瀏覽代碼

Merge branch 'OTSRelease3_0' of http://36.129.163.148:30080/gogsadmin/OTS into OTSRelease3_0

cxs 1 年之前
父節點
當前提交
711de05c9c

+ 1 - 1
Bin/x64/Debug/Config/ProData/HardwareConfig.xml

@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <XMLData PathName="HardwareConfig.xml" ID="1">
   <Member RegName="SemControllerName" Value="OffLine" ImageInputSources="SE" />
-  <Member RegName="EDSName" Value="OffLine" DelayQuantify="true" WeightPercentageToAtomicPercentage="false"/>
+  <Member RegName="EDSName" Value="OffLine" DelayQuantify="true" WeightPercentageToAtomicPercentage="false" />
   <Member RegName="BrukerDllVersion" Version="Bruker.API.Esprit64.dll" />
   <Member RegName="FEIIP" Value="192.168.0.1" />
   <Member RegName="FEIPORT" Value="7520" />

+ 1 - 1
Bin/x64/Debug/Config/ProData/lj2.psf

@@ -1,2 +1,2 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<XMLData FileMark="626" Name="LiJi2" Sizes="0,0.5,1,2,5,30,100" Version="1.1.1" />
+<XMLData FileMark="626" Name="LiJi2" Sizes="5,15,25,50,80,100" Version="1.1.1" />

+ 6 - 1
Bin/x64/Debug/Config/ReportTemplate/CleannessA_Template/ReportTemplateConfig.xml

@@ -79,7 +79,8 @@
       <MBIndex0>0</MBIndex0>
       <MBIndex1>2</MBIndex1>
     </list_lbv_syxt_mblb_index>
-    <str_cb_syxt_ljb> </str_cb_syxt_ljb>
+    <str_cb_syxt_ljb>
+    </str_cb_syxt_ljb>
   </M_SYXT>
   <M_KLLBXX>
     <b_ck_kllb_xsmk>True</b_ck_kllb_xsmk>
@@ -140,4 +141,8 @@
     </str_MainPriority>
     <str_SecondaryPriority>Nialloy,Fe-O,Fe-Cr,Fe-alloy</str_SecondaryPriority>
   </whole>
+  <M_DZ>
+    <Notes>
+    </Notes>
+  </M_DZ>
 </XmlConfig>

+ 3 - 2
Bin/x64/Debug/Config/ReportTemplate/Inca_Template/ReportTemplateConfig.xml

@@ -1,8 +1,9 @@
 <XmlConfig>
   <M_SY>
     <str_tb_ZBT>夹杂物报告</str_tb_ZBT>
-    <str_tb_FBT>北京首钢吉泰安新材料有限公司</str_tb_FBT>
-    <str_tb_YPBH>20804164 4.0  2</str_tb_YPBH>
+    <str_tb_FBT>XXX有限公司</str_tb_FBT>
+    <str_tb_YPBH>
+    </str_tb_YPBH>
     <str_tb_CKBZ>
     </str_tb_CKBZ>
     <b_ck_ypsm>True</b_ck_ypsm>

二進制
Bin/x64/Debug/Config/ReportTemplate/language.db


+ 1 - 1
Bin/x64/Debug/Config/SysData/OTSStage.stg

@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<XMLData Modify="true" PathName=".\Config\SysData\OTSStage.stg" WorkingStageId="0">
+<XMLData Modify="true" PathName=".\Config\SysData\OTSStage.stg" WorkingStageId="4">
   <Collection RegName="Stagelist">
     <Member strName="圆形九圆孔50mm">
       <Member RegName="boundary" PolygonPoint="" rectDomian="0,0,50000,0" shape="0:ROUND" />

+ 1 - 1
OTSCPP/OTSClassifyEngine/ExpressionClassifyEngine.cpp

@@ -426,7 +426,7 @@ CElementChemistriesList ExpressionClassifyEngine::ZeroElementProcess(COTSParticl
 			}
 		}
 		if (bMatch == false) continue;
-		// all the rule's using element are contained in the particle then we replace the element with the percentage value
+		// all the rule's using elements are contained in the particle then we replace the element with the percentage value
 
 		for (std::string s : rule->GetOtherpropertyList())
 		{

+ 14 - 1
OTSIncAMeasureApp/5-OTSMeasureStatuImageFun/OTSMeasureStatusWindow.Designer.cs

@@ -50,6 +50,8 @@
             this.ExportScanInfoMenuItem = new System.Windows.Forms.ToolStripMenuItem();
             this.myChart = new System.Windows.Forms.DataVisualization.Charting.Chart();
             this.panelXray = new System.Windows.Forms.Panel();
+            this.backgroundWorker1 = new System.ComponentModel.BackgroundWorker();
+            this.timer1 = new System.Windows.Forms.Timer(this.components);
             ((System.ComponentModel.ISupportInitialize)(this.picBox)).BeginInit();
             this.contextMenuStrip1.SuspendLayout();
             ((System.ComponentModel.ISupportInitialize)(this.myChart)).BeginInit();
@@ -163,7 +165,7 @@
             this.MenuItemLineScan.Name = "MenuItemLineScan";
             this.MenuItemLineScan.Size = new System.Drawing.Size(242, 22);
             this.MenuItemLineScan.Text = "线扫描曲线";
-            this.MenuItemLineScan.Click += new System.EventHandler(this.ShowGrayLevelLine_Click);
+            this.MenuItemLineScan.Click += new System.EventHandler(this.ShowLineScanChart_Click);
             // 
             // PointScanElementMenuItem
             // 
@@ -219,6 +221,15 @@
             this.panelXray.Size = new System.Drawing.Size(781, 169);
             this.panelXray.TabIndex = 0;
             // 
+            // backgroundWorker1
+            // 
+            this.backgroundWorker1.DoWork += new System.ComponentModel.DoWorkEventHandler(this.backgroundWorker1_DoWork);
+            // 
+            // timer1
+            // 
+            this.timer1.Interval = 3000;
+            this.timer1.Tick += new System.EventHandler(this.timer1_Tick);
+            // 
             // OTSMeasureStatusWindow
             // 
             this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
@@ -263,5 +274,7 @@
         private System.Windows.Forms.ToolStripMenuItem VisualAdjustingMenu;
         private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem1;
         private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem2;
+        private System.ComponentModel.BackgroundWorker backgroundWorker1;
+        private System.Windows.Forms.Timer timer1;
     }
 }

+ 102 - 55
OTSIncAMeasureApp/5-OTSMeasureStatuImageFun/OTSMeasureStatusWindow.cs

@@ -264,8 +264,48 @@ namespace OTSMeasureApp
             }
             //设置右键菜单中的项 是否可编辑
             SetContextMenuEnabled(true);
-            AcquireBSEImage();
+           bool rst= AcquireBSEImage();
 
+            //取图不成功就返回
+            if (rst)
+            {
+                bfResult = true;
+            }
+            if (!rst)
+            {
+                if (contextMenuStrip1.Items[(int)MeasureStateMenuType.ChangeDiffImageShow].Enabled == true)
+                {
+                    contextMenuStrip1.Items[(int)MeasureStateMenuType.ChangeDiffImageShow].Enabled = false;
+                }
+                //显示单点扫描元素信息菜单
+                contextMenuStrip1.Items[(int)MeasureStateMenuType.PointScanElementMenuItem].Enabled = false;
+                picBox.Hide();
+                return;
+            }
+            else
+            {
+                //显示单点扫描元素信息菜单
+                contextMenuStrip1.Items[(int)MeasureStateMenuType.PointScanElementMenuItem].Enabled = true;
+            }
+            m_IsShowImageType = ImageType.BSEImage;
+            m_imagetype = ImageType.BSEImage;
+            
+            ShowImage(m_iWidth, m_iHeight, originalBseData);
+
+            IsShowGrayLevelLine = false;
+            //获取默认Y轴
+
+
+            myChart.Visible = false;
+
+            //图像加载后的显示位置
+            m_CurrentMultiple = 0;
+
+
+            picBox.Height = this.RestoreBounds.Height;
+
+            picBox.Left = 0;
+            picBox.Top = 0;
 
 
             DelElementPointGDIObjects();
@@ -276,7 +316,7 @@ namespace OTSMeasureApp
         /// <summary>
         /// 获取BSE图方法
         /// </summary>
