From f849434f24e41e8a5e7d280687cfe8cae9b3208c Mon Sep 17 00:00:00 2001 From: Thomas Krijnen Date: Sun, 9 Dec 2018 11:59:49 +0100 Subject: [PATCH] More defensive IfcCurveBoundedPlane processing --- src/ifcgeom/IfcGeomShapes.cpp | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/src/ifcgeom/IfcGeomShapes.cpp b/src/ifcgeom/IfcGeomShapes.cpp index 81a8af14ca..17acda26e7 100644 --- a/src/ifcgeom/IfcGeomShapes.cpp +++ b/src/ifcgeom/IfcGeomShapes.cpp @@ -832,24 +832,32 @@ bool IfcGeom::Kernel::convert(const IfcSchema::IfcCsgSolid* l, TopoDS_Shape& sha bool IfcGeom::Kernel::convert(const IfcSchema::IfcCurveBoundedPlane* l, TopoDS_Shape& face) { gp_Pln pln; - IfcGeom::Kernel::convert(l->BasisSurface(), pln); + if (!IfcGeom::Kernel::convert(l->BasisSurface(), pln)) { + return false; + } gp_Trsf trsf; trsf.SetTransformation(pln.Position(), gp::XOY()); TopoDS_Wire outer; - convert_wire(l->OuterBoundary(), outer); + if (!convert_wire(l->OuterBoundary(), outer)) { + return false; + } - BRepBuilderAPI_MakeFace mf (outer); - mf.Add(outer); + BRepBuilderAPI_MakeFace mf(outer); + if (!mf.IsDone() || mf.Shape().IsNull()) { + Logger::Error("Invalid outer boundary:", l->OuterBoundary()->entity); + return false; + } + IfcSchema::IfcCurve::list::ptr boundaries = l->InnerBoundaries(); for (IfcSchema::IfcCurve::list::it it = boundaries->begin(); it != boundaries->end(); ++it) { TopoDS_Wire inner; - convert_wire(*it, inner); - - mf.Add(inner); + if (convert_wire(*it, inner)) { + mf.Add(inner); + } } ShapeFix_Shape sfs(mf.Face());