-// SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses
+// Copyright (C) 2007-2008 CEA/DEN, EDF R&D, OPEN CASCADE
//
-// Copyright (C) 2003 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.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+// 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.
//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+//
+// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
+// SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses
//
-// File : SMESH_2D_Algo_i.hxx
-// Author : Paul RASCLE, EDF
-// Module : SMESH
-// $Header$
-
// File : SMESH_2smeshpy.cxx
// Created : Fri Nov 18 13:20:10 2005
// Author : Edward AGAPOV (eap)
-
+//
#include "SMESH_2smeshpy.hxx"
#include "utilities.h"
#include "SMESH_PythonDump.hxx"
+#include "SMESH_NoteBook.hxx"
#include "Resource_DataMapOfAsciiStringAsciiString.hxx"
#include "SMESH_Gen_i.hxx"
IMPLEMENT_STANDARD_HANDLE (_pyCommand ,Standard_Transient);
IMPLEMENT_STANDARD_HANDLE (_pyGen ,_pyObject);
IMPLEMENT_STANDARD_HANDLE (_pyMesh ,_pyObject);
+IMPLEMENT_STANDARD_HANDLE (_pySubMesh ,_pyObject);
IMPLEMENT_STANDARD_HANDLE (_pyMeshEditor ,_pyObject);
IMPLEMENT_STANDARD_HANDLE (_pyHypothesis ,_pyObject);
+IMPLEMENT_STANDARD_HANDLE (_pySelfEraser ,_pyObject);
IMPLEMENT_STANDARD_HANDLE (_pyAlgorithm ,_pyHypothesis);
IMPLEMENT_STANDARD_HANDLE (_pyComplexParamHypo,_pyHypothesis);
IMPLEMENT_STANDARD_HANDLE (_pyNumberOfSegmentsHyp,_pyHypothesis);
IMPLEMENT_STANDARD_RTTIEXT(_pyCommand ,Standard_Transient);
IMPLEMENT_STANDARD_RTTIEXT(_pyGen ,_pyObject);
IMPLEMENT_STANDARD_RTTIEXT(_pyMesh ,_pyObject);
+IMPLEMENT_STANDARD_RTTIEXT(_pySubMesh ,_pyObject);
IMPLEMENT_STANDARD_RTTIEXT(_pyMeshEditor ,_pyObject);
IMPLEMENT_STANDARD_RTTIEXT(_pyHypothesis ,_pyObject);
+IMPLEMENT_STANDARD_RTTIEXT(_pySelfEraser ,_pyObject);
IMPLEMENT_STANDARD_RTTIEXT(_pyAlgorithm ,_pyHypothesis);
IMPLEMENT_STANDARD_RTTIEXT(_pyComplexParamHypo,_pyHypothesis);
IMPLEMENT_STANDARD_RTTIEXT(_pyNumberOfSegmentsHyp,_pyHypothesis);
TCollection_AsciiString
SMESH_2smeshpy::ConvertScript(const TCollection_AsciiString& theScript,
- Resource_DataMapOfAsciiStringAsciiString& theEntry2AccessorMethod)
+ Resource_DataMapOfAsciiStringAsciiString& theEntry2AccessorMethod,
+ Resource_DataMapOfAsciiStringAsciiString& theObjectNames)
{
- theGen = new _pyGen( theEntry2AccessorMethod );
+ theGen = new _pyGen( theEntry2AccessorMethod, theObjectNames );
// split theScript into separate commands
+
+ SMESH_NoteBook * aNoteBook = new SMESH_NoteBook();
+
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();
+
+ TCollection_AsciiString aNoteScript = aNoteBook->GetResultScript();
+ delete aNoteBook;
+ aNoteBook = 0;
+
+ // 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( theScript.SubString( from, to - 1 ));
+ theGen->AddCommand( aNoteScript.SubString( from, to - 1 ));
from = to + 1;
}
+
// finish conversion
theGen->Flush();
#ifdef DUMP_CONVERSION
- cout << endl << " ######## RESULT ######## " << endl<< endl;
+ MESSAGE_BEGIN ( std::endl << " ######## RESULT ######## " << std::endl<< std::endl );
#endif
+
// reorder commands after conversion
list< Handle(_pyCommand) >::iterator cmd;
bool orderChanges;
for ( cmd = theGen->GetCommands().begin(); cmd != theGen->GetCommands().end(); ++cmd )
{
#ifdef DUMP_CONVERSION
- cout << "## COM " << (*cmd)->GetOrderNb() << ": "<< (*cmd)->GetString() << endl;
+ MESSAGE_ADD ( "## COM " << (*cmd)->GetOrderNb() << ": "<< (*cmd)->GetString() << std::endl );
#endif
if ( !(*cmd)->IsEmpty() ) {
aScript += "\n";
*/
//================================================================================
-_pyGen::_pyGen(Resource_DataMapOfAsciiStringAsciiString& theEntry2AccessorMethod)
+_pyGen::_pyGen(Resource_DataMapOfAsciiStringAsciiString& theEntry2AccessorMethod,
+ Resource_DataMapOfAsciiStringAsciiString& theObjectNames)
: _pyObject( new _pyCommand( TPythonDump::SMESHGenName(), 0 )),
- myID2AccessorMethod( theEntry2AccessorMethod )
+ myID2AccessorMethod( theEntry2AccessorMethod ),
+ myObjectNames( theObjectNames )
{
myNbCommands = 0;
- myHasPattern = false;
// make that GetID() to return TPythonDump::SMESHGenName()
GetCreationCmd()->GetString() += "=";
}
Handle(_pyCommand) aCommand = myCommands.back();
#ifdef DUMP_CONVERSION
- cout << "## COM " << myNbCommands << ": "<< aCommand->GetString() << endl;
+ MESSAGE ( "## COM " << myNbCommands << ": "<< aCommand->GetString() );
#endif
_pyID objID = aCommand->GetObject();
return aCommand;
// SMESH_Gen method?
- if ( objID == this->GetID() ) {
+ if ( objID == this->GetID() || objID == SMESH_2smeshpy::GenName()) {
this->Process( aCommand );
return aCommand;
}
+
// SMESH_Mesh method?
map< _pyID, Handle(_pyMesh) >::iterator id_mesh = myMeshes.find( objID );
if ( id_mesh != myMeshes.end() ) {
+ // check for mesh editor object
if ( aCommand->GetMethod() == "GetMeshEditor" ) { // MeshEditor creation
_pyID editorID = aCommand->GetResultValue();
Handle(_pyMeshEditor) editor = new _pyMeshEditor( aCommand );
myMeshEditors.insert( make_pair( editorID, editor ));
return aCommand;
+ }
+ // check for SubMesh objects
+ else if ( aCommand->GetMethod() == "GetSubMesh" ) { // SubMesh creation
+ _pyID subMeshID = aCommand->GetResultValue();
+ Handle(_pySubMesh) subMesh = new _pySubMesh( aCommand );
+ myObjects.insert( make_pair( subMeshID, subMesh ));
}
id_mesh->second->Process( aCommand );
return aCommand;
}
+
// SMESH_MeshEditor method?
map< _pyID, Handle(_pyMeshEditor) >::iterator id_editor = myMeshEditors.find( objID );
if ( id_editor != myMeshEditors.end() ) {
id_editor->second->Process( aCommand );
+ TCollection_AsciiString processedCommand = aCommand->GetString();
+ // some commands of SMESH_MeshEditor create meshes
+ if ( aCommand->GetMethod().Search("MakeMesh") != -1 ) {
+ Handle(_pyMesh) mesh = new _pyMesh( aCommand, aCommand->GetResultValue() );
+ aCommand->GetString() = processedCommand; // discard changes made by _pyMesh
+ myMeshes.insert( make_pair( mesh->GetID(), mesh ));
+ }
return aCommand;
}
// SMESH_Hypothesis method?
return aCommand;
}
+ // other object method?
+ map< _pyID, Handle(_pyObject) >::iterator id_obj = myObjects.find( objID );
+ if ( id_obj != myObjects.end() ) {
+ id_obj->second->Process( aCommand );
+ return aCommand;
+ }
+// if ( theCommand.Search( "aFilterManager" ) != -1 ) {
+// if ( theCommand.Search( "CreateFilterManager" ) != -1 )
+// myFilterManager = new _pySelfEraser( aCommand );
+// else if ( !myFilterManager.IsNull() )
+// myFilterManager->Process( aCommand );
+// return aCommand;
+// }
+
// Add access to a wrapped mesh
AddMeshAccessorMethod( aCommand );
// CreateHypothesis( theHypType, theLibName )
// Compute( mesh, geom )
// mesh creation
- if ( theCommand->GetMethod() == "CreateMesh" ||
- theCommand->GetMethod() == "CreateEmptyMesh" ||
- theCommand->GetMethod() == "CreateMeshesFromUNV" ||
- theCommand->GetMethod() == "CreateMeshesFromSTL")
+ TCollection_AsciiString method = theCommand->GetMethod();
+
+ if ( method == "CreateMesh" || method == "CreateEmptyMesh")
{
Handle(_pyMesh) mesh = new _pyMesh( theCommand );
myMeshes.insert( make_pair( mesh->GetID(), mesh ));
return;
}
-
- if(theCommand->GetMethod() == "CreateMeshesFromMED")
+ if ( method == "CreateMeshesFromUNV" || method == "CreateMeshesFromSTL")
+ {
+ Handle(_pyMesh) mesh = new _pyMesh( theCommand, theCommand->GetResultValue() );
+ myMeshes.insert( make_pair( mesh->GetID(), mesh ));
+ return;
+ }
+ if( method == "CreateMeshesFromMED")
{
for(int ind = 0;ind<theCommand->GetNbResultValues();ind++)
{
}
// CreateHypothesis()
- if ( theCommand->GetMethod() == "CreateHypothesis" )
+ if ( method == "CreateHypothesis" )
{
+ // issue 199929, remove standard library name (default parameter)
+ const TCollection_AsciiString & aLibName = theCommand->GetArg( 2 );
+ if ( aLibName.Search( "StdMeshersEngine" ) != -1 ) {
+ // keep first argument
+ TCollection_AsciiString arg = theCommand->GetArg( 1 );
+ theCommand->RemoveArgs();
+ theCommand->SetArg( 1, arg );
+ }
+
myHypos.push_back( _pyHypothesis::NewHypothesis( theCommand ));
return;
}
// smeshgen.Compute( mesh, geom ) --> mesh.Compute()
- if ( theCommand->GetMethod() == "Compute" )
+ if ( method == "Compute" )
{
const _pyID& meshID = theCommand->GetArg( 1 );
map< _pyID, Handle(_pyMesh) >::iterator id_mesh = myMeshes.find( meshID );
}
}
- // leave only one smeshgen.GetPattern() in the script
- if ( theCommand->GetMethod() == "GetPattern" ) {
- if ( myHasPattern ) {
- theCommand->Clear();
- return;
- }
- myHasPattern = true;
+ // objects erasing creation command if no more it's commands invoked:
+ // SMESH_Pattern, FilterManager
+ if ( method == "GetPattern" || method == "CreateFilterManager" ) {
+ Handle(_pyObject) obj = new _pySelfEraser( theCommand );
+ if ( !myObjects.insert( make_pair( obj->GetID(), obj )).second )
+ theCommand->Clear(); // already created
}
// Concatenate( [mesh1, ...], ... )
- if ( theCommand->GetMethod() == "Concatenate" ||
- theCommand->GetMethod() == "ConcatenateWithGroups")
+ if ( method == "Concatenate" || method == "ConcatenateWithGroups")
{
+ if ( method == "ConcatenateWithGroups" ) {
+ theCommand->SetMethod( "Concatenate" );
+ theCommand->SetArg( theCommand->GetNbArgs() + 1, "True" );
+ }
+ Handle(_pyMesh) mesh = new _pyMesh( theCommand, theCommand->GetResultValue() );
+ myMeshes.insert( make_pair( mesh->GetID(), mesh ));
AddMeshAccessorMethod( theCommand );
}
void _pyGen::Flush()
{
+ // create empty command
+ myLastCommand = new _pyCommand();
+
map< _pyID, Handle(_pyMesh) >::iterator id_mesh = myMeshes.begin();
for ( ; id_mesh != myMeshes.end(); ++id_mesh )
if ( ! id_mesh->second.IsNull() )
if ( !(*hyp)->IsWrapped() )
(*hyp)->GetCreationCmd()->SetObject( SMESH_2smeshpy::GenName() );
}
+
+ map< _pyID, Handle(_pyObject) >::iterator id_obj = myObjects.begin();
+ for ( ; id_obj != myObjects.end(); ++id_obj )
+ if ( ! id_obj->second.IsNull() )
+ id_obj->second->Flush();
+
+ myLastCommand->SetOrderNb( ++myNbCommands );
+ myCommands.push_back( myLastCommand );
}
//================================================================================
if ( !hyp->IsNull() &&
(*hyp)->IsAlgo() &&
theHypothesis->CanBeCreatedBy( (*hyp)->GetAlgoType() ) &&
- (*hyp)->GetGeom() == theGeom &&
+ (*hyp)->GetGeom() == theGeom &&
(*hyp)->GetMesh() == theMesh )
return *hyp;
return 0;
}
+//================================================================================
+/*!
+ * \brief Find subMesh by ID (entry)
+ * \param theSubMeshID - The subMesh ID
+ * \retval Handle(_pySubMesh) - The found subMesh
+ */
+//================================================================================
+
+Handle(_pySubMesh) _pyGen::FindSubMesh( const _pyID& theSubMeshID )
+{
+ map< _pyID, Handle(_pyObject) >::iterator id_subMesh = myObjects.find(theSubMeshID);
+ if ( id_subMesh != myObjects.end() )
+ return Handle(_pySubMesh)::DownCast( id_subMesh->second );
+ return Handle(_pySubMesh)();
+}
+
+
//================================================================================
/*!
* \brief Change order of commands in the script
void _pyGen::SetCommandAfter( Handle(_pyCommand) theCmd, Handle(_pyCommand) theAfterCmd )
{
-#ifdef _DEBUG_
-//cout << "SET\t" << theAfterCmd->GetString() << endl << "BEFORE\t" << theCmd->GetString() << endl<<endl;
-#endif
+ setNeighbourCommand( theCmd, theAfterCmd, true );
+}
+
+//================================================================================
+/*!
+ * \brief Set one command before the other
+ * \param theCmd - Command to move
+ * \param theBeforeCmd - Command before which to insert the first one
+ */
+//================================================================================
+
+void _pyGen::SetCommandBefore( Handle(_pyCommand) theCmd, Handle(_pyCommand) theBeforeCmd )
+{
+ setNeighbourCommand( theCmd, theBeforeCmd, false );
+}
+
+//================================================================================
+/*!
+ * \brief Set one command before or after the other
+ * \param theCmd - Command to move
+ * \param theOtherCmd - Command ater or before which to insert the first one
+ */
+//================================================================================
+
+void _pyGen::setNeighbourCommand( Handle(_pyCommand)& theCmd,
+ Handle(_pyCommand)& theOtherCmd,
+ const bool theIsAfter )
+{
list< Handle(_pyCommand) >::iterator pos;
pos = find( myCommands.begin(), myCommands.end(), theCmd );
myCommands.erase( pos );
- pos = find( myCommands.begin(), myCommands.end(), theAfterCmd );
- myCommands.insert( ++pos, theCmd );
+ pos = find( myCommands.begin(), myCommands.end(), theOtherCmd );
+ myCommands.insert( (theIsAfter ? ++pos : pos), theCmd );
int i = 1;
for ( pos = myCommands.begin(); pos != myCommands.end(); ++pos)
(*pos)->SetOrderNb( i++ );
}
+//================================================================================
+/*!
+ * \brief Set command be last in list of commands
+ * \param theCmd - Command to be last
+ */
+//================================================================================
+
+Handle(_pyCommand)& _pyGen::GetLastCommand()
+{
+ return myLastCommand;
+}
+
//================================================================================
/*!
* \brief Set method to access to object wrapped with python class
myID2AccessorMethod.Bind( theID, (char*) theMethod );
}
+//================================================================================
+/*!
+ * \brief Generated new ID for object and assign with existing name
+ * \param theID - ID of existing object
+ */
+//================================================================================
+
+_pyID _pyGen::GenerateNewID( const _pyID& theID )
+{
+ int index = 1;
+ _pyID aNewID;
+ do {
+ aNewID = theID + _pyID( ":" ) + _pyID( index++ );
+ }
+ while ( myObjectNames.IsBound( aNewID ) );
+
+ myObjectNames.Bind( aNewID, myObjectNames.IsBound( theID )
+ ? (myObjectNames.Find( theID ) + _pyID( "_" ) + _pyID( index-1 ))
+ : _pyID( "A" ) + aNewID );
+ return aNewID;
+}
+
//================================================================================
/*!
* \brief Find out type of geom group
*/
//================================================================================
-_pyMesh::_pyMesh(const Handle(_pyCommand) theCreationCmd):
- _pyObject(theCreationCmd), myHasEditor(false)
+_pyMesh::_pyMesh(const Handle(_pyCommand) theCreationCmd)
+ : _pyObject(theCreationCmd), myHasEditor(false)
{
// convert my creation command
Handle(_pyCommand) creationCmd = GetCreationCmd();
- TCollection_AsciiString str = creationCmd->GetMethod();
-
+ //TCollection_AsciiString str = creationCmd->GetMethod();
+// if(str != "CreateMeshesFromUNV" &&
+// str != "CreateMeshesFromMED" &&
+// str != "CreateMeshesFromSTL")
creationCmd->SetObject( SMESH_2smeshpy::SmeshpyName() );
- if(str != "CreateMeshesFromUNV" &&
- str != "CreateMeshesFromMED" &&
- str != "CreateMeshesFromSTL")
- creationCmd->SetMethod( "Mesh" );
+ creationCmd->SetMethod( "Mesh" );
theGen->SetAccessorMethod( GetID(), "GetMesh()" );
}
const TCollection_AsciiString method = theCommand->GetMethod();
// ----------------------------------------------------------------------
if ( method == "GetSubMesh" ) {
- mySubmeshes.push_back( theCommand );
+ Handle(_pySubMesh) subMesh = theGen->FindSubMesh( theCommand->GetResultValue() );
+ if ( !subMesh.IsNull() ) {
+ subMesh->SetCreator( this );
+ mySubmeshes.push_back( subMesh );
+ }
}
// ----------------------------------------------------------------------
else if ( method == "AddHypothesis" ) { // mesh.AddHypothesis(geom, HYPO )
theCommand->SetArg( 1, grp );
}
else {
- AddMeshAccess( theCommand );
+ _pyID type = theCommand->GetArg( 1 );
+ _pyID name = theCommand->GetArg( 2 );
+ theCommand->SetMethod( "GroupOnGeom" );
+ theCommand->RemoveArgs();
+ theCommand->SetArg( 1, grp );
+ theCommand->SetArg( 2, name );
+ theCommand->SetArg( 3, type );
}
}
// ----------------------------------------------------------------------
"GetNodeInverseElements","GetShapeID","GetShapeIDForElem","GetElemNbNodes",
"GetElemNode","IsMediumNode","IsMediumNodeOfAnyElem","ElemNbEdges","ElemNbFaces",
"IsPoly","IsQuadratic","BaryCenter","GetHypothesisList", "SetAutoColor", "GetAutoColor",
- "" }; // <- mark of end
+ "Clear", "ConvertToStandalone"
+ ,"" }; // <- mark of end
sameMethods.Insert( names );
}
void _pyMesh::Flush()
{
- list < Handle(_pyCommand) >::iterator cmd, cmd2;
+ list < Handle(_pyCommand) >::iterator cmd;
// try to convert algo addition like this:
// mesh.AddHypothesis(geom, ALGO ) --> ALGO = mesh.Algo()
for ( cmd = myAddHypCmds.begin(); cmd != myAddHypCmds.end(); ++cmd )
{
Handle(_pyCommand) addCmd = *cmd;
+
_pyID algoID = addCmd->GetArg( 2 );
Handle(_pyHypothesis) algo = theGen->FindHyp( algoID );
if ( algo.IsNull() || !algo->IsAlgo() )
continue;
- // try to convert
+
+ // check and create new algorithm instance if it is already wrapped
+ if ( algo->IsWrapped() ) {
+ _pyID localAlgoID = theGen->GenerateNewID( algoID );
+ TCollection_AsciiString aNewCmdStr = localAlgoID +
+ TCollection_AsciiString( " = " ) + theGen->GetID() +
+ TCollection_AsciiString( ".CreateHypothesis( \"" ) + algo->GetAlgoType() +
+ TCollection_AsciiString( "\" )" );
+
+ Handle(_pyCommand) newCmd = theGen->AddCommand( aNewCmdStr );
+ Handle(_pyAlgorithm) newAlgo = Handle(_pyAlgorithm)::DownCast(theGen->FindHyp( localAlgoID ));
+ if ( !newAlgo.IsNull() ) {
+ newAlgo->Assign( algo, this->GetID() );
+ newAlgo->SetCreationCmd( newCmd );
+ algo = newAlgo;
+ // set algorithm creation
+ theGen->SetCommandBefore( newCmd, addCmd );
+ }
+ else
+ newCmd->Clear();
+ }
_pyID geom = addCmd->GetArg( 1 );
bool isLocalAlgo = ( geom != GetGeom() );
+
+ // try to convert
if ( algo->Addition2Creation( addCmd, this->GetID() )) // OK
{
// wrapped algo is created atfer mesh creation
addCmd->SetArg( addCmd->GetNbArgs() + 1,
TCollection_AsciiString( "geom=" ) + geom );
// sm = mesh.GetSubMesh(geom, name) --> sm = ALGO.GetSubMesh()
- for ( cmd2 = mySubmeshes.begin(); cmd2 != mySubmeshes.end(); ++cmd2 ) {
- Handle(_pyCommand) subCmd = *cmd2;
+ list < Handle(_pySubMesh) >::iterator smIt;
+ for ( smIt = mySubmeshes.begin(); smIt != mySubmeshes.end(); ++smIt ) {
+ Handle(_pySubMesh) subMesh = *smIt;
+ Handle(_pyCommand) subCmd = subMesh->GetCreationCmd();
if ( geom == subCmd->GetArg( 1 )) {
subCmd->SetObject( algo->GetID() );
subCmd->RemoveArgs();
- addCmd->AddDependantCmd( subCmd );
+ subMesh->SetCreator( algo );
}
}
}
if ( sameMethods.empty() ) {
const char * names[] = {
"RemoveElements","RemoveNodes","AddNode","AddEdge","AddFace","AddPolygonalFace",
- "AddVolume","AddPolyhedralVolume","AddPolyhedralVolumeByFaces","MoveNode",
- "InverseDiag","DeleteDiag","Reorient","ReorientObject","SplitQuad","SplitQuadObject",
+ "AddVolume","AddPolyhedralVolume","AddPolyhedralVolumeByFaces","MoveNode", "MoveClosestNodeToPoint",
+ "InverseDiag","DeleteDiag","Reorient","ReorientObject","TriToQuad","SplitQuad","SplitQuadObject",
"BestSplit","Smooth","SmoothObject","SmoothParametric","SmoothParametricObject",
"ConvertToQuadratic","ConvertFromQuadratic","RenumberNodes","RenumberElements",
- "RotationSweep","RotationSweepObject","ExtrusionSweep","AdvancedExtrusion",
- "ExtrusionSweepObject","ExtrusionSweepObject1D","ExtrusionSweepObject2D","Mirror",
- "MirrorObject","Translate","TranslateObject","Rotate","RotateObject",
+ "RotationSweep","RotationSweepObject","RotationSweepObject1D","RotationSweepObject2D",
+ "ExtrusionSweep","AdvancedExtrusion","ExtrusionSweepObject","ExtrusionSweepObject1D","ExtrusionSweepObject2D",
+ "ExtrusionAlongPath","ExtrusionAlongPathObject","ExtrusionAlongPathObject1D","ExtrusionAlongPathObject2D",
+ "Mirror","MirrorObject","Translate","TranslateObject","Rotate","RotateObject",
"FindCoincidentNodes","FindCoincidentNodesOnPart","MergeNodes","FindEqualElements",
"MergeElements","MergeEqualElements","SewFreeBorders","SewConformFreeBorders",
"SewBorderToSide","SewSideElements","ChangeElemNodes","GetLastCreatedNodes",
"GetLastCreatedElems",
"MirrorMakeMesh","MirrorObjectMakeMesh","TranslateMakeMesh",
- "TranslateObjectMakeMesh","RotateMakeMesh","RotateObjectMakeMesh",
- "" }; // <- mark of the end
+ "TranslateObjectMakeMesh","RotateMakeMesh","RotateObjectMakeMesh"
+ ,"" }; // <- mark of the end
sameMethods.Insert( names );
}
- //theGen->AddMeshAccessorMethod( theCommand ); // for *Object()
+
+ // names of SMESH_MeshEditor methods which differ from methods of class Mesh
+ // only last two arguments
+ static TStringSet diffLastTwoArgsMethods;
+ if (diffLastTwoArgsMethods.empty() ){
+ const char * names[] = {
+ "MirrorMakeGroups","MirrorObjectMakeGroups",
+ "TranslateMakeGroups","TranslateObjectMakeGroups",
+ "RotateMakeGroups","RotateObjectMakeGroups",
+ ""};// <- mark of the end
+ diffLastTwoArgsMethods.Insert( names );
+ }
if ( sameMethods.Contains( theCommand->GetMethod() )) {
theCommand->SetObject( myMesh );
// 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 ( theCommand->GetMethod().Search("MakeMesh") != -1 )
+// _pyMesh( new _pyCommand( theCommand->GetString(), 0 )); // for theGen->SetAccessorMethod()
}
else {
- // editor creation command is needed only if any editor function is called
- if ( !myCreationCmdStr.IsEmpty() ) {
- GetCreationCmd()->GetString() = myCreationCmdStr;
- myCreationCmdStr.Clear();
+
+ //Replace SMESH_MeshEditor "MakeGroups" functions on the Mesh
+ //functions with the flag "theMakeGroups = True" like:
+ //SMESH_MeshEditor.CmdMakeGroups => Mesh.Cmd(...,True)
+ int pos = theCommand->GetMethod().Search("MakeGroups");
+ if( pos != -1) {
+ // 1. Remove "MakeGroups" from the Command
+ TCollection_AsciiString aMethod = theCommand->GetMethod();
+ int nbArgsToAdd = diffLastTwoArgsMethods.Contains(aMethod) ? 2 : 1;
+ aMethod.Trunc(pos-1);
+ theCommand->SetMethod(aMethod);
+
+ // 2. Set Mesh object instead of SMESH_MeshEditor
+ theCommand->SetObject( myMesh );
+
+ // 3. And add last "True" argument
+ while(nbArgsToAdd--)
+ theCommand->SetArg(theCommand->GetNbArgs()+1,"True ");
+ }
+ else {
+ // editor creation command is needed only if any editor function is called
+ theGen->AddMeshAccessorMethod( theCommand ); // for *Object()
+ if ( !myCreationCmdStr.IsEmpty() ) {
+ GetCreationCmd()->GetString() = myCreationCmdStr;
+ myCreationCmdStr.Clear();
+ }
}
}
}
// i.e. convertion result will be "locallength = regular1d.LocalLength(<arg of SetLength()>)"
hyp->AddArgMethod( "SetLength" );
}
+ else if ( hypType == "MaxLength" ) {
+ // set algo's method creating hyp, and algo type
+ hyp->SetConvMethodAndType( "MaxSize", "Regular_1D");
+ // set method whose 1 arg will become the 1-st arg of hyp creation command
+ // i.e. convertion result will be "maxsize = regular1d.MaxSize(<arg of SetLength()>)"
+ hyp->AddArgMethod( "SetLength" );
+ }
else if ( hypType == "NumberOfSegments" ) {
hyp = new _pyNumberOfSegmentsHyp( theCreationCmd );
hyp->SetConvMethodAndType( "NumberOfSegments", "Regular_1D");
hyp->SetConvMethodAndType( "QuadranglePreference", "Quadrangle_2D");
hyp->SetConvMethodAndType( "QuadranglePreference", "NETGEN_2D_ONLY");
}
+ else if ( hypType == "TrianglePreference" ) {
+ hyp->SetConvMethodAndType( "TrianglePreference", "Quadrangle_2D");
+ }
+ // BLSURF ----------
+ else if ( hypType == "BLSURF" ) {
+ algo->SetConvMethodAndType( "Triangle", hypType.ToCString());
+ algo->myArgs.Append( "algo=smesh.BLSURF" );
+ }
+ else if ( hypType == "BLSURF_Parameters") {
+ hyp->SetConvMethodAndType( "Parameters", "BLSURF");
+ }
// NETGEN ----------
-// else if ( hypType == "NETGEN_2D") { // 1D-2D
-// algo->SetConvMethodAndType( "Triangle" , hypType.ToCString());
-// algo->myArgs.Append( "algo=smesh.NETGEN" );
-// }
+ else if ( hypType == "NETGEN_2D") { // 1D-2D
+ algo->SetConvMethodAndType( "Triangle" , hypType.ToCString());
+ algo->myArgs.Append( "algo=smesh.NETGEN" );
+ }
+ else if ( hypType == "NETGEN_Parameters_2D") {
+ hyp->SetConvMethodAndType( "Parameters", "NETGEN_2D");
+ }
+ else if ( hypType == "NETGEN_SimpleParameters_2D") {
+ hyp->SetConvMethodAndType( "Parameters", "NETGEN_2D");
+ hyp->myArgs.Append( "which=smesh.SIMPLE" );
+ }
+ else if ( hypType == "NETGEN_2D3D") { // 1D-2D-3D
+ algo->SetConvMethodAndType( "Tetrahedron" , hypType.ToCString());
+ algo->myArgs.Append( "algo=smesh.FULL_NETGEN" );
+ }
+ else if ( hypType == "NETGEN_Parameters") {
+ hyp->SetConvMethodAndType( "Parameters", "NETGEN_2D3D");
+ }
+ else if ( hypType == "NETGEN_SimpleParameters_3D") {
+ hyp->SetConvMethodAndType( "Parameters", "NETGEN_2D3D");
+ hyp->myArgs.Append( "which=smesh.SIMPLE" );
+ }
else if ( hypType == "NETGEN_2D_ONLY") { // 2D
algo->SetConvMethodAndType( "Triangle" , hypType.ToCString());
algo->myArgs.Append( "algo=smesh.NETGEN_2D" );
algo->SetConvMethodAndType( "Tetrahedron", hypType.ToCString());
algo->myArgs.Append( "algo=smesh.GHS3D" );
}
+ else if ( hypType == "GHS3D_Parameters") {
+ hyp->SetConvMethodAndType( "Parameters", "GHS3D_3D");
+ }
// Hexa_3D ---------
- else if ( hypType == "Hexa_3D" ) {
+ else if ( hypType == "BLSURF" ) {
algo->SetConvMethodAndType( "Hexahedron", hypType.ToCString());
}
// Repetitive Projection_1D ---------
algo = theGen->FindAlgo( myGeom, theMesh, this );
if ( algo.IsNull() )
return false;
+ // attach hypothesis creation command to be after algo creation command
+ // because it can be new created instance of algorithm
algo->GetCreationCmd()->AddDependantCmd( theCmd );
}
myIsWrapped = true;
}
// set a new creation command
GetCreationCmd()->Clear();
+ // replace creation command by wrapped instance
+ // please note, that hypothesis attaches to algo creation command (see upper)
SetCreationCmd( theCmd );
+
// clear commands setting arg values
list < Handle(_pyCommand) >::iterator argCmd = myArgCommands.begin();
( *cmd )->Clear();
}
+
+//================================================================================
+/*!
+ * \brief Assign fields of theOther to me except myIsWrapped
+ */
+//================================================================================
+
+void _pyHypothesis::Assign( const Handle(_pyHypothesis)& theOther,
+ const _pyID& theMesh )
+{
+ myIsWrapped = false;
+ myMesh = theMesh;
+
+ // myCreationCmd = theOther->myCreationCmd;
+ myIsAlgo = theOther->myIsAlgo;
+ myGeom = theOther->myGeom;
+ myType2CreationMethod = theOther->myType2CreationMethod;
+ myArgs = theOther->myArgs;
+ myArgMethods = theOther->myArgMethods;
+ myNbArgsByMethod = theOther->myNbArgsByMethod;
+ myArgCommands = theOther->myArgCommands;
+ myUnknownCommands = theOther->myUnknownCommands;
+}
+
//================================================================================
/*!
* \brief Remember hypothesis parameter values
//================================================================================
/*!
* \brief
- * \param theAdditionCmd -
- * \param theMesh -
- * \retval bool -
+ * \param theAdditionCmd - command to be converted
+ * \param theMesh - mesh instance
+ * \retval bool - status
*/
//================================================================================
{
// beginning
int begPos = GetBegPos( RESULT_IND ) + myRes.Length();
- if ( begPos < 1 )
+ if ( begPos < 1 ) {
begPos = myString.Location( "=", 1, Length() ) + 1;
- // store
+ // is '=' in the string argument (for example, name) or not
+ int nb1 = 0; // number of ' character at the left of =
+ int nb2 = 0; // number of " character at the left of =
+ for ( int i = 1; i < begPos-1; i++ ) {
+ if ( myString.Value( i )=='\'' )
+ nb1 += 1;
+ else if ( myString.Value( i )=='"' )
+ nb2 += 1;
+ }
+ // if number of ' or " is not divisible by 2,
+ // then get an object at the start of the command
+ if ( nb1 % 2 != 0 || nb2 % 2 != 0 )
+ 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 ( dotPos > begPos+myObj.Length() )
+ myObj = myString.SubString( begPos, dotPos-1 );
+ }
+ // store
SetBegPos( OBJECT_IND, begPos );
}
//SCRUTE(myObj);
if ( begPos < 1 )
begPos = myString.Location( "(", 1, Length() ) + 1;
- int i = 0, prevLen = 0;
+ int i = 0, prevLen = 0, nbNestings = 0;
while ( begPos != EMPTY ) {
begPos += prevLen;
+ if( myString.Value( begPos ) == '(' )
+ nbNestings++;
// check if we are looking at the closing parenthesis
while ( begPos <= Length() && isspace( myString.Value( begPos )))
++begPos;
- if ( begPos > Length() || myString.Value( begPos ) == ')' )
+ if ( begPos > Length() )
break;
+ if ( myString.Value( begPos ) == ')' ) {
+ nbNestings--;
+ if( nbNestings == 0 )
+ break;
+ }
myArgs.Append( GetWord( myString, begPos, true, true ));
SetBegPos( ARG1_IND + i, begPos );
prevLen = myArgs.Last().Length();
return theEmptyString; // no word found
// end
end = beg + 1;
- while ( end <= theString.Length() && isWord( theString.Value( end ), dotIsWord))
- ++end;
- --end;
+ char begChar = theString.Value( beg );
+ if ( begChar == '"' || begChar == '\'' ) {
+ // end is at the corresponding quoting mark
+ while ( end < theString.Length() &&
+ ( theString.Value( end ) != begChar || theString.Value( end-1 ) == '\\'))
+ ++end;
+ }
+ else {
+ while ( end <= theString.Length() && isWord( theString.Value( end ), dotIsWord))
+ ++end;
+ --end;
+ }
}
else { // search backward
// end
if ( end == 0 )
return theEmptyString; // no word found
beg = end - 1;
- while ( beg > 0 && isWord( theString.Value( beg ), dotIsWord))
- --beg;
- ++beg;
+ char endChar = theString.Value( end );
+ if ( endChar == '"' || endChar == '\'' ) {
+ // beg is at the corresponding quoting mark
+ while ( beg > 1 &&
+ ( theString.Value( beg ) != endChar || theString.Value( beg-1 ) == '\\'))
+ --beg;
+ }
+ else {
+ while ( beg > 0 && isWord( theString.Value( beg ), dotIsWord))
+ --beg;
+ ++beg;
+ }
}
theStartPos = beg;
//cout << theString << " ---- " << beg << " - " << end << endl;
if ( pos < 1 ) // no index-th arg exist, append inexistent args
{
// find a closing parenthesis
- if ( int lastArgInd = GetNbArgs() ) {
+ if ( GetNbArgs() != 0 && index <= GetNbArgs() ) {
+ int lastArgInd = GetNbArgs();
pos = GetBegPos( ARG1_IND + lastArgInd - 1 ) + GetArg( lastArgInd ).Length();
while ( pos > 0 && pos <= Length() && myString.Value( pos ) != ')' )
++pos;
return childID.SubString( 1, colPos-1 );
return "";
}
+
+//================================================================================
+/*!
+ * \brief SelfEraser erases creation command if no more it's commands invoked
+ */
+//================================================================================
+
+void _pySelfEraser::Flush()
+{
+ if ( GetNbCalls() == 0 )
+ GetCreationCmd()->Clear();
+}
+
+//================================================================================
+/*!
+ * \brief count invoked commands
+ */
+//================================================================================
+
+void _pySubMesh::Process( const Handle(_pyCommand)& theCommand )
+{
+ _pyObject::Process(theCommand); // count calls of Process()
+ GetCreationCmd()->AddDependantCmd( theCommand );
+}
+
+//================================================================================
+/*!
+ * \brief Clear creatin command if no commands invoked
+ */
+//================================================================================
+
+void _pySubMesh::Flush()
+{
+ if ( GetNbCalls() == 0 ) // 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() );
+}