From 5f1aa98d975d7814c5a93486f78c78db1c5cb98a Mon Sep 17 00:00:00 2001
From: Christophe Geuzaine <cgeuzaine@ulg.ac.be>
Date: Mon, 23 Apr 2007 07:59:25 +0000
Subject: [PATCH] - new version of MED IO (Pascale Noyret) - moved OCCInternals
 class into separate header for Salome plugin (Pascale Noyret)

---
 Geo/GModelIO_MED.cpp |  90 +++++--------
 Geo/GModelIO_MED.h   | 306 ++++++++++++++++++++-----------------------
 Geo/GModelIO_OCC.cpp |  39 +-----
 Geo/GModelIO_OCC.h   |  66 ++++++++++
 4 files changed, 246 insertions(+), 255 deletions(-)
 create mode 100644 Geo/GModelIO_OCC.h

diff --git a/Geo/GModelIO_MED.cpp b/Geo/GModelIO_MED.cpp
index 6300c707d9..e9fa3cf0fe 100644
--- a/Geo/GModelIO_MED.cpp
+++ b/Geo/GModelIO_MED.cpp
@@ -1,4 +1,4 @@
-// $Id: GModelIO_MED.cpp,v 1.3 2007-02-03 11:21:40 geuzaine Exp $
+// $Id: GModelIO_MED.cpp,v 1.4 2007-04-23 07:59:25 geuzaine Exp $
 //
 // Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
@@ -18,24 +18,21 @@
 // USA.
 // 
 // Please report all bugs and problems to <gmsh@geuz.org>.
-//
-// Contributor(s):
-//   Pascale Noyret
-
-#include <map>
-#include <string>
-#include <vector>
-#include <iostream>
-#include <sstream>
 
 #include "GModel.h"
-#include "GModelIO_MED.h"
 #include "MVertex.h"
 #include "MEdge.h"
 #include "Message.h"
 
 #if defined(HAVE_MED)
 
+#include <map>
+#include <string>
+#include <vector>
+#include <iostream>
+#include <sstream>
+#include "GModelIO_MED.h"
+
 extern "C" {
 #include "med.h"
 }
@@ -44,6 +41,11 @@ ConversionData Data::MyConversionData;
 
 typedef std::list<int>::const_iterator listIter;
 
+// _____________________________________________ //
+//                                               //
+// Implementation  de la classe  ConversionData  //
+//  ____________________________________________ //
+
 ConversionData::ConversionData()
 { 
 	// Correspondance des types GMSH et MEd
@@ -60,18 +62,6 @@ ConversionData::ConversionData()
 	   ++i;
 	}
 
-	// *****************************************************
-	// elements GMSH avec un nb de noeuds differents en Med
-	// *****************************************************
-	static const int secondOrderElts[] = { 10, 12, 13, 14 , 0};
-	static const int NbNodesInMed[]    = { 8,  20, 15, 13 , 0};
-	i=0;
-	while (secondOrderElts[i] != 0)
-	{
-	   maxEltInMed[secondOrderElts[i]]=NbNodesInMed[i];
-	   ++i;
-	}
-
 	// **************************
 	// Num�rotation des Noeuds
 	// **************************
@@ -185,17 +175,11 @@ ConversionData::ConversionData()
 	}
 };
 
-int ConversionData::inMaxEltInMed(int clef)
-{
-	std::map<int,int>::const_iterator MyIter;
-	MyIter = maxEltInMed.find(clef);
-	if ( MyIter != maxEltInMed.end() )
-		return 1;
-	return 0;
-};
-
-
 
+// ____________________________________ //
+//                                      //
+// Implementation  de la classe  MedIO  //
+//  ___________________________________ //
 
 MedIO::MedIO() : _numOfNode(1), _boolOpen(0), _meshName("monMaillage")
 { 
@@ -236,10 +220,12 @@ int MedIO::SetFile(const std::string &FileName)
 }
  
 // -------------------------------------------------
