Salome HOME
NRI : First integration.
[modules/smesh.git] / src / SMESH_I / SMESH_MEDMesh_i.cxx
diff --git a/src/SMESH_I/SMESH_MEDMesh_i.cxx b/src/SMESH_I/SMESH_MEDMesh_i.cxx
new file mode 100644 (file)
index 0000000..23fb01f
--- /dev/null
@@ -0,0 +1,1018 @@
+using namespace std;
+//=============================================================================
+// File      : SMESH_MEDMesh_i.cxx
+// Project   : SALOME
+// Copyright : EDF 2001
+//=============================================================================
+
+#include "SMESH_MEDMesh_i.hxx"
+#include "SMESH_Mesh_i.hxx"
+
+#include "SMESHDS_Mesh.hxx"
+#include "SMESHDS_SubMesh.hxx"
+
+#include "SMDS_MapIteratorOfExtendedMap.hxx"
+#include "SMDS_MapOfMeshElement.hxx"
+
+#include <TopExp.hxx>
+#include <TopExp_Explorer.hxx>
+#include <TopoDS.hxx>
+#include <TopoDS_Iterator.hxx>
+#include <TopoDS_Compound.hxx>
+#include <TopoDS_CompSolid.hxx>
+#include <TopoDS_Solid.hxx>
+#include <TopoDS_Shell.hxx>
+#include <TopoDS_Face.hxx>
+#include <TopoDS_Wire.hxx>
+#include <TopoDS_Edge.hxx>
+#include <TopoDS_Vertex.hxx>
+#include <TopoDS_Shape.hxx>
+#include <TopTools_MapOfShape.hxx>
+
+#include "utilities.h"
+#include "Utils_CorbaException.hxx"
+
+#include "SMESH_MEDSupport_i.hxx"
+#include "SMESH_MEDFamily_i.hxx"
+
+# include "Utils_ORB_INIT.hxx"
+# include "Utils_SINGLETON.hxx"
+extern "C"
+{
+#include <stdio.h>
+}
+
+
+//=============================================================================
+/*!
+ * Default constructor
+ */
+//=============================================================================
+// PN Est-ce un const ?
+SMESH_MEDMesh_i::SMESH_MEDMesh_i()
+{
+  BEGIN_OF("Default Constructor SMESH_MEDMesh_i");
+  END_OF("Default Constructor SMESH_MEDMesh_i");
+}
+//=============================================================================
+/*!
+ * Destructor
+ */
+//=============================================================================
+SMESH_MEDMesh_i::~SMESH_MEDMesh_i()
+{
+}
+//=============================================================================
+/*!
+ * Constructor
+ */
+//=============================================================================
+SMESH_MEDMesh_i::SMESH_MEDMesh_i( ::SMESH_Mesh_i* m_i ) :_meshId(""),
+                                                        _compte(false),
+                                                        _creeFamily(false),
+                                                        _famIdent(0),
+                                                        _indexElts(0), 
+                                                        _indexEnts(0) 
+{
+  _mesh_i = m_i;
+  _meshDS = _mesh_i->GetImpl().GetMeshDS();
+
+  BEGIN_OF("Constructor SMESH_MEDMesh_i");
+  END_OF("Constructor SMESH_MEDMesh_i");
+}
+
+//=============================================================================
+/*!
+ * CORBA: Accessor for Name
+ */
+//=============================================================================
+char * SMESH_MEDMesh_i::getName()      
+  throw (SALOME::SALOME_Exception)
+{
+  if (_meshDS == NULL)
+    THROW_SALOME_CORBA_EXCEPTION("No associated Mesh", \
+                                SALOME::INTERNAL_ERROR);
+
+  try
+    {
+      // A COMPLETER PAR LE NOM DU MAILLAGE
+      //return CORBA::string_dup(_mesh_i->getName().c_str());
+      return CORBA::string_dup("toto");
+    }
+  catch(...)
+    {
+      MESSAGE("Exception en accedant au nom");
+      THROW_SALOME_CORBA_EXCEPTION("Unable to acces Mesh C++ Object"\
+                                  ,SALOME::INTERNAL_ERROR);
+    }
+}
+//=============================================================================
+/*!
+ * CORBA: Accessor for corbaindex cuisine interne 
+ */
+//=============================================================================
+CORBA::Long SMESH_MEDMesh_i::getCorbaIndex() 
+  throw (SALOME::SALOME_Exception)
+{
+  MESSAGE("Non Implemente");
+  THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method"\
+                              ,SALOME::BAD_PARAM);
+}
+//=============================================================================
+/*!
+ * CORBA: Accessor for Space Dimension
+ */
+//=============================================================================
+CORBA::Long SMESH_MEDMesh_i::getSpaceDimension() 
+  throw (SALOME::SALOME_Exception)
+{
+  // PN : Il semblerait que la dimension soit fixee a 3
+  if (_mesh_i == 0)
+    THROW_SALOME_CORBA_EXCEPTION("No associated Mesh", \
+                                SALOME::INTERNAL_ERROR);
+  return 3;
+}
+//=============================================================================
+/*!
+ * CORBA: Accessor for Mesh Dimension
+ */
+//=============================================================================
+CORBA::Long SMESH_MEDMesh_i::getMeshDimension()
+  throw (SALOME::SALOME_Exception)
+{
+  if (_mesh_i == 0)
+    THROW_SALOME_CORBA_EXCEPTION("No associated Mesh", \
+                                SALOME::INTERNAL_ERROR);
+  // PN : Il semblerait que la dimension soit fixee a 3
+  if (_mesh_i == 0)
+    THROW_SALOME_CORBA_EXCEPTION("No associated Mesh", \
+                                SALOME::INTERNAL_ERROR);
+  return 3;
+}
+//=============================================================================
+/*!
+ * CORBA: Accessor for Coordinates System
+ */
+//=============================================================================
+char * SMESH_MEDMesh_i::getCoordinateSystem()
+  throw (SALOME::SALOME_Exception)
+{
+  if (_mesh_i == 0)
+    THROW_SALOME_CORBA_EXCEPTION("No associated Mesh", \
+                                SALOME::INTERNAL_ERROR);
+  // PN : En dur. Non encore prevu
+  try
+    {
+      string systcoo="CARTESIEN";
+      return CORBA::string_dup(systcoo.c_str());
+    }
+  catch(...)
+    {
+      MESSAGE("Exception en accedant au maillage");
+      THROW_SALOME_CORBA_EXCEPTION("Unable to acces Mesh C++ Object"\
+                                  ,SALOME::INTERNAL_ERROR);
+    }
+}
+//=============================================================================
+/*!
+ * CORBA: Accessor for Coordinates
+ */
+//=============================================================================
+Engines::double_array * SMESH_MEDMesh_i::getCoordinates(SALOME_MED::medModeSwitch typeSwitch)
+  throw (SALOME::SALOME_Exception)
+{
+  if (_mesh_i == 0)
+    THROW_SALOME_CORBA_EXCEPTION("No associated Mesh", \
+                                SALOME::INTERNAL_ERROR);
+  Engines::double_array_var myseq = new Engines::double_array;
+  try
+    {
+      // PN  : En dur
+      int spaceDimension=3;
+      int nbNodes=_meshDS->NbNodes();
+      SCRUTE(nbNodes);
+      myseq->length(nbNodes*spaceDimension);
+      int i = 0;
+      SMDS_MeshNodesIterator itNodes(_meshDS);
+      for (;itNodes.More();itNodes.Next()) 
+       {
+
+         const Handle(SMDS_MeshElement)& elem = itNodes.Value();
+         const Handle(SMDS_MeshNode)& node =_meshDS->GetNode(1,elem);
+
+         if (typeSwitch == SALOME_MED::MED_FULL_INTERLACE)
+           {
+             myseq[i*3]=node->X();
+             myseq[i*3+1]=node->Y();
+             myseq[i*3+2]=node->Z();
+             SCRUTE(myseq[i*3]);
+             SCRUTE(myseq[i*3+1]);
+             SCRUTE(myseq[i*3+2]);
+           }
+         else
+           {
+             ASSERT(typeSwitch == SALOME_MED::MED_NO_INTERLACE);
+             myseq[i]=node->X();
+             myseq[i+nbNodes]=node->Y();
+             myseq[i+(nbNodes*2)]=node->Z();
+             SCRUTE(myseq[i]);
+             SCRUTE(myseq[i+nbNodes]);
+             SCRUTE(myseq[i+(nbNodes*2)]);
+           }
+         i++;
+       }
+    }
+  catch(...)
+    {       
+      MESSAGE("Exception en accedant aux coordonnees");
+      THROW_SALOME_CORBA_EXCEPTION("Unable to acces Mesh C++ Object"\
+                                  ,SALOME::INTERNAL_ERROR);
+    }
+  return myseq._retn();
+}
+//=============================================================================
+/*!
+ * CORBA: Accessor for Coordinates Names
+ */
+//=============================================================================
+Engines::string_array  * SMESH_MEDMesh_i::getCoordinatesNames() 
+  throw (SALOME::SALOME_Exception)
+{
+  if (_mesh_i == 0)
+    THROW_SALOME_CORBA_EXCEPTION("No associated Mesh", \
+                                SALOME::INTERNAL_ERROR);
+  Engines::string_array_var myseq = new Engines::string_array;
+  try
+    {
+      // PN : en dur
+      int spaceDimension=3;
+      myseq->length(spaceDimension);
+      myseq[0]=CORBA::string_dup("x");
+      myseq[1]=CORBA::string_dup("y");
+      myseq[2]=CORBA::string_dup("z");
+    }
+  catch(...)
+    {       
+      MESSAGE("Exception en accedant aux noms des coordonnees");
+      THROW_SALOME_CORBA_EXCEPTION("Unable to acces Mesh C++ Object"\
+                                  ,SALOME::INTERNAL_ERROR);
+    }
+  return myseq._retn();
+
+}
+//=============================================================================
+/*!
+ * CORBA: Accessor for Coordinates Units
+ */
+//=============================================================================
+Engines::string_array *  SMESH_MEDMesh_i::getCoordinatesUnits()
+  throw (SALOME::SALOME_Exception)
+{
+  if (_mesh_i == 0)
+    THROW_SALOME_CORBA_EXCEPTION("No associated Mesh", \
+                                SALOME::INTERNAL_ERROR);
+  Engines::string_array_var myseq = new Engines::string_array;
+  try
+    {
+      // PN : en dur
+      int spaceDimension=3;
+      myseq->length(spaceDimension);
+      myseq[0]=CORBA::string_dup("m");
+      myseq[1]=CORBA::string_dup("m");
+      myseq[2]=CORBA::string_dup("m");
+    }
+  catch(...)
+    {       
+      MESSAGE("Exception en accedant aux unites des coordonnees");
+      THROW_SALOME_CORBA_EXCEPTION("Unable to acces Mesh C++ Object"\
+                                  ,SALOME::INTERNAL_ERROR);
+    }
+  return myseq._retn();
+}
+//=============================================================================
+/*!
+ * CORBA: Accessor for Number of Nodes
+ */
+//=============================================================================
+CORBA::Long  SMESH_MEDMesh_i::getNumberOfNodes() 
+  throw (SALOME::SALOME_Exception)
+{
+  if (_mesh_i == 0)
+    THROW_SALOME_CORBA_EXCEPTION("No associated Mesh", \
+                                SALOME::INTERNAL_ERROR);
+  try
+    {
+      return _meshDS->NbNodes();
+    }
+  catch(...)
+    {       
+      MESSAGE("Exception en accedant au nombre de noeuds");
+      THROW_SALOME_CORBA_EXCEPTION("Unable to acces Mesh C++ Object"\
+                                  ,SALOME::INTERNAL_ERROR);
+    }
+}
+//=============================================================================
+/*!
+ * CORBA: Accessor for number of Types
+ */
+//=============================================================================
+CORBA::Long SMESH_MEDMesh_i::getNumberOfTypes(SALOME_MED::medEntityMesh entity) 
+  throw (SALOME::SALOME_Exception)
+{
+  if (_mesh_i == 0)
+    THROW_SALOME_CORBA_EXCEPTION("No associated Mesh", \
+                                SALOME::INTERNAL_ERROR);
+  try
+    {
+      if (! _compte)
+       calculeNbElts();
+      int retour = 0; 
+      if ( _mapNbTypes.find(entity)!=_mapNbTypes.end())
+       retour=_mapNbTypes[entity];
+      return retour;
+    }
+  catch(...)
+    {       
+      MESSAGE("Exception en accedant au nombre de Types");
+      THROW_SALOME_CORBA_EXCEPTION("Unable to acces Mesh C++ Object"\
+                                  ,SALOME::INTERNAL_ERROR);
+    }
+}
+
+//=============================================================================
+/*!
+ * CORBA: Accessor for existing geometry element types 
+ *       Not implemented for MED_ALL_ENTITIES
+ */
+//=============================================================================
+SALOME_MED::medGeometryElement_array * SMESH_MEDMesh_i::getTypes (SALOME_MED::medEntityMesh entity) 
+  throw (SALOME::SALOME_Exception)
+{
+  if (_mesh_i == 0)
+    THROW_SALOME_CORBA_EXCEPTION("No associated Mesh", \
+                                SALOME::INTERNAL_ERROR);
+  if (entity ==SALOME_MED::MED_ALL_ENTITIES)
+    THROW_SALOME_CORBA_EXCEPTION("Not implemented for MED_ALL_ENTITIES",\
+                                SALOME::BAD_PARAM);
+  if (! _compte)
+    calculeNbElts();
+  SALOME_MED::medGeometryElement_array_var myseq = 
+    new SALOME_MED::medGeometryElement_array;
+  try
+    {
+      if ( _mapNbTypes.find(entity) ==_mapNbTypes.end())
+       THROW_SALOME_CORBA_EXCEPTION("No Such Entity in the mesh"\
+                                    ,SALOME::BAD_PARAM);
+      int nbTypes=_mapNbTypes[entity];
+
+      myseq->length(nbTypes);
+               
+      if ( _mapIndToVectTypes.find(entity) ==_mapIndToVectTypes.end())
+       THROW_SALOME_CORBA_EXCEPTION("No Such Entity in the mesh"\
+                                    ,SALOME::INTERNAL_ERROR);
+
+      int index=_mapIndToVectTypes[entity];
+      ASSERT( _TypesId[index].size()!=0);
+      int i=0;
+      vector<SALOME_MED::medGeometryElement>::iterator it;
+      for (it=_TypesId[index].begin();it!=_TypesId[index].end();it++)
+       {
+         myseq[i++]=*it;
+       };
+    }
+  catch(...)
+    {       
+      MESSAGE("Exception en accedant aux differents types");
+      THROW_SALOME_CORBA_EXCEPTION("Unable to acces Mesh C++ Object"\
+                                  ,SALOME::INTERNAL_ERROR);
+    }
+  return myseq._retn();
+}
+//=============================================================================
+/*!
+ * CORBA: Returns number of elements of type medGeometryElement
+ *       Not implemented for MED_ALL_ELEMENTS 
+ *       implemented for MED_ALL_ENTITIES
+ *
+ * Dans cette implementation, il n est pas prevu de tenir compte du entity
+ * qui ne doit pas pouvoir avoir deux valeurs differentes pour un geomElement 
+ */
+//=============================================================================
+CORBA::Long SMESH_MEDMesh_i::getNumberOfElements(SALOME_MED::medEntityMesh entity, 
+                                                SALOME_MED::medGeometryElement geomElement)
+  throw (SALOME::SALOME_Exception)
+{
+  if (_mesh_i == 0)
+    THROW_SALOME_CORBA_EXCEPTION("No associated Mesh", \
+                                SALOME::INTERNAL_ERROR);
+  if (geomElement == SALOME_MED::MED_ALL_ELEMENTS)
+    THROW_SALOME_CORBA_EXCEPTION("Not implemented for MED_ALL_ELEMENTS", \
+                                SALOME::BAD_PARAM);
+  if (! _compte)
+    calculeNbElts();
+
+  try
+    {
+      int retour = 0; 
+      if ( _mapIndToSeqElts.find(geomElement)!=_mapIndToSeqElts.end())
+       { 
+         int index = _mapIndToSeqElts[geomElement];
+         retour=_seq_elemId[index]->length();
+       }
+      return retour;
+    }
+  catch(...)
+    {
+      MESSAGE("Exception en accedant au nombre d élements");
+      THROW_SALOME_CORBA_EXCEPTION("Unable to acces Mesh C++ Object"\
+                                  ,SALOME::INTERNAL_ERROR);
+    }
+}
+//=============================================================================
+/*!
+ * CORBA: Accessor for connectivities
+ */
+//=============================================================================
+Engines::long_array *  SMESH_MEDMesh_i::getConnectivity(SALOME_MED::medModeSwitch typeSwitch,
+                                                       SALOME_MED::medConnectivity mode, 
+                                                       SALOME_MED::medEntityMesh entity, 
+                                                       SALOME_MED::medGeometryElement geomElement)
+  throw (SALOME::SALOME_Exception)
+{
+  if (_mesh_i == 0)
+    THROW_SALOME_CORBA_EXCEPTION("No associated Mesh", \
+                                SALOME::INTERNAL_ERROR);
+  if (mode != SALOME_MED::MED_NODAL)
+    THROW_SALOME_CORBA_EXCEPTION("Not Implemented",\
+                                SALOME::BAD_PARAM);
+  if (typeSwitch == SALOME_MED::MED_NO_INTERLACE)
+    THROW_SALOME_CORBA_EXCEPTION("Not Yet Implemented",\
+                                SALOME::BAD_PARAM);
+  if (! _compte)
+    calculeNbElts();
+
+  // Faut-il renvoyer un pointeur vide ???
+  if ( _mapIndToSeqElts.find(geomElement)!=_mapIndToSeqElts.end())
+    THROW_SALOME_CORBA_EXCEPTION("No Such Element in the mesh"\
+                                ,SALOME::BAD_PARAM);
+
+  int index=_mapIndToSeqElts[geomElement];
+  return _seq_elemId[index]._retn();
+}
+//=============================================================================
+/*!
+ * CORBA: Accessor for connectivities
+ */
+//=============================================================================
+Engines::long_array* SMESH_MEDMesh_i::getConnectivityIndex(SALOME_MED::medConnectivity mode, 
+                                                          SALOME_MED::medEntityMesh entity) 
+  throw (SALOME::SALOME_Exception)
+{
+  MESSAGE("Pas Implemente dans SMESH");
+  THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method"\
+                              ,SALOME::BAD_PARAM);
+  return 0;
+}
+//=============================================================================
+/*!
+ * CORBA: Find an element corresponding to the given connectivity
+ */
+//=============================================================================
+CORBA::Long SMESH_MEDMesh_i::getElementNumber(SALOME_MED::medConnectivity mode,
+                                             SALOME_MED::medEntityMesh entity,
+                                             SALOME_MED::medGeometryElement type,
+                                             const Engines::long_array & connectivity
+) 
+  throw (SALOME::SALOME_Exception)
+{
+  const char * LOC = "getElementNumber ";
+  MESSAGE(LOC<<"Pas Implemente dans SMESH");
+  THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method"\
+                              ,SALOME::BAD_PARAM);
+  return -1;
+}
+//=============================================================================
+/*!
+ * CORBA: Accessor for Ascendant connectivities
+ * not implemented for MED_ALL_ENTITIES and MED_MAILLE
+ */
+//=============================================================================
+Engines::long_array* SMESH_MEDMesh_i::getReverseConnectivity(SALOME_MED::medConnectivity mode)
+  throw (SALOME::SALOME_Exception)
+{
+  MESSAGE("Pas Implemente dans SMESH");
+  THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method"\
+                              ,SALOME::BAD_PARAM);
+  return 0;
+}
+//=============================================================================
+/*!
+ * CORBA: Accessor for connectivities
+ */
+//=============================================================================
+Engines::long_array* SMESH_MEDMesh_i::getReverseConnectivityIndex(SALOME_MED::medConnectivity mode)
+  throw (SALOME::SALOME_Exception)
+{
+  MESSAGE("Pas Implemente dans SMESH");
+  THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method"\
+                              ,SALOME::BAD_PARAM);
+  return 0;
+}
+//=============================================================================
+/*!
+ * CORBA: Returns number of families within the mesh
+ */
+//=============================================================================
+CORBA::Long SMESH_MEDMesh_i::getNumberOfFamilies(SALOME_MED::medEntityMesh entity)
+  throw (SALOME::SALOME_Exception)
+{
+  if (_creeFamily == false)
+    createFamilies();
+  if (_mesh_i == 0)
+    THROW_SALOME_CORBA_EXCEPTION("No associated Mesh", \
+                                SALOME::INTERNAL_ERROR);
+  return _families.size();
+}
+//=============================================================================
+/*!
+ * CORBA: Returns number of groups within the mesh
+ */
+//=============================================================================
+CORBA::Long SMESH_MEDMesh_i::getNumberOfGroups(SALOME_MED::medEntityMesh entity) 
+  throw (SALOME::SALOME_Exception)
+{
+  if (_mesh_i == 0)
+    THROW_SALOME_CORBA_EXCEPTION("No associated Mesh", \
+                                SALOME::INTERNAL_ERROR);
+  MESSAGE(" Pas d implementation des groupes dans SMESH");
+  return 0;
+}
+//=============================================================================
+/*!
+ * CORBA: Returns references for families within the mesh
+ */
+//=============================================================================
+SALOME_MED::Family_array * SMESH_MEDMesh_i::getFamilies(SALOME_MED::medEntityMesh entity) 
+  throw (SALOME::SALOME_Exception)
+{
+  if (_creeFamily == false)
+    createFamilies();
+  if (_mesh_i == 0)
+    THROW_SALOME_CORBA_EXCEPTION("No associated Mesh", \
+                                SALOME::INTERNAL_ERROR);
+  SALOME_MED::Family_array_var myseq = new SALOME_MED::Family_array;
+  int nbfam= _families.size();
+  myseq->length(nbfam);
+  int i = 0;
+  vector<SALOME_MED::FAMILY_ptr>::iterator it;
+  for (it=_families.begin();it!=_families.end();it++)
+    {
+      myseq[i++]=*it;
+    };
+  return myseq._retn();
+}
+//=============================================================================
+/*!
+ * CORBA: Returns references for family i within the mesh
+ */
+//=============================================================================
+SALOME_MED::FAMILY_ptr SMESH_MEDMesh_i::getFamily(SALOME_MED::medEntityMesh entity,
+                                                 CORBA::Long i) 
+  throw (SALOME::SALOME_Exception)
+{
+  if (_creeFamily == false)
+    createFamilies();
+  if (_mesh_i == 0)
+    THROW_SALOME_CORBA_EXCEPTION("No associated Mesh", \
+                                SALOME::INTERNAL_ERROR);
+
+  SCRUTE(_families[i]->getName());
+  MESSAGE ( " SMESH_MEDMesh_i::getFamily " << i )
+  return _families[i];
+}
+//=============================================================================
+/*!
+ * CORBA: Returns references for groups within the mesh
+ */
+//=============================================================================
+SALOME_MED::Group_array *  SMESH_MEDMesh_i::getGroups(SALOME_MED::medEntityMesh entity) 
+  throw (SALOME::SALOME_Exception)
+{
+  if (_mesh_i == 0)
+    THROW_SALOME_CORBA_EXCEPTION("No associated Mesh", \
+                                SALOME::INTERNAL_ERROR);
+  MESSAGE(" Pas d implementation des groupes dans SMESH");
+  THROW_SALOME_CORBA_EXCEPTION("No group implementation"\
+                              ,SALOME::BAD_PARAM);
+}
+//=============================================================================
+/*!
+ * CORBA: Returns references for group i within the mesh
+ */
+//=============================================================================
+SALOME_MED::GROUP_ptr SMESH_MEDMesh_i::getGroup(SALOME_MED::medEntityMesh entity,
+                                               CORBA::Long i) 
+  throw (SALOME::SALOME_Exception)
+{
+  if (_mesh_i == 0)
+    THROW_SALOME_CORBA_EXCEPTION("No associated Mesh", \
+                                SALOME::INTERNAL_ERROR);
+  MESSAGE(" Pas d implementation des groupes dans SMESH");
+  THROW_SALOME_CORBA_EXCEPTION("No group implementation"\
+                              ,SALOME::BAD_PARAM);
+}
+//=============================================================================
+/*!
+ * CORBA: 
+ */
+//=============================================================================
+SALOME_MED::FIELD_ptr SMESH_MEDMesh_i::getVolume(SALOME_MED::SUPPORT_ptr mySupport)
+  throw (SALOME::SALOME_Exception)
+{
+  MESSAGE("Pas Implemente dans SMESH");
+  THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method"\
+                              ,SALOME::BAD_PARAM);
+  return 0;
+}
+//=============================================================================
+/*!
+ * CORBA: 
+ */
+//=============================================================================
+SALOME_MED::FIELD_ptr SMESH_MEDMesh_i::getArea(SALOME_MED::SUPPORT_ptr mySupport)
+  throw (SALOME::SALOME_Exception)
+{
+  MESSAGE("Pas Implemente dans SMESH");
+  THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method"\
+                              ,SALOME::BAD_PARAM);
+  return 0;
+}
+//=============================================================================
+/*!
+ * CORBA: 
+ */
+//=============================================================================
+SALOME_MED::FIELD_ptr SMESH_MEDMesh_i::getLength(SALOME_MED::SUPPORT_ptr mySupport)
+  throw (SALOME::SALOME_Exception)
+{
+  MESSAGE("Pas Implemente dans SMESH");
+  THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method"\
+                              ,SALOME::BAD_PARAM);
+  return 0;
+}
+//=============================================================================
+/*!
+ * CORBA: 
+ */
+//=============================================================================
+SALOME_MED::FIELD_ptr SMESH_MEDMesh_i::getNormal(SALOME_MED::SUPPORT_ptr mySupport)
+  throw (SALOME::SALOME_Exception)
+{
+  MESSAGE("Pas Implemente dans SMESH");
+  THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method"\
+                              ,SALOME::BAD_PARAM);
+  return 0;
+}
+//=============================================================================
+/*!
+ * CORBA: 
+ */
+//=============================================================================
+SALOME_MED::FIELD_ptr SMESH_MEDMesh_i::getBarycenter(SALOME_MED::SUPPORT_ptr mySupport)
+  throw (SALOME::SALOME_Exception)
+{
+  MESSAGE("Pas Implemente dans SMESH");
+  THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method"\
+                              ,SALOME::BAD_PARAM);
+  return 0;
+}
+//=============================================================================
+/*!
+ * CORBA: 
+ */
+//=============================================================================
+SALOME_MED::FIELD_ptr SMESH_MEDMesh_i::getNeighbourhood(SALOME_MED::SUPPORT_ptr mySupport)
+  throw (SALOME::SALOME_Exception)
+{
+  MESSAGE("Non Implemente");
+  THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method"\
+                              ,SALOME::BAD_PARAM);
+  return 0;
+}
+//=============================================================================
+/*!
+ * CORBA: add the Mesh in the StudyManager 
+ * PN Pas Implemente
+ */
+//=============================================================================
+void SMESH_MEDMesh_i::addInStudy(SALOMEDS::Study_ptr myStudy,
+                                SALOME_MED::MESH_ptr myIor)
+  throw (SALOME::SALOME_Exception)
+{
+  BEGIN_OF("MED_Mesh_i::addInStudy");
+  if ( _meshId != "" )
+    {
+      MESSAGE("Mesh already in Study");
+      THROW_SALOME_CORBA_EXCEPTION("Mesh already in Study", \
+                                  SALOME::BAD_PARAM);
+    };
+
+  /*
+    SALOMEDS::StudyBuilder_var myBuilder = myStudy->NewBuilder();
+
+    // Create SComponent labelled 'MED' if it doesn't already exit
+    SALOMEDS::SComponent_var medfather = myStudy->FindComponent("MED");
+    if ( CORBA::is_nil(medfather) ) 
+    {
+    MESSAGE("Add Component MED");
+    medfather = myBuilder->NewComponent("MED");
+    //myBuilder->AddAttribute (medfather,SALOMEDS::Name,"MED");
+    SALOMEDS::AttributeName_var aName = SALOMEDS::AttributeName::_narrow(
+                      myBuilder->FindOrCreateAttribute(medfather, "AttributeName"));
+    aName->SetValue("MED");
+
+    myBuilder->DefineComponentInstance(medfather,myIor);
+
+    } ;
+
+    MESSAGE("Add a mesh Object under MED");
+    myBuilder->NewCommand();
+    SALOMEDS::SObject_var newObj = myBuilder->NewObject(medfather);
+
+    ORB_INIT &init = *SINGLETON_<ORB_INIT>::Instance() ;
+    ASSERT(SINGLETON_<ORB_INIT>::IsAlreadyExisting()) ;
+    CORBA::ORB_var &orb = init(0,0);
+    string iorStr = orb->object_to_string(myIor);
+    //myBuilder->AddAttribute(newObj,SALOMEDS::IOR,iorStr.c_str());
+    SALOMEDS::AttributeIOR_var aIOR = SALOMEDS::AttributeIOR::_narrow(
+                      myBuilder->FindOrCreateAttribute(newObj, "AttributeIOR"));
+    aIOR->SetValue(iorStr.c_str());
+
+    //myBuilder->AddAttribute(newObj,SALOMEDS::Name,_mesh_i->getName().c_str());
+    SALOMEDS::AttributeName_var aName = SALOMEDS::AttributeName::_narrow(
+                      myBuilder->FindOrCreateAttribute(newObj, "AttributeName"));
+    aName->SetValue(_mesh_i->getName().c_str());
+
+    _meshId = newObj->GetID();
+    myBuilder->CommitCommand();
+
+  */
+  END_OF("Mesh_i::addInStudy(SALOMEDS::Study_ptr myStudy)");
+}
+//=============================================================================
+/*!
+ * CORBA: write mesh in a med file
+ */
+//=============================================================================
+void SMESH_MEDMesh_i::write(CORBA::Long i, const char* driverMeshName)              
+  throw (SALOME::SALOME_Exception)
+{
+  MESSAGE("Non Implemente");
+  THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method"\
+                              ,SALOME::BAD_PARAM);
+}
+//=============================================================================
+/*!
+ * CORBA: read mesh in a med file
+ */
+//=============================================================================
+void SMESH_MEDMesh_i::read(CORBA::Long i)           
+  throw (SALOME::SALOME_Exception)
+{
+  MESSAGE("Non Implemente");
+  THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method"\
+                              ,SALOME::BAD_PARAM);
+}
+//=============================================================================
+/*!
+ * CORBA : release driver
+ */
+//=============================================================================
+void SMESH_MEDMesh_i::rmDriver(CORBA::Long i)       
+  throw (SALOME::SALOME_Exception)
+{
+  MESSAGE("Non Implemente");
+  THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method"\
+                              ,SALOME::BAD_PARAM);
+}
+//=============================================================================
+/*!
+ * CORBA : attach driver
+ */
+//=============================================================================
+CORBA::Long SMESH_MEDMesh_i::addDriver(SALOME_MED::medDriverTypes driverType, 
+                                      const char* fileName, const char* meshName)
+  throw (SALOME::SALOME_Exception)
+{
+  MESSAGE("Non Implemente");
+  THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method"\
+                              ,SALOME::BAD_PARAM);
+  return 0;
+}
+//=============================================================================
+/*!
+ * Calcule le Nb d'elements par entite geometrique
+ */
+//=============================================================================
+void SMESH_MEDMesh_i::calculeNbElts()
+  throw (SALOME::SALOME_Exception)
+{
+  if (! _compte)
+    {
+      _compte=true;
+
+      _mapNbTypes[SALOME_MED::MED_NODE]=1;
+      // On compte les aretes MED_SEG2 ou MED_SEG3
+      // On range les elements dans  les vecteurs correspondants 
+
+      _mapIndToSeqElts[SALOME_MED::MED_SEG2]=_indexElts++;
+      _mapIndToSeqElts[SALOME_MED::MED_SEG3]=_indexElts++;
+      _mapIndToVectTypes[SALOME_MED::MED_EDGE]=_indexEnts++;
+
+      int trouveSeg2=0; 
+      int trouveSeg3=0; 
+      SALOME_MED::medGeometryElement medElement;
+      SMDS_MeshEdgesIterator itEdges(_meshDS);
+      for (;itEdges.More();itEdges.Next()) 
+       {
+         const Handle(SMDS_MeshElement)& elem = itEdges.Value();
+         int nb_of_nodes = elem->NbNodes();
+
+         switch (nb_of_nodes) 
+           {
+           case 2 : 
+             {
+               medElement=SALOME_MED::MED_SEG2;
+               if (trouveSeg2==0)
+                 {
+                   trouveSeg2=1;
+                   _TypesId[SALOME_MED::MED_EDGE].push_back(SALOME_MED::MED_SEG2);
+
+                 }
+               break;
+             }
+           case 3 : 
+             {
+               medElement=SALOME_MED::MED_SEG3;
+               if (trouveSeg3==0)
+                 {
+                   trouveSeg3=1;
+                   _TypesId[SALOME_MED::MED_EDGE].push_back(SALOME_MED::MED_SEG3);
+                 }
+               break;
+             }
+           }
+         int index=_mapIndToSeqElts[medElement];
+         SCRUTE(index);
+         // Traitement de l arete
+         int longueur=_seq_elemId[index]->length();
+         _seq_elemId[index]->length(longueur + nb_of_nodes);
+
+         for (int k=0; k<nb_of_nodes; k++)
+           {
+             _seq_elemId[index][longueur+k]=elem->GetConnection(k+1) +1;
+           }
+       }
+
+      _mapNbTypes[SALOME_MED::MED_EDGE]=trouveSeg2 + trouveSeg3;
+
+      // On compte les faces MED_TRIA3, MED_HEXA8, MED_TRIA6
+      // On range les elements dans  les vecteurs correspondants 
+      int trouveTria3=0; 
+      int trouveTria6=0; 
+      int trouveQuad4=0; 
+
+      _mapIndToSeqElts[SALOME_MED::MED_TRIA3]=_indexElts++;
+      _mapIndToSeqElts[SALOME_MED::MED_TRIA6]=_indexElts++;
+      _mapIndToSeqElts[SALOME_MED::MED_QUAD4]=_indexElts++;
+      _mapIndToVectTypes[SALOME_MED::MED_FACE]=_indexEnts++;
+
+      SMDS_MeshFacesIterator itFaces(_meshDS);
+      for (;itFaces.More();itFaces.Next()) 
+       {
+
+         const Handle(SMDS_MeshElement)& elem = itFaces.Value();
+         int nb_of_nodes = elem->NbNodes();
+
+         switch (nb_of_nodes) 
+           {
+           case 3 : 
+             {
+               medElement=SALOME_MED::MED_TRIA3;
+               if (trouveTria3==0)
+                 {
+                   trouveTria3=1;
+                   _TypesId[SALOME_MED::MED_FACE].push_back(SALOME_MED::MED_TRIA3);
+                 }
+               break;
+             }
+           case 4 : 
+             {
+               medElement=SALOME_MED::MED_QUAD4;
+               if (trouveQuad4==0)
+                 {
+                   trouveQuad4=1;
+                   _TypesId[SALOME_MED::MED_FACE].push_back(SALOME_MED::MED_QUAD4);
+                 }
+               break;
+             }
+           case 6 : 
+             {
+               medElement=SALOME_MED::MED_TRIA6;
+               if (trouveTria6==0)
+                 {
+                   trouveTria6=1;
+                   _TypesId[SALOME_MED::MED_FACE].push_back(SALOME_MED::MED_TRIA6);
+                 }
+               break;
+             }
+           }
+         int index=_mapIndToSeqElts[medElement];
+         SCRUTE(index);
+
+         // Traitement de la face
+         // Attention La numérotation des noeuds Med commence a 1
+
+
+         int longueur = _seq_elemId[index]->length();
+         _seq_elemId[index]->length(longueur+nb_of_nodes);
+
+         for (int k=0; k<nb_of_nodes; k++)
+           {
+             _seq_elemId[index][longueur+k]=elem->GetConnection(k+1) +1;
+           }
+
+       }
+      _mapNbTypes[SALOME_MED::MED_FACE]=trouveTria3 + trouveTria6 + trouveQuad4;
+
+      _mapIndToSeqElts[SALOME_MED::MED_HEXA8]=_indexElts++;
+      _mapIndToVectTypes[SALOME_MED::MED_CELL]=_indexEnts++;
+      int index=_mapIndToSeqElts[medElement];
+
+      int trouveHexa8=0;
+      SMDS_MeshVolumesIterator itVolumes(_meshDS);
+      for (;itVolumes.More();itVolumes.Next()) 
+       {
+         const Handle(SMDS_MeshElement)& elem = itVolumes.Value();
+
+         int nb_of_nodes = elem->NbNodes();
+         medElement=SALOME_MED::MED_HEXA8;
+         ASSERT(nb_of_nodes=8);
+
+         if (trouveHexa8 == 0)
+           {
+             trouveHexa8=1;
+             _TypesId[SALOME_MED::MED_CELL].push_back(SALOME_MED::MED_HEXA8);
+           };
+         // Traitement de la maille
+         int longueur=_seq_elemId[index]->length();
+         _seq_elemId[index]->length(longueur+nb_of_nodes);
+
+         for (int k=0; k<nb_of_nodes; k++)
+           {
+             _seq_elemId[index][longueur+k]=elem->GetConnection(k+1) +1;
+           }
+
+        }
+
+      _mapNbTypes[SALOME_MED::MED_CELL]=trouveHexa8;
+      _mapNbTypes[SALOME_MED::MED_ALL_ENTITIES]
+       =trouveHexa8 + trouveTria3 + trouveTria6 + trouveQuad4 + trouveSeg2 + trouveSeg3 ;
+    } /* fin du _compte */
+};
+//=============================================================================
+/*!
+ * Creation des familles
+ */
+//=============================================================================
+void SMESH_MEDMesh_i::createFamilies()
+  throw (SALOME::SALOME_Exception)
+{
+  string famDes=("Je ne sais pas");
+  string famName0="Famille_";
+  string famName;
+  char numero[10];
+
+  if ( _creeFamily == false)
+    {
+      _creeFamily = true;
+      SMESH_subMesh_i* subMeshServant;
+
+      map<int, SMESH_subMesh_i*>::iterator it;
+      for (it = _mesh_i->_mapSubMesh_i.begin(); it !=  _mesh_i->_mapSubMesh_i.end(); it++) {
+       SMESH_subMesh_i* submesh_i = (*it).second;
+       int famIdent = (*it).first;
+
+       ASSERT (famIdent<999999999);
+       sprintf(numero,"%d\n",famIdent);
+       famName=famName0 + numero;
+
+       SMESH_MEDFamily_i * famservant= new SMESH_MEDFamily_i(famIdent, submesh_i,
+                                                             famName, famDes, SALOME_MED::MED_NODE);
+       SALOME_MED::FAMILY_ptr famille = 
+         SALOME_MED::FAMILY::_narrow(famservant->POA_SALOME_MED::FAMILY::_this());
+       _families.push_back(famille);
+      }
+    } /* fin du _compte */
+};
+