private float GetPercentInArcByPoint(IDrawObject drawObject, UnitPoint unitPoint)
        {
            ArcBase arcBase = (ArcBase)drawObject;
            double  angle   = HitUtil.LineAngleR(arcBase.Center, unitPoint, 0);

            return((float)(angle / (Math.PI * 2)));
        }
Ejemplo n.º 2
0
 public void Finish()
 {
     this.clonePoints[0]       = this.clone.startPoint;
     this.clonePoints[1]       = this.clone.midPoint;
     this.clonePoints[2]       = this.clone.endPoint;
     this.clone.IsCompleteDraw = true;
     this.owner.Copy(this.clone);
     this.owner.Update();
     this.owner.IsSelected = true;
     this.clone.IsEditMode = false;
     this.clone            = null;
 }
Ejemplo n.º 3
0
 public NodeArcPoint(ArcBase owner, ArcNodeType arcNodeType)
 {
     this.owner                = owner;
     this.clone                = this.owner.Clone() as ArcBase;
     this.owner.IsSelected     = false;
     this.clone.IsSelected     = true;
     this.clone.IsCompleteDraw = false;
     this.clone.IsEditMode     = true;
     this.ownerPoints[0]       = this.owner.startPoint;
     this.ownerPoints[1]       = this.owner.midPoint;
     this.ownerPoints[2]       = this.owner.endPoint;
     this.arcNodeType          = arcNodeType;
 }
Ejemplo n.º 4
0
        private void GetArcLeadLineParams(IDrawObject drawObject, LineInOutParamsModel leadInOutParamsModel)
        {
            ArcBase arcBase = (ArcBase)drawObject;
            double  angle   = HitUtil.LineAngleR(arcBase.Center, this.p2, 0);

            leadInOutParamsModel.FigureTotalLength = (float)(angle / (Math.PI * 2));//TODO:验证
            this.p2 = HitUtil.PointOnCircle(arcBase.Center, arcBase.Radius, angle);
            bool isInner;

            leadInOutParamsModel.LineInAngle  = DrawingOperationHelper.GetLeadLineAngleArc(this.p1, this.p2, arcBase.Center, arcBase.IsClockwise, out isInner);
            leadInOutParamsModel.LineInLength = (float)HitUtil.Distance(this.p1, this.p2);
            arcBase.IsInnerCut = isInner;
        }
Ejemplo n.º 5
0
        private static List <BridgePoints> GetBridgeByArc(ArcBase arc, UnitPoint p1, UnitPoint p2, BridgingModel param)
        {
            List <BridgePoints> retPoints = new List <BridgePoints>();
            var          line             = DrawingOperationHelper.GetLineEquation(p1, p2);
            double       width            = param.Width / 2;
            ArcModelMini arcMini          = new DrawModel.ArcModelMini()
            {
                Center     = arc.Center,
                Radius     = arc.Radius,
                StartAngle = arc.StartAngle,
                EndAngle   = arc.EndAngle,
                SweepAngle = arc.AngleSweep,
                Clockwise  = arc.IsClockwise
            };

            List <UnitPoint> points = DrawingOperationHelper.GetIntersectPointByLineAndCircle(line.Item1, line.Item2, line.Item3, arc.Center, arc.Radius);
            var hasPoints           = points?.Where(p => !p.IsEmpty && (HitUtil.IsPointOnArc(p, 0.000001f, arcMini) && HitUtil.IsPointInLine(p1, p2, p, 0.000001f))).ToList();

            if (hasPoints != null && hasPoints.Count > 0)
            {
                //根据宽度求点
                double angle = width / arc.Radius * (arc.IsClockwise ? 1 : -1);
                hasPoints?.ForEach(p =>
                {
                    double lineAngle    = HitUtil.LineAngleR(arcMini.Center, p, 0);
                    double angle1       = lineAngle + angle;
                    double angle2       = lineAngle - angle;
                    UnitPoint retPoint1 = UnitPoint.Empty;
                    UnitPoint retPoint2 = UnitPoint.Empty;
                    if (HitUtil.IsPointInArc(HitUtil.RadiansToDegrees(angle1), arcMini.StartAngle, arcMini.EndAngle, arcMini.Clockwise))
                    {
                        //第一个位置点
                        retPoint1 = HitUtil.PointOnCircle(arcMini.Center, arcMini.Radius, angle1);
                    }
                    if (HitUtil.IsPointInArc(HitUtil.RadiansToDegrees(angle2), arcMini.StartAngle, arcMini.EndAngle, arcMini.Clockwise))
                    {
                        //第二个位置点
                        retPoint2 = HitUtil.PointOnCircle(arcMini.Center, arcMini.Radius, angle2);
                    }
                    BridgePoints bridges = new BridgePoints(arc,
                                                            new UnitPointBulge(retPoint1),
                                                            new UnitPointBulge(retPoint2),
                                                            HitUtil.Distance(p1, p));
                    retPoints.Add(bridges);
                });
            }
            return(retPoints);
        }
