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