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;