Ejemplo n.º 6
0
        public static void SetArcOverCut(ArcBase arc)
        {
            float pos = arc.LeadOut.Pos;

            if (Math.Abs(arc.LeadOut.Pos) < 0.000001)//封口
            {
            }
            else if (pos < 0)//缺口,从圆弧尾部去掉pos长的距离
            {
                arc.AngleSweep -= (float)(Math.Abs(pos) / arc.SizeLength) * arc.AngleSweep;
                arc.Update();
            }
            else//过切/多圈
            {
            }
        }
Ejemplo n.º 7
0
        public static bool IsArcIntersectWithRect(ArcBase arcBase, RectangleF rectangle, float thWidth)
        {
            bool      result = false;
            UnitPoint p1     = new UnitPoint(rectangle.Left, rectangle.Top);
            UnitPoint p2     = new UnitPoint(rectangle.Left, rectangle.Bottom);

            if (HitUtil.CircleIntersectWithLine(arcBase.Center, arcBase.Radius, p1, p2))
            {
                result = HitUtil.IsLineOnArc(p1, p2, arcBase.Center, arcBase.Radius, arcBase.StartAngle, arcBase.AngleSweep, arcBase.IsClockwise, thWidth);
                if (result)
                {
                    return(result);
                }
            }
            p1 = new UnitPoint(rectangle.Left, rectangle.Bottom);
            p2 = new UnitPoint(rectangle.Right, rectangle.Bottom);
            if (HitUtil.CircleIntersectWithLine(arcBase.Center, arcBase.Radius, p1, p2))
            {
                result = HitUtil.IsLineOnArc(p1, p2, arcBase.Center, arcBase.Radius, arcBase.StartAngle, arcBase.AngleSweep, arcBase.IsClockwise, thWidth);
                if (result)
                {
                    return(result);
                }
            }
            p1 = new UnitPoint(rectangle.Left, rectangle.Top);
            p2 = new UnitPoint(rectangle.Right, rectangle.Top);
            if (HitUtil.CircleIntersectWithLine(arcBase.Center, arcBase.Radius, p1, p2))
            {
                result = HitUtil.IsLineOnArc(p1, p2, arcBase.Center, arcBase.Radius, arcBase.StartAngle, arcBase.AngleSweep, arcBase.IsClockwise, thWidth);
                if (result)
                {
                    return(result);
                }
            }
            p1 = new UnitPoint(rectangle.Right, rectangle.Top);
            p2 = new UnitPoint(rectangle.Right, rectangle.Bottom);
            if (HitUtil.CircleIntersectWithLine(arcBase.Center, arcBase.Radius, p1, p2))
            {
                result = HitUtil.IsLineOnArc(p1, p2, arcBase.Center, arcBase.Radius, arcBase.StartAngle, arcBase.AngleSweep, arcBase.IsClockwise, thWidth);
                if (result)
                {
                    return(result);
                }
            }
            return(result);
        }
