0022627: Change OCCT memory management defaults
[occt.git] / src / IntTools / IntTools_Tools.cxx
CommitLineData
7fd59977 1// File: IntTools_Tools.cxx
2// Created: Thu Nov 16 11:42:23 2000
3// Author: Peter KURNEV
4// <pkv@irinox>
5//
6
7#include <IntTools_Tools.ixx>
8
9#include <Precision.hxx>
10
11#include <TopExp_Explorer.hxx>
12#include <TopTools_IndexedDataMapOfShapeShape.hxx>
13
14#include <TopoDS.hxx>
15#include <TopoDS_Shape.hxx>
16#include <TopoDS_Vertex.hxx>
17#include <TopoDS_Edge.hxx>
18#include <TopoDS_Face.hxx>
19#include <TopoDS_Wire.hxx>
20#include <TopLoc_Location.hxx>
21
22#include <BRep_Builder.hxx>
23#include <BRep_Tool.hxx>
24#include <BRepAdaptor_Surface.hxx>
25#include <BRepAdaptor_Curve.hxx>
26#include <BRepAdaptor_Surface.hxx>
27
28#include <gp_Pnt.hxx>
29#include <gp_Pnt2d.hxx>
30#include <gp.hxx>
31#include <gp_Lin.hxx>
32#include <gp_Dir.hxx>
33#include <gp_Ax1.hxx>
34
35#include <Geom_Curve.hxx>
36#include <GeomAdaptor_Surface.hxx>
37#include <Geom_Surface.hxx>
38#include <GeomAPI_ProjectPointOnSurf.hxx>
39#include <GeomAPI_ProjectPointOnCurve.hxx>
40#include <GeomAdaptor_Curve.hxx>
41#include <GeomAbs_CurveType.hxx>
42#include <Geom_Line.hxx>
43#include <Geom2d_Curve.hxx>
44#include <Geom_BoundedCurve.hxx>
45#include <Geom_Geometry.hxx>
46#include <Geom_TrimmedCurve.hxx>
47#include <Geom2d_TrimmedCurve.hxx>
48
49#include <IntTools_FClass2d.hxx>
50#include <IntTools_Curve.hxx>
51#include <IntTools_SequenceOfCurves.hxx>
52
53static
54 void ParabolaTolerance(const Handle(Geom_Curve)& ,
55 const Standard_Real ,
56 const Standard_Real ,
57 const Standard_Real ,
58 Standard_Real& ,
59 Standard_Real& );
60
61//=======================================================================
62//function : HasInternalEdge
63//purpose :
64//=======================================================================
65 Standard_Boolean IntTools_Tools::HasInternalEdge(const TopoDS_Wire& aW)
66{
67 Standard_Boolean bFlag=Standard_True;
68
69 TopExp_Explorer anExp(aW, TopAbs_EDGE);
70 for (; anExp.More(); anExp.Next()) {
71 const TopoDS_Edge& aE=TopoDS::Edge(anExp.Current());
72 TopAbs_Orientation anOr=aE.Orientation();
73 if (anOr==TopAbs_INTERNAL) {
74 return bFlag;
75 }
76 }
77 return !bFlag;
78}
79
80//=======================================================================
81//function : IsClosed
82//purpose :
83//=======================================================================
84 Standard_Boolean IntTools_Tools::IsClosed (const Handle(Geom_Curve)& aC3D)
85{
cf8e963a 86 Standard_Boolean bRet;
87 Standard_Real aF, aL, aDist, aPC;
7fd59977 88 gp_Pnt aP1, aP2;
cf8e963a 89
7fd59977 90 Handle (Geom_BoundedCurve) aGBC=
91 Handle (Geom_BoundedCurve)::DownCast(aC3D);
92 if (aGBC.IsNull()) {
93 return Standard_False;
94 }
cf8e963a 95
7fd59977 96 aF=aC3D->FirstParameter();
97 aL=aC3D-> LastParameter();
98
99 aC3D->D0(aF, aP1);
100 aC3D->D0(aL, aP2);
101
cf8e963a 102
103 //
104 //modified by NIZNHY-PKV Mon Jul 04 11:58:23 2011f
105 aPC=Precision::Confusion();
106 aPC=aPC*aPC;
107 aDist=aP1.SquareDistance(aP2);
108 bRet=aDist<aPC;
109 return bRet;
110 //
111 //aDist=aP1.Distance(aP2);
112 //return (aDist < Precision::Confusion());
113 //modified by NIZNHY-PKV Mon Jul 04 11:59:50 2011t
7fd59977 114}
115
116//=======================================================================
117//function : RejectLines
118//purpose :
119//=======================================================================
120 void IntTools_Tools::RejectLines(const IntTools_SequenceOfCurves& aSIn,
121 IntTools_SequenceOfCurves& aSOut)
122{
123 Standard_Integer i, j, aNb;
124 Standard_Boolean bFlag;
125 Handle (Geom_Curve) aC3D;
126
127 gp_Dir aD1, aD2;
128
129 aSOut.Clear();
130
131 aNb=aSIn.Length();
132 for (i=1; i<=aNb; i++) {
133 const IntTools_Curve& IC=aSIn(i);
134 aC3D=IC.Curve();
135 //
136 Handle (Geom_TrimmedCurve) aGTC=
137 Handle (Geom_TrimmedCurve)::DownCast(aC3D);
138
139 if (!aGTC.IsNull()) {
140 aC3D=aGTC->BasisCurve();
141 IntTools_Curve* pIC=(IntTools_Curve*) &IC;
142 pIC->SetCurve(aC3D);
143 }
144 //
145 Handle (Geom_Line) aGLine=
146 Handle (Geom_Line)::DownCast(aC3D);
147
148 if (aGLine.IsNull()) {
149 aSOut.Clear();
150 for (j=1; j<=aNb; j++) {
151 aSOut.Append(aSIn(j));
152 }
153 return;
154 }
155 //
156 gp_Lin aLin=aGLine->Lin();
157 aD2=aLin.Direction();
158 if (i==1) {
159 aSOut.Append(IC);
160 aD1=aD2;
161 continue;
162 }
163
164 bFlag=IntTools_Tools::IsDirsCoinside(aD1, aD2);
165 if (!bFlag) {
166 aSOut.Append(IC);
167 return;
168 }
169 }
170}
171
172//=======================================================================
173//function : IsDirsCoinside
174//purpose :
175//=======================================================================
176 Standard_Boolean IntTools_Tools::IsDirsCoinside (const gp_Dir& D1, const gp_Dir& D2)
177{
178 Standard_Boolean bFlag;
179 gp_Pnt P1(D1.X(), D1.Y(), D1.Z());
180 gp_Pnt P2(D2.X(), D2.Y(), D2.Z());
181 Standard_Real dLim=0.0002, d;
182 d=P1.Distance (P2);
183 bFlag= (d<dLim || fabs (2.-d)<dLim);
184 return bFlag;
185}
186
187//=======================================================================
188//function : IsDirsCoinside
189//purpose :
190//=======================================================================
191 Standard_Boolean IntTools_Tools::IsDirsCoinside (const gp_Dir& D1,
192 const gp_Dir& D2,
193 const Standard_Real dLim)
194{
195 Standard_Boolean bFlag;
196 Standard_Real d;
197 //
198 gp_Pnt P1(D1.X(), D1.Y(), D1.Z());
199 gp_Pnt P2(D2.X(), D2.Y(), D2.Z());
200 d=P1.Distance (P2);
201 bFlag= (d<dLim || fabs (2.-d)<dLim);
202 return bFlag;
203}
204//=======================================================================
205//function : SplitCurve
206//purpose :
207//=======================================================================
208 Standard_Integer IntTools_Tools::SplitCurve(const IntTools_Curve& IC,
209 IntTools_SequenceOfCurves& aCvs)
210{
211 Handle (Geom_Curve) aC3D =IC.Curve();
212 if(aC3D.IsNull())
213 return 0;
214 //
215 Handle (Geom2d_Curve) aC2D1=IC.FirstCurve2d();
216 Handle (Geom2d_Curve) aC2D2=IC.SecondCurve2d();
217 Standard_Boolean bIsClosed;
218
219 bIsClosed=IntTools_Tools::IsClosed(aC3D);
220 if (!bIsClosed) {
221 return 0;
222 }
223
224 Standard_Real aF, aL, aMid;
225
226 //
227 aF=aC3D->FirstParameter();
228 aL=aC3D->LastParameter();
229 aMid=0.5*(aF+aL);
7fd59977 230 GeomAdaptor_Curve aGAC(aC3D);
231 GeomAbs_CurveType aCT=aGAC.GetType();
232 if (aCT==GeomAbs_BSplineCurve ||
233 aCT==GeomAbs_BezierCurve) {
234 //aMid=0.5*aMid;
235 aMid=IntTools_Tools::IntermediatePoint(aF, aL);
236 }
7fd59977 237 //
238 Handle(Geom_Curve) aC3DNewF, aC3DNewL;
239 aC3DNewF =new Geom_TrimmedCurve (aC3D, aF, aMid);
240 aC3DNewL =new Geom_TrimmedCurve (aC3D, aMid, aL);
241
242 //
243 Handle (Geom2d_Curve) aC2D1F, aC2D1L, aC2D2F, aC2D2L;
244 //
245 if(!aC2D1.IsNull()) {
246 aC2D1F=new Geom2d_TrimmedCurve (aC2D1, aF, aMid);
247 aC2D1L=new Geom2d_TrimmedCurve (aC2D1, aMid, aL);
248 }
249
250 if(!aC2D2.IsNull()) {
251 aC2D2F=new Geom2d_TrimmedCurve (aC2D2, aF, aMid);
252 aC2D2L=new Geom2d_TrimmedCurve (aC2D2, aMid, aL);
253 }
254 //
255
256 IntTools_Curve aIC1(aC3DNewF, aC2D1F, aC2D2F);
257 IntTools_Curve aIC2(aC3DNewL, aC2D1L, aC2D2L);
258 //
259 aCvs.Append(aIC1);
260 //
261 aCvs.Append(aIC2);
262 //
263 return 2;
264}
265
266//=======================================================================
267//function : IntermediatePoint
268//purpose :
269//=======================================================================
270 Standard_Real IntTools_Tools::IntermediatePoint (const Standard_Real aFirst,
271 const Standard_Real aLast)
272{
c6541a0c 273 //define parameter division number as 10*e^(-M_PI) = 0.43213918
7fd59977 274 const Standard_Real PAR_T = 0.43213918;
275 Standard_Real aParm;
276 aParm=(1.-PAR_T)*aFirst + PAR_T*aLast;
277 return aParm;
278}
279
280//=======================================================================
281//function : IsVertex
282//purpose :
283//=======================================================================
284 Standard_Boolean IntTools_Tools::IsVertex (const gp_Pnt& aP,
285 const Standard_Real aTolPV,
286 const TopoDS_Vertex& aV)
287{
cf8e963a 288 Standard_Boolean bRet;
7fd59977 289 Standard_Real aTolV, aD, dTol;
290 gp_Pnt aPv;
291
292 aTolV=BRep_Tool::Tolerance(aV);
293 //
7fd59977 294 dTol=Precision::Confusion();
295 aTolV=aTolV+aTolPV+dTol;
7fd59977 296 //
297 aPv=BRep_Tool::Pnt(aV);
cf8e963a 298 //
299 //modified by NIZNHY-PKV Mon Jul 04 12:00:37 2011f
300 aD=aPv.SquareDistance(aP);
301 aTolV=aTolV*aTolV;
302 bRet=(aD<=aTolV);
303 return bRet;
304 //
305 //aD=aPv.Distance(aP);
306 //return (aD<=aTolV);
307 //modified by NIZNHY-PKV Mon Jul 04 12:00:40 2011t
7fd59977 308}
309
310
311//=======================================================================
312//function : IsVertex
313//purpose :
314//=======================================================================
315 Standard_Boolean IntTools_Tools::IsVertex (const IntTools_CommonPrt& aCmnPrt)
316{
317 Standard_Boolean anIsVertex;
318 Standard_Real aParam;
319
320 const TopoDS_Edge& aE1=aCmnPrt.Edge1();
321 const IntTools_Range& aR1=aCmnPrt.Range1();
322 aParam=0.5*(aR1.First()+aR1.Last());
323 anIsVertex=IntTools_Tools::IsVertex (aE1, aParam);
324
325 if (anIsVertex) {
326 return Standard_True;
327 }
328
329 const TopoDS_Edge& aE2=aCmnPrt.Edge2();
330 const IntTools_SequenceOfRanges& aRs2=aCmnPrt.Ranges2();
331 const IntTools_Range& aR2=aRs2(1);
332 aParam=0.5*(aR2.First()+aR2.Last());
333 anIsVertex=IntTools_Tools::IsVertex (aE2, aParam);
334 if (anIsVertex) {
335 return Standard_True;
336 }
337 return Standard_False;
338}
339
340//=======================================================================
341//function : IsVertex
342//purpose :
343//=======================================================================
344 Standard_Boolean IntTools_Tools::IsVertex (const TopoDS_Edge& aE,
345 const TopoDS_Vertex& aV,
346 const Standard_Real t)
347{
348 Standard_Real aTolV, aTolV2, d2;
349 gp_Pnt aPv, aPt;
350
351 BRepAdaptor_Curve aBAC(aE);
352 aBAC.D0(t, aPt);
353
354 aTolV=BRep_Tool::Tolerance(aV);
355 aTolV2=aTolV*aTolV;
356 aPv=BRep_Tool::Pnt(aV);
357 d2=aPv.SquareDistance (aPt);
358 if (d2 < aTolV2) {
359 return Standard_True;
360 }
361 return Standard_False;
362}
363//=======================================================================
364//function : IsVertex
365//purpose :
366//=======================================================================
367 Standard_Boolean IntTools_Tools::IsVertex (const TopoDS_Edge& aE,
368 const Standard_Real t)
369{
370 Standard_Real aTolV, aTolV2, d2;
371 TopoDS_Vertex aV;
372 gp_Pnt aPv, aPt;
373
374 BRepAdaptor_Curve aBAC(aE);
375 aBAC.D0(t, aPt);
376
377 TopExp_Explorer anExp(aE, TopAbs_VERTEX);
378 for (; anExp.More(); anExp.Next()) {
379 aV=TopoDS::Vertex (anExp.Current());
380 aTolV=BRep_Tool::Tolerance(aV);
381 aTolV2=aTolV*aTolV;
382 aTolV2=1.e-12;
383 aPv=BRep_Tool::Pnt(aV);
384 d2=aPv.SquareDistance (aPt);
385 if (d2 < aTolV2) {
386 return Standard_True;
387 }
388 }
389 return Standard_False;
390}
391
392
393//=======================================================================
394//function : ComputeVV
395//purpose :
396//=======================================================================
397 Standard_Integer IntTools_Tools::ComputeVV(const TopoDS_Vertex& aV1,
398 const TopoDS_Vertex& aV2)
399{
400 Standard_Real aTolV1, aTolV2, aTolSum, d;
401 gp_Pnt aP1, aP2;
402
403 aTolV1=BRep_Tool::Tolerance(aV1);
404 aTolV2=BRep_Tool::Tolerance(aV2);
405 aTolSum=aTolV1+aTolV2;
cf8e963a 406
7fd59977 407 aP1=BRep_Tool::Pnt(aV1);
408 aP2=BRep_Tool::Pnt(aV2);
cf8e963a 409 //modified by NIZNHY-PKV Mon Jul 04 11:55:52 2011f
410 aTolSum=aTolSum*aTolSum;
411 d=aP1.SquareDistance(aP2);
412 //d=aP1.Distance(aP2);
413 //modified by NIZNHY-PKV Mon Jul 04 11:55:53 2011t
7fd59977 414 if (d<aTolSum) {
415 return 0;
416 }
417 return -1;
418}
419
420//=======================================================================
421//function : MakeFaceFromWireAndFace
422//purpose :
423//=======================================================================
424 void IntTools_Tools::MakeFaceFromWireAndFace(const TopoDS_Wire& aW,
425 const TopoDS_Face& aF,
426 TopoDS_Face& aFNew)
427{
428 TopoDS_Face aFF;
429 aFF=aF;
430 aFF.Orientation(TopAbs_FORWARD);
431 aFNew=TopoDS::Face (aFF.EmptyCopied());
432 BRep_Builder BB;
433 BB.Add(aFNew, aW);
434}
435
436//=======================================================================
437//function : ClassifyPointByFace
438//purpose :
439//=======================================================================
440 TopAbs_State IntTools_Tools::ClassifyPointByFace(const TopoDS_Face& aF,
441 const gp_Pnt2d& aP2d)
442{
443 Standard_Real aFaceTolerance;
444 TopAbs_State aState;
445
446 aFaceTolerance=BRep_Tool::Tolerance(aF);
447 IntTools_FClass2d aClass2d(aF, aFaceTolerance);
448 aState=aClass2d.Perform(aP2d);
449
450 return aState;
451}
452
453//=======================================================================
454//function : IsMiddlePointsEqual
455//purpose :
456//=======================================================================
457 Standard_Boolean IntTools_Tools::IsMiddlePointsEqual(const TopoDS_Edge& aE1,
458 const TopoDS_Edge& aE2)
459
460{
cf8e963a 461 Standard_Boolean bRet;
462 Standard_Real f1, l1, m1, f2, l2, m2, aTol1, aTol2, aSumTol, aD2;
7fd59977 463 gp_Pnt aP1, aP2;
464
465 aTol1=BRep_Tool::Tolerance(aE1);
466 Handle(Geom_Curve) C1=BRep_Tool::Curve(aE1, f1, l1);
467 m1=0.5*(f1+l1);
468 C1->D0(m1, aP1);
469
470 aTol2=BRep_Tool::Tolerance(aE2);
471 Handle(Geom_Curve) C2=BRep_Tool::Curve(aE2, f2, l2);
472 m2=0.5*(f2+l2);
473 C2->D0(m2, aP2);
474
475 aSumTol=aTol1+aTol2;
cf8e963a 476 //modified by NIZNHY-PKV Mon Jul 04 12:02:20 2011f
477 aSumTol=aSumTol*aSumTol;
478 aD2=aP1.SquareDistance(aP2);
479 bRet=aD2<aSumTol;
480 return bRet;
481 //
482 //if (aP1.Distance(aP2) < aSumTol) {
483 // return Standard_True;
484 //}
485 //return Standard_False;
486 //modified by NIZNHY-PKV Mon Jul 04 12:02:24 2011t
7fd59977 487}
488
489//=======================================================================
490//function : CurveTolerance
491//purpose :
492//=======================================================================
493 Standard_Real IntTools_Tools::CurveTolerance(const Handle(Geom_Curve)& aC3D,
494 const Standard_Real aTolBase)
495{
496 Standard_Real aTolReached, aTf, aTl, aTolMin, aTolMax;
497
498 aTolReached=aTolBase;
499 //
500 if (aC3D.IsNull()) {
501 return aTolReached;
502 }
503 //
504 Handle(Geom_TrimmedCurve) aCT3D=Handle(Geom_TrimmedCurve)::DownCast(aC3D);
505 if (aCT3D.IsNull()) {
506 return aTolReached;
507 }
508 //
509 aTolMin=aTolBase;
510 aTolMax=aTolBase;
511 //
512 aTf=aCT3D->FirstParameter();
513 aTl=aCT3D->LastParameter();
514 //
515 GeomAdaptor_Curve aGAC(aCT3D);
516 GeomAbs_CurveType aCType=aGAC.GetType();
517 //
518 if (aCType==GeomAbs_Parabola) {
519 Handle(Geom_Curve) aC3DBase=aCT3D->BasisCurve();
520 ParabolaTolerance(aC3DBase, aTf, aTl, aTolBase, aTolMin, aTolMax);
521 aTolReached=aTolMax;
522 }
523 //
524 return aTolReached;
525}
526
527#include <Geom_Parabola.hxx>
528#include <gp_Parab.hxx>
529//=======================================================================
530//function : ParabolaTolerance
531//purpose :
532//=======================================================================
533void ParabolaTolerance(const Handle(Geom_Curve)& aC3D,
534 const Standard_Real aTf,
535 const Standard_Real aTl,
536 const Standard_Real aTol,
537 Standard_Real& aTolMin,
538 Standard_Real& aTolMax)
539{
540
541 aTolMin=aTol;
542 aTolMax=aTol;
543
544 Handle(Geom_Parabola) aGP=Handle(Geom_Parabola)::DownCast(aC3D);
545 if (aGP.IsNull()){
546 return;
547 }
548
549 Standard_Integer aNbPoints;
550 Standard_Real aFocal, aX1, aX2, aTol1, aTol2;
551 gp_Pnt aPf, aPl;
552 gp_Parab aParab=aGP->Parab();
553 gp_Ax1 aXAxis=aParab.XAxis();
554 Handle(Geom_Line) aGAxis=new Geom_Line(aXAxis);
555
556 aFocal=aGP->Focal();
557 if (aFocal==0.) {
558 return;
559 }
560 //
561 // aTol1
562 aTol1=aTol;
563 aX1=0.;
564 aGP->D0(aTf, aPf);
565 GeomAPI_ProjectPointOnCurve aProj1(aPf, aGAxis);
566 aNbPoints=aProj1.NbPoints();
567 if (aNbPoints) {
568 aX1=aProj1.LowerDistanceParameter();
569 }
570 if (aX1>=0.) {
571 aTol1=aTol*sqrt(0.5*aX1/aFocal);
572 }
573 if (aTol1==0.) {
574 aTol1=aTol;
575 }
576 //
577 // aTol2
578 aTol2=aTol;
579 aX2=0.;
580 aGP->D0(aTl, aPl);
581 GeomAPI_ProjectPointOnCurve aProj2(aPl, aGAxis);
582 aNbPoints=aProj2.NbPoints();
583 if (aNbPoints) {
584 aX2=aProj2.LowerDistanceParameter();
585 }
586
587 if (aX2>=0.) {
588 aTol2=aTol*sqrt(0.5*aX2/aFocal);
589 }
590 if (aTol2==0.) {
591 aTol2=aTol;
592 }
593 //
594 aTolMax=(aTol1>aTol2) ? aTol1 : aTol2;
595 aTolMin=(aTol1<aTol2) ? aTol1 : aTol2;
596}
597