From afe8e70b86493fec9b6782c89883436a2c12e9b9 Mon Sep 17 00:00:00 2001 From: Florian Foinant-Willig Date: Tue, 3 Oct 2023 21:40:49 +0200 Subject: [PATCH] Part: fix crash with null face --- src/Mod/Part/App/TopoShapeFacePyImp.cpp | 33 ++++++++++++++++--------- 1 file changed, 21 insertions(+), 12 deletions(-) diff --git a/src/Mod/Part/App/TopoShapeFacePyImp.cpp b/src/Mod/Part/App/TopoShapeFacePyImp.cpp index 378d919fe7..bf130e41cc 100644 --- a/src/Mod/Part/App/TopoShapeFacePyImp.cpp +++ b/src/Mod/Part/App/TopoShapeFacePyImp.cpp @@ -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();