Example #1
0
        /// <summary>
        /// 计算特定比例点坐标
        /// </summary>
        /// <param name="fixRate">特定点比例系数</param>
        /// <param name="isBound">是否是矩形边框特定点</param>
        /// <returns></returns>
        public static PointF CalcFixPoint(IDrawData data, PointF fixRate, bool isBound = false)
        {
            _funMatrix.Reset();
            PointF point = PointF.Empty;

            CalcMatrix(data, ref _funMatrix, ref point);


            RectangleF rf = data.Rect;

            if (data is DrawObj)
            {
                rf = ((DrawObj)data).NewRect;
            }
            PointF fixPos = new PointF(rf.X + rf.Width * fixRate.X, rf.Y + rf.Height * fixRate.Y);

            if (isBound)
            {
                rf     = GetMatrixBounds(_funMatrix, rf);
                fixPos = new PointF(rf.X + rf.Width * fixRate.X, rf.Y + rf.Height * fixRate.Y);

                return(fixPos);
            }

            return(GetMatrixPos(_funMatrix, fixPos));
        }
Example #2
0
        /// <summary>
        /// 计算矩阵转换后的点
        /// </summary>
        /// <param name="data"></param>
        /// <param name="point"></param>
        /// <returns></returns>
        public static PointF CalcMatrixPoint(IDrawData data, PointF point)
        {
            _funMatrix.Reset();
            PointF center = PointF.Empty;

            CalcMatrix(data, ref _funMatrix, ref center);

            return(GetMatrixPos(_funMatrix, point));
        }
Example #3
0
        private List <DataUnit> GetLeadOut(IDrawData drawData)
        {
            var result = new List <DataUnit>();
            var part   = drawData.GetLeadOut();

            if (part != null && part.Any())
            {
                result.AddRange(ParserUtils.Convert(part, this.layerId));
            }
            return(result);
        }
Example #4
0
        /// <summary>
        /// 正交模式下,获取Rect的宽高比例值
        /// </summary>
        /// <param name="data"></param>
        /// <param name="pos"></param>
        /// <param name="orthoTan"></param>
        /// <returns></returns>
        public static float CalcOrthoTan(IDrawData data, int pos)
        {
            if (pos == 0 || pos == 2 || pos == 5 || pos == 7)
            {
                float tan = data.Rect.Height / data.Rect.Width;
                if (pos == 2 || pos == 5)
                {
                    tan = -tan;
                }
                return(tan);
            }

            return(0);
        }
Example #5
0
        private void InsertBasic(List <DataUnit> items, IDrawData drawData)
        {
            var part1 = drawData.GetBasic();
            var part2 = drawData.GetCompensation();

            if (part2 != null && part2.Any())
            {
                items.AddRange(ParserUtils.Convert(part2, this.layerId));
            }
            else
            {
                items.AddRange(ParserUtils.Convert(part1, this.layerId));
            }
        }
Example #6
0
        /// <summary>
        /// 生成矩阵
        /// </summary>
        /// <param name="matrix"></param>
        /// <param name="rotatePointPos"></param>
        public static void CalcMatrix(IDrawData data, ref Matrix matrix, ref PointF rotatePointPos)
        {
            matrix.Reset();

            RectangleF rect = data.Rect;

            if (data is DrawObj)
            {
                rect = ((DrawObj)data).NewRect;
            }

            RectangleF rf         = GetScaleRect(data.ScalePoint, data.XScale, data.YScale, rect);
            PointF     scalePoint = new PointF(rf.Left + rf.Width * data.ScalePoint.X,
                                               rf.Top + rf.Height * data.ScalePoint.Y);
            PointF rectCenter = new PointF(rf.Left + rf.Width * 0.5f,
                                           rf.Top + rf.Height * 0.5f);
            //计算旋转中心点
            PointF origCenter = new PointF(rf.Width * (data.RotatePoint.X - 0.5f),
                                           rf.Height * (data.RotatePoint.Y - 0.5f));
            PointF rotateCenter = GetShearPoint(origCenter, data.Shear);

            rotatePointPos = new PointF(rectCenter.X + rotateCenter.X,
                                        rectCenter.Y + rotateCenter.Y);

            //本段代码次序不能改变
            //Matrix后面的操作先执行,切记
            //以中心点为基准旋转倾斜
            matrix.Translate(rectCenter.X, rectCenter.Y);
            matrix.RotateAt(data.RotateAngle, rotateCenter);
            matrix.Shear(data.Shear, 0);
            matrix.Translate(-rectCenter.X, -rectCenter.Y);
            //以缩放点为基准缩放
            matrix.Translate(scalePoint.X, scalePoint.Y);
            matrix.Scale(data.XScale, data.YScale);
            matrix.Translate(-scalePoint.X, -scalePoint.Y);
            //垂直水平翻转
            if (data.IsFlipX || data.IsFlipY)
            {
                float x = data.IsFlipX ? -1 : 1;
                float y = data.IsFlipY ? -1 : 1;
                matrix.Translate(rectCenter.X, rectCenter.Y);
                matrix.Scale(x, y);
                matrix.Translate(-rectCenter.X, -rectCenter.Y);
            }
        }
