1 // Created on: 1994-03-24
2 // Created by: Isabelle GRIGNON
3 // Copyright (c) 1994-1999 Matra Datavision
4 // Copyright (c) 1999-2014 OPEN CASCADE SAS
6 // This file is part of Open CASCADE Technology software library.
8 // This library is free software; you can redistribute it and/or modify it under
9 // the terms of the GNU Lesser General Public License version 2.1 as published
10 // by the Free Software Foundation, with special exception defined in the file
11 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
12 // distribution for complete text of the license and disclaimer of any warranty.
14 // Alternatively, this file may be used under the terms of Open CASCADE
15 // commercial license or contractual agreement.
17 #ifndef ChFi3d_Builder_0_HeaderFile
18 #define ChFi3d_Builder_0_HeaderFile
20 #include <TopOpeBRepDS_SurfaceCurveInterference.hxx>
21 #include <TopOpeBRepDS_CurvePointInterference.hxx>
22 #include <TopOpeBRepDS_DataStructure.hxx>
23 #include <TopOpeBRepDS_Curve.hxx>
24 #include <TopOpeBRepDS_Surface.hxx>
25 #include <BRepBlend_Extremity.hxx>
26 #include <ChFiDS_Stripe.hxx>
27 #include <ChFiDS_SurfData.hxx>
28 #include <ChFiDS_Spine.hxx>
29 #include <ChFiDS_HElSpine.hxx>
30 #include <ChFiDS_CommonPoint.hxx>
31 #include <ChFiDS_Regularities.hxx>
32 #include <ChFiDS_FaceInterference.hxx>
33 #include <ChFiDS_Map.hxx>
34 #include <TopoDS_Face.hxx>
35 #include <TopoDS_Vertex.hxx>
37 #include <TopAbs_Orientation.hxx>
38 #include <TopTools_ListOfShape.hxx>
39 #include <TopTools_ListIteratorOfListOfShape.hxx>
40 #include <IntSurf_LineOn2S.hxx>
41 #include <IntSurf_TypeTrans.hxx>
42 #include <GeomFill_Boundary.hxx>
43 #include <GeomFill_BoundWithSurf.hxx>
44 #include <GeomFill_SimpleBound.hxx>
45 #include <GeomFill_ConstrainedFilling.hxx>
46 #include <Geom2d_Curve.hxx>
47 #include <Geom_Curve.hxx>
48 #include <Geom_TrimmedCurve.hxx>
49 #include <Geom_Surface.hxx>
50 #include <Geom_BezierCurve.hxx>
51 #include <Geom_Circle.hxx>
52 #include <GeomAdaptor_Curve.hxx>
53 #include <GeomAdaptor_Surface.hxx>
54 #include <GeomAdaptor_HSurface.hxx>
55 #include <BRepAdaptor_Surface.hxx>
56 #include <BRepAdaptor_HSurface.hxx>
57 #include <Adaptor3d_HCurve.hxx>
58 #include <Adaptor3d_HCurveOnSurface.hxx>
59 #include <Adaptor3d_HSurface.hxx>
60 #include <Extrema_LocateExtCC.hxx>
61 #include <Extrema_POnCurv.hxx>
62 #include <Bnd_Box.hxx>
63 #include <GeomAbs_Shape.hxx>
66 #include <gp_Pnt2d.hxx>
67 #include <gp_Vec2d.hxx>
68 #include <gp_Dir2d.hxx>
69 #include <TColgp_Array1OfPnt.hxx>
70 #include <TColgp_Array1OfVec.hxx>
71 #include <TColStd_Array1OfReal.hxx>
72 #include <TColStd_Array1OfInteger.hxx>
73 #include <TopTools_Array1OfShape.hxx>
75 #include <OSD_Chronometer.hxx>
76 extern OSD_Chronometer simul,elspine,chemine;
79 Standard_Real ChFi3d_InPeriod(const Standard_Real U,
80 const Standard_Real UFirst,
81 const Standard_Real ULast,
82 const Standard_Real Eps);
84 void ChFi3d_Boite(const gp_Pnt2d& p1,const gp_Pnt2d& p2,
85 Standard_Real& mu,Standard_Real& Mu,
86 Standard_Real& mv,Standard_Real& Mv);
88 void ChFi3d_Boite(const gp_Pnt2d& p1,const gp_Pnt2d& p2,
89 const gp_Pnt2d& p3,const gp_Pnt2d& p4,
90 Standard_Real& Du,Standard_Real& Dv,
91 Standard_Real& mu,Standard_Real& Mu,
92 Standard_Real& mv,Standard_Real& Mv);
94 void ChFi3d_SetPointTolerance(TopOpeBRepDS_DataStructure& DStr,
96 const Standard_Integer IP);
98 void ChFi3d_EnlargeBox(const Handle(Geom_Curve)& C,
99 const Standard_Real wd,
100 const Standard_Real wf,
104 void ChFi3d_EnlargeBox(const Handle(Adaptor3d_HSurface)& S,
105 const Handle(Geom2d_Curve)& PC,
106 const Standard_Real wd,
107 const Standard_Real wf,
111 void ChFi3d_EnlargeBox(const TopoDS_Edge& E,
112 const TopTools_ListOfShape& LF,
113 const Standard_Real w,
116 void ChFi3d_EnlargeBox(TopOpeBRepDS_DataStructure& DStr,
117 const Handle(ChFiDS_Stripe)& st,
118 const Handle(ChFiDS_SurfData)& sd,
121 const Standard_Boolean isfirst);
123 GeomAbs_Shape ChFi3d_evalconti(const TopoDS_Edge& E,
124 const TopoDS_Face& F1,
125 const TopoDS_Face& F2);
127 void ChFi3d_conexfaces(const TopoDS_Edge& E,
130 const ChFiDS_Map& EFMap);
132 ChFiDS_State ChFi3d_EdgeState(TopoDS_Edge* E,
133 const ChFiDS_Map& EFMap);
135 Standard_Boolean ChFi3d_KParticular
136 (const Handle(ChFiDS_Spine)& Spine,
137 const Standard_Integer IE,
138 const BRepAdaptor_Surface& S1,
139 const BRepAdaptor_Surface& S2);
141 void ChFi3d_BoundFac(BRepAdaptor_Surface& S,
142 const Standard_Real umin,
143 const Standard_Real umax,
144 const Standard_Real vmin,
145 const Standard_Real vmax,
146 const Standard_Boolean checknaturalbounds = Standard_True);
148 void ChFi3d_BoundSrf(GeomAdaptor_Surface& S,
149 const Standard_Real umin,
150 const Standard_Real umax,
151 const Standard_Real vmin,
152 const Standard_Real vmax,
153 const Standard_Boolean checknaturalbounds = Standard_True);
155 Standard_Boolean ChFi3d_InterPlaneEdge (const Handle(Adaptor3d_HSurface)& Plan,
156 const Handle(Adaptor3d_HCurve)& C,
158 const Standard_Boolean Sens,
159 const Standard_Real tolc);
161 void ChFi3d_ExtrSpineCarac(const TopOpeBRepDS_DataStructure& DStr,
162 const Handle(ChFiDS_Stripe)& cd,
163 const Standard_Integer i,
164 const Standard_Real p,
165 const Standard_Integer jf,
166 const Standard_Integer sens,
171 Handle(Geom_Circle) ChFi3d_CircularSpine(Standard_Real& WFirst,
172 Standard_Real& WLast,
177 const Standard_Real rad);
179 Handle(Geom_BezierCurve) ChFi3d_Spine(const gp_Pnt& pd,
183 const Standard_Real R);
185 Handle(GeomFill_Boundary) ChFi3d_mkbound
186 (const Handle(Adaptor3d_HSurface)& Fac,
187 Handle(Geom2d_Curve)& curv,
188 const Standard_Integer sens1,
189 const gp_Pnt2d& pfac1,
190 const gp_Vec2d& vfac1,
191 const Standard_Integer sens2,
192 const gp_Pnt2d& pfac2,
193 const gp_Vec2d& vfac2,
194 const Standard_Real t3d,
195 const Standard_Real ta);
197 Handle(GeomFill_Boundary) ChFi3d_mkbound
198 (const Handle(Adaptor3d_HSurface)& Surf,
199 Handle(Geom2d_Curve)& curv,
200 const Standard_Integer sens1,
203 const Standard_Integer sens2,
206 const Standard_Real t3d,
207 const Standard_Real ta);
209 Handle(GeomFill_Boundary) ChFi3d_mkbound
210 (const Handle(Geom_Surface)& s,
213 const Standard_Real t3d,
214 const Standard_Real ta,
215 const Standard_Boolean isfreeboundary = Standard_False);
217 Handle(GeomFill_Boundary) ChFi3d_mkbound
218 (const Handle(Adaptor3d_HSurface)& HS,
221 const Standard_Real t3d,
222 const Standard_Real ta,
223 const Standard_Boolean isfreeboundary = Standard_False);
225 Handle(GeomFill_Boundary) ChFi3d_mkbound
226 (const Handle(Adaptor3d_HSurface)& HS,
227 const Handle(Geom2d_Curve)& curv,
228 const Standard_Real t3d,
229 const Standard_Real ta,
230 const Standard_Boolean isfreeboundary = Standard_False);
232 Handle(GeomFill_Boundary) ChFi3d_mkbound
233 (const Handle(Adaptor3d_HSurface)& Fac,
234 Handle(Geom2d_Curve)& curv,
237 const Standard_Real t3d,
238 const Standard_Real ta,
239 const Standard_Boolean isfreeboundary = Standard_False);
241 void ChFi3d_Coefficient(const gp_Vec& V3d,
247 Handle(Geom2d_Curve) ChFi3d_BuildPCurve
252 const Standard_Boolean redresse = Standard_True);
254 Handle(Geom2d_Curve) ChFi3d_BuildPCurve
255 (const Handle(Adaptor3d_HSurface)& Surf,
260 const Standard_Boolean redresse = Standard_False);
262 Handle(Geom2d_Curve) ChFi3d_BuildPCurve
263 (const Handle(Adaptor3d_HSurface)& Surf,
268 const Standard_Boolean redresse = Standard_False);
270 Standard_Boolean ChFi3d_CheckSameParameter
271 (const Handle(Adaptor3d_HCurve)& C3d,
272 Handle(Geom2d_Curve)& Pcurv,
273 const Handle(Adaptor3d_HSurface)& S,
274 const Standard_Real tol3d,
275 Standard_Real& tolreached);
277 Standard_Boolean ChFi3d_SameParameter(const Handle(Adaptor3d_HCurve)& C3d,
278 Handle(Geom2d_Curve)& Pcurv,
279 const Handle(Adaptor3d_HSurface)& S,
280 const Standard_Real tol3d,
281 Standard_Real& tolreached);
283 Standard_Boolean ChFi3d_SameParameter(const Handle(Geom_Curve)& C3d,
284 Handle(Geom2d_Curve)& Pcurv,
285 const Handle(Geom_Surface)& S,
286 const Standard_Real Pardeb,
287 const Standard_Real Parfin,
288 const Standard_Real tol3d,
289 Standard_Real& tolreached);
291 void ChFi3d_ComputePCurv(const Handle(Geom_Curve)& C3d,
294 Handle(Geom2d_Curve)& Pcurv,
295 const Handle(Geom_Surface)& S,
296 const Standard_Real Pardeb,
297 const Standard_Real Parfin,
298 const Standard_Real tol3d,
299 Standard_Real& tolreached,
300 const Standard_Boolean reverse = Standard_False);
302 void ChFi3d_ComputePCurv(const Handle(Adaptor3d_HCurve)& C3d,
305 Handle(Geom2d_Curve)& Pcurv,
306 const Handle(Adaptor3d_HSurface)& S,
307 const Standard_Real Pardeb,
308 const Standard_Real Parfin,
309 const Standard_Real tol3d,
310 Standard_Real& tolreached,
311 const Standard_Boolean reverse = Standard_False);
313 void ChFi3d_ComputePCurv(const gp_Pnt2d& UV1,
315 Handle(Geom2d_Curve)& Pcurv,
316 const Standard_Real Pardeb,
317 const Standard_Real Parfin,
318 const Standard_Boolean reverse = Standard_False);
320 Standard_Boolean ChFi3d_IntTraces(const Handle(ChFiDS_SurfData)& fd1,
321 const Standard_Real pref1,
323 const Standard_Integer jf1,
324 const Standard_Integer sens1,
325 const Handle(ChFiDS_SurfData)& fd2,
326 const Standard_Real pref2,
328 const Standard_Integer jf2,
329 const Standard_Integer sens2,
330 const gp_Pnt2d& RefP2d,
331 const Standard_Boolean Check2dDistance = Standard_False,
332 const Standard_Boolean enlarge = Standard_False);
334 Standard_Boolean ChFi3d_IsInFront(TopOpeBRepDS_DataStructure& DStr,
335 const Handle(ChFiDS_Stripe)& cd1,
336 const Handle(ChFiDS_Stripe)& cd2,
337 const Standard_Integer i1,
338 const Standard_Integer i2,
339 const Standard_Integer sens1,
340 const Standard_Integer sens2,
344 Standard_Boolean& sameside,
345 Standard_Integer& jf1,
346 Standard_Integer& jf2,
347 Standard_Boolean& visavis,
348 const TopoDS_Vertex& Vtx,
349 const Standard_Boolean Check2dDistance = Standard_False,
350 const Standard_Boolean enlarge = Standard_False);
352 void ChFi3d_ProjectPCurv(const Handle(Adaptor3d_HCurve)& HCg,
353 const Handle(Adaptor3d_HSurface)& HSg,
354 Handle(Geom2d_Curve)& Pcurv,
355 const Standard_Real tol3d,
356 Standard_Real& tolreached) ;
358 void ChFi3d_ReparamPcurv(const Standard_Real Uf,
359 const Standard_Real Ul,
360 Handle(Geom2d_Curve)& Pcurv) ;
362 void ChFi3d_ComputeArete(const ChFiDS_CommonPoint& P1,
364 const ChFiDS_CommonPoint& P2,
366 const Handle(Geom_Surface)& Surf,
367 Handle(Geom_Curve)& C3d,
368 Handle(Geom2d_Curve)& Pcurv,
369 Standard_Real& Pardeb,
370 Standard_Real& Parfin,
371 const Standard_Real tol3d,
372 const Standard_Real tol2d,
373 Standard_Real& tolreached,
374 const Standard_Integer IFlag);
376 Handle(TopOpeBRepDS_SurfaceCurveInterference)
377 ChFi3d_FilCurveInDS(const Standard_Integer Icurv,
378 const Standard_Integer Isurf,
379 const Handle(Geom2d_Curve)& Pcurv,
380 const TopAbs_Orientation Et);
382 TopAbs_Orientation ChFi3d_TrsfTrans(const IntSurf_TypeTrans T1);
384 Standard_EXPORT void ChFi3d_FilCommonPoint(const BRepBlend_Extremity& SP,
385 const IntSurf_TypeTrans TransLine,
386 const Standard_Boolean Start,
387 ChFiDS_CommonPoint& CP,
388 const Standard_Real Tol);
391 Standard_Integer ChFi3d_SolidIndex(const Handle(ChFiDS_Spine)& sp,
392 TopOpeBRepDS_DataStructure& DStr,
396 Standard_Integer ChFi3d_IndexPointInDS(const ChFiDS_CommonPoint& P1,
397 TopOpeBRepDS_DataStructure& DStr);
399 Handle(TopOpeBRepDS_CurvePointInterference) ChFi3d_FilPointInDS
400 (const TopAbs_Orientation Et,
401 const Standard_Integer Ic,
402 const Standard_Integer Ip,
403 const Standard_Real Par,
404 const Standard_Boolean IsVertex = Standard_False);
406 Handle(TopOpeBRepDS_CurvePointInterference) ChFi3d_FilVertexInDS
407 (const TopAbs_Orientation Et,
408 const Standard_Integer Ic,
409 const Standard_Integer Ip,
410 const Standard_Real Par);
412 void ChFi3d_FilDS(const Standard_Integer SolidIndex,
413 const Handle(ChFiDS_Stripe)& CorDat,
414 TopOpeBRepDS_DataStructure& DStr,
415 ChFiDS_Regularities& reglist,
416 const Standard_Real tol3d,
417 const Standard_Real tol2d);
420 void ChFi3d_StripeEdgeInter (const Handle(ChFiDS_Stripe)& theStripe1,
421 const Handle(ChFiDS_Stripe)& theStripe2,
422 TopOpeBRepDS_DataStructure& DStr,
423 const Standard_Real tol2d);
425 Standard_Integer ChFi3d_IndexOfSurfData(const TopoDS_Vertex& V1,
426 const Handle(ChFiDS_Stripe)& CD,
427 Standard_Integer& sens);
429 TopoDS_Edge ChFi3d_EdgeFromV1(const TopoDS_Vertex& V1,
430 const Handle(ChFiDS_Stripe)& CD,
431 Standard_Integer& sens);
433 Standard_Real ChFi3d_ConvTol2dToTol3d(const Handle(Adaptor3d_HSurface)& S,
434 const Standard_Real tol2d);
436 Standard_Boolean ChFi3d_ComputeCurves(const Handle(Adaptor3d_HSurface)& S1,
437 const Handle(Adaptor3d_HSurface)& S2,
438 const TColStd_Array1OfReal& Pardeb,
439 const TColStd_Array1OfReal& Parfin,
440 Handle(Geom_Curve)& C3d,
441 Handle(Geom2d_Curve)& Pc1,
442 Handle(Geom2d_Curve)& Pc2,
443 const Standard_Real tol3d,
444 const Standard_Real tol2d,
445 Standard_Real& tolreached,
446 const Standard_Boolean wholeCurv
449 Standard_Boolean ChFi3d_IntCS(const Handle(Adaptor3d_HSurface)& S,
450 const Handle(Adaptor3d_HCurve)& C,
454 void ChFi3d_ComputesIntPC (const ChFiDS_FaceInterference& Fi1,
455 const ChFiDS_FaceInterference& Fi2,
456 const Handle(GeomAdaptor_HSurface)& HS1,
457 const Handle(GeomAdaptor_HSurface)& HS2,
458 Standard_Real& UInt1,
459 Standard_Real& UInt2);
461 void ChFi3d_ComputesIntPC (const ChFiDS_FaceInterference& Fi1,
462 const ChFiDS_FaceInterference& Fi2,
463 const Handle(GeomAdaptor_HSurface)& HS1,
464 const Handle(GeomAdaptor_HSurface)& HS2,
465 Standard_Real& UInt1,
466 Standard_Real& UInt2,
469 Handle(GeomAdaptor_HSurface) ChFi3d_BoundSurf(TopOpeBRepDS_DataStructure& DStr,
470 const Handle(ChFiDS_SurfData)& Fd1,
471 const Standard_Integer& IFaCo1,
472 const Standard_Integer& IFaArc1);
474 Standard_Integer ChFi3d_SearchPivot(Standard_Integer* s,
475 Standard_Real u[3][3],
476 const Standard_Real t);
478 Standard_Boolean ChFi3d_SearchFD(TopOpeBRepDS_DataStructure& DStr,
479 const Handle(ChFiDS_Stripe)& cd1,
480 const Handle(ChFiDS_Stripe)& cd2,
481 const Standard_Integer sens1,
482 const Standard_Integer sens2,
483 Standard_Integer& i1,
484 Standard_Integer& i2,
487 const Standard_Integer ind1,
488 const Standard_Integer ind2,
490 Standard_Boolean& sameside,
491 Standard_Integer& jf1,
492 Standard_Integer& jf2);
495 void ChFi3d_Parameters(const Handle(Geom_Surface)& S,
500 void ChFi3d_TrimCurve(const Handle(Geom_Curve)& gc,
501 const gp_Pnt& FirstP,
503 Handle(Geom_TrimmedCurve)& gtc);
505 Standard_EXPORT void ChFi3d_PerformElSpine(Handle(ChFiDS_HElSpine)& HES,
506 Handle(ChFiDS_Spine)& Spine,
507 const GeomAbs_Shape continuity,
508 const Standard_Real tol);
510 TopoDS_Face ChFi3d_EnlargeFace(const Handle(ChFiDS_Spine)& Spine,
511 const Handle(BRepAdaptor_HSurface)& HS,
512 const Standard_Real Tol );
515 void ChFi3d_cherche_face1 (const TopTools_ListOfShape & map,
516 const TopoDS_Face & F1,
519 void ChFi3d_cherche_element( const TopoDS_Vertex & V,
520 const TopoDS_Edge & E1,
521 const TopoDS_Face & F1,
523 TopoDS_Vertex & Vtx );
525 Standard_Real ChFi3d_EvalTolReached(const Handle(Adaptor3d_HSurface)& S1,
526 const Handle(Geom2d_Curve)& pc1,
527 const Handle(Adaptor3d_HSurface)& S2,
528 const Handle(Geom2d_Curve)& pc2,
529 const Handle(Geom_Curve)& C);
531 void ChFi3d_cherche_edge( const TopoDS_Vertex & V,
532 const TopTools_Array1OfShape & E1,
533 const TopoDS_Face & F1,
535 TopoDS_Vertex & Vtx );
537 Standard_Integer ChFi3d_nbface (const TopTools_ListOfShape & mapVF );
539 void ChFi3d_edge_common_faces (const TopTools_ListOfShape & mapEF,
544 Standard_Real ChFi3d_AngleEdge (const TopoDS_Vertex & Vtx,
545 const TopoDS_Edge& E1,
546 const TopoDS_Edge & E2);
548 void ChFi3d_ChercheBordsLibres(const ChFiDS_Map & myVEMap,
549 const TopoDS_Vertex & V1,
550 Standard_Boolean & bordlibre,
551 TopoDS_Edge & edgelibre1,
552 TopoDS_Edge & edgelibre2);
554 Standard_Boolean ChFi3d_isTangentFaces(const TopoDS_Edge &theEdge,
555 const TopoDS_Face &theFace1,
556 const TopoDS_Face &theFace2,
557 const GeomAbs_Shape Order = GeomAbs_G1);
559 Standard_Integer ChFi3d_NbNotDegeneratedEdges (const TopoDS_Vertex& Vtx,
560 const ChFiDS_Map& VEMap);
561 Standard_Integer ChFi3d_NumberOfEdges(const TopoDS_Vertex& Vtx,
562 const ChFiDS_Map& VEMap);
564 Standard_Integer ChFi3d_NumberOfSharpEdges(const TopoDS_Vertex& Vtx,
565 const ChFiDS_Map& VEMap,
566 const ChFiDS_Map& EFmap);
568 void ChFi3d_cherche_vertex (const TopoDS_Edge & E1,
569 const TopoDS_Edge & E2,
570 TopoDS_Vertex & vertex,
571 Standard_Boolean & trouve);
573 void ChFi3d_Couture( const TopoDS_Face & F,
574 Standard_Boolean & couture,
575 TopoDS_Edge & edgecouture);
577 void ChFi3d_CoutureOnVertex( const TopoDS_Face & F,
578 const TopoDS_Vertex & V,
579 Standard_Boolean & couture,
580 TopoDS_Edge & edgecouture);
582 Standard_Boolean ChFi3d_IsPseudoSeam( const TopoDS_Edge& E,
583 const TopoDS_Face& F );
585 Handle(Geom_BSplineCurve) ChFi3d_ApproxByC2( const Handle(Geom_Curve)& C );
587 Standard_Boolean ChFi3d_IsSmooth( const Handle(Geom_Curve)& C );