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