-int MedIO::AddVertex(MVertex* v, const int famille)
+int MedIO::AddNode(MVertex* v, const int famille)
 // -------------------------------------------------
 { 
-   // Msg(INFO, "Creation ");
+    //Msg(INFO, "Creation %d", v->getNum());
+   
+   if ( elements.find(v->getNum()) != elements.end() ) return 1;
    coordonnees.push_back((med_float)v->x());
    coordonnees.push_back((med_float)v->y());
    coordonnees.push_back((med_float)v->z());
@@ -254,7 +240,7 @@ int MedIO::AddVertex(MVertex* v, const int famille)
 }
 
 // -------------------------------
-int MedIO::CreateNodeFam( )
+int MedIO::CreateFamilles( )
 // -------------------------------
 {
    numFamilles.insert(0);
@@ -264,8 +250,8 @@ int MedIO::CreateNodeFam( )
 	if (*itFam != 0 )
 	{ std::ostringstream oss;
           oss << *itFam;
-          std::string fam = "Famille" + oss.str();
-          std::string group = "Groupe" + oss.str();
+          std::string fam = "F_" + oss.str();
+          std::string group = "G_" + oss.str();
 	  while (group.size() < 80) group = group + " ";
           CR = MEDfamCr (_fid, (char *) _meshName.c_str(),(char *)fam.c_str(),*itFam, 0,0,0,0,(char *)group.c_str(),1);
 	  CR=0;
@@ -284,9 +270,6 @@ int MedIO::CreateNodeFam( )
    return 1;
 }
 
-int MedIO::CreateElemtFam( )
-{}
-
 
 // -------------------------------
 int MedIO::CreateElemt()
@@ -297,10 +280,10 @@ int MedIO::CreateElemt()
        med_geometrie_element typemed =(*eltIter).second;
        if (typemed == MED_POINT1) continue;
        int nbNoeudElt = typemed % 100 ;
-       int nbElements = connectivities[typemed].size() / nbNoeudElt;
+       int nbElements = LesConn[typemed].size() / nbNoeudElt;
        if (nbElements != 0 )
            med_err CR = MEDelementsEcr (_fid, (char*) _meshName.c_str(),(med_int) 3, 
-		         &connectivities[typemed][0], MED_FULL_INTERLACE,
+		         &LesConn[typemed][0], MED_FULL_INTERLACE,
 			 NULL, MED_FAUX, NULL, MED_FAUX,
 			 &famElts[typemed][0],nbElements,
 			   MED_MAILLE,typemed,MED_NOD);
@@ -327,20 +310,13 @@ int MedIO::Ecrit()
     // *********************
     // Creation des Familles
     // *********************
-    int CRFam = CreateNodeFam();
+    int CRFam = CreateFamilles();
     if ( CRFam < 0 )
     {
        Msg(GERROR, "Error in Nodes Families Creation ");
        return 0;
     }
 
-    int CRFamElt = CreateElemtFam();
-    if ( CRFamElt < 0 )
-    {
-       Msg(GERROR, "Error in Elements Families Creation ");
-       return 0;
-    }
-
     // *************************
     // Creation des Coordonnees
     // *************************
@@ -389,10 +365,11 @@ int GModel::writeMED(const std::string &name)
    MedIO MedDriver=MedIO();
    int CR1 =MedDriver.SetFile(name);
 
-   MedDriver.WriteNodes(vertices);
-   MedDriver.WriteNodes(edges);
-   MedDriver.WriteNodes(faces);
-   MedDriver.WriteNodes(regions);
+   renumberMeshVertices();
+   MedDriver.TraiteMed(vertices);
+   MedDriver.TraiteMed(edges);
+   MedDriver.TraiteMed(faces);
+   MedDriver.TraiteMed(regions);
 
    int CR2 = MedDriver.Ecrit();
    int CR3 = MedDriver.CloseFile();
@@ -409,4 +386,5 @@ int GModel::writeMED(const std::string &name)
   return 0;
 }
 
-#endif
+#endif                // du HAVE_LIBMED
+
diff --git a/Geo/GModelIO_MED.h b/Geo/GModelIO_MED.h
index 382badf8b1..185a06006b 100644
--- a/Geo/GModelIO_MED.h
+++ b/Geo/GModelIO_MED.h
@@ -1,28 +1,6 @@
 #ifndef _GMODELIO_MED_H_
 #define _GMODELIO_MED_H_
 
