Part: implement Part.Wire.makeEvolved and Part.Face.makeEvolved

This commit is contained in:
wmayer
2021-11-30 18:17:29 +01:00
parent 3cddf78b5e
commit 5018af974c
4 changed files with 122 additions and 0 deletions

View File

@@ -30,6 +30,11 @@ Returns Compound of Wires. Deprecated - use makeOffset2D instead.
</UserDocu>
</Documentation>
</Methode>
<Methode Name="makeEvolved" Const="true" Keyword="true">
<Documentation>
<UserDocu>Profile along the spine</UserDocu>
</Documentation>
</Methode>
<Methode Name="getUVNodes" Const="true">
<Documentation>
<UserDocu>Get the list of (u,v) nodes of the tessellation

View File

@@ -70,6 +70,7 @@
# include <GeomLProp_SLProps.hxx>
# include <BRep_Tool.hxx>
#endif // _PreComp
#include <BRepOffsetAPI_MakeEvolved.hxx>
#include <Base/VectorPy.h>
#include <Base/GeometryPyCXX.h>
@@ -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<TopoShapeWirePy*>(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;

View File

@@ -58,6 +58,11 @@ Transition can be 0 (default), 1 (right corners) or 2 (rounded corners).
</UserDocu>
</Documentation>
</Methode>
<Methode Name="makeEvolved" Const="true" Keyword="true">
<Documentation>
<UserDocu>Profile along the spine</UserDocu>
</Documentation>
</Methode>
<Methode Name="approximate" Const="true" Keyword="true">
<Documentation>
<UserDocu>Approximate B-Spline-curve from this wire

View File

@@ -45,6 +45,7 @@
# include <GCPnts_QuasiUniformAbscissa.hxx>
# include <GCPnts_QuasiUniformDeflection.hxx>
#endif
#include <BRepOffsetAPI_MakeEvolved.hxx>
#include <Base/VectorPy.h>
#include <Base/GeometryPyCXX.h>
@@ -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<TopoShapeWirePy*>(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;