23
#include "PreCompiled.h"
27
# include <BRepAdaptor_Curve.hxx>
28
# include <BRepAdaptor_Surface.hxx>
29
# include <BRepBuilderAPI_MakeEdge.hxx>
30
# include <BRepBuilderAPI_MakeEdge2d.hxx>
31
# include <BRep_Builder.hxx>
32
# include <BRep_Tool.hxx>
33
# include <BRepLib.hxx>
34
# include <GCPnts_UniformAbscissa.hxx>
35
# include <GCPnts_UniformDeflection.hxx>
36
# include <GCPnts_TangentialDeflection.hxx>
37
# include <GCPnts_QuasiUniformAbscissa.hxx>
38
# include <GCPnts_QuasiUniformDeflection.hxx>
39
# include <GCPnts_AbscissaPoint.hxx>
40
# include <Geom2d_Curve.hxx>
41
# include <Geom2d_Geometry.hxx>
42
# include <Geom2dAdaptor_Curve.hxx>
43
# include <Geom2dAPI_ExtremaCurveCurve.hxx>
44
# include <Geom2dAPI_InterCurveCurve.hxx>
45
# include <Geom2dAPI_ProjectPointOnCurve.hxx>
46
# include <Geom2dConvert_ApproxCurve.hxx>
47
# include <Geom2dLProp_CLProps2d.hxx>
48
# include <gp_Dir2d.hxx>
49
# include <Precision.hxx>
50
# include <ShapeConstruct_Curve.hxx>
51
# include <Standard_Failure.hxx>
52
# include <Standard_NullValue.hxx>
56
#include <Base/GeometryPyCXX.h>
57
#include <Base/PyWrapParseTupleAndKeywords.h>
59
#include "Geom2d/Curve2dPy.h"
60
#include "Geom2d/Curve2dPy.cpp"
61
#include "Geom2d/BSplineCurve2dPy.h"
62
#include "GeometrySurfacePy.h"
64
#include "TopoShapeFacePy.h"
68
extern const Py::Object makeGeometryCurvePy(const Handle(Geom_Curve)& c);
74
std::string Curve2dPy::representation() const
76
return "<Curve2d object>";
79
PyObject *Curve2dPy::PyMake(struct _typeobject *, PyObject *, PyObject *)
82
PyErr_SetString(PyExc_RuntimeError,
83
"You cannot create an instance of the abstract class 'Curve2d'.");
88
int Curve2dPy::PyInit(PyObject* , PyObject* )
93
PyObject* Curve2dPy::reverse(PyObject * args)
95
if (PyArg_ParseTuple(args, "")) {
97
Handle(Geom2d_Curve) curve = Handle(Geom2d_Curve)::DownCast(getGeom2dCurvePtr()->handle());
101
catch (Standard_Failure& e) {
102
PyErr_SetString(PartExceptionOCCError, e.GetMessageString());
111
extern Py::Object shape2pyshape(const TopoDS_Shape &shape);
113
void create3dCurve(const TopoDS_Edge& edge)
116
BRepAdaptor_Curve adapt_curve(edge);
117
switch(adapt_curve.GetType()) {
120
BRepBuilderAPI_MakeEdge mkBuilder3d(adapt_curve.Line(),
121
adapt_curve.FirstParameter(),
122
adapt_curve.LastParameter());
123
edge3d = mkBuilder3d.Edge();
127
BRepBuilderAPI_MakeEdge mkBuilder3d(adapt_curve.Circle(),
128
adapt_curve.FirstParameter(),
129
adapt_curve.LastParameter());
130
edge3d = mkBuilder3d.Edge();
132
case GeomAbs_Ellipse:
134
BRepBuilderAPI_MakeEdge mkBuilder3d(adapt_curve.Ellipse(),
135
adapt_curve.FirstParameter(),
136
adapt_curve.LastParameter());
137
edge3d = mkBuilder3d.Edge();
139
case GeomAbs_Hyperbola:
141
BRepBuilderAPI_MakeEdge mkBuilder3d(adapt_curve.Hyperbola(),
142
adapt_curve.FirstParameter(),
143
adapt_curve.LastParameter());
144
edge3d = mkBuilder3d.Edge();
146
case GeomAbs_Parabola:
148
BRepBuilderAPI_MakeEdge mkBuilder3d(adapt_curve.Parabola(),
149
adapt_curve.FirstParameter(),
150
adapt_curve.LastParameter());
151
edge3d = mkBuilder3d.Edge();
153
case GeomAbs_BezierCurve:
155
BRepBuilderAPI_MakeEdge mkBuilder3d(adapt_curve.Bezier(),
156
adapt_curve.FirstParameter(),
157
adapt_curve.LastParameter());
158
edge3d = mkBuilder3d.Edge();
162
BRepLib::BuildCurves3d(edge3d, Precision::Confusion(), GeomAbs_Shape::GeomAbs_C1, 14, 10000);
165
Standard_Real aFirst, aLast;
166
Handle(Geom_Curve) curve = BRep_Tool::Curve(edge3d, aFirst, aLast);
167
BRep_Builder builder;
168
builder.UpdateEdge(edge, curve, Precision::Confusion());
169
builder.Range(edge, aFirst, aLast, true);
174
PyObject* Curve2dPy::toShape(PyObject *args)
176
if (PyArg_ParseTuple(args, "")) {
178
Handle(Geom2d_Curve) curv = Handle(Geom2d_Curve)::DownCast(getGeometry2dPtr()->handle());
180
BRepBuilderAPI_MakeEdge2d mkBuilder(curv);
181
TopoDS_Shape edge = mkBuilder.Shape();
182
return Py::new_reference_to(shape2pyshape(edge));
184
catch (Standard_Failure& e) {
185
PyErr_SetString(PartExceptionOCCError, e.GetMessageString());
192
if (PyArg_ParseTuple(args, "dd", &u1, &u2)) {
194
Handle(Geom2d_Curve) curv = Handle(Geom2d_Curve)::DownCast(getGeometry2dPtr()->handle());
196
BRepBuilderAPI_MakeEdge2d mkBuilder(curv, u1, u2);
197
TopoDS_Shape edge = mkBuilder.Shape();
198
return Py::new_reference_to(shape2pyshape(edge));
200
catch (Standard_Failure& e) {
201
PyErr_SetString(PartExceptionOCCError, e.GetMessageString());
208
if (PyArg_ParseTuple(args, "O!", &(Part::GeometrySurfacePy::Type), &p)) {
210
Handle(Geom_Surface) surf = Handle(Geom_Surface)::DownCast(
211
static_cast<GeometrySurfacePy*>(p)->getGeomSurfacePtr()->handle());
212
Handle(Geom2d_Curve) curv = Handle(Geom2d_Curve)::DownCast(getGeometry2dPtr()->handle());
214
BRepBuilderAPI_MakeEdge mkBuilder(curv, surf);
215
TopoDS_Edge edge = mkBuilder.Edge();
218
return Py::new_reference_to(shape2pyshape(edge));
220
catch (Standard_Failure& e) {
221
PyErr_SetString(PartExceptionOCCError, e.GetMessageString());
227
if (PyArg_ParseTuple(args, "O!dd", &(Part::GeometrySurfacePy::Type), &p, &u1, &u2)) {
229
Handle(Geom_Surface) surf = Handle(Geom_Surface)::DownCast(
230
static_cast<GeometrySurfacePy*>(p)->getGeomSurfacePtr()->handle());
231
Handle(Geom2d_Curve) curv = Handle(Geom2d_Curve)::DownCast(getGeometry2dPtr()->handle());
233
BRepBuilderAPI_MakeEdge mkBuilder(curv, surf, u1, u2);
234
TopoDS_Edge edge = mkBuilder.Edge();
237
return Py::new_reference_to(shape2pyshape(edge));
239
catch (Standard_Failure& e) {
241
PyErr_SetString(PartExceptionOCCError, e.GetMessageString());
247
if (PyArg_ParseTuple(args, "O!", &(Part::TopoShapeFacePy::Type), &p)) {
249
const TopoDS_Face& face = TopoDS::Face(static_cast<TopoShapeFacePy*>(p)->getTopoShapePtr()->getShape());
250
Handle(Geom2d_Curve) curv = Handle(Geom2d_Curve)::DownCast(getGeometry2dPtr()->handle());
252
BRepAdaptor_Surface adapt(face);
253
BRepBuilderAPI_MakeEdge mkBuilder(curv, adapt.Surface().Surface());
254
TopoDS_Edge edge = mkBuilder.Edge();
257
return Py::new_reference_to(shape2pyshape(edge));
259
catch (Standard_Failure& e) {
260
PyErr_SetString(PartExceptionOCCError, e.GetMessageString());
266
if (PyArg_ParseTuple(args, "O!dd", &(Part::TopoShapeFacePy::Type), &p, &u1, &u2)) {
268
const TopoDS_Face& face = TopoDS::Face(static_cast<TopoShapeFacePy*>(p)->getTopoShapePtr()->getShape());
269
Handle(Geom2d_Curve) curv = Handle(Geom2d_Curve)::DownCast(getGeometry2dPtr()->handle());
271
BRepAdaptor_Surface adapt(face);
272
BRepBuilderAPI_MakeEdge mkBuilder(curv, adapt.Surface().Surface(), u1, u2);
273
TopoDS_Edge edge = mkBuilder.Edge();
276
return Py::new_reference_to(shape2pyshape(edge));
278
catch (Standard_Failure& e) {
279
PyErr_SetString(PartExceptionOCCError, e.GetMessageString());
284
PyErr_SetString(PyExc_TypeError, "empty parameter list, parameter range or surface expected");
288
PyObject* Curve2dPy::discretize(PyObject *args, PyObject *kwds)
291
Handle(Geom2d_Geometry) g = getGeometry2dPtr()->handle();
292
Handle(Geom2d_Curve) c = Handle(Geom2d_Curve)::DownCast(g);
294
PyErr_SetString(PartExceptionOCCError, "Geometry is not a curve");
298
Geom2dAdaptor_Curve adapt(c);
299
double first = adapt.FirstParameter();
300
double last = adapt.LastParameter();
303
static const std::array<const char *, 4> kwds_numPoints {"Number", "First", "Last", nullptr};
306
if (Base::Wrapped_ParseTupleAndKeywords(args, kwds, "i|dd", kwds_numPoints, &numPoints, &first, &last)) {
307
GCPnts_UniformAbscissa discretizer;
308
discretizer.Initialize (adapt, numPoints, first, last);
310
if (discretizer.IsDone () && discretizer.NbPoints () > 0) {
312
int nbPoints = discretizer.NbPoints ();
314
for (int i=1; i<=nbPoints; i++) {
315
gp_Pnt2d p = adapt.Value (discretizer.Parameter (i));
316
points.append(Base::Vector2dPy::create(p.X(), p.Y()));
319
return Py::new_reference_to(points);
322
PyErr_SetString(PartExceptionOCCError, "Discretization of curve failed");
328
static const std::array<const char *, 4> kwds_Distance{"Distance", "First", "Last", nullptr};
330
double distance = -1;
331
if (Base::Wrapped_ParseTupleAndKeywords(args, kwds, "d|dd", kwds_Distance, &distance, &first, &last)) {
332
GCPnts_UniformAbscissa discretizer;
333
discretizer.Initialize (adapt, distance, first, last);
335
if (discretizer.IsDone () && discretizer.NbPoints () > 0) {
337
int nbPoints = discretizer.NbPoints ();
339
for (int i=1; i<=nbPoints; i++) {
340
gp_Pnt2d p = adapt.Value (discretizer.Parameter (i));
341
points.append(Base::Vector2dPy::create(p.X(), p.Y()));
344
return Py::new_reference_to(points);
347
PyErr_SetString(PartExceptionOCCError, "Discretization of curve failed");
353
static const std::array<const char *, 4> kwds_Deflection{"Deflection", "First", "Last", nullptr};
356
if (Base::Wrapped_ParseTupleAndKeywords(args, kwds, "d|dd", kwds_Deflection, &deflection, &first, &last)) {
357
GCPnts_UniformDeflection discretizer(adapt, deflection, first, last);
358
if (discretizer.IsDone () && discretizer.NbPoints () > 0) {
360
int nbPoints = discretizer.NbPoints ();
362
for (int i=1; i<=nbPoints; i++) {
363
gp_Pnt p = discretizer.Value (i);
364
points.append(Base::Vector2dPy::create(p.X(), p.Y()));
367
return Py::new_reference_to(points);
370
PyErr_SetString(PartExceptionOCCError, "Discretization of curve failed");
376
static const std::array<const char *, 6> kwds_TangentialDeflection{"Angular", "Curvature", "First", "Last",
381
int minimumPoints = 2;
382
if (Base::Wrapped_ParseTupleAndKeywords(args, kwds, "dd|ddi", kwds_TangentialDeflection, &angular, &curvature,
383
&first, &last, &minimumPoints)) {
384
GCPnts_TangentialDeflection discretizer(adapt, first, last, angular, curvature, minimumPoints);
385
if (discretizer.NbPoints () > 0) {
387
int nbPoints = discretizer.NbPoints ();
389
for (int i=1; i<=nbPoints; i++) {
390
gp_Pnt p = discretizer.Value (i);
391
points.append(Base::Vector2dPy::create(p.X(), p.Y()));
394
return Py::new_reference_to(points);
397
PyErr_SetString(PartExceptionOCCError, "Discretization of curve failed");
403
static const std::array<const char *, 4> kwds_QuasiNumPoints{"QuasiNumber", "First", "Last", nullptr};
406
if (Base::Wrapped_ParseTupleAndKeywords(args, kwds, "i|dd", kwds_QuasiNumPoints, &quasiNumPoints, &first,
408
GCPnts_QuasiUniformAbscissa discretizer(adapt, quasiNumPoints, first, last);
409
if (discretizer.NbPoints () > 0) {
411
int nbPoints = discretizer.NbPoints ();
413
for (int i=1; i<=nbPoints; i++) {
414
gp_Pnt2d p = adapt.Value (discretizer.Parameter (i));
415
points.append(Base::Vector2dPy::create(p.X(), p.Y()));
418
return Py::new_reference_to(points);
421
PyErr_SetString(PartExceptionOCCError, "Discretization of curve failed");
427
static const std::array<const char *, 4> kwds_QuasiDeflection {"QuasiDeflection","First","Last",nullptr};
429
double quasiDeflection;
430
if (Base::Wrapped_ParseTupleAndKeywords(args, kwds, "d|dd", kwds_QuasiDeflection, &quasiDeflection, &first,
432
GCPnts_QuasiUniformDeflection discretizer(adapt, quasiDeflection, first, last);
433
if (discretizer.NbPoints () > 0) {
435
int nbPoints = discretizer.NbPoints ();
436
for (int i=1; i<=nbPoints; i++) {
437
gp_Pnt p = discretizer.Value (i);
438
points.append(Base::Vector2dPy::create(p.X(), p.Y()));
441
return Py::new_reference_to(points);
444
PyErr_SetString(PartExceptionOCCError, "Discretization of curve failed");
449
catch (const Base::Exception& e) {
450
PyErr_SetString(PartExceptionOCCError, e.what());
454
PyErr_SetString(PartExceptionOCCError,"Wrong arguments");
458
PyObject* Curve2dPy::length(PyObject *args)
460
Handle(Geom2d_Geometry) g = getGeometry2dPtr()->handle();
461
Handle(Geom2d_Curve) c = Handle(Geom2d_Curve)::DownCast(g);
464
double u=c->FirstParameter();
465
double v=c->LastParameter();
466
double t=Precision::Confusion();
467
if (!PyArg_ParseTuple(args, "|ddd", &u,&v,&t))
469
Geom2dAdaptor_Curve adapt(c);
470
double len = GCPnts_AbscissaPoint::Length(adapt,u,v,t);
471
return PyFloat_FromDouble(len);
474
catch (Standard_Failure& e) {
475
PyErr_SetString(PartExceptionOCCError, e.GetMessageString());
479
PyErr_SetString(PartExceptionOCCError, "Geometry is not a curve");
483
PyObject* Curve2dPy::parameterAtDistance(PyObject *args)
485
Handle(Geom2d_Geometry) g = getGeometry2dPtr()->handle();
486
Handle(Geom2d_Curve) c = Handle(Geom2d_Curve)::DownCast(g);
491
if (!PyArg_ParseTuple(args, "d|d", &abscissa,&u))
493
Geom2dAdaptor_Curve adapt(c);
494
GCPnts_AbscissaPoint abscissaPoint(adapt,abscissa,u);
495
double parm = abscissaPoint.Parameter();
496
return PyFloat_FromDouble(parm);
499
catch (Standard_Failure& e) {
500
PyErr_SetString(PartExceptionOCCError, e.GetMessageString());
504
PyErr_SetString(PartExceptionOCCError, "Geometry is not a curve");
508
PyObject* Curve2dPy::value(PyObject *args)
510
Handle(Geom2d_Geometry) g = getGeometry2dPtr()->handle();
511
Handle(Geom2d_Curve) c = Handle(Geom2d_Curve)::DownCast(g);
515
if (!PyArg_ParseTuple(args, "d", &u))
517
gp_Pnt2d p = c->Value(u);
518
return Py::new_reference_to(Base::Vector2dPy::create(p.X(), p.Y()));
521
catch (Standard_Failure& e) {
522
PyErr_SetString(PartExceptionOCCError, e.GetMessageString());
526
PyErr_SetString(PartExceptionOCCError, "Geometry is not a curve");
530
PyObject* Curve2dPy::tangent(PyObject *args)
532
Handle(Geom2d_Geometry) g = getGeometry2dPtr()->handle();
533
Handle(Geom2d_Curve) c = Handle(Geom2d_Curve)::DownCast(g);
537
if (!PyArg_ParseTuple(args, "d", &u))
540
Geom2dLProp_CLProps2d prop(c,u,2,Precision::Confusion());
541
if (prop.IsTangentDefined()) {
545
return Py::new_reference_to(Base::Vector2dPy::create(dir.X(), dir.Y()));
548
catch (Standard_Failure& e) {
549
PyErr_SetString(PartExceptionOCCError, e.GetMessageString());
553
PyErr_SetString(PartExceptionOCCError, "Geometry is not a curve");
557
PyObject* Curve2dPy::normal(PyObject *args)
559
Handle(Geom2d_Geometry) g = getGeometry2dPtr()->handle();
560
Handle(Geom2d_Curve) c = Handle(Geom2d_Curve)::DownCast(g);
564
if (!PyArg_ParseTuple(args, "d", &u))
567
Geom2dLProp_CLProps2d prop(c,u,2,Precision::Confusion());
570
return Py::new_reference_to(Base::Vector2dPy::create(dir.X(), dir.Y()));
573
catch (Standard_Failure& e) {
574
PyErr_SetString(PartExceptionOCCError, e.GetMessageString());
578
PyErr_SetString(PartExceptionOCCError, "Geometry is not a curve");
582
PyObject* Curve2dPy::curvature(PyObject *args)
584
Handle(Geom2d_Geometry) g = getGeometry2dPtr()->handle();
585
Handle(Geom2d_Curve) c = Handle(Geom2d_Curve)::DownCast(g);
589
if (!PyArg_ParseTuple(args, "d", &u))
591
Geom2dLProp_CLProps2d prop(c,u,2,Precision::Confusion());
592
double C = prop.Curvature();
593
return Py::new_reference_to(Py::Float(C));
596
catch (Standard_Failure& e) {
597
PyErr_SetString(PartExceptionOCCError, e.GetMessageString());
601
PyErr_SetString(PartExceptionOCCError, "Geometry is not a curve");
605
PyObject* Curve2dPy::centerOfCurvature(PyObject *args)
607
Handle(Geom2d_Geometry) g = getGeometry2dPtr()->handle();
608
Handle(Geom2d_Curve) c = Handle(Geom2d_Curve)::DownCast(g);
612
if (!PyArg_ParseTuple(args, "d", &u))
614
Geom2dLProp_CLProps2d prop(c,u,2,Precision::Confusion());
616
prop.CentreOfCurvature(pnt);
618
return Py::new_reference_to(Base::Vector2dPy::create(pnt.X(), pnt.Y()));
621
catch (Standard_Failure& e) {
622
PyErr_SetString(PartExceptionOCCError, e.GetMessageString());
626
PyErr_SetString(PartExceptionOCCError, "Geometry is not a curve");
630
PyObject* Curve2dPy::parameter(PyObject *args)
632
Handle(Geom2d_Geometry) g = getGeometry2dPtr()->handle();
633
Handle(Geom2d_Curve) c = Handle(Geom2d_Curve)::DownCast(g);
637
if (!PyArg_ParseTuple(args, "O!", Base::Vector2dPy::type_object(), &p))
639
Base::Vector2d v = Py::toVector2d(p);
640
gp_Pnt2d pnt(v.x,v.y);
641
Geom2dAPI_ProjectPointOnCurve ppc(pnt, c);
642
double val = ppc.LowerDistanceParameter();
643
return Py::new_reference_to(Py::Float(val));
646
catch (Standard_Failure& e) {
648
PyErr_SetString(PartExceptionOCCError, e.GetMessageString());
652
PyErr_SetString(PartExceptionOCCError, "Geometry is not a curve");
656
PyObject* Curve2dPy::toBSpline(PyObject * args)
658
Handle(Geom2d_Geometry) g = getGeometry2dPtr()->handle();
659
Handle(Geom2d_Curve) c = Handle(Geom2d_Curve)::DownCast(g);
663
u=c->FirstParameter();
664
v=c->LastParameter();
665
if (!PyArg_ParseTuple(args, "|dd", &u,&v))
667
ShapeConstruct_Curve scc;
668
Handle(Geom2d_BSplineCurve) spline = scc.ConvertToBSpline(c, u, v, Precision::Confusion());
670
Standard_NullValue::Raise("Conversion to B-spline failed");
671
return new BSplineCurve2dPy(new Geom2dBSplineCurve(spline));
674
catch (Standard_Failure& e) {
675
PyErr_SetString(PartExceptionOCCError, e.GetMessageString());
679
PyErr_SetString(PartExceptionOCCError, "Geometry is not a curve");
683
PyObject* Curve2dPy::approximateBSpline(PyObject *args)
686
int maxSegment, maxDegree;
687
const char* order = "C2";
688
if (!PyArg_ParseTuple(args, "dii|s", &tolerance, &maxSegment, &maxDegree, &order))
691
GeomAbs_Shape absShape;
692
std::string str = order;
694
absShape = GeomAbs_C0;
695
else if (str == "G1")
696
absShape = GeomAbs_G1;
697
else if (str == "C1")
698
absShape = GeomAbs_C1;
699
else if (str == "G2")
700
absShape = GeomAbs_G2;
701
else if (str == "C2")
702
absShape = GeomAbs_C2;
703
else if (str == "C3")
704
absShape = GeomAbs_C3;
705
else if (str == "CN")
706
absShape = GeomAbs_CN;
708
absShape = GeomAbs_C2;
711
Handle(Geom2d_Curve) self = Handle(Geom2d_Curve)::DownCast(getGeometry2dPtr()->handle());
712
Geom2dConvert_ApproxCurve approx(self, tolerance, absShape, maxSegment, maxDegree);
713
if (approx.IsDone()) {
714
return new BSplineCurve2dPy(new Geom2dBSplineCurve(approx.Curve()));
716
else if (approx.HasResult()) {
717
std::stringstream str;
718
str << "Maximum error (" << approx.MaxError() << ") is outside tolerance";
719
PyErr_SetString(PyExc_RuntimeError, str.str().c_str());
723
PyErr_SetString(PyExc_RuntimeError, "Approximation of curve failed");
727
catch (Standard_Failure& e) {
728
PyErr_SetString(PartExceptionOCCError, e.GetMessageString());
733
Py::String Curve2dPy::getContinuity() const
735
GeomAbs_Shape c = Handle(Geom2d_Curve)::DownCast
736
(getGeometry2dPtr()->handle())->Continuity();
764
return Py::String(str);
767
Py::Boolean Curve2dPy::getClosed() const
769
return Py::Boolean(Handle(Geom2d_Curve)::DownCast
770
(getGeometry2dPtr()->handle())->IsClosed() ? true : false);
773
Py::Boolean Curve2dPy::getPeriodic() const
775
return Py::Boolean(Handle(Geom2d_Curve)::DownCast
776
(getGeometry2dPtr()->handle())->IsPeriodic() ? true : false);
779
Py::Float Curve2dPy::getFirstParameter() const
781
return Py::Float(Handle(Geom2d_Curve)::DownCast
782
(getGeometry2dPtr()->handle())->FirstParameter());
785
Py::Float Curve2dPy::getLastParameter() const
787
return Py::Float(Handle(Geom2d_Curve)::DownCast
788
(getGeometry2dPtr()->handle())->LastParameter());
791
PyObject *Curve2dPy::getCustomAttributes(const char* ) const
796
int Curve2dPy::setCustomAttributes(const char* , PyObject* )
801
PyObject* Curve2dPy::intersectCC(PyObject *args)
803
Handle(Geom2d_Curve) curve1 = Handle(Geom2d_Curve)::DownCast(getGeometry2dPtr()->handle());
805
if (!curve1.IsNull()) {
807
double prec = Precision::Confusion();
808
if (!PyArg_ParseTuple(args, "O!|d", &(Part::Curve2dPy::Type), &p, &prec))
811
Handle(Geom2d_Curve) curve2 = Handle(Geom2d_Curve)::DownCast(static_cast<Geometry2dPy*>(p)->getGeometry2dPtr()->handle());
813
Geom2dAPI_InterCurveCurve intersector(curve1, curve2, prec);
814
if ((intersector.NbPoints() == 0) && (intersector.NbSegments() == 0)) {
816
return Py::new_reference_to(Py::List());
818
if (intersector.NbPoints() > 0) {
820
for (int i = 1; i <= intersector.NbPoints(); i++) {
821
gp_Pnt2d p1 = intersector.Point(i);
822
points.append(Base::Vector2dPy::create(p1.X(), p1.Y()));
825
if (intersector.NbSegments() > 0) {
827
Geom2dAPI_ExtremaCurveCurve intersector2(curve1, curve2,
828
curve1->FirstParameter(),
829
curve1->LastParameter(),
830
curve2->FirstParameter(),
831
curve2->LastParameter());
832
for (int i = 1; i <= intersector2.NbExtrema(); i++) {
833
if (intersector2.Distance(i) > prec)
836
intersector2.Points(i, p1, p2);
837
points.append(Base::Vector2dPy::create(p1.X(), p1.Y()));
840
return Py::new_reference_to(points);
843
catch (Standard_Failure& e) {
844
PyErr_SetString(PyExc_RuntimeError, e.GetMessageString());
848
PyErr_SetString(PyExc_TypeError, "Geometry is not a curve");