2 // C++ : La clase principale de Hexa
4 // Copyright (C) 2009-2016 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
22 #include "HexDocument.hxx"
24 #include "HexEltBase.hxx"
25 #include "HexVertex.hxx"
26 #include "HexEdge.hxx"
27 #include "HexQuad.hxx"
28 #include "HexHexa.hxx"
30 #include "HexElements.hxx"
32 #include "HexVector.hxx"
33 #include "HexMatrix.hxx"
34 #include "HexCloner.hxx"
35 #include "HexPropagation.hxx"
38 #include "HexXmlWriter.hxx"
39 #include "HexXmlTree.hxx"
40 #include "HexGlobale.hxx"
43 // ========================================================= performTranslation
44 int Document::performTranslation (Elements* elts, Vector* trans)
46 DumpStart ("performTranslation", elts << trans);
49 matrice.defTranslation (trans);
51 int ier = elts->transform (&matrice);
56 // ==================================================== performScale
57 int Document::performScale (Elements* elts, Vertex* ver, double k)
59 DumpStart ("performScale", elts << ver << k);
62 matrice.defScale (ver, k);
64 int ier = elts->transform (&matrice);
69 // ==================================================== performRotation
70 int Document::performRotation (Elements* elts, Vertex* ver, Vector* vec, double angle)
72 DumpStart ("performRotation", elts << ver << vec << angle);
75 matrice.defRotation (ver, vec, angle);
77 int ier = elts->transform (&matrice);
82 // ==================================================== performSymmetryPoint
83 int Document::performSymmetryPoint (Elements* elts, Vertex* ver)
85 DumpStart ("performSymmetryPoint", elts << ver);
88 matrice.defSymmetryPoint (ver);
90 int ier = elts->transform (&matrice);
95 // ==================================================== performSymmetryPlane
96 int Document::performSymmetryPlane (Elements* elts, Vertex* ver, Vector* vec)
98 DumpStart ("performSymmetryPlane", elts << ver << vec);
101 matrice.defSymmetryPlane (ver, vec);
103 int ier = elts->transform (&matrice);
109 // ==================================================== performSymmetryLine
110 int Document::performSymmetryLine (Elements* elts, Vertex* ver, Vector* vec)
112 DumpStart ("performSymmetryLine", elts << ver << vec);
115 matrice.defSymmetryLine (ver, vec);
117 int ier = elts->transform (&matrice);
122 // --------------------------------------------------------
123 // --------------------------------------------------------
124 // --------------------------------------------------------
125 // ========================================================= clonerElements
126 Elements* Document::clonerElements (Elements* table, Matrix* matrice)
128 Cloner copieur (matrice);
129 Elements* grille = copieur.clonerElements (table);
132 // --------------------------------------------------------
133 // --------------------------------------------------------
134 // --------------------------------------------------------
135 // ========================================================= makeTranslation
136 Elements* Document::makeTranslation (Elements* table, Vector* trans)
138 DumpStart ("makeTranslation", table << trans);
141 matrice.defTranslation (trans);
143 Elements* grille = clonerElements (table, &matrice);
148 // ========================================================= makeScale
149 Elements* Document::makeScale (Elements* table, Vertex* ver, double k)
151 DumpStart ("makeScale", table << ver << k);
154 matrice.defScale (ver, k);
156 Elements* grille = clonerElements (table, &matrice);
161 // ========================================================= makeRotation
162 Elements* Document::makeRotation (Elements* table, Vertex* ver, Vector* vec,
165 DumpStart ("makeRotation", table << ver << vec << angle);
168 matrice.defRotation (ver, vec, angle);
170 Elements* grille = clonerElements (table, &matrice);
175 // ========================================================= makeSymmetryPoint
176 Elements* Document::makeSymmetryPoint (Elements* table, Vertex* ver)
178 DumpStart ("makeSymmetryPoint", table << ver);
181 matrice.defSymmetryPoint (ver);
183 Elements* grille = clonerElements (table, &matrice);
188 // ========================================================= makeSymmetryLine
189 Elements* Document::makeSymmetryLine (Elements* table, Vertex* ver, Vector* vec)
191 DumpStart ("makeSymmetryLine", table << ver << vec);
194 matrice.defSymmetryLine (ver, vec);
196 Elements* grille = clonerElements (table, &matrice);
201 // ========================================================= makeSymmetryPlane
202 Elements* Document::makeSymmetryPlane (Elements* table, Vertex* ver, Vector* vec)
204 DumpStart ("makeSymmetryPlane", table << ver << vec);
207 matrice.defSymmetryPlane (ver, vec);
209 Elements* grille = clonerElements (table, &matrice);
214 // ----------------------------------------------------------------------
215 // ------------ Destroy
216 // ----------------------------------------------------------------------
217 // ========================================================= removeHexa
218 int Document::removeHexa (Hexa* cell)
220 DumpStart ("removeHexa", cell);
223 if (BadElement (cell))
232 for (int nro = 0 ; nro < HQ_MAXI ; ++nro)
234 Quad* quad = cell->getQuad (nro);
235 if (EltIsValid(quad) && quad->getNbrParents()<=1)
236 menage.push_back (quad);
240 int nbdel = menage.size();
241 for (int nro = 0 ; nro < nbdel ; ++nro)
242 menage[nro]->remove();
247 // ========================================================= removeQuad
248 int Document::removeQuad (Quad* cell)
250 DumpStart ("removeQuad", cell);
261 // ========================================================= removeElements
262 int Document::removeElements (Elements* bloc)
264 DumpStart ("removeElements", bloc);
276 // ====================================================== removeConnectedHexa
277 int Document::removeConnectedHexa (Hexa* cell)
279 DumpStart ("removeConnectedHexa", cell);
288 cell->removeConnected ();
294 // ========================================================= dumpPropagation
295 void Document::dumpPropagation ()
297 int nb = countPropagation ();
299 for (int nro=0 ; nro<nb ; nro++)
301 Propagation* prop = getPropagation (nro);
302 const Edges& table = prop->getEdges ();
303 printf (" ____________________________________ Prop nro %d\n", nro);
304 for (int ned=0 ; ned<(int)table.size() ; ned++)
306 bool way = table [ned]->getWay ();
308 table [ned]->printName (" = ");
312 table [ned]->getVertex (0)->printName (", ");
313 table [ned]->getVertex (1)->printName (")\n");
318 table [ned]->getVertex (1)->printName (", ");
319 table [ned]->getVertex (0)->printName (")\n");
324 // ----------------------------------------------------------------------
325 // ------------ reorderFaces
326 // ----------------------------------------------------------------------
327 // ========================================================= reorderFaces
328 // ==== Ordonner les faces externes
329 void Document::reorderFaces ()
332 for (EltBase* elt = doc_first_elt[EL_QUAD]->next (); elt!=NULL;
335 Quad* quad = static_cast <Quad*> (elt);
336 if (quad!=NULL && quad->isHere())
337 quad->setOrientation ();