4 // Copyright (C) 2009-2013 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.
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 "HexEltBase.hxx"
33 class Document : public EltBase
35 // Fonctions utilisateur
37 Document (cpchar name, Hex* dad=NULL);
39 int setName (const char* name);
40 void setLevel (int niv);
41 int save (const char* ficxml); // Genere le xml dans un seul fichier
42 int saveVtk (cpchar nomfic);
46 void setTolerance (double tol) { doc_tolerance = std::max (tol, 0.0); }
47 double getTolerance () { return doc_tolerance; }
49 // Creation d'elements
50 Vertex* addVertex (double x=0.0, double y=0.0, double z=0.0);
52 Edge* addEdge (Vertex* va, Vertex* vb);
53 Edge* addEdgeVector (Vertex* va, Vector* vec);
55 Quad* addQuad (Edge* v1, Edge* v2, Edge* v3, Edge* v4);
56 Quad* addQuadVertices (Vertex* v1, Vertex* v2, Vertex* v3, Vertex* v4);
58 Hexa* addHexa (Quad* qa, Quad* qb, Quad* qc, Quad* qd, Quad* qe, Quad* qf);
59 Hexa* addHexaVertices (Vertex* v1, Vertex* v2, Vertex* v3, Vertex* v4,
60 Vertex* v5, Vertex* v6, Vertex* v7, Vertex* v8);
62 Hexa* addHexa2Quads (Quad* q1, Quad* q2);
63 Hexa* addHexa3Quads (Quad* q1, Quad* q2, Quad* q3);
64 Hexa* addHexa4Quads (Quad* q1, Quad* q2, Quad* q3, Quad* q4);
65 Hexa* addHexa5Quads (Quad* q1, Quad* q2, Quad* q3, Quad* q4, Quad* q5);
67 Vector* addVector (double dx=0.0, double dy=0.0, double dz=0.0);
68 Vector* addVectorVertices (Vertex* va, Vertex* vb);
69 Law* addLaw (const char* name, int nbnodes);
70 int addLaws (double lgmoy, bool usemax=true);
72 Group* addHexaGroup (cpchar name);
73 Group* addQuadGroup (cpchar name);
74 Group* addQuadNodeGroup (cpchar name);
75 Group* addHexaNodeGroup (cpchar name);
76 Group* addEdgeGroup (cpchar name);
77 Group* addEdgeNodeGroup (cpchar name);
78 Group* addVertexNodeGroup (cpchar name);
81 // ----------------- Transformations
82 Elements* makeTranslation (Elements* elts, Vector* trans);
83 Elements* makeScale (Elements* elts, Vertex* ver, double k);
84 Elements* makeRotation (Elements* elts, Vertex* ver, Vector* vec,
86 Elements* makeSymmetryPoint (Elements* elts, Vertex* ver);
87 Elements* makeSymmetryLine (Elements* elts, Vertex* ver, Vector* vec);
88 Elements* makeSymmetryPlane (Elements* elts, Vertex* ver, Vector* vec);
90 int performTranslation (Elements* elts, Vector* trans);
91 int performScale (Elements* elts, Vertex* ver, double k);
92 int performRotation (Elements* elts, Vertex* ver, Vector* vec, double angle);
93 int performSymmetryPoint (Elements* elts, Vertex* ver);
94 int performSymmetryLine (Elements* elts, Vertex* ver, Vector* vec);
95 int performSymmetryPlane (Elements* elts, Vertex* ver, Vector* vec);
97 // ----------------- Modifications
98 Elements* cut (Edge* edge, int nbcuts);
99 Elements* disconnectQuad (Hexa* maille, Quad* face);
100 Elements* disconnectEdge (Hexa* maille, Edge* arete);
101 Elements* disconnectVertex (Hexa* maille, Vertex* noeud);
102 Elements* disconnectEdges (Hexas thexas, Edges edges);
104 Elements* replace (Quads pattern, Vertex* p1, Vertex* c1,
105 Vertex* p2, Vertex* c2, Vertex* p3, Vertex* c3);
107 int mergeVertices (Vertex* v1, Vertex* v2);
108 int mergeEdges (Edge* e1, Edge* e2, Vertex* v1, Vertex* v2);
109 int mergeQuads (Quad* q1, Quad* q2, Vertex* v1, Vertex* v2,
110 Vertex* v3, Vertex* v4);
112 // ----------------- Associations
113 void clearAssociation ();
114 int associateOpenedLine (Edges mline, NewShapes gline, IntVector tabid,
115 double pstart, double pend);
117 int associateClosedLine (Vertex* mfirst, Edges mline,
118 NewShapes gline, IntVector tabid,
119 double pstart, bool inv);
120 // ----------------- count
125 int countVector () { return doc_vector.size(); }
127 int countGroup () { return (int) doc_group.size(); }
128 int countLaw () { return nbr_laws ; }
129 int countPropagation ();
130 int countShape () { return doc_tab_shape.size() ; }
132 int countUsedHexa ();
133 int countUsedQuad ();
134 int countUsedEdge ();
135 int countUsedVertex ();
137 int countCylinder () { return doc_cylinder.size(); }
138 int countPipe () { return doc_pipe.size(); }
140 // ----------------- get par indice
141 Hexa* getHexa (int nro);
142 Quad* getQuad (int nro);
143 Edge* getEdge (int nro);
144 Vertex* getVertex (int nro);
146 Hexa* getUsedHexa (int nro);
147 Quad* getUsedQuad (int nro);
148 Edge* getUsedEdge (int nro);
149 Vertex* getUsedVertex (int nro);
151 Vector* getVector (int nro);
152 Cylinder* getCylinder (int nro);
153 Pipe* getPipe (int nro);
154 NewShape* getShape (int nro);
155 Group* getGroup (int nro);
156 Law* getLaw (int nro);
157 Propagation* getPropagation (int nro);
159 // ----------------- find
160 Vertex* findVertex (double vx, double vy, double vz);
161 Edge* findEdge (Vertex* va, Vertex* vb);
162 Quad* findQuad (Vertex* va, Vertex* vb);
163 Hexa* findHexa (Vertex* va, Vertex* vb);
165 Group* findGroup (cpchar name);
166 Law* findLaw (cpchar name);
167 Propagation* findPropagation (Edge* arete);
169 // ----------------- Suppressions
170 int removeHexa (Hexa* maille);
171 int removeQuad (Quad* maille);
172 int removeConnectedHexa (Hexa* maille);
173 int removeElements (Elements* bloc);
174 int removeGroup (Group* grp);
175 int removeLaw (Law* lau);
178 // ----------------- Creations Hexav6
179 Elements* makeCartesianTop (int nx, int ny, int nz);
180 Elements* makeCartesianUni (Vertex* ori, Vector* vx, Vector* vy, Vector* vz,
181 double lx, double ly, double lz,
182 int nx, int ny, int nz);
183 Elements* makeCartesian (Vertex* ori, Vector* vx, Vector* vy, Vector* vz,
184 RealVector tlx, RealVector tly, RealVector tlz);
186 Elements* makeCylinderTop (int nr, int na, int nh);
187 Elements* makeCylinderUni (Vertex* orig, Vector* vx, Vector* vz,
188 double rint, double rext, double ang, double haut,
189 int nr, int na, int nh);
190 Elements* makeCylinder (Vertex* orig, Vector* vx, Vector* vz,
191 RealVector tray, RealVector tang, RealVector thaut);
193 Elements* makePipeTop (int nr, int na, int nh);
194 Elements* makePipeUni (Vertex* orig, Vector* vx, Vector* vz,
195 double rint, double rext, double angle, double haut,
196 int nr, int na, int nh);
197 Elements* makePipe (Vertex* orig, Vector* vx, Vector* vz,
198 RealVector tray, RealVector tang, RealVector thaut);
200 Elements* makeSphericalTop (int nbre, int crit=0);
201 Elements* makeSphericalUni (Vertex* centre, Vector* vx, Vector* vz,
202 double rayon, int nbre, int crit=0);
203 Elements* makeSpherical (Vertex* centre, Vector* vx, Vector* vz,
204 RealVector rayon, int crit=0);
205 Elements* makeSphereTop (int nr, int na, int nh);
206 Elements* makeSphereUni (Vertex* centre, Vector* vx, Vector* vz,
207 double rtrou, double rext, double ang,
208 Vertex* vplan, int nr, int na, int nh);
209 Elements* makeSphere (Vertex* centre, Vector* vx, Vector* vz,
210 RealVector tray, RealVector tang, RealVector thaut);
212 Elements* makeRindTop (int nr, int na, int nh);
213 Elements* makeRindUni (Vertex* centre, Vector* vx, Vector* vz,
214 double raytrou, double rint, double rext,
215 double ang, Vertex* vplan, int nr, int na, int nh);
216 Elements* makeRind (Vertex* centre, Vector* vx, Vector* vz,
217 RealVector tray, RealVector tang, RealVector thaut);
219 BiCylinder* makeCylinders (Vertex* ori1, Vector* z1, double r1, double h1,
220 Vertex* ori2, Vector* z2, double r2, double h2);
221 BiCylinder* makePipes (Vertex* ori1, Vector* z1, double rint1, double rex1,
222 double h1, Vertex* ori2, Vector* z2, double rint2,
223 double rex2, double h2);
225 Elements* extrudeQuadTop (Quad* start, int nbre);
226 Elements* extrudeQuadUni (Quad* start, Vector* dv, double len, int nbre);
227 Elements* extrudeQuad (Quad* start, Vector* dv, RealVector tlen);
229 Elements* extrudeQuadsTop (Quads start, int nbre);
230 Elements* extrudeQuadsUni (Quads start, Vector* axis, double len, int nbre);
231 Elements* extrudeQuads (Quads start, Vector* axis, RealVector tlen);
233 Elements* revolutionQuadUni (Quad* start, Vertex* center, Vector* axis,
234 double angle, int nbre);
235 Elements* revolutionQuad (Quad* start, Vertex* center, Vector* axis,
237 Elements* revolutionQuadsUni (Quads start, Vertex* center, Vector* axis,
238 double angle, int nbre);
239 Elements* revolutionQuads (Quads start, Vertex* center, Vector* axis,
242 Elements* joinQuadUni (Quad* start, Quad* dest, Vertex* v1, Vertex* v2,
243 Vertex* v3, Vertex* v4, int nb);
245 Elements* joinQuadsUni (Quads start, Quad* dest, Vertex* v1, Vertex* v2,
246 Vertex* v3, Vertex* v4, int nb);
248 Elements* joinQuad (Quad* start, Quad* dest, Vertex* va1, Vertex* vb1,
249 Vertex* va2, Vertex* vb2, RealVector& tlen);
251 Elements* joinQuads (Quads start, Quad* dest, Vertex* va1, Vertex* vb1,
252 Vertex* va2, Vertex* vb2, RealVector& tlen);
254 Elements* cutUni (Edge* eddge, int nbre);
255 Elements* cut (Edge* eddge, RealVector& tlen);
257 Group* addGroup (cpchar name, EnumGroup kind);
258 // Fonctions globales
259 bool isSaved () { return doc_saved ; }
261 int appendXml (pfile fstudy); // Genere le xml dans un fichier ouvert
262 cpchar getXml (); // Genere le xml et rend un flux
264 int getLevel () { return doc_db ; }
266 Elements* makeCartesian (Vertex* v, Vector* v1, // Obsolete
267 int px, int py, int pz, int mx=0, int my=0, int mz=0);
269 Vertex* findVertex (int id);
271 int closeQuads (Quad* q1, Quad* q2);
273 // ---------------------------------------------------
275 Law* addLaw (Law* law); // lo-add-lololo
277 // ---------------------------------------------------
279 int checkAssociations ();
280 // addShape version Python
281 NewShape* addShape (long forme, const char* name);
284 // addShape HorsPython
285 NewShape* addShape (TopoDS_Shape& forme, const char* name);
286 // ----------------- Perimes Hexav6
287 Cylinder* addCylinder (Vertex* b, Vector* d, double r, double h);
288 Pipe* addPipe (Vertex* b, Vector* d, double ri, double re, double h);
289 Elements* makeCartesian (Vertex* v, Vector* v1, Vector* v2, Vector* v3,
290 int px, int py, int pz);
292 Elements* makeCartesian1 (Vertex* v, Vector* v1, Vector* v2, Vector* v3,
293 int px, int py, int pz, int mx, int my, int mz);
295 Elements* makeCylindrical (Vertex* c, Vector* b, Vector* h, double dr,
296 double da, double dl, int nr, int na, int nl,
298 Elements* makeCylindricals (Vertex* c, Vector* b, Vector* h,
299 RealVector tdr, RealVector tda, RealVector tdh,
302 Elements* makeCylinder (Cylinder* cyl, Vector* vx, int nr, int na, int nl);
303 Elements* makePipe (Pipe* pip, Vector* vx, int nr, int na, int nl);
305 Elements* makeSpherical (Vertex* center, double rayon, int nb, double k);
307 CrossElements* makeCylinders (Cylinder* cyl1, Cylinder* cyl2);
308 CrossElements* makePipes (Pipe* pipe1, Pipe* pipe2);
309 BiCylinder* makeBiCylinder (Cylinder* cyl1, Cylinder* cyl2);
310 BiCylinder* makeBiPipe (Pipe* pipe1, Pipe* pipe2);
312 Elements* makeSphere (Vertex* center, Vector* vx, Vector* vz,
313 double radius, double radhole,
315 int nrad, int nang, int nhaut);
317 Elements* makePartSphere (Vertex* center, Vector* vx, Vector* vz,
318 double radius, double radhole,
319 Vertex* plorig, double angle,
320 int nrad, int nang, int nhaut);
322 Elements* makeRind (Vertex* center, Vector* vx, Vector* vz,
323 double radext, double radint, double radhole,
325 int nrad, int nang, int nhaut);
327 Elements* makePartRind (Vertex* center, Vector* vx, Vector* vz,
328 double radext, double radint, double radhole,
329 Vertex* plorig, double angle,
330 int nrad, int nang, int nhaut);
332 Elements* prismQuad (Quad* start, Vector* dv, int nb);
333 Elements* prismQuads (Quads start, Vector* dv, int nb);
334 Elements* prismQuadsVec (Quads start, Vector* dv, RealVector th, int k);
336 Elements* revolutionQuadsVec (Quads start, Vertex* center, Vector* axis,
339 Elements* joinQuad (Quad* start, Quad* dest, Vertex* v1, Vertex* v2,
340 Vertex* v3, Vertex* v4, int nb);
342 Elements* joinQuads (Quads start, Quad* dest, Vertex* v1, Vertex* v2,
343 Vertex* v3, Vertex* v4, int nb);
345 // ----------------- Perimes (fin)
347 void dumpPropagation ();
349 Document* copyDocument ();
351 NewShape* getCloud () { return doc_cloud ; }
352 NewShape* addShape (const char* name, EnumShape type);
353 NewShape* findShape (rcstring name);
355 int associateLine (Vertex* mfirst, Edges& mline,
356 NewShapes& gline, IntVector& tabid,
357 double pstart, double pend, bool inv);
359 int clearAssociation (EnumElt type);
360 void clearAssoVertices ();
361 void clearAssoEdges ();
362 void clearAssoQuads ();
364 Quad* findQuad (Edge* ea, Edge* eb);
369 int loadXml (cpchar name);
370 int setXml (cpchar flux);
371 int setXml (cpchar flux, int& position);
373 EltBase* getFirstEltBase (EnumElt type) { return doc_first_elt [type]; }
374 EltBase* getLastEltBase (EnumElt type) { return doc_last_elt [type]; }
375 int getNbrElt (EnumElt type) { return doc_nbr_elt [type]; }
376 void setDeprecated (int level=1);
378 void markAll (int marque, int type=-1);
379 int saveVtk0 (cpchar nomfic);
380 int saveVtk (cpchar radical, int &nro);
382 void putError (cpchar mess, cpchar info1=NULL, cpchar info2=NULL);
383 void hputError (cpchar mess, EltBase* e1, EltBase* e2=NULL);
385 void majReferences (); // M.A.J relation "utilise par"
386 void update () { if (maj_connection) majReferences (); }
387 bool debug (int niv=0) { return doc_db > niv ; }
389 void reorderFaces ();
390 void reorderQuads ();
392 // --------------------------------------------------- Evols Hexa5
393 cpchar getNextName (EnumElt type, string& name);
394 string getNextName (EnumElt type);
396 virtual char* makeVarName (char* name);
401 // --------------------------------------------------- Evols Hexa6
403 void addHexa (Hexa* elt) { doc_hexas .push_back (elt) ; }
404 void addQuad (Quad* elt) { doc_quads .push_back (elt) ; }
405 void addEdge (Edge* elt) { doc_edges .push_back (elt) ; }
406 void addVertex (Vertex* elt) { doc_vertex.push_back (elt) ; }
413 int parseXml (XmlTree& xml);
415 void replaceVertex (Vertex* v1, Vertex* v2);
416 void replaceEdge (Edge* e1, Edge* e2);
417 int replaceQuad (Quad* q1, Quad* q2);
419 int countElement (EnumElt type);
420 EltBase* getElement (EnumElt type, int nro);
422 void majPropagation ();
426 Elements* clonerElements (Elements* table, Matrix* matrice);
428 // --------------------------------------------------- Evols Hexa3
429 Hexa* addHexaQuadsAB (AnaQuads& strquads);
430 Hexa* addHexaQuadsAC (AnaQuads& strquads);
431 Hexa* addHexaQuadsACE (AnaQuads& strquads);
432 Hexa* addHexaQuadsACD (AnaQuads& strquads);
433 Hexa* addHexaQuadsABCD (AnaQuads& strquads);
434 Hexa* addHexaQuadsACDE (AnaQuads& strquads);
436 EltBase* findElement (EnumElt type, int ident);
437 // --------------------------------------------------- Evols Hexa5
439 int sortShapes (NewShapes& tshapes, IntVector& subid,
440 bool closed, bool inv, double pstart, double pend,
441 EdgeShapes& glines, IntVector& sens, double& lgtotale);
442 int sortEdges (Vertex* vfirst, Edges& mline, Edges& edges, IntVector& sens);
444 void parseShapes (XmlTree& root);
445 void parseAssociation (XmlTree* root, Quad* elt);
446 void parseAssociation (XmlTree* root, Edge* elt);
447 void parseAssociation (XmlTree* root, Vertex* elt);
448 SubShape* parseSubShape (XmlTree* root);
451 friend class EltBase;
462 EltBase* doc_first_elt [EL_MAXI];
463 EltBase* doc_last_elt [EL_MAXI];
464 int doc_nbr_elt [EL_MAXI];
465 double doc_tolerance;
467 std::vector <Law*> doc_laws;
471 int nbr_propagations;
472 bool maj_propagation;
474 std::vector <Propagation*> doc_propagation;
475 std::vector <Group*> doc_group;
477 std::vector <Vector*> doc_vector;
478 std::vector <Cylinder*> doc_cylinder;
479 std::vector <Pipe*> doc_pipe;
482 // --------------------------------------------------- Evols Hexa3
484 std::vector <Hexa*> doc_used_hexas;
485 std::vector <Quad*> doc_used_quads;
486 std::vector <Edge*> doc_used_edges;
487 std::vector <Vertex*> doc_used_vertex;
494 // --------------------------------------------------- Evols Hexa5
496 static int doc_number;
500 NewShape* doc_cloud; // Nuage de points du doc;
501 std::vector <NewShape*> doc_tab_shape;
503 // --------------------------------------------------- Evols internes Hexa6
504 std::vector <Hexa*> doc_hexas;
505 std::vector <Quad*> doc_quads;
506 std::vector <Edge*> doc_edges;
507 std::vector <Vertex*> doc_vertex;