0031035: Coding - uninitialized class fields reported by Visual Studio Code Analysis
[occt.git] / src / BRepLib / BRepLib_MakeEdge.cxx
1 // Created on: 1993-07-23
2 // Created by: Joelle CHAUVET
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 // Modified:    Wed Oct 23 09:17:47 1996
18 //              check ponctuallity (PRO4896)
19
20 #include <Adaptor3d_CurveOnSurface.hxx>
21 #include <BRep_Builder.hxx>
22 #include <BRep_Tool.hxx>
23 #include <BRepLib.hxx>
24 #include <BRepLib_MakeEdge.hxx>
25 #include <ElCLib.hxx>
26 #include <Extrema_ExtPC.hxx>
27 #include <Geom2d_Curve.hxx>
28 #include <Geom2d_TrimmedCurve.hxx>
29 #include <Geom2dAdaptor_HCurve.hxx>
30 #include <Geom_Circle.hxx>
31 #include <Geom_Curve.hxx>
32 #include <Geom_Ellipse.hxx>
33 #include <Geom_Hyperbola.hxx>
34 #include <Geom_Line.hxx>
35 #include <Geom_Parabola.hxx>
36 #include <Geom_Surface.hxx>
37 #include <Geom_TrimmedCurve.hxx>
38 #include <GeomAdaptor_Curve.hxx>
39 #include <GeomAdaptor_HSurface.hxx>
40 #include <gp.hxx>
41 #include <gp_Circ.hxx>
42 #include <gp_Elips.hxx>
43 #include <gp_Hypr.hxx>
44 #include <gp_Lin.hxx>
45 #include <gp_Parab.hxx>
46 #include <gp_Pnt.hxx>
47 #include <Precision.hxx>
48 #include <StdFail_NotDone.hxx>
49 #include <TopoDS.hxx>
50 #include <TopoDS_Edge.hxx>
51 #include <TopoDS_Vertex.hxx>
52
53 //=======================================================================
54 //function : Project
55 //purpose  : project a vertex on a curve
56 //=======================================================================
57 static Standard_Boolean Project(const Handle(Geom_Curve)& C,
58                                 const TopoDS_Vertex& V,
59                                 Standard_Real& p)
60 {
61   Standard_Real Eps2 = BRep_Tool::Tolerance(V);
62   Eps2 *= Eps2;
63   
64   gp_Pnt P = BRep_Tool::Pnt(V);
65   GeomAdaptor_Curve GAC(C);
66   
67   // Afin de faire les extremas, on verifie les distances en bout
68   Standard_Real D1,D2;
69   gp_Pnt P1,P2;
70   P1 = GAC.Value(GAC.FirstParameter());
71   P2 = GAC.Value(GAC.LastParameter());
72   D1 = P1.SquareDistance(P);
73   D2 = P2.SquareDistance(P);
74   if ( (D1 < D2) && (D1 <= Eps2) ) {
75     p = GAC.FirstParameter();
76     return Standard_True;
77   }
78   else if ( (D2 < D1) && (D2 <= Eps2) ) {
79     p = GAC.LastParameter();
80     return Standard_True;
81   }
82
83   // Sinon, on calcule les extremas.
84
85   Extrema_ExtPC extrema(P,GAC);
86   if (extrema.IsDone()) {
87     Standard_Integer i, index = 0, n = extrema.NbExt();
88     Standard_Real Dist2 = RealLast(), dist2min;
89
90     for (i = 1; i <= n; i++) {
91       dist2min = extrema.SquareDistance(i);
92       if (dist2min < Dist2) {
93         index = i;
94         Dist2 = dist2min;
95       }
96     }
97
98     if (index != 0) {
99       if (Dist2 <= Eps2) {
100         p = (extrema.Point(index)).Parameter();
101         return Standard_True;
102       }
103     }
104   }
105   return Standard_False;
106 }
107
108
109 //=======================================================================
110 //function : Project
111 //purpose  : project a vertex on a curve on surface
112 //=======================================================================
113
114 static Standard_Boolean Project(const Handle(Geom2d_Curve)& C,
115                                 const Handle(Geom_Surface)& S,
116                                 const TopoDS_Vertex& V,
117                                 Standard_Real& p)
118 {
119   gp_Pnt P = BRep_Tool::Pnt(V);
120   Standard_Real Eps2 = BRep_Tool::Tolerance(V);
121   Eps2 *= Eps2;
122   
123   Handle(Geom2dAdaptor_HCurve) HG2AHC = new Geom2dAdaptor_HCurve();
124   HG2AHC->Set(C);
125   Handle(GeomAdaptor_HSurface) HGAHS = new GeomAdaptor_HSurface();
126   HGAHS->Set(S);
127   Adaptor3d_CurveOnSurface ACOS(HG2AHC,HGAHS);
128
129   Standard_Real D1,D2;
130   gp_Pnt P1,P2;
131   P1 = ACOS.Value(ACOS.FirstParameter());
132   P2 = ACOS.Value(ACOS.LastParameter());
133   D1 = P1.SquareDistance(P);
134   D2 = P2.SquareDistance(P);
135   if ( (D1 < D2) && (D1 <= Eps2) ) {
136     p = ACOS.FirstParameter();
137     return Standard_True;
138   }
139   else if ( (D2 < D1) && (D2 <= Eps2) ) {
140     p = ACOS.LastParameter();
141     return Standard_True;
142   }
143   
144   
145   Extrema_ExtPC extrema(P,ACOS);
146   
147   if (extrema.IsDone()) {
148     Standard_Integer i, index = 0, n = extrema.NbExt();
149     Standard_Real Dist2 = RealLast(), dist2min;
150     
151     for (i = 1; i <= n; i++) {
152       dist2min = extrema.SquareDistance(i);
153       if (dist2min < Dist2) {
154         index = i;
155         Dist2 = dist2min;
156       }
157     }
158     
159     if (index != 0) {
160       Extrema_POnCurv POC = extrema.Point(index);
161       if (P.SquareDistance(POC.Value()) <= Precision::SquareConfusion()) {
162         p = POC.Parameter();
163         return Standard_True;
164       }
165     }
166   }
167   return Standard_False;
168 }
169
170 //=======================================================================
171 //function : BRepLib_MakeEdge
172 //purpose  : 
173 //=======================================================================
174
175 BRepLib_MakeEdge::BRepLib_MakeEdge()
176 : myError(BRepLib_PointProjectionFailed)
177 {
178 }
179
180 //=======================================================================
181 //function : BRepLib_MakeEdge
182 //purpose  : 
183 //=======================================================================
184
185 BRepLib_MakeEdge::BRepLib_MakeEdge(const TopoDS_Vertex& V1, 
186                                    const TopoDS_Vertex& V2)
187 {
188   gp_Pnt P1 = BRep_Tool::Pnt(V1);
189   gp_Pnt P2 = BRep_Tool::Pnt(V2);
190   Standard_Real l = P1.Distance(P2);
191   if (l <= gp::Resolution()) {
192     myError = BRepLib_LineThroughIdenticPoints;
193     return;
194   }
195   gp_Lin L(P1,gp_Vec(P1,P2));
196   Handle(Geom_Line) GL = new Geom_Line(L);
197   Init(GL,V1,V2,0,l);
198 }
199
200
201 //=======================================================================
202 //function : BRepLib_MakeEdge
203 //purpose  : 
204 //=======================================================================
205
206 BRepLib_MakeEdge::BRepLib_MakeEdge(const gp_Pnt& P1, 
207                                    const gp_Pnt& P2)
208 {
209   Standard_Real l = P1.Distance(P2);
210   if (l <= gp::Resolution()) {
211     myError = BRepLib_LineThroughIdenticPoints;
212     return;
213   }
214   gp_Lin L(P1,gp_Vec(P1,P2));
215   Handle(Geom_Line) GL = new Geom_Line(L);
216   Init(GL,P1,P2,0,l);
217 }
218
219
220 //=======================================================================
221 //function : BRepLib_MakeEdge
222 //purpose  : 
223 //=======================================================================
224
225 BRepLib_MakeEdge::BRepLib_MakeEdge(const gp_Lin& L)
226 {
227   Handle(Geom_Line) GL = new Geom_Line(L);
228   Init(GL);
229 }
230
231
232 //=======================================================================
233 //function : BRepLib_MakeEdge
234 //purpose  : 
235 //=======================================================================
236
237 BRepLib_MakeEdge::BRepLib_MakeEdge(const gp_Lin& L, 
238                                    const Standard_Real p1, 
239                                    const Standard_Real p2)
240 {
241   Handle(Geom_Line) GL = new Geom_Line(L);
242   Init(GL,p1,p2);
243 }
244
245
246 //=======================================================================
247 //function : BRepLib_MakeEdge
248 //purpose  : 
249 //=======================================================================
250
251 BRepLib_MakeEdge::BRepLib_MakeEdge(const gp_Lin& L, 
252                                    const gp_Pnt& P1, 
253                                    const gp_Pnt& P2)
254 {
255   Handle(Geom_Line) GL = new Geom_Line(L);
256   Init(GL,P1,P2);
257 }
258
259
260 //=======================================================================
261 //function : BRepLib_MakeEdge
262 //purpose  : 
263 //=======================================================================
264
265 BRepLib_MakeEdge::BRepLib_MakeEdge(const gp_Lin& L, 
266                                    const TopoDS_Vertex& V1, 
267                                    const TopoDS_Vertex& V2)
268 {
269   Handle(Geom_Line) GL = new Geom_Line(L);
270   Init(GL,V1,V2);
271 }
272
273
274 //=======================================================================
275 //function : BRepLib_MakeEdge
276 //purpose  : 
277 //=======================================================================
278
279 BRepLib_MakeEdge::BRepLib_MakeEdge(const gp_Circ& C) 
280 {
281   Handle(Geom_Circle) GC = new Geom_Circle(C);
282   Init(GC);
283 }
284
285
286 //=======================================================================
287 //function : BRepLib_MakeEdge
288 //purpose  : 
289 //=======================================================================
290
291 BRepLib_MakeEdge::BRepLib_MakeEdge(const gp_Circ& C,
292                                    const Standard_Real p1,
293                                    const Standard_Real p2)
294 {
295   Handle(Geom_Circle) GC = new Geom_Circle(C);
296   Init(GC,p1,p2);
297 }
298
299
300 //=======================================================================
301 //function : BRepLib_MakeEdge
302 //purpose  : 
303 //=======================================================================
304
305 BRepLib_MakeEdge::BRepLib_MakeEdge(const gp_Circ& C,
306                                    const gp_Pnt& P1,
307                                    const gp_Pnt& P2)
308 {
309   Handle(Geom_Circle) GC = new Geom_Circle(C);
310   Init(GC,P1,P2);
311 }
312
313
314 //=======================================================================
315 //function : BRepLib_MakeEdge
316 //purpose  : 
317 //=======================================================================
318
319 BRepLib_MakeEdge::BRepLib_MakeEdge(const gp_Circ& C,
320                                    const TopoDS_Vertex& V1,
321                                    const TopoDS_Vertex& V2)
322 {
323   Handle(Geom_Circle) GC = new Geom_Circle(C);
324   Init(GC,V1,V2);
325 }
326
327
328 //=======================================================================
329 //function : BRepLib_MakeEdge
330 //purpose  : 
331 //=======================================================================
332
333 BRepLib_MakeEdge::BRepLib_MakeEdge(const gp_Elips& E) 
334 {
335   Handle(Geom_Ellipse) GE = new Geom_Ellipse(E);
336   Init(GE);
337 }
338
339
340 //=======================================================================
341 //function : BRepLib_MakeEdge
342 //purpose  : 
343 //=======================================================================
344
345 BRepLib_MakeEdge::BRepLib_MakeEdge(const gp_Elips& E,
346                                    const Standard_Real p1,
347                                    const Standard_Real p2)
348 {
349   Handle(Geom_Ellipse) GE = new Geom_Ellipse(E);
350   Init(GE,p1,p2);
351 }
352
353
354 //=======================================================================
355 //function : BRepLib_MakeEdge
356 //purpose  : 
357 //=======================================================================
358
359 BRepLib_MakeEdge::BRepLib_MakeEdge(const gp_Elips& E,
360                                    const gp_Pnt& P1,
361                                    const gp_Pnt& P2)
362 {
363   Handle(Geom_Ellipse) GE = new Geom_Ellipse(E);
364   Init(GE,P1,P2);
365 }
366
367
368 //=======================================================================
369 //function : BRepLib_MakeEdge
370 //purpose  : 
371 //=======================================================================
372
373 BRepLib_MakeEdge::BRepLib_MakeEdge(const gp_Elips& E,
374                                    const TopoDS_Vertex& V1,
375                                    const TopoDS_Vertex& V2)
376 {
377   Handle(Geom_Ellipse) GE = new Geom_Ellipse(E);
378   Init(GE,V1,V2);
379 }
380
381
382 //=======================================================================
383 //function : BRepLib_MakeEdge
384 //purpose  : 
385 //=======================================================================
386
387 BRepLib_MakeEdge::BRepLib_MakeEdge(const gp_Hypr& H)
388 {
389   Handle(Geom_Hyperbola) GH = new Geom_Hyperbola(H);
390   Init(GH);
391 }
392
393
394 //=======================================================================
395 //function : BRepLib_MakeEdge
396 //purpose  : 
397 //=======================================================================
398
399 BRepLib_MakeEdge::BRepLib_MakeEdge(const gp_Hypr& H,
400                                    const Standard_Real p1,
401                                    const Standard_Real p2)
402 {
403   Handle(Geom_Hyperbola) GH = new Geom_Hyperbola(H);
404   Init(GH,p1,p2);
405 }
406
407
408 //=======================================================================
409 //function : BRepLib_MakeEdge
410 //purpose  : 
411 //=======================================================================
412
413 BRepLib_MakeEdge::BRepLib_MakeEdge(const gp_Hypr& H,
414                                    const gp_Pnt& P1,
415                                    const gp_Pnt& P2)
416 {
417   Handle(Geom_Hyperbola) GH = new Geom_Hyperbola(H);
418   Init(GH,P1,P2);
419 }
420
421
422 //=======================================================================
423 //function : BRepLib_MakeEdge
424 //purpose  : 
425 //=======================================================================
426
427 BRepLib_MakeEdge::BRepLib_MakeEdge(const gp_Hypr& H,
428                                    const TopoDS_Vertex& V1,
429                                    const TopoDS_Vertex& V2)
430 {
431   Handle(Geom_Hyperbola) GH = new Geom_Hyperbola(H);
432   Init(GH,V1,V2);
433 }
434
435
436 //=======================================================================
437 //function : BRepLib_MakeEdge
438 //purpose  : 
439 //=======================================================================
440
441 BRepLib_MakeEdge::BRepLib_MakeEdge(const gp_Parab& P)
442 {
443   Handle(Geom_Parabola) GP = new Geom_Parabola(P);
444   Init(GP);
445 }
446
447
448 //=======================================================================
449 //function : BRepLib_MakeEdge
450 //purpose  : 
451 //=======================================================================
452
453 BRepLib_MakeEdge::BRepLib_MakeEdge(const gp_Parab& P,
454                                    const Standard_Real p1,
455                                    const Standard_Real p2)
456 {
457   Handle(Geom_Parabola) GP = new Geom_Parabola(P);
458   Init(GP,p1,p2);
459 }
460
461
462 //=======================================================================
463 //function : BRepLib_MakeEdge
464 //purpose  : 
465 //=======================================================================
466
467 BRepLib_MakeEdge::BRepLib_MakeEdge(const gp_Parab& P,
468                                    const gp_Pnt& P1,
469                                    const gp_Pnt& P2)
470 {
471   Handle(Geom_Parabola) GP = new Geom_Parabola(P);
472   Init(GP,P1,P2);
473 }
474
475
476 //=======================================================================
477 //function : BRepLib_MakeEdge
478 //purpose  : 
479 //=======================================================================
480
481 BRepLib_MakeEdge::BRepLib_MakeEdge(const gp_Parab& P,
482                                    const TopoDS_Vertex& V1,
483                                    const TopoDS_Vertex& V2)
484 {
485   Handle(Geom_Parabola) GP = new Geom_Parabola(P);
486   Init(GP,V1,V2);
487 }
488
489
490 //=======================================================================
491 //function : BRepLib_MakeEdge
492 //purpose  : 
493 //=======================================================================
494
495 BRepLib_MakeEdge::BRepLib_MakeEdge(const Handle(Geom_Curve)& L)
496 {
497   Init(L);
498 }
499
500
501 //=======================================================================
502 //function : BRepLib_MakeEdge
503 //purpose  : 
504 //=======================================================================
505
506 BRepLib_MakeEdge::BRepLib_MakeEdge(const Handle(Geom_Curve)& L,
507                                    const Standard_Real p1,
508                                    const Standard_Real p2)
509 {
510   Init(L,p1,p2);
511 }
512
513
514 //=======================================================================
515 //function : BRepLib_MakeEdge
516 //purpose  : 
517 //=======================================================================
518
519 BRepLib_MakeEdge::BRepLib_MakeEdge(const Handle(Geom_Curve)& L,
520                                    const gp_Pnt& P1,
521                                    const gp_Pnt& P2)
522 {
523   Init(L,P1,P2);
524 }
525
526 //=======================================================================
527 //function : BRepLib_MakeEdge
528 //purpose  : 
529 //=======================================================================
530
531 BRepLib_MakeEdge::BRepLib_MakeEdge(const Handle(Geom_Curve)& L,
532                                    const TopoDS_Vertex& V1,
533                                    const TopoDS_Vertex& V2)
534 {
535   Init(L,V1,V2);
536 }
537
538
539 //=======================================================================
540 //function : BRepLib_MakeEdge
541 //purpose  : 
542 //=======================================================================
543
544 BRepLib_MakeEdge::BRepLib_MakeEdge(const Handle(Geom_Curve)& L,
545                                    const gp_Pnt& P1,
546                                    const gp_Pnt& P2,
547                                    const Standard_Real p1,
548                                    const Standard_Real p2)
549 {
550   Init(L,P1,P2,p1,p2);
551 }
552
553
554 //=======================================================================
555 //function : BRepLib_MakeEdge
556 //purpose  : 
557 //=======================================================================
558
559 BRepLib_MakeEdge::BRepLib_MakeEdge(const Handle(Geom_Curve)& L,
560                                    const TopoDS_Vertex& V1,
561                                    const TopoDS_Vertex& V2,
562                                    const Standard_Real p1,
563                                    const Standard_Real p2)
564 {
565   Init(L,V1,V2,p1,p2);
566 }
567
568
569
570 //=======================================================================
571 //function : BRepLib_MakeEdge
572 //purpose  : 
573 //=======================================================================
574
575 BRepLib_MakeEdge::BRepLib_MakeEdge(const Handle(Geom2d_Curve)& L,
576                                    const Handle(Geom_Surface)& S)
577 {
578   Init(L,S);
579 }
580
581
582 //=======================================================================
583 //function : BRepLib_MakeEdge
584 //purpose  : 
585 //=======================================================================
586
587 BRepLib_MakeEdge::BRepLib_MakeEdge(const Handle(Geom2d_Curve)& L,
588                                    const Handle(Geom_Surface)& S,
589                                    const Standard_Real p1,
590                                    const Standard_Real p2)
591 {
592   Init(L,S,p1,p2);
593 }
594
595
596 //=======================================================================
597 //function : BRepLib_MakeEdge
598 //purpose  : 
599 //=======================================================================
600
601 BRepLib_MakeEdge::BRepLib_MakeEdge(const Handle(Geom2d_Curve)& L,
602                                    const Handle(Geom_Surface)& S,
603                                    const gp_Pnt& P1,
604                                    const gp_Pnt& P2)
605 {
606   Init(L,S,P1,P2);
607 }
608
609 //=======================================================================
610 //function : BRepLib_MakeEdge
611 //purpose  : 
612 //=======================================================================
613
614 BRepLib_MakeEdge::BRepLib_MakeEdge(const Handle(Geom2d_Curve)& L,
615                                    const Handle(Geom_Surface)& S,
616                                    const TopoDS_Vertex& V1,
617                                    const TopoDS_Vertex& V2)
618 {
619   Init(L,S,V1,V2);
620 }
621
622
623 //=======================================================================
624 //function : BRepLib_MakeEdge
625 //purpose  : 
626 //=======================================================================
627
628 BRepLib_MakeEdge::BRepLib_MakeEdge(const Handle(Geom2d_Curve)& L,
629                                    const Handle(Geom_Surface)& S,
630                                    const gp_Pnt& P1,
631                                    const gp_Pnt& P2,
632                                    const Standard_Real p1,
633                                    const Standard_Real p2)
634 {
635   Init(L,S,P1,P2,p1,p2);
636 }
637
638
639 //=======================================================================
640 //function : BRepLib_MakeEdge
641 //purpose  : 
642 //=======================================================================
643
644 BRepLib_MakeEdge::BRepLib_MakeEdge(const Handle(Geom2d_Curve)& L,
645                                    const Handle(Geom_Surface)& S,
646                                    const TopoDS_Vertex& V1,
647                                    const TopoDS_Vertex& V2,
648                                    const Standard_Real p1,
649                                    const Standard_Real p2)
650 {
651   Init(L,S,V1,V2,p1,p2);
652 }
653
654
655 //=======================================================================
656 //function : Init
657 //purpose  : 
658 //=======================================================================
659
660 void  BRepLib_MakeEdge::Init(const Handle(Geom_Curve)& C)
661 {
662   Init(C,C->FirstParameter(),C->LastParameter());
663 }
664
665
666 //=======================================================================
667 //function : Init
668 //purpose  : 
669 //=======================================================================
670
671 void  BRepLib_MakeEdge::Init(const Handle(Geom_Curve)& C,
672                              const Standard_Real p1,
673                              const Standard_Real p2)
674 {
675 //  BRep_Builder B;
676
677   TopoDS_Vertex V1,V2;
678   Init(C,V1,V2,p1,p2);
679 }
680
681
682 //=======================================================================
683 //function : Init
684 //purpose  : 
685 //=======================================================================
686
687 void  BRepLib_MakeEdge::Init(const Handle(Geom_Curve)& C,
688                              const gp_Pnt& P1,
689                              const gp_Pnt& P2)
690 {
691   Standard_Real Tol = BRepLib::Precision();
692
693   BRep_Builder B;
694   TopoDS_Vertex V1,V2;
695   B.MakeVertex(V1,P1,Tol);
696   if (P1.Distance(P2) < Tol)
697     V2 = V1;
698   else
699     B.MakeVertex(V2,P2,Tol);
700   
701   Init(C,V1,V2);
702 }
703
704
705 //=======================================================================
706 //function : Init
707 //purpose  : 
708 //=======================================================================
709
710 void  BRepLib_MakeEdge::Init(const Handle(Geom_Curve)& C,
711                              const TopoDS_Vertex& V1,
712                              const TopoDS_Vertex& V2)
713 {
714   // try projecting the vertices on the curve
715
716   Standard_Real p1,p2;
717   
718   if (V1.IsNull())
719     p1 = C->FirstParameter();
720   else
721     if (!Project(C,V1,p1)) {
722       myError = BRepLib_PointProjectionFailed;
723       return;
724     }
725   if (V2.IsNull())
726     p2 = C->LastParameter();
727   else
728     if (!Project(C,V2,p2))  {
729       myError = BRepLib_PointProjectionFailed;
730       return;
731     }
732   
733   Init(C,V1,V2,p1,p2);
734 }
735
736
737 //=======================================================================
738 //function : Init
739 //purpose  : 
740 //=======================================================================
741
742 void  BRepLib_MakeEdge::Init(const Handle(Geom_Curve)& C,
743                              const gp_Pnt& P1,
744                              const gp_Pnt& P2,
745                              const Standard_Real p1,
746                              const Standard_Real p2)
747 {
748   Standard_Real Tol = BRepLib::Precision();
749   BRep_Builder B;
750
751   TopoDS_Vertex V1,V2;
752   B.MakeVertex(V1,P1,Tol);
753   if (P1.Distance(P2) < Tol)
754     V2 = V1;
755   else
756     B.MakeVertex(V2,P2,Tol);
757   
758   Init(C,V1,V2,p1,p2);
759 }
760
761
762 //=======================================================================
763 //function : Init
764 //purpose  : this one really makes the job ...
765 //=======================================================================
766
767 void  BRepLib_MakeEdge::Init(const Handle(Geom_Curve)& CC,
768                              const TopoDS_Vertex& VV1,
769                              const TopoDS_Vertex& VV2,
770                              const Standard_Real pp1,
771                              const Standard_Real pp2)
772 {
773   // kill trimmed curves
774   Handle(Geom_Curve) C = CC;
775   Handle(Geom_TrimmedCurve) CT = Handle(Geom_TrimmedCurve)::DownCast(C);
776   while (!CT.IsNull()) {
777     C = CT->BasisCurve();
778     CT = Handle(Geom_TrimmedCurve)::DownCast(C);
779   }
780
781   // check parameters
782   Standard_Real p1 = pp1;
783   Standard_Real p2 = pp2;
784   Standard_Real cf = C->FirstParameter();
785   Standard_Real cl = C->LastParameter();
786   Standard_Real epsilon = Precision::PConfusion();
787   Standard_Boolean periodic = C->IsPeriodic();
788   GeomAdaptor_Curve aCA(C);
789
790   TopoDS_Vertex V1,V2;
791   if (periodic) {
792     // adjust in period
793     ElCLib::AdjustPeriodic(cf,cl,epsilon,p1,p2);
794     V1 = VV1;
795     V2 = VV2;
796   }
797   else {
798     // reordonate
799     if (p1 < p2) {
800       V1 = VV1;
801       V2 = VV2;
802     }
803     else {
804       V2 = VV1;
805       V1 = VV2;
806       Standard_Real x = p1;
807       p1 = p2;
808       p2 = x;
809     }
810
811     // check range
812     if ((cf - p1 > epsilon) || (p2 - cl > epsilon)) {
813       myError = BRepLib_ParameterOutOfRange;
814       return;
815     }
816
817     // check ponctuallity
818     if ((p2-p1) <= gp::Resolution()) {
819       myError = BRepLib_LineThroughIdenticPoints;
820       return;
821     }
822   }
823   
824   // compute points on the curve
825   Standard_Boolean p1inf = Precision::IsNegativeInfinite(p1);
826   Standard_Boolean p2inf = Precision::IsPositiveInfinite(p2);
827   gp_Pnt P1,P2;
828   if (!p1inf) P1 = aCA.Value(p1);
829   if (!p2inf) P2 = aCA.Value(p2);
830
831   Standard_Real preci = BRepLib::Precision();
832   BRep_Builder B;
833
834   // check for closed curve
835   Standard_Boolean closed = Standard_False;
836   Standard_Boolean degenerated = Standard_False;
837   if (!p1inf && !p2inf)
838     closed = (P1.Distance(P2) <= preci);
839
840   // check if the vertices are on the curve
841   if (closed) {
842     if (V1.IsNull() && V2.IsNull()) {
843       B.MakeVertex(V1,P1,preci);
844       V2 = V1;
845     }
846     else if (V1.IsNull())
847       V1 = V2;
848     else if (V2.IsNull())
849       V2 = V1;
850     else {
851       if (!V1.IsSame(V2)) {
852         myError = BRepLib_DifferentPointsOnClosedCurve;
853         return;
854       }
855       else if (P1.Distance(BRep_Tool::Pnt(V1)) > 
856         Max(preci,BRep_Tool::Tolerance(V1))) {
857         myError = BRepLib_DifferentPointsOnClosedCurve;
858         return;
859       }
860       else
861       {
862         gp_Pnt PM = aCA.Value((p1+p2)/2);
863         if (P1.Distance(PM) < preci)
864           degenerated = Standard_True;
865       }
866     }
867   }
868
869   else {    // not closed
870
871     if (p1inf) {
872       if (!V1.IsNull()) {
873         myError = BRepLib_PointWithInfiniteParameter;
874         return;
875       }
876     }
877     else {
878       if (V1.IsNull()) {
879         B.MakeVertex(V1,P1,preci);
880       }
881       else if (P1.Distance(BRep_Tool::Pnt(V1)) >
882                Max(preci,BRep_Tool::Tolerance(V1))) {
883         myError = BRepLib_DifferentsPointAndParameter;
884         return;
885       }
886     }
887     
888     if (p2inf) {
889       if (!V2.IsNull()) {
890         myError = BRepLib_PointWithInfiniteParameter;
891         return;
892       }
893     }
894     else {
895       if (V2.IsNull()) {
896         B.MakeVertex(V2,P2,preci);
897       }
898       else if (P2.Distance(BRep_Tool::Pnt(V2)) >
899                Max(preci,BRep_Tool::Tolerance(V2))){
900         myError = BRepLib_DifferentsPointAndParameter;
901         return;
902       }
903     }
904   }
905
906   V1.Orientation(TopAbs_FORWARD);
907   V2.Orientation(TopAbs_REVERSED);
908   myVertex1 = V1;
909   myVertex2 = V2;
910
911   TopoDS_Edge& E = TopoDS::Edge(myShape);
912   B.MakeEdge(E,C,preci);
913   if (!V1.IsNull()) {
914     B.Add(E,V1);
915   }
916   if (!V2.IsNull()) {
917     B.Add(E,V2);
918   }
919   B.Range(E,p1,p2);
920   B.Degenerated(E, degenerated);
921
922   myError = BRepLib_EdgeDone;
923   Done();
924 }
925
926 //=======================================================================
927 //function : Init
928 //purpose  : 
929 //=======================================================================
930
931 void  BRepLib_MakeEdge::Init(const Handle(Geom2d_Curve)& C,
932                              const Handle(Geom_Surface)& S)
933 {
934   Init(C,S,C->FirstParameter(),C->LastParameter());
935 }
936
937
938 //=======================================================================
939 //function : Init
940 //purpose  : 
941 //=======================================================================
942
943 void  BRepLib_MakeEdge::Init(const Handle(Geom2d_Curve)& C,
944                              const Handle(Geom_Surface)& S,
945                              const Standard_Real p1,
946                              const Standard_Real p2)
947 {
948 //  BRep_Builder B;
949
950   TopoDS_Vertex V1,V2;
951   Init(C,S,V1,V2,p1,p2);
952 }
953
954
955 //=======================================================================
956 //function : Init
957 //purpose  : 
958 //=======================================================================
959
960 void  BRepLib_MakeEdge::Init(const Handle(Geom2d_Curve)& C,
961                              const Handle(Geom_Surface)& S,
962                              const gp_Pnt& P1,
963                              const gp_Pnt& P2)
964 {
965   Standard_Real Tol = BRepLib::Precision();
966   
967   BRep_Builder B;
968   TopoDS_Vertex V1,V2;
969   B.MakeVertex(V1,P1,Tol);
970   if (P1.Distance(P2) < Tol)
971     V2 = V1;
972   else
973     B.MakeVertex(V2,P2,Tol);
974   
975   Init(C,S,V1,V2);
976 }
977
978
979 //=======================================================================
980 //function : Init
981 //purpose  : 
982 //=======================================================================
983
984 void  BRepLib_MakeEdge::Init(const Handle(Geom2d_Curve)& C,
985                              const Handle(Geom_Surface)& S,
986                              const TopoDS_Vertex& V1,
987                              const TopoDS_Vertex& V2)
988 {
989   // try projecting the vertices on the curve
990
991   Standard_Real p1,p2;
992   
993   if (V1.IsNull())
994     p1 = C->FirstParameter();
995   else
996     if (!Project(C,S,V1,p1)) {
997       myError = BRepLib_PointProjectionFailed;
998       return;
999     }
1000   if (V2.IsNull())
1001     p2 = C->LastParameter();
1002   else
1003     if (!Project(C,S,V2,p2))  {
1004       myError = BRepLib_PointProjectionFailed;
1005       return;
1006     }
1007   
1008   Init(C,S,V1,V2,p1,p2);
1009 }
1010
1011
1012 //=======================================================================
1013 //function : Init
1014 //purpose  : 
1015 //=======================================================================
1016
1017 void  BRepLib_MakeEdge::Init(const Handle(Geom2d_Curve)& C,
1018                              const Handle(Geom_Surface)& S,
1019                              const gp_Pnt& P1,
1020                              const gp_Pnt& P2,
1021                              const Standard_Real p1,
1022                              const Standard_Real p2)
1023 {
1024   Standard_Real Tol = BRepLib::Precision();
1025   BRep_Builder B;
1026
1027   TopoDS_Vertex V1,V2;
1028   B.MakeVertex(V1,P1,Tol);
1029   if (P1.Distance(P2) < Tol)
1030     V2 = V1;
1031   else
1032     B.MakeVertex( V2, P2, Tol);
1033   
1034   Init(C,S,V1,V2,p1,p2);
1035 }
1036
1037
1038 //=======================================================================
1039 //function : Init
1040 //purpose  : this one really makes the job ...
1041 //=======================================================================
1042
1043 void  BRepLib_MakeEdge::Init(const Handle(Geom2d_Curve)& CC,
1044                              const Handle(Geom_Surface)& S,
1045                              const TopoDS_Vertex& VV1,
1046                              const TopoDS_Vertex& VV2,
1047                              const Standard_Real pp1,
1048                              const Standard_Real pp2)
1049 {
1050   // kill trimmed curves
1051   Handle(Geom2d_Curve) C = CC;
1052   Handle(Geom2d_TrimmedCurve) CT = Handle(Geom2d_TrimmedCurve)::DownCast(C);
1053   while (!CT.IsNull()) {
1054     C = CT->BasisCurve();
1055     CT = Handle(Geom2d_TrimmedCurve)::DownCast(C);
1056   }
1057
1058   // check parameters
1059   Standard_Real p1 = pp1;
1060   Standard_Real p2 = pp2;
1061   Standard_Real cf = C->FirstParameter();
1062   Standard_Real cl = C->LastParameter();
1063   Standard_Real epsilon = Precision::PConfusion();
1064   Standard_Boolean periodic = C->IsPeriodic();
1065
1066
1067   TopoDS_Vertex V1,V2;
1068   Standard_Boolean reverse = Standard_False;
1069
1070   if (periodic) {
1071     // adjust in period
1072     ElCLib::AdjustPeriodic(cf,cl,epsilon,p1,p2);
1073     V1 = VV1;
1074     V2 = VV2;
1075   }
1076   else {
1077     // reordonate
1078     if (p1 < p2) {
1079       V1 = VV1;
1080       V2 = VV2;
1081     }
1082     else {
1083       V2 = VV1;
1084       V1 = VV2;
1085       Standard_Real x = p1;
1086       p1 = p2;
1087       p2 = x;
1088       reverse = Standard_True;
1089     }
1090
1091     // check range
1092     if ((cf - p1 > epsilon) || (p2 - cl > epsilon)) {
1093       myError = BRepLib_ParameterOutOfRange;
1094       return;
1095     }
1096   }
1097   
1098   // compute points on the curve
1099   Standard_Boolean p1inf = Precision::IsNegativeInfinite(p1);
1100   Standard_Boolean p2inf = Precision::IsPositiveInfinite(p2);
1101   gp_Pnt P1,P2;
1102   gp_Pnt2d P2d1,P2d2;
1103   if (!p1inf) {
1104     P2d1 = C->Value(p1);
1105     P1   = S->Value(P2d1.X(),P2d1.Y());
1106   }
1107   if (!p2inf) {
1108     P2d2 = C->Value(p2);
1109     P2   = S->Value(P2d2.X(),P2d2.Y());
1110   }
1111
1112   Standard_Real preci = BRepLib::Precision();
1113   BRep_Builder B;
1114
1115   // check for closed curve
1116   Standard_Boolean closed = Standard_False;
1117   if (!p1inf && !p2inf)
1118     closed = (P1.Distance(P2) <= preci);
1119
1120   // check if the vertices are on the curve
1121   if (closed) {
1122     if (V1.IsNull() && V2.IsNull()) {
1123       B.MakeVertex(V1,P1,preci);
1124       V2 = V1;
1125     }
1126     else if (V1.IsNull())
1127       V1 = V2;
1128     else if (V2.IsNull())
1129       V2 = V1;
1130     else {
1131       if (!V1.IsSame(V2)) {
1132         myError = BRepLib_DifferentPointsOnClosedCurve;
1133         return;
1134       }
1135       else if (P1.Distance(BRep_Tool::Pnt(V1)) > 
1136                Max(preci,BRep_Tool::Tolerance(V1))) {
1137         myError = BRepLib_DifferentPointsOnClosedCurve;
1138         return;
1139       }
1140     }
1141   }
1142
1143   else {    // not closed
1144
1145     if (p1inf) {
1146       if (!V1.IsNull()) {
1147         myError = BRepLib_PointWithInfiniteParameter;
1148         return;
1149       }
1150     }
1151     else {
1152       if (V1.IsNull()) {
1153         B.MakeVertex(V1,P1,preci);
1154       }
1155       else if (P1.Distance(BRep_Tool::Pnt(V1)) >
1156                Max(preci,BRep_Tool::Tolerance(V1))) {
1157         myError = BRepLib_DifferentsPointAndParameter;
1158         return;
1159       }
1160     }
1161     
1162     if (p2inf) {
1163       if (!V2.IsNull()) {
1164         myError = BRepLib_PointWithInfiniteParameter;
1165         return;
1166       }
1167     }
1168     else {
1169       if (V2.IsNull()) {
1170         B.MakeVertex(V2,P2,preci);
1171       }
1172       else if (P2.Distance(BRep_Tool::Pnt(V2)) >
1173                Max(preci,BRep_Tool::Tolerance(V2))){
1174         myError = BRepLib_DifferentsPointAndParameter;
1175         return;
1176       }
1177     }
1178   }
1179
1180   V1.Orientation(TopAbs_FORWARD);
1181   V2.Orientation(TopAbs_REVERSED);
1182   myVertex1 = V1;
1183   myVertex2 = V2;
1184
1185   TopoDS_Edge& E = TopoDS::Edge(myShape);
1186   B.MakeEdge(E);
1187   B.UpdateEdge(E,C,S,TopLoc_Location(),preci);
1188
1189   if (!V1.IsNull()) {
1190     B.Add(E,V1);
1191   }
1192   if (!V2.IsNull()) {
1193     B.Add(E,V2);
1194   }
1195   B.Range(E,p1,p2);
1196
1197   if (reverse)
1198     E.Orientation(TopAbs_REVERSED);
1199
1200   myError = BRepLib_EdgeDone;
1201   Done();
1202 }
1203
1204 //=======================================================================
1205 //function : Error
1206 //purpose  : 
1207 //=======================================================================
1208
1209 BRepLib_EdgeError BRepLib_MakeEdge::Error() const
1210 {
1211   return myError;
1212 }
1213
1214 //=======================================================================
1215 //function : Edge
1216 //purpose  : 
1217 //=======================================================================
1218
1219 const TopoDS_Edge&  BRepLib_MakeEdge::Edge()
1220 {
1221   return TopoDS::Edge(Shape());
1222 }
1223
1224
1225 //=======================================================================
1226 //function : Vertex1
1227 //purpose  : 
1228 //=======================================================================
1229
1230 const TopoDS_Vertex&  BRepLib_MakeEdge::Vertex1()const 
1231 {
1232   Check();
1233   return myVertex1;
1234 }
1235
1236
1237 //=======================================================================
1238 //function : Vertex2
1239 //purpose  : 
1240 //=======================================================================
1241
1242 const TopoDS_Vertex&  BRepLib_MakeEdge::Vertex2()const 
1243 {
1244   Check();
1245   return myVertex2;
1246 }
1247
1248
1249
1250 //=======================================================================
1251 //function : operator
1252 //purpose  : 
1253 //=======================================================================
1254
1255 BRepLib_MakeEdge::operator TopoDS_Edge()
1256 {
1257   return Edge();
1258 }