X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FSMESH_I%2FSMESH_2smeshpy.cxx;h=45540d510a4f8157a2df1b610317ab85c87aeb4a;hb=a9af195d4038d9caef14302c725d734b938ac50f;hp=565089b150cce9a19675ea475be377f1c2a162ab;hpb=24412178e1a7c741a73d5b23822c43e08c353b97;p=modules%2Fsmesh.git diff --git a/src/SMESH_I/SMESH_2smeshpy.cxx b/src/SMESH_I/SMESH_2smeshpy.cxx index 565089b15..45540d510 100644 --- a/src/SMESH_I/SMESH_2smeshpy.cxx +++ b/src/SMESH_I/SMESH_2smeshpy.cxx @@ -1,4 +1,4 @@ -// Copyright (C) 2007-2016 CEA/DEN, EDF R&D, OPEN CASCADE +// Copyright (C) 2007-2019 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 @@ -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 ); } @@ -1006,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(); @@ -1027,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" ) @@ -1089,9 +1098,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 ); @@ -1999,7 +2020,7 @@ void _pyMesh::Process( const Handle(_pyCommand)& theCommand ) args.push_back( theCommand->GetArg( i ) ); } theCommand->RemoveArgs(); - for ( uint i = 0; i < args.size(); i++ ) + for ( unsigned int i = 0; i < args.size(); i++ ) theCommand->SetArg( i+1, args[i] ); if ( theCommand->GetNbArgs() == 4 ) { @@ -2032,21 +2053,32 @@ void _pyMesh::Process( const Handle(_pyCommand)& theCommand ) TCollection_AsciiString newMethod = method; newMethod.Remove( /*where=*/7, /*howmany=*/6 ); theCommand->SetMethod( newMethod ); - // filter out deprecated version parameter - vector< _AString > args; + // 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( theCommand->GetArg( i ) ); + if ( _FilterArg( theCommand->GetArg( i ))) + args.push_back( "minor=0"); + else + args.push_back( theCommand->GetArg( i )); } - theCommand->RemoveArgs(); - for ( uint i = 0; i < args.size(); i++ ) - theCommand->SetArg( i+1, args[i] ); - // 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 ); + // 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 ), @@ -2115,7 +2147,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(); @@ -2199,7 +2231,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; @@ -2461,7 +2493,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", @@ -3041,7 +3073,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") @@ -3712,17 +3744,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 { @@ -3798,6 +3830,8 @@ bool _pyCommand::IsMethodCall() { if ( GetMethod().IsEmpty() ) return false; + if ( myString.StartsWith("#") ) + return false; const char* s = myString.ToCString() + GetBegPos( METHOD_IND ) + myMeth.Length() - 1; return ( s[0] == '(' || s[1] == '(' ); } @@ -4028,7 +4062,7 @@ bool _pyCommand::IsID( const TCollection_AsciiString& str ) //================================================================================ /*! - * \brief Finds entries in a sting + * \brief Finds entries in a string */ //================================================================================ @@ -5026,40 +5060,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 ); @@ -5080,7 +5107,7 @@ 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 // too few string to make a family for them {