X-Git-Url: http://git.salome-platform.org/gitweb/?p=modules%2Fsmesh.git;a=blobdiff_plain;f=src%2FSMESH_I%2FSMESH_PythonDump.cxx;h=5a92bde8242a3d3acbf740d8ca4a4f065d29c2c3;hp=6fbf726b7285ae0ebd8f0469abb00e6e8a842a4d;hb=refs%2Ftags%2FV9_7_0a1;hpb=4cd676f92c936b15ce41a4f7168a9dcd18e92773 diff --git a/src/SMESH_I/SMESH_PythonDump.cxx b/src/SMESH_I/SMESH_PythonDump.cxx index 6fbf726b7..5a92bde82 100644 --- a/src/SMESH_I/SMESH_PythonDump.cxx +++ b/src/SMESH_I/SMESH_PythonDump.cxx @@ -1,4 +1,4 @@ -// Copyright (C) 2007-2016 CEA/DEN, EDF R&D, OPEN CASCADE +// Copyright (C) 2007-2021 CEA/DEN, EDF R&D, OPEN CASCADE // // Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS @@ -32,13 +32,20 @@ #include "SMESH_Gen_i.hxx" #include "SMESH_MeshEditor_i.hxx" +#include +#include #include #include -#include #include #include +#if OCC_VERSION_LARGE < 0x07050000 +#include +#endif + +#include + #ifdef _DEBUG_ static int MYDEBUG = 0; #else @@ -53,17 +60,22 @@ namespace SMESH size_t TPythonDump::myCounter = 0; const char theNotPublishedObjectName[] = "__NOT__Published__Object__"; - TVar::TVar(CORBA::Double value):myVals(1), myIsList(false) { myVals[0] = SMESH_Comment(value); } - TVar::TVar(CORBA::Long value):myVals(1), myIsList(false) { myVals[0] = SMESH_Comment(value); } - TVar::TVar(CORBA::Short value):myVals(1), myIsList(false) { myVals[0] = SMESH_Comment(value); } + TVar::TVar(CORBA::Double value):myVals(1), myIsList(false) { myVals[0] = SMESH_Comment(value); } + TVar::TVar(CORBA::Long value):myVals(1), myIsList(false) { myVals[0] = SMESH_Comment(value); } + TVar::TVar(CORBA::LongLong value):myVals(1), myIsList(false) { myVals[0] = SMESH_Comment(value); } + TVar::TVar(CORBA::Short value):myVals(1), myIsList(false) { myVals[0] = SMESH_Comment(value); } TVar::TVar(const SMESH::double_array& value):myVals(value.length()), myIsList(true) { for ( size_t i = 0; i < value.length(); i++) myVals[i] = SMESH_Comment(value[i]); } + + TPythonDump::TPythonDump():myVarsCounter(0),mySmesh(SMESH_Gen_i::GetSMESHGen()) + { + ++myCounter; + } - TPythonDump:: - TPythonDump():myVarsCounter(0) + TPythonDump::TPythonDump(SMESH_Gen_i *smesh):myVarsCounter(0),mySmesh(smesh) { ++myCounter; } @@ -76,7 +88,7 @@ namespace SMESH TCollection_AsciiString aCollection(Standard_CString(aString.c_str())); if(!aCollection.IsEmpty()) { - const std::string & objEntry = SMESH_Gen_i::GetSMESHGen()->GetLastObjEntry(); + const std::string & objEntry = aSMESHGen->GetLastObjEntry(); if ( !objEntry.empty() ) aCollection += (TVar::ObjPrefix() + objEntry ).c_str(); aSMESHGen->AddToPythonScript(aCollection); @@ -132,6 +144,13 @@ namespace SMESH return *this; } + TPythonDump& + TPythonDump:: + operator<<(long long theArg){ + myStream< - void DumpArray(const TArray& theArray, TPythonDump & theStream) + TPythonDump& + TPythonDump::operator<<(const SMESH::long_array& theArg) { - if ( theArray.length() == 0 ) - { - theStream << "[]"; - } - else - { - theStream << "[ "; - for (CORBA::ULong i = 1; i <= theArray.length(); i++) { - theStream << theArray[i-1]; - if ( i < theArray.length() ) - theStream << ", "; - } - theStream << " ]"; - } + DumpArray( theArg, *this ); + return *this; } TPythonDump& - TPythonDump::operator<<(const SMESH::long_array& theArg) + TPythonDump::operator<<(const SMESH::smIdType_array& theArg) { DumpArray( theArg, *this ); return *this; @@ -316,7 +323,7 @@ namespace SMESH operator<<(CORBA::Object_ptr theArg) { SMESH_Gen_i* aSMESHGen = SMESH_Gen_i::GetSMESHGen(); - SALOMEDS::SObject_wrap aSObject = SMESH_Gen_i::ObjectToSObject(theArg); + SALOMEDS::SObject_wrap aSObject = mySmesh->ObjectToSObject(theArg); if(!aSObject->_is_nil()) { CORBA::String_var id = aSObject->GetID(); myStream << id; @@ -335,7 +342,7 @@ namespace SMESH TPythonDump:: operator<<(SMESH::SMESH_Hypothesis_ptr theArg) { - SALOMEDS::SObject_wrap aSObject = SMESH_Gen_i::ObjectToSObject(theArg); + SALOMEDS::SObject_wrap aSObject = mySmesh->ObjectToSObject(theArg); if(aSObject->_is_nil() && !CORBA::is_nil(theArg)) myStream << "hyp_" << theArg->GetId(); else @@ -349,7 +356,7 @@ namespace SMESH { if ( CORBA::is_nil( theArg ) ) return *this << "None"; - SALOMEDS::SObject_wrap aSObject = SMESH_Gen_i::ObjectToSObject(theArg); + SALOMEDS::SObject_wrap aSObject = mySmesh->ObjectToSObject(theArg); if(!aSObject->_is_nil()) { return *this << aSObject; @@ -360,11 +367,12 @@ namespace SMESH } if ( SMESH_MeshEditor_i::IsTemporaryIDSource( theArg )) { - SMESH::SMESH_Mesh_var mesh = theArg->GetMesh(); - SMESH::long_array_var anElementsId = theArg->GetIDs(); - SMESH::array_of_ElementType_var types = theArg->GetTypes(); - SMESH::ElementType type = types->length() ? types[0] : SMESH::ALL; - SALOMEDS::SObject_wrap meshSO = SMESH_Gen_i::ObjectToSObject(mesh); + SMESH::SMESH_Mesh_var mesh = theArg->GetMesh(); + SMESH::smIdType_array_var anElementsId = theArg->GetIDs(); + SMESH::array_of_ElementType_var types = theArg->GetTypes(); + SMESH::ElementType type = types->length() ? types[0] : SMESH::ALL; + SALOMEDS::SObject_wrap meshSO = mySmesh->ObjectToSObject(mesh); + if ( meshSO->_is_nil() ) // don't waste memory for dumping not published objects return *this << mesh << ".GetIDSource([], " << type << ")"; else @@ -383,7 +391,7 @@ namespace SMESH TPythonDump& TPythonDump:: - operator<<(SMESH::FilterManager_i* theArg) + operator<<(SMESH::FilterManager_i* /*theArg*/) { myStream<<"aFilterManager"; return *this; @@ -464,13 +472,13 @@ namespace SMESH TPythonDump& TPythonDump:: - operator<<(SMESH::Measurements_i* theArg) + operator<<(SMESH::Measurements_i* /*theArg*/) { myStream<<"aMeasurements"; return *this; } - TPythonDump& TPythonDump:: operator<<(SMESH_Gen_i* theArg) + TPythonDump& TPythonDump:: operator<<(SMESH_Gen_i* /*theArg*/) { myStream << SMESHGenName(); return *this; } @@ -686,7 +694,9 @@ namespace SMESH void printException( const char* text ) { #ifdef _DEBUG_ - cout << "Exception in SMESH_Gen_i::DumpPython(): " << text << endl; + std::cout << "Exception in SMESH_Gen_i::DumpPython(): " << text << std::endl; +#else + (void)text; // unused in release mode #endif } @@ -714,10 +724,13 @@ namespace SMESH //function : DumpPython //purpose : //======================================================================= -Engines::TMPFile* SMESH_Gen_i::DumpPython (CORBA::Boolean isPublished, +Engines::TMPFile* SMESH_Gen_i::DumpPython( CORBA::Boolean isPublished, CORBA::Boolean isMultiFile, CORBA::Boolean& isValidScript) { + // localizing + Kernel_Utils::Localizer loc; + SALOMEDS::Study_var aStudy = getStudyServant(); if (CORBA::is_nil(aStudy)) return new Engines::TMPFile(0); @@ -973,7 +986,7 @@ namespace { //================================================================================ /*! - * \brief Createa a Dump Python script + * \brief Creates a Dump Python script * \param [in,out] theObjectNames - map of an entry to a study and python name * \param [in] theNames - - map of an entry to a study name * \param [in] isPublished - \c true if dump of object publication in study is needed @@ -1009,9 +1022,9 @@ TCollection_AsciiString SMESH_Gen_i::DumpPython_impl lines.push_back( aSMESHGen + " = smeshBuilder.New()" ); if ( isPublished ) - optionalComment = helper + "#"; + optionalComment = "#"; lines.push_back( optionalComment + aSMESHGen + ".SetEnablePublish( False ) # Set to False to avoid publish in study if not needed or in some particular situations:" ); - lines.push_back( " # multiples meshes built in parallel, complex and numerous mesh edition (performance)" ); + lines.push_back( " # multiples meshes built in parallel, complex and numerous mesh edition (performance)\n" ); lines.push_back( helper + "aFilterManager = " + aSMESHGen + ".CreateFilterManager()" ); lines.push_back( helper + "aMeasurements = " + aSMESHGen + ".CreateMeasurements()" ); @@ -1076,12 +1089,15 @@ TCollection_AsciiString SMESH_Gen_i::DumpPython_impl isHistoricalDump ); bool importGeom = false; - GEOM::GEOM_Gen_ptr geom = GetGeomEngine(); + GEOM::GEOM_Gen_ptr geom[2]; + for ( int isShaper = 0; isShaper < 2; ++isShaper ) { + geom[ isShaper ] = GetGeomEngine( isShaper ); + if ( CORBA::is_nil( geom[ isShaper ])) + continue; // Add names of GEOM objects to theObjectNames to exclude same names of SMESH objects - GEOM::string_array_var aGeomNames = geom->GetAllDumpNames(); - int ign = 0, nbgn = aGeomNames->length(); - for (; ign < nbgn; ign++) { + GEOM::string_array_var aGeomNames = geom[ isShaper ]->GetAllDumpNames(); + for ( CORBA::ULong ign = 0; ign < aGeomNames->length(); ign++) { TCollection_AsciiString aName = aGeomNames[ign].in(); theObjectNames.Bind(aName, "1"); } @@ -1090,10 +1106,15 @@ TCollection_AsciiString SMESH_Gen_i::DumpPython_impl TCollection_AsciiString anUpdatedScript; Resource_DataMapOfAsciiStringAsciiString mapRemoved; - Resource_DataMapOfAsciiStringAsciiString mapEntries; // names and entries present in anUpdatedScript + Resource_DataMapOfAsciiStringAsciiString mapEntries; // { entry: name } present in anUpdatedScript Standard_Integer objectCounter = 0; TCollection_AsciiString anEntry, aName, aGUIName, aBaseName("smeshObj_"); + std::string compDataType = ComponentDataType(); // SMESH module's data type + SALOMEDS::SComponent_var smeshSO = getStudyServant()->FindComponent( compDataType.c_str() ); + CORBA::String_var smeshID = smeshSO->GetID(); + TCollection_AsciiString smeshEntry = smeshID.in(); + // Treat every script line and add it to anUpdatedScript for ( linesIt = lines.begin(); linesIt != lines.end(); ++linesIt ) { @@ -1115,7 +1136,11 @@ TCollection_AsciiString SMESH_Gen_i::DumpPython_impl anUpdatedScript += aLine.SubString( aStart, aSeq->Value(i) - 1 ); // line part before i-th entry anEntry = aLine.SubString( aSeq->Value(i), aSeq->Value(i + 1) ); // is a GEOM object? - CORBA::String_var geomName = geom->GetDumpName( anEntry.ToCString() ); + CORBA::String_var geomName; + if ( !CORBA::is_nil( geom[0] )) + geomName = geom[0]->GetDumpName( anEntry.ToCString() ); + if (( !geomName.in() || !geomName.in()[0] ) && !CORBA::is_nil( geom[1] )) + geomName = geom[1]->GetDumpName( anEntry.ToCString() ); if ( !geomName.in() || !geomName.in()[0] ) { // is a SMESH object if ( theObjectNames.IsBound( anEntry )) { @@ -1141,15 +1166,22 @@ TCollection_AsciiString SMESH_Gen_i::DumpPython_impl } else { - // Removed Object - do { - aName = aBaseName + (++objectCounter); - } while (theObjectNames.IsBound(aName)); + if ( !anEntry.StartsWith( smeshEntry )) // not SMESH object + { + aName = SMESH::TPythonDump::NotPublishedObjectName(); + } + else + { + // Removed Object + do { + aName = aBaseName + (++objectCounter); + } while (theObjectNames.IsBound(aName)); - if ( !aRemovedObjIDs.count( anEntry ) && aLine.Value(1) != '#') - mapRemoved.Bind(anEntry, aName); + if ( !aRemovedObjIDs.count( anEntry ) && aLine.Value(1) != '#') + mapRemoved.Bind(anEntry, aName); - theObjectNames.Bind(anEntry, aName); + theObjectNames.Bind(anEntry, aName); + } } theObjectNames.Bind(aName, anEntry); // to detect same name of diff objects } @@ -1396,3 +1428,55 @@ void SMESH_Gen_i::CleanPythonTrace() myPythonScript->Clear(); } } + +//================================================================================ +/*! + * \brief Count inclusions of a string in a raw Python dump script + */ +//================================================================================ + +int SMESH_Gen_i::CountInPyDump(const TCollection_AsciiString& theText) +{ + int count = 0; + + SALOMEDS::Study_var aStudy = getStudyServant(); + if ( CORBA::is_nil( aStudy )) + return count; + + SMESH_Gen_i* me = GetSMESHGen(); + CORBA::String_var compDataType = me->ComponentDataType(); + SALOMEDS::SObject_wrap aSO = aStudy->FindComponent( compDataType.in() ); + if ( CORBA::is_nil( aSO )) + return count; + + // Trace saved in the study + SALOMEDS::GenericAttribute_wrap attr; + if ( aSO->FindAttribute( attr.inout(), "AttributePythonObject" )) + { + SALOMEDS::AttributePythonObject_var pyAttr = + SALOMEDS::AttributePythonObject::_narrow( attr ); + CORBA::String_var script = pyAttr->GetObject(); + for ( const char * scriptPos = script.in(); true; ++scriptPos ) + if (( scriptPos = strstr( scriptPos, theText.ToCString() ))) + ++count; + else + break; + } + + // New python commands + if ( !me->myPythonScript.IsNull() ) + { + const int nbLines = me->myPythonScript->Length(); + for ( int i = 1; i <= nbLines; ++i ) + { + const TCollection_AsciiString& line = me->myPythonScript->Value( i ); + for ( int loc = 1; loc <= line.Length(); ++loc ) + if (( loc = line.Location( theText, loc, line.Length() ))) + ++count; + else + break; + } + } + + return count; +}