X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FSMESH_I%2FSMESH_DumpPython.cxx;h=26eb938c1ed7ae0fbe12421b6cb4b7a5cffaaf3d;hb=01952c274211b867744da2ea33ffc09442a83b39;hp=cd9da6336944d93e0aa0921a604eb33467111838;hpb=83630f83146a695f958ef5d181a56b11462fa0eb;p=modules%2Fsmesh.git diff --git a/src/SMESH_I/SMESH_DumpPython.cxx b/src/SMESH_I/SMESH_DumpPython.cxx index cd9da6336..26eb938c1 100644 --- a/src/SMESH_I/SMESH_DumpPython.cxx +++ b/src/SMESH_I/SMESH_DumpPython.cxx @@ -9,46 +9,126 @@ #include "SMESH_Filter_i.hxx" #include +#include + +#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); + } + } + } + + TPythonDump& + TPythonDump:: + operator<<(long int theArg){ + myStream<object_to_string(theArg); } - theString<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<NewChildIterator(aSO); @@ -207,7 +283,9 @@ Engines::TMPFile* SMESH_Gen_i::DumpPython (CORBA::Object_ptr theStudy, 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, '_'); @@ -228,9 +306,8 @@ Engines::TMPFile* SMESH_Gen_i::DumpPython (CORBA::Object_ptr theStudy, // 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]; @@ -391,6 +468,7 @@ Handle(TColStd_HSequenceOfInteger) FindEntries (TCollection_AsciiString& theStri TCollection_AsciiString SMESH_Gen_i::DumpPython_impl (int theStudyID, Resource_DataMapOfAsciiStringAsciiString& theObjectNames, + Resource_DataMapOfAsciiStringAsciiString& theNames, bool isPublished, bool& aValidScript, const TCollection_AsciiString& theSavedTrace) @@ -404,19 +482,18 @@ TCollection_AsciiString SMESH_Gen_i::DumpPython_impl 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)"; - Standard_Integer posToInertGlobalVars = aScript.Length(); - TCollection_AsciiString globalVars; - // Dump trace of restored study if (theSavedTrace.Length() > 0) { aScript += "\n"; @@ -441,42 +518,50 @@ TCollection_AsciiString SMESH_Gen_i::DumpPython_impl 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; } @@ -491,26 +576,29 @@ TCollection_AsciiString SMESH_Gen_i::DumpPython_impl 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)";