PPGP issue.

Make a script valid even if some involved object are not published:
eliminate SetName() and object removal from the scrip

SMESH_2smeshpy::
   ConvertScript(const TCollection_AsciiString&            theScript,
                 Resource_DataMapOfAsciiStringAsciiString& theEntry2AccessorMethod,
                 Resource_DataMapOfAsciiStringAsciiString& theObjectNames,
+                std::set< TCollection_AsciiString >&      theRemovedObjIDs,
                 SALOMEDS::Study_ptr&                      theStudy,
                 const bool                                theHistoricalDump);
This commit is contained in:
eap 2013-03-07 08:37:57 +00:00
parent 23d265a7a7
commit 19ddff45f9
4 changed files with 95 additions and 41 deletions

View File

@ -179,11 +179,24 @@ namespace {
void CheckObjectPresence( const Handle(_pyCommand)& cmd, set<_pyID> & presentObjects) void CheckObjectPresence( const Handle(_pyCommand)& cmd, set<_pyID> & presentObjects)
{ {
// either comment or erase a command including NotPublishedObjectName()
if ( cmd->GetString().Location( TPythonDump::NotPublishedObjectName(), 1, cmd->Length() )) if ( cmd->GetString().Location( TPythonDump::NotPublishedObjectName(), 1, cmd->Length() ))
{ {
cmd->Comment(); bool isResultPublished = false;
for ( int i = 0; i < cmd->GetNbResultValues(); i++ )
{
_pyID objID = cmd->GetResultValue( i+1 );
if ( cmd->IsStudyEntry( objID ))
isResultPublished = (! theGen->IsNotPublished( objID ));
theGen->ObjectCreationRemoved( objID ); // objID.SetName( name ) is not needed
}
if ( isResultPublished )
cmd->Comment();
else
cmd->Clear();
return; return;
} }
// comment a command having not created args
for ( int iArg = cmd->GetNbArgs(); iArg; --iArg ) for ( int iArg = cmd->GetNbArgs(); iArg; --iArg )
{ {
const _pyID& arg = cmd->GetArg( iArg ); const _pyID& arg = cmd->GetArg( iArg );
@ -197,14 +210,23 @@ namespace {
cmd->Comment(); cmd->Comment();
cmd->GetString() += " ### " ; cmd->GetString() += " ### " ;
cmd->GetString() += *id + " has not been yet created"; cmd->GetString() += *id + " has not been yet created";
for ( int i = 0; i < cmd->GetNbResultValues(); i++ ) {
_pyID objID = cmd->GetResultValue( i+1 );
theGen->ObjectCreationRemoved( objID ); // objID.SetName( name ) is not needed
}
return; return;
} }
} }
// comment a command having not created Object
const _pyID& obj = cmd->GetObject(); const _pyID& obj = cmd->GetObject();
if ( !obj.IsEmpty() && cmd->IsStudyEntry( obj ) && !presentObjects.count( obj )) if ( !obj.IsEmpty() && cmd->IsStudyEntry( obj ) && !presentObjects.count( obj ))
{ {
cmd->Comment(); cmd->Comment();
cmd->GetString() += " ### not created object" ; cmd->GetString() += " ### not created object" ;
for ( int i = 0; i < cmd->GetNbResultValues(); i++ ) {
_pyID objID = cmd->GetResultValue( i+1 );
theGen->ObjectCreationRemoved( objID ); // objID.SetName( name ) is not needed
}
} }
const _pyID& result = cmd->GetResultValue(); const _pyID& result = cmd->GetResultValue();
if ( result.IsEmpty() || result.Value( 1 ) == '"' || result.Value( 1 ) == '\'' ) if ( result.IsEmpty() || result.Value( 1 ) == '"' || result.Value( 1 ) == '\'' )
@ -323,13 +345,15 @@ namespace {
//================================================================================ //================================================================================
/*! /*!
* \brief Convert python script using commands of smesh.py * \brief Convert a python script using commands of smesh.py
* \param theScript - Input script * \param theScript - Input script
* \retval TCollection_AsciiString - Convertion result * \param theEntry2AccessorMethod - returns method names to access to
* \param theToKeepAllCommands - to keep all commands or * objects wrapped with python class
* to exclude commands relating to objects removed from study * \param theObjectNames - names of objects
* * \param theRemovedObjIDs - entries of objects whose created commands were removed
* Class SMESH_2smeshpy declared in SMESH_PythonDump.hxx * \param theHistoricalDump - true means to keep all commands, false means
* to exclude commands relating to objects removed from study
* \retval TCollection_AsciiString - Convertion result
*/ */
//================================================================================ //================================================================================
@ -337,10 +361,15 @@ TCollection_AsciiString
SMESH_2smeshpy::ConvertScript(const TCollection_AsciiString& theScript, SMESH_2smeshpy::ConvertScript(const TCollection_AsciiString& theScript,
Resource_DataMapOfAsciiStringAsciiString& theEntry2AccessorMethod, Resource_DataMapOfAsciiStringAsciiString& theEntry2AccessorMethod,
Resource_DataMapOfAsciiStringAsciiString& theObjectNames, Resource_DataMapOfAsciiStringAsciiString& theObjectNames,
std::set< TCollection_AsciiString >& theRemovedObjIDs,
SALOMEDS::Study_ptr& theStudy, SALOMEDS::Study_ptr& theStudy,
const bool theToKeepAllCommands) const bool theToKeepAllCommands)
{ {
theGen = new _pyGen( theEntry2AccessorMethod, theObjectNames, theStudy, theToKeepAllCommands ); theGen = new _pyGen( theEntry2AccessorMethod,
theObjectNames,
theRemovedObjIDs,
theStudy,
theToKeepAllCommands );
// split theScript into separate commands // split theScript into separate commands
@ -350,9 +379,9 @@ SMESH_2smeshpy::ConvertScript(const TCollection_AsciiString& theScrip
while ( from < end && ( to = theScript.Location( "\n", from, end ))) while ( from < end && ( to = theScript.Location( "\n", from, end )))
{ {
if ( to != from ) if ( to != from )
// cut out and store a command // cut out and store a command
aNoteBook->AddCommand( theScript.SubString( from, to - 1 )); aNoteBook->AddCommand( theScript.SubString( from, to - 1 ));
from = to + 1; from = to + 1;
} }
aNoteBook->ReplaceVariables(); aNoteBook->ReplaceVariables();
@ -421,12 +450,14 @@ SMESH_2smeshpy::ConvertScript(const TCollection_AsciiString& theScrip
_pyGen::_pyGen(Resource_DataMapOfAsciiStringAsciiString& theEntry2AccessorMethod, _pyGen::_pyGen(Resource_DataMapOfAsciiStringAsciiString& theEntry2AccessorMethod,
Resource_DataMapOfAsciiStringAsciiString& theObjectNames, Resource_DataMapOfAsciiStringAsciiString& theObjectNames,
std::set< TCollection_AsciiString >& theRemovedObjIDs,
SALOMEDS::Study_ptr& theStudy, SALOMEDS::Study_ptr& theStudy,
const bool theToKeepAllCommands) const bool theToKeepAllCommands)
: _pyObject( new _pyCommand( "", 0 )), : _pyObject( new _pyCommand( "", 0 )),
myNbCommands( 0 ), myNbCommands( 0 ),
myID2AccessorMethod( theEntry2AccessorMethod ), myID2AccessorMethod( theEntry2AccessorMethod ),
myObjectNames( theObjectNames ), myObjectNames( theObjectNames ),
myRemovedObjIDs( theRemovedObjIDs ),
myNbFilters( 0 ), myNbFilters( 0 ),
myToKeepAllCommands( theToKeepAllCommands ), myToKeepAllCommands( theToKeepAllCommands ),
myStudy( SALOMEDS::Study::_duplicate( theStudy )), myStudy( SALOMEDS::Study::_duplicate( theStudy )),
@ -792,7 +823,7 @@ void _pyGen::Process( const Handle(_pyCommand)& theCommand )
method == "CreateMeshesFromSAUV"|| method == "CreateMeshesFromSAUV"||
method == "CreateMeshesFromGMF" ) method == "CreateMeshesFromGMF" )
{ {
for(int ind = 0;ind<theCommand->GetNbResultValues();ind++) for ( int ind = 0; ind < theCommand->GetNbResultValues(); ind++ )
{ {
_pyID meshID = theCommand->GetResultValue(ind+1); _pyID meshID = theCommand->GetResultValue(ind+1);
if ( !theCommand->IsStudyEntry( meshID ) ) continue; if ( !theCommand->IsStudyEntry( meshID ) ) continue;
@ -1373,6 +1404,19 @@ bool _pyGen::IsNotPublished(const _pyID& theObjID) const
return true; // SMESH object not in study return true; // SMESH object not in study
} }
//================================================================================
/*!
* \brief Remove object name from myObjectNames that leads to that SetName() for
* this object is not dumped
* \param [in] theObjID - entry of the object whose creation command was eliminated
*/
//================================================================================
void _pyGen::ObjectCreationRemoved(const _pyID& theObjID)
{
myRemovedObjIDs.insert( theObjID );
}
//================================================================================ //================================================================================
/*! /*!
* \brief Return reader of hypotheses of plugins * \brief Return reader of hypotheses of plugins
@ -3189,22 +3233,21 @@ const TCollection_AsciiString & _pyCommand::GetResultValue()
//================================================================================ //================================================================================
/*! /*!
* \brief Return number of python command result value ResultValue = Obj.Meth() * \brief Return number of python command result value ResultValue = Obj.Meth()
* \retval const int
*/ */
//================================================================================ //================================================================================
const int _pyCommand::GetNbResultValues() int _pyCommand::GetNbResultValues()
{ {
int nb = 0;
int begPos = 1; int begPos = 1;
int Nb=0;
int endPos = myString.Location( "=", 1, Length() ); int endPos = myString.Location( "=", 1, Length() );
TCollection_AsciiString str = ""; while ( begPos < endPos )
while ( begPos < endPos) { {
str = GetWord( myString, begPos, true ); _AString str = GetWord( myString, begPos, true );
begPos = begPos+ str.Length(); begPos = begPos+ str.Length();
Nb++; nb++;
} }
return (Nb-1); return (nb-1);
} }

View File

@ -123,7 +123,7 @@ public:
bool IsEmpty() const { return myString.IsEmpty(); } bool IsEmpty() const { return myString.IsEmpty(); }
_AString GetIndentation(); _AString GetIndentation();
const _AString & GetResultValue(); const _AString & GetResultValue();
const int GetNbResultValues(); int GetNbResultValues();
_AString GetResultValue(int res); _AString GetResultValue(int res);
const _AString & GetObject(); const _AString & GetObject();
const _AString & GetMethod(); const _AString & GetMethod();
@ -223,6 +223,7 @@ class _pyGen: public _pyObject
public: public:
_pyGen(Resource_DataMapOfAsciiStringAsciiString& theEntry2AccessorMethod, _pyGen(Resource_DataMapOfAsciiStringAsciiString& theEntry2AccessorMethod,
Resource_DataMapOfAsciiStringAsciiString& theObjectNames, Resource_DataMapOfAsciiStringAsciiString& theObjectNames,
std::set< TCollection_AsciiString >& theRemovedObjIDs,
SALOMEDS::Study_ptr& theStudy, SALOMEDS::Study_ptr& theStudy,
const bool theToKeepAllCommands); const bool theToKeepAllCommands);
Handle(_pyCommand) AddCommand( const _AString& theCommand ); Handle(_pyCommand) AddCommand( const _AString& theCommand );
@ -236,8 +237,8 @@ public:
_pyID GenerateNewID( const _pyID& theID ); _pyID GenerateNewID( const _pyID& theID );
void AddObject( Handle(_pyObject)& theObj ); void AddObject( Handle(_pyObject)& theObj );
void SetProxyObject( const _pyID& theID, Handle(_pyObject)& theObj ); void SetProxyObject( const _pyID& theID, Handle(_pyObject)& theObj );
Handle(_pyObject) FindObject( const _pyID& theObjID ) const; Handle(_pyObject) FindObject( const _pyID& theObjID ) const;
Handle(_pySubMesh) FindSubMesh( const _pyID& theSubMeshID ); Handle(_pySubMesh) FindSubMesh( const _pyID& theSubMeshID );
Handle(_pyHypothesis) FindHyp( const _pyID& theHypID ); Handle(_pyHypothesis) FindHyp( const _pyID& theHypID );
Handle(_pyHypothesis) FindAlgo( const _pyID& theGeom, const _pyID& theMesh, Handle(_pyHypothesis) FindAlgo( const _pyID& theGeom, const _pyID& theMesh,
const Handle(_pyHypothesis)& theHypothesis); const Handle(_pyHypothesis)& theHypothesis);
@ -249,6 +250,7 @@ public:
bool IsGeomObject(const _pyID& theObjID) const; bool IsGeomObject(const _pyID& theObjID) const;
bool IsNotPublished(const _pyID& theObjID) const; bool IsNotPublished(const _pyID& theObjID) const;
void ObjectCreationRemoved(const _pyID& theObjID);
bool IsToKeepAllCommands() const { return myToKeepAllCommands; } bool IsToKeepAllCommands() const { return myToKeepAllCommands; }
void AddExportedMesh(const _AString& file, const ExportedMeshData& mesh ) void AddExportedMesh(const _AString& file, const ExportedMeshData& mesh )
{ myFile2ExportedMesh[ file ] = mesh; } { myFile2ExportedMesh[ file ] = mesh; }
@ -268,21 +270,22 @@ private:
const bool theIsAfter ); const bool theIsAfter );
private: private:
std::map< _pyID, Handle(_pyMesh) > myMeshes; std::map< _pyID, Handle(_pyMesh) > myMeshes;
std::map< _pyID, Handle(_pyMeshEditor) > myMeshEditors; std::map< _pyID, Handle(_pyMeshEditor) > myMeshEditors;
std::map< _pyID, Handle(_pyObject) > myObjects; std::map< _pyID, Handle(_pyObject) > myObjects;
std::list< Handle(_pyHypothesis) > myHypos; std::list< Handle(_pyHypothesis) > myHypos;
std::list< Handle(_pyCommand) > myCommands; std::list< Handle(_pyCommand) > myCommands;
int myNbCommands; int myNbCommands;
Resource_DataMapOfAsciiStringAsciiString& myID2AccessorMethod; Resource_DataMapOfAsciiStringAsciiString& myID2AccessorMethod;
Resource_DataMapOfAsciiStringAsciiString& myObjectNames; Resource_DataMapOfAsciiStringAsciiString& myObjectNames;
Handle(_pyCommand) myLastCommand; std::set< TCollection_AsciiString >& myRemovedObjIDs;
int myNbFilters; Handle(_pyCommand) myLastCommand;
bool myToKeepAllCommands; int myNbFilters;
SALOMEDS::Study_var myStudy; bool myToKeepAllCommands;
int myGeomIDNb, myGeomIDIndex; SALOMEDS::Study_var myStudy;
std::map< _AString, ExportedMeshData > myFile2ExportedMesh; int myGeomIDNb, myGeomIDIndex;
Handle( _pyHypothesisReader ) myHypReader; std::map< _AString, ExportedMeshData > myFile2ExportedMesh;
Handle( _pyHypothesisReader ) myHypReader;
DEFINE_STANDARD_RTTI (_pyGen) DEFINE_STANDARD_RTTI (_pyGen)
}; };

View File

@ -915,9 +915,11 @@ TCollection_AsciiString SMESH_Gen_i::DumpPython_impl
// Some objects are wrapped with python classes and // Some objects are wrapped with python classes and
// Resource_DataMapOfAsciiStringAsciiString holds methods returning wrapped objects // Resource_DataMapOfAsciiStringAsciiString holds methods returning wrapped objects
Resource_DataMapOfAsciiStringAsciiString anEntry2AccessorMethod; Resource_DataMapOfAsciiStringAsciiString anEntry2AccessorMethod;
std::set< TCollection_AsciiString > aRemovedObjIDs;
if ( !getenv("NO_2smeshpy_conversion")) if ( !getenv("NO_2smeshpy_conversion"))
aScript = SMESH_2smeshpy::ConvertScript( aScript, anEntry2AccessorMethod, aScript = SMESH_2smeshpy::ConvertScript( aScript, anEntry2AccessorMethod,
theObjectNames, theStudy, isHistoricalDump ); theObjectNames, aRemovedObjIDs,
theStudy, isHistoricalDump );
// Replace characters used instead of quote marks to quote notebook variables // Replace characters used instead of quote marks to quote notebook variables
{ {
@ -1017,6 +1019,7 @@ TCollection_AsciiString SMESH_Gen_i::DumpPython_impl
anUpdatedScript += "\n\taStudyBuilder = theStudy.NewBuilder()"; anUpdatedScript += "\n\taStudyBuilder = theStudy.NewBuilder()";
} }
for (int ir = 1; ir <= seqRemoved.Length(); ir++) { for (int ir = 1; ir <= seqRemoved.Length(); ir++) {
if ( aRemovedObjIDs.count( seqRemoved.Value(ir) )) continue;
anUpdatedScript += "\n\tSO = theStudy.FindObjectIOR(theStudy.ConvertObjectToIOR("; anUpdatedScript += "\n\tSO = theStudy.FindObjectIOR(theStudy.ConvertObjectToIOR(";
anUpdatedScript += seqRemoved.Value(ir); anUpdatedScript += seqRemoved.Value(ir);
// for object wrapped by class of smesh.py // for object wrapped by class of smesh.py
@ -1037,13 +1040,14 @@ TCollection_AsciiString SMESH_Gen_i::DumpPython_impl
for (Standard_Integer i = 1; i <= aLen; i += 2) for (Standard_Integer i = 1; i <= aLen; i += 2)
{ {
anEntry = aScript.SubString(aSeq->Value(i), aSeq->Value(i + 1)); anEntry = aScript.SubString(aSeq->Value(i), aSeq->Value(i + 1));
aName = geom->GetDumpName( anEntry.ToCString() ); aName = geom->GetDumpName( anEntry.ToCString() );
if (aName.IsEmpty() && // Not a GEOM object if (aName.IsEmpty() && // Not a GEOM object
theNames.IsBound(anEntry) && theNames.IsBound(anEntry) &&
!aRemovedObjIDs.count(anEntry) && // a command creating anEntry was erased
!mapEntries.IsBound(anEntry) && // Not yet processed !mapEntries.IsBound(anEntry) && // Not yet processed
!mapRemoved.IsBound(anEntry)) // Was not removed !mapRemoved.IsBound(anEntry)) // Was not removed
{ {
aName = theObjectNames.Find(anEntry); aName = theObjectNames.Find(anEntry);
aGUIName = theNames.Find(anEntry); aGUIName = theNames.Find(anEntry);
mapEntries.Bind(anEntry, aName); mapEntries.Bind(anEntry, aName);
anUpdatedScript += helper + "\n\t" + aSMESHGen + ".SetName(" + aName; anUpdatedScript += helper + "\n\t" + aSMESHGen + ".SetName(" + aName;

View File

@ -31,6 +31,7 @@
#include <sstream> #include <sstream>
#include <vector> #include <vector>
#include <set>
class SMESH_Gen_i; class SMESH_Gen_i;
class SMESH_MeshEditor_i; class SMESH_MeshEditor_i;
@ -51,8 +52,10 @@ public:
/*! /*!
* \brief Convert a python script using commands of smesh.py * \brief Convert a python script using commands of smesh.py
* \param theScript - Input script * \param theScript - Input script
* \param theEntry2AccessorMethod - The returning method names to access to * \param theEntry2AccessorMethod - returns method names to access to
* objects wrapped with python class * objects wrapped with python class
* \param theObjectNames - names of objects
* \param theRemovedObjIDs - entries of objects whose created commands were removed
* \param theHistoricalDump - true means to keep all commands, false means * \param theHistoricalDump - true means to keep all commands, false means
* to exclude commands relating to objects removed from study * to exclude commands relating to objects removed from study
* \retval TCollection_AsciiString - Convertion result * \retval TCollection_AsciiString - Convertion result
@ -61,6 +64,7 @@ public:
ConvertScript(const TCollection_AsciiString& theScript, ConvertScript(const TCollection_AsciiString& theScript,
Resource_DataMapOfAsciiStringAsciiString& theEntry2AccessorMethod, Resource_DataMapOfAsciiStringAsciiString& theEntry2AccessorMethod,
Resource_DataMapOfAsciiStringAsciiString& theObjectNames, Resource_DataMapOfAsciiStringAsciiString& theObjectNames,
std::set< TCollection_AsciiString >& theRemovedObjIDs,
SALOMEDS::Study_ptr& theStudy, SALOMEDS::Study_ptr& theStudy,
const bool theHistoricalDump); const bool theHistoricalDump);