Skip to content
Snippets Groups Projects
GEntity.h 9.46 KiB
Newer Older
Christophe Geuzaine's avatar
Christophe Geuzaine committed
// Gmsh - Copyright (C) 1997-2015 C. Geuzaine, J.-F. Remacle
Christophe Geuzaine's avatar
Christophe Geuzaine committed
//
// See the LICENSE.txt file for license information. Please report all
Christophe Geuzaine's avatar
Christophe Geuzaine committed
// bugs and problems to the public mailing list <gmsh@geuz.org>.
Christophe Geuzaine's avatar
Christophe Geuzaine committed

#ifndef _GENTITY_H_
#define _GENTITY_H_
#include <list>
#include <string>
#include <vector>
#include "Range.h"
#include "SPoint3.h"
#include "SBoundingBox3d.h"
class GModel;
class GVertex;
class GEdge;
class GFace;
class GRegion;
class MVertex;
Christophe Geuzaine's avatar
 
Christophe Geuzaine committed
class MElement;
Christophe Geuzaine's avatar
 
Christophe Geuzaine committed
class VertexArray;
// A geometric model entity.
class GEntity {
 private:
Christophe Geuzaine's avatar
Christophe Geuzaine committed
  // all entities are owned by a GModel
  GModel *_model;
Laurent Van Migroet's avatar
Laurent Van Migroet committed

Christophe Geuzaine's avatar
Christophe Geuzaine committed
  // the tag (the number) of this entity
  int _tag;
Laurent Van Migroet's avatar
Laurent Van Migroet committed

  // gives the number of the master entity in periodic mesh, gives _tag
Christophe Geuzaine's avatar
Christophe Geuzaine committed
  // if non-periodic
Christophe Geuzaine's avatar
Christophe Geuzaine committed
  // the visibility and the selection flag
  char _visible, _selection;
Laurent Van Migroet's avatar
Laurent Van Migroet committed

Christophe Geuzaine's avatar
Christophe Geuzaine committed
  // flag storing if all mesh elements are visible
Christophe Geuzaine's avatar
 
Christophe Geuzaine committed
  char _allElementsVisible;

Christophe Geuzaine's avatar
Christophe Geuzaine committed
  // the color of the entity (ignored if set to transparent blue)
  unsigned int _color;
Laurent Van Migroet's avatar
Laurent Van Migroet committed

 public: // these will become protected at some point
Christophe Geuzaine's avatar
Christophe Geuzaine committed
  // the mesh vertices uniquely owned by the entity
  std::vector<MVertex*> mesh_vertices;

