Skip to content

Commit 798397f

Browse files
committed
Do not trim conical curves if the difference between parametric values is 2pi
1 parent 60aa198 commit 798397f

1 file changed

Lines changed: 10 additions & 2 deletions

File tree

src/ifcgeom/IfcGeomWires.cpp

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -167,14 +167,22 @@ bool IfcGeom::convert(const Ifc2x3::IfcTrimmedCurve::ptr l, TopoDS_Wire& wire) {
167167
gp_Pnt pnt2;
168168
IfcGeom::convert(reinterpret_pointer_cast<IfcUtil::IfcAbstractSelect,Ifc2x3::IfcCartesianPoint>(i), pnt2 );
169169
BRepBuilderAPI_MakeEdge e (curve,pnt1,pnt2);
170+
if ( ! e.IsDone() ) {
171+
BRepBuilderAPI_EdgeError err = e.Error();
172+
return false;
173+
}
170174
w.Add(e.Edge());
171175
trimmed2 = true;
172176
break;
173177
} else if ( i->is(Ifc2x3::Type::IfcParameterValue) && !trim_cartesian && trimmed1 ) {
174178
const float value = *reinterpret_pointer_cast<IfcUtil::IfcAbstractSelect,IfcUtil::IfcArgumentSelect>(i)->wrappedValue();
175179
float flt2 = value * parameterFactor;
176-
BRepBuilderAPI_MakeEdge e (curve,sense_agreement ? flt1 : flt2,sense_agreement ? flt2 : flt1);
177-
w.Add(e.Edge());
180+
if ( isConic && ALMOST_THE_SAME(fmod(flt2-flt1,(float)(PI*2.0)),0.0f) ) {
181+
w.Add(BRepBuilderAPI_MakeEdge(curve));
182+
} else {
183+
BRepBuilderAPI_MakeEdge e (curve,sense_agreement ? flt1 : flt2,sense_agreement ? flt2 : flt1);
184+
w.Add(e.Edge());
185+
}
178186
trimmed2 = true;
179187
break;
180188
}

0 commit comments

Comments
 (0)