-// Copyright (C) 2007-2012 CEA/DEN, EDF R&D, OPEN CASCADE
+// Copyright (C) 2007-2013 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
void CheckObjectPresence( const Handle(_pyCommand)& cmd, set<_pyID> & presentObjects)
{
- for ( int iArg = cmd->GetNbArgs(); iArg; --iArg )
+ // either comment or erase a command including NotPublishedObjectName()
+ if ( cmd->GetString().Location( TPythonDump::NotPublishedObjectName(), 1, cmd->Length() ))
+ {
+ 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;
+ }
+ // check if an Object was created in the script
+ _AString comment;
+ const _pyID& obj = cmd->GetObject();
+ if ( !obj.IsEmpty() && cmd->IsStudyEntry( obj ) && !presentObjects.count( obj ))
+ {
+ comment = "not created Object";
+ theGen->ObjectCreationRemoved( obj );
+ }
+ // check if a command has not created args
+ for ( int iArg = cmd->GetNbArgs(); iArg && comment.IsEmpty(); --iArg )
{
const _pyID& arg = cmd->GetArg( iArg );
if ( arg.IsEmpty() || arg.Value( 1 ) == '"' || arg.Value( 1 ) == '\'' )
for ( ; id != idList.end(); ++id )
if ( !theGen->IsGeomObject( *id ) && !presentObjects.count( *id ))
{
- cmd->Comment();
- cmd->GetString() += " ### " ;
- cmd->GetString() += *id + " has not been yet created";
- return;
+ comment += *id + " has not been yet created";
+ break;
}
}
- const _pyID& obj = cmd->GetObject();
- if ( !obj.IsEmpty() && cmd->IsStudyEntry( obj ) && !presentObjects.count( obj ))
+ // treat result objects
+ const _pyID& result = cmd->GetResultValue();
+ if ( !result.IsEmpty() && result.Value( 1 ) != '"' && result.Value( 1 ) != '\'' )
+ {
+ list< _pyID > idList = cmd->GetStudyEntries( result );
+ list< _pyID >::iterator id = idList.begin();
+ for ( ; id != idList.end(); ++id )
+ if ( comment.IsEmpty() )
+ presentObjects.insert( *id );
+ else
+ theGen->ObjectCreationRemoved( *id ); // objID.SetName( name ) is not needed
+ }
+ // comment the command
+ if ( !comment.IsEmpty() )
{
cmd->Comment();
- cmd->GetString() += " ### not created object" ;
+ cmd->GetString() += " ### ";
+ cmd->GetString() += comment;
}
- const _pyID& result = cmd->GetResultValue();
- if ( result.IsEmpty() || result.Value( 1 ) == '"' || result.Value( 1 ) == '\'' )
- return;
- list< _pyID > idList = cmd->GetStudyEntries( result );
- list< _pyID >::iterator id = idList.begin();
- for ( ; id != idList.end(); ++id )
- presentObjects.insert( *id );
}
//================================================================================
// - FT_BallDiameter = 37
// v 6.7.1: FT_Undefined == 45, new items:
// - FT_EntityType = 36
+ // v 7.3.0: FT_Undefined == 46, new items:
+ // - FT_ConnectedElements = 39
//
// It's necessary to continue recording this history and to fill
// undef2newItems (see below) accordingly.
undef2newItems[ 39 ].assign( items, items+6 ); }
{ int items[] = { 14, 15, 16, 17 };
undef2newItems[ 43 ].assign( items, items+4 ); }
- { int items[] = { 37 };
- undef2newItems[ 44 ].assign( items, items+1 ); }
- { int items[] = { 36 };
- undef2newItems[ 45 ].assign( items, items+1 ); }
+ undef2newItems[ 44 ].push_back( 37 );
+ undef2newItems[ 45 ].push_back( 36 );
+ undef2newItems[ 46 ].push_back( 39 );
+
+ ASSERT( undef2newItems.rbegin()->first == SMESH::FT_Undefined );
}
int iType = Type.IntegerValue();
BinaryOp = TCollection_AsciiString( iBinaryOp );
}
}
+
+ //================================================================================
+ /*!
+ * \brief Replaces "SMESH.PointStruct(x,y,z)" and "SMESH.DirStruct( SMESH.PointStruct(x,y,z))"
+ * arguments of a given command by a list "[x,y,z]" if the list is accesible
+ * type of argument.
+ */
+ //================================================================================
+
+ void StructToList( Handle( _pyCommand)& theCommand )
+ {
+ static TStringSet methodsAcceptingList;
+ if ( methodsAcceptingList.empty() ) {
+ const char * methodNames[] = {
+ "GetCriterion","Reorient2D","ExtrusionSweep","ExtrusionSweepMakeGroups0D",
+ "ExtrusionSweepMakeGroups","ExtrusionSweep0D",
+ "AdvancedExtrusion","AdvancedExtrusionMakeGroups",
+ "ExtrusionSweepObject","ExtrusionSweepObject0DMakeGroups",
+ "ExtrusionSweepObjectMakeGroups","ExtrusionSweepObject0D",
+ "ExtrusionSweepObject1D","ExtrusionSweepObject1DMakeGroups",
+ "ExtrusionSweepObject2D","ExtrusionSweepObject2DMakeGroups",
+ "Translate","TranslateMakeGroups","TranslateMakeMesh",
+ "TranslateObject","TranslateObjectMakeGroups", "TranslateObjectMakeMesh",
+ "ExtrusionAlongPathX","ExtrusionAlongPathObjX"
+ ,"" }; // <- mark of the end
+ methodsAcceptingList.Insert( methodNames );
+ }
+ if ( methodsAcceptingList.Contains( theCommand->GetMethod() ))
+ {
+ for ( int i = theCommand->GetNbArgs(); i > 0; --i )
+ {
+ const _AString & arg = theCommand->GetArg( i );
+ if ( arg.Search( "SMESH.PointStruct" ) == 1 ||
+ arg.Search( "SMESH.DirStruct" ) == 1 )
+ {
+ Handle(_pyCommand) workCmd = new _pyCommand( arg );
+ if ( workCmd->GetNbArgs() == 1 ) // SMESH.DirStruct( SMESH.PointStruct(x,y,z))
+ {
+ workCmd = new _pyCommand( workCmd->GetArg( 1 ) );
+ }
+ if ( workCmd->GetNbArgs() == 3 ) // SMESH.PointStruct(x,y,z)
+ {
+ _AString newArg = "[ ";
+ newArg += ( workCmd->GetArg( 1 ) + ", " +
+ workCmd->GetArg( 2 ) + ", " +
+ workCmd->GetArg( 3 ) + " ]");
+ theCommand->SetArg( i, newArg );
+ }
+ }
+ }
+ }
+ }
+ //================================================================================
+ /*!
+ * \brief Replaces "mesh.GetIDSource([id1,id2])" argument of a given command by
+ * a list "[id1,id2]" if the list is an accesible type of argument.
+ */
+ //================================================================================
+
+ void GetIDSourceToList( Handle( _pyCommand)& theCommand )
+ {
+ static TStringSet methodsAcceptingList;
+ if ( methodsAcceptingList.empty() ) {
+ const char * methodNames[] = {
+ "ExportPartToMED","ExportPartToDAT","ExportPartToUNV","ExportPartToSTL",
+ "ExportCGNS","ExportGMF",
+ "Create0DElementsOnAllNodes","Reorient2D","QuadTo4Tri",
+ "ScaleMakeGroups","Scale","ScaleMakeMesh",
+ "FindCoincidentNodesOnPartBut","DoubleElements"
+ ,"" }; // <- mark of the end
+ methodsAcceptingList.Insert( methodNames );
+ }
+ if ( methodsAcceptingList.Contains( theCommand->GetMethod() ))
+ {
+ for ( int i = theCommand->GetNbArgs(); i > 0; --i )
+ {
+ _pyCommand argCmd( theCommand->GetArg( i ));
+ if ( argCmd.GetMethod() == "GetIDSource" &&
+ argCmd.GetNbArgs() == 2 )
+ {
+ theCommand->SetArg( i, argCmd.GetArg( 1 ));
+ }
+ }
+ }
+ }
}
//================================================================================
/*!
- * \brief Convert python script using commands of smesh.py
- * \param theScript - Input script
- * \retval TCollection_AsciiString - Convertion result
- * \param theToKeepAllCommands - to keep all commands or
- * to exclude commands relating to objects removed from study
- *
- * Class SMESH_2smeshpy declared in SMESH_PythonDump.hxx
+ * \brief Convert a python script using commands of smeshBuilder.py
+ * \param theScript - Input script
+ * \param theEntry2AccessorMethod - returns method names to access to
+ * 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
+ * to exclude commands relating to objects removed from study
+ * \retval TCollection_AsciiString - Convertion result
*/
//================================================================================
SMESH_2smeshpy::ConvertScript(const TCollection_AsciiString& theScript,
Resource_DataMapOfAsciiStringAsciiString& theEntry2AccessorMethod,
Resource_DataMapOfAsciiStringAsciiString& theObjectNames,
+ std::set< TCollection_AsciiString >& theRemovedObjIDs,
SALOMEDS::Study_ptr& theStudy,
const bool theToKeepAllCommands)
{
- theGen = new _pyGen( theEntry2AccessorMethod, theObjectNames, theStudy, theToKeepAllCommands );
+ theGen = new _pyGen( theEntry2AccessorMethod,
+ theObjectNames,
+ theRemovedObjIDs,
+ theStudy,
+ theToKeepAllCommands );
// split theScript into separate commands
while ( from < end && ( to = theScript.Location( "\n", from, end )))
{
if ( to != from )
- // cut out and store a command
- aNoteBook->AddCommand( theScript.SubString( from, to - 1 ));
- from = to + 1;
+ // cut out and store a command
+ aNoteBook->AddCommand( theScript.SubString( from, to - 1 ));
+ from = to + 1;
}
aNoteBook->ReplaceVariables();
_pyGen::_pyGen(Resource_DataMapOfAsciiStringAsciiString& theEntry2AccessorMethod,
Resource_DataMapOfAsciiStringAsciiString& theObjectNames,
+ std::set< TCollection_AsciiString >& theRemovedObjIDs,
SALOMEDS::Study_ptr& theStudy,
const bool theToKeepAllCommands)
: _pyObject( new _pyCommand( "", 0 )),
myNbCommands( 0 ),
myID2AccessorMethod( theEntry2AccessorMethod ),
myObjectNames( theObjectNames ),
+ myRemovedObjIDs( theRemovedObjIDs ),
myNbFilters( 0 ),
myToKeepAllCommands( theToKeepAllCommands ),
myStudy( SALOMEDS::Study::_duplicate( theStudy )),
//================================================================================
/*!
- * \brief name of SMESH_Gen in smesh.py
+ * \brief name of SMESH_Gen in smeshBuilder.py
*/
//================================================================================
// Prevent moving a command creating a sub-mesh to the end of the script
// if the sub-mesh is used in theCommand as argument
- if ( _pySubMesh::CanBeArgOfMethod( aCommand->GetMethod() ))
- {
- PlaceSubmeshAfterItsCreation( aCommand );
- }
+ // if ( _pySubMesh::CanBeArgOfMethod( aCommand->GetMethod() ))
+ // {
+ // PlaceSubmeshAfterItsCreation( aCommand );
+ // }
+
+ // Method( SMESH.PointStruct(x,y,z)... -> Method( [x,y,z]...
+ StructToList( aCommand );
+
+ // not to erase _pySelfEraser's etc. used as args in some commands
+ std::list< _pyID >::const_iterator id = myKeepAgrCmdsIDs.begin();
+ for ( ; id != myKeepAgrCmdsIDs.end(); ++id )
+ if ( *id != objID && theCommand.Search( *id ) > id->Length() )
+ {
+ Handle(_pyObject) obj = FindObject( *id );
+ if ( !obj.IsNull() )
+ obj->AddArgCmd( aCommand );
+ }
// Find an object to process theCommand
if ( objID == this->GetID() || objID == SMESH_2smeshpy::GenName())
{
this->Process( aCommand );
+ //addFilterUser( aCommand, theGen ); // protect filters from clearing
return aCommand;
}
else if ( aCommand->GetMethod() == "GetSubMesh" ) { // SubMesh creation
_pyID subMeshID = aCommand->GetResultValue();
Handle(_pySubMesh) subMesh = new _pySubMesh( aCommand );
+ CheckObjectIsReCreated( subMesh );
myObjects.insert( make_pair( subMeshID, subMesh ));
}
+ // Method( mesh.GetIDSource([id1,id2]) -> Method( [id1,id2]
+ GetIDSourceToList( aCommand );
+
+ //addFilterUser( aCommand, theGen ); // protect filters from clearing
+
id_mesh->second->Process( aCommand );
id_mesh->second->AddProcessedCmd( aCommand );
return aCommand;
map< _pyID, Handle(_pyMeshEditor) >::iterator id_editor = myMeshEditors.find( objID );
if ( id_editor != myMeshEditors.end() )
{
+ // Method( mesh.GetIDSource([id1,id2]) -> Method( [id1,id2]
+ GetIDSourceToList( aCommand );
+
+ //addFilterUser( aCommand, theGen ); // protect filters from clearing
+
const TCollection_AsciiString& method = aCommand->GetMethod();
// some commands of SMESH_MeshEditor create meshes and groups
!myMeshes.count( meshID ) &&
aCommand->IsStudyEntry( meshID ))
{
- TCollection_AsciiString processedCommand = aCommand->GetString();
+ _AString processedCommand = aCommand->GetString();
Handle(_pyMesh) mesh = new _pyMesh( aCommand, meshID );
+ CheckObjectIsReCreated( mesh );
myMeshes.insert( make_pair( meshID, mesh ));
aCommand->Clear();
aCommand->GetString() = processedCommand; // discard changes made by _pyMesh
} // SMESH_MeshEditor methods
// SMESH_Hypothesis method?
- list< Handle(_pyHypothesis) >::iterator hyp = myHypos.begin();
- for ( ; hyp != myHypos.end(); ++hyp )
- if ( !(*hyp)->IsAlgo() && objID == (*hyp)->GetID() ) {
- (*hyp)->Process( aCommand );
- (*hyp)->AddProcessedCmd( aCommand );
- return aCommand;
- }
+ Handle(_pyHypothesis) hyp = FindHyp( objID );
+ if ( !hyp.IsNull() && !hyp->IsAlgo() )
+ {
+ hyp->Process( aCommand );
+ hyp->AddProcessedCmd( aCommand );
+ return aCommand;
+ }
// aFilterManager.CreateFilter() ?
if ( aCommand->GetMethod() == "CreateFilter" )
Handle(_pyObject) filter( new _pyFilter( aCommand, newID ));
AddObject( filter );
}
+ // aFreeNodes0x5011f80 = aFilterManager.CreateFreeNodes() ## issue 0020976
+ else if ( theCommand.Search( "aFilterManager.Create" ) > 0 )
+ {
+ // create _pySelfEraser for functors
+ Handle(_pySelfEraser) functor = new _pySelfEraser( aCommand );
+ functor->IgnoreOwnCalls(); // to erase if not used as an argument
+ AddObject( functor );
+ }
// other object method?
map< _pyID, Handle(_pyObject) >::iterator id_obj = myObjects.find( objID );
// 1 2 3 4 5 6 7 8 9 10
// in order to avoid the problem of type mismatch of long and FunctorType
const TCollection_AsciiString
- SMESH("SMESH."), dfltFunctor("SMESH.FT_Undefined"), dftlTol("1e-07"), dftlPreci("-1");
+ SMESH("SMESH."), dfltFunctor("SMESH.FT_Undefined"), dfltTol("1e-07"), dfltPreci("-1");
TCollection_AsciiString
Type = aCommand->GetArg(1), // long
Compare = aCommand->GetArg(2), // long
UnaryOp = SMESH + SMESH::FunctorTypeToString( SMESH::FunctorType( UnaryOp.IntegerValue() ));
BinaryOp = SMESH + SMESH::FunctorTypeToString( SMESH::FunctorType( BinaryOp.IntegerValue() ));
+ if ( Compare == "SMESH.FT_EqualTo" )
+ Compare = "'='";
+
aCommand->RemoveArgs();
aCommand->SetObject( SMESH_2smeshpy::GenName() );
aCommand->SetMethod( "GetCriterion" );
// set SMESH.EntityType instead of a numerical Threshold
const char* types[SMESH::Entity_Ball+1] = {
"Entity_Node", "Entity_0D", "Entity_Edge", "Entity_Quad_Edge",
- "Entity_Triangle", "Entity_Quad_Triangle",
+ "Entity_Triangle", "Entity_Quad_Triangle", "Entity_BiQuad_Triangle",
"Entity_Quadrangle", "Entity_Quad_Quadrangle", "Entity_BiQuad_Quadrangle",
"Entity_Polygon", "Entity_Quad_Polygon", "Entity_Tetra", "Entity_Quad_Tetra",
"Entity_Pyramid", "Entity_Quad_Pyramid",
Threshold = SMESH + types[ iGeom ];
}
}
- if ( ThresholdID.Length() != 2 && ThresholdStr.Length() != 2) // not '' or ""
+ if ( ThresholdID.Length() != 2 ) // neither '' nor ""
aCommand->SetArg( 4, ThresholdID.SubString( 2, ThresholdID.Length()-1 )); // shape entry
else if ( ThresholdStr.Length() != 2 )
aCommand->SetArg( 4, ThresholdStr );
aCommand->SetArg( 4, Threshold );
// find the last not default arg
int lastDefault = 8;
- if ( Tolerance == dftlTol ) {
+ if ( Tolerance == dfltTol ) {
lastDefault = 7;
if ( BinaryOp == dfltFunctor ) {
lastDefault = 6;
if ( 5 < lastDefault ) aCommand->SetArg( 5, UnaryOp );
if ( 6 < lastDefault ) aCommand->SetArg( 6, BinaryOp );
if ( 7 < lastDefault ) aCommand->SetArg( 7, Tolerance );
- if ( Precision != dftlPreci )
+ if ( Precision != dfltPreci )
{
TCollection_AsciiString crit = aCommand->GetResultValue();
aCommand->GetString() += "; ";
if ( method == "CreateMesh" || method == "CreateEmptyMesh")
{
Handle(_pyMesh) mesh = new _pyMesh( theCommand );
- myMeshes.insert( make_pair( mesh->GetID(), mesh ));
+ AddObject( mesh );
return;
}
if ( method == "CreateMeshesFromUNV" ||
method == "CreateMeshesFromSTL" ||
- method == "CreateMeshesFromCGNS" ||
- method == "CopyMesh" )
+ method == "CopyMesh" ) // command result is a mesh
{
Handle(_pyMesh) mesh = new _pyMesh( theCommand, theCommand->GetResultValue() );
- myMeshes.insert( make_pair( mesh->GetID(), mesh ));
+ AddObject( mesh );
return;
}
if( method == "CreateMeshesFromMED" ||
method == "CreateMeshesFromSAUV"||
- method == "CreateMeshesFromGMF" )
+ method == "CreateMeshesFromCGNS" ||
+ method == "CreateMeshesFromGMF" ) // command result is ( [mesh1,mesh2], status )
{
- for(int ind = 0;ind<theCommand->GetNbResultValues();ind++)
+ for ( int ind = 0; ind < theCommand->GetNbResultValues(); ind++ )
{
_pyID meshID = theCommand->GetResultValue(ind+1);
if ( !theCommand->IsStudyEntry( meshID ) ) continue;
Handle(_pyMesh) mesh = new _pyMesh( theCommand, theCommand->GetResultValue(ind+1));
- myMeshes.insert( make_pair( mesh->GetID(), mesh ));
+ AddObject( mesh );
}
if ( method == "CreateMeshesFromGMF" )
{
// issue 199929, remove standard library name (default parameter)
const TCollection_AsciiString & aLibName = theCommand->GetArg( 2 );
if ( aLibName.Search( "StdMeshersEngine" ) != -1 ) {
- // keep first argument
+ // keep the first argument
TCollection_AsciiString arg = theCommand->GetArg( 1 );
theCommand->RemoveArgs();
theCommand->SetArg( 1, arg );
}
- myHypos.push_back( _pyHypothesis::NewHypothesis( theCommand ));
+ Handle(_pyHypothesis) hyp = _pyHypothesis::NewHypothesis( theCommand );
+ CheckObjectIsReCreated( hyp );
+ myHypos.insert( make_pair( hyp->GetID(), hyp ));
+
return;
}
// SMESH_Pattern, FilterManager
if ( method == "GetPattern" ||
method == "CreateFilterManager" ||
- method == "CreateMeasurements" ) {
+ method == "CreateMeasurements" )
+ {
Handle(_pyObject) obj = new _pySelfEraser( theCommand );
if ( !myObjects.insert( make_pair( obj->GetID(), obj )).second )
theCommand->Clear(); // already created
theCommand->SetArg( theCommand->GetNbArgs() + 1, "True" );
}
Handle(_pyMesh) mesh = new _pyMesh( theCommand, theCommand->GetResultValue() );
- myMeshes.insert( make_pair( mesh->GetID(), mesh ));
+ AddObject( mesh );
AddMeshAccessorMethod( theCommand );
}
else if ( method == "SetName" ) // SetName(obj,name)
// Replace name of SMESH_Gen
- // names of SMESH_Gen methods fully equal to methods defined in smesh.py
+ // names of SMESH_Gen methods fully equal to methods defined in smeshBuilder.py
static TStringSet smeshpyMethods;
if ( smeshpyMethods.empty() ) {
const char * names[] =
// smeshgen.Method() --> smesh.Method()
theCommand->SetObject( SMESH_2smeshpy::SmeshpyName() );
else
- // smeshgen.Method() --> smesh.smesh.Method()
+ // smeshgen.Method() --> smesh.Method()
theCommand->SetObject( SMESH_2smeshpy::GenName() );
}
map< _pyID, Handle(_pyMesh) >::iterator id_mesh;
map< _pyID, Handle(_pyObject) >::iterator id_obj;
- list< Handle(_pyHypothesis) >::iterator hyp;
+ map< _pyID, Handle(_pyHypothesis) >::iterator id_hyp;
if ( IsToKeepAllCommands() ) // historical dump
{
// set myIsPublished = true to all objects
for ( id_mesh = myMeshes.begin(); id_mesh != myMeshes.end(); ++id_mesh )
id_mesh->second->SetRemovedFromStudy( false );
- for ( hyp = myHypos.begin(); hyp != myHypos.end(); ++hyp )
- (*hyp)->SetRemovedFromStudy( false );
+ for ( id_hyp = myHypos.begin(); id_hyp != myHypos.end(); ++id_hyp )
+ id_hyp->second->SetRemovedFromStudy( false );
for ( id_obj = myObjects.begin(); id_obj != myObjects.end(); ++id_obj )
id_obj->second->SetRemovedFromStudy( false );
}
// let hypotheses find referred objects in order to prevent clearing
// not published referred hyps (it's needed for hyps like "LayerDistribution")
list< Handle(_pyMesh) > fatherMeshes;
- for ( hyp = myHypos.begin(); hyp != myHypos.end(); ++hyp )
- if ( !hyp->IsNull() )
- (*hyp)->GetReferredMeshesAndGeom( fatherMeshes );
+ for ( id_hyp = myHypos.begin(); id_hyp != myHypos.end(); ++id_hyp )
+ if ( !id_hyp->second.IsNull() )
+ id_hyp->second->GetReferredMeshesAndGeom( fatherMeshes );
}
// set myIsPublished = false to all objects depending on
// meshes built on a removed geometry
id_mesh->second->Flush();
// Flush hyps
- for ( hyp = myHypos.begin(); hyp != myHypos.end(); ++hyp )
- if ( !hyp->IsNull() ) {
- (*hyp)->Flush();
- // smeshgen.CreateHypothesis() --> smesh.smesh.CreateHypothesis()
- if ( !(*hyp)->IsWrapped() )
- (*hyp)->GetCreationCmd()->SetObject( SMESH_2smeshpy::GenName() );
+ for ( id_hyp = myHypos.begin(); id_hyp != myHypos.end(); ++id_hyp )
+ if ( !id_hyp->second.IsNull() ) {
+ id_hyp->second->Flush();
+ // smeshgen.CreateHypothesis() --> smesh.CreateHypothesis()
+ if ( !id_hyp->second->IsWrapped() )
+ id_hyp->second->GetCreationCmd()->SetObject( SMESH_2smeshpy::GenName() );
}
// Flush other objects
for ( ; id_mesh != myMeshes.end(); ++id_mesh )
id_mesh->second->ClearCommands();
- list< Handle(_pyHypothesis) >::iterator hyp = myHypos.begin();
- for ( ; hyp != myHypos.end(); ++hyp )
- if ( !hyp->IsNull() )
- (*hyp)->ClearCommands();
+ map< _pyID, Handle(_pyHypothesis) >::iterator id_hyp = myHypos.begin();
+ for ( ; id_hyp != myHypos.end(); ++id_hyp )
+ if ( !id_hyp->second.IsNull() )
+ id_hyp->second->ClearCommands();
map< _pyID, Handle(_pyObject) >::iterator id_obj = myObjects.begin();
for ( ; id_obj != myObjects.end(); ++id_obj )
id_obj->second->Free();
myObjects.clear();
- list< Handle(_pyHypothesis) >::iterator hyp = myHypos.begin();
- for ( ; hyp != myHypos.end(); ++hyp )
- if ( !hyp->IsNull() )
- (*hyp)->Free();
+ map< _pyID, Handle(_pyHypothesis) >::iterator id_hyp = myHypos.begin();
+ for ( ; id_hyp != myHypos.end(); ++id_hyp )
+ if ( !id_hyp->second.IsNull() )
+ id_hyp->second->Free();
myHypos.clear();
myFile2ExportedMesh.clear();
bool _pyGen::AddAlgoAccessorMethod( Handle(_pyCommand) theCmd ) const
{
bool added = false;
- list< Handle(_pyHypothesis) >::const_iterator hyp = myHypos.begin();
- for ( ; hyp != myHypos.end(); ++hyp ) {
- if ( (*hyp)->IsAlgo() && /*(*hyp)->IsWrapped() &&*/
- theCmd->AddAccessorMethod( (*hyp)->GetID(), (*hyp)->AccessorMethod() ))
+ map< _pyID, Handle(_pyHypothesis) >::const_iterator id_hyp = myHypos.begin();
+ for ( ; id_hyp != myHypos.end(); ++id_hyp )
+ if ( !id_hyp->second.IsNull() &&
+ id_hyp->second->IsAlgo() && /*(*hyp)->IsWrapped() &&*/
+ theCmd->AddAccessorMethod( id_hyp->second->GetID(),
+ id_hyp->second->AccessorMethod() ))
added = true;
- }
+
return added;
}
Handle(_pyHypothesis) _pyGen::FindHyp( const _pyID& theHypID )
{
- list< Handle(_pyHypothesis) >::iterator hyp = myHypos.begin();
- for ( ; hyp != myHypos.end(); ++hyp )
- if ( !hyp->IsNull() && theHypID == (*hyp)->GetID() )
- return *hyp;
+ map< _pyID, Handle(_pyHypothesis) >::iterator id_hyp = myHypos.find( theHypID );
+ if ( id_hyp != myHypos.end() &&
+ !id_hyp->second.IsNull() &&
+ theHypID == id_hyp->second->GetID() )
+ return id_hyp->second;
return Handle(_pyHypothesis)();
}
//================================================================================
/*!
- * \brief Find algorithm the created algorithm
+ * \brief Find algorithm able to create a hypothesis
* \param theGeom - The shape ID the algorithm was created on
* \param theMesh - The mesh ID that created the algorithm
- * \param dim - The algo dimension
+ * \param theHypothesis - The hypothesis the algorithm sould be able to create
* \retval Handle(_pyHypothesis) - The found algo
*/
//================================================================================
Handle(_pyHypothesis) _pyGen::FindAlgo( const _pyID& theGeom, const _pyID& theMesh,
const Handle(_pyHypothesis)& theHypothesis )
{
- list< Handle(_pyHypothesis) >::iterator hyp = myHypos.begin();
- for ( ; hyp != myHypos.end(); ++hyp )
- if ( !hyp->IsNull() &&
- (*hyp)->IsAlgo() &&
- theHypothesis->CanBeCreatedBy( (*hyp)->GetAlgoType() ) &&
- (*hyp)->GetGeom() == theGeom &&
- (*hyp)->GetMesh() == theMesh )
- return *hyp;
- return 0;
+ map< _pyID, Handle(_pyHypothesis) >::iterator id_hyp = myHypos.begin();
+ for ( ; id_hyp != myHypos.end(); ++id_hyp )
+ if ( !id_hyp->second.IsNull() &&
+ id_hyp->second->IsAlgo() &&
+ theHypothesis->CanBeCreatedBy( id_hyp->second->GetAlgoType() ) &&
+ id_hyp->second->GetGeom() == theGeom &&
+ id_hyp->second->GetMesh() == theMesh )
+ return id_hyp->second;
+ return Handle(_pyHypothesis)();
}
//================================================================================
(*pos)->SetOrderNb( i++ );
}
+//================================================================================
+/*!
+ * \brief Call _pyFilter.AddUser() if a filter is used as a command arg
+ */
+//================================================================================
+
+// void _pyGen::addFilterUser( Handle(_pyCommand)& theCommand, const Handle(_pyObject)& user )
+// {
+ // No more needed after adding _pyObject::myArgCommands
+
+// const char filterPrefix[] = "aFilter0x";
+// if ( theCommand->GetString().Search( filterPrefix ) < 1 )
+// return;
+
+// for ( int i = theCommand->GetNbArgs(); i > 0; --i )
+// {
+// const _AString & arg = theCommand->GetArg( i );
+// // NOT TREATED CASE: arg == "[something, aFilter0x36a2f60]"
+// if ( arg.Search( filterPrefix ) != 1 )
+// continue;
+
+// Handle(_pyFilter) filter = Handle(_pyFilter)::DownCast( FindObject( arg ));
+// if ( !filter.IsNull() )
+// {
+// filter->AddUser( user );
+// if ( !filter->GetNewID().IsEmpty() )
+// theCommand->SetArg( i, filter->GetNewID() );
+// }
+// }
+//}
+
//================================================================================
/*!
* \brief Set command be last in list of commands
{
if ( theObj.IsNull() ) return;
+ CheckObjectIsReCreated( theObj );
+
if ( theObj->IsKind( STANDARD_TYPE( _pyMesh )))
myMeshes.insert( make_pair( theObj->GetID(), Handle(_pyMesh)::DownCast( theObj )));
myObjects.insert( make_pair( theObj->GetID(), theObj ));
}
+//================================================================================
+/*!
+ * \brief Erases an existing object with the same ID. This method should be called
+ * before storing theObj in _pyGen
+ */
+//================================================================================
+
+void _pyGen::CheckObjectIsReCreated( Handle(_pyObject)& theObj )
+{
+ if ( theObj.IsNull() || !_pyCommand::IsStudyEntry( theObj->GetID() ))
+ return;
+
+ const bool isHyp = theObj->IsKind( STANDARD_TYPE( _pyHypothesis ));
+ Handle(_pyObject) existing =
+ isHyp ? FindHyp( theObj->GetID() ) : FindObject( theObj->GetID() );
+ if ( !existing.IsNull() && existing != theObj )
+ {
+ existing->SetRemovedFromStudy( true );
+ existing->ClearCommands();
+ if ( isHyp )
+ {
+ if ( myHypos.count( theObj->GetID() ))
+ myHypos.erase( theObj->GetID() );
+ }
+ else if ( myMeshes.count( theObj->GetID() ))
+ {
+ myMeshes.erase( theObj->GetID() );
+ }
+ else if ( myObjects.count( theObj->GetID() ))
+ {
+ myObjects.erase( theObj->GetID() );
+ }
+ }
+}
+
//================================================================================
/*!
* \brief Re-register an object with other ID to make it Process() commands of
return true; // SMESH object not in study
}
+//================================================================================
+/*!
+ * \brief Add an object to myRemovedObjIDs 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
myGroups.push_back( group );
theGen->AddObject( group );
}
+ // ----------------------------------------------------------------------
// update list of groups
else if ( method == "GetGroups" )
{
+ bool allGroupsRemoved = true;
TCollection_AsciiString grIDs = theCommand->GetResultValue();
- list< _pyID > idList = theCommand->GetStudyEntries( grIDs );
- list< _pyID >::iterator grID = idList.begin();
+ list< _pyID > idList = theCommand->GetStudyEntries( grIDs );
+ list< _pyID >::iterator grID = idList.begin();
+ const int nbGroupsBefore = myGroups.size();
+ Handle(_pyObject) obj;
for ( ; grID != idList.end(); ++grID )
{
- Handle(_pyObject) obj = theGen->FindObject( *grID );
+ obj = theGen->FindObject( *grID );
if ( obj.IsNull() )
{
Handle(_pyGroup) group = new _pyGroup( theCommand, *grID );
theGen->AddObject( group );
myGroups.push_back( group );
+ obj = group;
}
+ if ( !obj->CanClear() )
+ allGroupsRemoved = false;
+ }
+ if ( nbGroupsBefore == myGroups.size() ) // no new _pyGroup created
+ obj->AddProcessedCmd( theCommand ); // to clear theCommand if all groups are removed
+
+ if ( !allGroupsRemoved && !theGen->IsToKeepAllCommands() )
+ {
+ // check if the preceding command is Compute();
+ // if GetGroups() is just after Compute(), this can mean that the groups
+ // were created by some algorithm and hence Compute() should not be discarded
+ std::list< Handle(_pyCommand) >& cmdList = theGen->GetCommands();
+ std::list< Handle(_pyCommand) >::iterator cmd = cmdList.begin();
+ while ( (*cmd)->GetMethod() == "GetGroups" )
+ ++cmd;
+ if ( myLastComputeCmd == (*cmd))
+ // protect last Compute() from clearing by the next Compute()
+ myLastComputeCmd.Nullify();
}
}
+ // ----------------------------------------------------------------------
// notify a group about full removal
- else if ( method == "RemoveGroupWithContents" )
+ else if ( method == "RemoveGroupWithContents" ||
+ method == "RemoveGroup")
{
if ( !theGen->IsToKeepAllCommands() ) { // snapshot mode
const _pyID groupID = theCommand->GetArg( 1 );
Handle(_pyGroup) grp = Handle(_pyGroup)::DownCast( theGen->FindObject( groupID ));
if ( !grp.IsNull() )
- grp->RemovedWithContents();
+ {
+ if ( method == "RemoveGroupWithContents" )
+ grp->RemovedWithContents();
+ // to clear RemoveGroup() if the group creation is cleared
+ grp->AddProcessedCmd( theCommand );
+ }
}
}
// ----------------------------------------------------------------------
else if ( theCommand->MethodStartsFrom( "Export" ))
{
- if ( method == "ExportToMED" || // ExportToMED() --> ExportMED()
- method == "ExportToMEDX" ) { // ExportToMEDX() --> ExportMED()
+ if ( method == "ExportToMED" || // ExportToMED() --> ExportMED()
+ method == "ExportToMEDX" ) // ExportToMEDX() --> ExportMED()
+ {
theCommand->SetMethod( "ExportMED" );
+ if ( theCommand->GetNbArgs() == 5 )
+ {
+ // ExportToMEDX(...,autoDimension) -> ExportToMEDX(...,meshPart=None,autoDimension)
+ _AString autoDimension = theCommand->GetArg( 5 );
+ theCommand->SetArg( 5, "None" );
+ theCommand->SetArg( 6, autoDimension );
+ }
}
else if ( method == "ExportCGNS" )
{ // ExportCGNS(part, ...) -> ExportCGNS(..., part)
TCollection_AsciiString newMethod = method;
newMethod.Remove( 7, 6 );
theCommand->SetMethod( newMethod );
- // make the 1st arg be the last one
+ // make the 1st arg be the last one (or last but one for ExportMED())
_pyID partID = theCommand->GetArg( 1 );
- int nbArgs = theCommand->GetNbArgs();
+ int nbArgs = theCommand->GetNbArgs() - (newMethod == "ExportMED");
for ( int i = 2; i <= nbArgs; ++i )
theCommand->SetArg( i-1, theCommand->GetArg( i ));
theCommand->SetArg( nbArgs, partID );
void _pyMesh::addFatherMesh( const _pyID& meshID )
{
- if ( !meshID.IsEmpty() )
+ if ( !meshID.IsEmpty() && meshID != GetID() )
addFatherMesh( Handle(_pyMesh)::DownCast( theGen->FindObject( meshID )));
}
void _pyMesh::addFatherMesh( const Handle(_pyMesh)& mesh )
{
- if ( !mesh.IsNull() )
+ if ( !mesh.IsNull() && mesh->GetID() != GetID() )
{
//myFatherMeshes.push_back( mesh );
mesh->myChildMeshes.push_back( this );
void _pyMeshEditor::Process( const Handle(_pyCommand)& theCommand)
{
- // names of SMESH_MeshEditor methods fully equal to methods of the python class Mesh, so
- // commands calling this methods are converted to calls of Mesh methods
+ // Names of SMESH_MeshEditor methods fully equal to methods of the python class Mesh, so
+ // commands calling these methods are converted to calls of Mesh methods without
+ // additional modifs, only object is changed from MeshEditor to Mesh.
static TStringSet sameMethods;
if ( sameMethods.empty() ) {
const char * names[] = {
- "RemoveElements","RemoveNodes","RemoveOrphanNodes","AddNode","Add0DElement","AddEdge","AddFace","AddPolygonalFace","AddBall",
- "AddVolume","AddPolyhedralVolume","AddPolyhedralVolumeByFaces","MoveNode", "MoveClosestNodeToPoint",
+ "RemoveElements","RemoveNodes","RemoveOrphanNodes",
+ "AddNode","Add0DElement","AddEdge","AddFace","AddPolygonalFace","AddBall",
+ "AddVolume","AddPolyhedralVolume","AddPolyhedralVolumeByFaces",
+ "MoveNode", "MoveClosestNodeToPoint",
"InverseDiag","DeleteDiag","Reorient","ReorientObject",
- "TriToQuad","TriToQuadObject", "SplitQuad","SplitQuadObject",
+ "TriToQuad","TriToQuadObject", "QuadTo4Tri", "SplitQuad","SplitQuadObject",
"BestSplit","Smooth","SmoothObject","SmoothParametric","SmoothParametricObject",
"ConvertToQuadratic","ConvertFromQuadratic","RenumberNodes","RenumberElements",
"RotationSweep","RotationSweepObject","RotationSweepObject1D","RotationSweepObject2D",
- "ExtrusionSweep","AdvancedExtrusion","ExtrusionSweepObject","ExtrusionSweepObject1D","ExtrusionSweepObject2D",
- "ExtrusionAlongPath","ExtrusionAlongPathObject","ExtrusionAlongPathX",
- "ExtrusionAlongPathObject1D","ExtrusionAlongPathObject2D",
+ "ExtrusionSweep","AdvancedExtrusion","ExtrusionSweepObject","ExtrusionSweepObject1D",
+ "ExtrusionSweepObject2D","ExtrusionAlongPath","ExtrusionAlongPathObject",
+ "ExtrusionAlongPathX","ExtrusionAlongPathObject1D","ExtrusionAlongPathObject2D",
"Mirror","MirrorObject","Translate","TranslateObject","Rotate","RotateObject",
- "FindCoincidentNodes",/*"FindCoincidentNodesOnPart",*/"MergeNodes","FindEqualElements",
+ "FindCoincidentNodes","MergeNodes","FindEqualElements",
"MergeElements","MergeEqualElements","SewFreeBorders","SewConformFreeBorders",
"SewBorderToSide","SewSideElements","ChangeElemNodes","GetLastCreatedNodes",
"GetLastCreatedElems",
- "MirrorMakeMesh","MirrorObjectMakeMesh","TranslateMakeMesh",
- "TranslateObjectMakeMesh","RotateMakeMesh","RotateObjectMakeMesh","MakeBoundaryMesh",
- "MakeBoundaryElements", "SplitVolumesIntoTetra"
+ "MirrorMakeMesh","MirrorObjectMakeMesh","TranslateMakeMesh","TranslateObjectMakeMesh",
+ "Scale","ScaleMakeMesh","RotateMakeMesh","RotateObjectMakeMesh","MakeBoundaryMesh",
+ "MakeBoundaryElements", "SplitVolumesIntoTetra",
+ "DoubleElements","DoubleNodes","DoubleNode","DoubleNodeGroup","DoubleNodeGroups",
+ "DoubleNodeElem","DoubleNodeElemInRegion","DoubleNodeElemGroup",
+ "DoubleNodeElemGroupInRegion","DoubleNodeElemGroups","DoubleNodeElemGroupsInRegion",
+ "DoubleNodesOnGroupBoundaries","CreateFlatElementsOnFacesGroups","CreateHoleSkin"
,"" }; // <- mark of the end
sameMethods.Insert( names );
}
if (diffLastTwoArgsMethods.empty() ) {
const char * names[] = {
"MirrorMakeGroups","MirrorObjectMakeGroups",
- "TranslateMakeGroups","TranslateObjectMakeGroups",
+ "TranslateMakeGroups","TranslateObjectMakeGroups","ScaleMakeGroups",
"RotateMakeGroups","RotateObjectMakeGroups",
""};// <- mark of the end
diffLastTwoArgsMethods.Insert( names );
list<Handle(_pyCommand)>::reverse_iterator cmd = myUnusedCommands.rbegin();
int distrTypeNb = 0;
for ( ; !distrTypeNb && cmd != myUnusedCommands.rend(); ++cmd )
- if ( (*cmd)->GetMethod() == "SetDistrType" )
- distrTypeNb = (*cmd)->GetOrderNb();
- else if (IsWrapped() && (*cmd)->GetMethod() == "SetObjectEntry" )
+ if ( (*cmd)->GetMethod() == "SetDistrType" ) {
+ if ( cmd != myUnusedCommands.rbegin() )
+ distrTypeNb = (*cmd)->GetOrderNb();
+ }
+ else if (IsWrapped() && (*cmd)->GetMethod() == "SetObjectEntry" ) {
(*cmd)->Clear();
-
+ }
// clear commands before the last SetDistrType()
list<Handle(_pyCommand)> * cmds[2] = { &myArgCommands, &myUnusedCommands };
+ set< int > treatedCmdNbs; // avoid treating same cmd twice
for ( int i = 0; i < 2; ++i ) {
set<TCollection_AsciiString> uniqueMethods;
list<Handle(_pyCommand)> & cmdList = *cmds[i];
for ( cmd = cmdList.rbegin(); cmd != cmdList.rend(); ++cmd )
{
+ if ( !treatedCmdNbs.insert( (*cmd)->GetOrderNb() ).second )
+ continue;// avoid treating same cmd twice
bool clear = ( (*cmd)->GetOrderNb() < distrTypeNb );
const TCollection_AsciiString& method = (*cmd)->GetMethod();
if ( !clear || method == "SetNumberOfSegments" ) {
return EMPTY;
if ( myBegPos.Length() < thePartIndex )
return UNKNOWN;
+ ASSERT( thePartIndex > 0 );
return myBegPos( thePartIndex );
}
{
while ( myBegPos.Length() < thePartIndex )
myBegPos.Append( UNKNOWN );
+ ASSERT( thePartIndex > 0 );
myBegPos( thePartIndex ) = thePosition;
}
//================================================================================
/*!
* \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 Nb=0;
int endPos = myString.Location( "=", 1, Length() );
- TCollection_AsciiString str = "";
- while ( begPos < endPos) {
- str = GetWord( myString, begPos, true );
+ while ( begPos < endPos )
+ {
+ _AString str = GetWord( myString, begPos, true );
begPos = begPos+ str.Length();
- Nb++;
+ nb++;
}
- return (Nb-1);
+ return (nb-1);
}
begPos = 1;
}
myObj = GetWord( myString, begPos, true );
- // check if object is complex,
- // so far consider case like "smesh.smesh.Method()"
- if ( int bracketPos = myString.Location( "(", begPos, Length() )) {
- //if ( bracketPos==0 ) bracketPos = Length();
- int dotPos = begPos+myObj.Length();
- while ( dotPos+1 < bracketPos ) {
- if ( int pos = myString.Location( ".", dotPos+1, bracketPos ))
- dotPos = pos;
- else
- break;
+ if ( begPos != EMPTY )
+ {
+ // check if object is complex,
+ // so far consider case like "smesh.Method()"
+ if ( int bracketPos = myString.Location( "(", begPos, Length() )) {
+ //if ( bracketPos==0 ) bracketPos = Length();
+ int dotPos = begPos+myObj.Length();
+ while ( dotPos+1 < bracketPos ) {
+ if ( int pos = myString.Location( ".", dotPos+1, bracketPos ))
+ dotPos = pos;
+ else
+ break;
+ }
+ if ( dotPos > begPos+myObj.Length() )
+ myObj = myString.SubString( begPos, dotPos-1 );
}
- if ( dotPos > begPos+myObj.Length() )
- myObj = myString.SubString( begPos, dotPos-1 );
}
// 1st word after '=' is an object
// else // no method -> no object
if ( i <= Length() )
{
myString.Insert( i, "#" );
- for ( int iPart = 0; iPart < myBegPos.Length(); ++iPart )
+ for ( int iPart = 1; iPart <= myBegPos.Length(); ++iPart )
{
- int begPos = GetBegPos( iPart );
+ int begPos = GetBegPos( iPart + 1 );
if ( begPos != UNKNOWN )
- SetBegPos( iPart, begPos + 1 );
+ SetBegPos( iPart + 1, begPos + 1 );
}
}
}
*/
//================================================================================
+_pySelfEraser::_pySelfEraser(const Handle(_pyCommand)& theCreationCmd)
+ :_pyObject(theCreationCmd), myIgnoreOwnCalls(false)
+{
+ myIsPublished = true; // prevent clearing as a not published
+ theGen->KeepAgrCmds( GetID() ); // ask to fill myArgCmds
+}
+
+//================================================================================
+/*!
+ * \brief SelfEraser erases creation command if no more it's commands invoked
+ */
+//================================================================================
+
void _pySelfEraser::Flush()
{
- if ( GetNbCalls() == 0 )
- GetCreationCmd()->Clear();
+ bool toErase = false;
+ if ( myIgnoreOwnCalls ) // check if this obj is used as argument
+ {
+ int nbArgUses = 0;
+ list< Handle(_pyCommand) >::iterator cmd = myArgCmds.begin();
+ for ( ; cmd != myArgCmds.end(); ++cmd )
+ nbArgUses += !(*cmd)->IsEmpty();
+ toErase = ( nbArgUses < 1 );
+ }
+ else
+ {
+ int nbCalls = GetNbCalls();
+ if ( nbCalls > 0 )
+ {
+ // ignore cleared commands
+ std::list< Handle(_pyCommand) >& cmds = GetProcessedCmds();
+ std::list< Handle(_pyCommand) >::const_iterator cmd = cmds.begin();
+ for ( ; cmd != cmds.end(); ++cmd )
+ nbCalls -= (*cmd)->IsEmpty();
+ }
+ toErase = ( nbCalls < 1 );
+ }
+ if ( toErase )
+ {
+ myIsPublished = false;
+ _pyObject::ClearCommands();
+ }
}
//================================================================================
_pyObject(theCreationCmd)
{
myMesh = ObjectToMesh( theGen->FindObject( theCreationCmd->GetObject() ));
+ theGen->KeepAgrCmds( GetID() ); // ask to fill myArgCmds
}
//================================================================================
bool _pySubMesh::CanBeArgOfMethod(const _AString& theMethodName)
{
- // names of all methods where a sub-mesh can be used as argument
- static TStringSet methods;
- if ( methods.empty() ) {
- const char * names[] = {
- // methods of SMESH_Gen
- "CopyMesh",
- // methods of SMESH_Group
- "AddFrom",
- // methods of SMESH_Measurements
- "MinDistance",
- // methods of SMESH_Mesh
- "ExportPartToMED","ExportCGNS","ExportPartToDAT","ExportPartToUNV","ExportPartToSTL",
- "RemoveSubMesh",
- // methods of SMESH_MeshEditor
- "ReorientObject","Reorient2D","TriToQuadObject","QuadToTriObject","SplitQuadObject",
- "SplitVolumesIntoTetra","SmoothObject","SmoothParametricObject","ConvertFromQuadraticObject",
- "RotationSweepObject","RotationSweepObjectMakeGroups","RotationSweepObject1D",
- "RotationSweepObject1DMakeGroups","RotationSweepObject2D","RotationSweepObject2DMakeGroups",
- "ExtrusionSweepObject","ExtrusionSweepObjectMakeGroups","ExtrusionSweepObject0D",
- "ExtrusionSweepObject0DMakeGroups","ExtrusionSweepObject1D","ExtrusionSweepObject2D",
- "ExtrusionSweepObject1DMakeGroups","ExtrusionSweepObject2DMakeGroups",
- "ExtrusionAlongPathObjX","ExtrusionAlongPathObject","ExtrusionAlongPathObjectMakeGroups",
- "ExtrusionAlongPathObject1D","ExtrusionAlongPathObject1DMakeGroups",
- "ExtrusionAlongPathObject2D","ExtrusionAlongPathObject2DMakeGroups","MirrorObject",
- "MirrorObjectMakeGroups","MirrorObjectMakeMesh","TranslateObject","Scale",
- "TranslateObjectMakeGroups","TranslateObjectMakeMesh","ScaleMakeGroups","ScaleMakeMesh",
- "RotateObject","RotateObjectMakeGroups","RotateObjectMakeMesh","FindCoincidentNodesOnPart",
- "FindCoincidentNodesOnPartBut","FindEqualElements","FindAmongElementsByPoint",
- "MakeBoundaryMesh","Create0DElementsOnAllNodes",
- "" }; // <- mark of end
- methods.Insert( names );
- }
- return methods.Contains( theMethodName );
+ return false;
+// // names of all methods where a sub-mesh can be used as argument
+// static TStringSet methods;
+// if ( methods.empty() ) {
+// const char * names[] = {
+// // methods of SMESH_Gen
+// "CopyMesh",
+// // methods of SMESH_Group
+// "AddFrom",
+// // methods of SMESH_Measurements
+// "MinDistance",
+// // methods of SMESH_Mesh
+// "ExportPartToMED","ExportCGNS","ExportPartToDAT","ExportPartToUNV","ExportPartToSTL",
+// "RemoveSubMesh",
+// // methods of SMESH_MeshEditor
+// "ReorientObject","Reorient2D","TriToQuadObject","QuadToTriObject","SplitQuadObject",
+// "SplitVolumesIntoTetra","SmoothObject","SmoothParametricObject","ConvertFromQuadraticObject",
+// "RotationSweepObject","RotationSweepObjectMakeGroups","RotationSweepObject1D",
+// "RotationSweepObject1DMakeGroups","RotationSweepObject2D","RotationSweepObject2DMakeGroups",
+// "ExtrusionSweepObject","ExtrusionSweepObjectMakeGroups","ExtrusionSweepObject0D",
+// "ExtrusionSweepObject0DMakeGroups","ExtrusionSweepObject1D","ExtrusionSweepObject2D",
+// "ExtrusionSweepObject1DMakeGroups","ExtrusionSweepObject2DMakeGroups",
+// "ExtrusionAlongPathObjX","ExtrusionAlongPathObject","ExtrusionAlongPathObjectMakeGroups",
+// "ExtrusionAlongPathObject1D","ExtrusionAlongPathObject1DMakeGroups",
+// "ExtrusionAlongPathObject2D","ExtrusionAlongPathObject2DMakeGroups","MirrorObject",
+// "MirrorObjectMakeGroups","MirrorObjectMakeMesh","TranslateObject","Scale",
+// "TranslateObjectMakeGroups","TranslateObjectMakeMesh","ScaleMakeGroups","ScaleMakeMesh",
+// "RotateObject","RotateObjectMakeGroups","RotateObjectMakeMesh","FindCoincidentNodesOnPart",
+// "FindCoincidentNodesOnPartBut","FindEqualElements","FindAmongElementsByPoint",
+// "MakeBoundaryMesh","Create0DElementsOnAllNodes",
+// "" }; // <- mark of end
+// methods.Insert( names );
+// }
+// return methods.Contains( theMethodName );
}
//================================================================================
void _pySubMesh::Process( const Handle(_pyCommand)& theCommand )
{
_pyObject::Process(theCommand); // count calls of Process()
- GetCreationCmd()->AddDependantCmd( theCommand );
}
//================================================================================
void _pySubMesh::Flush()
{
- if ( GetNbCalls() == 0 ) // move to the end of all commands
+ if ( GetNbCalls() == 0 && myArgCmds.empty() ) // move to the end of all commands
theGen->GetLastCommand()->AddDependantCmd( GetCreationCmd() );
else if ( !myCreator.IsNull() )
// move to be just after creator
myCreator->GetCreationCmd()->AddDependantCmd( GetCreationCmd() );
+
+ // move sub-mesh usage after creation cmd
+ list< Handle(_pyCommand) >::iterator cmd = myArgCmds.begin();
+ for ( ; cmd != myArgCmds.end(); ++cmd )
+ if ( !(*cmd)->IsEmpty() )
+ GetCreationCmd()->AddDependantCmd( *cmd );
}
//================================================================================
{
if ( !filter->GetNewID().IsEmpty() )
theCreationCmd->SetArg( 3, filter->GetNewID() );
- filter->AddUser( this );
+ //filter->AddUser( this );
}
myFilter = filter;
}
+ else if ( method == "GetGroups" )
+ {
+ myCanClearCreationCmd = ( theCreationCmd->GetNbResultValues() == 1 );
+ }
else
{
// theCreationCmd does something else apart from creation of this group
}
}
+//================================================================================
+/*!
+ * \brief Check if "[ group1, group2 ] = mesh.GetGroups()" creation command
+ * can be cleared
+ */
+//================================================================================
+
+bool _pyGroup::CanClear()
+{
+ if ( IsInStudy() )
+ return false;
+
+ if ( !myCanClearCreationCmd && myCreationCmd->GetMethod() == "GetGroups" )
+ {
+ TCollection_AsciiString grIDs = myCreationCmd->GetResultValue();
+ list< _pyID > idList = myCreationCmd->GetStudyEntries( grIDs );
+ list< _pyID >::iterator grID = idList.begin();
+ if ( GetID() == *grID )
+ {
+ myCanClearCreationCmd = true;
+ list< Handle(_pyGroup ) > groups;
+ for ( ; grID != idList.end(); ++grID )
+ {
+ Handle(_pyGroup) group = Handle(_pyGroup)::DownCast( theGen->FindObject( *grID ));
+ if ( group.IsNull() ) continue;
+ groups.push_back( group );
+ if ( group->IsInStudy() )
+ myCanClearCreationCmd = false;
+ }
+ // set myCanClearCreationCmd == true to all groups
+ list< Handle(_pyGroup ) >::iterator group = groups.begin();
+ for ( ; group != groups.end(); ++group )
+ (*group)->myCanClearCreationCmd = myCanClearCreationCmd;
+ }
+ }
+
+ return myCanClearCreationCmd;
+}
+
//================================================================================
/*!
* \brief set myCanClearCreationCmd = true if the main action of the creation
}
}
- if ( !filter.IsNull() )
- filter->AddUser( this );
+ // if ( !filter.IsNull() )
+ // filter->AddUser( this );
theGen->AddMeshAccessorMethod( theCommand );
}
_pyFilter::_pyFilter(const Handle(_pyCommand)& theCreationCmd, const _pyID& newID/*=""*/)
:_pyObject(theCreationCmd), myNewID( newID )
{
+ theGen->KeepAgrCmds( GetID() ); // ask to fill myArgCmds
}
//================================================================================
//================================================================================
/*!
- * \brief Set new filter name to the creation command
+ * \brief Set new filter name to the creation command and to myArgCmds
*/
//================================================================================
void _pyFilter::Flush()
{
- if ( !myNewID.IsEmpty() && !GetCreationCmd()->IsEmpty() )
+ if ( myNewID.IsEmpty() ) return;
+
+ list< Handle(_pyCommand) >::iterator cmd = myArgCmds.begin();
+ for ( ; cmd != myArgCmds.end(); ++cmd )
+ if ( !(*cmd)->IsEmpty() )
+ {
+ _AString cmdStr = (*cmd)->GetString();
+ _AString id = GetID();
+ int pos = cmdStr.Search( id );
+ if ( pos > 0 )
+ {
+ cmdStr.Remove( pos, id.Length() );
+ cmdStr.Insert( pos, myNewID );
+ }
+ (*cmd)->Clear();
+ (*cmd)->GetString() = cmdStr;
+ }
+
+ if ( !GetCreationCmd()->IsEmpty() )
GetCreationCmd()->SetResultValue( myNewID );
}
*/
//================================================================================
-bool _pyFilter::CanClear()
+bool _pyObject::CanClear()
{
- list< Handle(_pyObject) >::iterator obj = myUsers.begin();
- for ( ; obj != myUsers.end(); ++obj )
- if ( !(*obj)->CanClear() )
- return false;
+ if ( !myIsPublished )
+ return true;
+
+ list< Handle(_pyCommand) >::iterator cmd = myArgCmds.begin();
+ for ( ; cmd != myArgCmds.end(); ++cmd )
+ if ( !(*cmd)->IsEmpty() )
+ {
+ Handle(_pyObject) obj = theGen->FindObject( (*cmd)->GetObject() );
+ if ( !obj.IsNull() && !obj->CanClear() )
+ return false;
+ }
return true;
}