  // corresponding principal vertices
  std::map<GVertex*,GVertex*> vertexCounterparts;

Christophe Geuzaine's avatar
Christophe Geuzaine committed
  // the physical entitites (if any) that contain this entity
  std::vector<int> physicals;

Christophe Geuzaine's avatar
Christophe Geuzaine committed
  // vertex arrays to draw the mesh efficiently
  VertexArray *va_lines, *va_triangles;
Christophe Geuzaine's avatar
 
Christophe Geuzaine committed

Christophe Geuzaine's avatar
Christophe Geuzaine committed
  // all known native model types
Christophe Geuzaine's avatar
 
Christophe Geuzaine committed
  enum ModelType {
    UnknownModel,
    GmshModel,
    FourierModel,
    OpenCascadeModel,
    AcisModel
Christophe Geuzaine's avatar
 
Christophe Geuzaine committed
  };

Christophe Geuzaine's avatar
Christophe Geuzaine committed
  // all known entity types
  enum GeomType {
    Unknown,
    Point,
Christophe Geuzaine's avatar
 
Christophe Geuzaine committed
    BoundaryLayerPoint,
    Line,
    Circle,
    Ellipse,
    Conic,
    Parabola,
    Hyperbola,
    TrimmedCurve,
    OffsetCurve,
    BSpline,
    Bezier,
    ParametricCurve,
Christophe Geuzaine's avatar
 
Christophe Geuzaine committed
    BoundaryLayerCurve,
    CompoundCurve,
    DiscreteCurve,
    Plane,
    Nurb,
    Cylinder,
    Sphere,
    Cone,
    Torus,
    RuledSurface,
    ParametricSurface,
Akash Anand's avatar
 
Akash Anand committed
    ProjectionFace,
    BezierSurface,
    SurfaceOfRevolution,
Christophe Geuzaine's avatar
 
Christophe Geuzaine committed
    BoundaryLayerSurface,
    DiscreteSurface,
    CompoundSurface,
    Volume,
    CompoundVolume,
    PartitionVertex,
    PartitionSurface
Christophe Geuzaine's avatar
Christophe Geuzaine committed
    PENDING,
    DONE,
Christophe Geuzaine's avatar
Christophe Geuzaine committed
  // return a string describing the entity type
  virtual std::string getTypeString()
  {
Christophe Geuzaine's avatar
 
Christophe Geuzaine committed
    const char *name[] = {
      "Unknown",
      "Point",
Christophe Geuzaine's avatar
 
Christophe Geuzaine committed
      "Boundary layer point",
      "Line",
      "Circle",
      "Ellipse",
      "Conic",
      "Parabola",
      "Hyperbola",
      "TrimmedCurve",
      "OffsetCurve",
      "BSpline",
      "Bezier",
      "Parametric curve",
Christophe Geuzaine's avatar
 
Christophe Geuzaine committed
      "Boundary layer curve",
      "Compound curve",
      "Discrete curve",
      "Plane",
      "Nurb",
      "Cylinder",
      "Sphere",
      "Cone",
      "Torus",
      "Ruled surface",
      "Parametric surface",
Christophe Geuzaine's avatar
 
Christophe Geuzaine committed
      "Projection surface",
      "Bezier surface",
      "Surface of Revolution",
Christophe Geuzaine's avatar
 
Christophe Geuzaine committed
      "Boundary layer surface",
      "Discrete surface",
      "Compound surface",
      "Volume",
      "Compound Volume",
      "Partition vertex",
      "Partition curve",
      "Partition surface"
    unsigned int type = (unsigned int)geomType();
    if(type >= sizeof(name) / sizeof(name[0]))
      return "Undefined";
    else
      return name[type];
  }

  virtual ~GEntity(){}
Christophe Geuzaine's avatar
 
Christophe Geuzaine committed
  // delete the mesh data
  virtual void deleteMesh(){}

Christophe Geuzaine's avatar
Christophe Geuzaine committed
  // delete the vertex arrays, used to to draw the mesh efficiently
Christophe Geuzaine's avatar
 
Christophe Geuzaine committed
  void deleteVertexArrays();

Christophe Geuzaine's avatar
Christophe Geuzaine committed
  // spatial dimension of the entity
  virtual int dim() const { return -1; }
Christophe Geuzaine's avatar
Christophe Geuzaine committed
  // regions that bound this entity or that this entity bounds.
  virtual std::list<GRegion*> regions() const { return std::list<GRegion*>(); }
Christophe Geuzaine's avatar
Christophe Geuzaine committed
  // faces that bound this entity or that this entity bounds.
  virtual std::list<GFace*> faces() const { return std::list<GFace*>(); }
Christophe Geuzaine's avatar
Christophe Geuzaine committed
  // edges that bound this entity or that this entity bounds.
  virtual std::list<GEdge*> edges() const { return std::list<GEdge*>(); }
Christophe Geuzaine's avatar
Christophe Geuzaine committed
  // vertices that bound this entity.
  virtual std::list<GVertex*> vertices() const { return std::list<GVertex*>(); }
  // for python, temporary solution while iterator are not binded
Christophe Geuzaine's avatar
Christophe Geuzaine committed
  std::vector<GRegion*> bindingsGetRegions() {
    std::list<GRegion*> r = regions();  // NOTE : two-line to dont create two different lists with diff pointers
    return std::vector<GRegion*> (r.begin(), r.end());
  }
  std::vector<GFace*> bindingsGetFaces() {
    std::list<GFace*> f = faces();
    return std::vector<GFace*> (f.begin(), f.end());
  }
  std::vector<GEdge*> bindingsGetEdges() {
    std::list<GEdge*> e = edges();
    return std::vector<GEdge*> (e.begin(), e.end());
  }
  std::vector<GVertex*> bindingsGetVertices() {
    std::list<GVertex*> v = vertices();
    return std::vector<GVertex*> (v.begin(), v.end());
  }

Christophe Geuzaine's avatar
Christophe Geuzaine committed
  // underlying geometric representation of this entity.
  virtual GeomType geomType() const { return Unknown; }
Christophe Geuzaine's avatar
Christophe Geuzaine committed
  // true if parametric space is continuous in the "dim" direction.
Christophe Geuzaine's avatar
 
Christophe Geuzaine committed
  virtual bool continuous(int dim) const { return true; }
Christophe Geuzaine's avatar
Christophe Geuzaine committed
  // true if entity is periodic in the "dim" direction.
Christophe Geuzaine's avatar
 
Christophe Geuzaine committed
  virtual bool periodic(int dim) const { return false; }
  virtual double period(int dim) const { return 0.0; }
Christophe Geuzaine's avatar
Christophe Geuzaine committed
  // true if there are parametric degeneracies in the "dim" direction.
Christophe Geuzaine's avatar
 
Christophe Geuzaine committed
  virtual bool degenerate(int dim) const { return false; }
Christophe Geuzaine's avatar
 
Christophe Geuzaine committed
  // does the entity have a parametrization?
  virtual bool haveParametrization(){ return true; }

Christophe Geuzaine's avatar
Christophe Geuzaine committed
  // parametric bounds of the entity in the "i" direction.
  virtual Range<double> parBounds(int i) const { return Range<double>(0., 0.); }
Christophe Geuzaine's avatar
Christophe Geuzaine committed
  // modeler tolerance for the entity.
Christophe Geuzaine's avatar
 
Christophe Geuzaine committed
  virtual double tolerance() const { return 1.e-14; }
Christophe Geuzaine's avatar
Christophe Geuzaine committed
  // true if the entity contains the given point to within tolerance.
  virtual bool containsPoint(const SPoint3 &pt) const { return false; }
Christophe Geuzaine's avatar
Christophe Geuzaine committed
  // get the native type of the particular representation
  virtual ModelType getNativeType() const { return UnknownModel; }
Christophe Geuzaine's avatar
 
Christophe Geuzaine committed

Christophe Geuzaine's avatar
Christophe Geuzaine committed
  // get the native pointer of the particular representation
  virtual void *getNativePtr() const { return 0; }
  
  // get the native id (int) of the particular representation
  virtual int getNativeInt() const { return 0; }
Christophe Geuzaine's avatar
Christophe Geuzaine committed
  // the model owning this entity
Christophe Geuzaine's avatar
 
Christophe Geuzaine committed
  GModel *model() const { return _model; }
Christophe Geuzaine's avatar
Christophe Geuzaine committed
  // get/set the tag of the entity
Christophe Geuzaine's avatar
 
Christophe Geuzaine committed
  int tag() const { return _tag; }
Christophe Geuzaine's avatar
 
Christophe Geuzaine committed
  void setTag(int tag) { _tag = tag; }
  // get/set physical entities
Christophe Geuzaine's avatar
pp  
Christophe Geuzaine committed
  virtual void addPhysicalEntity(int physicalTag)
  {
    physicals.push_back(physicalTag);
  }
Christophe Geuzaine's avatar
pp  
Christophe Geuzaine committed
  virtual std::vector<int> getPhysicalEntities()
  {
    return physicals;
  }

  // returns the master entity (for mesh)
  GEntity* meshMaster() const;
  void setMeshMaster(GEntity*);
  void setMeshMaster(GEntity*,const std::vector<double>&);
Christophe Geuzaine's avatar
Christophe Geuzaine committed
  // get the bounding box
  virtual SBoundingBox3d bounds() const { return SBoundingBox3d(); }
Jean-François Remacle's avatar
 
Jean-François Remacle committed
  virtual SOrientedBoundingBox getOBB() {return SOrientedBoundingBox(); }
Christophe Geuzaine's avatar
Christophe Geuzaine committed
  // get/set the visibility flag
Christophe Geuzaine's avatar
 
Christophe Geuzaine committed
  virtual char getVisibility();
  virtual void setVisibility(char val, bool recursive=false){ _visible = val; }
Christophe Geuzaine's avatar
Christophe Geuzaine committed

Christophe Geuzaine's avatar
Christophe Geuzaine committed
  // get/set the selection flag
  virtual char getSelection(){ return _selection; }
  virtual void setSelection(char val){ _selection = val; }
Christophe Geuzaine's avatar
Christophe Geuzaine committed
  // get/set the color
  virtual unsigned int getColor(){ return _color; }
  virtual void setColor(unsigned color){ _color = color; }

Christophe Geuzaine's avatar
Christophe Geuzaine committed
  // return true if we should use this color to represent the entity
  virtual bool useColor();

Christophe Geuzaine's avatar
Christophe Geuzaine committed
  // return an information string for the entity
  virtual std::string getInfoString();
Christophe Geuzaine's avatar
Christophe Geuzaine committed
  // return a type-specific additional information string
  virtual std::string getAdditionalInfoString() { return std::string(""); }
Christophe Geuzaine's avatar
Christophe Geuzaine committed
  // reset the mesh attributes to default values
Christophe Geuzaine's avatar
 
Christophe Geuzaine committed
  virtual void resetMeshAttributes() { return; }

Stefen Guzik's avatar
Stefen Guzik committed
  // number of types of elements
  virtual int getNumElementTypes() const { return 0; }

  // get the number of mesh elements (total and by type) in the entity
  virtual unsigned int getNumMeshElements() { return 0; }
Gaetan Bricteux's avatar
Gaetan Bricteux committed
  virtual unsigned int getNumMeshParentElements() { return 0; }
Gaetan Bricteux's avatar
Gaetan Bricteux committed
  virtual void getNumMeshElements(unsigned *const c) const { }
Stefen Guzik's avatar
Stefen Guzik committed

  // get the start of the array of a type of element
  virtual MElement *const *getStartElementType(int type) const { return 0; }
Christophe Geuzaine's avatar
 
Christophe Geuzaine committed

Christophe Geuzaine's avatar
Christophe Geuzaine committed
  // get the element at the given index
  virtual MElement *getMeshElement(unsigned int index) { return 0; }
Christophe Geuzaine's avatar
 
Christophe Geuzaine committed

Christophe Geuzaine's avatar
Christophe Geuzaine committed
  // get/set all mesh element visibility flag
Christophe Geuzaine's avatar
 
Christophe Geuzaine committed
  bool getAllElementsVisible(){ return _allElementsVisible ? true : false; }
  void setAllElementsVisible(bool val){ _allElementsVisible = val ? 1 : 0; }

Christophe Geuzaine's avatar
Christophe Geuzaine committed
  // get the number of mesh vertices in the entity
Christophe Geuzaine's avatar
Christophe Geuzaine committed
  unsigned int getNumMeshVertices() { return (int)mesh_vertices.size(); }
Christophe Geuzaine's avatar
Christophe Geuzaine committed
  // get the mesh vertex at the given index
  MVertex *getMeshVertex(unsigned int index) { return mesh_vertices[index]; }
  void addMeshVertex(MVertex *v) { mesh_vertices.push_back(v);}

  // relocate mesh vertices using their parametric coordinates
  virtual void relocateMeshVertices(){}

  // clean downcasts
Christophe Geuzaine's avatar
Christophe Geuzaine committed
  GVertex *cast2Vertex();
  GEdge   *cast2Edge();
  GFace   *cast2Face();
  GRegion *cast2Region();

  // periodic data
  std::map<MVertex*,MVertex*> correspondingVertices;

class GEntityLessThan {
 public:
  bool operator()(const GEntity *ent1, const GEntity *ent2) const
  {
    return ent1->tag() < ent2->tag();
  }
};