Esempio n. 1
0
        private void CalculateRoundParams(double radius)
        {
            if (radius > this.maxRadius)
            {
                return;
            }
            List <UnitPointBulge> temp = new List <UnitPointBulge>();
            double bulge = BulgeHelper.GetBulgFromRadian(Math.PI / 2);

            bulge = this.Clockwise ? -bulge : bulge;
            List <UnitPoint> unitPoints = BulgeHelper.GetCufoffPoint(this.rectPoint[0], this.rectPoint[1], this.rectPoint[2], radius);

            temp.Add(new UnitPointBulge(unitPoints[0], bulge));
            temp.Add(new UnitPointBulge(unitPoints[1]));
            unitPoints = BulgeHelper.GetCufoffPoint(this.rectPoint[1], this.rectPoint[2], this.rectPoint[3], radius);
            temp.Add(new UnitPointBulge(unitPoints[0], bulge));
            temp.Add(new UnitPointBulge(unitPoints[1]));
            unitPoints = BulgeHelper.GetCufoffPoint(this.rectPoint[2], this.rectPoint[3], this.rectPoint[0], radius);
            temp.Add(new UnitPointBulge(unitPoints[0], bulge));
            temp.Add(new UnitPointBulge(unitPoints[1]));
            unitPoints = BulgeHelper.GetCufoffPoint(this.rectPoint[3], this.rectPoint[0], this.rectPoint[1], radius);
            temp.Add(new UnitPointBulge(unitPoints[0], bulge));
            temp.Add(new UnitPointBulge(unitPoints[1]));
            this.Points = temp;
            this.Points.Insert(0, this.Points[this.PointCount - 1]);
            this.Points.RemoveAt(this.PointCount - 1);
        }
Esempio n. 2
0
        /// <summary>
        /// 得到直线或者圆弧的标准补偿点
        /// </summary>
        /// <param name="p1"></param>
        /// <param name="p2"></param>
        /// <param name="isOutside"></param>
        /// <returns></returns>
        public static Tuple <UnitPointBulge, UnitPointBulge> GetCompensationsPoint(UnitPointBulge p1, UnitPointBulge p2, double size, bool isOutside, bool isUpdateBulge = false)
        {
            UnitPointBulge up1 = new UnitPointBulge();
            UnitPointBulge up2 = new UnitPointBulge();

            if (!double.IsNaN(p1.Bulge))//圆弧
            {
                var    arc = DrawingOperationHelper.GetArcParametersFromBulge(p1.Point, p2.Point, (float)p1.Bulge);
                double r   = arc.Clockwise ? arc.Radius - size : arc.Radius + size;
                if (isOutside)
                {
                    r = arc.Clockwise ? arc.Radius + size : arc.Radius - size;
                }
                if (r > 0)
                {
                    UnitPoint point1 = HitUtil.GetLinePointByDistance(arc.Center, p1.Point, r, true);
                    UnitPoint point2 = HitUtil.GetLinePointByDistance(arc.Center, p2.Point, r, true);
                    up1 = new UnitPointBulge()
                    {
                        Point = point1, Bulge = p1.Bulge, HasMicroConn = p1.HasMicroConn
                    };
                    up2 = new UnitPointBulge()
                    {
                        Point = point2, Bulge = p2.Bulge, HasMicroConn = p2.HasMicroConn
                    };
                    if (isUpdateBulge)
                    {
                        up1.Bulge = BulgeHelper.GetBulgeFromTwoPointsAndCenter(arc.Center, up1.Point, up2.Point, arc.Clockwise);
                    }
                }
            }
            else //直线
            {
                var       line1d1 = DrawingOperationHelper.GetLinePointByVerticalLine(p1.Point, p2.Point, size);
                var       line1d2 = DrawingOperationHelper.GetLinePointByVerticalLine(p2.Point, p1.Point, size);
                UnitPoint point1  = !isOutside ? line1d1.Item2 : line1d1.Item1;
                UnitPoint point2  = !isOutside ? line1d2.Item1 : line1d2.Item2;
                up1 = new UnitPointBulge()
                {
                    Point = point1, Bulge = p1.Bulge, HasMicroConn = p1.HasMicroConn
                };
                up2 = new UnitPointBulge()
                {
                    Point = point2, Bulge = p2.Bulge, HasMicroConn = p2.HasMicroConn
                };
            }

            return(Tuple.Create(up1, up2));
        }
