diff --git a/src/ifcgeom/IfcGeomShapes.cpp b/src/ifcgeom/IfcGeomShapes.cpp index 82c98d5a85..e5628e863b 100644 --- a/src/ifcgeom/IfcGeomShapes.cpp +++ b/src/ifcgeom/IfcGeomShapes.cpp @@ -842,24 +842,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()); + 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()); diff --git a/src/ifcgeom_schema_agnostic/Kernel.cpp b/src/ifcgeom_schema_agnostic/Kernel.cpp index ac77fdff7c..d85c9015ac 100644 --- a/src/ifcgeom_schema_agnostic/Kernel.cpp +++ b/src/ifcgeom_schema_agnostic/Kernel.cpp @@ -177,14 +177,24 @@ std::map IfcGeom::Kernel::get_layers(IfcUt } bool IfcGeom::Kernel::is_manifold(const TopoDS_Shape& a) { - TopTools_IndexedDataMapOfShapeListOfShape map; - TopExp::MapShapesAndAncestors(a, TopAbs_EDGE, TopAbs_FACE, map); - - for (int i = 1; i <= map.Extent(); ++i) { - if (map.FindFromIndex(i).Extent() != 2) { - return false; + if (a.ShapeType() == TopAbs_COMPOUND) { + TopoDS_Iterator it(a); + for (; it.More(); it.Next()) { + if (!is_manifold(it.Value())) { + return false; + } } - } + return true; + } else { + TopTools_IndexedDataMapOfShapeListOfShape map; + TopExp::MapShapesAndAncestors(a, TopAbs_EDGE, TopAbs_FACE, map); - return true; + for (int i = 1; i <= map.Extent(); ++i) { + if (map.FindFromIndex(i).Extent() != 2) { + return false; + } + } + + return true; + } } \ No newline at end of file