コード例 #1
0
 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;
 }
コード例 #2
0
        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));
        }
コード例 #3
0
        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);
        }
コード例 #4
0
ファイル: BridgeHelper.cs プロジェクト: liyangTeam/WSXCut
        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);
        }
コード例 #5
0
ファイル: BridgeHelper.cs プロジェクト: liyangTeam/WSXCut
        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);
        }
コード例 #6
0
ファイル: BridgeHelper.cs プロジェクト: liyangTeam/WSXCut
        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);
        }
コード例 #7
0
 public static void C(MultiSegmentLineBase multiSegmentLine)
 {
 }
コード例 #8
0
ファイル: FigureHelper.cs プロジェクト: liyangTeam/WSXCut
        /// <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);
            }
        }