MAGiC  V5.0
Mailleurs Automatiques de Géometries intégrés à la Cao
CAD4FE_MCBody.h
Aller à la documentation de ce fichier.
1 //####//------------------------------------------------------------
2 //####//------------------------------------------------------------
3 //####// MAGiC
4 //####// Jean Christophe Cuilliere et Vincent FRANCOIS
5 //####// Departement de Genie Mecanique - UQTR
6 //####//------------------------------------------------------------
7 //####// MAGIC est un projet de recherche de l equipe ERICCA
8 //####// du departement de genie mecanique de l Universite du Quebec a Trois Rivieres
9 //####// http://www.uqtr.ca/ericca
10 //####// http://www.uqtr.ca/
11 //####//------------------------------------------------------------
12 //####//------------------------------------------------------------
13 //####//
14 //####// CAD4FE_MCBody.h
15 //####//
16 //####//------------------------------------------------------------
17 //####//------------------------------------------------------------
18 //####// COPYRIGHT 2000-2024
19 //####// jeu 13 jun 2024 11:58:56 EDT
20 //####//------------------------------------------------------------
21 //####//------------------------------------------------------------
22 #ifndef CAD4FE_MCBodyh
23 #define CAD4FE_MCBodyh
24 
25 #include "CAD4FE_MCT_Platform.h"
26 
27 #include "gestionversion.h"
28 #include <mg_geometrie.h>
29 #include "CAD4FE_Graph.h"
30 #include <map>
31 #include <vector>
32 
33 #pragma hdrstop
34 
35 #define MCBODY_FOR_EACH_MCEDGE(M,E)\
36  HypergraphLib::Graph *G21graph_tmp=M->G21(); \
37  HypergraphLib::Graph::MapArcsById::const_iterator iteratorArcs_tmp; \
38  iteratorArcs_tmp = G21graph_tmp->GetArcs().begin(); \
39  CAD4FE::MCEdge * E = (iteratorArcs_tmp->second != NULL) ? M->GetMCEdge(iteratorArcs_tmp->second) : NULL; \
40  for (iteratorArcs_tmp = G21graph_tmp->GetArcs().begin(); \
41  E != NULL; \
42  iteratorArcs_tmp++ , E = (iteratorArcs_tmp != G21graph_tmp->GetArcs().end() && iteratorArcs_tmp->second != NULL) ? M->GetMCEdge(iteratorArcs_tmp->second) : NULL )
43 
44 
45 #define MCBODY_FOR_EACH_MCFACE(M,F)\
46  HypergraphLib::Graph *G21graph_tmp=M->G21(); \
47  CAD4FE::MCFace * F=M->GetMCFace(G21graph_tmp->GetNodes().begin()->second); \
48  if (G21graph_tmp->GetNodes().size() != 0)\
49  for (HypergraphLib::Graph::MapNodesById::const_iterator iteratorNodes_tmp = G21graph_tmp->GetNodes().begin() \
50  ; \
51  F != NULL; \
52  iteratorNodes_tmp++ , F = (iteratorNodes_tmp != G21graph_tmp->GetNodes().end()) ? M->GetMCFace(iteratorNodes_tmp->second) : NULL )
53 
54 
55 #define MCBODY_FOR_EACH_MCVERTEX(M,V)\
56  HypergraphLib::Graph *G10graph_tmp=M->G10();\
57  CAD4FE::MCVertex * V=M->GetMCVertex(G10graph_tmp->GetArcs().begin()->second); \
58  if (G10graph_tmp->GetArcs().size() != 0) \
59  for (HypergraphLib::Graph::MapArcsById::const_iterator iteratorArcs_tmp = G10graph_tmp->GetArcs().begin() \
60  ; \
61  V != NULL ; \
62  iteratorArcs_tmp++ , V = (iteratorArcs_tmp != G10graph_tmp->GetArcs().end()) ? M->GetMCVertex(iteratorArcs_tmp->second) : NULL )
63 
65 class MG_GEOMETRIE;
66 class MG_COARETE;
67 
68 namespace CAD4FE {
69 
70  class MCEdge;
71  class MCFace;
72  class MCVertex;
73  class Vector3dKey;
74  class PolyCurve;
75 
76  class RTChanges {
77  public:
78  RTChanges(){};
80  std::multimap < MG_FACE *, MG_FACE * > F;
82  std::multimap < MG_ARETE *, MG_ARETE * > E;
84  std::multimap < MG_SOMMET *, MG_SOMMET * > V;
86  void Merge(RTChanges&);
87  };
88 
89  class MCTChanges {
90  public:
93  std::multimap < MCFace * , MCFace * > F;
95  std::multimap < MCEdge * , MCEdge * > E;
97  std::multimap < MCVertex * , MCVertex * > V;
99  void Merge(MCTChanges&);
100  };
101 
102  class MCBody {
103  public:
104  typedef std::map<int, MCFace*> MapMCFaceById;
105  typedef std::map<int, MCEdge*> MapMCEdgeById;
106  typedef std::map<int, MCVertex*> MapMCVertexById;
107 
108  MCBody(MG_GEOMETRIE * __refGeom, MG_VOLUME * __refBody);
109  // Destruction routines
110  ~MCBody();
111 
112  // Construction routines
113  void ReInit();
114  void InitHyperGraphs();
115  double EvaluateBoundaryShape(Graph::Arc *__arcG2V, double __RMin);
116  void InitializeRealGeomData();
118  int G2ToNeatoFile (Graph::Graph * __G2, char * __filename, char *__graphname);
119  int G1ToNeatoFile (Graph::Graph * __G1, char * __filename, char *__graphname);
120 
121  Graph::Arc * GetG2ArcFromG1Node(const Graph::Node *) const;
122 
123  Graph::Graph * G10() const;
124  Graph::Graph * G21() const;
125  Graph::Graph * G20() const;
126 
128 
129  // Link userdata in hypergraphs
132 
133  // MC Face
134  MCFace * AddMCFace(MG_FACE * __refFace);
135  MCFace * AddMCFace(MCFace *__a, MCFace *__b);
136  MCFace* GetMCFace(const int) const;
137  static MCFace* GetMCFace(Graph::GraphObject * __graphObject);
138  bool Contains(MCFace *) const;
139  void DeleteMCFace(MCFace * __mcFace);
140  // MC Edge
141  MCEdge * AddMCEdge(MG_ARETE * __refEdge);
142  void AddMCEdgeCovertices(MCEdge * __mcEdge, std::vector<MCVertex *> __mcVertex);
143  void DeleteMCEdgeCovertices(MCEdge * __mcEdge);
144  void DeleteMCEdge(MCEdge *__mcEdge);
145  MCEdge * AddMCEdge(MCEdge *__A, MCEdge *__B);
146  MCEdge * AddMCEdge(PolyCurve * );
147  MCEdge* GetMCEdge(const int ) const;
148  static MCEdge* GetMCEdge(Graph::GraphObject * __graphObject);
149  bool Contains(MCEdge *) const;
150  // MC Vertex
151  MCVertex * AddMCVertex(MG_SOMMET * __refVertex);
152  MCVertex * GetMCVertex(const int)const ;
153  void DeleteMCVertex(MCVertex * __mcVertex);
154  static MCVertex * GetMCVertex(Graph::GraphObject * __graphObject);
155  bool Contains(MCVertex *) const;
156 
157  // Create a MCVertex with a defined label
159  // Split an MC edge at one specified position
160  void SplitEdge(MCEdge * __mcEdge, double __xyz[3], MCTChanges * __mctChanges = 0, RTChanges * __rtChanges = 0);
167  void SuppressMCEdge(MCEdge*, MCFace * __replMCFace[3]);
168  // Vertex suppression algorithm
169  void SuppressMCVertex(MCVertex *, MCTChanges * __mctChanges = 0);
170  // Edge-Vertex Contraction operator
171  void ContractEdgeToVertex(MCEdge * __mcEdge, MCVertex * __targetVertex, std::set <MCEdge*> & , std::set <MCEdge*> &);
172  void MergeVertices(MCVertex * __deleteVertex, MCVertex * __targetVertex, std::set<MCEdge*> & edges);
173 
174  // Topological properties of MCEdges
175  std::set < MCFace * > Edge_GetAdjacentFaces(MCEdge * __mcEdge);
176  void Edge_GetVertices (MCEdge *, std::vector<MCVertex*> & __mcVertices);
177 
178  // Topological properties of MCFaces
179  void Face_GetMCVertices (MCFace * __mcFace, std::vector<MCVertex*> & __mcVertices);
180  std::set < MCEdge * > Face_GetAdjacentEdges(MCFace * __mcFace);
181  Graph::Graph * Face_G10SubGraph(MCFace * __mcFace);
182  std::vector < std::vector < MCEdge * > > Face_GetUnsortedLoops(MCFace * __mcFace);
183  std::vector < std::vector < MCEdge * > > Face_GetCycles(MCFace * __mcFace);
184 
185  // Topological properties of MCVertices
186  void Vertex_GetAdjacentEdges(MCVertex * __mcVertex, std::vector<MCEdge *> & __list);
187  void Vertex_GetAdjacentEdges(MCVertex * __mcVertex, std::set<MCEdge *> & __list);
188  void Vertex_GetAdjacentFaces(MCVertex * __mcVertex, std::set<MCFace *> & __list);
189  int TestInteriorVertexIsolatedInFace(MCVertex * __mcVertex, MCFace ** __mcFace);
190 
191  // number of faces, edges, vertices of reference body and mc body
192  void GetFEVCount(int * __faceCount,int * __edgeCount,int * __vertexCount);
193  void GetRefBodyFEVCount(int * __faceCount,int * __edgeCount,int * __vertexCount);
194 
195  // Generate Loops of MC Faces
196  void MCFace_GetLoops(MCFace* __mcFace, const std::set < Graph::Node * > & scc, std::vector < std::vector < std::pair < int, MCEdge * > > > & __loops );
197  MG_COARETE * CreateCoEdge(MCFace * mcFace, MG_BOUCLE * mcLoop, MCEdge * mcEdge);
198  MG_COARETE * CreateCoEdge(MCFace * mcFace, MG_BOUCLE * mcLoop, MCEdge * mcEdge, int sense);
199  int ExportBRep_MCEdgeSense(MCFace * __mcFace, MCEdge * __mcEdge);
200  int ExportBRep_CreateInteriorVertexIsolatedInFace(MCVertex * __mcVertex, MCFace * __mcFace);
201  // Export MC Body hypergraphs to BRep volume
202  MG_VOLUME * ExportBRep();
203  // delete all B-Rep MC entites
204  int DeleteBRep(MG_GESTIONNAIRE * gest, MG_GEOMETRIE * mggeo);
205 
208  int time;
209 
210  private:
217  };
218 
219 }
220 
221 #endif // CAD4FE_VIRTUALTOPOLOGYMODEL_H
CAD4FE::MCBody::SuppressMCEdge
void SuppressMCEdge(MCEdge *, MCFace *__replMCFace[3])
Definition: CAD4FE_MCBody.cpp:877
CAD4FE::MCBody::InitHyperGraphs
void InitHyperGraphs()
Definition: CAD4FE_MCBody.cpp:374
CAD4FE::MCBody::Face_G10SubGraph
Graph::Graph * Face_G10SubGraph(MCFace *__mcFace)
Definition: CAD4FE_MCBody.cpp:1435
CAD4FE::MCBody::MapMCEdgeById
std::map< int, MCEdge * > MapMCEdgeById
Definition: CAD4FE_MCBody.h:105
mg_geometrie.h
CAD4FE::MCBody::_G21
Graph::Graph * _G21
Definition: CAD4FE_MCBody.h:216
MG_BOUCLE
Definition: mg_boucle.h:35
gestionversion.h
CAD4FE::MCBody::SuppressMCVertex
void SuppressMCVertex(MCVertex *, MCTChanges *__mctChanges=0)
Definition: CAD4FE_MCBody.cpp:955
CAD4FE::MCBody::GetMCVertex
MCVertex * GetMCVertex(const int) const
Definition: CAD4FE_MCBody.cpp:346
CAD4FE::MCBody::Face_GetCycles
std::vector< std::vector< MCEdge * > > Face_GetCycles(MCFace *__mcFace)
Definition: CAD4FE_MCBody.cpp:1326
CAD4FE::MCBody::ExportBRep
MG_VOLUME * ExportBRep()
Definition: CAD4FE_MCBody.cpp:1563
CAD4FE::MCBody::CreateCoEdge
MG_COARETE * CreateCoEdge(MCFace *mcFace, MG_BOUCLE *mcLoop, MCEdge *mcEdge)
CAD4FE::PolyCurve
Definition: CAD4FE_PolyCurve.h:38
CAD4FE::MCBody::CreateMCVertex
MCVertex * CreateMCVertex(MG_SOMMET *)
Definition: CAD4FE_MCBody.cpp:595
CAD4FE::MCBody::GetRefBodyFEVCount
void GetRefBodyFEVCount(int *__faceCount, int *__edgeCount, int *__vertexCount)
Definition: CAD4FE_MCBody.cpp:1684
CAD4FE::MCBody::InitializeRealGeomData
void InitializeRealGeomData()
CAD4FE::RTChanges::F
std::multimap< MG_FACE *, MG_FACE * > F
map of old to new faces
Definition: CAD4FE_MCBody.h:78
CAD4FE::MCBody::MCBody
MCBody(MG_GEOMETRIE *__refGeom, MG_VOLUME *__refBody)
Definition: CAD4FE_MCBody.cpp:96
MG_COARETE
Definition: mg_coarete.h:31
CAD4FE::MCBody::DeleteMCVertex
void DeleteMCVertex(MCVertex *__mcVertex)
Definition: CAD4FE_MCBody.cpp:227
CAD4FE_MCT_Platform.h
CAD4FE::MCBody::Edge_GetVertices
void Edge_GetVertices(MCEdge *, std::vector< MCVertex * > &__mcVertices)
Definition: CAD4FE_MCBody.cpp:1224
CAD4FE::MCBody::Face_GetMCVertices
void Face_GetMCVertices(MCFace *__mcFace, std::vector< MCVertex * > &__mcVertices)
Definition: CAD4FE_MCBody.cpp:1380
CAD4FE::MCBody::~MCBody
~MCBody()
Definition: CAD4FE_MCBody.cpp:104
CAD4FE::MCBody::ExportBRep_CreateInteriorVertexIsolatedInFace
int ExportBRep_CreateInteriorVertexIsolatedInFace(MCVertex *__mcVertex, MCFace *__mcFace)
Definition: CAD4FE_MCBody.cpp:1657
CAD4FE::MCBody::GetGeometry
MG_GEOMETRIE * GetGeometry()
Definition: CAD4FE_MCBody.h:127
HypergraphLib::Arc
Definition: hypergraphlib_arc.h:37
CAD4FE::MCBody::DeleteMCFace
void DeleteMCFace(MCFace *__mcFace)
Definition: CAD4FE_MCBody.cpp:221
MG_VOLUME
Definition: mg_volume.h:33
CAD4FE::MCBody::_G20
Graph::Graph * _G20
Definition: CAD4FE_MCBody.h:215
CAD4FE::MCBody::_G10
Graph::Graph * _G10
Definition: CAD4FE_MCBody.h:214
MG_GESTIONNAIRE
Definition: mg_gestionnaire.h:57
CAD4FE::RTChanges::RTChanges
RTChanges()
Definition: CAD4FE_MCBody.h:78
CAD4FE::RTChanges::Merge
void Merge(RTChanges &)
Merge changes.
CAD4FE::MCBody::_refBody
MG_VOLUME * _refBody
Definition: CAD4FE_MCBody.h:212
CAD4FE::MCBody::Graph_SetUserData
void Graph_SetUserData(MG_ELEMENT_TOPOLOGIQUE *__topo)
Definition: CAD4FE_MCBody.cpp:111
CAD4FE::MCBody::G1ToNeatoFile
int G1ToNeatoFile(Graph::Graph *__G1, char *__filename, char *__graphname)
Definition: CAD4FE_MCBody.cpp:772
CAD4FE::MCBody::_refGeom
MG_GEOMETRIE * _refGeom
Definition: CAD4FE_MCBody.h:211
CAD4FE_Graph.h
CAD4FE::MCBody::InitializeCopyRealToVirtualHyperGraphs
void InitializeCopyRealToVirtualHyperGraphs()
CAD4FE::MCBody::AddMCEdgeCovertices
void AddMCEdgeCovertices(MCEdge *__mcEdge, std::vector< MCVertex * > __mcVertex)
Definition: CAD4FE_MCBody.cpp:194
CAD4FE::RTChanges::V
std::multimap< MG_SOMMET *, MG_SOMMET * > V
map of old to new vertices
Definition: CAD4FE_MCBody.h:84
MG_ELEMENT_TOPOLOGIQUE
Definition: mg_element_topologique.h:51
CAD4FE::MCBody::G2ToNeatoFile
int G2ToNeatoFile(Graph::Graph *__G2, char *__filename, char *__graphname)
Definition: CAD4FE_MCBody.cpp:579
CAD4FE::MCBody::G10
Graph::Graph * G10() const
Definition: CAD4FE_MCBody.cpp:292
CAD4FE::MCBody::ContractEdgeToVertex
void ContractEdgeToVertex(MCEdge *__mcEdge, MCVertex *__targetVertex, std::set< MCEdge * > &, std::set< MCEdge * > &)
Definition: CAD4FE_MCBody.cpp:1105
CAD4FE::MCTChanges::MCTChanges
MCTChanges()
Definition: CAD4FE_MCBody.h:91
CAD4FE::MCBody::DeleteBRep
int DeleteBRep(MG_GESTIONNAIRE *gest, MG_GEOMETRIE *mggeo)
Definition: CAD4FE_MCBody.cpp:1689
CAD4FE::RTChanges::E
std::multimap< MG_ARETE *, MG_ARETE * > E
map of old to new edges
Definition: CAD4FE_MCBody.h:82
CAD4FE::MCBody::MergeVertices
void MergeVertices(MCVertex *__deleteVertex, MCVertex *__targetVertex, std::set< MCEdge * > &edges)
Definition: CAD4FE_MCBody.cpp:1044
CAD4FE::MCBody::ExportBRep_MCEdgeSense
int ExportBRep_MCEdgeSense(MCFace *__mcFace, MCEdge *__mcEdge)
Definition: CAD4FE_MCBody.cpp:1467
CAD4FE::MCBody::GetG2ArcFromG1Node
Graph::Arc * GetG2ArcFromG1Node(const Graph::Node *) const
CAD4FE::MCBody::AddMCEdge
MCEdge * AddMCEdge(MG_ARETE *__refEdge)
Definition: CAD4FE_MCBody.cpp:232
CAD4FE::MCBody::GetFEVCount
void GetFEVCount(int *__faceCount, int *__edgeCount, int *__vertexCount)
Definition: CAD4FE_MCBody.cpp:1677
CAD4FE::MCBody::GetMCEdge
MCEdge * GetMCEdge(const int) const
Definition: CAD4FE_MCBody.cpp:307
CAD4FE::MCBody::AddMCFace
MCFace * AddMCFace(MG_FACE *__refFace)
Definition: CAD4FE_MCBody.cpp:153
CAD4FE::MCVertex
Definition: CAD4FE_MCVertex.h:35
CAD4FE::MCBody::MapMCVertexById
std::map< int, MCVertex * > MapMCVertexById
Definition: CAD4FE_MCBody.h:106
HypergraphLib::GraphObject
Definition: hypergraphlib_graphobject.h:31
CAD4FE::MCBody::SplitEdge
void SplitEdge(MCEdge *__mcEdge, double __xyz[3], MCTChanges *__mctChanges=0, RTChanges *__rtChanges=0)
Definition: CAD4FE_MCBody.cpp:612
CAD4FE::MCBody::DeleteMCEdgeCovertices
void DeleteMCEdgeCovertices(MCEdge *__mcEdge)
Definition: CAD4FE_MCBody.cpp:210
CAD4FE::MCBody::MapMCFaceById
std::map< int, MCFace * > MapMCFaceById
Definition: CAD4FE_MCBody.h:104
CAD4FE::MCBody::Edge_GetAdjacentFaces
std::set< MCFace * > Edge_GetAdjacentFaces(MCEdge *__mcEdge)
Definition: CAD4FE_MCBody.cpp:1240
CAD4FE::MCBody::TestInteriorVertexIsolatedInFace
int TestInteriorVertexIsolatedInFace(MCVertex *__mcVertex, MCFace **__mcFace)
Definition: CAD4FE_MCBody.cpp:1638
CAD4FE::MCBody::Vertex_GetAdjacentFaces
void Vertex_GetAdjacentFaces(MCVertex *__mcVertex, std::set< MCFace * > &__list)
Definition: CAD4FE_MCBody.cpp:1422
CAD4FE::MCBody::G20
Graph::Graph * G20() const
Definition: CAD4FE_MCBody.cpp:302
CAD4FE::MCBody::Face_GetAdjacentEdges
std::set< MCEdge * > Face_GetAdjacentEdges(MCFace *__mcFace)
Definition: CAD4FE_MCBody.cpp:1266
HypergraphLib::Graph
Definition: hypergraphlib_graph.h:58
CAD4FE::MCBody::Contains
bool Contains(MCFace *) const
Definition: CAD4FE_MCBody.cpp:185
HypergraphLib::Node
Definition: hypergraphlib_node.h:35
CAD4FE::MCEdge
Definition: CAD4FE_MCEdge.h:48
CAD4FE::RTChanges
Definition: CAD4FE_MCBody.h:76
CAD4FE::MCBody::AddMCVertex
MCVertex * AddMCVertex(MG_SOMMET *__refVertex)
Definition: CAD4FE_MCBody.cpp:334
CAD4FE::MCBody::GetMCFace
MCFace * GetMCFace(const int) const
Definition: CAD4FE_MCBody.cpp:174
CAD4FE::MCTChanges::V
std::multimap< MCVertex *, MCVertex * > V
map of old to new vertices
Definition: CAD4FE_MCBody.h:97
CAD4FE::MCTChanges::F
std::multimap< MCFace *, MCFace * > F
map of old to new faces
Definition: CAD4FE_MCBody.h:91
MG_GEOMETRIE
Definition: mg_geometrie.h:84
CAD4FE
Definition: CAD4FE_ClosestPoint_Segment_MG_ARETE.h:34
CAD4FE::MCBody::G21
Graph::Graph * G21() const
Definition: CAD4FE_MCBody.cpp:297
CAD4FE::MCTChanges::E
std::multimap< MCEdge *, MCEdge * > E
map of old to new edges
Definition: CAD4FE_MCBody.h:95
CAD4FE::MCBody
Definition: CAD4FE_MCBody.h:102
MG_ARETE
Definition: mg_arete.h:36
MG_FACE
Definition: mg_face.h:34
CAD4FE::MCFace
Definition: CAD4FE_MCFace.h:50
CAD4FE::MCBody::time
int time
Definition: CAD4FE_MCBody.h:208
MG_SOMMET
Definition: mg_sommet.h:35
CAD4FE::MCBody::_brep
MG_VOLUME * _brep
Definition: CAD4FE_MCBody.h:213
CAD4FE::MCTChanges
Definition: CAD4FE_MCBody.h:89
CAD4FE::MCTChanges::Merge
void Merge(MCTChanges &)
Merge changes.
Definition: CAD4FE_MCBody.cpp:57
CAD4FE::MCBody::Vertex_GetAdjacentEdges
void Vertex_GetAdjacentEdges(MCVertex *__mcVertex, std::vector< MCEdge * > &__list)
Definition: CAD4FE_MCBody.cpp:1393
CAD4FE::MCBody::DeleteMCEdge
void DeleteMCEdge(MCEdge *__mcEdge)
Definition: CAD4FE_MCBody.cpp:215
CAD4FE::MCBody::ReInit
void ReInit()
CAD4FE::MCBody::EvaluateBoundaryShape
double EvaluateBoundaryShape(Graph::Arc *__arcG2V, double __RMin)
CAD4FE::MCBody::MCFace_GetLoops
void MCFace_GetLoops(MCFace *__mcFace, const std::set< Graph::Node * > &scc, std::vector< std::vector< std::pair< int, MCEdge * > > > &__loops)
CAD4FE::MCBody::Face_GetUnsortedLoops
std::vector< std::vector< MCEdge * > > Face_GetUnsortedLoops(MCFace *__mcFace)
Definition: CAD4FE_MCBody.cpp:1290