2 // C++ : La clase principale de Hexa
4 // Copyright (C) 2009-2012 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/
21 // or email : webmaster.salome@opencascade.com
23 #include "HexDocument.hxx"
25 #include "HexEltBase.hxx"
26 #include "HexVertex.hxx"
27 #include "HexEdge.hxx"
28 #include "HexQuad.hxx"
29 #include "HexHexa.hxx"
31 #include "HexElements.hxx"
32 #include "HexCrossElements.hxx"
34 #include "HexVector.hxx"
35 #include "HexCylinder.hxx"
36 #include "HexPipe.hxx"
37 #include "HexMatrix.hxx"
38 #include "HexCloner.hxx"
39 #include "HexPropagation.hxx"
42 #include "HexXmlWriter.hxx"
43 #include "HexXmlTree.hxx"
44 #include "HexGlobale.hxx"
45 #include "HexGroup.hxx"
49 // ======================================================== Constructeur
50 Document::Document (cpchar name)
52 glob = Globale::getInstance ();
62 maj_propagation = true;
66 defaultLaw = addLaw ("DefaultLaw", 0);
68 nbr_used_hexas = nbr_used_quads = nbr_used_edges = nbr_used_vertex = 0;
70 for (EnumElt type = EL_NONE ; type < EL_MAXI ; type=(EnumElt) (type+1))
72 doc_first_elt [type] = doc_last_elt [type] = new EltBase ();
73 doc_nbr_elt [type] = 0;
76 // ======================================================== Destructeur
77 Document::~Document ()
81 for (EnumElt type = EL_NONE ; type < EL_MAXI ; type=(EnumElt) (type+1))
83 // printf ("____________________________ Type=%d\n", type);
85 for (EltBase* elt=doc_first_elt [type] ; elt != NULL ; elt=next)
92 // ======================================================== addVector
93 Vector* Document::addVector (double dx, double dy, double dz)
95 Vector* pv = new Vector (this, dx, dy, dz);
96 doc_vector.push_back (pv);
99 // ======================================================== addVectorVertices
100 Vector* Document::addVectorVertices (Vertex* va, Vertex* vb)
102 Vector* pv = addVector (vb->getX () - va->getX (),
103 vb->getY () - va->getY (),
104 vb->getZ () - va->getZ ());
107 // ======================================================== addVertex
108 Vertex* Document::addVertex (double x, double y, double z)
110 Vertex* pv = new Vertex (this, x, y, z);
113 // ======================================================== addEdge
114 Edge* Document::addEdge (Vertex* va, Vertex* vb)
116 if (va==NULL || vb==NULL)
119 Edge* arete = new Edge (va, vb);
122 // ======================================================== addEdge (bis)
123 Edge* Document::addEdge (Vertex* va, Vector* vec)
125 Vertex* vb = addVertex (va->getX () + vec->getDx(),
126 va->getY () + vec->getDy(),
127 va->getZ () + vec->getDz());
129 Edge* arete = addEdge (va, vb);
132 // ======================================================== addQuadVertices
133 Quad* Document::addQuadVertices (Vertex* va, Vertex* vb, Vertex* vc, Vertex* vd)
135 Quad* face = new Quad (va, vb, vc, vd);
138 // ======================================================== addQuad
139 Quad* Document::addQuad (Edge* ea, Edge* eb, Edge* ec, Edge* ed)
141 Quad* face = new Quad (ea, eb, ec, ed);
144 // ======================================================== addHexaVertices
145 Hexa* Document::addHexaVertices (Vertex* va, Vertex* vb, Vertex* vc, Vertex* vd,
146 Vertex* ve, Vertex* vf, Vertex* vg, Vertex* vh)
148 Hexa* pave = new Hexa (va, vb, vc, vd, ve, vf, vg, vh);
151 // ======================================================== addHexa
152 Hexa* Document::addHexa (Quad* qa, Quad* qb, Quad* qc, Quad* qd, Quad* qe,
155 Hexa* pave = new Hexa (qa, qb, qc, qd, qe, qf);
158 // ======================================================== addCylinder
159 Cylinder* Document::addCylinder (Vertex* b, Vector* d, double r, double h)
161 Cylinder* cyl = new Cylinder (b, d, r, h);
162 doc_cylinder.push_back (cyl);
165 // ======================================================== addPipe
166 Pipe* Document::addPipe (Vertex* b, Vector* d, double ri, double re, double h)
168 Pipe* tuyau = new Pipe (b, d, ri, re, h);
169 doc_pipe.push_back (tuyau);
172 // ======================================================== makeCartesian
173 Elements* Document::makeCartesian (Vertex* v, Vector* dir,
174 int px, int py, int pz, int mx, int my, int mz)
176 Vector* v1 = new Vector (this, dir->getDx(), 0, 0);
177 Vector* v2 = new Vector (this, 0, dir->getDy(), 0);
178 Vector* v3 = new Vector (this, 0,0, dir->getDz());
179 Elements* grille = new Elements (this);
180 grille->makeCartesianGrid (v, v1, v2, v3, px, py, pz, mx, my, mz);
183 // ======================================================== makeCartesian
184 Elements* Document::makeCartesian (Vertex* v, Vector* v1, Vector* v2,
185 Vector* v3, int px, int py, int pz, int mx, int my, int mz)
187 Elements* grille = new Elements (this);
188 grille->makeCartesianGrid (v, v1, v2, v3, px, py, pz, mx, my, mz);
191 // ======================================================== makeSpherical
192 Elements* Document::makeSpherical (Vertex* c, double rayon, int nb, double k)
194 Elements* grille = new Elements (this);
195 grille->makeSphericalGrid (c, rayon, nb, k);
198 // ======================================================== makeCylindrical
199 Elements* Document::makeCylindrical (Vertex* c, Vector* b, Vector* h,
200 double dr, double da, double dl, int nr, int na, int nl, bool fill)
202 Elements* grille = new Elements (this);
203 grille->makeCylindricalGrid (c, b, h, dr, da, dl, nr, na, nl, fill);
206 // ======================================================== makeSphere
207 Elements* Document::makeSphere (Vertex* center, Vector* vx, Vector* vz,
208 double radius, double radhole, Vertex* plorig,
209 int nrad, int nang, int nhaut)
211 Elements* grille = new Elements (this);
212 double radint = (radhole + radius)*DEMI;
213 grille->makeRind (GR_HEMISPHERIC, center, vx, vz, radius, radint, radhole,
214 plorig, 360.0, nrad, nang, nhaut);
217 // ======================================================== makePartSphere
218 Elements* Document::makePartSphere (Vertex* center, Vector* vx, Vector* vz,
219 double radius, double radhole,
220 Vertex* plorig, double angle,
221 int nrad, int nang, int nhaut)
223 Elements* grille = new Elements (this);
224 double radint = (radhole + radius)*DEMI;
225 grille->makeRind (GR_PART_SPHERIC, center, vx, vz, radius, radint, radhole,
226 plorig, angle, nrad, nang, nhaut);
229 // ======================================================== makeRind
230 Elements* Document::makeRind (Vertex* center, Vector* vx, Vector* vz,
231 double radext, double radint, double radhole,
232 Vertex* plorig, int nrad, int nang, int nhaut)
234 Elements* grille = new Elements (this);
235 grille->makeRind (GR_RIND, center, vx, vz, radext, radint, radhole,
236 plorig, 360.0, nrad, nang, nhaut);
239 // ======================================================== makePartRind
240 Elements* Document::makePartRind (Vertex* center, Vector* vx, Vector* vz,
241 double radext, double radint, double radhole,
242 Vertex* plorig, double angle,
243 int nrad, int nang, int nhaut)
245 Elements* grille = new Elements (this);
246 grille->makeRind (GR_PART_RIND, center, vx, vz, radext, radint, radhole,
247 plorig, angle, nrad, nang, nhaut);
250 // ======================================================== findVertex
251 Vertex* Document::findVertex (double vx, double vy, double vz)
253 double xmin = vx - doc_tolerance;
254 double xmax = vx + doc_tolerance;
255 double ymin = vy - doc_tolerance;
256 double ymax = vy + doc_tolerance;
257 double zmin = vz - doc_tolerance;
258 double zmax = vz + doc_tolerance;
260 for (EltBase* elt = doc_first_elt[EL_VERTEX]->next (); elt!=NULL;
265 Vertex* node = static_cast <Vertex*> (elt);
266 if (node->isin (xmin, xmax, ymin, ymax, zmin, zmax))
272 // ======================================================== findEdge
273 Edge* Document::findEdge (Vertex* v1, Vertex* v2)
275 for (EltBase* elt = doc_first_elt[EL_EDGE]->next (); elt!=NULL;
278 Edge* candidat = static_cast <Edge*> (elt);
279 if (candidat->definedBy (v1, v2))
284 // ======================================================== findQuad
285 Quad* Document::findQuad (Vertex* v1, Vertex* v2)
287 for (EltBase* elt = doc_first_elt[EL_QUAD]->next (); elt!=NULL;
290 Quad* candidat = static_cast <Quad*> (elt);
291 if (candidat->definedBy (v1, v2))
296 // ======================================================== findHexa
297 Hexa* Document::findHexa (Vertex* v1, Vertex* v2)
299 for (EltBase* elt = doc_first_elt[EL_HEXA]->next (); elt!=NULL;
302 Hexa* candidat = static_cast <Hexa*> (elt);
303 if (candidat->definedBy (v1, v2))
309 // ======================================================== findElement
310 EltBase* Document::findElement (EnumElt type, int ident)
312 for (EltBase* elt = doc_first_elt[type]->next (); elt!=NULL;
315 if (elt->isHere() && elt->getId()==ident)
320 // ======================================================== findVertex
321 Vertex* Document::findVertex (int ident)
323 Vertex* node = static_cast <Vertex*> (findElement (EL_VERTEX, ident));
327 // ======================================================== index_tv
328 int index_tv (Vertex* table[], Vertex* elt)
330 for (int nro=0; nro<QUAD4; nro++)
331 if (elt == table[nro])
336 // ======================================================== mergeQuads
337 int Document::mergeQuads (Quad* dest, Quad* orig, Vertex* v1, Vertex* v2,
338 Vertex* v3, Vertex* v4)
344 printf (" *** Quads identiques dans mergeQuads\n");
347 else if (dest==NULL || dest->isDeleted())
349 printf (" *** Quad nro 1 incorrect dans mergeQuads \n");
352 else if (orig==NULL || orig->isDeleted() )
354 printf (" *** Quad nro 2 incorrect dans mergeQuads \n");
359 for (int nro=0 ; nro<QUAD4 ; nro++)
361 int norig = orig->indexVertex (dest->getVertex(nro));
362 if (norig != NOTHING)
364 Vertex* uv = dest->getVertex(nro);
369 printf (" +++ Sommets communs dans mergeQuads");
370 printf (" (%s,", dest->getName (nom));
371 printf (" %s)\n", orig->getName (nom));
373 printf (" +++ quad1[%d] = quad2[%d] = %s\n", nro, norig,
380 printf (" +++ Les vertex passes en arguments sont ignores\n");
381 int ier = closeQuads (dest, orig);
384 else if (nbcomm != 0)
386 printf (" *** _____________________ mergeQuads refuse: \n");
387 printf (" il y a %d sommet(s) sont commun(s)\n", nbcomm);
391 if ( v1 ==NULL || v1 ->isDeleted() || v2 ==NULL || v2 ->isDeleted()
392 || v3 ==NULL || v3 ->isDeleted() || v4 ==NULL || v4 ->isDeleted())
394 printf (" *** _____________________ mergeQuads refuse: \n");
395 printf (" un sommet est incorrect\n");
402 printf (" ----------------- mergeQuads : \n");
411 Vertex *tv1 [QUAD4], *tv2 [QUAD4];
412 Edge *te1 [QUAD4], *te2 [QUAD4];
414 int ier1 = dest->ordoVertex (v1, v3, tv1);
415 int ier2 = orig->ordoVertex (v2, v4, tv2);
416 if (ier1 != HOK) return ier1;
417 else if (ier2 != HOK) return ier2;
419 for (int nro=0 ; nro<QUAD4 ; nro++)
421 te1 [nro] = dest->getEdge(nro);
422 Vertex* va1 = te1[nro]->getVertex(V_AMONT);
423 Vertex* vb1 = te1[nro]->getVertex(V_AVAL);
424 int na = index_tv (tv1, va1);
425 int nb = index_tv (tv1, vb1);
426 if (na==NOTHING || nb==NOTHING)
429 te2 [nro] = orig->findEdge (tv2[na], tv2[nb]);
436 printf (" ----------------- Correspondances mergeQuads : \n");
437 for (int nro=0 ; nro<QUAD4 ; nro++)
439 printf (" %d : ", nro);
440 tv2 [nro]->printName(" -> ");
441 tv1 [nro]->printName("\n");
443 for (int nro=0 ; nro<QUAD4 ; nro++)
445 printf (" %d : ", nro);
446 te2 [nro]->printName(" (");
447 te2 [nro]->getVertex(0)->printName(", ");
448 te2 [nro]->getVertex(1)->printName(") -> ");
449 te1 [nro]->printName(" (");
450 te1 [nro]->getVertex(0)->printName(", ");
451 te1 [nro]->getVertex(1)->printName(")\n");
455 replaceQuad (orig, dest);
456 for (int nro=0 ; nro<QUAD4 ; nro++)
457 replaceEdge (te2[nro], te1[nro]);
458 for (int nro=0 ; nro<QUAD4 ; nro++)
459 replaceVertex (tv2[nro], tv1[nro]);
461 maj_connection = false;
462 purge_elements = false;
465 // ======================================================== closeQuads
466 int Document::closeQuads (Quad* dest, Quad* orig)
473 printf (" *** Quads identiques dans closeQuads : %s\n",
477 else if (dest==NULL || dest->isDeleted())
479 printf (" *** Quad nro 1 incorrect dans closeQuads \n");
482 else if (orig==NULL || orig->isDeleted() )
484 printf (" *** Quad nro 2 incorrect dans closeQuads \n");
489 for (int nro=0 ; nro<QUAD4 ; nro++)
491 int norig = orig->indexEdge (dest->getEdge(nro));
492 if (norig != NOTHING)
496 printf (" *** Plus d'une arete commune dans closeQuads");
497 printf (" (%s,", dest->getName (nom));
498 printf (" %s)\n", orig->getName (nom));
501 edc = dest->getEdge (nro);
502 printf (" +++ quad1[%d] = quad2[%d] = %s\n", nro, norig,
507 Vertex* va = edc->getVertex (V_AMONT);
508 Vertex* vb = edc->getVertex (V_AVAL);
509 Vertex *tv1 [QUAD4], *tv2 [QUAD4];
510 Edge *te1 [QUAD4], *te2 [QUAD4];
512 int ier1 = dest->ordoVertex (va, vb, tv1);
513 int ier2 = orig->ordoVertex (va, vb, tv2);
515 if (ier1 != HOK) return ier1;
516 else if (ier2 != HOK) return ier2;
518 for (int nro=0 ; nro<QUAD4 ; nro++)
520 te1 [nro] = dest->getEdge(nro);
521 Vertex* va1 = te1[nro]->getVertex(V_AMONT);
522 Vertex* vb1 = te1[nro]->getVertex(V_AVAL);
523 int na = index_tv (tv1, va1);
524 int nb = index_tv (tv1, vb1);
525 if (na==NOTHING || nb==NOTHING)
528 te2 [nro] = orig->findEdge (tv2[na], tv2[nb]);
535 printf (" ----------------- Correspondances mergeQuads : \n");
536 for (int nro=0 ; nro<QUAD4 ; nro++)
538 printf (" %d : ", nro);
539 tv2 [nro]->printName(" -> ");
540 tv1 [nro]->printName("\n");
542 for (int nro=0 ; nro<QUAD4 ; nro++)
544 printf (" %d : ", nro);
545 te2 [nro]->printName(" (");
546 te2 [nro]->getVertex(0)->printName(", ");
547 te2 [nro]->getVertex(1)->printName(") -> ");
548 te1 [nro]->printName(" (");
549 te1 [nro]->getVertex(0)->printName(", ");
550 te1 [nro]->getVertex(1)->printName(")\n");
554 replaceQuad (orig, dest);
555 for (int nro=0 ; nro<QUAD4 ; nro++)
556 replaceEdge (te2[nro], te1[nro]);
557 for (int nro=0 ; nro<QUAD4 ; nro++)
558 replaceVertex (tv2[nro], tv1[nro]);
560 maj_connection = false;
561 purge_elements = false;
564 // ======================================================== mergeEdges
565 int Document::mergeEdges (Edge* e1, Edge* e2, Vertex* v1, Vertex* v2)
567 if (e1==NULL || e1->isDeleted() || e2==NULL || e2->isDeleted())
570 for (int nro=0 ; nro<V_TWO ; nro++)
571 if (e1->index (e2->getVertex(nro))!= NOTHING)
574 Vertex *tv1 [V_TWO], *tv2 [V_TWO];
576 int ier1 = e1->anaMerge (v1, tv1);
577 int ier2 = e2->anaMerge (v2, tv2);
579 if (ier1 != HOK) return ier1;
580 else if (ier2 != HOK) return ier2;
582 replaceEdge (e2, e1);
583 for (int nro=0 ; nro<V_TWO ; nro++)
584 replaceVertex (tv2[nro], tv1[nro]);
586 maj_connection = false;
589 // ======================================================== mergeVertices
590 int Document::mergeVertices (Vertex* v1, Vertex* v2)
592 if (v1==v2 || v1==NULL || v1->isDeleted()
593 || v2==NULL || v2->isDeleted())
596 replaceVertex (v2, v1);
598 maj_connection = false;
601 // ======================================================== replaceVertex
602 void Document::replaceVertex (Vertex* old, Vertex* par)
607 par->replaceAssociation (old);
609 for (int type=EL_EDGE ; type <= EL_HEXA ; type++)
611 for (EltBase* elt = doc_first_elt[type]->next (); elt!=NULL;
614 elt->replaceVertex (old, par);
618 // ======================================================== replaceEdge
619 void Document::replaceEdge (Edge* old, Edge* par)
624 par->replaceAssociation (old);
626 for (int type=EL_QUAD ; type <= EL_HEXA ; type++)
628 for (EltBase* elt = doc_first_elt[type]->next (); elt!=NULL;
631 elt->replaceEdge (old, par);
635 // ======================================================== replaceQuad
636 void Document::replaceQuad (Quad* old, Quad* par)
641 par->replaceAssociation (old);
643 for (EltBase* elt = doc_first_elt[EL_HEXA]->next (); elt!=NULL;
647 Hexa* cell = static_cast <Hexa*> (elt);
648 cell->replaceQuad (old, par);
652 // ======================================================== prismQuad
653 Elements* Document::prismQuad (Quad* start, Vector* dir, int nb)
656 tstart.push_back (start);
659 Elements* prisme = prismQuads (tstart, dir, nb);
662 // ======================================================== prismQuads
663 Elements* Document::prismQuads (Quads& tstart, Vector* dir, int nb)
665 Elements* prisme = new Elements (this);
666 if (nb<=0) return prisme;
668 prisme->prismQuads (tstart, dir, nb);
671 // ======================================================== prismQuadsVec
672 Elements* Document::prismQuadsVec (Quads& tstart, Vector* dir, RealVector& tlen,
675 Elements* prisme = new Elements (this);
676 if (tlen.size()<=0) return prisme;
678 prisme->prismQuadsVec (tstart, dir, tlen, crit);
681 // ======================================================== joinQuads
682 Elements* Document::joinQuads (Quads& start, Quad* dest, Vertex* v1,
683 Vertex* v2, Vertex* v3, Vertex* v4, int nb)
686 Elements* joint = new Elements (this);
687 if (nb<=0) return joint;
689 int ier = joint->joinQuads (start, nb, v1, v2, v3, v4, dest);
691 printf ("\n ****\n **** Error in joinQuad(s)\n ****\n");
694 // ======================================================== joinQuad
695 Elements* Document::joinQuad (Quad* start, Quad* dest, Vertex* v1,
696 Vertex* v2, Vertex* v3, Vertex* v4, int nb)
699 tstart.push_back (start);
701 Elements* joint = joinQuads (tstart, dest, v1, v2, v3, v4, nb);
704 // ========================================================== getHexa
705 Hexa* Document::getHexa (int nro)
707 return static_cast <Hexa*> (getElement (EL_HEXA, nro));
709 // ========================================================== getQuad
710 Quad* Document::getQuad (int nro)
712 return static_cast <Quad*> (getElement (EL_QUAD, nro));
714 // ========================================================== getEdge
715 Edge* Document::getEdge (int nro)
717 return static_cast <Edge*> (getElement (EL_EDGE, nro));
719 // ========================================================== getVertex
720 Vertex* Document::getVertex (int nro)
722 return static_cast <Vertex*> (getElement (EL_VERTEX, nro));
724 // ========================================================== countElement
725 int Document::countElement (EnumElt type)
728 for (EltBase* elt = doc_first_elt[type]->next (); elt!=NULL;
735 // ========================================================== getElement
736 EltBase* Document::getElement (EnumElt type, int nro)
739 for (EltBase* elt = doc_first_elt[type]->next (); elt!=NULL;
751 // ========================================================= addLaw
752 Law* Document::addLaw (const char* name, int nbnodes)
754 Law* loi = new Law (name, nbnodes);
757 // ========================================================= addLaw
758 Law* Document::addLaw (Law* loi)
760 doc_laws.push_back (loi);
764 // ========================================================= GetLaw
765 Law* Document::getLaw (int nro)
767 if (nro <0 || nro>= nbr_laws)
770 return doc_laws [nro];
772 // ========================================================= FindLaw
773 Law* Document::findLaw (const char* name)
775 std::string nom = name;
776 for (int nro=0 ; nro<nbr_laws; nro++)
777 if (doc_laws [nro]->getName() == nom)
778 return doc_laws [nro];
782 // ========================================================= removeLaw
783 int Document::removeLaw (Law* loi)
785 for (int nro=1 ; nro<nbr_laws; nro++)
786 if (doc_laws [nro] == loi)
788 //All propagations having this law should now have the default law.
790 for (int nl=0 ; nl<nbr_propagations ; nl++)
792 if ( doc_propagation [nl]->getLaw() == loi )
793 doc_propagation [nl]->setLaw(defaultLaw);
796 delete doc_laws [nro];
797 doc_laws.erase (doc_laws.begin()+nro);
798 nbr_laws= doc_laws.size();
804 // ========================================================= majPropagation
805 void Document::majPropagation ()
809 // if (purge_elements)
812 for (int nro=0 ; nro<nbr_propagations ; nro++)
814 delete doc_propagation [nro];
817 doc_propagation.clear ();
818 nbr_propagations = 0;
819 maj_propagation = false;
821 for (EltBase* elt = doc_first_elt[EL_EDGE]->next (); elt!=NULL;
824 Edge* arete = static_cast <Edge*> (elt);
826 arete->setPropag (NOTHING, true);
829 // markAll (NO_COUNTED, EL_EDGE);
831 for (EltBase* elt = doc_first_elt[EL_HEXA]->next (); elt!=NULL;
834 Hexa* cell = static_cast <Hexa*> (elt);
835 if (cell!=NULL && cell->isHere())
837 for (int ne=0 ; ne<HE_MAXI ; ne++)
839 Edge* arete = cell->getEdge(ne);
840 if (arete->getPropag()<0)
842 Propagation* prop = new Propagation ();
843 doc_propagation.push_back (prop);
844 arete->propager (prop, nbr_propagations);
852 // ======================================================== countPropagation
853 int Document::countPropagation ()
858 return nbr_propagations;
860 // ======================================================== getPropagation
861 Propagation* Document::getPropagation (int nro)
866 if (nro < 0 || nro >= nbr_propagations)
869 return doc_propagation [nro];
871 // ======================================================== findPropagation
872 Propagation* Document::findPropagation (Edge* arete)
880 return getPropagation (arete->getPropag ());
882 // ======================================================== disconnectQuad
883 Elements* Document::disconnectQuad (Hexa* cell, Quad* element)
885 if (cell==NULL || element==NULL)
889 Elements* crees = cell->disconnectQuad (element);
896 // ======================================================== disconnectEdge
897 Elements* Document::disconnectEdge (Hexa* cell, Edge* element)
899 if (cell==NULL || element==NULL)
903 Elements* crees = cell->disconnectEdge (element);
909 // ======================================================== disconnectVertex
910 Elements* Document::disconnectVertex (Hexa* cell, Vertex* element)
912 if (cell==NULL || element==NULL)
916 Elements* crees = cell->disconnectVertex (element);
922 // ======================================================== cut
923 Elements* Document::cut (Edge* edge, int nbcuts)
925 Elements* t_hexas = new Elements (this);
927 if (edge==NULL || nbcuts<=0)
930 Propagation* prop = findPropagation (edge);
931 const Edges& t_edges = prop->getEdges ();
933 t_hexas->cutHexas (t_edges, nbcuts);
938 // ======================================================== addGroup
939 Group* Document::addGroup (cpchar name, EnumGroup kind)
941 Group* grp = new Group (name, kind);
942 doc_group.push_back (grp);
945 // ======================================================== findGroup
946 Group* Document::findGroup (cpchar name)
948 int nbre = doc_group.size();
950 for (int ng=0 ; ng<nbre ; ng++)
951 if (Cestegal (doc_group [ng]->getName(), name))
952 return doc_group [ng];
956 // ======================================================== removeGroup
957 int Document::removeGroup (Group* grp)
959 int nbre = doc_group.size();
960 for (int ng=0 ; ng<nbre ; ng++)
962 if (grp == doc_group [ng])
964 doc_group.erase (doc_group.begin() + ng);
969 // Pas trouve dans la liste. On detruit quand meme
972 }// ======================================================== makeCylinder
973 Elements* Document::makeCylinder (Cylinder* cyl, Vector* base, int nr, int na,
976 Elements* grille = new Elements (this);
977 grille->makeCylinder (cyl, base, nr, na, nl);
980 // ======================================================== makeCylinders
981 CrossElements* Document::makeCylinders (Cylinder* cyl1, Cylinder* cyl2)
983 CrossElements* grille = new CrossElements (this, GR_BICYL);
984 grille->crossCylinders (cyl1, cyl2, true);
988 // ======================================================== makePipe
989 Elements* Document::makePipe (Pipe* pipe, Vector* bx, int nr, int na, int nl)
991 Elements* grille = new Elements (this);
992 grille->makePipe (pipe, bx, nr, na, nr);
995 // ======================================================== makePipes
996 CrossElements* Document::makePipes (Pipe* pipe1, Pipe* pipe2)
998 CrossElements* grille = new CrossElements (this, GR_BIPIPE);
999 grille->crossCylinders (pipe1, pipe2, false);
1002 // ======================================================== setName
1003 int Document::setName (const char* name)
1009 // ======================================================== setLevel
1017 BiCylinder* test_bicylinder (Document* docu, int option);
1018 void set_debug_asso (bool boule);
1020 void Document::setLevel (int niv)
1023 clearAssociation ();
1024 else if (niv == 777)
1025 set_special_option (true);
1026 else if (niv == 778)
1027 set_special_option (false);
1029 else if (niv >=90 && niv <=99)
1030 test_bicylinder (this, niv-90);
1035 set_debug_asso (niv>0);
1038 // ======================================================== getAssoVertices
1039 void Document::getAssoVertices (Vertices& tabelt)
1042 for (EltBase* elt = doc_first_elt[EL_VERTEX]->next (); elt!=NULL;
1044 if (elt->isHere() && elt->getAssociation()!=NULL)
1045 tabelt.push_back (static_cast <Vertex*> (elt));
1047 // ======================================================== getAssoEdges
1048 void Document::getAssoEdges (Edges& tabelt)
1051 for (EltBase* elt = doc_first_elt[EL_EDGE]->next (); elt!=NULL;
1055 Edge* edge = static_cast <Edge*> (elt);
1056 int nbass = edge->getAssociations().size();
1058 tabelt.push_back (edge);