public NodeMultisegment(MultiSegmentLineBase owner, MultiSegementNodeType nodeType, int nodeIndex) { this.owner = owner; this.clone = this.owner.Clone() as MultiSegmentLineBase; this.nodeType = nodeType; this.nodeIndex = nodeIndex; this.ownerPoints = new List <UnitPointBulge>(); for (int i = 0; i < this.owner.PointCount; i++) { this.ownerPoints.Add(this.owner.Points[i]); } this.clonePoints = new List <UnitPointBulge>(); this.clone.IsCompleteDraw = false; this.clone.IsEditMode = true; this.owner.IsSelected = false; this.clone.IsSelected = true; }
private float GetPercentInPolylineByPoint(IDrawObject drawObject, UnitPoint unitPoint) { MultiSegmentLineBase item = (MultiSegmentLineBase)drawObject; int segment = DrawingOperationHelper.GetPointInLineIndex(item, unitPoint); int nextIndex = (segment + 1 >= item.PointCount) ? 0 : segment + 1; float percent; if (double.IsNaN(item.Points[segment].Bulge)) { double partLen = HitUtil.Distance(item.Points[segment].Point, unitPoint); double allLen = HitUtil.Distance(item.Points[segment].Point, item.Points[nextIndex].Point); percent = (float)(segment + partLen / allLen); } else { DrawModel.ArcModelMini arcModelMini = DrawingOperationHelper.GetArcParametersFromBulge(item.Points[segment].Point, item.Points[nextIndex].Point, (float)item.Points[segment].Bulge); percent = segment + DrawingOperationHelper.GetPercentInArcByPoint(arcModelMini, unitPoint); } return((float)(DrawingOperationHelper.GetLengthByPositionInPolyLine(item.Points, item.IsCloseFigure, percent) / item.SizeLength)); }
private void GetMultiLineLeadLineParams(IDrawObject drawObject, LineInOutParamsModel leadInOutParamsModel) { MultiSegmentLineBase multiSegmentLine = drawObject as MultiSegmentLineBase; int segment = 0; if (multiSegmentLine != null) { //所在段数必须合法 segment = DrawingOperationHelper.GetPointInLineIndex(multiSegmentLine, this.p2); int nextIndex = (segment + 1 >= multiSegmentLine.PointCount && multiSegmentLine.IsCloseFigure) ? 0 : segment + 1; if (double.IsNaN(multiSegmentLine.Points[segment].Bulge)) { double partLen = HitUtil.Distance(multiSegmentLine.Points[segment].Point, this.p2); double allLen = HitUtil.Distance(multiSegmentLine.Points[segment].Point, multiSegmentLine.Points[nextIndex].Point); float percent = (float)(segment + partLen / allLen); leadInOutParamsModel.FigureTotalLength = (float)(DrawingOperationHelper.GetLengthByPositionInPolyLine(multiSegmentLine.Points, multiSegmentLine.IsCloseFigure, percent) / multiSegmentLine.SizeLength); //角度(p1p2与当前线段所成夹角或与圆弧在当前鼠标点位置的切点出的切线所成夹角) this.p2 = HitUtil.FindApparentIntersectPoint(this.p1, this.p2, multiSegmentLine.Points[segment].Point, multiSegmentLine.Points[nextIndex].Point); double lineAngle = HitUtil.LineAngleR(multiSegmentLine.Points[nextIndex].Point, multiSegmentLine.Points[segment].Point, 0); UnitPoint extensionCordPoint = HitUtil.LineEndPoint(multiSegmentLine.Points[segment].Point, lineAngle, 5); leadInOutParamsModel.LineInAngle = (float)BulgeHelper.CalTwoLinesAngleFromThreePoints(extensionCordPoint, this.p2, this.p1); multiSegmentLine.IsInnerCut = HitUtil.IsClockwiseByCross(this.p1, this.p2, extensionCordPoint) == multiSegmentLine.Clockwise ? false : true; } else { ArcModelMini arcModelMini = DrawingOperationHelper.GetArcParametersFromBulge(multiSegmentLine.Points[segment].Point, multiSegmentLine.Points[nextIndex].Point, (float)multiSegmentLine.Points[segment].Bulge); float percent = segment + DrawingOperationHelper.GetPercentInArcByPoint(arcModelMini, this.p2); leadInOutParamsModel.FigureTotalLength = (float)(DrawingOperationHelper.GetLengthByPositionInPolyLine(multiSegmentLine.Points, multiSegmentLine.IsCloseFigure, percent) / multiSegmentLine.SizeLength); bool isInner; leadInOutParamsModel.LineInAngle = DrawingOperationHelper.GetLeadLineAngleArc(this.p1, this.p2, arcModelMini.Center, arcModelMini.Clockwise, out isInner); multiSegmentLine.IsInnerCut = isInner; } } //长度(p1p2的长度) leadInOutParamsModel.LineInLength = (float)HitUtil.Distance(p1, p2); }
private static List <BridgePoints> GetBridgeByMultiSegLine(MultiSegmentLineBase multiSegLine, UnitPoint p1, UnitPoint p2, BridgingModel param) { List <BridgePoints> retPoints = new List <BridgePoints>(); var line = DrawingOperationHelper.GetLineEquation(p1, p2); double width = param.Width / 2; var oriPoints = multiSegLine.Points; for (int index = 0; index < oriPoints.Count; index++) { int next = (index + 1 == oriPoints.Count) ? 0 : index + 1; UnitPointBulge point1 = oriPoints[index]; UnitPointBulge point2 = oriPoints[next]; if (!multiSegLine.IsCloseFigure && index == oriPoints.Count - 1) { break; } if (!double.IsNaN(point1.Bulge)) { //圆弧 ArcModelMini arcMini = DrawingOperationHelper.GetArcParametersFromBulge(point1.Point, point2.Point, (float)point1.Bulge); arcMini.StartAngle = (float)HitUtil.RadiansToDegrees(arcMini.StartAngle); arcMini.EndAngle = (float)HitUtil.RadiansToDegrees(arcMini.EndAngle); List <UnitPoint> points = DrawingOperationHelper.GetIntersectPointByLineAndCircle(line.Item1, line.Item2, line.Item3, arcMini.Center, arcMini.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) { arcMini.StartAngle = (float)HitUtil.DegreesToRadians(arcMini.StartAngle); arcMini.EndAngle = (float)HitUtil.DegreesToRadians(arcMini.EndAngle); //根据宽度求点 double arcLength = DrawingOperationHelper.GetArcLength(arcMini.Radius, arcMini.SweepAngle); hasPoints?.ForEach(p => { double percent = DrawingOperationHelper.GetPercentInArcByPoint(arcMini, p); //第一个位置点 double length1 = arcLength * (1 - percent) + width; UnitPointBulge retP1 = GetEndPointByLength(oriPoints, index, length1, false); //第二个位置点 double length2 = arcLength * percent + width; UnitPointBulge retP2 = GetEndPointByLength(oriPoints, index, length2, true); var bridge = new BridgePoints(multiSegLine, retP1, retP2, HitUtil.Distance(p1, p)); retPoints.Add(bridge); }); } } else { //直线 var lineABC = DrawingOperationHelper.GetLineEquation(point1.Point, point2.Point); UnitPoint point = DrawingOperationHelper.GetIntersectionPointBy2Line(line.Item1, line.Item2, line.Item3, lineABC.Item1, lineABC.Item2, lineABC.Item3); if (!point.IsEmpty && HitUtil.IsPointInLine(point1.Point, point2.Point, point, 0.000001f) && HitUtil.IsPointInLine(p1, p2, point, 0.000001f)) { //第一个位置点 double lenght1 = HitUtil.Distance(point2.Point, point) + width; UnitPointBulge retP1 = GetEndPointByLength(oriPoints, index, lenght1, false); //第二个位置点 double lenght2 = HitUtil.Distance(point1.Point, point) + width; UnitPointBulge retP2 = GetEndPointByLength(oriPoints, index, lenght2, true); var bridge = new BridgePoints(multiSegLine, retP1, retP2, HitUtil.Distance(p1, point)); retPoints.Add(bridge); } } } return(retPoints); }
private static List <IDrawObject> ConvertToMultiSegLine(MultiSegmentLineBase multiSegLine, List <BridgePoints> bridges) { List <IDrawObject> retObjects = new List <IDrawObject>(); double totalLength = 0; List <MicroUnitPoint> microTemps = MicroConnectHelper.InitMicroUnitPoint(multiSegLine.Points, multiSegLine.IsCloseFigure, out totalLength); List <MicroUnitPoint> microBridges = new List <MicroUnitPoint>(); microTemps.ForEach(e => e.Point.IsBasePoint = true); #region 位置点计算长度 foreach (BridgePoints point in bridges) { //第一个位置点 MicroUnitPoint startPoint = microTemps[(int)point.Point1.Position]; MicroUnitPoint endPoint = microTemps[(int)point.Point1.Position + 1 > microTemps.Count - 1 ? 0 : (int)point.Point1.Position + 1]; double length = 0; if (!double.IsNaN(startPoint.Point.Bulge)) { var arcMini = DrawingOperationHelper.GetArcParametersFromBulge(startPoint.Point.Point, endPoint.Point.Point, (float)startPoint.Point.Bulge); double bulge = BulgeHelper.GetBulgeFromTwoPointsAndCenter(arcMini.Center, startPoint.Point.Point, point.Point1.Point, arcMini.Clockwise); var arcNew = DrawingOperationHelper.GetArcParametersFromBulge(startPoint.Point.Point, point.Point1.Point, (float)bulge); length = DrawingOperationHelper.GetArcLength(arcNew.Radius, arcNew.SweepAngle); } else { length = HitUtil.Distance(startPoint.Point.Point, point.Point1.Point); } microBridges.Add(new MicroUnitPoint() { Point = point.Point1, OwerPos = (int)point.Point1.Position, StartLength = startPoint.StartLength + length, Flags = MicroConnectFlags.None }); //第二个位置点 startPoint = microTemps[(int)point.Point2.Position]; endPoint = microTemps[(int)point.Point2.Position + 1 > microTemps.Count - 1 ? 0 : (int)point.Point2.Position + 1]; if (!double.IsNaN(startPoint.Point.Bulge)) { var arcMini = DrawingOperationHelper.GetArcParametersFromBulge(startPoint.Point.Point, endPoint.Point.Point, (float)startPoint.Point.Bulge); double bulge = BulgeHelper.GetBulgeFromTwoPointsAndCenter(arcMini.Center, startPoint.Point.Point, point.Point2.Point, arcMini.Clockwise); var arcNew = DrawingOperationHelper.GetArcParametersFromBulge(startPoint.Point.Point, point.Point2.Point, (float)bulge); length = DrawingOperationHelper.GetArcLength(arcMini.Radius, arcNew.SweepAngle); } else { length = HitUtil.Distance(startPoint.Point.Point, point.Point2.Point); } microBridges.Add(new MicroUnitPoint() { Point = point.Point2, OwerPos = (int)point.Point2.Position, StartLength = startPoint.StartLength + length, Flags = MicroConnectFlags.None }); } #endregion #region 排序,相当于在合适的位置插入位置点 microTemps.AddRange(microBridges); microTemps.Sort((x, y) => { if (x.StartLength > y.StartLength) { return(1); } return(-1); }); #endregion #region 更新bulge for (int i = 0; i < microTemps.Count; i++) { int iNext = i + 1 >= microTemps.Count ? 0 : i + 1; if (!double.IsNaN(microTemps[i].Point.Bulge) && (!microTemps[i].Point.IsBasePoint || !microTemps[iNext].Point.IsBasePoint)) { int mIndex = microTemps[i].Point.IsBasePoint ? microTemps[i].OwerPos : (int)microTemps[i].Point.Position; int mNext = mIndex + 1 >= multiSegLine.Points.Count ? 0 : mIndex + 1; ArcModelMini arc = DrawingOperationHelper.GetArcParametersFromBulge(multiSegLine.Points[mIndex].Point, multiSegLine.Points[mNext].Point, (float)multiSegLine.Points[mIndex].Bulge); microTemps[i].Point.Bulge = BulgeHelper.GetBulgeFromTwoPointsAndCenter(arc.Center, microTemps[i].Point.Point, microTemps[iNext].Point.Point, arc.Clockwise); } } #endregion #region 更新断开的位置标志 bridges.ForEach(e => { int startIndex = microTemps.FindIndex(m => m.Point == e.Point1); int endIndex = microTemps.FindIndex(m => m.Point == e.Point2); if (startIndex > endIndex) { var points1 = microTemps.GetRange(startIndex, microTemps.Count - startIndex); var points2 = microTemps.GetRange(0, endIndex); points1.ForEach(p => p.Point.HasMicroConn = true); points2.ForEach(p => p.Point.HasMicroConn = true); } else { var points = microTemps.GetRange(startIndex, endIndex - startIndex); points.ForEach(p => p.Point.HasMicroConn = true); } }); #endregion #region 转换为多段线 MultiSegmentLineBase lwPolyLine = null; for (int i = 0; i < microTemps.Count; i++) { if (microTemps[i].Point.HasMicroConn) { if (lwPolyLine != null) { microTemps[i].Point.HasMicroConn = false; lwPolyLine.Points.Add(microTemps[i].Point); retObjects.Add(lwPolyLine); lwPolyLine = null; } } else { if (lwPolyLine == null) { lwPolyLine = new MultiSegmentLineBase() { IsCloseFigure = false, LayerId = multiSegLine.LayerId, GroupParam = CopyUtil.DeepCopy(multiSegLine.GroupParam), Points = new List <UnitPointBulge>() }; } lwPolyLine.Points.Add(microTemps[i].Point); } } if (lwPolyLine != null) { if (multiSegLine.IsCloseFigure) { (retObjects[0] as MultiSegmentLineBase).Points.InsertRange(0, lwPolyLine.Points); } else { retObjects.Add(lwPolyLine); } } #endregion return(retObjects); }
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); }
public static void C(MultiSegmentLineBase multiSegmentLine) { }
/// <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); } }