| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296 | using OTSCommon.Model;using OTSIncAReportGraph.Class;using System;using System.Collections.Generic;using System.Drawing;using System.Drawing.Drawing2D;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Windows.Forms;namespace OTSIncAReportGraph{    /// <summary>    /// 包含DParticle类的field类,目前只用于绘制背景色,按理说应该有更多的作用,比如做多线程分式运算    /// </summary>    public class DisplayField : BaseObject    {        Guid  m_id;        string m_tagid;        string m_fieldid;        bool m_IsDragging;        Color m_backcolor;        List<DisplayParticle> m_list_dparticle;        List<DisplayParticle> m_list_Useparticle;        PointF m_ots_point;  //按底层设计结构,底层返回的物理坐标位置及大小,OTS坐标大小        RectangleF m_pix_rect; //与底层返回物理坐标及位置大小对应转换成,pixel像素分率下的坐标位置大小        RectangleF m_show_rect;//最后换算到在显示器上显示的坐标位置大小        RectangleF m_current_rect;//当前field在显示器上显示的坐标位置大小        PointF m_dragingpoint;//鼠标拖动的位置        //private string m_GBContent;        private PointF m_OTSPointF;        private bool m_IsSelect;        private Color m_color;        private GraphicsPath m_GPath;        private Bitmap m_originalImage;        const int INVALIDPARTICLE= -1;        /// <summary>        /// 构造函数        /// </summary>        public DisplayField(Field fld, int fldwidth, int fldheight,Point screenPos)        {                     m_list_dparticle = new List<DisplayParticle>();            m_list_Useparticle = new List<DisplayParticle>();            m_id = System.Guid.NewGuid();            Point thisfield_point = new Point() { X = fld.FieldPosX, Y = fld.FieldPosY };                       FieldID = fld.FieldID.ToString();            Show_Rect = new Rectangle(screenPos, new Size(fldwidth, fldheight));            Current_Rect = new Rectangle(screenPos, new Size(fldwidth, fldheight));            OTSCoordinatePos = new PointF(thisfield_point.X, thisfield_point.Y);            //先获取该Field中的所有Particle            List<Particle> 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);                             List<Segment> list_seg;                list_seg = particle.SegmentList;                //创建颗粒分布图对应的类对象                List<DisplaySegment> list_dsegment = new List<DisplaySegment>();                //再循环取出里面所有的segment                foreach (Segment seg in list_seg)                {                    #region 创建DSegment对象,并将STD分析出的化合物颜色保存到DSegment对象中                    //对Particle里的Segment进行偏移的计算等,创建了DSegment的大小                    DisplaySegment ds = new DisplaySegment();                    ds.Rect = new Rectangle(seg.Start + screenPos.X,                                             seg.Height + screenPos.Y,                        seg.Length,                        1);                    ds.Color = dp.Color;//将线的颜色对应到颗粒的颜色                    #endregion                    #region //这里是在Field中,抠取出原BSE图像到DSegment中--------------------------------                                      //合成图像完成,开始抠取像素-----------------------------------------------------------------                    int f_length = seg.Length;                                     for (int m = 0; m < f_length; m++)                    {                        //这里实现一下代码保护                        int lsjs_x = seg.Start + m;                                             int lsjs_y = seg.Height;                                            var pixelColor = m_originalImage.GetPixel(lsjs_x, lsjs_y);                        try                        {                                                       dpImage.SetPixel(lsjs_x, lsjs_y, pixelColor);//ls_list_colors[m]                        }                        catch (Exception ex)                        {                            NLog.LogManager.GetCurrentClassLogger().Error(ex.Message.ToString());                        }                                            }                                      #endregion //------------------------------------------------------------------------------                    list_dsegment.Add(ds);                                   }                          dp.SetPaintState(PaintState.PAINT);                dp.DSegments = list_dsegment;                dp.Rect = dp.GetRectFromDSegment();                dp.GPath = dp.GetRegionFromDSegments();                dp.SmallRect = dp.GetSmallRectangleFromRect();                var currentRect = new RectangleF(dp.Rect.X - screenPos.X, dp.Rect.Y - screenPos.Y, dp.Rect.Width, dp.Rect.Height);                try                 {                    var dpImg = dpImage.Clone(currentRect, dpImage.PixelFormat);                    dp.SetImage(dpImg);                } catch (Exception ex)                {                    NLog.LogManager.GetCurrentClassLogger().Error(ex.ToString());                }                                                           m_list_dparticle.Add(dp);                if (dp.XRayId > -1)                {                    m_list_Useparticle.Add(dp);                }            }        }        public DisplayField(List<DisplayParticle> in_list_dparticle)        {            m_list_dparticle = in_list_dparticle;        }        public override Guid guid { get => m_id; set => m_id = value; }        /// <summary>        /// 记录与底层对应的TagID        /// </summary>        public string TagID        {            get { return m_tagid; }            set { m_tagid = value; }        }        /// <summary>        /// 是否被拖动标识        /// </summary>        public override bool IsDragging { get => m_IsDragging; set => m_IsDragging = value; }        /// <summary>        /// 被拖动到的位置坐标        /// </summary>        public override PointF DraggingPoint { get => m_dragingpoint; set => m_dragingpoint = value; }        /// <summary>        /// 与底层对应的ID,这里叫成FieldID        /// </summary>        public string FieldID        {            get { return m_fieldid; }            set { m_fieldid = value; }        }        public override Color BackColor { get => m_backcolor; set => m_backcolor = value; }        /// <summary>        /// 包含的Particle列表        /// </summary>        public List<DisplayParticle> List_DParticle        {            get { return m_list_dparticle; }            set { m_list_dparticle = value; }        }        public List<DisplayParticle> List_Useparticle        {            get { return m_list_Useparticle; }            set { m_list_Useparticle = value; }        }        /// <summary>        /// 该Field的OTS坐标及大小        /// </summary>        public PointF OTSCoordinatePos        {            get { return m_ots_point; }            set { m_ots_point = value; }        }        /// <summary>        /// 该Field物理坐标大小转换出,对应的像素坐标及大小        /// </summary>        public RectangleF Pix_Rect        {            get { return m_pix_rect; }            set { m_pix_rect = value; }        }        /// <summary>        /// 该Field最后在屏幕上显示的坐标及大小        /// </summary>        public RectangleF Show_Rect        {            get { return m_show_rect; }            set { m_show_rect = value; }        }        /// <summary>        /// Field当前在屏幕上显示的坐标及大小        /// </summary>        public RectangleF Current_Rect        {            get { return m_current_rect; }            set { m_current_rect = value; }        }        public override RectangleF Rect { get => m_show_rect; set => m_show_rect = value; }        public override PointF OTSPointF { get => m_OTSPointF; set => m_OTSPointF = value; }        public override bool IsSelect { get => m_IsSelect; set => m_IsSelect = value; }        public override Color Color { get => m_color; set => m_color = value; }        public override GraphicsPath GPath { get => m_GPath; set => m_GPath = value; }        public Bitmap OriginalImage { get => m_originalImage; set => m_originalImage = value; }        public override void OnPaint(PaintEventArgs e)        {            //开始向下传递并进行绘制            foreach (BaseObject item in m_list_dparticle)            {                DisplayParticle dp = (DisplayParticle)item;                if (dp.IsDeleted==false)                {                    if (dp.GetPaintState() == PaintState.PAINT)                    {                        item.OnPaint(e);                    }                    //获取矩形的rectangle                    dp.Rect = dp.GetRectFromDSegment();                    //通过line获取路径边缘                    dp.GPath = dp.GetRegionFromDSegments();                    //重新计算小矩形边框                    dp.SmallRect = dp.GetSmallRectangleFromRect();                }            }        }    }}
 |