X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FHEXABLOCK%2FHexEdge.cxx;h=2f0160b41b8cf83bef67c7a36fa3cbea15f9f4ac;hb=b871c3e20e331915e4534dcaffc1f0eab8f809d5;hp=e6583a3d88b2f48335081e530c46b8c3592d1c74;hpb=6924a056f811baefa30f31083b93b10f7dae3a35;p=modules%2Fhexablock.git diff --git a/src/HEXABLOCK/HexEdge.cxx b/src/HEXABLOCK/HexEdge.cxx index e6583a3..2f0160b 100755 --- a/src/HEXABLOCK/HexEdge.cxx +++ b/src/HEXABLOCK/HexEdge.cxx @@ -1,12 +1,12 @@ // C++ : Gestion des aretes -// Copyright (C) 2009-2013 CEA/DEN, EDF R&D +// Copyright (C) 2009-2016 CEA/DEN, EDF R&D // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License as published by the Free Software Foundation; either -// version 2.1 of the License. +// version 2.1 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -27,6 +27,7 @@ #include "HexXmlWriter.hxx" #include "HexNewShape.hxx" #include "HexAssoEdge.hxx" +#include "HexVertexShape.hxx" static int niveau = 0; @@ -61,6 +62,8 @@ Edge::Edge (Vertex* va, Vertex* vb) return; } + if (el_root != NULL) + el_root->addEdge (this); majReferences (); } // ======================================================== Constructeur 2 @@ -75,6 +78,9 @@ Edge::Edge (Edge* other) e_way = true; e_law = NULL; e_clone = NULL; + + if (el_root != NULL) + el_root->addEdge (this); } // ======================================================== majReferences void Edge::majReferences () @@ -126,6 +132,26 @@ void Edge::propager (Propagation* prop, int groupe, int sens) } niveau --; } +// ========================================================= setPropag +void Edge::setPropag (int nro, bool sens) +{ + e_propag = nro; + e_way = sens; + if (NOT db || nro<0) + return; + + int prems = sens ? 0 : 1; + Vertex* v1 = getVertex ( prems); + Vertex* v2 = getVertex (1-prems); + + cout << " setPropag " << el_name + << " = " << nro + << " = (" << v1->getName() << ", " << v2->getName() + << ") = (" << v2->getX() - v1->getX() + << ", " << v2->getY() - v1->getY() + << ", " << v2->getZ() - v1->getZ() + << ")" << endl; +} // ========================================================= getParent Quad* Edge::getParent (int nro) { @@ -233,7 +259,7 @@ string Edge::makeDefinition () return definition; } -// ========================================================== addAssociation +// ===================================================== addAssociation int Edge::addAssociation (EdgeShape* gline, double deb, double fin) { if (gline == NULL) @@ -272,7 +298,7 @@ int Edge::addAssociation (NewShape* geom, int subid, double deb, double fin) int ier = addAssociation (gline, deb, fin); return ier; } -// ========================================================== clearAssociation +// ================================================== clearAssociation void Edge::clearAssociation () { int nombre = tab_assoc.size (); @@ -284,14 +310,114 @@ void Edge::clearAssociation () tab_assoc .clear (); is_associated = false; } -// ========================================================== getAssociation +// ================================================== getAssociation AssoEdge* Edge::getAssociation (int nro) { - if (nro<0 || nro >= tab_assoc.size()) + if (nro<0 || nro >= (int)tab_assoc.size()) return NULL; return tab_assoc [nro]; } +// =============================================================== getVertex +Vertex* Edge::getVertex(int nro) +{ + Vertex* elt = NULL; + if (nro >=0 && nro < V_TWO && el_status == HOK + && e_vertex [nro]->isValid()) + elt = e_vertex [nro]; + + return elt; +} +// =============================================================== index +int Edge::index (Vertex* node) +{ + return node == NULL ? NOTHING + : node == e_vertex[V_AMONT] ? V_AMONT + : node == e_vertex[V_AVAL ] ? V_AVAL : NOTHING; +} +// ============================================================= opposedVertex +Vertex* Edge::opposedVertex (Vertex* sommet) +{ + int nro = index (sommet); + return nro<0 ? NULL : e_vertex[1-nro]; +} +// ============================================================= commonVertex +Vertex* Edge::commonVertex (Edge* other) +{ + int nro = inter (other); + return nro<0 ? NULL : e_vertex[nro]; +} +// ============================================================= commonPoint +double* Edge::commonPoint (Edge* other, double point[]) +{ + Vertex* commun = commonVertex (other); + if (commun==NULL) + { + point[dir_x] = point[dir_y] = point[dir_z] = 0; + return NULL; + } + + commun->getPoint (point); + return point; +} +// =============================================================== inter +int Edge::inter (Edge* other) +{ + int nro; + return inter (other, nro); +} +// =============================================================== inter +int Edge::inter (Edge* other, int& nother) +{ + for (int ni=0 ; nie_vertex[nj]) + { + nother = nj; + return ni; + } + + nother = NOTHING; + return NOTHING; +} +// =============================================================== definedBy +bool Edge::definedBy (Vertex* v1, Vertex* v2) +{ + bool rep = (v1 == e_vertex[V_AMONT] && v2 == e_vertex[V_AVAL ]) + || (v1 == e_vertex[V_AVAL ] && v2 == e_vertex[V_AMONT]); + return rep; +} +// =============================================================== setColor +void Edge::setColor (double val) +{ + e_vertex [V_AMONT]->setColor (val); + e_vertex [V_AVAL ]->setColor (val); +} +// =============================================================== duplicate +void Edge::duplicate () +{ + e_clone = new Edge (GetClone (e_vertex [V_AMONT]), + GetClone (e_vertex [V_AVAL ])); + + // e_clone->tab_shapes = tab_shapes; + e_clone->tab_assoc = tab_assoc; +} +// =============================================================== getVector +double* Edge::getVector (double vecteur[]) +{ + + if (e_vertex[V_AMONT]==NULL || e_vertex[V_AVAL]==NULL) + { + vecteur [dir_x] = vecteur [dir_y] = vecteur [dir_z] = 0; + return NULL; + } + + vecteur[dir_x] = e_vertex[V_AVAL]->getX() - e_vertex[V_AMONT]->getX(); + vecteur[dir_y] = e_vertex[V_AVAL]->getY() - e_vertex[V_AMONT]->getY(); + vecteur[dir_z] = e_vertex[V_AVAL]->getZ() - e_vertex[V_AMONT]->getZ(); + + return vecteur; +} // ========================================================== checkAssociation int Edge::checkAssociation () { @@ -320,8 +446,8 @@ int Edge::checkAssociation () { if (ier==HOK) cout << endl; cout << " Association Edge " << el_name - << " : Le vertex " << e_vertex[nro]->getName() - << " : Le vertex " << e_vertex[nro]->getName() + << " : Le vertex " << e_vertex[nro]->getName() + << " : Le vertex " << e_vertex[nro]->getName() << " Touche les lignes " << arc [nro] << " et " << nass << endl; ier = 112; @@ -371,4 +497,117 @@ int Edge::checkAssociation () return ier; } +// ========================================================== getAssoLen +double Edge::getAssoLen () +{ + int nombre = tab_assoc.size(); + double longueur = 0; + if (nombre==0) + { + Real3 p1, p2; + e_vertex [V_AMONT]-> getAssoCoord (p1); + e_vertex [V_AVAL ]-> getAssoCoord (p2); + longueur = calc_distance (p1, p2); + } + else + { + for (int nass=0 ; nasslength (); + } + + return longueur; +} +// ========================================================= getLength +double Edge::getLength () +{ + Real3 p1, p2; + e_vertex [V_AMONT]-> getAssoCoord (p1); + e_vertex [V_AVAL ]-> getAssoCoord (p2); + double longueur = calc_distance (p1, p2); + return longueur; +} +// ========================================================= findAssociation +int Edge::findAssociation (NewShape* geom) +{ + Real3 point, p2; + if (geom==NULL) + return NOTHING; + + e_vertex [V_AMONT]-> getAssoCoord (point); + e_vertex [V_AVAL ]-> getAssoCoord (p2); + + EdgeShape* gline = geom->findEdge (point, p2); + if (gline==NULL) + { + cout << " *** FindAssociation " << el_name << endl; + for (int nv=0 ; nv < V_TWO ; ++nv) + { + e_vertex [nv]-> getAssoCoord (point); + VertexShape* shape = geom->findVertex (point); + cout << " *** Vertex nro " << nv; + if (shape==NULL) + { + cout << " absent : "; + PutCoord (point); + } + else + { + cout << " : Subid = " << shape->getIdent() << endl; + } + } + return NOTHING; + } + + clearAssociation (); + addAssociation (gline, 0, 1); + return gline->getIdent(); +} +// ========================================================= setAssociation +int Edge::setAssociation (NewShape* geom, int subid) +{ + if (geom == NULL) + { + if (el_root->debug ()) + cout << " Edge " << el_name << " addAssociation of NULL ignored" + << endl; + return HERR; + } + + EdgeShape* gline = geom->findEdge (subid); + if (gline == NULL) + { + if (el_root->debug ()) + cout << " Edge " << el_name << " addAssociation bad subid : " + << subid << endl; + return HERR; + } + + Real3 p1, p2, pa, pb; + gline->getCoords (p1, p2); + e_vertex [V_AMONT]-> getAssoCoord (pa); + e_vertex [V_AVAL ]-> getAssoCoord (pb); + + double da1 = calc_d2 (pa, p1); + double da2 = calc_d2 (pa, p2); + double db1 = calc_d2 (pb, p1); + double db2 = calc_d2 (pb, p2); + + cout << "setAssociation " << el_name << " :" <setAssociation (p2); + e_vertex [V_AVAL ]->setAssociation (p1); + } + else + { + e_vertex [V_AMONT]->setAssociation (p1); + e_vertex [V_AVAL ]->setAssociation (p2); + } + + + clearAssociation (); + int ier = addAssociation (gline, 0, 1); + return ier; +} END_NAMESPACE_HEXA