Part: Fix endless-loop in TopoShapePy::proximity function

This commit is contained in:
marioalexis
2022-11-17 12:32:13 -03:00
committed by wwmayer
parent a0ad4ebebb
commit 6d74cfa383

View File

@@ -2494,54 +2494,12 @@ PyObject* TopoShapePy::proximity(PyObject *args)
BRepExtrema_ShapeProximity proximity;
proximity.LoadShape1 (s1);
proximity.LoadShape2 (s2);
if (tol > 0.0)
if (tol > 0.0) {
proximity.SetTolerance (tol);
}
proximity.Perform();
if (!proximity.IsDone()) {
// the proximity failed, maybe it's because the shapes are not yet mesh
TopLoc_Location aLoc;
TopExp_Explorer xp(s1, TopAbs_FACE);
while (xp.More()) {
const Handle(Poly_Triangulation)& aTriangulation =
BRep_Tool::Triangulation(TopoDS::Face(xp.Current()), aLoc);
if (aTriangulation.IsNull()) {
PyErr_SetString(PartExceptionOCCError, "BRepExtrema_ShapeProximity not done, call 'tessellate' beforehand");
return nullptr;
}
}
xp.Init(s2, TopAbs_FACE);
while (xp.More()) {
const Handle(Poly_Triangulation)& aTriangulation =
BRep_Tool::Triangulation(TopoDS::Face(xp.Current()), aLoc);
if (aTriangulation.IsNull()) {
PyErr_SetString(PartExceptionOCCError, "BRepExtrema_ShapeProximity not done, call 'tessellate' beforehand");
return nullptr;
}
}
// check also for free edges
xp.Init(s1, TopAbs_EDGE, TopAbs_FACE);
while (xp.More()) {
const Handle(Poly_Polygon3D)& aPoly3D =
BRep_Tool::Polygon3D(TopoDS::Edge(xp.Current()), aLoc);
if (aPoly3D.IsNull()) {
PyErr_SetString(PartExceptionOCCError, "BRepExtrema_ShapeProximity not done, call 'tessellate' beforehand");
return nullptr;
}
}
xp.Init(s2, TopAbs_EDGE, TopAbs_FACE);
while (xp.More()) {
const Handle(Poly_Polygon3D)& aPoly3D =
BRep_Tool::Polygon3D(TopoDS::Edge(xp.Current()), aLoc);
if (aPoly3D.IsNull()) {
PyErr_SetString(PartExceptionOCCError, "BRepExtrema_ShapeProximity not done, call 'tessellate' beforehand");
return nullptr;
}
}
// another problem must have occurred
PyErr_SetString(PartExceptionOCCError, "BRepExtrema_ShapeProximity not done");
return nullptr;
}