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"
+ ,"" }; // <- 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 )
+ {
+ _pyCommand workCmd( arg );
+ if ( workCmd.GetNbArgs() == 1 ) // SMESH.DirStruct( SMESH.PointStruct(x,y,z))
+ {
+ workCmd = _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 ));
+ }
+ }
+ }
+ }
}
//================================================================================
PlaceSubmeshAfterItsCreation( aCommand );
}
+ // Method( SMESH.PointStruct(x,y,z) -> Method( [x,y,z]
+ StructToList( aCommand );
+
// Find an object to process theCommand
// SMESH_Gen method?
if ( objID == this->GetID() || objID == SMESH_2smeshpy::GenName())
{
this->Process( aCommand );
+ addFilterUser( aCommand, theGen ); // protect filters from clearing
return aCommand;
}
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
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" );
(*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 )
+{
+ 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
//================================================================================
/*!
- * \brief Remove object name from myObjectNames that leads to that SetName() for
+ * \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
*/
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 );
+ }
}
}
// ----------------------------------------------------------------------
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 );
}
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