Browse Source

报告程序修复原图导出失败的bug,增加导出渲染原图时增加颜色标签

zhangjiaxin 2 năm trước cách đây
mục cha
commit
fb1137f971

+ 10 - 1
OTSIncAReportApp/1-UI/Control_Graph/Controls/Control_DrawDistrbutionImageAndBSE.cs

@@ -1523,6 +1523,7 @@ namespace OTSIncAReportGraph.Controls
         //复制图像
         private void toolStripMenuItem_copyimage_Click(object sender, EventArgs e)
         {
+            this.Cursor = System.Windows.Forms.Cursors.WaitCursor;
             SaveFileDialog sfd = new SaveFileDialog();
             //|ALL Files(*.*)|*.*
             //BMP Files(*.bmp)| *.bmp |
@@ -1538,7 +1539,7 @@ namespace OTSIncAReportGraph.Controls
                 bThread.IsBackground = true;
                 bThread.Start();
             }
-            
+            this.Cursor = System.Windows.Forms.Cursors.Default;
         }
 
         private void ToolStripMenuItem_movesempoint_Click(object sender, EventArgs e)
@@ -2069,7 +2070,12 @@ namespace OTSIncAReportGraph.Controls
 
         private void ExportoriginalspliceToolStripMenuItem_Click(object sender, EventArgs e)
         {
+            this.Cursor = System.Windows.Forms.Cursors.WaitCursor;
             SaveFileDialog sfd = new SaveFileDialog();
+
+            var particledata = new ParticleData(resultFile.FilePath);
+            DataTable ParticleAll = particledata.GetParticleTypeInformation();
+            DataTable ParticleClass = particledata.GetParticleClassAll();
             //|ALL Files(*.*)|*.*
             //BMP Files(*.bmp)| *.bmp |
             sfd.Filter = "png Files(*.png)| *.png |BMP Files(*.bmp)| *.bmp |JPG Files(*.jpg)|*.jpg;*.jpeg";
@@ -2080,10 +2086,13 @@ namespace OTSIncAReportGraph.Controls
                 outpic.resultFile = resultFile;
                 outpic.sfd = sfd;
                 outpic.type = (int)Outpic_enum.Render_pic;
+                outpic.ParticleData = ParticleAll.Copy();
+                outpic.ParticleClassData = ParticleClass.Copy();
                 Thread bThread = new Thread(new ThreadStart(outpic.opencv_outpic));
                 bThread.IsBackground = true;
                 bThread.Start();
             }
+            this.Cursor = System.Windows.Forms.Cursors.Default;
         }
 
         private void ToolStripMenuItemDelete_Particle_Click(object sender, EventArgs e)

+ 209 - 23
OTSIncAReportApp/1-UI/Control_Graph/Controls/OutPIC.cs

@@ -20,6 +20,8 @@ namespace OTSIncAReportApp._3_ServiceCenter
         public List<DisplayField> m_list_allDfield = null;
         public ResultFile resultFile = null;
         public SaveFileDialog sfd = null;
+        public DataTable ParticleData = new DataTable();
+        public DataTable ParticleClassData = new DataTable();
         public int type = 0;
         /// <summary>
         /// 获取每行图片的位置配合opencv方法使用
@@ -34,12 +36,15 @@ namespace OTSIncAReportApp._3_ServiceCenter
             foreach (var f in m_list_allDfield)
             {
                 DataRow dr = picDatat.NewRow();
-                dr["X"] = f.GetShowRect().X;
-                dr["Y"] = f.GetShowRect().Y;
+
+                dr["X"] = f.OTSCoordinatePos.X;
+                dr["Y"] = f.OTSCoordinatePos.Y;
+                //dr["X"] = f.GetShowRect().X;
+                //dr["Y"] = f.GetShowRect().Y;
                 picDatat.Rows.Add(dr);
             }
-            int y_max = Convert.ToInt32(picDatat.Compute("Max(Y)", "true"));
-            int y_min = Convert.ToInt32(picDatat.Compute("Min(Y)", "true"));
+            //int y_max = Convert.ToInt32(picDatat.Compute("Max(Y)", "true"));
+            //int y_min = Convert.ToInt32(picDatat.Compute("Min(Y)", "true"));
             DataTable total_dt_X = picDatat.Copy();
             DataView dv_x = total_dt_X.DefaultView;
             DataView dv_x_2 = dv_x.ToTable(true, "X").DefaultView;
