Browse Source

归一化+拼接颗粒

cxs 1 year ago
parent
commit
920a62995e

+ 5 - 1
OTSCPP/OTSClassifyEngine/ExpressionClassifyEngine.cpp

@@ -493,7 +493,11 @@ CElementChemistriesList ExpressionClassifyEngine::ZeroElementProcess(COTSParticl
 					}
 					for (auto ele : partEles)
 					{
-						ele->SetPercentage(ele->GetPercentage() / sumPercentage*100);
+						if (sumPercentage != 0)
+						{
+							ele->SetPercentage(ele->GetPercentage() / sumPercentage * 100);
+						}
+						
 					}
 
 				}

+ 1 - 1
OTSCPP/OTSClrInterface/ClassificationClr/OTSClassifyEngineClr.h

@@ -35,7 +35,7 @@ namespace OTSCLRINTERFACE {
 
 		double IfNeedMaxEDS(COTSParticleClr^ particle);
 
-		bool ZeroElementProcess(COTSParticleClr^ particle);
+		bool ZeroElementProcess(COTSParticleClr^ particle);             
 	private:
 		IClassifyEngine* engine;
 	};

+ 6 - 0
OTSCommon/ReportModel/ResultFile.cs

@@ -188,6 +188,12 @@ public    enum OTS_Y_AXIS_DIRECTION
             return STDName;
 
         }
