Inheritance: IfcSegmentIndexSelect
Exemple #1
0
 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();
     }
 }
Exemple #3
0
 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)
            {
            });
        }