DisplayField.cs 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221
  1. using OTSCommon.Model;
  2. using OTSIncAReportGraph.Class;
  3. using System;
  4. using System.Collections.Generic;
  5. using System.Drawing;
  6. using System.Windows.Forms;
  7. namespace OTSIncAReportGraph
  8. {
  9. public class DisplayField
  10. {
  11. Guid m_id;
  12. Color disColor;
  13. string m_fieldid;
  14. bool m_IsDragging;
  15. public string gradeString="";
  16. List<DisplayParticle> m_list_dparticle;
  17. private float m_currentZoom=1;
  18. PointF m_ots_point; //按底层设计结构,底层返回的物理坐标位置及大小,OTS坐标大小
  19. RectangleF m_Rect;//最后换算到在显示器上显示的坐标位置大小
  20. PointF m_dragingpoint;//鼠标拖动的位置
  21. private Bitmap m_originalImage;
  22. const int INVALIDPARTICLE= -1;
  23. /// <summary>
  24. /// 构造函数
  25. /// </summary>
  26. public DisplayField(Field fld, int fldwidth, int fldheight,Point screenPos)
  27. {
  28. m_list_dparticle = new List<DisplayParticle>();
  29. m_id = System.Guid.NewGuid();
  30. Point thisfield_point = new Point() { X = fld.FieldPosX, Y = fld.FieldPosY };
  31. FieldID = fld.FieldID.ToString();
  32. var ltPoint = new Point(screenPos.X - fldwidth / 2, screenPos.Y -fldheight / 2);
  33. SetShow_Rect(new Rectangle(ltPoint, new Size(fldwidth, fldheight)));
  34. OTSCoordinatePos = new PointF(thisfield_point.X, thisfield_point.Y);
  35. //先获取该Field中的所有Particle
  36. List<Particle> list_particle;
  37. list_particle = fld.ParticleList;
  38. //然后将取出的数据,转换成Bitmap对象
  39. m_originalImage = DrawFunction.ReadImageFile(fld.FieldImage);
  40. Bitmap dpImage = new Bitmap(fldwidth, fldheight);
  41. //再循环计算所有的Particle对象
  42. foreach (Particle particle in list_particle)
  43. {
  44. //分布图排列图无效颗粒不显示
  45. if (particle.TypeId == INVALIDPARTICLE)
  46. {
  47. continue;
  48. }
  49. //创建DParticle颗粒
  50. DisplayParticle dp = new DisplayParticle(particle, ltPoint, m_originalImage,dpImage);
  51. m_list_dparticle.Add(dp);
  52. }
  53. }
  54. public DisplayField(List<DisplayParticle> in_list_dparticle)
  55. {
  56. m_list_dparticle = in_list_dparticle;
  57. }
  58. public DisplayField(int fldwidth, int fldheight, Point screenPos)
  59. {
  60. m_id = System.Guid.NewGuid();
  61. var ltPoint = new Point(screenPos.X - fldwidth / 2, screenPos.Y - fldheight / 2);
  62. SetShow_Rect(new Rectangle(ltPoint, new Size(fldwidth, fldheight)));
  63. }
  64. public void Zoom(float zoomDelta , PointF refPoint)
  65. {
  66. m_Rect.Width += m_Rect.Width/ m_currentZoom * zoomDelta;
  67. m_Rect.Height += m_Rect.Height/ m_currentZoom * zoomDelta;
  68. //锚点缩放补差值计算,得出差值
  69. float xShiftOld = m_Rect.X - refPoint.X;
  70. float yShiftOld = m_Rect.Y - refPoint.Y;
  71. float xShift = m_Rect.X - refPoint.X + xShiftOld/ m_currentZoom * zoomDelta;
  72. float yShift = m_Rect.Y - refPoint.Y + yShiftOld/ m_currentZoom * zoomDelta;
  73. m_Rect.X = refPoint.X + xShift;
  74. m_Rect.Y = refPoint.Y + yShift;
  75. m_currentZoom += zoomDelta;
  76. }
  77. public void DraggingMove(PointF mousePoint)
  78. {
  79. m_Rect = new RectangleF(
  80. m_Rect.Left + Convert.ToSingle((mousePoint.X - DraggingPoint.X)),
  81. m_Rect.Top + Convert.ToSingle((mousePoint.Y - DraggingPoint.Y)),
  82. m_Rect.Width,
  83. m_Rect.Height);
  84. DraggingPoint = mousePoint;
  85. }
  86. public void Move(SizeF xyShift)
  87. {
  88. m_Rect = new RectangleF(
  89. m_Rect.Left- Convert.ToSingle(xyShift.Width),
  90. m_Rect.Top - Convert.ToSingle(xyShift.Height),
  91. m_Rect.Width,
  92. m_Rect.Height);
  93. }
  94. public Guid guid { get => m_id; set => m_id = value; }
  95. /// <summary>
  96. /// 是否被拖动标识
  97. /// </summary>
  98. public bool IsDragging { get => m_IsDragging; set => m_IsDragging = value; }
  99. /// <summary>
  100. /// 被拖动到的位置坐标
  101. /// </summary>
  102. public PointF DraggingPoint { get => m_dragingpoint; set => m_dragingpoint = value; }
  103. /// <summary>
  104. /// 与底层对应的ID,这里叫成FieldID
  105. /// </summary>
  106. public string FieldID
  107. {
  108. get { return m_fieldid; }
  109. set { m_fieldid = value; }
  110. }
  111. /// <summary>
  112. /// 包含的Particle列表
  113. /// </summary>
  114. public List<DisplayParticle> List_DParticle
  115. {
  116. get { return m_list_dparticle; }
  117. set { m_list_dparticle = value; }
  118. }
  119. /// <summary>
  120. /// 该Field的OTS坐标及大小
  121. /// </summary>
  122. public PointF OTSCoordinatePos
  123. {
  124. get { return m_ots_point; }
  125. set { m_ots_point = value; }
  126. }
  127. /// <summary>
  128. /// 该Field最后在屏幕上显示的坐标及大小
  129. /// </summary>
  130. public RectangleF GetShowRect()
  131. { return m_Rect; }
  132. /// <summary>
  133. /// 该Field最后在屏幕上显示的坐标及大小
  134. /// </summary>
  135. public void SetShow_Rect(RectangleF value)
  136. { m_Rect = value; }
  137. public Bitmap OriginalImage { get => m_originalImage; set => m_originalImage = value; }
  138. public Color DisColor { get => disColor; set =>disColor = value; }
  139. public void OnPaint(PaintEventArgs e)
  140. {
  141. Graphics g = e.Graphics;
  142. float w = 1;
  143. Pen p = new Pen(Color.Red, w);
  144. var r = new Rectangle((int)m_Rect.Left, (int)m_Rect.Top, (int)m_Rect.Width, (int)m_Rect.Height);
  145. g.DrawRectangle(p, r);
  146. if (gradeString != "")
  147. {
  148. SolidBrush solidBrush = new SolidBrush(Color.FromArgb(100, disColor));
  149. //字体大小 根据样品孔Rectangle大小
  150. float fontSize = m_Rect.Width / 20;
  151. Font font = new Font("宋体", fontSize, FontStyle.Bold);
  152. if (fontSize == 0)
  153. {
  154. font = new Font("宋体", 5, FontStyle.Bold);
  155. }
  156. RectangleF rectFont = m_Rect;
  157. rectFont.X += 2;
  158. rectFont.Y += 2;
  159. g.DrawString(gradeString, font, solidBrush, rectFont);
  160. }
  161. }
  162. }
  163. }