-// Copyright (C) 2007-2013 CEA/DEN, EDF R&D, OPEN CASCADE
+// Copyright (C) 2007-2015 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
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
+// version 2.1 of the License, or (at your option) any later version.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
#include <LDOMParser.hxx>
-#ifdef WNT
+#ifdef WIN32
#include <windows.h>
#else
#include <unistd.h>
if ( cmd->GetString().Location( TPythonDump::NotPublishedObjectName(), 1, cmd->Length() ))
{
bool isResultPublished = false;
- for ( int i = 0; i < cmd->GetNbResultValues(); i++ )
+ const int nbRes = cmd->GetNbResultValues();
+ for ( int i = 0; i < nbRes; i++ )
{
_pyID objID = cmd->GetResultValue( i+1 );
if ( cmd->IsStudyEntry( objID ))
}
// 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 ))
+
+ _pyID obj = cmd->GetObject();
+ if ( obj.Search( "print " ) == 1 )
+ return; // print statement
+
+ if ( !obj.IsEmpty() && obj.Value( obj.Length() ) == ')' )
+ // remove an accessor method
+ obj = _pyCommand( obj ).GetObject();
+
+ const bool isMethodCall = cmd->IsMethodCall();
+ if ( !obj.IsEmpty() && isMethodCall && !presentObjects.count( obj ) )
{
comment = "not created Object";
theGen->ObjectCreationRemoved( obj );
comment += *id + " has not been yet created";
break;
}
+ // if ( idList.empty() && cmd->IsID( arg ) && !presentObjects.count( arg ))
+ // comment += arg + " has not been yet created";
}
// treat result objects
const _pyID& result = cmd->GetResultValue();
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
+ }
+ if ( idList.empty() && cmd->IsID( result ))
+ presentObjects.insert( result );
}
// comment the command
if ( !comment.IsEmpty() )
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();
*/
//================================================================================
- void StructToList( Handle( _pyCommand)& theCommand )
+ void StructToList( Handle( _pyCommand)& theCommand, const bool checkMethod=true )
{
static TStringSet methodsAcceptingList;
if ( methodsAcceptingList.empty() ) {
"ExtrusionSweepObject1D","ExtrusionSweepObject1DMakeGroups",
"ExtrusionSweepObject2D","ExtrusionSweepObject2DMakeGroups",
"Translate","TranslateMakeGroups","TranslateMakeMesh",
- "TranslateObject","TranslateObjectMakeGroups", "TranslateObjectMakeMesh"
+ "TranslateObject","TranslateObjectMakeGroups", "TranslateObjectMakeMesh",
+ "ExtrusionAlongPathX","ExtrusionAlongPathObjX","SplitHexahedraIntoPrisms"
,"" }; // <- mark of the end
methodsAcceptingList.Insert( methodNames );
}
- if ( methodsAcceptingList.Contains( theCommand->GetMethod() ))
+ if ( !checkMethod || methodsAcceptingList.Contains( theCommand->GetMethod() ))
{
for ( int i = theCommand->GetNbArgs(); i > 0; --i )
{
//================================================================================
/*!
* \brief Convert a python script using commands of smeshBuilder.py
- * \param theScript - Input script
+ * \param theScriptLines - Lines of the input script
* \param theEntry2AccessorMethod - returns method names to access to
* objects wrapped with python class
* \param theObjectNames - names of objects
*/
//================================================================================
-TCollection_AsciiString
-SMESH_2smeshpy::ConvertScript(const TCollection_AsciiString& theScript,
+void
+SMESH_2smeshpy::ConvertScript(std::list< TCollection_AsciiString >& theScriptLines,
Resource_DataMapOfAsciiStringAsciiString& theEntry2AccessorMethod,
Resource_DataMapOfAsciiStringAsciiString& theObjectNames,
std::set< TCollection_AsciiString >& theRemovedObjIDs,
SALOMEDS::Study_ptr& theStudy,
const bool theToKeepAllCommands)
{
- theGen = new _pyGen( theEntry2AccessorMethod,
- theObjectNames,
- theRemovedObjIDs,
- theStudy,
- theToKeepAllCommands );
+ std::list< TCollection_AsciiString >::iterator lineIt;
+ // process notebook variables
+ {
+ SMESH_NoteBook aNoteBook;
- // split theScript into separate commands
+ for ( lineIt = theScriptLines.begin(); lineIt != theScriptLines.end(); ++lineIt )
+ aNoteBook.AddCommand( *lineIt );
- SMESH_NoteBook * aNoteBook = new SMESH_NoteBook();
+ theScriptLines.clear();
- int from = 1, end = theScript.Length(), to;
- 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;
+ aNoteBook.ReplaceVariables();
+
+ aNoteBook.GetResultLines( theScriptLines );
}
- aNoteBook->ReplaceVariables();
+ // convert to smeshBuilder.py API
+
+ theGen = new _pyGen( theEntry2AccessorMethod,
+ theObjectNames,
+ theRemovedObjIDs,
+ theStudy,
+ theToKeepAllCommands );
- TCollection_AsciiString aNoteScript = aNoteBook->GetResultScript();
- delete aNoteBook;
- aNoteBook = 0;
+ for ( lineIt = theScriptLines.begin(); lineIt != theScriptLines.end(); ++lineIt )
+ theGen->AddCommand( *lineIt );
- // split theScript into separate commands
- from = 1, end = aNoteScript.Length();
- while ( from < end && ( to = aNoteScript.Location( "\n", from, end )))
- {
- if ( to != from )
- // cut out and store a command
- theGen->AddCommand( aNoteScript.SubString( from, to - 1 ));
- from = to + 1;
- }
+ theScriptLines.clear();
// finish conversion
theGen->Flush();
} while ( orderChanges );
// concat commands back into a script
- TCollection_AsciiString aScript, aPrevCmd;
+ TCollection_AsciiString aPrevCmd;
set<_pyID> createdObjects;
+ createdObjects.insert( "smeshBuilder" );
+ createdObjects.insert( "smesh" );
+ createdObjects.insert( "theStudy" );
for ( cmd = theGen->GetCommands().begin(); cmd != theGen->GetCommands().end(); ++cmd )
{
#ifdef DUMP_CONVERSION
#endif
if ( !(*cmd)->IsEmpty() && aPrevCmd != (*cmd)->GetString()) {
CheckObjectPresence( *cmd, createdObjects );
- aPrevCmd = (*cmd)->GetString();
- aScript += "\n";
- aScript += aPrevCmd;
+ if ( !(*cmd)->IsEmpty() ) {
+ aPrevCmd = (*cmd)->GetString();
+ theScriptLines.push_back( aPrevCmd );
+ }
}
}
- aScript += "\n";
theGen->Free();
theGen.Nullify();
-
- return aScript;
}
//================================================================================
// 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]
+ // Method( SMESH.PointStruct(x,y,z)... -> Method( [x,y,z]...
StructToList( aCommand );
+ const TCollection_AsciiString& method = aCommand->GetMethod();
+
+ // not to erase _pySelfEraser's etc. used as args in some commands
+ {
+#ifdef USE_STRING_FAMILY
+ std::list<_pyID> objIDs;
+ if ( myKeepAgrCmdsIDs.IsInArgs( aCommand, objIDs ))
+ {
+ std::list<_pyID>::iterator objID = objIDs.begin();
+ for ( ; objID != objIDs.end(); ++objID )
+ {
+ Handle(_pyObject) obj = FindObject( *objID );
+ if ( !obj.IsNull() )
+ {
+ obj->AddArgCmd( aCommand );
+ //cout << objID << " found in " << theCommand << endl;
+ }
+ }
+ }
+#else
+ 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 );
+ }
+#endif
+ }
+
// 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
+ //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 );
- myObjects.insert( make_pair( subMeshID, subMesh ));
+ AddObject( subMesh );
}
// Method( mesh.GetIDSource([id1,id2]) -> Method( [id1,id2]
GetIDSourceToList( aCommand );
- addFilterUser( aCommand, theGen ); // protect filters from clearing
+ //addFilterUser( aCommand, theGen ); // protect filters from clearing
id_mesh->second->Process( aCommand );
id_mesh->second->AddProcessedCmd( aCommand );
// Method( mesh.GetIDSource([id1,id2]) -> Method( [id1,id2]
GetIDSourceToList( aCommand );
- addFilterUser( aCommand, theGen ); // protect filters from clearing
-
- const TCollection_AsciiString& method = aCommand->GetMethod();
+ //addFilterUser( aCommand, theGen ); // protect filters from clearing
// some commands of SMESH_MeshEditor create meshes and groups
_pyID meshID, 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 );
if ( Type == "SMESH.FT_ElemGeomType" )
{
// set SMESH.GeometryType instead of a numerical Threshold
- const char* types[SMESH::Geom_BALL+1] = {
+ const int nbTypes = SMESH::Geom_BALL+1;
+ const char* types[nbTypes] = {
"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 )
+ if ( -1 < iGeom && iGeom < nbTypes )
Threshold = SMESH + types[ iGeom ];
}
if (Type == "SMESH.FT_EntityType")
{
// set SMESH.EntityType instead of a numerical Threshold
- const char* types[SMESH::Entity_Ball+1] = {
+ const int nbTypes = SMESH::Entity_Ball+1;
+ const char* types[nbTypes] = {
"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_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 )
+ if ( -1 < iGeom && iGeom < nbTypes )
Threshold = SMESH + types[ iGeom ];
}
}
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 == "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 == "CreateMeshesFromCGNS" ||
method == "CreateMeshesFromGMF" ) // command result is ( [mesh1,mesh2], status )
{
- for ( int ind = 0; ind < theCommand->GetNbResultValues(); ind++ )
+ std::list< _pyID > meshIDs = theCommand->GetStudyEntries( theCommand->GetResultValue() );
+ std::list< _pyID >::iterator meshID = meshIDs.begin();
+ for ( ; meshID != meshIDs.end(); ++meshID )
{
- _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 ));
+ Handle(_pyMesh) mesh = new _pyMesh( theCommand, *meshID );
+ 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 )
+ if ( !AddObject( obj ) )
theCommand->Clear(); // already created
}
// Concatenate( [mesh1, ...], ... )
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)
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();
+ 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 ( !(*hyp)->IsWrapped() )
- (*hyp)->GetCreationCmd()->SetObject( SMESH_2smeshpy::GenName() );
+ if ( !id_hyp->second->IsWrapped() )
+ id_hyp->second->GetCreationCmd()->SetObject( SMESH_2smeshpy::GenName() );
}
- // Flush other objects
- for ( id_obj = myObjects.begin(); id_obj != myObjects.end(); ++id_obj )
- if ( ! id_obj->second.IsNull() )
- id_obj->second->Flush();
+ // Flush other objects. 2 times, for objects depending on Flush() of later created objects
+ std::list< Handle(_pyObject) >::reverse_iterator robj = myOrderedObjects.rbegin();
+ for ( ; robj != myOrderedObjects.rend(); ++robj )
+ if ( ! robj->IsNull() )
+ (*robj)->Flush();
+ std::list< Handle(_pyObject) >::iterator obj = myOrderedObjects.begin();
+ for ( ; obj != myOrderedObjects.end(); ++obj )
+ if ( ! obj->IsNull() )
+ (*obj)->Flush();
myLastCommand->SetOrderNb( ++myNbCommands );
myCommands.push_back( myLastCommand );
void _pyGen::PlaceSubmeshAfterItsCreation( Handle(_pyCommand) theCmdUsingSubmesh ) const
{
- map< _pyID, Handle(_pyObject) >::const_iterator id_obj = myObjects.begin();
- for ( ; id_obj != myObjects.end(); ++id_obj )
- {
- if ( !id_obj->second->IsKind( STANDARD_TYPE( _pySubMesh ))) continue;
- for ( int iArg = theCmdUsingSubmesh->GetNbArgs(); iArg; --iArg )
- {
- const _pyID& arg = theCmdUsingSubmesh->GetArg( iArg );
- if ( arg.IsEmpty() || arg.Value( 1 ) == '"' || arg.Value( 1 ) == '\'' )
- continue;
- list< _pyID > idList = theCmdUsingSubmesh->GetStudyEntries( arg );
- list< _pyID >::iterator id = idList.begin();
- for ( ; id != idList.end(); ++id )
- if ( id_obj->first == *id )
- // _pySubMesh::Process() does what we need
- Handle(_pySubMesh)::DownCast( id_obj->second )->Process( theCmdUsingSubmesh );
- }
- }
+ // map< _pyID, Handle(_pyObject) >::const_iterator id_obj = myObjects.begin();
+ // for ( ; id_obj != myObjects.end(); ++id_obj )
+ // {
+ // if ( !id_obj->second->IsKind( STANDARD_TYPE( _pySubMesh ))) continue;
+ // for ( int iArg = theCmdUsingSubmesh->GetNbArgs(); iArg; --iArg )
+ // {
+ // const _pyID& arg = theCmdUsingSubmesh->GetArg( iArg );
+ // if ( arg.IsEmpty() || arg.Value( 1 ) == '"' || arg.Value( 1 ) == '\'' )
+ // continue;
+ // list< _pyID > idList = theCmdUsingSubmesh->GetStudyEntries( arg );
+ // list< _pyID >::iterator id = idList.begin();
+ // for ( ; id != idList.end(); ++id )
+ // if ( id_obj->first == *id )
+ // // _pySubMesh::Process() does what we need
+ // Handle(_pySubMesh)::DownCast( id_obj->second )->Process( theCmdUsingSubmesh );
+ // }
+ // }
}
//================================================================================
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(_pyObject) >::iterator id_obj = myObjects.begin();
- for ( ; id_obj != myObjects.end(); ++id_obj )
- id_obj->second->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();
+
+ // Other objects. 2 times, for objects depending on ClearCommands() of later created objects
+ std::list< Handle(_pyObject) >::reverse_iterator robj = myOrderedObjects.rbegin();
+ for ( ; robj != myOrderedObjects.rend(); ++robj )
+ if ( ! robj->IsNull() )
+ (*robj)->ClearCommands();
+ std::list< Handle(_pyObject) >::iterator obj = myOrderedObjects.begin();
+ for ( ; obj != myOrderedObjects.end(); ++obj )
+ if ( ! obj->IsNull() )
+ (*obj)->ClearCommands();
}
//================================================================================
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();
+
+ //myKeepAgrCmdsIDs.Print();
}
//================================================================================
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)();
}
//================================================================================
*/
//================================================================================
-void _pyGen::addFilterUser( Handle(_pyCommand)& theCommand, const Handle(_pyObject)& user )
-{
- const char filterPrefix[] = "aFilter0x";
- if ( theCommand->GetString().Search( filterPrefix ) < 1 )
- return;
+// void _pyGen::addFilterUser( Handle(_pyCommand)& theCommand, const Handle(_pyObject)& user )
+// {
+ // No more needed after adding _pyObject::myArgCommands
- 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;
+// const char filterPrefix[] = "aFilter0x";
+// if ( theCommand->GetString().Search( filterPrefix ) < 1 )
+// return;
- Handle(_pyFilter) filter = Handle(_pyFilter)::DownCast( FindObject( arg ));
- if ( !filter.IsNull() )
- {
- filter->AddUser( user );
- if ( !filter->GetNewID().IsEmpty() )
- theCommand->SetArg( i, filter->GetNewID() );
- }
- }
-}
+// 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() );
+// }
+// }
+//}
//================================================================================
/*!
*/
//================================================================================
-void _pyGen::AddObject( Handle(_pyObject)& theObj )
+bool _pyGen::AddObject( Handle(_pyObject)& theObj )
{
- if ( theObj.IsNull() ) return;
+ if ( theObj.IsNull() ) return false;
- if ( theObj->IsKind( STANDARD_TYPE( _pyMesh )))
- myMeshes.insert( make_pair( theObj->GetID(), Handle(_pyMesh)::DownCast( theObj )));
+ CheckObjectIsReCreated( theObj );
- else if ( theObj->IsKind( STANDARD_TYPE( _pyMeshEditor )))
- myMeshEditors.insert( make_pair( theObj->GetID(), Handle(_pyMeshEditor)::DownCast( theObj )));
+ bool add;
- else
- myObjects.insert( make_pair( theObj->GetID(), theObj ));
+ if ( theObj->IsKind( STANDARD_TYPE( _pyMesh ))) {
+ add = myMeshes.insert( make_pair( theObj->GetID(),
+ Handle(_pyMesh)::DownCast( theObj ))).second;
+ }
+ else if ( theObj->IsKind( STANDARD_TYPE( _pyMeshEditor ))) {
+ add = myMeshEditors.insert( make_pair( theObj->GetID(),
+ Handle(_pyMeshEditor)::DownCast( theObj ))).second;
+ }
+ else {
+ add = myObjects.insert( make_pair( theObj->GetID(), theObj )).second;
+ if ( add ) myOrderedObjects.push_back( theObj );
+ }
+ return add;
+}
+
+//================================================================================
+/*!
+ * \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() );
+ }
+ }
}
//================================================================================
list< Handle(_pyHypothesis) >::iterator hyp;
if ( !myLastComputeCmd.IsNull() )
{
- for ( hyp = myHypos.begin(); hyp != myHypos.end(); ++hyp )
- (*hyp)->ComputeDiscarded( myLastComputeCmd );
+ // check if the previously computed mesh has been edited,
+ // if so then we do not clear the previous Compute()
+ bool toClear = true;
+ if ( myLastComputeCmd->GetMethod() == "Compute" )
+ {
+ list< Handle(_pyMeshEditor)>::iterator e = myEditors.begin();
+ for ( ; e != myEditors.end() && toClear; ++e )
+ {
+ list< Handle(_pyCommand)>& cmds = (*e)->GetProcessedCmds();
+ list< Handle(_pyCommand) >::reverse_iterator cmd = cmds.rbegin();
+ if ( cmd != cmds.rend() &&
+ (*cmd)->GetOrderNb() > myLastComputeCmd->GetOrderNb() )
+ toClear = false;
+ }
+ }
+ if ( toClear )
+ {
+ // clear hyp commands called before myLastComputeCmd
+ for ( hyp = myHypos.begin(); hyp != myHypos.end(); ++hyp )
+ (*hyp)->ComputeDiscarded( myLastComputeCmd );
- myLastComputeCmd->Clear();
+ myLastComputeCmd->Clear();
+ }
}
myLastComputeCmd = theCommand;
//
// remove "PartTo" from the method
TCollection_AsciiString newMethod = method;
- newMethod.Remove( 7, 6 );
+ newMethod.Remove( /*where=*/7, /*howmany=*/6 );
theCommand->SetMethod( newMethod );
- // make the 1st arg be the last one (or last but one for ExportMED())
+ // make the 1st arg be the last one (or last but three for ExportMED())
_pyID partID = theCommand->GetArg( 1 );
- int nbArgs = theCommand->GetNbArgs() - (newMethod == "ExportMED");
+ int nbArgs = theCommand->GetNbArgs() - 3 * (newMethod == "ExportMED");
for ( int i = 2; i <= nbArgs; ++i )
theCommand->SetArg( i-1, theCommand->GetArg( i ));
theCommand->SetArg( nbArgs, partID );
{
addCmd = *cmd;
cmd = addHypCmds.erase( cmd );
- if ( !theGen->IsToKeepAllCommands() ) {
+ if ( !theGen->IsToKeepAllCommands() && CanClear() ) {
addCmd->Clear();
theCommand->Clear();
}
+ else
+ {
+ // mesh.AddHypothesis(geom, hyp) --> mesh.AddHypothesis(hyp, geom=0)
+ addCmd->RemoveArgs();
+ addCmd->SetArg( 1, hypID );
+ if ( isLocal )
+ addCmd->SetArg( 2, geomID );
+ }
}
else
{
"GetSubMeshElementsId","GetSubMeshNodesId","GetSubMeshElementType","Dump","GetNodeXYZ",
"GetNodeInverseElements","GetShapeID","GetShapeIDForElem","GetElemNbNodes",
"GetElemNode","IsMediumNode","IsMediumNodeOfAnyElem","ElemNbEdges","ElemNbFaces",
+ "GetElemFaceNodes", "GetFaceNormal", "FindElementByNodes",
"IsPoly","IsQuadratic","BaryCenter","GetHypothesisList", "SetAutoColor", "GetAutoColor",
"Clear", "ConvertToStandalone", "GetMeshOrder", "SetMeshOrder"
,"" }; // <- mark of end
"AddNode","Add0DElement","AddEdge","AddFace","AddPolygonalFace","AddBall",
"AddVolume","AddPolyhedralVolume","AddPolyhedralVolumeByFaces",
"MoveNode", "MoveClosestNodeToPoint",
- "InverseDiag","DeleteDiag","Reorient","ReorientObject",
+ "InverseDiag","DeleteDiag","Reorient","ReorientObject","Reorient2DBy3D",
"TriToQuad","TriToQuadObject", "QuadTo4Tri", "SplitQuad","SplitQuadObject",
"BestSplit","Smooth","SmoothObject","SmoothParametric","SmoothParametricObject",
"ConvertToQuadratic","ConvertFromQuadratic","RenumberNodes","RenumberElements",
"GetLastCreatedElems",
"MirrorMakeMesh","MirrorObjectMakeMesh","TranslateMakeMesh","TranslateObjectMakeMesh",
"Scale","ScaleMakeMesh","RotateMakeMesh","RotateObjectMakeMesh","MakeBoundaryMesh",
- "MakeBoundaryElements", "SplitVolumesIntoTetra",
+ "MakeBoundaryElements", "SplitVolumesIntoTetra","SplitHexahedraIntoPrisms",
"DoubleElements","DoubleNodes","DoubleNode","DoubleNodeGroup","DoubleNodeGroups",
"DoubleNodeElem","DoubleNodeElemInRegion","DoubleNodeElemGroup",
"DoubleNodeElemGroupInRegion","DoubleNodeElemGroups","DoubleNodeElemGroupsInRegion",
hyp->SetConvMethodAndType( "SetGrid", "Cartesian_3D");
for ( int iArg = 0; iArg < 4; ++iArg )
hyp->setCreationArg( iArg+1, "[]");
+ hyp->AddAccumulativeMethod( "SetGrid" );
+ hyp->AddAccumulativeMethod( "SetGridSpacing" );
}
else
{
myArgCommands.push_back( theCommand );
usedCommand = true;
while ( crMethod.myArgs.size() < i+1 )
- crMethod.myArgs.push_back( "[]" );
+ crMethod.myArgs.push_back( "None" );
crMethod.myArgs[ i ] = theCommand->GetArg( crMethod.myArgNb[i] );
}
}
{
// CartesianParameters3D hyp
- if ( theCommand->GetMethod() == "SetSizeThreshold" )
+ if ( theCommand->GetMethod() == "SetSizeThreshold" ||
+ theCommand->GetMethod() == "SetToAddEdges" )
{
- setCreationArg( 4, theCommand->GetArg( 1 ));
+ int iEdges = ( theCommand->GetMethod().Value( 4 ) == 'T' );
+ setCreationArg( 4+iEdges, theCommand->GetArg( 1 ));
myArgCommands.push_back( theCommand );
return;
}
myCurCrMethod->myArgs[ iArg ] += "]";
}
myArgCommands.push_back( theCommand );
- rememberCmdOfParameter( theCommand );
+ //rememberCmdOfParameter( theCommand ); -- these commands are marked as
+ // accumulative, else, if the creation
+ // is not converted, commands for axes 1 and 2 are lost
return;
}
}
void _pyComplexParamHypo::Flush()
{
+ list < Handle(_pyCommand) >::iterator cmd;
if ( IsWrapped() )
{
- list < Handle(_pyCommand) >::iterator cmd = myUnusedCommands.begin();
- for ( ; cmd != myUnusedCommands.end(); ++cmd )
+ for ( cmd = myUnusedCommands.begin(); cmd != myUnusedCommands.end(); ++cmd )
if ((*cmd)->GetMethod() == "SetObjectEntry" )
(*cmd)->Clear();
}
+
+ // if ( GetAlgoType() == "Cartesian_3D" )
+ // {
+ // _pyID algo = myCreationCmd->GetObject();
+ // for ( cmd = myProcessedCmds.begin(); cmd != myProcessedCmds.end(); ++cmd )
+ // {
+ // if ( IsWrapped() )
+ // {
+ // StructToList( *cmd, /*checkMethod=*/false );
+ // const _AString & method = (*cmd)->GetMethod();
+ // if ( method == "SetFixedPoint" )
+ // (*cmd)->SetObject( algo );
+ // }
+ // }
+ // }
}
//================================================================================
/*!
* \brief Convert methods of 1D hypotheses to my own methods
- * \param theCommand - The called hypothesis method
+ * \param theCommand - The called hypothesis method
*/
//================================================================================
*/
//================================================================================
-int _pyCommand::GetBegPos( int thePartIndex )
+int _pyCommand::GetBegPos( int thePartIndex ) const
{
if ( IsEmpty() )
return EMPTY;
GetWord( myString, end, true );
else
end = GetBegPos( RESULT_IND );
- return myString.SubString( 1, end - 1 );
+ return myString.SubString( 1, Max( end - 1, 1 ));
}
//================================================================================
int _pyCommand::GetNbResultValues()
{
- int nb = 0;
- int begPos = 1;
- int endPos = myString.Location( "=", 1, Length() );
- while ( begPos < endPos )
- {
- _AString str = GetWord( myString, begPos, true );
- begPos = begPos+ str.Length();
- nb++;
- }
- return (nb-1);
+ GetResultValue(1);
+ return myResults.Length();
}
* \retval const TCollection_AsciiString & - ResultValue with res index substring
*/
//================================================================================
-TCollection_AsciiString _pyCommand::GetResultValue(int res)
+const _AString& _pyCommand::GetResultValue(int res)
{
- int begPos = 1;
- if ( SkipSpaces( myString, begPos ) && myString.Value( begPos ) == '[' )
- ++begPos; // skip [, else the whole list is returned
- int endPos = myString.Location( "=", 1, Length() );
- int Nb=0;
- while ( begPos < endPos) {
- _AString result = GetWord( myString, begPos, true );
- begPos = begPos + result.Length();
- Nb++;
- if(res == Nb) {
- result.RemoveAll('[');
- result.RemoveAll(']');
- return result;
+ if ( GetResultValue().IsEmpty() )
+ return theEmptyString;
+
+ if ( myResults.IsEmpty() )
+ {
+ int begPos = 1;
+ if ( SkipSpaces( myRes, begPos ) && myRes.Value( begPos ) == '[' )
+ ++begPos; // skip [, else the whole list is returned
+ while ( begPos < myRes.Length() ) {
+ _AString result = GetWord( myRes, begPos, true );
+ begPos += result.Length();
+ // if(res == Nb) {
+ // result.RemoveAll('[');
+ // result.RemoveAll(']');
+ // return result;
+ // }
+ // if(Nb>res)
+ // break;
+ myResults.Append( result );
}
- if(Nb>res)
- break;
}
+ if ( res > 0 && res <= myResults.Length() )
+ return myResults( res );
return theEmptyString;
}
//================================================================================
/*!
* \brief Return substring of python command looking like ResVal = Object.Meth()
- * \retval const TCollection_AsciiString & - Object substring
+ * \retval const TCollection_AsciiString & - Object substring
*/
//================================================================================
if ( GetBegPos( OBJECT_IND ) == UNKNOWN )
{
// beginning
- int begPos = GetBegPos( RESULT_IND ) + myRes.Length();
+ int begPos = GetBegPos( RESULT_IND );
if ( begPos < 1 ) {
begPos = myString.Location( "=", 1, Length() ) + 1;
// is '=' in the string argument (for example, name) or not
if ( nb1 % 2 != 0 || nb2 % 2 != 0 )
begPos = 1;
}
+ else {
+ begPos += myRes.Length();
+ }
myObj = GetWord( myString, begPos, true );
if ( begPos != EMPTY )
{
return myMeth;
}
+//================================================================================
+/*!
+ * \brief Returns true if there are brackets after the method
+ */
+//================================================================================
+
+bool _pyCommand::IsMethodCall()
+{
+ if ( GetMethod().IsEmpty() )
+ return false;
+ const char* s = myString.ToCString() + GetBegPos( METHOD_IND ) + myMeth.Length() - 1;
+ return ( s[0] == '(' || s[1] == '(' );
+}
+
//================================================================================
/*!
* \brief Return substring of python command looking like ResVal = Obj.Meth(Arg1,...)
return myArgs( index );
}
+//================================================================================
+/*!
+ * \brief Return position where arguments begin
+ */
+//================================================================================
+
+int _pyCommand::GetArgBeginning() const
+{
+ int pos = GetBegPos( ARG1_IND );
+ if ( pos == UNKNOWN )
+ {
+ pos = GetBegPos( METHOD_IND ) + myMeth.Length();
+ if ( pos < 1 )
+ pos = myString.Location( "(", 4, Length() ); // 4 = strlen("b.c(")
+ }
+ return pos;
+}
+
//================================================================================
/*!
* \brief Check if char is a word part
return nbColons > 2 && str.Length()-nbColons > 2;
}
+//================================================================================
+/*!
+ * \brief Returns true if the string looks like an object ID but not like a list,
+ * string, command etc.
+ */
+//================================================================================
+
+bool _pyCommand::IsID( const TCollection_AsciiString& str )
+{
+ if ( str.Length() < 1 ) return false;
+
+ const char* s = str.ToCString();
+
+ for ( int i = 0; i < str.Length(); ++i )
+ if ( !IsIDChar( s[i] ))
+ return false;
+
+ return true;
+}
+
//================================================================================
/*!
* \brief Finds entries in a sting
myString.Insert( i, "#" );
for ( int iPart = 1; iPart <= myBegPos.Length(); ++iPart )
{
- int begPos = GetBegPos( iPart + 1 );
- if ( begPos != UNKNOWN )
- SetBegPos( iPart + 1, begPos + 1 );
+ int begPos = GetBegPos( iPart );
+ if ( begPos != UNKNOWN && begPos != EMPTY )
+ SetBegPos( iPart, begPos + 1 );
}
}
}
// check that theObjectID is not just a part of a longer ID
int afterEnd = beg + theObjectID.Length();
Standard_Character c = myString.Value( afterEnd );
- if ( !isalnum( c ) && c != ':' ) {
+ if ( !IsIDChar( c ))
+ {
// check if accessor method already present
if ( c != '.' ||
myString.Location( (char*) theAcsMethod, afterEnd, Length() ) != afterEnd+1) {
added = true;
}
}
- beg = afterEnd; // is a part - next search
+ beg = afterEnd; // is a part -> next search
}
return added;
}
//================================================================================
/*!
- * \brief SelfEraser erases creation command if no more it's commands invoked
+ * \brief SelfEraser erases creation command if none of it's commands invoked
+ * (e.g. filterManager) or it's not used as a command argument (e.g. a filter)
*/
//================================================================================
-void _pySelfEraser::Flush()
+_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 none of it's commands invoked
+ * (e.g. filterManager) or it's not used as a command argument (e.g. a filter)
+ */
+//================================================================================
+
+bool _pySelfEraser::CanClear()
{
- int nbCalls = GetNbCalls();
- if ( nbCalls > 0 )
+ bool toErase = false;
+ if ( myIgnoreOwnCalls ) // check if this obj is used as argument
{
- // ignore cleared commands
+ int nbArgUses = 0;
+ list< Handle(_pyCommand) >::iterator cmd = myArgCmds.begin();
+ for ( ; cmd != myArgCmds.end(); ++cmd )
+ nbArgUses += IsAliveCmd( *cmd );
+
+ toErase = ( nbArgUses < 1 );
+ }
+ else
+ {
+ int nbCalls = 0;
std::list< Handle(_pyCommand) >& cmds = GetProcessedCmds();
- std::list< Handle(_pyCommand) >::const_iterator cmd = cmds.begin();
- for ( ; cmd != cmds.end(); ++cmd )
- nbCalls -= (*cmd)->IsEmpty();
+ std::list< Handle(_pyCommand) >::iterator cmd = cmds.begin();
+ for ( ; cmd != cmds.end(); )
+ // check of cmd emptiness is not enough as object can change
+ if (( *cmd )->GetString().Search( GetID() ) > 0 )
+ ++nbCalls, ++cmd;
+ else
+ cmd = cmds.erase( cmd ); // save the cmd from clearing
+
+ toErase = ( nbCalls < 1 );
+ }
+ return toErase;
+}
+
+//================================================================================
+/*!
+ * \brief Check if a command is or can be cleared
+ */
+//================================================================================
+
+bool _pySelfEraser::IsAliveCmd( const Handle(_pyCommand)& theCmd )
+{
+ if ( theCmd->IsEmpty() )
+ return false;
+
+ if ( !theGen->IsToKeepAllCommands() )
+ {
+ const _pyID& objID = theCmd->GetObject();
+ Handle( _pyObject ) obj = theGen->FindObject( objID );
+ if ( !obj.IsNull() )
+ return !obj->CanClear();
+ }
+ return true;
+}
+
+//================================================================================
+/*!
+ * \brief SelfEraser erases creation command if none of it's commands invoked
+ * (e.g. filterManager) or it's not used as a command argument (e.g. a filter)
+ */
+//================================================================================
+
+void _pySelfEraser::Flush()
+{
+ if ( CanClear() )
+ {
+ myIsPublished = false;
+ _pyObject::ClearCommands();
}
- if ( nbCalls < 1 )
- GetCreationCmd()->Clear();
}
//================================================================================
*/
//================================================================================
-_pySubMesh::_pySubMesh(const Handle(_pyCommand)& theCreationCmd):
+_pySubMesh::_pySubMesh(const Handle(_pyCommand)& theCreationCmd, bool toKeepAgrCmds):
_pyObject(theCreationCmd)
{
myMesh = ObjectToMesh( theGen->FindObject( theCreationCmd->GetObject() ));
+ if ( toKeepAgrCmds )
+ 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 );
}
//================================================================================
//================================================================================
_pyGroup::_pyGroup(const Handle(_pyCommand)& theCreationCmd, const _pyID & id)
- :_pySubMesh(theCreationCmd)
+ :_pySubMesh(theCreationCmd, /*toKeepAgrCmds=*/false)
{
if ( !id.IsEmpty() )
setID( id );
{
if ( !filter->GetNewID().IsEmpty() )
theCreationCmd->SetArg( 3, filter->GetNewID() );
- filter->AddUser( this );
+ //filter->AddUser( this );
}
myFilter = filter;
}
if ( IsInStudy() )
return false;
- if ( !myCanClearCreationCmd && myCreationCmd->GetMethod() == "GetGroups" )
+ if ( !myCanClearCreationCmd &&
+ !myCreationCmd.IsNull() &&
+ myCreationCmd->GetMethod() == "GetGroups" )
{
TCollection_AsciiString grIDs = myCreationCmd->GetResultValue();
list< _pyID > idList = myCreationCmd->GetStudyEntries( grIDs );
makeGroupCmd->SetMethod( "MakeGroupByFilter" );
makeGroupCmd->SetArg( 1, name );
makeGroupCmd->SetArg( 2, idSource );
+ filter->AddArgCmd( makeGroupCmd );
}
}
else if ( theCommand->GetMethod() == "SetFilter" )
}
}
- if ( !filter.IsNull() )
- filter->AddUser( this );
+ // if ( !filter.IsNull() )
+ // filter->AddUser( this );
theGen->AddMeshAccessorMethod( theCommand );
}
void _pyGroup::Flush()
{
if ( !theGen->IsToKeepAllCommands() &&
- myCreationCmd && !myCanClearCreationCmd )
+ !myCreationCmd.IsNull() && !myCanClearCreationCmd )
{
myCreationCmd.Nullify(); // this way myCreationCmd won't be cleared
}
_pyFilter::_pyFilter(const Handle(_pyCommand)& theCreationCmd, const _pyID& newID/*=""*/)
:_pyObject(theCreationCmd), myNewID( newID )
{
+ //myIsPublished = true; // prevent clearing as a not published
+ theGen->KeepAgrCmds( GetID() ); // ask to fill myArgCmds
}
//================================================================================
theCommand->SetObject( SMESH_2smeshpy::GenName() );
theCommand->SetMethod( "GetFilterFromCriteria" );
- // Clear aFilterManager.CreateFilter()
+ // Swap "aFilterManager.CreateFilter()" and "smesh.GetFilterFromCriteria(criteria)"
GetCreationCmd()->Clear();
+ GetCreationCmd()->GetString() = theCommand->GetString();
+ theCommand->Clear();
+ theCommand->AddDependantCmd( GetCreationCmd() );
+ // why swap? -- it's needed
+ //GetCreationCmd()->Clear();
}
else if ( theCommand->GetMethod() == "SetMesh" )
{
//================================================================================
/*!
- * \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;
-
- 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 ( !myIsPublished );
}
//================================================================================
}
return resHyp;
}
+
+//================================================================================
+/*!
+ * \brief Adds an object ID to some family of IDs with a common prefix
+ * \param [in] str - the object ID
+ * \return bool - \c false if \a str does not have the same prefix as \a this family
+ * (for internal usage)
+ */
+//================================================================================
+
+bool _pyStringFamily::Add( const char* str )
+{
+ if ( strncmp( str, _prefix.ToCString(), _prefix.Length() ) != 0 )
+ return false; // expected prefix is missing
+
+ str += _prefix.Length(); // skip _prefix
+
+ // try to add to some of child falimies
+ std::list< _pyStringFamily >::iterator itSub = _subFams.begin();
+ for ( ; itSub != _subFams.end(); ++itSub )
+ if ( itSub->Add( str ))
+ return true;
+
+ // no suitable family found - add str to _strings or create a new child family
+
+ // look for a proper place within sorted _strings
+ std::list< _AString >::iterator itStr = _strings.begin();
+ while ( itStr != _strings.end() && itStr->IsLess( str ))
+ ++itStr;
+ if ( itStr != _strings.end() && itStr->IsEqual( str ))
+ return true; // same ID already kept
+
+ const int minPrefixSize = 4;
+
+ // count "smaller" strings with the same prefix
+ std::list< _AString >::iterator itLess = itStr; --itLess;
+ int nbLess = 0;
+ for ( ; itLess != _strings.end(); --itLess )
+ if ( strncmp( str, itLess->ToCString(), minPrefixSize ) == 0 )
+ ++nbLess;
+ else
+ break;
+ ++itLess;
+ // count "greater" strings with the same prefix
+ std::list< _AString >::iterator itMore = itStr;
+ int nbMore = 0;
+ for ( ; itMore != _strings.end(); ++itMore )
+ if ( strncmp( str, itMore->ToCString(), minPrefixSize ) == 0 )
+ ++nbMore;
+ else
+ break;
+ --itMore;
+ if ( nbLess + nbMore > 1 ) // ------- ADD a NEW CHILD FAMILY -------------
+ {
+ // look for a maximal prefix length
+ // int lessPrefSize = 3, morePrefSize = 3;
+ // if ( nbLess > 0 )
+ // while( itLess->ToCString()[ lessPrefSize ] == str[ lessPrefSize ] )
+ // ++lessPrefSize;
+ // if ( nbMore > 0 )
+ // while ( itMore->ToCString()[ morePrefSize ] == str[ morePrefSize ] )
+ // ++morePrefSize;
+ // int prefixSize = 3;
+ // if ( nbLess == 0 )
+ // prefixSize = morePrefSize;
+ // else if ( nbMore == 0 )
+ // prefixSize = lessPrefSize;
+ // else
+ // prefixSize = Min( lessPrefSize, morePrefSize );
+ int prefixSize = minPrefixSize;
+ _AString newPrefix ( str, prefixSize );
+
+ // look for a proper place within _subFams sorted by _prefix
+ for ( itSub = _subFams.begin(); itSub != _subFams.end(); ++itSub )
+ if ( !itSub->_prefix.IsLess( newPrefix ))
+ break;
+
+ // add the new _pyStringFamily
+ itSub = _subFams.insert( itSub, _pyStringFamily());
+ _pyStringFamily& newSubFam = *itSub;
+ newSubFam._prefix = newPrefix;
+
+ // pass this->_strings to newSubFam._strings
+ for ( itStr = itLess; nbLess > 0; --nbLess, ++itStr )
+ newSubFam._strings.push_back( itStr->ToCString() + prefixSize );
+ newSubFam._strings.push_back( str + prefixSize );
+ for ( ; nbMore > 0; --nbMore, ++itStr )
+ newSubFam._strings.push_back( itStr->ToCString() + prefixSize );
+
+ _strings.erase( itLess, ++itMore );
+ }
+ else // to few string to make a family fot them
+ {
+ _strings.insert( itStr, str );
+ }
+ return true;
+}
+
+//================================================================================
+/*!
+ * \brief Finds an object ID in the command
+ * \param [in] longStr - the command string
+ * \param [out] subStr - the found object ID
+ * \return bool - \c true if the object ID found
+ */
+//================================================================================
+
+bool _pyStringFamily::IsInArgs( Handle( _pyCommand)& cmd, std::list<_AString>& subStr )
+{
+ const _AString& longStr = cmd->GetString();
+ const char* s = longStr.ToCString();
+
+ // look in _subFams
+ std::list< _pyStringFamily >::iterator itSub = _subFams.begin();
+ int nbFound = 0, pos, len, from, argBeg = cmd->GetArgBeginning();
+ if ( argBeg < 4 || argBeg > longStr.Length() )
+ return false;
+ for ( ; itSub != _subFams.end(); ++itSub )
+ {
+ from = argBeg;
+ while (( pos = longStr.Location( itSub->_prefix, from, longStr.Length() )))
+ if (( len = itSub->isIn( s + pos-1 + itSub->_prefix.Length() )) >= 0 )
+ {
+ subStr.push_back( _AString( s + pos-1, len + itSub->_prefix.Length() ));
+ from = pos + len + itSub->_prefix.Length();
+ nbFound++;
+ }
+ else
+ {
+ from += itSub->_prefix.Length();
+ }
+ }
+ // look among _strings
+ std::list< _AString >::iterator itStr = _strings.begin();
+ for ( ; itStr != _strings.end(); ++itStr )
+ if (( pos = longStr.Location( *itStr, argBeg, longStr.Length() )))
+ // check that object ID does not continue after len
+ if ( !cmd->IsIDChar( s[ pos + itStr->Length() - 1 ] ))
+ {
+ subStr.push_back( *itStr );
+ nbFound++;
+ }
+ return nbFound;
+}
+
+//================================================================================
+/*!
+ * \brief Return remainder length of the object ID after my _prefix
+ * \param [in] str - remainder of the command after my _prefix
+ * \return int - length of the object ID or -1 if not found
+ */
+//================================================================================
+
+int _pyStringFamily::isIn( const char* str )
+{
+ std::list< _pyStringFamily >::iterator itSub = _subFams.begin();
+ int len = -1;
+ for ( ; itSub != _subFams.end(); ++itSub )
+ {
+ int cmp = strncmp( str, itSub->_prefix.ToCString(), itSub->_prefix.Length() );
+ if ( cmp == 0 )
+ {
+ if (( len = itSub->isIn( str + itSub->_prefix.Length() )) >= 0 )
+ return itSub->_prefix.Length() + len;
+ }
+ else if ( cmp > 0 )
+ break;
+ }
+ if ( !_strings.empty() )
+ {
+ std::list< _AString >::iterator itStr = _strings.begin();
+ bool firstEmpty = itStr->IsEmpty();
+ if ( firstEmpty )
+ ++itStr, len = 0;
+ for ( ; itStr != _strings.end(); ++itStr )
+ {
+ int cmp = strncmp( str, itStr->ToCString(), itStr->Length() );
+ if ( cmp == 0 )
+ {
+ len = itStr->Length();
+ break;
+ }
+ else if ( cmp < 0 )
+ {
+ break;
+ }
+ }
+
+ // check that object ID does not continue after len
+ if ( len >= 0 && _pyCommand::IsIDChar( str[len] ))
+ len = -1;
+ }
+
+ return len;
+}
+
+//================================================================================
+/*!
+ * \brief DEBUG
+ */
+//================================================================================
+
+void _pyStringFamily::Print( int level )
+{
+ cout << string( level, ' ' ) << "prefix = '" << _prefix << "' : ";
+ std::list< _AString >::iterator itStr = _strings.begin();
+ for ( ; itStr != _strings.end(); ++itStr )
+ cout << *itStr << " | ";
+ cout << endl;
+ std::list< _pyStringFamily >::iterator itSub = _subFams.begin();
+ for ( ; itSub != _subFams.end(); ++itSub )
+ itSub->Print( level + 1 );
+ if ( level == 0 )
+ cout << string( 70, '-' ) << endl;
+}
+