Salome HOME
Enable simultaneous usage of several StdMeshersGUI_SubShapeSelectorWdg's
[modules/smesh.git] / src / SMESH_I / SMESH_PythonDump.cxx
index 391b555273b393a6655c00e004955934a5b74571..e1c3002c0a583800cfd546adf15618eb0b3c12ba 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright (C) 2007-2019  CEA/DEN, EDF R&D, OPEN CASCADE
+// Copyright (C) 2007-2020  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
@@ -40,6 +40,8 @@
 #include <TColStd_HSequenceOfInteger.hxx>
 #include <TCollection_AsciiString.hxx>
 
+#include <cstring>
+
 #ifdef _DEBUG_
 static int MYDEBUG = 0;
 #else
@@ -77,7 +79,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);
@@ -1061,12 +1063,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");
     }
@@ -1100,7 +1105,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 )) {
@@ -1381,3 +1390,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;
+}