if possible then keep canonical curve and avoid to get a B-spline

This commit is contained in:
wmayer 2017-02-24 12:32:06 +01:00
parent 2dcbba9c33
commit 1073d06ef5

View File

@ -49,6 +49,7 @@
# include <BRepBuilderAPI_MakeEdge.hxx> # include <BRepBuilderAPI_MakeEdge.hxx>
# include <BRepAdaptor_Surface.hxx> # include <BRepAdaptor_Surface.hxx>
# include <BRepLib.hxx> # include <BRepLib.hxx>
# include <BRepAdaptor_Curve.hxx>
# include <TopoDS.hxx> # include <TopoDS.hxx>
#endif #endif
@ -112,6 +113,69 @@ PyObject* Curve2dPy::reverse(PyObject * args)
namespace Part { namespace Part {
extern Py::Object shape2pyshape(const TopoDS_Shape &shape); extern Py::Object shape2pyshape(const TopoDS_Shape &shape);
TopoDS_Edge create3dCurve(const TopoDS_Edge& edge)
{
TopoDS_Edge edge3d;
BRepAdaptor_Curve adapt_curve(edge);
switch(adapt_curve.GetType()) {
case GeomAbs_Line:
{
BRepBuilderAPI_MakeEdge mkBuilder3d(adapt_curve.Line(),
adapt_curve.FirstParameter(),
adapt_curve.LastParameter());
edge3d = mkBuilder3d.Edge();
} break;
case GeomAbs_Circle:
{
BRepBuilderAPI_MakeEdge mkBuilder3d(adapt_curve.Circle(),
adapt_curve.FirstParameter(),
adapt_curve.LastParameter());
edge3d = mkBuilder3d.Edge();
} break;
case GeomAbs_Ellipse:
{
BRepBuilderAPI_MakeEdge mkBuilder3d(adapt_curve.Ellipse(),
adapt_curve.FirstParameter(),
adapt_curve.LastParameter());
edge3d = mkBuilder3d.Edge();
} break;
case GeomAbs_Hyperbola:
{
BRepBuilderAPI_MakeEdge mkBuilder3d(adapt_curve.Hyperbola(),
adapt_curve.FirstParameter(),
adapt_curve.LastParameter());
edge3d = mkBuilder3d.Edge();
} break;
case GeomAbs_Parabola:
{
BRepBuilderAPI_MakeEdge mkBuilder3d(adapt_curve.Parabola(),
adapt_curve.FirstParameter(),
adapt_curve.LastParameter());
edge3d = mkBuilder3d.Edge();
} break;
case GeomAbs_BezierCurve:
{
BRepBuilderAPI_MakeEdge mkBuilder3d(adapt_curve.Bezier(),
adapt_curve.FirstParameter(),
adapt_curve.LastParameter());
edge3d = mkBuilder3d.Edge();
} break;
case GeomAbs_BSplineCurve:
{
BRepBuilderAPI_MakeEdge mkBuilder3d(adapt_curve.BSpline(),
adapt_curve.FirstParameter(),
adapt_curve.LastParameter());
edge3d = mkBuilder3d.Edge();
} break;
default:
edge3d = edge;
BRepLib::BuildCurves3d(edge3d);
break;
}
return edge3d;
}
} }
PyObject* Curve2dPy::toShape(PyObject *args) PyObject* Curve2dPy::toShape(PyObject *args)
@ -157,8 +221,9 @@ PyObject* Curve2dPy::toShape(PyObject *args)
Handle_Geom2d_Curve curv = Handle_Geom2d_Curve::DownCast(getGeometry2dPtr()->handle()); Handle_Geom2d_Curve curv = Handle_Geom2d_Curve::DownCast(getGeometry2dPtr()->handle());
BRepBuilderAPI_MakeEdge mkBuilder(curv, surf); BRepBuilderAPI_MakeEdge mkBuilder(curv, surf);
TopoDS_Shape edge = mkBuilder.Shape(); TopoDS_Edge edge = mkBuilder.Edge();
BRepLib::BuildCurves3d(edge); edge = create3dCurve(edge);
return Py::new_reference_to(shape2pyshape(edge)); return Py::new_reference_to(shape2pyshape(edge));
} }
catch (Standard_Failure) { catch (Standard_Failure) {
@ -176,8 +241,9 @@ PyObject* Curve2dPy::toShape(PyObject *args)
Handle_Geom2d_Curve curv = Handle_Geom2d_Curve::DownCast(getGeometry2dPtr()->handle()); Handle_Geom2d_Curve curv = Handle_Geom2d_Curve::DownCast(getGeometry2dPtr()->handle());
BRepBuilderAPI_MakeEdge mkBuilder(curv, surf, u1, u2); BRepBuilderAPI_MakeEdge mkBuilder(curv, surf, u1, u2);
TopoDS_Shape edge = mkBuilder.Shape(); TopoDS_Edge edge = mkBuilder.Edge();
BRepLib::BuildCurves3d(edge); edge = create3dCurve(edge);
return Py::new_reference_to(shape2pyshape(edge)); return Py::new_reference_to(shape2pyshape(edge));
} }
catch (Standard_Failure) { catch (Standard_Failure) {
@ -195,8 +261,9 @@ PyObject* Curve2dPy::toShape(PyObject *args)
BRepAdaptor_Surface adapt(face); BRepAdaptor_Surface adapt(face);
BRepBuilderAPI_MakeEdge mkBuilder(curv, adapt.Surface().Surface()); BRepBuilderAPI_MakeEdge mkBuilder(curv, adapt.Surface().Surface());
TopoDS_Shape edge = mkBuilder.Shape(); TopoDS_Edge edge = mkBuilder.Edge();
BRepLib::BuildCurves3d(edge); edge = create3dCurve(edge);
return Py::new_reference_to(shape2pyshape(edge)); return Py::new_reference_to(shape2pyshape(edge));
} }
catch (Standard_Failure) { catch (Standard_Failure) {
@ -214,8 +281,9 @@ PyObject* Curve2dPy::toShape(PyObject *args)
BRepAdaptor_Surface adapt(face); BRepAdaptor_Surface adapt(face);
BRepBuilderAPI_MakeEdge mkBuilder(curv, adapt.Surface().Surface(), u1, u2); BRepBuilderAPI_MakeEdge mkBuilder(curv, adapt.Surface().Surface(), u1, u2);
TopoDS_Shape edge = mkBuilder.Shape(); TopoDS_Edge edge = mkBuilder.Edge();
BRepLib::BuildCurves3d(edge); edge = create3dCurve(edge);
return Py::new_reference_to(shape2pyshape(edge)); return Py::new_reference_to(shape2pyshape(edge));
} }
catch (Standard_Failure) { catch (Standard_Failure) {