4 // Copyright (C) 2009-2020 CEA/DEN, EDF R&D
6 // This library is free software; you can redistribute it and/or
7 // modify it under the terms of the GNU Lesser General Public
8 // License as published by the Free Software Foundation; either
9 // version 2.1 of the License, or (at your option) any later version.
11 // This library is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 // Lesser General Public License for more details.
16 // You should have received a copy of the GNU Lesser General Public
17 // License along with this library; if not, write to the Free Software
18 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
26 #include "Hex_defines.hxx"
27 #include "HexEltBase.hxx"
42 class HexaExport Document : public EltBase
44 // Fonctions utilisateur
46 Document (cpchar name, Hex* dad=NULL);
48 int setName (const char* name);
49 void setLevel (int niv);
50 int save (const char* ficxml); // Genere le xml dans un seul fichier
51 int saveVtk (cpchar nomfic);
55 void setTolerance (double tol) { doc_tolerance = std::max (tol, 0.0); }
56 double getTolerance () { return doc_tolerance; }
58 // Creation d'elements
59 Vertex* addVertex (double x=0.0, double y=0.0, double z=0.0);
61 Edge* addEdge (Vertex* va, Vertex* vb);
62 Edge* addEdgeVector (Vertex* va, Vector* vec);
64 Quad* addQuad (Edge* v1, Edge* v2, Edge* v3, Edge* v4);
65 Quad* addQuadVertices (Vertex* v1, Vertex* v2, Vertex* v3, Vertex* v4);
67 Hexa* addHexa (Quad* qa, Quad* qb, Quad* qc, Quad* qd, Quad* qe, Quad* qf);
68 Hexa* addHexaVertices (Vertex* v1, Vertex* v2, Vertex* v3, Vertex* v4,
69 Vertex* v5, Vertex* v6, Vertex* v7, Vertex* v8);
71 Hexa* addHexa2Quads (Quad* q1, Quad* q2);
72 Hexa* addHexa3Quads (Quad* q1, Quad* q2, Quad* q3);
73 Hexa* addHexa4Quads (Quad* q1, Quad* q2, Quad* q3, Quad* q4);
74 Hexa* addHexa5Quads (Quad* q1, Quad* q2, Quad* q3, Quad* q4, Quad* q5);
76 Vector* addVector (double dx=0.0, double dy=0.0, double dz=0.0);
77 Vector* addVectorVertices (Vertex* va, Vertex* vb);
78 Law* addLaw (const char* name, int nbnodes);
79 int addLaws (double lgmoy, bool usemax=true);
81 Group* addHexaGroup (cpchar name);
82 Group* addQuadGroup (cpchar name);
83 Group* addQuadNodeGroup (cpchar name);
84 Group* addHexaNodeGroup (cpchar name);
85 Group* addEdgeGroup (cpchar name);
86 Group* addEdgeNodeGroup (cpchar name);
87 Group* addVertexNodeGroup (cpchar name);
90 // ----------------- Transformations
91 Elements* makeTranslation (Elements* elts, Vector* trans);
92 Elements* makeScale (Elements* elts, Vertex* ver, double k);
93 Elements* makeRotation (Elements* elts, Vertex* ver, Vector* vec,
95 Elements* makeSymmetryPoint (Elements* elts, Vertex* ver);
96 Elements* makeSymmetryLine (Elements* elts, Vertex* ver, Vector* vec);
97 Elements* makeSymmetryPlane (Elements* elts, Vertex* ver, Vector* vec);
99 int performTranslation (Elements* elts, Vector* trans);
100 int performScale (Elements* elts, Vertex* ver, double k);
101 int performRotation (Elements* elts, Vertex* ver, Vector* vec, double angle);
102 int performSymmetryPoint (Elements* elts, Vertex* ver);
103 int performSymmetryLine (Elements* elts, Vertex* ver, Vector* vec);
104 int performSymmetryPlane (Elements* elts, Vertex* ver, Vector* vec);
106 // ----------------- Modifications
107 Elements* disconnectQuad (Hexa* maille, Quad* face);
108 Elements* disconnectEdge (Hexa* maille, Edge* arete);
109 Elements* disconnectVertex (Hexa* maille, Vertex* noeud);
110 Elements* disconnectEdges (Hexas thexas, Edges edges);
112 Elements* replace (Quads pattern, Quads cible, Vertex* p1, Vertex* c1,
113 Vertex* p2, Vertex* c2);
115 int mergeVertices (Vertex* v1, Vertex* v2);
116 int mergeEdges (Edge* e1, Edge* e2, Vertex* v1, Vertex* v2);
117 int mergeQuads (Quad* q1, Quad* q2, Vertex* v1, Vertex* v2,
118 Vertex* v3, Vertex* v4);
120 // ----------------- Associations
121 void clearAssociation ();
122 int associateOpenedLine (Edges mline, NewShapes gline, IntVector tabid,
123 double pstart, double pend);
125 int associateClosedLine (Vertex* mfirst, Edges mline,
126 NewShapes gline, IntVector tabid,
127 double pstart, bool inv);
128 // ----------------- count
133 int countVector () { return doc_vector.size(); }
135 int countGroup () { return (int) doc_group.size(); }
136 int countLaw () { return nbr_laws ; }
137 int countPropagation ();
138 int countShape () { return doc_tab_shape.size() ; }
140 int countUsedHexa ();
141 int countUsedQuad ();
142 int countUsedEdge ();
143 int countUsedVertex ();
145 // ----------------- get par indice
146 Hexa* getHexa (int nro);
147 Quad* getQuad (int nro);
148 Edge* getEdge (int nro);
149 Vertex* getVertex (int nro);
151 Hexa* getUsedHexa (int nro);
152 Quad* getUsedQuad (int nro);
153 Edge* getUsedEdge (int nro);
154 Vertex* getUsedVertex (int nro);
156 Vector* getVector (int nro);
157 NewShape* getShape (int nro);
158 Group* getGroup (int nro);
159 Law* getLaw (int nro);
160 Propagation* getPropagation (int nro);
161 cpchar getFirstExplicitShape();
163 // ----------------- find
164 Vertex* findVertex (double vx, double vy, double vz);
165 Edge* findEdge (Vertex* va, Vertex* vb);
166 Quad* findQuad (Vertex* va, Vertex* vb);
167 Quad* findQuad (Edge* ea, Edge* eb);
168 Hexa* findHexa (Vertex* va, Vertex* vb);
170 Group* findGroup (cpchar name);
171 Law* findLaw (cpchar name);
172 Propagation* findPropagation (Edge* arete);
174 // ----------------- Suppressions
175 int removeHexa (Hexa* maille);
176 int removeQuad (Quad* maille);
177 int removeConnectedHexa (Hexa* maille);
178 int removeElements (Elements* bloc);
179 int removeGroup (Group* grp);
180 int removeLaw (Law* lau);
183 // ----------------- Creations Hexav6
184 Elements* makeCartesianTop (int nx, int ny, int nz);
185 Elements* makeCartesianUni (Vertex* ori, Vector* vx, Vector* vy, Vector* vz,
186 double lx, double ly, double lz,
187 int nx, int ny, int nz);
188 Elements* makeCartesian (Vertex* ori, Vector* vx, Vector* vy, Vector* vz,
189 RealVector tlx, RealVector tly, RealVector tlz);
191 Elements* makeCylinderTop (int nr, int na, int nh);
192 Elements* makeCylinderUni (Vertex* orig, Vector* vx, Vector* vz,
193 double rint, double rext, double ang, double haut,
194 int nr, int na, int nh);
195 Elements* makeCylinder (Vertex* orig, Vector* vx, Vector* vz,
196 RealVector tray, RealVector tang, RealVector thaut);
198 Elements* makePipeTop (int nr, int na, int nh);
199 Elements* makePipeUni (Vertex* orig, Vector* vx, Vector* vz,
200 double rint, double rext, double angle, double haut,
201 int nr, int na, int nh);
202 Elements* makePipe (Vertex* orig, Vector* vx, Vector* vz,
203 RealVector tray, RealVector tang, RealVector thaut);
205 Elements* makeSphericalTop (int nbre, int crit=0);
206 Elements* makeSphericalUni (Vertex* centre, Vector* vx, Vector* vz,
207 double rayon, int nbre, int crit=0);
208 Elements* makeSpherical (Vertex* centre, Vector* vx, Vector* vz,
209 RealVector rayon, int crit=0);
210 Elements* makeSphereTop (int nr, int na, int nh);
211 Elements* makeSphereUni (Vertex* centre, Vector* vx, Vector* vz,
212 double rtrou, double rext, double ang,
213 Vertex* vplan, int nr, int na, int nh);
214 Elements* makeSphere (Vertex* centre, Vector* vx, Vector* vz,
215 RealVector tray, RealVector tang, RealVector thaut);
217 Elements* makeRindTop (int nr, int na, int nh);
218 Elements* makeRindUni (Vertex* centre, Vector* vx, Vector* vz,
219 double raytrou, double rint, double rext,
220 double ang, Vertex* vplan, int nr, int na, int nh);
221 Elements* makeRind (Vertex* centre, Vector* vx, Vector* vz,
222 RealVector tray, RealVector tang, RealVector thaut);
224 BiCylinder* makeCylinders (Vertex* ori1, Vector* z1, double r1, double h1,
225 Vertex* ori2, Vector* z2, double r2, double h2);
226 BiCylinder* makePipes (Vertex* ori1, Vector* z1, double rint1, double rex1,
227 double h1, Vertex* ori2, Vector* z2, double rint2,
228 double rex2, double h2);
230 Elements* extrudeQuadTop (Quad* start, int nbre);
231 Elements* extrudeQuadUni (Quad* start, Vector* dv, double len, int nbre);
232 Elements* extrudeQuad (Quad* start, Vector* dv, RealVector tlen);
234 Elements* extrudeQuadsTop (Quads start, int nbre);
235 Elements* extrudeQuadsUni (Quads start, Vector* axis, double len, int nbre);
236 Elements* extrudeQuads (Quads start, Vector* axis, RealVector tlen);
238 Elements* revolutionQuadUni (Quad* start, Vertex* center, Vector* axis,
239 double angle, int nbre);
240 Elements* revolutionQuad (Quad* start, Vertex* center, Vector* axis,
242 Elements* revolutionQuadsUni (Quads start, Vertex* center, Vector* axis,
243 double angle, int nbre);
244 Elements* revolutionQuads (Quads start, Vertex* center, Vector* axis,
247 Elements* joinQuadUni (Quad* start, Quad* dest, Vertex* v1, Vertex* v2,
248 Vertex* v3, Vertex* v4, int nb);
250 Elements* joinQuadsUni (Quads start, Quad* dest, Vertex* v1, Vertex* v2,
251 Vertex* v3, Vertex* v4, int nb);
253 Elements* joinQuad (Quad* start, Quad* dest, Vertex* va1, Vertex* vb1,
254 Vertex* va2, Vertex* vb2, RealVector& tlen);
256 Elements* joinQuads (Quads start, Quad* dest, Vertex* va1, Vertex* vb1,
257 Vertex* va2, Vertex* vb2, RealVector& tlen);
259 Elements* cutUni (Edge* eddge, int nbre);
260 Elements* cut (Edge* eddge, RealVector& tlen);
262 Group* addGroup (cpchar name, EnumGroup kind);
263 // Fonctions globales
264 bool isSaved () { return doc_saved ; }
266 int appendXml (pfile fstudy); // Genere le xml dans un fichier ouvert
267 cpchar getXml (); // Genere le xml et rend un flux
269 int getLevel () { return doc_db ; }
271 Vertex* findVertex (int id);
273 int closeQuads (Quad* q1, Quad* q2);
275 // ---------------------------------------------------
277 Law* addLaw (Law* law); // lo-add-lololo
279 // ---------------------------------------------------
281 int checkAssociations ();
282 // addShape version Python
283 NewShape* addShape (long forme, const char* name);
286 // addShape HorsPython
287 NewShape* addShape (TopoDS_Shape& forme, const char* name);
290 void dumpPropagation ();
292 Document* copyDocument ();
294 NewShape* getCloud () { return doc_cloud ; }
295 NewShape* addShape (const char* name, EnumShape type);
296 NewShape* findShape (rcstring name);
298 int associateLine (Vertex* mfirst, Edges& mline,
299 NewShapes& gline, IntVector& tabid,
300 double pstart, double pend, bool inv);
302 int clearAssociation (EnumElt type);
303 void clearAssoVertices ();
304 void clearAssoEdges ();
305 void clearAssoQuads ();
308 Elements* replaceHexa (Quads pattern, Vertex* p1, Vertex* c1, Vertex* p2,
309 Vertex* c2, Vertex* p3, Vertex* c3);
310 Elements* replace (Quads pattern, Vertex* p1, Vertex* c1, Vertex* p2,
311 Vertex* c2, Vertex* p3, Vertex* c3)
312 { return replaceHexa (pattern, p1, c1, p2, c2, p3, c3); }
314 Elements* replaceHexas (Quads pattern, Quads cible, Vertex* p1, Vertex* c1,
315 Vertex* p2, Vertex* c2, Vertex* p3, Vertex* c3)
316 { return replace (pattern, cible, p1, c1, p2, c2); }
322 int loadXml (cpchar name);
323 int setXml (cpchar flux);
324 int setXml (cpchar flux, int& position);
326 EltBase* getFirstEltBase (EnumElt type) { return doc_first_elt [type]; }
327 EltBase* getLastEltBase (EnumElt type) { return doc_last_elt [type]; }
328 int getNbrElt (EnumElt type) { return doc_nbr_elt [type]; }
329 void setDeprecated (int level=1);
331 void markAll (int marque, int type=-1);
332 int saveVtk0 (cpchar nomfic);
333 int saveVtk (cpchar radical, int &nro);
335 void putError (cpchar mess, cpchar info1=NULL, cpchar info2=NULL);
336 void hputError (cpchar mess, EltBase* e1, EltBase* e2=NULL);
338 void majReferences (); // M.A.J relation "utilise par"
339 void update () { if (maj_connection) majReferences (); }
340 bool debug (int niv=0) { return doc_db > niv ; }
342 void reorderFaces ();
343 void reorderQuads ();
345 // --------------------------------------------------- Evols Hexa5
346 cpchar getNextName (EnumElt type, std::string& name);
347 std::string getNextName (EnumElt type);
349 virtual char* makeVarName (char* name);
354 // --------------------------------------------------- Evols Hexa6
356 void addHexa (Hexa* elt) { doc_hexas .push_back (elt) ; }
357 void addQuad (Quad* elt) { doc_quads .push_back (elt) ; }
358 void addEdge (Edge* elt) { doc_edges .push_back (elt) ; }
359 void addVertex (Vertex* elt) { doc_vertex.push_back (elt) ; }
366 int parseXml (XmlTree& xml);
368 void replaceVertex (Vertex* v1, Vertex* v2);
369 void replaceEdge (Edge* e1, Edge* e2);
370 int replaceQuad (Quad* q1, Quad* q2);
372 int countElement (EnumElt type);
373 EltBase* getElement (EnumElt type, int nro);
375 void majPropagation ();
379 Elements* clonerElements (Elements* table, Matrix* matrice);
381 // --------------------------------------------------- Evols Hexa3
382 Hexa* addHexaQuadsAB (AnaQuads& strquads);
383 Hexa* addHexaQuadsAC (AnaQuads& strquads);
384 Hexa* addHexaQuadsACE (AnaQuads& strquads);
385 Hexa* addHexaQuadsACD (AnaQuads& strquads);
386 Hexa* addHexaQuadsABCD (AnaQuads& strquads);
387 Hexa* addHexaQuadsACDE (AnaQuads& strquads);
389 EltBase* findElement (EnumElt type, int ident);
390 // --------------------------------------------------- Evols Hexa5
392 int sortShapes (NewShapes& tshapes, IntVector& subid,
393 bool closed, bool inv, double pstart, double pend,
394 EdgeShapes& glines, IntVector& sens, double& lgtotale);
395 int sortEdges (Vertex* vfirst, Edges& mline, Edges& edges, IntVector& sens);
397 void parseShapes (XmlTree& root);
398 void parseAssociation (XmlTree* root, Quad* elt);
399 void parseAssociation (XmlTree* root, Edge* elt);
400 void parseAssociation (XmlTree* root, Vertex* elt);
401 SubShape* parseSubShape (XmlTree* root);
404 friend class EltBase;
415 EltBase* doc_first_elt [EL_MAXI];
416 EltBase* doc_last_elt [EL_MAXI];
417 int doc_nbr_elt [EL_MAXI];
418 double doc_tolerance;
420 std::vector <Law*> doc_laws;
424 int nbr_propagations;
425 bool maj_propagation;
427 std::vector <Propagation*> doc_propagation;
428 std::vector <Group*> doc_group;
429 std::vector <Vector*> doc_vector;
432 // --------------------------------------------------- Evols Hexa3
434 std::vector <Hexa*> doc_used_hexas;
435 std::vector <Quad*> doc_used_quads;
436 std::vector <Edge*> doc_used_edges;
437 std::vector <Vertex*> doc_used_vertex;
444 // --------------------------------------------------- Evols Hexa5
446 static int doc_number;
450 NewShape* doc_cloud; // Nuage de points du doc;
451 std::vector <NewShape*> doc_tab_shape;
453 // --------------------------------------------------- Evols internes Hexa6
454 std::vector <Hexa*> doc_hexas;
455 std::vector <Quad*> doc_quads;
456 std::vector <Edge*> doc_edges;
457 std::vector <Vertex*> doc_vertex;