-        private void AcquireBSEImage()
+        private bool AcquireBSEImage()
         {
 
             //获取电镜中图像大小
@@ -314,27 +354,16 @@ namespace OTSMeasureApp
 
 
             bool rst = GetScanImage(m_iWidth, m_iHeight, nDwellTime, ref originalBseData);
-            //取图不成功就返回
-            if (rst)
-            {
-                bfResult = true;
-            }
-            if (!rst)
-            {
-                if (contextMenuStrip1.Items[(int)MeasureStateMenuType.ChangeDiffImageShow].Enabled == true)
-                {
-                    contextMenuStrip1.Items[(int)MeasureStateMenuType.ChangeDiffImageShow].Enabled = false;
-                }
-                //显示单点扫描元素信息菜单
-                contextMenuStrip1.Items[(int)MeasureStateMenuType.PointScanElementMenuItem].Enabled = false;
-                picBox.Hide();
-                return;
-            }
-            else
-            {
-                //显示单点扫描元素信息菜单
-                contextMenuStrip1.Items[(int)MeasureStateMenuType.PointScanElementMenuItem].Enabled = true;
-            }
+
+
+            return rst;
+          
+           
+
+        }
+        private void UpdateImageAndLineScanChart()
+        {
+            ShowImage(m_iWidth, m_iHeight, originalBseData);
             //获取灰度图数据
             dGrayLevelData = new double[(int)GrayLevel.Max];
             dGrayLevelData = GetGaryData(originalBseData, dGrayLevelData);
@@ -345,26 +374,19 @@ namespace OTSMeasureApp
             {
                 dGrayLevelMax = Math.Max(dGrayLevelMax, dGrayLevelData[i]);
             }
-            SetClickMenuBSEImg();
-            //更新当前的图
-            //UpdateImageOrChart(m_imagetype);
-
-            ShowImage(m_iWidth, m_iHeight, originalBseData);
-
-            IsShowGrayLevelLine = false;
-            //获取默认Y轴
-
-
-            myChart.Visible = false;
-
-            //图像加载后的显示位置
-            m_CurrentMultiple = 0;
-
-
-            picBox.Height = this.RestoreBounds.Height;
-
-            picBox.Left = 0;
-            picBox.Top = 0;
+            int[] XData = new int[(int)GrayLevel.Max];
+            for (int i = 0; i < (int)GrayLevel.Max; i++)
+            {
+                XData[i] = i + 1;
+            }
+            int[] YData = new int[dGrayLevelData.Length];
+            for (int i = 0; i < dGrayLevelData.Length; i++)
+            {
+                YData[i] = (int)dGrayLevelData[i];
+            }
+            chartData(XData, YData);
+            picBox.Refresh();
+          
 
         }
         public double[] GetGaryData(byte[] Imagedata, double[] GrayLevelData)
@@ -423,17 +445,7 @@ namespace OTSMeasureApp
         }
         #endregion
 
-        #region 设置点击BSE菜单
-        public void SetClickMenuBSEImg()
-        {
-            //用于线扫描曲线
-            m_IsShowImageType = ImageType.BSEImage;
-            m_imagetype = ImageType.BSEImage;
-            picBox.Show();
-
-
-        }
-        #endregion
+       
 
 
         //显示去背景图 = AUTO
@@ -614,7 +626,7 @@ namespace OTSMeasureApp
         #endregion
         //显示线扫描曲线
         #region  显示线扫描曲线
-        private void ShowGrayLevelLine_Click(object sender, EventArgs e)
+        private void ShowLineScanChart_Click(object sender, EventArgs e)
         {
             if (MenuItemLineScan.Checked)
             {
@@ -629,6 +641,14 @@ namespace OTSMeasureApp
             panelXray.Visible = false;
 
             picBox.Refresh();
+            if (IsShowGrayLevelLine)
+            {
+                timer1.Enabled = true;
+            }
+            else 
+            {
+                timer1.Enabled = false;
+            }
 
         }
 
@@ -1930,6 +1950,33 @@ namespace OTSMeasureApp
             m_CurrentMultiple = 0;
             panelXray.Visible = false;
         }
+
+        private void timer1_Tick(object sender, EventArgs e)
+        {
+            log.Info("begin to acquire image");
+            bool rst = AcquireBSEImage();
+            if (rst)
+            {
+                backgroundWorker1.RunWorkerAsync();
+            }
+           
+        }
+
+        private void backgroundWorker1_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e)
+        {
+            
+          
+           
+
+            //更新当前的图
+           
+                log.Info("begin to show image");
+                UpdateImageAndLineScanChart();
+
+           
+        }
+
+      
     }
 }
 

+ 6 - 0
OTSIncAMeasureApp/5-OTSMeasureStatuImageFun/OTSMeasureStatusWindow.resx

@@ -120,4 +120,10 @@
   <metadata name="contextMenuStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
     <value>17, 17</value>
   </metadata>
+  <metadata name="backgroundWorker1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>182, 17</value>
+  </metadata>
+  <metadata name="timer1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>356, 17</value>
+  </metadata>
 </root>

+ 5 - 5
OTSIncAMeasureApp/OTSIncAMeasureAppForm.cs

@@ -761,11 +761,11 @@ namespace OTSMeasureApp
         {
            
             //判断样品台是否有样品,如果有样品则不能设置默认参数
-            if (m_ProjParam.GetSampleCount() > 0)
-            {
-                MessageBox.Show("Cann't setup preference parameter,for you have added some samples!");
-                return;
-            }
+            //if (m_ProjParam.GetSampleCount() > 0)
+            //{
+            //    MessageBox.Show("Cann't setup preference parameter,for you have added some samples!");
+            //    return;
+            //}
             ProgMgrInfoForm ProgMgrForm = new ProgMgrInfoForm();
           
 

+ 14 - 10
OTSIncAReportApp/1-UI/Control_ECharts/EChart_ParticlesComposition.cs

@@ -297,7 +297,8 @@ namespace OTSIncAReportApp.Control_ECharts
             //ListName
             for (int i = 0; i < dt.Rows.Count; i++)
             {
-                listName.Add(dt.Rows[i]["e1"].ToString());
+                if (dt.Rows[i]["e1"].ToString() != "")
+                    listName.Add(dt.Rows[i]["e1"].ToString());
             }
             chart.ListName = listName;
             //DataTable dt 
@@ -306,16 +307,19 @@ namespace OTSIncAReportApp.Control_ECharts
             //ListData
             for (int k = 0; k < dt.Rows.Count; k++)
             {
-                string str = dt.Rows[k]["Cunt"].ToString();
-                string name = dt.Rows[k]["e1"].ToString();
-                
-
-                Item item = new Item()
+                if (dt.Rows[k]["e1"].ToString() != "")
                 {
-                    value = decimal.Round(decimal.Parse(dt.Rows[k]["Cunt"].ToString()), 2).ToString(),
-                    name = name
-                };
-                listData.Add(item);
+                    string str = dt.Rows[k]["Cunt"].ToString();
+                    string name = dt.Rows[k]["e1"].ToString();
+
+
+                    Item item = new Item()
+                    {
+                        value = decimal.Round(decimal.Parse(dt.Rows[k]["Cunt"].ToString()), 2).ToString(),
+                        name = name
+                    };
+                    listData.Add(item);
+                }
 
             }
             chart.ListData = listData;

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

@@ -1429,6 +1429,11 @@ namespace OTSIncAReportGraph.Controls
             //    bThread.Start();
             //}
             SaveFileDialog sfd = new SaveFileDialog();
