/// <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)); }
/// <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)); }
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); }
/// <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); }
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)); } }
/// <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); } }
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; } } } } }
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; } } } } }
public void addDrawData(IDrawData drawData) { }
//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); }
private void SetDrawPoint2(CanvasControl canvas, IDrawData data, PointerRoutedEventArgs e) => data.Point2 = DrawPoint(canvas, e);