From 61c07dbe3793908118e8f86a84ea229acfa75c63 Mon Sep 17 00:00:00 2001 From: Thomas Krijnen Date: Thu, 13 Oct 2011 13:37:38 +0000 Subject: [PATCH] - Implement correct use of IfcCompositeCurveSegment::SenseAgreement and IfcTrimmedCurve::SameSense - Reintroduce smaller tolerance value for IfcCompositeCurves --- src/ifcgeom/IfcGeomWires.cpp | 27 +++++++++++++++++++++++---- 1 file changed, 23 insertions(+), 4 deletions(-) diff --git a/src/ifcgeom/IfcGeomWires.cpp b/src/ifcgeom/IfcGeomWires.cpp index 6d908ffbf6..e447bfce2b 100644 --- a/src/ifcgeom/IfcGeomWires.cpp +++ b/src/ifcgeom/IfcGeomWires.cpp @@ -72,18 +72,36 @@ #include +#include + #include "../ifcgeom/IfcGeom.h" bool IfcGeom::convert(const Ifc2x3::IfcCompositeCurve::ptr l, TopoDS_Wire& wire) { Ifc2x3::IfcCompositeCurveSegment::list segments = l->Segments(); BRepBuilderAPI_MakeWire w; + //TopoDS_Vertex last_vertex; for( Ifc2x3::IfcCompositeCurveSegment::it it = segments->begin(); it != segments->end(); ++ it ) { const Ifc2x3::IfcCurve::ptr curve = (*it)->ParentCurve(); TopoDS_Wire wire2; - if ( ! IfcGeom::convert_wire(curve,wire2) ) continue; - //ShapeFix_ShapeTolerance FTol; - //FTol.SetTolerance(wire2, 0.01, TopAbs_WIRE); + if ( ! IfcGeom::convert_wire(curve,wire2) ) { + Ifc::LogMessage("Error","Failed to convert curve:",curve->entity); + continue; + } + if ( ! (*it)->SameSense() ) wire2.Reverse(); + ShapeFix_ShapeTolerance FTol; + FTol.SetTolerance(wire2, 0.001, TopAbs_WIRE); + /*if ( it != segments->begin() ) { + TopExp_Explorer exp (wire2,TopAbs_VERTEX); + const TopoDS_Vertex& first_vertex = TopoDS::Vertex(exp.Current()); + gp_Pnt first = BRep_Tool::Pnt(first_vertex); + gp_Pnt last = BRep_Tool::Pnt(last_vertex); + Standard_Real distance = first.Distance(last); + if ( distance > ALMOST_ZERO ) { + w.Add( BRepBuilderAPI_MakeEdge( last_vertex, first_vertex ) ); + } + }*/ w.Add(wire2); + //last_vertex = w.Vertex(); if ( w.Error() != BRepBuilderAPI_WireDone ) { Ifc::LogMessage("Error","Failed to join curve segments:",l->entity); return false; @@ -103,6 +121,7 @@ bool IfcGeom::convert(const Ifc2x3::IfcTrimmedCurve::ptr l, TopoDS_Wire& wire) { IfcUtil::IfcAbstractSelect::list trims2 = l->Trim2(); bool trimmed1 = false; bool trimmed2 = false; + bool sense_agreement = l->SenseAgreement(); float flt1; gp_Pnt pnt1; BRepBuilderAPI_MakeWire w; @@ -129,7 +148,7 @@ bool IfcGeom::convert(const Ifc2x3::IfcTrimmedCurve::ptr l, TopoDS_Wire& wire) { } 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,flt1,flt2); + BRepBuilderAPI_MakeEdge e (curve,sense_agreement ? flt1 : flt2,sense_agreement ? flt2 : flt1); w.Add(e.Edge()); trimmed2 = true; break;