+        public bool GetUseSysSTD()
+        {
+            Dictionary<string, object> sampleMembers = ((Dictionary<string, object>)((Dictionary<string, object>)ResultInfo["Sample"])["Members"]);
+            string UseSysSTD = ((Dictionary<string, object>)sampleMembers["MsrParams"])["UseSysSTD"].ToString();
+            return Convert.ToBoolean(UseSysSTD);
+        }
         public int GetIncASteeltech()
         {
             //--------the int number  meaning----------

+ 117 - 117
OTSIncAMeasureApp/1-OTSMeasure/Measure/DBDataTransition/ElementChemistryDB.cs

@@ -14,153 +14,153 @@ namespace OTSModelSharp.DTLBase
     public class CElementChemistryDB : CSQLiteDB
     {
         List<CPosXrayClr> m_listPosXrayInfo = new List<CPosXrayClr>();
-        public CElementChemistryDB(IDBStoreBase _conStr, IDBTableBase _table):base(_conStr,_table) 		
-	{
-		
+        public CElementChemistryDB(IDBStoreBase _conStr, IDBTableBase _table) : base(_conStr, _table)
+        {
 
-    }
 
- 
+        }
 
-      public System.Data.DataTable GetQueryById( long a_nXrayId, long a_nFieldId,  long a_nElementId,  long a_nElementSize)
-	  {
 
-        
 
-        var datastorePtr = GetDatastore();
-   
-        var tableInfoPtr = GetTableInfo();
-   
+        public System.Data.DataTable GetQueryById(long a_nXrayId, long a_nFieldId, long a_nElementId, long a_nElementSize)
+        {
+
+
+
+            var datastorePtr = GetDatastore();
+
+            var tableInfoPtr = GetTableInfo();
 
-        var sXrayIdColumnName = tableInfoPtr.GetColumnName((int)CElementChemistryTable.ColumnID.N_XRAY_INDEX - (int)CElementChemistryTable.ColumnID.MIN);
-        var sFieldIdColumnName = tableInfoPtr.GetColumnName((int)CElementChemistryTable.ColumnID.N_FIELD_ID - (int)CElementChemistryTable.ColumnID.MIN);
-        var sElementIdColumnName = tableInfoPtr.GetColumnName((int)CElementChemistryTable.ColumnID.N_ELEMENT_ID - (int)CElementChemistryTable.ColumnID.MIN);
-        var sElementNumColumnName = tableInfoPtr.GetColumnName((int)CElementChemistryTable.ColumnID.N_ELEMENT_TOTAL - (int)CElementChemistryTable.ColumnID.MIN);
 
+            var sXrayIdColumnName = tableInfoPtr.GetColumnName((int)CElementChemistryTable.ColumnID.N_XRAY_INDEX - (int)CElementChemistryTable.ColumnID.MIN);
+            var sFieldIdColumnName = tableInfoPtr.GetColumnName((int)CElementChemistryTable.ColumnID.N_FIELD_ID - (int)CElementChemistryTable.ColumnID.MIN);
+            var sElementIdColumnName = tableInfoPtr.GetColumnName((int)CElementChemistryTable.ColumnID.N_ELEMENT_ID - (int)CElementChemistryTable.ColumnID.MIN);
+            var sElementNumColumnName = tableInfoPtr.GetColumnName((int)CElementChemistryTable.ColumnID.N_ELEMENT_TOTAL - (int)CElementChemistryTable.ColumnID.MIN);
 
-        String  sSQLCommand= String.Format("SELECT * FROM \'{0}\' WHERE {1} = {2} AND {3} ={4} AND {5} ={6} AND {7} = {8};", (String)tableInfoPtr.GetTableName(), sFieldIdColumnName,
-        a_nFieldId, sXrayIdColumnName, a_nXrayId,sElementIdColumnName, a_nElementId,sElementNumColumnName, a_nElementSize);
 
-      
+            String sSQLCommand = String.Format("SELECT * FROM \'{0}\' WHERE {1} = {2} AND {3} ={4} AND {5} ={6} AND {7} = {8};", (String)tableInfoPtr.GetTableName(), sFieldIdColumnName,
+            a_nFieldId, sXrayIdColumnName, a_nXrayId, sElementIdColumnName, a_nElementId, sElementNumColumnName, a_nElementSize);
 
-        var q=datastorePtr.QueryByCmdForDataTable(sSQLCommand);
-           
-        return q;
-	  }
 
-    
 
-     public   List< CPosXrayClr> GetXrayInfoList( bool a_bForce/* = FALSE*/)
-	{
-		if (a_bForce)
-		{
-            m_listPosXrayInfo.Clear();
-		}
+            var q = datastorePtr.QueryByCmdForDataTable(sSQLCommand);
 
-		if (m_listPosXrayInfo.Count == 0)
-		{
-			ReadXrayPointInfoList();
+            return q;
         }
 
-		return m_listPosXrayInfo;
-	}
 
-       public  bool ReadXrayPointInfoList()
+
+        public List<CPosXrayClr> GetXrayInfoList(bool a_bForce/* = FALSE*/)
+        {
+            if (a_bForce)
+            {
+                m_listPosXrayInfo.Clear();
+            }
+
+            if (m_listPosXrayInfo.Count == 0)
+            {
+                ReadXrayPointInfoList();
+            }
+
+            return m_listPosXrayInfo;
+        }
+
+        public bool ReadXrayPointInfoList()
         {
             var tableInfoPtr = GetTableInfo();
-            
+
             var query = GetTableQueryForDataTable("");
-           
+
             m_listPosXrayInfo = ReadXrayPointInfoList(query);
 
             return true;
         }
 
-     
-      public  bool SaveElementChemistriesList(List<CPosXrayClr> a_xrayPointList)
-	{
-		
-          var tableInfoPtr = GetTableInfo();
-   
-          var datastorePtr = GetDatastore();
+
+        public bool SaveElementChemistriesList(List<CPosXrayClr> a_xrayPointList)
+        {
+
+            var tableInfoPtr = GetTableInfo();
+
+            var datastorePtr = GetDatastore();
 
             String sInsertFormat = tableInfoPtr.GetInsertCommandFormatString();
-          String sSQLCommand = "";
+            String sSQLCommand = "";
 
-		foreach (var xrayPointInfo in a_xrayPointList)
-		{
-			List<CElementChemistryClr> listElemnentChemistries = xrayPointInfo.GetElementQuantifyData();
+            foreach (var xrayPointInfo in a_xrayPointList)
+            {
+                List<CElementChemistryClr> listElemnentChemistries = xrayPointInfo.GetElementQuantifyData();
 
-            int nSize = (int)listElemnentChemistries.Count;
-            int nElementIndex = 0;
-			foreach (var pElementChemistry in listElemnentChemistries)
-			{
-                    sSQLCommand= String.Format(sInsertFormat,
+                int nSize = (int)listElemnentChemistries.Count;
+                int nElementIndex = 0;
+                foreach (var pElementChemistry in listElemnentChemistries)
+                {
+                    sSQLCommand = String.Format(sInsertFormat,
                     xrayPointInfo.GetIndex(),
-					xrayPointInfo.GetScanFieldId(),
-					nElementIndex,
-					nSize,
-					pElementChemistry.GetName(),
-					pElementChemistry.GetPercentage());
+                    xrayPointInfo.GetScanFieldId(),
+                    nElementIndex,
+                    nSize,
+                    pElementChemistry.GetName(),
+                    pElementChemistry.GetPercentage());
                     //var helper = new SQLiteHelper(datastorePtr);         
                     if (datastorePtr.RunCommand(sSQLCommand) != true)
-				   {
+                    {
 
 
 
                         return false;
-				}
+                    }
 
-				nElementIndex++;
-			}
+                    nElementIndex++;
+                }
 
-		}
+            }
 
             return true;
-	}
+        }
 
-      public  bool SaveElementChemistriesList( CPosXrayClr a_pxrayPoint)
-	{
-		
-       var tableInfoPtr = GetTableInfo();
-    
-       var datastorePtr = GetDatastore();
+        public bool SaveElementChemistriesList(CPosXrayClr a_pxrayPoint)
+        {
+
+            var tableInfoPtr = GetTableInfo();
+
+            var datastorePtr = GetDatastore();
 
             String sInsertFormat = tableInfoPtr.GetInsertCommandFormatString();
-        String sSQLCommand = "";
+            String sSQLCommand = "";
 
-       List<CElementChemistryClr >listElemnentChemistries = a_pxrayPoint.GetElementQuantifyData();
+            List<CElementChemistryClr> listElemnentChemistries = a_pxrayPoint.GetElementQuantifyData();
 
-        int nSize = (int)listElemnentChemistries.Count;
-        int nElementIndex = 0;
-		foreach (var pElementChemistry in listElemnentChemistries)
-		{
-                sSQLCommand=String.Format(sInsertFormat,
+            int nSize = (int)listElemnentChemistries.Count;
+            int nElementIndex = 0;
+            foreach (var pElementChemistry in listElemnentChemistries)
+            {
+                sSQLCommand = String.Format(sInsertFormat,
                 a_pxrayPoint.GetIndex(),
-				a_pxrayPoint.GetScanFieldId(),
-				nElementIndex,
-				nSize,
-				pElementChemistry.GetName(),
-				pElementChemistry.GetPercentage(),
-				pElementChemistry.GetMolarPercentage());
-                    
+                a_pxrayPoint.GetScanFieldId(),
+                nElementIndex,
+                nSize,
+                pElementChemistry.GetName(),
+                pElementChemistry.GetPercentage(),
+                pElementChemistry.GetMolarPercentage());
+
                 if (datastorePtr.RunCommand(sSQLCommand) != true)
-			    {
+                {
 
                     return false;
-			    }
+                }
 
-			nElementIndex++;
-		}
+                nElementIndex++;
+            }
 
             return true;
-	}
-        public List<KeyValuePair<string,SQLiteParameter[]>> GetSavingElementChemistriesCmds(CPosXrayClr a_pxrayPoint)
+        }
+        public List<KeyValuePair<string, SQLiteParameter[]>> GetSavingElementChemistriesCmds(CPosXrayClr a_pxrayPoint)
         {
             List<KeyValuePair<string, SQLiteParameter[]>> cmds = new List<KeyValuePair<string, SQLiteParameter[]>>();
             var tableInfoPtr = GetTableInfo();
 
-          
+
 
             var sInsertFormat = tableInfoPtr.GetInsertCommand();
             var parasTem = sInsertFormat.Value;
@@ -183,9 +183,9 @@ namespace OTSModelSharp.DTLBase
                 paras[3].Value = nSize;
                 paras[4].Value = pElementChemistry.GetName();
                 paras[5].Value = pElementChemistry.GetPercentage();
-             
 
-               
+
+
                 nElementIndex++;
                 cmds.Add(new KeyValuePair<string, SQLiteParameter[]>(sInsertFormat.Key, paras));
             }
@@ -194,7 +194,7 @@ namespace OTSModelSharp.DTLBase
         }
 
         public bool DeleteElementChemistryById(long a_nFieldId, long a_nXrayId)
-        {            
+        {
             if (m_listPosXrayInfo.Count != 0)
             {
                 for (int itr = 0; itr < m_listPosXrayInfo.Count; itr++)
@@ -213,28 +213,28 @@ namespace OTSModelSharp.DTLBase
             String sTableName = tableInfoPtr.GetTableName();
             if (IsTableExists(sTableName))
             {
-                
 
-           
 
-            var sXrayIdColumnName = tableInfoPtr.GetColumnName((int)CElementChemistryTable.ColumnID.N_XRAY_INDEX - (int)CElementChemistryTable.ColumnID.MIN);
-            var sFieldIdColumnName = tableInfoPtr.GetColumnName((int)CElementChemistryTable.ColumnID.N_FIELD_ID - (int)CElementChemistryTable.ColumnID.MIN);
 
-            String sSQLCommand = 
-            String.Format("DELETE FROM \'{0}\' WHERE {1} = {2} AND {3} ={4};",
-			sTableName,
-			sXrayIdColumnName,
-            a_nXrayId,
-			sFieldIdColumnName,
-			a_nFieldId);
 
-            //var helper = new SQLiteHelper(datastorePtr);
+                var sXrayIdColumnName = tableInfoPtr.GetColumnName((int)CElementChemistryTable.ColumnID.N_XRAY_INDEX - (int)CElementChemistryTable.ColumnID.MIN);
+                var sFieldIdColumnName = tableInfoPtr.GetColumnName((int)CElementChemistryTable.ColumnID.N_FIELD_ID - (int)CElementChemistryTable.ColumnID.MIN);
+
+                String sSQLCommand =
+                String.Format("DELETE FROM \'{0}\' WHERE {1} = {2} AND {3} ={4};",
+                sTableName,
+                sXrayIdColumnName,
+                a_nXrayId,
+                sFieldIdColumnName,
+                a_nFieldId);
+
+                //var helper = new SQLiteHelper(datastorePtr);
 
-             datastorePtr.RunCommand(sSQLCommand);
+                datastorePtr.RunCommand(sSQLCommand);
             }
             return true;
 
-    }
+        }
 
         public bool IsTableExists(String a_sTableName)
         {
@@ -243,26 +243,26 @@ namespace OTSModelSharp.DTLBase
 
         }
 
-       public List<CPosXrayClr> ReadXrayPointInfoList(DataTable a_query)
+        public List<CPosXrayClr> ReadXrayPointInfoList(DataTable a_query)
         {
             List<CPosXrayClr> xrayList = new List<CPosXrayClr>();
             Dictionary<string, CPosXrayClr> mapXrayInfo = new Dictionary<string, CPosXrayClr>();
             foreach (DataRow row in a_query.Rows)
             {
-               int nCol = (int)CElementChemistryTable.ColumnID.N_FIELD_ID- (int)CElementChemistryTable.ColumnID.MIN;
+                int nCol = (int)CElementChemistryTable.ColumnID.N_FIELD_ID - (int)CElementChemistryTable.ColumnID.MIN;
                 int curFldId = Convert.ToInt32(row[nCol]);
                 nCol = (int)CElementChemistryTable.ColumnID.N_XRAY_INDEX - (int)CElementChemistryTable.ColumnID.MIN;
                 int xrayId = Convert.ToInt32(row[nCol]);
                 string fldvec = "";
-                fldvec+=curFldId.ToString();
+                fldvec += curFldId.ToString();
                 fldvec += "_";
                 fldvec += xrayId.ToString();
-               
+
                 nCol = (int)CElementChemistryTable.ColumnID.S_NAME - (int)CElementChemistryTable.ColumnID.MIN;
                 string cheName = Convert.ToString(row[nCol]);
                 nCol = (int)CElementChemistryTable.ColumnID.F_PERCENTAGE - (int)CElementChemistryTable.ColumnID.MIN;
                 double percentage = Convert.ToDouble(row[nCol]);
-                CElementChemistryClr che = new CElementChemistryClr(cheName,percentage);
+                CElementChemistryClr che = new CElementChemistryClr(cheName, percentage);
 
                 if (!mapXrayInfo.ContainsKey(fldvec))
                 {
@@ -271,7 +271,7 @@ namespace OTSModelSharp.DTLBase
 
                     mapXrayInfo.Add(fldvec, xray);
                 }
-                else 
+                else
                 {
                     CPosXrayClr xray = mapXrayInfo[fldvec];
                     xray.AddQuantifyElement(che);
@@ -286,9 +286,9 @@ namespace OTSModelSharp.DTLBase
 
             }
             return xrayList;
-            
+
         }
-      public  bool GetAllMapedXrayInfo(ref Dictionary<string, CPosXrayClr> mapXrayInfo)
+        public bool GetAllMapedXrayInfo(ref Dictionary<string, CPosXrayClr> mapXrayInfo)
         {
             DataTable a_query = GetTableQueryForDataTable();
             //Dictionary<string, CPosXrayClr> mapXrayInfo = new Dictionary<string, CPosXrayClr>();

+ 1 - 0
OTSIncAMeasureApp/1-OTSMeasure/Measure/DBDataTransition/IncAFileMgr.cs

@@ -38,6 +38,7 @@ namespace OTSModelSharp
 
         CIncADataDB m_IncADataDB;
 
+
      
 
         CSQLiteDBStore dbStore ;

+ 20 - 10
OTSIncAReportApp/1-UI/frmMeasureRstMgr.Designer.cs

@@ -31,11 +31,12 @@
             this.components = new System.ComponentModel.Container();
             System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(frmMeasureRstMgr));
             this.contextMenuStrip1 = new System.Windows.Forms.ContextMenuStrip(this.components);
+            this.计算边界颗粒合成ToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
             this.contextMenuStrip2 = new System.Windows.Forms.ContextMenuStrip(this.components);
             this.AddSample = new System.Windows.Forms.ToolStripMenuItem();
             this.treeView1 = new System.Windows.Forms.TreeView();
             this.button1 = new System.Windows.Forms.Button();
-            this.计算边界颗粒合成ToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+            this.ToolStripMenuItem_Zeroelementprocess = new System.Windows.Forms.ToolStripMenuItem();
             this.contextMenuStrip1.SuspendLayout();
             this.contextMenuStrip2.SuspendLayout();
             this.SuspendLayout();
@@ -44,9 +45,17 @@
             // 
             this.contextMenuStrip1.ImageScalingSize = new System.Drawing.Size(24, 24);
             this.contextMenuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
-            this.计算边界颗粒合成ToolStripMenuItem});
+            this.计算边界颗粒合成ToolStripMenuItem,
+            this.ToolStripMenuItem_Zeroelementprocess});
             this.contextMenuStrip1.Name = "contextMenuStrip1";
