frmReMeasure.cs 50 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072
  1. using OTSDataType;
  2. using OTSCommon.Model;
  3. using OTSMeasureApp;
  4. using System;
  5. using System.Collections.Generic;
  6. using System.ComponentModel;
  7. using System.Data;
  8. using System.Drawing;
  9. using System.Linq;
  10. using System.Text;
  11. using System.Threading.Tasks;
  12. using System.Windows.Forms;
  13. using OTSIncAReportGrids.OTSIncAReportGridsFuncation;
  14. using System.Threading;
  15. using static OTSDataType.otsdataconst;
  16. using OTSPeriodicTable;
  17. using OpenCvSharp;
  18. using Point = System.Drawing.Point;
  19. using OTSIncAReportGraph.Controls;
  20. using OTSIncAReportGraph.OTSIncAReportGraphFuncation;
  21. using OTSCLRINTERFACE;
  22. using System.IO;
  23. using System.Reflection;
  24. using OTSModelSharp.ResourceManage;
  25. using System.Collections;
  26. using OTSIncAReportApp.SysMgrTools;
  27. using OTSIncAReportApp.DataOperation.DataAccess;
  28. using OTSModelSharp.DTLBase;
  29. using OTSRptPeriodicTable;
  30. using ExportToExcel;
  31. using ComboBoxItem = OTSMeasureApp.ComboBoxItem;
  32. namespace OTSIncAReportApp
  33. {
  34. public partial class frmReMeasure : Form
  35. {
  36. frmReportApp m_ReportApp;
  37. OTSImageDisHelp ReportFun;
  38. OTSReportGridsFun m_OTSIncAReportGridsFun;
  39. List<Particle> SelectedParticles;
  40. List<Particle> successParticles;
  41. Dictionary<int, Mat> keyValuesMat;
  42. bool isCheck = true;
  43. bool stopFlag = false;//停止标识
  44. Point handPoint;
  45. int partFunIndex = 0;
  46. int xrayScanMode = 0;
  47. int nBrukerDwellTime = 0;
  48. double ScanFieldSizeX = 0;
  49. double ScanFieldSizeX100 = 0;
  50. double ScanFieldSizeY100 = 0;
  51. double oldMag = 0;
  52. double old_pixelsize = 0;
  53. double new_pixelsize = 0;
  54. string sampleName = "";
  55. int width = 0;
  56. int height = 0;
  57. OpenCvSharp.Size dsize;
  58. DataTable dt_new;
  59. //国际化
  60. Language lan;
  61. Hashtable table;
  62. public static string ReportMgrParamFile = "\\Config\\SysData\\OTSReportMgrParam.rpf"; //报告对应使用的参数文件名
  63. private delegate void DelSetPro(string txt, RichTextBox richTextBox);//设置进度条进度的委托方法
  64. /// <summary>
  65. /// 设置进度。
  66. /// </summary>
  67. /// <param name="pro"></param>
  68. /// <param name="proBar"></param>
  69. private void SetProgressMessage(string txt, RichTextBox richTextBox)
  70. {
  71. //如果当前调用方不是创建控件的一方,则需要使用this.Invoke()
  72. //在这里,ProgressBar控件是由主线程创建的,所以子线程要对该控件进行操作
  73. //必须执行this.InvokeRequired进行判断。
  74. if (this.InvokeRequired)
  75. {
  76. DelSetPro setPro = new DelSetPro(SetProgressMessage);
  77. this.Invoke(setPro, new object[] { txt, richTextBox });
  78. }
  79. else
  80. {
  81. WriteRictBox(txt);
  82. }
  83. }
  84. #region 将文本追加到RictBox的尾部上
  85. /// <summary>
  86. /// 将文本追加到RictBox的尾部上
  87. /// </summary>
  88. public void WriteRictBox(string in_str)
  89. {
  90. //追加到rictbox尾部
  91. richTextBox_process.AppendText("[" + DateTime.Now.Hour.ToString() + ":"
  92. + DateTime.Now.Minute.ToString() + ":"
  93. + DateTime.Now.Second.ToString() + "]"
  94. + in_str + Environment.NewLine);
  95. richTextBox_process.ScrollToCaret();
  96. }
  97. #endregion
  98. public frmReMeasure(OTSImageDisHelp ReportFun, frmReportApp m_ReportApp)
  99. {
  100. InitializeComponent();
  101. lan = new Language(this);
  102. table = lan.GetNameTable(this.Name);
  103. this.m_ReportApp = m_ReportApp;
  104. //初始化底层操作类
  105. this.m_OTSIncAReportGridsFun = new OTSReportGridsFun(m_ReportApp);
  106. this.SelectedParticles = m_ReportApp.GetSelectedParticles();
  107. this.ReportFun = ReportFun;
  108. //load the userdefine control dynamically
  109. System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Control_DrawDistrbutionImageAndBSE));
  110. this.control_XRayTable1 = new Control_XRayTable();
  111. this.control_XRayTable1.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(180)))), ((int)(((byte)(255)))), ((int)(((byte)(255)))), ((int)(((byte)(255)))));
  112. this.control_XRayTable1.Dock = System.Windows.Forms.DockStyle.Fill;
  113. this.control_XRayTable1.GBInfoStr = "";
  114. this.control_XRayTable1.GoodChineseName = "";
  115. this.control_XRayTable1.MaterialName = "";
  116. this.control_XRayTable1.List_ShowElementInfo = ((System.Collections.Generic.List<OTSIncAReportGraph.Controls.ShowElementInfo>)(resources.GetObject("control_XRayTable1.List_ShowElementInfo")));
  117. this.control_XRayTable1.Name = "control_XRayTable1";
  118. this.control_XRayTable1.ShowAnalysisXray = true;
  119. this.control_XRayTable1.ShowSearchXray = false;
  120. this.control_XRayTable1.Size = new System.Drawing.Size(groupBox2.Width, groupBox2.Height);
  121. this.control_XRayTable1.STDName = "";
  122. this.control_XRayTable1.TabIndex = 16;
  123. this.groupBox2.Controls.Add(this.control_XRayTable1);
  124. ReadSuccessDb();
  125. //显示已测颗粒
  126. if (successParticles.Count != 0)
  127. {
  128. BindDataGridView(dataGridView_success, successParticles);
  129. }
  130. //显示待测颗粒
  131. if (SelectedParticles.Count != 0)
  132. {
  133. BindDataGridView(dgV_ParticlesDevidePage, SelectedParticles);
  134. }
  135. //默认选中
  136. foreach (DataGridViewRow dr in dgV_ParticlesDevidePage.Rows)
  137. {
  138. dr.Cells[0].Value = isCheck;
  139. }
  140. }
  141. /// <summary>
  142. /// 判断是否是二次测量颗粒
  143. /// </summary>
  144. private void UpdateDB()
  145. {
  146. if (dgV_ParticlesDevidePage.Rows.Count == SelectedParticles.Count)
  147. {
  148. for (int i = 0; i < SelectedParticles.Count; i++)
  149. {
  150. if (dt_new.Select("FieldId = " + SelectedParticles[i].FieldId + " and ParticleId = " + SelectedParticles[i].ParticleId + "").Count() != 0)
  151. {
  152. dgV_ParticlesDevidePage.Rows[i].Cells["ReMeasure"].Value = "是";
  153. }
  154. else
  155. {
  156. dgV_ParticlesDevidePage.Rows[i].Cells["ReMeasure"].Value = "否";
  157. }
  158. }
  159. }
  160. for (int i = 0; i < dataGridView_success.Rows.Count; i++)
  161. {
  162. dataGridView_success.Rows[i].Cells["ReMeasure"].Value = "是";
  163. }
  164. }
  165. /// <summary>
  166. /// 显示已测颗粒
  167. /// </summary>
  168. private void ReadSuccessDb()
  169. {
  170. SQLiteHelper sQLiteHelper = new SQLiteHelper(ReportFun.resultFile.FilePath + "\\FIELD_FILES\\Inclusion.db");
  171. if (!sQLiteHelper.IsExist("IncADataReMeasure"))
  172. {
  173. sQLiteHelper.ExecuteNonQuery("CREATE TABLE IncADataReMeasure AS SELECT * FROM IncAData where 1=0;");
  174. }
  175. dt_new = sQLiteHelper.ExecuteDataTable("SELECT * FROM IncADataReMeasure");
  176. successParticles = new List<Particle>();
  177. for (int i = 0; i < dt_new.Rows.Count; i++)
  178. {
  179. DataTable dt_xray = sQLiteHelper.ExecuteDataTable("SELECT XrayData FROM XRayData WHERE FieldId = " + dt_new.Rows[i]["FieldId"].ToString() + " AND XrayIndex = " + dt_new.Rows[i]["XrayId"].ToString() + "");
  180. DataTable dt_Element = sQLiteHelper.ExecuteDataTable("SELECT * FROM ElementChemistry WHERE FieldId = " + dt_new.Rows[i]["FieldId"].ToString() + " AND XRayId = " + dt_new.Rows[i]["XrayId"].ToString() + "");
  181. Particle particle = new Particle();
  182. particle.FieldId = int.Parse(dt_new.Rows[i]["FieldId"].ToString());
  183. particle.ParticleId = int.Parse(dt_new.Rows[i]["ParticleId"].ToString());
  184. particle.AveGray = int.Parse(dt_new.Rows[i]["AveGray"].ToString());
  185. particle.RectLeft = int.Parse(dt_new.Rows[i]["RectLeft"].ToString());
  186. particle.RectTop = int.Parse(dt_new.Rows[i]["RectTop"].ToString());
  187. particle.RectWidth = int.Parse(dt_new.Rows[i]["RectWidth"].ToString());
  188. particle.RectHeight = int.Parse(dt_new.Rows[i]["RectHeight"].ToString());
  189. particle.Area = double.Parse(dt_new.Rows[i]["Area"].ToString());
  190. particle.PosX = int.Parse(dt_new.Rows[i]["PosX"].ToString());
  191. particle.PosY = int.Parse(dt_new.Rows[i]["PosY"].ToString());
  192. particle.TypeId = int.Parse(dt_new.Rows[i]["TypeId"].ToString());
  193. particle.SegmentNum = int.Parse(dt_new.Rows[i]["SegmentNum"].ToString());
  194. particle.SEMPosX = int.Parse(dt_new.Rows[i]["SEMPosX"].ToString());
  195. particle.SEMPosY = int.Parse(dt_new.Rows[i]["SEMPosY"].ToString());
  196. particle.XrayId = int.Parse(dt_new.Rows[i]["XrayId"].ToString());
  197. particle.DMAX = double.Parse(dt_new.Rows[i]["DMAX"].ToString());
  198. particle.DMIN = double.Parse(dt_new.Rows[i]["DMIN"].ToString());
  199. particle.DPERP = double.Parse(dt_new.Rows[i]["DPERP"].ToString());
  200. particle.PERIMETER = double.Parse(dt_new.Rows[i]["PERIMETER"].ToString());
  201. particle.ORIENTATION = double.Parse(dt_new.Rows[i]["ORIENTATION"].ToString());
  202. particle.DINSCR = double.Parse(dt_new.Rows[i]["DINSCR"].ToString());
  203. particle.DMEAN = double.Parse(dt_new.Rows[i]["DMEAN"].ToString());
  204. particle.DELONG = double.Parse(dt_new.Rows[i]["DELONG"].ToString());
  205. particle.DFERET = double.Parse(dt_new.Rows[i]["DFERET"].ToString());
  206. particle.TypeName = dt_new.Rows[i]["TypeName"].ToString();
  207. particle.TypeColor = dt_new.Rows[i]["TypeColor"].ToString();
  208. particle.XRayData = (Byte[])dt_xray.Rows[0][0];
  209. particle.ElementList = new List<Element>();
  210. particle.ElementNum = dt_Element.Rows.Count;
  211. for (int j = 0; j < dt_Element.Rows.Count; j++)
  212. {
  213. Element element = new Element();
  214. element.FieldId = particle.FieldId;
  215. element.XrayId = particle.XrayId;
  216. element.Name = dt_Element.Rows[j]["Name"].ToString();
  217. element.Percentage = double.Parse(dt_Element.Rows[j]["Percentage"].ToString());
  218. element.ElementNum = particle.ElementNum;
  219. particle.ElementList.Add(element);
  220. }
  221. successParticles.Add(particle);
  222. }
  223. }
  224. private void BindDataGridView(DataGridView dgv, List<Particle> particlesList)
  225. {
  226. dgv.Rows.Clear();
  227. dgv.Columns.Clear();
  228. //先建立个 CheckBox 栏
  229. DataGridViewCheckBoxColumn cbCol = new DataGridViewCheckBoxColumn();
  230. cbCol.Name = "dgv_check";
  231. cbCol.Width = 50; //设定宽度
  232. cbCol.HeaderText = "全选";
  233. cbCol.DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter; //置中
  234. dgv.Columns.Insert(0, cbCol);
  235. string startFun = ((Dictionary<string, object>)((Dictionary<string, object>)((Dictionary<string, object>)ReportFun.resultFile.ResultInfo["Sample"])["Members"])["MsrParams"])["SysType"].ToString();
  236. //从报告xml文件中加载,显示计算列,显示元素信息
  237. string str_DefaultComputedColName = "";
  238. DataSet ds = OTSIncAReportApp.DataOperation.DataAccess.XMLoperate.GetXmlData(Application.StartupPath + ReportMgrParamFile, "XMLData");
  239. DataTable dt = ds.Tables["Member"];
  240. foreach (DataRow element in dt.Rows)
  241. {
  242. string RegName = element["RegName"].ToString();
  243. if (RegName == "DefaultComputedColName")
  244. {
  245. str_DefaultComputedColName = element["strValue"].ToString();
  246. }
  247. }
  248. //获取需要显示的计算列
  249. string[] strs = str_DefaultComputedColName.Split(',');
  250. //列名
  251. Dictionary<string, string> keyValues = new Dictionary<string, string>() { };
  252. keyValues.Add("rowid", table["str1"].ToString());
  253. keyValues.Add("ReMeasure", table["str19"].ToString());
  254. keyValues.Add("TypeName", table["str20"].ToString());
  255. keyValues.Add("FieldID", "FieldID");
  256. keyValues.Add("particleid", "particleid");
  257. keyValues.Add("SEMPosX", "SEMPosX");
  258. keyValues.Add("SEMPosY", "SEMPosY");
  259. for (int i = 0; i < strs.Count(); i++)
  260. {
  261. if (strs[i] == "Area")
  262. {
  263. keyValues.Add("Area", table["str21"].ToString());
  264. }
  265. if (strs[i] == "EquivalentCircleDiameter")
  266. {
  267. keyValues.Add("Equivalent", table["str22"].ToString());
  268. }
  269. if (strs[i] == "MaxDiameter")
  270. {
  271. keyValues.Add("DMAX", table["str23"].ToString());
  272. }
  273. if (strs[i] == "MinDiameter")
  274. {
  275. keyValues.Add("DMIN", table["str24"].ToString());
  276. }
  277. if (strs[i] == "DiameterRatio")
  278. {
  279. keyValues.Add("DiameterRatio", table["str25"].ToString());
  280. }
  281. if (strs[i] == "FerretDiameter")
  282. {
  283. keyValues.Add("DFERET", table["str26"].ToString());
  284. }
  285. if (strs[i] == "PERP")
  286. {
  287. keyValues.Add("DPERP", table["str27"].ToString());
  288. }
  289. if (strs[i] == "PERI")
  290. {
  291. keyValues.Add("PERIMETER", table["str28"].ToString());
  292. }
  293. if (strs[i] == "INSCR")
  294. {
  295. keyValues.Add("DINSCR", table["str29"].ToString());
  296. }
  297. if (strs[i] == "MEAN")
  298. {
  299. keyValues.Add("DMEAN", table["str30"].ToString());
  300. }
  301. if (strs[i] == "ELONG")
  302. {
  303. keyValues.Add("DELONG", table["str31"].ToString());
  304. }
  305. if (strs[i] == "ASPECT_ELONG")
  306. {
  307. keyValues.Add("ASPECT_ELONG", table["str32"].ToString());
  308. }
  309. if (strs[i] == "Orientation")
  310. {
  311. keyValues.Add("ORIENTATION", table["str33"].ToString());
  312. }
  313. if (startFun == "1:CleannessA")
  314. {
  315. if (strs[i] == "Hardness")
  316. {
  317. keyValues.Add("Hardness", table["str36"].ToString());
  318. }
  319. if (strs[i] == "Density")
  320. {
  321. keyValues.Add("Density", table["str35"].ToString());
  322. }
  323. if (strs[i] == "Electrical_conductivity")
  324. {
  325. keyValues.Add("Electrical_conductivity", table["str34"].ToString());
  326. }
  327. }
  328. }
  329. Dictionary<string, string>.Enumerator en = keyValues.GetEnumerator();
  330. for (int irow = 0; irow < keyValues.Count; irow++)
  331. {
  332. if (en.MoveNext())
  333. {
  334. dgv.Columns.Add(en.Current.Key, en.Current.Value);
  335. }
  336. }
  337. DataTable particles = UpdateTable(particlesList);
  338. for (int i = 0; i < particles.Rows.Count; i++)
  339. {
  340. Dictionary<string, string>.Enumerator enl = keyValues.GetEnumerator();
  341. int add_rowindex = dgv.Rows.Add();
  342. for (int k = 1; k < keyValues.Count; k++)
  343. {
  344. if (enl.MoveNext())
  345. {
  346. if (enl.Current.Key == "rowid")
  347. {
  348. dgv.Rows[add_rowindex].Cells[k].Value = (i + 1);
  349. }
  350. if (enl.Current.Key == "DiameterRatio")
  351. {
  352. double d = Convert.ToDouble(particles.Rows[i]["DMAX"]) / Convert.ToDouble(particles.Rows[i]["DMIN"]);
  353. dgv.Rows[add_rowindex].Cells[k].Value = Math.Round(d, 2);
  354. }
  355. if (enl.Current.Key == "ASPECT_ELONG")
  356. {
  357. double d = Convert.ToDouble(particles.Rows[i]["DELONG"]) / Convert.ToDouble(particles.Rows[i]["DMEAN"]);
  358. dgv.Rows[add_rowindex].Cells[k].Value = Math.Round(d, 2);
  359. }
  360. if (particles.Columns.Contains(enl.Current.Key))
  361. {
  362. double num = 0;
  363. if (double.TryParse(particles.Rows[i][enl.Current.Key].ToString(), out num))
  364. {
  365. dgv.Rows[add_rowindex].Cells[k].Value = Math.Round(num, 2);
  366. }
  367. else
  368. {
  369. dgv.Rows[add_rowindex].Cells[k].Value = particles.Rows[i][enl.Current.Key];
  370. }
  371. }
  372. if (enl.Current.Key == "TypeName")
  373. {
  374. if (particles.Rows[i]["TypeId"].ToString() == "9")
  375. {
  376. dgv.Rows[add_rowindex].Cells[k].Value = "Not Identified";
  377. }
  378. }
  379. if (enl.Current.Key == "Equivalent")
  380. {
  381. double dSize = Convert.ToDouble(particles.Rows[i]["Area"]);
  382. double Diameter = Math.Sqrt(dSize / Math.PI) * 2;
  383. dgv.Rows[add_rowindex].Cells[k].Value = Math.Round(Diameter, 2);
  384. }
  385. }
  386. }
  387. }
  388. if (dgv.Name == "dataGridView_success")
  389. {
  390. dgv.Columns["dgv_check"].Visible = false;
  391. dgv.Columns["ReMeasure"].Visible = false;
  392. }
  393. UpdateDB();
  394. }
  395. private DataTable UpdateTable(List<Particle> particles)
  396. {
  397. List<Particle> selectParticles = particles;
  398. DataTable dtUelect = new DataTable();
  399. dtUelect.Columns.Add("fieldid");
  400. dtUelect.Columns.Add("particleid");
  401. dtUelect.Columns.Add("AveGray");
  402. dtUelect.Columns.Add("RectLeft");
  403. dtUelect.Columns.Add("RectTop");
  404. dtUelect.Columns.Add("RectWidth");
  405. dtUelect.Columns.Add("RectHeight");
  406. dtUelect.Columns.Add("Area");
  407. dtUelect.Columns.Add("PosX");
  408. dtUelect.Columns.Add("PosY");
  409. dtUelect.Columns.Add("TypeId");
  410. dtUelect.Columns.Add("SegmentNum");
  411. dtUelect.Columns.Add("SEMPosX");
  412. dtUelect.Columns.Add("SEMPosY");
  413. dtUelect.Columns.Add("XrayId");
  414. dtUelect.Columns.Add("DMAX");
  415. dtUelect.Columns.Add("DMIN");
  416. dtUelect.Columns.Add("DPERP");
  417. dtUelect.Columns.Add("PERIMETER");
  418. dtUelect.Columns.Add("ORIENTATION");
  419. dtUelect.Columns.Add("DINSCR");
  420. dtUelect.Columns.Add("DMEAN");
  421. dtUelect.Columns.Add("DELONG");
  422. dtUelect.Columns.Add("DFERET");
  423. dtUelect.Columns.Add("TypeName");
  424. dtUelect.Columns.Add("TypeColor");
  425. dtUelect.Columns.Add("SubParticles");
  426. dtUelect.Columns.Add("Element");
  427. dtUelect.Columns.Add("Hardness");
  428. dtUelect.Columns.Add("Density");
  429. dtUelect.Columns.Add("Electrical_conductivity");
  430. for (int i = 0; i < selectParticles.Count; i++)
  431. {
  432. dtUelect.Rows.Add(selectParticles[i].FieldId, selectParticles[i].ParticleId, selectParticles[i].AveGray, selectParticles[i].RectLeft, selectParticles[i].RectTop, selectParticles[i].RectWidth, selectParticles[i].RectHeight, selectParticles[i].Area, selectParticles[i].PosX, selectParticles[i].PosX, selectParticles[i].TypeId, /*selectParticles[i].ElementNum,*/ selectParticles[i].SegmentNum, selectParticles[i].SEMPosX, selectParticles[i].SEMPosY, selectParticles[i].ParticleId, selectParticles[i].DMAX, selectParticles[i].DMIN, selectParticles[i].DPERP, selectParticles[i].PERIMETER, selectParticles[i].ORIENTATION, selectParticles[i].DINSCR, selectParticles[i].DMEAN, selectParticles[i].DELONG, selectParticles[i].DFERET, selectParticles[i].TypeName, selectParticles[i].TypeColor, "", "", "", "", "");
  433. }
  434. string str_libraryName = ((Dictionary<string, object>)((Dictionary<string, object>)((Dictionary<string, object>)ReportFun.resultFile.ResultInfo["Sample"])["Members"])["MsrParams"])["STDName"].ToString();
  435. DataTable userLibraryData = new DataTable();
  436. UserLibraryData userLibrary = new UserLibraryData(str_libraryName);
  437. if (userLibrary != null)
  438. {
  439. userLibraryData = userLibrary.GetSubAttributeFromDatabase();
  440. }
  441. else
  442. {
  443. userLibraryData = null;
  444. }
  445. if (userLibraryData != null)
  446. {
  447. for (int i = 0; i < dtUelect.Rows.Count; i++)
  448. {
  449. DataRow[] dr = userLibraryData.Select("STDId=" + dtUelect.Rows[i]["TypeId"].ToString());
  450. if (dr.Length > 0)
  451. {
  452. dtUelect.Rows[i]["Hardness"] = System.Text.RegularExpressions.Regex.Replace(dr[0]["Hardness"].ToString(), @"[^\d.\d]", "");
  453. dtUelect.Rows[i]["Density"] = System.Text.RegularExpressions.Regex.Replace(dr[0]["Density"].ToString(), @"[^\d.\d]", "");
  454. dtUelect.Rows[i]["Electrical_conductivity"] = System.Text.RegularExpressions.Regex.Replace(dr[0]["Electrical_conductivity"].ToString(), @"[^\d.\d]", "");
  455. }
  456. else
  457. {
  458. dtUelect.Rows[i]["Hardness"] = "";
  459. dtUelect.Rows[i]["Density"] = "";
  460. dtUelect.Rows[i]["Electrical_conductivity"] = "";
  461. }
  462. }
  463. }
  464. else
  465. {
  466. for (int i = 0; i < dtUelect.Rows.Count; i++)
  467. {
  468. dtUelect.Rows[i]["Hardness"] = "";
  469. dtUelect.Rows[i]["Density"] = "";
  470. dtUelect.Rows[i]["Electrical_conductivity"] = "";
  471. }
  472. }
  473. ParticleData Particledata = new ParticleData(ReportFun.resultFile.FilePath);
  474. DataTable elementchemistry = Particledata.GetElementChemistry();
  475. for (int i = 0; i < dtUelect.Rows.Count; i++)
  476. {
  477. string str = "XRayId = " + dtUelect.Rows[i]["particleId"].ToString() + " and fieldid = " + dtUelect.Rows[i]["fieldid"].ToString();
  478. DataRow[] drs = elementchemistry.Select(str);
  479. string ConcatenatedString = "";
  480. for (int j = 0; j < drs.Length; j++)
  481. {
  482. ConcatenatedString += drs[j]["name"] + "-" + drs[j]["Percentage"] + ';';
  483. }
  484. dtUelect.Rows[i]["Element"] = ConcatenatedString;
  485. }
  486. return dtUelect;
  487. }
  488. private void frmReMeasure_Load(object sender, EventArgs e)
  489. {
  490. //图像扫描精度
  491. IDC_COMBO_IMGSCANSPEED.Items.Clear();
  492. foreach (otsdataconst.OTS_IMAGE_SCANSPEED_OPTIONS enum_one in Enum.GetValues(typeof(otsdataconst.OTS_IMAGE_SCANSPEED_OPTIONS)))
  493. {
  494. ComboBoxItem cbi = new ComboBoxItem();
  495. cbi.Text = GetScanSpeedString(enum_one);
  496. cbi.Value = (int)enum_one;
  497. IDC_COMBO_IMGSCANSPEED.Items.Add(cbi);
  498. }
  499. IDC_COMBO_IMGSCANSPEED.SelectedIndex = (int)otsdataconst.OTS_IMAGE_SCANSPEED_OPTIONS.low;
  500. //X-Ray扫描方式
  501. IDC_COMBO_XRAYSCANMODE.Items.Clear();
  502. foreach (otsdataconst.OTS_X_RAY_SCAN_MODE enum_one in Enum.GetValues(typeof(otsdataconst.OTS_X_RAY_SCAN_MODE)))
  503. {
  504. ComboBoxItem cbi = new ComboBoxItem();
  505. cbi.Text = GetXRayScanModeIdString(enum_one);
  506. cbi.Value = (int)enum_one;
  507. IDC_COMBO_XRAYSCANMODE.Items.Add(cbi);
  508. }
  509. IDC_COMBO_XRAYSCANMODE.SelectedIndex = (int)otsdataconst.OTS_X_RAY_SCAN_MODE.PointMode;
  510. //旧放大倍数
  511. Dictionary<string, object> sample = (Dictionary<string, object>)ReportFun.resultFile.ResultInfo["Sample"];
  512. Dictionary<string, object> sampleMembers = ((Dictionary<string, object>)(sample)["Members"]);
  513. Dictionary<string, object> imageScanParam = (Dictionary<string, object>)((Dictionary<string, object>)((Dictionary<string, object>)sampleMembers["MsrParams"])["Members"])["ImageScanParam"];
  514. Dictionary<string, object> SEMDataMsr = (Dictionary<string, object>)((Dictionary<string, object>)sampleMembers["SEMDataMsr"]);
  515. ScanFieldSizeX = double.Parse(SEMDataMsr["ScanFieldSize"].ToString());
  516. ScanFieldSizeX100 = double.Parse(SEMDataMsr["ScanFieldSize100"].ToString());
  517. oldMag = Math.Round((ScanFieldSizeX100 / ScanFieldSizeX) * 100, 2);
  518. //LB_OLDMAGVALUE.Text = oldMag.ToString();
  519. //颗粒信息
  520. sampleName = sample["SampleName"].ToString();
  521. string ImageResolution = imageScanParam["ImageResolution"].ToString();
  522. width = int.Parse(ImageResolution.Split('_')[1]);
  523. height = int.Parse(ImageResolution.Split('_')[2]);
  524. old_pixelsize = ScanFieldSizeX / width;
  525. ScanFieldSizeY100 = height * old_pixelsize;
  526. //颗粒方法
  527. CB_partFun.SelectedIndex = 0;
  528. control_XRayTable1.Visible = false;
  529. }
  530. private void showXrayChart(Particle particle)
  531. {
  532. if (particle.XRayData == null)
  533. {
  534. control_XRayTable1.Visible = false;
  535. return;
  536. }
  537. //显示xray相关信息
  538. uint[] Search_xray = new uint[2000];
  539. uint[] Analysis_xray = new uint[2000];
  540. //获取Xray数据
  541. for (int i = 0; i < 2000; i++)
  542. {
  543. Analysis_xray[i] = BitConverter.ToUInt32(particle.XRayData, i * 4);
  544. }
  545. Search_xray = Analysis_xray;
  546. //get CElementChemistryClr list
  547. List<ShowElementInfo> list_showelementinfo = new List<ShowElementInfo>();
  548. for (int i = 0; i < particle.ElementList.Count; i++)
  549. {
  550. ShowElementInfo ls_sei = new ShowElementInfo();
  551. ls_sei.ElementName = particle.ElementList[i].Name;
  552. ls_sei.Percentage = particle.ElementList[i].Percentage;
  553. ls_sei.dKF = Convert.ToDouble(CListPeriodic.GetPeriodicByEleName(ls_sei.ElementName).K_Peak);
  554. double de_K_Peak = 0;
  555. if (CListPeriodic.GetPeriodicByEleName(ls_sei.ElementName).K_Peak == "" || CListPeriodic.GetPeriodicByEleName(ls_sei.ElementName).K_Peak == "-")
  556. {
  557. de_K_Peak = 0;
  558. }
  559. else
  560. {
  561. de_K_Peak = Convert.ToDouble(CListPeriodic.GetPeriodicByEleName(ls_sei.ElementName).K_Peak);
  562. }
  563. ls_sei.dLF = de_K_Peak;
  564. list_showelementinfo.Add(ls_sei);
  565. }
  566. //获取数据后,需要对xraytable设置
  567. control_XRayTable1.Visible = false;
  568. control_XRayTable1.SetXRayShowLineValue(Search_xray, Analysis_xray, list_showelementinfo);
  569. //颗粒国标信息
  570. control_XRayTable1.GBInfoStr = "";
  571. control_XRayTable1.MaterialName = particle.TypeName;//名称
  572. control_XRayTable1.List_ShowElementInfo = list_showelementinfo;
  573. control_XRayTable1.Visible = true;
  574. this.Refresh();
  575. }
  576. public string GetScanSpeedString(otsdataconst.OTS_IMAGE_SCANSPEED_OPTIONS a_nScanSpeed)
  577. {
  578. string strScanSpeedId = "";
  579. if (a_nScanSpeed >= otsdataconst.OTS_IMAGE_SCANSPEED_OPTIONS.low && a_nScanSpeed <= otsdataconst.OTS_IMAGE_SCANSPEED_OPTIONS.high)
  580. {
  581. strScanSpeedId = XmlResourceData.GetInstance().GetStringByKey(ResourceID.GrpOtherParam, ResourceID.IDS_SCANSPEED + (int)a_nScanSpeed);
  582. }
  583. return strScanSpeedId;
  584. }
  585. public static string GetXRayScanModeIdString(otsdataconst.OTS_X_RAY_SCAN_MODE a_nXRayScanMode)
  586. {
  587. string strXRayScanModeId = "";
  588. if (a_nXRayScanMode >= otsdataconst.OTS_X_RAY_SCAN_MODE.PointMode && a_nXRayScanMode <= otsdataconst.OTS_X_RAY_SCAN_MODE.FeatureMode)
  589. {
  590. strXRayScanModeId = XmlResourceData.GetInstance().GetStringByKey(ResourceID.GrpOtherParam, ResourceID.IDS_XRAYSCANMODE + (int)a_nXRayScanMode);
  591. }
  592. return strXRayScanModeId;
  593. }
  594. private void BTN_NO_Click(object sender, EventArgs e)
  595. {
  596. stopFlag = true;
  597. }
  598. private void BTN_YES_Click(object sender, EventArgs e)
  599. {
  600. //参数定义
  601. int nBrukerDwellTimeId = 3;
  602. switch (IDC_COMBO_IMGSCANSPEED.SelectedIndex)
  603. {
  604. case (int)OTS_IMAGE_SCANSPEED_OPTIONS.low:
  605. nBrukerDwellTimeId = 3;
  606. break;
  607. case (int)OTS_IMAGE_SCANSPEED_OPTIONS.meddium:
  608. nBrukerDwellTimeId = 4;
  609. break;
  610. case (int)OTS_IMAGE_SCANSPEED_OPTIONS.high:
  611. nBrukerDwellTimeId = 5;
  612. break;
  613. default:
  614. nBrukerDwellTimeId = 3;
  615. break;
  616. }
  617. nBrukerDwellTime = DWELLTIME_BRUKER_VALUES[nBrukerDwellTimeId];
  618. tabControl_grid.SelectedIndex = 0;
  619. tabControl_grid.Enabled = false;
  620. groupBox_param.Enabled = false;
  621. partFunIndex = CB_partFun.SelectedIndex;
  622. xrayScanMode = IDC_COMBO_XRAYSCANMODE.SelectedIndex;
  623. bgw_process.RunWorkerAsync();
  624. }
  625. private void bgw_process_DoWork(object sender, DoWorkEventArgs e)
  626. {
  627. //第一步,连接电镜
  628. if (!m_OTSIncAReportGridsFun.Connection_ForParticlesGrid())
  629. {
  630. SetProgressMessage(table["str2"].ToString(), richTextBox_process);
  631. return;
  632. }
  633. Thread.Sleep(500);
  634. keyValuesMat = new Dictionary<int, Mat>();
  635. for (int i = 0; i < SelectedParticles.Count; i++)
  636. {
  637. if (!(bool)dgV_ParticlesDevidePage.Rows[i].Cells[0].Value)
  638. {
  639. MessageBox.Show(i.ToString());
  640. continue;
  641. }
  642. if (stopFlag)
  643. {
  644. MessageBox.Show(table["str3"].ToString());
  645. return;
  646. }
  647. if (m_OTSIncAReportGridsFun.m_SEMConnectionState == true)
  648. {
  649. dgV_ParticlesDevidePage.Rows[i].DefaultCellStyle.BackColor = Color.Blue;
  650. SetProgressMessage(table["str4"].ToString() + (i + 1), richTextBox_process);
  651. double new_ScanFieldSize_width = (SelectedParticles[i].RectWidth + (double)NUD_Outspread.Value) * old_pixelsize;
  652. double new_ScanFieldSize_height = (SelectedParticles[i].RectHeight + (double)NUD_Outspread.Value) * old_pixelsize;
  653. double mag_width = Math.Round((ScanFieldSizeX100 / new_ScanFieldSize_width) * 100, 2);
  654. double mag_height = Math.Round((ScanFieldSizeY100 / new_ScanFieldSize_height) * 100, 2);
  655. double final_mag = mag_width > mag_height ? mag_height : mag_width;
  656. new_pixelsize = new_ScanFieldSize_width / width;
  657. SetProgressMessage(table["str5"].ToString() + final_mag, richTextBox_process);
  658. if (!m_OTSIncAReportGridsFun.SetMagnification(final_mag))
  659. {
  660. SetProgressMessage(table["str6"].ToString(), richTextBox_process);
  661. return;
  662. }
  663. Point point = Control_DrawDistrbutionImageAndBSE.CalculateParticleCenterPosition(ReportFun.resultFile, new Point(SelectedParticles[i].SEMPosX, SelectedParticles[i].SEMPosY), new Point(SelectedParticles[i].PosX, SelectedParticles[i].PosY));
  664. SetProgressMessage(table["str7"].ToString() + point.X + "," + point.Y, richTextBox_process);
  665. if (!m_OTSIncAReportGridsFun.MoveSemToPointXY_ForParticlesGrid(point.X, point.Y))
  666. {
  667. SetProgressMessage(table["str8"].ToString(), richTextBox_process);
  668. return;
  669. }
  670. SetProgressMessage(table["str9"].ToString(), richTextBox_process);
  671. byte[] ImageByte = new byte[width * height];
  672. if (!m_OTSIncAReportGridsFun.AcquireBSEImage(sampleName, width, height, nBrukerDwellTime, ref ImageByte))
  673. {
  674. SetProgressMessage(table["str10"].ToString(), richTextBox_process);
  675. return;
  676. }
  677. SetProgressMessage(table["str11"].ToString(), richTextBox_process);
  678. //Mat mat = new Mat(@"F:\汽车清洁度\20220325\2\Sample1\FIELD_FILES\Field" + i + ".bmp", ImreadModes.Grayscale);
  679. //Mat mat = new Mat(resultFile.FilePath + "\\" + savePathName + "\\" + SelectedParticles[i].FieldId + "_" + SelectedParticles[i].ParticleId + ".bmp", ImreadModes.Grayscale);
  680. Mat mat = new Mat(height, width, MatType.CV_8UC1, ImageByte);
  681. Particle particle_new = (Particle)ReportFun.CloneObject(SelectedParticles[i]);
  682. particle_new.XrayId = SelectedParticles[i].XrayId + 10000;
  683. if (!FindNewPartInfo(ref mat, particle_new))
  684. {
  685. SetProgressMessage(table["str12"].ToString(), richTextBox_process);
  686. return;
  687. }
  688. SetProgressMessage(table["str13"].ToString(), richTextBox_process);
  689. if (!m_OTSIncAReportGridsFun.AcquisitionSpectrum(ReportFun.resultFile.FilePath + "\\FIELD_FILES\\", xrayScanMode, new_pixelsize, ref particle_new, (uint)NUD_SCANTIME.Value))
  690. {
  691. SetProgressMessage(table["str14"].ToString(), richTextBox_process);
  692. return;
  693. }
  694. showXrayChart(particle_new);//显示Xray图
  695. SaveXray(particle_new.FieldId + "_" + particle_new.ParticleId + ".bmp");//保存图谱图
  696. keyValuesMat.Add(i, mat);
  697. bgw_process.ReportProgress(0, OpenCvSharp.Extensions.BitmapConverter.ToBitmap(mat));
  698. SetProgressMessage(table["str16"].ToString() + (i + 1), richTextBox_process);
  699. dgV_ParticlesDevidePage.Rows[i].DefaultCellStyle.BackColor = Color.Green;
  700. SelectedParticles[i] = particle_new;
  701. }
  702. }
  703. ReadSuccessDb();
  704. BindDataGridView(dataGridView_success, successParticles);
  705. BindDataGridView(dgV_ParticlesDevidePage, SelectedParticles);
  706. Thread.Sleep(500);
  707. SetProgressMessage(table["str17"].ToString(), richTextBox_process);
  708. }
  709. private void bgw_process_ProgressChanged(object sender, ProgressChangedEventArgs e)
  710. {
  711. switch (e.ProgressPercentage)
  712. {
  713. case 0: pictureBox_part.Image = (Bitmap)e.UserState; break;
  714. default:
  715. break;
  716. }
  717. }
  718. private bool SaveImg(string imgName, Mat mat)
  719. {
  720. if (!Directory.Exists(ReportFun.resultFile.FilePath + "\\" + m_ReportApp.savePathName))
  721. {
  722. Directory.CreateDirectory(ReportFun.resultFile.FilePath + "\\" + m_ReportApp.savePathName);
  723. }
  724. if (!Directory.Exists(ReportFun.resultFile.FilePath + "\\" + m_ReportApp.savePathName + "\\image"))
  725. {
  726. Directory.CreateDirectory(ReportFun.resultFile.FilePath + "\\" + m_ReportApp.savePathName + "\\image");
  727. }
  728. Cv2.ImWrite(ReportFun.resultFile.FilePath + "\\" + m_ReportApp.savePathName + "\\image\\" + imgName, mat);
  729. return true;
  730. }
  731. private bool SaveXray(string imgName)
  732. {
  733. if (!Directory.Exists(ReportFun.resultFile.FilePath + "\\" + m_ReportApp.savePathName))
  734. {
  735. Directory.CreateDirectory(ReportFun.resultFile.FilePath + "\\" + m_ReportApp.savePathName);
  736. }
  737. if (!Directory.Exists(ReportFun.resultFile.FilePath + "\\" + m_ReportApp.savePathName + "\\xray"))
  738. {
  739. Directory.CreateDirectory(ReportFun.resultFile.FilePath + "\\" + m_ReportApp.savePathName + "\\xray");
  740. }
  741. using (Bitmap bmp = new Bitmap(control_XRayTable1.Width, control_XRayTable1.Height))
  742. {
  743. control_XRayTable1.DrawToBitmap(bmp, control_XRayTable1.ClientRectangle);
  744. bmp.Save(ReportFun.resultFile.FilePath + "\\" + m_ReportApp.savePathName + "\\xray\\" + imgName);
  745. }
  746. return true;
  747. }
  748. /// <summary>
  749. /// 颗粒处理核心方法
  750. /// </summary>
  751. /// <param name="mat"></param>
  752. /// <param name="particle_new"></param>
  753. /// <returns></returns>
  754. private bool FindNewPartInfo(ref Mat mat, Particle particle_new)
  755. {
  756. try
  757. {
  758. using (Mat mat_dst = new Mat())
  759. {
  760. Dictionary<int, double> keyValuePairs = new Dictionary<int, double>();
  761. switch (partFunIndex)
  762. {
  763. case 0: Cv2.Threshold(mat, mat_dst, 0, 255, ThresholdTypes.Triangle);break;
  764. case 1: Cv2.Threshold(mat, mat_dst, 0, 255, ThresholdTypes.Otsu);break;
  765. }
  766. Mat labelMat = new Mat();
  767. Mat stats = new Mat();//点的信息
  768. Mat centroids = new Mat();//质心的信息
  769. int nonenum = Cv2.ConnectedComponentsWithStats(mat_dst, labelMat, stats, centroids, PixelConnectivity.Connectivity8);
  770. for (int h = 1; h < centroids.Height; h++)
  771. {
  772. int areaField = stats.At<int>(h, 4);
  773. keyValuePairs.Add(h, areaField);
  774. }
  775. int Key = 0;//新颗粒序列
  776. if (CB_HAND.Checked)//手动处理
  777. {
  778. Mat srcWhite = new Mat(mat_dst.Height, mat_dst.Width, MatType.CV_8UC1, new Scalar(0));//黑色底图
  779. mat.CopyTo(srcWhite, mat_dst);
  780. bgw_process.ReportProgress(0, OpenCvSharp.Extensions.BitmapConverter.ToBitmap(srcWhite));
  781. SetProgressMessage(table["str18"].ToString(), richTextBox_process);
  782. GetKeyNo(labelMat, mat_dst.Width, mat_dst.Height, ref Key);
  783. }
  784. else//自动处理
  785. {
  786. keyValuePairs = keyValuePairs.OrderByDescending(a => a.Value).ToDictionary(a => a.Key, b => b.Value);
  787. Dictionary<int, double> dsList = new Dictionary<int, double>();
  788. for (int i = 0; i < keyValuePairs.Count; i++)
  789. {
  790. dsList.Add(keyValuePairs.ElementAt(i).Key, Math.Abs(keyValuePairs.ElementAt(i).Value * new_pixelsize * new_pixelsize - particle_new.Area));
  791. }
  792. dsList = dsList.OrderBy(a => a.Value).ToDictionary(a => a.Key, b => b.Value);
  793. Key = dsList.ElementAt(0).Key;
  794. }
  795. Cv2.CvtColor(mat_dst, mat_dst, ColorConversionCodes.RGB2BGR);
  796. OpenCvSharp.Point centroidsPoint = new OpenCvSharp.Point((int)centroids.At<double>(Key, 0), (int)centroids.At<double>(Key, 1));
  797. Rect rect = new Rect(stats.At<int>(Key, 0), stats.At<int>(Key, 1), stats.At<int>(Key, 2), stats.At<int>(Key, 3));
  798. Cv2.Circle(mat_dst, centroidsPoint, 5, Scalar.Green, -1);
  799. Cv2.Rectangle(mat_dst, rect, Scalar.Red);
  800. bgw_process.ReportProgress(0, OpenCvSharp.Extensions.BitmapConverter.ToBitmap(mat_dst));
  801. //保存局部高清图片
  802. mat = new Mat(mat, rect);
  803. if (mat.Width > mat.Height)
  804. {
  805. dsize = new OpenCvSharp.Size(100, 100 * mat.Height / mat.Width);
  806. }
  807. else
  808. {
  809. dsize = new OpenCvSharp.Size(100 * mat.Width / mat.Height, 100);
  810. }
  811. Cv2.Resize(mat, mat, dsize, 0, 0, InterpolationFlags.Cubic);
  812. //保存高清图
  813. SaveImg(particle_new.FieldId + "_" + particle_new.ParticleId + ".bmp", mat);
  814. //取各个轮廓内的像素
  815. List<Point> points = new List<Point>();
  816. for (int k = 0; k < labelMat.Height; k++)
  817. {
  818. for (int j = 0; j < labelMat.Width; j++)
  819. {
  820. int no = labelMat.Get<int>(k, j);
  821. if (Key == no)
  822. {
  823. points.Add(new Point(j, k));
  824. }
  825. }
  826. }
  827. //保存颗粒信息
  828. particle_new.PosX = centroidsPoint.X;
  829. particle_new.PosY = centroidsPoint.Y;
  830. particle_new.RectLeft = stats.At<int>(Key, 0);
  831. particle_new.RectTop = stats.At<int>(Key, 1);
  832. particle_new.RectWidth = stats.At<int>(Key, 2);
  833. particle_new.RectHeight = stats.At<int>(Key, 3);
  834. List<COTSSegmentClr> SegmentClrList1 = new List<COTSSegmentClr>();
  835. List<Segment> SegmentList1 = new List<Segment>();
  836. ReportFun.GetSegment(points, particle_new, SegmentClrList1, ref SegmentList1);
  837. particle_new.SegmentList = SegmentList1;
  838. particle_new.SegmentNum = SegmentList1.Count;
  839. }
  840. }
  841. catch (Exception ex)
  842. {
  843. SetProgressMessage(ex.ToString(), richTextBox_process);
  844. return false;
  845. }
  846. return true;
  847. }
  848. private void bgw_process_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
  849. {
  850. stopFlag = false;
  851. tabControl_grid.Enabled = true;
  852. groupBox_param.Enabled = true;
  853. }
  854. private void pictureBox_part_MouseDown(object sender, MouseEventArgs e)
  855. {
  856. if (CB_HAND.Checked && pictureBox_part.Image != null)
  857. {
  858. int originalWidth = this.pictureBox_part.Image.Width;
  859. int originalHeight = this.pictureBox_part.Image.Height;
  860. PropertyInfo rectangleProperty = this.pictureBox_part.GetType().GetProperty("ImageRectangle", BindingFlags.Instance | BindingFlags.NonPublic);
  861. Rectangle rectangle = (Rectangle)rectangleProperty.GetValue(this.pictureBox_part, null);
  862. int currentWidth = rectangle.Width;
  863. int currentHeight = rectangle.Height;
  864. double rate = (double)currentHeight / (double)originalHeight;
  865. int black_left_width = (currentWidth == this.pictureBox_part.Width) ? 0 : (this.pictureBox_part.Width - currentWidth) / 2;
  866. int black_top_height = (currentHeight == this.pictureBox_part.Height) ? 0 : (this.pictureBox_part.Height - currentHeight) / 2;
  867. int zoom_x = e.X - black_left_width;
  868. int zoom_y = e.Y - black_top_height;
  869. double original_x = (double)zoom_x / rate;
  870. double original_y = (double)zoom_y / rate;
  871. //StringBuilder sb = new StringBuilder();
  872. //sb.AppendFormat("原始尺寸{0}/{1}(宽/高)\r\n", originalWidth, originalHeight);
  873. //sb.AppendFormat("缩放状态图片尺寸{0}/{1}(宽/高)\r\n", currentWidth, currentHeight);
  874. //sb.AppendFormat("缩放比率{0}\r\n", rate);
  875. //sb.AppendFormat("左留白宽度{0}\r\n", black_left_width);
  876. //sb.AppendFormat("上留白高度{0}\r\n", black_top_height);
  877. //sb.AppendFormat("当前鼠标坐标{0}/{1}(X/Y)\r\n", e.X, e.Y);
  878. //sb.AppendFormat("缩放图中鼠标坐标{0}/{1}(X/Y)\r\n", zoom_x, zoom_y);
  879. //sb.AppendFormat("原始图中鼠标坐标{0}/{1}(X/Y)\r\n", original_x, original_y);
  880. handPoint = new Point((int)original_x, (int)original_y);
  881. }
  882. }
  883. /// <summary>
  884. ///获取手动处理序号
  885. /// </summary>
  886. /// <param name="labelMat"></param>
  887. /// <param name="width"></param>
  888. /// <param name="height"></param>
  889. /// <param name="key"></param>
  890. private void GetKeyNo(Mat labelMat, int width, int height, ref int key)
  891. {
  892. handPoint = new Point(-1, -1);
  893. Color color = groupBox_img.BackColor;
  894. while (key == 0 && stopFlag == false)
  895. {
  896. groupBox_img.BackColor = Color.Red;
  897. Thread.Sleep(1000);
  898. if (handPoint.X >= 0 && handPoint.X < width && handPoint.Y >= 0 && handPoint.Y < height)
  899. {
  900. key = labelMat.Get<int>((int)handPoint.Y, (int)handPoint.X);
  901. }
  902. }
  903. groupBox_img.BackColor = color;
  904. }
  905. private void dgV_ParticlesDevidePage_ColumnHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e)
  906. {
  907. if (e.ColumnIndex == 0)
  908. {
  909. foreach (DataGridViewRow dr in dgV_ParticlesDevidePage.Rows)
  910. {
  911. dr.Cells[0].Value = !isCheck;
  912. }
  913. isCheck = !isCheck;
  914. }
  915. }
  916. private void dgV_ParticlesDevidePage_CellMouseClick(object sender, DataGridViewCellMouseEventArgs e)
  917. {
  918. if (e.ColumnIndex == 0 && e.RowIndex != -1)
  919. {
  920. if ((bool)dgV_ParticlesDevidePage.Rows[e.RowIndex].Cells[e.ColumnIndex].Value)
  921. {
  922. dgV_ParticlesDevidePage.Rows[e.RowIndex].Cells[e.ColumnIndex].Value = false;
  923. }
  924. else
  925. {
  926. dgV_ParticlesDevidePage.Rows[e.RowIndex].Cells[e.ColumnIndex].Value = true;
  927. }
  928. }
  929. if (e.RowIndex != -1)
  930. {
  931. string imagePath = ReportFun.resultFile.FilePath + "\\" + m_ReportApp.savePathName + "\\image\\" + dgV_ParticlesDevidePage.Rows[e.RowIndex].Cells["FieldID"].Value + "_" + dgV_ParticlesDevidePage.Rows[e.RowIndex].Cells["particleid"].Value + ".bmp";
  932. if (File.Exists(imagePath))
  933. {
  934. pictureBox_part.Image = new Bitmap(imagePath);
  935. }
  936. else
  937. {
  938. pictureBox_part.Image = null;
  939. }
  940. showXrayChart(SelectedParticles[e.RowIndex]);//显示Xray图
  941. }
  942. }
  943. private void dataGridView_success_CellMouseClick(object sender, DataGridViewCellMouseEventArgs e)
  944. {
  945. if (e.RowIndex != -1)
  946. {
  947. string imagePath = ReportFun.resultFile.FilePath + "\\" + m_ReportApp.savePathName + "\\image\\" + dataGridView_success.Rows[e.RowIndex].Cells["FieldID"].Value + "_" + dataGridView_success.Rows[e.RowIndex].Cells["particleid"].Value + ".bmp";
  948. if (File.Exists(imagePath))
  949. {
  950. pictureBox_part.Image = new Bitmap(imagePath);
  951. }
  952. else
  953. {
  954. pictureBox_part.Image = null;
  955. }
  956. showXrayChart(successParticles[e.RowIndex]);//显示Xray图
  957. }
  958. }
  959. private void BTN_EXPORT_Click(object sender, EventArgs e)
  960. {
  961. ExportDgvToExcel export = new ExportDgvToExcel();
  962. SetState(false);
  963. string imagePath = ReportFun.resultFile.FilePath + "\\" + m_ReportApp.savePathName;
  964. export.ExportExcel(imagePath, dataGridView_success, "宋体", 11);//默认文件名,DataGridView控件的名称,字体,字号
  965. SetState(true);
  966. MessageBox.Show(table["str37"].ToString(), table["str38"].ToString(), MessageBoxButtons.OK, MessageBoxIcon.Information);
  967. }
  968. private void SetState(bool isTrue)
  969. {
  970. dataGridView_success.Columns["FieldID"].Visible = isTrue;
  971. dataGridView_success.Columns["particleid"].Visible = isTrue;
  972. dataGridView_success.Columns["SEMPosX"].Visible = isTrue;
  973. dataGridView_success.Columns["SEMPosY"].Visible = isTrue;
  974. }
  975. }
  976. }