internal static IfcIndexedPolyCurve Convert(DatabaseIfc db, PolyCurve polycurve, bool twoD) { double tol = db.Tolerance; Curve[] segments = polycurve.Explode(); PolyCurve pc = new PolyCurve(); foreach (Curve s in segments) { if (s.IsLinear(tol)) pc.Append(new Line(s.PointAtStart, s.PointAtEnd)); else { Arc a = Arc.Unset; if (s.TryGetArc(out a, tol)) pc.Append(a); else return null; } } List<IfcSegmentIndexSelect> segs = new List<IfcSegmentIndexSelect>(); IfcCartesianPointList cpl = null; bool closed = pc.PointAtStart.DistanceTo(pc.PointAtEnd) < tol; if (twoD) { Point2d pt = new Point2d(pc.PointAtStart.X, pc.PointAtStart.Y); int pcounter = 1; List<Point2d> pts = new List<Point2d>(); pts.Add(pt); IfcLineIndex li = null; for (int icounter = 0; icounter < pc.SegmentCount; icounter++) { Curve c = pc.SegmentCurve(icounter); if (c.IsLinear(tol) && c.PointAtStart.DistanceTo(c.PointAtEnd) < tol) continue; if (c.IsLinear(tol)) { if (closed && icounter + 1 == segments.Length) { if (li != null) li.mIndices.Add(1); else li = new IfcLineIndex(pcounter, 1); } else { pts.Add(new Point2d(c.PointAtEnd.X, c.PointAtEnd.Y)); if (li != null) li.mIndices.Add(++pcounter); else li = new IfcLineIndex(pcounter++, pcounter); } } else { if (li != null) { segs.Add(li); li = null; } Point3d tp = c.PointAt(c.Domain.Mid); pts.Add(new Point2d(tp.X, tp.Y)); if (closed && icounter + 1 == segments.Length) segs.Add(new IfcArcIndex(pcounter++, pcounter++, 1)); else { pts.Add(new Point2d(c.PointAtEnd.X, c.PointAtEnd.Y)); segs.Add(new IfcArcIndex(pcounter++, pcounter++, pcounter)); } } } if (li != null) segs.Add(li); cpl = new IfcCartesianPointList2D(db, pts.ToArray()); } else { Point3d pt = pc.PointAtStart; int pcounter = 1; List<Point3d> pts = new List<Point3d>(); pts.Add(pt); List<IfcSegmentIndexSelect> sis = new List<IfcSegmentIndexSelect>(segments.Length); IfcLineIndex li = null; for (int icounter = 0; icounter < pc.SegmentCount; icounter++) { Curve c = pc.SegmentCurve(icounter); if (c.IsLinear(tol) && c.PointAtStart.DistanceTo(c.PointAtEnd) < tol) continue; if (c.IsLinear(tol)) { if (closed && icounter + 1 == segments.Length) { if (li != null) li.mIndices.Add(0); else li = new IfcLineIndex(pcounter, 0); } else { pts.Add(c.PointAtEnd); if (li != null) li.mIndices.Add(++pcounter); else li = new IfcLineIndex(pcounter++, pcounter); } } else { if (li != null) { segs.Add(li); li = null; } pts.Add(c.PointAt(c.Domain.Mid)); if (closed && icounter + 1 == segments.Length) segs.Add(new IfcArcIndex(pcounter++, pcounter, 0)); else { pts.Add(c.PointAtEnd); segs.Add(new IfcArcIndex(pcounter++, pcounter++, pcounter)); } } } if (li != null) segs.Add(li); cpl = new IfcCartesianPointList3D(db, pts.ToArray()); } return new IfcIndexedPolyCurve(cpl, segs) { }; }
internal IfcCompositeCurve(DatabaseIfc db, PolyCurve plc, bool twoD) : base(db) { mSegments = new List<int>(plc.SegmentCount); IfcCartesianPoint curr = null; for (int icounter = 0; icounter < plc.SegmentCount; icounter++) mSegments.Add(new IfcCompositeCurveSegment(db, plc.SegmentCurve(icounter), true, IfcTransitionCode.CONTINUOUS, twoD, curr, out curr).mIndex); }