7 #include "hexa_base.hxx"
13 // Fonctions utilisateur
16 const char* getFile () { return doc_name.c_str() ; }
17 bool isSaved () { return NOT doc_modified ; }
18 int setFile (const char* filename) { doc_name = filename ; return HOK ; }
21 int getLevel () { return doc_db ; }
22 void setLevel (int niv) { doc_db = niv ; }
24 Hexa* getHexa (int nro);
25 Quad* getQuad (int nro);
26 Edge* getEdge (int nro);
27 Vertex* getVertex (int nro);
29 int countHexa () { return countElement (EL_HEXA); }
30 int countQuad () { return countElement (EL_QUAD); }
31 int countEdge () { return countElement (EL_EDGE); }
32 int countVertex () { return countElement (EL_VERTEX); }
34 // Creation d'elements
35 Vertex* addVertex (double x=0.0, double y=0.0, double z=0.0);
36 Edge* addEdge (Vertex* va, Vertex* vb);
37 Edge* addEdge (Vertex* va, Vector* vec);
39 Quad* addQuadVertices (Vertex* v1, Vertex* v2, Vertex* v3, Vertex* v4);
40 Quad* addQuad (Edge* v1, Edge* v2, Edge* v3, Edge* v4);
42 Hexa* addHexaVertices (Vertex* v1, Vertex* v2, Vertex* v3, Vertex* v4,
43 Vertex* v5, Vertex* v6, Vertex* v7, Vertex* v8);
44 Hexa* addHexa (Quad* qa, Quad* qb, Quad* qc, Quad* qd, Quad* qe, Quad* qf);
46 Vector* addVector (double dx=0.0, double dy=0.0, double dz=0.0);
47 Vector* addVectorVertices (Vertex* va, Vertex* vb);
50 Elements* makeCartesian (Vertex* v, Vector* v1,
51 int px, int py, int pz, int mx=0, int my=0, int mz=0);
52 Elements* makeCartesian (Vertex* v, Vector* v1, Vector* v2, Vector* v3,
53 int px, int py, int pz, int mx=0, int my=0, int mz=0);
55 Elements* makeCylindrical (Vertex* c, Vector* b, Vector* h, double dr,
56 double da, double dl, int nr, int na, int nl, bool fill=false);
58 Elements* makeSpherical (Vertex* v, Vector* dv, int nb, double k=1);
60 Elements* prismQuad (Quad* start, Vector* dv, int nb);
61 Elements* prismQuads (Quads& start, Vector* dv, int nb);
63 Elements* joinQuad (Quad* start, Quad* dest, Vertex* v1, Vertex* v2,
64 Vertex* v3, Vertex* v4, int nb);
65 Elements* joinQuads (Quads& start, Quad* dest, Vertex* v1, Vertex* v2,
66 Vertex* v3, Vertex* v4, int nb);
68 Cylinder* addCylinder (Vertex* b, Vector* d, double r, double h);
69 Elements* makeCylinder (Cylinder* cyl, Vector* vx, int nr, int na, int nl);
70 CrossElements* makeCylinders (Cylinder* cyl1, Cylinder* cyl2);
72 Pipe* addPipe (Vertex* b, Vector* d, double ri, double re, double h);
73 Elements* makePipe (Pipe* pip, Vector* vx, int nr, int na, int nl);
74 CrossElements* makePipes (Pipe* pipe1, Pipe* pipe2);
76 // CrossElements* makePipes (Pipe* pipe1, int nr1, int na1, int nl1,
77 // Pipe* pipe2, int nr2, int na2, int nl2);
79 int removeHexa (Hexa* maille);
80 int removeConnectedHexa (Hexa* maille);
82 Vertex* findVertex (double vx, double vy, double vz);
83 Edge* findEdge (Vertex* va, Vertex* vb);
84 Quad* findQuad (Vertex* va, Vertex* vb);
85 Hexa* findHexa (Vertex* va, Vertex* vb);
87 int mergeVertices (Vertex* v1, Vertex* v2);
88 int mergeEdges (Edge* e1, Edge* e2, Vertex* v1, Vertex* v2);
89 int mergeQuads (Quad* q1, Quad* q2, Vertex* v1, Vertex* v2,
90 Vertex* v3, Vertex* v4);
92 Elements* makeTranslation (Elements* elts, Vector* trans);
93 Elements* makeScale (Elements* elts, Vertex* ver, double k);
94 Elements* makeRotation (Elements* elts, Vertex* ver, Vector* vec,
96 Elements* makeSymmetryPoint (Elements* elts, Vertex* ver);
97 Elements* makeSymmetryLine (Elements* elts, Vertex* ver, Vector* vec);
98 Elements* makeSymmetryPlane (Elements* elts, Vertex* ver, Vector* vec);
100 int performTranslation (Elements* elts, Vector* trans);
101 int performScale (Elements* elts, Vertex* ver, double k);
102 int performRotation (Elements* elts, Vertex* ver, Vector* vec, double angle);
103 int performSymmetryPoint (Elements* elts, Vertex* ver);
104 int performSymmetryLine (Elements* elts, Vertex* ver, Vector* vec);
105 int performSymmetryPlane (Elements* elts, Vertex* ver, Vector* vec);
107 void setTolerance (double tol) { doc_tolerance = std::max (tol, 0.0); }
108 double getTolerance () { return doc_tolerance; }
110 Elements* disconnectQuad (Hexa* maille, Quad* face);
111 Elements* disconnectEdge (Hexa* maille, Edge* arete);
112 Elements* disconnectVertex (Hexa* maille, Vertex* noeud);
114 Elements* cut (Edge* edge, int nbcuts);
116 Group* addGroup (cpchar name, EnumGroup kind);
117 Group* getGroup (int nro) { return doc_group [nro]; }
118 Group* findGroup (cpchar name);
119 int removeGroup (Group* grp);
120 int countGroup () { return (int) doc_group.size(); }
122 // ---------------------------------------------------
124 Law* addLaw (const char* name, int nbnodes);
125 int countLaw () { return nbr_laws ; }
126 Law* getLaw (int nro);
127 Law* findLaw (const char* name);
128 int removeLaw (Law* loi);
130 // ---------------------------------------------------
131 int countPropagation ();
132 Propagation* getPropagation (int nro);
133 Propagation* findPropagation (Edge* arete);
134 void dumpPropagation ();
136 int countVector () { return doc_vector.size(); }
137 int countCylinder () { return doc_cylinder.size(); }
138 int countPipe () { return doc_pipe.size(); }
140 Vector* getVector (int nro) { return doc_vector [nro]; }
141 Cylinder* getCylinder (int nro) { return doc_cylinder [nro]; }
142 Pipe* getPipe (int nro) { return doc_pipe [nro]; }
147 Document (cpchar filename);
152 EltBase* getFirstEltBase (EnumElt type) { return doc_first_elt [type]; }
153 EltBase* getLastEltBase (EnumElt type) { return doc_last_elt [type]; }
154 void setModified () { doc_modified = true; }
155 void setDeprecated (int level=1);
158 void markAll (int marque, int type=-1);
159 int saveVtk (cpchar nomfic);
160 int saveVtk (cpchar radical, int &nro);
162 void putError (cpchar mess, cpchar info1=NULL, cpchar info2=NULL);
163 void majReferences (); // M.A.J relation "utilise par"
164 void update () { if (maj_connection) majReferences (); }
165 bool debug (int niv=0) { return doc_db > niv ; }
171 void replaceVertex (Vertex* v1, Vertex* v2);
172 void replaceEdge (Edge* e1, Edge* e2);
173 void replaceQuad (Quad* q1, Quad* q2);
174 int countElement (EnumElt type);
175 EltBase* getElement (EnumElt type, int nro);
177 void majPropagation ();
180 Elements* clonerElements (Elements* table, Matrix* matrice);
183 friend class EltBase;
192 EltBase* doc_first_elt [EL_MAXI];
193 EltBase* doc_last_elt [EL_MAXI];
194 int doc_nbr_elt [EL_MAXI];
195 double doc_tolerance;
197 std::vector <Law*> doc_laws;
200 int nbr_propagations;
201 bool maj_propagation;
203 std::vector <Propagation*> doc_propagation;
204 std::vector <Group*> doc_group;
206 std::vector <Vector*> doc_vector;
207 std::vector <Cylinder*> doc_cylinder;
208 std::vector <Pipe*> doc_pipe;
210 // ========================================================= saveVtk (avec nro)
211 inline int Document::saveVtk (cpchar radical, int &nro)
214 sprintf (num, "%d", nro);
217 string filename = radical;
220 int ier = saveVtk (filename.c_str());
223 // ========================================================= setDeprecated
224 inline void Document::setDeprecated (int level)
228 // En cas de destruction : parents invalides
229 case 2 : maj_connection = true;
230 purge_elements = true;
231 // creation + destruction : propagations a revoir
232 case 1 : maj_propagation = true;
234 default: doc_modified = true;