+
+            var particledata = new ParticleData(resultFile.FilePath);
+            DataTable ParticleAll = particledata.GetParticleTypeInformation();
+            DataTable ParticleClass = particledata.GetParticleClassAll();
+
             sfd.Filter = "png Files(*.png)| *.png |BMP Files(*.bmp)| *.bmp |JPG Files(*.jpg)|*.jpg;*.jpeg";
             if (sfd.ShowDialog() == DialogResult.OK)
             {
@@ -1436,6 +1441,9 @@ namespace OTSIncAReportGraph.Controls
                 ImageExporter outpic = new ImageExporter();
                 outpic.m_list_allDfield = m_list_allDfield;
                 outpic.resultFile = resultFile;
+                outpic.ParticleData = ParticleAll.Copy();
+                outpic.ParticleClassData = ParticleClass.Copy();
+                outpic.pixelSize = imageDisHelper.m_pixelSize;
                 outpic.sfd = sfd;
                 outpic.type = (int)Outpic_enum.ColoredParticles;
                 outpic.m_ReportApp = m_ReportApp;
@@ -2246,6 +2254,8 @@ namespace OTSIncAReportGraph.Controls
                 outpic.sfd = sfd;
                 outpic.type = (int)Outpic_enum.noBackground_pic;
                 outpic.m_ReportApp = m_ReportApp;
+
+                outpic.pixelSize = imageDisHelper.m_pixelSize;
                 Thread bThread = new Thread(new ThreadStart(outpic.opencv_outpic));
 
                 bThread.IsBackground = true;
@@ -2575,6 +2585,11 @@ namespace OTSIncAReportGraph.Controls
         {
             SaveFileDialog sfd = new SaveFileDialog();
 
+            var particledata = new ParticleData(resultFile.FilePath);
+            DataTable ParticleAll = particledata.GetParticleTypeInformation();
+            DataTable ParticleClass = particledata.GetParticleClassAll();
+
+
             sfd.Filter = "png Files(*.png)| *.png |BMP Files(*.bmp)| *.bmp |JPG Files(*.jpg)|*.jpg;*.jpeg";
             if (sfd.ShowDialog() == DialogResult.OK)
             {
@@ -2583,6 +2598,12 @@ namespace OTSIncAReportGraph.Controls
                 ImageExporter outpic = new ImageExporter();
                 outpic.GBDatatableOne = datd;
                 outpic.GridLength = Convert.ToInt32(710.0 / imageDisHelper.m_pixelSize);
+
+                outpic.pixelSize = imageDisHelper.m_pixelSize;
+
+                outpic.ParticleData = ParticleAll.Copy();
+                outpic.ParticleClassData = ParticleClass.Copy();
+
                 outpic.m_list_allDfield = m_list_allDfield;
                 outpic.resultFile = resultFile;
                 outpic.sfd = sfd;
@@ -2599,6 +2620,10 @@ namespace OTSIncAReportGraph.Controls
         {
             SaveFileDialog sfd = new SaveFileDialog();
 
+            var particledata = new ParticleData(resultFile.FilePath);
+            DataTable ParticleAll = particledata.GetParticleTypeInformation();
+            DataTable ParticleClass = particledata.GetParticleClassAll();
+
             sfd.Filter = "png Files(*.png)| *.png |BMP Files(*.bmp)| *.bmp |JPG Files(*.jpg)|*.jpg;*.jpeg";
             if (sfd.ShowDialog() == DialogResult.OK)
             {
@@ -2612,6 +2637,11 @@ namespace OTSIncAReportGraph.Controls
                 outpic.sfd = sfd;
                 outpic.type = (int)Outpic_enum.GBOne;
                 outpic.m_ReportApp = m_ReportApp;
+                
+
+                outpic.ParticleData = ParticleAll.Copy();
+                outpic.ParticleClassData = ParticleClass.Copy();
+
                 Thread bThread = new Thread(new ThreadStart(outpic.opencv_outpic));
                 bThread.IsBackground = true;
                 bThread.Start();
@@ -2622,7 +2652,9 @@ namespace OTSIncAReportGraph.Controls
         private void aSTMToolStripMenuItem1_Click(object sender, EventArgs e)
         {
             SaveFileDialog sfd = new SaveFileDialog();
-
+            var particledata = new ParticleData(resultFile.FilePath);
+            DataTable ParticleAll = particledata.GetParticleTypeInformation();
+            DataTable ParticleClass = particledata.GetParticleClassAll();
             sfd.Filter = "png Files(*.png)| *.png |BMP Files(*.bmp)| *.bmp |JPG Files(*.jpg)|*.jpg;*.jpeg";
             if (sfd.ShowDialog() == DialogResult.OK)
             {
@@ -2636,6 +2668,9 @@ namespace OTSIncAReportGraph.Controls
                 outpic.sfd = sfd;
                 outpic.type = (int)Outpic_enum.GBOne;
                 outpic.m_ReportApp = m_ReportApp;
+
+                outpic.ParticleData = ParticleAll.Copy();
+                outpic.ParticleClassData = ParticleClass.Copy();
                 Thread bThread = new Thread(new ThreadStart(outpic.opencv_outpic));
                 bThread.IsBackground = true;
                 bThread.Start();

+ 120 - 580
OTSIncAReportApp/1-UI/Control_Graph/Controls/ImageExporter.cs

@@ -1,5 +1,7 @@
 using OpenCvSharp;
+using OpenCvSharp.Extensions;
 using OTSCommon.Model;
+using OTSIncAReportApp._1_UI.Control_Graph.Controls;
 using OTSIncAReportGraph;
 using OTSIncAReportGraph.Class;
 using OTSIncAReportGraph.Controls;
@@ -34,244 +36,61 @@ namespace OTSIncAReportApp._3_ServiceCenter
         /// </summary>
         public int GridLength { get; set; }
         public int type = 0;
+        //像素大小
+        public double pixelSize = 0;
 
-        private double picYmin = 0;
+      
         private double picGBYmin = 0;
-        private int imgeH = 0;
-        private int imgeW = 0;
-        /// <summary>
-        /// 获取每行图片的位置配合opencv方法使用
-        /// </summary>
-        /// <returns></returns>
-        private List<DataTable> opencv_piclist()
-        {
-            List<DataTable> list_dt_picdata = new List<DataTable>();
-            DataTable picDatat = new DataTable();
-            picDatat.Columns.Add("X", typeof(double));
-            picDatat.Columns.Add("Y", typeof(double));
-            foreach (var f in m_list_allDfield)
-            {
-                DataRow dr = picDatat.NewRow();
 
-                dr["X"] = f.OTSCoordinatePos.X;
-                dr["Y"] = f.OTSCoordinatePos.Y;
-                picDatat.Rows.Add(dr);
-            }
-            DataTable total_dt_X = picDatat.Copy();
-            DataView dv_x = total_dt_X.DefaultView;
-            DataView dv_x_2 = dv_x.ToTable(true, "X").DefaultView;
-            dv_x_2.Sort = "X ASC";
-            total_dt_X = dv_x_2.ToTable();
+        private double OverlapParamPX = 0;
+   
+   
 
 
-            DataTable total_dt_Y = picDatat.Copy();
-            DataView dv_Y = total_dt_Y.DefaultView;
-            DataView dv_Y_2 = dv_Y.ToTable(true, "Y").DefaultView;
-            dv_Y_2.Sort = "Y ASC";
-            total_dt_Y = dv_Y_2.ToTable();
+        public void opencv_outpic()
+        {
 
+            ImageSplicer imageSplicer = new ImageSplicer();
 
-            for (int i = 0; i < total_dt_Y.Rows.Count; i++)
+            Dictionary<string, object> sampleMembers = ((Dictionary<string, object>)((Dictionary<string, object>)resultFile.ResultInfo["Sample"])["Members"]);
+            Dictionary<string, object> imageProcessParam = (Dictionary<string, object>)((Dictionary<string, object>)((Dictionary<string, object>)sampleMembers["MsrParams"])["Members"])["ImageProcessParam"];
+            object strOverlapParam = "";
+            imageProcessParam.TryGetValue("OverlapParam", out strOverlapParam);
+            if (strOverlapParam == null)
             {
-                NLog.LogManager.GetCurrentClassLogger().Info("Splice line"+i+1.ToString()+"of"+ total_dt_Y.Rows.Count.ToString()+".....");
-                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].OriginalImage.Width, (int)m_list_allDfield[0].OriginalImage.Height);
-
-                    Graphics g = Graphics.FromImage(bitmap);
-                    g.Clear(Color.White);
-                    g.Dispose();
-                    dr2["mat"] = bitmap;
-                    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.OTSCoordinatePos.Y.ToString())
-                    {
-                        for (int c = 0; c < data.Rows.Count; c++)
-                        {
-                            if (data.Rows[c]["X"].ToString() == f.OTSCoordinatePos.X.ToString())
-                            {
-                                data.Rows[c]["mat"] = f.OriginalImage;
-                                data.Rows[c]["X"] = f.OTSCoordinatePos.X;
-                                data.Rows[c]["Y"] = f.OTSCoordinatePos.Y;
-                            }
-                        }
-
-                    }
-                }
-
-
-                DataView dataView1 = data.DefaultView;
-                dataView1.Sort = "X ASC";
-                data = dataView1.ToTable();
-
-
-                list_dt_picdata.Add(data);
+                strOverlapParam = "0";
+                //NLog.LogManager.GetCurrentClassLogger().Info("There are no overlapping dimensions");
+                //return;
             }
+            //获取图像重叠参数(微米需要转换成像素)
+            int OverlapParam = int.Parse(strOverlapParam.ToString());
 
-            return list_dt_picdata;
-        }
-
-        private List<DataTable> color_piclist()
-        {
-            List<DataTable> list_dt_picdata = new List<DataTable>();
-            DataTable picDatat = new DataTable();
-            List<Field> fieldlist = resultFile.List_OTSField;
-            picDatat.Columns.Add("X", typeof(double));
-            picDatat.Columns.Add("Y", typeof(double));
-            foreach (var f in m_list_allDfield)
+            if (OverlapParam==0)
             {
-                DataRow dr = picDatat.NewRow();
-                dr["X"] = f.OTSCoordinatePos.X;
-                dr["Y"] = f.OTSCoordinatePos.Y;
-                picDatat.Rows.Add(dr);
-            }
-            DataTable total_dt_X = picDatat.Copy();
-            DataView dv_x = total_dt_X.DefaultView;
-            DataView dv_x_2 = dv_x.ToTable(true, "X").DefaultView;
-            dv_x_2.Sort = "X ASC";
-            total_dt_X = dv_x_2.ToTable();
-
-
-            DataTable total_dt_Y = picDatat.Copy();
-            DataView dv_Y = total_dt_Y.DefaultView;
-            DataView dv_Y_2 = dv_Y.ToTable(true, "Y").DefaultView;
-            dv_Y_2.Sort = "Y ASC";
-            total_dt_Y = dv_Y_2.ToTable();
-            picYmin = Convert.ToDouble(total_dt_Y.Rows[0]["Y"]);
-
-            for (int i = 0; i < total_dt_Y.Rows.Count; i++)
+                OverlapParamPX = 0;
+            }else
             {
-                NLog.LogManager.GetCurrentClassLogger().Info("Splice line" + i + 1.ToString() + "of" + total_dt_Y.Rows.Count.ToString() + ".....");
-                DataTable data = new DataTable();
-                data.Columns.Add("mat", typeof(Bitmap));
-                data.Columns.Add("X", typeof(double));
-                data.Columns.Add("Y", typeof(double));
-                imgeH = (int)m_list_allDfield[0].OriginalImage.Height;
-                imgeW = (int)m_list_allDfield[0].OriginalImage.Width;
-                Bitmap bitmap = new Bitmap((int)m_list_allDfield[0].OriginalImage.Width, (int)m_list_allDfield[0].OriginalImage.Height);
-                for (int a = 0; a < total_dt_X.Rows.Count; a++)
-                {
-                    DataRow dr2 = data.NewRow();
-                    Graphics g = Graphics.FromImage(bitmap);
-
-                    g.Clear(Color.White);
-                    g.Dispose();
-                    dr2["mat"] = bitmap;
-                    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.OTSCoordinatePos.Y.ToString())
-                    {
-                        for (int c = 0; c < data.Rows.Count; c++)
-                        {
-                            if (data.Rows[c]["X"].ToString() == f.OTSCoordinatePos.X.ToString())
-                            {
-
-                                Bitmap image = new Bitmap(bitmap.Width, bitmap.Height);
-                                Graphics graph_2 = Graphics.FromImage(image);
-                                Color color1 = Color.FromArgb(217, 217, 217);
-                                graph_2.Clear(color1);
-
-                                //Color color1 = Color.FromArgb(217, 217, 217);
-                                //graph_2.Clear(color1);
-
-                                for (int a = 0; a < fieldlist.Count; a++)
-                                {
-                                    if (fieldlist[a].FieldID.ToString() == f.FieldID.ToString())
-                                    {
-                                        //先获取该Field中的所有Particle
-                                        List<Particle> list_particle;
-                                        list_particle = fieldlist[a].ParticleList;
-                                        //再循环计算所有的Particle对象
-                                        foreach (Particle particle in list_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对象中
-
-                                                System.Drawing.Point on_p = new System.Drawing.Point() { X = seg.Start, Y = seg.Height };
-                                                System.Drawing.Point off_p = new System.Drawing.Point() { X = seg.Start + seg.Length, Y = seg.Height };
-                                                var color = DrawFunction.GetColorBySTDTypeIDForBSEAndSorImage(particle.TypeColor, particle.TypeId);
-                                                Pen npen = new Pen(color);
-                                                graph_2.DrawLine(npen, on_p, off_p);
-
-                                                #endregion
-                                            }
-                                        }
-                                    }
-                                    
-                                }
-                                data.Rows[c]["mat"] = image;
-                                data.Rows[c]["X"] = f.OTSCoordinatePos.X;
-                                data.Rows[c]["Y"] = f.OTSCoordinatePos.Y;
-                            }
-                        }
-
-                    }
-                }
-
-
-                DataView dataView1 = data.DefaultView;
-                dataView1.Sort = "X ASC";
-                data = dataView1.ToTable();
-
-
-                list_dt_picdata.Add(data);
+                OverlapParamPX = OverlapParam / pixelSize;
             }
 
-            return list_dt_picdata;
-        }
-
-
-        public void opencv_outpic()
-        {
-
-            
             List<DataTable> list_dt_picdata = new List<DataTable>();
             OpenCvSharp.Mat[] list_mats;
-            if (type == (int)Outpic_enum.pic)
+            //导出拼接图片外加颗粒渲染
+            if (type ==(int)Outpic_enum.ColoredParticles)
             {
-                list_dt_picdata = opencv_piclist();
+                list_dt_picdata = imageSplicer.ImageStitchingParticleRendering(resultFile, m_list_allDfield);
                 list_mats = new OpenCvSharp.Mat[list_dt_picdata.Count];
             }
-            else if (type == (int)Outpic_enum.Render_pic)
-            {
-                list_dt_picdata = opencv_piclist_Render();
-                list_mats = new OpenCvSharp.Mat[list_dt_picdata.Count + 1];
-            }
-            //国标导出拼接图
+            //导出国标外加颗粒渲染
             else if (type == (int)Outpic_enum.GBOne)
             {
-                list_dt_picdata = color_piclist();
+                list_dt_picdata = imageSplicer.ImageStitchingParticleRendering(resultFile, m_list_allDfield);
                 list_mats = new OpenCvSharp.Mat[list_dt_picdata.Count];
             }
-            //导出没背景颗粒渲染的图
-            else if (type == (int)Outpic_enum.ColoredParticles)
-            {
-                list_dt_picdata = color_piclist();
-                list_mats = new OpenCvSharp.Mat[list_dt_picdata.Count];
-            }
-            //导出没背景有颗粒的图
+            //导出拼接图片
             else
             {
-                list_dt_picdata = NoBackgroundParticleDiagram();
+                list_dt_picdata = imageSplicer.Mosaics(resultFile, m_list_allDfield);
                 list_mats = new OpenCvSharp.Mat[list_dt_picdata.Count];
             }
 
@@ -279,40 +98,58 @@ namespace OTSIncAReportApp._3_ServiceCenter
             NLog.LogManager.GetCurrentClassLogger().Info("Organize and splice all pictures......");
 
             List<OpenCvSharp.Mat> list_pano = new List<OpenCvSharp.Mat>();
-
+            List<Bitmap> list_panos = new List<Bitmap>();
             //循环保存每行拼接的图片
             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++)
+                // 计算新Bitmap的总宽度和高度  
+                int totalWidth = 0;
+                int maxHeight = 0;
+                for ( int c=0;c< list_dt_picdata[i].Rows.Count;c++)
+                {
+                    Bitmap bitmap = (Bitmap)list_dt_picdata[i].Rows[c]["mat"];
+                    totalWidth += bitmap.Width; // 减去重叠部分将在绘制时处理  
+                    maxHeight = Math.Max(maxHeight, bitmap.Height);
+                }
+                // 因为有n张图片,它们之间会有n-1个重叠区域,所以需要从总宽度中减去这些重叠的像素  
+                // 注意:如果图片数量小于2,则不需要减去任何重叠部分  
+                if (list_dt_picdata[i].Rows.Count > 1)
                 {
-                    mats[a] = OpenCvSharp.Extensions.BitmapConverter.ToMat((Bitmap)list_dt_picdata[i].Rows[a]["mat"]);
+                    totalWidth -= (list_dt_picdata[i].Rows.Count - 1) * (int)OverlapParamPX;
                 }
-                OpenCvSharp.Mat pano = new OpenCvSharp.Mat();
-                
-                OpenCvSharp.Cv2.HConcat(mats, pano);
-                list_pano.Add(pano);
-             
+                // 创建一个新的Bitmap对象来存储拼接后的图像  
+                Bitmap combinedImage = new Bitmap(totalWidth, maxHeight);
 
+                // 使用Graphics对象来绘制拼接后的图像  
+                using (Graphics g = Graphics.FromImage(combinedImage))
+                {
+                    int currentX = 0;
+                    for (int b=0;b< list_dt_picdata[i].Rows.Count; b++)
+                    {
+                        Bitmap bitmap = (Bitmap)list_dt_picdata[i].Rows[b]["mat"];
+                        // 绘制当前图片,注意调整X坐标以实现重叠  
+                        g.DrawImage(bitmap, new Rectangle(currentX, 0, bitmap.Width, bitmap.Height));
+
+                        // 更新当前X坐标,为下一张图片留出空间(包括重叠部分)  
+                        currentX += bitmap.Width - (list_dt_picdata[i].Rows.Count > 1 ? (int)OverlapParamPX : 0); // 如果不是最后一张图片,则减去重叠的20像素  
+                    }
+                }
+                Mat mat = BitmapConverter.ToMat(combinedImage);
+                list_pano.Add(mat);
+                list_panos.Add(combinedImage);
             }
            
 
             //导出原图(渲染图)在下方增加每种颜色的标注和面积占比
