示例#1
0
        public static EditResult Cut(CadObjectDB db, CadFigure fig, int sp)
        {
            EditResult result = new EditResult();

            if (fig.Type != CadFigure.Types.POLY_LINES)
            {
                return(result);
            }

            if (fig.IsLoop)
            {
                return(result);
            }

            int pcnt = fig.PointCount;

            int headNum = sp + 1;
            int tailNum = pcnt - sp;

            CadFigure headFig = null;
            CadFigure tailFig = null;

            if (headNum <= 1 || tailNum <= 1)
            {
                return(result);
            }

            if (headNum >= 2)
            {
                headFig = db.NewFigure(CadFigure.Types.POLY_LINES);
                headFig.AddPoints(fig.PointList, 0, headNum);
            }

            if (tailNum >= 2)
            {
                tailFig = db.NewFigure(CadFigure.Types.POLY_LINES);
                tailFig.AddPoints(fig.PointList, sp, tailNum);
            }

            if (headFig != null)
            {
                result.AddList.Add(new EditResult.Item(fig.LayerID, headFig));
            }

            if (tailFig != null)
            {
                result.AddList.Add(new EditResult.Item(fig.LayerID, tailFig));
            }

            result.RemoveList.Add(new EditResult.Item(fig.LayerID, fig));

            return(result);
        }
示例#2
0
        public static EditResult CutSegment(CadObjectDB db, MarkSegment seg, Vector3d p)
        {
            EditResult result = new EditResult();

            if (seg.Figure.Type != CadFigure.Types.POLY_LINES)
            {
                return(result);
            }

            CrossInfo ci = CadMath.PerpendicularCrossSeg(seg.pA.vector, seg.pB.vector, p);

            if (!ci.IsCross)
            {
                return(result);
            }

            CadFigure org = db.GetFigure(seg.FigureID);

            int a = Math.Min(seg.PtIndexA, seg.PtIndexB);
            int b = Math.Max(seg.PtIndexA, seg.PtIndexB);


            CadFigure fa = db.NewFigure(CadFigure.Types.POLY_LINES);
            CadFigure fb = db.NewFigure(CadFigure.Types.POLY_LINES);

            fa.AddPoints(org.PointList, 0, a + 1);
            fa.AddPoint(new CadVertex(ci.CrossPoint));

            fb.AddPoint(new CadVertex(ci.CrossPoint));
            fb.AddPoints(org.PointList, b);

            if (org.IsLoop)
            {
                fb.AddPoint(fa.GetPointAt(0));
            }

            result.AddList.Add(new EditResult.Item(seg.LayerID, fa));
            result.AddList.Add(new EditResult.Item(seg.LayerID, fb));
            result.RemoveList.Add(new EditResult.Item(org.LayerID, org));

            return(result);
        }
示例#3
0
        public static EditResult Bond(CadObjectDB db, CadFigure fig)
        {
            EditResult result = new EditResult();

            if (fig.LayerID == 0)
            {
                return(result);
            }

            if (fig.IsLoop)
            {
                return(result);
            }

            CadLayer layer = db.GetLayer(fig.LayerID);

            CadVertex ps = fig.PointList[0];
            CadVertex pe = fig.PointList[fig.PointCount - 1];

            int pi  = -1;
            int bpi = -1;

            CadFigure bfig = null;

            foreach (CadFigure tfig in layer.FigureList)
            {
                if (tfig.ID == fig.ID)
                {
                    continue;
                }

                if (tfig.IsLoop)
                {
                    continue;
                }

                CadVertex tps = tfig.PointList[0];
                CadVertex tpe = tfig.PointList[tfig.PointCount - 1];

                if (tps.Equals(ps))
                {
                    bpi  = 0;
                    pi   = 0;
                    bfig = tfig;
                    break;
                }

                if (tps.Equals(pe))
                {
                    bpi  = 0;
                    pi   = fig.PointCount - 1;
                    bfig = tfig;
                    break;
                }

                if (tpe.Equals(ps))
                {
                    bpi  = tfig.PointCount - 1;
                    pi   = 0;
                    bfig = tfig;
                    break;
                }

                if (tpe.Equals(pe))
                {
                    bpi  = tfig.PointCount - 1;
                    pi   = fig.PointCount - 1;
                    bfig = tfig;
                    break;
                }
            }

            if (pi < 0)
            {
                return(result);
            }

            CadFigure newFig = db.NewFigure(CadFigure.Types.POLY_LINES);

            VertexList plist = new VertexList(fig.PointList);
            VertexList blist = new VertexList(bfig.PointList);

            if (pi == 0)
            {
                plist.Reverse();
            }

            if (bpi != 0)
            {
                blist.Reverse();
            }

            newFig.PointList.AddRange(plist);
            newFig.PointList.AddRange(blist);

            result.AddList.Add(new EditResult.Item(layer.ID, newFig));

            result.RemoveList.Add(new EditResult.Item(layer.ID, fig));
            result.RemoveList.Add(new EditResult.Item(layer.ID, bfig));

            return(result);
        }