b311480e |
1 | // Created on: 2001-11-02 |
2 | // Created by: Peter KURNEV |
3 | // Copyright (c) 2001-2012 OPEN CASCADE SAS |
4 | // |
5 | // The content of this file is subject to the Open CASCADE Technology Public |
6 | // License Version 6.5 (the "License"). You may not use the content of this file |
7 | // except in compliance with the License. Please obtain a copy of the License |
8 | // at http://www.opencascade.org and read it completely before using this file. |
9 | // |
10 | // The Initial Developer of the Original Code is Open CASCADE S.A.S., having its |
11 | // main offices at: 1, place des Freres Montgolfier, 78280 Guyancourt, France. |
12 | // |
13 | // The Original Code and all software distributed under the License is |
14 | // distributed on an "AS IS" basis, without warranty of any kind, and the |
15 | // Initial Developer hereby disclaims all such warranties, including without |
16 | // limitation, any warranties of merchantability, fitness for a particular |
17 | // purpose or non-infringement. Please see the License for the specific terms |
18 | // and conditions governing the rights and limitations under the License. |
19 | |
7fd59977 |
20 | |
21 | #include <BOP_ShellSolid.ixx> |
22 | |
23 | #include <TColStd_ListOfInteger.hxx> |
24 | #include <TColStd_ListIteratorOfListOfInteger.hxx> |
25 | |
26 | #include <TopAbs_State.hxx> |
27 | #include <TopAbs_Orientation.hxx> |
28 | |
29 | #include <TopExp_Explorer.hxx> |
30 | #include <TopTools_IndexedMapOfShape.hxx> |
31 | #include <BRep_Tool.hxx> |
32 | #include <TopoDS_Shape.hxx> |
33 | #include <TopoDS_Edge.hxx> |
34 | #include <TopoDS_Face.hxx> |
35 | #include <TopoDS.hxx> |
36 | |
37 | #include <BooleanOperations_ShapesDataStructure.hxx> |
38 | #include <BooleanOperations_IndexedDataMapOfShapeInteger.hxx> |
39 | |
40 | #include <IntTools_Context.hxx> |
41 | |
42 | #include <BOPTools_InterferencePool.hxx> |
43 | #include <BOPTools_CArray1OfSSInterference.hxx> |
44 | #include <BOPTools_SSInterference.hxx> |
45 | #include <BOPTools_SequenceOfCurves.hxx> |
46 | #include <BOPTools_Curve.hxx> |
47 | #include <BOPTools_ListOfPaveBlock.hxx> |
48 | #include <BOPTools_ListIteratorOfListOfPaveBlock.hxx> |
49 | #include <BOPTools_PaveBlock.hxx> |
50 | |
51 | #include <BOPTools_Tools3D.hxx> |
52 | #include <BOPTools_PaveFiller.hxx> |
53 | #include <BOPTools_CommonBlockPool.hxx> |
54 | #include <BOPTools_InterferencePool.hxx> |
55 | #include <BOPTools_CArray1OfSSInterference.hxx> |
56 | |
57 | #include <BOPTools_SSInterference.hxx> |
58 | #include <BOPTools_ListOfCommonBlock.hxx> |
59 | #include <BOPTools_ListIteratorOfListOfCommonBlock.hxx> |
60 | #include <BOPTools_CommonBlock.hxx> |
61 | |
62 | #include <BOP_BuilderTools.hxx> |
63 | #include <BOP_SDFWESFiller.hxx> |
64 | |
65 | |
66 | static |
67 | void AddPartsEF (const TopoDS_Edge& aSSin, |
68 | const TopoDS_Edge& aEF2, |
69 | const TopoDS_Face& aF2, |
70 | const TopoDS_Face& myFace, |
71 | const Standard_Integer iRankF1, |
72 | const BOP_Operation myOperation, |
73 | const TopTools_IndexedDataMapOfShapeListOfShape& aMEF, |
74 | BOP_WireEdgeSet& aWES); |
75 | static |
76 | void AddPartEF1INF2 (TopoDS_Edge& aSS, |
77 | const TopoDS_Face& myFace, |
78 | const TopoDS_Face& aF2, |
79 | const Standard_Integer iRankF1, |
80 | const BOP_Operation myOperation, |
81 | BOP_WireEdgeSet& aWES); |
82 | static |
83 | void BothInternals (TopoDS_Edge& aSS, |
84 | const TopoDS_Face& myFace, |
85 | const TopoDS_Face& aF2, |
86 | const Standard_Integer iRankF1, |
87 | const BOP_Operation myOperation, |
88 | BOP_WireEdgeSet& aWES); |
89 | static |
90 | void FirstInternal(TopoDS_Edge& aSS, |
91 | const TopoDS_Face& myFace, |
92 | const TopoDS_Face& aF2, |
93 | const TopoDS_Edge& anEF2, |
94 | TopoDS_Edge& aSSx, |
95 | const Standard_Integer iRankF1, |
96 | const BOP_Operation myOperation, |
97 | const TopTools_IndexedDataMapOfShapeListOfShape& aMEF, |
98 | BOP_WireEdgeSet& aWES, |
4f189102 |
99 | const Handle(IntTools_Context)& aContext); |
7fd59977 |
100 | |
101 | static |
102 | void SecondInternal(TopoDS_Edge& aSS, |
103 | const TopoDS_Face& aF1, |
104 | const TopoDS_Face& aF2, |
105 | const TopoDS_Edge& anEF1, |
106 | TopoDS_Edge& aSSx, |
107 | const TopAbs_Orientation anOrEF1, |
108 | const Standard_Integer iRankF1, |
109 | const BOP_Operation myOperation, |
110 | BOP_WireEdgeSet& aWES, |
4f189102 |
111 | const Handle(IntTools_Context)& aContext); |
7fd59977 |
112 | |
113 | |
114 | //======================================================================= |
115 | // |
116 | // the WES components for a solid |
117 | // |
118 | //======================================================================= |
119 | // function: AddSectionPartsSo |
120 | // purpose: |
121 | //======================================================================= |
122 | void BOP_ShellSolid::AddSectionPartsSo (const Standard_Integer nF1, |
123 | const Standard_Integer iFF, |
124 | BOP_WireEdgeSet& aWES) |
125 | { |
126 | const BooleanOperations_ShapesDataStructure& aDS=myDSFiller->DS(); |
127 | |
128 | BOPTools_InterferencePool* pIntrPool= |
129 | (BOPTools_InterferencePool*)&myDSFiller->InterfPool(); |
130 | |
131 | BOPTools_CArray1OfSSInterference& aFFs=pIntrPool->SSInterferences(); |
132 | // |
133 | Standard_Integer i, aNbCurves, nF2, nE, iRankF1; |
134 | Standard_Boolean bIsTouchCase; |
135 | // |
136 | iRankF1=aDS.Rank(nF1); |
137 | // |
138 | BOPTools_SSInterference& aFF=aFFs(iFF); |
139 | nF2=aFF.OppositeIndex(nF1); |
140 | // |
141 | const TopoDS_Face& aF2=TopoDS::Face(aDS.Shape(nF2)); |
142 | // |
143 | BOPTools_SequenceOfCurves& aSC=aFF.Curves(); |
144 | aNbCurves=aSC.Length(); |
145 | for (i=1; i<=aNbCurves; i++) { |
146 | const BOPTools_Curve& aBC=aSC(i); |
147 | const BOPTools_ListOfPaveBlock& aLPB=aBC.NewPaveBlocks(); |
148 | BOPTools_ListIteratorOfListOfPaveBlock anIt(aLPB); |
149 | for (; anIt.More(); anIt.Next()) { |
150 | const BOPTools_PaveBlock& aPB=anIt.Value(); |
151 | nE=aPB.Edge(); |
152 | const TopoDS_Edge& aE=TopoDS::Edge(aDS.Shape(nE)); |
153 | |
154 | TopoDS_Edge aES=aE; |
155 | bIsTouchCase=BOPTools_Tools3D::IsTouchCase(aES, myFace, aF2); |
156 | if (bIsTouchCase) { |
157 | aWES.AddStartElement (aES); |
158 | aES.Reverse(); |
159 | aWES.AddStartElement (aES); |
160 | } |
161 | else { |
162 | BOP_BuilderTools::OrientSectionEdgeOnF1 |
163 | (myFace, aF2, iRankF1, myOperation, aES); |
164 | aWES.AddStartElement (aES); |
165 | } |
166 | } |
167 | } |
168 | } |
169 | //======================================================================= |
170 | // function: AddSplitPartsON3DSo |
171 | // purpose: |
172 | //======================================================================= |
173 | void BOP_ShellSolid::AddSplitPartsON3DSo(const Standard_Integer nF1, |
174 | const Standard_Integer iFF, |
175 | BOP_WireEdgeSet& aWES) |
176 | { |
177 | const BooleanOperations_ShapesDataStructure& aDS=myDSFiller->DS(); |
178 | const BOPTools_PaveFiller& aPaveFiller=myDSFiller->PaveFiller(); |
179 | |
180 | BOPTools_PaveFiller* pPaveFiller=(BOPTools_PaveFiller*)&aPaveFiller; |
181 | BOPTools_CommonBlockPool& aCBPool=pPaveFiller->ChangeCommonBlockPool(); |
182 | |
183 | BOPTools_InterferencePool* pIntrPool=(BOPTools_InterferencePool*)&myDSFiller->InterfPool(); |
184 | BOPTools_CArray1OfSSInterference& aFFs=pIntrPool->SSInterferences(); |
185 | // |
4f189102 |
186 | const Handle(IntTools_Context)& aContext=pPaveFiller->Context(); |
7fd59977 |
187 | // |
188 | Standard_Boolean bIsToKeep; |
189 | Standard_Integer nEF1, nF2, nF2x, nSpF1, iRankF1; |
190 | TopAbs_Orientation anOrEF1; |
191 | TopExp_Explorer anExp; |
192 | // |
193 | BOPTools_SSInterference& aFF=aFFs(iFF); |
194 | nF2=aFF.OppositeIndex(nF1); |
195 | |
196 | const TopoDS_Face& aF1=TopoDS::Face(aDS.Shape(nF1)); |
197 | const TopoDS_Face& aF2=TopoDS::Face(aDS.Shape(nF2)); |
198 | |
199 | iRankF1=aDS.Rank(nF1); |
200 | // |
201 | // |
202 | anExp.Init(myFace, TopAbs_EDGE); |
203 | for (; anExp.More(); anExp.Next()) { |
204 | const TopoDS_Edge& anEF1=TopoDS::Edge(anExp.Current()); |
205 | anOrEF1=anEF1.Orientation(); |
206 | |
207 | nEF1=aDS.ShapeIndex(anEF1, iRankF1); |
208 | |
209 | BOPTools_ListOfCommonBlock& aLCB=aCBPool(aDS.RefEdge(nEF1)); |
210 | |
211 | BOPTools_ListIteratorOfListOfCommonBlock anItCB(aLCB); |
212 | for (; anItCB.More(); anItCB.Next()) { |
213 | BOPTools_CommonBlock& aCB=anItCB.Value(); |
214 | |
215 | BOPTools_PaveBlock& aPBEF1=aCB.PaveBlock1(nEF1); |
216 | // |
217 | nF2x=aCB.Face(); |
218 | |
219 | if (nF2x==nF2) { |
220 | // Splits that are ON (IN 2D) for other Face (aF2) |
221 | nSpF1=aPBEF1.Edge(); |
222 | const TopoDS_Shape& aSplit=aDS.Shape(nSpF1); |
223 | TopoDS_Edge aSS=TopoDS::Edge(aSplit); |
224 | // |
225 | //iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii |
226 | // Internal edges treatment |
227 | { |
228 | if (anOrEF1==TopAbs_INTERNAL) { |
229 | AddPartEF1INF2(aSS, myFace, aF2, iRankF1, myOperation, aWES); |
230 | continue; |
231 | } |
232 | } |
233 | // |
234 | //iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii |
235 | // |
236 | aSS.Orientation(anOrEF1); |
237 | // |
238 | TopAbs_State aState1= |
239 | BOPTools_Tools3D::GetStatePartIN2D(aSS, anEF1, aF1, aF2, aContext); |
240 | // |
241 | bIsToKeep= |
242 | BOP_BuilderTools::IsPartIN2DToKeep(aState1, iRankF1, myOperation); |
243 | // |
244 | if (bIsToKeep) { |
245 | aWES.AddStartElement (aSS); |
246 | } |
247 | } |
248 | } |
249 | } |
250 | } |
251 | //======================================================================= |
252 | // function: AddSplitPartsONSo |
253 | // purpose: |
254 | //======================================================================= |
255 | void BOP_ShellSolid::AddSplitPartsONSo(const Standard_Integer nF1, |
256 | const TopTools_IndexedDataMapOfShapeListOfShape& aMEFObj, |
257 | const TopTools_IndexedDataMapOfShapeListOfShape& aMEFTool, |
258 | BOP_WireEdgeSet& aWES) |
259 | { |
260 | const BooleanOperations_ShapesDataStructure& aDS=myDSFiller->DS(); |
261 | const BOPTools_PaveFiller& aPaveFiller=myDSFiller->PaveFiller(); |
262 | |
263 | BOPTools_PaveFiller* pPaveFiller=(BOPTools_PaveFiller*)&aPaveFiller; |
264 | BOPTools_CommonBlockPool& aCBPool=pPaveFiller->ChangeCommonBlockPool(); |
265 | // |
4f189102 |
266 | const Handle(IntTools_Context)& aContext=pPaveFiller->Context(); |
7fd59977 |
267 | // |
268 | Standard_Integer nEF1, nF2, nSpF1, nSpF2, nEF2, nSpTaken, iRankF1; |
269 | TopAbs_Orientation anOrEF1, anOrEF2; |
270 | TopExp_Explorer anExp; |
271 | TopTools_IndexedMapOfShape aM; |
272 | // |
273 | const TopoDS_Face& aF1=TopoDS::Face(aDS.Shape(nF1)); |
274 | iRankF1=aDS.Rank(nF1); |
275 | // |
276 | // |
277 | anExp.Init(myFace, TopAbs_EDGE); |
278 | for (; anExp.More(); anExp.Next()) { |
279 | const TopoDS_Edge& anEF1=TopoDS::Edge(anExp.Current()); |
280 | anOrEF1=anEF1.Orientation(); |
281 | |
282 | nEF1=aDS.ShapeIndex(anEF1, iRankF1); |
283 | |
284 | BOPTools_ListOfCommonBlock& aLCB=aCBPool(aDS.RefEdge(nEF1)); |
285 | |
286 | BOPTools_ListIteratorOfListOfCommonBlock anItCB(aLCB); |
287 | for (; anItCB.More(); anItCB.Next()) { |
288 | BOPTools_CommonBlock& aCB=anItCB.Value(); |
289 | |
290 | BOPTools_PaveBlock& aPBEF1=aCB.PaveBlock1(nEF1); |
291 | BOPTools_PaveBlock& aPBEF2=aCB.PaveBlock2(nEF1); |
292 | nF2=aCB.Face(); |
293 | if (nF2) { |
294 | // Splits that are ON (IN 2D) for other Face (aF2) |
295 | Standard_Boolean bIsToKeep; |
296 | |
297 | const TopoDS_Face& aF2=TopoDS::Face(aDS.Shape(nF2)); |
298 | |
299 | nSpF1=aPBEF1.Edge(); |
300 | const TopoDS_Shape& aSplit=aDS.Shape(nSpF1); |
301 | TopoDS_Edge aSS=TopoDS::Edge(aSplit); |
302 | // |
303 | //iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii |
304 | // Internal edges treatment |
305 | { |
306 | if (anOrEF1==TopAbs_INTERNAL) { |
307 | AddPartEF1INF2(aSS, myFace, aF2, iRankF1, myOperation, aWES); |
308 | continue; |
309 | } |
310 | } |
311 | // |
312 | //iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii |
313 | // |
314 | aSS.Orientation(anOrEF1); |
315 | // |
316 | TopAbs_State aState1= |
317 | BOPTools_Tools3D::GetStatePartIN2D(aSS, anEF1, aF1, aF2, aContext); |
318 | |
319 | bIsToKeep= |
320 | BOP_BuilderTools::IsPartIN2DToKeep(aState1, iRankF1, myOperation); |
321 | // |
322 | if (bIsToKeep) { |
323 | aWES.AddStartElement (aSS); |
324 | } |
325 | // |
326 | } |
327 | else {// else x |
328 | // Splits that are ON other Edge from other Face |
329 | nSpF1=aPBEF1.Edge(); |
330 | nSpF2=aPBEF2.Edge(); |
331 | nEF2=aPBEF2.OriginalEdge(); |
332 | // |
333 | // Pave Block from which new edge will be taken |
334 | const BOPTools_PaveBlock& aPB=aCB.PaveBlock1(); |
335 | nSpTaken=aPB.Edge(); |
336 | // |
337 | //iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii |
338 | // Internal edges treatment |
339 | { |
340 | Standard_Boolean bInternal1, bInternal2; |
341 | |
342 | const TopoDS_Edge& anEF2=TopoDS::Edge(aDS.Shape(nEF2)); |
343 | anOrEF2=anEF2.Orientation(); |
344 | |
345 | const TopTools_IndexedDataMapOfShapeListOfShape& aMEF= |
346 | (iRankF1==1) ? aMEFTool : aMEFObj; |
347 | const TopTools_ListOfShape& aLF2=aMEF.FindFromKey(anEF2); |
348 | const TopoDS_Face& aF2=TopoDS::Face(aLF2.First()); |
349 | // |
350 | bInternal1=(anOrEF1==TopAbs_INTERNAL); |
351 | bInternal2=(anOrEF2==TopAbs_INTERNAL); |
352 | // |
353 | if (bInternal1 || bInternal2) { |
354 | Standard_Integer nSpNotTaken; |
355 | // |
356 | nSpNotTaken=(nSpF1==nSpTaken) ? nSpF2 : nSpF1; |
357 | // |
358 | TopoDS_Edge aSS =TopoDS::Edge(aDS.Shape(nSpTaken)); |
359 | TopoDS_Edge aSSx=TopoDS::Edge(aDS.Shape(nSpNotTaken)); |
360 | |
361 | // a. Both parts are interlal edges |
362 | if (bInternal1 && bInternal2) { |
363 | BothInternals(aSS, myFace, aF2, iRankF1, myOperation, aWES); |
364 | } |
365 | |
366 | // b. The first is internal , the second is not |
367 | else if (bInternal1 && !bInternal2) { |
368 | FirstInternal(aSS, myFace, aF2, anEF2, aSSx, |
369 | iRankF1, myOperation, aMEF, aWES, aContext); |
370 | } |
371 | |
372 | // c. The first is no1 internal , the second is internal |
373 | else if (!bInternal1 && bInternal2) { |
374 | SecondInternal (aSS, aF1, aF2, anEF1, aSSx, |
375 | anOrEF1, iRankF1, myOperation, aWES, aContext); |
376 | } |
377 | continue; |
378 | } |
379 | } |
380 | // |
381 | //iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii |
382 | // |
383 | Standard_Boolean bIsON2DToKeep, bIsON2DToKeepSimm=Standard_False; |
384 | { |
385 | const TopoDS_Edge& anEFx=TopoDS::Edge(aDS.Shape(nEF2)); |
386 | TopoDS_Edge aSpFx=TopoDS::Edge(aDS.Shape(nSpF2)); |
387 | const TopTools_IndexedDataMapOfShapeListOfShape& aMEFx= |
388 | (iRankF1==1) ? aMEFTool : aMEFObj; |
389 | // |
390 | // anEF1 |
391 | TopAbs_State aST1; |
392 | BOPTools_Tools3D::GetPlanes(aSpFx, anEFx, aMEFx, anEF1, aF1, aST1, aContext); |
393 | bIsON2DToKeep= |
394 | BOP_BuilderTools::IsPartOn2dToKeep(aST1, iRankF1, myOperation); |
395 | |
396 | if (BRep_Tool::IsClosed(anEF1, aF1)) { |
397 | TopoDS_Edge anEF1Seam; |
398 | BOPTools_Tools3D::GetSeam (aF1, anEF1, anEF1Seam); |
399 | // |
400 | if (!anEF1Seam.IsNull()) { |
401 | TopAbs_State aSTSeam; |
402 | |
403 | BOPTools_Tools3D::GetPlanes(aSpFx, anEFx, aMEFx, anEF1Seam, aF1, aSTSeam, aContext); |
404 | bIsON2DToKeepSimm= |
405 | BOP_BuilderTools::IsPartOn2dToKeep(aSTSeam, iRankF1, myOperation); |
406 | } |
407 | bIsON2DToKeep=bIsON2DToKeep || bIsON2DToKeepSimm; |
408 | } |
409 | } |
410 | // |
411 | |
412 | if (nSpTaken==nSpF1) { |
413 | // Common Edge is from nEF1 |
414 | const TopoDS_Shape& aSp1=aDS.Shape(nSpF1); |
415 | TopoDS_Edge aSS=TopoDS::Edge(aSp1); |
416 | aSS.Orientation(anOrEF1); |
417 | // |
418 | if (bIsON2DToKeep) { |
419 | aWES.AddStartElement (aSS); |
420 | } |
421 | } |
422 | else /*if (nSpTaken==nSpF2)*/ { |
423 | // Common Edge is from nEF2 |
424 | |
425 | const TopoDS_Shape& aSp1=aDS.Shape(nSpF1); |
426 | TopoDS_Edge aSpF1=TopoDS::Edge(aSp1); |
427 | aSpF1.Orientation(anOrEF1); |
428 | |
429 | const TopoDS_Shape& aSp2=aDS.Shape(nSpF2); |
430 | TopoDS_Edge aSpF2=TopoDS::Edge(aSp2); |
431 | |
432 | Standard_Boolean bToReverse= |
433 | BOPTools_Tools3D::IsSplitToReverse1 (aSpF1, aSpF2, aContext); |
434 | if (bToReverse) { |
435 | aSpF2.Reverse(); |
436 | } |
437 | // |
438 | if (BRep_Tool::IsClosed(aSpF1, myFace)) { |
439 | if (aM.Contains(aSpF2)){ |
440 | continue; |
441 | } |
442 | aM.Add(aSpF2); |
443 | // |
444 | if (bIsON2DToKeep) { |
445 | if (!BRep_Tool::IsClosed(aSpF2, myFace)) { |
446 | // modified by NIZHNY-MKK Mon Feb 17 15:12:22 2003.BEGIN |
447 | // BOPTools_Tools3D::DoSplitSEAMOnFace (aSpF2, myFace); |
448 | Standard_Boolean bIsReversed = Standard_False; |
449 | |
450 | if(!BOPTools_Tools3D::DoSplitSEAMOnFace(aSpF2, aSpF1, myFace, bIsReversed)) |
451 | BOPTools_Tools3D::DoSplitSEAMOnFace (aSpF2, myFace); |
452 | // modified by NIZHNY-MKK Mon Feb 17 15:12:25 2003.END |
453 | } |
454 | |
455 | aWES.AddStartElement (aSpF2); |
456 | aSpF2.Reverse(); |
457 | aWES.AddStartElement (aSpF2); |
458 | } |
459 | continue; |
460 | } |
461 | // |
462 | if (bIsON2DToKeep) { |
463 | aWES.AddStartElement (aSpF2); |
464 | } |
465 | } |
466 | }// else x |
467 | }// for (; anItCB.More(); anItCB.Next()) |
468 | }// for (; anExp.More(); anExp.Next()) |
469 | } |
470 | //======================================================================= |
471 | // function: AddPartsEFSo |
472 | // purpose: |
473 | //======================================================================= |
474 | void BOP_ShellSolid::AddPartsEFSo (const Standard_Integer nF1, |
475 | const Standard_Integer iFF, |
476 | const TopTools_IndexedDataMapOfShapeListOfShape& aMEFObj, |
477 | const TopTools_IndexedDataMapOfShapeListOfShape& aMEFTool, |
478 | TopTools_IndexedMapOfShape& anEMap, |
479 | BOP_WireEdgeSet& aWES) |
480 | { |
481 | const BooleanOperations_ShapesDataStructure& aDS=myDSFiller->DS(); |
482 | BOPTools_InterferencePool* pIntrPool=(BOPTools_InterferencePool*)&myDSFiller->InterfPool(); |
483 | BOPTools_CArray1OfSSInterference& aFFs=pIntrPool->SSInterferences(); |
484 | |
485 | const BOPTools_PaveFiller& aPF=myDSFiller->PaveFiller(); |
486 | BOPTools_PaveFiller* pPaveFiller=(BOPTools_PaveFiller*)&aPF; |
487 | BOPTools_CommonBlockPool& aCBPool=pPaveFiller->ChangeCommonBlockPool(); |
488 | // |
489 | Standard_Integer iRankF1, iRankF2, nF2, nSpEF2, nEF2, nFace; |
490 | Standard_Boolean bIsKeepTwice, bIsAdjExists, bIsTouchCase; |
491 | TopExp_Explorer anExp2, anExp1; |
492 | // |
493 | BOPTools_SSInterference& aFF=aFFs(iFF); |
494 | nF2=aFF.OppositeIndex(nF1); |
495 | |
496 | |
497 | const TopoDS_Face& aF1=TopoDS::Face(aDS.Shape(nF1)); |
498 | const TopoDS_Face& aF2=TopoDS::Face(aDS.Shape(nF2)); |
499 | |
500 | iRankF1=aDS.Rank(nF1); |
501 | iRankF2=aDS.Rank(nF2); |
502 | |
503 | const TopTools_IndexedDataMapOfShapeListOfShape& aMEF=(iRankF2==1) ? aMEFObj : aMEFTool; |
504 | // |
505 | // EF2\F1 Processing |
506 | anExp2.Init (aF2, TopAbs_EDGE); |
507 | for (; anExp2.More(); anExp2.Next()) { |
508 | const TopoDS_Edge& aEF2= TopoDS::Edge(anExp2.Current()); |
509 | |
510 | nEF2=aDS.ShapeIndex(aEF2, iRankF2); |
511 | |
512 | BOPTools_ListOfCommonBlock& aLCB=aCBPool(aDS.RefEdge(nEF2)); |
513 | |
514 | BOPTools_ListIteratorOfListOfCommonBlock anItCB(aLCB); |
515 | for (; anItCB.More(); anItCB.Next()) { |
516 | BOPTools_CommonBlock& aCB=anItCB.Value(); |
517 | nFace=aCB.Face(); |
518 | if (nFace==nF1) { |
519 | BOPTools_PaveBlock& aPB=aCB.PaveBlock1(nEF2); |
520 | |
521 | nSpEF2=aPB.Edge(); |
522 | const TopoDS_Shape& aSpEF2=aDS.Shape(nSpEF2); |
523 | |
524 | if (anEMap.Contains(aSpEF2)) { |
525 | continue;// next CB |
526 | } |
527 | anEMap.Add(aSpEF2); |
528 | |
529 | TopoDS_Edge aSS=TopoDS::Edge(aSpEF2); |
530 | // |
531 | TopoDS_Face aF2Adj; |
532 | bIsAdjExists=BOPTools_Tools3D::GetAdjacentFace(aF2, aEF2, aMEF, aF2Adj); |
533 | |
534 | if (bIsAdjExists) { |
535 | bIsKeepTwice=BOPTools_Tools3D::IsKeepTwice(aF1, aF2, aF2Adj, aSS); |
536 | if (bIsKeepTwice) { |
537 | aWES.AddStartElement(aSS); |
538 | aSS.Reverse(); |
539 | aWES.AddStartElement(aSS); |
540 | } |
541 | else { |
542 | aSS.Orientation(TopAbs_FORWARD); |
543 | BOP_BuilderTools::OrientSectionEdgeOnF1 |
544 | (myFace, aF2, iRankF1, myOperation, aSS); |
545 | |
546 | aWES.AddStartElement(aSS); |
547 | } |
548 | } |
549 | else { |
550 | // No Adjacents |
551 | bIsTouchCase=BOPTools_Tools3D::IsTouchCase(aSS, myFace, aF2); |
552 | if (bIsTouchCase) { |
553 | aWES.AddStartElement(aSS); |
554 | aSS.Reverse(); |
555 | aWES.AddStartElement(aSS); |
556 | } |
557 | else { |
558 | aSS.Orientation(TopAbs_FORWARD); |
559 | BOP_BuilderTools::OrientSectionEdgeOnF1 |
560 | (myFace, aF2, iRankF1, myOperation, aSS); |
561 | |
562 | aWES.AddStartElement(aSS); |
563 | } |
564 | } |
565 | //continue; |
566 | } |
567 | |
568 | } // next CB on nEF2 |
569 | } |
570 | } |
571 | //======================================================================= |
572 | // function: AddINON2DPartsSo |
573 | // purpose: |
574 | //======================================================================= |
575 | void BOP_ShellSolid::AddINON2DPartsSo(const Standard_Integer iFF, |
576 | const Standard_Integer nF1, |
577 | const Standard_Integer nF2, |
578 | BOP_WireEdgeSet& aWES) |
579 | { |
580 | const BooleanOperations_ShapesDataStructure& aDS=myDSFiller->DS(); |
581 | BOPTools_InterferencePool* pIntrPool=(BOPTools_InterferencePool*)&myDSFiller->InterfPool(); |
582 | BOPTools_CArray1OfSSInterference& aFFs=pIntrPool->SSInterferences(); |
583 | // |
584 | Standard_Integer iSenseFlag, iRankF1; |
585 | // |
586 | iRankF1=aDS.Rank(nF1); |
587 | // |
588 | BOPTools_SSInterference& aFF=aFFs(iFF); |
589 | // |
590 | iSenseFlag=aFF.SenseFlag(); |
591 | // |
592 | BOP_SDFWESFiller aWESFiller; |
593 | aWESFiller.SetDSFiller(*myDSFiller); |
594 | aWESFiller.SetFaces(nF1, nF2); |
595 | aWESFiller.SetStatesMap(aFF.StatesMap()); |
596 | aWESFiller.SetSenseFlag(iSenseFlag); |
597 | |
598 | if (iSenseFlag==1) { |
599 | switch (myOperation) { |
600 | |
601 | case BOP_FUSE: |
602 | if (iRankF1==1) { |
603 | aWESFiller.SetOperation(BOP_CUT); |
604 | aWESFiller.Do(aWES); |
605 | aWESFiller.SetOperation(BOP_COMMON); |
606 | aWESFiller.Do(aWES); |
607 | } |
608 | else { |
609 | aWESFiller.SetOperation(BOP_CUT); |
610 | aWESFiller.Do(aWES); |
611 | } |
612 | break; |
613 | |
614 | case BOP_COMMON: |
615 | if (iRankF1==1) { |
616 | aWESFiller.SetOperation(BOP_COMMON); |
617 | aWESFiller.Do(aWES); |
618 | } |
619 | break; |
620 | |
621 | case BOP_CUT: |
622 | if (iRankF1==1) { |
623 | aWESFiller.SetOperation(BOP_CUT); |
624 | aWESFiller.Do(aWES); |
625 | } |
626 | break; |
627 | |
628 | case BOP_CUT21: |
629 | if (iRankF1==2) { |
630 | aWESFiller.SetOperation(BOP_CUT); |
631 | aWESFiller.Do(aWES); |
632 | } |
633 | break; |
634 | |
635 | default: |
636 | break; |
637 | } |
638 | } |
639 | |
640 | else if (iSenseFlag==-1) { // iSenseFlag<0 |
641 | switch (myOperation) { |
642 | |
643 | case BOP_FUSE: |
644 | aWESFiller.SetOperation(BOP_CUT); |
645 | aWESFiller.Do(aWES); |
646 | break; |
647 | |
648 | case BOP_COMMON: |
649 | break; |
650 | |
651 | case BOP_CUT: |
652 | if (iRankF1==1) { |
653 | aWESFiller.SetOperation(BOP_CUT); |
654 | aWESFiller.Do(aWES); |
655 | aWESFiller.SetOperation(BOP_COMMON); |
656 | aWESFiller.Do(aWES); |
657 | } |
658 | break; |
659 | |
660 | case BOP_CUT21: |
661 | if (iRankF1==2) { |
662 | aWESFiller.SetOperation(BOP_CUT); |
663 | aWESFiller.Do(aWES); |
664 | aWESFiller.SetOperation(BOP_COMMON); |
665 | aWESFiller.Do(aWES); |
666 | } |
667 | default: |
668 | break; |
669 | } |
670 | } |
671 | } |
672 | //======================================================================= |
673 | // function: AddPartsEFSDSo |
674 | // purpose: |
675 | //======================================================================= |
676 | void BOP_ShellSolid::AddPartsEFSDSo (const Standard_Integer nF1, |
677 | const Standard_Integer iFF, |
678 | const TopTools_IndexedDataMapOfShapeListOfShape& aMEFObj, |
679 | const TopTools_IndexedDataMapOfShapeListOfShape& aMEFTool, |
680 | BOP_WireEdgeSet& aWES) |
681 | { |
682 | const BooleanOperations_ShapesDataStructure& aDS=myDSFiller->DS(); |
683 | |
684 | BOPTools_InterferencePool* pIntrPool=(BOPTools_InterferencePool*)&myDSFiller->InterfPool(); |
685 | BOPTools_CArray1OfSSInterference& aFFs=pIntrPool->SSInterferences(); |
686 | |
687 | const BOPTools_PaveFiller& aPF=myDSFiller->PaveFiller(); |
688 | BOPTools_PaveFiller* pPaveFiller=(BOPTools_PaveFiller*)&aPF; |
689 | // |
690 | Standard_Integer iRankF1, iRankF2, nF2, bid=0, nSpEF2, nEF2, iSenseFlag; |
691 | Standard_Boolean bIsAdjExists, bKeptTwice; |
692 | TopExp_Explorer anExp2, anExp1; |
693 | // |
694 | BOPTools_SSInterference& aFF=aFFs(iFF); |
695 | nF2=aFF.OppositeIndex(nF1); |
696 | iSenseFlag=aFF.SenseFlag(); |
697 | |
698 | const TopoDS_Face& aF1=TopoDS::Face(aDS.Shape(nF1)); |
699 | const TopoDS_Face& aF2=TopoDS::Face(aDS.Shape(nF2)); |
700 | |
701 | iRankF1=aDS.Rank(nF1); |
702 | iRankF2=aDS.Rank(nF2); |
703 | |
704 | const TopTools_IndexedDataMapOfShapeListOfShape& aMEF=(iRankF2==1) ? aMEFObj : aMEFTool; |
705 | // |
706 | BOPTools_ListOfPaveBlock aLPB; |
707 | BOPTools_ListIteratorOfListOfPaveBlock anIt; |
708 | |
709 | pPaveFiller->SplitsInFace(bid, nF2, nF1, aLPB); |
710 | // |
711 | anIt.Initialize(aLPB); |
712 | for (; anIt.More(); anIt.Next()) { |
713 | const BOPTools_PaveBlock& aPBF2=anIt.Value(); |
714 | nEF2=aPBF2.OriginalEdge(); |
715 | nSpEF2=aPBF2.Edge(); |
716 | const TopoDS_Edge& aEF2=TopoDS::Edge(aDS.Shape(nEF2)); |
717 | const TopoDS_Edge& aSpEF2=TopoDS::Edge(aDS.Shape(nSpEF2)); |
718 | // |
719 | bKeptTwice=aWES.KeptTwice(aSpEF2); |
720 | |
721 | TopoDS_Face aF2Adj; |
722 | bIsAdjExists=BOPTools_Tools3D::GetAdjacentFace(aF2, aEF2, aMEF, aF2Adj); |
723 | |
724 | TopAbs_State aSt; |
725 | |
726 | if (bIsAdjExists) { |
727 | BOPTools_Tools3D::GetPointState(aSpEF2, aEF2, aF2Adj, aF1, aSt); |
728 | TopoDS_Edge aSS=aSpEF2; |
729 | aSS.Orientation(TopAbs_FORWARD); |
730 | Standard_Boolean bIsTouchCase; |
731 | |
732 | if (iSenseFlag==-1) { |
733 | if (aSt==TopAbs_IN) { |
734 | if (myOperation!=BOP_FUSE) { |
735 | if (bKeptTwice) { |
736 | aWES.RemoveEdgeFromWES(aSpEF2); |
737 | TopoDS_Edge aSpEF2R=TopoDS::Edge(aSpEF2.Reversed()); |
738 | aWES.RemoveEdgeFromWES(aSpEF2R); |
739 | } |
740 | |
741 | bIsTouchCase=BOPTools_Tools3D::IsTouchCase(aSS, myFace, aF2Adj); |
742 | if (bIsTouchCase) { |
743 | // |
744 | aWES.AddStartElement(aSS); |
745 | aSS.Reverse(); |
746 | aWES.AddStartElement(aSS); |
747 | // |
748 | } |
749 | else { |
750 | BOP_BuilderTools::OrientSectionEdgeOnF1 |
751 | (myFace, aF2Adj, iRankF1, myOperation, aSS); |
752 | aWES.AddStartElement(aSS); |
753 | } |
754 | } |
755 | else {//myOperation==BOP_FUSE && aSt==TopAbs_IN |
756 | aWES.RemoveEdgeFromWES(aSpEF2); |
757 | TopoDS_Edge aSpEF2R=TopoDS::Edge(aSpEF2.Reversed()); |
758 | aWES.RemoveEdgeFromWES(aSpEF2R); |
759 | } |
760 | } |
761 | |
762 | } |
763 | else {// if (iSenseFlag==1) |
764 | if (aSt==TopAbs_OUT) { |
765 | if (myOperation!=BOP_FUSE) { |
766 | if (bKeptTwice) { |
767 | aWES.RemoveEdgeFromWES(aSpEF2); |
768 | TopoDS_Edge aSpEF2R=TopoDS::Edge(aSpEF2.Reversed()); |
769 | aWES.RemoveEdgeFromWES(aSpEF2R); |
770 | } |
771 | bIsTouchCase=BOPTools_Tools3D::IsTouchCase(aSS, myFace, aF2Adj); |
772 | if (bIsTouchCase) { |
773 | // |
774 | aWES.AddStartElement(aSS); |
775 | aSS.Reverse(); |
776 | aWES.AddStartElement(aSS); |
777 | // |
778 | } |
779 | else { |
780 | BOP_BuilderTools::OrientSectionEdgeOnF1 |
781 | (myFace, aF2Adj, iRankF1, myOperation, aSS); |
782 | aWES.AddStartElement(aSS); |
783 | } |
784 | // |
785 | if ((myOperation==BOP_CUT && iRankF1==1)|| |
786 | (myOperation==BOP_CUT21 && iRankF1==2)) { |
787 | aWES.RemoveEdgeFromWES(aSpEF2); |
788 | TopoDS_Edge aSpEF2R=TopoDS::Edge(aSpEF2.Reversed()); |
789 | aWES.RemoveEdgeFromWES(aSpEF2R); |
790 | } |
791 | } |
792 | else {//myOperation!=BOP_FUSE at aSt==TopAbs_OUT |
793 | bIsTouchCase=BOPTools_Tools3D::IsTouchCase(aSS, myFace, aF2Adj); |
794 | if (!bIsTouchCase) { |
795 | aWES.RemoveEdgeFromWES(aSpEF2); |
796 | TopoDS_Edge aSpEF2R=TopoDS::Edge(aSpEF2.Reversed()); |
797 | aWES.RemoveEdgeFromWES(aSpEF2R); |
798 | |
799 | BOP_BuilderTools::OrientSectionEdgeOnF1 |
800 | (myFace, aF2Adj, iRankF1, myOperation, aSS); |
801 | aWES.AddStartElement(aSS); |
802 | } |
803 | } |
804 | } |
805 | } |
806 | } |
807 | } |
808 | } |
809 | //======================================================================= |
810 | // function: AddPartsEFNonSDSo |
811 | // purpose: |
812 | //======================================================================= |
813 | void BOP_ShellSolid::AddPartsEFNonSDSo (const Standard_Integer nF1, |
814 | const Standard_Integer iFF, |
815 | const TopTools_IndexedDataMapOfShapeListOfShape& aMEFObj, |
816 | const TopTools_IndexedDataMapOfShapeListOfShape& aMEFTool, |
817 | const TColStd_IndexedMapOfInteger& aFFIndicesMap, |
818 | TopTools_IndexedMapOfShape& anEMap, |
819 | BOP_WireEdgeSet& aWES) |
820 | { |
821 | const BooleanOperations_ShapesDataStructure& aDS=myDSFiller->DS(); |
822 | BOPTools_InterferencePool* pIntrPool=(BOPTools_InterferencePool*)&myDSFiller->InterfPool(); |
823 | BOPTools_CArray1OfSSInterference& aFFs=pIntrPool->SSInterferences(); |
824 | |
825 | const BOPTools_PaveFiller& aPF=myDSFiller->PaveFiller(); |
826 | BOPTools_PaveFiller* pPaveFiller=(BOPTools_PaveFiller*)&aPF; |
827 | BOPTools_CommonBlockPool& aCBPool=pPaveFiller->ChangeCommonBlockPool(); |
828 | // |
829 | Standard_Integer iRankF1, iRankF2, nF2, nSpEF2, nEF2, nFace; |
830 | Standard_Boolean bIsKeepTwice, bIsAdjExists, bIsTouchCase; |
831 | TopExp_Explorer anExp2, anExp1; |
832 | // |
833 | BOPTools_SSInterference& aFF=aFFs(iFF); |
834 | nF2=aFF.OppositeIndex(nF1); |
835 | |
836 | const TopoDS_Face& aF1=TopoDS::Face(aDS.Shape(nF1)); |
837 | const TopoDS_Face& aF2=TopoDS::Face(aDS.Shape(nF2)); |
838 | |
839 | iRankF1=aDS.Rank(nF1); |
840 | iRankF2=aDS.Rank(nF2); |
841 | |
842 | const TopTools_IndexedDataMapOfShapeListOfShape& aMEF=(iRankF2==1) ? aMEFObj : aMEFTool; |
843 | // |
844 | // EF2\F1 Processing |
845 | anExp2.Init (aF2, TopAbs_EDGE); |
846 | for (; anExp2.More(); anExp2.Next()) { |
847 | const TopoDS_Edge& aEF2= TopoDS::Edge(anExp2.Current()); |
848 | |
849 | nEF2=aDS.ShapeIndex(aEF2, iRankF2); |
850 | |
851 | BOPTools_ListOfCommonBlock& aLCB=aCBPool(aDS.RefEdge(nEF2)); |
852 | |
853 | BOPTools_ListIteratorOfListOfCommonBlock anItCB(aLCB); |
854 | for (; anItCB.More(); anItCB.Next()) { |
855 | BOPTools_CommonBlock& aCB=anItCB.Value(); |
856 | nFace=aCB.Face(); |
857 | |
858 | if (nFace==nF1) { |
859 | BOPTools_PaveBlock& aPB=aCB.PaveBlock1(nEF2); |
860 | |
861 | nSpEF2=aPB.Edge(); |
862 | const TopoDS_Shape& aSpEF2=aDS.Shape(nSpEF2); |
863 | |
864 | if (anEMap.Contains(aSpEF2)) { |
865 | continue;// next CB |
866 | } |
867 | anEMap.Add(aSpEF2); |
868 | |
869 | TopoDS_Edge aSS=TopoDS::Edge(aSpEF2); |
870 | // |
871 | TopoDS_Face aF2Adj; |
872 | bIsAdjExists=BOPTools_Tools3D::GetAdjacentFace(aF2, aEF2, aMEF, aF2Adj); |
873 | |
874 | if (bIsAdjExists) { |
875 | // |
876 | |
877 | Standard_Integer nF2Adj; |
878 | |
879 | nF2Adj=aDS.ShapeIndex(aF2Adj, iRankF2); |
880 | |
881 | Standard_Boolean bIsSameDomainFaceWithF1; |
882 | |
883 | bIsSameDomainFaceWithF1= |
884 | BOP_BuilderTools::IsSameDomainFaceWithF1(nF1, nF2Adj, aFFIndicesMap, aFFs); |
885 | |
886 | if (bIsSameDomainFaceWithF1) { |
887 | continue; |
888 | } |
889 | // |
890 | bIsKeepTwice=BOPTools_Tools3D::IsKeepTwice(aF1, aF2, aF2Adj, aSS); |
891 | if (bIsKeepTwice) { |
892 | aWES.AddStartElement(aSS); |
893 | aSS.Reverse(); |
894 | aWES.AddStartElement(aSS); |
895 | } |
896 | else { |
897 | aSS.Orientation(TopAbs_FORWARD); |
898 | BOP_BuilderTools::OrientSectionEdgeOnF1 |
899 | (myFace, aF2, iRankF1, myOperation, aSS); |
900 | |
901 | aWES.AddStartElement(aSS); |
902 | } |
903 | } |
904 | else { |
905 | // No Adjacents |
906 | bIsTouchCase=BOPTools_Tools3D::IsTouchCase(aSS, myFace, aF2); |
907 | if (bIsTouchCase) { |
908 | aWES.AddStartElement(aSS); |
909 | aSS.Reverse(); |
910 | aWES.AddStartElement(aSS); |
911 | } |
912 | else { |
913 | aSS.Orientation(TopAbs_FORWARD); |
914 | BOP_BuilderTools::OrientSectionEdgeOnF1 |
915 | (myFace, aF2, iRankF1, myOperation, aSS); |
916 | |
917 | aWES.AddStartElement(aSS); |
918 | } |
919 | } |
920 | } //if (nFace==nF1) { |
921 | } // next CB on nEF2 |
922 | } |
923 | } |
924 | |
925 | // |
926 | //======================================================================= |
927 | // function: AddPartsEENonSDSo |
928 | // purpose: |
929 | //======================================================================= |
930 | void BOP_ShellSolid::AddPartsEENonSDSo (const Standard_Integer nF1, |
931 | const Standard_Integer iFF, |
932 | const TopTools_IndexedDataMapOfShapeListOfShape& aMEFObj, |
933 | const TopTools_IndexedDataMapOfShapeListOfShape& aMEFTool, |
934 | const TColStd_IndexedMapOfInteger& aFFIndicesMap, |
935 | TopTools_IndexedMapOfShape& anEMap, |
936 | BOP_WireEdgeSet& aWES) |
937 | { |
938 | const BooleanOperations_ShapesDataStructure& aDS=myDSFiller->DS(); |
939 | BOPTools_InterferencePool* pIntrPool=(BOPTools_InterferencePool*)&myDSFiller->InterfPool(); |
940 | BOPTools_CArray1OfSSInterference& aFFs=pIntrPool->SSInterferences(); |
941 | |
942 | const BOPTools_PaveFiller& aPF=myDSFiller->PaveFiller(); |
943 | BOPTools_PaveFiller* pPaveFiller=(BOPTools_PaveFiller*)&aPF; |
944 | BOPTools_CommonBlockPool& aCBPool=pPaveFiller->ChangeCommonBlockPool(); |
945 | // |
4f189102 |
946 | const Handle(IntTools_Context)& aContext=pPaveFiller->Context(); |
7fd59977 |
947 | // |
948 | Standard_Integer nEF1, nF2, nSpF1, nSpF2, nEF2, nSpTaken, iRankF1, nF2x, iRankF2; |
949 | TopAbs_Orientation anOrEF1, anOrEF2; |
950 | TopExp_Explorer anExp; |
951 | TopTools_IndexedMapOfShape aM; |
952 | TColStd_ListOfInteger aSplitsOnF1; |
953 | TColStd_ListIteratorOfListOfInteger anIt; |
954 | TColStd_IndexedMapOfInteger aMSplitsOnF1; |
955 | // |
956 | // nF1 |
957 | const TopoDS_Face& aF1=TopoDS::Face(aDS.Shape(nF1)); |
958 | iRankF1=aDS.Rank(nF1); |
959 | const TopTools_IndexedDataMapOfShapeListOfShape& aMEFx=(iRankF1==1) ? aMEFTool : aMEFObj; |
960 | // |
961 | // nF2 |
962 | BOPTools_SSInterference& aFF=aFFs(iFF); |
963 | nF2=aFF.OppositeIndex(nF1); |
964 | |
965 | iRankF2=aDS.Rank(nF2); |
966 | |
967 | const TopoDS_Face& aF2=TopoDS::Face(aDS.Shape(nF2)); |
968 | // |
969 | pPaveFiller->SplitsOnFace(0, nF1, nF2, aSplitsOnF1); |
970 | anIt.Initialize(aSplitsOnF1); |
971 | for (; anIt.More(); anIt.Next()) { |
972 | nSpF1=anIt.Value(); |
973 | aMSplitsOnF1.Add(nSpF1); |
974 | } |
975 | // |
976 | anExp.Init(myFace, TopAbs_EDGE); |
977 | for (; anExp.More(); anExp.Next()) { |
978 | const TopoDS_Edge& anEF1=TopoDS::Edge(anExp.Current()); |
979 | anOrEF1=anEF1.Orientation(); |
980 | |
981 | nEF1=aDS.ShapeIndex(anEF1, iRankF1); |
982 | |
983 | BOPTools_ListOfCommonBlock& aLCB=aCBPool(aDS.RefEdge(nEF1)); |
984 | |
985 | BOPTools_ListIteratorOfListOfCommonBlock anItCB(aLCB); |
986 | for (; anItCB.More(); anItCB.Next()) { |
987 | BOPTools_CommonBlock& aCB=anItCB.Value(); |
988 | |
989 | BOPTools_PaveBlock& aPBEF1=aCB.PaveBlock1(nEF1); |
990 | BOPTools_PaveBlock& aPBEF2=aCB.PaveBlock2(nEF1); |
991 | |
992 | nF2x=aCB.Face(); |
993 | if (nF2x) { |
994 | continue; |
995 | } |
996 | // Splits that are ON other Edge from other Face |
997 | nSpF1=aPBEF1.Edge(); |
998 | // |
999 | if (!aMSplitsOnF1.Contains(nSpF1)) { |
1000 | continue;// next CB |
1001 | } |
1002 | // |
1003 | nSpF2=aPBEF2.Edge(); |
1004 | nEF2=aPBEF2.OriginalEdge(); |
1005 | // |
1006 | const TopoDS_Edge& aEF2=TopoDS::Edge(aDS.Shape(nEF2)); |
1007 | TopoDS_Face aF2Adj; |
1008 | |
1009 | Standard_Boolean bIsAdjExists; |
1010 | bIsAdjExists=BOPTools_Tools3D::GetAdjacentFace(aF2, aEF2, aMEFx, aF2Adj); |
1011 | |
1012 | if (bIsAdjExists) { |
1013 | Standard_Boolean bIsSameDomainFaceWithF1; |
1014 | Standard_Integer nF2Adj; |
1015 | |
1016 | nF2Adj=aDS.ShapeIndex(aF2Adj, iRankF2); |
1017 | |
1018 | bIsSameDomainFaceWithF1= |
1019 | BOP_BuilderTools::IsSameDomainFaceWithF1(nF1, nF2Adj, aFFIndicesMap, aFFs); |
1020 | |
1021 | if (bIsSameDomainFaceWithF1) { |
1022 | continue; |
1023 | } |
1024 | } |
1025 | // |
1026 | const TopoDS_Shape& aSp1=aDS.Shape(nSpF1); |
1027 | const TopoDS_Shape& aSp2=aDS.Shape(nSpF2); |
1028 | |
1029 | // |
1030 | if (anEMap.Contains(aSp1)) { |
1031 | continue;// next CB |
1032 | } |
1033 | anEMap.Add(aSp1); |
1034 | // |
1035 | if (anEMap.Contains(aSp2)) { |
1036 | continue;// next CB |
1037 | } |
1038 | anEMap.Add(aSp2); |
1039 | // |
1040 | |
1041 | // Pave Block from which new edge will be taken |
1042 | const BOPTools_PaveBlock& aPB=aCB.PaveBlock1(); |
1043 | nSpTaken=aPB.Edge(); |
1044 | // |
1045 | //iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii |
1046 | // Internal edges treatment |
1047 | { |
1048 | Standard_Boolean bInternal1, bInternal2; |
1049 | |
1050 | const TopoDS_Edge& anEF2=TopoDS::Edge(aDS.Shape(nEF2)); |
1051 | anOrEF2=anEF2.Orientation(); |
1052 | |
1053 | const TopTools_IndexedDataMapOfShapeListOfShape& aMEF= |
1054 | (iRankF1==1) ? aMEFTool : aMEFObj; |
1055 | |
1056 | bInternal1=(anOrEF1==TopAbs_INTERNAL); |
1057 | bInternal2=(anOrEF2==TopAbs_INTERNAL); |
1058 | |
1059 | if (bInternal1 || bInternal2) { |
1060 | Standard_Integer nSpNotTaken; |
1061 | // |
1062 | nSpNotTaken=(nSpF1==nSpTaken) ? nSpF2 : nSpF1; |
1063 | |
1064 | TopoDS_Edge aSS =TopoDS::Edge(aDS.Shape(nSpTaken)); |
1065 | TopoDS_Edge aSSx=TopoDS::Edge(aDS.Shape(nSpNotTaken)); |
1066 | // a. Both parts are interlal edges |
1067 | if (bInternal1 && bInternal2) { |
1068 | BothInternals(aSS, myFace, aF2, iRankF1, myOperation, aWES); |
1069 | } |
1070 | // b. The first is internal, the second is not |
1071 | else if (bInternal1 && !bInternal2) { |
1072 | FirstInternal(aSS, myFace, aF2, anEF2, aSSx, |
1073 | iRankF1, myOperation, aMEF, aWES, aContext); |
1074 | } |
1075 | |
1076 | // c. The first is no1 internal , the second is internal |
1077 | else if (!bInternal1 && bInternal2) { |
1078 | SecondInternal (aSS, aF1, aF2, anEF1, aSSx, |
1079 | anOrEF1, iRankF1, myOperation, aWES, aContext); |
1080 | } |
1081 | continue; |
1082 | } |
1083 | } |
1084 | // |
1085 | //iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii |
1086 | // |
1087 | Standard_Boolean bIsON2DToKeep, bIsON2DToKeepSimm=Standard_False; |
1088 | { |
1089 | const TopoDS_Edge& anEFx=TopoDS::Edge(aDS.Shape(nEF2)); |
1090 | TopoDS_Edge aSpFx=TopoDS::Edge(aDS.Shape(nSpF2)); |
1091 | // |
1092 | // anEF1 |
1093 | TopAbs_State aST1; |
1094 | BOPTools_Tools3D::GetPlanes(aSpFx, anEFx, aMEFx, anEF1, aF1, aST1, aContext); |
1095 | bIsON2DToKeep= |
1096 | BOP_BuilderTools::IsPartOn2dToKeep(aST1, iRankF1, myOperation); |
1097 | |
1098 | if (BRep_Tool::IsClosed(anEF1, aF1)) { |
1099 | TopoDS_Edge anEF1Seam; |
1100 | BOPTools_Tools3D::GetSeam (aF1, anEF1, anEF1Seam); |
1101 | // |
1102 | if (!anEF1Seam.IsNull()) { |
1103 | TopAbs_State aSTSeam; |
1104 | |
1105 | BOPTools_Tools3D::GetPlanes(aSpFx, anEFx, aMEFx, anEF1Seam, aF1, aSTSeam, aContext); |
1106 | bIsON2DToKeepSimm= |
1107 | BOP_BuilderTools::IsPartOn2dToKeep(aSTSeam, iRankF1, myOperation); |
1108 | } |
1109 | bIsON2DToKeep=bIsON2DToKeep || bIsON2DToKeepSimm; |
1110 | } |
1111 | } |
1112 | // |
1113 | |
1114 | if (nSpTaken==nSpF1) { |
1115 | // Common Edge is from nEF1 |
1116 | |
1117 | TopoDS_Edge aSS=TopoDS::Edge(aSp1); |
1118 | aSS.Orientation(anOrEF1); |
1119 | // |
1120 | if (bIsON2DToKeep) { |
1121 | aWES.AddStartElement (aSS); |
1122 | } |
1123 | } |
1124 | else /*if (nSpTaken==nSpF2)*/ { |
1125 | // Common Edge is from nEF2 |
1126 | TopoDS_Edge aSpF1=TopoDS::Edge(aSp1); |
1127 | aSpF1.Orientation(anOrEF1); |
1128 | |
1129 | TopoDS_Edge aSpF2=TopoDS::Edge(aSp2); |
1130 | |
1131 | Standard_Boolean bToReverse= BOPTools_Tools3D::IsSplitToReverse1 (aSpF1, aSpF2, aContext); |
1132 | if (bToReverse) { |
1133 | aSpF2.Reverse(); |
1134 | } |
1135 | // |
1136 | if (BRep_Tool::IsClosed(aSpF1, myFace)) { |
1137 | if (aM.Contains(aSpF2)){ |
1138 | continue; |
1139 | } |
1140 | aM.Add(aSpF2); |
1141 | // |
1142 | if (bIsON2DToKeep) { |
1143 | if (!BRep_Tool::IsClosed(aSpF2, myFace)) { |
1144 | BOPTools_Tools3D::DoSplitSEAMOnFace (aSpF2, myFace); |
1145 | } |
1146 | |
1147 | aWES.AddStartElement (aSpF2); |
1148 | aSpF2.Reverse(); |
1149 | aWES.AddStartElement (aSpF2); |
1150 | } |
1151 | continue; |
1152 | } |
1153 | // |
1154 | if (bIsON2DToKeep) { |
1155 | aWES.AddStartElement (aSpF2); |
1156 | } |
1157 | |
1158 | }// else /*if (nSpTaken==nSpF2)*/ { |
1159 | }// for (; anItCB.More(); anItCB.Next()) |
1160 | }// for (; anExp.More(); anExp.Next()) |
1161 | } |
1162 | |
1163 | //======================================================================= |
1164 | // function: AddPartsEF |
1165 | // purpose: |
1166 | //======================================================================= |
1167 | void AddPartsEF (const TopoDS_Edge& aSSin, |
1168 | const TopoDS_Edge& aEF2, |
1169 | const TopoDS_Face& aF2, |
1170 | const TopoDS_Face& myFace, |
1171 | const Standard_Integer iRankF1, |
1172 | const BOP_Operation myOperation, |
1173 | const TopTools_IndexedDataMapOfShapeListOfShape& aMEF, |
1174 | BOP_WireEdgeSet& aWES) |
1175 | { |
1176 | Standard_Boolean bIsKeepTwice, bIsAdjExists, bIsTouchCase; |
1177 | TopoDS_Face aF2Adj; |
1178 | TopoDS_Edge aSS=aSSin; |
1179 | // |
1180 | bIsAdjExists=BOPTools_Tools3D::GetAdjacentFace(aF2, aEF2, aMEF, aF2Adj); |
1181 | // |
1182 | if (bIsAdjExists) { |
1183 | bIsKeepTwice=BOPTools_Tools3D::IsKeepTwice(myFace, aF2, aF2Adj, aSS); |
1184 | if (bIsKeepTwice) { |
1185 | aWES.AddStartElement(aSS); |
1186 | aSS.Reverse(); |
1187 | aWES.AddStartElement(aSS); |
1188 | } |
1189 | else { |
1190 | aSS.Orientation(TopAbs_FORWARD); |
1191 | BOP_BuilderTools::OrientSectionEdgeOnF1 (myFace, aF2, iRankF1, myOperation, aSS); |
1192 | aWES.AddStartElement(aSS); |
1193 | } |
1194 | } |
1195 | else { |
1196 | // No Adjacents |
1197 | bIsTouchCase=BOPTools_Tools3D::IsTouchCase(aSS, myFace, aF2); |
1198 | // |
1199 | if (bIsTouchCase) { |
1200 | aWES.AddStartElement(aSS); |
1201 | aSS.Reverse(); |
1202 | aWES.AddStartElement(aSS); |
1203 | } |
1204 | else { |
1205 | aSS.Orientation(TopAbs_FORWARD); |
1206 | BOP_BuilderTools::OrientSectionEdgeOnF1 (myFace, aF2, iRankF1, myOperation, aSS); |
1207 | aWES.AddStartElement(aSS); |
1208 | } |
1209 | } |
1210 | } |
1211 | |
1212 | //======================================================================= |
1213 | // function: AddPartEF1INF2 |
1214 | // purpose: |
1215 | //======================================================================= |
1216 | void AddPartEF1INF2 (TopoDS_Edge& aSS, |
1217 | const TopoDS_Face& myFace, |
1218 | const TopoDS_Face& aF2, |
1219 | const Standard_Integer iRankF1, |
1220 | const BOP_Operation myOperation, |
1221 | BOP_WireEdgeSet& aWES) |
1222 | { |
1223 | Standard_Boolean bIsTouchCase; |
1224 | |
1225 | aSS.Orientation(TopAbs_FORWARD); |
1226 | |
1227 | bIsTouchCase=BOPTools_Tools3D::IsTouchCase(aSS, myFace, aF2); |
1228 | |
1229 | if (bIsTouchCase) { |
1230 | aWES.AddStartElement (aSS); |
1231 | aSS.Reverse(); |
1232 | aWES.AddStartElement (aSS); |
1233 | } |
1234 | else { |
1235 | BOP_BuilderTools::OrientSectionEdgeOnF1(myFace, aF2, iRankF1, myOperation, aSS); |
1236 | aWES.AddStartElement (aSS); |
1237 | } |
1238 | } |
1239 | //======================================================================= |
1240 | // function: BothInternals |
1241 | // purpose: |
1242 | //======================================================================= |
1243 | void BothInternals (TopoDS_Edge& aSS, |
1244 | const TopoDS_Face& myFace, |
1245 | const TopoDS_Face& aF2, |
1246 | const Standard_Integer iRankF1, |
1247 | const BOP_Operation myOperation, |
1248 | BOP_WireEdgeSet& aWES) |
1249 | { |
1250 | Standard_Boolean bIsTouchCase; |
1251 | // |
1252 | aSS.Orientation(TopAbs_FORWARD); |
1253 | // |
1254 | bIsTouchCase=BOPTools_Tools3D::IsTouchCase(aSS, myFace, aF2); |
1255 | // |
1256 | if (bIsTouchCase) { |
1257 | aWES.AddStartElement (aSS); |
1258 | aSS.Reverse(); |
1259 | aWES.AddStartElement (aSS); |
1260 | } |
1261 | else { |
1262 | BOP_BuilderTools::OrientSectionEdgeOnF1(myFace, aF2, iRankF1, myOperation, aSS); |
1263 | aWES.AddStartElement (aSS); |
1264 | } |
1265 | } |
1266 | //======================================================================= |
1267 | // function: FirstInternal |
1268 | // purpose: |
1269 | //======================================================================= |
1270 | void FirstInternal(TopoDS_Edge& aSS, |
1271 | const TopoDS_Face& myFace, |
1272 | const TopoDS_Face& aF2, |
1273 | const TopoDS_Edge& anEF2, |
1274 | TopoDS_Edge& aSSx, |
1275 | const Standard_Integer iRankF1, |
1276 | const BOP_Operation myOperation, |
1277 | const TopTools_IndexedDataMapOfShapeListOfShape& aMEF, |
1278 | BOP_WireEdgeSet& aWES, |
4f189102 |
1279 | const Handle(IntTools_Context)& aContext) |
7fd59977 |
1280 | { |
1281 | Standard_Boolean bToReverse; |
1282 | TopAbs_Orientation anOrEF2; |
1283 | TopoDS_Edge aEF2; |
1284 | |
1285 | BOPTools_Tools3D::OrientEdgeOnFace (anEF2, aF2, aEF2); |
1286 | anOrEF2=aEF2.Orientation(); |
1287 | |
1288 | if (aSS.Orientation()==TopAbs_INTERNAL) { |
1289 | aSS.Orientation(TopAbs_FORWARD); |
1290 | aSSx.Orientation(anOrEF2); |
1291 | bToReverse=BOPTools_Tools3D::IsSplitToReverse1 (aSSx, aSS, aContext); |
1292 | if(bToReverse){ |
1293 | aSS.Reverse(); |
1294 | } |
1295 | } |
1296 | else { |
1297 | aSS.Orientation(anOrEF2); |
1298 | } |
1299 | |
1300 | AddPartsEF(aSS, aEF2, aF2, myFace, iRankF1, myOperation, aMEF, aWES); |
1301 | } |
1302 | |
1303 | //======================================================================= |
1304 | // function: SecondInternal |
1305 | // purpose: |
1306 | //======================================================================= |
1307 | void SecondInternal(TopoDS_Edge& aSS, |
1308 | const TopoDS_Face& aF1, |
1309 | const TopoDS_Face& aF2, |
1310 | const TopoDS_Edge& anEF1, |
1311 | TopoDS_Edge& aSSx, |
1312 | const TopAbs_Orientation anOrEF1, |
1313 | const Standard_Integer iRankF1, |
1314 | const BOP_Operation myOperation, |
1315 | BOP_WireEdgeSet& aWES, |
4f189102 |
1316 | const Handle(IntTools_Context)& aContext) |
7fd59977 |
1317 | { |
1318 | Standard_Boolean bToReverse, bIsToKeep; |
1319 | if (aSS.Orientation()==TopAbs_INTERNAL) { |
1320 | aSS.Orientation(TopAbs_FORWARD); |
1321 | aSSx.Orientation(anOrEF1); |
1322 | bToReverse=BOPTools_Tools3D::IsSplitToReverse1 (aSSx, aSS, aContext); |
1323 | if(bToReverse){ |
1324 | aSS.Reverse(); |
1325 | } |
1326 | } |
1327 | else { |
1328 | aSS.Orientation(anOrEF1); |
1329 | } |
1330 | // |
1331 | TopAbs_State aState1= |
1332 | BOPTools_Tools3D::GetStatePartIN2D(aSS, anEF1, aF1, aF2, aContext); |
1333 | // |
1334 | bIsToKeep= |
1335 | BOP_BuilderTools::IsPartIN2DToKeep(aState1, iRankF1, myOperation); |
1336 | // |
1337 | if (bIsToKeep) { |
1338 | aWES.AddStartElement (aSS); |
1339 | } |
1340 | } |
1341 | |
1342 | //======================================================================= |
1343 | // function: AddPartsEESDSo |
1344 | // purpose: |
1345 | //======================================================================= |
1346 | void BOP_ShellSolid::AddPartsEESDSo (const Standard_Integer nF1, |
1347 | const Standard_Integer iFF, |
1348 | const TopTools_IndexedDataMapOfShapeListOfShape& aMEFObj, |
1349 | const TopTools_IndexedDataMapOfShapeListOfShape& aMEFTool, |
1350 | BOP_WireEdgeSet& aWES) |
1351 | { |
1352 | if (myOperation==BOP_FUSE) { |
1353 | return; |
1354 | } |
1355 | // |
1356 | const BooleanOperations_ShapesDataStructure& aDS=myDSFiller->DS(); |
1357 | BOPTools_InterferencePool* pIntrPool=(BOPTools_InterferencePool*)&myDSFiller->InterfPool(); |
1358 | BOPTools_CArray1OfSSInterference& aFFs=pIntrPool->SSInterferences(); |
1359 | |
1360 | const BOPTools_PaveFiller& aPF=myDSFiller->PaveFiller(); |
1361 | BOPTools_PaveFiller* pPaveFiller=(BOPTools_PaveFiller*)&aPF; |
1362 | BOPTools_CommonBlockPool& aCBPool=pPaveFiller->ChangeCommonBlockPool(); |
1363 | // |
4f189102 |
1364 | const Handle(IntTools_Context)& aContext=pPaveFiller->Context(); |
7fd59977 |
1365 | // |
1366 | Standard_Integer nEF1, nF2, nSpF1, nSpF2, nEF2, nSpTaken, iRankF1, nF2x, iRankF2, iSenseFlag; |
1367 | TopAbs_Orientation anOrEF1; |
1368 | TopExp_Explorer anExp; |
1369 | TopTools_IndexedMapOfShape aM; |
1370 | TColStd_ListOfInteger aSplitsOnF1; |
1371 | TColStd_ListIteratorOfListOfInteger anIt; |
1372 | TColStd_IndexedMapOfInteger aMSplitsOnF1; |
1373 | // |
1374 | // nF1 |
1375 | const TopoDS_Face& aF1=TopoDS::Face(aDS.Shape(nF1)); |
1376 | iRankF1=aDS.Rank(nF1); |
1377 | const TopTools_IndexedDataMapOfShapeListOfShape& aMEFx=(iRankF1==1) ? aMEFTool : aMEFObj; |
1378 | // |
1379 | // nF2 |
1380 | BOPTools_SSInterference& aFF=aFFs(iFF); |
1381 | nF2=aFF.OppositeIndex(nF1); |
1382 | iSenseFlag=aFF.SenseFlag(); |
1383 | // |
1384 | if (iSenseFlag==1) { |
1385 | return ; |
1386 | } |
1387 | // |
1388 | iRankF2=aDS.Rank(nF2); |
1389 | // |
1390 | pPaveFiller->SplitsOnFace(0, nF1, nF2, aSplitsOnF1); |
1391 | // |
1392 | anIt.Initialize(aSplitsOnF1); |
1393 | for (; anIt.More(); anIt.Next()) { |
1394 | nSpF1=anIt.Value(); |
1395 | aMSplitsOnF1.Add(nSpF1); |
1396 | } |
1397 | // |
1398 | anExp.Init(myFace, TopAbs_EDGE); |
1399 | for (; anExp.More(); anExp.Next()) { |
1400 | const TopoDS_Edge& anEF1=TopoDS::Edge(anExp.Current()); |
1401 | anOrEF1=anEF1.Orientation(); |
1402 | |
1403 | nEF1=aDS.ShapeIndex(anEF1, iRankF1); |
1404 | |
1405 | BOPTools_ListOfCommonBlock& aLCB=aCBPool(aDS.RefEdge(nEF1)); |
1406 | |
1407 | BOPTools_ListIteratorOfListOfCommonBlock anItCB(aLCB); |
1408 | for (; anItCB.More(); anItCB.Next()) { |
1409 | BOPTools_CommonBlock& aCB=anItCB.Value(); |
1410 | |
1411 | BOPTools_PaveBlock& aPBEF1=aCB.PaveBlock1(nEF1); |
1412 | BOPTools_PaveBlock& aPBEF2=aCB.PaveBlock2(nEF1); |
1413 | |
1414 | nF2x=aCB.Face(); |
1415 | if (nF2x) { |
1416 | continue; |
1417 | } |
1418 | // Splits that are ON other Edge from other Face |
1419 | nSpF1=aPBEF1.Edge(); |
1420 | // |
1421 | if (!aMSplitsOnF1.Contains(nSpF1)) { |
1422 | continue;// next CB |
1423 | } |
1424 | // |
1425 | nSpF2=aPBEF2.Edge(); |
1426 | nEF2=aPBEF2.OriginalEdge(); |
1427 | // |
1428 | const TopoDS_Shape& aSp1=aDS.Shape(nSpF1); |
1429 | const TopoDS_Shape& aSp2=aDS.Shape(nSpF2); |
1430 | // Pave Block from which new edge will be taken |
1431 | const BOPTools_PaveBlock& aPB=aCB.PaveBlock1(); |
1432 | nSpTaken=aPB.Edge(); |
1433 | // |
1434 | Standard_Boolean bIsON2DToKeep; |
1435 | { |
1436 | const TopoDS_Edge& anEFx=TopoDS::Edge(aDS.Shape(nEF2)); |
1437 | TopoDS_Edge aSpFx=TopoDS::Edge(aDS.Shape(nSpF2)); |
1438 | // |
1439 | // anEF1 |
1440 | TopAbs_State aST1; |
1441 | BOPTools_Tools3D::GetPlanes(aSpFx, anEFx, aMEFx, anEF1, aF1, aST1, aContext); |
1442 | |
1443 | bIsON2DToKeep=BOP_BuilderTools::IsPartOn2dToKeep(aST1, iRankF1, myOperation); |
1444 | if (bIsON2DToKeep) { |
1445 | bIsON2DToKeep=!bIsON2DToKeep; |
1446 | if (aST1==TopAbs_IN) { |
1447 | if ( |
1448 | (iRankF1==2 && (myOperation==BOP_COMMON || myOperation==BOP_CUT)) || |
1449 | (iRankF1==1 && (myOperation==BOP_COMMON || myOperation==BOP_CUT21)) |
1450 | ){ |
1451 | bIsON2DToKeep=!bIsON2DToKeep; |
1452 | } |
1453 | } |
1454 | } |
1455 | } |
1456 | if (bIsON2DToKeep) { |
1457 | // |
1458 | if (nSpTaken==nSpF1) { |
1459 | // Common Edge is from nEF1 |
1460 | TopoDS_Edge aSS=TopoDS::Edge(aSp1); |
1461 | aSS.Orientation(anOrEF1); |
1462 | // |
1463 | aWES.AddStartElement (aSS); |
1464 | } |
1465 | else /*if (nSpTaken==nSpF2)*/ { |
1466 | // Common Edge is from nEF2 |
1467 | TopoDS_Edge aSpF1=TopoDS::Edge(aSp1); |
1468 | aSpF1.Orientation(anOrEF1); |
1469 | |
1470 | TopoDS_Edge aSpF2=TopoDS::Edge(aSp2); |
1471 | |
1472 | Standard_Boolean bToReverse= BOPTools_Tools3D::IsSplitToReverse1 (aSpF1, aSpF2, aContext); |
1473 | if (bToReverse) { |
1474 | aSpF2.Reverse(); |
1475 | } |
1476 | // |
1477 | if (BRep_Tool::IsClosed(aSpF1, myFace)) { |
1478 | if (aM.Contains(aSpF2)){ |
1479 | continue; |
1480 | } |
1481 | aM.Add(aSpF2); |
1482 | // |
1483 | |
1484 | if (!BRep_Tool::IsClosed(aSpF2, myFace)) { |
1485 | BOPTools_Tools3D::DoSplitSEAMOnFace (aSpF2, myFace); |
1486 | } |
1487 | |
1488 | aWES.AddStartElement (aSpF2); |
1489 | aSpF2.Reverse(); |
1490 | aWES.AddStartElement (aSpF2); |
1491 | |
1492 | continue; |
1493 | } |
1494 | // |
1495 | aWES.AddStartElement (aSpF2); |
1496 | }// else /*if (nSpTaken==nSpF2)*/ { |
1497 | }// if (bIsON2DToKeep) |
1498 | }// for (; anItCB.More(); anItCB.Next()) |
1499 | }// for (; anExp.More(); anExp.Next()) |
1500 | } |