]> SALOME platform Git repositories - modules/hexablock.git/blob - src/HEXABLOCK/HexDocument_skin.cxx
Salome HOME
Merge from V6_main 13/12/2012
[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 // ========================================================= makeSkin
53 void makeSkin (Quad* orig)
54 {
55    OrientedQuad triplet;
56    queue <OrientedQuad> queue_quads;
57
58    orig->setOrientation();  // Q_DIRECT=1, Q_INVERSE=2 
59    propagateOrientation (queue_quads, orig);
60    
61    while (NOT queue_quads.empty ())
62       {
63       triplet = queue_quads.front ();
64       queue_quads.pop ();
65       int n1 = triplet.quad->indexVertex (triplet.v1);
66       int n2 = triplet.quad->indexVertex (triplet.v2);
67       int sens = Q_WAITING;
68       if (n2 == (n1+1) MODULO QUAD4)
69           sens = Q_DIRECT;
70       else if (n1 == (n2+1) MODULO QUAD4)
71           sens = Q_INVERSE;
72       else 
73           printf (" **************** Orientation face impossible\n");
74
75       triplet.quad->setOrientation (sens);
76       propagateOrientation (queue_quads, triplet.quad);
77       }
78 }
79 // ==================================================== propagateOrientation
80 void propagateOrientation (queue <OrientedQuad> &queue_quads, Quad* orig)
81 {
82    OrientedQuad triplet;
83                 // Q_DIRECT : le sens des vertex est l'exterieur 
84    int sens = orig->getOrientation();  // Q_DIRECT=1, Q_INVERSE=2 
85
86    for (int ned=0; ned<QUAD4 ; ned++)
87        {
88        triplet.v1 = orig->getVertex ( ned );
89        triplet.v2 = orig->getVertex ((ned+1) MODULO QUAD4);
90        if (sens==Q_DIRECT)
91           {
92           Vertex* v3 = triplet.v1;
93           triplet.v1 = triplet.v2;
94           triplet.v2 = v3;
95           }
96        Edge* edge = orig->getEdge (ned);
97        int nbp    = edge->getNbrParents ();
98        for (int np=0; np<nbp ; np++)
99            {
100            triplet.quad = edge->getParent (np); 
101            if (triplet.quad->getOrientation ()==Q_UNDEFINED)
102               {
103               triplet.quad->setOrientation (Q_WAITING);
104               queue_quads.push (triplet);
105               }
106            }
107        }
108 }
109 END_NAMESPACE_HEXA