Commit | Line | Data |
---|---|---|
b311480e | 1 | // Created on: 1996-03-07 |
2 | // Created by: Jean Yves LEBEY | |
3 | // Copyright (c) 1996-1999 Matra Datavision | |
973c2be1 | 4 | // Copyright (c) 1999-2014 OPEN CASCADE SAS |
b311480e | 5 | // |
973c2be1 | 6 | // This file is part of Open CASCADE Technology software library. |
b311480e | 7 | // |
d5f74e42 | 8 | // This library is free software; you can redistribute it and/or modify it under |
9 | // the terms of the GNU Lesser General Public License version 2.1 as published | |
973c2be1 | 10 | // by the Free Software Foundation, with special exception defined in the file |
11 | // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT | |
12 | // distribution for complete text of the license and disclaimer of any warranty. | |
b311480e | 13 | // |
973c2be1 | 14 | // Alternatively, this file may be used under the terms of Open CASCADE |
15 | // commercial license or contractual agreement. | |
7fd59977 | 16 | |
17 | #include <TopOpeBRepBuild_Builder.ixx> | |
18 | #include <TopOpeBRepBuild_define.hxx> | |
19 | #include <TopOpeBRepDS_EXPORT.hxx> | |
20 | ||
21 | #ifdef DRAW | |
22 | #include <TopOpeBRepDS_DRAW.hxx> | |
23 | #endif | |
24 | ||
25 | #include <TopOpeBRepDS_EXPORT.hxx> | |
26 | #include <TopOpeBRepDS_ProcessInterferencesTool.hxx> | |
27 | #include <TopOpeBRepTool_EXPORT.hxx> | |
28 | #include <TopOpeBRepTool_TOOL.hxx> | |
29 | #include <TopOpeBRepDS_TKI.hxx> | |
30 | #include <TopOpeBRepDS.hxx> | |
31 | #include <BRep_Tool.hxx> | |
32 | #include <TopoDS.hxx> | |
33 | #include <Geom_Curve.hxx> | |
34 | #include <Geom2d_Curve.hxx> | |
35 | #include <Geom_Plane.hxx> | |
36 | #include <gp_Pnt.hxx> | |
37 | #include <gp_Pnt2d.hxx> | |
38 | #include <ElCLib.hxx> | |
39 | #include <ElSLib.hxx> | |
40 | #include <Geom2dAdaptor_Curve.hxx> | |
41 | #include <Precision.hxx> | |
42 | #include <BRepAdaptor_Curve.hxx> | |
43 | #include <TopOpeBRepTool_2d.hxx> | |
44 | #include <TopOpeBRepDS_Dumper.hxx> | |
45 | #include <Standard_ProgramError.hxx> | |
46 | ||
47 | #ifdef DEB | |
48 | Standard_EXPORT Standard_Boolean TopOpeBRepBuild_GetcontextNOSG(); | |
49 | #endif | |
50 | ||
51 | #define M_FORWARD(st) (st == TopAbs_FORWARD) | |
52 | #define M_REVERSED(st) (st == TopAbs_REVERSED) | |
53 | #define M_INTERNAL(st) (st == TopAbs_INTERNAL) | |
54 | #define M_EXTERNAL(st) (st == TopAbs_EXTERNAL) | |
55 | ||
1d0a9d4d | 56 | Standard_Boolean TopOpeBRepBuild_FUN_aresamegeom(const TopoDS_Shape& S1,const TopoDS_Shape& S2); |
7fd59977 | 57 | |
58 | ||
59 | //======================================================================= | |
60 | //function : GMergeEdges | |
61 | //purpose : | |
62 | //======================================================================= | |
63 | void TopOpeBRepBuild_Builder::GMergeEdges(const TopTools_ListOfShape& LE1,const TopTools_ListOfShape& LE2,const TopOpeBRepBuild_GTopo& G1) | |
64 | { | |
65 | if ( LE1.IsEmpty() ) return; | |
66 | TopAbs_State TB1,TB2; G1.StatesON(TB1,TB2); | |
67 | ||
68 | const TopoDS_Shape& E1 = LE1.First(); | |
69 | #ifdef DEB | |
70 | Standard_Integer iE; Standard_Boolean tSPS1 = GtraceSPS(E1,iE); | |
71 | if(tSPS1){ | |
72 | cout<<endl;cout<<"--- GMergeEdges "<<endl; | |
73 | GdumpEDG(E1); | |
74 | GdumpSAMDOM(LE1, (char *) "1 : "); | |
75 | GdumpSAMDOM(LE2, (char *) "2 : "); | |
76 | } | |
77 | #endif | |
78 | ||
79 | myEdgeReference = TopoDS::Edge(E1); | |
80 | TopOpeBRepBuild_PaveSet PVS(E1); | |
81 | ||
82 | GFillEdgesPVS(LE1,LE2,G1,PVS); | |
83 | ||
84 | // Create a edge builder EBU | |
85 | TopoDS_Shape E1F = LE1.First(); E1F.Orientation(TopAbs_FORWARD); | |
86 | TopOpeBRepBuild_PaveClassifier VCL(E1F); | |
87 | Standard_Boolean equalpar = PVS.HasEqualParameters(); | |
88 | if (equalpar) VCL.SetFirstParameter(PVS.EqualParameters()); | |
89 | TopOpeBRepBuild_EdgeBuilder EDBU(PVS,VCL); | |
90 | ||
91 | // Build the new edges LEM | |
92 | TopTools_ListOfShape LEM; | |
93 | GEDBUMakeEdges(E1F,EDBU,LEM); | |
94 | ||
95 | // connect new edges as edges built TB1 on LE1 edges | |
96 | TopTools_ListIteratorOfListOfShape it1; | |
97 | for (it1.Initialize(LE1); it1.More(); it1.Next()) { | |
98 | const TopoDS_Shape& E11 = it1.Value(); | |
99 | ChangeMerged(E11,TB1) = LEM; | |
100 | } | |
101 | ||
102 | // connect new edges as edges built TB2 on LE2 edges | |
103 | TopTools_ListIteratorOfListOfShape it2; | |
104 | for (it2.Initialize(LE2); it2.More(); it2.Next()) { | |
105 | const TopoDS_Shape& E2 = it2.Value(); | |
106 | ChangeMerged(E2,TB2) = LEM; | |
107 | } | |
108 | ||
109 | } // GMergeEdges | |
110 | ||
111 | //======================================================================= | |
112 | //function : GFillEdgesPVS | |
113 | //purpose : | |
114 | //======================================================================= | |
115 | void TopOpeBRepBuild_Builder::GFillEdgesPVS(const TopTools_ListOfShape& LE1,const TopTools_ListOfShape& LE2,const TopOpeBRepBuild_GTopo& G1,TopOpeBRepBuild_PaveSet& PVS) | |
116 | { | |
117 | if ( LE1.IsEmpty() ) return; | |
118 | TopAbs_State TB1,TB2; G1.StatesON(TB1,TB2); | |
119 | ||
120 | const TopoDS_Shape& E1 = LE1.First(); | |
121 | myEdgeReference = TopoDS::Edge(E1); | |
122 | ||
123 | TopTools_ListIteratorOfListOfShape it1; | |
124 | for (it1.Initialize(LE1); it1.More(); it1.Next()) { | |
125 | const TopoDS_Shape& E11 = it1.Value(); | |
126 | Standard_Boolean ismerged = IsMerged(E11,TB1); | |
127 | ||
128 | #ifdef DEB | |
129 | Standard_Integer i1; Standard_Boolean tSPS1 = GtraceSPS(E11,i1); | |
130 | if(tSPS1){ | |
131 | cout<<endl;cout<<"--- GFillEdgesPVS ";GdumpSHA(E11); | |
132 | cout<<" ismerged : "<<ismerged<<" ";TopAbs::Print(TB1,cout);cout<<endl; | |
133 | } | |
134 | #endif | |
135 | ||
136 | if (!ismerged) GFillEdgePVS(E11,LE2,G1,PVS); | |
137 | } | |
138 | ||
139 | TopOpeBRepBuild_GTopo G2 = G1.CopyPermuted(); | |
140 | ||
141 | TopTools_ListIteratorOfListOfShape it2; | |
142 | for (it2.Initialize(LE2); it2.More(); it2.Next() ) { | |
143 | const TopoDS_Shape& E2 = it2.Value(); | |
144 | Standard_Boolean ismerged = IsMerged(E2,TB2); | |
145 | ||
146 | #ifdef DEB | |
147 | Standard_Integer i2; Standard_Boolean tSPS2 = GtraceSPS(E2,i2); | |
148 | if(tSPS2){ | |
149 | cout<<endl; | |
150 | cout<<"--- GFillEdgesPVS ";GdumpSHA(E2); | |
151 | cout<<" ismerged : "<<ismerged<<" ";TopAbs::Print(TB2,cout);cout<<endl; | |
152 | } | |
153 | #endif | |
154 | ||
155 | if (!ismerged) GFillEdgePVS(E2,LE1,G2,PVS); | |
156 | } | |
157 | ||
158 | } // GFillEdgesPVS | |
159 | ||
160 | //======================================================================= | |
161 | //function : GFillEdgePVS | |
162 | //purpose : | |
163 | //======================================================================= | |
164 | void TopOpeBRepBuild_Builder::GFillEdgePVS(const TopoDS_Shape& E, | |
165 | const TopTools_ListOfShape& /*LE2*/, | |
166 | const TopOpeBRepBuild_GTopo& G, | |
167 | TopOpeBRepBuild_PaveSet& PVS) | |
168 | { | |
96a95605 | 169 | TopAbs_ShapeEnum t1,t2; |
7fd59977 | 170 | G.Type(t1,t2); |
7fd59977 | 171 | TopAbs_State TB1,TB2; |
172 | G.StatesON(TB1,TB2); | |
173 | ||
174 | // work on a FORWARD edge EF | |
175 | TopoDS_Shape EF = E; | |
176 | EF.Orientation(TopAbs_FORWARD); | |
177 | // Add the point/vertex topology build/found on edge EF in PVS | |
178 | GFillPointTopologyPVS(EF,G,PVS); | |
179 | ||
180 | } // GFillEdgePVS | |
181 | ||
182 | // --- iterer sur EPit jusqu'a la prochaine interference dont la | |
183 | // --- transition est definie sur un shape de type SHA Before et After | |
184 | static Standard_Boolean FUN_MoreSHAINT(TopOpeBRepDS_PointIterator& EPit, | |
185 | const TopAbs_ShapeEnum SHA) | |
186 | { | |
187 | Standard_Boolean more = Standard_False; | |
188 | while (EPit.More()) { | |
189 | const Handle(TopOpeBRepDS_Interference)& I = EPit.Value(); | |
190 | const TopOpeBRepDS_Transition& T = I->Transition(); | |
191 | TopOpeBRepDS_Kind GT,ST; Standard_Integer G,S; FDS_data(I,GT,G,ST,S); | |
192 | TopAbs_ShapeEnum SB,SA; Standard_Integer IB,IA; FDS_Tdata(I,SB,IB,SA,IA); | |
193 | ||
194 | TopAbs_ShapeEnum b = T.ShapeBefore(), a = T.ShapeAfter(); | |
195 | Standard_Boolean rejet = ( (b != SHA) || (a != SHA) ); | |
196 | if ( rejet ) EPit.Next(); | |
197 | else { | |
198 | more = Standard_True; | |
199 | break; | |
200 | } | |
201 | } | |
202 | return more; | |
203 | } | |
204 | ||
205 | // Unused : | |
206 | /*#ifdef DEB | |
207 | static Standard_Integer FUN_getTRASHA(const Standard_Integer geti, | |
208 | const TopOpeBRepDS_ListOfInterference& lFOR, const Standard_Integer FOR, | |
209 | const TopOpeBRepDS_ListOfInterference& lREV, const Standard_Integer REV, | |
210 | const TopOpeBRepDS_ListOfInterference& lINT, const Standard_Integer INT) | |
211 | { | |
212 | Standard_Integer trasha = 0; | |
213 | if (geti == 1) { // get i before | |
214 | if (REV) trasha = lREV.First()->Transition().Before(); | |
215 | if (INT) trasha = lINT.First()->Transition().Before(); | |
216 | } | |
217 | if (geti == 2) { // get i after | |
218 | if (FOR) trasha = lFOR.Last()->Transition().After(); | |
219 | if (INT) trasha = lINT.Last()->Transition().After(); | |
220 | } | |
221 | return trasha; | |
222 | } | |
223 | #endif*/ | |
224 | ||
225 | #ifdef DEB | |
226 | void debfillp(const Standard_Integer i) {cout <<"+ + debfillp "<<i<<endl;} | |
227 | void debfillpon(const Standard_Integer i) {cout <<"+ + debfillpon "<<i<<endl;} | |
228 | void debfillpin(const Standard_Integer i) {cout <<"+ + debfillpin "<<i<<endl;} | |
229 | void debfillpou(const Standard_Integer i) {cout <<"+ + debfillpou "<<i<<endl;} | |
230 | void debfillp2(const Standard_Integer i) {cout <<"+ + debfillp2 "<<i<<endl;} | |
231 | #endif | |
232 | ||
233 | //Standard_IMPORT extern Standard_Boolean GLOBAL_faces2d; | |
1d0a9d4d | 234 | extern Standard_Boolean GLOBAL_faces2d; |
7fd59977 | 235 | |
236 | Standard_EXPORT Standard_Boolean FDS_SIisGIofIofSBAofTofI(const TopOpeBRepDS_DataStructure& BDS,const Standard_Integer SI,const Handle(TopOpeBRepDS_Interference)& I); | |
237 | //Standard_IMPORT extern Standard_Boolean GLOBAL_IEtoMERGE; // xpu240498 | |
238 | Standard_IMPORT Standard_Boolean GLOBAL_IEtoMERGE; // xpu240498 | |
239 | //Standard_IMPORT extern Standard_Integer GLOBAL_issp; | |
1d0a9d4d | 240 | extern Standard_Integer GLOBAL_issp; |
7fd59977 | 241 | //Standard_IMPORT extern Standard_Integer GLOBAL_hassd; |
242 | Standard_IMPORT Standard_Integer GLOBAL_hassd; | |
243 | ||
244 | static Standard_Boolean FUN_isonbound(const Handle(TopOpeBRepDS_HDataStructure)& HDS, | |
245 | const Handle(TopOpeBRepDS_Interference)& I) | |
246 | { | |
247 | Standard_Integer G = I->Geometry(); | |
248 | TopOpeBRepDS_Kind KG = I->GeometryType(); | |
249 | Standard_Boolean Gb1 = (KG == TopOpeBRepDS_VERTEX); | |
250 | if (Gb1) { | |
251 | Handle(TopOpeBRepDS_EdgeVertexInterference) EVI= Handle(TopOpeBRepDS_EdgeVertexInterference)::DownCast(I); | |
252 | Standard_Boolean vhassd = HDS->HasSameDomain(HDS->DS().Shape(G)); | |
253 | Gb1 = (EVI.IsNull()) ? Standard_False : EVI->GBound(); | |
254 | Gb1 = Gb1 && !vhassd; | |
255 | } | |
256 | return Gb1; | |
257 | } | |
258 | ||
259 | #define TheIN (1) | |
260 | #define TheON (2) | |
261 | #define TheOUT (3) | |
262 | #define HASSD2d (2) | |
263 | #define HASSD3d (3) | |
264 | #define FIRST (1) | |
265 | #define LAST (2) | |
266 | ||
267 | //======================================================================= | |
268 | //function : GFillPointTopologyPVS | |
269 | //purpose : | |
270 | //======================================================================= | |
271 | void TopOpeBRepBuild_Builder::GFillPointTopologyPVS(const TopoDS_Shape& E, | |
272 | const TopOpeBRepBuild_GTopo& G, | |
273 | TopOpeBRepBuild_PaveSet& PVS) | |
274 | { | |
275 | #ifdef DEB | |
276 | // TopAbs_State TB1,TB2; | |
277 | // G.StatesON(TB1,TB2); | |
278 | // TopOpeBRepDS_Config GConf1 = G.Config1(); | |
279 | // TopOpeBRepDS_Config GConf2 = G.Config2(); | |
280 | #endif | |
281 | TopAbs_ShapeEnum t1,t2,ShapeInterf; | |
282 | G.Type(t1,t2); | |
283 | ShapeInterf = t1; | |
284 | const TopOpeBRepDS_DataStructure& BDS = myDataStructure->DS(); | |
285 | const Standard_Integer iEDS = BDS.Shape(E); | |
286 | #ifdef DEB | |
287 | // Standard_Integer rkE = BDS.AncestorRank(E); | |
288 | #endif | |
289 | Standard_Boolean isSE = BDS.IsSectionEdge(TopoDS::Edge(E)); | |
290 | Standard_Boolean dgE = BRep_Tool::Degenerated(TopoDS::Edge(E)); | |
291 | Standard_Boolean isEd; | |
292 | ||
293 | isEd = BRep_Tool::Degenerated(TopoDS::Edge(E)); | |
294 | #ifdef DEB | |
295 | // Standard_Boolean hsd = myDataStructure->HasSameDomain(E); //xpu170498 | |
296 | #endif | |
297 | Standard_Boolean isfafa = BDS.Isfafa(); //xpu120598 | |
298 | ||
299 | #ifdef DEB | |
300 | Standard_Boolean tSPSE=GtraceSPS(iEDS); | |
301 | TCollection_AsciiString striE=TopOpeBRepDS::SPrint(TopAbs_EDGE,iEDS); | |
302 | const TopoDS_Shape& EPVS=PVS.Edge();Standard_Integer iEPVS;Standard_Boolean tSPSEPVS=GtraceSPS(EPVS,iEPVS); | |
303 | Standard_Boolean tSPS = tSPSE || tSPSEPVS; | |
304 | if(tSPS){ | |
305 | cout<<endl; | |
306 | cout<<"--- GFillPointTopologyPVS : ShapeInterf ";TopAbs::Print(ShapeInterf,cout); | |
307 | cout<<",efil ";GdumpSHA(E);cout<<",eref ";GdumpSHA(myEdgeReference); | |
308 | cout<<",ffil ";GdumpSHA(myFaceToFill);cout<<",fref ";GdumpSHA(myFaceReference); | |
309 | cout<<endl; | |
310 | debfillp(iEDS); | |
311 | } | |
312 | #endif | |
313 | ||
314 | Standard_Boolean isspin=(GLOBAL_issp==TheIN), isspou=(GLOBAL_issp==TheOUT), isspon=(GLOBAL_issp==TheON); | |
315 | if (isSE && (GLOBAL_issp == 0)) return; // splits done in process ProcessSectionEdges | |
316 | ||
317 | #ifdef DEB | |
318 | // Standard_Integer iefil = BDS.Shape(E); | |
319 | // Standard_Integer iffil = BDS.Shape(myFaceToFill); | |
320 | // Standard_Integer ieref = BDS.Shape(myEdgeReference); | |
321 | // Standard_Integer ifref = BDS.Shape(myFaceReference); | |
322 | if(tSPS) { | |
323 | if (isspon) debfillpon(iEDS); | |
324 | if (isspin) debfillpin(iEDS); | |
325 | if (isspou) debfillpou(iEDS); | |
326 | } | |
327 | #endif | |
328 | ||
329 | // 0. | |
330 | //--- | |
331 | const TopOpeBRepDS_ListOfInterference& lIE = BDS.ShapeInterferences(E); | |
332 | Standard_Boolean scanall = (isspin || isspou || isspon); // xpu161198: BUC60382 //xpu011098: CTS21180(e8on); cto900I7(e12on) | |
333 | ||
334 | // loiSHAINT = interferences avec les 2 proprietes | |
335 | // - fournies par un PointIterator | |
336 | // - dont la transition est definie / shape = ShapeInterf | |
337 | TopOpeBRepDS_ListOfInterference loiSHAINT; | |
338 | if (scanall) FDS_assign(lIE,loiSHAINT); | |
339 | else { | |
340 | TopOpeBRepDS_PointIterator EPit(lIE); | |
341 | EPit.Init(BDS.ShapeInterferences(E)); | |
342 | Standard_Boolean addi = FUN_MoreSHAINT(EPit,ShapeInterf); | |
343 | while (addi) { | |
344 | const Handle(TopOpeBRepDS_Interference)& II = EPit.Value(); | |
345 | loiSHAINT.Append(II); | |
346 | EPit.Next(); | |
347 | addi = FUN_MoreSHAINT(EPit,ShapeInterf); | |
348 | } | |
349 | } | |
350 | ||
351 | TopOpeBRepDS_TKI tki; | |
352 | tki.FillOnGeometry(loiSHAINT); // groupage par geometrie d'interference | |
353 | ||
354 | // - kp1 - | |
355 | // BUC60093 : only 2 G : 1 point && 1 vertex | |
356 | // deleting interfs on G = vertex sdm && closingE | |
357 | TopoDS_Vertex vclo; Standard_Boolean closedE = TopOpeBRepTool_TOOL::ClosedE(TopoDS::Edge(E),vclo); | |
96a95605 | 358 | Standard_Integer kp1 = 0; |
7fd59977 | 359 | if (closedE) { |
360 | tki.Init(); | |
361 | Standard_Integer nG = 0; | |
362 | while (tki.More()) { | |
363 | nG++; | |
364 | TopOpeBRepDS_Kind Kcur;Standard_Integer Gcur; | |
365 | tki.Value(Kcur,Gcur); | |
366 | if (Kcur == TopOpeBRepDS_POINT) {tki.Next();continue;} | |
367 | const TopoDS_Shape& v = BDS.Shape(Gcur); | |
368 | TopoDS_Shape oov; | |
369 | FUN_ds_getoov(v,myDataStructure,oov); | |
370 | Standard_Boolean samev = v.IsSame(vclo), sameoov = oov.IsSame(vclo); | |
96a95605 | 371 | if (samev || sameoov) {kp1 = Gcur;} |
7fd59977 | 372 | tki.Next(); |
373 | } | |
374 | if (nG == 1) kp1 = 0; // we have only one interf on vGclo -> keep the interf | |
375 | } //kp1 | |
376 | ||
377 | // - kp6 - nyiReducing | |
378 | // xpu250998 : cto900M5 (e5,p1) | |
379 | // prequesitory : if we have I3d on Gb0 FORWARD or REVERSED, we do NOT need | |
380 | // interference on Gb1 to determinate split IN/OUT of edge. | |
381 | Standard_Boolean kp6 = (!isSE); | |
382 | if (kp6) { | |
383 | kp6 = Standard_False; | |
384 | TopOpeBRepDS_ListIteratorOfListOfInterference it(loiSHAINT); | |
385 | for (; it.More(); it.Next()){ | |
386 | const Handle(TopOpeBRepDS_Interference)& I = it.Value(); | |
387 | TopOpeBRepDS_Kind ST = I->SupportType(); | |
388 | if (ST != TopOpeBRepDS_FACE) continue; | |
389 | TopAbs_Orientation O = I->Transition().Orientation(TopAbs_IN); | |
390 | Standard_Boolean FORREV = (O == TopAbs_FORWARD) || (O == TopAbs_REVERSED); | |
391 | if (!FORREV) continue; | |
392 | Standard_Boolean Gb1 = ::FUN_isonbound(myDataStructure,I); | |
393 | if (!Gb1) {kp6 = Standard_True; break;} | |
394 | } // it(l3dFOR+l3dREV) | |
395 | } | |
396 | ||
397 | // 1. | |
398 | //--- | |
399 | tki.Init(); | |
400 | while (tki.More()) { | |
401 | ||
402 | // lieu courant : Kcur,Gcur; Interferences : LICur | |
403 | TopOpeBRepDS_Kind Kcur; | |
404 | Standard_Integer Gcur; | |
405 | const TopOpeBRepDS_ListOfInterference& LICur = tki.Value(Kcur,Gcur); | |
406 | Standard_Boolean point = (Kcur == TopOpeBRepDS_POINT); //xpu170498 | |
407 | Standard_Boolean vertex = (Kcur == TopOpeBRepDS_VERTEX);//xpu170498 | |
408 | #ifdef DEB | |
409 | // Standard_Integer nLICur = LICur.Extent(); | |
410 | Standard_Boolean trcI = Standard_False; | |
411 | if(trcI) {TopOpeBRepDS_Dumper DSD(myDataStructure); TCollection_AsciiString aa("lI"); | |
412 | aa += TCollection_AsciiString(Gcur); DSD.DumpLOI(LICur,cout,aa);} | |
413 | #endif | |
414 | ||
96a95605 DB |
415 | TopoDS_Shape vGsd; |
416 | if (vertex) FUN_ds_getoov(BDS.Shape(Gcur), myDataStructure, vGsd); //xpu221098 | |
7fd59977 | 417 | |
418 | // recall : I3d=(I3dF,I3dFE) : I3dF=(T(F),G,F), I3dFE=(T(F),G,E) | |
419 | // I2d=I2dFE | |
420 | // I1d=(T(E),V,E) | |
421 | ||
422 | if ((Kcur == TopOpeBRepDS_VERTEX) && (kp1 == Gcur)) {tki.Next();continue;} | |
423 | const Handle(TopOpeBRepDS_Interference)& I = LICur.First(); | |
424 | Standard_Real parSE = FDS_Parameter(I); | |
425 | TopOpeBRepDS_ListOfInterference LICurcopy; | |
426 | TopOpeBRepDS_ListOfInterference l3dFcur; FDS_assign(LICur,LICurcopy); Standard_Integer n3d=FUN_selectSKinterference(LICurcopy,TopOpeBRepDS_FACE,l3dFcur); | |
427 | TopOpeBRepDS_ListOfInterference l2dFEcur; FDS_assign(LICur,LICurcopy); Standard_Integer n2d=FUN_ds_hasI2d(iEDS,LICurcopy,l2dFEcur); | |
428 | TopOpeBRepDS_ListOfInterference l1dEcur; FDS_assign(LICur,LICurcopy); | |
429 | FUN_selectTRASHAinterference(LICurcopy,TopAbs_EDGE,l1dEcur); | |
430 | ||
431 | TopAbs_State stb; Standard_Integer isb; Standard_Integer bdim; | |
432 | TopAbs_State sta; Standard_Integer isa; Standard_Integer adim; | |
433 | FUN_ds_GetTr(BDS,iEDS,Gcur,LICur, | |
434 | stb,isb,bdim, | |
435 | sta,isa,adim); | |
436 | if (isSE) { | |
437 | // before | |
438 | Standard_Boolean bIN1d = (stb==TopAbs_IN)&&(bdim==1); | |
439 | Standard_Boolean bIN2d = (stb==TopAbs_IN)&&(bdim==2); | |
440 | Standard_Boolean bIN3d = (stb==TopAbs_IN)&&(bdim==3); | |
441 | ||
442 | Standard_Boolean bOUT2d = (stb==TopAbs_OUT)&&(bdim==2); | |
443 | Standard_Boolean bOUT3d = (stb==TopAbs_OUT)&&(bdim==3); | |
444 | // after | |
445 | Standard_Boolean aIN1d = (sta==TopAbs_IN)&&(adim==1); | |
446 | Standard_Boolean aIN2d = (sta==TopAbs_IN)&&(adim==2); | |
447 | Standard_Boolean aIN3d = (sta==TopAbs_IN)&&(adim==3); | |
448 | ||
449 | Standard_Boolean aOUT2d = (sta==TopAbs_OUT)&&(adim==2); | |
450 | Standard_Boolean aOUT3d = (sta==TopAbs_OUT)&&(adim==3); | |
451 | ||
452 | TopOpeBRepDS_Transition newT; Standard_Boolean INb=Standard_False,INa=Standard_False; | |
453 | if (isfafa) { | |
454 | if (isspon) { | |
455 | if ((stb == TopAbs_OUT)&&(sta == TopAbs_OUT)) {tki.Next(); continue;} | |
456 | INb = bIN1d; | |
457 | INa = aIN1d; | |
458 | newT.Index(isb); newT.ShapeBefore(TopAbs_EDGE); newT.ShapeAfter(TopAbs_EDGE); | |
459 | } else if (isspin) { | |
460 | INb = bIN2d; | |
461 | INa = aIN2d; | |
462 | newT.ShapeBefore(TopAbs_FACE); newT.ShapeAfter(TopAbs_FACE); | |
463 | } else if (isspou) { | |
464 | INb = !bOUT2d; | |
465 | INa = !aOUT2d; | |
466 | newT.ShapeBefore(TopAbs_FACE); newT.ShapeAfter(TopAbs_FACE); | |
467 | } | |
468 | } | |
469 | else { | |
470 | if (isspon) { | |
471 | if ((stb == TopAbs_OUT)&&(sta == TopAbs_OUT)) {tki.Next(); continue;} | |
472 | INb = bIN1d || bIN2d; | |
473 | INa = aIN1d || aIN2d; | |
474 | newT.Index(isb); newT.ShapeBefore(TopAbs_EDGE); newT.ShapeAfter(TopAbs_EDGE); | |
475 | } else if (isspin) { | |
476 | if ((stb == TopAbs_OUT)&&(sta == TopAbs_OUT)) {tki.Next(); continue;} | |
477 | INb = bIN3d; | |
478 | INa = aIN3d; | |
479 | if (INb) newT.Index(isb); | |
480 | else newT.Index(isa); | |
481 | newT.ShapeBefore(TopAbs_FACE); newT.ShapeAfter(TopAbs_FACE); | |
482 | } else if (isspou) { | |
483 | if ((stb == TopAbs_IN)&&(sta == TopAbs_IN)) {tki.Next(); continue;} | |
484 | INb = !bOUT3d; | |
485 | INa = !aOUT3d; | |
486 | if (bOUT3d) newT.Index(isb); | |
487 | else newT.Index(isa); | |
488 | newT.ShapeBefore(TopAbs_FACE); newT.ShapeAfter(TopAbs_FACE); | |
489 | } | |
490 | } | |
491 | TopAbs_State sb = INb ? TopAbs_IN : TopAbs_OUT; | |
492 | TopAbs_State sa = INa ? TopAbs_IN : TopAbs_OUT; | |
493 | newT.StateBefore(sb);newT.StateAfter(sa); | |
494 | Standard_Integer S=0; // dummy | |
495 | Standard_Boolean B = (Kcur == TopOpeBRepDS_POINT) ? Standard_False : (Handle(TopOpeBRepDS_EdgeVertexInterference)::DownCast(I)->GBound()); | |
496 | Handle(TopOpeBRepDS_Interference) newI = MakeEPVInterference(newT,S,Gcur,parSE,Kcur,B); | |
497 | ||
498 | TopOpeBRepDS_ListOfInterference li; li.Append(newI); TopOpeBRepDS_PointIterator itCur(li); | |
499 | GFillPointTopologyPVS(E,itCur,G,PVS); | |
500 | #ifdef DEB | |
501 | if(tSPS) {newI->Dump(cout,"\nnewinterf ","\n\n"); debfillp2(iEDS);} | |
502 | #endif | |
503 | {tki.Next(); continue;} | |
504 | } // isSE | |
505 | ||
506 | // - kp3 - | |
507 | // xpu200598 interference 2d at GPOINT | |
508 | Standard_Boolean kp3 = (n2d > 0) && point; | |
96a95605 | 509 | if (kp3) l2dFEcur.First()->Transition().Orientation(TopAbs_IN); |
7fd59977 | 510 | |
511 | ||
512 | TopOpeBRepDS_PointIterator itCur(LICur); Standard_Integer iICur=0; | |
513 | while ( itCur.More() ) { | |
514 | iICur++; | |
515 | const Handle(TopOpeBRepDS_Interference)& I1=itCur.Value(); | |
516 | const TopOpeBRepDS_Transition& T1=I1->Transition(); | |
517 | T1.Orientation(TopAbs_IN); | |
518 | TopAbs_ShapeEnum SB1,SA1;Standard_Integer IB1,IA1;TopOpeBRepDS_Kind GT1,ST1;Standard_Integer G1,S1; | |
519 | FDS_Idata(I1,SB1,IB1,SA1,IA1,GT1,G1,ST1,S1); | |
520 | ||
521 | #ifdef DEB | |
522 | if(tSPS) {I1->Dump(cout,"\n? keepinterf ","\n\n"); debfillp2(iEDS);} | |
523 | #endif | |
524 | ||
525 | Standard_Boolean keepinterf1 = Standard_False; | |
526 | if (isEd) { | |
527 | keepinterf1 = Standard_True; | |
528 | } | |
529 | else { | |
530 | if (GLOBAL_faces2d) { // split 2d | |
531 | Standard_Boolean has2d3d = (n2d >0 && n3d >0); // JYL300998 | |
532 | // JYL300998 : traitement correct de cto 100 K1 e27 (chanceux auparavant, schema d'I faux) | |
533 | // e27 n'est PAS arete de section mais doit etre traitee comme telle. | |
534 | // e27 possede des I de nature 2d et 3d en V8 | |
535 | // on privilegie l'info 3d | |
536 | if (has2d3d && !isSE) { | |
537 | #ifdef DEB | |
538 | const Handle(TopOpeBRepDS_Interference)& i2d = | |
539 | #endif | |
540 | l2dFEcur.First(); | |
541 | const Handle(TopOpeBRepDS_Interference)& i3d = l3dFcur.First(); | |
542 | Standard_Boolean id3d = (I1 == i3d); | |
543 | #ifdef DEB | |
544 | Standard_Boolean id2d = (I1 == i2d); | |
545 | #endif | |
546 | keepinterf1 = id3d; | |
547 | #ifdef DEB | |
548 | if (tSPS) { | |
549 | cout<<"DEB : GFillPointTopologyPVS E"<<iEDS<<" has2d3d"<<endl; | |
550 | i2d->Dump(cout,"2d : ","\n"); | |
551 | i3d->Dump(cout,"3d : ","\n"); | |
552 | I1->Dump (cout,"I1 : ","\n"); | |
553 | if (id3d) cout<<"--> Interference 3d "; | |
554 | if (id2d) cout<<"--> Interference 2d "; | |
555 | if (keepinterf1) cout<<" traitee"<<endl; | |
556 | else cout<<" non traitee"<<endl; | |
557 | cout<<endl; | |
558 | } | |
559 | #endif | |
560 | } | |
561 | else { | |
562 | keepinterf1 = Standard_True; // PRO13075 tspIN(e17) | |
563 | } | |
564 | } // split 2d | |
565 | else { // split 3d | |
566 | keepinterf1 = (ST1 == TopOpeBRepDS_FACE); // (iICur == 1); | |
567 | } | |
568 | } | |
569 | if ( keepinterf1 ) { | |
570 | if (kp6) { | |
571 | Standard_Boolean Gb1 = ::FUN_isonbound(myDataStructure,I1); | |
572 | if (!Gb1) GFillPointTopologyPVS(E,itCur,G,PVS); | |
573 | } | |
574 | else { | |
575 | GFillPointTopologyPVS(E,itCur,G,PVS); | |
576 | } | |
577 | if (!dgE) break; // xpu140498 | |
578 | } // keepinterf1 | |
579 | itCur.Next(); | |
580 | } // itCur.More | |
581 | ||
582 | tki.Next(); | |
583 | } // tki.More() | |
584 | } | |
585 | ||
586 | //======================================================================= | |
587 | //function : GFillPointTopologyPVS | |
588 | //purpose : | |
589 | //======================================================================= | |
590 | void TopOpeBRepBuild_Builder::GFillPointTopologyPVS(const TopoDS_Shape& E, | |
591 | const TopOpeBRepDS_PointIterator& EPit, | |
592 | const TopOpeBRepBuild_GTopo& G1, | |
593 | TopOpeBRepBuild_PaveSet& PVS) const | |
594 | { | |
595 | const TopoDS_Shape& EPVS = PVS.Edge(); | |
596 | ||
597 | //modified by NIZHNY-MZV Mon Feb 21 14:47:34 2000 | |
598 | const Handle(TopOpeBRepDS_Interference)& I1=EPit.Value(); | |
599 | TopOpeBRepDS_Kind ST1 = I1->SupportType(); | |
600 | ||
601 | #ifdef DEB | |
602 | Standard_Integer iE; Standard_Boolean tSPSE = GtraceSPS(E,iE); | |
603 | Standard_Integer iEPVS; Standard_Boolean tSPSEPVS = GtraceSPS(EPVS,iEPVS); | |
604 | Standard_Boolean tSPS = tSPSE || tSPSEPVS; | |
605 | if ( tSPS ) debfillp(iE); | |
606 | #endif | |
607 | ||
608 | TopAbs_State TB1,TB2; | |
609 | G1.StatesON(TB1,TB2); | |
610 | TopOpeBRepDS_Config Conf = G1.Config1(); | |
611 | TopAbs_State TB = TB1; | |
612 | ||
613 | // iG = index of new point or existing vertex | |
614 | Standard_Integer iG = EPit.Current(); | |
615 | Standard_Boolean ispoint = EPit.IsPoint(); | |
616 | TopoDS_Vertex VIG; // NYI pointer | |
617 | if (ispoint) VIG = TopoDS::Vertex(NewVertex(iG)); | |
618 | else VIG = TopoDS::Vertex(myDataStructure->Shape(iG)); | |
619 | ||
620 | if (VIG.IsNull()) return; //PMN 17/02/99 Nothing to add. | |
621 | ||
622 | Standard_Boolean hasVSD = Standard_False; | |
623 | Standard_Integer iVRE = 0; TopoDS_Shape VRE; // NYI pointer | |
624 | if (!ispoint) { | |
625 | hasVSD = myDataStructure->HasSameDomain(VIG); | |
626 | if (hasVSD) { // on prend VRE = vertex reference de VIG | |
627 | iVRE = myDataStructure->SameDomainReference(VIG); | |
628 | VRE = TopoDS::Vertex(myDataStructure->Shape(iVRE)); | |
629 | } | |
630 | } | |
631 | ||
632 | TopoDS_Vertex VPV; // NYI pointer on VRE or VIG | |
633 | if (hasVSD) VPV = TopoDS::Vertex(VRE); | |
634 | else VPV = VIG; | |
635 | // else VPV = TopoDS::Vertex(VIG); | |
636 | ||
637 | Standard_Real par = EPit.Parameter(); | |
638 | TopAbs_Orientation ori = EPit.Orientation(TB); | |
639 | ||
640 | #ifdef DEB | |
641 | if ( tSPS ) debfillp(iE); | |
642 | #endif | |
643 | ||
644 | Standard_Boolean samegeom = ::TopOpeBRepBuild_FUN_aresamegeom(E,EPVS); | |
645 | if (Conf == TopOpeBRepDS_DIFFORIENTED) ori = TopAbs::Complement(ori); | |
646 | #ifdef DEB | |
647 | if (!TopOpeBRepBuild_GetcontextNOSG()) { | |
648 | #endif | |
649 | if (!samegeom) ori = TopAbs::Complement(ori); | |
650 | #ifdef DEB | |
651 | } | |
652 | #endif | |
653 | ||
654 | ||
655 | Standard_Boolean lesmemes = E.IsEqual(myEdgeReference); | |
656 | if ( !lesmemes ) { | |
657 | Standard_Real parref = par; | |
658 | const TopoDS_Edge& EE = TopoDS::Edge(E); | |
659 | GParamOnReference(VPV,EE,parref); | |
660 | #ifdef DEB | |
661 | if(tSPS){ | |
662 | cout<<"par "<<par<<" / ";GdumpSHA(E);cout<<" --> parref "<<parref<<" / ";GdumpSHA(EPVS); | |
663 | cout<<endl; | |
664 | } | |
665 | #endif | |
666 | par = parref; | |
667 | } | |
668 | ||
669 | Standard_Boolean kpbound = Standard_False; | |
670 | { | |
671 | TopoDS_Vertex vclo; Standard_Boolean Eclosed = TopOpeBRepTool_TOOL::ClosedE(myEdgeReference,vclo); | |
672 | #ifdef DEB | |
673 | // Standard_Integer ivclo = myDataStructure->Shape(vclo); | |
674 | #endif | |
675 | TopAbs_Orientation oriI = EPit.Orientation(TopAbs_IN); | |
676 | // kpbound = lesmemes && Eclosed && hasVSD && (ori == TopAbs_INTERNAL) && (TB == TopAbs_OUT); -xpu140898 | |
677 | // xpu110398 cto 009 L2 : e6ou en v11 | |
678 | // xpu140898 USA60111 : e9ou (!=0) + e7ou(=0) | |
679 | Standard_Boolean INTEXT = (oriI == TopAbs_INTERNAL) && (TB == TopAbs_IN); | |
0ebaa4db | 680 | INTEXT = INTEXT || ((oriI == TopAbs_EXTERNAL) && (TB == TopAbs_OUT)); |
7fd59977 | 681 | kpbound = lesmemes && Eclosed && INTEXT; |
682 | if ( kpbound ) { | |
683 | kpbound = vclo.IsSame(VIG); | |
684 | if (!kpbound) { | |
685 | TopoDS_Shape VSD; Standard_Boolean ok = FUN_ds_getoov(VIG,myDataStructure->DS(),VSD); | |
686 | if (ok) kpbound = vclo.IsSame(VSD); | |
687 | } | |
688 | } | |
689 | } | |
690 | ||
691 | if (!kpbound) { | |
692 | VPV.Orientation(ori); | |
693 | Standard_Boolean vofe = Standard_False; | |
694 | Handle(TopOpeBRepBuild_Pave) PV = new TopOpeBRepBuild_Pave(VPV,par,vofe); | |
695 | if (hasVSD) { | |
696 | PV->HasSameDomain(Standard_True); | |
697 | const TopoDS_Shape& VSD = myDataStructure->SameDomain(VPV).Value(); | |
698 | Standard_Integer iVSD = myDataStructure->Shape(VSD); | |
699 | if (iVSD == iVRE) PV->SameDomain(VIG); | |
700 | else PV->SameDomain(VSD); | |
701 | } | |
702 | //modified by NIZHNY-MZV Mon Feb 21 14:48:37 2000 | |
703 | PV -> InterferenceType() = ST1; | |
704 | PVS.Append(PV); | |
705 | ||
706 | ||
707 | #ifdef DEB | |
708 | gp_Pnt P = BRep_Tool::Pnt(VPV); | |
709 | if(tSPS){cout<<"+";if(ispoint)cout<<" PDS ";else cout<<" VDS ";} | |
710 | if(tSPS){cout<<iG<<" : ";GdumpORIPARPNT(ori,par,P);cout<<endl;} | |
711 | if(tSPS) { | |
712 | // Standard_Boolean trc = Standard_False; | |
713 | #ifdef DRAW | |
714 | if (trc) { | |
715 | FUN_draw2d(par,TopoDS::Edge(E),myEdgeReference,myFaceReference); | |
716 | FUN_draw(VPV); FUN_draw(E); FUN_draw(myFaceReference); | |
717 | } | |
718 | #endif | |
719 | } | |
720 | #endif | |
721 | } | |
722 | else { | |
723 | Standard_Real parf,parl; FUN_tool_bounds(myEdgeReference,parf,parl); | |
724 | TopAbs_Orientation ovpv; | |
725 | ovpv = TopAbs_FORWARD; | |
726 | VPV.Orientation(ovpv); | |
727 | Standard_Boolean vfofe = Standard_False; | |
728 | Handle(TopOpeBRepBuild_Pave) PVF = new TopOpeBRepBuild_Pave(VPV,parf,vfofe); | |
729 | if (hasVSD) { | |
730 | PVF->HasSameDomain(Standard_True); | |
731 | const TopoDS_Shape& VSD = myDataStructure->SameDomain(VPV).Value(); | |
732 | Standard_Integer iVSD = myDataStructure->Shape(VSD); | |
733 | if (iVSD == iVRE) PVF->SameDomain(VIG); | |
734 | else PVF->SameDomain(VSD); | |
735 | } | |
736 | //modified by NIZHNY-MZV Mon Feb 21 14:48:37 2000 | |
737 | PVF -> InterferenceType() = ST1; | |
738 | PVS.Append(PVF); | |
739 | ||
740 | #ifdef DEB | |
741 | gp_Pnt PF = BRep_Tool::Pnt(VPV); | |
742 | if(tSPS){cout<<"+";if(ispoint)cout<<" PDS ";else cout<<" VDS ";} | |
743 | if(tSPS){cout<<iG<<" : ";GdumpORIPARPNT(ovpv,parf,PF);cout<<endl;} | |
744 | #endif | |
745 | ||
746 | ovpv = TopAbs_REVERSED; | |
747 | VPV.Orientation(ovpv); | |
748 | Standard_Boolean vrofe = Standard_False; | |
749 | Handle(TopOpeBRepBuild_Pave) PVR = new TopOpeBRepBuild_Pave(VPV,parl,vrofe); | |
750 | if (hasVSD) { | |
751 | PVR->HasSameDomain(Standard_True); | |
752 | const TopoDS_Shape& VSD = myDataStructure->SameDomain(VPV).Value(); | |
753 | Standard_Integer iVSD = myDataStructure->Shape(VSD); | |
754 | if (iVSD == iVRE) PVR->SameDomain(VIG); | |
755 | else PVR->SameDomain(VSD); | |
756 | } | |
757 | //modified by NIZHNY-MZV Mon Feb 21 14:48:37 2000 | |
758 | PVR -> InterferenceType() = ST1; | |
759 | PVS.Append(PVR); | |
760 | #ifdef DEB | |
761 | gp_Pnt PR = BRep_Tool::Pnt(VPV); | |
762 | if(tSPS){cout<<"+";if(ispoint)cout<<" PDS ";else cout<<" VDS ";} | |
763 | if(tSPS){cout<<iG<<" : ";GdumpORIPARPNT(ovpv,parl,PR);cout<<endl;} | |
764 | #endif | |
765 | ||
766 | PVS.RemovePV(Standard_False); // jyl + 980217 | |
767 | } | |
768 | ||
769 | } | |
770 | ||
771 | ||
772 | //======================================================================= | |
773 | //function : GParamOnReference | |
774 | //purpose : calcul du parametre de V sur myEdgeReference de myFaceReference | |
775 | // V est sur la surface de myFaceReference, | |
776 | // V est un vertex de E | |
777 | // E est une arete samedomain de myEdgeReference | |
778 | // retourne true si ok | |
779 | //======================================================================= | |
780 | Standard_Boolean TopOpeBRepBuild_Builder::GParamOnReference(const TopoDS_Vertex& V, | |
781 | const TopoDS_Edge& /*E*/, | |
782 | Standard_Real& P) const | |
783 | { | |
784 | Handle(Geom_Surface) su = BRep_Tool::Surface(myFaceReference); | |
785 | Handle(Geom_Plane) suplan = Handle(Geom_Plane)::DownCast(su); | |
786 | if ( suplan.IsNull() ) { | |
63c629aa | 787 | #ifdef TOPOPEBREPBUILD_DEB |
7fd59977 | 788 | cout<<"NYI : GParamOnReference : not planar"<<endl; |
789 | #endif | |
790 | return Standard_False; | |
791 | } | |
792 | ||
793 | gp_Pln pln = suplan->Pln(); gp_Pnt p3 = BRep_Tool::Pnt(V); | |
794 | Standard_Real u,v; ElSLib::Parameters(pln,p3,u,v); gp_Pnt2d p2(u,v); | |
795 | Standard_Real f,l,tolpc; Handle(Geom2d_Curve) C2D; | |
796 | C2D = FC2D_CurveOnSurface(myEdgeReference,myFaceReference,f,l,tolpc); | |
797 | if (C2D.IsNull()) Standard_ProgramError::Raise("TopOpeBRepBuild_Builder::GParamOnReference"); | |
798 | ||
799 | // Standard_Real U; | |
800 | Geom2dAdaptor_Curve AC(C2D); | |
801 | switch ( AC.GetType() ) { | |
802 | case GeomAbs_Line: | |
803 | P = ElCLib::Parameter(AC.Line(),p2); break; | |
804 | case GeomAbs_Circle: | |
805 | P = ElCLib::Parameter(AC.Circle(),p2); break; | |
806 | case GeomAbs_Ellipse: | |
807 | P = ElCLib::Parameter(AC.Ellipse(),p2); break; | |
808 | case GeomAbs_Hyperbola: | |
809 | P = ElCLib::Parameter(AC.Hyperbola(),p2); break; | |
810 | case GeomAbs_Parabola: | |
811 | P = ElCLib::Parameter(AC.Parabola(),p2); break; | |
812 | default : | |
63c629aa | 813 | #ifdef TOPOPEBREPBUILD_DEB |
7fd59977 | 814 | cout<<"NYI : GParamOnReference : OtherCurve on planar surface"<<endl; |
815 | #endif | |
816 | return Standard_False; | |
817 | } | |
818 | ||
819 | return Standard_True; | |
820 | } |