Esempio n. 3
0
        private static List <IDrawObject> ConvertToMultiSegLine(Circle circle, List <BridgePoints> bridges)
        {
            List <IDrawObject> retObjects = new List <IDrawObject>();

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

                bridges[1].Point2.Bulge = BulgeHelper.GetBulgeFromTwoPointsAndCenter(circle.Center, bridges[1].Point2.Point, bridges[0].Point1.Point, circle.IsClockwise);;
                retObjects.Add(new MultiSegmentLineBase()
                {
                    IsCloseFigure = false,
                    LayerId       = circle.LayerId,
                    GroupParam    = CopyUtil.DeepCopy(circle.GroupParam),
                    Points        = new List <UnitPointBulge>()
                    {
                        bridges[1].Point2, bridges[0].Point1
                    }
                });
            }
            else if (bridges.Count == 1)
            {
                bridges[0].Point2.Bulge = BulgeHelper.GetBulgeFromTwoPointsAndCenter(circle.Center, bridges[0].Point2.Point, bridges[0].Point1.Point, circle.IsClockwise);;
                retObjects.Add(new MultiSegmentLineBase()
                {
                    IsCloseFigure = false,
                    LayerId       = circle.LayerId,
                    GroupParam    = CopyUtil.DeepCopy(circle.GroupParam),
                    Points        = new List <UnitPointBulge>()
                    {
                        bridges[0].Point2, bridges[0].Point1
                    }
                });
            }
            return(retObjects);
        }
Esempio n. 4
0
        /// <summary>
        /// 直线与直线,补偿求交点
        /// </summary>
        /// <param name="p1"></param>
        /// <param name="p2"></param>
        /// <param name="p3"></param>
        /// <param name="indexCur"></param>
        /// <returns></returns>
        private static List <UnitPointBulge> CalCompensationsBy2Line(UnitPointBulge p1, UnitPointBulge p2, UnitPointBulge p3, int indexCur, CompensationModel compensationParam, bool isOutside)
        {
            var retPoints = new List <UnitPointBulge>();
            var cPoints1  = GetCompensationsPoint(p1, p2, compensationParam.Size, isOutside);
            var cPoints2  = GetCompensationsPoint(p2, p3, compensationParam.Size, isOutside);

            //如果两点距离在误差范围内,当做同一个点处理
            if (HitUtil.Distance(cPoints1.Item2.Point, cPoints2.Item1.Point) < errorRange)
            {
                retPoints.Add(new UnitPointBulge(cPoints1.Item2.Point, p2.Bulge, hasMicroConn: p2.HasMicroConn, position: indexCur));
                return(retPoints);
            }
            var       line1 = DrawingOperationHelper.GetLineEquation(cPoints1.Item1.Point, cPoints1.Item2.Point);
            var       line2 = DrawingOperationHelper.GetLineEquation(cPoints2.Item1.Point, cPoints2.Item2.Point);
            UnitPoint point = DrawingOperationHelper.GetIntersectionPointBy2Line(line1.Item1, line1.Item2, line1.Item3, line2.Item1, line2.Item2, line2.Item3);

            if (double.IsNaN(point.X) || double.IsNaN(point.Y))
            {
                //平行
                retPoints.Add(new UnitPointBulge(cPoints1.Item2.Point, p2.Bulge, hasMicroConn: p2.HasMicroConn, position: indexCur));
                return(retPoints);
            }
            else
            {
                bool pointInLine = HitUtil.IsPointInLine(cPoints1.Item1.Point, cPoints1.Item2.Point, point, errorRange);
                if (compensationParam.IsSmooth && !pointInLine)
                {
                    //圆角处理,转换为带弧度的点
                    bool   closewise = HitUtil.IsClockwiseByCross(cPoints1.Item1.Point, cPoints1.Item2.Point, p2.Point);
                    double bulge     = BulgeHelper.GetBulgeFromTwoPointsAndCenter(p2.Point, cPoints1.Item2.Point, cPoints2.Item1.Point, closewise);
                    retPoints.Add(new UnitPointBulge(cPoints1.Item2.Point, bulge, hasMicroConn: p2.HasMicroConn, position: -1 - indexCur));
                    retPoints.Add(new UnitPointBulge(cPoints2.Item1.Point, p2.Bulge, hasMicroConn: p2.HasMicroConn, position: indexCur));
                    return(retPoints);
                }
                else
                {
                    retPoints.Add(new UnitPointBulge(point, p2.Bulge, hasMicroConn: p2.HasMicroConn, position: indexCur));
                    return(retPoints);
                }
            }
        }
