using PaintDotNet.Annotation.Enum; using PaintDotNet.Base.CommTool; using PaintDotNet.Base.SettingModel; using System; using System.Collections.Generic; using System.Drawing; using System.Drawing.Drawing2D; using System.Globalization; using System.IO; using System.Linq; using System.Runtime.Serialization; using System.Windows.Forms; using System.Xml; namespace PaintDotNet.Annotation.Label { using PointList = List; /// /// 标注->工字线 /// public class DrawWorkType : DrawObject { private static Cursor handleCursor = new Cursor(PdnResources.GetResourceStream("Cursors.AnnotationPolyHandle.cur")); /// /// 标注样式信息model /// public WorkTypeStyleModel labelWorkTypeStyleMode; /// /// 点集合 /// public PointList pointArray; public double unitLength = 1; private string unit = "μm"; public DrawWorkType(ISurfaceBox surfaceBox) : base() { this.objectType = DrawClass.Label; this.drawToolType = DrawToolType.DrawWorkType; pointArray = new PointList(); textboxMessage = ""; Initialize(); } public DrawWorkType(ISurfaceBox surfaceBox, int x, int y) : base() { this.objectType = DrawClass.Label; this.drawToolType = DrawToolType.DrawWorkType; labelWorkTypeStyleMode = surfaceBox.GetWorkTypeStyleModel(); pointArray = new PointList(); startPoint = new PointF(x, y); pointArray.Add(startPoint); textboxMessage = ""; Initialize(); } public DrawWorkType(ISurfaceBox surfaceBox, List points, ParentStyleModel parentStyleModel, Object content) : base() { this.objectType = DrawClass.Label; this.drawToolType = DrawToolType.DrawWorkType; this.ISurfaceBox = surfaceBox; labelWorkTypeStyleMode = (WorkTypeStyleModel)parentStyleModel; pointArray = points; textboxMessage = content.ToString(); } /// /// Clone this instance /// public override DrawObject Clone() { DrawWorkType newWorkType = new DrawWorkType(ISurfaceBox); newWorkType.objectType = DrawClass.Label; newWorkType.drawToolType = DrawToolType.DrawWorkType; newWorkType.ISurfaceBox = this.ISurfaceBox; newWorkType.pointArray = this.pointArray; newWorkType.rectangle = this.rectangle; newWorkType.textboxMessage = this.textboxMessage; newWorkType.labelWorkTypeStyleMode = this.labelWorkTypeStyleMode; FillDrawObjectFields(newWorkType); return newWorkType; } public override DrawObject Clone(ISurfaceBox surfaceBox) { DrawWorkType newWorkType = new DrawWorkType(surfaceBox); newWorkType.objectType = DrawClass.Label; newWorkType.drawToolType = DrawToolType.DrawWorkType; newWorkType.ISurfaceBox = surfaceBox; newWorkType.pointArray = this.pointArray; newWorkType.rectangle = this.rectangle; newWorkType.textboxMessage = this.textboxMessage; newWorkType.labelWorkTypeStyleMode = this.labelWorkTypeStyleMode; FillDrawObjectFields(newWorkType); return newWorkType; } public override void Draw(Graphics g) { //辅助线样式 Pen guideLinePen = new Pen(Color.FromArgb(labelWorkTypeStyleMode.guideColour), labelWorkTypeStyleMode.guideLineWidth); //测量线样式 Pen measureLinePen = new Pen(Color.FromArgb(labelWorkTypeStyleMode.measureColour), labelWorkTypeStyleMode.measureLineWidth); //测量内容样式 Font textfont = new Font(this.labelWorkTypeStyleMode.font, this.labelWorkTypeStyleMode.fontSize); Brush textbrush = new SolidBrush(Color.FromArgb(this.labelWorkTypeStyleMode.fontColour)); //连接线样式 Pen connectLinePen = new Pen(Color.FromArgb(labelWorkTypeStyleMode.connectColour), labelWorkTypeStyleMode.connectLineWidth); g.SmoothingMode = SmoothingMode.AntiAlias; if (pointArray.Count == 2) { g.DrawLine(guideLinePen, pointArray[0].X, pointArray[0].Y, pointArray[1].X, pointArray[1].Y); } if (textboxMessage != "" && textboxMessage != null)//如果工字线距离的值已经有了 { //算第一条线的中心店 if (pointArray.Count < 3) { pointArray.Add(new PointF((pointArray[0].X + pointArray[1].X) / 2, (pointArray[0].Y + pointArray[1].Y) / 2)); } else { pointArray[2] = new PointF((pointArray[0].X + pointArray[1].X) / 2, (pointArray[0].Y + pointArray[1].Y) / 2); } ISurfaceBox.getMeasureInfo().TryGetValue(MeasurementUnit.Micron,out unitLength); this.labelWorkTypeStyleMode.distance = double.Parse(textboxMessage.ToString()); double measureLineEnterLength = double.Parse(textboxMessage.ToString()) / unitLength;//获取输入的距离值 //按路径和名称保存xml文件 string workTypeXml = XmlSerializeHelper.XmlSerialize(this.labelWorkTypeStyleMode); //xml保存路径 string filePath = Application.StartupPath + "\\Config\\Default \\WorkType\\Default" + ".xml"; //保存xml FileOperationHelper.WriteStringToFile(workTypeXml, filePath, FileMode.Create); PointF a = pointArray[0]; PointF b = pointArray[2]; PointF measureLinePoint = new PointF(); double ratioXY = Math.Abs((double)(pointArray[1].X - pointArray[0].X)) / Math.Abs((double)(pointArray[1].Y - pointArray[0].Y));//xy比率 double relativeY = judgeP.Y - pointArray[0].Y;//Y轴相对长度 int relativeX = (int)(relativeY * ratioXY);//X轴相对长度 int x = 0; //与第一条线垂直方向横坐标位置 //判断第三点所在象限位置,决定 + OR - X轴相对长度 结束点减起始点大于0 2、3象限,否则1、4象限 if ((double)(pointArray[1].Y - pointArray[0].Y) > 0) { //判断第三点相对Y轴角度,如果大于直线相对Y轴角度则减去X轴相对长度,否则加上 if ((double)(judgeP.X - pointArray[0].X) / (double)(judgeP.Y - pointArray[0].Y) > (double)(pointArray[1].X - pointArray[0].X) / (double)(pointArray[1].Y - pointArray[0].Y)) { x = judgeP.X - relativeX; } else { x = judgeP.X + relativeX; } } else { if ((double)(judgeP.X - pointArray[0].X) / (double)(judgeP.Y - pointArray[0].Y) > (double)(pointArray[1].X - pointArray[0].X) / (double)(pointArray[1].Y - pointArray[0].Y)) { x = judgeP.X + relativeX; } else { x = judgeP.X - relativeX; } } //计算测量线的另一个点 if (x > judgeP.X) { measureLinePoint.X = Convert.ToInt32(b.X + (measureLineEnterLength * (a.Y - b.Y)) / Math.Sqrt(((a.X - b.X) * (a.X - b.X)) + ((a.Y - b.Y) * (a.Y - b.Y)))); measureLinePoint.Y = Convert.ToInt32(b.Y - (measureLineEnterLength * (a.X - b.X)) / Math.Sqrt(((a.X - b.X) * (a.X - b.X)) + ((a.Y - b.Y) * (a.Y - b.Y)))); } else { measureLinePoint.X = Convert.ToInt32(b.X - (measureLineEnterLength * (a.Y - b.Y)) / Math.Sqrt(((a.X - b.X) * (a.X - b.X)) + ((a.Y - b.Y) * (a.Y - b.Y)))); measureLinePoint.Y = Convert.ToInt32(b.Y + (measureLineEnterLength * (a.X - b.X)) / Math.Sqrt(((a.X - b.X) * (a.X - b.X)) + ((a.Y - b.Y) * (a.Y - b.Y)))); } if (pointArray.Count < 4) { pointArray.Add(measureLinePoint); } else { pointArray[3] = measureLinePoint; } double countLength = (Math.Sqrt((pointArray[1].X - pointArray[0].X) * (pointArray[1].X - pointArray[0].X) + (pointArray[1].Y - pointArray[0].Y) * (pointArray[1].Y - pointArray[0].Y))) / 2; //通过测量线两点之间的偏移值,计算辅助线和连接线对应的点 float registX = pointArray[3].X - pointArray[2].X;//横坐标偏移距离 float registY = pointArray[3].Y - pointArray[2].Y;//纵坐标偏移距离 PointF connectLinePoint1 = new PointF(pointArray[0].X + registX, pointArray[0].Y + registY); PointF connectLinePoint2 = new PointF(pointArray[1].X + registX, pointArray[1].Y + registY); if (pointArray.Count < 5) { pointArray.Add(connectLinePoint1); } else { pointArray[4] = connectLinePoint1; } if (pointArray.Count < 6) { pointArray.Add(connectLinePoint2); } else { pointArray[5] = connectLinePoint2; } //算外圈的矩形尺寸 float[] pointX = new float[] { pointArray[0].X, pointArray[1].X, pointArray[4].X, pointArray[5].X }; rectangle.X = pointX.Min(); float[] pointY = new float[] { pointArray[0].Y, pointArray[1].Y, pointArray[4].Y, pointArray[5].Y }; rectangle.Y = pointY.Min(); rectangle.Width = pointX.Max() - pointX.Min(); rectangle.Height = pointY.Max() - pointY.Min(); double measureLineCountLength = Math.Sqrt((pointArray[2].X - pointArray[3].X) * (pointArray[2].X - pointArray[3].X) + (pointArray[2].Y - pointArray[3].Y) * (pointArray[2].Y - pointArray[3].Y)); string workMessage = ""; int isGuideLineShow = labelWorkTypeStyleMode.guideShowFlag;//辅助线是否显示 if (isGuideLineShow == 1) { //显示 g.DrawLine(guideLinePen, pointArray[0].X, pointArray[0].Y, pointArray[1].X, pointArray[1].Y); } int isMeasureRangeShow = labelWorkTypeStyleMode.measureRangeShowFlag;//测量线距离是否显示 if (isMeasureRangeShow == 1) { //显示 workMessage += "距离: " + double.Parse(textboxMessage.ToString()) + unit + "\r\n"; //workMessage += "距离: " + Math.Floor(measureLineCountLength) + unit + "\r\n"; } int isMeasureLengthShow = labelWorkTypeStyleMode.measureLengthShowFlag;//测量线长度是否显示 if (isMeasureLengthShow == 1) { //显示 workMessage += "长度:" + Math.Round(countLength * 2, 2) + unit; } int isConnectShow = labelWorkTypeStyleMode.connectShowFlag;//连接线是否显示 if (isConnectShow == 1) { //显示 g.DrawLine(connectLinePen, pointArray[4].X, pointArray[4].Y, pointArray[5].X, pointArray[5].Y); } SizeF fontSize = g.MeasureString(workMessage, textfont);//获取字符串对应的矩形尺寸 RectangleF workRec = new RectangleF(); workRec.X = (pointArray[2].X + pointArray[3].X) / 2; workRec.Y = (pointArray[2].Y + pointArray[3].Y) / 2; workRec.Width = fontSize.Width; workRec.Height = fontSize.Height; g.DrawLine(measureLinePen, pointArray[2].X, pointArray[2].Y, pointArray[3].X, pointArray[3].Y); g.DrawString(workMessage, textfont, textbrush, workRec); } guideLinePen.Dispose(); measureLinePen.Dispose(); textbrush.Dispose(); connectLinePen.Dispose(); } public override int HandleCount { get { return 2; } } /// /// Get handle pointscroll by 1-based number /// /// /// public override PointF GetHandle(int handleNumber) { PointF newPoint = new PointF(); switch (handleNumber) { case 1: newPoint.X = pointArray[0].X; newPoint.Y = pointArray[0].Y; break; case 2: newPoint.X = pointArray[1].X; newPoint.Y = pointArray[1].Y; break; } return newPoint; } /// /// Hit test. /// Return value: -1 - no hit /// 0 - hit anywhere /// > 1 - handle number /// /// /// public override int HitTest(Point point) { if (Selected) { for (int i = 1; i <= HandleCount; i++) { if (GetHandleRectangle(i).Contains(point)) return i; } } if (PointInObject(point)) return 0; return -1; } protected override bool PointInObject(Point point) { return rectangle.Contains(point); } public override bool IntersectsWith(Rectangle rectangle) { return Rectangle.IntersectsWith(rectangle); } public override Cursor GetHandleCursor(int handleNumber) { return Cursors.Default; } public override void MoveHandleTo(Point point, int handleNumber) { if (handleNumber < 3) { pointArray[handleNumber - 1] = point; } } public override void Move(int deltaX, int deltaY) { for (int i = 0; i < pointArray.Count; i++) { pointArray[i] = new PointF(pointArray[i].X + ISurfaceBox.UnscaleScalar(deltaX), pointArray[i].Y + ISurfaceBox.UnscaleScalar(deltaY)); } judgeP.X = judgeP.X + ISurfaceBox.UnscaleScalar(deltaX); judgeP.Y = judgeP.Y + ISurfaceBox.UnscaleScalar(deltaY); rectangle.X += deltaX; rectangle.Y += deltaY; } public override void DrawTracker(Graphics g) { if (!Selected) return; if (pointArray.Count > 1) { SolidBrush brush = new SolidBrush(Color.Black); for (int i = 1; i <= HandleCount; i++) { g.FillRectangle(brush, GetHandleRectangle(i)); } brush.Dispose(); RectangleF r = GetBoundingBox(); g.DrawRectangle(new Pen(Color.White), r.X, r.Y, r.Width, r.Height); } } public override RectangleF GetBoundingBox() { return rectangle; } internal void setNextPoint(PointF p) { AddPoint(p); } public void AddPoint(PointF point) { pointArray.Add(point); } public override List GetPoints() { return pointArray; } public override ParentStyleModel GetStyle() { return labelWorkTypeStyleMode; } public override string GetContent() { return textboxMessage; } } }