OTSMeasureDisplayResult.cs 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588
  1. 
  2. using OTSModelSharp;
  3. using OTSDataType;
  4. using System;
  5. using System.Collections;
  6. using System.Collections.Generic;
  7. using System.ComponentModel;
  8. using System.Drawing;
  9. using System.Linq;
  10. using System.Text;
  11. using System.Threading;
  12. using System.Windows.Forms;
  13. using static OTSDataType.otsdataconst;
  14. using static OTSModelSharp.STMSampleResultData;
  15. namespace OTSMeasureApp
  16. {
  17. class OTSMeasureDisplayResult
  18. {
  19. NLog.Logger log ;
  20. public enum ProgressState
  21. {
  22. MeasureCheckReport = 1,
  23. MeasureResult = 2
  24. }
  25. #region 变量生成汇总
  26. OTSIncAMeasureAppForm m_MeasureApp = null;
  27. //样品台窗口对象
  28. public OTSSamplespaceWindow m_OTSSamplespaceWindow = null;
  29. //测量进度信息窗口对象
  30. public MeasureCheckResultInfoWindow m_MeasureCheckReportInfoWindow = null;
  31. //测量结果信息窗口对象
  32. public OTSMeasureResultWindow m_OTSMeasureResultWindow = null;
  33. //在窗体TAB测量状态中显示BSE图
  34. public OTSMeasureStatusWindow m_OTSMeasureStatusWindow = null;
  35. public System.ComponentModel.BackgroundWorker m_bgWorker;
  36. ST_MSTMsg MeasureResultMsrData;
  37. //已完成帧图的绘制 根据位置-判断相差范围 四舍五入返回的数值有偏差
  38. #endregion
  39. #region 构造方法
  40. public OTSMeasureDisplayResult( OTSIncAMeasureAppForm m_MeasureApps, BackgroundWorker a_bgWorker)
  41. {
  42. log = NLog.LogManager.GetCurrentClassLogger();
  43. m_MeasureApp = m_MeasureApps;
  44. m_OTSSamplespaceWindow = m_MeasureApps.m_SamplepaceWindow;
  45. m_OTSMeasureResultWindow = m_MeasureApp.m_MeasureRetWindow;
  46. m_OTSMeasureStatusWindow = new OTSMeasureStatusWindow(m_MeasureApp);
  47. Control.CheckForIllegalCrossThreadCalls = false;
  48. //测量结束信息窗口对象
  49. m_MeasureCheckReportInfoWindow = new MeasureCheckResultInfoWindow();
  50. m_bgWorker = a_bgWorker;
  51. //设置报告更新是否可用
  52. m_bgWorker.WorkerReportsProgress = true;
  53. //设置支持取消操作是否可用
  54. m_bgWorker.WorkerSupportsCancellation = true;
  55. m_bgWorker.ProgressChanged += new ProgressChangedEventHandler(backgroundWorker_ProgressChanged);
  56. m_bgWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(backgroundWorker_RunWorkerCompleted);
  57. }
  58. #endregion
  59. #region 修改窗体控件的响应事件_ProgressChanged
  60. //这里就是通过响应消息,来处理界面的显示工作
  61. private void backgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
  62. {
  63. try
  64. {
  65. if (e.ProgressPercentage == (int)ProgressState.MeasureCheckReport)
  66. {
  67. MeasureResultInfo(MeasureResultMsrData);
  68. }
  69. //测量结果
  70. if (e.ProgressPercentage == (int)ProgressState.MeasureResult)
  71. {
  72. if (m_OTSMeasureResultWindow == null)
  73. {
  74. //实例窗体
  75. m_OTSMeasureResultWindow = m_MeasureApp.m_MeasureRetWindow;
  76. }
  77. //设置工作样品
  78. m_MeasureApp.m_ProjParam.SetWorkSample(m_OTSSamplespaceWindow.GetWorkingVisualSample().GetSampleName());
  79. //获取工作样品信息
  80. COTSSample WSample = m_MeasureApp.m_ProjParam.GetWorkSample();
  81. CMsrDisplayResults cMsrResultsClr = WSample.GetMsrResults();
  82. //获取结果文件 颗粒列表信息
  83. List<CMsrResultItem> cMsrResultItemClrList = cMsrResultsClr.GetResultItems();
  84. //根据编号获取分类名称
  85. List<CMsrResultItem> cMsrResultItemClrListTemp = cMsrResultItemClrList;
  86. //设置测量状态数据列表
  87. SetMeasureListInfo(cMsrResultItemClrList);
  88. }
  89. }
  90. catch (Exception ex)
  91. {
  92. log.Error( ex.ToString());
  93. }
  94. }
  95. #endregion
  96. #region 处理完成的响应事件_RunWorkerCompleted
  97. //这里是后台工作完成后的消息处理,可以在这里进行后续的处理工作。
  98. private void backgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
  99. {
  100. //m_bgWorker.CancelAsync();
  101. //m_bgWorker = null;
  102. }
  103. #endregion
  104. #region 打开测量结果窗口
  105. /// <summary>
  106. /// 打开测量结果窗口
  107. /// </summary>
  108. public void MeasureResultInfo(ST_MSTMsg sMSR)
  109. {
  110. //打开测量结果窗体
  111. if (m_MeasureCheckReportInfoWindow.IsDisposed)
  112. {
  113. m_MeasureCheckReportInfoWindow = new MeasureCheckResultInfoWindow();
  114. }
  115. m_MeasureCheckReportInfoWindow.Activate();
  116. m_MeasureCheckReportInfoWindow.Show();
  117. SetMeasureResultInfo(sMSR);
  118. }
  119. #endregion
  120. #region 显示BSE图片
  121. public void OTSMeasureStatusWindowFun(int width, int height, byte[] ImageData, OTSIncAMeasureAppForm m_MeasureApps)
  122. {
  123. //设置图像数据与状态
  124. OTSMeasureStatusWindow.bfResult = true;
  125. m_MeasureApps.m_MessureStatuWindow.bBseData = ImageData;
  126. //获取灰度图数据
  127. double[] dGrayLevelData = new double[255];
  128. dGrayLevelData = GetStaticGaryData(ImageData, dGrayLevelData);
  129. m_MeasureApps.m_MessureStatuWindow.dGrayLevelData = dGrayLevelData;
  130. if (m_MeasureApps.m_MessureStatuWindow.panelXray.Visible)
  131. {
  132. m_MeasureApps.m_MessureStatuWindow.panelXray.Visible = false;
  133. }
  134. //删除点标记
  135. m_MeasureApps.m_MessureStatuWindow.DelElementPointGDIObjects();
  136. //显示BSE图
  137. m_MeasureApps.m_MessureStatuWindow.pbBSEImage.Show();
  138. //显示BSE图
  139. m_MeasureApps.m_MessureStatuWindow.ShowImage(width, height, ImageData);
  140. }
  141. public double[] GetStaticGaryData(byte[] Imagedata, double[] GrayLevelData)
  142. {
  143. try
  144. {
  145. //获得下标每一点的灰度值,并在数组里加一
  146. for (int i = 0; i < Imagedata.Length; i++)
  147. {
  148. byte graylevel = Imagedata[i];
  149. if (graylevel > 0 && graylevel < 255)
  150. {
  151. GrayLevelData[graylevel] += 1;
  152. }
  153. }
  154. return GrayLevelData;
  155. }
  156. catch (Exception ex)
  157. {
  158. log.Error(ex.ToString());
  159. return null;
  160. }
  161. }
  162. #endregion
  163. #region 隐藏BSE图片
  164. #endregion
  165. #region 初始窗口对象
  166. int intFlag = 0;
  167. public void RunThreadLoadEvent()
  168. {
  169. if (intFlag == 0)
  170. {
  171. m_bgWorker.RunWorkerAsync();
  172. intFlag++;
  173. }
  174. }
  175. #endregion
  176. #region 设置测量状态列表数据
  177. /// <summary>
  178. /// 设置测量状态列表数据
  179. /// </summary>
  180. /// <param name="stratTime"></param>
  181. public void SetMeasureListInfo(IList list)
  182. {
  183. //设置开始时间
  184. if (list != null)
  185. {
  186. //获取测量状态Grid中的数据list
  187. m_OTSMeasureResultWindow.SetMeasureListInfo(list);
  188. }
  189. }
  190. #endregion
  191. #region 设置开始时间
  192. /// <summary>
  193. /// 设置开始时间
  194. /// </summary>
  195. /// <param name="stratTime"></param>
  196. public void SetStartTime(string stratTime)
  197. {
  198. //设置开始时间
  199. if (stratTime != null)
  200. {
  201. if (stratTime != "")
  202. {
  203. m_OTSMeasureResultWindow.SetStartTime(stratTime);
  204. }
  205. }
  206. }
  207. #endregion
  208. #region 设置测量结束窗体中信息内容
  209. public void SetMeasureResultInfo(ST_MSTMsg SMsrData)
  210. {
  211. //设置开始时间
  212. string startTime = SMsrData.STMThreadStu.SMsrCompleteData.csMsrStartTime;
  213. //设置结束时间
  214. string endTime = SMsrData.STMThreadStu.SMsrCompleteData.csMsrEndTime;
  215. //设置测量数
  216. int completeSampleCount = SMsrData.STMThreadStu.SMsrCompleteData.iMsrCompleteSampleCount;
  217. //设置帧图数
  218. int completeFieldCount = SMsrData.STMThreadStu.SMsrCompleteData.iMsrCompleteFieldCount;
  219. //颗粒数
  220. int particleCount = SMsrData.STMThreadStu.SMsrCompleteData.iParticleCount;
  221. //用时
  222. TimeSpan measureTime = SMsrData.STMThreadStu.SMsrCompleteData.MsrUsedTime;
  223. string measureState = string.Empty;
  224. OTSCommon.Language lan = new OTSCommon.Language();
  225. Hashtable table= lan.GetNameTable("OTSMeasureResultWindow");
  226. //状态
  227. switch (SMsrData.STMThreadStu.iMsrStatu)
  228. {
  229. case OTS_MSR_THREAD_STATUS.COMPLETED:
  230. measureState = table["state1"].ToString();
  231. break;
  232. case OTS_MSR_THREAD_STATUS.FAILED:
  233. measureState = table["state2"].ToString();
  234. break;
  235. case OTS_MSR_THREAD_STATUS.STOPPED:
  236. measureState = table["state3"].ToString();
  237. break;
  238. }
  239. //设置测量结果窗体信息
  240. string measureTimes = string.Empty;
  241. m_MeasureCheckReportInfoWindow.SetMeasureStateInfo(measureState, completeSampleCount, completeFieldCount, particleCount, startTime, measureTime, endTime, ref measureTimes);
  242. }
  243. #endregion
  244. #region 设置测量用时
  245. public void SetMeasureTime(TimeSpan tSpan)
  246. {
  247. m_OTSMeasureResultWindow.SetMeasureTime(tSpan);
  248. }
  249. #endregion
  250. #region 设置样品名称
  251. /// <summary>
  252. /// 设置样品名称
  253. /// </summary>
  254. /// <param name="SetSampleName"></param>
  255. public void SetSampleName(string sampleName)
  256. {
  257. //设置开始时间
  258. if (sampleName != null)
  259. {
  260. if (sampleName != "")
  261. {
  262. m_MeasureApp.m_SamplepaceWindow.SetSampleOrder(sampleName);
  263. double iWDistance = 0;
  264. double dMagni = 0;
  265. m_MeasureApp.m_ProjParam.GetWorkingSampleSEMData(ref iWDistance, ref dMagni);
  266. if (m_MeasureApp.GetRunType() == MSR_RUN_TYPE.RUNMEASURE)
  267. {
  268. m_OTSMeasureResultWindow.SetSampleName(sampleName);
  269. }
  270. m_MeasureApp.m_SamplepaceWindow.Invalidate();
  271. }
  272. }
  273. }
  274. #endregion
  275. #region 测量状态进度窗口
  276. public void MeasureStateProgressInfo(SAMPLEFIELDDATA FieldData)
  277. {
  278. //样品测量中的总帧图数
  279. int MeasureFieldTotalCount = FieldData.iMeasureFieldCount;
  280. //样品测量中当前已测量的帧图数
  281. int CompleteFieldCount = FieldData.iCompleteFieldCount;
  282. int ParticleCount = FieldData.iSParticleCount;
  283. if (CompleteFieldCount >= 0 && MeasureFieldTotalCount >= 0)
  284. {
  285. m_bgWorker.ReportProgress((int)ProgressState.MeasureResult);
  286. //设置当前进度信息(当前Field数量与Field总数)
  287. m_OTSMeasureResultWindow.SetCurrentProgressInfo(CompleteFieldCount, MeasureFieldTotalCount, ParticleCount);
  288. }
  289. }
  290. #endregion
  291. #region 设置样品孔中BSE图像信息
  292. /// <summary>
  293. /// 设置样品孔中BSE图像信息
  294. /// </summary>
  295. /// <param name="ImageData">获取显示BSE的图片数据</param>
  296. /// <param name="width">图片宽度</param>
  297. /// <param name="height">图片高度</param>
  298. /// <param name="fieldPos">Field位置</param>
  299. public void SetHoleBSEImageData(byte[] ImageData, int width, int height, Point fieldPos)
  300. {
  301. m_MeasureApp.m_SamplepaceWindow.AddHoleBSEImageData(ImageData, width, height, fieldPos);
  302. }
  303. #endregion
  304. #region 测量方法
  305. //运行测量状态方法
  306. public void RunMeasureState(ST_MSTMsg SMsrData)
  307. {
  308. try
  309. {
  310. //消息枚举 测量状态、测量结果
  311. ENUM_MSG_TYPE dataType = SMsrData.iMsgType;
  312. //测量状态:开始状态、完成状态(测量停止、测量失败、测量完成)
  313. OTS_MSR_THREAD_STATUS msrStatus = SMsrData.STMThreadStu.iMsrStatu;
  314. //获取当前线程执行类型 1:测量 2:获取样品孔图片
  315. var runThreadType = m_MeasureApp.GetRunType();
  316. //获取需显示的grid信息
  317. OTSSamplePropertyInfo MeasureInfo = new OTSSamplePropertyInfo();
  318. m_MeasureApp.m_ProjParam.GetWorkSamplePerameter(m_MeasureApp.m_ProjParam.GetWorkSample(), ref MeasureInfo);
  319. switch (dataType)
  320. {
  321. //测量线程状态
  322. case ENUM_MSG_TYPE.MTHREADSTATUS:
  323. switch (msrStatus)
  324. {
  325. //测量状态在进行中-测量开始
  326. case OTS_MSR_THREAD_STATUS.INPROCESS:
  327. if (runThreadType == MSR_RUN_TYPE.RUNMEASURE)
  328. {
  329. string startTime = SMsrData.STMThreadStu.csMsrStartTime;
  330. }
  331. break;
  332. //测量状态已完成
  333. case OTS_MSR_THREAD_STATUS.COMPLETED:
  334. //当前线程执行类型 1:测量
  335. if (runThreadType == MSR_RUN_TYPE.RUNMEASURE)
  336. {
  337. string inprocessEndTime = SMsrData.STMThreadStu.csMsrEndTime;
  338. SetMeasureResultInfo(SMsrData);
  339. MeasureResultMsrData = SMsrData;
  340. m_bgWorker.ReportProgress((int)ProgressState.MeasureCheckReport, SMsrData);
  341. //激活跳转至报告程序按钮
  342. m_MeasureApp.rbPReport.Enabled = true;
  343. m_MeasureApp.rbReport.Enabled = true;
  344. m_MeasureApp.m_SPropertyWindows.DisplaySampleMeasureInfo(MeasureInfo);
  345. }
  346. //测量完成,更新Grid显示的测量信息
  347. break;
  348. //测量状态已失败
  349. case OTS_MSR_THREAD_STATUS.FAILED:
  350. //当前线程执行类型 1:测量
  351. if (runThreadType == MSR_RUN_TYPE.RUNMEASURE)
  352. {
  353. string failedEndTime = SMsrData.STMThreadStu.csMsrEndTime;
  354. SetMeasureResultInfo(SMsrData);
  355. MeasureResultMsrData = SMsrData;
  356. m_bgWorker.ReportProgress((int)ProgressState.MeasureCheckReport, SMsrData);
  357. }
  358. //测量失败,更新Grid显示的测量信息
  359. m_MeasureApp.m_SPropertyWindows.DisplaySampleMeasureInfo(MeasureInfo);
  360. break;
  361. //测量状态已停止
  362. case OTS_MSR_THREAD_STATUS.STOPPED:
  363. //当前线程执行类型 1:测量
  364. if (runThreadType == MSR_RUN_TYPE.RUNMEASURE)
  365. {
  366. string stopEndTime = SMsrData.STMThreadStu.csMsrEndTime;
  367. //打开测量结果窗口
  368. SetMeasureResultInfo(SMsrData);
  369. MeasureResultMsrData = SMsrData;
  370. m_bgWorker.ReportProgress((int)ProgressState.MeasureCheckReport, SMsrData);
  371. //激活跳转至报告程序按钮
  372. m_MeasureApp.rbPReport.Enabled = true;
  373. m_MeasureApp.rbReport.Enabled = true;
  374. //测量停止,更新Grid显示的测量信息
  375. m_MeasureApp.m_SPropertyWindows.DisplaySampleMeasureInfo(MeasureInfo);
  376. }
  377. break;
  378. }
  379. break;
  380. //测量结果
  381. case ENUM_MSG_TYPE.MSAMPLESTATUS:
  382. //获取测量状态样品信息
  383. OTS_MSR_SAMPLE_STATUS msrSampleStatu = SMsrData.STMSampleStu.iMsrSampleStatu;
  384. switch (msrSampleStatu)
  385. {
  386. case OTS_MSR_SAMPLE_STATUS.INPROCESS:
  387. //当前线程执行类型 1:测量
  388. if (runThreadType == MSR_RUN_TYPE.RUNMEASURE)
  389. {
  390. //获取样品名称
  391. string sampleName = SMsrData.STMSampleStu.cSampleName;
  392. //样品测量开始时间
  393. string csSampleMsrStartTime = SMsrData.STMSampleStu.csSampleMsrStartTime;
  394. //设置样品名称
  395. if (sampleName != null)
  396. {
  397. if (sampleName != "")
  398. {
  399. SetSampleName(sampleName);
  400. //设置开始时间
  401. SetStartTime(csSampleMsrStartTime);
  402. }
  403. }
  404. //切换样品
  405. m_MeasureApp.SwitchWSample(sampleName);
  406. //设置样品名称
  407. m_OTSMeasureResultWindow.SetSampleName(sampleName);
  408. }
  409. else if (runThreadType == MSR_RUN_TYPE.RUNSampleHoleImage)
  410. {
  411. //获取样品名称
  412. string sampleName = SMsrData.STMSampleStu.cSampleName;
  413. //设置样品名称
  414. if (sampleName == null)
  415. {
  416. if (sampleName.Equals(""))
  417. {
  418. if (m_MeasureApp.m_ProjParam.GetWorkSample() != null)
  419. {
  420. sampleName = m_MeasureApp.m_ProjParam.GetWorkSample().GetName();
  421. }
  422. }
  423. }
  424. SetSampleName(sampleName);
  425. }
  426. break;
  427. }
  428. break;
  429. case ENUM_MSG_TYPE.MSAMPLERESULT:
  430. //获取测量状态的Field与BSE信息
  431. MSAMPLE_RET retDataType = SMsrData.STMSampleRetData.iRetDataType;
  432. //判断测量状态提供Field与BSE信息
  433. switch (retDataType)
  434. {
  435. case MSAMPLE_RET.BSE_DATA:
  436. //当前线程执行类型 1:测量
  437. if (runThreadType == MSR_RUN_TYPE.RUNMEASURE)
  438. {
  439. //获取显示BSE的图片数据
  440. byte[] ImageData = SMsrData.STMSampleRetData.BSEData.lpBSEData;
  441. //图片宽度
  442. int width = SMsrData.STMSampleRetData.BSEData.iBSEDataWidth;
  443. //图片高度
  444. int height = SMsrData.STMSampleRetData.BSEData.iBSEDataHeight;
  445. //显示状态中的BSE图像控件
  446. if (!m_MeasureApp.m_MessureStatuWindow.pbBSEImage.Visible)
  447. {
  448. m_MeasureApp.m_MessureStatuWindow.pbBSEImage.Visible = true;
  449. }
  450. //调用测量状态TAB中窗体 显示BSE图片
  451. OTSMeasureStatusWindowFun(width, height, ImageData, m_MeasureApp);
  452. }
  453. else if (runThreadType == MSR_RUN_TYPE.RUNSampleHoleImage)
  454. {
  455. //获取显示BSE的图片数据
  456. byte[] ImageData = SMsrData.STMSampleRetData.BSEData.lpBSEData;
  457. //图片宽度
  458. int width = SMsrData.STMSampleRetData.BSEData.iBSEDataWidth;
  459. //图片高度
  460. int height = SMsrData.STMSampleRetData.BSEData.iBSEDataHeight;
  461. //Field位置
  462. Point fieldPos = SMsrData.STMSampleRetData.BSEData.pos;
  463. //设置样品孔中BSE图像信息
  464. SetHoleBSEImageData(ImageData, width, height, fieldPos);
  465. }
  466. break;
  467. case MSAMPLE_RET.FIELD_DATA:
  468. //当前线程执行类型 1:测量
  469. if (runThreadType == MSR_RUN_TYPE.RUNMEASURE)
  470. {
  471. //设置测量当前用时
  472. if (SMsrData.STMSampleRetData.SFieldData.TUsedTime != null)
  473. {
  474. SetMeasureTime(SMsrData.STMSampleRetData.SFieldData.TUsedTime);
  475. }
  476. MeasureStateProgressInfo(SMsrData.STMSampleRetData.SFieldData);
  477. var sam = m_MeasureApp.m_SamplepaceWindow.GetWorkingVisualSample();
  478. m_MeasureApp.m_SamplepaceWindow. ChangeDoneMeasureState(sam,SMsrData.STMSampleRetData.SFieldData.FieldPos, Color.Green);
  479. m_MeasureApp.m_SamplepaceWindow.Invalidate();
  480. }
  481. break;
  482. case MSAMPLE_RET.START_MSR_FIELD:
  483. //当前线程执行类型 1:测量
  484. if (runThreadType == MSR_RUN_TYPE.RUNMEASURE)
  485. {
  486. var sam = m_MeasureApp.m_SamplepaceWindow.GetWorkingVisualSample();
  487. m_MeasureApp.m_SamplepaceWindow.ChangeDoneMeasureState(sam,SMsrData.STMSampleRetData.SMsrField.FieldPos, Color.Yellow);
  488. m_MeasureApp.m_SamplepaceWindow.Invalidate();
  489. }
  490. break;
  491. }
  492. break;
  493. }
  494. }
  495. catch (Exception ex)
  496. {
  497. log.Error("RunMeasureState--The error message:" + ex.ToString());
  498. }
  499. }
  500. #endregion
  501. }
  502. }