]> SALOME platform Git repositories - modules/hexablock.git/blob - src/HEXABLOCK/HexHexa.hxx
Salome HOME
67fccc7cd68e4ce29004814d42b4dbf551cd86ca
[modules/hexablock.git] / src / HEXABLOCK / HexHexa.hxx
1
2 // class : Les hexaedres
3 /* -----------------------------------------------------
4
5                 // ---- Numerotation des faces (%x) 
6
7                    
8               +----bf-----+
9              /|          /|
10            bc |   B    bd |
11            /  |        /  |
12           +----be-----+   |   
13           |  cf     F |   df
14           | C |       | D |             z
15          ce   | E     de  |             ^
16           |   +----af-|---+             |   y
17           |  /        |  /              |  /
18           | ac    A   | ad              | /
19           |/          |/                |/
20           +----ae-----+                 +----->  x
21                 
22
23  * ----------------------------------------------------- */
24 #ifndef __HEX_HEXA_H_
25 #define __HEX_HEXA_H_
26
27 #include "HexEltBase.hxx"
28
29 #include "HexQuad.hxx"
30 #include "HexEdge.hxx"
31 #include "HexVertex.hxx"
32
33 BEGIN_NAMESPACE_HEXA
34
35 class Hexa : public EltBase 
36 {
37 public:
38     virtual Quad*   getQuad   (int  nro);
39     virtual Edge*   getEdge   (int  nro);
40     virtual Vertex* getVertex (int  nro);
41
42     virtual int     countQuad   () { return HQ_MAXI; } 
43     virtual int     countEdge   () { return HE_MAXI; } 
44     virtual int     countVertex () { return HV_MAXI; } 
45
46 public:
47     Hexa (Vertex* v1, Vertex* v2, Vertex* v3, Vertex* v4, 
48           Vertex* v5, Vertex* v6, Vertex* v7, Vertex* v8);
49     Hexa (Quad* qa, Quad* qb, Quad* qc, Quad* qd, Quad* qe, Quad* qf);
50     Hexa (Hexa* other);
51     Quad* Inter   (Hexa* other);
52     bool  definedBy  (Vertex* v1, Vertex* v2);
53     bool  definedBy  (Quad*   va, Quad*   v2);
54     virtual void dump ();
55     virtual void dumpPlus ();
56     virtual void dumpFull ();
57   
58     void razNodes ();
59     int  countNodes ();                      // Compte et numerote les noeuds
60     void printNodes (pfile vtk, int& count); // Impression format vtk
61     void colorNodes (pfile vtk);             // Impression scalaires vtk
62     void moveNodes  (Matrix* matrice);       // transfo controlee ds un ensemble
63     void transform  (Matrix* matrice);       // transfo indivituelle
64     void printHexa  (pfile vtk);             // Impression de la cellule 
65     virtual void majReferences();            // M.A.J relation "utilise par"
66
67     bool hasFreeEdges  ();
68     void propager (Propagation* prop, int nro);
69     void setScalar (double valeur);
70
71     virtual void saveXml (XmlWriter& xml);
72
73     Elements*  disconnectQuad   (Quad*   face);
74     Elements*  disconnectEdge   (Edge*   arete);
75     Elements*  disconnectVertex (Vertex* noeud);
76
77     int getBase (Vertex* orig, Edge* normale);
78
79     void replaceQuad   (Quad*   old, Quad* nouveau);
80     void replaceEdge   (Edge*   old, Edge* nouveau);
81     void replaceVertex (Vertex* old, Vertex* nouveau);
82     void removeConnected ();
83     void markElements (int marque);
84
85 private:
86     friend class Cloner;
87     void  OrdonnerAretes ();    // obsolete ?
88     void  OrdonnerSommets ();   // obsolete ?
89
90     void  controlerFaces   ();  // Controle primaire des donnees utilisateur   
91     void  controlerSommets ();  // Idem;  
92
93     void  verifierSommets ();   // Controle de coherence des quads
94     void  verifierAretes ();    // Idem
95
96     void  controlerArete (int arete, int face1, int face2);
97     void  controlerSommet (int node, int arete1, int arete2, int arete3);
98
99     int   findQuad   (Quad*   element);
100     int   findEdge   (Edge*   element);
101     int   findVertex (Vertex* element);
102
103     int   findOpposedQuad  (Quad* face, Edge* arete);
104
105 private:
106     Quad*   h_quad   [HQ_MAXI];
107     Edge*   h_edge   [HE_MAXI];
108     Vertex* h_vertex [HV_MAXI];
109 };
110 // ------------------------------------------------------------  inlining
111 // ============================================================  getQuad
112 inline Quad* Hexa::getQuad (int nro) 
113 {
114    Quad* elt = NULL;
115    if (nro >=0 && nro < HQ_MAXI && el_status == HOK && h_quad [nro]->isValid())
116       elt = h_quad [nro]; 
117
118    return elt;
119 }
120 // ============================================================  getEdge
121 inline Edge* Hexa::getEdge (int nro)
122 {
123    Edge* elt = NULL;
124    if (nro >=0 && nro < HE_MAXI && el_status == HOK && h_edge [nro]->isValid())
125       elt = h_edge [nro]; 
126
127    return elt;
128 }
129 // ============================================================  getVertex
130 inline Vertex* Hexa::getVertex (int nro)
131 {
132    Vertex* elt = NULL;
133    if (nro >=0 && nro <  HV_MAXI && el_status == HOK && h_vertex [nro]->isValid())
134       elt = h_vertex [nro]; 
135
136    return elt;
137 }
138 // =============================================================== definedBy
139 inline bool Hexa::definedBy  (Vertex* v1, Vertex* v2)
140 {
141    for (int n1=0 ; n1< HV_MAXI ; n1++)
142        {
143 //              (   Diagonale        )  Dessus
144        int n2 = (n1 + 2) MODULO HV_MAXI + HV_MAXI;
145        if (   (v1 == h_vertex[n1] && v2 == h_vertex[n2])
146            || (v1 == h_vertex[n2] && v2 == h_vertex[n1])) return true;
147        }
148    return false;
149 }
150 // =============================================================== definedBy
151 inline bool Hexa::definedBy  (Quad* qa, Quad* qb)
152 {
153    for (int nc=0 ; nc< 3 ; nc++)
154        {
155        if (   (qa == h_quad[2*nc]   && qb == h_quad[2*nc+1])
156            || (qa == h_quad[2*nc+1] && qb == h_quad[2*nc])) return true;
157        }
158    return false;
159 }
160 // =============================================================== setScalar
161 inline void Hexa::setScalar  (double val)
162 {
163    for (int nc=0 ; nc< HV_MAXI ; nc++)
164        h_vertex[nc] -> setScalar (val);
165 }
166 // ============================================================== markElements
167 inline void Hexa::markElements  (int marque)
168 {
169    for (int nc=0 ; nc< HQ_MAXI ; nc++) h_quad  [nc] -> setMark (marque);
170    for (int nc=0 ; nc< HE_MAXI ; nc++) h_edge  [nc] -> setMark (marque);
171    for (int nc=0 ; nc< HV_MAXI ; nc++) h_vertex[nc] -> setMark (marque);
172 }
173
174 END_NAMESPACE_HEXA
175 #endif