Esempio n. 5
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);
        }
Esempio n. 6
0
        /// <summary>
        /// 圆弧到直线,补偿求交点
        /// </summary>
        /// <param name="p1"></param>
        /// <param name="p2"></param>
        /// <param name="p3"></param>
        /// <param name="indexCur"></param>
        /// <returns></returns>
        private static List <UnitPointBulge> CalCompensationsByArcLine(UnitPointBulge p1, UnitPointBulge p2, UnitPointBulge p3, int indexCur, CompensationModel compensationParam, bool isOutside)
        {
            var          retPoints = new List <UnitPointBulge>();
            ArcModelMini arc       = DrawingOperationHelper.GetArcParametersFromBulge(p1.Point, p2.Point, (float)p1.Bulge);
            var          cPoints   = GetCompensationsPoint(p2, p3, compensationParam.Size, isOutside);
            double       r         = arc.Clockwise ? arc.Radius - compensationParam.Size : arc.Radius + compensationParam.Size;

            if (isOutside)
            {
                r = arc.Clockwise ? arc.Radius + compensationParam.Size : arc.Radius - compensationParam.Size;
            }
            UnitPoint point1 = HitUtil.GetLinePointByDistance(arc.Center, p2.Point, r, true);

            //如果两点距离在误差范围内,当做同一个点处理
            if (HitUtil.Distance(point1, cPoints.Item1.Point) < errorRange)
            {
                retPoints.Add(new UnitPointBulge(point1, p2.Bulge, hasMicroConn: p2.HasMicroConn, position: indexCur));
                return(retPoints);
            }
            var       line               = DrawingOperationHelper.GetLineEquation(cPoints.Item1.Point, cPoints.Item2.Point);
            var       intersects         = DrawingOperationHelper.GetIntersectPointByLineAndCircle(line.Item1, line.Item2, line.Item3, arc.Center, r);
            var       validPoint         = new UnitPoint(double.NaN, double.NaN);
            UnitPoint intersecteArcPoint = new UnitPoint(double.NaN, double.NaN);

            //筛选有交点,如果有两个点就选距离p2近的点
            if (intersects.Count == 1)
            {
                validPoint = intersects[0];
            }
            else if (intersects.Count == 2)
            {
                validPoint = HitUtil.Distance(intersects[0], p2.Point) < HitUtil.Distance(intersects[1], p2.Point) ? intersects[0] : intersects[1];
            }

            if (validPoint.IsEmpty) //|| !HitUtil.IsPointInLine(cPoints.Item1.Point, cPoints.Item2.Point, validPoint, errorRange))
            {
                //求圆弧的切线的交点
                if (arc.Clockwise != HitUtil.IsClockwiseByCross(p2.Point, point1, cPoints.Item1.Point))
                {
                    var l1 = DrawingOperationHelper.GetLineEquationByVerticalLine(point1, p2.Point);
                    intersecteArcPoint = DrawingOperationHelper.GetIntersectionPointBy2Line(l1.Item1, l1.Item2, l1.Item3, line.Item1, line.Item2, line.Item3);
                }
            }
            bool completedSmooth = false;   //是否完成圆角处理

            if (compensationParam.IsSmooth) //圆角处理
            {
                if (!intersecteArcPoint.IsEmpty ||
                    (!validPoint.IsEmpty && !HitUtil.IsPointInLine(cPoints.Item1.Point, cPoints.Item2.Point, validPoint, errorRange)))
                {
                    bool   closewise = HitUtil.IsClockwiseByCross(p2.Point, cPoints.Item1.Point, cPoints.Item2.Point);
                    double bulge     = BulgeHelper.GetBulgeFromTwoPointsAndCenter(p2.Point, point1, cPoints.Item1.Point, closewise);
                    retPoints.Add(new UnitPointBulge(point1, bulge, hasMicroConn: p2.HasMicroConn, position: -1 - indexCur));
                    retPoints.Add(new UnitPointBulge(cPoints.Item1.Point, p2.Bulge, hasMicroConn: p2.HasMicroConn, position: indexCur));
                    completedSmooth = true;
                }
            }
            if (!completedSmooth)
            {
                if (!intersecteArcPoint.IsEmpty)
                {
                    retPoints.Add(new UnitPointBulge(point1, position: indexCur));
                    retPoints.Add(new UnitPointBulge(intersecteArcPoint, position: indexCur));
                }
                else if (!validPoint.IsEmpty)
                {
                    retPoints.Add(new UnitPointBulge(validPoint, p2.Bulge, hasMicroConn: p2.HasMicroConn, position: indexCur));
                    return(retPoints);
                }
                else
                {
                    retPoints.Add(new UnitPointBulge(point1, position: indexCur));
                    retPoints.Add(new UnitPointBulge(p2.Point, position: indexCur));
                    retPoints.Add(new UnitPointBulge(cPoints.Item1.Point, p2.Bulge, hasMicroConn: p2.HasMicroConn, position: indexCur));
                }
            }
            return(retPoints);
        }
