]> SALOME platform Git repositories - modules/smesh.git/blobdiff - src/SMESH_I/SMESH_Mesh_i.cxx
Salome HOME
ILMAB: export GEOM fields to MED file
[modules/smesh.git] / src / SMESH_I / SMESH_Mesh_i.cxx
index ee7160486460717571ee521be25f589dd2f4f8f9..f2e1ca4c83c1494ddf71d2d2d2e78f79b2963c10 100644 (file)
@@ -1709,6 +1709,9 @@ void SMESH_Mesh_i::addGeomGroupData(GEOM::GEOM_Object_ptr theGeomObj,
     groupData._indices.insert( ids[i] );
   // SMESH object
   groupData._smeshObject = CORBA::Object::_duplicate( theSmeshObj );
+  // shape index in SMESHDS
+  // TopoDS_Shape shape = _gen_i->GeomObjectToShape( theGeomObj );
+  // groupData._dsID = shape.IsNull() ? 0 : _impl->GetSubMesh( shape )->GetId();
 }
 
 //================================================================================
@@ -1824,13 +1827,12 @@ void SMESH_Mesh_i::CheckGeomModif()
   GEOM::GEOM_Object_var mainGO = _gen_i->ShapeToGeomObject( _impl->GetShapeToMesh() );
   if ( mainGO->_is_nil() ) return;
 
-  if ( mainGO->GetType() == GEOM_GROUP )
+  if ( mainGO->GetType() == GEOM_GROUP ||
+       mainGO->GetTick() == _mainShapeTick )
   {
     CheckGeomGroupModif();
     return;
   }
-  if ( mainGO->GetTick() == _mainShapeTick )
-    return;
 
   GEOM_Client* geomClient = _gen_i->GetShapeReader();
   if ( !geomClient ) return;
@@ -1841,7 +1843,7 @@ void SMESH_Mesh_i::CheckGeomModif()
   geomClient->RemoveShapeFromBuffer( ior.in() );
 
   // Update data taking into account that
-  // all sub-shapes change but IDs of sub-shapes remain
+  // all sub-shapes change but IDs of sub-shapes remain (except for geom groups)
 
   _impl->Clear();
   TopoDS_Shape newShape = _gen_i->GeomObjectToShape( mainGO );
@@ -1879,9 +1881,31 @@ void SMESH_Mesh_i::CheckGeomModif()
   }
 
   // change shape to mesh
+  int oldNbSubShapes = meshDS->MaxShapeIndex();
   _impl->ShapeToMesh( TopoDS_Shape() );
   _impl->ShapeToMesh( newShape );
 
+  // re-add shapes of geom groups
+  list<TGeomGroupData>::iterator data = _geomGroupData.begin();
+  for ( ; data != _geomGroupData.end(); ++data )
+  {
+    TopoDS_Shape newShape = newGroupShape( *data );
+    if ( !newShape.IsNull() )
+    {
+      if ( meshDS->ShapeToIndex( newShape ) > 0 ) // a group reduced to one sub-shape
+      {
+        TopoDS_Compound compound;
+        BRep_Builder().MakeCompound( compound );
+        BRep_Builder().Add( compound, newShape );
+        newShape = compound;
+      }
+      _impl->GetSubMesh( newShape );
+    }
+  }
+  if ( oldNbSubShapes != meshDS->MaxShapeIndex() )
+    THROW_SALOME_CORBA_EXCEPTION( "SMESH_Mesh_i::CheckGeomModif() bug",
+                                  SALOME::INTERNAL_ERROR );
+
   // re-assign hypotheses
   for ( size_t i = 0; i < ids2Hyps.size(); ++i )
   {
@@ -1912,8 +1936,11 @@ void SMESH_Mesh_i::CheckGeomModif()
     }
     else
     {
-      gr_i->changeLocalId( id );
       g->GetGroupDS()->SetColor( data._color );
+      gr_i->changeLocalId( id );
+      _mapGroups[ id ] = i2g->second;
+      if ( data._oldID != id )
+        _mapGroups.erase( i2g );
     }
   }
 
@@ -3043,7 +3070,7 @@ void SMESH_Mesh_i::ExportPartToMED(SMESH::SMESH_IDSource_ptr meshPart,
   {
     aMeshName = prepareMeshNameAndGroups(file, overwrite);
     _impl->ExportMED( file, aMeshName.c_str(), auto_groups,
-                      version, 0, autoDimension, have0dField);
+                      version, 0, autoDimension, /*addODOnVertices=*/have0dField);
     meshDS = _impl->GetMeshDS();
   }
   else
