2 // C++ : Associatiosn dans le document
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
22 #include "HexDocument.hxx"
23 #include "HexEdge.hxx"
24 #include "HexDiagnostics.hxx"
29 static bool db = false;
31 int vertexInLine (Vertex* mfirst, Edges& mline, vector<int> &tsens);
32 int associateShapes (Edges& mline, int msens[], Shape* gstart, Shapes& gline,
33 double pstart, double pend, bool closed, bool inv=false);
35 // ====================================================== associateOpenedLine
36 int Document::associateOpenedLine (Edge* mstart, Edges& mline, Shape* gstart,
37 double pstart, Shapes& gline, double pend)
39 int ier = associateLine (NULL, mstart, mline, gstart, pstart, gline, pend);
42 // ====================================================== associateClosedLine
43 int Document::associateClosedLine (Vertex* vfirst, Edge* mstart, Edges& mline,
44 Shape* gstart, double pstart, bool inv, Shapes& gline)
48 putError (W_ASSO_LINE3);
52 int ier = associateLine (vfirst, mstart, mline, gstart, pstart, gline,
56 // ====================================================== associateClosedLine
57 int Document::associateLine (Vertex* vfirst, Edge* mstart, Edges& mline,
58 Shape* gstart, double pstart, Shapes& gline, double pend,
62 char buffer [16], cnum [8];
63 int nbseg = mline.size ();
64 bool closed = vfirst != NULL;
68 putError (W_ASSO_LINE4);
72 // Le vertex de depart n'appartient pas a l'edge de depart
73 int istart = mstart->index (vfirst);
74 if (closed && istart == NOTHING)
76 putError (W_ASSO_LINE2, vfirst->getName (buffer));
84 mstart->printName (" = (");
85 mstart->getVertex(V_AMONT)->printName (", ");
86 mstart->getVertex(V_AVAL) ->printName (")\n");
88 for (int nro=0 ; nro<nbseg ; nro++)
90 printf (" %2d : ", nro);
91 mline[nro]->printName(" = (");
92 mline[nro]->getVertex(V_AMONT)->printName(", ");
93 mline[nro]->getVertex(V_AVAL )->printName(")\n");
98 for (int ns = 0 ; ns < nbseg ; ns++)
100 if (mline[ns] == NULL)
102 sprintf (cnum, "%d", ns);
103 putError (W_ASSO_LINE5, cnum);
108 vector <int> tab_sens (nbseg, V_TWO);
111 Vertex* pnode = mstart->getVertex (sens);
119 pnode = mstart->getVertex (sens);
120 nedge = vertexInLine (pnode, mline, tab_sens);
121 if (nedge == NOTHING)
124 pnode = mstart->getVertex (sens);
125 nedge = vertexInLine (pnode, mline, tab_sens);
128 // Closed : on recherche ou se trouve le 2e vertex de mstart
132 pnode = mstart->getVertex (sens);
133 nedge = vertexInLine (pnode, mline, tab_sens);
138 if (nedge == NOTHING)
140 putError (W_ASSO_LINE, mstart->getName (buffer));
145 vector <int> les_orig;
146 les_edges.push_back (mstart);
147 les_orig .push_back (1-sens);
149 cout << " ........................................ Marque 1" << endl;
152 les_edges.push_back (mline[nedge]);
153 les_orig. push_back (tab_sens[nedge]);
156 cout << " ........................................ Marque 2" << endl;
158 printf (" mstart [%d] = mline[%d][%d] = %s\n", sens, nedge,
159 tab_sens [nedge], pnode->getName(buffer));
161 cout << " ........................................ Marque 3" << endl;
162 for (int ns = 1 ; ns < nbseg ; ns++)
164 Vertex* pnode = mline[nedge]->getVertex (1-tab_sens [nedge]);
165 int nro = vertexInLine (pnode, mline, tab_sens);
168 sprintf (cnum, "%d", nedge);
169 putError (W_ASSO_LINE2, cnum, mline[nedge]->getName (buffer));
173 printf (" mline[%d][%d] = mline[%d][%d] = %s\n", nedge,
174 1-tab_sens [nedge], nro, tab_sens [nro], pnode->getName(buffer));
176 les_edges.push_back (mline [nedge]);
177 les_orig. push_back (tab_sens [nedge]);
180 /********************
183 printf (" ... gstart = 0x%x, pstart=%g\n", gstart, pstart);
184 for (int ns = 0 ; ns < gline.size() ; ns++)
186 printf (" ... gline[%d] = 0x%x\n", ns, gline[ns]);
189 **************************/
193 Vertex* tete = les_edges [0] ->getVertex (les_orig[0]);
194 Vertex* queue = les_edges [nbseg]->getVertex (1-les_orig[nbseg]);
199 HexDump (les_edges [0]);
200 HexDump (les_edges [nbseg]);
201 putError (W_ASSO_LINE6);
206 int ier = associateShapes (les_edges, &les_orig[0], gstart, gline, pstart,
210 // ====================================================== vertexInLine
211 int vertexInLine (Vertex* mfirst, Edges& mline, vector<int> &tsens)
213 int nbseg = mline.size ();
215 for (int ned = 0 ; ned<nbseg ; ned++)
217 if (tsens [ned] == V_TWO)
218 for (int ns=V_AMONT; ns<=V_AVAL ; ns++)
220 if (mline[ned]->getVertex (ns) == mfirst)
230 // ====================================================== vertexInLine
231 void Document::clearAssociation ()
233 for (int nat=EL_VERTEX ; nat<=EL_QUAD ; nat++)
235 for (EltBase* elt = doc_first_elt[nat]->next (); elt!=NULL;
237 clear_association (elt);