Ejemplo n.º 8
0
        private static List <IDrawObject> ConvertToMultiSegLine(ArcBase arc, List <BridgePoints> bridges)
        {
            List <IDrawObject> retObjects = new List <IDrawObject>();

            if (bridges.Count == 2)
            {
                double angle1 = HitUtil.LineAngleR(arc.Center, bridges[0].Point1.Point, 0);
                double angle2 = HitUtil.LineAngleR(arc.Center, bridges[1].Point1.Point, 0);
                angle1 = HitUtil.CalAngleSweep(arc.StartAngle, HitUtil.RadiansToDegrees(angle1), arc.IsClockwise);
                angle2 = HitUtil.CalAngleSweep(arc.StartAngle, HitUtil.RadiansToDegrees(angle2), arc.IsClockwise);
                if (angle1 > angle2)
                {
                    bridges.Reverse();
                }

                double bulge1 = BulgeHelper.GetBulgeFromTwoPointsAndCenter(arc.Center, arc.startPoint, bridges[0].Point1.Point, arc.IsClockwise);
                retObjects.Add(new MultiSegmentLineBase()
                {
                    IsCloseFigure = false,
                    LayerId       = arc.LayerId,
                    GroupParam    = CopyUtil.DeepCopy(arc.GroupParam),
                    Points        = new List <UnitPointBulge>()
                    {
                        new UnitPointBulge(arc.startPoint, bulge1), bridges[0].Point1
                    }
                });

                bridges[0].Point2.Bulge = BulgeHelper.GetBulgeFromTwoPointsAndCenter(arc.Center, bridges[0].Point2.Point, bridges[1].Point1.Point, arc.IsClockwise);;
                retObjects.Add(new MultiSegmentLineBase()
                {
                    IsCloseFigure = false,
                    LayerId       = arc.LayerId,
                    GroupParam    = CopyUtil.DeepCopy(arc.GroupParam),
                    Points        = new List <UnitPointBulge>()
                    {
                        bridges[0].Point2, bridges[1].Point1
                    }
                });

                bridges[1].Point2.Bulge = BulgeHelper.GetBulgeFromTwoPointsAndCenter(arc.Center, bridges[1].Point2.Point, arc.endPoint, arc.IsClockwise);;
                retObjects.Add(new MultiSegmentLineBase()
                {
                    IsCloseFigure = false,
                    LayerId       = arc.LayerId,
                    GroupParam    = CopyUtil.DeepCopy(arc.GroupParam),
                    Points        = new List <UnitPointBulge>()
                    {
                        bridges[1].Point2, new UnitPointBulge(arc.endPoint, bridges[1].Point2.Bulge)
                    }
                });
            }
            else if (bridges.Count == 1)
            {
                double bulge1 = BulgeHelper.GetBulgeFromTwoPointsAndCenter(arc.Center, arc.startPoint, bridges[0].Point1.Point, arc.IsClockwise);
                retObjects.Add(new MultiSegmentLineBase()
                {
                    IsCloseFigure = false,
                    LayerId       = arc.LayerId,
                    GroupParam    = CopyUtil.DeepCopy(arc.GroupParam),
                    Points        = new List <UnitPointBulge>()
                    {
                        new UnitPointBulge(arc.startPoint, bulge1), bridges[0].Point1
                    }
                });

                bridges[0].Point2.Bulge = BulgeHelper.GetBulgeFromTwoPointsAndCenter(arc.Center, bridges[0].Point2.Point, arc.endPoint, arc.IsClockwise);;
                retObjects.Add(new MultiSegmentLineBase()
                {
                    IsCloseFigure = false,
                    LayerId       = arc.LayerId,
                    GroupParam    = CopyUtil.DeepCopy(arc.GroupParam),
                    Points        = new List <UnitPointBulge>()
                    {
                        bridges[0].Point2, new UnitPointBulge(arc.endPoint, bridges[0].Point2.Bulge)
                    }
                });
            }
            return(retObjects);
        }