-            if (type == (int)Outpic_enum.Render_pic /*|| type == (int)Outpic_enum.GBOne*/)
+            if (type == (int)Outpic_enum.ColoredParticles || type == (int)Outpic_enum.GBOne)
             {
                 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);
@@ -320,7 +157,6 @@ namespace OTSIncAReportApp._3_ServiceCenter
                 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++)
                 {
@@ -347,120 +183,20 @@ namespace OTSIncAReportApp._3_ServiceCenter
 
                     Gitter_X = Gitter_X + 350;
                 }
-
+                list_panos.Add(bitmap);
                 g.Dispose();
-                OpenCvSharp.Mat pano = OpenCvSharp.Extensions.BitmapConverter.ToMat(bitmap);
-                list_pano.Add(pano);
-            }
-
-            for (int i = 0; i < list_mats.Length; i++)
-            {
-                list_mats[i] = list_pano[i];
             }
-
+            Bitmap combined = MergeImagesVertically(list_panos, (int)OverlapParamPX);
             NLog.LogManager.GetCurrentClassLogger().Info("Picture splicing completed.");
             NLog.LogManager.GetCurrentClassLogger().Info("Save to disk......");
-            OpenCvSharp.Mat save_pano = new OpenCvSharp.Mat();
-            OpenCvSharp.Cv2.VConcat(list_mats, save_pano);
-
+            OpenCvSharp.Mat save_pano = BitmapConverter.ToMat(combined);
+          
             if (type == (int)Outpic_enum.GBOne)
             {
-                // 创建一个HashSet来存储唯一的值  
-                HashSet<int> distinctValuesY = new HashSet<int>();
-                // 创建一个HashSet来存储唯一的值  
-                HashSet<int> distinctValuesX = new HashSet<int>();
-                for (int i = 0; i < GBDatatableOne.Rows.Count; i++)
-                {
-                    distinctValuesY.Add(Convert.ToInt32(GBDatatableOne.Rows[i]["fieldY"]));
-                    distinctValuesX.Add(Convert.ToInt32(GBDatatableOne.Rows[i]["fieldX"]));
-                }
-                //int picdataYmin = Convert.ToInt32(list_dt_picdata[0].Rows[0]["Y"]);
-                //int picdataXmin = Convert.ToInt32(list_dt_picdata[0].Rows[0]["X"]);
-                var distinctY = distinctValuesY.ToList();
-                distinctY.Sort((a, b) => b.CompareTo(a));
-                var distinctX = distinctValuesX.ToList();
-                distinctX.Sort();
-
-                //int Yzhou = 0;
-                int Yzhou = (int)picYmin- distinctY.Min();
-                Yzhou = Yzhou + (GridLength / 2) + (imgeH / 2);
-                for (int i = 0; i < distinctY.Count; i++)
-                {
-                    int Xzhou = +(GridLength / 2) /*+ (imgeW / 2)*/;
-                    DataTable number = CountTheNumberOfX_axes(GBDatatableOne, "fieldY", distinctY[i].ToString());
-                    for (int j = 0; j < number.Rows.Count; j++)
-                    {
-
-                        // 定义矩形的左上角和右下角坐标  
-                        OpenCvSharp.Point topLeft = new OpenCvSharp.Point(Xzhou, Yzhou);
-                        int XzhouDOW = Xzhou + GridLength;
-                        int YzhouDOW = Yzhou + GridLength;
-                        OpenCvSharp.Point textOrg = new OpenCvSharp.Point(Xzhou + 20, Yzhou + 70); // 文字开始的位置  
-                        OpenCvSharp.Point bottomRight = new OpenCvSharp.Point(XzhouDOW, YzhouDOW);
-                        Xzhou = Xzhou + GridLength;
-
-                        // 定义矩形的颜色(BGR)和线宽  
-                        OpenCvSharp.Scalar color = new OpenCvSharp.Scalar(0, 0, 255, 255); // 蓝色  
-                        int thickness = 2;
-                        // 在图像上绘制矩形  
-                        OpenCvSharp.Cv2.Rectangle(save_pano, topLeft, bottomRight, color, thickness);
-
-                        // 设置要绘制的文字及其位置  
-                        string text = number.Rows[j]["data"].ToString();
-
-
-                        string input = number.Rows[j]["data"].ToString();
-                        double fontScale = 1; // 字体大小缩放因子  
-                        int thickness2 = 1; // 字体粗细 
-                        // 获取文字的大小,以便我们可以更好地定位它  
-                        OpenCvSharp.Size textSize = OpenCvSharp.Cv2.GetTextSize(input, HersheyFonts.HersheySimplex, fontScale, thickness2, out int baseline);
-                        int chunkSize = GridLength / textSize.Height; // 分割长度  
-                        // 使用LINQ的Enumerable.Chunk扩展方法分割字符串  
-                        var chunks = Enumerable.Range(0, input.Length / chunkSize + (input.Length % chunkSize > 0 ? 1 : 0))
-                            .Select(x => input.Substring(x * chunkSize, Math.Min(chunkSize, input.Length - x * chunkSize)))
-                            .ToList();
-    
-                        int topgrade = Convert.ToInt32(number.Rows[j]["color"]);
-                        // 设置字体样式和大小  
-                        Color color1 = new Color();
-                        switch (topgrade)
-                        {
-                            case 0:
-                                color1 = Color.White;
-                                break;
-                            case 1:
-                                color1 = Color.DarkGray;
-                                break;
-                            case 2:
-                                color1 = Color.Purple;
-                                break;
-                            case 3:
-                                color1 = Color.Blue;
-                                break;
-                            case 4:
-                                color1 = Color.Red;
-                                break;
-                            case 5:
-                                color1 = Color.Red;
-                                break;
-                            default:
-                                color1 = Color.Red;
-                                break;
-
-                        }
-                        OpenCvSharp.Scalar fontColor = new OpenCvSharp.Scalar(color1.B, color1.G, color1.R, 255); // 文字颜色:黑色  
-                        OpenCvSharp.LineTypes lineType = OpenCvSharp.LineTypes.AntiAlias; // 线条类型  
-
-                        foreach (var chunk in chunks)
-                        {
-                            // 使用PutText方法在图像上绘制文字  
-                            OpenCvSharp.Cv2.PutText(save_pano, chunk, textOrg, HersheyFonts.HersheySimplex, fontScale, fontColor, thickness, lineType);
-                            textOrg.Y = textOrg.Y + 70;
-                        }
-                    }
-                    Yzhou = Yzhou + GridLength;
-                }
+                imageSplicer.DrawingOfNationalStandardBoxes(GBDatatableOne, GridLength, save_pano);
+           
             }
