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);
87 //modified by NIZNHY-PKV Tue Sep 25 14:26:14 2012f
89 Standard_Boolean IsClosed(const TopoDS_Edge& aE,
90 const TopoDS_Face& aF);
91 //modified by NIZNHY-PKV Tue Sep 25 14:26:17 2012t
93 //=======================================================================
94 // function: BOP_SDFWESFiller::BOP_SDFWESFiller
96 //=======================================================================
97 BOP_SDFWESFiller::BOP_SDFWESFiller()
100 myOperation(BOP_UNKNOWN),
106 //=======================================================================
107 // function: BOP_SDFWESFiller::BOP_SDFWESFiller
109 //=======================================================================
110 BOP_SDFWESFiller::BOP_SDFWESFiller(const Standard_Integer nF1,
111 const Standard_Integer nF2,
112 const BOPTools_DSFiller& aDSFiller)
118 myDSFiller=(BOPTools_DSFiller*) &aDSFiller;
121 //=======================================================================
122 // function: SetStatesMap
124 //=======================================================================
125 void BOP_SDFWESFiller::SetStatesMap (const BOPTools_IndexedDataMapOfIntegerState& aMap)
130 //=======================================================================
131 // function: StatesMap
133 //=======================================================================
134 const BOPTools_IndexedDataMapOfIntegerState& BOP_SDFWESFiller::StatesMap ()const
139 //=======================================================================
140 // function: SetFaces
142 //=======================================================================
143 void BOP_SDFWESFiller::SetFaces (const Standard_Integer nF1,
144 const Standard_Integer nF2)
149 //=======================================================================
150 // function: SetSenseFlag
152 //=======================================================================
153 void BOP_SDFWESFiller::SetSenseFlag (const Standard_Integer iFlag)
159 //=======================================================================
160 // function: SenseFlag
162 //=======================================================================
163 Standard_Integer BOP_SDFWESFiller::SenseFlag () const
169 //=======================================================================
172 //=======================================================================
173 void BOP_SDFWESFiller::Faces (Standard_Integer& nF1,
174 Standard_Integer& nF2) const
179 //=======================================================================
180 // function: SetDSFiller
182 //=======================================================================
183 void BOP_SDFWESFiller::SetDSFiller(const BOPTools_DSFiller& aDSFiller)
185 myDSFiller=(BOPTools_DSFiller*) &aDSFiller;
188 //=======================================================================
189 // function: DSFiller
191 //=======================================================================
192 const BOPTools_DSFiller& BOP_SDFWESFiller::DSFiller()const
197 //=======================================================================
198 // function: SetOperation
200 //=======================================================================
201 void BOP_SDFWESFiller::SetOperation(const BOP_Operation anOp)
205 //=======================================================================
206 // function: Operation
208 //=======================================================================
209 BOP_Operation BOP_SDFWESFiller::Operation()const
214 //=======================================================================
215 //function : RejectedOnParts
217 //=======================================================================
218 const TopTools_ListOfShape& BOP_SDFWESFiller::RejectedOnParts()const
220 return myRejectedOnParts;
223 //=======================================================================
226 //=======================================================================
227 void BOP_SDFWESFiller::Prepare()
229 if (!myNF1 || !myNF2) {
233 // 1. Prepare States 2D for the Faces' entities (myStatesMap)
234 AssignStates(myNF1, myNF2);
235 AssignStates(myNF2, myNF1);
237 AssignDEStates(myNF1, myNF2);
238 AssignDEStates(myNF2, myNF1);
246 //=======================================================================
249 //=======================================================================
250 void BOP_SDFWESFiller::Do(const BOP_WireEdgeSet& pWES)
253 myWES=(BOP_WireEdgeSet*) &pWES;
255 if (!myNF1 || !myNF2) {
261 switch (myOperation) {
263 PrepareWESForZone (myNF1, myNF2);
267 PrepareWESForCut (myNF1, myNF2);
271 PrepareWESForCut (myNF2, myNF1);
280 //=======================================================================
281 // function: AssignStates
283 //=======================================================================
284 void BOP_SDFWESFiller::AssignStates(const Standard_Integer nF1,
285 const Standard_Integer nF2)
287 const BooleanOperations_ShapesDataStructure& aDS=myDSFiller->DS();
288 const BOPTools_PaveFiller& aPaveFiller=myDSFiller->PaveFiller();
289 BOPTools_PaveFiller* pPaveFiller=(BOPTools_PaveFiller*) &aPaveFiller;
290 const BOPTools_SplitShapesPool& aSplitShapesPool=aPaveFiller.SplitShapesPool();
292 Standard_Integer aBid=0, nSplit, nE, nW, nSp, anEdgeFlag, aWireFlag, aNbPB, iRankF1;
293 TColStd_ListOfInteger aList1IN2, aList1ON2;
294 TColStd_IndexedMapOfInteger aSpMapIN, aSpMapON;
295 TColStd_ListIteratorOfListOfInteger anIt;
297 iRankF1=aDS.Rank(nF1);
299 const TopoDS_Face& aF1=TopoDS::Face(aDS.Shape(nF1));
301 // Splits that are from nF2 and are IN2D for nF2
302 pPaveFiller->SplitsInFace (aBid, nF1, nF2, aList1IN2);
304 anIt.Initialize(aList1IN2);
305 for (; anIt.More(); anIt.Next()) {
307 aSpMapIN.Add(nSplit);
310 // that are from nF2 and are ON2D for nF2
311 pPaveFiller->SplitsOnFace (aBid, nF1, nF2, aList1ON2);
313 anIt.Initialize(aList1ON2);
314 for (; anIt.More(); anIt.Next()) {
316 aSpMapON.Add(nSplit);
319 // Treatment of the Face's entities
321 TopExp_Explorer anExpWire(aF1, TopAbs_WIRE);
322 for (; anExpWire.More(); anExpWire.Next()) {
323 const TopoDS_Shape& aWire=anExpWire.Current();
324 nW=aDS.ShapeIndex(aWire, iRankF1);
327 TopExp_Explorer anExpEdge (aWire, TopAbs_EDGE);
328 for (; anExpEdge.More(); anExpEdge.Next()) {
329 const TopoDS_Shape& anEdge=anExpEdge.Current();
330 nE=aDS.ShapeIndex(anEdge, iRankF1);
332 const BOPTools_ListOfPaveBlock& aLPB=aSplitShapesPool(aDS.RefEdge(nE));
336 // the whole edge is OUT
337 myStatesMap.Add(nE, BooleanOperations_OUT);
341 BOPTools_ListIteratorOfListOfPaveBlock aPBIt(aLPB);
343 for (; aPBIt.More(); aPBIt.Next()) {
344 const BOPTools_PaveBlock& aPB=aPBIt.Value();
347 if (aSpMapIN.Contains(nSp)) {// IN
348 myStatesMap.Add(nSp, BooleanOperations_IN);
351 else if (aSpMapON.Contains(nSp)) {// ON
352 myStatesMap.Add(nSp, BooleanOperations_ON);
355 else {// if (nSp!=nE) {// OUT
356 myStatesMap.Add(nSp, BooleanOperations_OUT);
359 } // enf of for (; anExpEdge.More(); anExpEdge.Next())
361 if (anEdgeFlag) {// all Wire is out
362 myStatesMap.Add(nW, BooleanOperations_OUT);
367 } // enf of for (; anExpEdge.More(); anExpEdge.Next())
369 if (aWireFlag) { // all Face is out of nF2
370 myStatesMap.Add(nF1, BooleanOperations_OUT);
374 //=======================================================================
375 // function: PrepareOnParts
377 //=======================================================================
378 void BOP_SDFWESFiller::PrepareOnParts ()
380 const BooleanOperations_ShapesDataStructure& aDS=myDSFiller->DS();
381 const BOPTools_PaveFiller& aPaveFiller=myDSFiller->PaveFiller();
382 BOPTools_PaveFiller* pPaveFiller=(BOPTools_PaveFiller*) &aPaveFiller;
383 BOPTools_CommonBlockPool& aCBPool=pPaveFiller->ChangeCommonBlockPool();
385 Standard_Integer aBid=0, nE1, nE2, aNbSpON, nSp1, nSp2, iRankF1;
386 Standard_Real aT1, aT2, aT, aTs; /*, U, V;*/
387 Standard_Boolean aFlag;
388 TColStd_ListOfInteger aLs;
389 TColStd_IndexedMapOfInteger aMap;
390 TopExp_Explorer anExpF1, anExpF2;
392 iRankF1=aDS.Rank(myNF1);
396 TopoDS_Face aF1FWD, aF2FWD;
397 PrepareFaces(myNF1, myNF2, aF1FWD, aF2FWD);
400 anExpF1.Init(aF1FWD, TopAbs_EDGE);
401 for (; anExpF1.More(); anExpF1.Next()) {
402 const TopoDS_Edge& anE1=TopoDS::Edge(anExpF1.Current());
404 if (BRep_Tool::Degenerated(anE1)){
408 nE1=aDS.ShapeIndex(anE1, iRankF1);
411 pPaveFiller->SplitsOnFace(nE1, myNF2, aLs);
413 aNbSpON=aLs.Extent();
419 TColStd_ListIteratorOfListOfInteger anItLs(aLs);
420 for (; anItLs.More(); anItLs.Next()) {
425 BOPTools_ListOfCommonBlock& aLCB=aCBPool(aDS.RefEdge(nE1));
426 BOPTools_ListIteratorOfListOfCommonBlock anItCB(aLCB);
427 for (; anItCB.More(); anItCB.Next()) {
428 BOPTools_CommonBlock& aCB=anItCB.Value();
429 BOPTools_PaveBlock& aPB1=aCB.PaveBlock1(nE1);
431 if (aMap.Contains(nSp1)) {
434 aPB1.Parameters(aT1, aT2);
435 aT=BOPTools_Tools2D::IntermediatePoint(aT1, aT2);
436 BOPTools_Tools::PointOnEdge(anE1, aT, aPx1);
438 BOPTools_PointBetween aPointBetween;
439 aPointBetween.SetParameter(aT);
440 aPointBetween.SetPnt(aPx1);
442 aPB1.SetPointBetween(aPointBetween);
445 BOPTools_PaveBlock& aPB2=aCB.PaveBlock2(nE1);
446 nE2=aPB2.OriginalEdge();
448 const TopoDS_Edge& anE2=TopoDS::Edge(aDS.GetShape(nE2));
450 const Handle(IntTools_Context)& aContext=pPaveFiller->Context();
451 aFlag=aContext->ProjectPointOnEdge(aPx1, anE2, aTs);
454 BOPTColStd_Dump::PrintMessage(" BOP_SDFWESFiller::PrepareOnParts() failed\n");
458 aPointBetween.SetParameter(aTs);
459 aPointBetween.SetPnt(aPx1);
461 aPB2.SetPointBetween(aPointBetween);
463 BOPTools_ListOfCommonBlock& aLCB2=aCBPool(aDS.RefEdge(nE2));
464 BOPTools_ListIteratorOfListOfCommonBlock anItCB2(aLCB2);
465 for (; anItCB2.More(); anItCB2.Next()){
466 BOPTools_CommonBlock& aCB2=anItCB2.Value();
467 BOPTools_PaveBlock& aPB21=aCB2.PaveBlock1(nE2);
468 BOPTools_PaveBlock& aPB22=aCB2.PaveBlock2(nE2);
470 if ((aPB21.IsEqual(aPB1) && aPB22.IsEqual(aPB2))
472 (aPB21.IsEqual(aPB2) && aPB22.IsEqual(aPB1))) {
474 aPointBetween.SetPnt(aPx1);
476 aPointBetween.SetParameter(aTs);
477 aPB21.SetPointBetween(aPointBetween);
479 aPointBetween.SetParameter(aT);
480 aPB22.SetPointBetween(aPointBetween);
491 //=======================================================================
492 // function: PrepareWESForZone
494 //=======================================================================
495 void BOP_SDFWESFiller::PrepareWESForZone (const Standard_Integer nF1,
496 const Standard_Integer nF2)
498 const BooleanOperations_ShapesDataStructure& aDS=myDSFiller->DS();
499 const BOPTools_PaveFiller& aPaveFiller=myDSFiller->PaveFiller();
500 const BOPTools_SplitShapesPool& aSplitShapesPool=aPaveFiller.SplitShapesPool();
501 BOP_WireEdgeSet& aWES=*myWES;
503 Standard_Integer nE, nSp, iRankF1, iRankF2;
505 TopAbs_Orientation anOr;
506 BooleanOperations_StateOfShape aState;
507 TopTools_IndexedMapOfOrientedShape aMap;
509 iRankF1=aDS.Rank(nF1);
510 iRankF2=aDS.Rank(nF2);
512 TopoDS_Face aF1FWD, aF2FWD;
513 PrepareFaces(nF1, nF2, aF1FWD, aF2FWD);
515 TopExp_Explorer anExp;
518 anExp.Init(aF1FWD, TopAbs_EDGE);
519 for (; anExp.More(); anExp.Next()) {
520 const TopoDS_Shape& anE=anExp.Current();
521 anOr=anE.Orientation();
523 nE=aDS.ShapeIndex(anE, iRankF1);
525 const BOPTools_ListOfPaveBlock& aLPB=aSplitShapesPool(aDS.RefEdge(nE));
526 BOPTools_ListIteratorOfListOfPaveBlock aPBIt(aLPB);
527 for (; aPBIt.More(); aPBIt.Next()) {
528 const BOPTools_PaveBlock& aPB=aPBIt.Value();
531 if (!myStatesMap.Contains(nSp)) {
535 aState=myStatesMap.FindFromKey(nSp);
537 if (aState==BooleanOperations_IN) {
539 const TopoDS_Shape& aSplit=aDS.Shape(nSp);
540 TopoDS_Edge aSS=TopoDS::Edge(aSplit);
541 aSS.Orientation(anOr);
543 if (aMap.Contains(aSS)) {
547 aWES.AddStartElement (aSS);
550 if (BRep_Tool::IsClosed(aSS, aF1FWD)){
551 TopoDS_Shape EE=aSS.Reversed();
552 aWES.AddStartElement (EE);
561 anExp.Init(aF2FWD, TopAbs_EDGE);
562 for (; anExp.More(); anExp.Next()) {
563 const TopoDS_Shape& anE=anExp.Current();
565 anOr=anE.Orientation();
567 nE=aDS.ShapeIndex(anE, iRankF2);
569 const BOPTools_ListOfPaveBlock& aLPB=aSplitShapesPool(aDS.RefEdge(nE));
571 BOPTools_ListIteratorOfListOfPaveBlock aPBIt(aLPB);
572 for (; aPBIt.More(); aPBIt.Next()) {
573 const BOPTools_PaveBlock& aPB=aPBIt.Value();
576 if (!myStatesMap.Contains(nSp)) {
580 aState=myStatesMap.FindFromKey(nSp);
582 if (aState==BooleanOperations_IN) {
583 const TopoDS_Shape& aSplit=aDS.Shape(nSp);
584 TopoDS_Edge aSS=TopoDS::Edge(aSplit);
586 if (!BOPTools_Tools2D::HasCurveOnSurface(aSS, aF1FWD)) {
590 aSS.Orientation(anOr);
592 if (aMap.Contains(aSS)) {
596 aWES.AddStartElement (aSS);
599 if (BRep_Tool::IsClosed(aSS, aF2FWD)){
600 TopoDS_Shape EE=aSS.Reversed();
601 aWES.AddStartElement (EE);
608 PrepareOnParts(nF1, nF2, BOP_COMMON);
611 //=======================================================================
612 // function: PrepareWESForCut
614 //=======================================================================
615 void BOP_SDFWESFiller::PrepareWESForCut (const Standard_Integer nF1,
616 const Standard_Integer nF2)
618 const BooleanOperations_ShapesDataStructure& aDS=myDSFiller->DS();
619 const BOPTools_PaveFiller& aPaveFiller=myDSFiller->PaveFiller();
620 const BOPTools_SplitShapesPool& aSplitShapesPool=aPaveFiller.SplitShapesPool();
621 BOP_WireEdgeSet& aWES=*myWES;
623 Standard_Integer nE, nSp, nPB, iRankF2;
624 TopAbs_Orientation anOr;
625 BooleanOperations_StateOfShape aState;
627 iRankF2=aDS.Rank(nF2);
630 TopoDS_Face aF1FWD, aF2FWD;
631 PrepareFaces(nF1, nF2, aF1FWD, aF2FWD);
635 TopExp_Explorer anExp;
638 anExp.Init(aF2FWD, TopAbs_EDGE);
639 for (; anExp.More(); anExp.Next()) {
640 const TopoDS_Shape& anE=anExp.Current();
641 anOr=anE.Orientation();
643 nE=aDS.ShapeIndex(anE, iRankF2);
645 const BOPTools_ListOfPaveBlock& aLPB=aSplitShapesPool(aDS.RefEdge(nE));
649 BOPTools_ListIteratorOfListOfPaveBlock aPBIt(aLPB);
650 for (; aPBIt.More(); aPBIt.Next()) {
651 const BOPTools_PaveBlock& aPB=aPBIt.Value();
654 if (!myStatesMap.Contains(nSp)) {
658 aState=myStatesMap.FindFromKey(nSp);
660 if (aState==BooleanOperations_IN) {
661 const TopoDS_Shape& aSplit=aDS.Shape(nSp);
662 TopoDS_Edge aSS=TopoDS::Edge(aSplit);
664 if (!BOPTools_Tools2D::HasCurveOnSurface(aSS, aF1FWD)) {
668 aSS.Orientation(anOr);
670 aWES.AddStartElement (aSS);
672 //modified by NIZNHY-PKV Tue Sep 25 14:25:13 2012f
673 if (IsClosed(aSS, aF2FWD)){
674 //if (BRep_Tool::IsClosed(aSS, aF2FWD)){
675 //modified by NIZNHY-PKV Tue Sep 25 14:25:35 2012t
676 TopoDS_Shape EE=aSS.Reversed();
677 aWES.AddStartElement (EE);
684 if (!myStatesMap.Contains(nE)) {
688 aState=myStatesMap.FindFromKey(nE);
689 if (aState==BooleanOperations_IN) {
690 TopoDS_Edge aSS=TopoDS::Edge(anE);
692 aWES.AddStartElement (aSS);
695 } // end of for (; anExp.More(); anExp.Next()) {
697 PrepareOnParts(nF1, nF2, BOP_CUT);
699 //=======================================================================
700 // function: PrepareOnParts
702 //=======================================================================
703 void BOP_SDFWESFiller::PrepareOnParts (const Standard_Integer nF1,
704 const Standard_Integer nF2,
705 const BOP_Operation anOperation)
707 const BooleanOperations_ShapesDataStructure& aDS=myDSFiller->DS();
708 const BOPTools_PaveFiller& aPaveFiller=myDSFiller->PaveFiller();
709 BOPTools_PaveFiller* pPaveFiller=(BOPTools_PaveFiller*) &aPaveFiller;
710 BOPTools_CommonBlockPool& aCBPool=pPaveFiller->ChangeCommonBlockPool();
711 BOP_WireEdgeSet& aWES=*myWES;
713 const Handle(IntTools_Context)& aContext=pPaveFiller->Context();
715 Standard_Integer nE1, nE2, aNbSpON, nSp1, aBid, nSpTaken, nSp2, iRankF1, iRankF2;
716 Standard_Real aT1, aT2, aU, aV, aScPr;
717 Standard_Boolean bToReverse, bInternal1, bInternal2, bAdded;
719 TopoDS_Edge aSS, aSSx;
720 TopoDS_Face aF1FWD, aF2FWD;
721 TopAbs_Orientation anOr, anOr2;
723 TColStd_ListOfInteger aLs;
724 TColStd_IndexedMapOfInteger aMap;
725 TopTools_IndexedMapOfShape aM;
726 TopTools_MapOfShape aMFence;//xft
728 gp_Vec aN1, aN2, aTau1, aTau2, aBiN1, aBiN2;
729 TopExp_Explorer anExpF1, anExpF2;
732 iRankF1=aDS.Rank(nF1);
733 iRankF2=aDS.Rank(nF2);
735 PrepareFaces(nF1, nF2, aF1FWD, aF2FWD);
737 myRejectedOnParts.Clear();//xft
739 anExpF1.Init(aF1FWD, TopAbs_EDGE);
740 for (; anExpF1.More(); anExpF1.Next()) {
741 const TopoDS_Edge& anE1=TopoDS::Edge(anExpF1.Current());
742 anOr=anE1.Orientation();
744 if (BRep_Tool::Degenerated(anE1)){
748 nE1=aDS.ShapeIndex(anE1, iRankF1);
750 anExpF2.Init(aF2FWD, TopAbs_EDGE);
751 for (; anExpF2.More(); anExpF2.Next()) {
752 const TopoDS_Edge& anE2=TopoDS::Edge(anExpF2.Current());
753 anOr2=anE2.Orientation();
755 if (BRep_Tool::Degenerated(anE2)){
759 nE2=aDS.ShapeIndex(anE2, iRankF2);
761 pPaveFiller->SplitsOnEdge(nE1, nE2, aLs);
763 aNbSpON=aLs.Extent();
769 TColStd_ListIteratorOfListOfInteger anItLs(aLs);
770 for (; anItLs.More(); anItLs.Next()) {
775 BOPTools_ListOfCommonBlock& aLCB=aCBPool(aDS.RefEdge(nE1));
776 BOPTools_ListIteratorOfListOfCommonBlock anItCB(aLCB);
777 for (; anItCB.More(); anItCB.Next()) {
778 bAdded=Standard_False;//xft
779 BOPTools_CommonBlock& aCB=anItCB.Value();
780 // Pave Block from which new edge will be taken
781 const BOPTools_PaveBlock& aPB=aCB.PaveBlock1();
783 const TopoDS_Shape& aSpTaken=aDS.Shape(nSpTaken);
785 BOPTools_PaveBlock& aPB1=aCB.PaveBlock1(nE1);
788 if (aMap.Contains(nSp1)) {
789 BOPTools_PaveBlock& aPB2=aCB.PaveBlock2(nE1);
793 //iiiiiiiiiiiiiiiii Tue Dec 25 15:10:09 2001 iiiiii
795 // Internal eges' processing
796 bInternal1=(anOr ==TopAbs_INTERNAL);
797 bInternal2=(anOr2==TopAbs_INTERNAL);
799 if (bInternal1 || bInternal2) {
800 aSS=TopoDS::Edge(aDS.Shape(nSpTaken));
802 if (bInternal1 && bInternal2) {
803 if (anOperation==BOP_COMMON) {
804 aWES.AddStartElement (aSS);
805 bAdded=Standard_True;//xft
810 if (bInternal1 && !bInternal2) {
811 if (nSpTaken==nSp1) {
812 aSS.Orientation(TopAbs_FORWARD);
813 aSSx=TopoDS::Edge(aDS.Shape(nSp2));
814 aSSx.Orientation(anOr2);
816 bToReverse=BOPTools_Tools3D::IsSplitToReverse1 (aSSx, aSS, aContext);
822 else {//nSpTaken!=nSp1
823 aSS.Orientation(anOr2);
827 else if (!bInternal1 && bInternal2) {
828 if (nSpTaken==nSp2) {
829 aSS.Orientation(TopAbs_FORWARD);
830 aSSx=TopoDS::Edge(aDS.Shape(nSp1));
831 aSSx.Orientation(anOr);
833 bToReverse=BOPTools_Tools3D::IsSplitToReverse1 (aSSx, aSS, aContext);
839 else {//nSpTaken!=nSp2
840 aSS.Orientation(anOr);
844 if (anOperation==BOP_COMMON) {
845 aWES.AddStartElement (aSS);
846 bAdded=Standard_True;//xft
848 if (anOperation==BOP_CUT) {
850 aWES.AddStartElement (aSS);
851 bAdded=Standard_True;//xft
857 //iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii
860 const BOPTools_PointBetween &aPbn1=aPB1.PointBetween();
861 aT1=aPbn1.Parameter();
862 BOPTools_Tools2D::EdgeTangent(anE1, aT1, aTau1);
864 BOPTools_Tools2D::PointOnSurface(anE1, aF1FWD, aT1, aU, aV);
865 BOPTools_Tools2D::FaceNormal(aF1FWD, aU, aV, aN1);
868 const BOPTools_PointBetween &aPbn2=aPB2.PointBetween();
869 aT2=aPbn2.Parameter();
870 BOPTools_Tools2D::EdgeTangent(anE2, aT2, aTau2);
872 BOPTools_Tools2D::PointOnSurface(anE2, aF2FWD, aT2, aU, aV);
873 BOPTools_Tools2D::FaceNormal(aF2FWD, aU, aV, aN2);
879 if (anOperation==BOP_CUT) {
881 if (nSpTaken==nSp1) {
882 aSS=TopoDS::Edge(aDS.GetShape(nSp1));
883 aSS.Orientation(anOr);
887 const TopoDS_Shape& aSp1=aDS.Shape(nSp1);
888 TopoDS_Edge aSpE1=TopoDS::Edge(aSp1);
889 aSpE1.Orientation(anOr);
891 const TopoDS_Shape& aSp2=aDS.Shape(nSp2);
892 TopoDS_Edge aSpE2=TopoDS::Edge(aSp2);
894 bToReverse=BOPTools_Tools3D::IsSplitToReverse1 (aSpE1, aSpE2, aContext);
901 // modified by NIZHNY-MKK Thu May 29 12:39:32 2003.BEGIN
902 if (BRep_Tool::IsClosed(anE1, aF1FWD) && (!aSS.IsSame(anE1))) {
903 Standard_Boolean areverse = Standard_False;
904 BOPTools_Tools3D::DoSplitSEAMOnFace(aSS, anE1, aF1FWD, areverse);
907 if(BRep_Tool::IsClosed(anE2, aF2FWD) && (!aSS.IsSame(anE2))) {
908 Standard_Boolean areverse = Standard_False;
909 BOPTools_Tools3D::DoSplitSEAMOnFace(aSS, anE2, aF2FWD, areverse);
911 // modified by NIZHNY-MKK Thu May 29 12:39:35 2003.END
913 if (BRep_Tool::IsClosed(anE1, aF1FWD) &&
914 BRep_Tool::IsClosed(anE2, aF2FWD)){
916 Standard_Boolean bIsTakenSp1;
917 TopoDS_Edge aSpE1Seam11, aSpE1Seam21;
919 bIsTakenSp1=(nSpTaken==nSp1);
920 aSpE1Seam11=TopoDS::Edge(aDS.Shape(nSp1));
921 aSpE1Seam21=TopoDS::Edge(aDS.Shape(nSp2));
923 if (aM.Contains(aSpE1Seam11)){
928 if (aM.Contains(aSpE1Seam21)){
933 TreatSDSeams (aSpE1Seam11, aT1, aF1FWD,
934 aSpE1Seam21, aT2, aF2FWD,
941 aWES.AddStartElement (aSS);
942 bAdded=Standard_True;//xft
948 if (anOperation==BOP_COMMON) {
950 if (nSpTaken==nSp1) {
951 aSS=TopoDS::Edge(aDS.GetShape(nSp1));
952 aSS.Orientation(anOr);
956 const TopoDS_Shape& aSp1=aDS.Shape(nSp1);
957 TopoDS_Edge aSpE1=TopoDS::Edge(aSp1);
958 aSpE1.Orientation(anOr);
960 const TopoDS_Shape& aSp2=aDS.Shape(nSp2);
961 TopoDS_Edge aSpE2=TopoDS::Edge(aSp2);
963 bToReverse=BOPTools_Tools3D::IsSplitToReverse1 (aSpE1, aSpE2, aContext);
970 if (BRep_Tool::IsClosed(aSpE1, aF1FWD)) {
972 if (aM.Contains(aSpE2)){
977 if (!BRep_Tool::IsClosed(aSpE2, aF1FWD)) {
978 BOPTools_Tools3D::DoSplitSEAMOnFace (aSpE2, aF1FWD);
980 aWES.AddStartElement (aSpE2);
982 aWES.AddStartElement (aSpE2);
983 bAdded=Standard_True; //xft
989 aWES.AddStartElement (aSS);
990 bAdded=Standard_True; //xft
991 }// if (anOperation==BOP_COMMON) {
994 if(aMFence.Add(aSpTaken)) {
995 myRejectedOnParts.Append(aSpTaken);
998 }// if (aMap.Contains(nSp1)) {
999 }// for (; anItCB.More(); anItCB.Next()) {
1000 }// for (; anExpF2.More(); anExpF2.Next()) {
1001 }//for (; anExpF1.More(); anExpF1.Next()) {
1004 //=======================================================================
1005 // function: PrepareFaces
1007 //=======================================================================
1008 void BOP_SDFWESFiller::PrepareFaces (const Standard_Integer nF1,
1009 const Standard_Integer nF2,
1010 TopoDS_Face& aF1FWD,
1011 TopoDS_Face& aF2FWD) const
1013 const BooleanOperations_ShapesDataStructure& aDS=myDSFiller->DS();
1014 TopAbs_Orientation anOr1, anOr2;
1016 const TopoDS_Shape& aF1=aDS.GetShape(nF1);
1017 aF1FWD=TopoDS::Face(aF1);
1018 anOr1=aF1.Orientation();
1020 const TopoDS_Shape& aF2=aDS.GetShape(nF2);
1021 aF2FWD=TopoDS::Face(aF2);
1022 anOr2=aF2.Orientation();
1024 aF1FWD.Orientation(TopAbs_FORWARD);
1026 if (mySenseFlag==1) {
1027 if (anOr1==TopAbs_FORWARD && anOr2==TopAbs_FORWARD) {
1028 aF2FWD.Orientation(TopAbs_FORWARD);
1030 else if (anOr1==TopAbs_REVERSED && anOr2==TopAbs_REVERSED) {
1031 aF2FWD.Orientation(TopAbs_FORWARD);
1033 else if (anOr1==TopAbs_FORWARD && anOr2==TopAbs_REVERSED) {
1034 aF2FWD.Orientation(TopAbs_REVERSED);
1036 else if (anOr1==TopAbs_REVERSED && anOr2==TopAbs_FORWARD) {
1037 aF2FWD.Orientation(TopAbs_REVERSED);
1042 if (anOr1==TopAbs_FORWARD && anOr2==TopAbs_FORWARD) {
1043 aF2FWD.Orientation(TopAbs_REVERSED);
1045 else if (anOr1==TopAbs_REVERSED && anOr2==TopAbs_REVERSED) {
1046 aF2FWD.Orientation(TopAbs_REVERSED);
1048 else if (anOr1==TopAbs_FORWARD && anOr2==TopAbs_REVERSED) {
1049 aF2FWD.Orientation(TopAbs_FORWARD);
1051 else if (anOr1==TopAbs_REVERSED && anOr2==TopAbs_FORWARD) {
1052 aF2FWD.Orientation(TopAbs_FORWARD);
1057 //=======================================================================
1058 // function: AssignDEStates
1060 //=======================================================================
1061 void BOP_SDFWESFiller::AssignDEStates(const Standard_Integer nF1,
1062 const Standard_Integer nF2)
1064 const BooleanOperations_ShapesDataStructure& aDS=myDSFiller->DS();
1066 Standard_Integer nE1, iRankF1;
1067 TopExp_Explorer anExpF1;
1069 iRankF1=aDS.Rank(nF1);
1071 const TopoDS_Face& aF1=TopoDS::Face(aDS.Shape(nF1));
1073 anExpF1.Init(aF1, TopAbs_EDGE);
1074 for (; anExpF1.More(); anExpF1.Next()) {
1075 const TopoDS_Edge& anE1=TopoDS::Edge(anExpF1.Current());
1077 if (!BRep_Tool::Degenerated(anE1)){
1081 nE1=aDS.ShapeIndex(anE1, iRankF1);
1082 AssignDEStates (nF1, nE1, nF2);
1086 //=======================================================================
1087 // function: AssignDEStates
1089 //=======================================================================
1090 void BOP_SDFWESFiller::AssignDEStates(const Standard_Integer nFD,
1091 const Standard_Integer nED,
1092 const Standard_Integer nF2)
1094 const BooleanOperations_ShapesDataStructure& aDS=myDSFiller->DS();
1095 const BOPTools_PaveFiller& aPaveFiller=myDSFiller->PaveFiller();
1096 BOPTools_PaveFiller* pPaveFiller=(BOPTools_PaveFiller*) &aPaveFiller;
1097 const BOPTools_SplitShapesPool& aSplitShapesPool=aPaveFiller.SplitShapesPool();
1099 const BOPTools_ListOfPaveBlock& aSplitEdges=aSplitShapesPool(aDS.RefEdge(nED));
1101 const Handle(IntTools_Context)& aContext=pPaveFiller->Context();
1102 const TopoDS_Edge& aDE=TopoDS::Edge(aDS.Shape(nED));
1103 const TopoDS_Face& aDF=TopoDS::Face(aDS.Shape(nFD));
1104 const TopoDS_Face& aFaceReference=TopoDS::Face(aDS.Shape(nF2));
1106 Standard_Boolean bIsValidPoint;
1107 Standard_Integer nSp;
1108 Standard_Real aT, aT1, aT2;
1109 TopAbs_State aState;
1115 aF.Orientation(TopAbs_FORWARD);
1117 BOPTools_ListIteratorOfListOfPaveBlock aPBIt(aSplitEdges);
1118 for (; aPBIt.More(); aPBIt.Next()) {
1119 BOPTools_PaveBlock& aPB=aPBIt.Value();
1122 const TopoDS_Edge& aSp=TopoDS::Edge(aDS.Shape(nSp));
1124 aPB.Parameters(aT1, aT2);
1125 aT=IntTools_Tools::IntermediatePoint(aT1, aT2);
1127 TopoDS_Edge aDERight, aSpRight;
1131 BOPTools_Tools3D::OrientEdgeOnFace (aDE, aF, aDERight);
1132 aSpRight.Orientation(aDERight.Orientation());
1134 BOPTools_Tools3D::PointNearEdge(aSpRight, aDF, aT, aPx2DNear, aPxNear);
1138 bIsValidPoint=aContext->IsValidPointForFace(aPxNear, aFaceReference, 1.e-3);
1140 if (bIsValidPoint) {
1144 BooleanOperations_StateOfShape aSt;
1146 aSt=BOPTools_SolidStateFiller::ConvertState(aState);
1147 if (myStatesMap.Contains(nSp)) {
1148 BooleanOperations_StateOfShape& aBooState=myStatesMap.ChangeFromKey(nSp);
1152 myStatesMap.Add(nSp, aSt);
1157 //=======================================================================
1158 // function: UpdateDEStates3D
1160 //=======================================================================
1161 void BOP_SDFWESFiller::UpdateDEStates3D()
1163 BooleanOperations_ShapesDataStructure* pDS=
1164 (BooleanOperations_ShapesDataStructure*)&myDSFiller->DS();
1166 Standard_Integer i, aNb, nSp;
1167 BooleanOperations_StateOfShape aSt;
1169 aNb=myStatesMap.Extent();
1170 for (i=1; i<=aNb; i++) {
1171 nSp=myStatesMap.FindKey(i);
1172 aSt=pDS->GetState(nSp);
1173 aSt=BooleanOperations_UNKNOWN;
1174 pDS->SetState(nSp, aSt);
1178 #include <Geom2d_Curve.hxx>
1179 #include <gp_Pnt2d.hxx>
1181 //=======================================================================
1182 // function: TreatSDSeams
1184 //=======================================================================
1185 void TreatSDSeams (const TopoDS_Edge& aSpE1Seam11,
1186 const Standard_Real aT1,
1187 const TopoDS_Face& aF1FWD,
1189 const TopoDS_Edge& aSpE1Seam21,
1190 const Standard_Real aT2,
1191 const TopoDS_Face& aF2FWD,
1193 const Standard_Boolean bIsTakenSp1,
1194 BOP_WireEdgeSet& aWES,
1195 const Handle(IntTools_Context)& aContext)
1197 Standard_Boolean bIsValidSeam11, bIsValidSeam12,
1198 bIsValidSeam21, bIsValidSeam22;
1199 Standard_Real aScPr;
1200 TopoDS_Edge aSS, aSpE1Seam12,aSpE1Seam22;
1201 gp_Dir aDB11, aDB12, aDB21, aDB22;
1203 aSpE1Seam12=TopoDS::Edge(aSpE1Seam11.Reversed());
1204 aSpE1Seam22=TopoDS::Edge(aSpE1Seam21.Reversed());
1207 BOPTools_Tools3D::DoSplitSEAMOnFace (aSpE1Seam21, aF1FWD);
1208 aSpE1Seam22=TopoDS::Edge(aSpE1Seam21.Reversed());
1211 bIsValidSeam11=IsValidSeam(aSpE1Seam11, aF1FWD, aT1, aContext);
1212 bIsValidSeam12=IsValidSeam(aSpE1Seam12, aF1FWD, aT1, aContext);
1213 bIsValidSeam21=IsValidSeam(aSpE1Seam21, aF2FWD, aT2, aContext);
1214 bIsValidSeam22=IsValidSeam(aSpE1Seam22, aF2FWD, aT2, aContext);
1216 if (bIsValidSeam11 && bIsValidSeam12) {
1217 BOPTools_Tools3D::GetBiNormal(aSpE1Seam11, aF1FWD, aT1, aDB11);
1218 BOPTools_Tools3D::GetBiNormal(aSpE1Seam12, aF1FWD, aT1, aDB12);
1220 if (bIsValidSeam21 && !bIsValidSeam22) {
1221 BOPTools_Tools3D::GetBiNormal(aSpE1Seam21, aF2FWD, aT2, aDB21);
1229 CorrespondantSeam(aSpE1Seam11, aT1,
1230 aSpE1Seam21, aSpE1Seam22, aT2,
1234 else { //if (aScPr>0.)
1240 CorrespondantSeam(aSpE1Seam12, aT1,
1241 aSpE1Seam21, aSpE1Seam22, aT2,
1245 aWES.AddStartElement (aSS);
1246 } //if (bIsValidSeam21 && !bIsValidSeam22)
1249 if (!bIsValidSeam21 && bIsValidSeam22) {
1250 BOPTools_Tools3D::GetBiNormal(aSpE1Seam22, aF2FWD, aT2, aDB22);
1258 CorrespondantSeam(aSpE1Seam11, aT1,
1259 aSpE1Seam21, aSpE1Seam22, aT2,
1263 else {//if (aScPr>0.)
1269 CorrespondantSeam(aSpE1Seam12, aT1,
1270 aSpE1Seam21, aSpE1Seam22, aT2,
1274 aWES.AddStartElement (aSS);
1275 }// if (!bIsValidSeam21 && bIsValidSeam22)
1276 } //if (bIsValidSeam11 && bIsValidSeam12)
1279 //=======================================================================
1280 // function: IsValidSeam
1282 //=======================================================================
1283 Standard_Boolean IsValidSeam(const TopoDS_Edge& aE,
1284 const TopoDS_Face& aF,
1285 const Standard_Real aT,
1286 const Handle(IntTools_Context)& aContext)
1288 Standard_Boolean bIsPointInOnFace;
1292 BOPTools_Tools3D::PointNearEdge(aE, aF, aT, aPx2DNear, aPxNear);
1294 bIsPointInOnFace=aContext->IsPointInOnFace(aF, aPx2DNear);
1295 return bIsPointInOnFace;
1297 //=======================================================================
1298 // function: CorrespondantSeam
1300 //=======================================================================
1301 void CorrespondantSeam(const TopoDS_Edge& aSpE1Seam11,
1302 const Standard_Real aT1,
1303 const TopoDS_Edge& aSpE1Seam21,
1304 const TopoDS_Edge& aSpE1Seam22,
1305 const Standard_Real aT2,
1306 const TopoDS_Face& aF1FWD,
1310 Standard_Real a, b, aD1121, aD1122, aTol=1.e-7;
1311 Handle(Geom2d_Curve) aC2DSeam11, aC2DSeam21, aC2DSeam22;
1312 gp_Pnt2d aP2D11, aP2D21, aP2D22;
1314 aC2DSeam11=BRep_Tool::CurveOnSurface(aSpE1Seam11, aF1FWD, a, b);
1315 aC2DSeam11->D0(aT1, aP2D11);
1317 aC2DSeam21=BRep_Tool::CurveOnSurface(aSpE1Seam21, aF1FWD, a, b);
1318 aC2DSeam21->D0(aT2, aP2D21);
1320 aC2DSeam22=BRep_Tool::CurveOnSurface(aSpE1Seam22, aF1FWD, a, b);
1321 aC2DSeam22->D0(aT2, aP2D22);
1323 aD1121=aP2D11.Distance(aP2D21);
1324 aD1122=aP2D11.Distance(aP2D22);
1331 //modified by NIZNHY-PKV Tue Sep 25 14:25:53 2012f
1332 //=======================================================================
1333 //function : IsClosed
1335 //=======================================================================
1336 Standard_Boolean IsClosed(const TopoDS_Edge& aE,
1337 const TopoDS_Face& aF)
1339 Standard_Boolean bRet;
1341 bRet=BRep_Tool::IsClosed(aE, aF);
1343 Standard_Integer iCnt;
1348 TopExp_Explorer aExp(aF, TopAbs_EDGE);
1349 for (; aExp.More(); aExp.Next()) {
1350 const TopoDS_Shape& aEx=aExp.Current();
1352 if (aEx.IsSame(aE)) {
1367 //modified by NIZNHY-PKV Tue Sep 25 14:25:56 2012t