using OTSCommon.Model; using OTSIncAReportGraph.Class; using System; using System.Collections.Generic; using System.Drawing; using System.Windows.Forms; namespace OTSIncAReportGraph { public class DisplayField { Guid m_id; Color disColor; string m_fieldid; bool m_IsDragging; public string gradeString=""; List m_list_dparticle; private float m_currentZoom=1; PointF m_ots_point; //按底层设计结构,底层返回的物理坐标位置及大小,OTS坐标大小 RectangleF m_Rect;//最后换算到在显示器上显示的坐标位置大小 PointF m_dragingpoint;//鼠标拖动的位置 private Bitmap m_originalImage; const int INVALIDPARTICLE= -1; /// /// 构造函数 /// public DisplayField(Field fld, int fldwidth, int fldheight,Point screenPos) { m_list_dparticle = new List(); m_id = System.Guid.NewGuid(); Point thisfield_point = new Point() { X = fld.FieldPosX, Y = fld.FieldPosY }; FieldID = fld.FieldID.ToString(); var ltPoint = new Point(screenPos.X - fldwidth / 2, screenPos.Y -fldheight / 2); SetShow_Rect(new Rectangle(ltPoint, new Size(fldwidth, fldheight))); OTSCoordinatePos = new PointF(thisfield_point.X, thisfield_point.Y); //先获取该Field中的所有Particle List list_particle; list_particle = fld.ParticleList; //然后将取出的数据,转换成Bitmap对象 m_originalImage = DrawFunction.ReadImageFile(fld.FieldImage); Bitmap dpImage = new Bitmap(fldwidth, fldheight); //再循环计算所有的Particle对象 foreach (Particle particle in list_particle) { //分布图排列图无效颗粒不显示 if (particle.TypeId == INVALIDPARTICLE) { continue; } //创建DParticle颗粒 DisplayParticle dp = new DisplayParticle(particle, ltPoint, m_originalImage,dpImage); m_list_dparticle.Add(dp); } } public DisplayField(List in_list_dparticle) { m_list_dparticle = in_list_dparticle; } public DisplayField(int fldwidth, int fldheight, Point screenPos) { m_id = System.Guid.NewGuid(); var ltPoint = new Point(screenPos.X - fldwidth / 2, screenPos.Y - fldheight / 2); SetShow_Rect(new Rectangle(ltPoint, new Size(fldwidth, fldheight))); } public void Zoom(float zoomDelta , PointF refPoint) { m_Rect.Width += m_Rect.Width/ m_currentZoom * zoomDelta; m_Rect.Height += m_Rect.Height/ m_currentZoom * zoomDelta; //锚点缩放补差值计算,得出差值 float xShiftOld = m_Rect.X - refPoint.X; float yShiftOld = m_Rect.Y - refPoint.Y; float xShift = m_Rect.X - refPoint.X + xShiftOld/ m_currentZoom * zoomDelta; float yShift = m_Rect.Y - refPoint.Y + yShiftOld/ m_currentZoom * zoomDelta; m_Rect.X = refPoint.X + xShift; m_Rect.Y = refPoint.Y + yShift; m_currentZoom += zoomDelta; } public void DraggingMove(PointF mousePoint) { m_Rect = new RectangleF( m_Rect.Left + Convert.ToSingle((mousePoint.X - DraggingPoint.X)), m_Rect.Top + Convert.ToSingle((mousePoint.Y - DraggingPoint.Y)), m_Rect.Width, m_Rect.Height); DraggingPoint = mousePoint; } public void Move(SizeF xyShift) { m_Rect = new RectangleF( m_Rect.Left- Convert.ToSingle(xyShift.Width), m_Rect.Top - Convert.ToSingle(xyShift.Height), m_Rect.Width, m_Rect.Height); } public Guid guid { get => m_id; set => m_id = value; } /// /// 是否被拖动标识 /// public bool IsDragging { get => m_IsDragging; set => m_IsDragging = value; } /// /// 被拖动到的位置坐标 /// public PointF DraggingPoint { get => m_dragingpoint; set => m_dragingpoint = value; } /// /// 与底层对应的ID,这里叫成FieldID /// public string FieldID { get { return m_fieldid; } set { m_fieldid = value; } } /// /// 包含的Particle列表 /// public List List_DParticle { get { return m_list_dparticle; } set { m_list_dparticle = value; } } /// /// 该Field的OTS坐标及大小 /// public PointF OTSCoordinatePos { get { return m_ots_point; } set { m_ots_point = value; } } /// /// 该Field最后在屏幕上显示的坐标及大小 /// public RectangleF GetShowRect() { return m_Rect; } /// /// 该Field最后在屏幕上显示的坐标及大小 /// public void SetShow_Rect(RectangleF value) { m_Rect = value; } public Bitmap OriginalImage { get => m_originalImage; set => m_originalImage = value; } public Color DisColor { get => disColor; set =>disColor = value; } public void OnPaint(PaintEventArgs e) { Graphics g = e.Graphics; float w = 1; Pen p = new Pen(Color.Red, w); var r = new Rectangle((int)m_Rect.Left, (int)m_Rect.Top, (int)m_Rect.Width, (int)m_Rect.Height); g.DrawRectangle(p, r); if (gradeString != "") { SolidBrush solidBrush = new SolidBrush(Color.FromArgb(100, disColor)); //字体大小 根据样品孔Rectangle大小 float fontSize = m_Rect.Width / 20; Font font = new Font("宋体", fontSize, FontStyle.Bold); if (fontSize == 0) { font = new Font("宋体", 5, FontStyle.Bold); } RectangleF rectFont = m_Rect; rectFont.X += 2; rectFont.Y += 2; g.DrawString(gradeString, font, solidBrush, rectFont); } } } }