2 // class : Les Quadrangles
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/ or email : webmaster.salome@opencascade.com
25 #include "HexEdge.hxx"
31 Vertex* v11; // 1er sommet 1er quad
33 Vertex* v21; // 1er sommet 2eme quad
35 int dir; // direction element suivant
37 StrOrient ( Vertex* n11, Vertex* n12, Vertex* n21, Vertex* n22, int d=0)
38 : v11 (n11), v12 (n12), v21 (n21), v22 (n22), dir (d) {}
40 StrOrient ( StrOrient* s)
41 : v11 (s->v11), v12(s->v12), v21(s->v21), v22(s->v22), dir(s->dir){}
45 class Quad : public EltBase
48 virtual Edge* getEdge (int nro);
49 virtual Vertex* getVertex (int nro);
51 virtual int countEdge () { return QUAD4; }
52 virtual int countVertex () { return QUAD4; }
55 Quad (Vertex* va, Vertex* vb, Vertex* vc, Vertex* vd);
56 Quad (Edge* ea, Edge* eb, Edge* ec, Edge* ed);
59 Hexa* getParent (int nro);
61 Edge* findEdge (Vertex* v1, Vertex*v2);
62 Edge* commonEdge (Quad* other);
63 int anaMerge (Vertex* v1, Vertex* v2, Vertex* tv[], Edge* te[]);
65 int ordoVertex (Vertex* v1, Vertex* v2, Vertex* tv[]);
66 int prepaMerge (Vertex* tv1[], Vertex* tv2[], Edge* te1[]);
68 int inter (Quad* other, int& nro);
69 bool definedBy (Vertex* v1, Vertex* v2);
70 bool definedBy (Edge* e1, Edge* e2);
72 int indexVertex (Vertex* elt);
73 int indexEdge (Edge* elt);
75 int accoupler (Quad* other, StrOrient* orient);
76 int coupler (Quad* other, StrOrient* orient, Elements* table);
78 Edge* getOpposEdge (Edge* arete, int &sens);
79 Vertex* getOpposVertex (Vertex* sommet);
81 virtual void majReferences(); // M.A.J relation "utilise par"
83 virtual void dumpPlus ();
84 virtual void saveXml (XmlWriter* xml);
85 void setScalar (double valeur);
86 void setColor (double valeur) { setScalar (valeur) ; }
88 void replace (Quad* old);
89 virtual void replaceEdge (Edge* old, Edge* nouveau);
90 virtual void replaceVertex (Vertex* old, Vertex* nouveau);
92 virtual void setAssociation (Shape* forme);
93 virtual int addAssociation (Shape* forme);
94 virtual void clearAssociation () { tab_assoc.clear() ; }
95 virtual bool isAssociated () { return tab_assoc.size() > 0 ; }
97 const Shapes& getAssociations () { return tab_assoc ; }
100 virtual void duplicate ();
101 Quad* getClone () { return q_clone ; }
103 Edge* getOpposEdge (Edge* arete); // Version simplifiee
104 Edge* getPerpendicular (Edge* arete, Vertex* node);
105 int getOrientation () { return q_orientation; }
106 int setOrientation ();
107 void setOrientation (int ori);
111 Quad* getBrother (StrOrient* orient);
114 Edge* q_edge [QUAD4];
115 Vertex* q_vertex [QUAD4];
121 // ----------------------------------------------- Inlining
122 // ========================================================== addAssociation
123 inline int Quad::addAssociation (Shape* forme)
126 tab_assoc.push_back (forme);
129 // ============================================================ getEdge
130 inline Edge* Quad::getEdge (int nro)
133 if (nro >=0 && nro < QUAD4 && el_status == HOK && q_edge [nro]->isValid())
138 // ============================================================ getVertex
139 inline Vertex* Quad::getVertex (int nro)
142 if (nro >=0 && nro < QUAD4 && el_status == HOK && q_vertex [nro]->isValid())
143 elt = q_vertex [nro];
147 // ======================================================== commonEdge
148 inline Edge* Quad::commonEdge (Quad* other)
150 for (int ne1=0 ; ne1<QUAD4 ; ne1++)
151 for (int ne2=0 ; ne2<QUAD4 ; ne2++)
152 if (q_edge [ne1] == other->q_edge [ne2])
158 // ======================================================== Inter
159 inline int Quad::inter (Quad* other, int& nother)
161 for (int ne1=0 ; ne1<QUAD4 ; ne1++)
162 for (int ne2=0 ; ne2<QUAD4 ; ne2++)
163 if (q_edge [ne1] == other->q_edge [ne2])
172 // ============================================================ definedBy (v)
173 inline bool Quad::definedBy (Vertex* v1, Vertex* v2)
175 for (int n1=0 ; n1< QUAD4 ; n1++)
176 if (v1 == q_vertex[n1] && v2 == q_vertex[(n1+2) MODULO QUAD4])
181 // ============================================================ definedBy (e)
182 inline bool Quad::definedBy (Edge* e1, Edge* e2)
184 for (int n1=0 ; n1< QUAD4 ; n1++)
185 if (e1 == q_edge[n1] && e2 == q_edge[(n1+2) MODULO QUAD4])
190 // =============================================================== findEdge
191 inline Edge* Quad::findEdge (Vertex* v1, Vertex* v2)
193 for (int nro=0 ; nro< QUAD4 ; nro++)
195 Vertex* va = q_edge[nro]->getVertex(V_AMONT) ;
196 Vertex* vb = q_edge[nro]->getVertex(V_AVAL) ;
197 if ((v1==va && v2==vb) || (v1==vb && v2==va))
203 // =============================================================== indexVertex
204 inline int Quad::indexVertex (Vertex* elt)
206 for (int n1=0 ; n1< QUAD4 ; n1++)
207 if (elt == q_vertex[n1])
212 // =============================================================== indexEdge
213 inline int Quad::indexEdge (Edge* elt)
215 for (int n1=0 ; n1< QUAD4 ; n1++)
216 if (elt == q_edge[n1])
221 // =============================================================== setScalar
222 inline void Quad::setScalar (double val)
224 for (int n1=0 ; n1< QUAD4 ; n1++)
225 q_vertex[n1] -> setScalar (val);
227 // =============================================================== duplicate
228 inline void Quad::duplicate ()
230 q_orientation = Q_UNDEFINED;
231 q_clone = new Quad (GetClone (q_edge [E_A]),
232 GetClone (q_edge [E_B]),
233 GetClone (q_edge [E_C]),
234 GetClone (q_edge [E_D]));
235 q_clone->tab_assoc = tab_assoc;