+
             OpenCvSharp.Cv2.ImWrite(sfd.FileName, save_pano);
             NLog.LogManager.GetCurrentClassLogger().Info("Save complete.");
             Control_DrawDistrbutionImageAndBSE v = m_ReportApp.im_Control_DrawDistrbutionImageAndBSE;
@@ -468,24 +204,60 @@ namespace OTSIncAReportApp._3_ServiceCenter
             v.Invoke(MyEvent);
         }
 
-        private DataTable CountTheNumberOfX_axes(DataTable dataTable, string ColumnName, string name)
+
+        private  Bitmap MergeImagesVertically(List<Bitmap> images, int overlap)
         {
+            if (images == null || images.Count == 0)
+            {
+                throw new ArgumentException("输入的图片数组不能为空或没有元素");
+            }
+
+            // 计算新Bitmap的宽度和高度  
+            int totalWidth = 0;
+            int totalHeight = 0;
+
+            // 找到最宽的宽度  
+            foreach (var img in images)
+            {
+                if (img.Width > totalWidth)
+                {
+                    totalWidth = img.Width;
+                }
+                //totalHeight += img.Height - (img != images[images.Count - 1] ? overlap : 0); // 最后一张图片不减去重叠  
+            }
+            int imgHeight = (int)OverlapParamPX * (images.Count - 1);
+            totalHeight = images[0].Height * (images.Count-1) - imgHeight;
+            // 为最后一张图片添加完整的高度  
+            if (images.Count > 1)
+            {
+                totalHeight += images[images.Count - 1].Height;
+            }
+            else
+            {
+                // 如果只有一张图片,则不需要调整高度  
+                totalHeight = images[0].Height;
+            }
+
+            Bitmap result = new Bitmap(totalWidth, totalHeight);
 
-            DataTable data = new DataTable();
-            data.Columns.Add("data");
-            data.Columns.Add("color");
-            for (int i = 0; i < dataTable.Rows.Count; i++)
+            using (Graphics g = Graphics.FromImage(result))
             {
-                if (name == dataTable.Rows[i][ColumnName].ToString())
+                g.Clear(Color.Transparent); // 或者设置为其他背景色  
+
+                int offsetY = 0;
+                foreach (var img in images)
                 {
-                    DataRow dr = data.NewRow();
-                    dr["data"] = dataTable.Rows[i]["gradeDetail"].ToString();
-                    dr["color"] = dataTable.Rows[i]["topGrade"].ToString();
-                    data.Rows.Add(dr);
+                    // 绘制图片,考虑重叠部分  
+                    g.DrawImage(img, new Rectangle(0, offsetY, img.Width, img.Height));
+
+                    // 更新偏移量  
+                    offsetY += img.Height - (img != images[images.Count - 1] ? overlap : 0);
                 }
             }
-            return data;
+
+            return result;
         }
