1 // Created on: 2001-06-06
2 // Created by: Peter KURNEV
3 // Copyright (c) 2001-2012 OPEN CASCADE SAS
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.
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.
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.
21 #include <BOP_SDFWESFiller.ixx>
26 #include <TopoDS_Face.hxx>
27 #include <TopoDS_Shape.hxx>
28 #include <TopoDS_Edge.hxx>
30 #include <TopExp_Explorer.hxx>
31 #include <TopTools_IndexedMapOfOrientedShape.hxx>
32 #include <TopTools_IndexedMapOfShape.hxx>
33 #include <TopAbs_Orientation.hxx>
35 #include <BRep_Tool.hxx>
37 #include <TColStd_ListOfInteger.hxx>
38 #include <TColStd_IndexedMapOfInteger.hxx>
39 #include <TColStd_ListIteratorOfListOfInteger.hxx>
41 #include <BooleanOperations_ShapesDataStructure.hxx>
42 #include <BooleanOperations_StateOfShape.hxx>
44 #include <IntTools_Tools.hxx>
45 #include <IntTools_Context.hxx>
47 #include <BOPTools_Tools2D.hxx>
48 #include <BOPTools_Tools3D.hxx>
49 #include <BOPTools_ListOfPaveBlock.hxx>
50 #include <BOPTools_ListIteratorOfListOfPaveBlock.hxx>
51 #include <BOPTools_PaveBlock.hxx>
52 #include <BOPTools_PaveFiller.hxx>
53 #include <BOPTools_SplitShapesPool.hxx>
54 #include <BOPTools_CommonBlockPool.hxx>
55 #include <BOPTools_ListOfCommonBlock.hxx>
56 #include <BOPTools_ListIteratorOfListOfCommonBlock.hxx>
57 #include <BOPTools_CommonBlock.hxx>
58 #include <BOPTools_Tools.hxx>
59 #include <BOPTools_PointBetween.hxx>
60 #include <BOPTools_SolidStateFiller.hxx>
62 #include <BOPTColStd_Dump.hxx>
63 #include <TopTools_MapOfShape.hxx>
64 static Standard_Boolean IsValidSeam(const TopoDS_Edge& aE,
65 const TopoDS_Face& aF,
66 const Standard_Real aT,
67 const Handle(IntTools_Context)& aContext);
69 static void CorrespondantSeam(const TopoDS_Edge& aSpE1Seam11,
70 const Standard_Real aT1,
71 const TopoDS_Edge& aSpE1Seam21,
72 const TopoDS_Edge& aSpE1Seam22,
73 const Standard_Real aT2,
74 const TopoDS_Face& aF1FWD,
77 static void TreatSDSeams (const TopoDS_Edge& aSpE1Seam11,
78 const Standard_Real aT1,
79 const TopoDS_Face& aF1FWD,
80 const TopoDS_Edge& aSpE1Seam21,
81 const Standard_Real aT2,
82 const TopoDS_Face& aF2FWD,
83 const Standard_Boolean bIsTakenSp1,
84 BOP_WireEdgeSet& aWES,
85 const Handle(IntTools_Context)& aContext);
88 //=======================================================================
89 // function: BOP_SDFWESFiller::BOP_SDFWESFiller
91 //=======================================================================
92 BOP_SDFWESFiller::BOP_SDFWESFiller()
95 myOperation(BOP_UNKNOWN),
101 //=======================================================================
102 // function: BOP_SDFWESFiller::BOP_SDFWESFiller
104 //=======================================================================
105 BOP_SDFWESFiller::BOP_SDFWESFiller(const Standard_Integer nF1,
106 const Standard_Integer nF2,
107 const BOPTools_DSFiller& aDSFiller)
113 myDSFiller=(BOPTools_DSFiller*) &aDSFiller;
116 //=======================================================================
117 // function: SetStatesMap
119 //=======================================================================
120 void BOP_SDFWESFiller::SetStatesMap (const BOPTools_IndexedDataMapOfIntegerState& aMap)
125 //=======================================================================
126 // function: StatesMap
128 //=======================================================================
129 const BOPTools_IndexedDataMapOfIntegerState& BOP_SDFWESFiller::StatesMap ()const
134 //=======================================================================
135 // function: SetFaces
137 //=======================================================================
138 void BOP_SDFWESFiller::SetFaces (const Standard_Integer nF1,
139 const Standard_Integer nF2)
144 //=======================================================================
145 // function: SetSenseFlag
147 //=======================================================================
148 void BOP_SDFWESFiller::SetSenseFlag (const Standard_Integer iFlag)
154 //=======================================================================
155 // function: SenseFlag
157 //=======================================================================
158 Standard_Integer BOP_SDFWESFiller::SenseFlag () const
164 //=======================================================================
167 //=======================================================================
168 void BOP_SDFWESFiller::Faces (Standard_Integer& nF1,
169 Standard_Integer& nF2) const
174 //=======================================================================
175 // function: SetDSFiller
177 //=======================================================================
178 void BOP_SDFWESFiller::SetDSFiller(const BOPTools_DSFiller& aDSFiller)
180 myDSFiller=(BOPTools_DSFiller*) &aDSFiller;
183 //=======================================================================
184 // function: DSFiller
186 //=======================================================================
187 const BOPTools_DSFiller& BOP_SDFWESFiller::DSFiller()const
192 //=======================================================================
193 // function: SetOperation
195 //=======================================================================
196 void BOP_SDFWESFiller::SetOperation(const BOP_Operation anOp)
200 //=======================================================================
201 // function: Operation
203 //=======================================================================
204 BOP_Operation BOP_SDFWESFiller::Operation()const
209 //=======================================================================
210 //function : RejectedOnParts
212 //=======================================================================
213 const TopTools_ListOfShape& BOP_SDFWESFiller::RejectedOnParts()const
215 return myRejectedOnParts;
218 //=======================================================================
221 //=======================================================================
222 void BOP_SDFWESFiller::Prepare()
224 if (!myNF1 || !myNF2) {
228 // 1. Prepare States 2D for the Faces' entities (myStatesMap)
229 AssignStates(myNF1, myNF2);
230 AssignStates(myNF2, myNF1);
232 AssignDEStates(myNF1, myNF2);
233 AssignDEStates(myNF2, myNF1);
241 //=======================================================================
244 //=======================================================================
245 void BOP_SDFWESFiller::Do(const BOP_WireEdgeSet& pWES)
248 myWES=(BOP_WireEdgeSet*) &pWES;
250 if (!myNF1 || !myNF2) {
256 switch (myOperation) {
258 PrepareWESForZone (myNF1, myNF2);
262 PrepareWESForCut (myNF1, myNF2);
266 PrepareWESForCut (myNF2, myNF1);
275 //=======================================================================
276 // function: AssignStates
278 //=======================================================================
279 void BOP_SDFWESFiller::AssignStates(const Standard_Integer nF1,
280 const Standard_Integer nF2)
282 const BooleanOperations_ShapesDataStructure& aDS=myDSFiller->DS();
283 const BOPTools_PaveFiller& aPaveFiller=myDSFiller->PaveFiller();
284 BOPTools_PaveFiller* pPaveFiller=(BOPTools_PaveFiller*) &aPaveFiller;
285 const BOPTools_SplitShapesPool& aSplitShapesPool=aPaveFiller.SplitShapesPool();
287 Standard_Integer aBid=0, nSplit, nE, nW, nSp, anEdgeFlag, aWireFlag, aNbPB, iRankF1;
288 TColStd_ListOfInteger aList1IN2, aList1ON2;
289 TColStd_IndexedMapOfInteger aSpMapIN, aSpMapON;
290 TColStd_ListIteratorOfListOfInteger anIt;
292 iRankF1=aDS.Rank(nF1);
294 const TopoDS_Face& aF1=TopoDS::Face(aDS.Shape(nF1));
296 // Splits that are from nF2 and are IN2D for nF2
297 pPaveFiller->SplitsInFace (aBid, nF1, nF2, aList1IN2);
299 anIt.Initialize(aList1IN2);
300 for (; anIt.More(); anIt.Next()) {
302 aSpMapIN.Add(nSplit);
305 // that are from nF2 and are ON2D for nF2
306 pPaveFiller->SplitsOnFace (aBid, nF1, nF2, aList1ON2);
308 anIt.Initialize(aList1ON2);
309 for (; anIt.More(); anIt.Next()) {
311 aSpMapON.Add(nSplit);
314 // Treatment of the Face's entities
316 TopExp_Explorer anExpWire(aF1, TopAbs_WIRE);
317 for (; anExpWire.More(); anExpWire.Next()) {
318 const TopoDS_Shape& aWire=anExpWire.Current();
319 nW=aDS.ShapeIndex(aWire, iRankF1);
322 TopExp_Explorer anExpEdge (aWire, TopAbs_EDGE);
323 for (; anExpEdge.More(); anExpEdge.Next()) {
324 const TopoDS_Shape& anEdge=anExpEdge.Current();
325 nE=aDS.ShapeIndex(anEdge, iRankF1);
327 const BOPTools_ListOfPaveBlock& aLPB=aSplitShapesPool(aDS.RefEdge(nE));
331 // the whole edge is OUT
332 myStatesMap.Add(nE, BooleanOperations_OUT);
336 BOPTools_ListIteratorOfListOfPaveBlock aPBIt(aLPB);
338 for (; aPBIt.More(); aPBIt.Next()) {
339 const BOPTools_PaveBlock& aPB=aPBIt.Value();
342 if (aSpMapIN.Contains(nSp)) {// IN
343 myStatesMap.Add(nSp, BooleanOperations_IN);
346 else if (aSpMapON.Contains(nSp)) {// ON
347 myStatesMap.Add(nSp, BooleanOperations_ON);
350 else {// if (nSp!=nE) {// OUT
351 myStatesMap.Add(nSp, BooleanOperations_OUT);
354 } // enf of for (; anExpEdge.More(); anExpEdge.Next())
356 if (anEdgeFlag) {// all Wire is out
357 myStatesMap.Add(nW, BooleanOperations_OUT);
362 } // enf of for (; anExpEdge.More(); anExpEdge.Next())
364 if (aWireFlag) { // all Face is out of nF2
365 myStatesMap.Add(nF1, BooleanOperations_OUT);
369 //=======================================================================
370 // function: PrepareOnParts
372 //=======================================================================
373 void BOP_SDFWESFiller::PrepareOnParts ()
375 const BooleanOperations_ShapesDataStructure& aDS=myDSFiller->DS();
376 const BOPTools_PaveFiller& aPaveFiller=myDSFiller->PaveFiller();
377 BOPTools_PaveFiller* pPaveFiller=(BOPTools_PaveFiller*) &aPaveFiller;
378 BOPTools_CommonBlockPool& aCBPool=pPaveFiller->ChangeCommonBlockPool();
380 Standard_Integer aBid=0, nE1, nE2, aNbSpON, nSp1, nSp2, iRankF1;
381 Standard_Real aT1, aT2, aT, aTs; /*, U, V;*/
382 Standard_Boolean aFlag;
383 TColStd_ListOfInteger aLs;
384 TColStd_IndexedMapOfInteger aMap;
385 TopExp_Explorer anExpF1, anExpF2;
387 iRankF1=aDS.Rank(myNF1);
391 TopoDS_Face aF1FWD, aF2FWD;
392 PrepareFaces(myNF1, myNF2, aF1FWD, aF2FWD);
395 anExpF1.Init(aF1FWD, TopAbs_EDGE);
396 for (; anExpF1.More(); anExpF1.Next()) {
397 const TopoDS_Edge& anE1=TopoDS::Edge(anExpF1.Current());
399 if (BRep_Tool::Degenerated(anE1)){
403 nE1=aDS.ShapeIndex(anE1, iRankF1);
406 pPaveFiller->SplitsOnFace(nE1, myNF2, aLs);
408 aNbSpON=aLs.Extent();
414 TColStd_ListIteratorOfListOfInteger anItLs(aLs);
415 for (; anItLs.More(); anItLs.Next()) {
420 BOPTools_ListOfCommonBlock& aLCB=aCBPool(aDS.RefEdge(nE1));
421 BOPTools_ListIteratorOfListOfCommonBlock anItCB(aLCB);
422 for (; anItCB.More(); anItCB.Next()) {
423 BOPTools_CommonBlock& aCB=anItCB.Value();
424 BOPTools_PaveBlock& aPB1=aCB.PaveBlock1(nE1);
426 if (aMap.Contains(nSp1)) {
429 aPB1.Parameters(aT1, aT2);
430 aT=BOPTools_Tools2D::IntermediatePoint(aT1, aT2);
431 BOPTools_Tools::PointOnEdge(anE1, aT, aPx1);
433 BOPTools_PointBetween aPointBetween;
434 aPointBetween.SetParameter(aT);
435 aPointBetween.SetPnt(aPx1);
437 aPB1.SetPointBetween(aPointBetween);
440 BOPTools_PaveBlock& aPB2=aCB.PaveBlock2(nE1);
441 nE2=aPB2.OriginalEdge();
443 const TopoDS_Edge& anE2=TopoDS::Edge(aDS.GetShape(nE2));
445 const Handle(IntTools_Context)& aContext=pPaveFiller->Context();
446 aFlag=aContext->ProjectPointOnEdge(aPx1, anE2, aTs);
449 BOPTColStd_Dump::PrintMessage(" BOP_SDFWESFiller::PrepareOnParts() failed\n");
453 aPointBetween.SetParameter(aTs);
454 aPointBetween.SetPnt(aPx1);
456 aPB2.SetPointBetween(aPointBetween);
458 BOPTools_ListOfCommonBlock& aLCB2=aCBPool(aDS.RefEdge(nE2));
459 BOPTools_ListIteratorOfListOfCommonBlock anItCB2(aLCB2);
460 for (; anItCB2.More(); anItCB2.Next()){
461 BOPTools_CommonBlock& aCB2=anItCB2.Value();
462 BOPTools_PaveBlock& aPB21=aCB2.PaveBlock1(nE2);
463 BOPTools_PaveBlock& aPB22=aCB2.PaveBlock2(nE2);
465 if ((aPB21.IsEqual(aPB1) && aPB22.IsEqual(aPB2))
467 (aPB21.IsEqual(aPB2) && aPB22.IsEqual(aPB1))) {
469 aPointBetween.SetPnt(aPx1);
471 aPointBetween.SetParameter(aTs);
472 aPB21.SetPointBetween(aPointBetween);
474 aPointBetween.SetParameter(aT);
475 aPB22.SetPointBetween(aPointBetween);
486 //=======================================================================
487 // function: PrepareWESForZone
489 //=======================================================================
490 void BOP_SDFWESFiller::PrepareWESForZone (const Standard_Integer nF1,
491 const Standard_Integer nF2)
493 const BooleanOperations_ShapesDataStructure& aDS=myDSFiller->DS();
494 const BOPTools_PaveFiller& aPaveFiller=myDSFiller->PaveFiller();
495 const BOPTools_SplitShapesPool& aSplitShapesPool=aPaveFiller.SplitShapesPool();
496 BOP_WireEdgeSet& aWES=*myWES;
498 Standard_Integer nE, nSp, iRankF1, iRankF2;
500 TopAbs_Orientation anOr;
501 BooleanOperations_StateOfShape aState;
502 TopTools_IndexedMapOfOrientedShape aMap;
504 iRankF1=aDS.Rank(nF1);
505 iRankF2=aDS.Rank(nF2);
507 TopoDS_Face aF1FWD, aF2FWD;
508 PrepareFaces(nF1, nF2, aF1FWD, aF2FWD);
510 TopExp_Explorer anExp;
513 anExp.Init(aF1FWD, TopAbs_EDGE);
514 for (; anExp.More(); anExp.Next()) {
515 const TopoDS_Shape& anE=anExp.Current();
516 anOr=anE.Orientation();
518 nE=aDS.ShapeIndex(anE, iRankF1);
520 const BOPTools_ListOfPaveBlock& aLPB=aSplitShapesPool(aDS.RefEdge(nE));
521 BOPTools_ListIteratorOfListOfPaveBlock aPBIt(aLPB);
522 for (; aPBIt.More(); aPBIt.Next()) {
523 const BOPTools_PaveBlock& aPB=aPBIt.Value();
526 if (!myStatesMap.Contains(nSp)) {
530 aState=myStatesMap.FindFromKey(nSp);
532 if (aState==BooleanOperations_IN) {
534 const TopoDS_Shape& aSplit=aDS.Shape(nSp);
535 TopoDS_Edge aSS=TopoDS::Edge(aSplit);
536 aSS.Orientation(anOr);
538 if (aMap.Contains(aSS)) {
542 aWES.AddStartElement (aSS);
545 if (BRep_Tool::IsClosed(aSS, aF1FWD)){
546 TopoDS_Shape EE=aSS.Reversed();
547 aWES.AddStartElement (EE);
556 anExp.Init(aF2FWD, TopAbs_EDGE);
557 for (; anExp.More(); anExp.Next()) {
558 const TopoDS_Shape& anE=anExp.Current();
560 anOr=anE.Orientation();
562 nE=aDS.ShapeIndex(anE, iRankF2);
564 const BOPTools_ListOfPaveBlock& aLPB=aSplitShapesPool(aDS.RefEdge(nE));
566 BOPTools_ListIteratorOfListOfPaveBlock aPBIt(aLPB);
567 for (; aPBIt.More(); aPBIt.Next()) {
568 const BOPTools_PaveBlock& aPB=aPBIt.Value();
571 if (!myStatesMap.Contains(nSp)) {
575 aState=myStatesMap.FindFromKey(nSp);
577 if (aState==BooleanOperations_IN) {
578 const TopoDS_Shape& aSplit=aDS.Shape(nSp);
579 TopoDS_Edge aSS=TopoDS::Edge(aSplit);
581 if (!BOPTools_Tools2D::HasCurveOnSurface(aSS, aF1FWD)) {
585 aSS.Orientation(anOr);
587 if (aMap.Contains(aSS)) {
591 aWES.AddStartElement (aSS);
594 if (BRep_Tool::IsClosed(aSS, aF2FWD)){
595 TopoDS_Shape EE=aSS.Reversed();
596 aWES.AddStartElement (EE);
603 PrepareOnParts(nF1, nF2, BOP_COMMON);
606 //=======================================================================
607 // function: PrepareWESForCut
609 //=======================================================================
610 void BOP_SDFWESFiller::PrepareWESForCut (const Standard_Integer nF1,
611 const Standard_Integer nF2)
613 const BooleanOperations_ShapesDataStructure& aDS=myDSFiller->DS();
614 const BOPTools_PaveFiller& aPaveFiller=myDSFiller->PaveFiller();
615 const BOPTools_SplitShapesPool& aSplitShapesPool=aPaveFiller.SplitShapesPool();
616 BOP_WireEdgeSet& aWES=*myWES;
618 Standard_Integer nE, nSp, nPB, iRankF2;
619 TopAbs_Orientation anOr;
620 BooleanOperations_StateOfShape aState;
622 iRankF2=aDS.Rank(nF2);
625 TopoDS_Face aF1FWD, aF2FWD;
626 PrepareFaces(nF1, nF2, aF1FWD, aF2FWD);
630 TopExp_Explorer anExp;
633 anExp.Init(aF2FWD, TopAbs_EDGE);
634 for (; anExp.More(); anExp.Next()) {
635 const TopoDS_Shape& anE=anExp.Current();
636 anOr=anE.Orientation();
638 nE=aDS.ShapeIndex(anE, iRankF2);
640 const BOPTools_ListOfPaveBlock& aLPB=aSplitShapesPool(aDS.RefEdge(nE));
644 BOPTools_ListIteratorOfListOfPaveBlock aPBIt(aLPB);
645 for (; aPBIt.More(); aPBIt.Next()) {
646 const BOPTools_PaveBlock& aPB=aPBIt.Value();
649 if (!myStatesMap.Contains(nSp)) {
653 aState=myStatesMap.FindFromKey(nSp);
655 if (aState==BooleanOperations_IN) {
656 const TopoDS_Shape& aSplit=aDS.Shape(nSp);
657 TopoDS_Edge aSS=TopoDS::Edge(aSplit);
659 if (!BOPTools_Tools2D::HasCurveOnSurface(aSS, aF1FWD)) {
663 aSS.Orientation(anOr);
665 aWES.AddStartElement (aSS);
667 if (BRep_Tool::IsClosed(aSS, aF2FWD)){
668 TopoDS_Shape EE=aSS.Reversed();
669 aWES.AddStartElement (EE);
676 if (!myStatesMap.Contains(nE)) {
680 aState=myStatesMap.FindFromKey(nE);
681 if (aState==BooleanOperations_IN) {
682 TopoDS_Edge aSS=TopoDS::Edge(anE);
684 aWES.AddStartElement (aSS);
687 } // end of for (; anExp.More(); anExp.Next()) {
689 PrepareOnParts(nF1, nF2, BOP_CUT);
691 //=======================================================================
692 // function: PrepareOnParts
694 //=======================================================================
695 void BOP_SDFWESFiller::PrepareOnParts (const Standard_Integer nF1,
696 const Standard_Integer nF2,
697 const BOP_Operation anOperation)
699 const BooleanOperations_ShapesDataStructure& aDS=myDSFiller->DS();
700 const BOPTools_PaveFiller& aPaveFiller=myDSFiller->PaveFiller();
701 BOPTools_PaveFiller* pPaveFiller=(BOPTools_PaveFiller*) &aPaveFiller;
702 BOPTools_CommonBlockPool& aCBPool=pPaveFiller->ChangeCommonBlockPool();
703 BOP_WireEdgeSet& aWES=*myWES;
705 const Handle(IntTools_Context)& aContext=pPaveFiller->Context();
707 Standard_Integer nE1, nE2, aNbSpON, nSp1, aBid, nSpTaken, nSp2, iRankF1, iRankF2;
708 Standard_Real aT1, aT2, aU, aV, aScPr;
709 Standard_Boolean bToReverse, bInternal1, bInternal2, bAdded;
711 TopoDS_Edge aSS, aSSx;
712 TopoDS_Face aF1FWD, aF2FWD;
713 TopAbs_Orientation anOr, anOr2;
715 TColStd_ListOfInteger aLs;
716 TColStd_IndexedMapOfInteger aMap;
717 TopTools_IndexedMapOfShape aM;
718 TopTools_MapOfShape aMFence;//xft
720 gp_Vec aN1, aN2, aTau1, aTau2, aBiN1, aBiN2;
721 TopExp_Explorer anExpF1, anExpF2;
724 iRankF1=aDS.Rank(nF1);
725 iRankF2=aDS.Rank(nF2);
727 PrepareFaces(nF1, nF2, aF1FWD, aF2FWD);
729 myRejectedOnParts.Clear();//xft
731 anExpF1.Init(aF1FWD, TopAbs_EDGE);
732 for (; anExpF1.More(); anExpF1.Next()) {
733 const TopoDS_Edge& anE1=TopoDS::Edge(anExpF1.Current());
734 anOr=anE1.Orientation();
736 if (BRep_Tool::Degenerated(anE1)){
740 nE1=aDS.ShapeIndex(anE1, iRankF1);
742 anExpF2.Init(aF2FWD, TopAbs_EDGE);
743 for (; anExpF2.More(); anExpF2.Next()) {
744 const TopoDS_Edge& anE2=TopoDS::Edge(anExpF2.Current());
745 anOr2=anE2.Orientation();
747 if (BRep_Tool::Degenerated(anE2)){
751 nE2=aDS.ShapeIndex(anE2, iRankF2);
753 pPaveFiller->SplitsOnEdge(nE1, nE2, aLs);
755 aNbSpON=aLs.Extent();
761 TColStd_ListIteratorOfListOfInteger anItLs(aLs);
762 for (; anItLs.More(); anItLs.Next()) {
767 BOPTools_ListOfCommonBlock& aLCB=aCBPool(aDS.RefEdge(nE1));
768 BOPTools_ListIteratorOfListOfCommonBlock anItCB(aLCB);
769 for (; anItCB.More(); anItCB.Next()) {
770 bAdded=Standard_False;//xft
771 BOPTools_CommonBlock& aCB=anItCB.Value();
772 // Pave Block from which new edge will be taken
773 const BOPTools_PaveBlock& aPB=aCB.PaveBlock1();
775 const TopoDS_Shape& aSpTaken=aDS.Shape(nSpTaken);
777 BOPTools_PaveBlock& aPB1=aCB.PaveBlock1(nE1);
780 if (aMap.Contains(nSp1)) {
781 BOPTools_PaveBlock& aPB2=aCB.PaveBlock2(nE1);
785 //iiiiiiiiiiiiiiiii Tue Dec 25 15:10:09 2001 iiiiii
787 // Internal eges' processing
788 bInternal1=(anOr ==TopAbs_INTERNAL);
789 bInternal2=(anOr2==TopAbs_INTERNAL);
791 if (bInternal1 || bInternal2) {
792 aSS=TopoDS::Edge(aDS.Shape(nSpTaken));
794 if (bInternal1 && bInternal2) {
795 if (anOperation==BOP_COMMON) {
796 aWES.AddStartElement (aSS);
797 bAdded=Standard_True;//xft
802 if (bInternal1 && !bInternal2) {
803 if (nSpTaken==nSp1) {
804 aSS.Orientation(TopAbs_FORWARD);
805 aSSx=TopoDS::Edge(aDS.Shape(nSp2));
806 aSSx.Orientation(anOr2);
808 bToReverse=BOPTools_Tools3D::IsSplitToReverse1 (aSSx, aSS, aContext);
814 else {//nSpTaken!=nSp1
815 aSS.Orientation(anOr2);
819 else if (!bInternal1 && bInternal2) {
820 if (nSpTaken==nSp2) {
821 aSS.Orientation(TopAbs_FORWARD);
822 aSSx=TopoDS::Edge(aDS.Shape(nSp1));
823 aSSx.Orientation(anOr);
825 bToReverse=BOPTools_Tools3D::IsSplitToReverse1 (aSSx, aSS, aContext);
831 else {//nSpTaken!=nSp2
832 aSS.Orientation(anOr);
836 if (anOperation==BOP_COMMON) {
837 aWES.AddStartElement (aSS);
838 bAdded=Standard_True;//xft
840 if (anOperation==BOP_CUT) {
842 aWES.AddStartElement (aSS);
843 bAdded=Standard_True;//xft
849 //iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii
852 const BOPTools_PointBetween &aPbn1=aPB1.PointBetween();
853 aT1=aPbn1.Parameter();
854 BOPTools_Tools2D::EdgeTangent(anE1, aT1, aTau1);
856 BOPTools_Tools2D::PointOnSurface(anE1, aF1FWD, aT1, aU, aV);
857 BOPTools_Tools2D::FaceNormal(aF1FWD, aU, aV, aN1);
860 const BOPTools_PointBetween &aPbn2=aPB2.PointBetween();
861 aT2=aPbn2.Parameter();
862 BOPTools_Tools2D::EdgeTangent(anE2, aT2, aTau2);
864 BOPTools_Tools2D::PointOnSurface(anE2, aF2FWD, aT2, aU, aV);
865 BOPTools_Tools2D::FaceNormal(aF2FWD, aU, aV, aN2);
871 if (anOperation==BOP_CUT) {
873 if (nSpTaken==nSp1) {
874 aSS=TopoDS::Edge(aDS.GetShape(nSp1));
875 aSS.Orientation(anOr);
879 const TopoDS_Shape& aSp1=aDS.Shape(nSp1);
880 TopoDS_Edge aSpE1=TopoDS::Edge(aSp1);
881 aSpE1.Orientation(anOr);
883 const TopoDS_Shape& aSp2=aDS.Shape(nSp2);
884 TopoDS_Edge aSpE2=TopoDS::Edge(aSp2);
886 bToReverse=BOPTools_Tools3D::IsSplitToReverse1 (aSpE1, aSpE2, aContext);
893 // modified by NIZHNY-MKK Thu May 29 12:39:32 2003.BEGIN
894 if (BRep_Tool::IsClosed(anE1, aF1FWD) && (!aSS.IsSame(anE1))) {
895 Standard_Boolean areverse = Standard_False;
896 BOPTools_Tools3D::DoSplitSEAMOnFace(aSS, anE1, aF1FWD, areverse);
899 if(BRep_Tool::IsClosed(anE2, aF2FWD) && (!aSS.IsSame(anE2))) {
900 Standard_Boolean areverse = Standard_False;
901 BOPTools_Tools3D::DoSplitSEAMOnFace(aSS, anE2, aF2FWD, areverse);
903 // modified by NIZHNY-MKK Thu May 29 12:39:35 2003.END
905 if (BRep_Tool::IsClosed(anE1, aF1FWD) &&
906 BRep_Tool::IsClosed(anE2, aF2FWD)){
908 Standard_Boolean bIsTakenSp1;
909 TopoDS_Edge aSpE1Seam11, aSpE1Seam21;
911 bIsTakenSp1=(nSpTaken==nSp1);
912 aSpE1Seam11=TopoDS::Edge(aDS.Shape(nSp1));
913 aSpE1Seam21=TopoDS::Edge(aDS.Shape(nSp2));
915 if (aM.Contains(aSpE1Seam11)){
920 if (aM.Contains(aSpE1Seam21)){
925 TreatSDSeams (aSpE1Seam11, aT1, aF1FWD,
926 aSpE1Seam21, aT2, aF2FWD,
933 aWES.AddStartElement (aSS);
934 bAdded=Standard_True;//xft
940 if (anOperation==BOP_COMMON) {
942 if (nSpTaken==nSp1) {
943 aSS=TopoDS::Edge(aDS.GetShape(nSp1));
944 aSS.Orientation(anOr);
948 const TopoDS_Shape& aSp1=aDS.Shape(nSp1);
949 TopoDS_Edge aSpE1=TopoDS::Edge(aSp1);
950 aSpE1.Orientation(anOr);
952 const TopoDS_Shape& aSp2=aDS.Shape(nSp2);
953 TopoDS_Edge aSpE2=TopoDS::Edge(aSp2);
955 bToReverse=BOPTools_Tools3D::IsSplitToReverse1 (aSpE1, aSpE2, aContext);
962 if (BRep_Tool::IsClosed(aSpE1, aF1FWD)) {
964 if (aM.Contains(aSpE2)){
969 if (!BRep_Tool::IsClosed(aSpE2, aF1FWD)) {
970 BOPTools_Tools3D::DoSplitSEAMOnFace (aSpE2, aF1FWD);
972 aWES.AddStartElement (aSpE2);
974 aWES.AddStartElement (aSpE2);
975 bAdded=Standard_True; //xft
981 aWES.AddStartElement (aSS);
982 bAdded=Standard_True; //xft
983 }// if (anOperation==BOP_COMMON) {
986 if(aMFence.Add(aSpTaken)) {
987 myRejectedOnParts.Append(aSpTaken);
990 }// if (aMap.Contains(nSp1)) {
991 }// for (; anItCB.More(); anItCB.Next()) {
992 }// for (; anExpF2.More(); anExpF2.Next()) {
993 }//for (; anExpF1.More(); anExpF1.Next()) {
996 //=======================================================================
997 // function: PrepareFaces
999 //=======================================================================
1000 void BOP_SDFWESFiller::PrepareFaces (const Standard_Integer nF1,
1001 const Standard_Integer nF2,
1002 TopoDS_Face& aF1FWD,
1003 TopoDS_Face& aF2FWD) const
1005 const BooleanOperations_ShapesDataStructure& aDS=myDSFiller->DS();
1006 TopAbs_Orientation anOr1, anOr2;
1008 const TopoDS_Shape& aF1=aDS.GetShape(nF1);
1009 aF1FWD=TopoDS::Face(aF1);
1010 anOr1=aF1.Orientation();
1012 const TopoDS_Shape& aF2=aDS.GetShape(nF2);
1013 aF2FWD=TopoDS::Face(aF2);
1014 anOr2=aF2.Orientation();
1016 aF1FWD.Orientation(TopAbs_FORWARD);
1018 if (mySenseFlag==1) {
1019 if (anOr1==TopAbs_FORWARD && anOr2==TopAbs_FORWARD) {
1020 aF2FWD.Orientation(TopAbs_FORWARD);
1022 else if (anOr1==TopAbs_REVERSED && anOr2==TopAbs_REVERSED) {
1023 aF2FWD.Orientation(TopAbs_FORWARD);
1025 else if (anOr1==TopAbs_FORWARD && anOr2==TopAbs_REVERSED) {
1026 aF2FWD.Orientation(TopAbs_REVERSED);
1028 else if (anOr1==TopAbs_REVERSED && anOr2==TopAbs_FORWARD) {
1029 aF2FWD.Orientation(TopAbs_REVERSED);
1034 if (anOr1==TopAbs_FORWARD && anOr2==TopAbs_FORWARD) {
1035 aF2FWD.Orientation(TopAbs_REVERSED);
1037 else if (anOr1==TopAbs_REVERSED && anOr2==TopAbs_REVERSED) {
1038 aF2FWD.Orientation(TopAbs_REVERSED);
1040 else if (anOr1==TopAbs_FORWARD && anOr2==TopAbs_REVERSED) {
1041 aF2FWD.Orientation(TopAbs_FORWARD);
1043 else if (anOr1==TopAbs_REVERSED && anOr2==TopAbs_FORWARD) {
1044 aF2FWD.Orientation(TopAbs_FORWARD);
1049 //=======================================================================
1050 // function: AssignDEStates
1052 //=======================================================================
1053 void BOP_SDFWESFiller::AssignDEStates(const Standard_Integer nF1,
1054 const Standard_Integer nF2)
1056 const BooleanOperations_ShapesDataStructure& aDS=myDSFiller->DS();
1058 Standard_Integer nE1, iRankF1;
1059 TopExp_Explorer anExpF1;
1061 iRankF1=aDS.Rank(nF1);
1063 const TopoDS_Face& aF1=TopoDS::Face(aDS.Shape(nF1));
1065 anExpF1.Init(aF1, TopAbs_EDGE);
1066 for (; anExpF1.More(); anExpF1.Next()) {
1067 const TopoDS_Edge& anE1=TopoDS::Edge(anExpF1.Current());
1069 if (!BRep_Tool::Degenerated(anE1)){
1073 nE1=aDS.ShapeIndex(anE1, iRankF1);
1074 AssignDEStates (nF1, nE1, nF2);
1078 //=======================================================================
1079 // function: AssignDEStates
1081 //=======================================================================
1082 void BOP_SDFWESFiller::AssignDEStates(const Standard_Integer nFD,
1083 const Standard_Integer nED,
1084 const Standard_Integer nF2)
1086 const BooleanOperations_ShapesDataStructure& aDS=myDSFiller->DS();
1087 const BOPTools_PaveFiller& aPaveFiller=myDSFiller->PaveFiller();
1088 BOPTools_PaveFiller* pPaveFiller=(BOPTools_PaveFiller*) &aPaveFiller;
1089 const BOPTools_SplitShapesPool& aSplitShapesPool=aPaveFiller.SplitShapesPool();
1091 const BOPTools_ListOfPaveBlock& aSplitEdges=aSplitShapesPool(aDS.RefEdge(nED));
1093 const Handle(IntTools_Context)& aContext=pPaveFiller->Context();
1094 const TopoDS_Edge& aDE=TopoDS::Edge(aDS.Shape(nED));
1095 const TopoDS_Face& aDF=TopoDS::Face(aDS.Shape(nFD));
1096 const TopoDS_Face& aFaceReference=TopoDS::Face(aDS.Shape(nF2));
1098 Standard_Boolean bIsValidPoint;
1099 Standard_Integer nSp;
1100 Standard_Real aT, aT1, aT2;
1101 TopAbs_State aState;
1107 aF.Orientation(TopAbs_FORWARD);
1109 BOPTools_ListIteratorOfListOfPaveBlock aPBIt(aSplitEdges);
1110 for (; aPBIt.More(); aPBIt.Next()) {
1111 BOPTools_PaveBlock& aPB=aPBIt.Value();
1114 const TopoDS_Edge& aSp=TopoDS::Edge(aDS.Shape(nSp));
1116 aPB.Parameters(aT1, aT2);
1117 aT=IntTools_Tools::IntermediatePoint(aT1, aT2);
1119 TopoDS_Edge aDERight, aSpRight;
1123 BOPTools_Tools3D::OrientEdgeOnFace (aDE, aF, aDERight);
1124 aSpRight.Orientation(aDERight.Orientation());
1126 BOPTools_Tools3D::PointNearEdge(aSpRight, aDF, aT, aPx2DNear, aPxNear);
1130 bIsValidPoint=aContext->IsValidPointForFace(aPxNear, aFaceReference, 1.e-3);
1132 if (bIsValidPoint) {
1136 BooleanOperations_StateOfShape aSt;
1138 aSt=BOPTools_SolidStateFiller::ConvertState(aState);
1139 if (myStatesMap.Contains(nSp)) {
1140 BooleanOperations_StateOfShape& aBooState=myStatesMap.ChangeFromKey(nSp);
1144 myStatesMap.Add(nSp, aSt);
1149 //=======================================================================
1150 // function: UpdateDEStates3D
1152 //=======================================================================
1153 void BOP_SDFWESFiller::UpdateDEStates3D()
1155 BooleanOperations_ShapesDataStructure* pDS=
1156 (BooleanOperations_ShapesDataStructure*)&myDSFiller->DS();
1158 Standard_Integer i, aNb, nSp;
1159 BooleanOperations_StateOfShape aSt;
1161 aNb=myStatesMap.Extent();
1162 for (i=1; i<=aNb; i++) {
1163 nSp=myStatesMap.FindKey(i);
1164 aSt=pDS->GetState(nSp);
1165 aSt=BooleanOperations_UNKNOWN;
1166 pDS->SetState(nSp, aSt);
1170 #include <Geom2d_Curve.hxx>
1171 #include <gp_Pnt2d.hxx>
1173 //=======================================================================
1174 // function: TreatSDSeams
1176 //=======================================================================
1177 void TreatSDSeams (const TopoDS_Edge& aSpE1Seam11,
1178 const Standard_Real aT1,
1179 const TopoDS_Face& aF1FWD,
1181 const TopoDS_Edge& aSpE1Seam21,
1182 const Standard_Real aT2,
1183 const TopoDS_Face& aF2FWD,
1185 const Standard_Boolean bIsTakenSp1,
1186 BOP_WireEdgeSet& aWES,
1187 const Handle(IntTools_Context)& aContext)
1189 Standard_Boolean bIsValidSeam11, bIsValidSeam12,
1190 bIsValidSeam21, bIsValidSeam22;
1191 Standard_Real aScPr;
1192 TopoDS_Edge aSS, aSpE1Seam12,aSpE1Seam22;
1193 gp_Dir aDB11, aDB12, aDB21, aDB22;
1195 aSpE1Seam12=TopoDS::Edge(aSpE1Seam11.Reversed());
1196 aSpE1Seam22=TopoDS::Edge(aSpE1Seam21.Reversed());
1199 BOPTools_Tools3D::DoSplitSEAMOnFace (aSpE1Seam21, aF1FWD);
1200 aSpE1Seam22=TopoDS::Edge(aSpE1Seam21.Reversed());
1203 bIsValidSeam11=IsValidSeam(aSpE1Seam11, aF1FWD, aT1, aContext);
1204 bIsValidSeam12=IsValidSeam(aSpE1Seam12, aF1FWD, aT1, aContext);
1205 bIsValidSeam21=IsValidSeam(aSpE1Seam21, aF2FWD, aT2, aContext);
1206 bIsValidSeam22=IsValidSeam(aSpE1Seam22, aF2FWD, aT2, aContext);
1208 if (bIsValidSeam11 && bIsValidSeam12) {
1209 BOPTools_Tools3D::GetBiNormal(aSpE1Seam11, aF1FWD, aT1, aDB11);
1210 BOPTools_Tools3D::GetBiNormal(aSpE1Seam12, aF1FWD, aT1, aDB12);
1212 if (bIsValidSeam21 && !bIsValidSeam22) {
1213 BOPTools_Tools3D::GetBiNormal(aSpE1Seam21, aF2FWD, aT2, aDB21);
1221 CorrespondantSeam(aSpE1Seam11, aT1,
1222 aSpE1Seam21, aSpE1Seam22, aT2,
1226 else { //if (aScPr>0.)
1232 CorrespondantSeam(aSpE1Seam12, aT1,
1233 aSpE1Seam21, aSpE1Seam22, aT2,
1237 aWES.AddStartElement (aSS);
1238 } //if (bIsValidSeam21 && !bIsValidSeam22)
1241 if (!bIsValidSeam21 && bIsValidSeam22) {
1242 BOPTools_Tools3D::GetBiNormal(aSpE1Seam22, aF2FWD, aT2, aDB22);
1250 CorrespondantSeam(aSpE1Seam11, aT1,
1251 aSpE1Seam21, aSpE1Seam22, aT2,
1255 else {//if (aScPr>0.)
1261 CorrespondantSeam(aSpE1Seam12, aT1,
1262 aSpE1Seam21, aSpE1Seam22, aT2,
1266 aWES.AddStartElement (aSS);
1267 }// if (!bIsValidSeam21 && bIsValidSeam22)
1268 } //if (bIsValidSeam11 && bIsValidSeam12)
1271 //=======================================================================
1272 // function: IsValidSeam
1274 //=======================================================================
1275 Standard_Boolean IsValidSeam(const TopoDS_Edge& aE,
1276 const TopoDS_Face& aF,
1277 const Standard_Real aT,
1278 const Handle(IntTools_Context)& aContext)
1280 Standard_Boolean bIsPointInOnFace;
1284 BOPTools_Tools3D::PointNearEdge(aE, aF, aT, aPx2DNear, aPxNear);
1286 bIsPointInOnFace=aContext->IsPointInOnFace(aF, aPx2DNear);
1287 return bIsPointInOnFace;
1289 //=======================================================================
1290 // function: CorrespondantSeam
1292 //=======================================================================
1293 void CorrespondantSeam(const TopoDS_Edge& aSpE1Seam11,
1294 const Standard_Real aT1,
1295 const TopoDS_Edge& aSpE1Seam21,
1296 const TopoDS_Edge& aSpE1Seam22,
1297 const Standard_Real aT2,
1298 const TopoDS_Face& aF1FWD,
1302 Standard_Real a, b, aD1121, aD1122, aTol=1.e-7;
1303 Handle(Geom2d_Curve) aC2DSeam11, aC2DSeam21, aC2DSeam22;
1304 gp_Pnt2d aP2D11, aP2D21, aP2D22;
1306 aC2DSeam11=BRep_Tool::CurveOnSurface(aSpE1Seam11, aF1FWD, a, b);
1307 aC2DSeam11->D0(aT1, aP2D11);
1309 aC2DSeam21=BRep_Tool::CurveOnSurface(aSpE1Seam21, aF1FWD, a, b);
1310 aC2DSeam21->D0(aT2, aP2D21);
1312 aC2DSeam22=BRep_Tool::CurveOnSurface(aSpE1Seam22, aF1FWD, a, b);
1313 aC2DSeam22->D0(aT2, aP2D22);
1315 aD1121=aP2D11.Distance(aP2D21);
1316 aD1122=aP2D11.Distance(aP2D22);