#5632 Generate PdmChildField and PdmChildArrayField methods

This commit is contained in:
Gaute Lindkvist
2020-03-04 14:52:16 +01:00
parent 2424d79c5d
commit bd8e079e24
16 changed files with 112 additions and 71 deletions

View File

@@ -16,7 +16,7 @@ if resinsight is not None:
for case in cases: for case in cases:
print("Case id: " + str(case.id)) print("Case id: " + str(case.id))
print("Case name: " + case.name) print("Case name: " + case.name)
print("Case type: " + case.class_keyword) print("Case type: " + case.__class__.__name__)
print("Case file name: " + case.file_path) print("Case file name: " + case.file_path)
print("Case reservoir bounding box:", case.reservoir_boundingbox()) print("Case reservoir bounding box:", case.reservoir_boundingbox())

View File

@@ -20,7 +20,7 @@ for wbsplot in wbsplots:
# Example of setting parameters for existing plots # Example of setting parameters for existing plots
params = wbsplot.parameters() params = wbsplot.parameters()
params.user_poisson_ratio = 0.654321 params.user_poisson_ratio = 0.12345
params.update() params.update()
wbsplot.update() wbsplot.update()
wbsplot.export_snapshot(export_folder=dirname) wbsplot.export_snapshot(export_folder=dirname)

View File

@@ -15,7 +15,6 @@ print("Exporting to: " + export_folder)
for plot in plots: for plot in plots:
plot.export_snapshot(export_folder=export_folder) plot.export_snapshot(export_folder=export_folder)
plot.export_snapshot(export_folder=export_folder, output_format='PDF') plot.export_snapshot(export_folder=export_folder, output_format='PDF')
well_log_plot = plot.cast(rips.WellLogPlot) if isinstance(plot, rips.WellLogPlot):
if well_log_plot is not None: plot.export_data_as_las(export_folder=export_folder)
well_log_plot.export_data_as_las(export_folder=export_folder) plot.export_data_as_ascii(export_folder=export_folder)
well_log_plot.export_data_as_ascii(export_folder=export_folder)

View File

@@ -8,4 +8,4 @@ cases = resinsight.project.cases()
print ("Got " + str(len(cases)) + " cases: ") print ("Got " + str(len(cases)) + " cases: ")
for case in cases: for case in cases:
print("Case name: " + case.name) print("Case name: " + case.name)
print("Case grid path: " + case.grid_path()) print("Case grid path: " + case.file_path)

View File

@@ -245,11 +245,6 @@ def days_since_start(self):
"""Get a list of decimal values representing days since the start of the simulation""" """Get a list of decimal values representing days since the start of the simulation"""
return self.__case_stub.GetDaysSinceStart(self.__request()).day_decimals return self.__case_stub.GetDaysSinceStart(self.__request()).day_decimals
@add_method(Case)
def views(self):
"""Get a list of views belonging to a case"""
return self.descendants(View)
@add_method(Case) @add_method(Case)
def view(self, view_id): def view(self, view_id):
"""Get a particular view belonging to a case by providing view id """Get a particular view belonging to a case by providing view id

View File

@@ -87,6 +87,7 @@ def copy_from(self, object):
setattr(self, attribute, value) setattr(self, attribute, value)
if self.__custom_init__ is not None: if self.__custom_init__ is not None:
self.__custom_init__(self._pb2_object, self._channel) self.__custom_init__(self._pb2_object, self._channel)
self.update()
@add_method(PdmObject) @add_method(PdmObject)
def warnings(self): def warnings(self):

View File

@@ -28,18 +28,6 @@ def __custom_init__(self, pb2_object=None, channel=None):
self.user_k0fg = 0.75 self.user_k0fg = 0.75
@add_method(WellBoreStabilityPlot) @add_method(WellBoreStabilityPlot)
def parameters(self): def set_parameters(self, new_parameters):
"""Retrieve the parameters of the Plot current_params = self.parameters()
""" current_params.copy_from(new_parameters)
children = self.children("WbsParameters", WbsParameters)
if len(children) == 1:
child = children[0]
return child
return None
@add_method(WellBoreStabilityPlot)
def set_parameters(self, wbs_parameters):
children = self.children("WbsParameters", WbsParameters)
if len(children) == 1:
pdm_params = children[0]
pdm_params.copy_from(wbs_parameters)