+
         private int getPICstringLong(DataTable particleData, List<OpenCvSharp.Mat> list_pano)
         {
             int Long = 1;
@@ -569,238 +341,6 @@ namespace OTSIncAReportApp._3_ServiceCenter
 
         }
 
-        private List<DataTable> NoBackgroundParticleDiagram()
-        {
-            List<DataTable> list_dt_picdata = new List<DataTable>();
-            DataTable picDatat = new DataTable();
-            List<Field> fieldlist = resultFile.List_OTSField;
-            picDatat.Columns.Add("X", typeof(double));
-            picDatat.Columns.Add("Y", typeof(double));
-            foreach (var f in m_list_allDfield)
-            {
-                DataRow dr = picDatat.NewRow();
-                dr["X"] = f.OTSCoordinatePos.X;
-                dr["Y"] = f.OTSCoordinatePos.Y;
-                picDatat.Rows.Add(dr);
-            }
-
-            DataTable total_dt_X = picDatat.Copy();
-            DataView dv_x = total_dt_X.DefaultView;
-            DataView dv_x_2 = dv_x.ToTable(true, "X").DefaultView;
-            dv_x_2.Sort = "X ASC";
-            total_dt_X = dv_x_2.ToTable();
-
-
-            DataTable total_dt_Y = picDatat.Copy();
-            DataView dv_Y = total_dt_Y.DefaultView;
-            DataView dv_Y_2 = dv_Y.ToTable(true, "Y").DefaultView;
-            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() + ".....");
-
-                DataTable data = new DataTable();
-                data.Columns.Add("mat", typeof(Bitmap));
-                data.Columns.Add("X", typeof(double));
-                //循环每行图片进行拼接
-                Bitmap bitmap = new Bitmap((int)m_list_allDfield[0].OriginalImage.Width, (int)m_list_allDfield[0].OriginalImage.Height);
-                
-                for (int a = 0; a < total_dt_X.Rows.Count; a++)
-                {
-                    DataRow dr2 = data.NewRow();
-                    Graphics g = Graphics.FromImage(bitmap);
-
-                    g.Clear(Color.White);
-                    g.Dispose();
-                    dr2["mat"] = bitmap;
-                    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.OTSCoordinatePos.Y.ToString())
-                    {
-                        //循环图片的行数
-                        for (int c = 0; c < data.Rows.Count; c++)
-                        {
-                            if (data.Rows[c]["X"].ToString() == f.OTSCoordinatePos.X.ToString())
-                            {
-                                Bitmap image = new Bitmap(bitmap.Width, bitmap.Height);
-                                Graphics g2 = Graphics.FromImage(image);
-                                //g2.Clear(Color.White);
-                                Color color1 = Color.FromArgb(217, 217, 217);
-                                g2.Clear(color1);
-                                g2.DrawImage(image, 0, 0, f.OriginalImage.Width, f.OriginalImage.Height);
-                                Graphics graph_2 = Graphics.FromImage(image);
-
-                                for (int a = 0; a < fieldlist.Count; a++)
-                                {
-                                    if (fieldlist[a].FieldID.ToString() == f.FieldID.ToString())
-                                    {
-                                        //先获取该Field中的所有Particle
-                                        List<Particle> list_particle;
-                                        list_particle = fieldlist[a].ParticleList;
-                                        //再循环计算所有的Particle对象
-                                        foreach (Particle particle in list_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对象中
-
-                                                System.Drawing.Point on_p = new System.Drawing.Point() { X = seg.Start, Y = seg.Height };
-                                                System.Drawing.Point off_p = new System.Drawing.Point() { X = seg.Start + seg.Length, Y = seg.Height };
-                                                Pen npen = new Pen(Color.FromArgb(255-particle.AveGray, 0, 0, 0));
-                                                graph_2.DrawLine(npen, on_p, off_p);
-
-                                                #endregion
-                                            }
-                                        }
-                                    }
-                                }
-                                data.Rows[c]["mat"] = image;
-                                data.Rows[c]["X"] = f.OTSCoordinatePos.X;
-                            }
-                        }
-                    }
-
-                }
-
-
-
-                DataView dataView1 = data.DefaultView;
-                dataView1.Sort = "X ASC";
-                data = dataView1.ToTable();
-                list_dt_picdata.Add(data);
-            }
-
-            return list_dt_picdata;
-        }
-
-        private List<DataTable> opencv_piclist_Render()
-        {
-            List<DataTable> list_dt_picdata = new List<DataTable>();
-            DataTable picDatat = new DataTable();
-            List<Field> fieldlist = resultFile.List_OTSField;
-            picDatat.Columns.Add("X", typeof(double));
-            picDatat.Columns.Add("Y", typeof(double));
-            foreach (var f in m_list_allDfield)
-            {
-                DataRow dr = picDatat.NewRow();
-                dr["X"] = f.OTSCoordinatePos.X;
-                dr["Y"] = f.OTSCoordinatePos.Y;
-                picDatat.Rows.Add(dr);
-            }
-
-            DataTable total_dt_X = picDatat.Copy();
-            DataView dv_x = total_dt_X.DefaultView;
-            DataView dv_x_2 = dv_x.ToTable(true, "X").DefaultView;
-            dv_x_2.Sort = "X ASC";
-            total_dt_X = dv_x_2.ToTable();
-
-
-            DataTable total_dt_Y = picDatat.Copy();
-            DataView dv_Y = total_dt_Y.DefaultView;
-            DataView dv_Y_2 = dv_Y.ToTable(true, "Y").DefaultView;
-            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() + ".....");
-
-                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].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"];
-                    data.Rows.Add(dr2);
-                }
-                //循环所有图片
-                foreach (var f in m_list_allDfield)
-                {
-                    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.OTSCoordinatePos.X.ToString())
-                            {
-                                Bitmap image = new Bitmap(f.OriginalImage.Width, f.OriginalImage.Height);
-                                Graphics g2 = Graphics.FromImage(image);
-                                g2.DrawImage(f.OriginalImage, 0, 0, f.OriginalImage.Width, f.OriginalImage.Height);
-                                Graphics graph_2 = Graphics.FromImage(image);
-
-                                for (int a = 0; a < fieldlist.Count; a++)
-                                {
-                                    if (fieldlist[a].FieldID.ToString() == f.FieldID.ToString())
-                                    {
-                                        //先获取该Field中的所有Particle
-                                        List<Particle> list_particle;
-                                        list_particle = fieldlist[a].ParticleList;
-                                        //再循环计算所有的Particle对象
-                                        foreach (Particle particle in list_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对象中
-
-                                                System.Drawing.Point on_p = new System.Drawing.Point() { X = seg.Start, Y = seg.Height };
-                                                System.Drawing.Point off_p = new System.Drawing.Point() { X = seg.Start + seg.Length, Y = seg.Height };
-                                                var color = DrawFunction.GetColorBySTDTypeIDForBSEAndSorImage(particle.TypeColor, particle.TypeId);
-                                                Pen npen = new Pen(color);
-                                                graph_2.DrawLine(npen, on_p, off_p);
-
-                                                #endregion
-                                            }
-                                        }
-                                    }
-                                }
-                                data.Rows[c]["mat"] = image;
-                                data.Rows[c]["X"] = f.OTSCoordinatePos.X;
-                            }
-                        }
-                    }
-
-                }
-
-
-
-                DataView dataView1 = data.DefaultView;
-                dataView1.Sort = "X ASC";
-                data = dataView1.ToTable();
-                list_dt_picdata.Add(data);
-            }
-
-            return list_dt_picdata;
-        }
         #region 合并天宇颗粒融合新增函数
         public void opencv_outpic2(/*int type*/)
         {

+ 398 - 0
OTSIncAReportApp/1-UI/Control_Graph/Controls/ImageSplicer.cs

@@ -0,0 +1,398 @@
+using OpenCvSharp;
+using OpenCvSharp.Extensions;
+using OTSCommon.Model;
+using OTSIncAReportGraph;
+using OTSIncAReportGraph.Class;
+using System;
+using System.Collections.Generic;
+using System.Data;
+using System.Drawing;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace OTSIncAReportApp._1_UI.Control_Graph.Controls
+{
+    class ImageSplicer
+    {
+        public double picYmin { get; set; }
+        public double picXmin { get; set; }
+        public int imgeH { get; set; }
+        public int imgeW { get; set; }
+        /// <summary>
+        /// 单纯图像拼接无颗粒颜色渲染
+        /// </summary>
+        /// <param name="resultFile"></param>
+        /// <param name="m_list_allDfield"></param>
+        /// <returns></returns>
+        public List<DataTable> Mosaics(ResultFile resultFile,List<DisplayRectangle> m_list_allDfield)
+        {
+            List<DataTable> list_dt_picdata = new List<DataTable>();
+            DataTable picDatat = new DataTable();
+            List<Field> fieldlist = resultFile.List_OTSField;
+            picDatat.Columns.Add("X", typeof(double));
+            picDatat.Columns.Add("Y", typeof(double));
+            foreach (var f in m_list_allDfield)
+            {
+                DataRow dr = picDatat.NewRow();
+                dr["X"] = f.OTSCoordinatePos.X;
+                dr["Y"] = f.OTSCoordinatePos.Y;
+                picDatat.Rows.Add(dr);
+            }
+
+            DataTable total_dt_X = picDatat.Copy();
+            DataView dv_x = total_dt_X.DefaultView;
+            DataView dv_x_2 = dv_x.ToTable(true, "X").DefaultView;
+            dv_x_2.Sort = "X ASC";
+            total_dt_X = dv_x_2.ToTable();
+
+
+            DataTable total_dt_Y = picDatat.Copy();
+            DataView dv_Y = total_dt_Y.DefaultView;
+            DataView dv_Y_2 = dv_Y.ToTable(true, "Y").DefaultView;
+            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() + ".....");
+
+                DataTable data = new DataTable();
+                data.Columns.Add("mat", typeof(Bitmap));
+                data.Columns.Add("X", typeof(double));
+                //循环每行图片进行拼接
+                Bitmap bitmap = new Bitmap((int)m_list_allDfield[0].OriginalImage.Width, (int)m_list_allDfield[0].OriginalImage.Height);
+
+                for (int a = 0; a < total_dt_X.Rows.Count; a++)
+                {
+                    DataRow dr2 = data.NewRow();
+                    Graphics g = Graphics.FromImage(bitmap);
+
+                    g.Clear(Color.White);
+                    g.Dispose();
+                    dr2["mat"] = bitmap;
+                    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.OTSCoordinatePos.Y.ToString())
+                    {
+                        //循环图片的行数
+                        for (int c = 0; c < data.Rows.Count; c++)
+                        {
+                            if (data.Rows[c]["X"].ToString() == f.OTSCoordinatePos.X.ToString())
+                            {
+                                Bitmap image = new Bitmap(bitmap.Width, bitmap.Height);
+                                Graphics g2 = Graphics.FromImage(image);
+                                //g2.Clear(Color.White);
+                                Color color1 = Color.FromArgb(217, 217, 217);
+                                g2.Clear(color1);
+                                g2.DrawImage(image, 0, 0, f.OriginalImage.Width, f.OriginalImage.Height);
+                                Graphics graph_2 = Graphics.FromImage(image);
+
+                                for (int a = 0; a < fieldlist.Count; a++)
+                                {
+                                    if (fieldlist[a].FieldID.ToString() == f.FieldID.ToString())
+                                    {
+                                        //先获取该Field中的所有Particle
+                                        List<Particle> list_particle;
+                                        list_particle = fieldlist[a].ParticleList;
+                                        //再循环计算所有的Particle对象
+                                        foreach (Particle particle in list_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对象中
+
+                                                System.Drawing.Point on_p = new System.Drawing.Point() { X = seg.Start, Y = seg.Height };
+                                                System.Drawing.Point off_p = new System.Drawing.Point() { X = seg.Start + seg.Length, Y = seg.Height };
+                                                Pen npen = new Pen(Color.FromArgb(255 - particle.AveGray, 0, 0, 0));
+                                                graph_2.DrawLine(npen, on_p, off_p);
+
+                                                #endregion
+                                            }
+                                        }
+                                    }
+                                }
+                                data.Rows[c]["mat"] = image;
+                                data.Rows[c]["X"] = f.OTSCoordinatePos.X;
+                            }
+                        }
+                    }
+
+                }
+
+
+
+                DataView dataView1 = data.DefaultView;
+                dataView1.Sort = "X ASC";
+                data = dataView1.ToTable();
+                list_dt_picdata.Add(data);
+            }
+
+            return list_dt_picdata;
+        }
+        /// <summary>
+        /// 图像拼接并进行颗粒渲染颜色
+        /// </summary>
+        /// <param name="resultFile"></param>
+        /// <param name="m_list_allDfield"></param>
+        /// <returns></returns>
+        public List<DataTable> ImageStitchingParticleRendering(ResultFile resultFile, List<DisplayRectangle> m_list_allDfield)
+        {
+            List<DataTable> list_dt_picdata = new List<DataTable>();
+            DataTable picDatat = new DataTable();
+            List<Field> fieldlist = resultFile.List_OTSField;
+            picDatat.Columns.Add("X", typeof(double));
+            picDatat.Columns.Add("Y", typeof(double));
+            foreach (var f in m_list_allDfield)
+            {
+                DataRow dr = picDatat.NewRow();
+                dr["X"] = f.OTSCoordinatePos.X;
+                dr["Y"] = f.OTSCoordinatePos.Y;
+                picDatat.Rows.Add(dr);
+            }
+            DataTable total_dt_X = picDatat.Copy();
+            DataView dv_x = total_dt_X.DefaultView;
+            DataView dv_x_2 = dv_x.ToTable(true, "X").DefaultView;
+            dv_x_2.Sort = "X ASC";
+            total_dt_X = dv_x_2.ToTable();
+
+
+            DataTable total_dt_Y = picDatat.Copy();
+            DataView dv_Y = total_dt_Y.DefaultView;
+            DataView dv_Y_2 = dv_Y.ToTable(true, "Y").DefaultView;
+            dv_Y_2.Sort = "Y ASC";
+            total_dt_Y = dv_Y_2.ToTable();
+            picYmin = Convert.ToDouble(total_dt_Y.Rows[total_dt_Y.Rows.Count - 1]["Y"]);
+            picXmin = Convert.ToDouble(total_dt_X.Rows[0]["X"]);
+            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() + ".....");
+                DataTable data = new DataTable();
+                data.Columns.Add("mat", typeof(Bitmap));
+                data.Columns.Add("X", typeof(double));
+                data.Columns.Add("Y", typeof(double));
+                imgeH = (int)m_list_allDfield[0].OriginalImage.Height;
+                imgeW = (int)m_list_allDfield[0].OriginalImage.Width;
+                Bitmap bitmap = new Bitmap((int)m_list_allDfield[0].OriginalImage.Width, (int)m_list_allDfield[0].OriginalImage.Height);
+                for (int a = 0; a < total_dt_X.Rows.Count; a++)
+                {
+                    DataRow dr2 = data.NewRow();
+                    Graphics g = Graphics.FromImage(bitmap);
+
+                    g.Clear(Color.White);
+                    g.Dispose();
+                    dr2["mat"] = bitmap;
+                    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.OTSCoordinatePos.Y.ToString())
+                    {
+                        for (int c = 0; c < data.Rows.Count; c++)
+                        {
+                            if (data.Rows[c]["X"].ToString() == f.OTSCoordinatePos.X.ToString())
+                            {
+
+                                Bitmap image = new Bitmap(bitmap.Width, bitmap.Height);
+                                Graphics graph_2 = Graphics.FromImage(image);
+                                Color color1 = Color.FromArgb(217, 217, 217);
+                                graph_2.Clear(color1);
+
+                                //Color color1 = Color.FromArgb(217, 217, 217);
+                                //graph_2.Clear(color1);
+
+                                for (int a = 0; a < fieldlist.Count; a++)
+                                {
+                                    if (fieldlist[a].FieldID.ToString() == f.FieldID.ToString())
+                                    {
+                                        //先获取该Field中的所有Particle
+                                        List<Particle> list_particle;
+                                        list_particle = fieldlist[a].ParticleList;
+                                        //再循环计算所有的Particle对象
+                                        foreach (Particle particle in list_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对象中
+
+                                                System.Drawing.Point on_p = new System.Drawing.Point() { X = seg.Start, Y = seg.Height };
+                                                System.Drawing.Point off_p = new System.Drawing.Point() { X = seg.Start + seg.Length, Y = seg.Height };
+                                                var color = DrawFunction.GetColorBySTDTypeIDForBSEAndSorImage(particle.TypeColor, particle.TypeId);
+                                                Pen npen = new Pen(color);
+                                                graph_2.DrawLine(npen, on_p, off_p);
+
+                                                #endregion
+                                            }
+                                        }
+                                    }
+
+                                }
+                                data.Rows[c]["mat"] = image;
+                                data.Rows[c]["X"] = f.OTSCoordinatePos.X;
+                                data.Rows[c]["Y"] = f.OTSCoordinatePos.Y;
+                            }
+                        }
+
+                    }
+                }
+
+
+                DataView dataView1 = data.DefaultView;
+                dataView1.Sort = "X ASC";
+                data = dataView1.ToTable();
+
+
+                list_dt_picdata.Add(data);
+            }
+
+            return list_dt_picdata;
+        }
+
+        public Mat DrawingOfNationalStandardBoxes(DataTable GBDatatableOne,int GridLength, Mat save_pano)
+        {
+            // 创建一个HashSet来存储唯一的值  
+            HashSet<int> distinctValuesY = new HashSet<int>();
+            // 创建一个HashSet来存储唯一的值  
+            HashSet<int> distinctValuesX = new HashSet<int>();
+            for (int i = 0; i < GBDatatableOne.Rows.Count; i++)
+            {
+                distinctValuesY.Add(Convert.ToInt32(GBDatatableOne.Rows[i]["fieldY"]));
+                distinctValuesX.Add(Convert.ToInt32(GBDatatableOne.Rows[i]["fieldX"]));
+            }
+
+            //OTS坐标向上为正,向右为正
+            var distinctY = distinctValuesY.ToList();
+            distinctY.Sort((a, b) => b.CompareTo(a));
+            var distinctX = distinctValuesX.ToList();
+            distinctX.Sort();
+
+            //取到Y轴图片的最上边的位置
+            picYmin = picYmin + (imgeH / 2);
+
+            int GBY = distinctY.Max() + (GridLength / 2);
+
+            int Yzhou = (int)picYmin - GBY;
+
+
+            picXmin = picXmin - (imgeW / 2);
+            int GBX = distinctX.Min() - (GridLength / 2);
+
+            for (int i = 0; i < distinctY.Count; i++)
+            {
+
+                int Xzhou = (int)picXmin - GBX;
+                DataTable number = CountTheNumberOfX_axes(GBDatatableOne, "fieldY", distinctY[i].ToString());
+                for (int j = 0; j < number.Rows.Count; j++)
+                {
+
+                    // 定义矩形的左上角和右下角坐标  
+                    OpenCvSharp.Point topLeft = new OpenCvSharp.Point(Xzhou, Yzhou);
+                    int XzhouDOW = Xzhou + GridLength;
+                    int YzhouDOW = Yzhou + GridLength;
+                    OpenCvSharp.Point textOrg = new OpenCvSharp.Point(Xzhou + 20, Yzhou + 70); // 文字开始的位置  
+                    OpenCvSharp.Point bottomRight = new OpenCvSharp.Point(XzhouDOW, YzhouDOW);
+                    Xzhou = Xzhou + GridLength;
+
+                    // 定义矩形的颜色(BGR)和线宽  
+                    Scalar color = new OpenCvSharp.Scalar(0, 0, 255, 255); // 蓝色  
+                    int thickness = 2;
+                    // 在图像上绘制矩形  
+                    Cv2.Rectangle(save_pano, topLeft, bottomRight, color, thickness);
+
+                    // 设置要绘制的文字及其位置  
+                    string text = number.Rows[j]["data"].ToString();
+
+
+                    string input = number.Rows[j]["data"].ToString();
+                    double fontScale = 1; // 字体大小缩放因子  
+                    int thickness2 = 1; // 字体粗细 
+                                        // 获取文字的大小,以便我们可以更好地定位它  
+                    OpenCvSharp.Size textSize = OpenCvSharp.Cv2.GetTextSize(input, HersheyFonts.HersheySimplex, fontScale, thickness2, out int baseline);
+                    int chunkSize = GridLength / textSize.Height; // 分割长度  
+                                                                  // 使用LINQ的Enumerable.Chunk扩展方法分割字符串  
+                    var chunks = Enumerable.Range(0, input.Length / chunkSize + (input.Length % chunkSize > 0 ? 1 : 0))
+                        .Select(x => input.Substring(x * chunkSize, Math.Min(chunkSize, input.Length - x * chunkSize)))
+                        .ToList();
+
+                    int topgrade = Convert.ToInt32(number.Rows[j]["color"]);
+                    // 设置字体样式和大小  
+                    Color color1 = new Color();
+                    switch (topgrade)
+                    {
+                        case 0:
+                            color1 = Color.White;
+                            break;
+                        case 1:
+                            color1 = Color.DarkGray;
+                            break;
+                        case 2:
+                            color1 = Color.Purple;
+                            break;
+                        case 3:
+                            color1 = Color.Blue;
+                            break;
+                        case 4:
+                            color1 = Color.Red;
+                            break;
+                        case 5:
+                            color1 = Color.Red;
+                            break;
+                        default:
+                            color1 = Color.Red;
+                            break;
+
+                    }
+                    Scalar fontColor = new OpenCvSharp.Scalar(color1.B, color1.G, color1.R, 255); // 文字颜色:黑色  
+                    LineTypes lineType = OpenCvSharp.LineTypes.AntiAlias; // 线条类型  
+
+                    foreach (var chunk in chunks)
+                    {
+                        // 使用PutText方法在图像上绘制文字  
+                        Cv2.PutText(save_pano, chunk, textOrg, HersheyFonts.HersheySimplex, fontScale, fontColor, thickness, lineType);
+                        textOrg.Y = textOrg.Y + 70;
+                    }
+                }
+                Yzhou = Yzhou + GridLength;
+            }
+
+            return save_pano;
+        }
+
+        private DataTable CountTheNumberOfX_axes(DataTable dataTable, string ColumnName, string name)
+        {
+
+            DataTable data = new DataTable();
+            data.Columns.Add("data");
+            data.Columns.Add("color");
+            for (int i = 0; i < dataTable.Rows.Count; i++)
+            {
+                if (name == dataTable.Rows[i][ColumnName].ToString())
+                {
+                    DataRow dr = data.NewRow();
+                    dr["data"] = dataTable.Rows[i]["gradeDetail"].ToString();
+                    dr["color"] = dataTable.Rows[i]["topGrade"].ToString();
+                    data.Rows.Add(dr);
+                }
+            }
+            return data;
+        }
+    }
+}

