123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424 |
- 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<PointF>;
- /// <summary>
- /// 标注->工字线
- /// </summary>
- public class DrawWorkType : DrawObject
- {
- private static Cursor handleCursor = new Cursor(PdnResources.GetResourceStream("Cursors.AnnotationPolyHandle.cur"));
- /// <summary>
- /// 标注样式信息model
- /// </summary>
- public WorkTypeStyleModel labelWorkTypeStyleMode;
- /// <summary>
- /// 点集合
- /// </summary>
- 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<PointF> 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();
- }
- /// <summary>
- /// Clone this instance
- /// </summary>
- 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<WorkTypeStyleModel>(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;
- }
- }
- /// <summary>
- /// Get handle pointscroll by 1-based number
- /// </summary>
- /// <param name="handleNumber"></param>
- /// <returns></returns>
- 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;
- }
- /// <summary>
- /// Hit test.
- /// Return value: -1 - no hit
- /// 0 - hit anywhere
- /// > 1 - handle number
- /// </summary>
- /// <param name="pointscroll"></param>
- /// <returns></returns>
- 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<PointF> GetPoints()
- {
- return pointArray;
- }
- public override ParentStyleModel GetStyle()
- {
- return labelWorkTypeStyleMode;
- }
- public override string GetContent()
- {
- return textboxMessage;
- }
- }
- }
|