From 17ebefa15837c3286941a5588a7ed2f115781a72 Mon Sep 17 00:00:00 2001 From: Thomas Krijnen Date: Mon, 10 Jun 2013 15:47:41 +0000 Subject: [PATCH] Fix a bug in the processing of an IfcTrimmedCurve with an IfcLine as a basis constructed from an IfcVector with non-unit length. --- src/ifcgeom/IfcGeomCurves.cpp | 1 + src/ifcgeom/IfcGeomWires.cpp | 9 +++++++++ 2 files changed, 10 insertions(+) diff --git a/src/ifcgeom/IfcGeomCurves.cpp b/src/ifcgeom/IfcGeomCurves.cpp index 37b2297b63..e32b4b9438 100644 --- a/src/ifcgeom/IfcGeomCurves.cpp +++ b/src/ifcgeom/IfcGeomCurves.cpp @@ -114,6 +114,7 @@ bool IfcGeom::convert(const Ifc2x3::IfcLine::ptr l, Handle(Geom_Curve)& curve) { gp_Pnt pnt;gp_Vec vec; IfcGeom::convert(l->Pnt(),pnt); IfcGeom::convert(l->Dir(),vec); + // See note at IfcGeomWires.cpp:237 curve = new Geom_Line(pnt,vec); return true; } \ No newline at end of file diff --git a/src/ifcgeom/IfcGeomWires.cpp b/src/ifcgeom/IfcGeomWires.cpp index 7c9239e6d8..ceb6aa76f6 100644 --- a/src/ifcgeom/IfcGeomWires.cpp +++ b/src/ifcgeom/IfcGeomWires.cpp @@ -234,6 +234,15 @@ bool IfcGeom::convert(const Ifc2x3::IfcTrimmedCurve::ptr l, TopoDS_Wire& wire) { } } if ( (!trim_cartesian || trim_cartesian_failed) && (has_flts[0] && has_flts[1]) ) { + // The Geom_Line is constructed from a gp_Pnt and gp_Dir, whereas the IfcLine + // is defined by an IfcCartesianPoint and an IfcVector with Magnitude. Because + // the vector is normalised when passed to Geom_Line constructor the magnitude + // needs to be factored in with the IfcParameterValue here. + if ( basis_curve->is(Ifc2x3::Type::IfcLine) ) { + Ifc2x3::IfcLine* line = static_cast(basis_curve); + const double magnitude = line->Dir()->Magnitude(); + flts[0] *= magnitude; flts[1] *= magnitude; + } if ( isConic && ALMOST_THE_SAME(fmod(flts[1]-flts[0],(double)(M_PI*2.0)),0.0f) ) { w.Add(BRepBuilderAPI_MakeEdge(curve)); } else {