View File

@@ -24,6 +24,7 @@
#include "RimEclipseResultDefinition.h" #include "RimEclipseResultDefinition.h"
#include "RimProject.h" #include "RimProject.h"
#include "cafPdmFieldScriptability.h"
#include "cafPdmObject.h" #include "cafPdmObject.h"
#include "cafPdmObjectScriptabilityRegister.h" #include "cafPdmObjectScriptabilityRegister.h"
@@ -171,7 +172,8 @@ Status RiaPdmObjectMethodStateHandler::init( const rips::PdmObjectMethodRequest*
m_fieldOwner->fields( fields ); m_fieldOwner->fields( fields );
for ( auto field : fields ) for ( auto field : fields )
{ {
if ( field->keyword() == fieldName ) auto scriptability = field->capability<caf::PdmFieldScriptability>();
if ( scriptability && scriptability->scriptFieldName() == fieldName )
{ {
caf::PdmProxyFieldHandle* proxyField = dynamic_cast<caf::PdmProxyFieldHandle*>( field ); caf::PdmProxyFieldHandle* proxyField = dynamic_cast<caf::PdmProxyFieldHandle*>( field );
if ( proxyField ) if ( proxyField )
@@ -224,7 +226,8 @@ Status RiaPdmObjectMethodStateHandler::init( const rips::PdmObjectSetMethodChunk
m_fieldOwner->fields( fields ); m_fieldOwner->fields( fields );
for ( auto field : fields ) for ( auto field : fields )
{ {
if ( field->keyword() == fieldName ) auto scriptability = field->capability<caf::PdmFieldScriptability>();
if ( scriptability && scriptability->scriptFieldName() == fieldName )
{ {
caf::PdmProxyFieldHandle* proxyField = dynamic_cast<caf::PdmProxyFieldHandle*>( field ); caf::PdmProxyFieldHandle* proxyField = dynamic_cast<caf::PdmProxyFieldHandle*>( field );
if ( proxyField ) if ( proxyField )
@@ -406,7 +409,8 @@ grpc::Status RiaGrpcPdmObjectService::GetChildPdmObjects( grpc::ServerContext*
matchingObject->fields( fields ); matchingObject->fields( fields );
for ( auto field : fields ) for ( auto field : fields )
{ {
if ( field->keyword() == fieldName ) auto scriptability = field->capability<caf::PdmFieldScriptability>();
if ( scriptability && scriptability->scriptFieldName() == fieldName )
{ {
std::vector<caf::PdmObjectHandle*> childObjects; std::vector<caf::PdmObjectHandle*> childObjects;
field->childObjects( &childObjects ); field->childObjects( &childObjects );

View File

@@ -85,7 +85,13 @@ RimEclipseCase::RimEclipseCase()
"Reservoir", "Reservoir",
"Abtract base class for Eclipse Cases" ); "Abtract base class for Eclipse Cases" );
CAF_PDM_InitFieldNoDefault( &reservoirViews, "ReservoirViews", "", "", "", "" ); CAF_PDM_InitScriptableFieldWithKeywordNoDefault( &reservoirViews,
"ReservoirViews",
"Views",
"",
"",
"",
"All Eclipse Views in the case" );
reservoirViews.uiCapability()->setUiHidden( true ); reservoirViews.uiCapability()->setUiHidden( true );
CAF_PDM_InitFieldNoDefault( &m_matrixModelResults, "MatrixModelResults", "", "", "", "" ); CAF_PDM_InitFieldNoDefault( &m_matrixModelResults, "MatrixModelResults", "", "", "", "" );

View File

@@ -128,7 +128,13 @@ RimEclipseView::RimEclipseView()
"EclipseView", "EclipseView",
"The Eclipse 3d Reservoir View" ); "The Eclipse 3d Reservoir View" );
CAF_PDM_InitFieldNoDefault( &m_cellResult, "GridCellResult", "Cell Result", ":/CellResult.png", "", "" ); CAF_PDM_InitScriptableFieldWithKeywordNoDefault( &m_cellResult,
"GridCellResult",
"CellResult",
"Cell Result",
":/CellResult.png",
"",
"" );
m_cellResult = new RimEclipseCellColors(); m_cellResult = new RimEclipseCellColors();
m_cellResult.uiCapability()->setUiHidden( true ); m_cellResult.uiCapability()->setUiHidden( true );
m_cellResult->setDiffResultOptionsEnabled( true ); m_cellResult->setDiffResultOptionsEnabled( true );

View File

@@ -76,7 +76,13 @@ RimGeoMechCase::RimGeoMechCase( void )
"GeoMechCase", "GeoMechCase",
"The Abaqus Based GeoMech Case" ); "The Abaqus Based GeoMech Case" );
CAF_PDM_InitFieldNoDefault( &geoMechViews, "GeoMechViews", "", "", "", "" ); CAF_PDM_InitScriptableFieldWithKeywordNoDefault( &geoMechViews,
"GeoMechViews",
"Views",
"",
"",
"",
"All GeoMech Views in the Case" );
geoMechViews.uiCapability()->setUiHidden( true ); geoMechViews.uiCapability()->setUiHidden( true );
CAF_PDM_InitField( &m_cohesion, "CaseCohesion", 10.0, "Cohesion", "", "Used to calculate the SE:SFI result", "" ); CAF_PDM_InitField( &m_cohesion, "CaseCohesion", 10.0, "Cohesion", "", "Used to calculate the SE:SFI result", "" );

View File

@@ -49,7 +49,7 @@ RimWellBoreStabilityPlot::RimWellBoreStabilityPlot()
CAF_PDM_InitScriptableFieldWithKeywordNoDefault( &m_wbsParameters, CAF_PDM_InitScriptableFieldWithKeywordNoDefault( &m_wbsParameters,
"WbsParameters", "WbsParameters",
"Params", "Parameters",
"Well Bore Stability Parameters", "Well Bore Stability Parameters",
"", "",
"", "",

View File

@@ -35,6 +35,8 @@
//################################################################################################## //##################################################################################################
#include "cafPdmPythonGenerator.h" #include "cafPdmPythonGenerator.h"
#include "cafPdmChildArrayField.h"
#include "cafPdmChildField.h"
#include "cafPdmFieldScriptability.h" #include "cafPdmFieldScriptability.h"
#include "cafPdmObject.h" #include "cafPdmObject.h"
#include "cafPdmObjectFactory.h" #include "cafPdmObjectFactory.h"
@@ -112,35 +114,40 @@ QString PdmPythonGenerator::generate(PdmObjectFactory* factory) const
object->fields(fields); object->fields(fields);
for (auto field : fields) for (auto field : fields)
{ {
auto pdmValueField = dynamic_cast<const PdmValueField*>(field); auto scriptability = field->template capability<PdmFieldScriptability>();
if (pdmValueField) if (scriptability != nullptr)
{ {
QString keyword = pdmValueField->keyword(); QString snake_field_name = camelToSnakeCase(scriptability->scriptFieldName());
auto scriptability = field->template capability<PdmFieldScriptability>();
if (scriptability != nullptr) QString comment;
{ {
QStringList commentComponents;
commentComponents << field->capability<PdmUiFieldHandle>()->uiName();
commentComponents << field->capability<PdmUiFieldHandle>()->uiWhatsThis();
commentComponents.removeAll(QString(""));
comment = commentComponents.join(". ");
}
auto pdmValueField = dynamic_cast<const PdmValueField*>(field);
auto pdmChildField = dynamic_cast<const PdmChildFieldHandle*>(field);
auto pdmChildArrayField = dynamic_cast<const PdmChildArrayFieldHandle*>(field);
if (pdmValueField)
{
QString dataType = PdmPythonGenerator::dataTypeString(field, true);
if (field->xmlCapability()->isVectorField())
{
dataType = QString("List of %1").arg(dataType);
}
bool shouldBeMethod = false; bool shouldBeMethod = false;
auto proxyField = dynamic_cast<const PdmProxyFieldHandle*>(field); auto proxyField = dynamic_cast<const PdmProxyFieldHandle*>(field);
if (proxyField && proxyField->isStreamingField()) shouldBeMethod = true; if (proxyField && proxyField->isStreamingField()) shouldBeMethod = true;
QString snake_field_name = camelToSnakeCase(scriptability->scriptFieldName());
if (classAttributesGenerated[field->ownerClass()].count(snake_field_name)) continue; if (classAttributesGenerated[field->ownerClass()].count(snake_field_name)) continue;
if (classMethodsGenerated[field->ownerClass()].count(snake_field_name)) continue; if (classMethodsGenerated[field->ownerClass()].count(snake_field_name)) continue;
QString comment;
{
QStringList commentComponents;
commentComponents << pdmValueField->capability<PdmUiFieldHandle>()->uiName();
commentComponents << pdmValueField->capability<PdmUiFieldHandle>()->uiWhatsThis();
commentComponents.removeAll(QString(""));
comment = commentComponents.join(". ");
}
QVariant valueVariant = pdmValueField->toQVariant(); QVariant valueVariant = pdmValueField->toQVariant();
bool isList, isBuiltinType;
QString dataType = PdmPythonGenerator::dataTypeString(pdmValueField, &isList, &isBuiltinType);
if (shouldBeMethod) if (shouldBeMethod)
{ {
if (proxyField->hasGetter()) if (proxyField->hasGetter())
@@ -174,7 +181,7 @@ QString PdmPythonGenerator::generate(PdmObjectFactory* factory) const
} }
} }
else else
{ {
QString valueString; QString valueString;
QTextStream valueStream(&valueString); QTextStream valueStream(&valueString);
scriptability->readFromField(valueStream, true, true); scriptability->readFromField(valueStream, true, true);
@@ -191,6 +198,29 @@ QString PdmPythonGenerator::generate(PdmObjectFactory* factory) const
classAttributesGenerated[field->ownerClass()][snake_field_name].second = fullComment; classAttributesGenerated[field->ownerClass()][snake_field_name].second = fullComment;
} }
} }
else if (pdmChildField || pdmChildArrayField)
{
QString dataType = PdmPythonGenerator::dataTypeString(field, false);
QString scriptDataType = PdmObjectScriptabilityRegister::scriptClassNameFromClassKeyword(dataType);
QString commentDataType = field->xmlCapability()->isVectorField() ?
QString("List of %1").arg(scriptDataType) : scriptDataType;
QString firstItemTag = pdmChildField ? QString("[0]") : QString("");
QString fullComment =
QString(" \"\"\"%1\n Returns:\n %2\n \"\"\"")
.arg(comment)
.arg(commentDataType);
QString fieldCode = QString(" def %1(self):\n%2\n return "
"self.children(\"%3\", %4)%5\n")
.arg(snake_field_name)
.arg(fullComment)
.arg(scriptability->scriptFieldName())
.arg(scriptDataType)
.arg(firstItemTag);
classMethodsGenerated[field->ownerClass()][snake_field_name] = fieldCode;
}
} }
} }
} }
@@ -309,12 +339,11 @@ QString PdmPythonGenerator::camelToSnakeCase(const QString& camelString)
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
QString PdmPythonGenerator::dataTypeString(const PdmFieldHandle* field, bool* isList, bool* isBuiltinType) QString PdmPythonGenerator::dataTypeString(const PdmFieldHandle* field, bool useStrForUnknownDataTypes)
{ {
auto xmlObj = field->capability<PdmXmlFieldHandle>(); auto xmlObj = field->capability<PdmXmlFieldHandle>();
QString dataType = xmlObj->dataTypeName(); QString dataType = xmlObj->dataTypeName();
bool foundList = xmlObj->isVectorField();
std::map<QString, QString> builtins = std::map<QString, QString> builtins =
{ {QString::fromStdString(typeid(double).name()), "float"}, { {QString::fromStdString(typeid(double).name()), "float"},
@@ -333,22 +362,11 @@ QString PdmPythonGenerator::dataTypeString(const PdmFieldHandle* field, bool* is
} }
} }
if (isList) if (!foundBuiltin && useStrForUnknownDataTypes)
{
*isList = foundList;
}
if (isBuiltinType)
{
*isBuiltinType = foundBuiltin;
}
if (!foundBuiltin)
{ {
dataType = "str"; dataType = "str";
} }
if (foundList) return QString("List of %1").arg(dataType);
return dataType; return dataType;
} }

View File

@@ -50,7 +50,7 @@ class PdmPythonGenerator : public PdmCodeGenerator
public: public:
QString generate(PdmObjectFactory* factory) const override; QString generate(PdmObjectFactory* factory) const override;
static QString camelToSnakeCase(const QString& camelString); static QString camelToSnakeCase(const QString& camelString);
static QString dataTypeString(const PdmFieldHandle* field, bool* isList = nullptr, bool* isBuiltinType = nullptr); static QString dataTypeString(const PdmFieldHandle* field, bool useStrForUnknownDataTypes);
static QString pythonifyDataValue(const QString& dataValue); static QString pythonifyDataValue(const QString& dataValue);
static QString pythonHelpString(const QString& existingTooltip, const QString& keyword); static QString pythonHelpString(const QString& existingTooltip, const QString& keyword);

View File

@@ -80,7 +80,7 @@ public:
void readFieldData(QXmlStreamReader& xmlStream, PdmObjectFactory* objectFactory) override; void readFieldData(QXmlStreamReader& xmlStream, PdmObjectFactory* objectFactory) override;
void writeFieldData(QXmlStreamWriter& xmlStream) const override; void writeFieldData(QXmlStreamWriter& xmlStream) const override;
bool resolveReferences() override; bool resolveReferences() override;
bool isVectorField() const;
private: private:
FieldType* m_field; FieldType* m_field;
@@ -124,6 +124,7 @@ public:
void readFieldData(QXmlStreamReader& xmlStream, PdmObjectFactory* objectFactory) override; void readFieldData(QXmlStreamReader& xmlStream, PdmObjectFactory* objectFactory) override;
void writeFieldData(QXmlStreamWriter& xmlStream) const override; void writeFieldData(QXmlStreamWriter& xmlStream) const override;
bool resolveReferences() override; bool resolveReferences() override;
bool isVectorField() const;
private: private:
FieldType* m_field; FieldType* m_field;
}; };

View File

@@ -218,7 +218,15 @@ bool caf::PdmFieldXmlCap<FieldType>::resolveReferences()
return foundValidObjectFromString; return foundValidObjectFromString;
} }
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
template < typename DataType>
bool caf::PdmFieldXmlCap< caf::PdmPtrArrayField<DataType*> >::isVectorField() const
{
return true;
}
//================================================================================================== //==================================================================================================
/// XML Implementation for PdmChildField<> /// XML Implementation for PdmChildField<>
@@ -432,4 +440,13 @@ bool caf::PdmFieldXmlCap<caf::PdmChildArrayField<DataType *>>::resolveReferences
return true; return true;
} }
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
template < typename DataType>
bool caf::PdmFieldXmlCap< caf::PdmChildArrayField<DataType*> >::isVectorField() const
{
return true;
}
} // End namespace caf } // End namespace caf