| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867 | using OTSCLRINTERFACE;using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Text.RegularExpressions;using System.Threading.Tasks;using System.Windows.Forms;namespace SpectrumSTDEditor{    public partial class XrayContrastForm : Form    {        #region 全部变量        //数据库操作对象        //全局Xray 用于存储采集的Xray信息        byte[] xrayByteData = null;        private SqlLiteClass m_sc = null;        //Xray控件        UXrayControl xrayControl = null;        UXrayControl xrayContrastControl = null;        public DataRow dr = null;        public DataTable dt = null;        // 电镜设置对象        COTSControlFunExport m_cfun = null;        // 连接状态        bool m_bConnectionState = false;        //STD信息集合        public Dictionary<int, STDdata> STDDictionary = null;        //国际化        Language lan;        System.Collections.Hashtable table;        #endregion        /// <summary>        /// [颜色:16进制转成RGB]        /// </summary>        /// <param name="strColor">设置16进制颜色 [返回RGB]</param>        /// <returns></returns>        public static System.Drawing.Color colorHx16toRGB(string strHxColor)        {            try            {                if (strHxColor.Length == 0)                {//如果为空                    return System.Drawing.Color.FromArgb(255, 255, 204);//设为白色                }                else                {//转换颜色                    return System.Drawing.Color.FromArgb(System.Int32.Parse(strHxColor.Substring(1, 2), System.Globalization.NumberStyles.AllowHexSpecifier), System.Int32.Parse(strHxColor.Substring(3, 2), System.Globalization.NumberStyles.AllowHexSpecifier), System.Int32.Parse(strHxColor.Substring(5, 2), System.Globalization.NumberStyles.AllowHexSpecifier));                }            }            catch            {//设为白色                return System.Drawing.Color.FromArgb(255, 255, 204);            }        }        public XrayContrastForm()        {            InitializeComponent();        }        private void XrayContrastForm_Load(object sender, EventArgs e)        {            //加载Xray信息控件            xrayControl = new UXrayControl();            plXray.Controls.Add(xrayControl);            xrayControl.Dock = DockStyle.Top;            BindGrid_IncALib();            //比对            //GetCompMineralFun();            xrayContrastControl = new UXrayControl();            plXray.Controls.Add(xrayContrastControl);            xrayContrastControl.Dock = DockStyle.Top;            //国际化            lan = new Language(this);            table = lan.GetNameTable(this.Name);        }        #region 绑定Grid等相关方法        /// <summary>        /// 绑定STDGrid        /// </summary>        private void BindGrid_IncALib()        {            if (m_sc == null)            {                m_sc = new SqlLiteClass();            }            //查询            //DataTable dtSelDB = m_sc.GetDTFormSysSTDBySQLString("select Name,Id,0 Color,'' Hardness,'' density,'' Conductivity,'' BSEValue,'' formula,'' Element,SPEC,RowIndex,0 ReducedValue from ClassifySTD order by Name");  //STDMinerals            //DataTable dtSelDB = m_sc.GetDTFormSysSTDBySQLString("select 'C.StdName','C.StdId','C.Color','C.Hardness','C.Density','C.Electrical_conductivity','C.BSE','C.Formula','C.Element','M.SPEC' from ClassifySTD C,STDMinerals M WHERE C.StdId=M.id");  //STDMinerals            DataTable dtSelDB = m_sc.GetDTFormSysSTDBySQLString("select StrName,StdId,Color,Hardness,Density,Electrical_conductivity,BSE,Formula,Element,SPEC,0 ReducedValue from ClassifySTD left join STDMinerals on ClassifySTD.StdId = STDMinerals.id");  //STDMinerals            //绑定            BindDataGridView_dgV_IncALib(dtSelDB);            //样式            SetDataGridViewStyleIncLib();        }        /// <summary>        /// 使用DataTable绑定Grid        /// </summary>        /// <param name="in_dt"></param>        public void BindDataGridView_dgV_IncALib(DataTable dtSelDB)        {            dgV_IncALib.Rows.Clear();            dgV_IncALib.Columns.Clear();            //创建Grid的列            //名称            dgV_IncALib.Columns.Add("Name", "strName");            //编号            dgV_IncALib.Columns.Add("Code", "Code");            //代表色            dgV_IncALib.Columns.Add("Color", "Color");            //硬度            dgV_IncALib.Columns.Add("Hardness", "Hardness");            //密度            dgV_IncALib.Columns.Add("Density", "Density");            //导电性            dgV_IncALib.Columns.Add("Conductivity", "Conductivity");            //BSE            dgV_IncALib.Columns.Add("BSEValue", "BSE");            //化学式            dgV_IncALib.Columns.Add("Formula", "Formula");            //元素            dgV_IncALib.Columns.Add("Element", "Element");            dgV_IncALib.Columns.Add("Xray", "Xray");            dgV_IncALib.Columns.Add("RowIndex", "RowIndex");            dgV_IncALib.Columns.Add("ReducedValue", "ReducedValue");            //添加完成列后,再对不需要显示的列进行隐藏            dgV_IncALib.Columns["Code"].Visible = false;            dgV_IncALib.Columns["Color"].Visible = false;            dgV_IncALib.Columns["Xray"].Visible = false;            dgV_IncALib.Columns["RowIndex"].Visible = false;            dgV_IncALib.Columns["ReducedValue"].Visible = false;            //宽度            dgV_IncALib.Columns["Name"].Width = 140;//名称            dgV_IncALib.Columns["Code"].Width = 0;//编号            dgV_IncALib.Columns["Color"].Width = 0;//代表色            dgV_IncALib.Columns["Hardness"].Width = 80;//硬度            dgV_IncALib.Columns["Density"].Width = 80;//密度            dgV_IncALib.Columns["Conductivity"].Width = 60;//导电性            dgV_IncALib.Columns["BSEValue"].Width = 80;//BSE            dgV_IncALib.Columns["Formula"].Width = 240;//化学式            dgV_IncALib.Columns["Element"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;//元素            dgV_IncALib.Columns["Xray"].Width = 0;//Xray            dgV_IncALib.Columns["RowIndex"].Width = 0;//index            dgV_IncALib.Columns["ReducedValue"].Width = 0;//相识比对值            //先设置一下头的高度,否则会太矮不好看            dgV_IncALib.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.EnableResizing;            dgV_IncALib.ColumnHeadersHeight = 23;            //设置数据            //克隆 查询出的数据结构            dt = dtSelDB.Clone();            foreach (KeyValuePair<int, STDdata> kv in STDDictionary)            {                byte[] xrayData = new byte[8000];                DataRow[] dr = dtSelDB.Select("STDId=" + kv.Key);                if (dr != null)                {                    if (dr.Length > 0)                    {                        if (dr[0]["SPEC"].GetType().ToString()!= "System.DBNull")                        {                            xrayData = (byte[])dr[0]["SPEC"];                        }                        else                        {                            xrayData = new byte[2000];                        }                    }                }                //添加至全局dt                DataRow drSTD = dt.NewRow();                drSTD["StrName"] = kv.Value.StrName.ToString();                drSTD["StdId"] = kv.Key.ToString();                drSTD["Color"] = Convert.ToInt32(ParseRGB(colorHx16toRGB(kv.Value.Color)));                drSTD["Hardness"] = kv.Value.Hardness.ToString();                drSTD["Density"] = kv.Value.Density.ToString();                //drSTD["Electrical_conductivity"] = kv.Value.Electrical_conductivity.ToString();                drSTD["BSE"] = kv.Value.BSE.ToString();                drSTD["Formula"] = kv.Value.Formula.ToString();                drSTD["Element"] = kv.Value.Element.ToString();                drSTD["SPEC"] = xrayData;                dt.Rows.Add(drSTD);            }            //设置数据            for (int i = 0; i < dt.Rows.Count; i++)            {                int add_rowindex = dgV_IncALib.Rows.Add();                dgV_IncALib.Rows[add_rowindex].Cells[0].Value = i.ToString();                dgV_IncALib.Rows[i].Cells[0].Value = add_rowindex;                for (int k = 0; k < dt.Columns.Count; k++)                {                    dgV_IncALib.Rows[i].Cells[k].Value = dt.Rows[i][k].ToString();                }            }            //设置颜色            for (int i = 0; i < dgV_IncALib.Rows.Count; i++)            {                //在该数据库中返回的颜色格式与正常的不同,需要在前面加#号                Color ls_c = colorValuetoRGB(dgV_IncALib[2, i].Value.ToString());                dgV_IncALib[0, i].Style.BackColor = ls_c;            }        }        public void SortDataGridView_dgV_IncALib(DataTable dt)        {            dgV_IncALib.Rows.Clear();            dgV_IncALib.Columns.Clear();            //创建Grid的列            //名称            dgV_IncALib.Columns.Add("Name", "Name");            //编号            dgV_IncALib.Columns.Add("Code", "Code");            //代表色            dgV_IncALib.Columns.Add("Color", "Color");            //硬度            dgV_IncALib.Columns.Add("Hardness", "Hardness");            //密度            dgV_IncALib.Columns.Add("Density", "Density");            //导电性            dgV_IncALib.Columns.Add("Conductivity", "Conductivity");            //BSE            dgV_IncALib.Columns.Add("BSEValue", "BSE");            //化学式            dgV_IncALib.Columns.Add("Formula", "Formula");            //元素            dgV_IncALib.Columns.Add("Element", "Element");            dgV_IncALib.Columns.Add("Xray", "Xray");            dgV_IncALib.Columns.Add("RowIndex", "RowIndex");            dgV_IncALib.Columns.Add("ReducedValue", "ReducedValue");            //添加完成列后,再对不需要显示的列进行隐藏            dgV_IncALib.Columns["Code"].Visible = false;            dgV_IncALib.Columns["Color"].Visible = false;            dgV_IncALib.Columns["Xray"].Visible = false;            dgV_IncALib.Columns["RowIndex"].Visible = false;            dgV_IncALib.Columns["ReducedValue"].Visible = false;            //宽度            dgV_IncALib.Columns["Name"].Width = 140;//名称            dgV_IncALib.Columns["Code"].Width = 0;//编号            dgV_IncALib.Columns["Color"].Width = 0;//代表色            dgV_IncALib.Columns["Hardness"].Width = 80;//硬度            dgV_IncALib.Columns["Density"].Width = 80;//密度            dgV_IncALib.Columns["Conductivity"].Width = 60;//导电性            dgV_IncALib.Columns["BSEValue"].Width = 80;//BSE            dgV_IncALib.Columns["Formula"].Width = 240;//化学式            dgV_IncALib.Columns["Element"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;//元素            dgV_IncALib.Columns["Xray"].Width = 0;//Xray            dgV_IncALib.Columns["RowIndex"].Width = 0;//index            dgV_IncALib.Columns["ReducedValue"].Width = 0;//相识比对值            //先设置一下头的高度,否则会太矮不好看            dgV_IncALib.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.EnableResizing;            dgV_IncALib.ColumnHeadersHeight = 23;            //设置数据            for (int i = 0; i < dt.Rows.Count; i++)            {                int add_rowindex = dgV_IncALib.Rows.Add();                dgV_IncALib.Rows[add_rowindex].Cells[0].Value = i.ToString();                dgV_IncALib.Rows[i].Cells[0].Value = add_rowindex;                for (int k = 0; k < dt.Columns.Count; k++)                {                    dgV_IncALib.Rows[i].Cells[k].Value = dt.Rows[i][k].ToString();                }            }            //设置颜色            for (int i = 0; i < dgV_IncALib.Rows.Count; i++)            {                //在该数据库中返回的颜色格式与正常的不同,需要在前面加#号                Color ls_c = colorValuetoRGB(dgV_IncALib[2, i].Value.ToString());                dgV_IncALib[0, i].Style.BackColor = ls_c;            }        }        #region 自定义方法        /// <summary>        /// [颜色:16进制转成RGB]        /// </summary>        /// <param name="strColor">设置16进制颜色 [返回RGB]</param>        /// <returns></returns>        public System.Drawing.Color colorValuetoRGB(string strHxColor)        {            try            {                if (strHxColor.Length == 0)                {//如果为空                    return System.Drawing.Color.FromArgb(0, 0, 0);//设为黑色                }                else                {                    int colorValue = Convert.ToInt32(strHxColor);                    //转换颜色                    return Color.FromArgb(colorValue % 256, (colorValue >> 8) % 256, (colorValue >> 16) % 256);                }            }            catch (Exception)            {//设为黑色                return System.Drawing.Color.FromArgb(0, 0, 0);            }        }        /// <summary>        /// 将颜色对象转换为uint        /// </summary>        /// <param name="color"></param>        /// <returns></returns>        public uint ParseRGB(Color color)        {            return (uint)(((uint)color.B << 16) | (ushort)(((ushort)color.G << 8) | color.R));        }        #endregion        #region 设置Grid样式        /// <summary>        /// 设置夹杂物列表DataGridView样式        /// </summary>        private void SetDataGridViewStyleIncLib()        {            //用户不能调整标题的高度            dgV_IncALib.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.DisableResizing;            //用户不能调整 行高            dgV_IncALib.AllowUserToResizeRows = false;            //改变行的高度;            //Gview_gz.RowTemplate.Height = 20;            //点击选择整行            dgV_IncALib.SelectionMode = DataGridViewSelectionMode.FullRowSelect;            //居中显示            //System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle1 = new System.Windows.Forms.DataGridViewCellStyle();            //dataGridViewCellStyle1.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleCenter;            //dgV_IncALib.DefaultCellStyle = dataGridViewCellStyle1;            dgV_IncALib.ColumnHeadersDefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;            //再次重覆禁用拖动表头高度,居然有效果了            dgV_IncALib.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.DisableResizing;            //设置grid可以复制            dgV_IncALib.ClipboardCopyMode = DataGridViewClipboardCopyMode.EnableAlwaysIncludeHeaderText;            //设置每列的宽度            //dgV_IncALib.Columns[1].Width = 40;//第一列序号的宽度设置一下吧,要不太丑            //设置序号列不排序            dgV_IncALib.Columns[0].SortMode = DataGridViewColumnSortMode.NotSortable;            for (int i = 0; i < dgV_IncALib.Columns.Count; i++)            {                dgV_IncALib.Columns[i].SortMode = DataGridViewColumnSortMode.NotSortable;            }            //设置序号列不可以设置宽度            dgV_IncALib.Columns[0].Resizable = DataGridViewTriState.False;                        System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle1 = new System.Windows.Forms.DataGridViewCellStyle();            System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle2 = new System.Windows.Forms.DataGridViewCellStyle();            dataGridViewCellStyle1.BackColor = System.Drawing.Color.LightCyan;            dgV_IncALib.AlternatingRowsDefaultCellStyle = dataGridViewCellStyle1;            dgV_IncALib.BackgroundColor = System.Drawing.Color.White;            dgV_IncALib.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;            dgV_IncALib.ColumnHeadersBorderStyle = System.Windows.Forms.DataGridViewHeaderBorderStyle.Single;            dataGridViewCellStyle2.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleCenter;//211, 223, 240            dataGridViewCellStyle2.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(211)))), ((int)(((byte)(223)))), ((int)(((byte)(240)))));            dataGridViewCellStyle2.Font = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));            dataGridViewCellStyle2.ForeColor = System.Drawing.Color.Navy;            dataGridViewCellStyle2.SelectionBackColor = System.Drawing.SystemColors.Highlight;            dataGridViewCellStyle2.SelectionForeColor = System.Drawing.SystemColors.HighlightText;            dgV_IncALib.ColumnHeadersDefaultCellStyle = dataGridViewCellStyle2;            dgV_IncALib.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;            dgV_IncALib.EnableHeadersVisualStyles = false;            dgV_IncALib.GridColor = System.Drawing.SystemColors.GradientInactiveCaption;            dgV_IncALib.ReadOnly = true;            dgV_IncALib.RowHeadersVisible = true; //建议改为true;为了以后显示序号。            dgV_IncALib.RowTemplate.Height = 23;            dgV_IncALib.RowTemplate.ReadOnly = true;            //居中            dgV_IncALib.RowsDefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;            dgV_IncALib.AllowUserToOrderColumns = false;        }        #endregion        #endregion        #region Xray比对        private void GetCompMineralFun(byte[] collectXrayData)        {            byte[] stdmineralclr = collectXrayData;            List<byte[]> listOreTypeClr = new List<byte[]>();            foreach (DataRow item in dt.Rows)            {                if (item["SPEC"].GetType().ToString() != "System.DBNull")                {                    listOreTypeClr.Add((byte[])item["SPEC"]);                }                else                {                    listOreTypeClr.Add(new byte[2000]);                }            }            //获取信息中的相识度            List<double> returnValue = GetCompMineral(ref stdmineralclr, ref listOreTypeClr);            //向DataTable中添加            for (int i = 0; i < dt.Rows.Count; i++)            {                dt.Rows[i]["ReducedValue"] = returnValue[i];            }            //重新排列            dt.DefaultView.Sort = "ReducedValue desc";            dt = dt.DefaultView.ToTable();            SortDataGridView_dgV_IncALib(dt);            //设置选中DataGridView当前行            if (dgV_IncALib.Rows.Count > 0)            {                dgV_IncALib.Rows[0].Selected = true;                xrayControl.Dr = dt.Rows[0];                //xrayControl.Dt = dt;                xrayControl.Refresh();            }        }        // 在listOreTypeClr列表里找出和stdmineralclr相似的信息并返回        protected List<double> GetCompMineral(ref byte[] stdmineralclr, ref List<byte[]> listOreTypeClr)        {            if (null == stdmineralclr || null == listOreTypeClr)            {                return null;            }            if (0 == listOreTypeClr.Count())            {                return null;            }            int i = 0;            List<double> oretypeclr = new List<double>();            List<byte[]> listOreTypeClr_cmp = new List<byte[]>();            // 计算余弦值            double dCosValue = 0;            List<string> lstIgnoreElementNames = new List<string>();            for (i = 0; i < listOreTypeClr.Count; i++)            {                dCosValue = GetCosValue(0, ref lstIgnoreElementNames, stdmineralclr, listOreTypeClr[i]);                dCosValue = 1000000 * dCosValue;                oretypeclr.Add((int)dCosValue);// 将mineralid设置为余弦值            }            return oretypeclr;        }        // 20190903:增加参数iStartChannel哪个位置开始比较, lstIgnoreChannel里面的通道不处理        // 20191128:变更lstIgnoreChannel参数为lstIgnoreElementNames        protected double GetCosValue(int iStartChannel, ref List<string> lstIgnoreElementNames, byte[] stdmineralclr1, byte[] stdmineralclr2)        {            int iXrayDataLen = stdmineralclr1.Length;            List<int> lstIgnoreChannel = new List<int>();            if(stdmineralclr2==null)            {                return 0;            }            // 两者数据量不一致,返回0            if (iXrayDataLen != stdmineralclr2.Length)            {                return 0;            }            if (iStartChannel < 0 || iStartChannel >= iXrayDataLen)            {                return 1;            }            bool bignore = false;            int j = 0;            // 公式: (x1y1+x2y2+x3y3+...x2000y2000) / (sqrt(x1^2 + x2^2 + ...x2000^2) * sqrt(y1^2 + y2^2 + ...y2000^2))                        double dotpro = 0;            double d1 = 0;            double d2 = 0;            for (int i = iStartChannel; i < iXrayDataLen; i++)            {                bignore = false;                for (j = 0; j < lstIgnoreChannel.Count(); j++)                {                    if (lstIgnoreChannel[j] == i)                    {                        bignore = true;                        break;                    }                }                if (!bignore)                {                    dotpro = dotpro + stdmineralclr1[i] * stdmineralclr2[i];                    d1 = d1 + stdmineralclr1[i] * stdmineralclr1[i];                    d2 = d2 + stdmineralclr2[i] * stdmineralclr2[i];                }            }            d1 = System.Math.Sqrt(d1);            d2 = System.Math.Sqrt(d2);            //            return (0 == d1 || 0 == d2) ? 0 : dotpro / (d1 * d2);            // 算法改进, 加上距离权重            if (0 == d1 || 0 == d2)            {                return 0;            }            double dresult = 0;            dresult = (d1 < d2) ? d1 / d2 : d2 / d1;            return 0.4 * dotpro / (d1 * d2) + 0.3 * dresult + 0.3 * GetStdEvp(iStartChannel, ref lstIgnoreChannel, stdmineralclr1, stdmineralclr2);        }        // 获取标准差        // 20190903:增加参数iStartChannel哪个位置开始比较, lstIgnoreChannel里面的通道不处理        double GetStdEvp(int iStartChannel, ref List<int> lstIgnoreChannel, byte[] stdmineralclr1, byte[] stdmineralclr2)        {            int iXrayDataLen = stdmineralclr1.Length;            // 两者数据量不一致,返回0            if (iXrayDataLen != stdmineralclr2.Length)            {                return 0;            }            if (iStartChannel < 0 || iStartChannel >= iXrayDataLen)            {                return 1;            }            bool bignore = false;            int i = 0;            int j = 0;            int iSum1 = 0;            int iSum2 = 0;            double dAva1 = 0;            double dAva2 = 0;            double dSquare1 = 0;            double dSquare2 = 0;            List<int> listdata1 = new List<int>();            List<int> listdata2 = new List<int>();            // 求出能谱的平均值            for (i = iStartChannel; i < iXrayDataLen; i++)            {                bignore = false;                for (j = 0; j < lstIgnoreChannel.Count(); j++)                {                    if (lstIgnoreChannel[j] == i)                    {                        bignore = true;                        break;                    }                }                if (!bignore)                {                    iSum1 = iSum1 + (int)stdmineralclr1[i];                    listdata1.Add((int)stdmineralclr1[i]);                    iSum2 = iSum2 + (int)stdmineralclr2[i];                    listdata2.Add((int)stdmineralclr2[i]);                }            }            dAva1 = iSum1 / listdata1.Count();            dAva2 = iSum2 / listdata2.Count();            for (i = 0; i < listdata1.Count(); i++)            {                dSquare1 = dSquare1 + (listdata1[i] - dAva1) * (listdata1[i] - dAva1);                dSquare2 = dSquare2 + (listdata2[i] - dAva1) * (listdata2[i] - dAva1);            }            dSquare1 = dSquare1 / listdata1.Count();            dSquare2 = dSquare2 / listdata2.Count();            dSquare1 = System.Math.Sqrt(dSquare1);            dSquare2 = System.Math.Sqrt(dSquare2);            dSquare1 = dSquare1 * (double)iSum2 / iSum1;    // 归一化            return (dSquare1 < dSquare2) ? (dSquare1 / dSquare2) : (dSquare2 / dSquare1);        }        #endregion        private void dgV_IncALib_CellClick(object sender, DataGridViewCellEventArgs e)        {            if (xrayByteData != null)            {                dgV_IncALib.ClearSelection();                //删除                if (e.RowIndex < 0)                {                    return;                }                //将选择行的数据传递给Xray控件                xrayControl.Dr = dt.Rows[e.RowIndex];                //xrayControl.Dt = dt;                xrayControl.Refresh();                //设置选中DataGridView当前行                dgV_IncALib.Rows[e.RowIndex].Selected = true;            }        }        private void btnCollectXray_Click(object sender, EventArgs e)        {            try            {                string strTime = txtCollectTime.Text.Trim();                if (txtCollectTime.Equals(""))                {                    showMessage("Please fill in the collection time name!");                    txtCollectTime.Focus();                    return;                }                if (!IsMatch(strTime, 1))                {                    showMessage("Error collecting time content, the format should be integer!");                    txtCollectTime.Focus();                    return;                }                if (Convert.ToInt32(strTime) < 100)                {                    showMessage("CollectTime must not be less than 100 milliseconds!");                    txtCollectTime.Focus();                    return;                }                //获取Xray方法                // 电镜设置对象                xrayByteData = intToBytes(GetCollectXray(strTime), 0);                DataRow dataRow = dt.NewRow();                dataRow["SPEC"] = xrayByteData;                dataRow["Color"] = 0;                xrayContrastControl.Dr = dataRow;                xrayContrastControl.Dt = dt;                                xrayContrastControl.Refresh();                //比对                GetCompMineralFun(xrayByteData);                //国际化                lan = new Language(this);                //国际化后各表头居中显示                for (int i = 0; i < dgV_IncALib.Columns.Count; i++)                {                    dgV_IncALib.Columns[i].SortMode = DataGridViewColumnSortMode.NotSortable;                }            }            catch (Exception ex)            {                throw ex;            }        }        /// <summary>        /// 获取采集当前的Xray信息        /// </summary>        /// <returns></returns>        protected uint[] GetCollectXray(string strTime)        {            try            {                if (null == m_cfun)                {                    //m_cfun = COTSControlFunExport.GetControllerInstance();                }                if (ConnectionSem(connectionEnumType.EDSOnlyPointXRay))                {                    if (EDSInit())                    {                        int iSize = 2000;                        uint[] iXrayData = new uint[iSize];                        //采集XRay数据                        if (m_cfun.CollectSpectrum(uint.Parse(strTime), ref iXrayData))                        {                            return iXrayData;                        }                    }                }                return null;            }            catch /*(Exception ex)*/            {                return null;            }            finally            {                //EDS过程结束                //m_cfun.EDSFinishedInstance();                //关闭连接                DisConnectSem(connectionEnumType.EDSOnlyPointXRay);            }        }        #region 连接与关闭设备        public bool ConnectionSem(connectionEnumType connectionType)        {            //获取连接电镜类型            string connTypeStr = GetConnectionType(connectionType);            //连接电镜标识            bool bDisConnResult = false;            //判断连接状态            if (!m_bConnectionState)            {                //连接电镜设置                bDisConnResult = m_cfun.ConncetSem();            }            if (bDisConnResult)            {                m_bConnectionState = true;            }            else            {                m_bConnectionState = false;            }            return bDisConnResult;        }        public bool DisConnectSem(connectionEnumType disConnectType)        {            //获取关闭电镜类型            string connTypeStr = GetConnectionType(disConnectType);            bool bDisConnResult = false;            if (m_bConnectionState)            {                //bDisConnResult = m_cfun.DisConnectSem();            }            if (bDisConnResult)            {                m_bConnectionState = false;            }            else            {                m_bConnectionState = true;            }            return bDisConnResult;        }        private string GetConnectionType(connectionEnumType connectionType)        {            string connString = string.Empty;            switch (connectionType)            {                //设置单点采集文字内容                case connectionEnumType.EDSOnlyPointXRay:                    connString = "OnlyPointXRay";                    break;                //设置多点采集文字内容                case connectionEnumType.EDSMultiPointXRay:                    connString = "MultiPointXRay";                    break;                //设置面采集文字内容                case connectionEnumType.EDSAreaXRay:                    connString = "AreaXRay";                    break;                //设置图片                case connectionEnumType.ScanImage:                    connString = "Image";                    break;                default: break;            }            return connString;        }        /// <summary>        /// EDS初始化        /// </summary>        public bool EDSInit()        {            bool bResult = false;            //线程调用 加载            bResult = m_cfun.EDSInit();            return bResult;        }        public enum connectionEnumType        {            EDSOnlyPointXRay = 0,            EDSMultiPointXRay = 1,            EDSAreaXRay = 2,            ScanImage = 3        }        #endregion        #region int数组转byte数组        /// <summary>          /// int数组转byte数组          /// </summary>          /// <param name="src">源int数组</param>         /// <param name="offset">起始位置,一般为0</param>          /// <returns>values</returns>          protected byte[] intToBytes(uint[] src, int offset)        {            byte[] values = new byte[src.Length * 4];            for (int i = 0; i < src.Length; i++)            {                values[offset + 3] = (byte)((src[i] >> 24) & 0xFF);                values[offset + 2] = (byte)((src[i] >> 16) & 0xFF);                values[offset + 1] = (byte)((src[i] >> 8) & 0xFF);                values[offset] = (byte)(src[i] & 0xFF);                offset += 4;            }            return values;        }        protected int[] bytesToInt(byte[] src, int offset)        {            int[] values = new int[src.Length / 4];            for (int i = 0; i < values.Length; i++)            {                values[i] = BitConverter.ToInt32(src, offset);                offset += 4;            }            return values;        }        #endregion        /// <summary>        /// 弹出提示        /// </summary>        /// <param name="strContent"></param>        protected void showMessage(string strContent)        {            MessageBox.Show(strContent, "Tip");        }        #region 常用数据验证的封装,数字字符的验证        /// <summary>        /// 常用数据验证的封装,数字字符的验证        /// </summary>        /// <param name="inputVal">需要验证的数值【字符串,或者数字】</param>        /// <param name="type">类型为哪一个验证</param>        /// <returns>如果验证成功则返回True,否则返回false</returns>        public bool IsMatch(string inputVal, int type)        {            switch (type)            {                case 0:                    return Regex.IsMatch(inputVal, @"^[1-9]d*$");  //匹配正整数                case 1:                    return Regex.IsMatch(inputVal, @"^-?\d+$");  //匹配整数                case 2:                    return Regex.IsMatch(inputVal, @"^[A-Za-z0-9]+$");  //匹配由数字和26个英文字母组成的字符串                 case 3:                    return Regex.IsMatch(inputVal, @"^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$");  //匹配正浮点数                case 4:                    return Regex.IsMatch(inputVal, @"^[\u4e00-\u9fa5]{0,}$");  //匹配汉字                case 5:                    return Regex.IsMatch(inputVal, @"^[0-9]+(.[0-9]{1,3})?$");  //匹配1~3位小数的正实数                case 6:                    return Regex.IsMatch(inputVal, @"^[A-Za-z]+$");  //匹配英文字符                default:                    return true;            }        }        #endregion    }}
 |