#include "SMESH_PythonDump.hxx"
#include "SMESH_Gen_i.hxx"
#include "SMESH_Filter_i.hxx"
+#include "SALOMEDSImpl_Study.hxx"
#include <TColStd_HSequenceOfInteger.hxx>
+#include <TCollection_AsciiString.hxx>
+
+
+#ifdef _DEBUG_
+static int MYDEBUG = 0;
+#else
+static int MYDEBUG = 0;
+#endif
+
+static TCollection_AsciiString NotPublishedObjectName()
+{
+ return "__NOT__Published__Object__";
+}
namespace SMESH
{
- TCollection_AsciiString&
- operator<<(TCollection_AsciiString& theString, const char* theArg){
- theString += Standard_CString(theArg);
- return theString;
+
+ size_t TPythonDump::myCounter = 0;
+
+ TPythonDump::
+ TPythonDump()
+ {
+ ++myCounter;
+ }
+ TPythonDump::
+ ~TPythonDump()
+ {
+ if(--myCounter == 0){
+ SMESH_Gen_i* aSMESHGen = SMESH_Gen_i::GetSMESHGen();
+ SALOMEDS::Study_ptr aStudy = aSMESHGen->GetCurrentStudy();
+ if(!aStudy->_is_nil()){
+ std::string aString = myStream.str();
+ TCollection_AsciiString aCollection(Standard_CString(aString.c_str()));
+ aSMESHGen->AddToPythonScript(aStudy->StudyId(),aCollection);
+ if(MYDEBUG) MESSAGE(aString);
+ }
+ }
}
- TCollection_AsciiString&
- operator<<(TCollection_AsciiString& theString, int theArg){
- theString += TCollection_AsciiString(theArg);
- return theString;
+ TPythonDump&
+ TPythonDump::
+ operator<<(long int theArg){
+ myStream<<theArg;
+ return *this;
+ }
+
+ TPythonDump&
+ TPythonDump::
+ operator<<(int theArg){
+ myStream<<theArg;
+ return *this;
}
- TCollection_AsciiString&
- operator<<(TCollection_AsciiString& theString, float theArg){
- theString += TCollection_AsciiString(theArg);
- return theString;
+ TPythonDump&
+ TPythonDump::
+ operator<<(double theArg){
+ myStream<<theArg;
+ return *this;
+ }
+
+ TPythonDump&
+ TPythonDump::
+ operator<<(float theArg){
+ myStream<<theArg;
+ return *this;
+ }
+
+ TPythonDump&
+ TPythonDump::
+ operator<<(const void* theArg){
+ myStream<<theArg;
+ return *this;
+ }
+
+ TPythonDump&
+ TPythonDump::
+ operator<<(const char* theArg){
+ myStream<<theArg;
+ return *this;
+ }
+
+ TPythonDump&
+ TPythonDump::
+ operator<<(const SMESH::ElementType& theArg)
+ {
+ myStream<<"SMESH.";
+ switch(theArg){
+ case ALL:
+ myStream<<"ALL";
+ break;
+ case NODE:
+ myStream<<"NODE";
+ break;
+ case EDGE:
+ myStream<<"EDGE";
+ break;
+ case FACE:
+ myStream<<"FACE";
+ break;
+ case VOLUME:
+ myStream<<"VOLUME";
+ break;
+ }
+ return *this;
}
- TCollection_AsciiString&
- operator<<(TCollection_AsciiString& theString,
- const SMESH::long_array& theArg)
+
+ TPythonDump&
+ TPythonDump::
+ operator<<(const SMESH::long_array& theArg)
{
- theString<<"[ ";
+ myStream<<"[ ";
CORBA::Long i = 1, iEnd = theArg.length();
for(; i <= iEnd; i++) {
- theString<<int(theArg[i-1]);
+ myStream<<theArg[i-1];
if(i < iEnd)
- theString<< ", ";
+ myStream<< ", ";
}
- theString<<" ]";
- return theString;
+ myStream<<" ]";
+ return *this;
}
- TCollection_AsciiString&
- operator<<(TCollection_AsciiString& theString,
- CORBA::Object_ptr theArg)
+ TPythonDump&
+ TPythonDump::
+ operator<<(CORBA::Object_ptr theArg)
{
- CORBA::String_var aString("None");
+ TCollection_AsciiString aString("None");
SMESH_Gen_i* aSMESHGen = SMESH_Gen_i::GetSMESHGen();
SALOMEDS::Study_ptr aStudy = aSMESHGen->GetCurrentStudy();
SALOMEDS::SObject_var aSObject = SMESH_Gen_i::ObjectToSObject(aStudy,theArg);
if(!aSObject->_is_nil()){
aString = aSObject->GetID();
}else if(!CORBA::is_nil(theArg)){
- aString = SMESH_Gen_i::GetORB()->object_to_string(theArg);
+ aString = "smeshObj_";
+ if ( aSMESHGen->CanPublishInStudy( theArg )) // not published SMESH object
+ aString += (int) theArg;
+ else
+ aString = NotPublishedObjectName();
}
- theString<<aString.in();
- return theString;
+ myStream<<aString.ToCString();
+ return *this;
}
- TCollection_AsciiString&
- operator<<(TCollection_AsciiString& theString,
- SMESH::FilterLibrary_i* theArg)
+ TPythonDump&
+ TPythonDump::
+ operator<<(SMESH::FilterLibrary_i* theArg)
{
- theString += TCollection_AsciiString("aFilterLibrary_");
- theString += TCollection_AsciiString(int(theArg));
- return theString;
+ myStream<<"aFilterLibrary"<<theArg;
+ return *this;
}
- TCollection_AsciiString&
- operator<<(TCollection_AsciiString& theString,
- SMESH::FilterManager_i* theArg)
+ TPythonDump&
+ TPythonDump::
+ operator<<(SMESH::FilterManager_i* theArg)
{
- theString += TCollection_AsciiString("aFilterManager_");
- theString += TCollection_AsciiString(int(theArg));
- return theString;
+ myStream<<"aFilterManager";
+ return *this;
}
- TCollection_AsciiString&
- operator<<(TCollection_AsciiString& theString,
- SMESH::Functor_i* theArg)
+ TPythonDump&
+ TPythonDump::
+ operator<<(SMESH::Filter_i* theArg)
+ {
+ myStream<<"aFilter"<<theArg;
+ return *this;
+ }
+
+ TPythonDump&
+ TPythonDump::
+ operator<<(SMESH::Functor_i* theArg)
{
FunctorType aFunctorType = theArg->GetFunctorType();
switch(aFunctorType){
case FT_AspectRatio:
- theString += TCollection_AsciiString("anAspectRatio");
+ myStream<<"anAspectRatio";
break;
case FT_AspectRatio3D:
- theString += TCollection_AsciiString("anAspectRatio3D");
+ myStream<<"anAspectRatio3D";
break;
case FT_Warping:
- theString += TCollection_AsciiString("aWarping");
+ myStream<<"aWarping";
break;
case FT_MinimumAngle:
- theString += TCollection_AsciiString("aMinimumAngle");
+ myStream<<"aMinimumAngle";
break;
case FT_Taper:
- theString += TCollection_AsciiString("aTaper");
+ myStream<<"aTaper";
break;
case FT_Skew:
- theString += TCollection_AsciiString("aSkew");
+ myStream<<"aSkew";
break;
case FT_Area:
- theString += TCollection_AsciiString("aArea");
+ myStream<<"aArea";
break;
case FT_FreeBorders:
- theString += TCollection_AsciiString("aFreeBorders");
+ myStream<<"aFreeBorders";
break;
case FT_FreeEdges:
- theString += TCollection_AsciiString("aFreeEdges");
+ myStream<<"aFreeEdges";
break;
case FT_MultiConnection:
- theString += TCollection_AsciiString("aMultiConnection");
+ myStream<<"aMultiConnection";
break;
case FT_MultiConnection2D:
- theString += TCollection_AsciiString("aMultiConnection2D");
+ myStream<<"aMultiConnection2D";
break;
case FT_Length:
- theString += TCollection_AsciiString("aLength");
+ myStream<<"aLength";
break;
case FT_Length2D:
- theString += TCollection_AsciiString("aLength");
+ myStream<<"aLength";
break;
case FT_BelongToGeom:
- theString += TCollection_AsciiString("aBelongToGeom");
+ myStream<<"aBelongToGeom";
break;
case FT_BelongToPlane:
- theString += TCollection_AsciiString("aBelongToPlane");
+ myStream<<"aBelongToPlane";
break;
case FT_BelongToCylinder:
- theString += TCollection_AsciiString("aBelongToCylinder");
+ myStream<<"aBelongToCylinder";
break;
case FT_LyingOnGeom:
- theString += TCollection_AsciiString("aLyingOnGeom");
+ myStream<<"aLyingOnGeom";
break;
case FT_RangeOfIds:
- theString += TCollection_AsciiString("aRangeOfIds");
+ myStream<<"aRangeOfIds";
break;
case FT_BadOrientedVolume:
- theString += TCollection_AsciiString("aBadOrientedVolume");
+ myStream<<"aBadOrientedVolume";
break;
case FT_LessThan:
- theString += TCollection_AsciiString("aLessThan");
+ myStream<<"aLessThan";
break;
case FT_MoreThan:
- theString += TCollection_AsciiString("aMoreThan");
+ myStream<<"aMoreThan";
break;
case FT_EqualTo:
- theString += TCollection_AsciiString("anEqualTo");
+ myStream<<"anEqualTo";
break;
case FT_LogicalNOT:
- theString += TCollection_AsciiString("aLogicalNOT");
+ myStream<<"aLogicalNOT";
break;
case FT_LogicalAND:
- theString += TCollection_AsciiString("aLogicalAND");
+ myStream<<"aLogicalAND";
break;
case FT_LogicalOR:
- theString += TCollection_AsciiString("aLogicalOR");
+ myStream<<"aLogicalOR";
break;
case FT_Undefined:
- theString += TCollection_AsciiString("anUndefined");
+ myStream<<"anUndefined";
break;
}
- theString += Standard_CString("_");
- theString += TCollection_AsciiString(int(theArg));
- return theString;
- }
-
- TPythonDump::
- ~TPythonDump()
- {
- SMESH_Gen_i* aSMESHGen = SMESH_Gen_i::GetSMESHGen();
- SALOMEDS::Study_ptr aStudy = aSMESHGen->GetCurrentStudy();
- if(!aStudy->_is_nil()){
- aSMESHGen->AddToPythonScript(aStudy->StudyId(),myString);
- }
+ myStream<<theArg;
+ return *this;
}
}
// Map study entries to object names
Resource_DataMapOfAsciiStringAsciiString aMap;
+ Resource_DataMapOfAsciiStringAsciiString aMapNames;
TCollection_AsciiString s ("qwertyuioplkjhgfdsazxcvbnmQWERTYUIOPLKJHGFDSAZXCVBNM0987654321_");
SALOMEDS::ChildIterator_var Itr = aStudy->NewChildIterator(aSO);
SALOMEDS::SObject_var aValue = Itr->Value();
TCollection_AsciiString aName (aValue->GetName());
+ TCollection_AsciiString aGUIName (aName);
if (aName.Length() > 0) {
+ aMapNames.Bind(TCollection_AsciiString(aValue->GetID()), aGUIName);
int p, p2 = 1, e = aName.Length();
while ((p = aName.FirstLocationNotInSet(s, p2, e))) {
aName.SetValue(p, '_');
TCollection_AsciiString aSavedTrace (oldValue);
// Add trace of API methods calls and replace study entries by names
- bool aValidScript;
- //TCollection_AsciiString aScript = myGen.DumpPython
- TCollection_AsciiString aScript = DumpPython_impl
- (aStudy->StudyId(), aMap, isPublished, aValidScript, aSavedTrace);
+ TCollection_AsciiString aScript =
+ SALOMEDSImpl_Study::GetDumpStudyComment("SMESH") + "\n\n" +
+ DumpPython_impl(aStudy->StudyId(), aMap, aMapNames, isPublished, isValidScript, aSavedTrace);
int aLen = aScript.Length();
unsigned char* aBuffer = new unsigned char[aLen+1];
CORBA::Octet* anOctetBuf = (CORBA::Octet*)aBuffer;
Engines::TMPFile_var aStreamFile = new Engines::TMPFile(aLen+1, aLen+1, anOctetBuf, 1);
- isValidScript = aValidScript;
+
+ bool hasNotPublishedObjects = aScript.Location( NotPublishedObjectName(), 1, aLen);
+ isValidScript = isValidScript && !hasNotPublishedObjects;
return aStreamFile._retn();
}
TCollection_AsciiString& SMESH_Gen_i::AddObject(TCollection_AsciiString& theStr,
CORBA::Object_ptr theObject)
{
+ TCollection_AsciiString aString("None");
SMESH_Gen_i* aSMESHGen = SMESH_Gen_i::GetSMESHGen();
- SALOMEDS::SObject_var aSO =
+ SALOMEDS::SObject_var aSObject =
aSMESHGen->ObjectToSObject(aSMESHGen->GetCurrentStudy(), theObject);
- if ( !aSO->_is_nil() )
- theStr += aSO->GetID();
- else if ( !CORBA::is_nil( theObject ) )
- theStr += GetORB()->object_to_string( theObject );
- else
- theStr += "None";
-
+ if ( !aSObject->_is_nil() ) {
+ aString = aSObject->GetID();
+ } else if ( !CORBA::is_nil( theObject )) {
+ aString = "smeshObj_";
+ if ( aSMESHGen->CanPublishInStudy( theObject )) // not published SMESH object
+ aString += (int) theObject;
+ else
+ aString = NotPublishedObjectName();
+ }
+ theStr += aString;
return theStr;
}
TCollection_AsciiString SMESH_Gen_i::DumpPython_impl
(int theStudyID,
Resource_DataMapOfAsciiStringAsciiString& theObjectNames,
+ Resource_DataMapOfAsciiStringAsciiString& theNames,
bool isPublished,
bool& aValidScript,
const TCollection_AsciiString& theSavedTrace)
{
TCollection_AsciiString aScript;
- aScript += "import salome\n";
- aScript += "import geompy\n\n";
- aScript += "import SMESH\n";
- aScript += "import StdMeshers\n\n";
- aScript += "#import GEOM module\n";
- aScript += "import string\n";
- aScript += "import os\n";
- aScript += "import sys\n";
- aScript += "sys.path.append( os.path.dirname(__file__) )\n";
- aScript += "exec(\"from \"+string.replace(__name__,\"SMESH\",\"GEOM\")+\" import *\")\n\n";
-
- aScript += "def RebuildData(theStudy):";
+ aScript = "def RebuildData(theStudy):";
aScript += "\n\tsmesh = salome.lcc.FindOrLoadComponent(\"FactoryServer\", \"SMESH\")";
+ aScript += "\n\taFilterManager = smesh.CreateFilterManager()";
if ( isPublished )
aScript += "\n\tsmesh.SetCurrentStudy(theStudy)";
else
aScript += "\n\tsmesh.SetCurrentStudy(None)";
- Standard_Integer posToInertGlobalVars = aScript.Length();
- TCollection_AsciiString globalVars;
-
// Dump trace of restored study
if (theSavedTrace.Length() > 0) {
aScript += "\n";
GEOM::GEOM_Gen_ptr geom = GetGeomEngine();
TColStd_SequenceOfAsciiString seqRemoved;
Resource_DataMapOfAsciiStringAsciiString mapRemoved;
- Resource_DataMapOfAsciiStringAsciiString aNames;
Standard_Integer objectCounter = 0, aStart = 1, aScriptLength = aScript.Length();
TCollection_AsciiString anUpdatedScript, anEntry, aName, aBaseName("smeshObj_");
+ // Collect names of GEOM objects to exclude same names for SMESH objects
+ GEOM::string_array_var aGeomNames = geom->GetAllDumpNames();
+ int ign = 0, nbgn = aGeomNames->length();
+ for (; ign < nbgn; ign++) {
+ aName = aGeomNames[ign];
+ theObjectNames.Bind(aName, "1");
+ }
+
+ bool importGeom = false;
for (Standard_Integer i = 1; i <= aLen; i += 2) {
anUpdatedScript += aScript.SubString(aStart, aSeq->Value(i) - 1);
anEntry = aScript.SubString(aSeq->Value(i), aSeq->Value(i + 1));
- if (theObjectNames.IsBound(anEntry)) {
- aName = theObjectNames.Find(anEntry);
- if (theObjectNames.IsBound(aName) && anEntry != theObjectNames(aName)) {
- // diff objects have same name - make a new name
- TCollection_AsciiString aName2;
- Standard_Integer i = 0;
- do {
- aName2 = aName + "_" + ++i;
- } while (theObjectNames.IsBound(aName2) && anEntry != theObjectNames(aName2));
- aName = aName2;
- theObjectNames(anEntry) = aName;
- }
- } else {
- // is a GEOM object?
- aName = geom->GetDumpName( anEntry.ToCString() );
- if ( aName.IsEmpty() ) {
- // ? Removed Object ?
+ // is a GEOM object?
+ aName = geom->GetDumpName( anEntry.ToCString() );
+ if (aName.IsEmpty()) {
+ // is a SMESH object
+ if (theObjectNames.IsBound(anEntry)) {
+ // The Object is in Study
+ aName = theObjectNames.Find(anEntry);
+ if ( aName.IsIntegerValue() ) // aName must not start with a digit
+ aName.Insert( 1, 'a' );
+ if (theObjectNames.IsBound(aName) && anEntry != theObjectNames(aName)) {
+ // diff objects have same name - make a new name
+ TCollection_AsciiString aName2;
+ Standard_Integer i = 0;
+ do {
+ aName2 = aName + "_" + ++i;
+ } while (theObjectNames.IsBound(aName2) && anEntry != theObjectNames(aName2));
+ aName = aName2;
+ theObjectNames(anEntry) = aName;
+ }
+ } else {
+ // Removed Object
do {
aName = aBaseName + TCollection_AsciiString(++objectCounter);
} while (theObjectNames.IsBound(aName));
seqRemoved.Append(aName);
mapRemoved.Bind(anEntry, "1");
+ theObjectNames.Bind(anEntry, aName);
}
- theObjectNames.Bind(anEntry, aName);
+ theObjectNames.Bind(aName, anEntry); // to detect same name of diff objects
+ }
+ else
+ {
+ importGeom = true;
}
- theObjectNames.Bind(aName, anEntry); // to detect same name of diff objects
-
anUpdatedScript += aName;
- aNames.Bind(aName, "1");
aStart = aSeq->Value(i + 1) + 1;
}
+ // set initial part of aSript
+ TCollection_AsciiString initPart = "import salome, SMESH, StdMeshers\n\n";
+ if ( importGeom )
+ {
+ initPart += ("import string, os, sys, re\n"
+ "sys.path.insert( 0, os.path.dirname(__file__) )\n"
+ "exec(\"from \"+re.sub(\"SMESH$\",\"GEOM\",__name__)+\" import *\")\n\n");
+ }
+ anUpdatedScript.Insert ( 1, initPart );
+
// add final part of aScript
if (aSeq->Value(aLen) < aScriptLength)
anUpdatedScript += aScript.SubString(aSeq->Value(aLen) + 1, aScriptLength);
anUpdatedScript += seqRemoved.Value(ir);
anUpdatedScript += "))\n\tif SO is not None: aStudyBuilder.RemoveObjectWithChildren(SO)";
}
- anUpdatedScript += "\n";
// Set object names
- anUpdatedScript += "\n\tisGUIMode = ";
+ anUpdatedScript += "\n\n\tisGUIMode = ";
anUpdatedScript += isPublished;
anUpdatedScript += "\n\tif isGUIMode:";
anUpdatedScript += "\n\t\tsmeshgui = salome.ImportComponentGUI(\"SMESH\")";
anUpdatedScript += "\n\t\tsmeshgui.Init(theStudy._get_StudyId())";
anUpdatedScript += "\n";
+ TCollection_AsciiString aGUIName;
Resource_DataMapOfAsciiStringAsciiString mapEntries;
for (Standard_Integer i = 1; i <= aLen; i += 2) {
anEntry = aScript.SubString(aSeq->Value(i), aSeq->Value(i + 1));
- if (theObjectNames.IsBound(anEntry) &&
- !mapEntries.IsBound(anEntry) &&
- !mapRemoved.IsBound(anEntry)) {
+ aName = geom->GetDumpName( anEntry.ToCString() );
+ if (aName.IsEmpty() && // Not a GEOM object
+ theNames.IsBound(anEntry) &&
+ !mapEntries.IsBound(anEntry) && // Not yet processed
+ !mapRemoved.IsBound(anEntry)) { // Was not removed
aName = theObjectNames.Find(anEntry);
+ aGUIName = theNames.Find(anEntry);
mapEntries.Bind(anEntry, aName);
anUpdatedScript += "\n\t\tsmeshgui.SetName(salome.ObjectToID(";
- anUpdatedScript += aName + "), \"" + aName + "\")";
+ anUpdatedScript += aName + "), \"" + aGUIName + "\")";
}
}
anUpdatedScript += "\n\n\t\tsalome.sg.updateObjBrowser(0)";