1 // Created on: 1995-01-04
2 // Created by: Bruno DUMORTIER
3 // Copyright (c) 1995-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 
18 #include <BRep_Builder.hxx>
19 #include <BRep_Tool.hxx>
20 #include <BRepLib.hxx>
21 #include <BRepLib_MakeEdge2d.hxx>
22 #include <ElCLib.hxx>
23 #include <ElSLib.hxx>
24 #include <Extrema_ExtPC2d.hxx>
25 #include <Geom2d_Circle.hxx>
26 #include <Geom2d_Curve.hxx>
27 #include <Geom2d_Ellipse.hxx>
28 #include <Geom2d_Hyperbola.hxx>
29 #include <Geom2d_Line.hxx>
30 #include <Geom2d_Parabola.hxx>
31 #include <Geom2d_TrimmedCurve.hxx>
32 #include <Geom2dAdaptor_Curve.hxx>
33 #include <Geom_Plane.hxx>
34 #include <gp.hxx>
35 #include <gp_Circ2d.hxx>
36 #include <gp_Elips2d.hxx>
37 #include <gp_Hypr2d.hxx>
38 #include <gp_Lin2d.hxx>
39 #include <gp_Parab2d.hxx>
40 #include <gp_Pnt2d.hxx>
41 #include <Precision.hxx>
42 #include <StdFail_NotDone.hxx>
43 #include <TopoDS.hxx>
44 #include <TopoDS_Edge.hxx>
45 #include <TopoDS_Vertex.hxx>
46 
47 //=======================================================================
48 //function : Point
49 //purpose  : make a 3d point on the current plane
50 //=======================================================================
Point(const gp_Pnt2d & P)51 static gp_Pnt Point(const gp_Pnt2d& P)
52 {
53   return BRepLib::Plane()->Value(P.X(),P.Y());
54 }
55 
56 //=======================================================================
57 //function : Project
58 //purpose  : project a vertex on the current plane
59 //=======================================================================
60 
Project(const TopoDS_Vertex & Ve)61 static gp_Pnt2d Project(const TopoDS_Vertex& Ve)
62 {
63   gp_Pnt P = BRep_Tool::Pnt(Ve);
64   Standard_Real U,V;
65   ElSLib::Parameters(BRepLib::Plane()->Pln(),P,U,V);
66   return gp_Pnt2d(U,V);
67 }
68 
69 //=======================================================================
70 //function : Project
71 //purpose  : project a vertex on a curve
72 //=======================================================================
73 
Project(const Handle (Geom2d_Curve)& C,const TopoDS_Vertex & V,Standard_Real & p)74 static Standard_Boolean Project(const Handle(Geom2d_Curve)& C,
75 				const TopoDS_Vertex& V,
76 				Standard_Real& p)
77 {
78   gp_Pnt2d P = Project(V);
79   Geom2dAdaptor_Curve AC(C);
80   if (AC.GetType() == GeomAbs_Line) {
81     p = ElCLib::LineParameter(AC.Line().Position(),P);
82   }
83   else if (AC.GetType() == GeomAbs_Circle) {
84     p = ElCLib::CircleParameter(AC.Circle().Position(),P);
85   }
86   else {
87     Extrema_ExtPC2d extrema(P,AC);
88     if (extrema.IsDone()) {
89       Standard_Integer i,n = extrema.NbExt();
90 
91       Standard_Real d2 = RealLast();
92       for (i = 1; i <= n; i++) {
93 	//OCC16852:if (extrema.IsMin(i)) {
94 	  const Standard_Real dd2 = extrema.SquareDistance(i);
95 	  if (dd2 < d2) {
96 	    d2 = dd2;
97 	    p = extrema.Point(i).Parameter();
98 	  }
99 	//OCC16852:}
100       }
101     }
102     else
103       return Standard_False;
104   }
105   return Standard_True;
106 }
107 
108 //=======================================================================
109 //function : BRepLib_MakeEdge2d
110 //purpose  :
111 //=======================================================================
112 
BRepLib_MakeEdge2d(const TopoDS_Vertex & V1,const TopoDS_Vertex & V2)113 BRepLib_MakeEdge2d::BRepLib_MakeEdge2d(const TopoDS_Vertex& V1,
114 				       const TopoDS_Vertex& V2)
115 {
116   gp_Pnt2d P1 = Project(V1);
117   gp_Pnt2d P2 = Project(V2);
118   Standard_Real l = P1.Distance(P2);
119   if (l <= gp::Resolution()) {
120     myError = BRepLib_LineThroughIdenticPoints;
121     return;
122   }
123   gp_Lin2d L(P1,gp_Vec2d(P1,P2));
124   Handle(Geom2d_Line) GL = new Geom2d_Line(L);
125   Init(GL,V1,V2,0,l);
126 }
127 
128 //=======================================================================
129 //function : BRepLib_MakeEdge2d
130 //purpose  :
131 //=======================================================================
132 
BRepLib_MakeEdge2d(const gp_Pnt2d & P1,const gp_Pnt2d & P2)133 BRepLib_MakeEdge2d::BRepLib_MakeEdge2d(const gp_Pnt2d& P1,
134 				       const gp_Pnt2d& P2)
135 {
136   Standard_Real l = P1.Distance(P2);
137   if (l <= gp::Resolution()) {
138     myError = BRepLib_LineThroughIdenticPoints;
139     return;
140   }
141   gp_Lin2d L(P1,gp_Vec2d(P1,P2));
142   Handle(Geom2d_Line) GL = new Geom2d_Line(L);
143   Init(GL,P1,P2,0,l);
144 }
145 
146 
147 //=======================================================================
148 //function : BRepLib_MakeEdge2d
149 //purpose  :
150 //=======================================================================
151 
BRepLib_MakeEdge2d(const gp_Lin2d & L)152 BRepLib_MakeEdge2d::BRepLib_MakeEdge2d(const gp_Lin2d& L)
153 {
154   Handle(Geom2d_Line) GL = new Geom2d_Line(L);
155   Init(GL);
156 }
157 
158 //=======================================================================
159 //function : BRepLib_MakeEdge2d
160 //purpose  :
161 //=======================================================================
162 
BRepLib_MakeEdge2d(const gp_Lin2d & L,const Standard_Real p1,const Standard_Real p2)163 BRepLib_MakeEdge2d::BRepLib_MakeEdge2d(const gp_Lin2d& L,
164 				       const Standard_Real p1,
165 				       const Standard_Real p2)
166 {
167   Handle(Geom2d_Line) GL = new Geom2d_Line(L);
168   Init(GL,p1,p2);
169 }
170 
171 //=======================================================================
172 //function : BRepLib_MakeEdge2d
173 //purpose  :
174 //=======================================================================
175 
BRepLib_MakeEdge2d(const gp_Lin2d & L,const gp_Pnt2d & P1,const gp_Pnt2d & P2)176 BRepLib_MakeEdge2d::BRepLib_MakeEdge2d(const gp_Lin2d& L,
177 				       const gp_Pnt2d& P1,
178 				       const gp_Pnt2d& P2)
179 {
180   Handle(Geom2d_Line) GL = new Geom2d_Line(L);
181   Init(GL,P1,P2);
182 }
183 
184 //=======================================================================
185 //function : BRepLib_MakeEdge2d
186 //purpose  :
187 //=======================================================================
188 
BRepLib_MakeEdge2d(const gp_Lin2d & L,const TopoDS_Vertex & V1,const TopoDS_Vertex & V2)189 BRepLib_MakeEdge2d::BRepLib_MakeEdge2d(const gp_Lin2d& L,
190 				       const TopoDS_Vertex& V1,
191 				       const TopoDS_Vertex& V2)
192 {
193   Handle(Geom2d_Line) GL = new Geom2d_Line(L);
194   Init(GL,V1,V2);
195 }
196 
197 //=======================================================================
198 //function : BRepLib_MakeEdge2d
199 //purpose  :
200 //=======================================================================
201 
BRepLib_MakeEdge2d(const gp_Circ2d & C)202 BRepLib_MakeEdge2d::BRepLib_MakeEdge2d(const gp_Circ2d& C)
203 {
204   Handle(Geom2d_Circle) GC = new Geom2d_Circle(C);
205   Init(GC);
206 }
207 
208 //=======================================================================
209 //function : BRepLib_MakeEdge2d
210 //purpose  :
211 //=======================================================================
212 
BRepLib_MakeEdge2d(const gp_Circ2d & C,const Standard_Real p1,const Standard_Real p2)213 BRepLib_MakeEdge2d::BRepLib_MakeEdge2d(const gp_Circ2d& C,
214 				       const Standard_Real p1,
215 				       const Standard_Real p2)
216 {
217   Handle(Geom2d_Circle) GC = new Geom2d_Circle(C);
218   Init(GC,p1,p2);
219 }
220 
221 //=======================================================================
222 //function : BRepLib_MakeEdge2d
223 //purpose  :
224 //=======================================================================
225 
BRepLib_MakeEdge2d(const gp_Circ2d & C,const gp_Pnt2d & P1,const gp_Pnt2d & P2)226 BRepLib_MakeEdge2d::BRepLib_MakeEdge2d(const gp_Circ2d& C,
227 				       const gp_Pnt2d& P1,
228 				       const gp_Pnt2d& P2)
229 {
230   Handle(Geom2d_Circle) GC = new Geom2d_Circle(C);
231   Init(GC,P1,P2);
232 }
233 
234 //=======================================================================
235 //function : BRepLib_MakeEdge2d
236 //purpose  :
237 //=======================================================================
238 
BRepLib_MakeEdge2d(const gp_Circ2d & C,const TopoDS_Vertex & V1,const TopoDS_Vertex & V2)239 BRepLib_MakeEdge2d::BRepLib_MakeEdge2d(const gp_Circ2d& C,
240 				       const TopoDS_Vertex& V1,
241 				       const TopoDS_Vertex& V2)
242 {
243   Handle(Geom2d_Circle) GC = new Geom2d_Circle(C);
244   Init(GC,V1,V2);
245 }
246 
247 //=======================================================================
248 //function : BRepLib_MakeEdge2d
249 //purpose  :
250 //=======================================================================
251 
BRepLib_MakeEdge2d(const gp_Elips2d & E)252 BRepLib_MakeEdge2d::BRepLib_MakeEdge2d(const gp_Elips2d& E)
253 {
254   Handle(Geom2d_Ellipse) GE = new Geom2d_Ellipse(E);
255   Init(GE);
256 }
257 
258 //=======================================================================
259 //function : BRepLib_MakeEdge2d
260 //purpose  :
261 //=======================================================================
262 
BRepLib_MakeEdge2d(const gp_Elips2d & E,const Standard_Real p1,const Standard_Real p2)263 BRepLib_MakeEdge2d::BRepLib_MakeEdge2d(const gp_Elips2d& E,
264 				       const Standard_Real p1,
265 				       const Standard_Real p2)
266 {
267   Handle(Geom2d_Ellipse) GE = new Geom2d_Ellipse(E);
268   Init(GE,p1,p2);
269 }
270 
271 //=======================================================================
272 //function : BRepLib_MakeEdge2d
273 //purpose  :
274 //=======================================================================
275 
BRepLib_MakeEdge2d(const gp_Elips2d & E,const gp_Pnt2d & P1,const gp_Pnt2d & P2)276 BRepLib_MakeEdge2d::BRepLib_MakeEdge2d(const gp_Elips2d& E,
277 				       const gp_Pnt2d& P1,
278 				       const gp_Pnt2d& P2)
279 {
280   Handle(Geom2d_Ellipse) GE = new Geom2d_Ellipse(E);
281   Init(GE,P1,P2);
282 }
283 
284 //=======================================================================
285 //function : BRepLib_MakeEdge2d
286 //purpose  :
287 //=======================================================================
288 
BRepLib_MakeEdge2d(const gp_Elips2d & E,const TopoDS_Vertex & V1,const TopoDS_Vertex & V2)289 BRepLib_MakeEdge2d::BRepLib_MakeEdge2d(const gp_Elips2d& E,
290 				       const TopoDS_Vertex& V1,
291 				       const TopoDS_Vertex& V2)
292 {
293   Handle(Geom2d_Ellipse) GE = new Geom2d_Ellipse(E);
294   Init(GE,V1,V2);
295 }
296 
297 //=======================================================================
298 //function : BRepLib_MakeEdge2d
299 //purpose  :
300 //=======================================================================
301 
BRepLib_MakeEdge2d(const gp_Hypr2d & H)302 BRepLib_MakeEdge2d::BRepLib_MakeEdge2d(const gp_Hypr2d& H)
303 {
304   Handle(Geom2d_Hyperbola) GH = new Geom2d_Hyperbola(H);
305   Init(GH);
306 }
307 
308 //=======================================================================
309 //function : BRepLib_MakeEdge2d
310 //purpose  :
311 //=======================================================================
312 
BRepLib_MakeEdge2d(const gp_Hypr2d & H,const Standard_Real p1,const Standard_Real p2)313 BRepLib_MakeEdge2d::BRepLib_MakeEdge2d(const gp_Hypr2d& H,
314 				       const Standard_Real p1,
315 				       const Standard_Real p2)
316 {
317   Handle(Geom2d_Hyperbola) GH = new Geom2d_Hyperbola(H);
318   Init(GH,p1,p2);
319 }
320 
321 //=======================================================================
322 //function : BRepLib_MakeEdge2d
323 //purpose  :
324 //=======================================================================
325 
BRepLib_MakeEdge2d(const gp_Hypr2d & H,const gp_Pnt2d & P1,const gp_Pnt2d & P2)326 BRepLib_MakeEdge2d::BRepLib_MakeEdge2d(const gp_Hypr2d& H,
327 				       const gp_Pnt2d& P1,
328 				       const gp_Pnt2d& P2)
329 {
330   Handle(Geom2d_Hyperbola) GH = new Geom2d_Hyperbola(H);
331   Init(GH,P1,P2);
332 }
333 
334 //=======================================================================
335 //function : BRepLib_MakeEdge2d
336 //purpose  :
337 //=======================================================================
338 
BRepLib_MakeEdge2d(const gp_Hypr2d & H,const TopoDS_Vertex & V1,const TopoDS_Vertex & V2)339 BRepLib_MakeEdge2d::BRepLib_MakeEdge2d(const gp_Hypr2d& H,
340 				       const TopoDS_Vertex& V1,
341 				       const TopoDS_Vertex& V2)
342 {
343   Handle(Geom2d_Hyperbola) GH = new Geom2d_Hyperbola(H);
344   Init(GH,V1,V2);
345 }
346 
347 //=======================================================================
348 //function : BRepLib_MakeEdge2d
349 //purpose  :
350 //=======================================================================
351 
BRepLib_MakeEdge2d(const gp_Parab2d & P)352 BRepLib_MakeEdge2d::BRepLib_MakeEdge2d(const gp_Parab2d& P)
353 {
354   Handle(Geom2d_Parabola) GP = new Geom2d_Parabola(P);
355   Init(GP);
356 }
357 
358 //=======================================================================
359 //function : BRepLib_MakeEdge2d
360 //purpose  :
361 //=======================================================================
362 
BRepLib_MakeEdge2d(const gp_Parab2d & P,const Standard_Real p1,const Standard_Real p2)363 BRepLib_MakeEdge2d::BRepLib_MakeEdge2d(const gp_Parab2d& P,
364 				       const Standard_Real p1,
365 				       const Standard_Real p2)
366 {
367   Handle(Geom2d_Parabola) GP = new Geom2d_Parabola(P);
368   Init(GP,p1,p2);
369 }
370 
371 //=======================================================================
372 //function : BRepLib_MakeEdge2d
373 //purpose  :
374 //=======================================================================
375 
BRepLib_MakeEdge2d(const gp_Parab2d & P,const gp_Pnt2d & P1,const gp_Pnt2d & P2)376 BRepLib_MakeEdge2d::BRepLib_MakeEdge2d(const gp_Parab2d& P,
377 				       const gp_Pnt2d& P1,
378 				       const gp_Pnt2d& P2)
379 {
380   Handle(Geom2d_Parabola) GP = new Geom2d_Parabola(P);
381   Init(GP,P1,P2);
382 }
383 
384 //=======================================================================
385 //function : BRepLib_MakeEdge2d
386 //purpose  :
387 //=======================================================================
388 
BRepLib_MakeEdge2d(const gp_Parab2d & P,const TopoDS_Vertex & V1,const TopoDS_Vertex & V2)389 BRepLib_MakeEdge2d::BRepLib_MakeEdge2d(const gp_Parab2d& P,
390 				       const TopoDS_Vertex& V1,
391 				       const TopoDS_Vertex& V2)
392 {
393   Handle(Geom2d_Parabola) GP = new Geom2d_Parabola(P);
394   Init(GP,V1,V2);
395 }
396 
397 //=======================================================================
398 //function : BRepLib_MakeEdge2d
399 //purpose  :
400 //=======================================================================
401 
BRepLib_MakeEdge2d(const Handle (Geom2d_Curve)& L)402 BRepLib_MakeEdge2d::BRepLib_MakeEdge2d(const Handle(Geom2d_Curve)& L)
403 {
404   Init(L);
405 }
406 
407 //=======================================================================
408 //function : BRepLib_MakeEdge2d
409 //purpose  :
410 //=======================================================================
411 
BRepLib_MakeEdge2d(const Handle (Geom2d_Curve)& L,const Standard_Real p1,const Standard_Real p2)412 BRepLib_MakeEdge2d::BRepLib_MakeEdge2d(const Handle(Geom2d_Curve)& L,
413 				       const Standard_Real p1,
414 				       const Standard_Real p2)
415 {
416   Init(L,p1,p2);
417 }
418 
419 //=======================================================================
420 //function : BRepLib_MakeEdge2d
421 //purpose  :
422 //=======================================================================
423 
BRepLib_MakeEdge2d(const Handle (Geom2d_Curve)& L,const gp_Pnt2d & P1,const gp_Pnt2d & P2)424 BRepLib_MakeEdge2d::BRepLib_MakeEdge2d(const Handle(Geom2d_Curve)& L,
425 				       const gp_Pnt2d& P1,
426 				       const gp_Pnt2d& P2)
427 {
428   Init(L,P1,P2);
429 }
430 
431 //=======================================================================
432 //function : BRepLib_MakeEdge2d
433 //purpose  :
434 //=======================================================================
435 
BRepLib_MakeEdge2d(const Handle (Geom2d_Curve)& L,const TopoDS_Vertex & V1,const TopoDS_Vertex & V2)436 BRepLib_MakeEdge2d::BRepLib_MakeEdge2d(const Handle(Geom2d_Curve)& L,
437 				       const TopoDS_Vertex& V1,
438 				       const TopoDS_Vertex& V2)
439 {
440   Init(L,V1,V2);
441 }
442 
443 //=======================================================================
444 //function : BRepLib_MakeEdge2d
445 //purpose  :
446 //=======================================================================
447 
BRepLib_MakeEdge2d(const Handle (Geom2d_Curve)& L,const gp_Pnt2d & P1,const gp_Pnt2d & P2,const Standard_Real p1,const Standard_Real p2)448 BRepLib_MakeEdge2d::BRepLib_MakeEdge2d(const Handle(Geom2d_Curve)& L,
449 				       const gp_Pnt2d& P1,
450 				       const gp_Pnt2d& P2,
451 				       const Standard_Real p1,
452 				       const Standard_Real p2)
453 {
454   Init(L,P1,P2,p1,p2);
455 }
456 
457 //=======================================================================
458 //function : BRepLib_MakeEdge2d
459 //purpose  :
460 //=======================================================================
461 
BRepLib_MakeEdge2d(const Handle (Geom2d_Curve)& L,const TopoDS_Vertex & V1,const TopoDS_Vertex & V2,const Standard_Real p1,const Standard_Real p2)462 BRepLib_MakeEdge2d::BRepLib_MakeEdge2d(const Handle(Geom2d_Curve)& L,
463 				       const TopoDS_Vertex& V1,
464 				       const TopoDS_Vertex& V2,
465 				       const Standard_Real p1,
466 				       const Standard_Real p2)
467 {
468   Init(L,V1,V2,p1,p2);
469 }
470 
471 //=======================================================================
472 //function : Init
473 //purpose  :
474 //=======================================================================
475 
Init(const Handle (Geom2d_Curve)& C)476 void  BRepLib_MakeEdge2d::Init(const Handle(Geom2d_Curve)& C)
477 {
478   Init(C,C->FirstParameter(),C->LastParameter());
479 }
480 
481 //=======================================================================
482 //function : Init
483 //purpose  :
484 //=======================================================================
485 
Init(const Handle (Geom2d_Curve)& C,const Standard_Real p1,const Standard_Real p2)486 void  BRepLib_MakeEdge2d::Init(const Handle(Geom2d_Curve)& C,
487 			       const Standard_Real p1,
488 			       const Standard_Real p2)
489 {
490 //  BRep_Builder B;
491 
492   TopoDS_Vertex V1,V2;
493   Init(C,V1,V2,p1,p2);
494 }
495 
496 //=======================================================================
497 //function : Init
498 //purpose  :
499 //=======================================================================
500 
Init(const Handle (Geom2d_Curve)& C,const gp_Pnt2d & P1,const gp_Pnt2d & P2)501 void  BRepLib_MakeEdge2d::Init(const Handle(Geom2d_Curve)& C,
502 			       const gp_Pnt2d& P1,
503 			       const gp_Pnt2d& P2)
504 {
505   BRep_Builder B;
506   TopoDS_Vertex V1,V2;
507   B.MakeVertex(V1,Point(P1),Precision::Confusion());
508   if (P1.Distance(P2) < Precision::Confusion())
509     V2 = V1;
510   else
511     B.MakeVertex(V2,Point(P2),Precision::Confusion());
512   Init(C,V1,V2);
513 }
514 
515 //=======================================================================
516 //function : Init
517 //purpose  :
518 //=======================================================================
519 
Init(const Handle (Geom2d_Curve)& C,const TopoDS_Vertex & V1,const TopoDS_Vertex & V2)520 void  BRepLib_MakeEdge2d::Init(const Handle(Geom2d_Curve)& C,
521 			       const TopoDS_Vertex& V1,
522 			       const TopoDS_Vertex& V2)
523 {
524   // try projecting the vertices on the curve
525 
526   Standard_Real p1,p2;
527 
528   if (V1.IsNull())
529     p1 = C->FirstParameter();
530   else
531     if (!Project(C,V1,p1)) {
532       myError = BRepLib_PointProjectionFailed;
533       return;
534     }
535   if (V2.IsNull())
536     p2 = C->LastParameter();
537   else
538     if (!Project(C,V2,p2))  {
539       myError = BRepLib_PointProjectionFailed;
540       return;
541     }
542 
543   Init(C,V1,V2,p1,p2);
544 }
545 
546 
547 //=======================================================================
548 //function : Init
549 //purpose  :
550 //=======================================================================
551 
Init(const Handle (Geom2d_Curve)& C,const gp_Pnt2d & P1,const gp_Pnt2d & P2,const Standard_Real p1,const Standard_Real p2)552 void  BRepLib_MakeEdge2d::Init(const Handle(Geom2d_Curve)& C,
553 			       const gp_Pnt2d& P1,
554 			       const gp_Pnt2d& P2,
555 			       const Standard_Real p1,
556 			       const Standard_Real p2)
557 {
558   BRep_Builder B;
559 
560   TopoDS_Vertex V1,V2;
561   B.MakeVertex(V1,Point(P1),Precision::Confusion());
562   if (P1.Distance(P2) < Precision::Confusion())
563     V2 = V1;
564   else
565     B.MakeVertex(V2,Point(P2),Precision::Confusion());
566 
567 
568   Init(C,V1,V2,p1,p2);
569 }
570 
571 
572 //=======================================================================
573 //function : Init
574 //purpose  : this one really makes the job ...
575 //=======================================================================
576 
Init(const Handle (Geom2d_Curve)& CC,const TopoDS_Vertex & VV1,const TopoDS_Vertex & VV2,const Standard_Real pp1,const Standard_Real pp2)577 void  BRepLib_MakeEdge2d::Init(const Handle(Geom2d_Curve)& CC,
578 			       const TopoDS_Vertex& VV1,
579 			       const TopoDS_Vertex& VV2,
580 			       const Standard_Real pp1,
581 			       const Standard_Real pp2)
582 {
583   // kill trimmed curves
584   Handle(Geom2d_Curve) C = CC;
585   Handle(Geom2d_TrimmedCurve) CT = Handle(Geom2d_TrimmedCurve)::DownCast(C);
586   while (!CT.IsNull()) {
587     C = CT->BasisCurve();
588     CT = Handle(Geom2d_TrimmedCurve)::DownCast(C);
589   }
590 
591   // check parameters
592   Standard_Real p1 = pp1;
593   Standard_Real p2 = pp2;
594   Standard_Real cf = C->FirstParameter();
595   Standard_Real cl = C->LastParameter();
596   Standard_Real epsilon = Precision::Confusion();
597   Standard_Boolean periodic = C->IsPeriodic();
598 
599 
600   TopoDS_Vertex V1,V2;
601   if (periodic) {
602     // adjust in period
603     ElCLib::AdjustPeriodic(cf,cl,epsilon,p1,p2);
604     V1 = VV1;
605     V2 = VV2;
606   }
607   else {
608     // reordonate
609     if (p1 < p2) {
610       V1 = VV1;
611       V2 = VV2;
612     }
613     else {
614       V2 = VV1;
615       V1 = VV2;
616       Standard_Real x = p1;
617       p1 = p2;
618       p2 = x;
619     }
620 
621     // check range
622     if ((cf - p1 > epsilon) || (p2 - cl > epsilon)) {
623       myError = BRepLib_ParameterOutOfRange;
624       return;
625     }
626   }
627 
628   // compute points on the curve
629   Standard_Boolean p1inf = Precision::IsNegativeInfinite(p1);
630   Standard_Boolean p2inf = Precision::IsPositiveInfinite(p2);
631   gp_Pnt2d P1,P2;
632   if (!p1inf) P1 = C->Value(p1);
633   if (!p2inf) P2 = C->Value(p2);
634 
635   Standard_Real preci = Precision::Confusion();
636   BRep_Builder B;
637 
638   // check for closed curve
639   Standard_Boolean closed = Standard_False;
640   if (!p1inf && !p2inf)
641     closed = (P1.Distance(P2) <= preci);
642 
643   // check if the vertices are on the curve
644   if (closed) {
645     if (V1.IsNull() && V2.IsNull()) {
646       B.MakeVertex(V1,Point(P1),preci);
647       V2 = V1;
648     }
649     else if (V1.IsNull())
650       V1 = V2;
651     else if (V2.IsNull())
652       V2 = V1;
653     else {
654       if (!V1.IsSame(V2)) {
655 	myError = BRepLib_DifferentPointsOnClosedCurve;
656 	return;
657       }
658       else if (Point(P1).Distance(BRep_Tool::Pnt(V1)) > preci) {
659 	myError = BRepLib_DifferentPointsOnClosedCurve;
660 	return;
661       }
662     }
663   }
664 
665   else {    // not closed
666 
667     if (p1inf) {
668       if (!V1.IsNull()) {
669 	myError = BRepLib_PointWithInfiniteParameter;
670 	return;
671       }
672     }
673     else {
674       gp_Pnt P = Point(P1);
675       if (V1.IsNull()) {
676 	B.MakeVertex(V1,P,preci);
677       }
678 #if 0
679       // desctivate control (RLE) for speed in sketcher
680         else if (P.Distance(BRep_Tool::Pnt(V1)) > preci) {
681 	myError = BRepLib_DifferentsPointAndParameter;
682 	return;
683       }
684 #endif
685     }
686 
687     if (p2inf) {
688       if (!V2.IsNull()) {
689 	myError = BRepLib_PointWithInfiniteParameter;
690 	return;
691       }
692     }
693     else {
694       gp_Pnt P = Point(P2);
695       if (V2.IsNull()) {
696 	B.MakeVertex(V2,P,preci);
697       }
698 #if 0
699       // desctivate control (RLE) for speed in sketcher
700         else if (P.Distance(BRep_Tool::Pnt(V2)) > preci){
701 	myError = BRepLib_DifferentsPointAndParameter;
702 	return;
703       }
704 #endif
705     }
706   }
707 
708   V1.Orientation(TopAbs_FORWARD);
709   V2.Orientation(TopAbs_REVERSED);
710   myVertex1 = V1;
711   myVertex2 = V2;
712 
713   TopoDS_Edge& E = TopoDS::Edge(myShape);
714   B.MakeEdge(E);
715   B.UpdateEdge(E,C,BRepLib::Plane(),TopLoc_Location(),preci);
716   if (!V1.IsNull()) {
717     B.Add(E,V1);
718   }
719   if (!V2.IsNull()) {
720     B.Add(E,V2);
721   }
722   B.Range(E,p1,p2);
723   Done();
724 }
725 
726 //=======================================================================
727 //function : Error
728 //purpose  :
729 //=======================================================================
730 
Error() const731 BRepLib_EdgeError BRepLib_MakeEdge2d::Error() const
732 {
733   return myError;
734 }
735 
736 //=======================================================================
737 //function : Edge
738 //purpose  :
739 //=======================================================================
740 
Edge()741 const TopoDS_Edge&  BRepLib_MakeEdge2d::Edge()
742 {
743   return TopoDS::Edge(Shape());
744 }
745 
746 
747 //=======================================================================
748 //function : Vertex1
749 //purpose  :
750 //=======================================================================
751 
Vertex1() const752 const TopoDS_Vertex&  BRepLib_MakeEdge2d::Vertex1()const
753 {
754   Check();
755   return myVertex1;
756 }
757 
758 
759 //=======================================================================
760 //function : Vertex2
761 //purpose  :
762 //=======================================================================
763 
Vertex2() const764 const TopoDS_Vertex&  BRepLib_MakeEdge2d::Vertex2()const
765 {
766   Check();
767   return myVertex2;
768 }
769 
770 
771 
772 //=======================================================================
773 //function : operator
774 //purpose  :
775 //=======================================================================
776 
operator TopoDS_Edge()777 BRepLib_MakeEdge2d::operator TopoDS_Edge()
778 {
779   return Edge();
780 }
781