#include "SMESH_Filter_i.hxx"
#include <TColStd_HSequenceOfInteger.hxx>
+#include <TCollection_AsciiString.hxx>
+
+#ifdef _DEBUG_
+static int MYDEBUG = 0;
+#else
+static int MYDEBUG = 0;
+#endif
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");
SMESH_Gen_i* aSMESHGen = SMESH_Gen_i::GetSMESHGen();
}else if(!CORBA::is_nil(theArg)){
aString = SMESH_Gen_i::GetORB()->object_to_string(theArg);
}
- theString<<aString.in();
- return theString;
+ myStream<<aString.in();
+ 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::Filter_i* theArg)
+ TPythonDump&
+ TPythonDump::
+ operator<<(SMESH::Filter_i* theArg)
{
- theString += TCollection_AsciiString("aFilter_");
- theString += TCollection_AsciiString(int(theArg));
- return theString;
+ myStream<<"aFilter"<<theArg;
+ return *this;
}
- TCollection_AsciiString&
- operator<<(TCollection_AsciiString& theString,
- SMESH::Functor_i* theArg)
+ 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, '_');
// 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);
+ (aStudy->StudyId(), aMap, aMapNames, isPublished, aValidScript, aSavedTrace);
int aLen = aScript.Length();
unsigned char* aBuffer = new unsigned char[aLen+1];
TCollection_AsciiString SMESH_Gen_i::DumpPython_impl
(int theStudyID,
Resource_DataMapOfAsciiStringAsciiString& theObjectNames,
+ Resource_DataMapOfAsciiStringAsciiString& theNames,
bool isPublished,
bool& aValidScript,
const TCollection_AsciiString& theSavedTrace)
aScript += "import string\n";
aScript += "import os\n";
aScript += "import sys\n";
+ aScript += "import re\n";
aScript += "sys.path.append( os.path.dirname(__file__) )\n";
- aScript += "exec(\"from \"+string.replace(__name__,\"SMESH\",\"GEOM\")+\" import *\")\n\n";
+ aScript += "exec(\"from \"+re.sub(\"SMESH$\",\"GEOM\",__name__)+\" import *\")\n\n";
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)";
- 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");
+ }
+
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 (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
}
- theObjectNames.Bind(aName, anEntry); // to detect same name of diff objects
anUpdatedScript += aName;
- aNames.Bind(aName, "1");
aStart = aSeq->Value(i + 1) + 1;
}
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)";