-// 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
// - 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 );
}
int iType = Type.IntegerValue();
//================================================================================
/*!
- * \brief Convert a python script using commands of smesh.py
+ * \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
//================================================================================
/*!
- * \brief name of SMESH_Gen in smesh.py
+ * \brief name of SMESH_Gen in smeshBuilder.py
*/
//================================================================================
// 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
// 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 == "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 ));
}
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++ )
{
// 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() );
}
//================================================================================
/*!
- * \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 _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 );
"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",
"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 );
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" ) {
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
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();
}
}
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