+ 3 - 1
OTSIncAReportApp/1-UI/OTSReportExport/Template/DataTemplate.cs

@@ -108,11 +108,13 @@ namespace OTSIncAReportApp._1_UI.OTSTemplateDesigner
      
             //夹杂物面积比图
             setXRLabelData(xrLabel_inca_pic_class, GetlanguageData(xrLabel_inca_pic_class.Name.ToString(), languageData));//夹杂物面积比图
+            setXRLabelData(xrLabel_inca_pic_subdivision, GetlanguageData(xrLabel_inca_pic_subdivision.Name.ToString(), languageData));
+            //setXRLabelData(xrLabel_size_IconQuestion_Subdivision, GetlanguageData(xrLabel_size_IconQuestion_Subdivision.Name.ToString(), languageData));
             //setXRLabelData(xrTableCell1, GetlanguageData(xrTableCell1.Name.ToString(), languageData));//备注
             setXRLabelData(xrTableCell1, "Notes");//备注
             //颗粒尺寸表
             //Bitmap bitmap = (Bitmap)Image.FromFile(str3 + "\\Config\\ReportTemplate\\ReportIdentification.bmp");
-            setXRLabelData(xrLabel_inca_pic_class, GetlanguageData(xrLabel_inca_pic_class.Name.ToString(), languageData));
+            //setXRLabelData(xrLabel_inca_pic_class, GetlanguageData(xrLabel_inca_pic_class.Name.ToString(), languageData));
             Bitmap bitmap = (Bitmap)Image.FromFile(System.IO.Directory.GetCurrentDirectory() + "\\Config\\ReportTemplate\\"+ TemplateClass.M_SY.LOGName);
             xrPictureBox1.ImageSource = new ImageSource(bitmap);
             xrPictureBox1.Sizing = DevExpress.XtraPrinting.ImageSizeMode.Squeeze;

+ 1 - 0
OTSIncAReportApp/OTSIncAReportApp.csproj

@@ -423,6 +423,7 @@
     <Reference Include="System.Xml" />
   </ItemGroup>
   <ItemGroup>
+    <Compile Include="1-UI\Control_Graph\Controls\ImageSplicer.cs" />
     <Compile Include="1-UI\Control_Grids\ParticlesGridDevidePage\ParticlesGridDevidePageShowConfig.cs">
       <SubType>Form</SubType>
     </Compile>