Python adjustments (#7809)

* #7797 Well Targets: Add scripting capability
* #7794 Python : Do not update childField or childFieldArray
* #7797: Python - Add scripting to well path collection
- Extend the pdmobject.py with method add_object()
- allow objects to be created from Python in well path collections
- add well targets to modelled well path

* #7795 Python : Make sure referenced generated classes are defined
* #7810 StimPlanModel: clean-up python generation
* Python : Always use empty string as default value for ptrFieldValue
It can happen that a ptrField is assigned to a pointer on object construction. (FaciesProperties) Make sure that constructor always assigns an empty string.

Co-authored-by: magnesj <magnesj@users.noreply.github.com>
Co-authored-by: Kristian Bendiksen <kristian.bendiksen@gmail.com>
This commit is contained in:
Magne Sjaastad
2021-06-25 14:18:36 +02:00
parent aa2b4305de
commit eb3c52aeb1
27 changed files with 293 additions and 72 deletions

View File

@@ -59,7 +59,7 @@ CAF_PDM_CODE_GENERATOR_SOURCE_INIT( PdmPythonGenerator, "py" );
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
QString PdmPythonGenerator::generate( PdmObjectFactory* factory ) const
QString caf::PdmPythonGenerator::generate( PdmObjectFactory* factory, std::vector<QString>& errorMessages ) const
{
QString generatedCode;
QTextStream out( &generatedCode );
@@ -92,6 +92,7 @@ QString PdmPythonGenerator::generate( PdmObjectFactory* factory ) const
std::map<QString, std::map<QString, std::pair<QString, QString>>> classAttributesGenerated;
std::map<QString, std::map<QString, QString>> classMethodsGenerated;
std::map<QString, QString> classCommentsGenerated;
std::set<QString> dataTypesInChildFields;
// First generate all attributes and comments to go into each object
for ( std::shared_ptr<PdmObject> object : dummyObjects )
@@ -181,9 +182,14 @@ QString PdmPythonGenerator::generate( PdmObjectFactory* factory ) const
}
else
{
QString valueString;
QTextStream valueStream( &valueString );
scriptability->readFromField( valueStream, true, true );
QString valueString;
// Always make sure the default value for a ptrField is empty string
if ( !field->hasPtrReferencedObjects() )
{
QTextStream valueStream( &valueString );
scriptability->readFromField( valueStream, true, true );
}
if ( valueString.isEmpty() ) valueString = QString( "\"\"" );
valueString = pythonifyDataValue( valueString );
@@ -203,6 +209,8 @@ QString PdmPythonGenerator::generate( PdmObjectFactory* factory ) const
QString scriptDataType =
PdmObjectScriptingCapabilityRegister::scriptClassNameFromClassKeyword( dataType );
dataTypesInChildFields.insert( scriptDataType );
QString commentDataType = field->xmlCapability()->isVectorField()
? QString( "List of %1" ).arg( scriptDataType )
: scriptDataType;
@@ -385,6 +393,16 @@ QString PdmPythonGenerator::generate( PdmObjectFactory* factory ) const
out << " return all_classes[class_keyword]\n";
out << " return None\n";
// Check if all referenced data types are exported as classes
for ( const auto& scriptDataType : dataTypesInChildFields )
{
if ( classesWritten.count( scriptDataType ) == 0 )
{
QString errorText = "No export for data type " + scriptDataType;
errorMessages.push_back( errorText );
}
}
return generatedCode;
}