Ejemplo n.º 9
0
        public static List <IDrawObject> GetBridgeObjects(List <IDrawObject> drawObjects, UnitPoint p1, UnitPoint p2, BridgingModel param, out bool isChanged)
        {
            isChanged = false;//桥接是否改变了图形
            List <BridgePoints> bridgePoints = new List <BridgePoints>();

            #region 计算桥接点在图形中的点的坐标
            drawObjects?.ForEach(drawObject =>
            {
                if ((drawObject.FigureType == FigureTypes.Circle))
                {
                    Circle circle = drawObject as Circle;
                    var bridges   = BridgeHelper.GetBridgeByCircle(circle, p1, p2, param);
                    bridgePoints.AddRange(bridges);
                }
                else if (drawObject.FigureType == FigureTypes.Arc)
                {
                    ArcBase arc = drawObject as ArcBase;
                    var bridges = BridgeHelper.GetBridgeByArc(arc, p1, p2, param);
                    bridgePoints.AddRange(bridges);
                }
                else if (drawObject.FigureType == FigureTypes.LwPolyline)
                {
                    MultiSegmentLineBase multiSegLine = drawObject as MultiSegmentLineBase;
                    var bridges = BridgeHelper.GetBridgeByMultiSegLine(multiSegLine, p1, p2, param);
                    bridgePoints.AddRange(bridges);
                }
            });
            #endregion

            #region 根据桥接点坐标,按直线的起点距离排序,如果奇数个将移除最后一个,保证偶数个可以连接
            bridgePoints.Sort((x, y) => { if (x.Distance > y.Distance)
                                          {
                                              return(1);
                                          }
                                          return(-1); });
            if (bridgePoints.Count % 2 == 1)
            {
                bridgePoints.RemoveAt(bridgePoints.Count - 1);
            }
            #endregion

            #region 移除间距大于最大条件的点
            List <BridgePoints> removes = new List <BridgePoints>();
            for (int i = 0; i < bridgePoints.Count - 1; i += 2)
            {
                var bridge1 = bridgePoints[i];
                var bridge2 = bridgePoints[i + 1];
                if (Math.Abs(bridge1.Distance - bridge2.Distance) > param.MaxDistance)
                {
                    removes.Add(bridge1);
                    removes.Add(bridge2);
                }
            }
            removes.ForEach(e => bridgePoints.Remove(e));
            #endregion

            if (bridgePoints.Count > 0)
            {
                List <IDrawObject> temps    = new List <IDrawObject>(); //计算后的图形
                List <IDrawObject> oldDraws = new List <IDrawObject>(); //不用计算的原图

                #region 根据桥接点的位置把原图形拆为多段线
                foreach (IDrawObject drawObject in drawObjects)
                {
                    var points = bridgePoints.FindAll(b => b.Owner == drawObject);
                    if (points.Count > 0)
                    {
                        List <IDrawObject> draws = null;
                        if (drawObject.FigureType == FigureTypes.Circle)
                        {
                            draws = BridgeHelper.ConvertToMultiSegLine(drawObject as Circle, points);
                        }
                        else if (drawObject.FigureType == FigureTypes.Arc)
                        {
                            draws = BridgeHelper.ConvertToMultiSegLine(drawObject as ArcBase, points);
                        }
                        else if (drawObject.FigureType == FigureTypes.LwPolyline)
                        {
                            draws = BridgeHelper.ConvertToMultiSegLine(drawObject as MultiSegmentLineBase, points);
                        }
                        if (draws != null)
                        {
                            draws.RemoveAll(p => (p as MultiSegmentLineBase).Points.Count < 2);
                            temps.AddRange(draws);
                        }
                    }
                    else
                    {
                        oldDraws.Add(drawObject);
                    }
                }
                #endregion

                #region 连接最新的桥接图形
                for (int i = 0; i < bridgePoints.Count - 1; i += 2)
                {
                    var                  bridge1    = bridgePoints[i];
                    var                  bridge2    = bridgePoints[i + 1];
                    bool                 clockwise1 = HitUtil.IsClockwiseByCross(p1, p2, bridge1.Point1.Point);
                    bool                 clockwise2 = HitUtil.IsClockwiseByCross(p1, p2, bridge2.Point1.Point);
                    UnitPointBulge       point11    = !clockwise1 ? bridge1.Point1 : bridge1.Point2;
                    UnitPointBulge       point12    = clockwise1 ? bridge1.Point1 : bridge1.Point2;
                    UnitPointBulge       point21    = !clockwise2 ? bridge2.Point1 : bridge2.Point2;
                    UnitPointBulge       point22    = clockwise2 ? bridge2.Point1 : bridge2.Point2;
                    MultiSegmentLineBase draw11     = temps.Find(d => (d as MultiSegmentLineBase).Points.Contains(point11)) as MultiSegmentLineBase;
                    MultiSegmentLineBase draw12     = temps.Find(d => (d as MultiSegmentLineBase).Points.Contains(point12)) as MultiSegmentLineBase;
                    MultiSegmentLineBase draw21     = temps.Find(d => (d as MultiSegmentLineBase).Points.Contains(point21)) as MultiSegmentLineBase;
                    MultiSegmentLineBase draw22     = temps.Find(d => (d as MultiSegmentLineBase).Points.Contains(point22)) as MultiSegmentLineBase;
                    if (draw11 == null)
                    {
                        draw11 = new MultiSegmentLineBase()
                        {
                            LayerId = (bridge1.Owner as DrawObjectBase).LayerId, GroupParam = CopyUtil.DeepCopy(bridge1.Owner.GroupParam), Points = new List <UnitPointBulge>()
                        };
                    }
                    if (draw12 == null)
                    {
                        draw12 = new MultiSegmentLineBase()
                        {
                            LayerId = (bridge1.Owner as DrawObjectBase).LayerId, GroupParam = CopyUtil.DeepCopy(bridge1.Owner.GroupParam), Points = new List <UnitPointBulge>()
                        };
                    }
                    if (draw21 == null)
                    {
                        draw21 = new MultiSegmentLineBase()
                        {
                            LayerId = (bridge2.Owner as DrawObjectBase).LayerId, GroupParam = CopyUtil.DeepCopy(bridge2.Owner.GroupParam), Points = new List <UnitPointBulge>()
                        };
                    }
                    if (draw22 == null)
                    {
                        draw22 = new MultiSegmentLineBase()
                        {
                            LayerId = (bridge2.Owner as DrawObjectBase).LayerId, GroupParam = CopyUtil.DeepCopy(bridge2.Owner.GroupParam), Points = new List <UnitPointBulge>()
                        };
                    }
                    #region 组合多段线
                    if (draw11 == draw12 && draw21 == draw22)
                    {
                        if (draw11.Points.Count > 0 && draw11.Points[0] == point11)
                        {
                            draw11.ReverseDirection();
                        }
                        if (draw21.Points.Count > 0 && draw21.Points[0] != point21)
                        {
                            draw11.ReverseDirection();
                        }
                        if (draw11.Points.Count > 0)
                        {
                            draw11.Points[draw11.Points.Count - 1].Bulge = double.NaN;
                        }
                        if (draw21.Points.Count > 0)
                        {
                            draw21.Points[draw21.Points.Count - 1].Bulge = double.NaN;
                        }
                        draw11.Points.AddRange(draw21.Points);
                        draw11.IsCloseFigure = true;
                        temps.Remove(draw21);
                    }
                    else if (draw11 == draw12 && draw21 != draw22)
                    {
                        if (draw21.Points.Count > 0 && draw21.Points[0] == point21)
                        {
                            draw21.ReverseDirection();
                        }
                        if (draw22.Points.Count > 0 && draw22.Points[0] != point22)
                        {
                            draw22.ReverseDirection();
                        }
                        if (draw11.Points.Count > 0 && draw11.Points[0] != point11)
                        {
                            draw11.ReverseDirection();
                        }
                        if (draw21.Points.Count > 0)
                        {
                            draw21.Points[draw21.Points.Count - 1].Bulge = double.NaN;
                        }
                        if (draw11.Points.Count > 0)
                        {
                            draw11.Points[draw11.Points.Count - 1].Bulge = double.NaN;
                        }
                        draw21.Points.AddRange(draw11.Points);
                        draw21.Points.AddRange(draw22.Points);
                        temps.Remove(draw11);
                        temps.Remove(draw22);
                    }
                    else if (draw11 != draw12 && draw21 == draw22)
                    {
                        if (draw11.Points.Count > 0 && draw11.Points[0] == point11)
                        {
                            draw11.ReverseDirection();
                        }
                        if (draw21.Points.Count > 0 && draw21.Points[0] != point21)
                        {
                            draw21.ReverseDirection();
                        }
                        if (draw12.Points.Count > 0 && draw12.Points[0] != point12)
                        {
                            draw12.ReverseDirection();
                        }
                        if (draw11.Points.Count > 0)
                        {
                            draw11.Points[draw11.Points.Count - 1].Bulge = double.NaN;
                        }
                        if (draw21.Points.Count > 0)
                        {
                            draw21.Points[draw21.Points.Count - 1].Bulge = double.NaN;
                        }
                        draw11.Points.AddRange(draw21.Points);
                        draw11.Points.AddRange(draw12.Points);
                        temps.Remove(draw21);
                        temps.Remove(draw12);
                    }
                    else if (draw11 == draw21 && draw12 == draw22)
                    {
                        if (draw11.Points.Count > 0 && draw11.Points[0] != point11)
                        {
                            draw11.ReverseDirection();
                        }
                        if (draw12.Points.Count > 0 && draw12.Points[0] != point12)
                        {
                            draw12.ReverseDirection();
                        }
                        if (draw11.Points.Count > 0)
                        {
                            draw11.Points[draw11.Points.Count - 1].Bulge = double.NaN;
                        }
                        if (draw12.Points.Count > 0)
                        {
                            draw12.Points[draw12.Points.Count - 1].Bulge = double.NaN;
                        }
                        draw11.IsCloseFigure = true;
                        draw12.IsCloseFigure = true;
                    }
                    else if (draw11 == draw21 && draw12 != draw22)
                    {
                        if (draw11.Points.Count > 0 && draw11.Points[0] != point11)
                        {
                            draw11.ReverseDirection();
                        }
                        if (draw12.Points.Count > 0 && draw12.Points[0] == point12)
                        {
                            draw12.ReverseDirection();
                        }
                        if (draw22.Points.Count > 0 && draw22.Points[0] != point22)
                        {
                            draw22.ReverseDirection();
                        }
                        if (draw11.Points.Count > 0)
                        {
                            draw11.Points[draw11.Points.Count - 1].Bulge = double.NaN;
                        }
                        if (draw12.Points.Count > 0)
                        {
                            draw12.Points[draw12.Points.Count - 1].Bulge = double.NaN;
                        }
                        draw11.IsCloseFigure = true;
                        draw12.Points.AddRange(draw22.Points);
                        temps.Remove(draw22);
                    }
                    else if (draw11 != draw21 && draw12 == draw22)
                    {
                        if (draw12.Points.Count > 0 && draw12.Points[0] != point12)
                        {
                            draw12.ReverseDirection();
                        }
                        if (draw11.Points.Count > 0 && draw11.Points[0] == point11)
                        {
                            draw11.ReverseDirection();
                        }
                        if (draw21.Points.Count > 0 && draw21.Points[0] != point21)
                        {
                            draw21.ReverseDirection();
                        }
                        if (draw12.Points.Count > 0)
                        {
                            draw12.Points[draw12.Points.Count - 1].Bulge = double.NaN;
                        }
                        if (draw11.Points.Count > 0)
                        {
                            draw11.Points[draw11.Points.Count - 1].Bulge = double.NaN;
                        }
                        draw12.IsCloseFigure = true;
                        draw11.Points.AddRange(draw21.Points);
                        temps.Remove(draw21);
                    }
                    else
                    {
                        if (draw11.Points.Count > 0 && draw11.Points[0] == point11)
                        {
                            draw11.ReverseDirection();
                        }
                        if (draw21.Points.Count > 0 && draw21.Points[0] != point21)
                        {
                            draw21.ReverseDirection();
                        }
                        if (draw12.Points.Count > 0 && draw12.Points[0] == point12)
                        {
                            draw12.ReverseDirection();
                        }
                        if (draw22.Points.Count > 0 && draw22.Points[0] != point22)
                        {
                            draw22.ReverseDirection();
                        }
                        if (draw11.Points.Count > 0)
                        {
                            draw11.Points[draw11.Points.Count - 1].Bulge = double.NaN;
                        }
                        if (draw12.Points.Count > 0)
                        {
                            draw12.Points[draw12.Points.Count - 1].Bulge = double.NaN;
                        }
                        draw11.Points.AddRange(draw21.Points);
                        draw12.Points.AddRange(draw22.Points);
                        temps.Remove(draw21);
                        temps.Remove(draw22);
                    }
                    #endregion
                }
                #endregion

                isChanged = true;
                temps.ForEach(d => d.Update());
                temps.AddRange(oldDraws);
                return(temps);
            }
            return(drawObjects);
        }
