Salome HOME
Merge branch 'OCCT780'
[modules/smesh.git] / src / SMESH_I / SMESH_Mesh_i.cxx
index c63eccd3b15a546e1f44b77a300cd9f4527f3fac..e1c8ca9163a28ec9ed99493064563d9d31221f5f 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright (C) 2007-2021  CEA/DEN, EDF R&D, OPEN CASCADE
+// Copyright (C) 2007-2024  CEA, EDF, OPEN CASCADE
 //
 // Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
@@ -57,6 +57,7 @@
 #include "SMESH_PreMeshInfo.hxx"
 #include "SMESH_PythonDump.hxx"
 #include "SMESH_subMesh_i.hxx"
+#include "SMESH_Meshio.h"
 
 #include <SALOMEDS_Attributes_wrap.hxx>
 #include <SALOMEDS_wrap.hxx>
 
 #include "SMESH_TryCatch.hxx" // include after OCCT headers!
 
-#ifdef _DEBUG_
-static int MYDEBUG = 0;
-#else
-static int MYDEBUG = 0;
-#endif
-
 using namespace std;
 using SMESH::TPythonDump;
 using SMESH::TVar;
@@ -664,7 +659,7 @@ SMESH_Mesh_i::AddHypothesis(GEOM::GEOM_Object_ptr       aSubShape,
     if ( prevNbMeshEnt > 0 /*newNbMeshEnt != prevNbMeshEnt*/ )
       _gen_i->UpdateIcons( mesh );
   }
-  if(MYDEBUG) MESSAGE( " AddHypothesis(): status = " << status );
+  MESSAGE( " AddHypothesis(): status = " << status );
 
   // Update Python script
   TPythonDump() << "status = " << mesh << ".AddHypothesis( "
