DisplayField.cs 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273
  1. using OTSIncAReportApp.DataOperation.Model;
  2. using OTSIncAReportGraph.Class;
  3. using System;
  4. using System.Collections.Generic;
  5. using System.Drawing;
  6. using System.Drawing.Drawing2D;
  7. using System.Linq;
  8. using System.Text;
  9. using System.Threading.Tasks;
  10. using System.Windows.Forms;
  11. namespace OTSIncAReportGraph
  12. {
  13. /// <summary>
  14. /// 包含DParticle类的field类,目前只用于绘制背景色,按理说应该有更多的作用,比如做多线程分式运算
  15. /// </summary>
  16. public class DisplayField : BaseObject
  17. {
  18. Guid m_id;
  19. string m_tagid;
  20. string m_fieldid;
  21. bool m_IsDragging;
  22. Color m_backcolor;
  23. List<DisplayParticle> m_list_dparticle;
  24. List<DisplayParticle> m_list_Useparticle;
  25. PointF m_ots_point; //按底层设计结构,底层返回的物理坐标位置及大小,OTS坐标大小
  26. RectangleF m_pix_rect; //与底层返回物理坐标及位置大小对应转换成,pixel像素分率下的坐标位置大小
  27. RectangleF m_show_rect;//最后换算到在显示器上显示的坐标位置大小
  28. RectangleF m_current_rect;//当前field在显示器上显示的坐标位置大小
  29. PointF m_dragingpoint;//鼠标拖动的位置
  30. //private string m_GBContent;
  31. private PointF m_OTSPointF;
  32. private bool m_IsSelect;
  33. private Color m_color;
  34. private GraphicsPath m_GPath;
  35. /// <summary>
  36. /// 构造函数
  37. /// </summary>
  38. public DisplayField(Field fld, int fldwidth, int fldheight,Point screenPos)
  39. {
  40. m_list_dparticle = new List<DisplayParticle>();
  41. m_list_Useparticle = new List<DisplayParticle>();
  42. m_id = System.Guid.NewGuid();
  43. Point thisfield_point = new Point() { X = fld.FieldPosX, Y = fld.FieldPosY };
  44. FieldID = fld.FieldID.ToString();
  45. Show_Rect = new Rectangle(screenPos, new Size(fldwidth, fldheight));
  46. Current_Rect = new Rectangle(screenPos, new Size(fldwidth, fldheight));
  47. OTSCoordinatePos = new PointF(thisfield_point.X, thisfield_point.Y);
  48. //先获取该Field中的所有Particle
  49. List<Particle> list_particle;
  50. list_particle = fld.ParticleList;
  51. //然后将取出的数据,转换成Bitmap对象
  52. Bitmap fieldbitmap = DrawFunction.ReadImageFile(fld.FieldImage);
  53. //再循环计算所有的Particle对象
  54. foreach (Particle particle in list_particle)
  55. {
  56. //创建DParticle颗粒
  57. DisplayParticle dp = new DisplayParticle(particle);
  58. List<Segment> list_seg;
  59. list_seg = particle.SegmentList;
  60. //创建颗粒分布图对应的类对象
  61. List<DisplaySegment> list_dsegment = new List<DisplaySegment>();
  62. //再循环取出里面所有的segment
  63. foreach (Segment seg in list_seg)
  64. {
  65. #region 创建DSegment对象,并将STD分析出的化合物颜色保存到DSegment对象中
  66. //对Particle里的Segment进行偏移的计算等,创建了DSegment的大小
  67. DisplaySegment ds = new DisplaySegment();
  68. ds.Rect = new Rectangle(seg.Start + screenPos.X,
  69. //i_field_height - ls_cotssegmentclr.GetHeight() + offset_point.Y,//这是让单个Field的图像按Y轴反过来
  70. seg.Height + screenPos.Y,
  71. seg.Length,
  72. 1);
  73. ds.Color = dp.Color;//将线的颜色对应到颗粒的颜色
  74. #endregion
  75. #region //这里是在Field中,抠取出原BSE图像到DSegment中--------------------------------
  76. //ls_bt.RotateFlip(RotateFlipType.Rotate180FlipX);//使用系统带的图像处理方法,进行Y轴的翻转,与上面记录位置对应
  77. //合成图像完成,开始抠取像素-----------------------------------------------------------------
  78. int f_length = seg.Length;
  79. List<Color> ls_list_colors = new List<Color>();
  80. for (int m = 0; m < f_length; m++)
  81. {
  82. //这里实现一下代码保护
  83. int lsjs_x = seg.Start + m;
  84. //int lsjs_y = i_field_height - ls_cotssegmentclr.GetHeight();//这个反转要与上面对应
  85. int lsjs_y = seg.Height;
  86. //if (lsjs_x < 0)
  87. // lsjs_x = 0;
  88. //if (lsjs_x >= fieldwidth)
  89. // lsjs_x = fieldwidth - 1;
  90. //if (lsjs_y < 0)
  91. // lsjs_y = 0;
  92. //if (lsjs_y >= fieldheight)
  93. // lsjs_y = fieldheight - 1;
  94. //按理说这里应该加上个横向抠取像素颜色,这里需要再处理一下
  95. ls_list_colors.Add(fieldbitmap.GetPixel(lsjs_x,
  96. lsjs_y));
  97. }
  98. //保存原BSE图中的颜色列表
  99. ds.List_Colors = ls_list_colors;
  100. #endregion //------------------------------------------------------------------------------
  101. list_dsegment.Add(ds);
  102. }
  103. //设置Particle在0.5F倍数以上时才进行显示
  104. //dp.Zoom_DisPlayThreshold = 0.5f;
  105. //dp.Zoom_DisPlay = true;
  106. dp.displayState = DisplayState.NORMALDISPLAY;
  107. //将segment对应的设置到particle中
  108. dp.DSegments = list_dsegment;
  109. //并对DParticle相关信息进行计算
  110. dp.Rect = dp.GetRectFromDSegment();
  111. dp.GPath = dp.GetRegionFromDSegments();
  112. dp.SmallRect = dp.GetSmallRectangleFromRect();
  113. //将每个颗粒添加到颗粒分布图中的列表中
  114. m_list_dparticle.Add(dp);
  115. if (dp.XRayId > -1)
  116. {
  117. m_list_Useparticle.Add(dp);
  118. }
  119. }
  120. }
  121. public DisplayField(List<DisplayParticle> in_list_dparticle)
  122. {
  123. m_list_dparticle = in_list_dparticle;
  124. }
  125. public override Guid guid { get => m_id; set => m_id = value; }
  126. /// <summary>
  127. /// 记录与底层对应的TagID
  128. /// </summary>
  129. public string TagID
  130. {
  131. get { return m_tagid; }
  132. set { m_tagid = value; }
  133. }
  134. /// <summary>
  135. /// 是否被拖动标识
  136. /// </summary>
  137. public override bool IsDragging { get => m_IsDragging; set => m_IsDragging = value; }
  138. /// <summary>
  139. /// 被拖动到的位置坐标
  140. /// </summary>
  141. public override PointF DraggingPoint { get => m_dragingpoint; set => m_dragingpoint = value; }
  142. /// <summary>
  143. /// 与底层对应的ID,这里叫成FieldID
  144. /// </summary>
  145. public string FieldID
  146. {
  147. get { return m_fieldid; }
  148. set { m_fieldid = value; }
  149. }
  150. public override Color BackColor { get => m_backcolor; set => m_backcolor = value; }
  151. /// <summary>
  152. /// 包含的Particle列表
  153. /// </summary>
  154. public List<DisplayParticle> List_DParticle
  155. {
  156. get { return m_list_dparticle; }
  157. set { m_list_dparticle = value; }
  158. }
  159. public List<DisplayParticle> List_Useparticle
  160. {
  161. get { return m_list_Useparticle; }
  162. set { m_list_Useparticle = value; }
  163. }
  164. /// <summary>
  165. /// 该Field的OTS坐标及大小
  166. /// </summary>
  167. public PointF OTSCoordinatePos
  168. {
  169. get { return m_ots_point; }
  170. set { m_ots_point = value; }
  171. }
  172. /// <summary>
  173. /// 该Field物理坐标大小转换出,对应的像素坐标及大小
  174. /// </summary>
  175. public RectangleF Pix_Rect
  176. {
  177. get { return m_pix_rect; }
  178. set { m_pix_rect = value; }
  179. }
  180. /// <summary>
  181. /// 该Field最后在屏幕上显示的坐标及大小
  182. /// </summary>
  183. public RectangleF Show_Rect
  184. {
  185. get { return m_show_rect; }
  186. set { m_show_rect = value; }
  187. }
  188. /// <summary>
  189. /// Field当前在屏幕上显示的坐标及大小
  190. /// </summary>
  191. public RectangleF Current_Rect
  192. {
  193. get { return m_current_rect; }
  194. set { m_current_rect = value; }
  195. }
  196. public override RectangleF Rect { get => m_show_rect; set => m_show_rect = value; }
  197. public override PointF OTSPointF { get => m_OTSPointF; set => m_OTSPointF = value; }
  198. public override bool IsSelect { get => m_IsSelect; set => m_IsSelect = value; }
  199. public override Color Color { get => m_color; set => m_color = value; }
  200. public override GraphicsPath GPath { get => m_GPath; set => m_GPath = value; }
  201. public override void OnPaint(PaintEventArgs e)
  202. {
  203. //开始向下传递并进行绘制
  204. foreach (BaseObject item in m_list_dparticle)
  205. {
  206. DisplayParticle dp = (DisplayParticle)item;
  207. if (dp.IsDeleted==false)
  208. {
  209. if (dp.displayState == DisplayState.NORMALDISPLAY)
  210. {
  211. item.OnPaint(e);
  212. }
  213. //获取矩形的rectangle
  214. dp.Rect = dp.GetRectFromDSegment();
  215. //通过line获取路径边缘
  216. dp.GPath = dp.GetRegionFromDSegments();
  217. //重新计算小矩形边框
  218. dp.SmallRect = dp.GetSmallRectangleFromRect();
  219. }
  220. }
  221. }
  222. }
  223. }