mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-09-26 18:21:59 +00:00
Fix a bug in the processing of an IfcTrimmedCurve with an IfcLine as a basis constructed from an IfcVector with non-unit length.
This commit is contained in:
@@ -114,6 +114,7 @@ bool IfcGeom::convert(const Ifc2x3::IfcLine::ptr l, Handle(Geom_Curve)& curve) {
|
|||||||
gp_Pnt pnt;gp_Vec vec;
|
gp_Pnt pnt;gp_Vec vec;
|
||||||
IfcGeom::convert(l->Pnt(),pnt);
|
IfcGeom::convert(l->Pnt(),pnt);
|
||||||
IfcGeom::convert(l->Dir(),vec);
|
IfcGeom::convert(l->Dir(),vec);
|
||||||
|
// See note at IfcGeomWires.cpp:237
|
||||||
curve = new Geom_Line(pnt,vec);
|
curve = new Geom_Line(pnt,vec);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -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]) ) {
|
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<Ifc2x3::IfcLine*>(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) ) {
|
if ( isConic && ALMOST_THE_SAME(fmod(flts[1]-flts[0],(double)(M_PI*2.0)),0.0f) ) {
|
||||||
w.Add(BRepBuilderAPI_MakeEdge(curve));
|
w.Add(BRepBuilderAPI_MakeEdge(curve));
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
Reference in New Issue
Block a user