0025568: SIGSEGV in thrusections with edge without 3D curve
[occt.git] / src / BRepFill / BRepFill_Generator.cxx
1 // Created on: 1994-03-07
2 // Created by: Bruno DUMORTIER
3 // Copyright (c) 1994-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 #include <BRepFill_Generator.ixx>
18
19 #include <TopoDS_Face.hxx>
20 #include <TopoDS_Wire.hxx>
21 #include <TopoDS_Edge.hxx>
22 #include <TopoDS_Vertex.hxx>
23 #include <BRep_Builder.hxx>
24 #include <TopLoc_Location.hxx>
25 #include <TopExp_Explorer.hxx>
26 #include <gp_Pnt2d.hxx>
27 #include <gp_Dir2d.hxx>
28 #include <gp_Ax1.hxx>
29 #include <gp_Ax3.hxx>
30 #include <gp_Circ.hxx>
31 #include <gp_Lin.hxx>
32 #include <GeomAbs_Shape.hxx>
33 #include <GeomAdaptor_Curve.hxx>
34 #include <Geom_Circle.hxx>
35 #include <Geom_Line.hxx>
36 #include <Geom_Curve.hxx>
37 #include <Geom_BezierCurve.hxx>
38 #include <Geom_TrimmedCurve.hxx>
39 #include <Geom_Surface.hxx>
40 #include <Geom_Plane.hxx>
41 #include <Geom_CylindricalSurface.hxx>
42 #include <Geom_ConicalSurface.hxx>
43 #include <Geom_RectangularTrimmedSurface.hxx>
44 #include <Geom2d_Line.hxx>
45 #include <Geom2d_BezierCurve.hxx>
46 #include <GeomFill_Generator.hxx>
47
48 #include <TopTools_DataMapOfShapeShape.hxx>
49 #include <GeomFill.hxx>
50 #include <BRep_Tool.hxx>
51 #include <TopoDS.hxx>
52 #include <TopExp.hxx>
53 #include <Precision.hxx>
54 #include <BRepLib.hxx>
55
56 #include <TColgp_Array1OfPnt.hxx> 
57 #include <TColgp_Array1OfPnt2d.hxx> 
58 #include <Geom_BSplineCurve.hxx> 
59 #include <gp_Vec.hxx>
60 #include <GeomConvert.hxx>
61
62 #include <BRepTools_WireExplorer.hxx>
63 #include <BRepTools.hxx>
64 #include <Standard_NullObject.hxx>
65
66
67 //=======================================================================
68 //function : DetectKPart
69 //purpose  : 
70 //=======================================================================
71
72 Standard_Integer DetectKPart(const TopoDS_Edge& Edge1,
73                              const TopoDS_Edge& Edge2)
74 {
75   // initializations
76   Standard_Integer IType = 0;
77
78   // characteristics of the first edge
79   Standard_Real first1 = 0., last1 = 0., first2, last2, ff, ll;
80   TopLoc_Location loc;
81   TopoDS_Vertex V1, V2;
82   Handle(Geom_Curve) curv1, curv;
83   GeomAdaptor_Curve AdC1;
84   Standard_Boolean degen1 = BRep_Tool::Degenerated(Edge1);
85
86   // find the particular case
87   gp_Pnt pos1, pos;
88   Standard_Real  dist;
89   Standard_Real dist1 =0.;
90   gp_Ax1 axe1, axe;
91
92   if (degen1) {
93     IType = -2;
94     TopExp::Vertices(Edge1,V1,V2);
95     pos1 = BRep_Tool::Pnt(V1);
96   }
97   else {
98     curv1 = BRep_Tool::Curve(Edge1, loc, first1, last1);
99     if (curv1.IsNull())
100       Standard_NullObject::Raise("Null 3D curve in edge");
101     curv1 = 
102       Handle(Geom_Curve)::DownCast(curv1->Transformed(loc.Transformation()));
103     ff = first1;
104     ll = last1;
105     if (Edge1.Orientation() == TopAbs_REVERSED) {
106       curv1->Reverse();
107       first1 = curv1->ReversedParameter(ll);
108       last1 = curv1->ReversedParameter(ff);
109     }
110     AdC1.Load(curv1);
111     if (AdC1.GetType() == GeomAbs_Circle) {
112       // first circular section 
113       IType = 1;
114       pos1 = AdC1.Circle().Location();
115       dist1 = AdC1.Circle().Radius();
116       axe1 = AdC1.Circle().Axis();
117     }
118     else if (AdC1.GetType() == GeomAbs_Line) {
119       // first straight line section 
120       IType = 4;
121       pos1 = AdC1.Line().Location();
122       dist1 = AdC1.Value(first1).Distance(AdC1.Value(last1));
123       gp_Vec vec(AdC1.Value(first1),AdC1.Value(last1));
124       gp_Dir dir(vec);
125       axe1 = gp_Ax1(AdC1.Value(first1),dir);
126     }
127     else {
128       // first section of any type
129       IType = 0;
130     }
131   }
132
133   if (IType!=0) {
134
135     Standard_Boolean degen2 = BRep_Tool::Degenerated(Edge2);
136     if (degen2) {
137       TopExp::Vertices(Edge2,V1,V2);
138       pos = BRep_Tool::Pnt(V1);
139       if (IType==1) {
140         // the only particular case with degenerated edge at end : the cone
141         if (pos.IsEqual(pos1,Precision::Confusion())) {
142           // the top is mixed with the center of the circle
143           IType = 0;
144         }
145         else {
146           gp_Vec vec(pos1,pos);
147           gp_Dir dir(vec);
148           axe = gp_Ax1(pos1,dir);
149           if (axe.IsParallel(axe1,Precision::Angular())) {
150             // the top is on the axis of the circle
151             IType = 2;
152           }
153           else {
154             // incorrect top --> no particular case
155             IType = 0;
156           }
157         }
158       }
159       else if (IType != 4) { //not a plane
160         // no particular case
161         IType = 0;
162       }
163     }
164     else {
165       curv = BRep_Tool::Curve(Edge2, loc, first2, last2);
166       if (curv.IsNull())
167         Standard_NullObject::Raise("Null 3D curve in edge");
168       curv = 
169         Handle(Geom_Curve)::DownCast(curv->Transformed(loc.Transformation()));
170       ff = first2;
171       ll = last2;
172       if (Edge2.Orientation() == TopAbs_REVERSED) {
173         curv->Reverse();
174         first2 = curv->ReversedParameter(ll);
175         last2 = curv->ReversedParameter(ff);
176       }
177       GeomAdaptor_Curve AdC(curv);
178     
179       if (IType>0 && IType<4) {
180         if (AdC.GetType() != GeomAbs_Circle) {
181           // section not circular --> no particular case
182           IType = 0;
183         }
184         else {
185           if (AdC.Circle().Axis()
186               .IsCoaxial(axe1,Precision::Angular(),Precision::Confusion())) {
187             // same axis
188             if (Abs(AdC.Circle().Radius()-dist1)< Precision::Confusion()) {
189               // possibility of cylinder or a piece of cylinder
190               Standard_Real h1 = Abs(last1-first1), h2 = Abs(last2-first2);
191               Standard_Boolean Same, 
192                SameParametricLength = ( Abs(h1-h2) < Precision::PConfusion() );
193               Standard_Real m1=(first1+last1)/2., m2=(first2+last2)/2.;
194               gp_Pnt P1,P2;
195               gp_Vec DU;
196               AdC1.D1(m1,P1,DU);
197               AdC.D0(m2,P2);
198               Same = SameParametricLength 
199                 && ( gp_Vec(P1,P2).IsNormal(DU,Precision::Angular()) ) ;
200               if (Same) {
201                 // cylinder or piece of cylinder
202                 IType = 1;
203               }
204               else {
205                 // the interval of definition is not correct
206                 IType = 0;
207               }
208             }
209             else {
210               // possibility of cone truncation
211               Standard_Real h1 = Abs(last1-first1), h2 = Abs(last2-first2);
212               Standard_Boolean Same, 
213                SameParametricLength = ( Abs(h1-h2) < Precision::PConfusion() );
214               Standard_Real m1=(first1+last1)/2., m2=(first2+last2)/2.;
215               gp_Pnt P1,P2;
216               gp_Vec DU;
217               AdC1.D1(m1,P1,DU);
218               AdC.D0(m2,P2);
219               Same = SameParametricLength 
220                 && ( gp_Vec(P1,P2).IsNormal(DU,Precision::Angular()) ) ;
221               if (Same) {
222                 // truncation of cone
223                 IType = 2;
224               }
225               else {
226                 // the interval of definition is not correct
227                 IType = 0;
228               }
229             }
230             if (AdC.Circle().Location().IsEqual(pos1,Precision::Confusion())) {
231               // the centers are mixed
232               IType = 0;
233             }
234           }
235           else {
236             // different axis
237             if (AdC.Circle().Radius()==dist1) {
238               // torus ?
239               IType = 3;
240             }
241             else {
242               // different radius --> no particular case
243               IType = 0;
244             }
245           }
246         }
247       }
248       else if (IType>=4) {
249         if (AdC.GetType() != GeomAbs_Line) {
250           // not a straight line section --> no particular case
251           IType = 0;
252         }
253         else {
254           pos = AdC.Line().Location();
255           dist = AdC.Value(first2).Distance(AdC.Value(last2));
256           gp_Vec vec(AdC.Value(first2),AdC.Value(last2));
257           gp_Dir dir(vec);
258           axe = gp_Ax1(AdC.Value(first2),dir);
259           if (axe.IsParallel(axe1,Precision::Angular())) {
260             // parallel straight line
261             if (Abs(dist-dist1)<Precision::Confusion()) {
262               gp_Dir dir(gp_Vec(AdC1.Value(first1),AdC.Value(first2)));
263               if (dir.IsNormal(gp_Dir(vec),Precision::Angular())) {
264                 // plane
265                 IType = 4;
266               }
267               else {
268                 // extrusion ?
269                 IType = 5;
270               }
271             }
272             else {
273               // different length --> no particular case
274               IType = 0;
275             }
276           }
277           else {
278             // not parallel straight line --> no particular case
279             IType = 0;
280           }
281         }
282       }
283       else if (IType==-2) {
284         if (AdC.GetType() == GeomAbs_Line)
285           IType = 4; //plane
286         else if (AdC.GetType() == GeomAbs_Circle)
287           {
288             // the only particular case with degenerated edge at the beginning the cone
289             pos = AdC.Circle().Location();
290             axe = AdC.Circle().Axis();
291             if (pos1.IsEqual(pos,Precision::Confusion())) {
292               // the top is mixed with the center of the circle
293               IType = 0;
294             }
295             else {
296               gp_Vec vec(pos1,pos);
297               gp_Dir dir(vec);
298               axe1 = gp_Ax1(pos1,dir);
299               if (axe.IsParallel(axe1,Precision::Angular())) {
300                 // the top is on the axis of the circle
301                 IType = -2;
302               }
303               else {
304                 // incorrect top --> no particular case
305                 IType = 0;
306               }
307             }
308           }
309         else
310           IType = 0;
311       }
312     }
313     
314   }
315   // torus and extrusion are not particular cases.
316   if (IType == 3 || IType == 5) IType = 0;
317   return IType;
318 }
319
320
321 //=======================================================================
322 //function : CreateKPart
323 //purpose  : 
324 //=======================================================================
325
326 void CreateKPart(const TopoDS_Edge& Edge1,const TopoDS_Edge& Edge2,
327                  const Standard_Integer IType, 
328                  Handle(Geom_Surface)& Surf)
329 {
330   // find the dimension
331   TopoDS_Vertex V1, V2;
332
333   TopLoc_Location loc;
334   Standard_Real a1, b1, aa =0., bb =0.;
335   TopoDS_Vertex v1f,v1l,v2f,v2l;
336
337   // find characteristics of the first edge
338   Handle(Geom_Curve) C1;
339   Standard_Boolean degen1 = BRep_Tool::Degenerated(Edge1);
340   if(degen1) {
341     // cone with degenerated edge at the top
342     TopExp::Vertices(Edge1,v1f,v1l);
343   }
344   else {
345     C1 = BRep_Tool::Curve(Edge1, loc, a1, b1);
346     if (C1.IsNull())
347       Standard_NullObject::Raise("Null 3D curve in edge");
348     C1 = Handle(Geom_Curve)::DownCast(C1->Transformed(loc.Transformation()));
349     aa = a1;
350     bb = b1;
351     if (Edge1.Orientation() == TopAbs_REVERSED) {
352       C1->Reverse();
353       aa = C1->ReversedParameter(b1);
354       bb = C1->ReversedParameter(a1);
355       TopExp::Vertices(Edge1,v1l,v1f);
356     }
357     else {
358       TopExp::Vertices(Edge1,v1f,v1l);
359     }
360   }
361
362   // find characteristics of the second edge
363   Handle(Geom_Curve) C2;
364   Standard_Boolean degen2 = BRep_Tool::Degenerated(Edge2);
365   if(degen2) {
366     // cone with degenerated edge at the top
367     TopExp::Vertices(Edge2,v2f,v2l);
368   }
369   else {
370     C2 = BRep_Tool::Curve(Edge2, loc, a1, b1);
371     if (C2.IsNull())
372       Standard_NullObject::Raise("Null 3D curve in edge");
373     C2 = Handle(Geom_Curve)::DownCast(C2->Transformed(loc.Transformation()));
374     if (Edge2.Orientation() == TopAbs_REVERSED) {
375       C2->Reverse();
376       if (degen1) {
377         aa = a1;
378         bb = b1;
379       }
380       TopExp::Vertices(Edge2,v2l,v2f);
381     }
382     else {
383       if (degen1) {
384         aa = a1; //C2->ReversedParameter(b1);
385         bb = b1; //C2->ReversedParameter(a1);
386       }
387       TopExp::Vertices(Edge2,v2f,v2l);
388     }
389   }
390
391   // create the new surface
392   TopoDS_Face face;
393   TopoDS_Wire W;
394   TopoDS_Edge edge1, edge2, edge3, edge4, couture;
395
396   TopoDS_Wire newW1, newW2;
397   BRep_Builder BW1, BW2;
398   BW1.MakeWire(newW1);
399   BW2.MakeWire(newW2);
400
401
402   // calculate the surface
403   Handle(Geom_Surface) surface;
404   Standard_Real V, Rad;
405   if (IType==1) {
406     // cylindrical surface
407     gp_Circ c1 = (Handle(Geom_Circle)::DownCast(C1))->Circ();
408     gp_Circ c2 = (Handle(Geom_Circle)::DownCast(C2))->Circ();
409     gp_Ax3 Ac1 = c1.Position();
410     V = gp_Vec( c1.Location(),c2.Location()).Dot(gp_Vec(Ac1.Direction()));
411     if ( V < 0.) {
412       Ac1.ZReverse();
413       V = -V;
414     }
415     Handle(Geom_CylindricalSurface) Cyl = 
416       new Geom_CylindricalSurface( Ac1, c1.Radius());
417     surface = new Geom_RectangularTrimmedSurface
418       ( Cyl, aa, bb, Min(0.,V), Max(0.,V) );
419   }
420   else if (IType==2) {
421     // conical surface
422     gp_Circ k1 = (Handle(Geom_Circle)::DownCast(C1))->Circ();
423     gp_Ax3 Ak1 = k1.Position();
424     if (degen2) {
425       V = gp_Vec( k1.Location(),BRep_Tool::Pnt(v2f))
426         .Dot(gp_Vec(Ak1.Direction()));
427       Rad = - k1.Radius();
428     }
429     else {
430       gp_Circ k2 = (Handle(Geom_Circle)::DownCast(C2))->Circ();
431       V = gp_Vec( k1.Location(),k2.Location()).Dot(gp_Vec(Ak1.Direction()));
432       Rad = k2.Radius() - k1.Radius();
433     }
434       
435     if ( V < 0.) {
436       Ak1.ZReverse();
437       V = -V;
438     }
439     Standard_Real Ang = ATan( Rad / V);
440     Handle(Geom_ConicalSurface) Cone = 
441       new Geom_ConicalSurface( Ak1, Ang, k1.Radius());
442     V /= Cos(Ang);
443     surface = new Geom_RectangularTrimmedSurface
444       ( Cone, aa, bb, Min(0.,V), Max(0.,V) );
445   }
446   else if (IType==-2) {
447     // conical surface with the top at the beginning (degen1 is true)
448     gp_Circ k2 = (Handle(Geom_Circle)::DownCast(C2))->Circ();
449     gp_Ax3 Ak2 = k2.Position();
450     Ak2.SetLocation(BRep_Tool::Pnt(v1f));
451     V = gp_Vec(BRep_Tool::Pnt(v1f),k2.Location())
452                                 .Dot(gp_Vec(Ak2.Direction()));
453     Rad = k2.Radius(); // - k2.Radius();      
454     if ( V < 0.) {
455       Ak2.ZReverse();
456       V = -V;
457     }
458     Standard_Real Ang = ATan( Rad / V);
459     Handle(Geom_ConicalSurface) Cone = 
460       new Geom_ConicalSurface( Ak2, Ang, 0.);
461     V /= Cos(Ang);
462     surface = new Geom_RectangularTrimmedSurface
463       ( Cone, aa, bb, Min(0.,V), Max(0.,V) );
464   }
465   else if (IType==3) {
466     // torus surface ?
467   }
468   else if (IType==4) {
469     // surface plane
470     gp_Lin L1, L2, aLine;
471     if (!degen1)
472       {
473         L1 = (Handle(Geom_Line)::DownCast(C1))->Lin();
474         aLine = L1;
475       }
476     if (!degen2)
477       {
478         L2 = (Handle(Geom_Line)::DownCast(C2))->Lin();
479         aLine = L2;
480       }
481
482     gp_Pnt P1 = (degen1)? BRep_Tool::Pnt(v1f) : L1.Location();
483     gp_Pnt P2 = (degen2)? BRep_Tool::Pnt(v2f) : L2.Location();
484
485     gp_Vec P1P2( P1, P2 ); 
486     gp_Dir D1 = aLine.Direction();
487     gp_Ax3 Ax( aLine.Location(), gp_Dir(D1.Crossed(P1P2)), D1 );
488     Handle(Geom_Plane) Plan = new Geom_Plane(Ax);
489     V = P1P2.Dot( Ax.YDirection());
490     surface = Plan;
491     //surface = new Geom_RectangularTrimmedSurface
492       //( Plan, aa, bb, Min(0.,V), Max(0.,V) );
493   }
494   else if (IType==5) {
495     // surface of extrusion ?
496   }
497   else {
498     // IType incorrect
499   }
500   Surf = surface;
501 }
502
503
504 //=======================================================================
505 //function : BRepFill_Generator
506 //purpose  : 
507 //=======================================================================
508
509 BRepFill_Generator::BRepFill_Generator()
510 {
511 }
512
513
514 //=======================================================================
515 //function : AddWire
516 //purpose  : 
517 //=======================================================================
518
519 void BRepFill_Generator::AddWire(const TopoDS_Wire& Wire)
520 {
521   myWires.Append( Wire);
522 }
523
524
525 //=======================================================================
526 //function : Perform
527 //purpose  : 
528 //=======================================================================
529
530 void BRepFill_Generator::Perform()
531 {
532   TopoDS_Shell Shell;
533   TopoDS_Face  Face;
534   TopoDS_Shape S1, S2;
535   TopoDS_Edge  Edge1, Edge2, Edge3, Edge4, Couture;
536
537   BRep_Builder B;
538   B.MakeShell(myShell);
539
540   Standard_Integer Nb = myWires.Length();
541
542   BRepTools_WireExplorer ex1,ex2;
543
544   Standard_Boolean wPoint1, wPoint2, uClosed = Standard_False, DegenFirst = Standard_False, DegenLast = Standard_False;
545   
546   for ( Standard_Integer i = 1; i <= Nb-1; i++) {
547
548     TopoDS_Wire Wire1 = TopoDS::Wire(myWires( i ));
549     TopoDS_Wire Wire2 = TopoDS::Wire(myWires(i+1));
550
551     wPoint1 = Standard_False;
552     if (i==1) {
553       wPoint1 = Standard_True;
554       for(ex1.Init(Wire1); ex1.More(); ex1.Next()) {
555         wPoint1 = wPoint1 && (BRep_Tool::Degenerated(ex1.Current()));
556       }
557       DegenFirst = wPoint1;
558
559       TopoDS_Vertex V1, V2;
560       TopExp::Vertices(Wire1, V1, V2);
561       uClosed = V1.IsSame(V2);
562     }
563
564     wPoint2 = Standard_False;
565     if (i==Nb-1) {
566       wPoint2 = Standard_True;
567       for(ex2.Init(Wire2); ex2.More(); ex2.Next()) {
568         wPoint2 = wPoint2 && (BRep_Tool::Degenerated(ex2.Current()));
569       }
570       DegenLast = wPoint2;
571     }
572
573     ex1.Init(Wire1);
574     ex2.Init(Wire2);
575
576     TopTools_DataMapOfShapeShape Map;
577     
578     Standard_Boolean tantque = ex1.More() && ex2.More();
579
580     while ( tantque ) { 
581
582       TopoDS_Vertex V1f,V1l,V2f,V2l, Vf_toMap, Vl_toMap;
583
584       Standard_Boolean degen1 
585         = BRep_Tool::Degenerated(TopoDS::Edge(ex1.Current()));
586       Standard_Boolean degen2
587         = BRep_Tool::Degenerated(TopoDS::Edge(ex2.Current()));
588
589       if ( degen1 ) {
590         TopoDS_Shape aLocalShape = ex1.Current().EmptyCopied();
591         Edge1 = TopoDS::Edge(aLocalShape);
592 //      Edge1 = TopoDS::Edge(ex1.Current().EmptyCopied());
593 //      aLocalShape = ex1.Current();
594 //      TopExp::Vertices(TopoDS::Edge(aLocalShape),V1f,V1l);
595         TopExp::Vertices(TopoDS::Edge(ex1.Current()),V1f,V1l);
596         V1f.Orientation(TopAbs_FORWARD);
597         B.Add(Edge1,V1f);
598         V1l.Orientation(TopAbs_REVERSED);
599         B.Add(Edge1,V1l);
600         B.Range(Edge1,0,1);
601       }
602       else {
603         TopoDS_Shape aLocalShape = ex1.Current();
604         Edge1 = TopoDS::Edge(aLocalShape);
605 //      Edge1 = TopoDS::Edge(ex1.Current());
606       }
607
608       if ( degen2 ) {
609         TopoDS_Shape aLocalShape = ex2.Current().EmptyCopied();
610         Edge2 = TopoDS::Edge(aLocalShape);
611 //      Edge2 = TopoDS::Edge(ex2.Current().EmptyCopied());
612         TopExp::Vertices(TopoDS::Edge(ex2.Current()),V2f,V2l);
613         V2f.Orientation(TopAbs_FORWARD);
614         B.Add(Edge2,V2f);
615         V2l.Orientation(TopAbs_REVERSED);
616         B.Add(Edge2,V2l);
617         B.Range(Edge2,0,1);
618       }
619       else {
620         Edge2 = TopoDS::Edge(ex2.Current());
621       }
622
623       Standard_Boolean Periodic
624         = (Edge1.Closed() || degen1) && (Edge2.Closed() || degen2);
625       // ATTENTION : a non-punctual wire should not 
626       //             contain a punctual edge
627       if (!wPoint1) ex1.Next();
628       if (!wPoint2) ex2.Next();
629
630       // initialization of vertices
631       Handle(Geom_Surface) Surf;
632       Standard_Real f1=0, l1=1, f2=0, l2=1;
633       if (Edge1.Orientation() == TopAbs_REVERSED)
634         TopExp::Vertices(Edge1,V1l,V1f);
635       else
636         TopExp::Vertices(Edge1,V1f,V1l);
637       if (Edge2.Orientation() == TopAbs_REVERSED)
638         TopExp::Vertices(Edge2,V2l,V2f);
639       else
640         TopExp::Vertices(Edge2,V2f,V2l);
641       if (degen1)
642         {
643           Vf_toMap = V2f;
644           Vl_toMap = V2l;
645         }
646       else
647         {
648           Vf_toMap = V1f;
649           Vl_toMap = V1l;
650         }
651       
652       if(Periodic) {
653         Standard_Boolean E1IsReallyClosed = BRepTools::Compare(V1f,V1l);
654         Standard_Boolean E2IsReallyClosed = BRepTools::Compare(V2f,V2l);
655         Periodic 
656           = (E1IsReallyClosed || degen1) && (E2IsReallyClosed || degen2);
657       }
658       // processing of KPart
659       Standard_Integer IType = DetectKPart(Edge1,Edge2);
660       if (IType==0) {
661         // no part cases
662         TopLoc_Location L,L1,L2;
663
664         Handle(Geom_Curve) C1, C2;
665         TColgp_Array1OfPnt Extremities(1,2);
666       
667         if (degen1) {
668           Extremities(1) = BRep_Tool::Pnt(V1f);
669           Extremities(2) = BRep_Tool::Pnt(V1l);
670           C1 = new Geom_BezierCurve(Extremities);
671         }
672         else {
673           C1 = BRep_Tool::Curve(Edge1,L1,f1,l1);
674           if (C1.IsNull())
675             Standard_NullObject::Raise("Null 3D curve in edge");
676         }
677         if (degen2) {
678           Extremities(1) = BRep_Tool::Pnt(V2l);
679           Extremities(2) = BRep_Tool::Pnt(V2f);
680           C2 = new Geom_BezierCurve(Extremities);
681         }
682         else {
683           C2 = BRep_Tool::Curve(Edge2,L2,f2,l2);
684           if (C2.IsNull())
685             Standard_NullObject::Raise("Null 3D curve in edge");
686         }
687         
688         // compute the location
689         Standard_Boolean SameLoc = Standard_False;
690         
691         // transform and trim the curves
692       
693         if (Abs(f1 - C1->FirstParameter()) > Precision::PConfusion() ||
694             Abs(l1 - C1->LastParameter())  > Precision::PConfusion()   ) {
695           C1 = new Geom_TrimmedCurve(C1,f1,l1);
696         }
697         else {
698           C1 = Handle(Geom_Curve)::DownCast(C1->Copy());
699         }
700         if (!SameLoc) C1->Transform(L1.Transformation());
701         if (Edge1.Orientation() == TopAbs_REVERSED) {
702           C1->Reverse();
703         }
704         
705         if (Abs(f2 - C2->FirstParameter()) > Precision::PConfusion() ||
706             Abs(l2 - C2->LastParameter())  > Precision::PConfusion()   ) {
707           C2 = new Geom_TrimmedCurve(C2,f2,l2);
708         }
709         else {
710           C2 = Handle(Geom_Curve)::DownCast(C2->Copy());
711         }
712         if (!SameLoc) C2->Transform(L2.Transformation());
713         if (Edge2.Orientation() == TopAbs_REVERSED) {
714           C2->Reverse();
715         }
716         
717         GeomFill_Generator Generator;
718         Generator.AddCurve( C1);
719         Generator.AddCurve( C2);
720         Generator.Perform( Precision::PConfusion());
721         
722         Surf = Generator.Surface();
723         B.MakeFace(Face,Surf,Precision::Confusion());
724       }
725       else {
726         // particular case
727         CreateKPart(Edge1,Edge2,IType,Surf);
728         B.MakeFace(Face,Surf,Precision::Confusion());
729       }
730       
731       // make the missing edges
732       Standard_Real first,last;
733       Surf->Bounds(f1,l1,f2,l2);
734
735       if ( Map.IsBound(Vf_toMap)) {
736         TopoDS_Shape aLocalShape = Map(Vf_toMap).Reversed();
737         Edge3 = TopoDS::Edge(aLocalShape);
738 //      Edge3 = TopoDS::Edge(Map(V1f).Reversed());
739       }
740       else {
741         Handle(Geom_Curve) CC;
742         TColgp_Array1OfPnt Extremities(1,2);
743         if (IType==0) {
744           // general case : Edge3 corresponds to iso U=f1
745           CC = Surf->UIso(f1);
746           first=f2;
747           last=l2;
748         }
749         else {
750           // particular case : it is required to calculate the curve 3d
751           Extremities(1) = BRep_Tool::Pnt(V1f);
752           Extremities(2) = BRep_Tool::Pnt(V2f);
753           CC = new Geom_BezierCurve(Extremities);
754           first=0.;
755           last=1.;
756         }
757         B.MakeEdge(Edge3,CC,Precision::Confusion());
758         V1f.Orientation(TopAbs_FORWARD);
759         B.Add(Edge3,V1f);
760         V2f.Orientation(TopAbs_REVERSED);
761         B.Add(Edge3,V2f);
762         B.Range(Edge3,first,last);
763         Edge3.Reverse();
764         Map.Bind(Vf_toMap, Edge3);
765       }
766
767       Standard_Boolean CommonEdge = Standard_False;
768       if ( Map.IsBound(Vl_toMap)  ) {
769         TopoDS_Shape aLocalShape = Map(Vl_toMap).Reversed();
770         const TopoDS_Edge CommonE = TopoDS::Edge(aLocalShape);
771 //      const TopoDS_Edge CommonE = TopoDS::Edge(Map(V1l).Reversed());
772         TopoDS_Vertex V1, V2;
773         TopExp::Vertices(CommonE,V1,V2);
774         CommonEdge = V1.IsSame(V1l) && V2.IsSame(V2l);
775       }
776       if ( CommonEdge ) {
777         TopoDS_Shape aLocalShape = Map(Vl_toMap).Reversed();
778         Edge4 = TopoDS::Edge(aLocalShape);
779 //      Edge4 = TopoDS::Edge(Map(V1l).Reversed());
780       }
781       else {
782         Handle(Geom_Curve) CC;
783         TColgp_Array1OfPnt Extremities(1,2);
784         if (IType==0) {
785           // general case : Edge4 corresponds to iso U=l1
786           CC = Surf->UIso(l1);
787           first=f2;
788           last=l2;
789         }
790         else {
791           // particular case : it is required to calculate the curve 3d
792           Extremities(1) = BRep_Tool::Pnt(V1l);
793           Extremities(2) = BRep_Tool::Pnt(V2l);
794           CC = new Geom_BezierCurve(Extremities);
795           first=0.;
796           last=1.;
797         }
798         B.MakeEdge(Edge4,CC,Precision::Confusion());
799         V1l.Orientation(TopAbs_FORWARD);
800         B.Add(Edge4,V1l);
801         V2l.Orientation(TopAbs_REVERSED);
802         B.Add(Edge4,V2l);
803         B.Range(Edge4,first,last);
804         Map.Bind(Vl_toMap, Edge4);
805       }
806
807       // make the wire
808       
809       TopoDS_Wire W;
810       B.MakeWire(W);
811       
812       if (! (degen1 && IType == 4))
813         B.Add(W,Edge1);
814       B.Add(W,Edge4);
815       if (! (degen2 && IType == 4))
816         B.Add(W,Edge2.Reversed());
817       B.Add(W,Edge3);
818       
819       B.Add(Face,W);
820       
821       B.Add(myShell,Face);
822
823     // complete myMap for edge1
824       if (! (degen1 && IType == 4))
825         {
826           TopTools_ListOfShape Empty;
827           if (!myMap.IsBound(Edge1)) myMap.Bind(Edge1,Empty);
828           myMap(Edge1).Append(Face);
829         }
830       
831       // set the pcurves
832       
833       Standard_Real T = Precision::Confusion();
834
835       if (IType != 4) //not plane
836         {
837           if ( Edge1.Orientation() == TopAbs_REVERSED ) {
838             B.UpdateEdge(Edge1,
839                          new Geom2d_Line(gp_Pnt2d(0,f2),gp_Dir2d(-1,0)),
840                          Face,T);
841             B.Range(Edge1,Face,-l1,-f1);
842           }
843           else {
844             B.UpdateEdge(Edge1,
845                          new Geom2d_Line(gp_Pnt2d(0,f2),gp_Dir2d(1,0)),
846                          Face,T);
847             B.Range(Edge1,Face,f1,l1);
848           }
849           
850           if ( Edge2.Orientation() == TopAbs_REVERSED ) {
851             B.UpdateEdge(Edge2,
852                          new Geom2d_Line(gp_Pnt2d(0,l2),gp_Dir2d(-1,0)),
853                          Face,T);
854             B.Range(Edge2,Face,-l1,-f1);
855           }
856           else {
857             B.UpdateEdge(Edge2,
858                          new Geom2d_Line(gp_Pnt2d(0,l2),gp_Dir2d(1,0)),
859                          Face,T);
860             B.Range(Edge2,Face,f1,l1);
861           }
862         }
863
864       if (IType==0) {
865         if ( Periodic) {
866           B.UpdateEdge(Edge3,
867                        new Geom2d_Line(gp_Pnt2d(l1,0),gp_Dir2d(0,1)),
868                        new Geom2d_Line(gp_Pnt2d(f1,0),gp_Dir2d(0,1)),
869                        Face,T);
870         }
871         else {
872           B.UpdateEdge(Edge3,
873                        new Geom2d_Line(gp_Pnt2d(f1,0),gp_Dir2d(0,1)),
874                        Face,T);
875           B.UpdateEdge(Edge4,
876                        new Geom2d_Line(gp_Pnt2d(l1,0),gp_Dir2d(0,1)),
877                        Face,T);
878         }
879       }
880       else {
881         // KPart
882         if ( Periodic) {
883           TColgp_Array1OfPnt2d Extrem1(1,2);
884           Extrem1(1).SetCoord(l1,f2);
885           Extrem1(2).SetCoord(l1,l2);
886           TColgp_Array1OfPnt2d Extrem2(1,2);
887           Extrem2(1).SetCoord(f1,f2);
888           Extrem2(2).SetCoord(f1,l2);
889           B.UpdateEdge(Edge3,
890                        new Geom2d_BezierCurve(Extrem1),
891                        new Geom2d_BezierCurve(Extrem2),
892                        Face,T);
893         }
894         else if (IType != 4) { //not plane
895           TColgp_Array1OfPnt2d Extrem2(1,2);
896           Extrem2(1).SetCoord(f1,f2);
897           Extrem2(2).SetCoord(f1,l2);
898           B.UpdateEdge(Edge3,
899                        new Geom2d_BezierCurve(Extrem2),
900                        Face,T);
901           TColgp_Array1OfPnt2d Extrem1(1,2);
902           Extrem1(1).SetCoord(l1,f2);
903           Extrem1(2).SetCoord(l1,l2);
904           B.UpdateEdge(Edge4,
905                        new Geom2d_BezierCurve(Extrem1),
906                        Face,T);
907         }
908       }
909       // Set the non parameter flag;
910       B.SameParameter(Edge1,Standard_False);
911       B.SameParameter(Edge2,Standard_False);
912       B.SameParameter(Edge3,Standard_False);
913       B.SameParameter(Edge4,Standard_False);
914       B.SameRange(Edge1,Standard_False);
915       B.SameRange(Edge2,Standard_False);
916       B.SameRange(Edge3,Standard_False);
917       B.SameRange(Edge4,Standard_False);
918
919       tantque = ex1.More() && ex2.More();
920       if (wPoint1) tantque = ex2.More();
921       if (wPoint2) tantque = ex1.More();
922     }
923   }
924   BRepLib::SameParameter(myShell);
925
926   if (uClosed && DegenFirst && DegenLast)
927     myShell.Closed(Standard_True);
928 }
929
930
931 //=======================================================================
932 //function : GeneratedShapes
933 //purpose  : 
934 //=======================================================================
935
936 const TopTools_ListOfShape& 
937  BRepFill_Generator::GeneratedShapes (const TopoDS_Shape& SSection) const 
938 {
939   if (myMap.IsBound(SSection)) {
940     return myMap(SSection);
941   }
942   else {
943     static TopTools_ListOfShape Empty;
944     return Empty;
945   }
946 }
947
948 //=======================================================================
949 //function : Generated
950 //purpose  : 
951 //=================================================================== ====
952
953 const TopTools_DataMapOfShapeListOfShape& BRepFill_Generator::Generated() const
954 {
955   return myMap;
956 }
957
958