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