From b6174726d937fdd9f13341e5a1c0a31da24db7f9 Mon Sep 17 00:00:00 2001 From: vsr Date: Thu, 27 Oct 2011 15:33:35 +0000 Subject: [PATCH] Merge from V6_3_BR branch (Windows porting) 27/10/2011 --- idl/SMESH_Gen.idl | 7 ++++ idl/SMESH_Mesh.idl | 7 ++++ src/SMESH/SMESH_Mesh.cxx | 38 +++++++++++++++++++++ src/SMESH/SMESH_Mesh.hxx | 3 ++ src/SMESHGUI/SMESHGUI.cxx | 51 +++++++++++++++++++++++++--- src/SMESHGUI/SMESH_msg_en.ts | 12 +++---- src/SMESH_I/SMESH_2smeshpy.cxx | 4 +-- src/SMESH_I/SMESH_Gen_i.cxx | 62 ++++++++++++++++++++++++++++++---- src/SMESH_I/SMESH_Gen_i.hxx | 10 ++++++ src/SMESH_I/SMESH_Mesh_i.cxx | 37 ++++++++++++++++---- src/SMESH_I/SMESH_Mesh_i.hxx | 4 +++ src/SMESH_SWIG/smeshDC.py | 20 +++++++++++ 12 files changed, 228 insertions(+), 27 deletions(-) diff --git a/idl/SMESH_Gen.idl b/idl/SMESH_Gen.idl index f73a3a9d1..a2a596418 100644 --- a/idl/SMESH_Gen.idl +++ b/idl/SMESH_Gen.idl @@ -215,6 +215,13 @@ module SMESH out SMESH::DriverMED_ReadStatus theStatus ) raises ( SALOME::SALOME_Exception ); + /*! + * Create Mesh object(s) importing data from given MED file + */ + mesh_array CreateMeshesFromSAUV( in string theFileName, + out SMESH::DriverMED_ReadStatus theStatus ) + raises ( SALOME::SALOME_Exception ); + /*! * Create Mesh object importing data from given STL file */ diff --git a/idl/SMESH_Mesh.idl b/idl/SMESH_Mesh.idl index 927969dbb..89de50129 100644 --- a/idl/SMESH_Mesh.idl +++ b/idl/SMESH_Mesh.idl @@ -610,6 +610,13 @@ module SMESH void ExportMED( in string file, in boolean auto_groups ) raises (SALOME::SALOME_Exception); + /*! + * Export Mesh to SAUV formatted file + * Write a temporary med file and use med2sauv + */ + void ExportSAUV( in string file, in boolean auto_groups ) + raises (SALOME::SALOME_Exception); + /*! * Return string representation of a MED file version comprising nbDigits */ diff --git a/src/SMESH/SMESH_Mesh.cxx b/src/SMESH/SMESH_Mesh.cxx index 02d93c4a5..61cfc4a94 100644 --- a/src/SMESH/SMESH_Mesh.cxx +++ b/src/SMESH/SMESH_Mesh.cxx @@ -1186,6 +1186,44 @@ void SMESH_Mesh::ExportMED(const char * file, myWriter.Perform(); } +void SMESH_Mesh::ExportSAUV(const char *file, + const char* theMeshName, + bool theAutoGroups) + throw(SALOME_Exception) +{ + std::string medfilename(file); + medfilename += ".med"; + std::string cmd; +#ifdef WNT + cmd = "%PYTHONBIN% "; +#else + cmd = "python "; +#endif + cmd += "-c \""; + cmd += "from medutilities import my_remove ; my_remove(r'" + medfilename + "')"; + cmd += "\""; + system(cmd.c_str()); + ExportMED(medfilename.c_str(), theMeshName, theAutoGroups, 1); +#ifdef WNT + cmd = "%PYTHONBIN% "; +#else + cmd = "python "; +#endif + cmd += "-c \""; + cmd += "from medutilities import convert ; convert(r'" + medfilename + "', 'MED', 'GIBI', 1, r'" + file + "')"; + cmd += "\""; + system(cmd.c_str()); +#ifdef WNT + cmd = "%PYTHONBIN% "; +#else + cmd = "python "; +#endif + cmd += "-c \""; + cmd += "from medutilities import my_remove ; my_remove(r'" + medfilename + "')"; + cmd += "\""; + system(cmd.c_str()); +} + //================================================================================ /*! * \brief Export the mesh to a DAT file diff --git a/src/SMESH/SMESH_Mesh.hxx b/src/SMESH/SMESH_Mesh.hxx index 570dbb345..41a2832ec 100644 --- a/src/SMESH/SMESH_Mesh.hxx +++ b/src/SMESH/SMESH_Mesh.hxx @@ -236,6 +236,9 @@ public: const SMESHDS_Mesh* meshPart = 0) throw(SALOME_Exception); void ExportCGNS(const char * file, const SMESHDS_Mesh* mesh); + void ExportSAUV(const char *file, + const char* theMeshName = NULL, + bool theAutoGroups = true) throw(SALOME_Exception); int NbNodes() const throw(SALOME_Exception); diff --git a/src/SMESHGUI/SMESHGUI.cxx b/src/SMESHGUI/SMESHGUI.cxx index 1080b3b79..9b0c877bd 100644 --- a/src/SMESHGUI/SMESHGUI.cxx +++ b/src/SMESHGUI/SMESHGUI.cxx @@ -205,6 +205,10 @@ else if ( theCommandID == 116 ) { filter.append( QObject::tr( "CGNS_FILES_FILTER" ) + " (*.cgns)" ); } + else if ( theCommandID == 117 ) { + filter.append( QObject::tr( "SAUV files (*.sauv*)" ) ); + filter.append( QObject::tr( "All files (*)" ) ); + } QString anInitialPath = ""; if ( SUIT_FileDlg::getLastVisitedPath().isEmpty() ) @@ -276,6 +280,17 @@ } break; } + case 117: + { + // SAUV format + SMESH::DriverMED_ReadStatus res; + aMeshes = theComponentMesh->CreateMeshesFromSAUV( filename.toLatin1().constData(), res ); + if ( res != SMESH::DRS_OK ) { + errors.append( QString( "%1 :\n\t%2" ).arg( filename ). + arg( QObject::tr( QString( "SMESH_DRS_%1" ).arg( res ).toLatin1().data() ) ) ); + } + break; + } } } catch ( const SALOME::SALOME_Exception& S_ex ) { @@ -349,6 +364,7 @@ const bool isUNV = ( theCommandID == 123 || theCommandID == 126 ); const bool isSTL = ( theCommandID == 140 || theCommandID == 141 ); const bool isCGNS= ( theCommandID == 142 || theCommandID == 143 ); + const bool isSAUV= ( theCommandID == 144 || theCommandID == 145 ); // actually, the following condition can't be met (added for insurance) if( selected.Extent() == 0 || @@ -400,7 +416,7 @@ SMESH::SMESH_Mesh_var aMesh = aMeshOrGroup->GetMesh(); QString aMeshName = (*aMeshIter).second; - if ( isMED || isCGNS ) + if ( isMED || isCGNS || isSAUV ) { // check for equal group names within each mesh for( aMeshIter = aMeshList.begin(); aMeshIter != aMeshList.end(); aMeshIter++ ) { @@ -506,13 +522,20 @@ } delete fd; } - else if ( isMED ) // Export to MED + else if ( isMED || isSAUV ) // Export to MED or SAUV { QMap aFilterMap; //QString v21 (aMesh->GetVersionString(SMESH::MED_V2_1, 2)); - QString v22 (aMesh->GetVersionString(SMESH::MED_V2_2, 2)); - //aFilterMap.insert( QObject::tr( "MED_VX_FILES_FILTER" ).arg( v21 ) + " (*.med)", SMESH::MED_V2_1 ); - aFilterMap.insert( QObject::tr( "MED_VX_FILES_FILTER" ).arg( v22 ) + " (*.med)", SMESH::MED_V2_2 ); + if ( isMED ) { + QString v22 (aMesh->GetVersionString(SMESH::MED_V2_2, 2)); + //aFilterMap.insert( QObject::tr( "MED_VX_FILES_FILTER" ).arg( v21 ) + " (*.med)", SMESH::MED_V2_1 ); + aFilterMap.insert( QObject::tr( "MED_VX_FILES_FILTER" ).arg( v22 ) + " (*.med)", SMESH::MED_V2_2 ); + } + else { // isSAUV + aFilterMap.insert("All files (*)", SMESH::MED_V2_1 ); + aFilterMap.insert("SAUV files (*.sauv)", SMESH::MED_V2_2 ); + aFilterMap.insert("SAUV files (*.sauve)", SMESH::MED_V2_1 ); + } QStringList filters; QString aDefaultFilter; @@ -656,6 +679,15 @@ aFormat, toOverwrite && aMeshIndex == 0 ); } } + else if ( isSAUV ) + { + for( aMeshIter = aMeshList.begin(); aMeshIter != aMeshList.end(); aMeshIter++ ) + { + SMESH::SMESH_Mesh_var aMeshItem = SMESH::SMESH_Mesh::_narrow( (*aMeshIter).first ); + if( !aMeshItem->_is_nil() ) + aMeshItem->ExportSAUV( aFilename.toLatin1().data(), toCreateGroups ); + } + } else if ( isDAT ) { if ( aMeshOrGroup->_is_equivalent( aMesh )) @@ -1975,6 +2007,7 @@ bool SMESHGUI::OnGUIEvent( int theCommandID ) case 116: case 115: + case 117: case 113: case 112: case 111: // IMPORT @@ -2013,6 +2046,8 @@ bool SMESHGUI::OnGUIEvent( int theCommandID ) case 141: case 142: case 143: + case 144: + case 145: { ::ExportMeshToFile(theCommandID); break; @@ -3371,16 +3406,19 @@ void SMESHGUI::initialize( CAM_Application* app ) createSMESHAction( 114, "NUM" ); createSMESHAction( 115, "STL" ); createSMESHAction( 116, "CGNS" ); + createSMESHAction( 117, "SAUV" ); createSMESHAction( 121, "DAT" ); createSMESHAction( 122, "MED" ); createSMESHAction( 123, "UNV" ); createSMESHAction( 140, "STL" ); createSMESHAction( 142, "CGNS" ); + createSMESHAction( 144, "SAUV" ); createSMESHAction( 124, "EXPORT_DAT" ); createSMESHAction( 125, "EXPORT_MED" ); createSMESHAction( 126, "EXPORT_UNV" ); createSMESHAction( 141, "EXPORT_STL" ); createSMESHAction( 143, "EXPORT_CGNS" ); + createSMESHAction( 145, "EXPORT_SAUV" ); createSMESHAction( 150, "FILE_INFO" ); createSMESHAction( 33, "DELETE", "ICON_DELETE", Qt::Key_Delete ); createSMESHAction( 5105, "SEL_FILTER_LIB" ); @@ -3547,6 +3585,7 @@ void SMESHGUI::initialize( CAM_Application* app ) #ifdef WITH_CGNS createMenu( 116, importId, -1 ); #endif + createMenu( 117, importId, -1 ); createMenu( 121, exportId, -1 ); createMenu( 122, exportId, -1 ); createMenu( 123, exportId, -1 ); @@ -3554,6 +3593,7 @@ void SMESHGUI::initialize( CAM_Application* app ) #ifdef WITH_CGNS createMenu( 142, exportId, -1 ); // export to CGNS #endif + createMenu( 144, exportId, -1 ); // export to SAUV createMenu( separator(), fileId, 10 ); createMenu( 33, editId, -1 ); @@ -3857,6 +3897,7 @@ void SMESHGUI::initialize( CAM_Application* app ) #ifdef WITH_CGNS createPopupItem( 143, OB, mesh_group, multiple_non_empty ); // EXPORT_CGNS #endif + createPopupItem( 145, OB, mesh_group, multiple_non_empty ); // EXPORT_SAUV createPopupItem( 33, OB, mesh_part + " " + hyp_alg ); // DELETE popupMgr()->insert( separator(), -1, 0 ); diff --git a/src/SMESHGUI/SMESH_msg_en.ts b/src/SMESHGUI/SMESH_msg_en.ts index e24143af4..aa73b2de3 100644 --- a/src/SMESHGUI/SMESH_msg_en.ts +++ b/src/SMESHGUI/SMESH_msg_en.ts @@ -373,7 +373,7 @@ MEN_EXPORT_SAUV - Export to SAUV (ASCII) file + Export to SAUV file MEN_EXPORT_STL @@ -501,7 +501,7 @@ MEN_SAUV - SAUV (ASCII) file + SAUV file MEN_MERGE @@ -2481,7 +2481,7 @@ Please check preferences of Mesh module. STB_EXPORT_SAUV - Export to SAUV (ASCII) file + Export to SAUV file STB_EXPORT_STL @@ -2581,7 +2581,7 @@ Please check preferences of Mesh module. STB_SAUV - Import SAUV (ASCII) file + Import SAUV file STB_MERGE @@ -3037,7 +3037,7 @@ Please check preferences of Mesh module. TOP_EXPORT_SAUV - Export to SAUV (ASCII) file + Export to SAUV file TOP_EXPORT_STL @@ -3137,7 +3137,7 @@ Please check preferences of Mesh module. TOP_SAUV - Import SAUV (ASCII) file + Import SAUV file TOP_MERGE diff --git a/src/SMESH_I/SMESH_2smeshpy.cxx b/src/SMESH_I/SMESH_2smeshpy.cxx index cbc8664d3..80d7a4d79 100644 --- a/src/SMESH_I/SMESH_2smeshpy.cxx +++ b/src/SMESH_I/SMESH_2smeshpy.cxx @@ -446,7 +446,7 @@ void _pyGen::Process( const Handle(_pyCommand)& theCommand ) myMeshes.insert( make_pair( mesh->GetID(), mesh )); return; } - if( method == "CreateMeshesFromMED") + if( method == "CreateMeshesFromMED" || method == "CreateMeshesFromSAUV") { for(int ind = 0;indGetNbResultValues();ind++) { @@ -1104,7 +1104,7 @@ bool _pyMesh::NeedMeshAccess( const Handle(_pyCommand)& theCommand ) static TStringSet sameMethods; if ( sameMethods.empty() ) { const char * names[] = - { "ExportDAT","ExportUNV","ExportSTL", "RemoveGroup","RemoveGroupWithContents", + { "ExportDAT","ExportUNV","ExportSTL","ExportSAUV", "RemoveGroup","RemoveGroupWithContents", "GetGroups","UnionGroups","IntersectGroups","CutGroups","GetLog","GetId","ClearLog", "GetStudyId","HasDuplicatedGroupNamesMED","GetMEDMesh","NbNodes","NbElements", "NbEdges","NbEdgesOfOrder","NbFaces","NbFacesOfOrder","NbTriangles", diff --git a/src/SMESH_I/SMESH_Gen_i.cxx b/src/SMESH_I/SMESH_Gen_i.cxx index cb00ff41a..9a562756a 100644 --- a/src/SMESH_I/SMESH_Gen_i.cxx +++ b/src/SMESH_I/SMESH_Gen_i.cxx @@ -918,13 +918,11 @@ SMESH::SMESH_Mesh_ptr SMESH_Gen_i::CreateMeshesFromUNV( const char* theFileName */ //============================================================================= -SMESH::mesh_array* SMESH_Gen_i::CreateMeshesFromMED( const char* theFileName, - SMESH::DriverMED_ReadStatus& theStatus) - throw ( SALOME::SALOME_Exception ) +SMESH::mesh_array* SMESH_Gen_i::CreateMeshesFromMEDorSAUV( const char* theFileName, + SMESH::DriverMED_ReadStatus& theStatus, + const char* theCommandNameForPython, + const char* theFileNameForPython) { - Unexpect aCatch(SALOME_SalomeException); - if(MYDEBUG) MESSAGE( "SMESH_Gen_i::CreateMeshFromMED" ); - // Retrieve mesh names from the file DriverMED_R_SMESHDS_Mesh myReader; myReader.SetFile( theFileName ); @@ -981,7 +979,7 @@ SMESH::mesh_array* SMESH_Gen_i::CreateMeshesFromMED( const char* theFileName, } // Update Python script - aPythonDump << "], status) = " << this << ".CreateMeshesFromMED(r'" << theFileName << "')"; + aPythonDump << "], status) = " << this << "." << theCommandNameForPython << "(r'" << theFileNameForPython << "')"; } // Dump creation of groups for ( int i = 0; i < aResult->length(); ++i ) @@ -990,6 +988,56 @@ SMESH::mesh_array* SMESH_Gen_i::CreateMeshesFromMED( const char* theFileName, return aResult._retn(); } +SMESH::mesh_array* SMESH_Gen_i::CreateMeshesFromMED( const char* theFileName, + SMESH::DriverMED_ReadStatus& theStatus) + throw ( SALOME::SALOME_Exception ) +{ + Unexpect aCatch(SALOME_SalomeException); + if(MYDEBUG) MESSAGE( "SMESH_Gen_i::CreateMeshFromMED" ); + SMESH::mesh_array* result = CreateMeshesFromMEDorSAUV(theFileName, theStatus, "CreateMeshesFromMED", theFileName); + return result; +} + +//============================================================================= +/*! + * SMESH_Gen_i::CreateMeshFromSAUV + * + * Create mesh and import data from SAUV file + */ +//============================================================================= + +SMESH::mesh_array* SMESH_Gen_i::CreateMeshesFromSAUV( const char* theFileName, + SMESH::DriverMED_ReadStatus& theStatus) + throw ( SALOME::SALOME_Exception ) +{ + Unexpect aCatch(SALOME_SalomeException); + if(MYDEBUG) MESSAGE( "SMESH_Gen_i::CreateMeshFromSAUV" ); + std::string sauvfilename(theFileName); + std::string medfilename(theFileName); + medfilename += ".med"; + std::string cmd; +#ifdef WNT + cmd = "%PYTHONBIN% "; +#else + cmd = "python "; +#endif + cmd += "-c \""; + cmd += "from medutilities import convert ; convert(r'" + sauvfilename + "', 'GIBI', 'MED', 1, r'" + medfilename + "')"; + cmd += "\""; + system(cmd.c_str()); + SMESH::mesh_array* result = CreateMeshesFromMEDorSAUV(medfilename.c_str(), theStatus, "CreateMeshesFromSAUV", sauvfilename.c_str()); +#ifdef WNT + cmd = "%PYTHONBIN% "; +#else + cmd = "python "; +#endif + cmd += "-c \""; + cmd += "from medutilities import my_remove ; my_remove(r'" + medfilename + "')"; + cmd += "\""; + system(cmd.c_str()); + return result; +} + //============================================================================= /*! * SMESH_Gen_i::CreateMeshFromSTL diff --git a/src/SMESH_I/SMESH_Gen_i.hxx b/src/SMESH_I/SMESH_Gen_i.hxx index f1d449edd..07ad55aa2 100644 --- a/src/SMESH_I/SMESH_Gen_i.hxx +++ b/src/SMESH_I/SMESH_Gen_i.hxx @@ -230,6 +230,11 @@ public: SMESH::DriverMED_ReadStatus& theStatus ) throw ( SALOME::SALOME_Exception ); + // Create mesh(es) and import data from MED file + SMESH::mesh_array* CreateMeshesFromSAUV( const char* theFileName, + SMESH::DriverMED_ReadStatus& theStatus ) + throw ( SALOME::SALOME_Exception ); + // Create mesh(es) and import data from STL file SMESH::SMESH_Mesh_ptr CreateMeshesFromSTL( const char* theFileName ) throw ( SALOME::SALOME_Exception ); @@ -550,6 +555,11 @@ private: static void loadGeomData( SALOMEDS::SComponent_ptr theCompRoot ); + SMESH::mesh_array* CreateMeshesFromMEDorSAUV( const char* theFileName, + SMESH::DriverMED_ReadStatus& theStatus, + const char* theCommandNameForPython, + const char* theFileNameForPython); + private: static GEOM::GEOM_Gen_var myGeomGen; static CORBA::ORB_var myOrb; // ORB reference diff --git a/src/SMESH_I/SMESH_Mesh_i.cxx b/src/SMESH_I/SMESH_Mesh_i.cxx index 07d8f2edd..8bc116f05 100644 --- a/src/SMESH_I/SMESH_Mesh_i.cxx +++ b/src/SMESH_I/SMESH_Mesh_i.cxx @@ -2548,14 +2548,9 @@ void SMESH_Mesh_i::PrepareForWriting (const char* file, bool overwrite) } } -void SMESH_Mesh_i::ExportToMEDX (const char* file, - CORBA::Boolean auto_groups, - SMESH::MED_VERSION theVersion, - CORBA::Boolean overwrite) - throw(SALOME::SALOME_Exception) +string SMESH_Mesh_i::PrepareMeshNameAndGroups(const char* file, + CORBA::Boolean overwrite) { - Unexpect aCatch(SALOME_SalomeException); - // Perform Export PrepareForWriting(file, overwrite); string aMeshName = "Mesh"; @@ -2590,6 +2585,17 @@ void SMESH_Mesh_i::ExportToMEDX (const char* file, // check names of groups checkGroupNames(); + return aMeshName; +} + +void SMESH_Mesh_i::ExportToMEDX (const char* file, + CORBA::Boolean auto_groups, + SMESH::MED_VERSION theVersion, + CORBA::Boolean overwrite) + throw(SALOME::SALOME_Exception) +{ + Unexpect aCatch(SALOME_SalomeException); + string aMeshName = PrepareMeshNameAndGroups(file, true); TPythonDump() << _this() << ".ExportToMEDX( r'" << file << "', " << auto_groups << ", " << theVersion << ", " << overwrite << " )"; @@ -2623,6 +2629,23 @@ void SMESH_Mesh_i::ExportMED (const char* file, ExportToMEDX(file,auto_groups,SMESH::MED_V2_2,true); } +//================================================================================ +/*! + * \brief Export a mesh to a SAUV file + */ +//================================================================================ + +void SMESH_Mesh_i::ExportSAUV (const char* file, + CORBA::Boolean auto_groups) + throw(SALOME::SALOME_Exception) +{ + Unexpect aCatch(SALOME_SalomeException); + string aMeshName = PrepareMeshNameAndGroups(file, true); + TPythonDump() << _this() << ".ExportSAUV( r'" << file << "', " << auto_groups << " )"; + _impl->ExportSAUV(file, aMeshName.c_str(), auto_groups); +} + + //================================================================================ /*! * \brief Export a mesh to a DAT file diff --git a/src/SMESH_I/SMESH_Mesh_i.hxx b/src/SMESH_I/SMESH_Mesh_i.hxx index dcd2bc537..bafb09e76 100644 --- a/src/SMESH_I/SMESH_Mesh_i.hxx +++ b/src/SMESH_I/SMESH_Mesh_i.hxx @@ -230,6 +230,8 @@ public: void ExportMED ( const char* file, CORBA::Boolean auto_groups ) throw (SALOME::SALOME_Exception); + void ExportSAUV( const char* file, CORBA::Boolean auto_groups ) throw (SALOME::SALOME_Exception); + void ExportDAT( const char* file ) throw (SALOME::SALOME_Exception); void ExportUNV( const char* file ) throw (SALOME::SALOME_Exception); void ExportSTL( const char* file, bool isascii ) throw (SALOME::SALOME_Exception); @@ -570,6 +572,8 @@ public: std::map _mapSubMesh; //NRI private: + std::string PrepareMeshNameAndGroups( const char* file, CORBA::Boolean overwrite ); + /*! * Check and correct names of mesh groups */ diff --git a/src/SMESH_SWIG/smeshDC.py b/src/SMESH_SWIG/smeshDC.py index ef8dd1df6..29b6c39fd 100644 --- a/src/SMESH_SWIG/smeshDC.py +++ b/src/SMESH_SWIG/smeshDC.py @@ -697,6 +697,17 @@ class smeshDC(SMESH._objref_SMESH_Gen): aMeshes.append(aMesh) return aMeshes, aStatus + ## Creates a Mesh object(s) importing data from the given SAUV file + # @return a list of Mesh class instances + # @ingroup l2_impexp + def CreateMeshesFromSAUV( self,theFileName ): + aSmeshMeshes, aStatus = SMESH._objref_SMESH_Gen.CreateMeshesFromSAUV(self,theFileName) + aMeshes = [] + for iMesh in range(len(aSmeshMeshes)) : + aMesh = Mesh(self, self.geompyD, aSmeshMeshes[iMesh]) + aMeshes.append(aMesh) + return aMeshes, aStatus + ## Creates a Mesh object importing data from the given STL file # @return an instance of Mesh class # @ingroup l2_impexp @@ -1747,6 +1758,15 @@ class Mesh: else: self.mesh.ExportToMEDX(f, auto_groups, version, overwrite) + ## Exports the mesh in a file in SAUV format + # @param f is the file name + # @param auto_groups boolean parameter for creating/not creating + # the groups Group_On_All_Nodes, Group_On_All_Faces, ... ; + # the typical use is auto_groups=false. + # @ingroup l2_impexp + def ExportSAUV(self, f, auto_groups=0): + self.mesh.ExportSAUV(f, auto_groups) + ## Exports the mesh in a file in DAT format # @param f the file name # @param meshPart a part of mesh (group, sub-mesh) to export instead of the mesh -- 2.39.2