2 // class : Les hexaedres
3 /* -----------------------------------------------------
5 // ---- Numerotation des faces (%x)
20 +----ae-----+ +-----> x
23 * ----------------------------------------------------- */
27 #include "HexEltBase.hxx"
29 #include "HexQuad.hxx"
30 #include "HexEdge.hxx"
31 #include "HexVertex.hxx"
35 class Hexa : public EltBase
38 virtual Quad* getQuad (int nro);
39 virtual Edge* getEdge (int nro);
40 virtual Vertex* getVertex (int nro);
42 virtual int countQuad () { return HQ_MAXI; }
43 virtual int countEdge () { return HE_MAXI; }
44 virtual int countVertex () { return HV_MAXI; }
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);
51 Quad* Inter (Hexa* other);
52 bool definedBy (Vertex* v1, Vertex* v2);
53 bool definedBy (Quad* va, Quad* v2);
55 virtual void dumpPlus ();
56 virtual void dumpFull ();
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"
68 void propager (Propagation* prop, int nro);
69 void setScalar (double valeur);
71 virtual void saveXml (XmlWriter& xml);
73 Elements* disconnectQuad (Quad* face);
74 Elements* disconnectEdge (Edge* arete);
75 Elements* disconnectVertex (Vertex* noeud);
77 int getBase (Vertex* orig, Edge* normale);
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);
87 void OrdonnerAretes (); // obsolete ?
88 void OrdonnerSommets (); // obsolete ?
90 void controlerFaces (); // Controle primaire des donnees utilisateur
91 void controlerSommets (); // Idem;
93 void verifierSommets (); // Controle de coherence des quads
94 void verifierAretes (); // Idem
96 void controlerArete (int arete, int face1, int face2);
97 void controlerSommet (int node, int arete1, int arete2, int arete3);
99 int findQuad (Quad* element);
100 int findEdge (Edge* element);
101 int findVertex (Vertex* element);
103 int findOpposedQuad (Quad* face, Edge* arete);
106 Quad* h_quad [HQ_MAXI];
107 Edge* h_edge [HE_MAXI];
108 Vertex* h_vertex [HV_MAXI];
110 // ------------------------------------------------------------ inlining
111 // ============================================================ getQuad
112 inline Quad* Hexa::getQuad (int nro)
115 if (nro >=0 && nro < HQ_MAXI && el_status == HOK && h_quad [nro]->isValid())
120 // ============================================================ getEdge
121 inline Edge* Hexa::getEdge (int nro)
124 if (nro >=0 && nro < HE_MAXI && el_status == HOK && h_edge [nro]->isValid())
129 // ============================================================ getVertex
130 inline Vertex* Hexa::getVertex (int nro)
133 if (nro >=0 && nro < HV_MAXI && el_status == HOK && h_vertex [nro]->isValid())
134 elt = h_vertex [nro];
138 // =============================================================== definedBy
139 inline bool Hexa::definedBy (Vertex* v1, Vertex* v2)
141 for (int n1=0 ; n1< HV_MAXI ; n1++)
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;
150 // =============================================================== definedBy
151 inline bool Hexa::definedBy (Quad* qa, Quad* qb)
153 for (int nc=0 ; nc< 3 ; nc++)
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;
160 // =============================================================== setScalar
161 inline void Hexa::setScalar (double val)
163 for (int nc=0 ; nc< HV_MAXI ; nc++)
164 h_vertex[nc] -> setScalar (val);
166 // ============================================================== markElements
167 inline void Hexa::markElements (int marque)
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);