diff --git a/src/Mod/Part/App/TopoShapeFacePy.xml b/src/Mod/Part/App/TopoShapeFacePy.xml index c3809f047f..cc6c1655f6 100644 --- a/src/Mod/Part/App/TopoShapeFacePy.xml +++ b/src/Mod/Part/App/TopoShapeFacePy.xml @@ -30,6 +30,11 @@ Returns Compound of Wires. Deprecated - use makeOffset2D instead. + + + Profile along the spine + + Get the list of (u,v) nodes of the tessellation diff --git a/src/Mod/Part/App/TopoShapeFacePyImp.cpp b/src/Mod/Part/App/TopoShapeFacePyImp.cpp index 63e8bead74..fba5f73879 100644 --- a/src/Mod/Part/App/TopoShapeFacePyImp.cpp +++ b/src/Mod/Part/App/TopoShapeFacePyImp.cpp @@ -70,6 +70,7 @@ # include # include #endif // _PreComp +#include #include #include @@ -99,6 +100,10 @@ using namespace Part; +namespace Part { + extern Py::Object shape2pyshape(const TopoDS_Shape &shape); +} + // returns a string which represent the object e.g. when printed in python std::string TopoShapeFacePy::representation(void) const { @@ -438,6 +443,59 @@ PyObject* TopoShapeFacePy::makeOffset(PyObject *args) return new TopoShapePy(new TopoShape(mkOffset.Shape())); } +/* +v = App.Vector +profile = Part.makePolygon([v(0.,0.,0.), v(-60.,-60.,-100.), v(-60.,-60.,-140.)]) +spine = Part.Face(Part.makePolygon([v(0.,0.,0.), v(100.,0.,0.), v(100.,100.,0.), v(0.,100.,0.), v(0.,0.,0.)])) +evolve = spine.makeEvolved(profile) +*/ +PyObject* TopoShapeFacePy::makeEvolved(PyObject *args, PyObject *kwds) +{ + PyObject* Profile; + PyObject* AxeProf = Py_True; + PyObject* Solid = Py_False; + PyObject* ProfOnSpine = Py_False; + int JoinType = int(GeomAbs_Arc); + double Tolerance = 0.0000001; + + static char* kwds_evolve[] = {"Profile", "Join", "AxeProf", "Solid", "ProfOnSpine", "Tolerance", nullptr}; + if (!PyArg_ParseTupleAndKeywords(args, kwds, "O!|iO!O!O!d", kwds_evolve, + &TopoShapeWirePy::Type, &Profile, &JoinType, + &PyBool_Type, &AxeProf, &PyBool_Type, &Solid, + &PyBool_Type, &ProfOnSpine, &Tolerance)) + return nullptr; + + const TopoDS_Face& spine = TopoDS::Face(getTopoShapePtr()->getShape()); + BRepBuilderAPI_FindPlane findPlane(spine); + if (!findPlane.Found()) { + PyErr_SetString(PartExceptionOCCError, "No planar face"); + return nullptr; + } + + const TopoDS_Wire& profile = TopoDS::Wire(static_cast(Profile)->getTopoShapePtr()->getShape()); + + GeomAbs_JoinType joinType; + switch (JoinType) { + case GeomAbs_Tangent: + joinType = GeomAbs_Tangent; + break; + case GeomAbs_Intersection: + joinType = GeomAbs_Intersection; + break; + default: + joinType = GeomAbs_Arc; + break; + } + + BRepOffsetAPI_MakeEvolved evolved(spine, profile, joinType, + PyObject_IsTrue(AxeProf) ? Standard_True : Standard_False, + PyObject_IsTrue(Solid) ? Standard_True : Standard_False, + PyObject_IsTrue(ProfOnSpine) ? Standard_True : Standard_False, + Tolerance); + TopoDS_Shape shape = evolved.Shape(); + return Py::new_reference_to(shape2pyshape(shape)); +} + PyObject* TopoShapeFacePy::valueAt(PyObject *args) { double u,v; diff --git a/src/Mod/Part/App/TopoShapeWirePy.xml b/src/Mod/Part/App/TopoShapeWirePy.xml index ab033e2064..04959c1d03 100644 --- a/src/Mod/Part/App/TopoShapeWirePy.xml +++ b/src/Mod/Part/App/TopoShapeWirePy.xml @@ -58,6 +58,11 @@ Transition can be 0 (default), 1 (right corners) or 2 (rounded corners). + + + Profile along the spine + + Approximate B-Spline-curve from this wire diff --git a/src/Mod/Part/App/TopoShapeWirePyImp.cpp b/src/Mod/Part/App/TopoShapeWirePyImp.cpp index a1f32d6d03..f00f3e2e7c 100644 --- a/src/Mod/Part/App/TopoShapeWirePyImp.cpp +++ b/src/Mod/Part/App/TopoShapeWirePyImp.cpp @@ -45,6 +45,7 @@ # include # include #endif +#include #include #include @@ -307,6 +308,59 @@ PyObject* TopoShapeWirePy::makePipeShell(PyObject *args) return 0; } +/* +v = App.Vector +profile = Part.makePolygon([v(0.,0.,0.), v(-60.,-60.,-100.), v(-60.,-60.,-140.)]) +spine = Part.makePolygon([v(0.,0.,0.), v(100.,0.,0.), v(100.,100.,0.), v(0.,100.,0.), v(0.,0.,0.)]) +evolve = spine.makeEvolved(profile) +*/ +PyObject* TopoShapeWirePy::makeEvolved(PyObject *args, PyObject *kwds) +{ + PyObject* Profile; + PyObject* AxeProf = Py_True; + PyObject* Solid = Py_False; + PyObject* ProfOnSpine = Py_False; + int JoinType = int(GeomAbs_Arc); + double Tolerance = 0.0000001; + + static char* kwds_evolve[] = {"Profile", "Join", "AxeProf", "Solid", "ProfOnSpine", "Tolerance", nullptr}; + if (!PyArg_ParseTupleAndKeywords(args, kwds, "O!|iO!O!O!d", kwds_evolve, + &TopoShapeWirePy::Type, &Profile, &JoinType, + &PyBool_Type, &AxeProf, &PyBool_Type, &Solid, + &PyBool_Type, &ProfOnSpine, &Tolerance)) + return nullptr; + + const TopoDS_Wire& spine = TopoDS::Wire(getTopoShapePtr()->getShape()); + BRepBuilderAPI_FindPlane findPlane(spine); + if (!findPlane.Found()) { + PyErr_SetString(PartExceptionOCCError, "No planar wire"); + return nullptr; + } + + const TopoDS_Wire& profile = TopoDS::Wire(static_cast(Profile)->getTopoShapePtr()->getShape()); + + GeomAbs_JoinType joinType; + switch (JoinType) { + case GeomAbs_Tangent: + joinType = GeomAbs_Tangent; + break; + case GeomAbs_Intersection: + joinType = GeomAbs_Intersection; + break; + default: + joinType = GeomAbs_Arc; + break; + } + + BRepOffsetAPI_MakeEvolved evolved(spine, profile, joinType, + PyObject_IsTrue(AxeProf) ? Standard_True : Standard_False, + PyObject_IsTrue(Solid) ? Standard_True : Standard_False, + PyObject_IsTrue(ProfOnSpine) ? Standard_True : Standard_False, + Tolerance); + TopoDS_Shape shape = evolved.Shape(); + return Py::new_reference_to(shape2pyshape(shape)); +} + PyObject* TopoShapeWirePy::makeHomogenousWires(PyObject *args) { PyObject* wire;