Part: fix crash with null face

This commit is contained in:
Florian Foinant-Willig
2023-10-03 21:40:49 +02:00
committed by wwmayer
parent 74a31d1473
commit afe8e70b86

View File

@@ -97,6 +97,15 @@ namespace Part {
extern Py::Object shape2pyshape(const TopoDS_Shape &shape);
}
namespace{
const TopoDS_Face& getTopoDSFace(const TopoShapeFacePy* theFace){
const TopoDS_Face& f = TopoDS::Face(theFace->getTopoShapePtr()->getShape());
if (f.IsNull())
throw Py::ValueError("Face is null");
return f;
}
}
// returns a string which represent the object e.g. when printed in python
std::string TopoShapeFacePy::representation() const
{
@@ -414,7 +423,7 @@ PyObject* TopoShapeFacePy::makeOffset(PyObject *args)
double dist;
if (!PyArg_ParseTuple(args, "d",&dist))
return nullptr;
const TopoDS_Face& f = TopoDS::Face(getTopoShapePtr()->getShape());
auto f = getTopoDSFace(this);
BRepBuilderAPI_FindPlane findPlane(f);
if (!findPlane.Found()) {
PyErr_SetString(PartExceptionOCCError, "No planar face");
@@ -495,7 +504,7 @@ PyObject* TopoShapeFacePy::valueAt(PyObject *args)
if (!PyArg_ParseTuple(args, "dd",&u,&v))
return nullptr;
const TopoDS_Face& f = TopoDS::Face(getTopoShapePtr()->getShape());
auto f = getTopoDSFace(this);
BRepAdaptor_Surface adapt(f);
BRepLProp_SLProps prop(adapt,u,v,0,Precision::Confusion());
@@ -509,7 +518,7 @@ PyObject* TopoShapeFacePy::normalAt(PyObject *args)
if (!PyArg_ParseTuple(args, "dd",&u,&v))
return nullptr;
const TopoDS_Face& f = TopoDS::Face(getTopoShapePtr()->getShape());
auto f = getTopoDSFace(this);
Standard_Boolean done;
gp_Dir dir;
@@ -528,7 +537,7 @@ PyObject* TopoShapeFacePy::getUVNodes(PyObject *args)
if (!PyArg_ParseTuple(args, ""))
return nullptr;
const TopoDS_Face& f = TopoDS::Face(getTopoShapePtr()->getShape());
auto f = getTopoDSFace(this);
TopLoc_Location aLoc;
Handle (Poly_Triangulation) mesh = BRep_Tool::Triangulation(f,aLoc);
if (mesh.IsNull()) {
@@ -571,7 +580,7 @@ PyObject* TopoShapeFacePy::tangentAt(PyObject *args)
gp_Dir dir;
Py::Tuple tuple(2);
const TopoDS_Face& f = TopoDS::Face(getTopoShapePtr()->getShape());
auto f = getTopoDSFace(this);
BRepAdaptor_Surface adapt(f);
BRepLProp_SLProps prop(adapt,u,v,2,Precision::Confusion());
@@ -602,7 +611,7 @@ PyObject* TopoShapeFacePy::curvatureAt(PyObject *args)
return nullptr;
Py::Tuple tuple(2);
const TopoDS_Face& f = TopoDS::Face(getTopoShapePtr()->getShape());
auto f = getTopoDSFace(this);
BRepAdaptor_Surface adapt(f);
BRepLProp_SLProps prop(adapt,u,v,2,Precision::Confusion());
@@ -625,7 +634,7 @@ PyObject* TopoShapeFacePy::derivative1At(PyObject *args)
return nullptr;
Py::Tuple tuple(2);
const TopoDS_Face& f = TopoDS::Face(getTopoShapePtr()->getShape());
auto f = getTopoDSFace(this);
BRepAdaptor_Surface adapt(f);
try {
@@ -649,7 +658,7 @@ PyObject* TopoShapeFacePy::derivative2At(PyObject *args)
return nullptr;
Py::Tuple tuple(2);
const TopoDS_Face& f = TopoDS::Face(getTopoShapePtr()->getShape());
auto f = getTopoDSFace(this);
BRepAdaptor_Surface adapt(f);
try {
@@ -849,7 +858,7 @@ PyObject* TopoShapeFacePy::cutHoles(PyObject *args)
}
if (!wires.empty()) {
const TopoDS_Face& f = TopoDS::Face(getTopoShapePtr()->getShape());
auto f = getTopoDSFace(this);
BRepBuilderAPI_MakeFace mkFace(f);
for (const auto & wire : wires)
mkFace.Add(wire);
@@ -1021,20 +1030,20 @@ Py::Object TopoShapeFacePy::getSurface() const
Py::Float TopoShapeFacePy::getTolerance() const
{
const TopoDS_Face& f = TopoDS::Face(getTopoShapePtr()->getShape());
auto f = getTopoDSFace(this);
return Py::Float(BRep_Tool::Tolerance(f));
}
void TopoShapeFacePy::setTolerance(Py::Float tol)
{
BRep_Builder aBuilder;
const TopoDS_Face& f = TopoDS::Face(getTopoShapePtr()->getShape());
auto f = getTopoDSFace(this);
aBuilder.UpdateFace(f, (double)tol);
}
Py::Tuple TopoShapeFacePy::getParameterRange() const
{
const TopoDS_Face& f = TopoDS::Face(getTopoShapePtr()->getShape());
auto f = getTopoDSFace(this);
BRepAdaptor_Surface adapt(f);
double u1 = adapt.FirstUParameter();
double u2 = adapt.LastUParameter();