1 // Created on: 1993-11-09
2 // Created by: Laurent BOURESCHE
3 // Copyright (c) 1993-1999 Matra Datavision
4 // Copyright (c) 1999-2014 OPEN CASCADE SAS
5 //
6 // This file is part of Open CASCADE Technology software library.
7 //
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.
13 //
14 // Alternatively, this file may be used under the terms of Open CASCADE
15 // commercial license or contractual agreement.
16 
17 #ifndef _ChFi3d_Builder_HeaderFile
18 #define _ChFi3d_Builder_HeaderFile
19 
20 #include <BRepAdaptor_Curve2d.hxx>
21 #include <BRepAdaptor_Surface.hxx>
22 #include <GeomAbs_Shape.hxx>
23 #include <ChFiDS_ErrorStatus.hxx>
24 #include <ChFiDS_ListOfStripe.hxx>
25 #include <ChFiDS_Map.hxx>
26 #include <ChFiDS_Regularities.hxx>
27 #include <ChFiDS_SequenceOfSurfData.hxx>
28 #include <ChFiDS_StripeMap.hxx>
29 #include <ChFiDS_ElSpine.hxx>
30 #include <math_Vector.hxx>
31 #include <TopoDS_Shape.hxx>
32 #include <TopTools_ListOfShape.hxx>
33 #include <TopTools_DataMapOfShapeListOfInteger.hxx>
34 #include <TopTools_DataMapOfShapeShape.hxx>
35 #include <TopAbs_Orientation.hxx>
36 #include <TopAbs_State.hxx>
37 
38 class TopOpeBRepDS_HDataStructure;
39 class TopOpeBRepBuild_HBuilder;
40 class TopoDS_Edge;
41 class ChFiDS_Spine;
42 class TopoDS_Vertex;
43 class Geom_Surface;
44 class ChFiDS_SurfData;
45 class Adaptor3d_TopolTool;
46 class BRepBlend_Line;
47 class Blend_Function;
48 class Blend_FuncInv;
49 class Blend_SurfRstFunction;
50 class Blend_SurfPointFuncInv;
51 class Blend_SurfCurvFuncInv;
52 class Blend_RstRstFunction;
53 class Blend_CurvPointFuncInv;
54 class ChFiDS_Stripe;
55 class BRepTopAdaptor_TopolTool;
56 class gp_Pnt2d;
57 class ChFiDS_CommonPoint;
58 class TopoDS_Face;
59 class AppBlend_Approx;
60 class Geom2d_Curve;
61 
62 
63 //! Root  class  for calculation of  surfaces (fillets,
64 //! chamfers)  destined  to smooth edges  of
65 //! a gap on a Shape and the reconstruction of  the   Shape.
66 class ChFi3d_Builder
67 {
68 public:
69 
70   DEFINE_STANDARD_ALLOC
71 
72   Standard_EXPORT virtual ~ChFi3d_Builder();
73 
74   Standard_EXPORT void SetParams (const Standard_Real Tang,
75                                   const Standard_Real Tesp,
76                                   const Standard_Real T2d,
77                                   const Standard_Real TApp3d,
78                                   const Standard_Real TolApp2d,
79                                   const Standard_Real Fleche);
80 
81   Standard_EXPORT void SetContinuity (const GeomAbs_Shape InternalContinuity,
82                                       const Standard_Real AngularTolerance);
83 
84   //! extracts from  the list the contour containing edge E.
85   Standard_EXPORT void Remove (const TopoDS_Edge& E);
86 
87   //! gives the number of  the contour containing E or 0
88   //! if E does  not  belong to  any  contour.
89   Standard_EXPORT Standard_Integer Contains (const TopoDS_Edge& E) const;
90 
91   //! gives  the number of  the contour containing E or 0
92   //! if E does  not  belong  to  any  contour.
93   //! Sets in IndexInSpine the index of E in the contour if it's found
94   Standard_EXPORT Standard_Integer Contains (const TopoDS_Edge& E,
95                                              Standard_Integer& IndexInSpine) const;
96 
97   //! gives the number of  disjoint contours on  which
98   //! the  fillets  are  calculated
99   Standard_EXPORT Standard_Integer NbElements() const;
100 
101   //! gives the n'th set  of edges (contour)
102   //! if I >NbElements()
103   Standard_EXPORT Handle(ChFiDS_Spine) Value (const Standard_Integer I) const;
104 
105   //! returns the length of  the contour of index IC.
106   Standard_EXPORT Standard_Real Length (const Standard_Integer IC) const;
107 
108   //! returns the First vertex V of
109   //! the contour of index IC.
110   Standard_EXPORT TopoDS_Vertex FirstVertex (const Standard_Integer IC) const;
111 
112   //! returns the Last vertex V of
113   //! the contour of index IC.
114   Standard_EXPORT TopoDS_Vertex LastVertex (const Standard_Integer IC) const;
115 
116   //! returns the abscissa of the vertex V on
117   //! the contour of index IC.
118   Standard_EXPORT Standard_Real Abscissa (const Standard_Integer IC,
119                                           const TopoDS_Vertex& V) const;
120 
121   //! returns the relative abscissa([0.,1.]) of the
122   //! vertex V on the contour of index IC.
123   Standard_EXPORT Standard_Real RelativeAbscissa (const Standard_Integer IC,
124                                                   const TopoDS_Vertex& V) const;
125 
126   //! returns true if the contour of index IC is closed
127   //! an tangent.
128   Standard_EXPORT Standard_Boolean ClosedAndTangent (const Standard_Integer IC) const;
129 
130   //! returns true if the contour of index IC is closed
131   Standard_EXPORT Standard_Boolean Closed (const Standard_Integer IC) const;
132 
133   //! general calculation of geometry on all edges,
134   //! topologic reconstruction.
135   Standard_EXPORT void Compute();
136 
137   //! returns True if the computation  is  success
138   Standard_EXPORT Standard_Boolean IsDone() const;
139 
140   //! if (Isdone()) makes the result.
141   //! if (!Isdone())
142   Standard_EXPORT TopoDS_Shape Shape() const;
143 
144   //! Advanced  function for the history
145   Standard_EXPORT const TopTools_ListOfShape& Generated (const TopoDS_Shape& EouV);
146 
147   //! Returns the number of contours on  which the calculation
148   //! has failed.
149   Standard_EXPORT Standard_Integer NbFaultyContours() const;
150 
151   //! Returns the number of  I'th contour on  which the calculation
152   //! has failed.
153   Standard_EXPORT Standard_Integer FaultyContour (const Standard_Integer I) const;
154 
155   //! Returns the number of  surfaces calculated  on  the contour IC.
156   Standard_EXPORT Standard_Integer NbComputedSurfaces (const Standard_Integer IC) const;
157 
158   //! Returns the IS'th surface calculated on  the contour IC.
159   Standard_EXPORT Handle(Geom_Surface) ComputedSurface (const Standard_Integer IC,
160                                                         const Standard_Integer IS) const;
161 
162   //! Returns the number of vertices on  which the calculation
163   //! has failed.
164   Standard_EXPORT Standard_Integer NbFaultyVertices() const;
165 
166   //! Returns the IV'th vertex on  which the calculation has failed.
167   Standard_EXPORT TopoDS_Vertex FaultyVertex (const Standard_Integer IV) const;
168 
169   //! returns True if  a partial result has  been  calculated
170   Standard_EXPORT Standard_Boolean HasResult() const;
171 
172   //! if (HasResult()) returns partial result
173   //! if (!HasResult())
174   Standard_EXPORT TopoDS_Shape BadShape() const;
175 
176   //! for the stripe IC ,indication on the cause
177   //! of  failure WalkingFailure,TwistedSurface,Error, Ok
178   Standard_EXPORT ChFiDS_ErrorStatus StripeStatus (const Standard_Integer IC) const;
179 
180   //! Reset all results of compute and returns the algorithm
181   //! in the state of the last acquisition to enable modification of contours or areas.
182   Standard_EXPORT void Reset();
183 
184   //! Returns the Builder of  topologic operations.
185   Standard_EXPORT Handle(TopOpeBRepBuild_HBuilder) Builder() const;
186 
187   //! Method, implemented in the inheritants, calculates
188   //! the elements of construction of the surface (fillet or
189   //! chamfer).
190   Standard_EXPORT Standard_Boolean SplitKPart (const Handle(ChFiDS_SurfData)& Data,
191                                                ChFiDS_SequenceOfSurfData& SetData,
192                                                const Handle(ChFiDS_Spine)& Spine,
193                                                const Standard_Integer Iedge,
194                                                const Handle(Adaptor3d_Surface)& S1,
195                                                const Handle(Adaptor3d_TopolTool)& I1,
196                                                const Handle(Adaptor3d_Surface)& S2,
197                                                const Handle(Adaptor3d_TopolTool)& I2,
198                                                Standard_Boolean& Intf,
199                                                Standard_Boolean& Intl);
200 
201   Standard_EXPORT Standard_Boolean PerformTwoCornerbyInter (const Standard_Integer Index);
202 
203 
204 
205 
206 protected:
207 
208 
209   Standard_EXPORT ChFi3d_Builder(const TopoDS_Shape& S, const Standard_Real Ta);
210 
211   Standard_EXPORT virtual void SimulKPart (const Handle(ChFiDS_SurfData)& SD) const = 0;
212 
213   Standard_EXPORT virtual Standard_Boolean SimulSurf (Handle(ChFiDS_SurfData)& Data,
214                                                       const Handle(ChFiDS_ElSpine)& Guide,
215                                                       const Handle(ChFiDS_Spine)& Spine,
216                                                       const Standard_Integer Choix,
217                                                       const Handle(BRepAdaptor_Surface)& S1,
218                                                       const Handle(Adaptor3d_TopolTool)& I1,
219                                                       const Handle(BRepAdaptor_Surface)& S2,
220                                                       const Handle(Adaptor3d_TopolTool)& I2,
221                                                       const Standard_Real TolGuide,
222                                                       Standard_Real& First,
223                                                       Standard_Real& Last,
224                                                       const Standard_Boolean Inside,
225                                                       const Standard_Boolean Appro,
226                                                       const Standard_Boolean Forward,
227                                                       const Standard_Boolean RecOnS1,
228                                                       const Standard_Boolean RecOnS2,
229                                                       const math_Vector& Soldep,
230                                                       Standard_Integer& Intf,
231                                                       Standard_Integer& Intl) = 0;
232 
233   Standard_EXPORT virtual void SimulSurf (Handle(ChFiDS_SurfData)& Data,
234                                           const Handle(ChFiDS_ElSpine)& Guide,
235                                           const Handle(ChFiDS_Spine)& Spine,
236                                           const Standard_Integer Choix,
237                                           const Handle(BRepAdaptor_Surface)& S1,
238                                           const Handle(Adaptor3d_TopolTool)& I1,
239                                           const Handle(BRepAdaptor_Curve2d)& PC1,
240                                           const Handle(BRepAdaptor_Surface)& Sref1,
241                                           const Handle(BRepAdaptor_Curve2d)& PCref1,
242                                           Standard_Boolean& Decroch1,
243                                           const Handle(BRepAdaptor_Surface)& S2,
244                                           const Handle(Adaptor3d_TopolTool)& I2,
245                                           const TopAbs_Orientation Or2,
246                                           const Standard_Real Fleche,
247                                           const Standard_Real TolGuide,
248                                           Standard_Real& First,
249                                           Standard_Real& Last,
250                                           const Standard_Boolean Inside,
251                                           const Standard_Boolean Appro,
252                                           const Standard_Boolean Forward,
253                                           const Standard_Boolean RecP,
254                                           const Standard_Boolean RecS,
255                                           const Standard_Boolean RecRst,
256                                           const math_Vector& Soldep);
257 
258   Standard_EXPORT virtual void SimulSurf (Handle(ChFiDS_SurfData)& Data,
259                                           const Handle(ChFiDS_ElSpine)& Guide,
260                                           const Handle(ChFiDS_Spine)& Spine,
261                                           const Standard_Integer Choix,
262                                           const Handle(BRepAdaptor_Surface)& S1,
263                                           const Handle(Adaptor3d_TopolTool)& I1,
264                                           const TopAbs_Orientation Or1,
265                                           const Handle(BRepAdaptor_Surface)& S2,
266                                           const Handle(Adaptor3d_TopolTool)& I2,
267                                           const Handle(BRepAdaptor_Curve2d)& PC2,
268                                           const Handle(BRepAdaptor_Surface)& Sref2,
269                                           const Handle(BRepAdaptor_Curve2d)& PCref2,
270                                           Standard_Boolean& Decroch2,
271                                           const Standard_Real Fleche,
272                                           const Standard_Real TolGuide,
273                                           Standard_Real& First,
274                                           Standard_Real& Last,
275                                           const Standard_Boolean Inside,
276                                           const Standard_Boolean Appro,
277                                           const Standard_Boolean Forward,
278                                           const Standard_Boolean RecP,
279                                           const Standard_Boolean RecS,
280                                           const Standard_Boolean RecRst,
281                                           const math_Vector& Soldep);
282 
283   Standard_EXPORT virtual void SimulSurf (Handle(ChFiDS_SurfData)& Data,
284                                           const Handle(ChFiDS_ElSpine)& Guide,
285                                           const Handle(ChFiDS_Spine)& Spine,
286                                           const Standard_Integer Choix,
287                                           const Handle(BRepAdaptor_Surface)& S1,
288                                           const Handle(Adaptor3d_TopolTool)& I1,
289                                           const Handle(BRepAdaptor_Curve2d)& PC1,
290                                           const Handle(BRepAdaptor_Surface)& Sref1,
291                                           const Handle(BRepAdaptor_Curve2d)& PCref1,
292                                           Standard_Boolean& Decroch1,
293                                           const TopAbs_Orientation Or1,
294                                           const Handle(BRepAdaptor_Surface)& S2,
295                                           const Handle(Adaptor3d_TopolTool)& I2,
296                                           const Handle(BRepAdaptor_Curve2d)& PC2,
297                                           const Handle(BRepAdaptor_Surface)& Sref2,
298                                           const Handle(BRepAdaptor_Curve2d)& PCref2,
299                                           Standard_Boolean& Decroch2,
300                                           const TopAbs_Orientation Or2,
301                                           const Standard_Real Fleche,
302                                           const Standard_Real TolGuide,
303                                           Standard_Real& First,
304                                           Standard_Real& Last,
305                                           const Standard_Boolean Inside,
306                                           const Standard_Boolean Appro,
307                                           const Standard_Boolean Forward,
308                                           const Standard_Boolean RecP1,
309                                           const Standard_Boolean RecRst1,
310                                           const Standard_Boolean RecP2,
311                                           const Standard_Boolean RecRst2,
312                                           const math_Vector& Soldep);
313 
314   Standard_EXPORT Standard_Boolean SimulData (Handle(ChFiDS_SurfData)& Data,
315                                               const Handle(ChFiDS_ElSpine)& Guide,
316                                               const Handle(ChFiDS_ElSpine)& AdditionalGuide,
317                                               Handle(BRepBlend_Line)& Lin,
318                                               const Handle(Adaptor3d_Surface)& S1,
319                                               const Handle(Adaptor3d_TopolTool)& I1,
320                                               const Handle(Adaptor3d_Surface)& S2,
321                                               const Handle(Adaptor3d_TopolTool)& I2,
322                                               Blend_Function& Func,
323                                               Blend_FuncInv& FInv,
324                                               const Standard_Real PFirst,
325                                               const Standard_Real MaxStep,
326                                               const Standard_Real Fleche,
327                                               const Standard_Real TolGuide,
328                                               Standard_Real& First,
329                                               Standard_Real& Last,
330                                               const Standard_Boolean Inside,
331                                               const Standard_Boolean Appro,
332                                               const Standard_Boolean Forward,
333                                               const math_Vector& Soldep,
334                                               const Standard_Integer NbSecMin,
335                                               const Standard_Boolean RecOnS1 = Standard_False,
336                                               const Standard_Boolean RecOnS2 = Standard_False);
337 
338   Standard_EXPORT Standard_Boolean SimulData (Handle(ChFiDS_SurfData)& Data,
339                                               const Handle(ChFiDS_ElSpine)& HGuide,
340                                               Handle(BRepBlend_Line)& Lin,
341                                               const Handle(Adaptor3d_Surface)& S1,
342                                               const Handle(Adaptor3d_TopolTool)& I1,
343                                               const Handle(Adaptor3d_Surface)& S2,
344                                               const Handle(Adaptor2d_Curve2d)& PC2,
345                                               const Handle(Adaptor3d_TopolTool)& I2,
346                                               Standard_Boolean& Decroch,
347                                               Blend_SurfRstFunction& Func,
348                                               Blend_FuncInv& FInv,
349                                               Blend_SurfPointFuncInv& FInvP,
350                                               Blend_SurfCurvFuncInv& FInvC,
351                                               const Standard_Real PFirst,
352                                               const Standard_Real MaxStep,
353                                               const Standard_Real Fleche,
354                                               const Standard_Real TolGuide,
355                                               Standard_Real& First,
356                                               Standard_Real& Last,
357                                               const math_Vector& Soldep,
358                                               const Standard_Integer NbSecMin,
359                                               const Standard_Boolean Inside,
360                                               const Standard_Boolean Appro,
361                                               const Standard_Boolean Forward,
362                                               const Standard_Boolean RecP,
363                                               const Standard_Boolean RecS,
364                                               const Standard_Boolean RecRst);
365 
366   Standard_EXPORT Standard_Boolean SimulData (Handle(ChFiDS_SurfData)& Data,
367                                               const Handle(ChFiDS_ElSpine)& HGuide,
368                                               Handle(BRepBlend_Line)& Lin,
369                                               const Handle(Adaptor3d_Surface)& S1,
370                                               const Handle(Adaptor2d_Curve2d)& PC1,
371                                               const Handle(Adaptor3d_TopolTool)& I1,
372                                               Standard_Boolean& Decroch1,
373                                               const Handle(Adaptor3d_Surface)& S2,
374                                               const Handle(Adaptor2d_Curve2d)& PC2,
375                                               const Handle(Adaptor3d_TopolTool)& I2,
376                                               Standard_Boolean& Decroch2,
377                                               Blend_RstRstFunction& Func,
378                                               Blend_SurfCurvFuncInv& FInv1,
379                                               Blend_CurvPointFuncInv& FInvP1,
380                                               Blend_SurfCurvFuncInv& FInv2,
381                                               Blend_CurvPointFuncInv& FInvP2,
382                                               const Standard_Real PFirst,
383                                               const Standard_Real MaxStep,
384                                               const Standard_Real Fleche,
385                                               const Standard_Real TolGuide,
386                                               Standard_Real& First,
387                                               Standard_Real& Last,
388                                               const math_Vector& Soldep,
389                                               const Standard_Integer NbSecMin,
390                                               const Standard_Boolean Inside,
391                                               const Standard_Boolean Appro,
392                                               const Standard_Boolean Forward,
393                                               const Standard_Boolean RecP1,
394                                               const Standard_Boolean RecRst1,
395                                               const Standard_Boolean RecP2,
396                                               const Standard_Boolean RecRst2);
397 
398   Standard_EXPORT virtual void SetRegul() = 0;
399 
400   Standard_EXPORT Standard_Boolean PerformElement (const Handle(ChFiDS_Spine)& CElement,
401                                                    const Standard_Real         Offset,
402                                                    const TopoDS_Face&          theFirstFace);
403 
404   Standard_EXPORT void PerformExtremity (const Handle(ChFiDS_Spine)& CElement);
405 
406   Standard_EXPORT void PerformSetOfSurf (Handle(ChFiDS_Stripe)& S,
407                                          const Standard_Boolean Simul = Standard_False);
408 
409   Standard_EXPORT void PerformSetOfKPart (Handle(ChFiDS_Stripe)& S,
410                                           const Standard_Boolean Simul = Standard_False);
411 
412   Standard_EXPORT void PerformSetOfKGen (Handle(ChFiDS_Stripe)& S,
413                                          const Standard_Boolean Simul = Standard_False);
414 
415   Standard_EXPORT void Trunc (const Handle(ChFiDS_SurfData)& SD,
416                               const Handle(ChFiDS_Spine)& Spine,
417                               const Handle(Adaptor3d_Surface)& S1,
418                               const Handle(Adaptor3d_Surface)& S2,
419                               const Standard_Integer iedge,
420                               const Standard_Boolean isfirst,
421                               const Standard_Integer cntlFiOnS);
422 
423   Standard_EXPORT void CallPerformSurf (Handle(ChFiDS_Stripe)& Stripe,
424                                         const Standard_Boolean Simul,
425                                         ChFiDS_SequenceOfSurfData& SeqSD,
426                                         Handle(ChFiDS_SurfData)& SD,
427                                         const Handle(ChFiDS_ElSpine)& Guide,
428                                         const Handle(ChFiDS_Spine)& Spine,
429                                         const Handle(BRepAdaptor_Surface)& HS1,
430                                         const Handle(BRepAdaptor_Surface)& HS3,
431                                         const gp_Pnt2d& P1,
432                                         const gp_Pnt2d& P3,
433                                         const Handle(Adaptor3d_TopolTool)& I1,
434                                         const Handle(BRepAdaptor_Surface)& HS2,
435                                         const Handle(BRepAdaptor_Surface)& HS4,
436                                         const gp_Pnt2d& P2, const gp_Pnt2d& P4,
437                                         const Handle(Adaptor3d_TopolTool)& I2,
438                                         const Standard_Real MaxStep,
439                                         const Standard_Real Fleche,
440                                         const Standard_Real TolGuide,
441                                         Standard_Real& First,
442                                         Standard_Real& Last,
443                                         const Standard_Boolean Inside,
444                                         const Standard_Boolean Appro,
445                                         const Standard_Boolean Forward,
446                                         const Standard_Boolean RecOnS1,
447                                         const Standard_Boolean RecOnS2,
448                                         math_Vector& Soldep,
449                                         Standard_Integer& Intf,
450                                         Standard_Integer& Intl,
451                                         Handle(BRepAdaptor_Surface)& Surf1,
452                                         Handle(BRepAdaptor_Surface)& Surf2);
453 
454   //! Method, implemented in the inheritants, calculating
455   //! elements of construction of the surface (fillet or
456   //! chamfer).
457   Standard_EXPORT virtual Standard_Boolean PerformSurf (ChFiDS_SequenceOfSurfData& Data,
458                                                         const Handle(ChFiDS_ElSpine)& Guide,
459                                                         const Handle(ChFiDS_Spine)& Spine,
460                                                         const Standard_Integer Choix,
461                                                         const Handle(BRepAdaptor_Surface)& S1,
462                                                         const Handle(Adaptor3d_TopolTool)& I1,
463                                                         const Handle(BRepAdaptor_Surface)& S2,
464                                                         const Handle(Adaptor3d_TopolTool)& I2,
465                                                         const Standard_Real MaxStep,
466                                                         const Standard_Real Fleche,
467                                                         const Standard_Real TolGuide,
468                                                         Standard_Real& First,
469                                                         Standard_Real& Last,
470                                                         const Standard_Boolean Inside,
471                                                         const Standard_Boolean Appro,
472                                                         const Standard_Boolean Forward,
473                                                         const Standard_Boolean RecOnS1,
474                                                         const Standard_Boolean RecOnS2,
475                                                         const math_Vector& Soldep,
476                                                         Standard_Integer& Intf,
477                                                         Standard_Integer& Intl) = 0;
478 
479   //! Method, implemented  in inheritants, calculates
480   //! the elements of construction of  the surface (fillet
481   //! or chamfer) contact edge/face.
482   Standard_EXPORT virtual void PerformSurf (ChFiDS_SequenceOfSurfData& Data,
483                                             const Handle(ChFiDS_ElSpine)& Guide,
484                                             const Handle(ChFiDS_Spine)& Spine,
485                                             const Standard_Integer Choix,
486                                             const Handle(BRepAdaptor_Surface)& S1,
487                                             const Handle(Adaptor3d_TopolTool)& I1,
488                                             const Handle(BRepAdaptor_Curve2d)& PC1,
489                                             const Handle(BRepAdaptor_Surface)& Sref1,
490                                             const Handle(BRepAdaptor_Curve2d)& PCref1,
491                                             Standard_Boolean& Decroch1,
492                                             const Handle(BRepAdaptor_Surface)& S2,
493                                             const Handle(Adaptor3d_TopolTool)& I2,
494                                             const TopAbs_Orientation Or2,
495                                             const Standard_Real MaxStep,
496                                             const Standard_Real Fleche,
497                                             const Standard_Real TolGuide,
498                                             Standard_Real& First,
499                                             Standard_Real& Last,
500                                             const Standard_Boolean Inside,
501                                             const Standard_Boolean Appro,
502                                             const Standard_Boolean Forward,
503                                             const Standard_Boolean RecP,
504                                             const Standard_Boolean RecS,
505                                             const Standard_Boolean RecRst,
506                                             const math_Vector& Soldep);
507 
508   //! Method, implemented in  inheritants, calculates
509   //! the elements of construction of  the surface (fillet
510   //! or chamfer) contact edge/face.
511   Standard_EXPORT virtual void PerformSurf (ChFiDS_SequenceOfSurfData& Data,
512                                             const Handle(ChFiDS_ElSpine)& Guide,
513                                             const Handle(ChFiDS_Spine)& Spine,
514                                             const Standard_Integer Choix,
515                                             const Handle(BRepAdaptor_Surface)& S1,
516                                             const Handle(Adaptor3d_TopolTool)& I1,
517                                             const TopAbs_Orientation Or1,
518                                             const Handle(BRepAdaptor_Surface)& S2,
519                                             const Handle(Adaptor3d_TopolTool)& I2,
520                                             const Handle(BRepAdaptor_Curve2d)& PC2,
521                                             const Handle(BRepAdaptor_Surface)& Sref2,
522                                             const Handle(BRepAdaptor_Curve2d)& PCref2,
523                                             Standard_Boolean& Decroch2,
524                                             const Standard_Real MaxStep,
525                                             const Standard_Real Fleche,
526                                             const Standard_Real TolGuide,
527                                             Standard_Real& First,
528                                             Standard_Real& Last,
529                                             const Standard_Boolean Inside,
530                                             const Standard_Boolean Appro,
531                                             const Standard_Boolean Forward,
532                                             const Standard_Boolean RecP,
533                                             const Standard_Boolean RecS,
534                                             const Standard_Boolean RecRst,
535                                             const math_Vector& Soldep);
536 
537   //! Method, implemented in inheritants, calculates
538   //! the elements of construction of  the surface (fillet
539   //! or chamfer) contact edge/edge.
540   Standard_EXPORT virtual void PerformSurf (ChFiDS_SequenceOfSurfData& Data,
541                                             const Handle(ChFiDS_ElSpine)& Guide,
542                                             const Handle(ChFiDS_Spine)& Spine,
543                                             const Standard_Integer Choix,
544                                             const Handle(BRepAdaptor_Surface)& S1,
545                                             const Handle(Adaptor3d_TopolTool)& I1,
546                                             const Handle(BRepAdaptor_Curve2d)& PC1,
547                                             const Handle(BRepAdaptor_Surface)& Sref1,
548                                             const Handle(BRepAdaptor_Curve2d)& PCref1,
549                                             Standard_Boolean& Decroch1,
550                                             const TopAbs_Orientation Or1,
551                                             const Handle(BRepAdaptor_Surface)& S2,
552                                             const Handle(Adaptor3d_TopolTool)& I2,
553                                             const Handle(BRepAdaptor_Curve2d)& PC2,
554                                             const Handle(BRepAdaptor_Surface)& Sref2,
555                                             const Handle(BRepAdaptor_Curve2d)& PCref2,
556                                             Standard_Boolean& Decroch2,
557                                             const TopAbs_Orientation Or2,
558                                             const Standard_Real MaxStep,
559                                             const Standard_Real Fleche,
560                                             const Standard_Real TolGuide,
561                                             Standard_Real& First,
562                                             Standard_Real& Last,
563                                             const Standard_Boolean Inside,
564                                             const Standard_Boolean Appro,
565                                             const Standard_Boolean Forward,
566                                             const Standard_Boolean RecP1,
567                                             const Standard_Boolean RecRst1,
568                                             const Standard_Boolean RecP2,
569                                             const Standard_Boolean RecRst2,
570                                             const math_Vector& Soldep);
571 
572   Standard_EXPORT virtual void PerformTwoCorner (const Standard_Integer Index) = 0;
573 
574   Standard_EXPORT virtual void PerformThreeCorner (const Standard_Integer Index) = 0;
575 
576   Standard_EXPORT void PerformMoreThreeCorner (const Standard_Integer Index,
577                                                const Standard_Integer nbcourb);
578 
579   Standard_EXPORT virtual void ExtentOneCorner (const TopoDS_Vertex& V,
580                                                 const Handle(ChFiDS_Stripe)& S) = 0;
581 
582   Standard_EXPORT virtual void ExtentTwoCorner (const TopoDS_Vertex& V,
583                                                 const ChFiDS_ListOfStripe& LS) = 0;
584 
585   Standard_EXPORT virtual void ExtentThreeCorner (const TopoDS_Vertex& V,
586                                                   const ChFiDS_ListOfStripe& LS) = 0;
587 
588   Standard_EXPORT virtual Standard_Boolean PerformFirstSection (const Handle(ChFiDS_Spine)& S,
589                                                                 const Handle(ChFiDS_ElSpine)& HGuide,
590                                                                 const Standard_Integer Choix,
591                                                                 Handle(BRepAdaptor_Surface)& S1,
592                                                                 Handle(BRepAdaptor_Surface)& S2,
593                                                                 const Handle(Adaptor3d_TopolTool)& I1,
594                                                                 const Handle(Adaptor3d_TopolTool)& I2,
595                                                                 const Standard_Real Par,
596                                                                 math_Vector& SolDep,
597                                                                 TopAbs_State& Pos1,
598                                                                 TopAbs_State& Pos2) const = 0;
599 
600   Standard_EXPORT Standard_Boolean SearchFace (const Handle(ChFiDS_Spine)& Sp,
601                                                const ChFiDS_CommonPoint& Pc,
602                                                const TopoDS_Face& FRef,
603                                                TopoDS_Face& FVoi) const;
604 
605   Standard_EXPORT Standard_Boolean StripeOrientations (const Handle(ChFiDS_Spine)& Sp,
606                                                        TopAbs_Orientation& Or1,
607                                                        TopAbs_Orientation& Or2,
608                                                        Standard_Integer& ChoixConge) const;
609 
610   //! Calculates  a Line of contact face/face.
611   Standard_EXPORT Standard_Boolean ComputeData (Handle(ChFiDS_SurfData)& Data,
612                                                 const Handle(ChFiDS_ElSpine)& Guide,
613                                                 const Handle(ChFiDS_Spine)& Spine,
614                                                 Handle(BRepBlend_Line)& Lin,
615                                                 const Handle(Adaptor3d_Surface)& S1,
616                                                 const Handle(Adaptor3d_TopolTool)& I1,
617                                                 const Handle(Adaptor3d_Surface)& S2,
618                                                 const Handle(Adaptor3d_TopolTool)& I2,
619                                                 Blend_Function& Func,
620                                                 Blend_FuncInv& FInv,
621                                                 const Standard_Real PFirst,
622                                                 const Standard_Real MaxStep,
623                                                 const Standard_Real Fleche,
624                                                 const Standard_Real TolGuide,
625                                                 Standard_Real& First,
626                                                 Standard_Real& Last,
627                                                 const Standard_Boolean Inside,
628                                                 const Standard_Boolean Appro,
629                                                 const Standard_Boolean Forward,
630                                                 const math_Vector& Soldep,
631                                                 Standard_Integer& Intf,
632                                                 Standard_Integer& Intl,
633                                                 Standard_Boolean& Gd1,
634                                                 Standard_Boolean& Gd2,
635                                                 Standard_Boolean& Gf1,
636                                                 Standard_Boolean& Gf2,
637                                                 const Standard_Boolean RecOnS1 = Standard_False,
638                                                 const Standard_Boolean RecOnS2 = Standard_False);
639 
640   //! Calculates a Line of contact edge/face.
641   Standard_EXPORT Standard_Boolean ComputeData (Handle(ChFiDS_SurfData)& Data,
642                                                 const Handle(ChFiDS_ElSpine)& HGuide,
643                                                 Handle(BRepBlend_Line)& Lin,
644                                                 const Handle(Adaptor3d_Surface)& S1,
645                                                 const Handle(Adaptor3d_TopolTool)& I1,
646                                                 const Handle(Adaptor3d_Surface)& S2,
647                                                 const Handle(Adaptor2d_Curve2d)& PC2,
648                                                 const Handle(Adaptor3d_TopolTool)& I2,
649                                                 Standard_Boolean& Decroch,
650                                                 Blend_SurfRstFunction& Func,
651                                                 Blend_FuncInv& FInv,
652                                                 Blend_SurfPointFuncInv& FInvP,
653                                                 Blend_SurfCurvFuncInv& FInvC,
654                                                 const Standard_Real PFirst,
655                                                 const Standard_Real MaxStep,
656                                                 const Standard_Real Fleche,
657                                                 const Standard_Real TolGuide,
658                                                 Standard_Real& First,
659                                                 Standard_Real& Last,
660                                                 const math_Vector& Soldep,
661                                                 const Standard_Boolean Inside,
662                                                 const Standard_Boolean Appro,
663                                                 const Standard_Boolean Forward,
664                                                 const Standard_Boolean RecP,
665                                                 const Standard_Boolean RecS,
666                                                 const Standard_Boolean RecRst);
667 
668   //! Calculates a Line of contact edge/edge.
669   Standard_EXPORT Standard_Boolean ComputeData (Handle(ChFiDS_SurfData)& Data,
670                                                 const Handle(ChFiDS_ElSpine)& HGuide,
671                                                 Handle(BRepBlend_Line)& Lin,
672                                                 const Handle(Adaptor3d_Surface)& S1,
673                                                 const Handle(Adaptor2d_Curve2d)& PC1,
674                                                 const Handle(Adaptor3d_TopolTool)& I1,
675                                                 Standard_Boolean& Decroch1,
676                                                 const Handle(Adaptor3d_Surface)& S2,
677                                                 const Handle(Adaptor2d_Curve2d)& PC2,
678                                                 const Handle(Adaptor3d_TopolTool)& I2,
679                                                 Standard_Boolean& Decroch2,
680                                                 Blend_RstRstFunction& Func,
681                                                 Blend_SurfCurvFuncInv& FInv1,
682                                                 Blend_CurvPointFuncInv& FInvP1,
683                                                 Blend_SurfCurvFuncInv& FInv2,
684                                                 Blend_CurvPointFuncInv& FInvP2,
685                                                 const Standard_Real PFirst,
686                                                 const Standard_Real MaxStep,
687                                                 const Standard_Real Fleche,
688                                                 const Standard_Real TolGuide,
689                                                 Standard_Real& First,
690                                                 Standard_Real& Last,
691                                                 const math_Vector& Soldep,
692                                                 const Standard_Boolean Inside,
693                                                 const Standard_Boolean Appro,
694                                                 const Standard_Boolean Forward,
695                                                 const Standard_Boolean RecP1,
696                                                 const Standard_Boolean RecRst1,
697                                                 const Standard_Boolean RecP2,
698                                                 const Standard_Boolean RecRst2);
699 
700   Standard_EXPORT Standard_Boolean CompleteData (Handle(ChFiDS_SurfData)& Data,
701                                                  Blend_Function& Func,
702                                                  Handle(BRepBlend_Line)& Lin,
703                                                  const Handle(Adaptor3d_Surface)& S1,
704                                                  const Handle(Adaptor3d_Surface)& S2,
705                                                  const TopAbs_Orientation Or1,
706                                                  const Standard_Boolean Gd1,
707                                                  const Standard_Boolean Gd2,
708                                                  const Standard_Boolean Gf1,
709                                                  const Standard_Boolean Gf2,
710                                                  const Standard_Boolean Reversed = Standard_False);
711 
712   Standard_EXPORT Standard_Boolean CompleteData (Handle(ChFiDS_SurfData)& Data,
713                                                  Blend_SurfRstFunction& Func,
714                                                  Handle(BRepBlend_Line)& Lin,
715                                                  const Handle(Adaptor3d_Surface)& S1,
716                                                  const Handle(Adaptor3d_Surface)& S2,
717                                                  const TopAbs_Orientation Or,
718                                                  const Standard_Boolean Reversed);
719 
720   Standard_EXPORT Standard_Boolean CompleteData (Handle(ChFiDS_SurfData)& Data,
721                                                  Blend_RstRstFunction& Func,
722                                                  Handle(BRepBlend_Line)& Lin,
723                                                  const Handle(Adaptor3d_Surface)& S1,
724                                                  const Handle(Adaptor3d_Surface)& S2,
725                                                  const TopAbs_Orientation Or);
726 
727   Standard_EXPORT Standard_Boolean StoreData (Handle(ChFiDS_SurfData)& Data,
728                                               const AppBlend_Approx& Approx,
729                                               const Handle(BRepBlend_Line)& Lin,
730                                               const Handle(Adaptor3d_Surface)& S1,
731                                               const Handle(Adaptor3d_Surface)& S2,
732                                               const TopAbs_Orientation Or1,
733                                               const Standard_Boolean Gd1,
734                                               const Standard_Boolean Gd2,
735                                               const Standard_Boolean Gf1,
736                                               const Standard_Boolean Gf2,
737                                               const Standard_Boolean Reversed = Standard_False);
738 
739   Standard_EXPORT Standard_Boolean CompleteData (Handle(ChFiDS_SurfData)& Data,
740                                                  const Handle(Geom_Surface)& Surfcoin,
741                                                  const Handle(Adaptor3d_Surface)& S1,
742                                                  const Handle(Geom2d_Curve)& PC1,
743                                                  const Handle(Adaptor3d_Surface)& S2,
744                                                  const Handle(Geom2d_Curve)& PC2,
745                                                  const TopAbs_Orientation Or,
746                                                  const Standard_Boolean On1,
747                                                  const Standard_Boolean Gd1,
748                                                  const Standard_Boolean Gd2,
749                                                  const Standard_Boolean Gf1,
750                                                  const Standard_Boolean Gf2);
751 
752 
753   Standard_Real tolappangle;
754   Standard_Real tolesp;
755   Standard_Real tol2d;
756   Standard_Real tolapp3d;
757   Standard_Real tolapp2d;
758   Standard_Real fleche;
759   GeomAbs_Shape myConti;
760   ChFiDS_Map myEFMap;
761   ChFiDS_Map myESoMap;
762   ChFiDS_Map myEShMap;
763   ChFiDS_Map myVFMap;
764   ChFiDS_Map myVEMap;
765   Handle(TopOpeBRepDS_HDataStructure) myDS;
766   Handle(TopOpeBRepBuild_HBuilder) myCoup;
767   ChFiDS_ListOfStripe myListStripe;
768   ChFiDS_StripeMap myVDataMap;
769   ChFiDS_Regularities myRegul;
770   ChFiDS_ListOfStripe badstripes;
771   TopTools_ListOfShape badvertices;
772   TopTools_DataMapOfShapeListOfInteger myEVIMap;
773   TopTools_DataMapOfShapeShape myEdgeFirstFace;
774   Standard_Boolean done;
775   Standard_Boolean hasresult;
776 
777 
778 private:
779 
780 
781   Standard_EXPORT Standard_Boolean FaceTangency (const TopoDS_Edge& E0,
782                                                  const TopoDS_Edge& E1,
783                                                  const TopoDS_Vertex& V) const;
784 
785   Standard_EXPORT void PerformSetOfSurfOnElSpine (const Handle(ChFiDS_ElSpine)& ES,
786                                                   Handle(ChFiDS_Stripe)& St,
787                                                   Handle(BRepTopAdaptor_TopolTool)& It1,
788                                                   Handle(BRepTopAdaptor_TopolTool)& It2,
789                                                   const Standard_Boolean Simul = Standard_False);
790 
791   Standard_EXPORT void PerformFilletOnVertex (const Standard_Integer Index);
792 
793   Standard_EXPORT void PerformSingularCorner (const Standard_Integer Index);
794 
795   Standard_EXPORT void PerformOneCorner (const Standard_Integer Index,
796                                          const Standard_Boolean PrepareOnSame = Standard_False);
797 
798   Standard_EXPORT void IntersectMoreCorner (const Standard_Integer Index);
799 
800   Standard_EXPORT void PerformMoreSurfdata (const Standard_Integer Index);
801 
802   Standard_EXPORT void PerformIntersectionAtEnd (const Standard_Integer Index);
803 
804   Standard_EXPORT void ExtentAnalyse();
805 
806   Standard_EXPORT Standard_Boolean FindFace (const TopoDS_Vertex& V,
807                                              const ChFiDS_CommonPoint& P1,
808                                              const ChFiDS_CommonPoint& P2,
809                                              TopoDS_Face& Fv) const;
810 
811   Standard_EXPORT Standard_Boolean FindFace (const TopoDS_Vertex& V,
812                                              const ChFiDS_CommonPoint& P1,
813                                              const ChFiDS_CommonPoint& P2,
814                                              TopoDS_Face& Fv,
815                                              const TopoDS_Face& Favoid) const;
816 
817   Standard_EXPORT Standard_Boolean MoreSurfdata (const Standard_Integer Index) const;
818 
819   Standard_EXPORT Standard_Boolean StartSol (const Handle(ChFiDS_Spine)& Spine,
820                                              Handle(BRepAdaptor_Surface)& HS,
821                                              gp_Pnt2d& P,
822                                              Handle(BRepAdaptor_Curve2d)& HC,
823                                              Standard_Real& W,
824                                              const Handle(ChFiDS_SurfData)& SD,
825                                              const Standard_Boolean isFirst,
826                                              const Standard_Integer OnS,
827                                              Handle(BRepAdaptor_Surface)& HSref,
828                                              Handle(BRepAdaptor_Curve2d)& HCref,
829                                              Standard_Boolean& RecP,
830                                              Standard_Boolean& RecS,
831                                              Standard_Boolean& RecRst,
832                                              Standard_Boolean& C1Obst,
833                                              Handle(BRepAdaptor_Surface)& HSbis,
834                                              gp_Pnt2d& Pbis,
835                                              const Standard_Boolean Decroch,
836                                              const TopoDS_Vertex& Vref) const;
837 
838   Standard_EXPORT void StartSol (const Handle(ChFiDS_Stripe)& S,
839                                  const Handle(ChFiDS_ElSpine)& HGuide,
840                                  Handle(BRepAdaptor_Surface)& HS1,
841                                  Handle(BRepAdaptor_Surface)& HS2,
842                                  Handle(BRepTopAdaptor_TopolTool)& I1,
843                                  Handle(BRepTopAdaptor_TopolTool)& I2,
844                                  gp_Pnt2d& P1,
845                                  gp_Pnt2d& P2,
846                                  Standard_Real& First) const;
847 
848   Standard_EXPORT void ConexFaces (const Handle(ChFiDS_Spine)& Sp,
849                                    const Standard_Integer IEdge,
850                                    Handle(BRepAdaptor_Surface)& HS1,
851                                    Handle(BRepAdaptor_Surface)& HS2) const;
852 
853 
854   TopoDS_Shape myShape;
855   Standard_Real angular;
856   TopTools_ListOfShape myGenerated;
857   TopoDS_Shape myShapeResult;
858   TopoDS_Shape badShape;
859 
860 
861 };
862 
863 
864 
865 
866 
867 
868 
869 #endif // _ChFi3d_Builder_HeaderFile
870