상속: IfcGeometricRepresentationItem
예제 #1
0
 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");
         }
     }
 }
예제 #2
0
 public IfcIndexedPolyCurve(IfcCartesianPointList pl, List <IfcSegmentIndexSelect> segs) : this(pl) { Segments = segs; }
예제 #3
0
 public IfcIndexedPolyCurve(IfcCartesianPointList pl, IEnumerable <IfcSegmentIndexSelect> segs) : this(pl) { mSegments.AddRange(segs); }
예제 #4
0
 public IfcIndexedPolyCurve(IfcCartesianPointList pl) : base(pl.mDatabase)
 {
     Points = pl;
 }
예제 #5
0
파일: IFC C.cs 프로젝트: jenca-cloud/ggIFC
		protected IfcCartesianPointList(IfcCartesianPointList o) : base(o) { }
예제 #6
0
파일: IFC I.cs 프로젝트: jenca-cloud/ggIFC
		internal IfcIndexedPolyCurve(IfcCartesianPointList pl, List<IfcSegmentIndexSelect> segs) : this(pl) { Segments = segs; }
예제 #7
0
파일: IFC I.cs 프로젝트: jenca-cloud/ggIFC
		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)
            {
            });
        }
예제 #9
0
 public IfcIndexedPolyCurve(IfcCartesianPointList pl, params IfcSegmentIndexSelect[] segments) : this(pl)
 {
     mSegments.AddRange(segments);
 }