X-Git-Url: http://git.salome-platform.org/gitweb/?p=modules%2Fsmesh.git;a=blobdiff_plain;f=src%2FSMESH_I%2FSMESH_2smeshpy.cxx;h=69b3b0f760514430b6c1374a5750e495167de815;hp=75c97665077cf12a0eda94a88d70a52410145eb9;hb=cc85955178440fffe36eef234d759e3c3590248f;hpb=30628bd54b2932ebfaae2ae2c24af7f173c4970e diff --git a/src/SMESH_I/SMESH_2smeshpy.cxx b/src/SMESH_I/SMESH_2smeshpy.cxx index 75c976650..69b3b0f76 100644 --- a/src/SMESH_I/SMESH_2smeshpy.cxx +++ b/src/SMESH_I/SMESH_2smeshpy.cxx @@ -185,7 +185,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() ) == ')' ) @@ -296,6 +296,8 @@ namespace { // - 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. @@ -319,6 +321,7 @@ namespace { 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 ); } @@ -360,7 +363,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. */ //================================================================================ @@ -412,7 +415,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. */ //================================================================================ @@ -443,6 +446,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(); + } } //================================================================================ @@ -464,7 +479,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; @@ -487,7 +501,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 ) @@ -519,7 +532,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 @@ -547,7 +559,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 ), @@ -556,7 +567,6 @@ _pyGen::_pyGen(Resource_DataMapOfAsciiStringAsciiString& theEntry2AccessorMethod myRemovedObjIDs( theRemovedObjIDs ), myNbFilters( 0 ), myToKeepAllCommands( theToKeepAllCommands ), - myStudy( SALOMEDS::Study::_duplicate( theStudy )), myGeomIDNb(0), myGeomIDIndex(-1) { // make that GetID() to return TPythonDump::SMESHGenName() @@ -565,11 +575,11 @@ _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"); + SALOMEDS::SComponent_wrap geomComp = SMESH_Gen_i::getStudyServant()->FindComponent("GEOM"); if ( geomComp->_is_nil() ) return; CORBA::String_var entry = geomComp->GetID(); geomID = entry.in(); @@ -691,7 +701,7 @@ Handle(_pyCommand) _pyGen::AddCommand( const TCollection_AsciiString& theCommand _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?'"; + _AString msgStr = indent + "\tprint('"; msgStr += method + "() failed. Invalid file name?')"; myCommands.insert( --myCommands.end(), new _pyCommand( tryStr, myNbCommands )); aCommand->Clear(); @@ -999,10 +1009,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(); @@ -1020,6 +1030,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" ) @@ -1105,7 +1121,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 ); @@ -1677,7 +1693,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 ); @@ -1980,16 +1996,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" ) @@ -2015,12 +2041,32 @@ void _pyMesh::Process( const Handle(_pyCommand)& theCommand ) TCollection_AsciiString newMethod = method; newMethod.Remove( /*where=*/7, /*howmany=*/6 ); theCommand->SetMethod( newMethod ); - // make the 1st arg be the last one (or last but three for ExportMED()) - _pyID partID = theCommand->GetArg( 1 ); - int nbArgs = theCommand->GetNbArgs() - 3 * (newMethod == "ExportMED"); - for ( int i = 2; i <= nbArgs; ++i ) - theCommand->SetArg( i-1, theCommand->GetArg( i )); - theCommand->SetArg( nbArgs, partID ); + // 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 ), @@ -2089,7 +2135,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(); @@ -2126,7 +2172,7 @@ bool _pyMesh::NeedMeshAccess( const Handle(_pyCommand)& theCommand ) const char * names[] = { "ExportDAT","ExportUNV","ExportSTL","ExportSAUV", "RemoveGroup","RemoveGroupWithContents", "GetGroups","UnionGroups","IntersectGroups","CutGroups","CreateDimGroup","GetLog","GetId", - "ClearLog","GetStudyId","HasDuplicatedGroupNamesMED","GetMEDMesh","NbNodes","NbElements", + "ClearLog","HasDuplicatedGroupNamesMED","GetMEDMesh","NbNodes","NbElements", "NbEdges","NbEdgesOfOrder","NbFaces","NbFacesOfOrder","NbTriangles", "NbTrianglesOfOrder","NbQuadrangles","NbQuadranglesOfOrder","NbPolygons","NbVolumes", "NbVolumesOfOrder","NbTetras","NbTetrasOfOrder","NbHexas","NbHexasOfOrder", @@ -2435,7 +2481,7 @@ void _pyMeshEditor::Process( const Handle(_pyCommand)& theCommand) "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", @@ -3015,7 +3061,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") @@ -3686,17 +3732,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 { @@ -4002,7 +4048,7 @@ bool _pyCommand::IsID( const TCollection_AsciiString& str ) //================================================================================ /*! - * \brief Finds entries in a sting + * \brief Finds entries in a string */ //================================================================================ @@ -5130,7 +5176,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() )