Part: improve Python interface
+ rename getCurve2dFromGeom2d to makeFromCurve2d + add function makeFromCurve and makeFromTrimmedCurve like makeFromSurface + implement OffsetCurve.BasisCurve + fix memory leak in BRepOffsetAPI_MakePipeShellPy
This commit is contained in:
@@ -4899,4 +4899,144 @@ std::unique_ptr<GeomSurface> makeFromSurface(const Handle(Geom_Surface)& s)
|
||||
return geoSurf;
|
||||
}
|
||||
|
||||
std::unique_ptr<GeomCurve> makeFromCurve(const Handle(Geom_Curve)& c)
|
||||
{
|
||||
std::unique_ptr<GeomCurve> geoCurve;
|
||||
if (c->IsKind(STANDARD_TYPE(Geom_Circle))) {
|
||||
Handle(Geom_Circle) circ = Handle(Geom_Circle)::DownCast(c);
|
||||
geoCurve.reset(new GeomCircle(circ));
|
||||
}
|
||||
else if (c->IsKind(STANDARD_TYPE(Geom_Ellipse))) {
|
||||
Handle(Geom_Ellipse) ell = Handle(Geom_Ellipse)::DownCast(c);
|
||||
geoCurve.reset(new GeomEllipse(ell));
|
||||
}
|
||||
else if (c->IsKind(STANDARD_TYPE(Geom_Hyperbola))) {
|
||||
Handle(Geom_Hyperbola) hyp = Handle(Geom_Hyperbola)::DownCast(c);
|
||||
geoCurve.reset(new GeomHyperbola(hyp));
|
||||
}
|
||||
else if (c->IsKind(STANDARD_TYPE(Geom_Line))) {
|
||||
Handle(Geom_Line) lin = Handle(Geom_Line)::DownCast(c);
|
||||
geoCurve.reset(new GeomLine(lin));
|
||||
}
|
||||
else if (c->IsKind(STANDARD_TYPE(Geom_OffsetCurve))) {
|
||||
Handle(Geom_OffsetCurve) oc = Handle(Geom_OffsetCurve)::DownCast(c);
|
||||
geoCurve.reset(new GeomOffsetCurve(oc));
|
||||
}
|
||||
else if (c->IsKind(STANDARD_TYPE(Geom_Parabola))) {
|
||||
Handle(Geom_Parabola) par = Handle(Geom_Parabola)::DownCast(c);
|
||||
geoCurve.reset(new GeomParabola(par));
|
||||
}
|
||||
else if (c->IsKind(STANDARD_TYPE(Geom_TrimmedCurve))) {
|
||||
return makeFromTrimmedCurve(c, c->FirstParameter(), c->LastParameter());
|
||||
}
|
||||
/*else if (c->IsKind(STANDARD_TYPE(Geom_BoundedCurve))) {
|
||||
Handle(Geom_BoundedCurve) bc = Handle(Geom_BoundedCurve)::DownCast(c);
|
||||
return Py::asObject(new GeometryCurvePy(new GeomBoundedCurve(bc)));
|
||||
}*/
|
||||
else if (c->IsKind(STANDARD_TYPE(Geom_BezierCurve))) {
|
||||
Handle(Geom_BezierCurve) bezier = Handle(Geom_BezierCurve)::DownCast(c);
|
||||
geoCurve.reset(new GeomBezierCurve(bezier));
|
||||
}
|
||||
else if (c->IsKind(STANDARD_TYPE(Geom_BSplineCurve))) {
|
||||
Handle(Geom_BSplineCurve) bspline = Handle(Geom_BSplineCurve)::DownCast(c);
|
||||
geoCurve.reset(new GeomBSplineCurve(bspline));
|
||||
}
|
||||
else {
|
||||
std::string err = "Unhandled curve type ";
|
||||
err += c->DynamicType()->Name();
|
||||
throw Base::TypeError(err);
|
||||
}
|
||||
|
||||
return geoCurve;
|
||||
}
|
||||
|
||||
std::unique_ptr<GeomCurve> makeFromTrimmedCurve(const Handle(Geom_Curve)& c, double f, double l)
|
||||
{
|
||||
if (c->IsKind(STANDARD_TYPE(Geom_Circle))) {
|
||||
Handle(Geom_Circle) circ = Handle(Geom_Circle)::DownCast(c);
|
||||
std::unique_ptr<GeomArcOfCircle> arc(new GeomArcOfCircle());
|
||||
Handle(Geom_TrimmedCurve) this_arc = Handle(Geom_TrimmedCurve)::DownCast
|
||||
(arc->handle());
|
||||
Handle(Geom_Circle) this_circ = Handle(Geom_Circle)::DownCast
|
||||
(this_arc->BasisCurve());
|
||||
this_circ->SetCirc(circ->Circ());
|
||||
this_arc->SetTrim(f, l);
|
||||
return arc;
|
||||
}
|
||||
else if (c->IsKind(STANDARD_TYPE(Geom_Ellipse))) {
|
||||
Handle(Geom_Ellipse) ellp = Handle(Geom_Ellipse)::DownCast(c);
|
||||
std::unique_ptr<GeomArcOfEllipse> arc(new GeomArcOfEllipse());
|
||||
Handle(Geom_TrimmedCurve) this_arc = Handle(Geom_TrimmedCurve)::DownCast
|
||||
(arc->handle());
|
||||
Handle(Geom_Ellipse) this_ellp = Handle(Geom_Ellipse)::DownCast
|
||||
(this_arc->BasisCurve());
|
||||
this_ellp->SetElips(ellp->Elips());
|
||||
this_arc->SetTrim(f, l);
|
||||
return arc;
|
||||
}
|
||||
else if (c->IsKind(STANDARD_TYPE(Geom_Hyperbola))) {
|
||||
Handle(Geom_Hyperbola) hypr = Handle(Geom_Hyperbola)::DownCast(c);
|
||||
std::unique_ptr<GeomArcOfHyperbola> arc(new GeomArcOfHyperbola());
|
||||
Handle(Geom_TrimmedCurve) this_arc = Handle(Geom_TrimmedCurve)::DownCast
|
||||
(arc->handle());
|
||||
Handle(Geom_Hyperbola) this_hypr = Handle(Geom_Hyperbola)::DownCast
|
||||
(this_arc->BasisCurve());
|
||||
this_hypr->SetHypr(hypr->Hypr());
|
||||
this_arc->SetTrim(f, l);
|
||||
return arc;
|
||||
}
|
||||
else if (c->IsKind(STANDARD_TYPE(Geom_Line))) {
|
||||
Handle(Geom_Line) line = Handle(Geom_Line)::DownCast(c);
|
||||
std::unique_ptr<GeomLineSegment> segm(new GeomLineSegment());
|
||||
Handle(Geom_TrimmedCurve) this_segm = Handle(Geom_TrimmedCurve)::DownCast
|
||||
(segm->handle());
|
||||
Handle(Geom_Line) this_line = Handle(Geom_Line)::DownCast
|
||||
(this_segm->BasisCurve());
|
||||
this_line->SetLin(line->Lin());
|
||||
this_segm->SetTrim(f, l);
|
||||
return segm;
|
||||
}
|
||||
else if (c->IsKind(STANDARD_TYPE(Geom_Parabola))) {
|
||||
Handle(Geom_Parabola) para = Handle(Geom_Parabola)::DownCast(c);
|
||||
std::unique_ptr<GeomArcOfParabola> arc(new GeomArcOfParabola());
|
||||
Handle(Geom_TrimmedCurve) this_arc = Handle(Geom_TrimmedCurve)::DownCast
|
||||
(arc->handle());
|
||||
Handle(Geom_Parabola) this_para = Handle(Geom_Parabola)::DownCast
|
||||
(this_arc->BasisCurve());
|
||||
this_para->SetParab(para->Parab());
|
||||
this_arc->SetTrim(f, l);
|
||||
return arc;
|
||||
}
|
||||
else if (c->IsKind(STANDARD_TYPE(Geom_BezierCurve))) {
|
||||
Handle(Geom_BezierCurve) bezier = Handle(Geom_BezierCurve)::DownCast(c->Copy());
|
||||
bezier->Segment(f, l);
|
||||
return std::unique_ptr<GeomBezierCurve>(new GeomBezierCurve(bezier));
|
||||
}
|
||||
else if (c->IsKind(STANDARD_TYPE(Geom_BSplineCurve))) {
|
||||
Handle(Geom_BSplineCurve) bspline = Handle(Geom_BSplineCurve)::DownCast(c->Copy());
|
||||
bspline->Segment(f, l);
|
||||
return std::unique_ptr<GeomBSplineCurve>(new GeomBSplineCurve(bspline));
|
||||
}
|
||||
else if (c->IsKind(STANDARD_TYPE(Geom_OffsetCurve))) {
|
||||
Handle(Geom_OffsetCurve) oc = Handle(Geom_OffsetCurve)::DownCast(c);
|
||||
double v = oc->Offset();
|
||||
gp_Dir dir = oc->Direction();
|
||||
std::unique_ptr<GeomCurve> bc(makeFromTrimmedCurve(oc->BasisCurve(), f, l));
|
||||
return std::unique_ptr<GeomOffsetCurve>(new GeomOffsetCurve(Handle(Geom_Curve)::DownCast(bc->handle()), v, dir));
|
||||
}
|
||||
else if (c->IsKind(STANDARD_TYPE(Geom_TrimmedCurve))) {
|
||||
Handle(Geom_TrimmedCurve) trc = Handle(Geom_TrimmedCurve)::DownCast(c);
|
||||
return makeFromTrimmedCurve(trc->BasisCurve(), f, l);
|
||||
}
|
||||
/*else if (c->IsKind(STANDARD_TYPE(Geom_BoundedCurve))) {
|
||||
Handle(Geom_BoundedCurve) bc = Handle(Geom_BoundedCurve)::DownCast(c);
|
||||
return Py::asObject(new GeometryCurvePy(new GeomBoundedCurve(bc)));
|
||||
}*/
|
||||
else {
|
||||
std::string err = "Unhandled curve type ";
|
||||
err += c->DynamicType()->Name();
|
||||
throw Base::TypeError(err);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user