internal override void SetXML(XmlElement xml, BaseClassIfc host, Dictionary <int, XmlElement> processed) { base.SetXML(xml, host, processed); xml.AppendChild(Points.GetXML(xml.OwnerDocument, "Points", this, processed)); if (mSegments.Count > 0) { XmlElement element = xml.OwnerDocument.CreateElement("Segments"); xml.AppendChild(element); foreach (IfcSegmentIndexSelect seg in Segments) { XmlElement s = xml.OwnerDocument.CreateElement(seg.GetType().Name + "-wrapper"); element.AppendChild(s); IfcArcIndex ai = seg as IfcArcIndex; if (ai != null) { s.InnerText = ai.mA + " " + ai.mB + " " + ai.mC; } else { IfcLineIndex li = seg as IfcLineIndex; s.InnerText = string.Join(" ", li.mIndices.ConvertAll(x => x.ToString())); } } } }
protected override void setJSON(JObject obj, BaseClassIfc host, SetJsonOptions options) { base.setJSON(obj, host, options); obj["Points"] = Points.getJson(this, options); if (mSegments.Count > 0) { JArray array = new JArray(); obj["Segments"] = array; foreach (IfcSegmentIndexSelect seg in Segments) { IfcArcIndex ai = seg as IfcArcIndex; JObject jobj = new JObject(); if (ai != null) { jobj["IfcArcIndex"] = ai[0] + " " + ai[1] + " " + ai[2]; } else { IfcLineIndex li = seg as IfcLineIndex; jobj["IfcLineIndex"] = string.Join(" ", li.ConvertAll(x => x.ToString())); } array.Add(jobj); } } if (mSelfIntersect != IfcLogicalEnum.UNKNOWN) { obj["SelfIntersect"] = mSelfIntersect.ToString(); } }
public static IfcBoundedCurve Generate(DatabaseIfc db, IEnumerable <Tuple <double, double> > points, List <IfcSegmentIndexSelect> segments) { if (db.Release < ReleaseVersion.IFC4) { if (segments == null || segments.Count == 0) { return(new IfcPolyline(db, points)); } List <IfcCompositeCurveSegment> segs = new List <IfcCompositeCurveSegment>(); List <IfcCartesianPoint> pts = points.ToList().ConvertAll(x => new IfcCartesianPoint(db, x.Item1, x.Item2)); foreach (IfcSegmentIndexSelect seg in segments) { IfcArcIndex arc = seg as IfcArcIndex; if (arc != null) { segs.Add(new IfcCompositeCurveSegment(IfcTransitionCode.CONTINUOUS, true, new IfcTrimmedCurve(pts[arc.mA - 1], points.ElementAt(arc.mB - 1), pts[arc.mC - 1]))); } else { IfcLineIndex line = seg as IfcLineIndex; if (line != null) { for (int icounter = 1; icounter < line.mIndices.Count; icounter++) { segs.Add(new IfcCompositeCurveSegment(IfcTransitionCode.CONTINUOUS, true, new IfcPolyline(pts[line.mIndices[icounter - 1] - 1], pts[line.mIndices[icounter] - 1]))); } } } } return(new IfcCompositeCurve(segs)); } return(new IfcIndexedPolyCurve(new IfcCartesianPointList2D(db, points), segments)); }
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 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) { }); }