1 // Created by: Peter KURNEV
2 // Copyright (c) 1999-2014 OPEN CASCADE SAS
4 // This file is part of Open CASCADE Technology software library.
6 // This library is free software; you can redistribute it and/or modify it under
7 // the terms of the GNU Lesser General Public License version 2.1 as published
8 // by the Free Software Foundation, with special exception defined in the file
9 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
10 // distribution for complete text of the license and disclaimer of any warranty.
12 // Alternatively, this file may be used under the terms of Open CASCADE
13 // commercial license or contractual agreement.
15 #include <BOPTools_AlgoTools.ixx>
17 #include <Precision.hxx>
20 #include <TopoDS_Vertex.hxx>
21 #include <TopoDS_Edge.hxx>
25 #include <Geom_Curve.hxx>
26 #include <IntTools_Curve.hxx>
27 #include <BRepBuilderAPI_MakeEdge.hxx>
28 #include <BRepAdaptor_Curve.hxx>
29 #include <GeomAbs_CurveType.hxx>
31 #include <BRep_Tool.hxx>
32 #include <BRep_Builder.hxx>
33 #include <TopoDS_Iterator.hxx>
36 void TreatCompound(const TopoDS_Shape& theC1,
37 BOPCol_ListOfShape& theLSX);
39 //=======================================================================
40 // function: UpdateVertex
42 //=======================================================================
43 void BOPTools_AlgoTools::UpdateVertex
44 (const TopoDS_Vertex& aVF,
45 const TopoDS_Vertex& aNewVertex)
47 Standard_Real aTolVF, aTolNewVertex, aDist, aDTol=1.e-12, aNewTol;
49 gp_Pnt aPVF=BRep_Tool::Pnt(aVF);
50 gp_Pnt aPNewVertex=BRep_Tool::Pnt(aNewVertex);
51 aTolVF=BRep_Tool::Tolerance(aVF);
52 aTolNewVertex=BRep_Tool::Tolerance(aNewVertex);
54 aDist=aPVF.Distance(aPNewVertex);
55 aNewTol=aDist+aTolNewVertex;
59 BB.UpdateVertex (aVF, aNewTol+aDTol);
63 //=======================================================================
64 // function: UpdateVertex
66 //=======================================================================
67 void BOPTools_AlgoTools::UpdateVertex (const TopoDS_Edge& aE,
68 const Standard_Real aT,
69 const TopoDS_Vertex& aV)
71 Standard_Real aTolV, aDist, aDTol=1.e-12, aFirst, aLast;
74 gp_Pnt aPv=BRep_Tool::Pnt(aV);
75 aTolV=BRep_Tool::Tolerance(aV);
77 GeomAdaptor_Curve aCA( BRep_Tool::Curve(aE, aFirst, aLast) );
79 aDist=aPv.Distance(aPc);
82 BB.UpdateVertex (aV, aDist+aDTol);
86 //=======================================================================
87 // function: UpdateVertex
89 //=======================================================================
90 void BOPTools_AlgoTools::UpdateVertex (const IntTools_Curve& aC,
91 const Standard_Real aT,
92 const TopoDS_Vertex& aV)
94 Standard_Real aTolV, aDist, aDTol=1.e-12;
97 gp_Pnt aPv=BRep_Tool::Pnt(aV);
98 aTolV=BRep_Tool::Tolerance(aV);
100 GeomAdaptor_Curve aCA( aC.Curve() );
102 aDist=aPv.Distance(aPc);
105 BB.UpdateVertex (aV, aDist+aDTol);
108 //=======================================================================
109 // function: MakeSectEdge
111 //=======================================================================
112 void BOPTools_AlgoTools::MakeSectEdge(const IntTools_Curve& aIC,
113 const TopoDS_Vertex& aV1,
114 const Standard_Real aP1,
115 const TopoDS_Vertex& aV2,
116 const Standard_Real aP2,
117 TopoDS_Edge& aNewEdge)
119 Handle(Geom_Curve) aC=aIC.Curve ();
121 BRepBuilderAPI_MakeEdge aMakeEdge(aC, aV1, aV2, aP1, aP2);
123 const TopoDS_Edge& aE=TopoDS::Edge(aMakeEdge.Shape());
125 // Range must be as it was !
127 aBB.Range (aE, aP1, aP2);
133 //=======================================================================
134 // function: MakeSplitEdge
136 //=======================================================================
137 void BOPTools_AlgoTools::MakeSplitEdge(const TopoDS_Edge& aE,
138 const TopoDS_Vertex& aV1,
139 const Standard_Real aP1,
140 const TopoDS_Vertex& aV2,
141 const Standard_Real aP2,
142 TopoDS_Edge& aNewEdge)
144 Standard_Real aTol;//f, l,
145 aTol=BRep_Tool::Tolerance(aE);
153 BB.Range(E, aP1, aP2);
154 BB.UpdateEdge(E, aTol);
158 //=======================================================================
159 // function: MakeNewVertex
161 //=======================================================================
162 void BOPTools_AlgoTools::MakeNewVertex(const TopoDS_Vertex& aV1,
163 const TopoDS_Vertex& aV2,
164 TopoDS_Vertex& aNewVertex)
166 gp_Pnt aPnt1=BRep_Tool::Pnt(aV1);
167 Standard_Real aTol1=BRep_Tool::Tolerance(aV1);
169 gp_Pnt aPnt2=BRep_Tool::Pnt(aV2);
170 Standard_Real aTol2=BRep_Tool::Tolerance(aV2);
172 Standard_Real aMaxTol, aDist;
174 aDist=aPnt1.Distance(aPnt2);
175 aMaxTol=(aTol1>aTol2)? aTol1 : aTol2;
176 aMaxTol=aMaxTol+0.5*aDist;
178 const gp_XYZ& aXYZ1=aPnt1.XYZ();
179 const gp_XYZ& aXYZ2=aPnt2.XYZ();
180 gp_XYZ aNewXYZ=0.5*(aXYZ1+aXYZ2);
182 gp_Pnt aNewPnt(aNewXYZ);
184 aBB.MakeVertex (aNewVertex, aNewPnt, aMaxTol);
186 //=======================================================================
187 // function: MakeNewVertex
189 //=======================================================================
190 void BOPTools_AlgoTools::MakeNewVertex(const gp_Pnt& aP,
191 const Standard_Real aTol,
192 TopoDS_Vertex& aNewVertex)
195 aBB.MakeVertex (aNewVertex, aP, aTol);
198 //=======================================================================
199 // function: MakeNewVertex
201 //=======================================================================
202 void BOPTools_AlgoTools::MakeNewVertex(const TopoDS_Edge& aE1,
203 const Standard_Real aParm1,
204 const TopoDS_Edge& aE2,
205 const Standard_Real aParm2,
206 TopoDS_Vertex& aNewVertex)
208 Standard_Real aTol1, aTol2, aMaxTol, aDist;
211 PointOnEdge (aE1, aParm1, aPnt1);
212 PointOnEdge (aE2, aParm2, aPnt2);
214 aTol1=BRep_Tool::Tolerance(aE1);
215 aTol2=BRep_Tool::Tolerance(aE2);
217 aDist=aPnt1.Distance(aPnt2);
218 aMaxTol=(aTol1>aTol2)? aTol1 : aTol2;
219 aMaxTol=aMaxTol+0.5*aDist;
221 const gp_XYZ& aXYZ1=aPnt1.XYZ();
222 const gp_XYZ& aXYZ2=aPnt2.XYZ();
223 gp_XYZ aNewXYZ=0.5*(aXYZ1+aXYZ2);
225 gp_Pnt aNewPnt(aNewXYZ);
227 aBB.MakeVertex (aNewVertex, aNewPnt, aMaxTol);
229 //=======================================================================
230 // function: MakeNewVertex
232 //=======================================================================
233 void BOPTools_AlgoTools::MakeNewVertex(const TopoDS_Edge& aE1,
234 const Standard_Real aParm1,
235 const TopoDS_Face& aF1,
236 TopoDS_Vertex& aNewVertex)
238 Standard_Real aTol1, aTol2, aMaxTol, delta=1.e-12;
241 PointOnEdge (aE1, aParm1, aPnt);
243 aTol1=BRep_Tool::Tolerance(aE1);
244 aTol2=BRep_Tool::Tolerance(aF1);
246 //aMaxTol=(aTol1>aTol2)? aTol1 : aTol2;
247 aMaxTol=aTol1+aTol2+delta;
250 aBB.MakeVertex (aNewVertex, aPnt, aMaxTol);
253 //=======================================================================
254 // function: PointOnEdge
256 //=======================================================================
257 void BOPTools_AlgoTools::PointOnEdge(const TopoDS_Edge& aE,
258 const Standard_Real aParm,
262 Handle(Geom_Curve) C1=BRep_Tool::Curve(aE, f, l);
266 //=======================================================================
267 //function : CorrectRange
269 //=======================================================================
270 void BOPTools_AlgoTools::CorrectRange(const TopoDS_Edge& aE1,
271 const TopoDS_Edge& aE2,
272 const IntTools_Range& aSR,
273 IntTools_Range& aNewSR)
276 Standard_Real aRes, aTolE1, aTolE2, aTF, aTL, dT;
277 BRepAdaptor_Curve aBC;
278 GeomAbs_CurveType aCT;
286 if (aCT==GeomAbs_Line) {
290 dT=Precision::PConfusion();
294 aTolE1=BRep_Tool::Tolerance(aE1);
295 aTolE2=BRep_Tool::Tolerance(aE2);
298 aRes = 2.*(aTolE1 + aTolE2);
300 if (aCT==GeomAbs_BezierCurve ||
301 aCT==GeomAbs_BSplineCurve||
302 aCT==GeomAbs_OtherCurve) {
305 aBC.D1 (aTF, aP, aDer);
308 aBC.D1 (aTL, aP, aDer);
311 Standard_Real aMgn = aDer.Magnitude();
317 aRes = aBC.Resolution(aRes);
319 } // if (aCT==GeomAbs_BezierCurve||...
321 aRes = aBC.Resolution(aRes);
325 aNewSR.SetFirst (aTF+aRes);
328 aNewSR.SetLast (aTL-aRes);
331 if ((aNewSR.Last()-aNewSR.First()) < dT) {
334 //aNewSR=((aNewSR.Last()-aNewSR.First()) < dT) ? aSR : aNewSR;
338 //=======================================================================
339 //function : CorrectRange
341 //=======================================================================
342 void BOPTools_AlgoTools::CorrectRange(const TopoDS_Edge& aE,
343 const TopoDS_Face& aF,
344 const IntTools_Range& aSR,
345 IntTools_Range& aNewSR)
348 Standard_Real aRes, aTolF, aTF, aTL, dT;
349 BRepAdaptor_Curve aBC;
350 GeomAbs_CurveType aCT;
356 dT=Precision::PConfusion();
363 aTolF=BRep_Tool::Tolerance(aF);
368 if (aCT==GeomAbs_BezierCurve ||
369 aCT==GeomAbs_BSplineCurve||
370 aCT==GeomAbs_OtherCurve) {
373 aBC.D1 (aTF, aP, aDer);
376 aBC.D1 (aTL, aP, aDer);
379 Standard_Real aMgn = aDer.Magnitude();
385 aRes = aBC.Resolution(aRes);
387 } // if (aCT==GeomAbs_BezierCurve||...
389 aRes = aBC.Resolution(aRes);
393 aNewSR.SetFirst (aTF+aRes);
396 aNewSR.SetLast (aTL-aRes);
399 if ((aNewSR.Last()-aNewSR.First()) < dT) {
404 //=======================================================================
405 //function : Dimension
407 //=======================================================================
408 Standard_Integer BOPTools_AlgoTools::Dimension(const TopoDS_Shape& theS)
410 Standard_Integer i, iRet, iRx0 = 0, iRx = 0;
411 TopAbs_ShapeEnum aTS;
412 BOPCol_ListOfShape aLS;
413 BOPCol_ListIteratorOfListOfShape aIt;
415 aTS=theS.ShapeType();
416 if (aTS!=TopAbs_COMPOUND) {
427 case TopAbs_COMPSOLID:
437 TreatCompound(theS, aLS);
439 iRet = -2; //empty compound
443 for (i=0; aIt.More(); aIt.Next()) {
444 const TopoDS_Shape& aSx=aIt.Value();
458 //=======================================================================
459 //function : TreatCompound
461 //=======================================================================
462 void TreatCompound(const TopoDS_Shape& theC1,
463 BOPCol_ListOfShape& theLSX)
465 Standard_Integer aNbC1;
466 TopAbs_ShapeEnum aType;
467 BOPCol_ListOfShape aLC, aLC1;
468 BOPCol_ListIteratorOfListOfShape aIt, aIt1;
469 TopoDS_Iterator aItC;
475 for (; aIt.More(); aIt.Next()) {
476 const TopoDS_Shape& aC=aIt.Value(); //C is compound
479 for (; aItC.More(); aItC.Next()) {
480 const TopoDS_Shape& aS=aItC.Value();
481 aType=aS.ShapeType();
482 if (aType==TopAbs_COMPOUND) {
497 aIt.Initialize(aLC1);
498 for (; aIt.More(); aIt.Next()) {
499 const TopoDS_Shape& aSC=aIt.Value();