From bf50d0534bc297a68e5f2f285d2df7c31fe86500 Mon Sep 17 00:00:00 2001 From: Thomas Krijnen Date: Sat, 29 Dec 2018 14:34:47 +0100 Subject: [PATCH] Fixes for edge curves and non-planar faces with inner boundaries. #338 --- src/ifcgeom/IfcGeomFaces.cpp | 11 +++++++++++ src/ifcgeom/IfcGeomWires.cpp | 17 ++++++++++++++--- 2 files changed, 25 insertions(+), 3 deletions(-) diff --git a/src/ifcgeom/IfcGeomFaces.cpp b/src/ifcgeom/IfcGeomFaces.cpp index 68ac0cb1b8..9b3cbea356 100644 --- a/src/ifcgeom/IfcGeomFaces.cpp +++ b/src/ifcgeom/IfcGeomFaces.cpp @@ -320,6 +320,17 @@ bool IfcGeom::Kernel::convert(const IfcSchema::IfcFace* l, TopoDS_Shape& face) { } else { mf->Add(wire); + + // Same as above: + // In case of (non-planar) face surface, p-curves need to be computed. + if (BRep_Tool::Surface(mf->Face())->DynamicType() != STANDARD_TYPE(Geom_Plane)) { + TopExp_Explorer exp(wire, TopAbs_EDGE); + for (; exp.More(); exp.Next()) { + const TopoDS_Edge& edge = TopoDS::Edge(exp.Current()); + ShapeFix_Edge fix_edge; + fix_edge.FixAddPCurve(edge, mf->Face(), false, getValue(GV_PRECISION)); + } + } } processed ++; } diff --git a/src/ifcgeom/IfcGeomWires.cpp b/src/ifcgeom/IfcGeomWires.cpp index eb99eec617..0c66cbcac5 100644 --- a/src/ifcgeom/IfcGeomWires.cpp +++ b/src/ifcgeom/IfcGeomWires.cpp @@ -715,7 +715,11 @@ bool IfcGeom::Kernel::convert(const IfcSchema::IfcEdgeCurve* l, TopoDS_Wire& res const bool is_bounded = l->EdgeGeometry()->is(IfcSchema::Type::IfcBoundedCurve); if (!is_bounded && convert_curve(l->EdgeGeometry(), crv)) { - mw.Add(BRepBuilderAPI_MakeEdge(crv, p1, p2)); + BRepBuilderAPI_MakeEdge me(crv, p1, p2); + if (!me.IsDone()) { + return false; + } + mw.Add(me.Edge()); result = mw; return true; } else if (is_bounded && convert_wire(l->EdgeGeometry(), result)) { @@ -745,7 +749,11 @@ bool IfcGeom::Kernel::convert(const IfcSchema::IfcEdgeCurve* l, TopoDS_Wire& res ecrv->D0(u1, a); b = p2; } else { - mw.Add(BRepBuilderAPI_MakeEdge(ecrv, u1, u2)); + BRepBuilderAPI_MakeEdge me(ecrv, u1, u2); + if (!me.IsDone()) { + return false; + } + mw.Add(me.Edge()); first = false; continue; } @@ -776,7 +784,10 @@ bool IfcGeom::Kernel::convert(const IfcSchema::IfcEdgeLoop* l, TopoDS_Wire& resu mw.Add(TopoDS::Edge(TopoDS_Iterator(w).Value())); } } - result = mw; + if (!mw.IsDone()) { + return false; + } + result = mw.Wire(); return true; }