X-Git-Url: http://git.salome-platform.org/gitweb/?p=modules%2Fsmesh.git;a=blobdiff_plain;f=src%2FSMESH_I%2FSMESH_2smeshpy.cxx;h=4ab71b44977e29027da7f1d171073e8ae71b4121;hp=e12cd7f5a5b6b323af282eb2e8ebd4a6b0c8970f;hb=47d2912cb349883a15d02bdddedd3ffb5b375098;hpb=b0a908c0d20341651771d0249fb10882f54b2aad diff --git a/src/SMESH_I/SMESH_2smeshpy.cxx b/src/SMESH_I/SMESH_2smeshpy.cxx index e12cd7f5a..4ab71b449 100644 --- a/src/SMESH_I/SMESH_2smeshpy.cxx +++ b/src/SMESH_I/SMESH_2smeshpy.cxx @@ -1,4 +1,4 @@ -// Copyright (C) 2007-2014 CEA/DEN, EDF R&D, OPEN CASCADE +// Copyright (C) 2007-2020 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 @@ -33,8 +33,11 @@ #include #include +#include #include +#if OCC_VERSION_LARGE < 0x07050000 #include +#endif #include "SMESH_Gen_i.hxx" /* SALOME headers that include CORBA headers that include windows.h @@ -50,45 +53,29 @@ #include #endif - -IMPLEMENT_STANDARD_HANDLE (_pyObject ,Standard_Transient); -IMPLEMENT_STANDARD_HANDLE (_pyCommand ,Standard_Transient); -IMPLEMENT_STANDARD_HANDLE (_pyHypothesisReader,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 (_pyGroup ,_pyObject); -IMPLEMENT_STANDARD_HANDLE (_pyFilter ,_pyObject); -IMPLEMENT_STANDARD_HANDLE (_pyAlgorithm ,_pyHypothesis); -IMPLEMENT_STANDARD_HANDLE (_pyComplexParamHypo,_pyHypothesis); -IMPLEMENT_STANDARD_HANDLE (_pyNumberOfSegmentsHyp,_pyHypothesis); - -IMPLEMENT_STANDARD_RTTIEXT(_pyObject ,Standard_Transient); -IMPLEMENT_STANDARD_RTTIEXT(_pyCommand ,Standard_Transient); -IMPLEMENT_STANDARD_RTTIEXT(_pyHypothesisReader,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(_pyGroup ,_pyObject); -IMPLEMENT_STANDARD_RTTIEXT(_pyFilter ,_pyObject); -IMPLEMENT_STANDARD_RTTIEXT(_pyAlgorithm ,_pyHypothesis); -IMPLEMENT_STANDARD_RTTIEXT(_pyComplexParamHypo,_pyHypothesis); -IMPLEMENT_STANDARD_RTTIEXT(_pyNumberOfSegmentsHyp,_pyHypothesis); -IMPLEMENT_STANDARD_RTTIEXT(_pyLayerDistributionHypo,_pyHypothesis); -IMPLEMENT_STANDARD_RTTIEXT(_pySegmentLengthAroundVertexHyp,_pyHypothesis); +IMPLEMENT_STANDARD_RTTIEXT(_pyObject ,Standard_Transient) +IMPLEMENT_STANDARD_RTTIEXT(_pyCommand ,Standard_Transient) +IMPLEMENT_STANDARD_RTTIEXT(_pyHypothesisReader,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(_pyGroup ,_pyObject) +IMPLEMENT_STANDARD_RTTIEXT(_pyFilter ,_pyObject) +IMPLEMENT_STANDARD_RTTIEXT(_pyAlgorithm ,_pyHypothesis) +IMPLEMENT_STANDARD_RTTIEXT(_pyComplexParamHypo,_pyHypothesis) +IMPLEMENT_STANDARD_RTTIEXT(_pyNumberOfSegmentsHyp,_pyHypothesis) +IMPLEMENT_STANDARD_RTTIEXT(_pyLayerDistributionHypo,_pyHypothesis) +IMPLEMENT_STANDARD_RTTIEXT(_pySegmentLengthAroundVertexHyp,_pyHypothesis) using namespace std; using SMESH::TPythonDump; /*! * \brief Container of commands into which the initial script is split. - * It also contains data coresponding to SMESH_Gen contents + * It also contains data corresponding to SMESH_Gen contents */ static Handle(_pyGen) theGen; @@ -201,7 +188,7 @@ namespace { _AString comment; _pyID obj = cmd->GetObject(); - if ( obj.Search( "print " ) == 1 ) + if ( obj.Search( "print(" ) == 1 ) return; // print statement if ( !obj.IsEmpty() && obj.Value( obj.Length() ) == ')' ) @@ -306,6 +293,14 @@ namespace { // - FT_EntityType = 36 // v 7.3.0: FT_Undefined == 46, new items: // - FT_ConnectedElements = 39 + // v 7.6.0: FT_Undefined == 47, new items: + // - FT_BelongToMeshGroup = 22 + // v 8.1.0: FT_Undefined == 48, new items: + // - FT_NodeConnectivityNumber= 22 + // v 8.5.0: FT_Undefined == 49, new items: + // - FT_Deflection2D = 22 + // v 9.3.0: FT_Undefined == 50, new items: + // - FT_Length3D = 22 // // It's necessary to continue recording this history and to fill // undef2newItems (see below) accordingly. @@ -326,6 +321,10 @@ namespace { undef2newItems[ 44 ].push_back( 37 ); undef2newItems[ 45 ].push_back( 36 ); undef2newItems[ 46 ].push_back( 39 ); + undef2newItems[ 47 ].push_back( 22 ); + undef2newItems[ 48 ].push_back( 22 ); + undef2newItems[ 49 ].push_back( 22 ); + undef2newItems[ 50 ].push_back( 22 ); ASSERT( undef2newItems.rbegin()->first == SMESH::FT_Undefined ); } @@ -367,7 +366,7 @@ namespace { //================================================================================ /*! * \brief Replaces "SMESH.PointStruct(x,y,z)" and "SMESH.DirStruct( SMESH.PointStruct(x,y,z))" - * arguments of a given command by a list "[x,y,z]" if the list is accesible + * arguments of a given command by a list "[x,y,z]" if the list is accessible * type of argument. */ //================================================================================ @@ -384,6 +383,7 @@ namespace { "ExtrusionSweepObjectMakeGroups","ExtrusionSweepObject0D", "ExtrusionSweepObject1D","ExtrusionSweepObject1DMakeGroups", "ExtrusionSweepObject2D","ExtrusionSweepObject2DMakeGroups", + "ExtrusionSweepObjects","RotationSweepObjects","ExtrusionAlongPathObjects", "Translate","TranslateMakeGroups","TranslateMakeMesh", "TranslateObject","TranslateObjectMakeGroups", "TranslateObjectMakeMesh", "ExtrusionAlongPathX","ExtrusionAlongPathObjX","SplitHexahedraIntoPrisms" @@ -418,7 +418,7 @@ namespace { //================================================================================ /*! * \brief Replaces "mesh.GetIDSource([id1,id2])" argument of a given command by - * a list "[id1,id2]" if the list is an accesible type of argument. + * a list "[id1,id2]" if the list is an accessible type of argument. */ //================================================================================ @@ -431,7 +431,8 @@ namespace { "ExportCGNS","ExportGMF", "Create0DElementsOnAllNodes","Reorient2D","QuadTo4Tri", "ScaleMakeGroups","Scale","ScaleMakeMesh", - "FindCoincidentNodesOnPartBut","DoubleElements" + "FindCoincidentNodesOnPartBut","DoubleElements", + "ExtrusionSweepObjects","RotationSweepObjects","ExtrusionAlongPathObjects" ,"" }; // <- mark of the end methodsAcceptingList.Insert( methodNames ); } @@ -448,6 +449,18 @@ namespace { } } } + + bool _FilterArg( const _AString& theArg ) + { + static std::list<_AString> filteredArgs; + static bool initialized = false; + if ( !initialized ) { + initialized = true; + filteredArgs.push_back( "SMESH.MED_V2_1" ); + filteredArgs.push_back( "SMESH.MED_V2_2" ); + } + return std::find( filteredArgs.begin(), filteredArgs.end(), theArg ) != filteredArgs.end(); + } } //================================================================================ @@ -460,7 +473,7 @@ namespace { * \param theRemovedObjIDs - entries of objects whose created commands were removed * \param theHistoricalDump - true means to keep all commands, false means * to exclude commands relating to objects removed from study - * \retval TCollection_AsciiString - Convertion result + * \retval TCollection_AsciiString - Conversion result */ //================================================================================ @@ -469,7 +482,6 @@ SMESH_2smeshpy::ConvertScript(std::list< TCollection_AsciiString >& theScrip Resource_DataMapOfAsciiStringAsciiString& theEntry2AccessorMethod, Resource_DataMapOfAsciiStringAsciiString& theObjectNames, std::set< TCollection_AsciiString >& theRemovedObjIDs, - SALOMEDS::Study_ptr& theStudy, const bool theToKeepAllCommands) { std::list< TCollection_AsciiString >::iterator lineIt; @@ -492,7 +504,6 @@ SMESH_2smeshpy::ConvertScript(std::list< TCollection_AsciiString >& theScrip theGen = new _pyGen( theEntry2AccessorMethod, theObjectNames, theRemovedObjIDs, - theStudy, theToKeepAllCommands ); for ( lineIt = theScriptLines.begin(); lineIt != theScriptLines.end(); ++lineIt ) @@ -506,7 +517,7 @@ SMESH_2smeshpy::ConvertScript(std::list< TCollection_AsciiString >& theScrip MESSAGE_BEGIN ( std::endl << " ######## RESULT ######## " << std::endl<< std::endl ); #endif - // clean commmands of removed objects depending on myIsPublished flag + // clean commands of removed objects depending on myIsPublished flag theGen->ClearCommands(); // reorder commands after conversion @@ -524,7 +535,6 @@ SMESH_2smeshpy::ConvertScript(std::list< TCollection_AsciiString >& theScrip 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 @@ -552,7 +562,6 @@ SMESH_2smeshpy::ConvertScript(std::list< TCollection_AsciiString >& theScrip _pyGen::_pyGen(Resource_DataMapOfAsciiStringAsciiString& theEntry2AccessorMethod, Resource_DataMapOfAsciiStringAsciiString& theObjectNames, std::set< TCollection_AsciiString >& theRemovedObjIDs, - SALOMEDS::Study_ptr& theStudy, const bool theToKeepAllCommands) : _pyObject( new _pyCommand( "", 0 )), myNbCommands( 0 ), @@ -561,8 +570,8 @@ _pyGen::_pyGen(Resource_DataMapOfAsciiStringAsciiString& theEntry2AccessorMethod myRemovedObjIDs( theRemovedObjIDs ), myNbFilters( 0 ), myToKeepAllCommands( theToKeepAllCommands ), - myStudy( SALOMEDS::Study::_duplicate( theStudy )), - myGeomIDNb(0), myGeomIDIndex(-1) + myGeomIDNb(0), myGeomIDIndex(-1), + myShaperIDNb(0), myShaperIDIndex(-1) { // make that GetID() to return TPythonDump::SMESHGenName() GetCreationCmd()->Clear(); @@ -570,30 +579,38 @@ _pyGen::_pyGen(Resource_DataMapOfAsciiStringAsciiString& theEntry2AccessorMethod GetCreationCmd()->GetString() += "="; // Find 1st digit of study entry by which a GEOM object differs from a SMESH object - if ( !theObjectNames.IsEmpty() && !CORBA::is_nil( theStudy )) + if (!theObjectNames.IsEmpty()) { - // find a GEOM entry - _pyID geomID; - SALOMEDS::SComponent_wrap geomComp = theStudy->FindComponent("GEOM"); - if ( geomComp->_is_nil() ) return; - CORBA::String_var entry = geomComp->GetID(); - geomID = entry.in(); - - // find a SMESH entry - _pyID smeshID; - Resource_DataMapIteratorOfDataMapOfAsciiStringAsciiString e2n( theObjectNames ); - for ( ; e2n.More() && smeshID.IsEmpty(); e2n.Next() ) - if ( _pyCommand::IsStudyEntry( e2n.Key() )) - smeshID = e2n.Key(); - - // find 1st difference between smeshID and geomID - if ( !geomID.IsEmpty() && !smeshID.IsEmpty() ) - for ( int i = 1; i <= geomID.Length() && i <= smeshID.Length(); ++i ) - if ( geomID.Value( i ) != smeshID.Value( i )) - { - myGeomIDNb = geomID.Value( i ); - myGeomIDIndex = i; - } + // find a GEOM (aPass == 0) and SHAPERSTUDY (aPass == 1) entries + for(int aPass = 0; aPass < 2; aPass++) { + _pyID geomID; + SALOMEDS::SComponent_wrap geomComp = SMESH_Gen_i::getStudyServant()-> + FindComponent(aPass == 0 ? "GEOM" : "SHAPERSTUDY"); + if (geomComp->_is_nil()) continue; + CORBA::String_var entry = geomComp->GetID(); + geomID = entry.in(); + + // find a SMESH entry + _pyID smeshID; + Resource_DataMapIteratorOfDataMapOfAsciiStringAsciiString e2n(theObjectNames); + for (; e2n.More() && smeshID.IsEmpty(); e2n.Next()) + if (_pyCommand::IsStudyEntry(e2n.Key())) + smeshID = e2n.Key(); + + // find 1st difference between smeshID and geomID + if (!geomID.IsEmpty() && !smeshID.IsEmpty()) + for (int i = 1; i <= geomID.Length() && i <= smeshID.Length(); ++i) + if (geomID.Value(i) != smeshID.Value(i)) + { + if (aPass == 0) { + myGeomIDNb = geomID.Value(i); + myGeomIDIndex = i; + } else { + myShaperIDNb = geomID.Value(i); + myShaperIDIndex = i; + } + } + } } } @@ -611,7 +628,7 @@ const char* _pyGen::AccessorMethod() const //================================================================================ /*! * \brief Convert a command using a specific converter - * \param theCommand - the command to convert + * \param theCommand - the command to convert */ //================================================================================ @@ -687,6 +704,25 @@ Handle(_pyCommand) _pyGen::AddCommand( const TCollection_AsciiString& theCommand { //id_mesh->second->AddProcessedCmd( aCommand ); + // Wrap Export*() into try-except + if ( aCommand->MethodStartsFrom("Export")) + { + _AString tab = "\t"; + _AString indent = aCommand->GetIndentation(); + _AString tryStr = indent + "try:"; + _AString newCmd = indent + tab + ( aCommand->GetString().ToCString() + indent.Length() ); + _AString pasCmd = indent + tab + "pass"; // to keep valid if newCmd is erased + _AString excStr = indent + "except:"; + _AString msgStr = indent + "\tprint('"; msgStr += method + "() failed. Invalid file name?')"; + + myCommands.insert( --myCommands.end(), new _pyCommand( tryStr, myNbCommands )); + aCommand->Clear(); + aCommand->GetString() = newCmd; + aCommand->SetOrderNb( ++myNbCommands ); + myCommands.push_back( new _pyCommand( pasCmd, ++myNbCommands )); + myCommands.push_back( new _pyCommand( excStr, ++myNbCommands )); + myCommands.push_back( new _pyCommand( msgStr, ++myNbCommands )); + } // check for mesh editor object if ( aCommand->GetMethod() == "GetMeshEditor" ) { // MeshEditor creation _pyID editorID = aCommand->GetResultValue(); @@ -729,15 +765,16 @@ Handle(_pyCommand) _pyGen::AddCommand( const TCollection_AsciiString& theCommand else if ( method == "MakeBoundaryElements") meshID = aCommand->GetResultValue(2); - if ( method.Search("MakeGroups") != -1 || - method == "ExtrusionAlongPathX" || - method == "ExtrusionAlongPathObjX" || - method == "DoubleNodeGroupNew" || - method == "DoubleNodeGroupsNew" || - method == "DoubleNodeElemGroupNew" || - method == "DoubleNodeElemGroupsNew"|| - method == "DoubleNodeElemGroup2New"|| - method == "DoubleNodeElemGroups2New" + if ( method.Search("MakeGroups") != -1 || + method == "ExtrusionAlongPathX" || + method == "ExtrusionAlongPathObjX" || + method == "DoubleNodeGroupNew" || + method == "DoubleNodeGroupsNew" || + method == "DoubleNodeElemGroupNew" || + method == "DoubleNodeElemGroupsNew" || + method == "DoubleNodeElemGroup2New" || + method == "DoubleNodeElemGroups2New" || + method == "AffectedElemGroupsInRegion" ) groups = aCommand->GetResultValue(); else if ( method == "MakeBoundaryMesh" ) @@ -846,8 +883,8 @@ Handle(_pyCommand) _pyGen::AddCommand( const TCollection_AsciiString& theCommand aCommand->GetString() += tmpCmd.GetString(); } // IMP issue 0021014 - // set GetCriterion(elementType,CritType,Compare,Treshold,UnaryOp,BinaryOp,Tolerance) - // 1 2 3 4 5 6 7 + // set GetCriterion(elementType,CritType,Compare,Threshold,UnaryOp,BinaryOp,Tolerance) + // 1 2 3 4 5 6 7 // instead of "SMESH.Filter.Criterion( // Type,Compare,Threshold,ThresholdStr,ThresholdID,UnaryOp,BinaryOp,Tolerance,TypeOfElement,Precision) // 1 2 3 4 5 6 7 8 9 10 @@ -888,29 +925,39 @@ Handle(_pyCommand) _pyGen::AddCommand( const TCollection_AsciiString& theCommand if ( Type == "SMESH.FT_ElemGeomType" ) { // set SMESH.GeometryType instead of a numerical Threshold - const int nbTypes = SMESH::Geom_BALL+1; - const char* types[nbTypes] = { + const int nbTypes = SMESH::Geom_LAST; + const char* types[] = { "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 < nbTypes ) Threshold = SMESH + types[ iGeom ]; +#ifdef _DEBUG_ + // is types complete? (compilation failure means that enum GeometryType changed) + static_assert( sizeof(types) / sizeof(const char*) == nbTypes, + "Update names of GeometryType's!!!" ); +#endif } if (Type == "SMESH.FT_EntityType") { // set SMESH.EntityType instead of a numerical Threshold - const int nbTypes = SMESH::Entity_Ball+1; - const char* types[nbTypes] = { + const int nbTypes = SMESH::Entity_Last; + const char* types[] = { "Entity_Node", "Entity_0D", "Entity_Edge", "Entity_Quad_Edge", "Entity_Triangle", "Entity_Quad_Triangle", "Entity_BiQuad_Triangle", "Entity_Quadrangle", "Entity_Quad_Quadrangle", "Entity_BiQuad_Quadrangle", "Entity_Polygon", "Entity_Quad_Polygon", "Entity_Tetra", "Entity_Quad_Tetra", "Entity_Pyramid", "Entity_Quad_Pyramid", "Entity_Hexa", "Entity_Quad_Hexa", "Entity_TriQuad_Hexa", - "Entity_Penta", "Entity_Quad_Penta", "Entity_Hexagonal_Prism", + "Entity_Penta", "Entity_Quad_Penta", "Entity_BiQuad_Penta", "Entity_Hexagonal_Prism", "Entity_Polyhedra", "Entity_Quad_Polyhedra", "Entity_Ball" }; if ( -1 < iGeom && iGeom < nbTypes ) Threshold = SMESH + types[ iGeom ]; +#ifdef _DEBUG_ + // is 'types' complete? (compilation failure means that enum EntityType changed) + static_assert( sizeof(types) / sizeof(const char*) == nbTypes, + "Update names of EntityType's!!!" ); +#endif } } if ( ThresholdID.Length() != 2 ) // neither '' nor "" @@ -947,7 +994,7 @@ Handle(_pyCommand) _pyGen::AddCommand( const TCollection_AsciiString& theCommand //================================================================================ /*! * \brief Convert the command or remember it for later conversion - * \param theCommand - The python command calling a method of SMESH_Gen + * \param theCommand - The python command calling a method of SMESH_Gen */ //================================================================================ @@ -976,10 +1023,10 @@ void _pyGen::Process( const Handle(_pyCommand)& theCommand ) AddObject( mesh ); return; } - if( method == "CreateMeshesFromMED" || - method == "CreateMeshesFromSAUV"|| - method == "CreateMeshesFromCGNS" || - method == "CreateMeshesFromGMF" ) // command result is ( [mesh1,mesh2], status ) + if ( method == "CreateMeshesFromMED" || + method == "CreateMeshesFromSAUV"|| + method == "CreateMeshesFromCGNS" || + method == "CreateMeshesFromGMF" ) // command result is ( [mesh1,mesh2], status ) { std::list< _pyID > meshIDs = theCommand->GetStudyEntries( theCommand->GetResultValue() ); std::list< _pyID >::iterator meshID = meshIDs.begin(); @@ -997,6 +1044,12 @@ void _pyGen::Process( const Handle(_pyCommand)& theCommand ) theCommand->SetArg( 1, file ); } } + if ( method == "CopyMeshWithGeom" ) + { + std::list< _pyID > entries = theCommand->GetStudyEntries( theCommand->GetResultValue() ); + Handle(_pyMesh) mesh = new _pyMesh( theCommand, entries.front() ); + AddObject( mesh ); + } // CreateHypothesis() if ( method == "CreateHypothesis" ) @@ -1059,9 +1112,21 @@ void _pyGen::Process( const Handle(_pyCommand)& theCommand ) // Concatenate( [mesh1, ...], ... ) else if ( method == "Concatenate" || method == "ConcatenateWithGroups") { + // OLD IDL: ( meshes, uniteGroups, toMerge, tol ) + // IDL: ( meshes, uniteGroups, toMerge, tol, meshToAppendTo ) + // PY: ( meshes, uniteGroups, toMerge, tol, allGroups=False, name="", meshToAppendTo=None ) + _pyID appendMesh = theCommand->GetArg( 5 ); if ( method == "ConcatenateWithGroups" ) { theCommand->SetMethod( "Concatenate" ); - theCommand->SetArg( theCommand->GetNbArgs() + 1, "True" ); + theCommand->SetArg( 5, "True" ); + } + else { + theCommand->SetArg( 5, "False" ); + } + if ( !appendMesh.IsEmpty() && appendMesh != "None" ) + { + appendMesh.Insert( 1, "meshToAppendTo=" ); + theCommand->SetArg( theCommand->GetNbArgs() + 1, appendMesh ); } Handle(_pyMesh) mesh = new _pyMesh( theCommand, theCommand->GetResultValue() ); AddObject( mesh ); @@ -1082,7 +1147,7 @@ void _pyGen::Process( const Handle(_pyCommand)& theCommand ) static TStringSet smeshpyMethods; if ( smeshpyMethods.empty() ) { const char * names[] = - { "SetEmbeddedMode","IsEmbeddedMode","SetCurrentStudy","GetCurrentStudy", + { "SetEmbeddedMode","IsEmbeddedMode","UpdateStudy","GetStudy", "GetPattern","GetSubShapesId", "" }; // <- mark of array end smeshpyMethods.Insert( names ); @@ -1170,7 +1235,7 @@ void _pyGen::Flush() */ //================================================================================ -void _pyGen::PlaceSubmeshAfterItsCreation( Handle(_pyCommand) theCmdUsingSubmesh ) const +void _pyGen::PlaceSubmeshAfterItsCreation( Handle(_pyCommand) /*theCmdUsingSubmesh*/ ) const { // map< _pyID, Handle(_pyObject) >::const_iterator id_obj = myObjects.begin(); // for ( ; id_obj != myObjects.end(); ++id_obj ) @@ -1193,7 +1258,7 @@ void _pyGen::PlaceSubmeshAfterItsCreation( Handle(_pyCommand) theCmdUsingSubmesh //================================================================================ /*! - * \brief Clean commmands of removed objects depending on myIsPublished flag + * \brief Clean commands of removed objects depending on myIsPublished flag */ //================================================================================ @@ -1256,8 +1321,8 @@ void _pyGen::Free() //================================================================================ /*! * \brief Add access method to mesh that is an argument - * \param theCmd - command to add access method - * \retval bool - true if added + * \param theCmd - command to add access method + * \retval bool - true if added */ //================================================================================ @@ -1275,8 +1340,8 @@ bool _pyGen::AddMeshAccessorMethod( Handle(_pyCommand) theCmd ) const //================================================================================ /*! * \brief Add access method to algo that is an object or an argument - * \param theCmd - command to add access method - * \retval bool - true if added + * \param theCmd - command to add access method + * \retval bool - true if added */ //================================================================================ @@ -1297,8 +1362,8 @@ bool _pyGen::AddAlgoAccessorMethod( Handle(_pyCommand) theCmd ) const //================================================================================ /*! * \brief Find hypothesis by ID (entry) - * \param theHypID - The hypothesis ID - * \retval Handle(_pyHypothesis) - The found hypothesis + * \param theHypID - The hypothesis ID + * \retval Handle(_pyHypothesis) - The found hypothesis */ //================================================================================ @@ -1315,10 +1380,10 @@ Handle(_pyHypothesis) _pyGen::FindHyp( const _pyID& theHypID ) //================================================================================ /*! * \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 theHypothesis - The hypothesis the algorithm sould be able to create - * \retval Handle(_pyHypothesis) - The found algo + * \param theGeom - The shape ID the algorithm was created on + * \param theMesh - The mesh ID that created the algorithm + * \param theHypothesis - The hypothesis the algorithm should be able to create + * \retval Handle(_pyHypothesis) - The found algo */ //================================================================================ @@ -1339,8 +1404,8 @@ Handle(_pyHypothesis) _pyGen::FindAlgo( const _pyID& theGeom, const _pyID& theMe //================================================================================ /*! * \brief Find subMesh by ID (entry) - * \param theSubMeshID - The subMesh ID - * \retval Handle(_pySubMesh) - The found subMesh + * \param theSubMeshID - The subMesh ID + * \retval Handle(_pySubMesh) - The found subMesh */ //================================================================================ @@ -1356,8 +1421,8 @@ Handle(_pySubMesh) _pyGen::FindSubMesh( const _pyID& theSubMeshID ) //================================================================================ /*! * \brief Change order of commands in the script - * \param theCmd1 - One command - * \param theCmd2 - Another command + * \param theCmd1 - One command + * \param theCmd2 - Another command */ //================================================================================ @@ -1374,15 +1439,15 @@ void _pyGen::ExchangeCommands( Handle(_pyCommand) theCmd1, Handle(_pyCommand) th int nb1 = theCmd1->GetOrderNb(); theCmd1->SetOrderNb( theCmd2->GetOrderNb() ); theCmd2->SetOrderNb( nb1 ); -// cout << "BECOME " << theCmd1->GetOrderNb() << "\t" << theCmd1->GetString() << endl -// << "BECOME " << theCmd2->GetOrderNb() << "\t" << theCmd2->GetString() << endl << endl; + // cout << "BECOME " << theCmd1->GetOrderNb() << "\t" << theCmd1->GetString() << endl + // << "BECOME " << theCmd2->GetOrderNb() << "\t" << theCmd2->GetString() << endl << endl; } //================================================================================ /*! * \brief Set one command after the other - * \param theCmd - Command to move - * \param theAfterCmd - Command ater which to insert the first one + * \param theCmd - Command to move + * \param theAfterCmd - Command ater which to insert the first one */ //================================================================================ @@ -1394,8 +1459,8 @@ void _pyGen::SetCommandAfter( Handle(_pyCommand) theCmd, Handle(_pyCommand) theA //================================================================================ /*! * \brief Set one command before the other - * \param theCmd - Command to move - * \param theBeforeCmd - Command before which to insert the first one + * \param theCmd - Command to move + * \param theBeforeCmd - Command before which to insert the first one */ //================================================================================ @@ -1407,8 +1472,8 @@ void _pyGen::SetCommandBefore( Handle(_pyCommand) theCmd, Handle(_pyCommand) the //================================================================================ /*! * \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 + * \param theCmd - Command to move + * \param theOtherCmd - Command ater or before which to insert the first one */ //================================================================================ @@ -1435,7 +1500,7 @@ void _pyGen::setNeighbourCommand( Handle(_pyCommand)& theCmd, // void _pyGen::addFilterUser( Handle(_pyCommand)& theCommand, const Handle(_pyObject)& user ) // { - // No more needed after adding _pyObject::myArgCommands +// No more needed after adding _pyObject::myArgCommands // const char filterPrefix[] = "aFilter0x"; // if ( theCommand->GetString().Search( filterPrefix ) < 1 ) @@ -1461,7 +1526,7 @@ void _pyGen::setNeighbourCommand( Handle(_pyCommand)& theCmd, //================================================================================ /*! * \brief Set command be last in list of commands - * \param theCmd - Command to be last + * \param theCmd - Command to be last */ //================================================================================ @@ -1473,8 +1538,8 @@ Handle(_pyCommand)& _pyGen::GetLastCommand() //================================================================================ /*! * \brief Set method to access to object wrapped with python class - * \param theID - The wrapped object entry - * \param theMethod - The accessor method + * \param theID - The wrapped object entry + * \param theMethod - The accessor method */ //================================================================================ @@ -1486,7 +1551,7 @@ void _pyGen::SetAccessorMethod(const _pyID& theID, const char* theMethod ) //================================================================================ /*! * \brief Generated new ID for object and assign with existing name - * \param theID - ID of existing object + * \param theID - ID of existing object */ //================================================================================ @@ -1499,9 +1564,10 @@ _pyID _pyGen::GenerateNewID( const _pyID& theID ) } while ( myObjectNames.IsBound( aNewID ) ); - myObjectNames.Bind( aNewID, myObjectNames.IsBound( theID ) - ? (myObjectNames.Find( theID ) + _pyID( "_" ) + _pyID( index-1 )) - : _pyID( "A" ) + aNewID ); + if ( myObjectNames.IsBound( theID ) ) + myObjectNames.Bind( aNewID, ( myObjectNames.Find( theID ) + _pyID( "_" ) + _pyID( index-1 ) ) ); + else + myObjectNames.Bind( aNewID, ( _pyID( "A" ) + aNewID ) ); return aNewID; } @@ -1525,7 +1591,7 @@ bool _pyGen::AddObject( Handle(_pyObject)& theObj ) } else if ( theObj->IsKind( STANDARD_TYPE( _pyMeshEditor ))) { add = myMeshEditors.insert( make_pair( theObj->GetID(), - Handle(_pyMeshEditor)::DownCast( theObj ))).second; + Handle(_pyMeshEditor)::DownCast( theObj ))).second; } else { add = myObjects.insert( make_pair( theObj->GetID(), theObj )).second; @@ -1547,8 +1613,11 @@ void _pyGen::CheckObjectIsReCreated( Handle(_pyObject)& theObj ) return; const bool isHyp = theObj->IsKind( STANDARD_TYPE( _pyHypothesis )); - Handle(_pyObject) existing = - isHyp ? FindHyp( theObj->GetID() ) : FindObject( theObj->GetID() ); + Handle(_pyObject) existing; + if( isHyp ) + existing = FindHyp( theObj->GetID() ); + else + existing = FindObject( theObj->GetID() ); if ( !existing.IsNull() && existing != theObj ) { existing->SetRemovedFromStudy( true ); @@ -1604,7 +1673,8 @@ Handle(_pyObject) _pyGen::FindObject( const _pyID& theObjID ) const return id_obj->second; } { - map< _pyID, Handle(_pyMesh) >::const_iterator id_obj = myMeshes.find( theObjID ); + _pyGen* me = const_cast< _pyGen* >( this ); + map< _pyID, Handle(_pyMesh) >::iterator id_obj = me->myMeshes.find( theObjID ); if ( id_obj != myMeshes.end() ) return id_obj->second; } @@ -1624,13 +1694,11 @@ Handle(_pyObject) _pyGen::FindObject( const _pyID& theObjID ) const bool _pyGen::IsGeomObject(const _pyID& theObjID) const { - if ( myGeomIDNb ) - { - return ( myGeomIDIndex <= theObjID.Length() && - int( theObjID.Value( myGeomIDIndex )) == myGeomIDNb && - _pyCommand::IsStudyEntry( theObjID )); - } - return false; + bool isGeom = myGeomIDNb && myGeomIDIndex <= theObjID.Length() && + int( theObjID.Value( myGeomIDIndex )) == myGeomIDNb; + bool isShaper = myShaperIDNb && myShaperIDIndex <= theObjID.Length() && + int( theObjID.Value( myShaperIDIndex )) == myShaperIDNb; + return ((isGeom || isShaper) && _pyCommand::IsStudyEntry( theObjID )); } //================================================================================ @@ -1649,7 +1717,7 @@ bool _pyGen::IsNotPublished(const _pyID& theObjID) const // either the SMESH object is not in study or it is a GEOM object if ( IsGeomObject( theObjID )) { - SALOMEDS::SObject_wrap so = myStudy->FindObjectID( theObjID.ToCString() ); + SALOMEDS::SObject_wrap so = SMESH_Gen_i::getStudyServant()->FindObjectID( theObjID.ToCString() ); if ( so->_is_nil() ) return true; CORBA::Object_var obj = so->GetObject(); return CORBA::is_nil( obj ); @@ -1765,13 +1833,13 @@ _pyMesh::_pyMesh(const Handle(_pyCommand) theCreationCmd, const _pyID& meshId): //================================================================================ /*! * \brief Convert an IDL API command of SMESH::SMESH_Mesh to a method call of python Mesh - * \param theCommand - Engine method called for this mesh + * \param theCommand - Engine method called for this mesh */ //================================================================================ void _pyMesh::Process( const Handle(_pyCommand)& theCommand ) { - // some methods of SMESH_Mesh interface needs special conversion + // some methods of SMESH_Mesh interface need special conversion // to methods of Mesh python class // // 1. GetSubMesh(geom, name) + AddHypothesis(geom, algo) @@ -1793,10 +1861,29 @@ void _pyMesh::Process( const Handle(_pyCommand)& theCommand ) 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; @@ -1840,7 +1927,7 @@ void _pyMesh::Process( const Handle(_pyCommand)& theCommand ) } } // ---------------------------------------------------------------------- - else if ( method == "GetSubMesh" ) { // collect submeshes of the mesh + else if ( method == "GetSubMesh" ) { // collect sub-meshes of the mesh Handle(_pySubMesh) subMesh = theGen->FindSubMesh( theCommand->GetResultValue() ); if ( !subMesh.IsNull() ) { subMesh->SetCreator( this ); @@ -1848,6 +1935,10 @@ void _pyMesh::Process( const Handle(_pyCommand)& theCommand ) } } // ---------------------------------------------------------------------- + else if ( method == "GetSubMeshes" ) { // clear as the command does nothing (0023156) + theCommand->Clear(); + } + // ---------------------------------------------------------------------- else if ( method == "AddHypothesis" ) { // mesh.AddHypothesis(geom, HYPO ) myAddHypCmds.push_back( theCommand ); // set mesh to hypo @@ -1862,7 +1953,8 @@ void _pyMesh::Process( const Handle(_pyCommand)& theCommand ) // ---------------------------------------------------------------------- else if ( method == "CreateGroup" || method == "CreateGroupFromGEOM" || - method == "CreateGroupFromFilter" ) + method == "CreateGroupFromFilter" || + method == "CreateDimGroup" ) { Handle(_pyGroup) group = new _pyGroup( theCommand ); myGroups.push_back( group ); @@ -1876,7 +1968,7 @@ void _pyMesh::Process( const Handle(_pyCommand)& theCommand ) TCollection_AsciiString grIDs = theCommand->GetResultValue(); list< _pyID > idList = theCommand->GetStudyEntries( grIDs ); list< _pyID >::iterator grID = idList.begin(); - const int nbGroupsBefore = myGroups.size(); + const size_t nbGroupsBefore = myGroups.size(); Handle(_pyObject) obj; for ( ; grID != idList.end(); ++grID ) { @@ -1891,7 +1983,7 @@ void _pyMesh::Process( const Handle(_pyCommand)& theCommand ) if ( !obj->CanClear() ) allGroupsRemoved = false; } - if ( nbGroupsBefore == myGroups.size() ) // no new _pyGroup created + if ( nbGroupsBefore == myGroups.size() && !obj.IsNull() ) // no new _pyGroup created obj->AddProcessedCmd( theCommand ); // to clear theCommand if all groups are removed if ( !allGroupsRemoved && !theGen->IsToKeepAllCommands() ) @@ -1900,7 +1992,7 @@ void _pyMesh::Process( const Handle(_pyCommand)& theCommand ) // if GetGroups() is just after Compute(), this can mean that the groups // were created by some algorithm and hence Compute() should not be discarded std::list< Handle(_pyCommand) >& cmdList = theGen->GetCommands(); - std::list< Handle(_pyCommand) >::iterator cmd = cmdList.begin(); + std::list< Handle(_pyCommand) >::reverse_iterator cmd = cmdList.rbegin(); while ( (*cmd)->GetMethod() == "GetGroups" ) ++cmd; if ( myLastComputeCmd == (*cmd)) @@ -1928,16 +2020,26 @@ void _pyMesh::Process( const Handle(_pyCommand)& theCommand ) // ---------------------------------------------------------------------- else if ( theCommand->MethodStartsFrom( "Export" )) { - if ( method == "ExportToMED" || // ExportToMED() --> ExportMED() - method == "ExportToMEDX" ) // ExportToMEDX() --> ExportMED() + if ( method == "ExportToMED" || // ExportToMED() --> ExportMED() + method == "ExportToMEDX" || // ExportToMEDX() --> ExportMED() + method == "ExportMED" ) { theCommand->SetMethod( "ExportMED" ); - if ( theCommand->GetNbArgs() == 5 ) + // filter out deprecated version parameter + vector< _AString > args; + for ( int i = 1; i <= theCommand->GetNbArgs(); i++ ) { + if ( !_FilterArg( theCommand->GetArg( i ) ) ) + args.push_back( theCommand->GetArg( i ) ); + } + theCommand->RemoveArgs(); + for ( unsigned int i = 0; i < args.size(); i++ ) + theCommand->SetArg( i+1, args[i] ); + if ( theCommand->GetNbArgs() == 4 ) { // ExportToMEDX(...,autoDimension) -> ExportToMEDX(...,meshPart=None,autoDimension) - _AString autoDimension = theCommand->GetArg( 5 ); - theCommand->SetArg( 5, "None" ); - theCommand->SetArg( 6, autoDimension ); + _AString autoDimension = theCommand->GetArg( 4 ); + theCommand->SetArg( 4, "None" ); + theCommand->SetArg( 5, autoDimension ); } } else if ( method == "ExportCGNS" ) @@ -1961,14 +2063,34 @@ void _pyMesh::Process( const Handle(_pyCommand)& 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()) - _pyID partID = theCommand->GetArg( 1 ); - int nbArgs = theCommand->GetNbArgs() - (newMethod == "ExportMED"); - for ( int i = 2; i <= nbArgs; ++i ) - theCommand->SetArg( i-1, theCommand->GetArg( i )); - theCommand->SetArg( nbArgs, partID ); + // replace version parameter by minor + std::list< _AString > args; + for ( int i = 1; i <= theCommand->GetNbArgs(); i++ ) { + if ( _FilterArg( theCommand->GetArg( i ))) + args.push_back( "minor=0"); + else + args.push_back( theCommand->GetArg( i )); + } + // check the 1st arg meshPart, it must be SMESH_IDSource + _AString meshPart = args.front(); + if ( _pyCommand::IsStudyEntry( meshPart ) || + meshPart.Search( "Filter" ) > 0 || + meshPart.Search( "GetIDSource" ) > 0 || + meshPart.Search( "meshPart" ) > 0 ) + { + // set the 1st arg meshPart + // - to 5th place for ExportMED command + // - to last place for the rest commands + std::list< _AString >::iterator newPos = args.end(); + if ( newMethod == "ExportMED" ) + std::advance( newPos = args.begin(), 5 ); + args.splice( newPos, args, args.begin() ); + } + std::list< _AString >::iterator a = args.begin(); + for ( unsigned int i = 1; a != args.end(); ++i, ++a ) + theCommand->SetArg( i, *a ); } // remember file name theGen->AddExportedMesh( theCommand->GetArg( 1 ), @@ -2002,10 +2124,18 @@ void _pyMesh::Process( const Handle(_pyCommand)& theCommand ) { addCmd = *cmd; cmd = addHypCmds.erase( cmd ); - if ( !theGen->IsToKeepAllCommands() && CanClear() ) { + 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 { @@ -2029,7 +2159,7 @@ void _pyMesh::Process( const Handle(_pyCommand)& theCommand ) else if ( method == "GetMeshOrder" || method == "SetMeshOrder" ) { // make commands GetSubMesh() returning sub-meshes be before using sub-meshes - // by GetMeshOrder() and SetMeshOrder(), since by defalut GetSubMesh() + // by GetMeshOrder() and SetMeshOrder(), since by default GetSubMesh() // commands are moved at the end of the script TCollection_AsciiString subIDs = ( method == "SetMeshOrder" ) ? theCommand->GetArg(1) : theCommand->GetResultValue(); @@ -2065,8 +2195,8 @@ bool _pyMesh::NeedMeshAccess( const Handle(_pyCommand)& theCommand ) if ( sameMethods.empty() ) { const char * names[] = { "ExportDAT","ExportUNV","ExportSTL","ExportSAUV", "RemoveGroup","RemoveGroupWithContents", - "GetGroups","UnionGroups","IntersectGroups","CutGroups","GetLog","GetId","ClearLog", - "GetStudyId","HasDuplicatedGroupNamesMED","GetMEDMesh","NbNodes","NbElements", + "GetGroups","UnionGroups","IntersectGroups","CutGroups","CreateDimGroup","GetLog","GetId", + "ClearLog","HasDuplicatedGroupNamesMED","GetMEDMesh","NbNodes","NbElements", "NbEdges","NbEdgesOfOrder","NbFaces","NbFacesOfOrder","NbTriangles", "NbTrianglesOfOrder","NbQuadrangles","NbQuadranglesOfOrder","NbPolygons","NbVolumes", "NbVolumesOfOrder","NbTetras","NbTetrasOfOrder","NbHexas","NbHexasOfOrder", @@ -2105,7 +2235,7 @@ void _pyMesh::Flush() for ( ; m != fatherMeshes.end(); ++m ) addFatherMesh( *m ); // if ( removedGeom ) - // SetRemovedFromStudy(); // as reffered geometry not in study + // SetRemovedFromStudy(); // as referred geometry not in study } if ( myGeomNotInStudy ) return; @@ -2113,7 +2243,7 @@ void _pyMesh::Flush() list < Handle(_pyCommand) >::iterator cmd; // try to convert algo addition like this: - // mesh.AddHypothesis(geom, ALGO ) --> ALGO = mesh.Algo() + // mesh.AddHypothesis( geom, ALGO ) --> ALGO = mesh.Algo() for ( cmd = myAddHypCmds.begin(); cmd != myAddHypCmds.end(); ++cmd ) { Handle(_pyCommand) addCmd = *cmd; @@ -2361,24 +2491,26 @@ void _pyMeshEditor::Process( const Handle(_pyCommand)& theCommand) "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", "RotationSweep","RotationSweepObject","RotationSweepObject1D","RotationSweepObject2D", "ExtrusionSweep","AdvancedExtrusion","ExtrusionSweepObject","ExtrusionSweepObject1D", - "ExtrusionSweepObject2D","ExtrusionAlongPath","ExtrusionAlongPathObject", + "ExtrusionByNormal", "ExtrusionSweepObject2D","ExtrusionAlongPath","ExtrusionAlongPathObject", "ExtrusionAlongPathX","ExtrusionAlongPathObject1D","ExtrusionAlongPathObject2D", - "Mirror","MirrorObject","Translate","TranslateObject","Rotate","RotateObject", - "FindCoincidentNodes","MergeNodes","FindEqualElements", + "ExtrusionSweepObjects","RotationSweepObjects","ExtrusionAlongPathObjects", + "Mirror","MirrorObject","Translate","TranslateObject","Rotate","RotateObject","Offset", + "FindCoincidentNodes","MergeNodes","FindEqualElements","FillHole", "MergeElements","MergeEqualElements","SewFreeBorders","SewConformFreeBorders", + "FindCoincidentFreeBorders", "SewCoincidentFreeBorders", "SewBorderToSide","SewSideElements","ChangeElemNodes","GetLastCreatedNodes", - "GetLastCreatedElems", + "GetLastCreatedElems", "FaceGroupsSeparatedByEdges", "MirrorMakeMesh","MirrorObjectMakeMesh","TranslateMakeMesh","TranslateObjectMakeMesh", "Scale","ScaleMakeMesh","RotateMakeMesh","RotateObjectMakeMesh","MakeBoundaryMesh", "MakeBoundaryElements", "SplitVolumesIntoTetra","SplitHexahedraIntoPrisms", "DoubleElements","DoubleNodes","DoubleNode","DoubleNodeGroup","DoubleNodeGroups", - "DoubleNodeElem","DoubleNodeElemInRegion","DoubleNodeElemGroup", + "DoubleNodeElem","DoubleNodeElemInRegion","DoubleNodeElemGroup","AffectedElemGroupsInRegion", "DoubleNodeElemGroupInRegion","DoubleNodeElemGroups","DoubleNodeElemGroupsInRegion", "DoubleNodesOnGroupBoundaries","CreateFlatElementsOnFacesGroups","CreateHoleSkin" ,"" }; // <- mark of the end @@ -2561,7 +2693,7 @@ bool _pyMeshEditor::CanClear() //================================================================================ /*! * \brief _pyHypothesis constructor - * \param theCreationCmd - + * \param theCreationCmd - */ //================================================================================ @@ -2574,8 +2706,8 @@ _pyHypothesis::_pyHypothesis(const Handle(_pyCommand)& theCreationCmd): //================================================================================ /*! * \brief Creates algorithm or hypothesis - * \param theCreationCmd - The engine command creating a hypothesis - * \retval Handle(_pyHypothesis) - Result _pyHypothesis + * \param theCreationCmd - The engine command creating a hypothesis + * \retval Handle(_pyHypothesis) - Result _pyHypothesis */ //================================================================================ @@ -2664,9 +2796,9 @@ bool _pyHypothesis::IsWrappable(const _pyID& theMesh) const //================================================================================ /*! * \brief Convert the command adding a hypothesis to mesh into a smesh command - * \param theCmd - The command like mesh.AddHypothesis( geom, hypo ) - * \param theAlgo - The algo that can create this hypo - * \retval bool - false if the command cant be converted + * \param theCmd - The command like mesh.AddHypothesis( geom, hypo ) + * \param theAlgo - The algo that can create this hypo + * \retval bool - false if the command can't be converted */ //================================================================================ @@ -2729,7 +2861,7 @@ bool _pyHypothesis::Addition2Creation( const Handle(_pyCommand)& theCmd, //================================================================================ /*! * \brief Remember hypothesis parameter values - * \param theCommand - The called hypothesis method + * \param theCommand - The called hypothesis method */ //================================================================================ @@ -2750,7 +2882,7 @@ void _pyHypothesis::Process( const Handle(_pyCommand)& theCommand) 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] ); } } @@ -2791,7 +2923,7 @@ void _pyHypothesis::Flush() //================================================================================ /*! - * \brief clear creation, arg and unkown commands + * \brief clear creation, arg and unknown commands */ //================================================================================ @@ -2953,7 +3085,7 @@ void _pyHypothesis::rememberCmdOfParameter( const Handle(_pyCommand) & theComman // parameters are discriminated by method name _AString method = theCommand->GetMethod(); if ( myAccumulativeMethods.count( method )) - return; // this method adds values and not override the previus value + return; // this method adds values and not override the previous value // discriminate commands setting different parameters via one method // by passing parameter names like e.g. SetOption("size", "0.2") @@ -3038,8 +3170,7 @@ void _pyHypothesis::ComputeDiscarded( const Handle(_pyCommand)& theComputeCmd ) continue; // check if a cmd is a sole command setting its parameter; // don't use method name for search as it can change - map >::iterator - m2cmds = myMeth2Commands.begin(); + map<_AString, list >::iterator m2cmds = myMeth2Commands.begin(); for ( ; m2cmds != myMeth2Commands.end(); ++m2cmds ) { list< Handle(_pyCommand)>& cmds = m2cmds->second; @@ -3069,7 +3200,7 @@ void _pyHypothesis::setCreationArg( const int argNb, const _AString& arg ) { if ( myCurCrMethod ) { - while ( myCurCrMethod->myArgs.size() < argNb ) + while ( (int) myCurCrMethod->myArgs.size() < argNb ) myCurCrMethod->myArgs.push_back( "None" ); if ( arg.IsEmpty() ) myCurCrMethod->myArgs[ argNb-1 ] = "None"; @@ -3082,7 +3213,7 @@ void _pyHypothesis::setCreationArg( const int argNb, const _AString& arg ) //================================================================================ /*! * \brief Remember hypothesis parameter values - * \param theCommand - The called hypothesis method + * \param theCommand - The called hypothesis method */ //================================================================================ @@ -3136,9 +3267,9 @@ void _pyComplexParamHypo::Process( const Handle(_pyCommand)& theCommand) for ( ; type2meth != myAlgoType2CreationMethod.end(); ++type2meth ) { CreationMethod& crMethod = type2meth->second; - while ( crMethod.myArgs.size() < i+1 ) - crMethod.myArgs.push_back( "[]" ); - crMethod.myArgs[ i ] = theCommand->GetArg( 1 ); // arg value + while ( (int) crMethod.myArgs.size() < i+1 ) + crMethod.myArgs.push_back( "[]" ); + crMethod.myArgs[ i ] = theCommand->GetArg( 1 ); // arg value } myArgCommands.push_back( theCommand ); } @@ -3155,29 +3286,34 @@ void _pyComplexParamHypo::Process( const Handle(_pyCommand)& theCommand) 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 ) - { - StructToList( *cmd, /*checkMethod=*/false ); - (*cmd)->SetObject( algo ); - } - } } + + // 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 */ //================================================================================ @@ -3214,9 +3350,9 @@ void _pyLayerDistributionHypo::Process( const Handle(_pyCommand)& theCommand) //================================================================================ /*! * \brief - * \param theAdditionCmd - command to be converted - * \param theMesh - mesh instance - * \retval bool - status + * \param theAdditionCmd - command to be converted + * \param theMesh - mesh instance + * \retval bool - status */ //================================================================================ @@ -3318,9 +3454,9 @@ void _pyLayerDistributionHypo::Flush() //================================================================================ /*! * \brief additionally to Addition2Creation, clears SetDistrType() command - * \param theCmd - AddHypothesis() command - * \param theMesh - mesh to which a hypothesis is added - * \retval bool - convertion result + * \param theCmd - AddHypothesis() command + * \param theMesh - mesh to which a hypothesis is added + * \retval bool - conversion result */ //================================================================================ @@ -3400,9 +3536,9 @@ void _pyNumberOfSegmentsHyp::Flush() /*! * \brief Convert the command adding "SegmentLengthAroundVertex" to mesh * into regular1D.LengthNearVertex( length, vertex ) - * \param theCmd - The command like mesh.AddHypothesis( vertex, SegmentLengthAroundVertex ) - * \param theMesh - The mesh needing this hypo - * \retval bool - false if the command cant be converted + * \param theCmd - The command like mesh.AddHypothesis( vertex, SegmentLengthAroundVertex ) + * \param theMesh - The mesh needing this hypo + * \retval bool - false if the command can't be converted */ //================================================================================ @@ -3413,28 +3549,31 @@ bool _pySegmentLengthAroundVertexHyp::Addition2Creation( const Handle(_pyCommand _pyID vertex = theCmd->GetArg( 1 ); - // the problem here is that segment algo will not be found + // the problem here is that segment algo can be not found // by pyHypothesis::Addition2Creation() for , so we try to find // geometry where segment algorithm is assigned - Handle(_pyHypothesis) algo; _pyID geom = vertex; + Handle(_pyHypothesis) algo = theGen->FindAlgo( geom, theMeshID, this ); while ( algo.IsNull() && !geom.IsEmpty()) { // try to find geom as a father of geom = FatherID( geom ); algo = theGen->FindAlgo( geom, theMeshID, this ); } - if ( algo.IsNull() ) + if ( algo.IsNull() || geom.IsEmpty() ) return false; // also possible to find geom as brother of veretex... + // set geom instead of vertex theCmd->SetArg( 1, geom ); - // set vertex as a second arg - if ( myCurCrMethod->myArgs.size() < 1) setCreationArg( 1, "1" ); // :( - setCreationArg( 2, vertex ); - // mesh.AddHypothesis(vertex, SegmentLengthAroundVertex) --> - // theMeshID.LengthNearVertex( length, vertex ) - return _pyHypothesis::Addition2Creation( theCmd, theMeshID ); + // SegmentLengthAroundVertex = Regular_1D.LengthNearVertex( length ) + if ( _pyHypothesis::Addition2Creation( theCmd, theMeshID )) + { + // set vertex as a second arg + theCmd->SetArg( 2, vertex ); + + return true; + } } return false; } @@ -3442,7 +3581,7 @@ bool _pySegmentLengthAroundVertexHyp::Addition2Creation( const Handle(_pyCommand //================================================================================ /*! * \brief _pyAlgorithm constructor - * \param theCreationCmd - The command like "algo = smeshgen.CreateHypothesis(type,lib)" + * \param theCreationCmd - The command like "algo = smeshgen.CreateHypothesis(type,lib)" */ //================================================================================ @@ -3455,9 +3594,9 @@ _pyAlgorithm::_pyAlgorithm(const Handle(_pyCommand)& theCreationCmd) //================================================================================ /*! * \brief Convert the command adding an algorithm to mesh - * \param theCmd - The command like mesh.AddHypothesis( geom, algo ) - * \param theMesh - The mesh needing this algo - * \retval bool - false if the command cant be converted + * \param theCmd - The command like mesh.AddHypothesis( geom, algo ) + * \param theMesh - The mesh needing this algo + * \retval bool - false if the command can't be converted */ //================================================================================ @@ -3475,8 +3614,8 @@ bool _pyAlgorithm::Addition2Creation( const Handle(_pyCommand)& theCmd, //================================================================================ /*! * \brief Return starting position of a part of python command - * \param thePartIndex - The index of command part - * \retval int - Part position + * \param thePartIndex - The index of command part + * \retval int - Part position */ //================================================================================ @@ -3493,8 +3632,8 @@ int _pyCommand::GetBegPos( int thePartIndex ) const //================================================================================ /*! * \brief Store starting position of a part of python command - * \param thePartIndex - The index of command part - * \param thePosition - Part position + * \param thePartIndex - The index of command part + * \param thePosition - Part position */ //================================================================================ @@ -3509,24 +3648,24 @@ void _pyCommand::SetBegPos( int thePartIndex, int thePosition ) //================================================================================ /*! * \brief Returns whitespace symbols at the line beginning - * \retval TCollection_AsciiString - result + * \retval TCollection_AsciiString - result */ //================================================================================ TCollection_AsciiString _pyCommand::GetIndentation() { int end = 1; - if ( GetBegPos( RESULT_IND ) == UNKNOWN ) - GetWord( myString, end, true ); - else - end = GetBegPos( RESULT_IND ); - return myString.SubString( 1, Max( end - 1, 1 )); + //while ( end <= Length() && isblank( myString.Value( end ))) + //ANA: isblank() function isn't provided in VC2010 compiler + while ( end <= Length() && ( myString.Value( end ) == ' ' || myString.Value( end ) == '\t') ) + ++end; + return ( end == 1 ) ? _AString("") : myString.SubString( 1, end - 1 ); } //================================================================================ /*! * \brief Return substring of python command looking like ResultValue = Obj.Meth() - * \retval const TCollection_AsciiString & - ResultValue substring + * \retval const TCollection_AsciiString & - ResultValue substring */ //================================================================================ @@ -3616,17 +3755,17 @@ const TCollection_AsciiString & _pyCommand::GetObject() if ( begPos < 1 ) { begPos = myString.Location( "=", 1, Length() ) + 1; // 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, + int nb[4] = { 0, 0, 0, 0 }; // number of '"() character at the left of = + for ( int i = 1; i < begPos-1; i++ ) + switch ( myString.Value( i )) { + case '\'': nb[0]++; break; + case '"' : nb[1]++; break; + case '(' : nb[2]++; break; + case ')' : nb[3]++; break; + } + // if = is inside a string or a list // then get an object at the start of the command - if ( nb1 % 2 != 0 || nb2 % 2 != 0 ) + if ( nb[0] % 2 != 0 || nb[1] % 2 != 0 || nb[2] != nb[3]) begPos = 1; } else { @@ -3666,7 +3805,7 @@ const TCollection_AsciiString & _pyCommand::GetObject() //================================================================================ /*! * \brief Return substring of python command looking like ResVal = Obj.Method() - * \retval const TCollection_AsciiString & - Method substring + * \retval const TCollection_AsciiString & - Method substring */ //================================================================================ @@ -3675,12 +3814,15 @@ const TCollection_AsciiString & _pyCommand::GetMethod() if ( GetBegPos( METHOD_IND ) == UNKNOWN ) { // beginning - int begPos = GetBegPos( OBJECT_IND ) + myObj.Length(); + int begPos = GetBegPos( OBJECT_IND ); bool forward = true; if ( begPos < 1 ) { begPos = myString.Location( "(", 1, Length() ) - 1; forward = false; } + else { + begPos += myObj.Length(); + } // store myMeth = GetWord( myString, begPos, forward ); SetBegPos( METHOD_IND, begPos ); @@ -3699,6 +3841,10 @@ bool _pyCommand::IsMethodCall() { if ( GetMethod().IsEmpty() ) return false; + if ( myString.StartsWith("#") ) + return false; + if ( myString.StartsWith("SHAPERSTUDY") ) // skip shaperstudy specific dump string analysis + return false; const char* s = myString.ToCString() + GetBegPos( METHOD_IND ) + myMeth.Length() - 1; return ( s[0] == '(' || s[1] == '(' ); } @@ -3706,7 +3852,7 @@ bool _pyCommand::IsMethodCall() //================================================================================ /*! * \brief Return substring of python command looking like ResVal = Obj.Meth(Arg1,...) - * \retval const TCollection_AsciiString & - Arg substring + * \retval const TCollection_AsciiString & - Arg substring */ //================================================================================ @@ -3798,7 +3944,7 @@ int _pyCommand::GetArgBeginning() const if ( pos == UNKNOWN ) { pos = GetBegPos( METHOD_IND ) + myMeth.Length(); - if ( pos < 1 ) + if ( pos < 1 && Length() >= 4 ) pos = myString.Location( "(", 4, Length() ); // 4 = strlen("b.c(") } return pos; @@ -3807,8 +3953,8 @@ int _pyCommand::GetArgBeginning() const //================================================================================ /*! * \brief Check if char is a word part - * \param c - The character to check - * \retval bool - The check result + * \param c - The character to check + * \retval bool - The check result */ //================================================================================ @@ -3821,10 +3967,10 @@ static inline bool isWord(const char c, const bool dotIsWord) //================================================================================ /*! * \brief Looks for a word in the string and returns word's beginning - * \param theString - The input string - * \param theStartPos - The position to start the search, returning word's beginning - * \param theForward - The search direction - * \retval TCollection_AsciiString - The found word + * \param theString - The input string + * \param theStartPos - The position to start the search, returning word's beginning + * \param theForward - The search direction + * \retval TCollection_AsciiString - The found word */ //================================================================================ @@ -3883,6 +4029,11 @@ TCollection_AsciiString _pyCommand::GetWord( const _AString & theString, } theStartPos = beg; //cout << theString << " ---- " << beg << " - " << end << endl; + if ( end > theString.Length() ) + { + theStartPos = EMPTY; + return theEmptyString; + } return theString.SubString( beg, end ); } @@ -3929,7 +4080,7 @@ bool _pyCommand::IsID( const TCollection_AsciiString& str ) //================================================================================ /*! - * \brief Finds entries in a sting + * \brief Finds entries in a string */ //================================================================================ @@ -3955,9 +4106,9 @@ std::list< _pyID > _pyCommand::GetStudyEntries( const TCollection_AsciiString& s //================================================================================ /*! * \brief Look for position where not space char is - * \param theString - The string - * \param thePos - The position to search from and which returns result - * \retval bool - false if there are only space after thePos in theString + * \param theString - The string + * \param thePos - The position to search from and which returns result + * \retval bool - false if there are only space after thePos in theString */ //================================================================================ @@ -3975,14 +4126,14 @@ bool _pyCommand::SkipSpaces( const TCollection_AsciiString & theString, int & th //================================================================================ /*! * \brief Modify a part of the command - * \param thePartIndex - The index of the part - * \param thePart - The new part string - * \param theOldPart - The old part + * \param thePartIndex - The index of the part + * \param thePart - The new part string + * \param theOldPart - The old part */ //================================================================================ void _pyCommand::SetPart(int thePartIndex, const TCollection_AsciiString& thePart, - TCollection_AsciiString& theOldPart) + TCollection_AsciiString& theOldPart) { int pos = GetBegPos( thePartIndex ); if ( pos <= Length() && theOldPart != thePart) @@ -4014,9 +4165,9 @@ void _pyCommand::SetPart(int thePartIndex, const TCollection_AsciiString& thePar //================================================================================ /*! - * \brief Set agrument - * \param index - The argument index, it counts from 1 - * \param theArg - The argument string + * \brief Set argument + * \param index - The argument index, it counts from 1 + * \param theArg - The argument string */ //================================================================================ @@ -4117,9 +4268,9 @@ bool _pyCommand::SetDependentCmdsAfter() const //================================================================================ /*! * \brief Insert accessor method after theObjectID - * \param theObjectID - id of the accessed object - * \param theAcsMethod - name of the method giving access to the object - * \retval bool - false if theObjectID is not found in the command string + * \param theObjectID - id of the accessed object + * \param theAcsMethod - name of the method giving access to the object + * \retval bool - false if theObjectID is not found in the command string */ //================================================================================ @@ -4207,7 +4358,7 @@ void _pyObject::ClearCommands() //================================================================================ /*! * \brief Return method name giving access to an interaface object wrapped by python class - * \retval const char* - method name + * \retval const char* - method name */ //================================================================================ @@ -4336,42 +4487,42 @@ _pySubMesh::_pySubMesh(const Handle(_pyCommand)& theCreationCmd, bool toKeepAgrC */ //================================================================================ -bool _pySubMesh::CanBeArgOfMethod(const _AString& theMethodName) +bool _pySubMesh::CanBeArgOfMethod(const _AString& /*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 ); + // 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 ); } //================================================================================ @@ -4438,13 +4589,13 @@ _pyGroup::_pyGroup(const Handle(_pyCommand)& theCreationCmd, const _pyID & id) //} //else { // ------------------------->>>>> GroupOnGeom( geom, name, typ ) - _pyID type = theCreationCmd->GetArg( 1 ); - _pyID name = theCreationCmd->GetArg( 2 ); - theCreationCmd->SetMethod( "GroupOnGeom" ); - theCreationCmd->RemoveArgs(); - theCreationCmd->SetArg( 1, geom ); - theCreationCmd->SetArg( 2, name ); - theCreationCmd->SetArg( 3, type ); + _pyID type = theCreationCmd->GetArg( 1 ); + _pyID name = theCreationCmd->GetArg( 2 ); + theCreationCmd->SetMethod( "GroupOnGeom" ); + theCreationCmd->RemoveArgs(); + theCreationCmd->SetArg( 1, geom ); + theCreationCmd->SetArg( 2, name ); + theCreationCmd->SetArg( 3, type ); //} } else if ( method == "CreateGroupFromFilter" ) @@ -4927,40 +5078,33 @@ bool _pyStringFamily::Add( const char* str ) 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 ) + std::list< _AString >::iterator itLess = itStr; + while ( itLess != _strings.begin() ) + { + --itLess; if ( strncmp( str, itLess->ToCString(), minPrefixSize ) == 0 ) ++nbLess; else + { + ++itLess; break; - ++itLess; + } + } + // itLess points to the 1st string with same prefix + // count "greater" strings with the same prefix - std::list< _AString >::iterator itMore = itStr; int nbMore = 0; + std::list< _AString >::iterator itMore = itStr; for ( ; itMore != _strings.end(); ++itMore ) if ( strncmp( str, itMore->ToCString(), minPrefixSize ) == 0 ) ++nbMore; else break; - --itMore; + // itMore points to the 1st string with greater prefix + 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 ); @@ -4981,9 +5125,9 @@ bool _pyStringFamily::Add( const char* str ) for ( ; nbMore > 0; --nbMore, ++itStr ) newSubFam._strings.push_back( itStr->ToCString() + prefixSize ); - _strings.erase( itLess, ++itMore ); + _strings.erase( itLess, itMore ); } - else // to few string to make a family fot them + else // too few string to make a family for them { _strings.insert( itStr, str ); } @@ -5057,7 +5201,7 @@ int _pyStringFamily::isIn( const char* str ) if (( len = itSub->isIn( str + itSub->_prefix.Length() )) >= 0 ) return itSub->_prefix.Length() + len; } - else if ( cmp > 0 ) + else if ( cmp < 0 ) break; } if ( !_strings.empty() )