-// Copyright (C) 1997-2007 C. Geuzaine, J.-F. Remacle
-//
-// This program is free software; you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation; either version 2 of the License, or
-// (at your option) any later version.
-//
-// This program is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-// GNU General Public License for more details.
-//
-// You should have received a copy of the GNU General Public License
-// along with this program; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
-// USA.
-// 
-// Please report all bugs and problems to <gmsh@geuz.org>.
-//
-// Contributor(s):
-//   Pascale Noyret
-
 #include <string>
 #include <map>
 #include <vector>
@@ -43,19 +21,23 @@ extern "C"
 }
 
 typedef std::map<med_geometrie_element,std::vector<int> >  connectivities;
-typedef std::list<int>::const_iterator listIter;
-typedef std::map<int,int>numero;
-typedef std::set<int>setFamille;
+typedef std::set<int>                  setFamille;
 
+class MedIO ;
+
+// _________________________________________ //
+//                                           //
+// Declaration  de la classe  ConversionData // 
+// (implementation ds le cpp)                //
+// ________________________________________  //
+//
 class ConversionData 
 {
 	public :
 
  	   ConversionData();
-	   int inMaxEltInMed(int clef);
 
            std::map<int,med_geometrie_element> typesOfElts;
-           std::map<int,int> maxEltInMed;
            std::map<int,std::list<int> > medVertexOrder;
 
 	   std::map<int,int> familleParDimension;
@@ -63,6 +45,12 @@ class ConversionData
 
 };
 
+// _________________________________________________ //
+//                                                   //
+// Declaration  de la classe  TraiteMailledeBase     // 
+// (implementations en fin de fichier)               //
+// ________________________________________________  //
+
 class Data 
 {
     public :
@@ -70,120 +58,69 @@ class Data
 };
 
 
-template<class T>
-class MontraitementDeBase : Data
+template<class T> 
+class TraiteMailledeBase : Data
 {
   protected:
-  static inline int RecupereFamille(const T &ele, setFamille & numFamilles, const int dimension)
-  {
-     int famille = 0;
-     if (ele.physicals.size() != 0) 
-        famille=ele.physicals[0];
-     if (famille == 0) return 0; 
 
-     if (famille > 0)  famille = -1 * famille;
+  static inline int RecupereFamille(const T &ele, const int dimension, MedIO & monDriver);
+  template<class G> static void RecupereElement(const std::vector<G*> &ele, const int famille, MedIO& monDriver);
 
-     // On verifie qu il s agit de la bonne dimension 
-     int familleInitiale=famille;
-     while (MyConversionData.familleParDimension[famille] != dimension)
-     {
-        if (numFamilles.find(famille) == numFamilles.end())
-        {
-     	    numFamilles.insert(famille);
-	    MyConversionData.familleParDimension[famille]=dimension;
-        }
-	 else 
-	{
-           famille=famille-1000;
-        }
-	//Msg(INFO, "famille %d", famille);
-     }
-
-     MyConversionData.famillefamille[familleInitiale]=famille;
-     return famille;
-  }
-
-  template < class G>
-  static void RecupereElement(const std::vector<G*> &ele , connectivities &maMap, connectivities &mesFamilles, 
-		              numero& elements , const int famille) {
-     if (ele.size() == 0) return;
-     const int type=ele[0]->getTypeForMSH();
-     const med_geometrie_element medType= Data::MyConversionData.typesOfElts[type];
+};
 
-     for (unsigned int elt = 0; elt < ele.size(); ++elt) {
-	const int monNum=ele[elt]->getNum();
-	for (listIter monIter  = Data::MyConversionData.medVertexOrder[type].begin(); 
-	              monIter != Data::MyConversionData.medVertexOrder[type].end(); 
-		      ++monIter) {
-	      const int NoeudATraiter = *monIter - 1;
-	      const int Noeud = ele[elt]->getVertex(NoeudATraiter)->getNum();
-	      maMap[medType].push_back(elements[Noeud]);
-           }
 
-	mesFamilles[medType].push_back(famille);
-        }
-  }
- };
+// _________________________________________________ //
+//                                                   //
+// Specialisations de la classe  TraiteMailledeBase  // 
+// selon le type de maille                           //
+// ________________________________________________  //
 
 template <class T>