@@ -684,7 +679,7 @@ SMESH_Mesh_i::addHypothesis(GEOM::GEOM_Object_ptr       aSubShape,
                             SMESH::SMESH_Hypothesis_ptr anHyp,
                             std::string*                anErrorText)
 {
-  if(MYDEBUG) MESSAGE("addHypothesis");
+  MESSAGE("addHypothesis");
 
   if (CORBA::is_nil( aSubShape ) && HasShapeToMesh())
     THROW_SALOME_CORBA_EXCEPTION("bad Sub-shape reference",SALOME::BAD_PARAM);
@@ -770,7 +765,7 @@ SMESH_Hypothesis::Hypothesis_Status
 SMESH_Mesh_i::removeHypothesis(GEOM::GEOM_Object_ptr       aSubShape,
                                SMESH::SMESH_Hypothesis_ptr anHyp)
 {
-  if(MYDEBUG) MESSAGE("removeHypothesis()");
+  MESSAGE("removeHypothesis()");
 
   if (CORBA::is_nil( aSubShape ) && HasShapeToMesh())
     THROW_SALOME_CORBA_EXCEPTION("bad Sub-shape reference", SALOME::BAD_PARAM);
@@ -816,7 +811,7 @@ SMESH::ListOfHypothesis *
 SMESH_Mesh_i::GetHypothesisList(GEOM::GEOM_Object_ptr aSubShape)
 {
   Unexpect aCatch(SALOME_SalomeException);
-  if (MYDEBUG) MESSAGE("GetHypothesisList");
+  MESSAGE("GetHypothesisList");
   if (_impl->HasShapeToMesh() && CORBA::is_nil(aSubShape))
     THROW_SALOME_CORBA_EXCEPTION("bad Sub-shape reference", SALOME::BAD_PARAM);
 
@@ -856,7 +851,7 @@ SMESH_Mesh_i::GetHypothesisList(GEOM::GEOM_Object_ptr aSubShape)
 SMESH::submesh_array* SMESH_Mesh_i::GetSubMeshes()
 {
   Unexpect aCatch(SALOME_SalomeException);
-  if (MYDEBUG) MESSAGE("GetSubMeshes");
+  MESSAGE("GetSubMeshes");
 
   SMESH::submesh_array_var aList = new SMESH::submesh_array();
 
@@ -1220,7 +1215,7 @@ void SMESH_Mesh_i::RemoveGroupWithContents( SMESH::SMESH_GroupBase_ptr theGroup
 SMESH::ListOfGroups * SMESH_Mesh_i::GetGroups()
 {
   Unexpect aCatch(SALOME_SalomeException);
-  if (MYDEBUG) MESSAGE("GetGroups");
+  MESSAGE("GetGroups");
 
   SMESH::ListOfGroups_var aList = new SMESH::ListOfGroups();
 
@@ -2415,9 +2410,11 @@ void SMESH_Mesh_i::CheckGeomModif( bool theIsBreakLink )
     {
       smIdType nb = NbNodes() + NbElements();
       CheckGeomGroupModif();
-      if ( nb != NbNodes() + NbElements() ) // something removed due to hypotheses change
+      bool updated = ( nb != NbNodes() + NbElements() );
+      if ( updated ) // something removed due to hypotheses change
         _gen_i->UpdateIcons( me );
-      return;
+      if ( updated == geomChanged || nb == 0 )
+        return;
     }
 
   // Update after shape modification or breakLink w/o geometry change
@@ -2504,7 +2501,7 @@ void SMESH_Mesh_i::CheckGeomModif( bool theIsBreakLink )
         }
         old2newShapeMap.Bind( group->GetShape(), groupsData.back()._shape );
       }
-      
+
     }
   }
   // store assigned hypotheses
@@ -3120,7 +3117,7 @@ SMESH::SMESH_Group_ptr SMESH_Mesh_i::ConvertToStandalone( SMESH::SMESH_GroupBase
 
 SMESH::SMESH_subMesh_ptr SMESH_Mesh_i::createSubMesh( GEOM::GEOM_Object_ptr theSubShapeObject )
 {
-  if(MYDEBUG) MESSAGE( "createSubMesh" );
+  MESSAGE( "createSubMesh" );
   TopoDS_Shape  myLocSubShape = _gen_i->GeomObjectToShape(theSubShapeObject);
   ::SMESH_subMesh * mySubMesh = _impl->GetSubMesh(myLocSubShape);
   int               subMeshId = 0;
@@ -3152,8 +3149,7 @@ SMESH::SMESH_subMesh_ptr SMESH_Mesh_i::createSubMesh( GEOM::GEOM_Object_ptr theS
 
   // register CORBA object for persistence
   int nextId = _gen_i->RegisterObject( subMesh );
-  if(MYDEBUG) { MESSAGE( "Add submesh to map with id = "<< nextId); }
-  else        { (void)nextId; } // avoid "unused variable" warning
+  MESSAGE( "Add submesh to map with id = "<< nextId);
 
   // to track changes of GEOM groups
   if ( subMeshId > 0 )
@@ -3289,8 +3285,7 @@ SMESH::SMESH_GroupBase_ptr SMESH_Mesh_i::createGroup (SMESH::ElementType
 
     // register CORBA object for persistence
     int nextId = _gen_i->RegisterObject( aGroup );
-    if(MYDEBUG) { MESSAGE( "Add group to map with id = "<< nextId); }
-    else        { nextId = ( nextId > 0 ); } // avoid "unused variable" warning in release mode
+    MESSAGE( "Add group to map with id = "<< nextId);
 
     // to track changes of GEOM groups
     if ( !theShape.IsNull() ) {
@@ -3311,7 +3306,7 @@ SMESH::SMESH_GroupBase_ptr SMESH_Mesh_i::createGroup (SMESH::ElementType
 
 void SMESH_Mesh_i::removeGroup( const int theId )
 {
-  if(MYDEBUG) MESSAGE("SMESH_Mesh_i::removeGroup()" );
+  MESSAGE("SMESH_Mesh_i::removeGroup()");
   if ( _mapGroups.find( theId ) != _mapGroups.end() ) {
     SMESH::SMESH_GroupBase_var group = _mapGroups[theId];
     _mapGroups.erase( theId );
@@ -3478,7 +3473,7 @@ void SMESH_Mesh_i::onHypothesisModified(int theHypID, bool theUpdateIcons)
 
 void SMESH_Mesh_i::SetImpl(::SMESH_Mesh * impl)
 {
-  if(MYDEBUG) MESSAGE("SMESH_Mesh_i::SetImpl");
+  MESSAGE("SMESH_Mesh_i::SetImpl");
   _impl = impl;
   if ( _impl )
     _impl->SetCallUp( new TCallUp_i(this));
@@ -3492,7 +3487,7 @@ void SMESH_Mesh_i::SetImpl(::SMESH_Mesh * impl)
 
 ::SMESH_Mesh & SMESH_Mesh_i::GetImpl()
 {
-  if(MYDEBUG) MESSAGE("SMESH_Mesh_i::GetImpl()");
+  MESSAGE("SMESH_Mesh_i::GetImpl()");
   return *_impl;
 }
 
@@ -3797,27 +3792,6 @@ CORBA::LongLong SMESH_Mesh_i::ExportMEDCoupling(CORBA::Boolean auto_groups, CORB
   return reinterpret_cast<CORBA::LongLong>(ret);
 }
 
-//================================================================================
-/*!
- * \brief Export a mesh to a SAUV file
- */
-//================================================================================
-
-void SMESH_Mesh_i::ExportSAUV( const char* file, CORBA::Boolean auto_groups )
-{
-  SMESH_TRY;
-  if ( _preMeshInfo )
-    _preMeshInfo->FullLoadFromFile();
-
-  string aMeshName = prepareMeshNameAndGroups(file, true);
-  TPythonDump() << SMESH::SMESH_Mesh_var( _this())
-                << ".ExportSAUV( r'" << file << "', " << auto_groups << " )";
-  _impl->ExportSAUV(file, aMeshName.c_str(), auto_groups);
-
-  SMESH_CATCH( SMESH::throwCorbaException );
-}
-
-
 //================================================================================
 /*!
  * \brief Export a mesh to a DAT file
@@ -3859,7 +3833,7 @@ void SMESH_Mesh_i::ExportUNV (const char *file, CORBA::Boolean renumber)
   checkGroupNames();
   // Update Python script
   TPythonDump() << SMESH::SMESH_Mesh_var(_this())
-                << ".ExportUNV( r'" << file << "' " << renumber << "' )";
+                << ".ExportUNV( r'" << file << "', " << renumber << " )";
 
   // Perform Export
   PrepareForWriting( file );
@@ -4079,6 +4053,55 @@ void SMESH_Mesh_i::ExportPartToMED(SMESH::SMESH_IDSource_ptr meshPart,
   SMESH_CATCH( SMESH::throwCorbaException );
 }
 
+//================================================================================
+/*!
+ * \brief Export a part of mesh to a file with meshio library
+ */
+//================================================================================
+
+void SMESH_Mesh_i::ExportPartToMESHIO(SMESH::SMESH_IDSource_ptr meshPart,
+                                      const char*               file,
+                                      const char*               selectedFilter)
+{
+  // Get default MED version
+  SMESH::long_array_var medVersions = GetMEDVersionsCompatibleForAppend();
+  const CORBA::Long version = medVersions[0];
+  MESSAGE("Export part with meshio through MED version: " << version);
+
+  // Default values are the same as for MED export
+  const bool auto_groups = false;
+  const bool overwrite = true;
+  const bool autoDimension = true;
+  const GEOM::ListOfFields fields;
+  const char* geomAssocFields = "";
+  const double ZTolerance = -1.0;
+  const bool saveNumbers = true;
+
+  // Create an object that holds a temp file name and
+  // removes the file when goes out of scope.
+  SMESH_Meshio meshio(selectedFilter);
+  const QString tempFileName = meshio.CreateTempFileName(file);
+
+  // Export a given mesh into the temp file
+  MEDFileSpeCls spe(tempFileName.toUtf8().data(), overwrite, version);
+  this->ExportPartToMEDCommon(spe, meshPart, auto_groups, autoDimension, fields,
+                               geomAssocFields, ZTolerance, saveNumbers);
+
+  // Convert temp file into a target one with meshio command
+  meshio.Convert(tempFileName, file);
+
+  // Prepare python dump
+  SMESH_TRY;
+
+  TPythonDump() << _this() << ".ExportPartToMESHIO("
+                << meshPart << ", r'"
+                << file << "', '"
+                << selectedFilter << "'"
+                << ")";
+
+  SMESH_CATCH(SMESH::throwCorbaException);
+}
+
 //================================================================================
 
 class MEDFileMemSpeCls
@@ -5208,7 +5231,7 @@ CORBA::LongLong SMESH_Mesh_i::GetMeshPtr()
     _preMeshInfo->FullLoadFromFile();
 
   CORBA::LongLong pointeur = CORBA::LongLong(_impl);
-  if ( MYDEBUG ) MESSAGE("CORBA::LongLong SMESH_Mesh_i::GetMeshPtr() "<<pointeur);
+  MESSAGE("CORBA::LongLong SMESH_Mesh_i::GetMeshPtr() "<<pointeur);
   return pointeur;
 }
 
@@ -5950,8 +5973,7 @@ void SMESH_Mesh_i::CreateGroupServants()
 
     // register CORBA object for persistence
     int nextId = _gen_i->RegisterObject( groupVar );
-    if(MYDEBUG) { MESSAGE( "Add group to map with id = "<< nextId); }
-    else        { (void)nextId; } // avoid "unused variable" warning in release mode
+    MESSAGE( "Add group to map with id = "<< nextId);
 
     // publishing the groups in the study
     GEOM::GEOM_Object_var shapeVar = _gen_i->ShapeToGeomObject( shape );
@@ -5982,7 +6004,7 @@ void SMESH_Mesh_i::CreateGroupServants()
  */
 //=============================================================================
 
-bool SMESH_Mesh_i::IsComputedOK()
+CORBA::Boolean SMESH_Mesh_i::IsComputedOK()
 {
   return _impl->IsComputedOK();
 }
@@ -6189,8 +6211,8 @@ SMESH::SMESH_Mesh_ptr SMESH_Mesh_i::GetMesh()
 /*!
  * \brief Return false if GetMeshInfo() return incorrect information that may
  *        happen if mesh data is not yet fully loaded from the file of study.
- * 
- * 
+ *
+ *
  */
 //================================================================================
 
@@ -7056,6 +7078,7 @@ TListOfListOfInt SMESH_Mesh_i::findConcurrentSubMeshes()
   return res;
 }
 
+
 //=============================================================================
 /*!
  * \brief Convert submesh ids into submesh interfaces
@@ -7248,7 +7271,7 @@ smIdType SMESH_MeshPartDS::MinNodeID() const
 {
   if ( _meshDS ) return _meshDS->MinNodeID();
   return NbNodes() == 0 ? 0 : (*_elements[ SMDSAbs_Node ].begin())->GetID();
-}  
+}
 // -------------------------------------------------------------------------------------
 smIdType SMESH_MeshPartDS::MaxElementID() const
 {