OTSMeasureDisplayResult.cs 32 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710
  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. //开始时间
  37. static string m_StartTimePara = "";
  38. //当前测试样品名称
  39. static string m_CurrentSampleName = "";
  40. ST_MSTMsg MeasureResultMsrData;
  41. //已完成帧图的绘制 根据位置-判断相差范围 四舍五入返回的数值有偏差
  42. static int minRange = -100;
  43. static int maxRange = 100;
  44. #endregion
  45. #region 构造方法
  46. public OTSMeasureDisplayResult( OTSIncAMeasureAppForm m_MeasureApps, BackgroundWorker a_bgWorker)
  47. {
  48. log = NLog.LogManager.GetCurrentClassLogger();
  49. m_MeasureApp = m_MeasureApps;
  50. m_OTSSamplespaceWindow = m_MeasureApps.m_SamplepaceWindow;
  51. m_OTSMeasureResultWindow = m_MeasureApp.m_MeasureRetWindow;
  52. m_OTSMeasureStatusWindow = new OTSMeasureStatusWindow(m_MeasureApp);
  53. Control.CheckForIllegalCrossThreadCalls = false;
  54. //测量结束信息窗口对象
  55. m_MeasureCheckReportInfoWindow = new MeasureCheckResultInfoWindow();
  56. m_bgWorker = a_bgWorker;
  57. //设置报告更新是否可用
  58. m_bgWorker.WorkerReportsProgress = true;
  59. //设置支持取消操作是否可用
  60. m_bgWorker.WorkerSupportsCancellation = true;
  61. m_bgWorker.ProgressChanged += new ProgressChangedEventHandler(backgroundWorker_ProgressChanged);
  62. m_bgWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(backgroundWorker_RunWorkerCompleted);
  63. }
  64. #endregion
  65. #region 修改窗体控件的响应事件_ProgressChanged
  66. //这里就是通过响应消息,来处理界面的显示工作
  67. private void backgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
  68. {
  69. try
  70. {
  71. if (e.ProgressPercentage == (int)ProgressState.MeasureCheckReport)
  72. {
  73. MeasureResultInfo(MeasureResultMsrData);
  74. }
  75. //测量结果
  76. if (e.ProgressPercentage == (int)ProgressState.MeasureResult)
  77. {
  78. if (m_OTSMeasureResultWindow == null)
  79. {
  80. //实例窗体
  81. m_OTSMeasureResultWindow = m_MeasureApp.m_MeasureRetWindow;
  82. }
  83. //设置工作样品
  84. m_MeasureApp.m_ProjParam.SetWorkSample(OTSSamplespaceWindow.m_SampleSelectName);
  85. //获取工作样品信息
  86. COTSSample WSample = m_MeasureApp.m_ProjParam.GetWorkSample();
  87. CMsrDisplayResults cMsrResultsClr = WSample.GetMsrResults();
  88. //获取结果文件 颗粒列表信息
  89. List<CMsrResultItem> cMsrResultItemClrList = cMsrResultsClr.GetResultItems();
  90. //根据编号获取分类名称
  91. List<CMsrResultItem> cMsrResultItemClrListTemp = cMsrResultItemClrList;
  92. //设置测量状态数据列表
  93. SetMeasureListInfo(cMsrResultItemClrList);
  94. }
  95. }
  96. catch (Exception ex)
  97. {
  98. log.Error("OTSIncAMeasureApp_backgroundWorker_ProgressChanged:--Open the measurement results list window - error log:" + ex.ToString());
  99. }
  100. }
  101. #endregion
  102. #region 处理完成的响应事件_RunWorkerCompleted
  103. //这里是后台工作完成后的消息处理,可以在这里进行后续的处理工作。
  104. private void backgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
  105. {
  106. //m_bgWorker.CancelAsync();
  107. //m_bgWorker = null;
  108. }
  109. #endregion
  110. #region 判断窗口是否已经打开
  111. //判断窗口是否已经打开
  112. private bool CheckFormIsOpen(string Forms)
  113. {
  114. bool bResult = false;
  115. foreach (Form frm in Application.OpenForms)
  116. {
  117. if (frm.Name == Forms)
  118. {
  119. bResult = true;
  120. break;
  121. }
  122. }
  123. return bResult;
  124. }
  125. #endregion
  126. #region 打开测量结果窗口
  127. /// <summary>
  128. /// 打开测量结果窗口
  129. /// </summary>
  130. public void MeasureResultInfo(ST_MSTMsg sMSR)
  131. {
  132. //打开测量结果窗体
  133. if (m_MeasureCheckReportInfoWindow.IsDisposed)
  134. {
  135. m_MeasureCheckReportInfoWindow = new MeasureCheckResultInfoWindow();
  136. }
  137. m_MeasureCheckReportInfoWindow.Activate();
  138. m_MeasureCheckReportInfoWindow.Show();
  139. SetMeasureResultInfo(sMSR);
  140. }
  141. #endregion
  142. #region 显示BSE图片
  143. public void OTSMeasureStatusWindowFun(int width, int height, byte[] ImageData, OTSIncAMeasureAppForm m_MeasureApps)
  144. {
  145. //设置图像数据与状态
  146. OTSMeasureStatusWindow.bfResult = true;
  147. m_MeasureApps.m_MessureStatuWindow.bBseData = ImageData;
  148. //获取灰度图数据
  149. double[] dGrayLevelData = new double[255];
  150. dGrayLevelData = OTSImageData.GetStaticGaryData(ImageData, dGrayLevelData);
  151. m_MeasureApps.m_MessureStatuWindow.dGrayLevelData = dGrayLevelData;
  152. if (m_MeasureApps.m_MessureStatuWindow.panelXray.Visible)
  153. {
  154. m_MeasureApps.m_MessureStatuWindow.panelXray.Visible = false;
  155. }
  156. //删除点标记
  157. m_MeasureApps.m_MessureStatuWindow.DelElementPointGDIObjects();
  158. //显示BSE图
  159. m_MeasureApps.m_MessureStatuWindow.pbBSEImage.Show();
  160. //显示BSE图
  161. m_MeasureApps.m_MessureStatuWindow.ShowImage(width, height, ImageData);
  162. }
  163. #endregion
  164. #region 隐藏BSE图片
  165. #endregion
  166. #region 初始窗口对象
  167. int intFlag = 0;
  168. public void RunThreadLoadEvent()
  169. {
  170. if (intFlag == 0)
  171. {
  172. m_bgWorker.RunWorkerAsync();
  173. intFlag++;
  174. }
  175. }
  176. #endregion
  177. #region 设置测量状态列表数据
  178. /// <summary>
  179. /// 设置测量状态列表数据
  180. /// </summary>
  181. /// <param name="stratTime"></param>
  182. public void SetMeasureListInfo(IList list)
  183. {
  184. //设置开始时间
  185. if (list != null)
  186. {
  187. //获取测量状态Grid中的数据list
  188. m_OTSMeasureResultWindow.SetMeasureListInfo(list);
  189. }
  190. }
  191. #endregion
  192. #region 设置开始时间
  193. /// <summary>
  194. /// 设置开始时间
  195. /// </summary>
  196. /// <param name="stratTime"></param>
  197. public void SetStartTime(string stratTime)
  198. {
  199. //设置开始时间
  200. if (stratTime != null)
  201. {
  202. if (stratTime != "")
  203. {
  204. m_OTSMeasureResultWindow.SetStartTime(stratTime);
  205. }
  206. }
  207. }
  208. #endregion
  209. #region 设置结束时间
  210. /// <summary>
  211. /// 设置结束时间
  212. /// </summary>
  213. /// <param name="SetEndTime"></param>
  214. public void SetEndTime(string endTime)
  215. {
  216. //设置开始时间
  217. if (endTime != null)
  218. {
  219. if (endTime != "")
  220. {
  221. //设置结束时间
  222. m_MeasureCheckReportInfoWindow.SetEndTime(endTime);
  223. }
  224. }
  225. }
  226. #endregion
  227. #region 设置测量结束窗体中信息内容
  228. public void SetMeasureResultInfo(ST_MSTMsg SMsrData)
  229. {
  230. //设置开始时间
  231. string startTime = SMsrData.STMThreadStu.SMsrCompleteData.csMsrStartTime;
  232. //设置结束时间
  233. string endTime = SMsrData.STMThreadStu.SMsrCompleteData.csMsrEndTime;
  234. //设置测量数
  235. int completeSampleCount = SMsrData.STMThreadStu.SMsrCompleteData.iMsrCompleteSampleCount;
  236. //设置帧图数
  237. int completeFieldCount = SMsrData.STMThreadStu.SMsrCompleteData.iMsrCompleteFieldCount;
  238. //颗粒数
  239. int particleCount = SMsrData.STMThreadStu.SMsrCompleteData.iParticleCount;
  240. //用时
  241. TimeSpan measureTime = SMsrData.STMThreadStu.SMsrCompleteData.MsrUsedTime;
  242. string measureState = string.Empty;
  243. OTSCommon.Language lan = new OTSCommon.Language();
  244. Hashtable table= lan.GetNameTable("OTSMeasureResultWindow");
  245. //状态
  246. //switch (SMsrData.STMThreadStu.SMsrCompleteData.MsrStatus)
  247. switch (SMsrData.STMThreadStu.iMsrStatu)
  248. {
  249. case OTS_MSR_THREAD_STATUS.COMPLETED:
  250. measureState = table["state1"].ToString();
  251. break;
  252. case OTS_MSR_THREAD_STATUS.FAILED:
  253. measureState = table["state2"].ToString();
  254. break;
  255. case OTS_MSR_THREAD_STATUS.STOPPED:
  256. measureState = table["state3"].ToString();
  257. break;
  258. }
  259. //设置测量结果窗体信息
  260. string measureTimes = string.Empty;
  261. m_MeasureCheckReportInfoWindow.SetMeasureStateInfo(measureState, completeSampleCount, completeFieldCount, particleCount, startTime, measureTime, endTime, ref measureTimes);
  262. }
  263. #endregion
  264. #region 设置测量用时
  265. public void SetMeasureTime(TimeSpan tSpan)
  266. {
  267. m_OTSMeasureResultWindow.SetMeasureTime(tSpan);
  268. }
  269. #endregion
  270. #region 设置样品名称
  271. /// <summary>
  272. /// 设置样品名称
  273. /// </summary>
  274. /// <param name="SetSampleName"></param>
  275. public void SetSampleName(string sampleName)
  276. {
  277. //设置开始时间
  278. if (sampleName != null)
  279. {
  280. if (sampleName != "")
  281. {
  282. CStageManage.SetWorkSampleAndWorkMeasure(sampleName);
  283. double iWDistance = 0;
  284. double dMagni = 0;
  285. m_MeasureApp.m_ProjParam.GetWorkingSampleSEMData(ref iWDistance, ref dMagni);
  286. if (CMeasureThreadWrapper.DoRunType == (int)MSR_THREAD_RunSTATUS.RUNMEASURE)
  287. {
  288. m_OTSMeasureResultWindow.SetSampleName(sampleName);
  289. }
  290. m_OTSSamplespaceWindow.Invalidate();
  291. }
  292. }
  293. }
  294. #endregion
  295. #region 更改已完成测量的帧图状态
  296. public void ChangeDoneMeasureState(Point CurrentFIELDOTSPoint, Color changeColor)
  297. {
  298. //根据完成的测量帧图 更改帧图的完成状态
  299. if (OTSSamplespaceWindow.m_SingleGDIObjects != null)
  300. {
  301. if (OTSSamplespaceWindow.m_SingleGDIObjects.Count > 0)
  302. {
  303. //已完成帧图的绘制 根据位置-判断相差范围 四舍五入返回的数值有偏差
  304. int minTempRange = minRange;
  305. int maxTempRange = maxRange;
  306. int XOffset = 0;
  307. int YOffset = 0;
  308. //以放大倍数 获取当前倍数扫描尺寸 与100倍扫描尺寸的比例
  309. int ScanFieldSize = m_MeasureApp.m_ProjParam.GetResultData().GetWorkingSample().GetSEMDataMsr().GetScanFieldSize();
  310. int ScanFieldSize100 = m_MeasureApp.m_ProjParam.GetResultData().GetWorkingSample().GetSEMDataMsr().GetScanFieldSize100();
  311. float Scale = Convert.ToSingle(ScanFieldSize100) / Convert.ToSingle(ScanFieldSize);
  312. if (Scale > 0)
  313. {
  314. minTempRange = Convert.ToInt32(minTempRange / Scale);
  315. maxTempRange = Convert.ToInt32(maxTempRange / Scale);
  316. }
  317. for (int i = OTSSamplespaceWindow.m_SingleGDIObjects.Count - 1; i >= 0; i--)
  318. {
  319. XOffset= OTSSamplespaceWindow.m_SingleGDIObjects[i].OTSX - CurrentFIELDOTSPoint.X;
  320. YOffset = OTSSamplespaceWindow.m_SingleGDIObjects[i].OTSY - CurrentFIELDOTSPoint.Y;
  321. if ((minTempRange < XOffset) && (XOffset < maxTempRange) && (minTempRange < YOffset) && (YOffset < maxTempRange))
  322. {
  323. //修改完成状态
  324. OTSSamplespaceWindow.m_SingleGDIObjects[i].SelColor = changeColor;
  325. break;
  326. }
  327. }
  328. }
  329. }
  330. }
  331. public static int ChangeCompleteFieldMeasureState(List<Point> CompleteFieldList, Color changeColor, OTSIncAMeasureAppForm m_MeasureApp)
  332. {
  333. int CompleteCount = 0;
  334. //根据完成的测量帧图 更改帧图的完成状态
  335. if (OTSSamplespaceWindow.m_SingleGDIObjects != null)
  336. {
  337. if (OTSSamplespaceWindow.m_SingleGDIObjects.Count > 0)
  338. {
  339. //已完成帧图的绘制 根据位置-判断相差范围 四舍五入返回的数值有偏差
  340. int minTempRange = minRange;
  341. int maxTempRange = maxRange;
  342. int XOffice = 0;
  343. int YOffice = 0;
  344. //以放大倍数 获取当前倍数扫描尺寸 与100倍扫描尺寸的比例
  345. int ScanFieldSize = m_MeasureApp.m_ProjParam.GetResultData().GetWorkingSample().GetSEMDataMsr().GetScanFieldSize();
  346. int ScanFieldSize100 = m_MeasureApp.m_ProjParam.GetResultData().GetWorkingSample().GetSEMDataMsr().GetScanFieldSize100();
  347. float Scale = ScanFieldSize100 / ScanFieldSize;
  348. minTempRange = Convert.ToInt32(minTempRange / Scale);
  349. maxTempRange = Convert.ToInt32(maxTempRange / Scale);
  350. for (int y = 0; y < CompleteFieldList.Count; y++)
  351. {
  352. for (int x = OTSSamplespaceWindow.m_SingleGDIObjects.Count - 1; x >= 0; x--)
  353. {
  354. XOffice = Convert.ToInt32((OTSSamplespaceWindow.m_SingleGDIObjects[x].OTSX - CompleteFieldList[y].X)/Scale);
  355. YOffice = Convert.ToInt32((OTSSamplespaceWindow.m_SingleGDIObjects[x].OTSY - CompleteFieldList[y].Y)/ Scale);
  356. if ((minTempRange < XOffice) && (XOffice < maxTempRange) && (minTempRange < YOffice) && (YOffice < maxTempRange))
  357. {
  358. //修改完成状态
  359. OTSSamplespaceWindow.m_SingleGDIObjects[x].SelColor = changeColor;
  360. CompleteCount++;
  361. break;
  362. }
  363. }
  364. }
  365. }
  366. }
  367. return CompleteCount;
  368. }
  369. #endregion
  370. #region 测量状态进度窗口
  371. public void MeasureStateProgressInfo(SAMPLEFIELDDATA FieldData)
  372. {
  373. //样品测量中的总帧图数
  374. int MeasureFieldTotalCount = FieldData.iMeasureFieldCount;
  375. //样品测量中当前已测量的帧图数
  376. int CompleteFieldCount = FieldData.iCompleteFieldCount;
  377. int ParticleCount = FieldData.iSParticleCount;
  378. if (CompleteFieldCount >= 0 && MeasureFieldTotalCount >= 0)
  379. {
  380. m_bgWorker.ReportProgress((int)ProgressState.MeasureResult);
  381. //设置当前进度信息(当前Field数量与Field总数)
  382. m_OTSMeasureResultWindow.SetCurrentProgressInfo(CompleteFieldCount, MeasureFieldTotalCount, ParticleCount);
  383. }
  384. }
  385. #endregion
  386. #region 设置样品孔中BSE图像信息
  387. /// <summary>
  388. /// 设置样品孔中BSE图像信息
  389. /// </summary>
  390. /// <param name="ImageData">获取显示BSE的图片数据</param>
  391. /// <param name="width">图片宽度</param>
  392. /// <param name="height">图片高度</param>
  393. /// <param name="fieldPos">Field位置</param>
  394. public void SetHoleBSEImageData(byte[] ImageData, int width, int height, Point fieldPos)
  395. {
  396. m_MeasureApp.m_SamplepaceWindow.AddHoleBSEImageData(ImageData, width, height, fieldPos);
  397. }
  398. #endregion
  399. #region 测量方法
  400. //运行测量状态方法
  401. public void RunMeasureState(ST_MSTMsg SMsrData)
  402. {
  403. try
  404. {
  405. //消息枚举 测量状态、测量结果
  406. ENUM_MSG_TYPE dataType = SMsrData.iMsgType;
  407. //测量状态:开始状态、完成状态(测量停止、测量失败、测量完成)
  408. OTS_MSR_THREAD_STATUS msrStatus = SMsrData.STMThreadStu.iMsrStatu;
  409. //获取当前线程执行类型 1:测量 2:获取样品孔图片
  410. int runThreadType = CMeasureThreadWrapper.DoRunType;
  411. //获取需显示的grid信息
  412. OTSSamplePropertyInfo MeasureInfo = new OTSSamplePropertyInfo();
  413. m_MeasureApp.m_ProjParam.GetWorkSamplePerameter(m_MeasureApp.m_ProjParam.GetWorkSample(), ref MeasureInfo);
  414. switch (dataType)
  415. {
  416. //测量线程状态
  417. case ENUM_MSG_TYPE.MTHREADSTATUS:
  418. switch (msrStatus)
  419. {
  420. //测量状态在进行中-测量开始
  421. case OTS_MSR_THREAD_STATUS.INPROCESS:
  422. //当前线程执行类型 1:测量
  423. if (runThreadType == (int)MSR_THREAD_RunSTATUS.RUNMEASURE)
  424. {
  425. string startTime = SMsrData.STMThreadStu.csMsrStartTime;
  426. //设置开始时间
  427. m_StartTimePara = startTime;
  428. }
  429. //判断信息来源 拍摄样品孔图片 或是 测量开始
  430. if (m_MeasureApp.m_MessageStates == MessageState.ShotBSEPicture)
  431. {
  432. //根据放大倍数、重新绘制帧图信息
  433. m_MeasureApp.m_SamplepaceWindow.showSingleInfo();
  434. }
  435. break;
  436. //测量状态已完成
  437. case OTS_MSR_THREAD_STATUS.COMPLETED:
  438. //当前线程执行类型 1:测量
  439. if (runThreadType == (int)MSR_THREAD_RunSTATUS.RUNMEASURE)
  440. {
  441. string inprocessEndTime = SMsrData.STMThreadStu.csMsrEndTime;
  442. SetMeasureResultInfo(SMsrData);
  443. MeasureResultMsrData = SMsrData;
  444. m_bgWorker.ReportProgress((int)ProgressState.MeasureCheckReport, SMsrData);
  445. //激活跳转至报告程序按钮
  446. m_MeasureApp.rbPReport.Enabled = true;
  447. m_MeasureApp.rbReport.Enabled = true;
  448. }
  449. if (runThreadType == (int)MSR_THREAD_RunSTATUS.RUNSampleHoleImage)
  450. {
  451. SetRestoreWorkingDistanceAndMagnification();
  452. }
  453. //测量完成,更新Grid显示的测量信息
  454. m_MeasureApp.m_SPropertyWindows.DisplaySampleMeasureInfo(MeasureInfo);
  455. break;
  456. //测量状态已失败
  457. case OTS_MSR_THREAD_STATUS.FAILED:
  458. //当前线程执行类型 1:测量
  459. if (runThreadType == (int)MSR_THREAD_RunSTATUS.RUNMEASURE)
  460. {
  461. string failedEndTime = SMsrData.STMThreadStu.csMsrEndTime;
  462. SetMeasureResultInfo(SMsrData);
  463. MeasureResultMsrData = SMsrData;
  464. m_bgWorker.ReportProgress((int)ProgressState.MeasureCheckReport, SMsrData);
  465. }
  466. if (runThreadType == (int)MSR_THREAD_RunSTATUS.RUNSampleHoleImage)
  467. {
  468. SetRestoreWorkingDistanceAndMagnification();
  469. }
  470. //测量失败,更新Grid显示的测量信息
  471. m_MeasureApp.m_SPropertyWindows.DisplaySampleMeasureInfo(MeasureInfo);
  472. break;
  473. //测量状态已停止
  474. case OTS_MSR_THREAD_STATUS.STOPPED:
  475. //当前线程执行类型 1:测量
  476. if (runThreadType == (int)MSR_THREAD_RunSTATUS.RUNMEASURE)
  477. {
  478. string stopEndTime = SMsrData.STMThreadStu.csMsrEndTime;
  479. //打开测量结果窗口
  480. SetMeasureResultInfo(SMsrData);
  481. MeasureResultMsrData = SMsrData;
  482. m_bgWorker.ReportProgress((int)ProgressState.MeasureCheckReport, SMsrData);
  483. //激活跳转至报告程序按钮
  484. m_MeasureApp.rbPReport.Enabled = true;
  485. m_MeasureApp.rbReport.Enabled = true;
  486. }
  487. if (runThreadType == (int)MSR_THREAD_RunSTATUS.RUNSampleHoleImage)
  488. {
  489. SetRestoreWorkingDistanceAndMagnification();
  490. }
  491. //测量停止,更新Grid显示的测量信息
  492. m_MeasureApp.m_SPropertyWindows.DisplaySampleMeasureInfo(MeasureInfo);
  493. break;
  494. }
  495. break;
  496. //测量结果
  497. case ENUM_MSG_TYPE.MSAMPLESTATUS:
  498. //获取测量状态样品信息
  499. OTS_MSR_SAMPLE_STATUS msrSampleStatu = SMsrData.STMSampleStu.iMsrSampleStatu;
  500. switch (msrSampleStatu)
  501. {
  502. case OTS_MSR_SAMPLE_STATUS.INPROCESS:
  503. //当前线程执行类型 1:测量
  504. if (runThreadType == (int)MSR_THREAD_RunSTATUS.RUNMEASURE)
  505. {
  506. //获取样品名称
  507. string sampleName = SMsrData.STMSampleStu.cSampleName;
  508. //样品测量开始时间
  509. string csSampleMsrStartTime = SMsrData.STMSampleStu.csSampleMsrStartTime;
  510. //设置样品名称
  511. if (sampleName != null)
  512. {
  513. if (sampleName != "")
  514. {
  515. SetSampleName(sampleName);
  516. //设置开始时间
  517. SetStartTime(csSampleMsrStartTime);
  518. m_CurrentSampleName = sampleName;
  519. }
  520. }
  521. //切换样品
  522. m_MeasureApp.SwitchWSample(sampleName);
  523. //设置样品名称
  524. m_OTSMeasureResultWindow.SetSampleName(sampleName);
  525. //填充帧图信息
  526. OTSSamplespaceWindow.ChangeSampleFillSingleInfo(sampleName);
  527. }
  528. else if (runThreadType == (int)MSR_THREAD_RunSTATUS.RUNSampleHoleImage)
  529. {
  530. //获取样品名称
  531. string sampleName = SMsrData.STMSampleStu.cSampleName;
  532. //设置样品名称
  533. if (sampleName == null)
  534. {
  535. if (sampleName.Equals(""))
  536. {
  537. if (m_MeasureApp.m_ProjParam.GetWorkSample() != null)
  538. {
  539. sampleName = m_MeasureApp.m_ProjParam.GetWorkSample().GetName();
  540. }
  541. }
  542. }
  543. SetSampleName(sampleName);
  544. }
  545. break;
  546. }
  547. break;
  548. case ENUM_MSG_TYPE.MSAMPLERESULT:
  549. //获取测量状态的Field与BSE信息
  550. MSAMPLE_RET retDataType = SMsrData.STMSampleRetData.iRetDataType;
  551. //判断测量状态提供Field与BSE信息
  552. switch (retDataType)
  553. {
  554. case MSAMPLE_RET.BSE_DATA:
  555. //当前线程执行类型 1:测量
  556. if (runThreadType == (int)MSR_THREAD_RunSTATUS.RUNMEASURE)
  557. {
  558. //获取显示BSE的图片数据
  559. byte[] ImageData = SMsrData.STMSampleRetData.BSEData.lpBSEData;
  560. //图片宽度
  561. int width = SMsrData.STMSampleRetData.BSEData.iBSEDataWidth;
  562. //图片高度
  563. int height = SMsrData.STMSampleRetData.BSEData.iBSEDataHeight;
  564. //显示状态中的BSE图像控件
  565. if (!m_MeasureApp.m_MessureStatuWindow.pbBSEImage.Visible)
  566. {
  567. m_MeasureApp.m_MessureStatuWindow.pbBSEImage.Visible = true;
  568. }
  569. //调用测量状态TAB中窗体 显示BSE图片
  570. OTSMeasureStatusWindowFun(width, height, ImageData, m_MeasureApp);
  571. }
  572. else if (runThreadType == (int)MSR_THREAD_RunSTATUS.RUNSampleHoleImage)
  573. {
  574. //获取显示BSE的图片数据
  575. byte[] ImageData = SMsrData.STMSampleRetData.BSEData.lpBSEData;
  576. //图片宽度
  577. int width = SMsrData.STMSampleRetData.BSEData.iBSEDataWidth;
  578. //图片高度
  579. int height = SMsrData.STMSampleRetData.BSEData.iBSEDataHeight;
  580. //Field位置
  581. Point fieldPos = SMsrData.STMSampleRetData.BSEData.pos;
  582. //设置样品孔中BSE图像信息
  583. SetHoleBSEImageData(ImageData, width, height, fieldPos);
  584. }
  585. break;
  586. case MSAMPLE_RET.FIELD_DATA:
  587. //当前线程执行类型 1:测量
  588. if (runThreadType == (int)MSR_THREAD_RunSTATUS.RUNMEASURE)
  589. {
  590. //设置测量当前用时
  591. if (SMsrData.STMSampleRetData.SFieldData.TUsedTime != null)
  592. {
  593. SetMeasureTime(SMsrData.STMSampleRetData.SFieldData.TUsedTime);
  594. }
  595. MeasureStateProgressInfo(SMsrData.STMSampleRetData.SFieldData);
  596. ChangeDoneMeasureState(SMsrData.STMSampleRetData.SFieldData.FieldPos, Color.Green);
  597. m_OTSSamplespaceWindow.Invalidate();
  598. }
  599. break;
  600. case MSAMPLE_RET.START_MSR_FIELD:
  601. //当前线程执行类型 1:测量
  602. if (runThreadType == (int)MSR_THREAD_RunSTATUS.RUNMEASURE)
  603. {
  604. ChangeDoneMeasureState(SMsrData.STMSampleRetData.SMsrField.FieldPos, Color.Yellow);
  605. //log.Warn("turn yellow!");
  606. m_OTSSamplespaceWindow.Invalidate();
  607. }
  608. break;
  609. }
  610. break;
  611. }
  612. }
  613. catch (Exception ex)
  614. {
  615. log.Error("RunMeasureState--The error message:" + ex.ToString());
  616. }
  617. }
  618. #endregion
  619. #region 设置原放大倍数与工作距离
  620. protected void SetRestoreWorkingDistanceAndMagnification()
  621. {
  622. //设置原放大倍数
  623. double m_SEMIWDistance = OTSSamplespaceWindow.m_SEMIWDistance;
  624. double m_SEMDMagni = OTSSamplespaceWindow.m_SEMDMagni;
  625. double m_PropIWDistance = OTSSamplespaceWindow.m_PropIWDistance;
  626. double m_PropDMagni = OTSSamplespaceWindow.m_PropDMagni;
  627. //m_MeasureApp.m_ProjParam.
  628. if (m_PropIWDistance != 0 && m_PropDMagni != 0)
  629. {
  630. m_MeasureApp.m_ProjParam.SetWorkingSampleSEMData(m_PropIWDistance, m_PropDMagni);
  631. }
  632. m_MeasureApp.m_SamplepaceWindow.SetSEMDATAMParameter(m_SEMDMagni,m_SEMIWDistance);
  633. m_MeasureApp.m_ProjParam.SetFliedsCount(OTSSamplespaceWindow.m_TotalFieldsCount);
  634. }
  635. #endregion
  636. }
  637. }