Esempio n. 7
0
        /// <summary>
        ///  计算补偿点
        /// </summary>
        /// <param name="points"></param>
        /// <param name="isCloseFigure"></param>
        /// <param name="compensationParam"></param>
        /// <param name="isReverseDirection"></param>
        /// <param name="isOutside"></param>
        /// <returns></returns>
        public static List <UnitPointBulge> CalCompensationPoints(List <UnitPointBulge> points, bool isCloseFigure, CompensationModel compensationParam, bool isReverseDirection, bool isOutside)
        {
            var rets = new List <UnitPointBulge>();

            if (points == null && points.Count <= 0)
            {
                return(rets);
            }

            #region 计算补偿点坐标
            if (points.Count == 2)
            {
                var ps = GetCompensationsPoint(points[0], points[1], compensationParam.Size, isOutside);
                ps.Item1.IsBasePoint = true;
                ps.Item1.Position    = 0;
                ps.Item2.IsBasePoint = true;
                ps.Item2.Position    = 1;
                rets.Add(ps.Item1);
                rets.Add(ps.Item2);
            }
            else if (points.Count >= 3)
            {
                for (int i = 0; i < points.Count; i++)
                {
                    if (!isCloseFigure && i == 0)
                    {
                        var ps = GetCompensationsPoint(points[0], points[1], compensationParam.Size, isOutside);
                        ps.Item1.IsBasePoint = true;
                        ps.Item1.Position    = i;
                        rets.Add(ps.Item1);
                    }
                    else if (!isCloseFigure && i == points.Count - 1)
                    {
                        var ps = GetCompensationsPoint(points[i - 1], points[points.Count - 1], compensationParam.Size, isOutside);
                        ps.Item2.IsBasePoint = true;
                        ps.Item2.Position    = i;
                        rets.Add(ps.Item2);
                    }
                    else
                    {
                        int indexPer  = (i - 1 < 0) ? points.Count - 1 : i - 1; //前一段
                        int indexCur  = i;                                      //当前段
                        int indexNext = (i + 1 > points.Count - 1) ? 0 : i + 1; //后一段

                        UnitPointBulge p1 = points[indexPer];
                        UnitPointBulge p2 = points[indexCur];
                        UnitPointBulge p3 = points[indexNext];

                        var ps = new List <UnitPointBulge>();
                        if (!double.IsNaN(p1.Bulge) && !double.IsNaN(p2.Bulge))
                        {
                            //圆弧到圆弧,求交点
                            ps = CalCompensationsBy2Arc(p1, p2, p3, indexCur, compensationParam, isOutside);
                        }
                        else if (double.IsNaN(p1.Bulge) && !double.IsNaN(p2.Bulge))
                        {
                            //直线到圆弧,求交点
                            ps = CalCompensationsByLineArc(p1, p2, p3, indexCur, compensationParam, isOutside);
                        }
                        else if (!double.IsNaN(p1.Bulge) && double.IsNaN(p2.Bulge))
                        {
                            //圆弧到直线,求交点
                            ps = CalCompensationsByArcLine(p1, p2, p3, indexCur, compensationParam, isOutside);
                        }
                        else
                        {
                            //直线到直线,求交点
                            ps = CalCompensationsBy2Line(p1, p2, p3, indexCur, compensationParam, isOutside);
                        }
                        if (ps.Count > 0)
                        {
                            ps[ps.Count - 1].IsBasePoint = true;
                        }
                        rets.AddRange(ps);
                    }
                }
            }
            #endregion

            #region 更新凸度值,和所在段的标记
            for (int i = 0; i < rets.Count - 1; i++)
            {
                if (!double.IsNaN(rets[i].Bulge) && (int)rets[i].Position >= 0)
                {
                    ArcModelMini arc   = DrawingOperationHelper.GetArcParametersFromBulge(points[(int)rets[i].Position].Point, points[(int)rets[i].Position + 1].Point, (float)points[(int)rets[i].Position].Bulge);
                    double       bugle = BulgeHelper.GetBulgeFromTwoPointsAndCenter(arc.Center, rets[i].Point, rets[i + 1].Point, arc.Clockwise);
                    rets[i].Bulge = bugle;
                }
                if ((int)rets[i].Position < 0)
                {
                    rets[i].Position = -(rets[i].Position + 1);
                }
            }
            if (isCloseFigure && rets.Count > 0 && !double.IsNaN(rets[rets.Count - 1].Bulge) && rets[rets.Count - 1].Position >= 0)
            {
                ArcModelMini arc   = DrawingOperationHelper.GetArcParametersFromBulge(points[points.Count - 1].Point, points[0].Point, (float)points[points.Count - 1].Bulge);
                double       bugle = BulgeHelper.GetBulgeFromTwoPointsAndCenter(arc.Center, rets[rets.Count - 1].Point, rets[0].Point, arc.Clockwise);
                rets[rets.Count - 1].Bulge = bugle;
            }
            if (rets.Count > 0 && (int)rets[rets.Count - 1].Position < 0)
            {
                rets[rets.Count - 1].Position = -(rets[rets.Count - 1].Position + 1);
            }
            #endregion

            #region 根据情况调整起点
            if (isCloseFigure)
            {
                int index = rets.FindLastIndex(e => (int)e.Position == 0);
                if ((index == 1 && !isReverseDirection) || index == 2)
                {
                    var temp = rets[0];
                    rets.Remove(temp);
                    rets.Add(temp);
                }
            }
            #endregion

            return(rets);
        }
