2 // C++ : Associations dans le document
4 // Copyright (C) 2009-2013 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
22 #include "HexDocument.hxx"
23 #include "HexEdge.hxx"
24 #include "HexQuad.hxx"
25 #include "HexDiagnostics.hxx"
26 #include "HexNewShape.hxx"
27 #include "HexEdgeShape.hxx"
31 static bool db = on_debug (); // == getenv ("HEXA_DB") > 0
34 int vertexInLine (Vertex* vfirst, Edges& mline, vector<int> &tsens);
35 // ====================================================== vertexInLine
36 int vertexInLine (Vertex* vfirst, Edges& mline, vector<int> &tsens)
38 int nbseg = mline.size ();
40 for (int ned = 0 ; ned<nbseg ; ned++)
42 if (tsens [ned] == V_TWO)
43 for (int ns=V_AMONT; ns<=V_AVAL ; ns++)
45 if (mline[ned]->getVertex (ns) == vfirst)
55 // ====================================================== clearAssociation
56 void Document::clearAssociation ()
62 // ====================================================== clearAssociation (t)
63 int Document::clearAssociation (EnumElt type)
76 default : return HERR;
81 // ====================================================== clearAssoVertices
82 void Document::clearAssoVertices ()
84 for (EltBase* elt = doc_first_elt[EL_VERTEX]->next (); elt!=NULL;
87 Vertex* elem = static_cast <Vertex*> (elt);
89 elem->clearAssociation ();
92 // ====================================================== clearAssoEdges
93 void Document::clearAssoEdges ()
95 for (EltBase* elt = doc_first_elt[EL_EDGE]->next (); elt!=NULL;
98 Edge* elem = static_cast <Edge*> (elt);
100 elem->clearAssociation ();
103 // ====================================================== clearAssoQuads
104 void Document::clearAssoQuads ()
106 for (EltBase* elt = doc_first_elt[EL_VERTEX]->next (); elt!=NULL;
109 Quad* elem = static_cast <Quad*> (elt);
110 if (elem->isValid ())
111 elem->clearAssociation ();
114 // ====================================================== addShape (1)
115 NewShape* Document::addShape (TopoDS_Shape& topo, cpchar name)
117 NewShape* shape = new NewShape (this);
118 doc_tab_shape.push_back (shape);
120 shape->setName (name);
121 shape->setShape (topo);
124 // ====================================================== addShape (2)
125 NewShape* Document::addShape (cpchar name, EnumShape type)
127 NewShape* shape = new NewShape (this, type);
128 doc_tab_shape.push_back (shape);
130 shape->setName (name);
133 // ====================================================== addCloud
134 void Document::addCloud ()
136 doc_cloud = new NewShape (this, SH_CLOUD);
137 doc_cloud->setName ("cloud");
139 doc_tab_shape.push_back (doc_cloud);
141 // ====================================================== getShape
142 NewShape* Document::getShape (int nro)
144 int nbre = doc_tab_shape.size ();
145 if (nro < 0 || nro >= nbre)
148 return doc_tab_shape [nro];
150 // ====================================================== findShape
151 NewShape* Document::findShape (rcstring nom)
153 int nbre = doc_tab_shape.size ();
154 for (int nro=0 ; nro<nbre ; ++nro)
155 if (nom == doc_tab_shape [nro]->getName())
156 return doc_tab_shape [nro];
158 // ====================================================== find_line
159 EdgeShape* find_line (EdgeShapes& gline, double* point, int& sens)
161 int nbseg = gline.size ();
163 for (int ned = 0 ; ned<nbseg ; ned++)
165 EdgeShape* edge = gline [ned];
168 sens = edge->onExtremity (point);
178 // ====================================================== find_edge
179 Edge* find_edge (Edges& mline, Vertex* vfirst, int& sens)
181 int nbseg = mline.size ();
183 for (int ned = 0 ; ned<nbseg ; ned++)
185 Edge* edge = mline [ned];
188 sens = edge->index (vfirst);
198 // ====================================================== associateOpenedLine
199 int Document::associateOpenedLine (Edges& mline, NewShapes& gline,
201 double pstart, double pend)
203 cout << "_________________________________ Asso Open Line"
204 << " ed=" << mline.size()
205 << " sh=" << tabid.size()
207 int ier = associateLine (NULL, mline, gline, tabid, pstart, pend, false);
210 // ====================================================== associateClosedLine
211 int Document::associateClosedLine (Vertex* vfirst, Edges& mline,
212 NewShapes& gline, IntVector& tabid,
213 double pstart, bool inv)
217 putError (W_ASSO_LINE3);
221 cout << "_________________________________ Asso Closed Line"
222 << " first=" << vfirst->getName()
223 << " ed=" << mline.size()
224 << " sh=" << tabid.size()
227 int ier = associateLine (vfirst, mline, gline, tabid, pstart, 1.0, inv);
231 // ====================================================== associateLine
232 int Document::associateLine (Vertex* vfirst, Edges& mline,
233 NewShapes& tshapes, IntVector& subid,
234 double pstart, double pend, bool inv)
238 IntVector gsens, tsens;
241 bool closed = vfirst!=NULL;
242 int ier = sortShapes (tshapes, subid, closed, inv, pstart, pend,
243 glines, gsens, lgtotale);
247 ier = sortEdges (vfirst, mline, tedges, tsens);
251 int nbedges = tedges.size();
252 int nblines = glines.size();
254 EdgeShape* gstart = glines [0];
255 EdgeShape* gend = glines [nblines-1];
256 bool boucle = closed && nblines==1;
258 double abstart = inv ? (1-pstart) : pstart;
261 bool rev = gsens [nblines-1]!=0;
262 double abend = rev ? pend : (1-pend);
263 lgtotale = lgtotale - abstart * gstart->getLength()
264 - abend * gend ->getLength();
268 gstart->getPoint (pstart, point);
269 int vsid = doc_cloud->addPoint (point);
270 Vertex* node = tedges[0]->getVertex (tsens[0]);
271 node->setAssociation (doc_cloud, vsid);
273 double lgedge = lgtotale/nbedges;
275 double smax = gstart->getLength()*(1-abstart);
276 double emax = lgedge;
277 double pdeb = pstart;
283 while (ned < nbedges && nsh < nblines)
285 EdgeShape* shape = glines [nsh];
286 Edge* edge = tedges [ned];
287 bool grev = gsens [nsh]==1;
288 bool av_shape = smax < emax + tol;
289 bool av_edge = emax < smax + tol;
290 bool vassoc = av_edge && NOT (closed && ned == nbedges-1);
292 double lgshape = shape->getLength ();
294 double abscisse = std::min (emax, smax);
295 double decal = (abscisse-ablast) / lgshape;
299 if (pfin < 0.0) pfin = 0;
304 if (pfin > 1.0) pfin = 1;
307 edge->addAssociation (shape, pdeb, pfin);
311 shape->getPoint (pfin, point);
312 vsid = doc_cloud->addPoint (point);
313 node = edge ->getVertex (1-tsens[ned]);
315 node->setAssociation (doc_cloud, vsid);
319 // On incremente les edges
325 // On incremente les shapes
332 smax = shape->getLength ();
340 smax += glines[nsh]->getLength();
348 // ====================================================== sortShapes
349 int Document::sortShapes (NewShapes& tshapes, IntVector& subid, bool closed,
350 bool inv, double pstart, double pend,
351 EdgeShapes& glines, IntVector& gsens, double& lgtotale)
354 int nblines = subid.size ();
355 int nombre = tshapes.size ();
357 if (nblines==0 || nombre==0)
360 if (nombre != 1 && nombre != nblines)
363 for (int ns = 0 ; ns < nombre ; ns++)
365 if (tshapes[ns] == NULL)
367 sprintf (cnum, "%d", ns);
368 putError (W_ASSO_LINE5, cnum);
373 NewShape* geom = tshapes [0];
374 EdgeShapes buf_lines;
377 for (int ns = 0 ; ns < nblines ; ns++)
381 EdgeShape* shape = geom->findEdge (subid[ns]);
384 sprintf (cnum, "%d", ns);
385 putError (W_ASSO_LINE5, cnum);
388 buf_lines.push_back (shape);
392 EdgeShape* gnext = buf_lines[0];
394 int reste = nblines - 1;
397 lgtotale = gnext->getLength();
398 glines.push_back (gnext);
399 gsens .push_back (inv);
401 for (int nro = 0 ; nro < reste ; nro++)
403 double param = 1-rev;
404 gnext->getPoint (param, pnext);
405 gnext = find_line (buf_lines, pnext, rev);
408 lgtotale += gnext->getLength();
409 glines.push_back (gnext);
410 gsens .push_back (rev);
415 EdgeShape* gfirst = glines[0];
416 gfirst->getPoint (1-inv, pnext);
417 int ext = gnext->onExtremity (pnext);
423 // ====================================================== sortEdges
424 int Document::sortEdges (Vertex* vfirst, Edges& mline, Edges& tab_edge,
428 bool closed = vfirst!=NULL;
430 int nbedges = mline.size ();
434 Edge* mstart = mline[0]; // Coherence ancienne version
436 // Le vertex de depart n'appartient pas a l'edge de depart
437 int istart = mstart->index (vfirst);
438 if (closed && istart == NOTHING)
440 putError (W_ASSO_LINE2, vfirst->getName());
447 for (int nro = 0 ; nro < nbedges ; nro++)
449 Edge* edge = mline[nro];
452 sprintf (cnum, "%d", nro);
453 putError (W_ASSO_LINE5, cnum);
456 buf_edge.push_back (edge);
459 Vertex* vnext = NULL;
460 Edge* enext = mstart;
462 int reste = nbedges - 1;
463 tab_edge.push_back (mstart);
468 tab_sens.push_back (istart);
473 vnext = mstart->getVertex (1-istart);
474 enext = find_edge (buf_edge, vnext, sens);
478 vnext = mstart->getVertex (1-istart);
479 enext = find_edge (buf_edge, vnext, sens);
483 tab_sens.push_back (istart);
484 tab_edge.push_back (enext);
485 tab_sens.push_back (sens);
489 for (int nro = 0 ; nro < reste ; nro++)
491 vnext = enext->getVertex (1 - sens);
492 enext = find_edge (buf_edge, vnext, sens);
495 tab_edge.push_back (enext);
496 tab_sens.push_back (sens);
499 istart = tab_edge [nbedges-1]->index (vfirst);
500 if (closed && istart == NOTHING)
502 putError (W_ASSO_LINE2, vfirst->getName());
508 // ====================================================== checkAssociations
509 int Document::checkAssociations ()
511 int nombre = countUsedEdge();
512 for (int ned=0 ; ned<nombre ; ++ned)
514 Edge* edge = getUsedEdge (ned);
515 int ier = edge->checkAssociation ();
516 // if (ier != HOK) return ier;