DrawWorkType.cs 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424
  1. using PaintDotNet.Annotation.Enum;
  2. using PaintDotNet.Base.CommTool;
  3. using PaintDotNet.Base.SettingModel;
  4. using System;
  5. using System.Collections.Generic;
  6. using System.Drawing;
  7. using System.Drawing.Drawing2D;
  8. using System.Globalization;
  9. using System.IO;
  10. using System.Linq;
  11. using System.Runtime.Serialization;
  12. using System.Windows.Forms;
  13. using System.Xml;
  14. namespace PaintDotNet.Annotation.Label
  15. {
  16. using PointList = List<PointF>;
  17. /// <summary>
  18. /// 标注->工字线
  19. /// </summary>
  20. public class DrawWorkType : DrawObject
  21. {
  22. private static Cursor handleCursor = new Cursor(PdnResources.GetResourceStream("Cursors.AnnotationPolyHandle.cur"));
  23. /// <summary>
  24. /// 标注样式信息model
  25. /// </summary>
  26. public WorkTypeStyleModel labelWorkTypeStyleMode;
  27. /// <summary>
  28. /// 点集合
  29. /// </summary>
  30. public PointList pointArray;
  31. public double unitLength = 1;
  32. private string unit = "μm";
  33. public DrawWorkType(ISurfaceBox surfaceBox) : base()
  34. {
  35. this.objectType = DrawClass.Label;
  36. this.drawToolType = DrawToolType.DrawWorkType;
  37. pointArray = new PointList();
  38. textboxMessage = "";
  39. Initialize();
  40. }
  41. public DrawWorkType(ISurfaceBox surfaceBox, int x, int y) : base()
  42. {
  43. this.objectType = DrawClass.Label;
  44. this.drawToolType = DrawToolType.DrawWorkType;
  45. labelWorkTypeStyleMode = surfaceBox.GetWorkTypeStyleModel();
  46. pointArray = new PointList();
  47. startPoint = new PointF(x, y);
  48. pointArray.Add(startPoint);
  49. textboxMessage = "";
  50. Initialize();
  51. }
  52. public DrawWorkType(ISurfaceBox surfaceBox, List<PointF> points, ParentStyleModel parentStyleModel, Object content) : base()
  53. {
  54. this.objectType = DrawClass.Label;
  55. this.drawToolType = DrawToolType.DrawWorkType;
  56. this.ISurfaceBox = surfaceBox;
  57. labelWorkTypeStyleMode = (WorkTypeStyleModel)parentStyleModel;
  58. pointArray = points;
  59. textboxMessage = content.ToString();
  60. }
  61. /// <summary>
  62. /// Clone this instance
  63. /// </summary>
  64. public override DrawObject Clone()
  65. {
  66. DrawWorkType newWorkType = new DrawWorkType(ISurfaceBox);
  67. newWorkType.objectType = DrawClass.Label;
  68. newWorkType.drawToolType = DrawToolType.DrawWorkType;
  69. newWorkType.ISurfaceBox = this.ISurfaceBox;
  70. newWorkType.pointArray = this.pointArray;
  71. newWorkType.rectangle = this.rectangle;
  72. newWorkType.textboxMessage = this.textboxMessage;
  73. newWorkType.labelWorkTypeStyleMode = this.labelWorkTypeStyleMode;
  74. FillDrawObjectFields(newWorkType);
  75. return newWorkType;
  76. }
  77. public override DrawObject Clone(ISurfaceBox surfaceBox)
  78. {
  79. DrawWorkType newWorkType = new DrawWorkType(surfaceBox);
  80. newWorkType.objectType = DrawClass.Label;
  81. newWorkType.drawToolType = DrawToolType.DrawWorkType;
  82. newWorkType.ISurfaceBox = surfaceBox;
  83. newWorkType.pointArray = this.pointArray;
  84. newWorkType.rectangle = this.rectangle;
  85. newWorkType.textboxMessage = this.textboxMessage;
  86. newWorkType.labelWorkTypeStyleMode = this.labelWorkTypeStyleMode;
  87. FillDrawObjectFields(newWorkType);
  88. return newWorkType;
  89. }
  90. public override void Draw(Graphics g)
  91. {
  92. //辅助线样式
  93. Pen guideLinePen = new Pen(Color.FromArgb(labelWorkTypeStyleMode.guideColour), labelWorkTypeStyleMode.guideLineWidth);
  94. //测量线样式
  95. Pen measureLinePen = new Pen(Color.FromArgb(labelWorkTypeStyleMode.measureColour), labelWorkTypeStyleMode.measureLineWidth);
  96. //测量内容样式
  97. Font textfont = new Font(this.labelWorkTypeStyleMode.font, this.labelWorkTypeStyleMode.fontSize);
  98. Brush textbrush = new SolidBrush(Color.FromArgb(this.labelWorkTypeStyleMode.fontColour));
  99. //连接线样式
  100. Pen connectLinePen = new Pen(Color.FromArgb(labelWorkTypeStyleMode.connectColour), labelWorkTypeStyleMode.connectLineWidth);
  101. g.SmoothingMode = SmoothingMode.AntiAlias;
  102. if (pointArray.Count == 2)
  103. {
  104. g.DrawLine(guideLinePen, pointArray[0].X, pointArray[0].Y, pointArray[1].X, pointArray[1].Y);
  105. }
  106. if (textboxMessage != "" && textboxMessage != null)//如果工字线距离的值已经有了
  107. {
  108. //算第一条线的中心店
  109. if (pointArray.Count < 3)
  110. {
  111. pointArray.Add(new PointF((pointArray[0].X + pointArray[1].X) / 2, (pointArray[0].Y + pointArray[1].Y) / 2));
  112. }
  113. else
  114. {
  115. pointArray[2] = new PointF((pointArray[0].X + pointArray[1].X) / 2, (pointArray[0].Y + pointArray[1].Y) / 2);
  116. }
  117. ISurfaceBox.getMeasureInfo().TryGetValue(MeasurementUnit.Micron,out unitLength);
  118. this.labelWorkTypeStyleMode.distance = double.Parse(textboxMessage.ToString());
  119. double measureLineEnterLength = double.Parse(textboxMessage.ToString()) / unitLength;//获取输入的距离值
  120. //按路径和名称保存xml文件
  121. string workTypeXml = XmlSerializeHelper.XmlSerialize<WorkTypeStyleModel>(this.labelWorkTypeStyleMode);
  122. //xml保存路径
  123. string filePath = Application.StartupPath + "\\Config\\Default \\WorkType\\Default" + ".xml";
  124. //保存xml
  125. FileOperationHelper.WriteStringToFile(workTypeXml, filePath, FileMode.Create);
  126. PointF a = pointArray[0];
  127. PointF b = pointArray[2];
  128. PointF measureLinePoint = new PointF();
  129. double ratioXY = Math.Abs((double)(pointArray[1].X - pointArray[0].X)) / Math.Abs((double)(pointArray[1].Y - pointArray[0].Y));//xy比率
  130. double relativeY = judgeP.Y - pointArray[0].Y;//Y轴相对长度
  131. int relativeX = (int)(relativeY * ratioXY);//X轴相对长度
  132. int x = 0; //与第一条线垂直方向横坐标位置
  133. //判断第三点所在象限位置,决定 + OR - X轴相对长度 结束点减起始点大于0 2、3象限,否则1、4象限
  134. if ((double)(pointArray[1].Y - pointArray[0].Y) > 0)
  135. {
  136. //判断第三点相对Y轴角度,如果大于直线相对Y轴角度则减去X轴相对长度,否则加上
  137. 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))
  138. {
  139. x = judgeP.X - relativeX;
  140. }
  141. else
  142. {
  143. x = judgeP.X + relativeX;
  144. }
  145. }
  146. else
  147. {
  148. 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))
  149. {
  150. x = judgeP.X + relativeX;
  151. }
  152. else
  153. {
  154. x = judgeP.X - relativeX;
  155. }
  156. }
  157. //计算测量线的另一个点
  158. if (x > judgeP.X)
  159. {
  160. 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))));
  161. 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))));
  162. }
  163. else
  164. {
  165. 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))));
  166. 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))));
  167. }
  168. if (pointArray.Count < 4)
  169. {
  170. pointArray.Add(measureLinePoint);
  171. }
  172. else
  173. {
  174. pointArray[3] = measureLinePoint;
  175. }
  176. 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;
  177. //通过测量线两点之间的偏移值,计算辅助线和连接线对应的点
  178. float registX = pointArray[3].X - pointArray[2].X;//横坐标偏移距离
  179. float registY = pointArray[3].Y - pointArray[2].Y;//纵坐标偏移距离
  180. PointF connectLinePoint1 = new PointF(pointArray[0].X + registX, pointArray[0].Y + registY);
  181. PointF connectLinePoint2 = new PointF(pointArray[1].X + registX, pointArray[1].Y + registY);
  182. if (pointArray.Count < 5)
  183. {
  184. pointArray.Add(connectLinePoint1);
  185. }
  186. else
  187. {
  188. pointArray[4] = connectLinePoint1;
  189. }
  190. if (pointArray.Count < 6)
  191. {
  192. pointArray.Add(connectLinePoint2);
  193. }
  194. else
  195. {
  196. pointArray[5] = connectLinePoint2;
  197. }
  198. //算外圈的矩形尺寸
  199. float[] pointX = new float[] { pointArray[0].X, pointArray[1].X, pointArray[4].X, pointArray[5].X };
  200. rectangle.X = pointX.Min();
  201. float[] pointY = new float[] { pointArray[0].Y, pointArray[1].Y, pointArray[4].Y, pointArray[5].Y };
  202. rectangle.Y = pointY.Min();
  203. rectangle.Width = pointX.Max() - pointX.Min();
  204. rectangle.Height = pointY.Max() - pointY.Min();
  205. 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));
  206. string workMessage = "";
  207. int isGuideLineShow = labelWorkTypeStyleMode.guideShowFlag;//辅助线是否显示
  208. if (isGuideLineShow == 1)
  209. {
  210. //显示
  211. g.DrawLine(guideLinePen, pointArray[0].X, pointArray[0].Y, pointArray[1].X, pointArray[1].Y);
  212. }
  213. int isMeasureRangeShow = labelWorkTypeStyleMode.measureRangeShowFlag;//测量线距离是否显示
  214. if (isMeasureRangeShow == 1)
  215. {
  216. //显示
  217. workMessage += "距离: " + double.Parse(textboxMessage.ToString()) + unit + "\r\n";
  218. //workMessage += "距离: " + Math.Floor(measureLineCountLength) + unit + "\r\n";
  219. }
  220. int isMeasureLengthShow = labelWorkTypeStyleMode.measureLengthShowFlag;//测量线长度是否显示
  221. if (isMeasureLengthShow == 1)
  222. {
  223. //显示
  224. workMessage += "长度:" + Math.Round(countLength * 2, 2) + unit;
  225. }
  226. int isConnectShow = labelWorkTypeStyleMode.connectShowFlag;//连接线是否显示
  227. if (isConnectShow == 1)
  228. {
  229. //显示
  230. g.DrawLine(connectLinePen, pointArray[4].X, pointArray[4].Y, pointArray[5].X, pointArray[5].Y);
  231. }
  232. SizeF fontSize = g.MeasureString(workMessage, textfont);//获取字符串对应的矩形尺寸
  233. RectangleF workRec = new RectangleF();
  234. workRec.X = (pointArray[2].X + pointArray[3].X) / 2;
  235. workRec.Y = (pointArray[2].Y + pointArray[3].Y) / 2;
  236. workRec.Width = fontSize.Width;
  237. workRec.Height = fontSize.Height;
  238. g.DrawLine(measureLinePen, pointArray[2].X, pointArray[2].Y, pointArray[3].X, pointArray[3].Y);
  239. g.DrawString(workMessage, textfont, textbrush, workRec);
  240. }
  241. guideLinePen.Dispose();
  242. measureLinePen.Dispose();
  243. textbrush.Dispose();
  244. connectLinePen.Dispose();
  245. }
  246. public override int HandleCount
  247. {
  248. get
  249. {
  250. return 2;
  251. }
  252. }
  253. /// <summary>
  254. /// Get handle pointscroll by 1-based number
  255. /// </summary>
  256. /// <param name="handleNumber"></param>
  257. /// <returns></returns>
  258. public override PointF GetHandle(int handleNumber)
  259. {
  260. PointF newPoint = new PointF();
  261. switch (handleNumber)
  262. {
  263. case 1:
  264. newPoint.X = pointArray[0].X;
  265. newPoint.Y = pointArray[0].Y;
  266. break;
  267. case 2:
  268. newPoint.X = pointArray[1].X;
  269. newPoint.Y = pointArray[1].Y;
  270. break;
  271. }
  272. return newPoint;
  273. }
  274. /// <summary>
  275. /// Hit test.
  276. /// Return value: -1 - no hit
  277. /// 0 - hit anywhere
  278. /// > 1 - handle number
  279. /// </summary>
  280. /// <param name="pointscroll"></param>
  281. /// <returns></returns>
  282. public override int HitTest(Point point)
  283. {
  284. if (Selected)
  285. {
  286. for (int i = 1; i <= HandleCount; i++)
  287. {
  288. if (GetHandleRectangle(i).Contains(point))
  289. return i;
  290. }
  291. }
  292. if (PointInObject(point))
  293. return 0;
  294. return -1;
  295. }
  296. protected override bool PointInObject(Point point)
  297. {
  298. return rectangle.Contains(point);
  299. }
  300. public override bool IntersectsWith(Rectangle rectangle)
  301. {
  302. return Rectangle.IntersectsWith(rectangle);
  303. }
  304. public override Cursor GetHandleCursor(int handleNumber)
  305. {
  306. return Cursors.Default;
  307. }
  308. public override void MoveHandleTo(Point point, int handleNumber)
  309. {
  310. if (handleNumber < 3)
  311. {
  312. pointArray[handleNumber - 1] = point;
  313. }
  314. }
  315. public override void Move(int deltaX, int deltaY)
  316. {
  317. for (int i = 0; i < pointArray.Count; i++)
  318. {
  319. pointArray[i] = new PointF(pointArray[i].X + ISurfaceBox.UnscaleScalar(deltaX), pointArray[i].Y + ISurfaceBox.UnscaleScalar(deltaY));
  320. }
  321. judgeP.X = judgeP.X + ISurfaceBox.UnscaleScalar(deltaX);
  322. judgeP.Y = judgeP.Y + ISurfaceBox.UnscaleScalar(deltaY);
  323. rectangle.X += deltaX;
  324. rectangle.Y += deltaY;
  325. }
  326. public override void DrawTracker(Graphics g)
  327. {
  328. if (!Selected)
  329. return;
  330. if (pointArray.Count > 1)
  331. {
  332. SolidBrush brush = new SolidBrush(Color.Black);
  333. for (int i = 1; i <= HandleCount; i++)
  334. {
  335. g.FillRectangle(brush, GetHandleRectangle(i));
  336. }
  337. brush.Dispose();
  338. RectangleF r = GetBoundingBox();
  339. g.DrawRectangle(new Pen(Color.White), r.X, r.Y, r.Width, r.Height);
  340. }
  341. }
  342. public override RectangleF GetBoundingBox()
  343. {
  344. return rectangle;
  345. }
  346. internal void setNextPoint(PointF p)
  347. {
  348. AddPoint(p);
  349. }
  350. public void AddPoint(PointF point)
  351. {
  352. pointArray.Add(point);
  353. }
  354. public override List<PointF> GetPoints()
  355. {
  356. return pointArray;
  357. }
  358. public override ParentStyleModel GetStyle()
  359. {
  360. return labelWorkTypeStyleMode;
  361. }
  362. public override string GetContent()
  363. {
  364. return textboxMessage;
  365. }
  366. }
  367. }