-struct MonTraitement : public MontraitementDeBase<T>{
-  static inline  void AddElement(const T & ele,connectivities  & maMap, connectivities &mesFamilles, numero& elements ,setFamille& numFamilles)
-   {
-	 Msg(GERROR, "Wrong Call : basic Method AddElt");
-   }
+struct TraiteMaille : public TraiteMailledeBase<T> {
+  static inline  void AddElement(const T& ele, MedIO & monDriver)
+  { Msg(GERROR, "Wrong Call : basic Method AddElt"); };
 };
 
+
 template <>
-struct MonTraitement<GVertex> : public MontraitementDeBase<GVertex>{
-  static inline  void AddElement(const GVertex & ele, connectivities  & maMap, connectivities &mesFamilles, numero& elements ,setFamille & numFamilles) {
-  // Pour les Noeuds on ne fait rien ni sur la connectivite ni sur les familles
-  }
+struct TraiteMaille<GVertex> : public TraiteMailledeBase<GVertex> {
+  static inline  void AddElement(const GVertex & ele, MedIO& monDriver) ;
+  // l'implementation est  en fin de fichier pour pouvoir utiliser la methode AddNode de MedIO
 };
 
 template <>
-struct MonTraitement<GEdge> : public MontraitementDeBase<GEdge>{
-  static inline void AddElement(const GEdge & ele, connectivities  & maMap, connectivities &mesFamilles, numero& elements, setFamille & numFamilles) {
-	   RecupereElement (ele.lines,  maMap, mesFamilles, elements, RecupereFamille(ele, numFamilles, 1));
-     }
+struct TraiteMaille<GEdge> : public TraiteMailledeBase<GEdge> {
+  static inline void AddElement(const GEdge & ele, MedIO& monDriver) 
+  {
+	   RecupereElement (ele.lines,  RecupereFamille(ele, 1, monDriver), monDriver);
+  }
 };
 
 template <>
-struct MonTraitement<GFace> : public MontraitementDeBase<GFace>{
-  static inline void AddElement(const GFace & ele, connectivities  & maMap, connectivities &mesFamilles, numero& elements , setFamille & numFamilles) {
-	   RecupereElement (ele.triangles,   maMap, mesFamilles, elements, RecupereFamille(ele, numFamilles, 2));
-	   RecupereElement (ele.quadrangles, maMap, mesFamilles, elements, RecupereFamille(ele, numFamilles, 2));
-     }
+struct TraiteMaille<GFace> : public TraiteMailledeBase<GFace> {
+  static inline void AddElement(const GFace & ele,  MedIO&  monDriver) 
+  {
+	   RecupereElement (ele.triangles,   RecupereFamille(ele, 2, monDriver), monDriver);
+	   RecupereElement (ele.quadrangles, RecupereFamille(ele, 2, monDriver), monDriver);
+  }
 };
 
 template <>
-struct MonTraitement<GRegion> : public MontraitementDeBase<GRegion>{
-  static inline void AddElement(const GRegion & ele, connectivities  & maMap, connectivities &mesFamilles, numero& elements, setFamille & numFamilles) {
-	   RecupereElement (ele.tetrahedra, maMap, mesFamilles, elements, RecupereFamille(ele, numFamilles, 3));
-	   RecupereElement (ele.hexahedra,  maMap, mesFamilles, elements, RecupereFamille(ele, numFamilles, 3));
-	   RecupereElement (ele.prisms,     maMap, mesFamilles, elements, RecupereFamille(ele, numFamilles, 3));
-	   RecupereElement (ele.pyramids,   maMap, mesFamilles, elements, RecupereFamille(ele, numFamilles, 3));
+struct TraiteMaille<GRegion> : public TraiteMailledeBase<GRegion>{
+  static inline void AddElement(const GRegion & ele, MedIO &  monDriver) 
+  {
+	   RecupereElement (ele.tetrahedra, RecupereFamille(ele, 3, monDriver), monDriver );
+	   RecupereElement (ele.hexahedra,  RecupereFamille(ele, 3, monDriver), monDriver);
+	   RecupereElement (ele.prisms,     RecupereFamille(ele, 3, monDriver), monDriver);
+	   RecupereElement (ele.pyramids,   RecupereFamille(ele, 3, monDriver), monDriver);
      }
 };
 
-template<class T> struct TraiteFamille
-{
-   static inline int GetFamille (const T& element)
-   {
-     // On ne traite pas les familles d 'elements a ce stade
-     return 0;
-   }
-};
-
-template<>
-struct TraiteFamille<GVertex>
-{
-  static inline int GetFamille (const GVertex& element)
- {
-     int famille = 0;
-     if (element.physicals.size() != 0 ) famille = element.physicals[0];
-     return famille;
- }
-};
+// ______________________________________ //
+//                                        //
+// Declaration  de la classe  MedIO       // 
+// (implementation ds le cpp)             //
+// _____________________________________  //
 
 class MVertex;
 class MEdge;
@@ -191,73 +128,118 @@ class MedIO
 {
    public:
       MedIO();
-      int SetFile     (const std::string& theFileName);
-      int AddVertex   (MVertex* const v, const int famille );
-      int AddEdge     (MEdge* const e );
-      int Ecrit	      ();
-      int CloseFile   ();
+      int SetFile   (const std::string& theFileName);
+      int AddNode   (MVertex* const v, const int famille );
+      int Ecrit	    ();
+      int CloseFile ();
 
    private :
-      int CreateNodeFam();
-      int CreateElemtFam();
+      int CreateFamilles();
       int CreateElemt();
 
-   private :
-      std::string  _FileName;
-      std::map<med_geometrie_element,std::vector<int> > connectivities;
+   public :
+      connectivities LesConn;
+      setFamille     numFamilles;
+      std::vector<int>       families;
+      std::map<int,int>      elements;
       std::map<med_geometrie_element,std::vector<int> > famElts;
 
+   private :
+
       std::vector<med_float> coordonnees;
-      std::vector<int> families;
-      std::vector<med_int> numOpt;
-      std::map<int,int> elements;
+      std::vector<med_int>   numOpt;
   
-      std::set<int> numFamilles;
       int _numOfNode;
-
       int _boolOpen;
+
       med_idt _fid;
-      std::string _meshName;
+      std::string  _FileName;
+      std::string  _meshName;
 
    public : 
      static ConversionData MyConversionData ;
     
       
-template<class T>
-void WriteNodes(const std::set<T*,GEntityLessThan> & seq) 
-{
-  typename std::set<T*,GEntityLessThan>::const_iterator iter=seq.begin();
+   template<class T>
+   void TraiteMed(const std::set<T*,GEntityLessThan> & seq) 
+   {
+        typename std::set<T*,GEntityLessThan>::const_iterator iter=seq.begin();
 
-  for ( ; iter != seq.end() ; ++iter)
-  {
-    const T& element= *(*iter);
+        for ( ; iter != seq.end() ; ++iter)
+        {
+             const T& element= *(*iter);
+             TraiteMaille<T>::AddElement(element, *this);
+        }
+   }
+};
 
-    //Msg(INFO," Type d element  %s", typeid(element).name());
+// _______________________________________________________________ //
+//                                                                 //
+// Implementation des Methodes des classes de type TraiteElement   // 
+// qui utilisent MedIO                                             //
+// _______________________________________________________________ //
+
+void TraiteMaille<GVertex>::AddElement(const GVertex & ele, MedIO& monDriver)
+{
+     int famille = 0;
+     if (ele.physicals.size() != 0 ) famille = ele.physicals[0];
+     monDriver.AddNode(ele.mesh_vertices[0],famille);
+}
 
-    // Traitement des Noeuds
-    // Calcul du nombre de noeuds a stocker dans Med
-    unsigned int thisSize=element.mesh_vertices.size();
-    if (Data::MyConversionData.inMaxEltInMed(element.tag()) == 1) 
-    {
-         const unsigned int maxSize  = Data::MyConversionData.maxEltInMed[element.tag()];
-         if (maxSize < thisSize) thisSize = maxSize ;
-    };
+//					*-*-*-*-*-*-*-*-*-*
 
-    // stockage du Noeud
-    int famille=TraiteFamille<T>::GetFamille(element);
-    for (unsigned int i = 0; i < thisSize; ++i)
-    {
-    	AddVertex (element.mesh_vertices[i], famille);
-    };
+template<class T> int TraiteMailledeBase<T>::RecupereFamille(const T &ele, const int dimension, MedIO & monDriver)
+// 
+// Dans le format MED, Les familles de mailles sont negatives (contrairement au physical group de GMSH)
+// Les familles ne contiennent des mailles de la meme dimension 
+{
+     int famille = 0;
+     if (ele.physicals.size() != 0) famille=ele.physicals[0];
+     if (famille == 0) return 0; 
 
-    // Stockage des Egdes
-    MonTraitement<T>::AddElement(element,connectivities,famElts,elements,numFamilles);
+     if (famille > 0)  famille = -1 * famille;
 
-  }
+     int familleInitiale=famille;
+     while (MyConversionData.familleParDimension[famille] != dimension)
+     {
+        if (monDriver.numFamilles.find(famille) == monDriver.numFamilles.end())
+        {   monDriver.numFamilles.insert(famille);
+	    MyConversionData.familleParDimension[famille]=dimension;
+        }
+	 else famille=famille-1000;
+     }
+
+     MyConversionData.famillefamille[familleInitiale]=famille;
+     return famille;
 }
-};
 
+//					*-*-*-*-*-*-*-*-*-*
+
+template<class T>
+template<class G> void TraiteMailledeBase<T>::RecupereElement(const std::vector<G*> &ele, const int famille, MedIO& monDriver) 
+// l'implementation aurait pu etre laissee avec la declaration (ok pour GCC 3.3.5)
+// mais pour eviter des eventuels pb de portage il semble preferable de la separer
+{
+
+     typedef std::list<int>::const_iterator listIter;
 
-# endif
+     if (ele.size() == 0) return;
+     const int type=ele[0]->getTypeForMSH();
+     const med_geometrie_element medType= Data::MyConversionData.typesOfElts[type];
+
+     for (unsigned int elt = 0; elt < ele.size(); ++elt) {
+	const int monNum=ele[elt]->getNum();
+	for (listIter monIter  = Data::MyConversionData.medVertexOrder[type].begin(); 
+	              monIter != Data::MyConversionData.medVertexOrder[type].end(); 
+		      ++monIter) {
+	      const int NoeudATraiter = *monIter - 1;
+	      const int Noeud = ele[elt]->getVertex(NoeudATraiter)->getNum();
+	      monDriver.AddNode(ele[elt]->getVertex(NoeudATraiter),0);
+	      monDriver.LesConn[medType].push_back(monDriver.elements[Noeud]);
+           }
+	monDriver.famElts[medType].push_back(famille);
+        }
+}
 
-#endif
+#endif               // du HAVE_LIBMED
+#endif               // du define de _GMODELIO_MED_H_
diff --git a/Geo/GModelIO_OCC.cpp b/Geo/GModelIO_OCC.cpp
index b60d0f57b0..85e4d0b9c8 100644
--- a/Geo/GModelIO_OCC.cpp
+++ b/Geo/GModelIO_OCC.cpp
@@ -1,4 +1,4 @@
-// $Id: GModelIO_OCC.cpp,v 1.19 2007-02-27 22:09:44 geuzaine Exp $
+// $Id: GModelIO_OCC.cpp,v 1.20 2007-04-23 07:59:25 geuzaine Exp $
 //
 // Copyright (C) 1997-2007 C. Geuzaine, J.-F. Remacle
 //
@@ -19,10 +19,9 @@
 // 
 // Please report all bugs and problems to <gmsh@geuz.org>.
 
-#include "GModel.h"
+#include "GModelIO_OCC.h"
 #include "Message.h"
 #include "Context.h"
-#include "OCCIncludes.h"
 #include "OCCVertex.h"
 #include "OCCEdge.h"
 #include "OCCFace.h"
@@ -32,40 +31,6 @@ extern Context_T CTX;
 
 #if defined(HAVE_OCC)
 
-#include "ShapeAnalysis_ShapeTolerance.hxx"
-#include "ShapeAnalysis_ShapeContents.hxx"
-#include "ShapeAnalysis_CheckSmallFace.hxx"
-#include "ShapeAnalysis_DataMapOfShapeListOfReal.hxx"
-#include "BRepAlgoAPI_Fuse.hxx"
-#include "BRepCheck_Analyzer.hxx"
-#include "BRepLib.hxx"
-#include "ShapeBuild_ReShape.hxx"
-#include "ShapeFix.hxx"
-#include "ShapeFix_FixSmallFace.hxx"
-
-class OCC_Internals {
-  TopoDS_Shape shape;
-  TopTools_IndexedMapOfShape fmap, emap, vmap, somap, shmap, wmap;
-public:
-  OCC_Internals()
-  {
-    somap.Clear();
-    shmap.Clear();
-    fmap.Clear();
-    wmap.Clear();
-    emap.Clear();
-    vmap.Clear();
-  }
-  void HealGeometry(double tolerance, bool fixsmalledges, 
-		    bool fixspotstripfaces, bool sewfaces, 
-		    bool makesolids=false);
-  void loadSTEP(const char *);
-  void loadIGES(const char *);
-  void loadBREP(const char *);  
-  void buildGModel(GModel *gm);
-  void buildLists();
-};
-
 void OCC_Internals::buildLists()
 {
   TopExp_Explorer exp0, exp1, exp2, exp3, exp4, exp5;
diff --git a/Geo/GModelIO_OCC.h b/Geo/GModelIO_OCC.h
new file mode 100644
index 0000000000..74f41df119
--- /dev/null
+++ b/Geo/GModelIO_OCC.h
@@ -0,0 +1,66 @@
+#ifndef _GMODELIO_OCC_H_
+#define _GMODELIO_OCC_H_
+
+// $Id: GModelIO_OCC.h,v 1.1 2007-04-23 07:59:25 geuzaine Exp $
+//
+// Copyright (C) 1997-2007 C. Geuzaine, J.-F. Remacle
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+// USA.
+// 
+// Please report all bugs and problems to <gmsh@geuz.org>.
+
+#include "GModel.h"
+#include "OCCIncludes.h"
+
+#if defined(HAVE_OCC)
+
+#include "ShapeAnalysis_ShapeTolerance.hxx"
+#include "ShapeAnalysis_ShapeContents.hxx"
+#include "ShapeAnalysis_CheckSmallFace.hxx"
+#include "ShapeAnalysis_DataMapOfShapeListOfReal.hxx"
+#include "BRepAlgoAPI_Fuse.hxx"
+#include "BRepCheck_Analyzer.hxx"
+#include "BRepLib.hxx"
+#include "ShapeBuild_ReShape.hxx"
+#include "ShapeFix.hxx"
+#include "ShapeFix_FixSmallFace.hxx"
+
+class OCC_Internals {
+ protected :
+  TopoDS_Shape shape;
+  TopTools_IndexedMapOfShape fmap, emap, vmap, somap, shmap, wmap;
+ public:
+  OCC_Internals()
+  {
+    somap.Clear();
+    shmap.Clear();
+    fmap.Clear();
+    wmap.Clear();
+    emap.Clear();
+    vmap.Clear();
+  }
+  void HealGeometry(double tolerance, bool fixsmalledges, 
+		    bool fixspotstripfaces, bool sewfaces, 
+		    bool makesolids=false);
+  void loadSTEP(const char *);
+  void loadIGES(const char *);
+  void loadBREP(const char *);  
+  void buildGModel(GModel *gm);
+  void buildLists();
+};
+
+#endif
+#endif
-- 
GitLab