Part: fix crash with null face
This commit is contained in:
committed by
wwmayer
parent
74a31d1473
commit
afe8e70b86
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user