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 OTSPartA_STDEditor
- {
- 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(table["message1"].ToString());
- txtCollectTime.Focus();
- return;
- }
- if (!IsMatch(strTime, 1))
- {
- showMessage(table["message2"].ToString());
- txtCollectTime.Focus();
- return;
- }
- if (Convert.ToInt32(strTime) < 100)
- {
- showMessage(table["message3"].ToString());
- 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, table["message4"].ToString());
- }
- #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
- }
- }
|