internal override void changeSchema(ReleaseVersion schema) { base.changeSchema(schema); if (schema == ReleaseVersion.IFC2x3) { IfcCartesianPointList cpl = Points; IfcCartesianPointList2D cpl2d = cpl as IfcCartesianPointList2D; if (cpl2d != null) { IfcBoundedCurve bc = IfcBoundedCurve.Generate(mDatabase, cpl2d.mCoordList.ToList(), Segments); int index = bc.mIndex; mDatabase[mIndex] = bc; mDatabase[index] = null; mDatabase[cpl.mIndex] = null; } else { throw new Exception("Not Implemented"); } } }
public IfcIndexedPolyCurve(IfcCartesianPointList pl, List <IfcSegmentIndexSelect> segs) : this(pl) { Segments = segs; }
public IfcIndexedPolyCurve(IfcCartesianPointList pl, IEnumerable <IfcSegmentIndexSelect> segs) : this(pl) { mSegments.AddRange(segs); }
public IfcIndexedPolyCurve(IfcCartesianPointList pl) : base(pl.mDatabase) { Points = pl; }
protected IfcCartesianPointList(IfcCartesianPointList o) : base(o) { }
internal IfcIndexedPolyCurve(IfcCartesianPointList pl, List<IfcSegmentIndexSelect> segs) : this(pl) { Segments = segs; }
internal IfcIndexedPolyCurve(IfcCartesianPointList pl) : base(pl.mDatabase) { Points = pl; }
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) { }); }
public IfcIndexedPolyCurve(IfcCartesianPointList pl, params IfcSegmentIndexSelect[] segments) : this(pl) { mSegments.AddRange(segments); }