OTSDataMgrFun.cs 71 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005
  1. using OTSModelSharp;
  2. using OTSDataType;
  3. using NSOTSController;
  4. using System;
  5. using System.Collections.Generic;
  6. using System.Drawing;
  7. using System.Linq;
  8. using System.IO;
  9. using OTSIncAMeasureApp.OTSMeasureThread;
  10. namespace OTSIncAMeasureApp
  11. {
  12. public enum OTS_SOFT_PACKAGE_ID
  13. {
  14. OTSIncA = 0, //夹杂物分析
  15. OTSPartA = 1, //颗粒度分析
  16. };
  17. //文件保存返回的结果,DataMgr返回
  18. public enum OTS_SAVE_FILE_REV
  19. {
  20. SaveFile_Success = 0,
  21. SaveFile_Cancel = 1,
  22. SaveFile_Failed = 2,
  23. SaveFile_NoNedd = 3 //文件不需要保存
  24. }
  25. //设置线程状态
  26. public enum MSR_THREAD_STATUS
  27. {
  28. INPROCESS = 1, //开始测量
  29. STOPPED = 2, //测量停止
  30. StartImageCollect = 3, //开始图像采集
  31. STOPPEDImageCollect = 4 //停止图像采集
  32. };
  33. //设置线程状态
  34. public enum MSR_THREAD_RunSTATUS
  35. {
  36. RUNMEASURE = 1, //开始测量
  37. RUNSampleHoleImage = 2 //运行获取样品孔照片
  38. };
  39. public class OTSDataMgrFun
  40. {
  41. OTSIncAMeasureAppForm m_MeasureAppFrom = null;
  42. // 工作文件。c++ 接口,主要用来操作数据管理类的样品测量数据交换, 工作文件类,所有样品信息都从此类中获得
  43. // public CProjMgrClr m_ProjDataMgr = new CProjMgrClr();
  44. public COTSProjMgrFile m_ProjDataMgr = new COTSProjMgrFile();
  45. //参数文件管理。选择OTSIncA和OTSPartA, 读取样品参数。
  46. public COTSProgMgr m_ProgMgr = new COTSProgMgr();
  47. //参数文件
  48. public COTSProgMgrParamFile m_ProgParamFile = null;
  49. //样品台文件(读取样品台数据等)
  50. CStageFile m_StageFile = null;
  51. // 用于绘制样品台的数据
  52. public OTSSampleStageData m_SStageData = null;
  53. //样品测量参数
  54. //测量线程类
  55. CMsrThread m_MsrThread = null;
  56. //测量样品链表
  57. List<COTSSample> m_MeasureSampleList = new List<COTSSample>();
  58. NLog.Logger log = NLog.LogManager.GetCurrentClassLogger();
  59. public OTSDataMgrFun(OTSIncAMeasureAppForm MeasureApp)
  60. {
  61. m_MeasureAppFrom = MeasureApp;
  62. m_SStageData = new OTSSampleStageData();
  63. }
  64. //判断系统文件是否存在
  65. public bool SystemFileExit()
  66. {
  67. return m_ProjDataMgr.IsValid();
  68. }
  69. //检查参数文件是否存在
  70. public bool LoadParamFile()
  71. {
  72. //加载样品参数文件: \Config\SysData\OTSProgMgrParam.pmf
  73. m_ProgParamFile = new COTSProgMgrParamFile();
  74. m_ProgParamFile.LoadInfoFromProgMgrFile((int)OTS_SOFT_PACKAGE_ID.OTSIncA);
  75. if (null == m_ProgParamFile)
  76. {
  77. return false;
  78. }
  79. return true;
  80. }
  81. //检查参数样品台文件是否存在
  82. public bool LoadStageParamFile()
  83. {
  84. m_StageFile = new CStageFile();
  85. // 加载样品台文件; \Config\SysData\OTSStage.stg
  86. if (!m_StageFile.Load((int)OTS_SOFT_PACKAGE_ID.OTSIncA, true, false))
  87. {
  88. return false;
  89. }
  90. if (!SetStageData())
  91. {
  92. return false;
  93. }
  94. return true;
  95. }
  96. /// <summary>
  97. /// 将配置文件中样品台信息 设置给样品台对象中
  98. /// </summary>
  99. /// <returns></returns>
  100. public bool SetStageData()
  101. {
  102. CSEMStageData SEMStageData;
  103. if (m_ProgParamFile == null)
  104. {
  105. return false;
  106. }
  107. SEMStageData = m_ProgParamFile.GetStageDataParam();
  108. if (m_StageFile == null)
  109. {
  110. return false;
  111. }
  112. m_StageFile.SetStageData(SEMStageData);
  113. return true;
  114. }
  115. //获取系统文件是否存在和有效
  116. //bool bNewFileFlag = true: New 文件
  117. public bool InitProjMgr(bool bNewFileFlag = true)
  118. {
  119. //打开文件,则文件中保存有样品台信息,不需要使用系统样品名信息
  120. if (bNewFileFlag)
  121. {
  122. //设置样品台参数
  123. CStage Stage = m_StageFile.GetWorkingStage();
  124. if (null == Stage)
  125. {
  126. return false;
  127. }
  128. m_ProjDataMgr.SetStage(Stage);
  129. // 设置 SEM stage data
  130. CSEMStageData SEMData = m_StageFile.GetStageData();
  131. if (null == SEMData)
  132. {
  133. return false;
  134. }
  135. m_ProjDataMgr.SetSEMStageData(SEMData);
  136. }
  137. //设置 general parameter
  138. COTSGeneralParameters GenParam = m_ProgParamFile.GetGenParam();
  139. if (null == GenParam)
  140. {
  141. return false;
  142. }
  143. m_ProjDataMgr.SetGenParam(GenParam);
  144. //设置 general parameter
  145. COTSImgScanPrm ImageScan = m_ProgParamFile.GetImageScanParam();
  146. if (null == ImageScan)
  147. {
  148. return false;
  149. }
  150. m_ProjDataMgr.SetImageScanParam(ImageScan);
  151. //设置 image process parameter
  152. COTSImgProcPrm ImageProc = m_ProgParamFile.GetImageProcParam();
  153. if (null == ImageProc)
  154. {
  155. return false;
  156. }
  157. m_ProjDataMgr.SetImageProcParam(ImageProc);
  158. //设置 XRay parameter
  159. COTSXRayParam XRayParam = m_ProgParamFile.GetXRayParam();
  160. if (null == XRayParam)
  161. {
  162. return false;
  163. }
  164. m_ProjDataMgr.SetXRayParam(XRayParam);
  165. //判断以上6类参数设置是否成功
  166. if (!m_ProjDataMgr.IsValid())
  167. {
  168. return false;
  169. }
  170. if (bNewFileFlag)
  171. {
  172. //产生样品新文件
  173. if (!m_ProjDataMgr.NewFile())
  174. {
  175. return false;
  176. }
  177. }
  178. //获取样品台信息 CStageClr
  179. if (!this.GetSampleStageData())
  180. {
  181. return false;
  182. }
  183. return true;
  184. }
  185. //获取绘制样品台的数据
  186. public bool GetSampleStageData()
  187. {
  188. //获取样品台信息
  189. CStage SStage = m_ProjDataMgr.GetStage();
  190. if (null == SStage)
  191. {
  192. return false;
  193. }
  194. //获得样品台数据
  195. m_SStageData.sStageName = SStage.GetName();
  196. m_SStageData.bStageShape = (int)SStage.GetBoundary().GetShape();
  197. m_SStageData.StageDomain = (Rectangle)SStage.GetBoundary().GetRectDomain();
  198. m_SStageData.bSampleShape = (int)SStage.GetSTD().GetShape();
  199. m_SStageData.SampleRect = (Rectangle)SStage.GetSTD().GetRectDomain();
  200. int iSHoleCount = SStage.GetHoleList().Count(); //样品孔个数
  201. if (m_SStageData.sSHoleInfoList.Count() > 0)
  202. {
  203. m_SStageData.sSHoleInfoList.Clear();
  204. }
  205. var holeLst = SStage.GetHoleList();
  206. for (int i = 0; i < iSHoleCount; i++)
  207. {
  208. CHole d = holeLst[i];
  209. OTSSampleHoleInfo SHoleInfo = new OTSSampleHoleInfo();
  210. //获取样品口的名称,形状,坐标
  211. SHoleInfo.sSHoleName = d.GetName();
  212. SHoleInfo.iSHoleShape =(int)d.GetShape();
  213. Rectangle r =(Rectangle)d.GetRectDomain();
  214. SHoleInfo.HoleRect =r;
  215. m_SStageData.sSHoleInfoList.Add(SHoleInfo);
  216. }
  217. //获取SEMData 绘制样品
  218. m_SStageData.iScanFieldSize100 = m_ProjDataMgr.GetSEMStageData().GetScanFieldSize100(); //放大倍数为100倍时的屏幕尺寸
  219. m_SStageData.iXAxisDir =(int) m_ProjDataMgr.GetSEMStageData().GetXAxisDir();
  220. m_SStageData.iYAxisDir = (int)m_ProjDataMgr.GetSEMStageData().GetYAxisDir();
  221. m_SStageData.iXAxisStartVal = m_ProjDataMgr.GetSEMStageData().GetXAxis().GetStart();
  222. m_SStageData.iXAxisEndVal = m_ProjDataMgr.GetSEMStageData().GetXAxis().GetEnd();
  223. m_SStageData.iYAxisStartVal = m_ProjDataMgr.GetSEMStageData().GetYAxis().GetStart();
  224. m_SStageData.iYAxisEndVal = m_ProjDataMgr.GetSEMStageData().GetYAxis().GetEnd();
  225. return true;
  226. }
  227. //新建样品工作文件
  228. public bool CreateNewFile()
  229. {
  230. if (m_ProjDataMgr.IsModified()) // 文件被修改
  231. {
  232. int iRev = m_MeasureAppFrom.ShowSaveInfoMsgBox();
  233. if ((int)MessageBoxRev.DIALOG_YES == iRev)
  234. {
  235. if (!m_ProjDataMgr.Save())
  236. {
  237. return false;
  238. }
  239. }
  240. }
  241. //新建新的工作文件
  242. //重新生成一个工作文件对象
  243. COTSProjMgrFile ProjDataMgr = new COTSProjMgrFile();
  244. if (!m_ProjDataMgr.NewFile())
  245. {
  246. return false;
  247. }
  248. m_ProjDataMgr = ProjDataMgr;
  249. this.LoadStageParamFile();
  250. //m_ProgMgr.SetPackId((int)OTS_SOFT_PACKAGE_ID.OTSIncA);
  251. if (!this.InitProjMgr())
  252. {
  253. return false;
  254. }
  255. return true;
  256. }
  257. //打开已存在的样品台工作文件, 返回True,打开新文件成功; 返回False,打开新文件失败;
  258. public bool OpenExistSampleFile()
  259. {
  260. //打开新文件
  261. //产生新的文件
  262. //重新生成一个工作文件对象
  263. COTSProjMgrFile ProjDataMgr = new COTSProjMgrFile();
  264. if (ProjDataMgr.Load())
  265. {
  266. m_ProjDataMgr = ProjDataMgr;
  267. if (!this.InitProjMgr(false))
  268. {
  269. return false;
  270. }
  271. return true;
  272. }
  273. return false;
  274. }
  275. //保存样品文件
  276. public bool SaveProjFile()
  277. {
  278. string SampleName = GetWorkSampleName();
  279. if (SampleName == "") {
  280. return false;
  281. }
  282. return m_ProjDataMgr.Save();
  283. }
  284. //另存文件
  285. public bool SaveAsProjFile()
  286. {
  287. return m_ProjDataMgr.SaveAs();
  288. }
  289. //检查测量区域是否超过样品台区域
  290. //RMeasureArea: 样品台的当前测量区域; RStageArea: 样品台区域; RMeasureArea《RStageArea
  291. public bool CheckMeasureAreaIsByondStageArea(Rectangle RMeasureArea, Rectangle RStageArea, int iShape)
  292. {
  293. Rectangle pMeasureArea = RMeasureArea;
  294. Rectangle pStageArea = RStageArea;
  295. CDomain a_DomainMeasureArea = new CDomain((otsdataconst.DOMAIN_SHAPE)iShape, pMeasureArea);
  296. CDomain a_DomainStageArea = new CDomain((otsdataconst.DOMAIN_SHAPE)iShape, pStageArea);
  297. return a_DomainStageArea.DomainInDomain(a_DomainMeasureArea);
  298. }
  299. //将样品台坐标转换为Sem 坐标
  300. public Point ChangeOTSToSemCoord(Point POTSCoord)
  301. {
  302. System.Drawing.Point VSemCoord = new System.Drawing.Point();
  303. m_StageFile.ConverOTSToSEMPoint(POTSCoord, ref VSemCoord);
  304. return (Point)VSemCoord;
  305. }
  306. //将Sem 坐标转换为样品台坐标
  307. public Point ConverSEMToOTSPoint(Point PSEMCoord)
  308. {
  309. System.Drawing.Point VOTSCoord = new System.Drawing.Point();
  310. m_StageFile.ConverSEMToOTSPoint(PSEMCoord, ref VOTSCoord);
  311. return (Point)VOTSCoord;
  312. }
  313. //添加样品
  314. //string sSHoleName: 样品孔名,当在样品孔上点击右键添加样品时,sSHoleName=样品孔名。当MEASUREAPP和TREEVIEW添加样品时,sSHoleName=""
  315. //返回新的工作样品名称
  316. public OTSSampleMeaInfo AddNewSampleMeasure(string sSHoleName = "")
  317. {
  318. //添加样品
  319. COTSSample NewSample = m_ProjDataMgr.AddSample(sSHoleName);
  320. if (null == NewSample)
  321. {
  322. return null;
  323. }
  324. // 获取样品的属性值
  325. OTSSampleMeaInfo MeasureInfo = new OTSSampleMeaInfo();
  326. if (!GetWorkSamplePropertyVal(NewSample, ref MeasureInfo))
  327. {
  328. return null;
  329. }
  330. ///初始化STD
  331. //SetSTDFileName(0);
  332. return MeasureInfo;
  333. }
  334. //设置工作样品的属性值
  335. public bool SetSampleParamVal(OTSDataType.OTS_SAMPLE_PROP_GRID_ITEMS ItemId, OTS_ITEM_TYPES ValType, object objVal)
  336. {
  337. COTSSample WSample = m_ProjDataMgr.GetWorkingSample();
  338. bool bSetFalg = false;
  339. switch (ValType)
  340. {
  341. case OTS_ITEM_TYPES.BOOL:
  342. {
  343. //设置工作样品值失败
  344. if (!WSample.SetPropboolData(ItemId, (bool)objVal))
  345. {
  346. bSetFalg = false;
  347. }
  348. else
  349. {
  350. bSetFalg = true;
  351. }
  352. }
  353. break;
  354. case OTS_ITEM_TYPES.INT:
  355. {
  356. //设置工作样品值失败
  357. if (!WSample.SetPropIntData(ItemId, (int)objVal))
  358. {
  359. bSetFalg = false;
  360. }
  361. else
  362. {
  363. bSetFalg = true;
  364. }
  365. }
  366. break;
  367. case OTS_ITEM_TYPES.DOUBLE:
  368. {
  369. //设置工作样品值失败
  370. if (!WSample.SetPropdoubleData(ItemId, Convert.ToDouble(objVal)))
  371. {
  372. bSetFalg = false;
  373. }
  374. else
  375. {
  376. bSetFalg = true;
  377. }
  378. }
  379. break;
  380. case OTS_ITEM_TYPES.STRING:
  381. {
  382. //判断样品名是否有效
  383. if (ItemId == OTSDataType.OTS_SAMPLE_PROP_GRID_ITEMS.SAMPLE_NAME)
  384. {
  385. if (!m_ProjDataMgr.IsValidSampleName((string)objVal))
  386. {
  387. bSetFalg = false;
  388. break;
  389. }
  390. }
  391. //设置工作样品值失败
  392. if (!WSample.SetPropStringData(ItemId, (string)objVal))
  393. {
  394. bSetFalg = false;
  395. }
  396. else
  397. {
  398. bSetFalg = true;
  399. }
  400. }
  401. break;
  402. case OTS_ITEM_TYPES.COMBO:
  403. {
  404. //设置工作样品值失败
  405. if (!WSample.SetPropComboData(ItemId, (int)objVal))
  406. {
  407. bSetFalg = false;
  408. }
  409. else
  410. {
  411. bSetFalg = true;
  412. }
  413. }
  414. break;
  415. case OTS_ITEM_TYPES.TIME:
  416. {
  417. //设置工作样品值失败
  418. if (!WSample.SetPropTimeData(ItemId, (DateTime)objVal))
  419. {
  420. bSetFalg = false;
  421. }
  422. else
  423. {
  424. bSetFalg = true;
  425. }
  426. }
  427. break;
  428. case OTS_ITEM_TYPES.TIME_SPAN:
  429. {
  430. //设置工作样品值失败
  431. if (!WSample.SetPropTimeSpanData(ItemId, (TimeSpan)objVal))
  432. {
  433. bSetFalg = false;
  434. }
  435. else
  436. {
  437. bSetFalg = true;
  438. }
  439. }
  440. break;
  441. case OTS_ITEM_TYPES.FILE_LIST:
  442. {
  443. //设置工作样品值失败
  444. if (!WSample.SetPropFileListData(ItemId, (string)objVal))
  445. {
  446. bSetFalg = false;
  447. }
  448. else
  449. {
  450. bSetFalg = true;
  451. }
  452. }
  453. break;
  454. default:
  455. bSetFalg = false;
  456. break;
  457. }
  458. if (bSetFalg)
  459. {
  460. m_ProjDataMgr.SetModify(true);
  461. }
  462. return bSetFalg;
  463. }
  464. //获取工作样品名称
  465. public string GetWorkSampleName()
  466. {
  467. COTSSample WSample = m_ProjDataMgr.GetWorkingSample();
  468. if (null == WSample)
  469. {
  470. return "";
  471. }
  472. string sWorkSampleName = WSample.GetName();
  473. if ("" == sWorkSampleName)
  474. {
  475. return "";
  476. }
  477. return sWorkSampleName;
  478. }
  479. //设置工作样品
  480. //string sNewWorkSampleName: 新工作样品
  481. public bool SetWorkSample(string sNewWorkSampleName)
  482. {
  483. if ("" == sNewWorkSampleName)
  484. {
  485. return false;
  486. }
  487. if (!m_ProjDataMgr.SetWorkingSampleByName(sNewWorkSampleName))
  488. {
  489. return false;
  490. }
  491. return true;
  492. }
  493. //获取工作样品
  494. // 返回工作样品对象
  495. public COTSSample GetWorkSample()
  496. {
  497. COTSSample WSample = m_ProjDataMgr.GetWorkingSample();
  498. if (null == WSample)
  499. {
  500. }
  501. return WSample;
  502. }
  503. //删除工作样品
  504. //string sWorkSampleName : 删除工作样品名称
  505. public bool DeleteWorkSample(string sWorkSampleName)
  506. {
  507. return m_ProjDataMgr.DeleteSampleByName(sWorkSampleName);
  508. }
  509. // 获取样品总数
  510. //返回样品总数
  511. public int GetSampleCount()
  512. {
  513. return m_ProjDataMgr.GetSampleList().Count();
  514. }
  515. //改变工作样品名称
  516. //String sWSampleNewName
  517. public bool ChangeWorkSampleName(String sWSampleNewName)
  518. {
  519. if (!m_ProjDataMgr.IsValidSampleName(sWSampleNewName))
  520. {
  521. return false;
  522. }
  523. COTSSample WorkSample = m_ProjDataMgr.GetWorkingSample();
  524. if (null == WorkSample)
  525. {
  526. return false;
  527. }
  528. WorkSample.SetName(sWSampleNewName);
  529. m_ProjDataMgr.SetModify(true);
  530. return true;
  531. }
  532. //移动工作样品到其他样品孔,样品孔名称和测量区域都要改变,重新设置工作样品参数
  533. //SampleMeasurePara SMeasurePara:
  534. public SampleMeasurePara SetWorkSampleHoleNameAndMeasureArea(SampleMeasurePara SMeasurePara)
  535. {
  536. SampleMeasurePara SMPara = new SampleMeasurePara();
  537. COTSSample WSample = m_ProjDataMgr.GetWorkingSample();
  538. if (null == WSample)
  539. {
  540. return SMPara;
  541. }
  542. CDomain Domain = new CDomain();
  543. Domain.SetShape((otsdataconst.DOMAIN_SHAPE)SMeasurePara.iShape);
  544. Domain.SetRectDomain(SMeasurePara.MeasureRect);
  545. if (SMeasurePara.DrawPolygonPointRegionF != null)
  546. {
  547. List<Point> PolygonPoint = new List<Point>();
  548. foreach (var item in SMeasurePara.DrawPolygonPointRegionF)
  549. {
  550. PolygonPoint.Add(new Point((int)item.X, (int)item.Y));
  551. }
  552. Domain.SetPolygonPoint(PolygonPoint);
  553. }
  554. WSample.SetSampleHoleName(SMeasurePara.sHoleName);
  555. WSample.SetMsrArea(Domain);
  556. //获取样品的测量区域信息
  557. SMPara.sSampleName = WSample.GetName(); //获取样品名称
  558. SMPara.iShape = (int)WSample.GetMsrArea().GetShape(); // 获取测量区域形状
  559. SMPara.sHoleName = WSample.GetSampleHoleName(); //获取样品孔名称
  560. SMPara.MeasureRect = (Rectangle)WSample.GetMsrArea().GetRectDomain(); //样品测量区域
  561. //改变测量区域后重新设置样品修改状态
  562. m_ProjDataMgr.SetModify(true);
  563. //string pathName = m_ProjDataMgr.GetPathName();
  564. //if (pathName != "" && pathName != "Untitled")
  565. //{
  566. // m_ProjDataMgr.Save();
  567. //}
  568. return SMPara;
  569. }
  570. //获取图像尺寸参数
  571. //double iMag : 放大倍数
  572. //ref int iSFieldSize : 返回的Field图片尺寸
  573. public void GetScanFieldSize(double iMag, ref int iSFieldSize)
  574. {
  575. CSEMDataMsr SemDataMsrClr = new CSEMDataMsr();
  576. SemDataMsrClr.SetScanFieldSize100(m_ProjDataMgr.GetSEMStageData().GetScanFieldSize100());
  577. SemDataMsrClr.SetMagnification(iMag);
  578. iSFieldSize = SemDataMsrClr.GetScanFieldSize();
  579. }
  580. //设置测量区域的形状 (通过RIBBON 上的画圆,画矩形 设置)
  581. //int iShape: 测量区域形状 0: 圆形; 1 :矩形
  582. public void SetMeasureAreaShape(int iShape)
  583. {
  584. // SampleMeasurePara SMPara = new SampleMeasurePara();
  585. COTSSample WSample = m_ProjDataMgr.GetWorkingSample();
  586. if (null == WSample)
  587. {
  588. return;
  589. }
  590. CDomain Domain = new CDomain();
  591. Domain.SetShape((otsdataconst.DOMAIN_SHAPE)iShape);
  592. }
  593. //修改了ITEMID后,重新更新GROUPID和ITEMID
  594. public void UpdateGroupValAndItemVal(OTSDataType.OTS_SAMPLE_PROP_GRID_ITEMS ItemID)
  595. {
  596. OTSDataType.OTS_SAMPLE_PROP_GRID_ITEM_GROUPS GroupID = OTSDataType.OTS_SAMPLE_PROP_GRID_ITEM_GROUPS.INVALID;
  597. OTSDataType.OTS_SAMPLE_PROP_GRID_ITEMS iItemID = OTSDataType.OTS_SAMPLE_PROP_GRID_ITEMS.INVALID;
  598. COTSSample WSample = m_ProjDataMgr.GetWorkingSample();
  599. if (null == WSample)
  600. {
  601. return;
  602. }
  603. if (!WSample.GetRelatedPropItemGrp((OTSDataType.OTS_SAMPLE_PROP_GRID_ITEMS)ItemID, ref GroupID))
  604. {
  605. bool bFlag = WSample.GetRelatedPropItem(ItemID, ref iItemID);
  606. }
  607. }
  608. //当SampleSpaceWindow 获取电镜参数时,SampleSpaceWindow给MeasureApp发送事件通知MEASUREP更新电镜工作参数参数
  609. public bool UpdateSEMData()
  610. {
  611. //COTSSample WSample = m_ProjDataMgr.GetWorkingSample();
  612. //if (null == WSample)
  613. //{
  614. //return false;
  615. //}
  616. //if (!WSample.SetPropItemGrps())
  617. //{
  618. //return false;
  619. //}
  620. return true;
  621. }
  622. //设置样品参数锁
  623. //bool ParaLockFlag : 样品参数锁
  624. public bool SetSampleParaLock(bool ParaLockFlag)
  625. {
  626. COTSSample WSample = m_ProjDataMgr.GetWorkingSample();
  627. if (null == WSample)
  628. {
  629. return false;
  630. }
  631. WSample.SetParamLock(ParaLockFlag);
  632. m_ProjDataMgr.SetModify(true);
  633. return true;
  634. }
  635. //获取工作样品锁
  636. //ref bool ParamLockFlag : 获取的工作样品参数锁
  637. public bool GetWSampleParaLock(ref bool ParamLockFlag)
  638. {
  639. COTSSample WSample = m_ProjDataMgr.GetWorkingSample();
  640. if (null == WSample)
  641. {
  642. return false;
  643. }
  644. ParamLockFlag = WSample.GetParamLock();
  645. return true;
  646. }
  647. //获取工作样品测量锁
  648. public bool GetWSampleParaLock(ref OTSSampleMeaInfo SMInfo)
  649. {
  650. COTSSample WSample = m_ProjDataMgr.GetWorkingSample();
  651. if (null == WSample)
  652. {
  653. return false;
  654. }
  655. if (!GetWorkSamplePropertyVal(WSample, ref SMInfo))
  656. {
  657. return false;
  658. }
  659. return true;
  660. }
  661. //重新设置样品在样品列表中的位置(当拖动TREEVIEW的样品顺序后执行 )
  662. public bool SortSamplePosition(List<string> SNameList)
  663. {
  664. if (!m_ProjDataMgr.ResetSamplesListOrder(SNameList))
  665. {
  666. return false;
  667. }
  668. List<COTSSample> SampleList = new List<COTSSample>();
  669. SampleList = m_ProjDataMgr.GetSampleList();
  670. return true;
  671. }
  672. //打开保存的样品文件
  673. //List<CWorkSampleParam> SampleFileList 样品文件中的样品列表
  674. //成功返回 True;
  675. public bool OpenExistSampleFile(ref List<CTreeSampleParam> SampleMeasureInfoList)
  676. {
  677. int iSampleCount = m_ProjDataMgr.GetSampleList().Count();
  678. if (0 == iSampleCount)
  679. {
  680. return false;
  681. }
  682. for (int i = 0; i < iSampleCount; i++)
  683. {
  684. CTreeSampleParam TSampleParam = new CTreeSampleParam();
  685. COTSSample SampleClr = (m_ProjDataMgr.GetSampleList())[i];
  686. GetExistSampleInfo(SampleClr, ref TSampleParam);
  687. SampleMeasureInfoList.Add(TSampleParam);
  688. }
  689. return true;
  690. }
  691. //获取样品的属性值
  692. //ref List<CTreeSampleParam> CTSampleParam : 打开已保存样品文件中的样品信息,用于TREEVIEW显示
  693. public void GetExistSampleInfo(COTSSample SampleClr, ref CTreeSampleParam CTSampleParam)
  694. {
  695. CTSampleParam.sSampleTitleName = m_ProjDataMgr.GetFileName();
  696. CTSampleParam.sWorkSampleName = SampleClr.GetName();
  697. CTSampleParam.bSwitch = SampleClr.GetSwitch();
  698. CTSampleParam.bParamLock = SampleClr.GetParamLock();
  699. }
  700. //打开保存的样品文件
  701. //List<SampleMeasurePara> SampleMeasureAreaList 样品文件中的样品列表,返回样品的测量区域给SampleSpaceWindow
  702. //成功返回 True;
  703. public bool OpenExistSampleMeasureArea(ref List<SampleMeasurePara> SampleMeasureAreaList)
  704. {
  705. int iSListCount = m_ProjDataMgr.GetSampleList().Count();
  706. if (0 == iSListCount)
  707. {
  708. return false;
  709. }
  710. for (int i = 0; i < iSListCount; i++)
  711. {
  712. SampleMeasurePara SampleMeasureArea = new SampleMeasurePara();
  713. //获取样品的测量区域信息
  714. //获取样品名称
  715. SampleMeasureArea.sSampleName = (m_ProjDataMgr.GetSampleList())[i].GetName();
  716. // 获取测量区域形状
  717. SampleMeasureArea.iShape = (int)(m_ProjDataMgr.GetSampleList())[i].GetMsrArea().GetShape();
  718. //获取样品孔名称
  719. SampleMeasureArea.sHoleName = (m_ProjDataMgr.GetSampleList())[i].GetSampleHoleName();
  720. //样品测量区域
  721. SampleMeasureArea.MeasureRect = (Rectangle)(m_ProjDataMgr.GetSampleList())[i].GetMsrArea().GetRectDomain();
  722. //多边形点集合
  723. SampleMeasureArea.PolygonPointRegion = (m_ProjDataMgr.GetSampleList())[i].GetMsrArea().GetPolygonPoint();
  724. List<PointF> PointRegionF = new List<PointF>();
  725. List<Point> PolygonPoint = m_ProjDataMgr.GetSampleList()[i].GetMsrArea().GetPolygonPoint();
  726. if (PolygonPoint != null)
  727. {
  728. foreach (var item in m_ProjDataMgr.GetSampleList()[i].GetMsrArea().GetPolygonPoint())
  729. {
  730. PointRegionF.Add(new PointF(item.X, item.Y));
  731. }
  732. }
  733. SampleMeasureArea.PolygonPointRegionF = PointRegionF;
  734. SampleMeasureArea.DrawPolygonPointRegionF = PointRegionF;
  735. SampleMeasureAreaList.Add(SampleMeasureArea);
  736. }
  737. return true;
  738. }
  739. //检查样品测量参数
  740. //ref List<COTSSample> SampleList: 返回的检查参数的样品列表
  741. //bool bCheckFlag: // True,用户点击检查参数按钮 False ,在点击运行按钮 ;
  742. public bool CheckSampleParam(bool bCheckFlag)
  743. {
  744. m_MeasureSampleList.Clear();
  745. List<COTSSample> MSampleList = new List<COTSSample>();
  746. if (m_MsrThread == null)
  747. {
  748. InitMeasureThread();
  749. }
  750. if (!m_MsrThread.CheckMeasureParam(m_ProjDataMgr, ref MSampleList, bCheckFlag))
  751. {
  752. return false;
  753. }
  754. if (MSampleList.Count > 0)
  755. {
  756. m_MeasureSampleList = MSampleList;
  757. return true;
  758. }
  759. return false;
  760. }
  761. //获取测量参数文件名称
  762. //int iNamePos: 文件名在链表中的位置
  763. //List<string> MParamFileNameList: 测量参数文件链表
  764. public bool GetMeasureParamFileName(ref int iNamePos, ref List<string> MParamFileNameList)
  765. {
  766. if (!m_ProjDataMgr.GetParamFileList(ref iNamePos, ref MParamFileNameList))
  767. {
  768. return false;
  769. }
  770. return true;
  771. }
  772. //设置测量文件名称
  773. //int iNamePos: 文件名在链表中的位置
  774. public bool SetMeasrueParamFileName(int iNamePos)
  775. {
  776. if (!m_ProjDataMgr.ChangeParamFromList(iNamePos))
  777. {
  778. return false;
  779. }
  780. return true;
  781. }
  782. //获取STD 标准库文件名称
  783. //int iNamePos: 文件名在链表中的位置
  784. //List<string> STDFileNameList: STD文件链表
  785. public bool GetSTDFileName(ref int iNamePos, ref List<string> STDFileNameList)
  786. {
  787. if (!m_ProjDataMgr.GetSTDFileList(ref iNamePos, ref STDFileNameList))
  788. {
  789. return false;
  790. }
  791. return true;
  792. }
  793. //设置STD 标准库文件名称
  794. public bool SetSTDFileName(int iNamePos)
  795. {
  796. if (!m_ProjDataMgr.ChangeSTDFromList(iNamePos))
  797. {
  798. return false;
  799. }
  800. return true;
  801. }
  802. ///保存工作样品的测量参数文件
  803. public bool SaveWorkMeasureFile()
  804. {
  805. CMsrParamFileMrg SMeasureParamData = new CMsrParamFileMrg();
  806. COTSSample WSample = m_ProjDataMgr.GetWorkingSample();
  807. if (null == WSample)
  808. {
  809. return false;
  810. }
  811. if (!SMeasureParamData.SetMsrParamFile(WSample.GetMsrParams()))
  812. {
  813. return false;
  814. }
  815. SMeasureParamData.Save("");
  816. return true;
  817. }
  818. //打开工作样品的测量参数文件
  819. public bool LoadWorkMeasureFile()
  820. {
  821. CMsrParamFileMrg SMeasureParamData = new CMsrParamFileMrg();
  822. if (!SMeasureParamData.Load("", true))
  823. {
  824. return false;
  825. }
  826. COTSSample WSample = m_ProjDataMgr.GetWorkingSample();
  827. if (null == WSample)
  828. {
  829. return false;
  830. }
  831. WSample.SetMsrParams(SMeasureParamData.GetMsrParams());
  832. //更新样品GRID值测量文件名
  833. OTSSampleMeaInfo SMInfo = new OTSSampleMeaInfo();
  834. if (!this.GetWorkSamplePropertyVal(WSample, ref SMInfo))
  835. {
  836. return false;
  837. }
  838. m_MeasureAppFrom.m_SPropertyWindows.DisplaySampleMeasureInfo(SMInfo);
  839. return true;
  840. }
  841. //判断是否允许修改样品名
  842. public bool CheckSampleNameIsValid(string sNewName)
  843. {
  844. return m_ProjDataMgr.IsValidSampleName(sNewName);
  845. }
  846. //设置电镜参数
  847. //int iScanFieldSize: Field扫描参数
  848. //int iWDistance: 电镜工作距离
  849. //double dMagni: 放大倍数
  850. public void SetSEMData(double iWDistance, double dMagni)
  851. {
  852. try
  853. {
  854. m_ProjDataMgr.GetWorkingSample().GetSEMDataMsr().SetScanFieldSize100(m_ProjDataMgr.GetSEMStageData().GetScanFieldSize100());
  855. m_ProjDataMgr.GetWorkingSample().GetSEMDataMsr().SetWorkingDistance(iWDistance);
  856. m_ProjDataMgr.GetWorkingSample().GetSEMDataMsr().SetMagnification(dMagni);
  857. }
  858. catch (Exception)
  859. {
  860. }
  861. }
  862. //获取电镜参数
  863. //int iScanFieldSize: Field扫描参数
  864. //int iWDistance: 电镜工作距离
  865. //double dMagni: 放大倍数
  866. public void GetSEMData(ref double iWDistance, ref double dMagni)
  867. {
  868. iWDistance = m_ProjDataMgr.GetWorkingSample().GetSEMDataMsr().GetWorkingDistance();
  869. dMagni = m_ProjDataMgr.GetWorkingSample().GetSEMDataMsr().GetMagnification();
  870. }
  871. //获取工作样品的测量区域
  872. //int iShape :测量区域形状
  873. //Rectangle Srect: 测量区域大小
  874. public bool GetWSampleMrsArea(ref int iShape, ref Rectangle Srect)
  875. {
  876. COTSSample WSample = m_ProjDataMgr.GetWorkingSample();
  877. if (null == WSample)
  878. {
  879. return false;
  880. }
  881. CDomain pMsrArea = new CDomain();
  882. pMsrArea = WSample.GetMsrArea();
  883. if (null == pMsrArea)
  884. {
  885. return false;
  886. }
  887. iShape =(int) pMsrArea.GetShape();
  888. ValueType ValType = new Rectangle();
  889. ValType = pMsrArea.GetRectDomain();
  890. Srect = (Rectangle)ValType;
  891. return true;
  892. }
  893. //获取幁图数
  894. //ref List<Point> pField: 幁图数
  895. public bool GetField(ref List<Point> pFields, ref Size iSzie)
  896. {
  897. COTSSample WSample = m_ProjDataMgr.GetWorkingSample();
  898. if (null == WSample)
  899. {
  900. return false;
  901. }
  902. CDomain pMsrArea = new CDomain();
  903. pMsrArea = WSample.GetMsrArea();
  904. COTSImgScanPrm pImgScanParam = new COTSImgScanPrm();
  905. pImgScanParam = m_ProjDataMgr.GetImageScanParam();
  906. CSEMDataMsr pSEMDataMsr = new CSEMDataMsr();
  907. //设置参数
  908. pSEMDataMsr.SetMagnification(m_ProjDataMgr.GetWorkingSample().GetSEMDataMsr().GetMagnification());
  909. pSEMDataMsr.SetScanFieldSize(m_ProjDataMgr.GetWorkingSample().GetSEMDataMsr().GetScanFieldSize());
  910. pSEMDataMsr.SetScanFieldSize100(m_ProjDataMgr.GetWorkingSample().GetSEMDataMsr().GetScanFieldSize100());
  911. pSEMDataMsr.SetTotalFields(m_ProjDataMgr.GetWorkingSample().GetSEMDataMsr().GetTotalFields());
  912. pSEMDataMsr.SetWorkingDistance(m_ProjDataMgr.GetWorkingSample().GetSEMDataMsr().GetWorkingDistance());
  913. CFieldMgr pFieldMgr = new CFieldMgr();
  914. List<Point> listPoint = new List<Point>();
  915. listPoint.Clear();
  916. //设置测量区域
  917. CSEMDataMsr pSEMDataMsrTemp = pSEMDataMsr;
  918. if (m_MeasureAppFrom.m_MessageStates == (int)MessageState.ShootBSEPicture)
  919. {
  920. //获取最小放大倍数与FieldSize100倍数
  921. pSEMDataMsrTemp.SetScanFieldSize100(m_ProjDataMgr.GetSEMStageData().GetScanFieldSize100());
  922. double dMagnification = m_MeasureAppFrom.m_DataMgrFun.m_StageFile.GetStageData().GetMinMag();
  923. pSEMDataMsrTemp.SetMagnification(dMagnification);
  924. //设置样品孔当前位置信息
  925. Rectangle sampleHoleRect = (Rectangle)OTSMeasureThreadFun.c_DomainMessure.GetRectDomain();
  926. //判断
  927. if ((int)m_MeasureAppFrom.m_SamplepaceWindow.CMStrip.Items[9].Tag == 1)
  928. {
  929. int shape = 0;
  930. foreach (var item in OTSSamplespaceWindow.m_SampleHoleGDIObjects)
  931. {
  932. if (item.Name == WSample.GetName())
  933. {
  934. shape = item.Shape;
  935. }
  936. }
  937. pMsrArea.SetShape((otsdataconst.DOMAIN_SHAPE)shape);
  938. }
  939. pMsrArea.SetRectDomain(sampleHoleRect);
  940. ////初始化
  941. if (!pFieldMgr.Init(pMsrArea, pImgScanParam, pSEMDataMsrTemp, listPoint))
  942. {
  943. return false;
  944. }
  945. }
  946. else if (m_MeasureAppFrom.m_MessageStates == (int)MessageState.MeasureBSEPicture)
  947. {
  948. //获取最小放大倍数与FieldSize100倍数
  949. pSEMDataMsrTemp.SetScanFieldSize100(m_ProjDataMgr.GetSEMStageData().GetScanFieldSize100());
  950. double dMagnification = m_MeasureAppFrom.m_DataMgrFun.m_StageFile.GetStageData().GetMinMag();
  951. pSEMDataMsrTemp.SetMagnification(dMagnification);
  952. //设置样品孔当前位置信息
  953. Rectangle sampleHoleRect = (Rectangle)OTSMeasureThreadFun.c_DomainMessure.GetRectDomain();
  954. pMsrArea.SetRectDomain(sampleHoleRect);
  955. ////初始化
  956. if (!pFieldMgr.Init(pMsrArea, pImgScanParam, pSEMDataMsrTemp, listPoint))
  957. {
  958. return false;
  959. }
  960. }
  961. else
  962. {
  963. try
  964. {
  965. //设置当前工作区域
  966. if (OTSMeasureThreadFun.c_DomainMessure != null)
  967. {
  968. Rectangle measureRect = (Rectangle)OTSMeasureThreadFun.c_DomainMessure.GetRectDomain();
  969. pMsrArea.SetRectDomain(measureRect);
  970. }
  971. }
  972. catch (Exception ex)
  973. {
  974. log.Error("获取幁图数问题:" + ex.ToString());
  975. }
  976. ////初始化
  977. if (!pFieldMgr.Init(pMsrArea, pImgScanParam, pSEMDataMsr, listPoint))
  978. {
  979. return false;
  980. }
  981. }
  982. //获取幁图的中心点
  983. pFields = pFieldMgr.GetFieldCentrePoints();
  984. //获取幁图数
  985. int iFieldCount = pFieldMgr.GetTotalFields();
  986. var oValue = new Rectangle();
  987. if (!pFieldMgr.GetFieldRectByIndex(0, ref oValue))
  988. {
  989. return false;
  990. }
  991. iSzie = ((Rectangle)oValue).Size;
  992. //将幁图数赋值给工作样品后
  993. m_ProjDataMgr.GetWorkingSample().GetSEMDataMsr().SetTotalFields(iFieldCount);
  994. return true;
  995. }
  996. //检查Samplelist中的sample的checkbox状态
  997. //当Samplelist中的链表有sample 的checkbox状态是选中状态,则返回TRUE. 说明可以测量
  998. public bool GetSampleCheckBoxStatus()
  999. {
  1000. COTSSample WSample = m_ProjDataMgr.GetWorkingSample();
  1001. if (null == WSample)
  1002. {
  1003. return false;
  1004. }
  1005. List<COTSSample> SampleList = new List<COTSSample>();
  1006. SampleList = m_ProjDataMgr.GetSampleList();
  1007. int iCount = SampleList.Count();
  1008. if (0 == iCount)
  1009. {
  1010. return false;
  1011. }
  1012. for (int i = 0; i < iCount; i++)
  1013. {
  1014. if (SampleList[i].GetSwitch())
  1015. {
  1016. return true;
  1017. }
  1018. }
  1019. return false;
  1020. }
  1021. //获取BSE图像数据
  1022. public bool GetBSEImageSize(ref int iHeight, ref int iWidth)
  1023. {
  1024. COTSSample WSample = m_ProjDataMgr.GetWorkingSample();
  1025. if (null == WSample)
  1026. {
  1027. return false;
  1028. }
  1029. if (!WSample.GetBSESize(out iHeight, out iWidth))
  1030. {
  1031. return false;
  1032. }
  1033. return true;
  1034. }
  1035. //获取测量的BSE图
  1036. //Byte[] BSEImage: 带背景图数据
  1037. //int iHeight: 图像高度
  1038. //int iWidth: 图像宽度
  1039. //Byte[]BSEImageNoBG : 去背景图数据
  1040. public bool GetBSEImage(Byte[] BSEImage, int iHeight, int iWidth, ref Byte[] BSEImageNoBG)
  1041. {
  1042. CBSEImg pBSEImageIn = new CBSEImg();
  1043. CBSEImg pBSEImageOut = new CBSEImg();
  1044. Rectangle rect = new Rectangle();
  1045. rect.Height = iHeight;
  1046. rect.Width = iWidth;
  1047. pBSEImageIn.SetImageRect(rect);
  1048. pBSEImageIn.SetImageData(BSEImage, iHeight * iWidth);
  1049. COTSSample WSample = m_ProjDataMgr.GetWorkingSample();
  1050. if (null == WSample)
  1051. {
  1052. return false;
  1053. }
  1054. COTSImgProcPrm ImgProcPrm = WSample.GetMsrParams().GetImageProcessParam();
  1055. if (!m_ProjDataMgr.RemoveBackGround(pBSEImageIn, ImgProcPrm, ref pBSEImageOut))
  1056. {
  1057. return false;
  1058. }
  1059. BSEImageNoBG = pBSEImageOut.GetImageDataPtr();
  1060. return true;
  1061. }
  1062. /// <summary>
  1063. /// 获取测量的BSE图
  1064. /// </summary>
  1065. /// <param name="BSEImage">BSE原数据</param>
  1066. /// <param name="iHeight">图像高度</param>
  1067. /// <param name="iWidth">图像宽度</param>
  1068. /// <param name="grayStart"></param>
  1069. /// <param name="grayEnd"></param>
  1070. /// <param name="BSEImageNoBG">去背景图数据</param>
  1071. /// <returns></returns>
  1072. public bool GetBSEImage(Byte[] BSEImage, int iHeight, int iWidth,int grayStart,int grayEnd, ref Byte[] BSEImageNoBG)
  1073. {
  1074. CBSEImg pBSEImageIn = new CBSEImg();
  1075. CBSEImg pBSEImageOut = new CBSEImg();
  1076. Rectangle rect = new Rectangle();
  1077. rect.Height = iHeight;
  1078. rect.Width = iWidth;
  1079. pBSEImageIn.SetImageRect(rect);
  1080. pBSEImageIn.SetImageData(BSEImage, iHeight * iWidth);
  1081. COTSSample WSample = m_ProjDataMgr.GetWorkingSample();
  1082. if (null == WSample)
  1083. {
  1084. return false;
  1085. }
  1086. COTSImgProcPrm ImgProcPrm = WSample.GetMsrParams().GetImageProcessParam();
  1087. CIntRange cIntRangeClr = new CIntRange();
  1088. cIntRangeClr.SetStart(grayStart);
  1089. cIntRangeClr.SetEnd(grayEnd);
  1090. ImgProcPrm.SetBGGray(cIntRangeClr);
  1091. if (!m_ProjDataMgr.RemoveBackGround(pBSEImageIn, ImgProcPrm, ref pBSEImageOut))
  1092. {
  1093. return false;
  1094. }
  1095. BSEImageNoBG = pBSEImageOut.GetImageDataPtr();
  1096. return true;
  1097. }
  1098. //获取图像尺寸
  1099. public string GetBSEImageSize()
  1100. {
  1101. try
  1102. {
  1103. COTSSample WSample = m_ProjDataMgr.GetWorkingSample();
  1104. if (null == WSample)
  1105. {
  1106. return "";
  1107. }
  1108. OTSSampleMeaInfo SMInfo = new OTSSampleMeaInfo();
  1109. if (!GetWorkSamplePropertyVal(WSample, ref SMInfo))
  1110. {
  1111. return "";
  1112. }
  1113. int iCount = SMInfo.SampleDataList.Count();
  1114. for (int i = 0; i < iCount; i++)
  1115. {
  1116. if (OTS_SAMPLE_PROP_GRID_ITEMS.IMAGE_RESOLUTION == SMInfo.SampleDataList[i].iSampleId)
  1117. {
  1118. String val= (String)SMInfo.SampleDataList[i].SampleVal;
  1119. return val;
  1120. }
  1121. }
  1122. return "";
  1123. }
  1124. catch (Exception)
  1125. {
  1126. return "";
  1127. }
  1128. }
  1129. //获取放大倍数和工作距离
  1130. public bool GetMagAndDistance(ref double SemMag, ref double dDistance)
  1131. {
  1132. try
  1133. {
  1134. COTSSample WSample = m_ProjDataMgr.GetWorkingSample();
  1135. if (null == WSample)
  1136. {
  1137. return false;
  1138. }
  1139. OTSSampleMeaInfo SMeasureInfo = new OTSSampleMeaInfo();
  1140. if (!GetWorkSamplePropertyVal(WSample, ref SMeasureInfo))
  1141. {
  1142. return false;
  1143. }
  1144. int iCount = SMeasureInfo.SampleDataList.Count;
  1145. if (iCount == 0)
  1146. {
  1147. return false;
  1148. }
  1149. bool iFlag = false;
  1150. for (int i = 0; i < iCount; i++)
  1151. {
  1152. if (SMeasureInfo.SampleDataList[i].iSampleId == OTS_SAMPLE_PROP_GRID_ITEMS.MAGNIFICATION)
  1153. {
  1154. SemMag = Convert.ToDouble(SMeasureInfo.SampleDataList[i].SampleVal);
  1155. iFlag = true;
  1156. }
  1157. if (SMeasureInfo.SampleDataList[i].iSampleId == OTS_SAMPLE_PROP_GRID_ITEMS.WORKING_DISTANCE)
  1158. {
  1159. dDistance = Convert.ToDouble(SMeasureInfo.SampleDataList[i].SampleVal);
  1160. iFlag = true;
  1161. }
  1162. }
  1163. if (iFlag)
  1164. {
  1165. return true;
  1166. }
  1167. return false;
  1168. }
  1169. catch (Exception)
  1170. {
  1171. return false;
  1172. }
  1173. }
  1174. public bool GetWorkSamplePropertyVal(COTSSample Sample, ref OTSSampleMeaInfo SMeasureInfo)
  1175. {
  1176. //设置工作样品属性项
  1177. Sample.SetPropItemGrps();
  1178. bool MeasurementStatus = false;
  1179. if (null == Sample)
  1180. {
  1181. return false;
  1182. }
  1183. //样品的标题名 (Treeview的根节点名)
  1184. SMeasureInfo.sSampleSoluName = m_ProjDataMgr.GetFileName();
  1185. // Treeview 的样品信息
  1186. SMeasureInfo.TSampleParam.sSampleTitleName = m_ProjDataMgr.GetFileName();
  1187. //获得 样品属性值
  1188. //JObject jo = Sample.GetJSONProperty();
  1189. SMeasureInfo.bSwitch = Sample.GetSwitch();// (bool)jo.GetValue("bSwitch");
  1190. SMeasureInfo.TSampleParam.bParamLock = Sample.GetParamLock();// (bool)jo.GetValue("ParamLock");
  1191. //获取样品的测量区域信息
  1192. //获取样品名称
  1193. //JObject SMeasurePara = (JObject)jo.GetValue("SMeasurePara");
  1194. SMeasureInfo.SMeasurePara.sSampleName = Sample.GetName();// (String)SMeasurePara.GetValue("sNewSampleName");
  1195. // 获取测量区域形状
  1196. SMeasureInfo.SMeasurePara.iShape =(int) Sample.GetMsrArea().GetShape();// (int)SMeasurePara.GetValue("iShape");
  1197. //获取样品孔名称
  1198. SMeasureInfo.SMeasurePara.sHoleName = Sample.GetSampleHoleName();// (String)SMeasurePara.GetValue("sHoleName");
  1199. //样品测量区域
  1200. // JObject rec = (JObject)SMeasurePara.GetValue("MeasureRect");
  1201. Rectangle rec = Sample.GetMsrArea().GetDomainRect();
  1202. SMeasureInfo.SMeasurePara.MeasureRect = new Rectangle((int)rec.X, (int)rec.Y , (int)rec.Width, (int)rec.Height);
  1203. // JObject TSampleParam = (JObject)jo.GetValue("TSampleParam");
  1204. SMeasureInfo.TSampleParam.sWorkSampleName = Sample.GetName();// (String)TSampleParam.GetValue("sWorkSampleName");
  1205. SMeasureInfo.TSampleParam.bSwitch = Sample.GetSwitch();// (bool)TSampleParam.GetValue("bSwitch");
  1206. List< CPropItemGrp> ja = Sample.GetPropItemGrps();// (JArray)jo.GetValue("ItemGrp");
  1207. for (int i = 0; i < ja.Count; i++)
  1208. {
  1209. //获取GROUP ID和Grid的显示组的标题名
  1210. var grp = ja[i];
  1211. int grpId = (int)grp.GetGroupId();
  1212. String sTitle = (String)grp.GetName();
  1213. //获取样品属性ID和值
  1214. var SDataArr = grp.GetItemsList();
  1215. if (SDataArr.Count == 0)
  1216. continue;
  1217. SampleDataGroup smlgrp = new SampleDataGroup();
  1218. smlgrp.GroupId = (OTS_SAMPLE_PROP_GRID_ITEM_GROUPS)grpId;
  1219. smlgrp.sTitle = sTitle;
  1220. for (int j = 0; j < SDataArr.Count; j++)
  1221. {
  1222. var SDataObj = SDataArr[j];
  1223. SampleData SData = new SampleData();
  1224. int smplid = (int)SDataObj.GetSmplItemId();
  1225. SData.iSampleId = (OTS_SAMPLE_PROP_GRID_ITEMS)smplid;
  1226. if (SData.iSampleId == OTS_SAMPLE_PROP_GRID_ITEMS.WORKING_DISTANCE)
  1227. {
  1228. bool b = (bool)SDataObj.IsReadOnly();
  1229. }
  1230. SData.sSCaptionName = (String)SDataObj.GetName();
  1231. //------------------------------修改--------------------------
  1232. if ((String)SDataObj.GetName() == "样品名")
  1233. {
  1234. for (int a = 0; a < ja.Count; a++)
  1235. {
  1236. var grpa = ja[a];
  1237. var SDataArra = grpa.GetItemsList();
  1238. for (int b = 0; b < SDataArra.Count; b++)
  1239. {
  1240. var SDataObb = SDataArra[b];
  1241. if ((String)SDataObb.GetName() == "测量状态")
  1242. {
  1243. if ((String)Sample.GetItemValueStr((OTSDataType.OTS_SAMPLE_PROP_GRID_ITEMS)SDataObb.GetSmplItemId()) == "未测量")
  1244. {
  1245. MeasurementStatus = false;
  1246. }
  1247. else
  1248. {
  1249. MeasurementStatus = true;
  1250. }
  1251. }
  1252. }
  1253. }
  1254. }
  1255. else
  1256. {
  1257. MeasurementStatus = false;
  1258. }
  1259. if (MeasurementStatus)
  1260. {
  1261. SData.bReadOnly = MeasurementStatus;
  1262. }
  1263. else
  1264. {
  1265. SData.bReadOnly = (bool)SDataObj.IsReadOnly();// OTS_ITEM_TYPES
  1266. }
  1267. //---------------------------------------------------------------
  1268. //SData.bReadOnly = (bool)SDataObj.GetValue("IsReadOnly");// OTS_ITEM_TYPES
  1269. int type = (int)SDataObj.GetTypeId();
  1270. SData.iSampleValType = (OTS_ITEM_TYPES)type;
  1271. SData.sDescriptionInfo = (String)SDataObj.GetDescription();
  1272. //SData.SampleVal = (String)SDataObj.GetItemValueStr();
  1273. OTSDataType.OTS_SAMPLE_PROP_GRID_ITEMS ItemId = SDataObj.GetSmplItemId();
  1274. SData.SampleVal = (String)Sample.GetItemValueStr(ItemId);
  1275. List<string> downStrList = new List<string>();
  1276. if (type == (int)OTS_ITEM_TYPES.COMBO)
  1277. {
  1278. Sample.GetPropComboStrings( SDataObj.GetSmplItemId(),downStrList);
  1279. }
  1280. else if (type == (int)OTS_ITEM_TYPES.FILE_LIST)
  1281. {
  1282. //the sample object dosen't know anything about the fileList infomation so it has to delay this duty here.
  1283. int iPos = -1;
  1284. List<string> sFileNameList = new List<string>();
  1285. if (OTS_SAMPLE_PROP_GRID_ITEMS.MEASURE_PARAM_FILE_NAME == (OTS_SAMPLE_PROP_GRID_ITEMS)smplid)
  1286. {
  1287. if (!this.GetMeasureParamFileName(ref iPos, ref sFileNameList))
  1288. {
  1289. return false;
  1290. }
  1291. foreach (var f in sFileNameList)
  1292. {
  1293. downStrList.Add(f);
  1294. }
  1295. }
  1296. if (OTS_SAMPLE_PROP_GRID_ITEMS.STD_FILE_NAME == (OTS_SAMPLE_PROP_GRID_ITEMS)smplid)
  1297. {
  1298. if (!this.GetSTDFileName(ref iPos, ref sFileNameList))
  1299. {
  1300. return false;
  1301. }
  1302. foreach (var f in sFileNameList)
  1303. {
  1304. downStrList.Add(f);
  1305. }
  1306. }
  1307. }
  1308. if (downStrList.Count > 0)
  1309. {
  1310. for (int k = 0; k < downStrList.Count; k++)
  1311. {
  1312. SData.comboDownList.Add((String)downStrList[k]);
  1313. }
  1314. }
  1315. smlgrp.SampleDataList.Add(SData);
  1316. }
  1317. SMeasureInfo.AddASampleDataGrp(smlgrp);
  1318. }
  1319. return true;
  1320. }
  1321. // 样品测量功能
  1322. public void InitMeasureThread()
  1323. {
  1324. if (m_MsrThread == null)
  1325. {
  1326. m_MsrThread = new CMsrThread();
  1327. m_MsrThread.Init(m_ProjDataMgr);
  1328. }
  1329. m_MsrThread.GetMeasureAppFormName(m_MeasureAppFrom.Text );//set appName to underlying c++ program.
  1330. }
  1331. //初始化测量样品
  1332. public bool InitMeasureSample()
  1333. {
  1334. m_MsrThread.Init(m_ProjDataMgr);
  1335. m_MsrThread.GetMeasureAppFormName(m_MeasureAppFrom.Name );//set appName to underlying c++ program.
  1336. return true;
  1337. }
  1338. public bool InitHolePreview()
  1339. {
  1340. if (!m_MsrThread.Init(m_ProjDataMgr, m_ProjDataMgr.GetSampleList()))
  1341. {
  1342. return false;
  1343. }
  1344. m_MsrThread.GetMeasureAppFormName(m_MeasureAppFrom.Name );
  1345. return true;
  1346. }
  1347. // 开始获取样品孔中的照片
  1348. public void DoHolePreview(int m_HoleID, CDomain c_DomainMessure)
  1349. {
  1350. m_MsrThread.DoHolePreview(m_HoleID, c_DomainMessure);
  1351. }
  1352. // 开始样品测量
  1353. public void DoMeasure()
  1354. {
  1355. m_MsrThread.DoMeasure();
  1356. }
  1357. //停止测量
  1358. public void SetMeasureThreadStatus(MSR_THREAD_STATUS ThreadStatus)
  1359. {
  1360. //设置测量线程状态
  1361. m_MsrThread.SetMsrLoopStatus((otsdataconst.OTS_MSR_THREAD_STATUS)ThreadStatus);
  1362. }
  1363. //保存测量样品的
  1364. public bool SaveMeasureSampleInfo()
  1365. {
  1366. m_ProjDataMgr = GetNewProjMgr();
  1367. if (null == m_ProjDataMgr)
  1368. {
  1369. return false;
  1370. }
  1371. log.Trace(" m_ProjDataMgr.GetSampleList().Count = " + m_ProjDataMgr.GetSampleList().Count.ToString());
  1372. if (!m_ProjDataMgr.Save())
  1373. {
  1374. return false;
  1375. }
  1376. return true;
  1377. }
  1378. //获取测量Sample的开始时间
  1379. public bool GetMsrSampleStartTime(ref DateTime MsrFieldStartTime)
  1380. {
  1381. COTSSample WSample = m_ProjDataMgr.GetWorkingSample();
  1382. if (null == WSample)
  1383. {
  1384. return false;
  1385. }
  1386. MsrFieldStartTime = (DateTime)WSample.GetMsrStatus().GetStartTime();
  1387. return true;
  1388. }
  1389. //获取测量已用时间
  1390. public bool GetMsrSampleUsedTime(ref TimeSpan TUsedTime)
  1391. {
  1392. COTSSample WSample = m_ProjDataMgr.GetWorkingSample();
  1393. if (null == WSample)
  1394. {
  1395. return false;
  1396. }
  1397. TUsedTime = (TimeSpan)WSample.GetMsrStatus().GetUsedTime();
  1398. return true;
  1399. }
  1400. //获取新的工作文件对象
  1401. public COTSProjMgrFile GetNewProjMgr()
  1402. {
  1403. if (null == m_MsrThread)
  1404. {
  1405. return null; ;
  1406. }
  1407. return m_MsrThread.GetProjMgrFile();
  1408. }
  1409. // 获取测量结果信息
  1410. public bool GetMsrRetData(ref SMSR_COMPLETE_DATA MsrCompleteData)
  1411. {
  1412. try
  1413. {
  1414. COTSSample WSample = m_ProjDataMgr.GetWorkingSample();
  1415. if (null == WSample)
  1416. {
  1417. return false;
  1418. }
  1419. List<COTSSample> MeasureCompleteSampleList = new List<COTSSample>();
  1420. if (!m_ProjDataMgr.GetMsredSampleList(ref MeasureCompleteSampleList))
  1421. {
  1422. return false;
  1423. }
  1424. if (null == m_MsrThread)
  1425. {
  1426. return false;
  1427. }
  1428. DateTime DTime = new DateTime();
  1429. if (m_MsrThread.GetMsrThreadStatus() == null)
  1430. {
  1431. return false;
  1432. }
  1433. if (m_MsrThread.GetMsrThreadStatus().GetStartTime() == null)
  1434. {
  1435. return false;
  1436. }
  1437. DTime = (DateTime)m_MsrThread.GetMsrThreadStatus().GetStartTime();
  1438. MsrCompleteData.csMsrStartTime = DTime.ToString("yyyy-MM-dd HH:mm:ss");
  1439. MsrCompleteData.MsrUsedTime = (TimeSpan)m_MsrThread.GetMsrThreadStatus().GetUsedTime();
  1440. DTime = (DateTime)m_MsrThread.GetMsrThreadStatus().GetEndTime();
  1441. MsrCompleteData.csMsrEndTime = DTime.ToString("yyyy-MM-dd HH:mm:ss");
  1442. MsrCompleteData.iMsrCompleteSampleCount = MeasureCompleteSampleList.Count();
  1443. MsrCompleteData.iMsrCompleteFieldCount = 0;
  1444. MsrCompleteData.iParticleCount = 0;
  1445. for (int i = 0; i < MsrCompleteData.iMsrCompleteSampleCount; i++)
  1446. {
  1447. MsrCompleteData.iMsrCompleteFieldCount += MeasureCompleteSampleList[i].GetMsrStatus().GetCompletedFields();
  1448. List<CMsrResultItem> MsrRetClr = MeasureCompleteSampleList[i].GetMsrResults().GetResultItems();
  1449. for (int k = 0; k < MsrRetClr.Count; k++)
  1450. {
  1451. MsrCompleteData.iParticleCount += (int)MsrRetClr[k].GetNumber();
  1452. }
  1453. }
  1454. return true;
  1455. }
  1456. catch (Exception ex)
  1457. {
  1458. log.Error("(OTSDataMgrFun.GetMsrRetData) Exception:"+ex.ToString());
  1459. return false;
  1460. }
  1461. }
  1462. // 获取测量样品中之前已经测量完成Field帧图,(上一次未测量完成继续测试)
  1463. public bool GetBeforeCompleteField(ref string MsrSampleName, ref List<Point> FieldList)
  1464. {
  1465. COTSSample WSample = m_ProjDataMgr.GetWorkingSample();
  1466. if (null == WSample)
  1467. {
  1468. return false;
  1469. }
  1470. MsrSampleName = WSample.GetName();
  1471. FieldList = WSample.GetMsrStatus().GetCpltedCenter();
  1472. return true;
  1473. }
  1474. // 当TREEVIEW 的样品参数锁状态发生变化后,Solution 需要将样品参数锁状态发送给MeasureApp更新新的样品参数锁状态
  1475. // string sSampleName : 样品参数锁对应的样品名
  1476. //bool bParaLockFlag: 样品新的排列顺序;
  1477. public bool SetSampleLockPara(string sSampleName, bool bFlag)
  1478. {
  1479. return true;
  1480. }
  1481. /// <summary>
  1482. /// 通过样品孔信息 返回默认测量区域大小
  1483. /// </summary>
  1484. /// <param name="cHoleClr"></param>
  1485. /// <returns></returns>
  1486. public Rectangle CalculateMsrArea(string cHoleName)
  1487. {
  1488. CHole cHoleClr = null;
  1489. foreach (CHole item in m_ProjDataMgr.GetStage().GetHoleList())
  1490. {
  1491. if (item.GetName() == cHoleName)
  1492. {
  1493. cHoleClr = item;
  1494. }
  1495. }
  1496. CDomain CDomain = m_ProjDataMgr.CalculateMsrArea(cHoleClr);
  1497. return (Rectangle)CDomain.GetRectDomain();
  1498. }
  1499. /// <summary>
  1500. /// 获取已完成测量的结果文件路径
  1501. /// </summary>
  1502. /// <param name="mrFilePathList">返回测量结果文件路径</param>
  1503. /// <returns></returns>
  1504. public bool GetCompletedMeasureFileName(ref List<string> mrFilePathList)
  1505. {
  1506. //测量文件路径
  1507. string proFilePath = m_ProjDataMgr.GetPathName();
  1508. //样品列表
  1509. List<COTSSample> sampleList = m_ProjDataMgr.GetSampleList();
  1510. //获取样品数量
  1511. int sampleCount = sampleList.Count;
  1512. string mrSuffix = ".rst";
  1513. int existsCount = 0;
  1514. //获取测量文件路径
  1515. if (proFilePath.Equals("Untitled"))
  1516. {
  1517. return false;
  1518. }
  1519. string mrFolderPath = string.Empty;
  1520. try
  1521. {
  1522. mrFolderPath = proFilePath.Substring(0, proFilePath.LastIndexOf("\\"));
  1523. }
  1524. catch (Exception)
  1525. {
  1526. mrFolderPath = string.Empty;
  1527. }
  1528. for (int sampleIndex = 0; sampleIndex < sampleCount; sampleIndex++)
  1529. {
  1530. int CompleteFieldsCount=sampleList[sampleIndex].GetMsrStatus().GetCompletedFields();
  1531. //如果样品已测量成功后再加载至报告程序中
  1532. if (CompleteFieldsCount > 0)
  1533. {
  1534. string sampleName = sampleList[sampleIndex].GetName();
  1535. string mrFilePath = mrFolderPath + "\\" + sampleName + "\\" + sampleName + mrSuffix;
  1536. //判断文件是否存在
  1537. if (File.Exists(mrFilePath))
  1538. {
  1539. if (mrFilePathList != null)
  1540. {
  1541. mrFilePathList.Add(mrFilePath);
  1542. }
  1543. existsCount++;
  1544. }
  1545. }
  1546. }
  1547. if (existsCount > 0)
  1548. {
  1549. return true;
  1550. }
  1551. return false;
  1552. }
  1553. internal bool ReClassify()
  1554. {
  1555. if (m_ProjDataMgr != null)
  1556. {
  1557. return m_ProjDataMgr.ReClassify();
  1558. }
  1559. return false;
  1560. }
  1561. /// <summary>
  1562. /// 获取工作样品的测量状态
  1563. /// </summary>
  1564. /// <param name="workingSampleName"></param>
  1565. /// <returns></returns>
  1566. public bool GetWorkSampleMeasureStatus()
  1567. {
  1568. bool reuslt = false;
  1569. COTSSample COTSSample = m_ProjDataMgr.GetWorkingSample();
  1570. int sampleStatus = COTSSample.GetMsrStatus().GetCompletedFields();
  1571. if (sampleStatus > 0)
  1572. {
  1573. reuslt = true;
  1574. }
  1575. return reuslt;
  1576. }
  1577. }
  1578. public class OTSBSEImageFun
  1579. {
  1580. OTSIncAMeasureAppForm m_MsrApp = null;
  1581. NLog.Logger log = NLog.LogManager.GetCurrentClassLogger();
  1582. public OTSBSEImageFun(OTSIncAMeasureAppForm MsrApp)
  1583. {
  1584. m_MsrApp = MsrApp;
  1585. }
  1586. public int GetScanImage(int iWidth, int iHeigh, ref byte[] bImageData)
  1587. {
  1588. //电镜设置对象
  1589. COTSControlFunExport cfun = new COTSControlFunExport();
  1590. int GetImgCount = 0;
  1591. try
  1592. {
  1593. //连接电镜
  1594. bool IsConnec = cfun.ConncetSem();
  1595. if (!IsConnec)
  1596. {
  1597. string strErrorInfo = "(OTSBSEImageFun.GetScanImage) cfun.ConncetSem() = false Failed";
  1598. log.Error(strErrorInfo);
  1599. return 0;
  1600. }
  1601. //实例电镜初始化
  1602. bool IsScan = cfun.ScanInit();
  1603. if (!IsScan)
  1604. {
  1605. string strErrorInfo = "(OTSBSEImageFun.GetScanImage) cfun.ScanInit = false Failed";
  1606. log.Error(strErrorInfo);
  1607. return 0;
  1608. }
  1609. int a_ExternalMode = 0;
  1610. //获取终止模式
  1611. a_ExternalMode = cfun.GetSemExternalMode();
  1612. //保存初始模式变量
  1613. int a_oldMode = 0;
  1614. //获取初始模式
  1615. if (!cfun.GetSemScanMode(ref a_oldMode))
  1616. {
  1617. string strErrorInfo = "(OTSBSEImageFun.GetScanImage) cfun.GetSemScanMode = false Failed";
  1618. log.Error(strErrorInfo);
  1619. return 0;
  1620. }
  1621. //设置当前模式
  1622. if (!cfun.SetSemScanMode(a_ExternalMode))
  1623. {
  1624. string strErrorInfo = "(OTSBSEImageFun.GetScanImage) cfun.SetSemScanMode = false Failed";
  1625. log.Error(strErrorInfo);
  1626. return 0;
  1627. }
  1628. #region BeamBlank
  1629. int a_nBeamBlank = 0;
  1630. //获取参数
  1631. if (!cfun.GetSemBeamBlank(ref a_nBeamBlank))
  1632. {
  1633. cfun.SetSemScanMode(a_oldMode);
  1634. string strErrorInfo = "(OTSBSEImageFun.GetScanImage) cfun.GetSemBeamBlank = false Failed";
  1635. log.Error(strErrorInfo);
  1636. return 0;
  1637. }
  1638. //设置参数
  1639. if (!cfun.SetSemBeamBlank(0))
  1640. {
  1641. cfun.SetSemScanMode(a_oldMode);
  1642. string strErrorInfo = "(OTSBSEImageFun.GetScanImage) cfun.SetSemBeamBlank = false Failed";
  1643. log.Error(strErrorInfo);
  1644. return 0;
  1645. }
  1646. #endregion
  1647. #region 获得放大倍数
  1648. //获得放大倍数
  1649. double a_dMagnification = 0;
  1650. //获取参数
  1651. if (!cfun.GetSemMagnification(ref a_dMagnification))
  1652. {
  1653. cfun.SetSemScanMode(a_oldMode);
  1654. string strErrorInfo = "(OTSBSEImageFun.GetScanImage) cfun.GetSemMagnification = false Failed";
  1655. log.Error(strErrorInfo);
  1656. return 0;
  1657. }
  1658. #endregion
  1659. #region 获取 电镜 X、Y轴 与角度
  1660. //获取 电镜 X、Y轴 与角度
  1661. double PositionX = 0;
  1662. double PositionY = 0;
  1663. double PositionR = 0;
  1664. //获取参数
  1665. if (!cfun.GetSemPositionXY(ref PositionX, ref PositionY, ref PositionR))
  1666. {
  1667. cfun.SetSemScanMode(a_oldMode);
  1668. string strErrorInfo = "(OTSBSEImageFun.GetScanImage) cfun.GetSemPositionXY = false Failed";
  1669. log.Error(strErrorInfo);
  1670. return 0;
  1671. }
  1672. #endregion
  1673. #region 设置图像分辨率
  1674. //设置宽度
  1675. if (!cfun.SetImageSize(iWidth))
  1676. {
  1677. cfun.SetSemScanMode(a_oldMode);
  1678. string strErrorInfo = "(OTSBSEImageFun.GetScanImage) cfun.SetImageSize = false Failed";
  1679. log.Error(strErrorInfo);
  1680. return 0;
  1681. }
  1682. #endregion
  1683. #region 采集时间
  1684. //采集时间
  1685. int nDwellTime = 4;
  1686. if (!cfun.SetDwellTime(nDwellTime))
  1687. {
  1688. cfun.SetSemScanMode(a_oldMode);
  1689. string strErrorInfo = "(OTSBSEImageFun.GetScanImage) cfun.SetDwellTime = false Failed";
  1690. log.Error(strErrorInfo);
  1691. return 0;
  1692. }
  1693. #endregion
  1694. #region MatrixSize
  1695. //获得放大倍数
  1696. int a_MatrixSize = 0;
  1697. Size size = new Size();
  1698. //获取参数
  1699. size = cfun.GetMatrixSize(a_MatrixSize);
  1700. size = cfun.GetMatrixSize(a_MatrixSize);
  1701. #endregion
  1702. //获取图像数据
  1703. int resultCount = iWidth * iHeigh;
  1704. GetImgCount = cfun.AcquireBSEImage(0, 0, 0, ref bImageData);
  1705. //记录日志
  1706. if (resultCount == GetImgCount)
  1707. {
  1708. //设置为原始 扫描模式
  1709. cfun.SetSemScanMode(a_oldMode);
  1710. //Scan类结束
  1711. //初始化电镜参数
  1712. if (!cfun.SetAndStartScan())
  1713. {
  1714. return 0;
  1715. }
  1716. }
  1717. else
  1718. {
  1719. cfun.SetSemScanMode(a_oldMode);
  1720. string strErrorInfo = "(OTSBSEImageFun.GetScanImage) cfun.AcquireBSEImage = 0 Failed";
  1721. log.Error(strErrorInfo);
  1722. //初始化电镜参数
  1723. if (!cfun.SetAndStartScan())
  1724. {
  1725. return 0;
  1726. }
  1727. }
  1728. }
  1729. catch (Exception ex)
  1730. {
  1731. //记录日志
  1732. log.Error(ex.Message.ToString());
  1733. string strErrorInfo = "(OTSBSEImageFun.GetScanImage) Exception Error Happend";
  1734. log.Error(strErrorInfo);
  1735. }
  1736. finally
  1737. {
  1738. cfun.ScanFinishedInstance();
  1739. cfun.DisConnectSem();
  1740. cfun.FreeDll();
  1741. }
  1742. return GetImgCount;
  1743. }
  1744. }
  1745. }