Example #7
0
        private void InsertConnerRing(List <DataUnit> items, IDrawData drawData)
        {
            var part = drawData.GetCornerRing();

            if (part != null && part.Any())
            {
                var tmp = ParserUtils.Convert(part, this.layerId);
                foreach (var m in tmp)
                {
                    for (int i = 0; i < items.Count; i++)
                    {
                        var p1 = m.Points[0];
                        var p2 = items[i].Points.Last();
                        if (MathEx.Equals(p1, p2))
                        {
                            items.Insert(i + 1, m);
                            break;
                        }
                    }
                }
            }
        }
Example #8
0
        private void SpiltByCoolingPoints(List <DataUnit> items, IDrawData drawData)
        {
            var part = drawData.GetCoolingPoints();

            if (part != null && part.Any())
            {
                var tmp = part.Select(x => x as DotLite).Where(x => x.IsInCompensation).ToList();
                if (!tmp.Any())
                {
                    tmp = part.Select(x => x as DotLite).ToList();
                }
                foreach (var m in tmp)
                {
                    for (int i = 0; i < items.Count; i++)
                    {
                        var data = items[i];
                        if (data.Id == DataUnitTypes.PointCooling)
                        {
                            continue;
                        }
                        var p = m.Point.ToPointF();
                        if (data.TrySpilt(p, out List <DataUnit> tmp1))
                        {
                            var coolingPoint = new DataUnit(DataUnitTypes.PointCooling, Constants.CoolingPointLayerId, new List <PointF> {
                                p, p.Offset(0.0001f, 0.0001f)
                            });
                            coolingPoint.AttachedLayerId = this.layerId;
                            tmp1.Insert(1, coolingPoint);

                            items.RemoveAt(i);
                            items.InsertRange(i, tmp1);

                            break;
                        }
                    }
                }
            }
        }
Example #9
0
 public void addDrawData(IDrawData drawData)
 {
 }
Example #10
0
        //private void InsertOriginal(List<DataUnit> items, IDrawData drawData)
        //{

        //}
        private List <DataUnit> GetDataCore(bool skipCoolingPoints = false)
        {
            IDrawData drawData  = this.drawObject as IDrawData;
            var       res       = new List <DataUnit>();
            var       basicPart = new List <DataUnit>();

            this.InsertBasic(res, drawData);
            if (!skipCoolingPoints)
            {
                this.SpiltByCoolingPoints(res, drawData);
            }

            //this.InsertLeadIn(res, drawData);
            //this.InsertLeadOut(res, drawData);
            var leadInPart  = this.GetLeadIn(drawData);
            var leadOutPart = this.GetLeadOut(drawData);

            if (leadInPart.Any())
            {
                var p = leadInPart.Last().Points.Last();
                res = this.LocateAndReshape(res, p);
            }
            else
            {
                bool condition1 = this.drawObject.OverCutLen.GetDecimal() < 0.0001f;
                bool condition2 = leadOutPart.Any();
                if (condition1 && condition2)
                {
                    var p = leadOutPart.First().Points.First();
                    res = this.LocateAndReshape(res, p);
                }
            }

            //Reshape data base on start move point
            var startPoint = this.drawObject.StartMovePoint.ToPointF();

            if (!leadInPart.Any() && !leadOutPart.Any() && !MathEx.Equals(res[0].Points[0], startPoint))
            {
                res = this.LocateAndReshape(res, startPoint);
            }

            //basicPart = CopyUtil.DeepCopy(res);
            basicPart = new List <DataUnit>(res);
            this.InsertConnerRing(res, drawData);

            var tmp = new List <DataUnit>();

            tmp.AddRange(res);
            int cnt = this.drawObject.OverCutLen.GetInteger() - 1;

            if (cnt > 0)
            {
                for (int i = 0; i < cnt; i++)
                {
                    tmp.AddRange(CopyUtil.DeepCopy(res));
                }
            }

            double ratio = this.drawObject.OverCutLen.GetDecimal();

            if (ratio > 0.0001f)
            {
                if (leadOutPart.Any())
                {
                    tmp.AddRange(GetRange(basicPart, leadOutPart.First().Points[0]));
                }
                else
                {
                    tmp.AddRange(GetRange(basicPart, ratio));
                }
            }

            if (leadInPart.Any())
            {
                tmp.InsertRange(0, leadInPart);
            }
            if (leadOutPart.Any())
            {
                tmp.AddRange(leadOutPart);
            }

            return(tmp);
        }
Example #11
0
 private void SetDrawPoint2(CanvasControl canvas, IDrawData data, PointerRoutedEventArgs e) => data.Point2 = DrawPoint(canvas, e);