Skip to content
Snippets Groups Projects
Select Git revision
  • 391b82694fc66dfe1c19391626a8d199ef16424c
  • master default
  • cgnsUnstructured
  • partitioning
  • poppler
  • HighOrderBLCurving
  • gmsh_3_0_4
  • gmsh_3_0_3
  • gmsh_3_0_2
  • gmsh_3_0_1
  • gmsh_3_0_0
  • gmsh_2_16_0
  • gmsh_2_15_0
  • gmsh_2_14_1
  • gmsh_2_14_0
  • gmsh_2_13_2
  • gmsh_2_13_1
  • gmsh_2_12_0
  • gmsh_2_11_0
  • gmsh_2_10_1
  • gmsh_2_10_0
  • gmsh_2_9_3
  • gmsh_2_9_2
  • gmsh_2_9_1
  • gmsh_2_9_0
  • gmsh_2_8_6
26 results

GModelIO_OCC.h

Blame
  • Forked from gmsh / gmsh
    Source project has a limited visibility.
    GModelIO_OCC.h 9.66 KiB
    // Gmsh - Copyright (C) 1997-2017 C. Geuzaine, J.-F. Remacle
    //
    // See the LICENSE.txt file for license information. Please report all
    // bugs and problems to the public mailing list <gmsh@onelab.info>.
    
    #ifndef _GMODELIO_OCC_H_
    #define _GMODELIO_OCC_H_
    
    #include "GmshConfig.h"
    #include "GModel.h"
    #include "OCCIncludes.h"
    
    #if defined(HAVE_OCC)
    #include <vector>
    
    class OCC_Internals {
     public:
      enum BooleanOperator { Union, Intersection, Difference, Section, Fragments };
    
     private :
      // tag contraints coming from outside OCC_Internals (when using multiple CAD
      // kernels)
      int _maxTagConstraints[4];
    
      // all the (sub)shapes, updated dynamically when shapes need to be imported
      // into a GModel
      TopTools_IndexedMapOfShape _vmap, _emap, _wmap, _fmap, _shmap, _somap;
    
      // cache mapping TopoDS_Shapes to their corresponding (future) GEntity tags
      TopTools_DataMapOfShapeInteger _vertexTag, _edgeTag, _faceTag, _solidTag;
      TopTools_DataMapOfIntegerShape _tagVertex, _tagEdge, _tagFace, _tagSolid;
    
      // cache mapping TopoDS_Shapes to tags for internal use during geometry
      // construction
      TopTools_DataMapOfShapeInteger _wireTag, _shellTag;
      TopTools_DataMapOfIntegerShape _tagWire, _tagShell;
    
      // add a shape and all its subshapes to _vmap, _emap, ..., _somap
      void _addShapeToMaps(TopoDS_Shape shape);
    
      // apply various healing algorithms to try to fix the shape
      void _healShape(TopoDS_Shape &myshape, double tolerance, bool fixdegenerated,
                      bool fixsmalledges, bool fixspotstripfaces, bool sewfaces,
                      bool makesolids=false, double scaling=0.0);
    
      // apply a geometrical transformation
      void _transform(std::vector<int> inTags[4], BRepBuilderAPI_Transform &tfo);
    
      // add bezier or bspline
      void _addSpline(int tag, std::vector<int> vertexTags, int mode);
    
     public:
      OCC_Internals();
    
      // bind and unbind OpenCASCADE shapes to tags
      void bind(TopoDS_Vertex vertex, int tag);
      void bind(TopoDS_Edge edge, int tag);
      void bind(TopoDS_Wire wire, int tag);
      void bind(TopoDS_Face face, int tag);
      void bind(TopoDS_Shell shell, int tag);
      void bind(TopoDS_Solid solid, int tag);
      void bind(TopoDS_Shape shape, int dim, int tag);
      void unbind(TopoDS_Vertex vertex, int tag);
      void unbind(TopoDS_Edge edge, int tag);
      void unbind(TopoDS_Wire wire, int tag);
      void unbind(TopoDS_Face face, int tag);
      void unbind(TopoDS_Shell shell, int tag);
      void unbind(TopoDS_Solid solid, int tag);
      void unbind(TopoDS_Shape shape, int dim, int tag);
    
      // bind (potentially) mutliple entities in shape and return the tags in
      // outTags. If tag > 0 and a single entity if found, use that; if
      // highestDimOnly is true, only bind the entities of the highest
      // dimension
      void bind(TopoDS_Shape shape, bool highestDimOnly, int tag,
                std::vector<int> outTags[4]);
    
      // is the entity of a given dimension and tag bound?
      bool isBound(int dim, int tag);
    
      // get the entity of a given dimension and tag
      TopoDS_Shape find(int dim, int tag);
    
      // set constraints on tags
      void setTagConstraints(int maxTags[4]);
    
      // get maximum tag number for each dimension
      int getMaxTag(int dim) const;
    
      // add shapes
      void addVertex(int tag, double x, double y, double z);
      void addLine(int tag, int startTag, int endTag);
      void addCircleArc(int tag, int startTag, int centerTag, int endTag);
      void addBezier(int tag, std::vector<int> vertexTags);
      void addBSpline(int tag, std::vector<int> vertexTags);
      void addLineLoop(int tag, std::vector<int> edgeTags);
      void addRectangle(int tag, double x1, double y1, double z1,
                        double x2, double y2, double z2);
      void addDisk(int tag, double xc, double yc, double zc, double rx, double ry);
      void addPlanarFace(int tag, std::vector<int> wireTags);
      void addRuledFaces(int tag, std::vector<int> wireTags, std::vector<int> outTags);
      void addSurfaceLoop(int tag, std::vector<int> faceTags);
      void addVolume(int tag, std::vector<int> shellTags);
      void addSphere(int tag, double xc, double yc, double zc, double radius);
      void addBlock(int tag, double x1, double y1, double z1,
                    double x2, double y2, double z2);
      void addCylinder(int tag, double x1, double y1, double z1,
                       double x2, double y2, double z2, double r);
      void addThruSections(int tag, std::vector<int> wireTags);
    
      // apply boolean operator
      void applyBooleanOperator(int tag, BooleanOperator op,
                                std::vector<int> shapeTags[4],
                                std::vector<int> toolTags[4],
                                std::vector<int> outTags[4],
                                bool removeShape=true,
                                bool removeTool=true);
    
      // get boundary of shapes of dimension dim (this will bind the boundary parts
      // to new tags, returned in outTags)
      void getBoundary(std::vector<int> inTags[4], std::vector<int> outTags[4],
                       bool combined=false);
    
      // apply transformations
      void translate(std::vector<int> inTags[4], double dx, double dy, double dz);
      void rotate(std::vector<int> inTags[4], double x, double y, double z,
                  double dx, double dy, double dz, double angle);
      void copy(std::vector<int> inTags[4], std::vector<int> outTags[4]);
      void remove(std::vector<int> inTags[4]);
    
      // import shapes from file
      void importShapes(const std::string &fileName, bool highestDimOnly,
                        std::vector<int> outTags[4], const std::string &format="");
    
      // import shapes from TopoDS_Shape
      void importShapes(const TopoDS_Shape *shape, bool highestDimOnly,
                        std::vector<int> outTags[4]);
    
      // export all bound shapes to file
      void exportShapes(const std::string &fileName, const std::string &format="");
    
      // synchronize internal CAD data with the given GModel
      void synchronize(GModel *model);
    
      // get the GEntity corresponding to an OCC shape
      GVertex *getOCCVertexByNativePtr(GModel *model, TopoDS_Vertex toFind);
      GEdge *getOCCEdgeByNativePtr(GModel *model, TopoDS_Edge toFind);
      GFace *getOCCFaceByNativePtr(GModel *model, TopoDS_Face toFind);
      GRegion *getOCCRegionByNativePtr(GModel *model, TopoDS_Solid toFind);
    
    
    
      // *** FIXME what follows will be removed ***
     private:
      TopoDS_Shape _shape;
     public:
      void _addShapeToLists(TopoDS_Shape shape){ _addShapeToMaps(shape); }
      void _healGeometry(double tolerance, bool fixdegenerated,
                         bool fixsmalledges, bool fixspotstripfaces, bool sewfaces,
                         bool makesolids=false, double scaling=0.0)
      {
        _healShape(_shape, tolerance, fixdegenerated, fixsmalledges,
                   fixspotstripfaces, sewfaces, makesolids, scaling);
      }
      void applyBooleanOperator(TopoDS_Shape tool, const BooleanOperator &op);
      TopoDS_Shape getShape () { return _shape; }
      void buildLists();
      void buildShapeFromLists(TopoDS_Shape shape);
      void fillet(std::vector<TopoDS_Edge> &shapes, double radius);
      void buildShapeFromGModel(GModel*);
      void buildGModel(GModel *gm);
      void loadShape(const TopoDS_Shape *s)
      {
        std::vector<int> tags[4]; importShapes(s, false, tags);
      }
      GVertex *addVertexToModel(GModel *model, TopoDS_Vertex v);
      GEdge *addEdgeToModel(GModel *model, TopoDS_Edge e);
      GFace *addFaceToModel(GModel *model, TopoDS_Face f);
      GRegion *addRegionToModel(GModel *model, TopoDS_Solid r);
      // *** FIXME end of stuff that will be removed ***
    };
    
    #else
    
    class OCC_Internals {
    public:
      enum BooleanOperator { Union, Intersection, Difference, Section, Fragments };
      OCC_Internals(){}
      void setTagConstraints(int maxTags[4]){}
      int getMaxTag(int dim) const { return 0; }
      void addVertex(int tag, double x, double y, double z){}
      void addLine(int tag, int startTag, int endTag){}
      void addCircleArc(int tag, int startTag, int centerTag, int endTag){}
      void addBezier(int tag, std::vector<int> vertexTags){};
      void addBSpline(int tag, std::vector<int> vertexTags){};
      void addLineLoop(int tag, std::vector<int> edgeTags){}
      void addRectangle(int tag, double x1, double y1, double z1,
                        double x2, double y2, double z2){}
      void addDisk(int tag, double xc, double yc, double zc, double rx, double ry){}
      void addPlanarFace(int tag, std::vector<int> wireTags){}
      void addRuledFaces(int tag, std::vector<int> wireTags, std::vector<int> outTags){}
      void addSurfaceLoop(int tag, std::vector<int> faceTags){}
      void addVolume(int tag, std::vector<int> shellTags){}
      void addSphere(int tag, double xc, double yc, double zc, double radius){};
      void addBlock(int tag, double x1, double y1, double z1,
                    double x2, double y2, double z2){}
      void addCylinder(int tag, double x1, double y1, double z1,
                       double x2, double y2, double z2, double r){}
      void addThruSections(int tag, std::vector<int> wireTags){}
      void applyBooleanOperator(int tag, BooleanOperator op,
                                std::vector<int> shapeTags[4],
                                std::vector<int> toolTags[4],
                                std::vector<int> outTags[4],
                                bool removeShape=true,
                                bool removeTool=true){}
      void getBoundary(std::vector<int> inTags[4], std::vector<int> outTags[4],
                       bool combined=false){}
      void translate(std::vector<int> inTags[4], double dx, double dy, double dz){}
      void rotate(std::vector<int> inTags[4], double x, double y, double z,
                  double dx, double dy, double dz, double angle){}
      void copy(std::vector<int> inTags[4], std::vector<int> outTags[4]){}
      void remove(std::vector<int> inTags[4]){}
      void importShapes(const std::string &fileName, bool highestDimOnly,
                        std::vector<int> outTags[4], const std::string &format=""){}
      void exportShapes(const std::string &fileName, const std::string &format=""){}
      void synchronize(GModel *model){}
    };
    
    #endif
    #endif