@@ -60,27 +65,32 @@ namespace OTSIncAReportApp._3_ServiceCenter
                 DataTable data = new DataTable();
                 data.Columns.Add("mat", typeof(Bitmap));
                 data.Columns.Add("X", typeof(double));
+                data.Columns.Add("Y", typeof(double));
                 for (int a = 0; a < total_dt_X.Rows.Count; a++)
                 {
                     DataRow dr2 = data.NewRow();
-                    Bitmap bitmap = new Bitmap((int)m_list_allDfield[0].GetShowRect().Width, (int)m_list_allDfield[0].GetShowRect().Height);
+                    Bitmap bitmap = new Bitmap((int)m_list_allDfield[0].OriginalImage.Width, (int)m_list_allDfield[0].OriginalImage.Height);
+
+                    //Bitmap bitmap = new Bitmap((int)m_list_allDfield[0].GetShowRect().Width, (int)m_list_allDfield[0].GetShowRect().Height);
                     Graphics g = Graphics.FromImage(bitmap);
                     g.Clear(Color.White);
                     g.Dispose();
                     dr2["mat"] = bitmap;
                     dr2["X"] = total_dt_X.Rows[a]["X"];
+                    //dr2["Y"] = total_dt_X.Rows[a]["Y"];
                     data.Rows.Add(dr2);
                 }
                 foreach (var f in m_list_allDfield)
                 {
-                    if (total_dt_Y.Rows[i]["Y"].ToString() == f.GetShowRect().Y.ToString())
+                    if (total_dt_Y.Rows[i]["Y"].ToString() == f.OTSCoordinatePos.Y.ToString())
                     {
                         for (int c = 0; c < data.Rows.Count; c++)
                         {
-                            if (data.Rows[c]["X"].ToString() == f.GetShowRect().X.ToString())
+                            if (data.Rows[c]["X"].ToString() == f.OTSCoordinatePos.X.ToString())
                             {
                                 data.Rows[c]["mat"] = f.OriginalImage;
-                                data.Rows[c]["X"] = f.GetShowRect().X;
+                                data.Rows[c]["X"] = f.OTSCoordinatePos.X;
+                                data.Rows[c]["Y"] = f.OTSCoordinatePos.Y;
                             }
                         }
 
@@ -98,33 +108,119 @@ namespace OTSIncAReportApp._3_ServiceCenter
 
             return list_dt_picdata;
         }
-        public void opencv_outpic(/*int type*/)
+        public void opencv_outpic()
         {
+          
+
             List<DataTable> list_dt_picdata = new List<DataTable>();
+            OpenCvSharp.Mat[] list_mats;
             if (type == (int)Outpic_enum.pic)
             {
                 list_dt_picdata = opencv_piclist();
+                list_mats = new OpenCvSharp.Mat[list_dt_picdata.Count];
             }
             else
-                    if (type == (int)Outpic_enum.Render_pic)
+                    //if (type == (int)Outpic_enum.Render_pic)
             {
                 list_dt_picdata = opencv_piclist_Render();
+                list_mats = new OpenCvSharp.Mat[list_dt_picdata.Count + 1];
             }
 
-            OpenCvSharp.Mat[] list_mats = new OpenCvSharp.Mat[list_dt_picdata.Count];
+            //OpenCvSharp.Mat[] list_mats = new OpenCvSharp.Mat[list_dt_picdata.Count];
             NLog.LogManager.GetCurrentClassLogger().Info("Organize and splice all pictures......");
-            for (int i = 0; i < list_dt_picdata.Count; i++)
+
+            List<OpenCvSharp.Mat> list_pano = new List<OpenCvSharp.Mat>();
+
+            //循环保存每行拼接的图片
+            for (int i = list_dt_picdata.Count-1; i >= 0; i--)
             {
+                //拼接同一行中的图片
                 OpenCvSharp.Mat[] mats = new OpenCvSharp.Mat[list_dt_picdata[i].Rows.Count];
                 for (int a = 0; a < list_dt_picdata[i].Rows.Count; a++)
                 {
                     mats[a] = OpenCvSharp.Extensions.BitmapConverter.ToMat((Bitmap)list_dt_picdata[i].Rows[a]["mat"]);
                 }
                 OpenCvSharp.Mat pano = new OpenCvSharp.Mat();
+
+                
                 OpenCvSharp.Cv2.HConcat(mats, pano);
-                list_mats[i] = pano;
+                list_pano.Add(pano);
+                //list_mats[i] = pano;
+
+            }
+           
+
+            //导出原图(渲染图)在下方增加每种颜色的标注和面积占比
+            if (type == (int)Outpic_enum.Render_pic)
+            {
+                DataTable particleData = ParticleDataIntegration(ParticleData, ParticleClassData);
+                int NumberOfRows = getPICstringLong(particleData, list_pano);
+
+
+                Bitmap bitmap = new Bitmap(list_pano[0].Width, NumberOfRows*140);
+
+                Graphics g = Graphics.FromImage(bitmap);
+                g.Clear(Color.White);
+                int rowData = 10;
+
                 
+
+                
+
+                //矩形格子宽500
+
+                SolidBrush mysbrush1 = new SolidBrush(ColorTranslator.FromHtml("#000000"));
+                Pen mypen = new Pen(mysbrush1, 2);
+                Font myFont = new Font("宋体", 13, FontStyle.Bold);
+                SolidBrush sbrush = new SolidBrush(Color.Black);
+                int Color_Y = 10; int TypeName_Y = 40; int Prozentsatz_Y = 100;int Area_Y = 70;
+                int Gitter_X = 10;
+                picKopfzeile(mypen, myFont, sbrush, g, 10, rowData);
+              
+
+                Gitter_X = Gitter_X + 350;
+                for (int i = 0; i < particleData.Rows.Count; i++)
+                {
+                    if (Gitter_X+350> list_pano[0].Width)
+                    {
+                        rowData = rowData + 130;
+                        picKopfzeile(mypen, myFont, sbrush, g, 10, rowData);
+                        Color_Y = Color_Y + 130;
+                        TypeName_Y = TypeName_Y + 130;
+                        Prozentsatz_Y = Prozentsatz_Y + 130;
+                        Area_Y = Area_Y + 130;
+                        Gitter_X = 360;
+                    }
+                    g.DrawRectangle(mypen, Gitter_X, Color_Y, 350, 30);
+                    g.DrawRectangle(mypen, Gitter_X, TypeName_Y, 350, 30);
+                    g.DrawRectangle(mypen, Gitter_X, Area_Y, 350, 30);
+                    g.DrawRectangle(mypen, Gitter_X, Prozentsatz_Y, 350, 30);
+
+                    SolidBrush mysbrush = new SolidBrush(ColorTranslator.FromHtml("#" + particleData.Rows[i]["Color"].ToString()));
+                    g.FillRectangle(mysbrush, Gitter_X + 1, Color_Y + 1, 348, 28);
+                    g.DrawString(particleData.Rows[i]["TypeName"].ToString(), myFont, sbrush, Gitter_X + 1, TypeName_Y + 2);
+                    g.DrawString(particleData.Rows[i]["Area"].ToString(), myFont, sbrush, Gitter_X + 1, Area_Y + 2);
+                    g.DrawString(particleData.Rows[i]["Percentage"].ToString()+"%", myFont, sbrush, Gitter_X + 1, Prozentsatz_Y + 2);
+
+                    Gitter_X = Gitter_X + 350;
+                }
+
+
+                g.Dispose();
+                //bitmap.Save("D:\\1.bmp");
+
+
+                OpenCvSharp.Mat pano = OpenCvSharp.Extensions.BitmapConverter.ToMat(bitmap);
+                list_pano.Add(pano);
             }
+
+
+
+            for (int i = 0; i < list_pano.Count; i++)
+            {
+                list_mats[i] = list_pano[i];
+            }
+
             NLog.LogManager.GetCurrentClassLogger().Info("Picture splicing completed.");
             NLog.LogManager.GetCurrentClassLogger().Info("Save to disk......");
             OpenCvSharp.Mat save_pano = new OpenCvSharp.Mat();
@@ -132,7 +228,90 @@ namespace OTSIncAReportApp._3_ServiceCenter
             OpenCvSharp.Cv2.ImWrite(sfd.FileName, save_pano);
             NLog.LogManager.GetCurrentClassLogger().Info("Save complete.");
         }
-       
+        private int getPICstringLong(DataTable particleData, List<OpenCvSharp.Mat> list_pano)
+        {
+            int Long = 1;
+            int Gitter_X = 10;
+            for (int i = 0; i < particleData.Rows.Count; i++)
+            {
+                if (Gitter_X + 350 > list_pano[0].Width)
+                {
+                    Long = Long + 1;
+                    Gitter_X = 10;
+                }
+                Gitter_X = Gitter_X + 350;
+            }
+            return Long;
+        }
+
+        private void picKopfzeile(Pen mypen, Font myFont, SolidBrush sbrush, Graphics g ,int X,int Y)
+        {
+
+            int Color_Y = Y; int TypeName_Y = Y+30; int Prozentsatz_Y = Y + 90; int Area_Y = Y+ 60;
+            int Gitter_X = X;
+
+            g.DrawRectangle(mypen, Gitter_X, Color_Y, 350, 30);
+            g.DrawRectangle(mypen, Gitter_X, TypeName_Y, 350, 30);
+            g.DrawRectangle(mypen, Gitter_X, Area_Y, 350, 30);
+            g.DrawRectangle(mypen, Gitter_X, Prozentsatz_Y, 350, 30);
+            g.DrawString("Color", myFont, sbrush, Gitter_X + 1, Color_Y + 2);
+            g.DrawString("TypeName", myFont, sbrush, Gitter_X + 1, TypeName_Y + 2);
+            g.DrawString("Area", myFont, sbrush, Gitter_X + 1, Area_Y + 2);
+            g.DrawString("Prozentsatz", myFont, sbrush, Gitter_X + 1, Prozentsatz_Y + 2);
+        }
+        private DataTable ParticleDataIntegration(DataTable ParticleAll,DataTable ParticleClass)
+        {
+            DataTable dt = ParticleClass.Copy();
+            dt.Columns.Add("Area", typeof(float));
+            dt.Columns.Add("Percentage");
+            dt.Columns.Add("Color");
+            double ParticleAreaTotal = 0;
+            for (int i=0;i< ParticleAll.Rows.Count;i++)
+            {
+                ParticleAreaTotal = ParticleAreaTotal + Convert.ToDouble(ParticleAll.Rows[i]["Area"]);
+            }
+
+            for (int i=0;i< dt.Rows.Count;i++)
+            {
+                double ParticleArea = 0;
+                double ParticleColer = 0;
+                for (int a=0;a< ParticleAll.Rows.Count;a++)
+                {
+                    if (dt.Rows[i]["TypeName"].ToString()== ParticleAll.Rows[a]["TypeName"].ToString())
+                    {
+                        ParticleArea = ParticleArea + Convert.ToDouble(ParticleAll.Rows[a]["Area"]);
+                        ParticleColer =  Convert.ToDouble(ParticleAll.Rows[a]["TypeColor"]);
+                    }
+                }
+                dt.Rows[i]["Area"] = ParticleArea;
+                dt.Rows[i]["Percentage"] = ParameterNormalization(ParticleAreaTotal, ParticleArea);
+                dt.Rows[i]["Color"] = ParticleColer;
+            }
+            return dt;
+        }
+
+        /// <summary>
+        /// 参数归一化
+        /// </summary>
+        /// <param name="a_mi">总数</param>
+        /// <param name="m">传参</param>
+        /// <returns></returns>
+        private string ParameterNormalization(double a_mi, double m)
+        {
+            double ColVal = Convert.ToDouble(m / a_mi * 100);
+            if (ColVal == 0)
+            {
+                return "";
+            }
+            else
+            {
+
+                return Math.Round(ColVal, 2).ToString();
+            }
+
+        }
+
+
         private List<DataTable> opencv_piclist_Render()
         {
             List<DataTable> list_dt_picdata = new List<DataTable>();
@@ -143,12 +322,11 @@ namespace OTSIncAReportApp._3_ServiceCenter
             foreach (var f in m_list_allDfield)
             {
                 DataRow dr = picDatat.NewRow();
-                dr["X"] = f.GetShowRect().X;
-                dr["Y"] = f.GetShowRect().Y;
+                dr["X"] = f.OTSCoordinatePos.X;
+                dr["Y"] = f.OTSCoordinatePos.Y;
                 picDatat.Rows.Add(dr);
             }
-            int y_max = Convert.ToInt32(picDatat.Compute("Max(Y)", "true"));
-            int y_min = Convert.ToInt32(picDatat.Compute("Min(Y)", "true"));
+
             DataTable total_dt_X = picDatat.Copy();
             DataView dv_x = total_dt_X.DefaultView;
             DataView dv_x_2 = dv_x.ToTable(true, "X").DefaultView;
@@ -162,7 +340,7 @@ namespace OTSIncAReportApp._3_ServiceCenter
             dv_Y_2.Sort = "Y ASC";
             total_dt_Y = dv_Y_2.ToTable();
 
-
+            //循环每一行图片
             for (int i = 0; i < total_dt_Y.Rows.Count; i++)
             {
                 NLog.LogManager.GetCurrentClassLogger().Info("Splice line" + i + 1.ToString() + "of" + total_dt_Y.Rows.Count.ToString() + ".....");
@@ -170,10 +348,14 @@ namespace OTSIncAReportApp._3_ServiceCenter
                 DataTable data = new DataTable();
                 data.Columns.Add("mat", typeof(Bitmap));
                 data.Columns.Add("X", typeof(double));
+                //循环每行图片进行拼接
                 for (int a = 0; a < total_dt_X.Rows.Count; a++)
                 {
                     DataRow dr2 = data.NewRow();
-                    Bitmap bitmap = new Bitmap((int)m_list_allDfield[0].GetShowRect().Width, (int)m_list_allDfield[0].GetShowRect().Height);
+
+                    Bitmap bitmap = new Bitmap((int)m_list_allDfield[0].OriginalImage.Width, (int)m_list_allDfield[0].OriginalImage.Height);
+
+                    //Bitmap bitmap = new Bitmap((int)m_list_allDfield[0].GetShowRect().Width, (int)m_list_allDfield[0].GetShowRect().Height);
                     Graphics g = Graphics.FromImage(bitmap);
                     g.Clear(Color.White);
                     g.Dispose();
@@ -181,13 +363,15 @@ namespace OTSIncAReportApp._3_ServiceCenter
                     dr2["X"] = total_dt_X.Rows[a]["X"];
                     data.Rows.Add(dr2);
                 }
+                //循环所有图片
                 foreach (var f in m_list_allDfield)
                 {
-                    if (total_dt_Y.Rows[i]["Y"].ToString() == f.GetShowRect().Y.ToString())
+                    if (total_dt_Y.Rows[i]["Y"].ToString() == f.OTSCoordinatePos.Y.ToString())
                     {
+                        //循环图片的行数
                         for (int c = 0; c < data.Rows.Count; c++)
                         {
-                            if (data.Rows[c]["X"].ToString() == f.GetShowRect().X.ToString())
+                            if (data.Rows[c]["X"].ToString() == f.OTSCoordinatePos.X.ToString())
                             {
                                 Bitmap image = new Bitmap(f.OriginalImage.Width, f.OriginalImage.Height);
                                 Graphics g2 = Graphics.FromImage(image);
@@ -227,13 +411,15 @@ namespace OTSIncAReportApp._3_ServiceCenter
                                     }
                                 }
                                 data.Rows[c]["mat"] = image;
-                                data.Rows[c]["X"] = f.GetShowRect().X;
+                                data.Rows[c]["X"] = f.OTSCoordinatePos.X;
                             }
                         }
                     }
 
                 }
 
+
+
                 DataView dataView1 = data.DefaultView;
                 dataView1.Sort = "X ASC";
                 data = dataView1.ToTable();

+ 22 - 1
OTSIncAReportApp/3-ServiceCenter/DataOperation/DataAccess/ParticleData.cs

@@ -67,6 +67,8 @@ namespace OTSIncAReportApp.DataOperation.DataAccess
             return listp;
 
         }
+
+
         /// <summary>
         /// 获取ParticleList
         /// </summary>
@@ -200,7 +202,26 @@ namespace OTSIncAReportApp.DataOperation.DataAccess
            
             return DT;
         }
-
+        /// <summary>
+        /// 查找所有颗粒的颜色、面积、种类名称信息
+        /// </summary>
+        /// <returns></returns>
+        public DataTable GetParticleTypeInformation()
+        {
+            string sqlp = @"select Area,TypeName,TypeColor from IncAData";
+            DataTable dt = dbHelper.ExecuteDataTable(sqlp, null);
+            return dt;
+        }
+        /// <summary>
+        /// 查找IncaData表中所有种类
+        /// </summary>
+        /// <returns></returns>
+        public DataTable GetParticleClassAll()
+        {
+            string sqlp = @"SELECT DISTINCT TypeName FROM IncaData";
+            DataTable dt = dbHelper.ExecuteDataTable(sqlp, null);
+            return dt;
+        }
 
         /// <summary>
         /// 获取所有Particle