Salome HOME
Bug moteur + ajout cas test
[modules/hexablock.git] / src / HEXABLOCK / HexDocument_skin.cxx
1
2 // C++ : Reordonnancement des faces
3
4 #include "HexDocument.hxx"
5
6 #include "HexVertex.hxx"
7 #include "HexEdge.hxx"
8 #include "HexQuad.hxx"
9 #include "HexHexa.hxx"
10
11 #include <queue>
12
13 BEGIN_NAMESPACE_HEXA
14 // ----------------------------------------------------------------------
15 struct OrientedQuad 
16      {
17      Quad* quad;
18      Vertex* v1;
19      Vertex* v2;
20      };
21
22 void propagateOrientation (queue <OrientedQuad> &queue_quads, Quad* orig);
23 void makeSkin (Quad* orig);
24
25 // ========================================================= reorderFaces
26 // ==== Ordonner les faces externes
27 void Document::reorderQuads ()
28 {
29    majReferences ();
30    EltBase* elt = NULL;
31
32    for (elt = doc_first_elt[EL_QUAD]->next (); elt!=NULL; elt = elt->next())
33        if (elt!=NULL && elt->isHere())
34           {
35           Quad* quad = static_cast <Quad*> (elt);
36           if (quad->getNbrParents()==1) quad->setOrientation (Q_UNDEFINED);
37           else                          quad->setOrientation (Q_INSIDE);
38           }
39
40    for (elt = doc_first_elt[EL_HEXA]->next (); elt!=NULL; elt = elt->next())
41        if (elt!=NULL && elt->isHere())
42           {
43           Hexa* hexa = static_cast <Hexa*> (elt);
44           for (int nq=0; nq<HQ_MAXI ; nq++)
45               {
46               Quad* quad = hexa->getQuad (nq);
47               if (quad->getOrientation()==Q_UNDEFINED)
48                  makeSkin (quad);
49               }
50           }
51
52    for (elt = doc_first_elt[EL_QUAD]->next (); elt!=NULL; elt = elt->next())
53        if (elt!=NULL && elt->isHere())
54           {
55           Quad* quad = static_cast <Quad*> (elt);
56           quad->reorienter ();
57           }
58 }
59 // ========================================================= makeSkin
60 void makeSkin (Quad* orig)
61 {
62    OrientedQuad triplet;
63    queue <OrientedQuad> queue_quads;
64
65    orig->setOrientation();  // Q_DIRECT=1, Q_INVERSE=2 
66    propagateOrientation (queue_quads, orig);
67    
68    while (NOT queue_quads.empty ())
69       {
70       triplet = queue_quads.front ();
71       queue_quads.pop ();
72       int n1 = triplet.quad->indexVertex (triplet.v1);
73       int n2 = triplet.quad->indexVertex (triplet.v2);
74       int sens = Q_WAITING;
75       if (n2 == (n1+1) MODULO QUAD4)
76           sens = Q_DIRECT;
77       else if (n1 == (n2+1) MODULO QUAD4)
78           sens = Q_INVERSE;
79       else 
80           printf (" **************** Orientation face impossible\n");
81
82       triplet.quad->setOrientation (sens);
83       propagateOrientation (queue_quads, triplet.quad);
84       }
85 }
86 // ==================================================== propagateOrientation
87 void propagateOrientation (queue <OrientedQuad> &queue_quads, Quad* orig)
88 {
89    OrientedQuad triplet;
90                 // Q_DIRECT : le sens des vertex est l'exterieur 
91    int sens = orig->getOrientation();  // Q_DIRECT=1, Q_INVERSE=2 
92
93    for (int ned=0; ned<QUAD4 ; ned++)
94        {
95        triplet.v1 = orig->getVertex ( ned );
96        triplet.v2 = orig->getVertex ((ned+1) MODULO QUAD4);
97        if (sens==Q_DIRECT)
98           {
99           Vertex* v3 = triplet.v1;
100           triplet.v1 = triplet.v2;
101           triplet.v2 = v3;
102           }
103        Edge* edge = orig->getEdge (ned);
104        int nbp    = edge->getNbrParents ();
105        for (int np=0; np<nbp ; np++)
106            {
107            triplet.quad = edge->getParent (np); 
108            if (triplet.quad->getOrientation ()==Q_UNDEFINED)
109               {
110               triplet.quad->setOrientation (Q_WAITING);
111               queue_quads.push (triplet);
112               }
113            }
114        }
115 }
116 END_NAMESPACE_HEXA