@@ -3063,7 +3090,7 @@ void SMESH_Mesh_i::ExportPartToMED(SMESH::SMESH_IDSource_ptr meshPart,
     }
     SMESH_MeshPartDS* partDS = new SMESH_MeshPartDS( meshPart );
     _impl->ExportMED( file, aMeshName.c_str(), auto_groups,
-                      version, partDS, autoDimension, have0dField);
+                      version, partDS, autoDimension, /*addODOnVertices=*/have0dField);
     meshDS = tmpDSDeleter._obj = partDS;
   }
 
@@ -3149,7 +3176,7 @@ void SMESH_Mesh_i::exportMEDFields( DriverMED_W_Field&        fieldWriter,
                            name.in(),
                            elemType,
                            comps->length(),
-                           ( dataType == GEOM::FDT_Int )))
+                           /*isIntData=*/false ))//( dataType == GEOM::FDT_Int )))
       continue;
 
     for ( size_t iC = 0; iC < comps->length(); ++iC )
@@ -3236,9 +3263,9 @@ void SMESH_Mesh_i::exportMEDFields( DriverMED_W_Field&        fieldWriter,
           const SMDS_MeshElement* e = elemIt->next();
           const int shapeID = e->getshapeId();
           if ( shapeID < 1 || shapeID >= intVals.size() )
-            fieldWriter.AddValue( noneIntValue );
+            fieldWriter.AddValue( (double) noneIntValue );
           else
-            fieldWriter.AddValue( intVals[ shapeID ]);
+            fieldWriter.AddValue( (double) intVals[ shapeID ]);
         }
 
       // write a step
@@ -3276,17 +3303,17 @@ void SMESH_Mesh_i::exportMEDFields( DriverMED_W_Field&        fieldWriter,
     std::vector< std::string > compNames;
     switch ( geomAssocFields[ iF ]) {
     case 'v': case 'V':
-      fieldWriter.Set( meshDS, "_vertices_", SMDSAbs_Node, /*nbComps=*/2, /*isInt=*/true );
+      fieldWriter.Set( meshDS, "_vertices_", SMDSAbs_Node, /*nbComps=*/2, /*isInt=*/false );
       compNames.push_back( "dim" );
       break;
     case 'e': case 'E':
-      fieldWriter.Set( meshDS, "_edges_", SMDSAbs_Edge, /*nbComps=*/1, /*isInt=*/true );
+      fieldWriter.Set( meshDS, "_edges_", SMDSAbs_Edge, /*nbComps=*/1, /*isInt=*/false );
       break;
     case 'f': case 'F':
-      fieldWriter.Set( meshDS, "_faces_", SMDSAbs_Face, /*nbComps=*/1, /*isInt=*/true );
+      fieldWriter.Set( meshDS, "_faces_", SMDSAbs_Face, /*nbComps=*/1, /*isInt=*/false );
       break;
     case 's': case 'S':
-      fieldWriter.Set( meshDS, "_solids_", SMDSAbs_Volume, /*nbComps=*/1, /*isInt=*/true );
+      fieldWriter.Set( meshDS, "_solids_", SMDSAbs_Volume, /*nbComps=*/1, /*isInt=*/false );
       break;
     default: continue;
     }
@@ -3307,14 +3334,14 @@ void SMESH_Mesh_i::exportMEDFields( DriverMED_W_Field&        fieldWriter,
         const int shapeID = e->getshapeId();
         if ( shapeID < 1 )
         {
-          fieldWriter.AddValue( -1 );
-          fieldWriter.AddValue( -1 );
+          fieldWriter.AddValue( (double) -1 );
+          fieldWriter.AddValue( (double) -1 );
         }
         else
         {
           const TopoDS_Shape& S = meshDS->IndexToShape( shapeID );
-          fieldWriter.AddValue( S.IsNull() ? -1 : shapeDim[ S.ShapeType() ]);
-          fieldWriter.AddValue( shapeID );
+          fieldWriter.AddValue( (double) ( S.IsNull() ? -1 : shapeDim[ S.ShapeType() ]));
+          fieldWriter.AddValue( (double) shapeID );
         }
       }
     else
@@ -3323,9 +3350,9 @@ void SMESH_Mesh_i::exportMEDFields( DriverMED_W_Field&        fieldWriter,
         const SMDS_MeshElement* e = elemIt->next();
         const int shapeID = e->getshapeId();
         if ( shapeID < 1 )
-          fieldWriter.AddValue( -1 );
+          fieldWriter.AddValue( (double) -1 );
         else
-          fieldWriter.AddValue( shapeID );
+          fieldWriter.AddValue( (double) shapeID );
       }
 
     // write a step