-// 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
//
#include "SMESH_2smeshpy.hxx"
-#include "utilities.h"
#include "SMESH_PythonDump.hxx"
#include "SMESH_NoteBook.hxx"
#include "SMESH_Filter_i.hxx"
+#include <SALOMEDS_wrap.hxx>
+#include <utilities.h>
+
#include <Resource_DataMapOfAsciiStringAsciiString.hxx>
#include <Resource_DataMapIteratorOfDataMapOfAsciiStringAsciiString.hxx>
}
};
+ //================================================================================
+ /*!
+ * \brief Map of TCollection_AsciiString initialized by C array of C strings.
+ * Odd items of the C array are map keys, and even items are values
+ */
+ //================================================================================
+
+ struct TStringMap: public map<TCollection_AsciiString,TCollection_AsciiString>
+ {
+ /*!
+ * \brief Filling. The last string must be ""
+ */
+ void Insert(const char* names_values[]) {
+ for ( int i = 0; names_values[i][0] ; i += 2 )
+ insert( make_pair( (char*) names_values[i], names_values[i+1] ));
+ }
+ /*!
+ * \brief Check if a string is in
+ */
+ TCollection_AsciiString Value(const TCollection_AsciiString& name ) {
+ map< _AString, _AString >::iterator it = find( name );
+ return it == end() ? "" : it->second;
+ }
+ };
+
//================================================================================
/*!
* \brief Returns a mesh by object
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() ))
+ {
+ 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;
+ }
+ // comment a command having not created args
for ( int iArg = cmd->GetNbArgs(); iArg; --iArg )
{
const _pyID& arg = cmd->GetArg( iArg );
cmd->Comment();
cmd->GetString() += " ### " ;
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;
}
}
+ // comment a command having not created Object
const _pyID& obj = cmd->GetObject();
if ( !obj.IsEmpty() && cmd->IsStudyEntry( obj ) && !presentObjects.count( obj ))
{
cmd->Comment();
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();
if ( result.IsEmpty() || result.Value( 1 ) == '"' || result.Value( 1 ) == '\'' )
// - FT_EqualVolumes = 17
// v 6.6.0: FT_Undefined == 44, new items:
// - 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 ); }
+ undef2newItems[ 44 ].push_back( 37 );
+ undef2newItems[ 45 ].push_back( 36 );
+ undef2newItems[ 46 ].push_back( 39 );
}
int iType = Type.IntegerValue();
//================================================================================
/*!
- * \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 )),
{
// find a GEOM entry
_pyID geomID;
- SALOMEDS::SComponent_var geomComp = theStudy->FindComponent("GEOM");
+ SALOMEDS::SComponent_wrap geomComp = theStudy->FindComponent("GEOM");
if ( geomComp->_is_nil() ) return;
CORBA::String_var entry = geomComp->GetID();
geomID = entry.in();
//================================================================================
/*!
- * \brief name of SMESH_Gen in smesh.py
+ * \brief name of SMESH_Gen in smeshBuilder.py
*/
//================================================================================
groups = aCommand->GetResultValue(2);
else if ( method == "MakeBoundaryElements")
groups = aCommand->GetResultValue(3);
+ else if ( method == "Create0DElementsOnAllNodes" &&
+ aCommand->GetArg(2).Length() > 2 ) // group name != ''
+ groups = aCommand->GetResultValue();
id_editor->second->Process( aCommand );
id_editor->second->AddProcessedCmd( aCommand );
+ // create meshes
if ( !meshID.IsEmpty() &&
!myMeshes.count( meshID ) &&
aCommand->IsStudyEntry( meshID ))
aCommand->Clear();
aCommand->GetString() = processedCommand; // discard changes made by _pyMesh
}
+ // create groups
if ( !groups.IsEmpty() )
{
if ( !aCommand->IsStudyEntry( meshID ))
// 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
aCommand->SetArg( 2, Type );
aCommand->SetArg( 3, Compare );
- if ( Type == "SMESH.FT_ElemGeomType" && Threshold.IsIntegerValue() )
+ if ( Threshold.IsIntegerValue() )
{
- // set SMESH.GeometryType instead of a numerical Threshold
- const char* types[SMESH::Geom_BALL+1] = {
- "Geom_POINT", "Geom_EDGE", "Geom_TRIANGLE", "Geom_QUADRANGLE", "Geom_POLYGON",
- "Geom_TETRA", "Geom_PYRAMID", "Geom_HEXA", "Geom_PENTA", "Geom_HEXAGONAL_PRISM",
- "Geom_POLYHEDRA", "Geom_BALL"
- };
int iGeom = Threshold.IntegerValue();
- if ( -1 < iGeom && iGeom < SMESH::Geom_POLYHEDRA+1 )
- Threshold = SMESH + types[ iGeom ];
+ if ( Type == "SMESH.FT_ElemGeomType" )
+ {
+ // set SMESH.GeometryType instead of a numerical Threshold
+ const char* types[SMESH::Geom_BALL+1] = {
+ "Geom_POINT", "Geom_EDGE", "Geom_TRIANGLE", "Geom_QUADRANGLE", "Geom_POLYGON",
+ "Geom_TETRA", "Geom_PYRAMID", "Geom_HEXA", "Geom_PENTA", "Geom_HEXAGONAL_PRISM",
+ "Geom_POLYHEDRA", "Geom_BALL" };
+ if ( -1 < iGeom && iGeom < SMESH::Geom_POLYHEDRA+1 )
+ Threshold = SMESH + types[ iGeom ];
+ }
+ if (Type == "SMESH.FT_EntityType")
+ {
+ // 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_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",
+ "Entity_Hexa", "Entity_Quad_Hexa", "Entity_TriQuad_Hexa",
+ "Entity_Penta", "Entity_Quad_Penta", "Entity_Hexagonal_Prism",
+ "Entity_Polyhedra", "Entity_Quad_Polyhedra", "Entity_Ball" };
+ if ( -1 < iGeom && iGeom < SMESH::Entity_Quad_Polyhedra+1 )
+ 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 == "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 ));
return;
}
- if( method == "CreateMeshesFromMED" || method == "CreateMeshesFromSAUV")
+ if( method == "CreateMeshesFromMED" ||
+ method == "CreateMeshesFromSAUV"||
+ 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 ));
}
+ if ( method == "CreateMeshesFromGMF" )
+ {
+ // CreateMeshesFromGMF( theFileName, theMakeRequiredGroups ) ->
+ // CreateMeshesFromGMF( theFileName )
+ _AString file = theCommand->GetArg(1);
+ theCommand->RemoveArgs();
+ theCommand->SetArg( 1, file );
+ }
}
// CreateHypothesis()
}
}
- // objects erasing creation command if no more it's commands invoked:
+ // objects erasing creation command if no more its commands invoked:
// SMESH_Pattern, FilterManager
if ( method == "GetPattern" ||
method == "CreateFilterManager" ||
// 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() );
}
for ( hyp = myHypos.begin(); hyp != myHypos.end(); ++hyp )
if ( !hyp->IsNull() ) {
(*hyp)->Flush();
- // smeshgen.CreateHypothesis() --> smesh.smesh.CreateHypothesis()
+ // smeshgen.CreateHypothesis() --> smesh.CreateHypothesis()
if ( !(*hyp)->IsWrapped() )
(*hyp)->GetCreationCmd()->SetObject( SMESH_2smeshpy::GenName() );
}
// either the SMESH object is not in study or it is a GEOM object
if ( IsGeomObject( theObjID ))
{
- SALOMEDS::SObject_var so = myStudy->FindObjectID( theObjID.ToCString() );
+ SALOMEDS::SObject_wrap so = myStudy->FindObjectID( theObjID.ToCString() );
if ( so->_is_nil() ) return true;
CORBA::Object_var obj = so->GetObject();
return CORBA::is_nil( obj );
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
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();
+ const int nbGroupsBefore = myGroups.size();
+ Handle(_pyObject) obj;
+ for ( ; grID != idList.end(); ++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" ||
+ 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() )
+ {
+ 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()
theCommand->SetArg( i-1, theCommand->GetArg( i ));
theCommand->SetArg( nbArgs, partID );
}
+ else if ( method == "ExportGMF" )
+ { // ExportGMF(part,file,bool) -> ExportCGNS(file, part)
+ _pyID partID = theCommand->GetArg( 1 );
+ _AString file = theCommand->GetArg( 2 );
+ theCommand->RemoveArgs();
+ theCommand->SetArg( 1, file );
+ theCommand->SetArg( 2, partID );
+ }
else if ( theCommand->MethodStartsFrom( "ExportPartTo" ))
{ // ExportPartTo*(part, ...) -> Export*(..., part)
//
{
_pyID hypID = theCommand->GetArg( 2 );
_pyID geomID = theCommand->GetArg( 1 );
+ bool isLocal = ( geomID != GetGeom() );
// check if this mesh still has corresponding addition command
- bool hasAddCmd = false;
- list< Handle(_pyCommand) >::iterator cmd = myAddHypCmds.begin();
- while ( cmd != myAddHypCmds.end() )
+ Handle(_pyCommand) addCmd;
+ list< Handle(_pyCommand) >::iterator cmd;
+ list< Handle(_pyCommand) >* addCmds[2] = { &myAddHypCmds, &myNotConvertedAddHypCmds };
+ for ( int i = 0; i < 2; ++i )
{
- // AddHypothesis(geom, hyp)
- if ( hypID == (*cmd)->GetArg( 2 ) &&
- geomID == (*cmd)->GetArg( 1 )) { // erase both (add and remove) commands
- theCommand->Clear();
- (*cmd)->Clear();
- cmd = myAddHypCmds.erase( cmd );
- hasAddCmd = true;
- }
- else {
- ++cmd;
+ list< Handle(_pyCommand )> & addHypCmds = *(addCmds[i]);
+ for ( cmd = addHypCmds.begin(); cmd != addHypCmds.end(); )
+ {
+ bool sameHyp = true;
+ if ( hypID != (*cmd)->GetArg( 1 ) && hypID != (*cmd)->GetArg( 2 ))
+ sameHyp = false; // other hyp
+ if ( (*cmd)->GetNbArgs() == 2 &&
+ geomID != (*cmd)->GetArg( 1 ) && geomID != (*cmd)->GetArg( 2 ))
+ sameHyp = false; // other geom
+ if ( (*cmd)->GetNbArgs() == 1 && isLocal )
+ sameHyp = false; // other geom
+ if ( sameHyp )
+ {
+ addCmd = *cmd;
+ cmd = addHypCmds.erase( cmd );
+ if ( !theGen->IsToKeepAllCommands() ) {
+ addCmd->Clear();
+ theCommand->Clear();
+ }
+ }
+ else
+ {
+ ++cmd;
+ }
}
}
Handle(_pyHypothesis) hyp = theGen->FindHyp( hypID );
- if ( ! hasAddCmd && hypID.Length() != 0 ) { // hypo addition already wrapped
+ if ( !theCommand->IsEmpty() && !hypID.IsEmpty() ) {
// RemoveHypothesis(geom, hyp) --> RemoveHypothesis( hyp, geom=0 )
_pyID geom = theCommand->GetArg( 1 );
theCommand->RemoveArgs();
subMesh->Process( theCommand ); // it moves GetSubMesh() before theCommand
}
}
- // update list of groups
- else if ( method == "GetGroups" )
- {
- TCollection_AsciiString grIDs = theCommand->GetResultValue();
- list< _pyID > idList = theCommand->GetStudyEntries( grIDs );
- list< _pyID >::iterator grID = idList.begin();
- for ( ; grID != idList.end(); ++grID )
- {
- Handle(_pyObject) obj = theGen->FindObject( *grID );
- if ( obj.IsNull() )
- {
- Handle(_pyGroup) group = new _pyGroup( theCommand, *grID );
- theGen->AddObject( group );
- myGroups.push_back( group );
- }
- }
- }
// add accessor method if necessary
else
{
addCmd->SetArg( 1, algoID );
if ( isLocalAlgo )
addCmd->SetArg( 2, geom );
+ myNotConvertedAddHypCmds.push_back( addCmd );
}
}
addCmd->SetArg( 1, hypID );
if ( geom != GetGeom() )
addCmd->SetArg( 2, geom );
+ myNotConvertedAddHypCmds.push_back( addCmd );
}
}
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 python class Mesh, so
- // commands calling this methods are converted to calls of methods of Mesh
+ // 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
static TStringSet sameMethods;
if ( sameMethods.empty() ) {
const char * names[] = {
"RemoveElements","RemoveNodes","RemoveOrphanNodes","AddNode","Add0DElement","AddEdge","AddFace","AddPolygonalFace","AddBall",
"AddVolume","AddPolyhedralVolume","AddPolyhedralVolumeByFaces","MoveNode", "MoveClosestNodeToPoint",
- "InverseDiag","DeleteDiag","Reorient","ReorientObject","TriToQuad","SplitQuad","SplitQuadObject",
+ "InverseDiag","DeleteDiag","Reorient","ReorientObject",
+ "TriToQuad","TriToQuadObject", "QuadTo4Tri", "SplitQuad","SplitQuadObject",
"BestSplit","Smooth","SmoothObject","SmoothParametric","SmoothParametricObject",
"ConvertToQuadratic","ConvertFromQuadratic","RenumberNodes","RenumberElements",
"RotationSweep","RotationSweepObject","RotationSweepObject1D","RotationSweepObject2D",
"MergeElements","MergeEqualElements","SewFreeBorders","SewConformFreeBorders",
"SewBorderToSide","SewSideElements","ChangeElemNodes","GetLastCreatedNodes",
"GetLastCreatedElems",
- "MirrorMakeMesh","MirrorObjectMakeMesh","TranslateMakeMesh",
- "TranslateObjectMakeMesh","RotateMakeMesh","RotateObjectMakeMesh","MakeBoundaryMesh",
+ "MirrorMakeMesh","MirrorObjectMakeMesh","TranslateMakeMesh","TranslateObjectMakeMesh",
+ "Scale","ScaleMakeMesh","RotateMakeMesh","RotateObjectMakeMesh","MakeBoundaryMesh",
"MakeBoundaryElements", "SplitVolumesIntoTetra"
,"" }; // <- mark of the end
sameMethods.Insert( names );
}
- // names of SMESH_MeshEditor methods which differ from methods of class Mesh
+ // names of SMESH_MeshEditor commands in which only a method name must be replaced
+ TStringMap diffMethods;
+ if ( diffMethods.empty() ) {
+ const char * orig2newName[] = {
+ // original name --------------> new name
+ "ExtrusionAlongPathObjX" , "ExtrusionAlongPathX",
+ "FindCoincidentNodesOnPartBut", "FindCoincidentNodesOnPart",
+ "ConvertToQuadraticObject" , "ConvertToQuadratic",
+ "ConvertFromQuadraticObject" , "ConvertFromQuadratic",
+ "Create0DElementsOnAllNodes" , "Add0DElementsToAllNodes",
+ ""};// <- mark of the end
+ diffMethods.Insert( orig2newName );
+ }
+
+ // names of SMESH_MeshEditor methods which differ from methods of Mesh class
// only by last two arguments
static TStringSet diffLastTwoArgsMethods;
if (diffLastTwoArgsMethods.empty() ) {
const char * names[] = {
"MirrorMakeGroups","MirrorObjectMakeGroups",
- "TranslateMakeGroups","TranslateObjectMakeGroups",
+ "TranslateMakeGroups","TranslateObjectMakeGroups","ScaleMakeGroups",
"RotateMakeGroups","RotateObjectMakeGroups",
""};// <- mark of the end
diffLastTwoArgsMethods.Insert( names );
}
+ // only a method name is to change?
const TCollection_AsciiString & method = theCommand->GetMethod();
bool isPyMeshMethod = sameMethods.Contains( method );
if ( !isPyMeshMethod )
{
- //Replace SMESH_MeshEditor "MakeGroups" functions by the Mesh
- //functions with the flag "theMakeGroups = True" like:
- //SMESH_MeshEditor.CmdMakeGroups => Mesh.Cmd(...,True)
+ TCollection_AsciiString newMethod = diffMethods.Value( method );
+ if (( isPyMeshMethod = ( newMethod.Length() > 0 )))
+ theCommand->SetMethod( newMethod );
+ }
+ // ConvertToBiQuadratic(...) -> ConvertToQuadratic(...,True)
+ if ( !isPyMeshMethod && (method == "ConvertToBiQuadratic" || method == "ConvertToBiQuadraticObject") )
+ {
+ isPyMeshMethod = true;
+ theCommand->SetMethod( method.SubString( 1, 9) + method.SubString( 12, method.Length()));
+ theCommand->SetArg( theCommand->GetNbArgs() + 1, "True" );
+ }
+
+ if ( !isPyMeshMethod )
+ {
+ // Replace SMESH_MeshEditor "*MakeGroups" functions by the Mesh
+ // functions with the flag "theMakeGroups = True" like:
+ // SMESH_MeshEditor.CmdMakeGroups => Mesh.Cmd(...,True)
int pos = method.Search("MakeGroups");
if( pos != -1)
{
}
}
- // ExtrusionSweep0D() -> ExtrusionSweep()
+ // ExtrusionSweep0D() -> ExtrusionSweep()
// ExtrusionSweepObject0D() -> ExtrusionSweepObject()
if ( !isPyMeshMethod && ( method == "ExtrusionSweep0D" ||
method == "ExtrusionSweepObject0D" ))
theCommand->SetArg(theCommand->GetNbArgs()+1,"False"); //sets flag "MakeGroups = False"
theCommand->SetArg(theCommand->GetNbArgs()+1,"True"); //sets flag "IsNode = True"
}
- // set "ExtrusionAlongPathX()" instead of "ExtrusionAlongPathObjX()"
- if ( !isPyMeshMethod && method == "ExtrusionAlongPathObjX")
- {
- isPyMeshMethod = true;
- theCommand->SetMethod("ExtrusionAlongPathX");
- }
- // set "FindCoincidentNodesOnPart()" instead of "FindCoincidentNodesOnPartBut()"
- if ( !isPyMeshMethod && method == "FindCoincidentNodesOnPartBut")
- {
- isPyMeshMethod = true;
- theCommand->SetMethod("FindCoincidentNodesOnPart");
- }
// DoubleNode...New(...) -> DoubleNode...(...,True)
if ( !isPyMeshMethod && ( method == "DoubleNodeElemGroupNew" ||
method == "DoubleNodeElemGroupsNew" ||
theCommand->SetResultValue( groupID );
}
}
- // ConvertToQuadraticObject(bool,obj) -> ConvertToQuadratic(bool,obj)
- // ConvertFromQuadraticObject(obj) -> ConvertFromQuadratic(obj)
- if ( !isPyMeshMethod && ( method == "ConvertToQuadraticObject" ||
- method == "ConvertFromQuadraticObject" ))
- {
- isPyMeshMethod = true;
- theCommand->SetMethod( method.SubString( 1, method.Length()-6));
- }
// FindAmongElementsByPoint(meshPart, x, y, z, elementType) ->
// FindElementsByPoint(x, y, z, elementType, meshPart)
if ( !isPyMeshMethod && method == "FindAmongElementsByPoint" )
theCommand->SetArg( 3, face );
}
- // meshes made by *MakeMesh() methods are not wrapped by _pyMesh,
- // so let _pyMesh care of it (TMP?)
- // if ( theCommand->GetMethod().Search("MakeMesh") != -1 )
- // _pyMesh( new _pyCommand( theCommand->GetString(), 0 )); // for theGen->SetAccessorMethod()
+ if ( method == "QuadToTri" || method == "QuadToTriObject" )
+ {
+ isPyMeshMethod = true;
+ int crit_arg = theCommand->GetNbArgs();
+ const _AString& crit = theCommand->GetArg(crit_arg);
+ if (crit.Search("MaxElementLength2D") != -1)
+ theCommand->SetArg(crit_arg, "");
+ }
+
if ( isPyMeshMethod )
{
theCommand->SetObject( myMesh );
else
{
// editor creation command is needed only if any editor function is called
- theGen->AddMeshAccessorMethod( theCommand ); // for *Object()
+ theGen->AddMeshAccessorMethod( theCommand ); // for *Object() methods
if ( !myCreationCmdStr.IsEmpty() ) {
GetCreationCmd()->GetString() = myCreationCmdStr;
myCreationCmdStr.Clear();
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" ) {
//================================================================================
/*!
* \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
void _pyCommand::RemoveArgs()
{
- if ( int pos = myString.Location( '(', 1, Length() ))
+ if ( int pos = myString.Location( '(', Max( 1, GetBegPos( METHOD_IND )), Length() ))
myString.Trunc( pos );
myString += ")";
myArgs.Clear();
myString.Insert( i, "#" );
for ( int iPart = 0; 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 );
}
}
}
void _pySelfEraser::Flush()
{
- if ( GetNbCalls() == 0 )
+ 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();
+ }
+ if ( nbCalls < 1 )
GetCreationCmd()->Clear();
}
"TranslateObjectMakeGroups","TranslateObjectMakeMesh","ScaleMakeGroups","ScaleMakeMesh",
"RotateObject","RotateObjectMakeGroups","RotateObjectMakeMesh","FindCoincidentNodesOnPart",
"FindCoincidentNodesOnPartBut","FindEqualElements","FindAmongElementsByPoint",
- "MakeBoundaryMesh",
+ "MakeBoundaryMesh","Create0DElementsOnAllNodes",
"" }; // <- mark of end
methods.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
+ * command is discarded
+ */
+//================================================================================
+
+void _pyGroup::RemovedWithContents()
+{
+ // this code would be appropriate if Add0DElementsToAllNodes() returned only new nodes
+ // via a created group
+ //if ( GetCreationCmd()->GetMethod() == "Add0DElementsToAllNodes")
+ // myCanClearCreationCmd = true;
+}
+
//================================================================================
/*!
* \brief To convert creation of a group by filter
//================================================================================
/*!
* \brief Prevent clearing "DoubleNode...() command if a group created by it is removed
- *
- *
*/
//================================================================================