XrayContrastForm.cs 34 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867
  1. using OTSCLRINTERFACE;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.ComponentModel;
  5. using System.Data;
  6. using System.Drawing;
  7. using System.Linq;
  8. using System.Text;
  9. using System.Text.RegularExpressions;
  10. using System.Threading.Tasks;
  11. using System.Windows.Forms;
  12. namespace OTSPartA_STDEditor
  13. {
  14. public partial class XrayContrastForm : Form
  15. {
  16. #region 全部变量
  17. //数据库操作对象
  18. //全局Xray 用于存储采集的Xray信息
  19. byte[] xrayByteData = null;
  20. private SqlLiteClass m_sc = null;
  21. //Xray控件
  22. UXrayControl xrayControl = null;
  23. UXrayControl xrayContrastControl = null;
  24. public DataRow dr = null;
  25. public DataTable dt = null;
  26. // 电镜设置对象
  27. COTSControlFunExport m_cfun = null;
  28. // 连接状态
  29. bool m_bConnectionState = false;
  30. //STD信息集合
  31. public Dictionary<int, STDdata> STDDictionary = null;
  32. //国际化
  33. Language lan;
  34. System.Collections.Hashtable table;
  35. #endregion
  36. /// <summary>
  37. /// [颜色:16进制转成RGB]
  38. /// </summary>
  39. /// <param name="strColor">设置16进制颜色 [返回RGB]</param>
  40. /// <returns></returns>
  41. public static System.Drawing.Color colorHx16toRGB(string strHxColor)
  42. {
  43. try
  44. {
  45. if (strHxColor.Length == 0)
  46. {//如果为空
  47. return System.Drawing.Color.FromArgb(255, 255, 204);//设为白色
  48. }
  49. else
  50. {//转换颜色
  51. 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));
  52. }
  53. }
  54. catch
  55. {//设为白色
  56. return System.Drawing.Color.FromArgb(255, 255, 204);
  57. }
  58. }
  59. public XrayContrastForm()
  60. {
  61. InitializeComponent();
  62. }
  63. private void XrayContrastForm_Load(object sender, EventArgs e)
  64. {
  65. //加载Xray信息控件
  66. xrayControl = new UXrayControl();
  67. plXray.Controls.Add(xrayControl);
  68. xrayControl.Dock = DockStyle.Top;
  69. BindGrid_IncALib();
  70. //比对
  71. //GetCompMineralFun();
  72. xrayContrastControl = new UXrayControl();
  73. plXray.Controls.Add(xrayContrastControl);
  74. xrayContrastControl.Dock = DockStyle.Top;
  75. //国际化
  76. lan = new Language(this);
  77. table = lan.GetNameTable(this.Name);
  78. }
  79. #region 绑定Grid等相关方法
  80. /// <summary>
  81. /// 绑定STDGrid
  82. /// </summary>
  83. private void BindGrid_IncALib()
  84. {
  85. if (m_sc == null)
  86. {
  87. m_sc = new SqlLiteClass();
  88. }
  89. //查询
  90. //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
  91. //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
  92. 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
  93. //绑定
  94. BindDataGridView_dgV_IncALib(dtSelDB);
  95. //样式
  96. SetDataGridViewStyleIncLib();
  97. }
  98. /// <summary>
  99. /// 使用DataTable绑定Grid
  100. /// </summary>
  101. /// <param name="in_dt"></param>
  102. public void BindDataGridView_dgV_IncALib(DataTable dtSelDB)
  103. {
  104. dgV_IncALib.Rows.Clear();
  105. dgV_IncALib.Columns.Clear();
  106. //创建Grid的列
  107. //名称
  108. dgV_IncALib.Columns.Add("Name", "strName");
  109. //编号
  110. dgV_IncALib.Columns.Add("Code", "Code");
  111. //代表色
  112. dgV_IncALib.Columns.Add("Color", "Color");
  113. //硬度
  114. dgV_IncALib.Columns.Add("Hardness", "Hardness");
  115. //密度
  116. dgV_IncALib.Columns.Add("Density", "Density");
  117. //导电性
  118. dgV_IncALib.Columns.Add("Conductivity", "Conductivity");
  119. //BSE
  120. dgV_IncALib.Columns.Add("BSEValue", "BSE");
  121. //化学式
  122. dgV_IncALib.Columns.Add("Formula", "Formula");
  123. //元素
  124. dgV_IncALib.Columns.Add("Element", "Element");
  125. dgV_IncALib.Columns.Add("Xray", "Xray");
  126. dgV_IncALib.Columns.Add("RowIndex", "RowIndex");
  127. dgV_IncALib.Columns.Add("ReducedValue", "ReducedValue");
  128. //添加完成列后,再对不需要显示的列进行隐藏
  129. dgV_IncALib.Columns["Code"].Visible = false;
  130. dgV_IncALib.Columns["Color"].Visible = false;
  131. dgV_IncALib.Columns["Xray"].Visible = false;
  132. dgV_IncALib.Columns["RowIndex"].Visible = false;
  133. dgV_IncALib.Columns["ReducedValue"].Visible = false;
  134. //宽度
  135. dgV_IncALib.Columns["Name"].Width = 140;//名称
  136. dgV_IncALib.Columns["Code"].Width = 0;//编号
  137. dgV_IncALib.Columns["Color"].Width = 0;//代表色
  138. dgV_IncALib.Columns["Hardness"].Width = 80;//硬度
  139. dgV_IncALib.Columns["Density"].Width = 80;//密度
  140. dgV_IncALib.Columns["Conductivity"].Width = 60;//导电性
  141. dgV_IncALib.Columns["BSEValue"].Width = 80;//BSE
  142. dgV_IncALib.Columns["Formula"].Width = 240;//化学式
  143. dgV_IncALib.Columns["Element"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;//元素
  144. dgV_IncALib.Columns["Xray"].Width = 0;//Xray
  145. dgV_IncALib.Columns["RowIndex"].Width = 0;//index
  146. dgV_IncALib.Columns["ReducedValue"].Width = 0;//相识比对值
  147. //先设置一下头的高度,否则会太矮不好看
  148. dgV_IncALib.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.EnableResizing;
  149. dgV_IncALib.ColumnHeadersHeight = 23;
  150. //设置数据
  151. //克隆 查询出的数据结构
  152. dt = dtSelDB.Clone();
  153. foreach (KeyValuePair<int, STDdata> kv in STDDictionary)
  154. {
  155. byte[] xrayData = new byte[8000];
  156. DataRow[] dr = dtSelDB.Select("STDId=" + kv.Key);
  157. if (dr != null)
  158. {
  159. if (dr.Length > 0)
  160. {
  161. if (dr[0]["SPEC"].GetType().ToString()!= "System.DBNull")
  162. {
  163. xrayData = (byte[])dr[0]["SPEC"];
  164. }
  165. else
  166. {
  167. xrayData = new byte[2000];
  168. }
  169. }
  170. }
  171. //添加至全局dt
  172. DataRow drSTD = dt.NewRow();
  173. drSTD["StrName"] = kv.Value.StrName.ToString();
  174. drSTD["StdId"] = kv.Key.ToString();
  175. drSTD["Color"] = Convert.ToInt32(ParseRGB(colorHx16toRGB(kv.Value.Color)));
  176. drSTD["Hardness"] = kv.Value.Hardness.ToString();
  177. drSTD["Density"] = kv.Value.Density.ToString();
  178. drSTD["Electrical_conductivity"] = kv.Value.Electrical_conductivity.ToString();
  179. drSTD["BSE"] = kv.Value.BSE.ToString();
  180. drSTD["Formula"] = kv.Value.Formula.ToString();
  181. drSTD["Element"] = kv.Value.Element.ToString();
  182. drSTD["SPEC"] = xrayData;
  183. dt.Rows.Add(drSTD);
  184. }
  185. //设置数据
  186. for (int i = 0; i < dt.Rows.Count; i++)
  187. {
  188. int add_rowindex = dgV_IncALib.Rows.Add();
  189. dgV_IncALib.Rows[add_rowindex].Cells[0].Value = i.ToString();
  190. dgV_IncALib.Rows[i].Cells[0].Value = add_rowindex;
  191. for (int k = 0; k < dt.Columns.Count; k++)
  192. {
  193. dgV_IncALib.Rows[i].Cells[k].Value = dt.Rows[i][k].ToString();
  194. }
  195. }
  196. //设置颜色
  197. for (int i = 0; i < dgV_IncALib.Rows.Count; i++)
  198. {
  199. //在该数据库中返回的颜色格式与正常的不同,需要在前面加#号
  200. Color ls_c = colorValuetoRGB(dgV_IncALib[2, i].Value.ToString());
  201. dgV_IncALib[0, i].Style.BackColor = ls_c;
  202. }
  203. }
  204. public void SortDataGridView_dgV_IncALib(DataTable dt)
  205. {
  206. dgV_IncALib.Rows.Clear();
  207. dgV_IncALib.Columns.Clear();
  208. //创建Grid的列
  209. //名称
  210. dgV_IncALib.Columns.Add("Name", "Name");
  211. //编号
  212. dgV_IncALib.Columns.Add("Code", "Code");
  213. //代表色
  214. dgV_IncALib.Columns.Add("Color", "Color");
  215. //硬度
  216. dgV_IncALib.Columns.Add("Hardness", "Hardness");
  217. //密度
  218. dgV_IncALib.Columns.Add("Density", "Density");
  219. //导电性
  220. dgV_IncALib.Columns.Add("Conductivity", "Conductivity");
  221. //BSE
  222. dgV_IncALib.Columns.Add("BSEValue", "BSE");
  223. //化学式
  224. dgV_IncALib.Columns.Add("Formula", "Formula");
  225. //元素
  226. dgV_IncALib.Columns.Add("Element", "Element");
  227. dgV_IncALib.Columns.Add("Xray", "Xray");
  228. dgV_IncALib.Columns.Add("RowIndex", "RowIndex");
  229. dgV_IncALib.Columns.Add("ReducedValue", "ReducedValue");
  230. //添加完成列后,再对不需要显示的列进行隐藏
  231. dgV_IncALib.Columns["Code"].Visible = false;
  232. dgV_IncALib.Columns["Color"].Visible = false;
  233. dgV_IncALib.Columns["Xray"].Visible = false;
  234. dgV_IncALib.Columns["RowIndex"].Visible = false;
  235. dgV_IncALib.Columns["ReducedValue"].Visible = false;
  236. //宽度
  237. dgV_IncALib.Columns["Name"].Width = 140;//名称
  238. dgV_IncALib.Columns["Code"].Width = 0;//编号
  239. dgV_IncALib.Columns["Color"].Width = 0;//代表色
  240. dgV_IncALib.Columns["Hardness"].Width = 80;//硬度
  241. dgV_IncALib.Columns["Density"].Width = 80;//密度
  242. dgV_IncALib.Columns["Conductivity"].Width = 60;//导电性
  243. dgV_IncALib.Columns["BSEValue"].Width = 80;//BSE
  244. dgV_IncALib.Columns["Formula"].Width = 240;//化学式
  245. dgV_IncALib.Columns["Element"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;//元素
  246. dgV_IncALib.Columns["Xray"].Width = 0;//Xray
  247. dgV_IncALib.Columns["RowIndex"].Width = 0;//index
  248. dgV_IncALib.Columns["ReducedValue"].Width = 0;//相识比对值
  249. //先设置一下头的高度,否则会太矮不好看
  250. dgV_IncALib.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.EnableResizing;
  251. dgV_IncALib.ColumnHeadersHeight = 23;
  252. //设置数据
  253. for (int i = 0; i < dt.Rows.Count; i++)
  254. {
  255. int add_rowindex = dgV_IncALib.Rows.Add();
  256. dgV_IncALib.Rows[add_rowindex].Cells[0].Value = i.ToString();
  257. dgV_IncALib.Rows[i].Cells[0].Value = add_rowindex;
  258. for (int k = 0; k < dt.Columns.Count; k++)
  259. {
  260. dgV_IncALib.Rows[i].Cells[k].Value = dt.Rows[i][k].ToString();
  261. }
  262. }
  263. //设置颜色
  264. for (int i = 0; i < dgV_IncALib.Rows.Count; i++)
  265. {
  266. //在该数据库中返回的颜色格式与正常的不同,需要在前面加#号
  267. Color ls_c = colorValuetoRGB(dgV_IncALib[2, i].Value.ToString());
  268. dgV_IncALib[0, i].Style.BackColor = ls_c;
  269. }
  270. }
  271. #region 自定义方法
  272. /// <summary>
  273. /// [颜色:16进制转成RGB]
  274. /// </summary>
  275. /// <param name="strColor">设置16进制颜色 [返回RGB]</param>
  276. /// <returns></returns>
  277. public System.Drawing.Color colorValuetoRGB(string strHxColor)
  278. {
  279. try
  280. {
  281. if (strHxColor.Length == 0)
  282. {//如果为空
  283. return System.Drawing.Color.FromArgb(0, 0, 0);//设为黑色
  284. }
  285. else
  286. {
  287. int colorValue = Convert.ToInt32(strHxColor);
  288. //转换颜色
  289. return Color.FromArgb(colorValue % 256, (colorValue >> 8) % 256, (colorValue >> 16) % 256);
  290. }
  291. }
  292. catch (Exception)
  293. {//设为黑色
  294. return System.Drawing.Color.FromArgb(0, 0, 0);
  295. }
  296. }
  297. /// <summary>
  298. /// 将颜色对象转换为uint
  299. /// </summary>
  300. /// <param name="color"></param>
  301. /// <returns></returns>
  302. public uint ParseRGB(Color color)
  303. {
  304. return (uint)(((uint)color.B << 16) | (ushort)(((ushort)color.G << 8) | color.R));
  305. }
  306. #endregion
  307. #region 设置Grid样式
  308. /// <summary>
  309. /// 设置夹杂物列表DataGridView样式
  310. /// </summary>
  311. private void SetDataGridViewStyleIncLib()
  312. {
  313. //用户不能调整标题的高度
  314. dgV_IncALib.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.DisableResizing;
  315. //用户不能调整 行高
  316. dgV_IncALib.AllowUserToResizeRows = false;
  317. //改变行的高度;
  318. //Gview_gz.RowTemplate.Height = 20;
  319. //点击选择整行
  320. dgV_IncALib.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
  321. //居中显示
  322. //System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle1 = new System.Windows.Forms.DataGridViewCellStyle();
  323. //dataGridViewCellStyle1.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleCenter;
  324. //dgV_IncALib.DefaultCellStyle = dataGridViewCellStyle1;
  325. dgV_IncALib.ColumnHeadersDefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;
  326. //再次重覆禁用拖动表头高度,居然有效果了
  327. dgV_IncALib.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.DisableResizing;
  328. //设置grid可以复制
  329. dgV_IncALib.ClipboardCopyMode = DataGridViewClipboardCopyMode.EnableAlwaysIncludeHeaderText;
  330. //设置每列的宽度
  331. //dgV_IncALib.Columns[1].Width = 40;//第一列序号的宽度设置一下吧,要不太丑
  332. //设置序号列不排序
  333. dgV_IncALib.Columns[0].SortMode = DataGridViewColumnSortMode.NotSortable;
  334. for (int i = 0; i < dgV_IncALib.Columns.Count; i++)
  335. {
  336. dgV_IncALib.Columns[i].SortMode = DataGridViewColumnSortMode.NotSortable;
  337. }
  338. //设置序号列不可以设置宽度
  339. dgV_IncALib.Columns[0].Resizable = DataGridViewTriState.False;
  340. System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle1 = new System.Windows.Forms.DataGridViewCellStyle();
  341. System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle2 = new System.Windows.Forms.DataGridViewCellStyle();
  342. dataGridViewCellStyle1.BackColor = System.Drawing.Color.LightCyan;
  343. dgV_IncALib.AlternatingRowsDefaultCellStyle = dataGridViewCellStyle1;
  344. dgV_IncALib.BackgroundColor = System.Drawing.Color.White;
  345. dgV_IncALib.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
  346. dgV_IncALib.ColumnHeadersBorderStyle = System.Windows.Forms.DataGridViewHeaderBorderStyle.Single;
  347. dataGridViewCellStyle2.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleCenter;//211, 223, 240
  348. dataGridViewCellStyle2.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(211)))), ((int)(((byte)(223)))), ((int)(((byte)(240)))));
  349. dataGridViewCellStyle2.Font = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
  350. dataGridViewCellStyle2.ForeColor = System.Drawing.Color.Navy;
  351. dataGridViewCellStyle2.SelectionBackColor = System.Drawing.SystemColors.Highlight;
  352. dataGridViewCellStyle2.SelectionForeColor = System.Drawing.SystemColors.HighlightText;
  353. dgV_IncALib.ColumnHeadersDefaultCellStyle = dataGridViewCellStyle2;
  354. dgV_IncALib.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
  355. dgV_IncALib.EnableHeadersVisualStyles = false;
  356. dgV_IncALib.GridColor = System.Drawing.SystemColors.GradientInactiveCaption;
  357. dgV_IncALib.ReadOnly = true;
  358. dgV_IncALib.RowHeadersVisible = true; //建议改为true;为了以后显示序号。
  359. dgV_IncALib.RowTemplate.Height = 23;
  360. dgV_IncALib.RowTemplate.ReadOnly = true;
  361. //居中
  362. dgV_IncALib.RowsDefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;
  363. dgV_IncALib.AllowUserToOrderColumns = false;
  364. }
  365. #endregion
  366. #endregion
  367. #region Xray比对
  368. private void GetCompMineralFun(byte[] collectXrayData)
  369. {
  370. byte[] stdmineralclr = collectXrayData;
  371. List<byte[]> listOreTypeClr = new List<byte[]>();
  372. foreach (DataRow item in dt.Rows)
  373. {
  374. if (item["SPEC"].GetType().ToString() != "System.DBNull")
  375. {
  376. listOreTypeClr.Add((byte[])item["SPEC"]);
  377. }
  378. else
  379. {
  380. listOreTypeClr.Add(new byte[2000]);
  381. }
  382. }
  383. //获取信息中的相识度
  384. List<double> returnValue = GetCompMineral(ref stdmineralclr, ref listOreTypeClr);
  385. //向DataTable中添加
  386. for (int i = 0; i < dt.Rows.Count; i++)
  387. {
  388. dt.Rows[i]["ReducedValue"] = returnValue[i];
  389. }
  390. //重新排列
  391. dt.DefaultView.Sort = "ReducedValue desc";
  392. dt = dt.DefaultView.ToTable();
  393. SortDataGridView_dgV_IncALib(dt);
  394. //设置选中DataGridView当前行
  395. if (dgV_IncALib.Rows.Count > 0)
  396. {
  397. dgV_IncALib.Rows[0].Selected = true;
  398. xrayControl.Dr = dt.Rows[0];
  399. //xrayControl.Dt = dt;
  400. xrayControl.Refresh();
  401. }
  402. }
  403. // 在listOreTypeClr列表里找出和stdmineralclr相似的信息并返回
  404. protected List<double> GetCompMineral(ref byte[] stdmineralclr, ref List<byte[]> listOreTypeClr)
  405. {
  406. if (null == stdmineralclr || null == listOreTypeClr)
  407. {
  408. return null;
  409. }
  410. if (0 == listOreTypeClr.Count())
  411. {
  412. return null;
  413. }
  414. int i = 0;
  415. List<double> oretypeclr = new List<double>();
  416. List<byte[]> listOreTypeClr_cmp = new List<byte[]>();
  417. // 计算余弦值
  418. double dCosValue = 0;
  419. List<string> lstIgnoreElementNames = new List<string>();
  420. for (i = 0; i < listOreTypeClr.Count; i++)
  421. {
  422. dCosValue = GetCosValue(0, ref lstIgnoreElementNames, stdmineralclr, listOreTypeClr[i]);
  423. dCosValue = 1000000 * dCosValue;
  424. oretypeclr.Add((int)dCosValue);// 将mineralid设置为余弦值
  425. }
  426. return oretypeclr;
  427. }
  428. // 20190903:增加参数iStartChannel哪个位置开始比较, lstIgnoreChannel里面的通道不处理
  429. // 20191128:变更lstIgnoreChannel参数为lstIgnoreElementNames
  430. protected double GetCosValue(int iStartChannel, ref List<string> lstIgnoreElementNames, byte[] stdmineralclr1, byte[] stdmineralclr2)
  431. {
  432. int iXrayDataLen = stdmineralclr1.Length;
  433. List<int> lstIgnoreChannel = new List<int>();
  434. if(stdmineralclr2==null)
  435. {
  436. return 0;
  437. }
  438. // 两者数据量不一致,返回0
  439. if (iXrayDataLen != stdmineralclr2.Length)
  440. {
  441. return 0;
  442. }
  443. if (iStartChannel < 0 || iStartChannel >= iXrayDataLen)
  444. {
  445. return 1;
  446. }
  447. bool bignore = false;
  448. int j = 0;
  449. // 公式: (x1y1+x2y2+x3y3+...x2000y2000) / (sqrt(x1^2 + x2^2 + ...x2000^2) * sqrt(y1^2 + y2^2 + ...y2000^2))
  450. double dotpro = 0;
  451. double d1 = 0;
  452. double d2 = 0;
  453. for (int i = iStartChannel; i < iXrayDataLen; i++)
  454. {
  455. bignore = false;
  456. for (j = 0; j < lstIgnoreChannel.Count(); j++)
  457. {
  458. if (lstIgnoreChannel[j] == i)
  459. {
  460. bignore = true;
  461. break;
  462. }
  463. }
  464. if (!bignore)
  465. {
  466. dotpro = dotpro + stdmineralclr1[i] * stdmineralclr2[i];
  467. d1 = d1 + stdmineralclr1[i] * stdmineralclr1[i];
  468. d2 = d2 + stdmineralclr2[i] * stdmineralclr2[i];
  469. }
  470. }
  471. d1 = System.Math.Sqrt(d1);
  472. d2 = System.Math.Sqrt(d2);
  473. // return (0 == d1 || 0 == d2) ? 0 : dotpro / (d1 * d2);
  474. // 算法改进, 加上距离权重
  475. if (0 == d1 || 0 == d2)
  476. {
  477. return 0;
  478. }
  479. double dresult = 0;
  480. dresult = (d1 < d2) ? d1 / d2 : d2 / d1;
  481. return 0.4 * dotpro / (d1 * d2) + 0.3 * dresult + 0.3 * GetStdEvp(iStartChannel, ref lstIgnoreChannel, stdmineralclr1, stdmineralclr2);
  482. }
  483. // 获取标准差
  484. // 20190903:增加参数iStartChannel哪个位置开始比较, lstIgnoreChannel里面的通道不处理
  485. double GetStdEvp(int iStartChannel, ref List<int> lstIgnoreChannel, byte[] stdmineralclr1, byte[] stdmineralclr2)
  486. {
  487. int iXrayDataLen = stdmineralclr1.Length;
  488. // 两者数据量不一致,返回0
  489. if (iXrayDataLen != stdmineralclr2.Length)
  490. {
  491. return 0;
  492. }
  493. if (iStartChannel < 0 || iStartChannel >= iXrayDataLen)
  494. {
  495. return 1;
  496. }
  497. bool bignore = false;
  498. int i = 0;
  499. int j = 0;
  500. int iSum1 = 0;
  501. int iSum2 = 0;
  502. double dAva1 = 0;
  503. double dAva2 = 0;
  504. double dSquare1 = 0;
  505. double dSquare2 = 0;
  506. List<int> listdata1 = new List<int>();
  507. List<int> listdata2 = new List<int>();
  508. // 求出能谱的平均值
  509. for (i = iStartChannel; i < iXrayDataLen; i++)
  510. {
  511. bignore = false;
  512. for (j = 0; j < lstIgnoreChannel.Count(); j++)
  513. {
  514. if (lstIgnoreChannel[j] == i)
  515. {
  516. bignore = true;
  517. break;
  518. }
  519. }
  520. if (!bignore)
  521. {
  522. iSum1 = iSum1 + (int)stdmineralclr1[i];
  523. listdata1.Add((int)stdmineralclr1[i]);
  524. iSum2 = iSum2 + (int)stdmineralclr2[i];
  525. listdata2.Add((int)stdmineralclr2[i]);
  526. }
  527. }
  528. dAva1 = iSum1 / listdata1.Count();
  529. dAva2 = iSum2 / listdata2.Count();
  530. for (i = 0; i < listdata1.Count(); i++)
  531. {
  532. dSquare1 = dSquare1 + (listdata1[i] - dAva1) * (listdata1[i] - dAva1);
  533. dSquare2 = dSquare2 + (listdata2[i] - dAva1) * (listdata2[i] - dAva1);
  534. }
  535. dSquare1 = dSquare1 / listdata1.Count();
  536. dSquare2 = dSquare2 / listdata2.Count();
  537. dSquare1 = System.Math.Sqrt(dSquare1);
  538. dSquare2 = System.Math.Sqrt(dSquare2);
  539. dSquare1 = dSquare1 * (double)iSum2 / iSum1; // 归一化
  540. return (dSquare1 < dSquare2) ? (dSquare1 / dSquare2) : (dSquare2 / dSquare1);
  541. }
  542. #endregion
  543. private void dgV_IncALib_CellClick(object sender, DataGridViewCellEventArgs e)
  544. {
  545. if (xrayByteData != null)
  546. {
  547. dgV_IncALib.ClearSelection();
  548. //删除
  549. if (e.RowIndex < 0)
  550. {
  551. return;
  552. }
  553. //将选择行的数据传递给Xray控件
  554. xrayControl.Dr = dt.Rows[e.RowIndex];
  555. //xrayControl.Dt = dt;
  556. xrayControl.Refresh();
  557. //设置选中DataGridView当前行
  558. dgV_IncALib.Rows[e.RowIndex].Selected = true;
  559. }
  560. }
  561. private void btnCollectXray_Click(object sender, EventArgs e)
  562. {
  563. try
  564. {
  565. string strTime = txtCollectTime.Text.Trim();
  566. if (txtCollectTime.Equals(""))
  567. {
  568. showMessage("Please fill in the collection time name!");
  569. txtCollectTime.Focus();
  570. return;
  571. }
  572. if (!IsMatch(strTime, 1))
  573. {
  574. showMessage("Error collecting time content, the format should be integer!");
  575. txtCollectTime.Focus();
  576. return;
  577. }
  578. if (Convert.ToInt32(strTime) < 100)
  579. {
  580. showMessage("CollectTime must not be less than 100 milliseconds!");
  581. txtCollectTime.Focus();
  582. return;
  583. }
  584. //获取Xray方法
  585. // 电镜设置对象
  586. xrayByteData = intToBytes(GetCollectXray(strTime), 0);
  587. DataRow dataRow = dt.NewRow();
  588. dataRow["SPEC"] = xrayByteData;
  589. dataRow["Color"] = 0;
  590. xrayContrastControl.Dr = dataRow;
  591. xrayContrastControl.Dt = dt;
  592. xrayContrastControl.Refresh();
  593. //比对
  594. GetCompMineralFun(xrayByteData);
  595. //国际化
  596. lan = new Language(this);
  597. //国际化后各表头居中显示
  598. for (int i = 0; i < dgV_IncALib.Columns.Count; i++)
  599. {
  600. dgV_IncALib.Columns[i].SortMode = DataGridViewColumnSortMode.NotSortable;
  601. }
  602. }
  603. catch (Exception ex)
  604. {
  605. throw ex;
  606. }
  607. }
  608. /// <summary>
  609. /// 获取采集当前的Xray信息
  610. /// </summary>
  611. /// <returns></returns>
  612. protected uint[] GetCollectXray(string strTime)
  613. {
  614. try
  615. {
  616. if (null == m_cfun)
  617. {
  618. m_cfun = COTSControlFunExport.GetControllerInstance();
  619. }
  620. if (ConnectionSem(connectionEnumType.EDSOnlyPointXRay))
  621. {
  622. if (EDSInit())
  623. {
  624. int iSize = 2000;
  625. uint[] iXrayData = new uint[iSize];
  626. //采集XRay数据
  627. if (m_cfun.CollectSpectrum(uint.Parse(strTime), ref iXrayData))
  628. {
  629. return iXrayData;
  630. }
  631. }
  632. }
  633. return null;
  634. }
  635. catch /*(Exception ex)*/
  636. {
  637. return null;
  638. }
  639. finally
  640. {
  641. //EDS过程结束
  642. //m_cfun.EDSFinishedInstance();
  643. //关闭连接
  644. DisConnectSem(connectionEnumType.EDSOnlyPointXRay);
  645. }
  646. }
  647. #region 连接与关闭设备
  648. public bool ConnectionSem(connectionEnumType connectionType)
  649. {
  650. //获取连接电镜类型
  651. string connTypeStr = GetConnectionType(connectionType);
  652. //连接电镜标识
  653. bool bDisConnResult = false;
  654. //判断连接状态
  655. if (!m_bConnectionState)
  656. {
  657. //连接电镜设置
  658. bDisConnResult = m_cfun.ConncetSem();
  659. }
  660. if (bDisConnResult)
  661. {
  662. m_bConnectionState = true;
  663. }
  664. else
  665. {
  666. m_bConnectionState = false;
  667. }
  668. return bDisConnResult;
  669. }
  670. public bool DisConnectSem(connectionEnumType disConnectType)
  671. {
  672. //获取关闭电镜类型
  673. string connTypeStr = GetConnectionType(disConnectType);
  674. bool bDisConnResult = false;
  675. if (m_bConnectionState)
  676. {
  677. //bDisConnResult = m_cfun.DisConnectSem();
  678. }
  679. if (bDisConnResult)
  680. {
  681. m_bConnectionState = false;
  682. }
  683. else
  684. {
  685. m_bConnectionState = true;
  686. }
  687. return bDisConnResult;
  688. }
  689. private string GetConnectionType(connectionEnumType connectionType)
  690. {
  691. string connString = string.Empty;
  692. switch (connectionType)
  693. {
  694. //设置单点采集文字内容
  695. case connectionEnumType.EDSOnlyPointXRay:
  696. connString = "OnlyPointXRay";
  697. break;
  698. //设置多点采集文字内容
  699. case connectionEnumType.EDSMultiPointXRay:
  700. connString = "MultiPointXRay";
  701. break;
  702. //设置面采集文字内容
  703. case connectionEnumType.EDSAreaXRay:
  704. connString = "AreaXRay";
  705. break;
  706. //设置图片
  707. case connectionEnumType.ScanImage:
  708. connString = "Image";
  709. break;
  710. default: break;
  711. }
  712. return connString;
  713. }
  714. /// <summary>
  715. /// EDS初始化
  716. /// </summary>
  717. public bool EDSInit()
  718. {
  719. bool bResult = false;
  720. //线程调用 加载
  721. bResult = m_cfun.EDSInit();
  722. return bResult;
  723. }
  724. public enum connectionEnumType
  725. {
  726. EDSOnlyPointXRay = 0,
  727. EDSMultiPointXRay = 1,
  728. EDSAreaXRay = 2,
  729. ScanImage = 3
  730. }
  731. #endregion
  732. #region int数组转byte数组
  733. /// <summary>
  734. /// int数组转byte数组
  735. /// </summary>
  736. /// <param name="src">源int数组</param>
  737. /// <param name="offset">起始位置,一般为0</param>
  738. /// <returns>values</returns>
  739. protected byte[] intToBytes(uint[] src, int offset)
  740. {
  741. byte[] values = new byte[src.Length * 4];
  742. for (int i = 0; i < src.Length; i++)
  743. {
  744. values[offset + 3] = (byte)((src[i] >> 24) & 0xFF);
  745. values[offset + 2] = (byte)((src[i] >> 16) & 0xFF);
  746. values[offset + 1] = (byte)((src[i] >> 8) & 0xFF);
  747. values[offset] = (byte)(src[i] & 0xFF);
  748. offset += 4;
  749. }
  750. return values;
  751. }
  752. protected int[] bytesToInt(byte[] src, int offset)
  753. {
  754. int[] values = new int[src.Length / 4];
  755. for (int i = 0; i < values.Length; i++)
  756. {
  757. values[i] = BitConverter.ToInt32(src, offset);
  758. offset += 4;
  759. }
  760. return values;
  761. }
  762. #endregion
  763. /// <summary>
  764. /// 弹出提示
  765. /// </summary>
  766. /// <param name="strContent"></param>
  767. protected void showMessage(string strContent)
  768. {
  769. MessageBox.Show(strContent, "Tip");
  770. }
  771. #region 常用数据验证的封装,数字字符的验证
  772. /// <summary>
  773. /// 常用数据验证的封装,数字字符的验证
  774. /// </summary>
  775. /// <param name="inputVal">需要验证的数值【字符串,或者数字】</param>
  776. /// <param name="type">类型为哪一个验证</param>
  777. /// <returns>如果验证成功则返回True,否则返回false</returns>
  778. public bool IsMatch(string inputVal, int type)
  779. {
  780. switch (type)
  781. {
  782. case 0:
  783. return Regex.IsMatch(inputVal, @"^[1-9]d*$"); //匹配正整数
  784. case 1:
  785. return Regex.IsMatch(inputVal, @"^-?\d+$"); //匹配整数
  786. case 2:
  787. return Regex.IsMatch(inputVal, @"^[A-Za-z0-9]+$"); //匹配由数字和26个英文字母组成的字符串
  788. case 3:
  789. 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]*))$"); //匹配正浮点数
  790. case 4:
  791. return Regex.IsMatch(inputVal, @"^[\u4e00-\u9fa5]{0,}$"); //匹配汉字
  792. case 5:
  793. return Regex.IsMatch(inputVal, @"^[0-9]+(.[0-9]{1,3})?$"); //匹配1~3位小数的正实数
  794. case 6:
  795. return Regex.IsMatch(inputVal, @"^[A-Za-z]+$"); //匹配英文字符
  796. default:
  797. return true;
  798. }
  799. }
  800. #endregion
  801. }
  802. }