1 // Created on: 2000-11-16
2 // Created by: Peter KURNEV
3 // Copyright (c) 2000-2014 OPEN CASCADE SAS
5 // This file is part of Open CASCADE Technology software library.
7 // This library is free software; you can redistribute it and / or modify it
8 // under the terms of the GNU Lesser General Public version 2.1 as published
9 // by the Free Software Foundation, with special exception defined in the file
10 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
11 // distribution for complete text of the license and disclaimer of any warranty.
13 // Alternatively, this file may be used under the terms of Open CASCADE
14 // commercial license or contractual agreement.
16 #include <IntTools_Tools.ixx>
18 #include <Precision.hxx>
20 #include <TopExp_Explorer.hxx>
21 #include <TopTools_IndexedDataMapOfShapeShape.hxx>
24 #include <TopoDS_Shape.hxx>
25 #include <TopoDS_Vertex.hxx>
26 #include <TopoDS_Edge.hxx>
27 #include <TopoDS_Face.hxx>
28 #include <TopoDS_Wire.hxx>
29 #include <TopLoc_Location.hxx>
31 #include <BRep_Builder.hxx>
32 #include <BRep_Tool.hxx>
33 #include <BRepAdaptor_Surface.hxx>
34 #include <BRepAdaptor_Curve.hxx>
35 #include <BRepAdaptor_Surface.hxx>
38 #include <gp_Pnt2d.hxx>
44 #include <Geom_Curve.hxx>
45 #include <GeomAdaptor_Surface.hxx>
46 #include <Geom_Surface.hxx>
47 #include <GeomAPI_ProjectPointOnSurf.hxx>
48 #include <GeomAPI_ProjectPointOnCurve.hxx>
49 #include <GeomAdaptor_Curve.hxx>
50 #include <GeomAbs_CurveType.hxx>
51 #include <Geom_Line.hxx>
52 #include <Geom2d_Curve.hxx>
53 #include <Geom_BoundedCurve.hxx>
54 #include <Geom_Geometry.hxx>
55 #include <Geom_TrimmedCurve.hxx>
56 #include <Geom2d_TrimmedCurve.hxx>
58 #include <IntTools_FClass2d.hxx>
59 #include <IntTools_Curve.hxx>
60 #include <IntTools_SequenceOfCurves.hxx>
63 void ParabolaTolerance(const Handle(Geom_Curve)& ,
70 //=======================================================================
71 //function : HasInternalEdge
73 //=======================================================================
74 Standard_Boolean IntTools_Tools::HasInternalEdge(const TopoDS_Wire& aW)
76 Standard_Boolean bFlag=Standard_True;
78 TopExp_Explorer anExp(aW, TopAbs_EDGE);
79 for (; anExp.More(); anExp.Next()) {
80 const TopoDS_Edge& aE=TopoDS::Edge(anExp.Current());
81 TopAbs_Orientation anOr=aE.Orientation();
82 if (anOr==TopAbs_INTERNAL) {
89 //=======================================================================
92 //=======================================================================
93 Standard_Boolean IntTools_Tools::IsClosed (const Handle(Geom_Curve)& aC3D)
95 Standard_Boolean bRet;
96 Standard_Real aF, aL, aDist, aPC;
99 Handle (Geom_BoundedCurve) aGBC=
100 Handle (Geom_BoundedCurve)::DownCast(aC3D);
102 return Standard_False;
105 aF=aC3D->FirstParameter();
106 aL=aC3D-> LastParameter();
113 //modified by NIZNHY-PKV Mon Jul 04 11:58:23 2011f
114 aPC=Precision::Confusion();
116 aDist=aP1.SquareDistance(aP2);
120 //aDist=aP1.Distance(aP2);
121 //return (aDist < Precision::Confusion());
122 //modified by NIZNHY-PKV Mon Jul 04 11:59:50 2011t
125 //=======================================================================
126 //function : RejectLines
128 //=======================================================================
129 void IntTools_Tools::RejectLines(const IntTools_SequenceOfCurves& aSIn,
130 IntTools_SequenceOfCurves& aSOut)
132 Standard_Integer i, j, aNb;
133 Standard_Boolean bFlag;
134 Handle (Geom_Curve) aC3D;
141 for (i=1; i<=aNb; i++) {
142 const IntTools_Curve& IC=aSIn(i);
145 Handle (Geom_TrimmedCurve) aGTC=
146 Handle (Geom_TrimmedCurve)::DownCast(aC3D);
148 if (!aGTC.IsNull()) {
149 aC3D=aGTC->BasisCurve();
150 IntTools_Curve* pIC=(IntTools_Curve*) &IC;
154 Handle (Geom_Line) aGLine=
155 Handle (Geom_Line)::DownCast(aC3D);
157 if (aGLine.IsNull()) {
159 for (j=1; j<=aNb; j++) {
160 aSOut.Append(aSIn(j));
165 gp_Lin aLin=aGLine->Lin();
166 aD2=aLin.Direction();
173 bFlag=IntTools_Tools::IsDirsCoinside(aD1, aD2);
181 //=======================================================================
182 //function : IsDirsCoinside
184 //=======================================================================
185 Standard_Boolean IntTools_Tools::IsDirsCoinside (const gp_Dir& D1, const gp_Dir& D2)
187 Standard_Boolean bFlag;
188 gp_Pnt P1(D1.X(), D1.Y(), D1.Z());
189 gp_Pnt P2(D2.X(), D2.Y(), D2.Z());
190 Standard_Real dLim=0.0002, d;
192 bFlag= (d<dLim || fabs (2.-d)<dLim);
196 //=======================================================================
197 //function : IsDirsCoinside
199 //=======================================================================
200 Standard_Boolean IntTools_Tools::IsDirsCoinside (const gp_Dir& D1,
202 const Standard_Real dLim)
204 Standard_Boolean bFlag;
207 gp_Pnt P1(D1.X(), D1.Y(), D1.Z());
208 gp_Pnt P2(D2.X(), D2.Y(), D2.Z());
210 bFlag= (d<dLim || fabs (2.-d)<dLim);
213 //=======================================================================
214 //function : SplitCurve
216 //=======================================================================
217 Standard_Integer IntTools_Tools::SplitCurve(const IntTools_Curve& IC,
218 IntTools_SequenceOfCurves& aCvs)
220 Handle (Geom_Curve) aC3D =IC.Curve();
224 Handle (Geom2d_Curve) aC2D1=IC.FirstCurve2d();
225 Handle (Geom2d_Curve) aC2D2=IC.SecondCurve2d();
226 Standard_Boolean bIsClosed;
228 bIsClosed=IntTools_Tools::IsClosed(aC3D);
233 Standard_Real aF, aL, aMid;
236 aF=aC3D->FirstParameter();
237 aL=aC3D->LastParameter();
239 GeomAdaptor_Curve aGAC(aC3D);
240 GeomAbs_CurveType aCT=aGAC.GetType();
241 if (aCT==GeomAbs_BSplineCurve ||
242 aCT==GeomAbs_BezierCurve) {
244 aMid=IntTools_Tools::IntermediatePoint(aF, aL);
247 Handle(Geom_Curve) aC3DNewF, aC3DNewL;
248 aC3DNewF =new Geom_TrimmedCurve (aC3D, aF, aMid);
249 aC3DNewL =new Geom_TrimmedCurve (aC3D, aMid, aL);
252 Handle (Geom2d_Curve) aC2D1F, aC2D1L, aC2D2F, aC2D2L;
254 if(!aC2D1.IsNull()) {
255 aC2D1F=new Geom2d_TrimmedCurve (aC2D1, aF, aMid);
256 aC2D1L=new Geom2d_TrimmedCurve (aC2D1, aMid, aL);
259 if(!aC2D2.IsNull()) {
260 aC2D2F=new Geom2d_TrimmedCurve (aC2D2, aF, aMid);
261 aC2D2L=new Geom2d_TrimmedCurve (aC2D2, aMid, aL);
265 IntTools_Curve aIC1(aC3DNewF, aC2D1F, aC2D2F);
266 IntTools_Curve aIC2(aC3DNewL, aC2D1L, aC2D2L);
275 //=======================================================================
276 //function : IntermediatePoint
278 //=======================================================================
279 Standard_Real IntTools_Tools::IntermediatePoint (const Standard_Real aFirst,
280 const Standard_Real aLast)
282 //define parameter division number as 10*e^(-M_PI) = 0.43213918
283 const Standard_Real PAR_T = 0.43213918;
285 aParm=(1.-PAR_T)*aFirst + PAR_T*aLast;
289 //=======================================================================
290 //function : IsVertex
292 //=======================================================================
293 Standard_Boolean IntTools_Tools::IsVertex (const gp_Pnt& aP,
294 const Standard_Real aTolPV,
295 const TopoDS_Vertex& aV)
297 Standard_Boolean bRet;
298 Standard_Real aTolV, aD, dTol;
301 aTolV=BRep_Tool::Tolerance(aV);
303 dTol=Precision::Confusion();
304 aTolV=aTolV+aTolPV+dTol;
306 aPv=BRep_Tool::Pnt(aV);
308 //modified by NIZNHY-PKV Mon Jul 04 12:00:37 2011f
309 aD=aPv.SquareDistance(aP);
314 //aD=aPv.Distance(aP);
315 //return (aD<=aTolV);
316 //modified by NIZNHY-PKV Mon Jul 04 12:00:40 2011t
320 //=======================================================================
321 //function : IsVertex
323 //=======================================================================
324 Standard_Boolean IntTools_Tools::IsVertex (const IntTools_CommonPrt& aCmnPrt)
326 Standard_Boolean anIsVertex;
327 Standard_Real aParam;
329 const TopoDS_Edge& aE1=aCmnPrt.Edge1();
330 const IntTools_Range& aR1=aCmnPrt.Range1();
331 aParam=0.5*(aR1.First()+aR1.Last());
332 anIsVertex=IntTools_Tools::IsVertex (aE1, aParam);
335 return Standard_True;
338 const TopoDS_Edge& aE2=aCmnPrt.Edge2();
339 const IntTools_SequenceOfRanges& aRs2=aCmnPrt.Ranges2();
340 const IntTools_Range& aR2=aRs2(1);
341 aParam=0.5*(aR2.First()+aR2.Last());
342 anIsVertex=IntTools_Tools::IsVertex (aE2, aParam);
344 return Standard_True;
346 return Standard_False;
349 //=======================================================================
350 //function : IsVertex
352 //=======================================================================
353 Standard_Boolean IntTools_Tools::IsVertex (const TopoDS_Edge& aE,
354 const TopoDS_Vertex& aV,
355 const Standard_Real t)
357 Standard_Real aTolV, aTolV2, d2;
360 BRepAdaptor_Curve aBAC(aE);
363 aTolV=BRep_Tool::Tolerance(aV);
365 aPv=BRep_Tool::Pnt(aV);
366 d2=aPv.SquareDistance (aPt);
368 return Standard_True;
370 return Standard_False;
372 //=======================================================================
373 //function : IsVertex
375 //=======================================================================
376 Standard_Boolean IntTools_Tools::IsVertex (const TopoDS_Edge& aE,
377 const Standard_Real t)
379 Standard_Real aTolV, aTolV2, d2;
383 BRepAdaptor_Curve aBAC(aE);
386 TopExp_Explorer anExp(aE, TopAbs_VERTEX);
387 for (; anExp.More(); anExp.Next()) {
388 aV=TopoDS::Vertex (anExp.Current());
389 aTolV=BRep_Tool::Tolerance(aV);
392 aPv=BRep_Tool::Pnt(aV);
393 d2=aPv.SquareDistance (aPt);
395 return Standard_True;
398 return Standard_False;
402 //=======================================================================
403 //function : ComputeVV
405 //=======================================================================
406 Standard_Integer IntTools_Tools::ComputeVV(const TopoDS_Vertex& aV1,
407 const TopoDS_Vertex& aV2)
409 Standard_Real aTolV1, aTolV2, aTolSum, d;
412 aTolV1=BRep_Tool::Tolerance(aV1);
413 aTolV2=BRep_Tool::Tolerance(aV2);
414 aTolSum=aTolV1+aTolV2;
416 aP1=BRep_Tool::Pnt(aV1);
417 aP2=BRep_Tool::Pnt(aV2);
418 //modified by NIZNHY-PKV Mon Jul 04 11:55:52 2011f
419 aTolSum=aTolSum*aTolSum;
420 d=aP1.SquareDistance(aP2);
421 //d=aP1.Distance(aP2);
422 //modified by NIZNHY-PKV Mon Jul 04 11:55:53 2011t
429 //=======================================================================
430 //function : MakeFaceFromWireAndFace
432 //=======================================================================
433 void IntTools_Tools::MakeFaceFromWireAndFace(const TopoDS_Wire& aW,
434 const TopoDS_Face& aF,
439 aFF.Orientation(TopAbs_FORWARD);
440 aFNew=TopoDS::Face (aFF.EmptyCopied());
445 //=======================================================================
446 //function : ClassifyPointByFace
448 //=======================================================================
449 TopAbs_State IntTools_Tools::ClassifyPointByFace(const TopoDS_Face& aF,
450 const gp_Pnt2d& aP2d)
452 Standard_Real aFaceTolerance;
455 aFaceTolerance=BRep_Tool::Tolerance(aF);
456 IntTools_FClass2d aClass2d(aF, aFaceTolerance);
457 aState=aClass2d.Perform(aP2d);
462 //=======================================================================
463 //function : IsMiddlePointsEqual
465 //=======================================================================
466 Standard_Boolean IntTools_Tools::IsMiddlePointsEqual(const TopoDS_Edge& aE1,
467 const TopoDS_Edge& aE2)
470 Standard_Boolean bRet;
471 Standard_Real f1, l1, m1, f2, l2, m2, aTol1, aTol2, aSumTol, aD2;
474 aTol1=BRep_Tool::Tolerance(aE1);
475 Handle(Geom_Curve) C1=BRep_Tool::Curve(aE1, f1, l1);
479 aTol2=BRep_Tool::Tolerance(aE2);
480 Handle(Geom_Curve) C2=BRep_Tool::Curve(aE2, f2, l2);
485 //modified by NIZNHY-PKV Mon Jul 04 12:02:20 2011f
486 aSumTol=aSumTol*aSumTol;
487 aD2=aP1.SquareDistance(aP2);
491 //if (aP1.Distance(aP2) < aSumTol) {
492 // return Standard_True;
494 //return Standard_False;
495 //modified by NIZNHY-PKV Mon Jul 04 12:02:24 2011t
498 //=======================================================================
499 //function : CurveTolerance
501 //=======================================================================
502 Standard_Real IntTools_Tools::CurveTolerance(const Handle(Geom_Curve)& aC3D,
503 const Standard_Real aTolBase)
505 Standard_Real aTolReached, aTf, aTl, aTolMin, aTolMax;
507 aTolReached=aTolBase;
513 Handle(Geom_TrimmedCurve) aCT3D=Handle(Geom_TrimmedCurve)::DownCast(aC3D);
514 if (aCT3D.IsNull()) {
521 aTf=aCT3D->FirstParameter();
522 aTl=aCT3D->LastParameter();
524 GeomAdaptor_Curve aGAC(aCT3D);
525 GeomAbs_CurveType aCType=aGAC.GetType();
527 if (aCType==GeomAbs_Parabola) {
528 Handle(Geom_Curve) aC3DBase=aCT3D->BasisCurve();
529 ParabolaTolerance(aC3DBase, aTf, aTl, aTolBase, aTolMin, aTolMax);
536 #include <Geom_Parabola.hxx>
537 #include <gp_Parab.hxx>
538 //=======================================================================
539 //function : ParabolaTolerance
541 //=======================================================================
542 void ParabolaTolerance(const Handle(Geom_Curve)& aC3D,
543 const Standard_Real aTf,
544 const Standard_Real aTl,
545 const Standard_Real aTol,
546 Standard_Real& aTolMin,
547 Standard_Real& aTolMax)
553 Handle(Geom_Parabola) aGP=Handle(Geom_Parabola)::DownCast(aC3D);
558 Standard_Integer aNbPoints;
559 Standard_Real aFocal, aX1, aX2, aTol1, aTol2;
561 gp_Parab aParab=aGP->Parab();
562 gp_Ax1 aXAxis=aParab.XAxis();
563 Handle(Geom_Line) aGAxis=new Geom_Line(aXAxis);
574 GeomAPI_ProjectPointOnCurve aProj1(aPf, aGAxis);
575 aNbPoints=aProj1.NbPoints();
577 aX1=aProj1.LowerDistanceParameter();
580 aTol1=aTol*sqrt(0.5*aX1/aFocal);
590 GeomAPI_ProjectPointOnCurve aProj2(aPl, aGAxis);
591 aNbPoints=aProj2.NbPoints();
593 aX2=aProj2.LowerDistanceParameter();
597 aTol2=aTol*sqrt(0.5*aX2/aFocal);
603 aTolMax=(aTol1>aTol2) ? aTol1 : aTol2;
604 aTolMin=(aTol1<aTol2) ? aTol1 : aTol2;