-            this.contextMenuStrip1.Size = new System.Drawing.Size(181, 48);
+            this.contextMenuStrip1.Size = new System.Drawing.Size(181, 70);
+            // 
+            // 计算边界颗粒合成ToolStripMenuItem
+            // 
+            this.计算边界颗粒合成ToolStripMenuItem.Name = "计算边界颗粒合成ToolStripMenuItem";
+            this.计算边界颗粒合成ToolStripMenuItem.Size = new System.Drawing.Size(180, 22);
+            this.计算边界颗粒合成ToolStripMenuItem.Text = "计算边界颗粒合成";
+            this.计算边界颗粒合成ToolStripMenuItem.Click += new System.EventHandler(this.计算边界颗粒合成ToolStripMenuItem_Click);
             // 
             // contextMenuStrip2
             // 
@@ -71,7 +80,7 @@
             | System.Windows.Forms.AnchorStyles.Right)));
             this.treeView1.CheckBoxes = true;
             this.treeView1.DrawMode = System.Windows.Forms.TreeViewDrawMode.OwnerDrawAll;
-            this.treeView1.Font = new System.Drawing.Font("SimSun", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
+            this.treeView1.Font = new System.Drawing.Font("宋体", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
             this.treeView1.Location = new System.Drawing.Point(0, 25);
             this.treeView1.Name = "treeView1";
             this.treeView1.ShowLines = false;
@@ -95,12 +104,12 @@
             this.button1.Visible = false;
             this.button1.Click += new System.EventHandler(this.button1_Click);
             // 
-            // 计算边界颗粒合成ToolStripMenuItem
+            // ToolStripMenuItem_Zeroelementprocess
             // 
-            this.计算边界颗粒合成ToolStripMenuItem.Name = "计算边界颗粒合成ToolStripMenuItem";
-            this.计算边界颗粒合成ToolStripMenuItem.Size = new System.Drawing.Size(180, 22);
-            this.计算边界颗粒合成ToolStripMenuItem.Text = "计算边界颗粒合成";
-            this.计算边界颗粒合成ToolStripMenuItem.Click += new System.EventHandler(this.计算边界颗粒合成ToolStripMenuItem_Click);
+            this.ToolStripMenuItem_Zeroelementprocess.Name = "ToolStripMenuItem_Zeroelementprocess";
+            this.ToolStripMenuItem_Zeroelementprocess.Size = new System.Drawing.Size(180, 22);
+            this.ToolStripMenuItem_Zeroelementprocess.Text = "零元素归一化";
+            this.ToolStripMenuItem_Zeroelementprocess.Click += new System.EventHandler(this.ToolStripMenuItem_Zeroelementprocess_Click);
             // 
             // frmMeasureRstMgr
             // 
@@ -114,7 +123,7 @@
             this.DockAreas = ((OTS.WinFormsUI.Docking.DockAreas)((((OTS.WinFormsUI.Docking.DockAreas.DockLeft | OTS.WinFormsUI.Docking.DockAreas.DockRight) 
             | OTS.WinFormsUI.Docking.DockAreas.DockTop) 
             | OTS.WinFormsUI.Docking.DockAreas.DockBottom)));
-            this.Font = new System.Drawing.Font("SimSun", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
+            this.Font = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
             this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
             this.Margin = new System.Windows.Forms.Padding(4);
             this.Name = "frmMeasureRstMgr";
@@ -134,5 +143,6 @@
         public System.Windows.Forms.TreeView treeView1;
         private System.Windows.Forms.Button button1;
         private System.Windows.Forms.ToolStripMenuItem 计算边界颗粒合成ToolStripMenuItem;
+        private System.Windows.Forms.ToolStripMenuItem ToolStripMenuItem_Zeroelementprocess;
     }
 }

+ 135 - 0
OTSIncAReportApp/1-UI/frmMeasureRstMgr.cs

@@ -11,6 +11,7 @@ using System;
 using System.Collections;
 using System.Collections.Generic;
 using System.Drawing;
+using System.IO;
 using System.Runtime.InteropServices;
 using System.Windows.Forms;
 
@@ -686,5 +687,139 @@ namespace OTSIncAReportApp
             return true;
         }
 