Esempio n. 8
0
        /// <summary>
        /// 圆弧到圆弧,补偿求交点
        /// </summary>
        /// <param name="p1"></param>
        /// <param name="p2"></param>
        /// <param name="p3"></param>
        /// <param name="indexCur"></param>
        /// <returns></returns>
        private static List <UnitPointBulge> CalCompensationsBy2Arc(UnitPointBulge p1, UnitPointBulge p2, UnitPointBulge p3, int indexCur, CompensationModel compensationParam, bool isOutside)
        {
            var          retPoints = new List <UnitPointBulge>();
            ArcModelMini arc1      = DrawingOperationHelper.GetArcParametersFromBulge(p1.Point, p2.Point, (float)p1.Bulge);
            ArcModelMini arc2      = DrawingOperationHelper.GetArcParametersFromBulge(p2.Point, p3.Point, (float)p2.Bulge);
            double       r1        = arc1.Clockwise ? arc1.Radius - compensationParam.Size : arc1.Radius + compensationParam.Size;
            double       r2        = arc2.Clockwise ? arc2.Radius - compensationParam.Size : arc2.Radius + compensationParam.Size;

            if (isOutside)
            {
                r1 = arc1.Clockwise ? arc1.Radius + compensationParam.Size : arc1.Radius - compensationParam.Size;
                r2 = arc2.Clockwise ? arc2.Radius + compensationParam.Size : arc2.Radius - compensationParam.Size;
            }
            UnitPoint point1 = HitUtil.GetLinePointByDistance(arc1.Center, p2.Point, r1, true);
            UnitPoint point2 = HitUtil.GetLinePointByDistance(arc2.Center, p2.Point, r2, true);

            if (HitUtil.Distance(point1, point2) < errorRange)
            {
                retPoints.Add(new UnitPointBulge(point2, p2.Bulge, hasMicroConn: p2.HasMicroConn, position: indexCur));
                return(retPoints);
            }

            var       intersects         = DrawingOperationHelper.GetIntersectPointBy2Circle(arc1.Center, r1, arc2.Center, r2);
            var       validPoint         = new UnitPoint(double.NaN, double.NaN);
            UnitPoint intersecteArcPoint = new UnitPoint(double.NaN, double.NaN);

            //筛选有交点,如果有两个点就选距离p2近的点
            if (intersects.Count == 1)
            {
                validPoint = intersects[0];
            }
            else if (intersects.Count == 2)
            {
                validPoint = HitUtil.Distance(intersects[0], p2.Point) < HitUtil.Distance(intersects[1], p2.Point) ? intersects[0] : intersects[1];
            }

            bool closewise = HitUtil.IsClockwiseByCross(p2.Point, point1, point2);

            if (validPoint.IsEmpty)
            {
                if (arc1.Clockwise != closewise || arc2.Clockwise != closewise)//求两个圆弧的切线的交点
                {
                    var line1 = DrawingOperationHelper.GetLineEquationByVerticalLine(point1, arc1.Center);
                    var line2 = DrawingOperationHelper.GetLineEquationByVerticalLine(point2, arc2.Center);
                    intersecteArcPoint = DrawingOperationHelper.GetIntersectionPointBy2Line(line1.Item1, line1.Item2, line1.Item3, line2.Item1, line2.Item2, line2.Item3);
                }
            }
            bool completedSmooth = false;   //是否完成圆角处理

            if (compensationParam.IsSmooth) //圆角处理
            {
                bool needSmooth = false;
                if (!validPoint.IsEmpty)
                {
                    double lineAngle  = HitUtil.LineAngleR(arc1.Center, validPoint, 0);
                    bool   pointInArc = HitUtil.IsPointInArc(HitUtil.RadiansToDegrees(lineAngle), HitUtil.RadiansToDegrees(arc1.StartAngle), HitUtil.RadiansToDegrees(arc1.EndAngle), arc1.Clockwise);
                    needSmooth = !pointInArc;
                }
                if (!intersecteArcPoint.IsEmpty || needSmooth)
                {
                    double bulge = BulgeHelper.GetBulgeFromTwoPointsAndCenter(p2.Point, point1, point2, closewise);
                    retPoints.Add(new UnitPointBulge(point1, bulge, hasMicroConn: p2.HasMicroConn, position: -1 - indexCur));
                    retPoints.Add(new UnitPointBulge(point2, p2.Bulge, hasMicroConn: p2.HasMicroConn, position: indexCur));
                    completedSmooth = true;
                }
            }
            if (!completedSmooth)
            {
                if (!validPoint.IsEmpty)
                {
                    retPoints.Add(new UnitPointBulge(validPoint, p2.Bulge, hasMicroConn: p2.HasMicroConn, position: indexCur));
                    return(retPoints);
                }
                else if (!intersecteArcPoint.IsEmpty)
                {
                    retPoints.Add(new UnitPointBulge(point1, position: indexCur));
                    retPoints.Add(new UnitPointBulge(intersecteArcPoint, position: indexCur));
                    retPoints.Add(new UnitPointBulge(point2, p2.Bulge, hasMicroConn: p2.HasMicroConn, position: indexCur));
                }
                else
                {
                    retPoints.Add(new UnitPointBulge(point1, position: indexCur));
                    retPoints.Add(new UnitPointBulge(p2.Point, position: indexCur));
                    retPoints.Add(new UnitPointBulge(point2, p2.Bulge, hasMicroConn: p2.HasMicroConn, position: indexCur));
                }
            }
            return(retPoints);
        }
Esempio n. 9
0
        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);
        }
Esempio n. 10
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);
        }