Ejemplo n.º 10
0
        /// <summary>
        /// 添加到显示画布
        /// </summary>
        /// <param name="canvas"></param>
        /// <param name="figures"></param>
        public static void AddToDrawObject(UCCanvas canvas, List <FigureBaseModel> figures, bool isClear = false)
        {
            if (canvas == null)
            {
                return;
            }
            if (figures != null && figures.Count > 0)
            {
                if (isClear)
                {
                    canvas.Model.Clear();
                }
                List <IDrawObject> objects = new List <IDrawObject>();
                foreach (FigureBaseModel figure in figures)
                {
                    switch (figure.Type)
                    {
                    case FigureTypes.Point:
                    {
                        var       fig       = figure as PointModel;
                        SingleDot singleDot = new SingleDot()
                        {
                            LayerId         = fig.LayerId,
                            IsSelected      = fig.IsSelected,
                            P1              = fig.Point,
                            GroupParam      = fig.GroupParam,
                            LeadIn          = fig.LeadIn,
                            LeadOut         = fig.LeadOut,
                            MicroConnParams = figure.MicroConnects,
                            CornerRingParam = figure.CornerRingParam,
                            IsInnerCut      = figure.IsInnerCut
                        };
                        singleDot.Update();
                        objects.Add(singleDot);
                    }
                    break;

                    case FigureTypes.Arc:
                    {
                        var     fig     = figure as ArcModel;
                        ArcBase arcBase = new ArcBase()
                        {
                            LayerId           = fig.LayerId,
                            IsSelected        = fig.IsSelected,
                            AngleSweep        = fig.AngleSweep,
                            Center            = fig.Center,
                            Radius            = (float)fig.Radius,
                            StartAngle        = (float)fig.StartAngle,
                            GroupParam        = fig.GroupParam,
                            LeadIn            = fig.LeadIn,
                            LeadOut           = fig.LeadOut,
                            MicroConnParams   = figure.MicroConnects,
                            CompensationParam = figure.CompensationParam,
                            CornerRingParam   = figure.CornerRingParam,
                            IsInnerCut        = figure.IsInnerCut
                        };
                        arcBase.Update();
                        objects.Add(arcBase);
                    }
                    break;

                    case FigureTypes.Circle:
                    {
                        var    fig    = figure as CircleModel;
                        Circle circle = new Circle()
                        {
                            LayerId            = fig.LayerId,
                            IsSelected         = fig.IsSelected,
                            IsClockwise        = fig.IsClockwise,
                            Center             = fig.Center,
                            Radius             = (float)fig.Radius,
                            StartAngle         = (float)fig.StartAngle,
                            GroupParam         = fig.GroupParam,
                            LeadIn             = fig.LeadIn,
                            LeadOut            = fig.LeadOut,
                            MicroConnParams    = figure.MicroConnects,
                            CompensationParam  = figure.CompensationParam,
                            CornerRingParam    = figure.CornerRingParam,
                            IsInnerCut         = figure.IsInnerCut,
                            IsFlyingCut        = fig.IsFlyingCut,
                            IsFlyingCutScatter = fig.IsFlyingCutScatter,
                            FlyingCutLeadOut   = fig.FlyingCutLeadOut,
                        };
                        circle.Update();
                        objects.Add(circle);
                    }
                    break;

                    case FigureTypes.LwPolyline:
                    {
                        var fig = figure as LwPolylineModel;
                        MultiSegmentLineBase multiSegmentLineBase = new MultiSegmentLineBase()
                        {
                            LayerId           = fig.LayerId,
                            IsSelected        = fig.IsSelected,
                            IsCloseFigure     = fig.IsFill,
                            Points            = fig.Points,
                            GroupParam        = fig.GroupParam,
                            LeadIn            = fig.LeadIn,
                            LeadOut           = fig.LeadOut,
                            PathStartParm     = fig.PathStartParm,
                            MicroConnParams   = figure.MicroConnects,
                            CompensationParam = figure.CompensationParam,
                            CornerRingParam   = figure.CornerRingParam,
                            IsInnerCut        = figure.IsInnerCut,
                            BezierParam       = fig.BezierParam
                        };
                        multiSegmentLineBase.Update();
                        objects.Add(multiSegmentLineBase);
                    }
                    break;

                    case FigureTypes.Ellipse:
                    { }
                    break;

                    case FigureTypes.PolyBezier:
                    { }
                    break;

                    default:
                        break;
                    }
                }
                canvas.Model.DrawingLayer.AddObjectOnDrawing(objects);
                canvas.Model.DrawingLayer.UpdateSN();
                GlobalData.Model.GlobalModel.TotalDrawObjectCount = canvas.Model.DrawingLayer.Objects.Count;
                canvas.DoInvalidate(true);
            }
        }