+        private void ToolStripMenuItem_Zeroelementprocess_Click(object sender, EventArgs e)
+        {
+            if (this.treeView1.SelectedNode == null) return;
+            var SampleName = this.treeView1.SelectedNode.Text;
+            var resultfile = m_RstDataMgr.GetResultFileObjByName(SampleName);
+            if (resultfile == null) return;
+            var log = NLog.LogManager.GetCurrentClassLogger();
+            log.Info("Start to Zeroelementprocess!");
+            this.Cursor = System.Windows.Forms.Cursors.WaitCursor;
+            List<COTSParticleClr> ParticleClrs = new List<COTSParticleClr>();
+            ParticleClrs = GetParticleClrFromFields(resultfile.List_OTSField);
+            if (m_ReportApp.m_RptConfigFile.Systype == OTS_SysType_ID.IncA)
+            {
+                if (resultfile.GetUseSysSTD())
+                {
+                    OTSCLRINTERFACE.COTSClassifyEngineClr EngineClr = new COTSClassifyEngineClr(EngineType.InclutionEng, "NoSTDDB");
+                    ParticleClrs = ZeroElementProcess(EngineClr, ParticleClrs);
+                }
+                string libname = resultfile.GetSTDName();
+                if (!libname.Contains(".db"))
+                {
+                    libname += ".db";
+                }
+                if (libname.ToLower() != "nostddb" && libname.ToLower() != "nostddb.db")
+                {
+                    if (!File.Exists(".\\Config\\SysData\\" + libname))
+                    {
+                        MessageBox.Show("未加载到标准库!");
+                        return;
+                    }
+                    OTSCLRINTERFACE.COTSClassifyEngineClr EngineClr2 = new COTSClassifyEngineClr(EngineType.ExpressionClassifyEng, libname);
+                    ParticleClrs = ZeroElementProcess(EngineClr2, ParticleClrs);
+                }
+            }
+            else
+            {
+                string libname = resultfile.GetSTDName();
+                if (!libname.Contains(".db"))
+                {
+                    libname += ".db";
+                }
+                if (libname.ToLower() != "nostddb" && libname.ToLower() != "nostddb.db")
+                {
+                    if (!File.Exists(".\\Config\\SysData\\" + libname))
+                    {
+                        MessageBox.Show("未加载到标准库!");
+                        return;
+                    }
+                    OTSCLRINTERFACE.COTSClassifyEngineClr EngineClr = new COTSClassifyEngineClr(EngineType.ExpressionClassifyEng, libname);
+                    ParticleClrs = ZeroElementProcess(EngineClr, ParticleClrs);
+                }
+            }
+
+            log.Info("begin particle data db saving...");
+
+            if(UpdateElementofParticles(ParticleClrs,resultfile.GetResultDBPath()))
+            {
+              MessageBox.Show("零元素归一化完毕,请重启报告以便数据生效!");
+            }
+            else
+            {
+
+            }
+            
+            this.Cursor = System.Windows.Forms.Cursors.Default;
+        }
+
+        List<COTSParticleClr> ZeroElementProcess(OTSCLRINTERFACE.COTSClassifyEngineClr ClassifyEngineClr, List<COTSParticleClr> allParticles)
+        {
+            //List<COTSParticleClr> ParticleClrs = new List<COTSParticleClr>();
+            foreach (COTSParticleClr particleClr in allParticles)
+            {
+                ClassifyEngineClr.ZeroElementProcess(particleClr);
+                //ParticleClrs.Add(particleClr);
+            }
+            return allParticles;
+        }
+
+        List<COTSParticleClr> GetParticleClrFromFields(List<OTSCommon.Model.Field> allFields)
+        {
+            List<COTSParticleClr> ParticleClrs = new List<COTSParticleClr>();
+            foreach (var f in allFields)
+            {
+                var parts = f.ParticleList;
+                foreach (var p in parts)
+                {
+                    COTSParticleClr part = new COTSParticleClr();
+                    COTSFeatureClr fea = new COTSFeatureClr();
+
+                    part.SetFeature(fea);
+                    var xray = part.GetXray();
+
+                    foreach (var ele in p.ElementList)
+                    {
+                        CElementChemistryClr eleclr = new CElementChemistryClr();
+                        eleclr.SetName(ele.Name);
+                        eleclr.SetPercentage(ele.Percentage);
+                        xray.AddQuantifyElement(eleclr);
+                    }
+
+                    part.SetFieldId(p.FieldId);
+                    part.SetAnalysisId(p.XrayId);
+                    part.SetParticleId(p.ParticleId);
+                    part.SetXray(xray);
+                    ParticleClrs.Add(part);
+                }
+            }
+            return ParticleClrs;
+        }
+
+        public bool UpdateElementofParticles(List<COTSParticleClr> Parts, string dbfile)
+        {
+            CIncAFileMgr pDBFileMgr = new CIncAFileMgr(dbfile);
+            CPosXrayDBMgr pXrayDBMgr = pDBFileMgr.GetPosXrayDBMgr();
+            CElementChemistryDB xraydb = pXrayDBMgr.GetElementChemistryDB();
+            List<CPosXrayClr> ches = new List<CPosXrayClr>();
+            foreach (COTSParticleClr part in Parts)
+            {
+                part.GetXray().SetIndex(part.GetParticleId());
+                part.GetXray().SetScanFieldId(part.GetFieldId());
+                ches.Add(part.GetXray());
+            }
+            xraydb.RemoveAllRows();
+            try
+            {
+                xraydb.SaveElementChemistriesList(ches);
+            }
+            catch(Exception ex)
+            {
+                MessageBox.Show(ex.ToString());
+                return false;
+            }
+            return true;
+        }
     }
 }