internal static IfcBoundedCurve convCurve(DatabaseIfc db, Curve crv, IfcCartesianPoint optStrt, bool twoD, out IfcCartesianPoint end) { double tol = db.Tolerance; end = null; Curve c = crv.DuplicateCurve(); if (c.IsLinear(tol)) { if (twoD) { end = new IfcCartesianPoint(db, new Point2d(c.PointAtEnd.X, c.PointAtEnd.Y)); } else { end = new IfcCartesianPoint(db, c.PointAtEnd); } if (optStrt == null) { if (twoD) { optStrt = new IfcCartesianPoint(db, new Point2d(c.PointAtStart.X, c.PointAtStart.Y)); } else { optStrt = new IfcCartesianPoint(db, c.PointAtStart); } } return(new IfcPolyline(optStrt, end)); } ArcCurve ac = c as ArcCurve; if (ac != null) { return(new IfcTrimmedCurve(db, ac.Arc, twoD, optStrt, out end)); } Arc arc = Arc.Unset; if (c.TryGetArc(out arc, tol)) { return(new IfcTrimmedCurve(db, arc, twoD, optStrt, out end)); } Polyline pl = new Polyline(); if (c.TryGetPolyline(out pl)) { if (db.mRelease != ReleaseVersion.IFC2x3 && db.mRelease != ReleaseVersion.IFC4) { if (twoD) { return(new IfcIndexedPolyCurve(new IfcCartesianPointList2D(db, pl.ConvertAll(x => new Point2d(x.X, x.Y))))); } else { return(new IfcIndexedPolyCurve(new IfcCartesianPointList3D(db, pl))); } } List <IfcCartesianPoint> cps = new List <IfcCartesianPoint>(); if (twoD) { Point2d p = new Point2d(pl[0].X, pl[0].Y), n; cps.Add(new IfcCartesianPoint(db, p)); for (int icounter = 1; icounter < pl.Count - 1; icounter++) { n = new Point2d(pl[icounter].X, pl[icounter].Y); if (n.DistanceTo(p) > tol) { cps.Add(new IfcCartesianPoint(db, n)); p = n; } } n = new Point2d(pl[pl.Count - 1].X, pl[pl.Count - 1].Y); if (n.DistanceTo(p) > tol) { if (pl.IsClosed) { cps.Add(cps[0]); } else { cps.Add(new IfcCartesianPoint(db, n)); } } } else { Point3d p = pl[0], n; cps.Add(new IfcCartesianPoint(db, p)); for (int icounter = 1; icounter < pl.Count; icounter++) { n = pl[icounter]; if (n.DistanceTo(p) > tol) { cps.Add(new IfcCartesianPoint(db, n)); p = n; } } } return(new IfcPolyline(cps)); } PolyCurve plc = c as PolyCurve; if (plc != null) { if (db.mRelease != ReleaseVersion.IFC2x3 && db.mRelease != ReleaseVersion.IFC4) { IfcIndexedPolyCurve ipc = IfcIndexedPolyCurve.Convert(db, plc, twoD); if (ipc != null) { return(ipc); } } return(new IfcCompositeCurve(db, plc, twoD)); } if (db.mRelease != ReleaseVersion.IFC2x3) { NurbsCurve nc = c as NurbsCurve; if (nc != null) { if (nc.IsRational) { return(new IfcRationalBSplineCurveWithKnots(db, nc, twoD)); } return(new IfcBSplineCurveWithKnots(db, nc, twoD)); } } return(null); }