From 81292f1adcc628f5b5c1018cdce0eaf3df5e8bf9 Mon Sep 17 00:00:00 2001 From: Thomas Krijnen Date: Sat, 7 Jun 2014 17:49:21 +0000 Subject: [PATCH] Detect cases where Newell's Method returns a zero-length vector and make no attempt to normalize it in order to prevent an exception. In this case the face will be flagged as invalid down the road, because its perimeter doesn't span any area. --- src/ifcgeom/IfcGeomFaces.cpp | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/ifcgeom/IfcGeomFaces.cpp b/src/ifcgeom/IfcGeomFaces.cpp index d0ffe631d3..42e3a5261d 100644 --- a/src/ifcgeom/IfcGeomFaces.cpp +++ b/src/ifcgeom/IfcGeomFaces.cpp @@ -189,9 +189,12 @@ bool IfcGeom::convert(const IfcSchema::IfcFace* l, TopoDS_Shape& face) { // as the topological face normal the face orientation is // reversed gp_Vec face_normal2(x,y,z); - if ( face_normal1.Dot(face_normal2) < 0 ) { - TopAbs_Orientation o = face.Orientation(); - face.Orientation(o == TopAbs_FORWARD ? TopAbs_REVERSED : TopAbs_FORWARD); + + if (face_normal2.Magnitude() > ALMOST_ZERO) { + if ( face_normal1.Dot(face_normal2) < 0 ) { + TopAbs_Orientation o = face.Orientation(); + face.Orientation(o == TopAbs_FORWARD ? TopAbs_REVERSED : TopAbs_FORWARD); + } } }