1 // Created on: 2001-04-02
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.
22 #include <BOPTools_Tools2D.ixx>
24 #include <Standard_NotImplemented.hxx>
25 #include <Precision.hxx>
29 #include <gp_Pnt2d.hxx>
31 #include <gp_Vec2d.hxx>
33 #include <Geom2d_Curve.hxx>
34 #include <Geom2d_Line.hxx>
35 #include <Geom2d_Circle.hxx>
36 #include <Geom2d_Ellipse.hxx>
37 #include <Geom2d_Parabola.hxx>
38 #include <Geom2d_Hyperbola.hxx>
40 #include <Geom_Curve.hxx>
41 #include <GeomAdaptor_HCurve.hxx>
42 #include <Geom_TrimmedCurve.hxx>
43 #include <Geom_Surface.hxx>
45 #include <TopLoc_Location.hxx>
46 #include <TopTools_IndexedMapOfShape.hxx>
49 #include <ProjLib_ProjectedCurve.hxx>
51 #include <BRep_Tool.hxx>
52 #include <BRepTools.hxx>
53 #include <BRepAdaptor_HSurface.hxx>
54 #include <BRepAdaptor_Curve.hxx>
55 #include <BRep_Builder.hxx>
56 #include <BRepAdaptor_Surface.hxx>
60 Standard_Boolean CheckEdgeLength (const TopoDS_Edge& E);
62 //=======================================================================
63 //function : EdgeTangent
65 //=======================================================================
66 Standard_Boolean BOPTools_Tools2D::EdgeTangent(const TopoDS_Edge& anEdge,
67 const Standard_Real aT,
70 Standard_Boolean isdgE;
71 Standard_Real first, last;
73 isdgE = BRep_Tool::Degenerated(anEdge);
75 return Standard_False;
77 if (!CheckEdgeLength(anEdge)) {
78 return Standard_False;
81 Handle(Geom_Curve) aC=BRep_Tool::Curve(anEdge, first, last);
84 Standard_Real mod = aTau.Magnitude();
85 if(mod > gp::Resolution()) {
89 return Standard_False;
92 if (anEdge.Orientation() == TopAbs_REVERSED){
99 //=======================================================================
100 //function : FaceNormal
102 //=======================================================================
103 void BOPTools_Tools2D::FaceNormal (const TopoDS_Face& aF,
104 const Standard_Real U,
105 const Standard_Real V,
110 Handle(Geom_Surface) aSurface;
112 aSurface=BRep_Tool::Surface(aF);
113 aSurface->D1 (U, V, aPnt, aD1U, aD1V);
114 aN=aD1U.Crossed(aD1V);
116 if (aF.Orientation() == TopAbs_REVERSED){
121 //=======================================================================
122 //function : RemovePCurveForEdgeOnFace
124 //=======================================================================
125 void BOPTools_Tools2D::RemovePCurveForEdgeOnFace (const TopoDS_Edge& aE,
126 const TopoDS_Face& aF)
129 Handle(Geom2d_Curve) aC2D;
132 aTol=BRep_Tool::Tolerance(aE);
133 aBB.UpdateEdge(aE, aC2D, aF, aTol);
135 //=======================================================================
136 //function : BuildPCurveForEdgeOnFace
138 //=======================================================================
139 void BOPTools_Tools2D::BuildPCurveForEdgeOnFace (const TopoDS_Edge& aE,
140 const TopoDS_Face& aF)
143 Handle(Geom2d_Curve) aC2D;
144 Standard_Real aTolPC, aTolFact, aTolEdge, aFirst, aLast;
146 Standard_Boolean aHasOld;
147 aHasOld=BOPTools_Tools2D::HasCurveOnSurface (aE, aF, aC2D, aFirst, aLast, aTolEdge);
153 BOPTools_Tools2D::CurveOnSurface(aE, aF, aC2D, aTolPC, Standard_True);
155 aTolEdge=BRep_Tool::Tolerance(aE);
157 aTolFact=Max(aTolEdge, aTolPC);
159 aBB.UpdateEdge(aE, aC2D, aF, aTolFact);
162 //=======================================================================
163 //function : PointOnOnSurface
165 //=======================================================================
166 void BOPTools_Tools2D::PointOnSurface (const TopoDS_Edge& aE,
167 const TopoDS_Face& aF,
168 const Standard_Real aParameter,
173 Handle(Geom2d_Curve) aC2D;
174 Standard_Real aToler, aFirst, aLast;
176 BOPTools_Tools2D::CurveOnSurface (aE, aF, aC2D, aFirst, aLast, aToler, Standard_True);
177 aC2D->D0(aParameter, aP2D);
183 //=======================================================================
184 //function : CurveOnSurface
186 //=======================================================================
187 void BOPTools_Tools2D::CurveOnSurface (const TopoDS_Edge& aE,
188 const TopoDS_Face& aF,
189 Handle(Geom2d_Curve)& aC2D,
190 Standard_Real& aToler,
191 const Standard_Boolean trim3d)
193 Standard_Real aFirst, aLast;
195 BOPTools_Tools2D::CurveOnSurface (aE, aF, aC2D, aFirst, aLast, aToler, trim3d);
199 //=======================================================================
200 //function : CurveOnSurface
202 //=======================================================================
203 void BOPTools_Tools2D::CurveOnSurface (const TopoDS_Edge& aE,
204 const TopoDS_Face& aF,
205 Handle(Geom2d_Curve)& aC2D,
206 Standard_Real& aFirst,
207 Standard_Real& aLast,
208 Standard_Real& aToler,
209 const Standard_Boolean trim3d)
211 Standard_Boolean aHasOld;
212 Handle(Geom2d_Curve) C2D;
214 aHasOld=BOPTools_Tools2D::HasCurveOnSurface (aE, aF, C2D, aFirst, aLast, aToler);
220 BOPTools_Tools2D::Make2D(aE, aF, C2D, aFirst, aLast, aToler, trim3d);
225 //=======================================================================
226 //function : HasCurveOnSurface
228 //=======================================================================
229 Standard_Boolean BOPTools_Tools2D::HasCurveOnSurface (const TopoDS_Edge& aE,
230 const TopoDS_Face& aF,
231 Handle(Geom2d_Curve)& aC2D,
232 Standard_Real& aFirst,
233 Standard_Real& aLast,
234 Standard_Real& aToler)
236 Standard_Boolean aHasOld;
238 aToler=BRep_Tool::Tolerance(aE);
239 BRep_Tool::Range(aE, aFirst, aLast);
241 if((aLast - aFirst) < Precision::PConfusion()) {
242 return Standard_False;
245 aC2D =BRep_Tool::CurveOnSurface(aE, aF, aFirst, aLast);
246 aHasOld=!aC2D.IsNull();
249 //=======================================================================
250 //function : HasCurveOnSurface
252 //=======================================================================
253 Standard_Boolean BOPTools_Tools2D::HasCurveOnSurface (const TopoDS_Edge& aE,
254 const TopoDS_Face& aF)
257 Standard_Boolean aHasOld;
258 Handle(Geom2d_Curve) aC2D;
259 Standard_Real aFirst, aLast;
260 BRep_Tool::Range(aE, aFirst, aLast);
262 if((aLast - aFirst) < Precision::PConfusion()) {
263 return Standard_False;
266 aC2D =BRep_Tool::CurveOnSurface(aE, aF, aFirst, aLast);
267 aHasOld=!aC2D.IsNull();
270 //=======================================================================
271 //function : MakeCurveOnSurface
273 //=======================================================================
274 void BOPTools_Tools2D::MakeCurveOnSurface (const TopoDS_Edge& aE,
275 const TopoDS_Face& aF,
276 Handle(Geom2d_Curve)& aC2D,
277 Standard_Real& aFirst,
278 Standard_Real& aLast,
279 Standard_Real& aToler,
280 const Standard_Boolean trim3d)
282 BOPTools_Tools2D::Make2D(aE, aF, aC2D, aFirst, aLast, aToler, trim3d);
285 //=======================================================================
288 //=======================================================================
289 void BOPTools_Tools2D::Make2D (const TopoDS_Edge& aE,
290 const TopoDS_Face& aF,
291 Handle(Geom2d_Curve)& aC2D,
292 Standard_Real& aFirst,
293 Standard_Real& aLast,
294 Standard_Real& aToler,
295 const Standard_Boolean trim3d)
297 Standard_Boolean aLocIdentity;
298 Standard_Real f3d, l3d;
299 TopLoc_Location aLoc;
301 Handle(Geom2d_Curve) C2D;
304 C2D=BRep_Tool::CurveOnSurface(aE, aF, aFirst, aLast);
311 Handle(Geom_Curve) C3D3, C3D2, C3D;
312 C3D = BRep_Tool::Curve(aE, aLoc, f3d, l3d);
315 // aE has no 3D curve, so nothing is done
318 aLocIdentity=aLoc.IsIdentity();
324 C3D2 = Handle(Geom_Curve)::
325 DownCast(C3D->Transformed(aLoc.Transformation()));
337 aToler=.5*BRep_Tool::Tolerance(aE);
338 BOPTools_Tools2D::MakePCurveOnFace(aF, C3D3, f3d, l3d, aC2D, aToler);
344 //=======================================================================
345 //function : MakePCurveOnFace
347 //=======================================================================
348 void BOPTools_Tools2D::MakePCurveOnFace (const TopoDS_Face& aF,
349 const Handle(Geom_Curve)& aC3D,
350 Handle(Geom2d_Curve)& aC2D, //->
351 Standard_Real& TolReached2d)
353 Standard_Real aFirst, aLast;
355 aFirst = aC3D -> FirstParameter();
356 aLast = aC3D -> LastParameter();
360 BOPTools_Tools2D::MakePCurveOnFace (aF, aC3D, aFirst, aLast, aC2D, TolReached2d);
363 //=======================================================================
364 //function : MakePCurveOnFace
366 //=======================================================================
367 void BOPTools_Tools2D::MakePCurveOnFace (const TopoDS_Face& aF,
368 const Handle(Geom_Curve)& aC3D,
369 const Standard_Real aFirst,
370 const Standard_Real aLast,
371 Handle(Geom2d_Curve)& aC2D,
372 Standard_Real& TolReached2d)
375 Handle(Geom2d_Curve) aC2DA;
377 BRepAdaptor_Surface aBAS(aF, Standard_False);
378 Handle(BRepAdaptor_HSurface) aBAHS = new BRepAdaptor_HSurface(aBAS);
379 Handle(GeomAdaptor_HCurve) aBAHC = new GeomAdaptor_HCurve(aC3D, aFirst, aLast);
381 ProjLib_ProjectedCurve aProjCurv(aBAHS, aBAHC);// 1
382 BOPTools_Tools2D::MakePCurveOfType(aProjCurv, aC2D);
383 aTolR=aProjCurv.GetTolerance();
386 ProjLib_ProjectedCurve aProjCurvAgain(aBAHS, aBAHC, TolReached2d);// 2
387 BOPTools_Tools2D::MakePCurveOfType(aProjCurvAgain, aC2D);
388 aTolR = aProjCurvAgain.GetTolerance();
391 Standard_Real aTR=0.0001;
392 ProjLib_ProjectedCurve aProj3(aBAHS, aBAHC, aTR);// 3
393 BOPTools_Tools2D::MakePCurveOfType(aProj3, aC2D);
394 aTolR = aProj3.GetTolerance();
399 BOPTools_Tools2D::AdjustPCurveOnFace (aF, aFirst, aLast, aC2D, aC2DA);
403 //=======================================================================
404 //function : AdjustPCurveOnFace
406 //=======================================================================
407 void BOPTools_Tools2D::AdjustPCurveOnFace (const TopoDS_Face& aF,
408 const Handle(Geom_Curve)& aC3D,
409 const Handle(Geom2d_Curve)& aC2D,
410 Handle(Geom2d_Curve)& aC2DA)
412 Standard_Real first, last;
414 first = aC3D -> FirstParameter();
415 last = aC3D -> LastParameter();
417 BOPTools_Tools2D::AdjustPCurveOnFace (aF, first, last, aC2D, aC2DA);
419 //=======================================================================
420 //function : AdjustPCurveOnFace
422 //=======================================================================
423 void BOPTools_Tools2D::AdjustPCurveOnFace (const TopoDS_Face& aF,
424 const Standard_Real aFirst,
425 const Standard_Real aLast,
426 const Handle(Geom2d_Curve)& aC2D,
427 Handle(Geom2d_Curve)& aC2DA)
429 Standard_Boolean mincond, maxcond, decalu, decalv;
430 Standard_Integer k, iCnt;
431 Standard_Real UMin, UMax, VMin, VMax, aT, u2, v2, du, dv, aDelta;
432 Standard_Real aUPeriod, aUP2, aUP1, aUNew, aDif, aUx;
434 aDelta=Precision::PConfusion();
436 BRepAdaptor_Surface aBAS(aF, Standard_False);
438 BRepTools::UVBounds(aF, UMin, UMax, VMin, VMax);
440 aT =.5*(aFirst+aLast);
449 if (aBAS.IsUPeriodic()) {
450 aUPeriod=aBAS.UPeriod();
451 mincond = (u2 < UMin-aDelta);
452 maxcond = (u2 > UMax+aDelta);
454 decalu = mincond || maxcond;
457 aUP2=aUPeriod+aUPeriod+aDelta;
458 aUP1=aUPeriod+aDelta;
469 else if (u2 < -aUP2) {
473 //modified by NIZNHY-PKV Thu Apr 12 08:12:09 2012f
476 //modified by NIZNHY-PKV Thu Apr 12 08:12:11 2012t
481 du = ( mincond ) ? aUPeriod : -aUPeriod;
486 if (aUNew<(UMin-aDelta) ||
487 aUNew>(UMax+aDelta)) {
488 // So previous correction was wrong.
489 // Try to be closer to UMin or UMax.
498 } // if (BAHS->IsUPeriodic())
502 if (aBAS.IsVPeriodic()) {
503 Standard_Real aVPeriod, aVm, aVr, aVmid, dVm, dVr;
505 aVPeriod=aBAS.VPeriod();
506 mincond = (VMin - v2 > aDelta);
507 maxcond = (v2 - VMax > aDelta);
508 decalv = mincond || maxcond;
510 dv = ( mincond ) ? aVPeriod : -aVPeriod;
514 if ((VMax-VMin<aVPeriod) && dv) {
517 aVmid=0.5*(VMin+VMax);
527 // Translation if necessary
528 Handle(Geom2d_Curve) aC2Dx=aC2D;
530 if ( du != 0. || dv != 0.) {
531 Handle(Geom2d_Curve) PCT = Handle(Geom2d_Curve)::DownCast(aC2Dx->Copy());
532 gp_Vec2d aV2D(du,dv);
533 PCT->Translate(aV2D);
541 //=======================================================================
542 //function : MakePCurveOfType
544 //=======================================================================
545 void BOPTools_Tools2D::MakePCurveOfType(const ProjLib_ProjectedCurve& PC,
546 Handle(Geom2d_Curve)& C2D)
549 switch (PC.GetType()) {
552 C2D = new Geom2d_Line(PC.Line());
554 case GeomAbs_Circle :
555 C2D = new Geom2d_Circle(PC.Circle());
557 case GeomAbs_Ellipse :
558 C2D = new Geom2d_Ellipse(PC.Ellipse());
560 case GeomAbs_Parabola :
561 C2D = new Geom2d_Parabola(PC.Parabola());
563 case GeomAbs_Hyperbola :
564 C2D = new Geom2d_Hyperbola(PC.Hyperbola());
566 case GeomAbs_BSplineCurve :
569 case GeomAbs_BezierCurve :
570 case GeomAbs_OtherCurve :
572 Standard_NotImplemented::Raise("BOPTools_Tools2D::MakePCurveOfType");
577 //=======================================================================
578 //function : TangentOnEdge
580 //=======================================================================
581 Standard_Boolean BOPTools_Tools2D::TangentOnEdge(const Standard_Real par,
582 const TopoDS_Edge& E,
585 Standard_Boolean isdgE;
587 isdgE = BRep_Tool::Degenerated(E);
589 return Standard_False;
591 if (!CheckEdgeLength(E)) {
592 return Standard_False;
595 BRepAdaptor_Curve BC(E);
598 Standard_Real f, l, tolE, tolp;
599 Standard_Boolean onf, onl, inbounds;
601 f = BC.FirstParameter();
602 l = BC.LastParameter();
603 tolE = BC.Tolerance();
604 tolp = BC.Resolution(tolE);
606 onf = Abs(f-par)<tolp;
607 onl = Abs(l-par)<tolp;
608 inbounds = (f<par) && (par<l);
610 if ((!inbounds) && (!onf) && (!onl)) {
611 return Standard_False;
620 return Standard_True;
622 //=======================================================================
623 //function : TangentOnEdge
625 //=======================================================================
626 Standard_Boolean BOPTools_Tools2D::TangentOnEdge(const TopoDS_Edge& aE,
632 DTg.SetCoord(1.,0.,0.);
634 aT= BOPTools_Tools2D::IntermediatePoint (aE);
635 Standard_Boolean bIsFound=BOPTools_Tools2D::TangentOnEdge(aT, aE, aTg);
643 //=======================================================================
644 //function : TangentOnVertex
646 //=======================================================================
647 Standard_Boolean BOPTools_Tools2D::TangentOnVertex (const TopoDS_Vertex& v,
648 const TopoDS_Vertex& vl,
649 const TopoDS_Edge& e,
651 // tg oriented INSIDE 1d(e)
652 // vl : last vertex of e
658 par = BRep_Tool::Parameter(v, e);
659 ok =BOPTools_Tools2D::TangentOnEdge (par, e, tg);
671 //=======================================================================
672 //function : EdgeBounds
674 //=======================================================================
675 void BOPTools_Tools2D::EdgeBounds (const TopoDS_Edge& aE,
676 Standard_Real& aFirst,
677 Standard_Real& aLast)
679 BRepAdaptor_Curve aBC(aE);
680 aFirst= aBC.FirstParameter();
681 aLast = aBC.LastParameter();
684 //=======================================================================
685 //function : IntermediatePoint
687 //=======================================================================
688 Standard_Real BOPTools_Tools2D::IntermediatePoint (const Standard_Real aFirst,
689 const Standard_Real aLast)
691 //define parameter division number as 10*e^(-M_PI) = 0.43213918
692 const Standard_Real PAR_T = 0.43213918;
694 aParm=(1.-PAR_T)*aFirst + PAR_T*aLast;
697 //=======================================================================
698 //function : IntermediatePoint
700 //=======================================================================
701 Standard_Real BOPTools_Tools2D::IntermediatePoint (const TopoDS_Edge& aE)
704 Standard_Real aT, aT1, aT2;
706 Handle(Geom_Curve)aC1=BRep_Tool::Curve(aE, aT1, aT2);
707 aT=BOPTools_Tools2D::IntermediatePoint(aT1, aT2);
711 //=======================================================================
712 //function : CheckEdgeLength
714 //=======================================================================
715 Standard_Boolean CheckEdgeLength (const TopoDS_Edge& E)
717 BRepAdaptor_Curve BC(E);
719 TopTools_IndexedMapOfShape aM;
720 TopExp::MapShapes(E, TopAbs_VERTEX, aM);
721 Standard_Integer i, anExtent, aN=10;
722 Standard_Real ln=0., d, t, f, l, dt;
723 anExtent=aM.Extent();
726 return Standard_True;
729 f = BC.FirstParameter();
730 l = BC.LastParameter();
734 for (i=1; i<=aN; i++) {
747 return (ln > Precision::Confusion());