2 // C++ : Classe Document : Methodes internes 2011
4 // Copyright (C) 2009-2019 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
23 #include "HexDocument.hxx"
24 #include "HexVertex.hxx"
25 #include "HexEdge.hxx"
26 #include "HexQuad.hxx"
27 #include "HexHexa.hxx"
28 #include "HexGlobale.hxx"
29 #include "HexGroup.hxx"
33 // ======================================================== countHexa
34 int Document::countHexa ()
36 DumpStart0 ("countHexa");
40 int nombre = doc_hexas.size();
44 // ======================================================== countQuad
45 int Document::countQuad ()
47 DumpStart0 ("countQuad");
51 int nombre = doc_quads.size();
55 // ======================================================== countEdge
56 int Document::countEdge ()
58 DumpStart0 ("countEdge");
62 int nombre = doc_edges.size();
66 // ======================================================== countVertex
67 int Document::countVertex ()
69 DumpStart0 ("countVertex");
73 int nombre = doc_vertex.size();
78 // ======================================================== getHexa
79 Hexa* Document::getHexa (int nro)
84 if (nro<0 || nro >= (int) doc_hexas.size())
87 return doc_hexas [nro];
89 // ======================================================== getQuad
90 Quad* Document::getQuad (int nro)
95 if (nro<0 || nro >= (int) doc_quads.size())
98 return doc_quads [nro];
100 // ======================================================== getEdge
101 Edge* Document::getEdge (int nro)
106 if (nro<0 || nro >= (int) doc_edges.size())
109 return doc_edges [nro];
111 // ======================================================== getVertex
112 Vertex* Document::getVertex (int nro)
117 if (nro<0 || nro >= (int) doc_vertex.size())
120 return doc_vertex [nro];
122 // ======================================================== renumeroter
123 void Document::renumeroter ()
125 int nbelts = doc_vertex.size();
127 for (int nro=0 ; nro<nbelts ; nro++)
129 Vertex* elt = doc_vertex [nro];
130 if (elt->isDeleted())
133 doc_vertex [nro-decal] = elt;
137 doc_vertex.resize (nbelts-decal);
138 // ----------------- Edges
139 nbelts = doc_edges.size();
141 for (int nro=0 ; nro<nbelts ; nro++)
143 Edge* elt = doc_edges [nro];
144 if (elt->isDeleted())
147 doc_edges [nro-decal] = elt;
151 doc_edges.resize (nbelts-decal);
152 // ----------------- Quads
153 nbelts = doc_quads.size();
155 for (int nro=0 ; nro<nbelts ; nro++)
157 Quad* elt = doc_quads [nro];
158 if (elt->isDeleted())
161 doc_quads [nro-decal] = elt;
165 doc_quads.resize (nbelts-decal);
166 // ----------------- Hexas
167 nbelts = doc_hexas.size();
169 for (int nro=0 ; nro<nbelts ; nro++)
171 Hexa* elt = doc_hexas [nro];
172 if (elt->isDeleted())
175 doc_hexas [nro-decal] = elt;
179 doc_hexas.resize (nbelts-decal);
181 // ----------------------------------------------------------------------------
182 // ======================================================== countUsedHexa
183 int Document::countUsedHexa ()
188 return nbr_used_hexas;
190 // ======================================================== countUsedQuad
191 int Document::countUsedQuad ()
196 return nbr_used_quads;
198 // ======================================================== countUsedEdge
199 int Document::countUsedEdge ()
204 return nbr_used_edges;
206 // ======================================================== countUsedVertex
207 int Document::countUsedVertex ()
212 return nbr_used_vertex;
215 // ======================================================== getUsedHexa
216 Hexa* Document::getUsedHexa (int nro)
221 if (nro<0 || nro >= nbr_used_hexas)
224 return doc_used_hexas [nro];
226 // ======================================================== getUsedQuad
227 Quad* Document::getUsedQuad (int nro)
232 if (nro<0 || nro >= nbr_used_quads)
235 return doc_used_quads [nro];
237 // ======================================================== getUsedEdge
238 Edge* Document::getUsedEdge (int nro)
243 if (nro<0 || nro >= nbr_used_edges)
246 return doc_used_edges [nro];
248 // ======================================================== getUsedVertex
249 Vertex* Document::getUsedVertex (int nro)
254 if (nro<0 || nro >= nbr_used_vertex)
257 return doc_used_vertex [nro];
259 // ======================================================== recountUsed
260 void Document::recountUsed ()
262 count_modified = false;
263 // -- 1) Raz numerotation precedente
264 markAll (NO_COUNTED);
266 doc_used_hexas .clear ();
267 doc_used_quads .clear ();
268 doc_used_edges .clear ();
269 doc_used_vertex.clear ();
271 for (EltBase* elt = doc_first_elt[EL_HEXA]->next (); elt!=NULL;
274 if (elt!=NULL && elt->isHere())
276 Hexa* cell = static_cast <Hexa*> (elt);
277 doc_used_hexas.push_back (cell);
278 for (int nb=0 ; nb<HQ_MAXI ; nb++)
279 cell->getQuad (nb)->setMark (IS_USED);
281 for (int nb=0 ; nb<HE_MAXI ; nb++)
282 cell->getEdge (nb)->setMark (IS_USED);
284 for (int nb=0 ; nb<HV_MAXI ; nb++)
285 cell->getVertex (nb)->setMark (IS_USED);
289 for (EltBase* elt = doc_first_elt[EL_QUAD]->next (); elt!=NULL;
292 if (elt!=NULL && elt->isHere() && elt->getMark()==IS_USED)
294 Quad* cell = static_cast <Quad*> (elt);
295 doc_used_quads.push_back (cell);
299 for (EltBase* elt = doc_first_elt[EL_EDGE]->next (); elt!=NULL;
302 if (elt!=NULL && elt->isHere() && elt->getMark()==IS_USED)
304 Edge* cell = static_cast <Edge*> (elt);
305 doc_used_edges.push_back (cell);
309 for (EltBase* elt = doc_first_elt[EL_VERTEX]->next (); elt!=NULL;
312 if (elt!=NULL && elt->isHere() && elt->getMark()==IS_USED)
314 Vertex* cell = static_cast <Vertex*> (elt);
315 doc_used_vertex.push_back (cell);
319 nbr_used_hexas = doc_used_hexas .size ();
320 nbr_used_quads = doc_used_quads .size ();
321 nbr_used_edges = doc_used_edges .size ();
322 nbr_used_vertex = doc_used_vertex .size ();
324 // ========================================================= saveVtk (avec nro)
325 int Document::saveVtk (cpchar radical, int &nro)
328 sprintf (num, "%d", nro);
331 string filename = radical;
334 int ier = saveVtk (filename.c_str());
337 // ========================================================= setDeprecated
338 void Document::setDeprecated (int level)
342 // En cas de destruction : parents invalides
343 case 2 : maj_connection = true;
344 purge_elements = true;
345 holes_elements = true;
346 // creation + destruction : propagations a revoir
347 case 1 : maj_propagation = true;
349 default: doc_modified = true;
350 count_modified = true;
354 // ========================================================= addHexaGroup
355 Group* Document::addHexaGroup (cpchar name)
357 DumpStart ("addHexaGroup", name);
358 Group* groupe = addGroup (name, HexaCell);
363 // ========================================================= addHexaNodeGroup
364 Group* Document::addHexaNodeGroup (cpchar name)
366 DumpStart ("addHexaNodeGroup", name);
367 Group* groupe = addGroup (name, HexaNode);
372 // ========================================================= addQuadGroup
373 Group* Document::addQuadGroup (cpchar name)
375 DumpStart ("addQuadGroup", name);
376 Group* groupe = addGroup (name, QuadCell);
381 // ========================================================= addQuadNodeGroup
382 Group* Document::addQuadNodeGroup (cpchar name)
384 DumpStart ("addQuadNodeGroup", name);
385 Group* groupe = addGroup (name, QuadNode);
390 // ========================================================= addEdgeGroup
391 Group* Document::addEdgeGroup (cpchar name)
393 DumpStart ("addEdgeGroup", name);
394 Group* groupe = addGroup (name, EdgeCell);
399 // ========================================================= addEdgeNodeGroup
400 Group* Document::addEdgeNodeGroup (cpchar name)
402 DumpStart ("addEdgeNodeGroup", name);
403 Group* groupe = addGroup (name, EdgeNode);
408 // ========================================================= addVertexNodeGroup
409 Group* Document::addVertexNodeGroup (cpchar name)
411 DumpStart ("addVertexNodeGroup", name);
412 Group* groupe = addGroup (name, VertexNode);
417 // ======================================================== addGroup
418 Group* Document::addGroup (cpchar name, EnumGroup kind)
420 Group* grp = new Group (this, name, kind);
421 doc_group.push_back (grp);
424 // ======================================================== findGroup
425 Group* Document::findGroup (cpchar name)
427 DumpStart ("findGroup", name);
429 int nbre = doc_group.size();
430 Group* groupe = NULL;
432 for (int ng=0 ; groupe==NULL && ng<nbre ; ng++)
433 if (Cestegal (doc_group [ng]->getName(), name))
434 groupe = doc_group [ng];
439 // ======================================================== removeGroup
440 int Document::removeGroup (Group* grp)
442 DumpStart ("removeGroup", grp );
444 int nbre = doc_group.size();
448 for (int ng=0 ; more && ng<nbre ; ng++)
450 if (grp == doc_group [ng])
452 doc_group.erase (doc_group.begin() + ng);
457 // Si pas trouve dans la liste. On detruit quand meme
459 if (NOT (BadElement (grp)))
465 // ----------------------------------------------------------------------------