From 798397fa21867219d5b904fe0a4b2c9728f86fa8 Mon Sep 17 00:00:00 2001 From: Thomas Krijnen Date: Mon, 2 Jan 2012 14:56:11 +0000 Subject: [PATCH] Do not trim conical curves if the difference between parametric values is 2pi --- src/ifcgeom/IfcGeomWires.cpp | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/ifcgeom/IfcGeomWires.cpp b/src/ifcgeom/IfcGeomWires.cpp index 01f1a00497..4c7eb231c9 100644 --- a/src/ifcgeom/IfcGeomWires.cpp +++ b/src/ifcgeom/IfcGeomWires.cpp @@ -167,14 +167,22 @@ bool IfcGeom::convert(const Ifc2x3::IfcTrimmedCurve::ptr l, TopoDS_Wire& wire) { gp_Pnt pnt2; IfcGeom::convert(reinterpret_pointer_cast(i), pnt2 ); BRepBuilderAPI_MakeEdge e (curve,pnt1,pnt2); + if ( ! e.IsDone() ) { + BRepBuilderAPI_EdgeError err = e.Error(); + return false; + } w.Add(e.Edge()); trimmed2 = true; break; } else if ( i->is(Ifc2x3::Type::IfcParameterValue) && !trim_cartesian && trimmed1 ) { const float value = *reinterpret_pointer_cast(i)->wrappedValue(); float flt2 = value * parameterFactor; - BRepBuilderAPI_MakeEdge e (curve,sense_agreement ? flt1 : flt2,sense_agreement ? flt2 : flt1); - w.Add(e.Edge()); + if ( isConic && ALMOST_THE_SAME(fmod(flt2-flt1,(float)(PI*2.0)),0.0f) ) { + w.Add(BRepBuilderAPI_MakeEdge(curve)); + } else { + BRepBuilderAPI_MakeEdge e (curve,sense_agreement ? flt1 : flt2,sense_agreement ? flt2 : flt1); + w.Add(e.Edge()); + } trimmed2 = true; break; }