frmMeasureRstMgr.cs 34 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957
  1. using DevExpress.CodeParser;
  2. using DevExpress.XtraCharts.Native;
  3. using DevExpress.XtraEditors.Filtering;
  4. using Microsoft.Office.Core;
  5. using OTS.WinFormsUI.Docking;
  6. using OTSCLRINTERFACE;
  7. using OTSCommon;
  8. using OTSCommon.DBOperate.Model;
  9. using OTSIncAReportApp.OTSRstMgrFunction;
  10. using OTSIncAReportApp.OTSSampleReportInfo;
  11. using OTSIncAReportApp.SysMgrTools;
  12. using OTSModelSharp;
  13. using OTSModelSharp.DTLBase;
  14. using System;
  15. using System.Collections;
  16. using System.Collections.Generic;
  17. using System.Drawing;
  18. using System.IO;
  19. using System.Runtime.InteropServices;
  20. using System.Text.RegularExpressions;
  21. using System.Windows.Forms;
  22. using static DevExpress.CodeParser.CodeStyle.Formatting.Rules.LineBreaks;
  23. using static DevExpress.XtraCharts.GLGraphics.GL;
  24. using static OTSDataType.otsdataconst;
  25. namespace OTSIncAReportApp
  26. {
  27. /// <summary>
  28. /// 显示测量结果树控件主窗体
  29. /// </summary>
  30. public partial class frmMeasureRstMgr : DockContent
  31. {
  32. #region 变量定义
  33. /// <summary>
  34. /// 主框架窗体,全局变量
  35. /// </summary>
  36. private frmReportApp m_ReportApp = null;
  37. private frmReportConditionChoose m_ConditionChoose;
  38. private ResultDataMgr m_RstDataMgr;
  39. /// <summary>
  40. /// 树窗口类
  41. /// </summary>
  42. private OTSTreeViewData m_TreeViewData = null;
  43. /// <summary>
  44. /// 测量结果样品节点
  45. /// </summary>
  46. public TreeNode m_WorkSampleNode = null;
  47. /// <summary>
  48. /// 工作样品属性参数
  49. /// </summary>
  50. public CTreeSampleRst m_WorkSampleParam = new CTreeSampleRst();
  51. /// <summary>
  52. /// 当前工作样品名
  53. /// </summary>
  54. private String m_WorkSampleName = "";
  55. /// <summary>
  56. /// 当前鼠标点击节点
  57. /// </summary>
  58. int treeNodeSample = -1;
  59. Hashtable table;
  60. #endregion
  61. #region 构造函数和窗体加载
  62. /// <summary>
  63. /// 构造函数
  64. /// </summary>
  65. /// <param name="reportApp"></param>
  66. public frmMeasureRstMgr(frmReportApp reportApp)
  67. {
  68. InitializeComponent();
  69. m_ReportApp = reportApp;
  70. m_ConditionChoose = reportApp.m_conditionChoose;
  71. m_RstDataMgr = reportApp.m_rstDataMgr;
  72. m_TreeViewData = new OTSTreeViewData(this);
  73. #region 国际化语言
  74. OTSCommon.Language lan = new OTSCommon.Language(this);
  75. table = lan.GetNameTable(this.Name);
  76. #endregion
  77. }
  78. /// <summary>
  79. /// 窗体加载
  80. /// </summary>
  81. /// <param name="sender"></param>
  82. /// <param name="e"></param>
  83. private void OTSMeasureRetMgrWindow_Load(object sender, EventArgs e)
  84. {
  85. treeView1.LabelEdit = true;//TreeView可编辑状态。
  86. }
  87. #endregion
  88. #region 外部接口函数及相关常量定义
  89. /// <summary>
  90. /// 发送消息
  91. /// </summary>
  92. /// <param name="hWnd"></param>
  93. /// <param name="Msg"></param>
  94. /// <param name="wParam"></param>
  95. /// <param name="lParam"></param>
  96. /// <returns></returns>
  97. [DllImport("user32.dll", CharSet = CharSet.Auto)]
  98. private static extern IntPtr SendMessage(IntPtr hWnd, int Msg, IntPtr wParam, ref TVITEM lParam);
  99. private const int TVIF_STATE = 0x8;
  100. private const int TVIS_STATEIMAGEMASK = 0xF000;
  101. private const int TV_FIRST = 0x1100;
  102. private const int TVM_SETITEM = TV_FIRST + 63;
  103. [StructLayout(LayoutKind.Sequential, Pack = 8, CharSet = CharSet.Auto)]
  104. private struct TVITEM
  105. {
  106. public int mask;
  107. public IntPtr hItem;
  108. public int state;
  109. public int stateMask;
  110. [MarshalAs(UnmanagedType.LPTStr)]
  111. public string lpszText;
  112. public int cchTextMax;
  113. public int iImage;
  114. public int iSelectedImage; public int cChildren; public IntPtr lParam;
  115. }
  116. #endregion
  117. #region 树控件相关事件
  118. /// <summary>
  119. /// 树控件点击是否选择右键
  120. /// </summary>
  121. /// <param name="sender"></param>
  122. /// <param name="e"></param>
  123. private void treeView1_Click(object sender, MouseEventArgs e)
  124. {
  125. if (e.Button == MouseButtons.Right)//判断你点的是不是右键
  126. {
  127. contextMenuStrip1.Show();
  128. }
  129. }
  130. /// <summary>
  131. /// 左键选择树节点事件
  132. /// </summary>
  133. /// <param name="sender"></param>
  134. /// <param name="e"></param>
  135. private void treeView1_AfterSelect(object sender, TreeViewEventArgs e)
  136. {
  137. //鼠标选中
  138. if (e.Action == TreeViewAction.ByMouse || e.Action == TreeViewAction.ByKeyboard)
  139. {
  140. if (e.Node.IsSelected)
  141. {
  142. //判断的选中的CHECKBOX和焦点都在当前被选择的节点上,切换当前工作样品
  143. m_WorkSampleNode = e.Node;
  144. treeView1.SelectedNode = e.Node; //当前被选中
  145. treeView1.Refresh();
  146. }
  147. }
  148. }
  149. /// <summary>
  150. /// 当Checkbox的状态发生变化时,响应事件
  151. /// </summary>
  152. /// <param name="sender"></param>
  153. /// <param name="e"></param>
  154. private void treeView1_AfterCheck(object sender, TreeViewEventArgs e)
  155. {
  156. if (e.Action == TreeViewAction.ByMouse)
  157. { //判断是否由鼠标触发的
  158. TreeNode TN = e.Node;//点击的节点
  159. if (TN.Checked)
  160. { //若是选中,遍历父节点,所属的父节点应为选中 {
  161. if (TN.Parent != null)
  162. {
  163. TN.Parent.Checked = true;
  164. if (TN.Parent.Parent != null)
  165. {
  166. TN.Parent.Parent.Checked = true;
  167. }
  168. }
  169. DG_Check(TN, true); //本身节点之下还有子节点,遍历,全选中
  170. }
  171. else
  172. { //若是取消选中
  173. DG_Check(TN, false);//本身节点之下还有子节点,遍历,全取消选中
  174. if (TN.Parent != null)
  175. {
  176. //若有父节点,判断此次取消选中后,是否兄弟节点也是没选中
  177. TreeNode TNP = TN.Parent;
  178. bool YXZ = false;//有选中的,以此来判断否兄弟节点也是没选中
  179. foreach (TreeNode childTN in TNP.Nodes)
  180. {
  181. if (childTN.Checked)
  182. {
  183. YXZ = true;//还有选中的兄弟节点
  184. break;
  185. }
  186. }
  187. TNP.Checked = YXZ;//将遍历结果赋给父节点
  188. }
  189. }
  190. }
  191. }
  192. /// <summary>
  193. /// 删除测量结果事件
  194. /// </summary>
  195. /// <param name="sender"></param>
  196. /// <param name="e"></param>
  197. private void RDeleteNode_Click(object sender, EventArgs e)
  198. {
  199. TreeNode tn = new TreeNode();
  200. tn = treeView1.SelectedNode;
  201. tn.Remove();
  202. }
  203. /// <summary>
  204. /// 显示树节点
  205. /// </summary>
  206. /// <param name="sender"></param>
  207. /// <param name="e"></param>
  208. private void treeView1_DrawNode(object sender, DrawTreeNodeEventArgs e)
  209. {
  210. e.DrawDefault = true;
  211. }
  212. /// <summary>
  213. /// 当鼠标点击选择了
  214. /// </summary>
  215. /// <param name="sender"></param>
  216. /// <param name="e"></param>
  217. public void TreeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
  218. {
  219. TreeNode tn = (TreeNode)e.Node;
  220. treeNodeSample = e.Node.Index;
  221. string treeNodeName = e.Node.Text;
  222. //正常indexadd值应该哪个为true哪个给它
  223. int indexadd = e.Node.Index;
  224. string checkednode = "";
  225. foreach (TreeNode item in treeView1.Nodes)
  226. {
  227. if (item.Checked)
  228. {
  229. checkednode = checkednode + "+" + item.Text;
  230. }
  231. }
  232. if (checkednode.LastIndexOf("+") > 1)
  233. {
  234. checkednode = checkednode.Substring(1);
  235. }
  236. else
  237. {
  238. checkednode = "";
  239. }
  240. if (treeView1.Nodes.Count>1&&e.Button == MouseButtons.Left)//判断按下鼠标右键
  241. {
  242. //插入多数据源选项
  243. m_ReportApp.MoreSource = checkednode;
  244. m_ConditionChoose.SetDefaultConditionValue();
  245. m_ConditionChoose.DisCurrentPicProperty();//刷新
  246. }
  247. if (e.Button == MouseButtons.Right)//判断按下鼠标右键
  248. {
  249. Point ClickPoint = new Point(e.X, e.Y);
  250. TreeNode CurrentNode = treeView1.GetNodeAt(ClickPoint);
  251. if (CurrentNode == null && null == CurrentNode.Parent)//判断选择的是不是一个节点
  252. {
  253. CurrentNode.ContextMenuStrip = contextMenuStrip2;
  254. }
  255. else
  256. {
  257. CurrentNode.ContextMenuStrip = contextMenuStrip1;
  258. m_WorkSampleNode = CurrentNode;
  259. }
  260. }
  261. this.Focus();
  262. }
  263. public void AddSampleResult(string str_path)
  264. {
  265. if (m_RstDataMgr.AddDataResult(str_path))
  266. {
  267. m_ConditionChoose.SetDefaultConditionValue();
  268. m_ConditionChoose.GetWorkingPictureConditionVal();
  269. m_ReportApp.m_RstWindow.Show(m_ReportApp.DockWindowPanel);
  270. //在treeview上添加测量结果
  271. m_TreeViewData.DisplayWorkSampleTree(this.m_RstDataMgr.ResultFilesList);
  272. //在grid上添加测量结果
  273. m_ConditionChoose.DisCurrentPicProperty();
  274. //根据标签索引 显示默认的数据图表for test
  275. m_ConditionChoose.ShowsTheDefaultPic();//显示图表
  276. }
  277. else
  278. {
  279. m_TreeViewData.DisplayWorkSampleTree(this.m_RstDataMgr.ResultFilesList);
  280. m_ConditionChoose.SetDefaultConditionValue();
  281. m_ConditionChoose.DisCurrentPicProperty();
  282. }
  283. }
  284. /// <summary>
  285. /// 树节点删除事件
  286. /// </summary>
  287. /// <param name="sender"></param>
  288. /// <param name="e"></param>
  289. private void RDeleteNode_Click_1(object sender, EventArgs e)
  290. {
  291. RemoveSample();
  292. }
  293. //ReportApp窗口给 RetMgrWindow 发送窗口删除样品回复
  294. public void RemoveSample()
  295. {
  296. if (this.treeView1.SelectedNode == null) return;
  297. string str1 = table["str1"].ToString();
  298. string str2 = table["str2"].ToString();
  299. string sDeleteSampleName = str1;
  300. var sDeletSName = this.treeView1.SelectedNode.Text;
  301. sDeleteSampleName += sDeletSName;
  302. sDeleteSampleName += str2;
  303. if (DialogResult.OK == MessageBox.Show(sDeleteSampleName, "Tip", MessageBoxButtons.OKCancel, MessageBoxIcon.Warning))
  304. {
  305. //删除当前选中的节点
  306. treeView1.Nodes.Remove(this.treeView1.SelectedNode); //移除当前工作样品
  307. if ("" == sDeletSName)
  308. {
  309. return;
  310. }
  311. //重新获取Treeview上的工作样品节点
  312. this.m_TreeViewData.GetTreeWorkSampleNode(sDeletSName);
  313. //设置工作样品焦点
  314. this.m_TreeViewData.ReSetWorkSampleFoucs();
  315. //当节点全部删除完时刷新树以及主窗口的控件
  316. if (treeView1.Nodes.Count == 0)
  317. {
  318. //treeView1.Nodes.Clear();
  319. //如果已经没有测量结果,则将报告程序初始化到刚打开的状态
  320. m_ReportApp.InitReportProState();
  321. m_ReportApp.m_StandardLibrary.DataDeletion();
  322. }
  323. else
  324. {
  325. //重新加载grid窗口
  326. m_ConditionChoose.DisCurrentPicProperty();
  327. //删除树上的节点
  328. m_WorkSampleName = m_ReportApp.m_rstDataMgr.GetSampleName();
  329. m_TreeViewData.GetTreeWorkSampleNode(m_WorkSampleName);
  330. }
  331. }
  332. m_RstDataMgr.RemoveDataResult(sDeletSName);
  333. var rstlist = m_ConditionChoose.m_conditionData.GetComboDownListByItemName(OTS_REPORT_PROP_GRID_ITEMS.DATA_SOURCE);
  334. rstlist.Remove(sDeletSName);
  335. m_ConditionChoose.m_conditionData.SetComboDownListByItemName(OTS_REPORT_PROP_GRID_ITEMS.DATA_SOURCE, rstlist);
  336. if (rstlist.Count > 0)
  337. {
  338. m_ConditionChoose.m_conditionData.SetPropByPropItemName(OTS_REPORT_PROP_GRID_ITEMS.DATA_SOURCE, rstlist[0]);
  339. m_ConditionChoose.m_conditionData.SetItemvalByItemName(OTS_REPORT_PROP_GRID_ITEMS.DATA_SOURCE, 0);
  340. }
  341. m_ConditionChoose.DisCurrentPicProperty();
  342. }
  343. //切换当前工作样品
  344. //string sNewWorkSample : 新的工作样品名
  345. public void MeasureApp_SwitchSample(string sNewName)
  346. {
  347. m_TreeViewData.SetNewWorkSample(sNewName);
  348. }
  349. #endregion
  350. #region 相关树控件方法
  351. //是否为选择工作样品的节点(窗口切换)
  352. public void SelectWorkSampleNode()
  353. {
  354. try
  355. {
  356. //是否添加结果文件
  357. if (m_RstDataMgr.ResultFilesList.Count != 0)
  358. {
  359. if (m_RstDataMgr.GetWorkingResultId() != -1)
  360. if (m_RstDataMgr.ResultFilesList[m_RstDataMgr.GetWorkingResultId()] != null)
  361. {
  362. string workSampleName = m_RstDataMgr.ResultFilesList[m_RstDataMgr.GetWorkingResultId()].anotherFileName;
  363. //设置工作样品
  364. if (m_ReportApp.m_RstWindow.treeView1.Nodes.Count > 0)
  365. {
  366. foreach (TreeNode item in m_ReportApp.m_RstWindow.treeView1.Nodes)
  367. {
  368. //设置选择TreeNode
  369. if (item.Text == workSampleName)
  370. {
  371. m_ReportApp.m_RstWindow.treeView1.SelectedNode = item;
  372. break;
  373. }
  374. }
  375. }
  376. }
  377. }
  378. }
  379. catch (Exception)
  380. {
  381. }
  382. }
  383. /// <summary>
  384. /// 设置树控件各节点的状态
  385. /// </summary>
  386. /// <param name="TN"></param>
  387. /// <param name="flag"></param>
  388. private void DG_Check(TreeNode TN, bool flag)
  389. {
  390. if (TN.Nodes.Count > 0)
  391. {
  392. foreach (TreeNode childTN in TN.Nodes)
  393. {
  394. childTN.Checked = flag;
  395. DG_Check(childTN, flag);
  396. }
  397. }
  398. }
  399. /// <summary>
  400. /// 隐藏树节点,复选框
  401. /// </summary>
  402. /// <param name="tvw"></param>
  403. /// <param name="node"></param>
  404. public void HideCheckBox(TreeView tvw, TreeNode node)
  405. {
  406. TVITEM tvi = new TVITEM();
  407. tvi.hItem = node.Handle;
  408. tvi.mask = TVIF_STATE;
  409. tvi.stateMask = TVIS_STATEIMAGEMASK;
  410. tvi.state = 0;
  411. SendMessage(tvw.Handle, TVM_SETITEM, IntPtr.Zero, ref tvi);
  412. }
  413. #endregion
  414. #region 多数据源操作部份相关
  415. private void button1_Click(object sender, EventArgs e)
  416. {
  417. frmMultiSourceSelect frm_Mss = new frmMultiSourceSelect(this.treeView1);
  418. if (frm_Mss.ShowDialog() == DialogResult.OK)
  419. {
  420. //判断是否选择了两个以上的选项,
  421. int iselectcount = 0;
  422. //第一次更新各选项值
  423. for (int i = 0; i < frm_Mss.treeView1.Nodes.Count; i++)
  424. {
  425. this.treeView1.Nodes[i].Checked = frm_Mss.treeView1.Nodes[i].Checked;
  426. if (frm_Mss.treeView1.Nodes[i].Checked == true)
  427. {
  428. iselectcount++;
  429. }
  430. }
  431. //主动去更新让其选择上多数据源或非多数据源
  432. if (iselectcount >= 2)
  433. {
  434. //获取
  435. //OTSSampleMeaInfo SMInfo = new OTSSampleMeaInfo();
  436. //DataMgrFun dataMgr = m_ReportApp.m_DataMgrFun;
  437. //dataMgr.SetSampleParamVal(OTS_RETORT_PROP_GRID_ITEMS.DATA_SOURCE, OTS_ITEM_TYPES.COMBO, 0);
  438. //获取属性窗口更新显示
  439. //dataMgr.GetWorkSamplePropertyVal(ref SMInfo);
  440. //m_ReportApp.m_PropWindow.DisProperyWindow(SMInfo);
  441. //显示默认的图表
  442. //m_ReportApp.m_PropWindow.m_SampleGrid.ShowDataDiagram();
  443. }
  444. else
  445. {
  446. //单一选项时,也要对该属性窗口进行切换
  447. for (int i = 0; i < frm_Mss.treeView1.Nodes.Count; i++)
  448. {
  449. if (frm_Mss.treeView1.Nodes[i].Checked == true)
  450. {
  451. //OTSSampleMeaInfo SMInfo = new OTSSampleMeaInfo();
  452. //DataMgrFun dataMgr = m_ReportApp.m_DataMgrFun;
  453. //dataMgr.SetSampleParamVal(OTS_RETORT_PROP_GRID_ITEMS.DATA_SOURCE, OTS_ITEM_TYPES.COMBO, i);
  454. ////获取属性窗口更新显示
  455. //dataMgr.GetWorkSamplePropertyVal(ref SMInfo);
  456. //m_ReportApp.m_PropWindow.DisProperyWindow(SMInfo);
  457. ////显示默认的图表
  458. //m_ReportApp.m_PropWindow.m_SampleGrid.ShowDataDiagram();
  459. }
  460. }
  461. }
  462. }
  463. }
  464. #endregion
  465. private void 计算边界颗粒合成ToolStripMenuItem_Click(object sender, EventArgs e)
  466. {
  467. if (this.treeView1.SelectedNode == null) return;
  468. //string sDeleteSampleName = str1;
  469. var SampleName = this.treeView1.SelectedNode.Text;
  470. var resultfile= m_RstDataMgr.GetResultFileObjByName(SampleName);
  471. if (resultfile == null) return;
  472. ClearMergedParticles(resultfile.GetResultDBPath());
  473. var log = NLog.LogManager.GetCurrentClassLogger();
  474. log.Info("Merging big particles which are crossing the field edge!");
  475. this.Cursor = System.Windows.Forms.Cursors.WaitCursor;
  476. int scanfldsize = (int)resultfile.GetScanFieldSizeX();
  477. List<COTSParticleClr> mergedParticles = new List<COTSParticleClr>();
  478. double pixelSize = resultfile.GetPixelSize();
  479. Size s = new Size(resultfile.GetImageWidth(), resultfile.GetImageHeight());
  480. MergeBigBoundaryParticles(resultfile.GetList_OTSField(), pixelSize, scanfldsize, s, ref mergedParticles);
  481. var prm = new COTSImgProcPrmClr();
  482. //prm.SetOverlapParam(resultfile.get)
  483. OTSCLRINTERFACE.ImageProForClr imgpro = new OTSCLRINTERFACE.ImageProForClr(prm);
  484. foreach (COTSParticleClr part in mergedParticles)
  485. {
  486. imgpro.CalcuParticleImagePropertes(part, pixelSize);
  487. }
  488. string libname = resultfile.GetSTDName();
  489. string LibraryName = GetStandardLibraryName(resultfile);
  490. string MeasurementType = GetMeasurementType(resultfile);
  491. int steelTech = resultfile.GetIncASteeltech();
  492. //ClassifyParticle(mergedParticles, libname, m_ReportApp.m_RptConfigFile.Systype, steelTech);
  493. ClassifyParticle(mergedParticles, LibraryName, m_ReportApp.m_RptConfigFile.Systype, steelTech, Convert.ToInt16(MeasurementType));
  494. log.Info("begin merged particle data db saving...");
  495. SaveMergedParticles(mergedParticles,resultfile.GetResultDBPath());
  496. MessageBox.Show("边界颗粒合成完成!");
  497. this.Cursor = System.Windows.Forms.Cursors.Default;
  498. }
  499. /// <summary>
  500. /// 获取标准库名称
  501. /// </summary>
  502. /// <returns></returns>
  503. private string GetStandardLibraryName(ResultFile resultfile)
  504. {
  505. string LibraryName = "";
  506. string strSTDType = resultfile.GetSTDEngineType();
  507. string rstSTD = resultfile.GetSTDName();
  508. string[] result = Regex.Split(strSTDType, ":");
  509. if (result[0] == "-1")
  510. {
  511. if ("NoSTDDB" == rstSTD ||
  512. "NoSTDDB.db" == rstSTD)
  513. {
  514. LibraryName = "OTSIncASysSTD";
  515. }
  516. else
  517. {
  518. LibraryName = rstSTD;
  519. }
  520. }
  521. else
  522. if (result[0] == "0")
  523. {
  524. LibraryName = "OTSIncASysSTD";
  525. }
  526. else if (result[0] == "1")
  527. {
  528. if ("NoSTDDB" == rstSTD ||
  529. "NoSTDDB.db" == rstSTD)
  530. {
  531. LibraryName = "OTSIncASysSTD";
  532. }
  533. else
  534. {
  535. LibraryName = rstSTD;
  536. }
  537. }
  538. else if (result[0] == "2")
  539. {
  540. if ("NoSTDDB" == rstSTD ||
  541. "NoSTDDB.db" == rstSTD)
  542. {
  543. LibraryName = "OTSIncASysSTD";
  544. }
  545. else
  546. {
  547. //LibraryName.Add("OTSIncASysSTD+");
  548. LibraryName = rstSTD;
  549. }
  550. }
  551. else if (result[0] == "3")
  552. {
  553. if ("NoSTDDB" == rstSTD ||
  554. "NoSTDDB.db" == rstSTD)
  555. {
  556. LibraryName = "OTSIncASysSTD";
  557. }
  558. else
  559. {
  560. LibraryName = rstSTD;
  561. }
  562. }
  563. return LibraryName;
  564. }
  565. /// <summary>
  566. /// 测量结果类型
  567. /// </summary>
  568. /// <param name="resultfile"></param>
  569. /// <returns></returns>
  570. private string GetMeasurementType(ResultFile resultfile)
  571. {
  572. string strSTDType = resultfile.GetSTDEngineType();
  573. string rstSTD = resultfile.GetSTDName();
  574. string[] result = Regex.Split(strSTDType, ":");
  575. return result[0];
  576. }
  577. public bool MergeBigBoundaryParticles(List<OTSCommon.DBOperate.Model.Field> allFields, double pixelSize, int scanFieldSize, System.Drawing.Size ResolutionSize, ref List<COTSParticleClr> mergedParts)
  578. {
  579. List<COTSFieldDataClr> fldclrs = new List<COTSFieldDataClr>();
  580. var prm = new COTSImgProcPrmClr();
  581. ImageProForClr imgpro = new ImageProForClr(prm);
  582. foreach (var f in allFields)
  583. {
  584. COTSFieldDataClr fldclr = new COTSFieldDataClr();
  585. PointF p1 = f.GetOTSPosition();
  586. System.Drawing.Point p2 = new System.Drawing.Point((int)p1.X, (int)p1.Y);
  587. fldclr.SetPosition((int)p1.X, (int)p1.Y);
  588. fldclr.SetImageWidth(ResolutionSize.Width);
  589. fldclr.SetImageHeight(ResolutionSize.Height);
  590. var parts = f.ParticleList;
  591. foreach (var p in parts)
  592. {
  593. COTSParticleClr part = new COTSParticleClr();
  594. COTSFeatureClr fea = new COTSFeatureClr();
  595. List<COTSSegmentClr> segs = new List<COTSSegmentClr>();
  596. foreach (var s in p.SegmentList)
  597. {
  598. COTSSegmentClr seg = new COTSSegmentClr();
  599. seg.SetStart(s.Start);
  600. seg.SetHeight(s.Height);
  601. seg.SetLength(s.Length);
  602. segs.Add(seg);
  603. }
  604. fea.SetSegmentsList(segs,true);
  605. part.SetFeature(fea);
  606. var xray = part.GetXray();
  607. foreach (var ele in p.ElementList)
  608. {
  609. CElementChemistryClr eleclr = new CElementChemistryClr();
  610. eleclr.SetName(ele.Name);
  611. eleclr.SetPercentage(ele.Percentage);
  612. xray.AddQuantifyElement(eleclr);
  613. }
  614. part.SetFieldId(p.FieldId);
  615. part.SetAnalysisId(p.XrayId);
  616. part.SetParticleId(p.ParticleId);
  617. part.SetSEMPos(new Point(p.SEMPosX, p.SEMPosY));
  618. part.SetTypeId(p.TypeId);
  619. part.SetParticleRect(new Rectangle(p.RectLeft, p.RectTop, p.RectWidth, p.RectHeight));
  620. part.SetXray(xray);
  621. part.SetActualArea(p.Area);
  622. part.CalCoverRectFromSegment();
  623. part.CalXrayPos();
  624. fldclr.AddParticle(part);
  625. }
  626. fldclrs.Add(fldclr);
  627. }
  628. imgpro.MergeBigBoundaryParticles(fldclrs, pixelSize, scanFieldSize, ResolutionSize, mergedParts);
  629. return true;
  630. }
  631. private bool ClassifyParticle(List<COTSParticleClr> parts,string libname, OTS_SysType_ID systype,int steeltech,int type)
  632. {
  633. bool r = true;
  634. try
  635. {
  636. if (systype == OTS_SysType_ID.IncA)
  637. {
  638. r= COffLineClassifyLogic.ClassifyIncA(parts, libname,steeltech, type);
  639. }
  640. else if (systype == OTS_SysType_ID.TCCleannessA)
  641. {
  642. r= COffLineClassifyLogic.ClassifyCleannessA(parts, libname);
  643. }
  644. else if (systype == OTS_SysType_ID.BatteryCleannessA)
  645. {
  646. r = COffLineClassifyLogic.ClassifyCleannessA(parts, libname);
  647. }
  648. return r;
  649. }
  650. catch (Exception e)
  651. {
  652. NLog.LogManager.GetCurrentClassLogger().Error("merged parts classify failed. " + e.Message);
  653. return false;
  654. }
  655. }
  656. public bool SaveMergedParticles(List<COTSParticleClr> mergedParts,string dbfile)
  657. {
  658. CIncAFileMgr pDBFileMgr = new CIncAFileMgr(dbfile);
  659. var partdb = pDBFileMgr.GetIncADB();
  660. CPosXrayDBMgr pXrayDBMgr = pDBFileMgr.GetPosXrayDBMgr();
  661. CElementChemistryDB xraydb = pXrayDBMgr.GetElementChemistryDB();
  662. foreach (COTSParticleClr part in mergedParts)
  663. {
  664. partdb.SaveAParticle(part, part.GetXray());
  665. foreach (COTSParticleClr subpart in part.GetSubParticles())
  666. {
  667. partdb.UpdateIsSubParticleState(subpart);
  668. }
  669. }
  670. List<CPosXrayClr> ches = new List<CPosXrayClr>();
  671. foreach (COTSParticleClr part in mergedParts)
  672. {
  673. ches.Add(part.GetXray());
  674. }
  675. xraydb.SaveElementChemistriesList_Batch(ches);
  676. return true;
  677. }
  678. public bool ClearMergedParticles(string dbfile)
  679. {
  680. CIncAFileMgr pDBFileMgr = new CIncAFileMgr(dbfile);
  681. var partdb = pDBFileMgr.GetIncADB();
  682. partdb.ClearAllMergedParticles();
  683. return true;
  684. }
  685. private void ToolStripMenuItem_Zeroelementprocess_Click(object sender, EventArgs e)
  686. {
  687. if (this.treeView1.SelectedNode == null) return;
  688. var SampleName = this.treeView1.SelectedNode.Text;
  689. var resultfile = m_RstDataMgr.GetResultFileObjByName(SampleName);
  690. if (resultfile == null) return;
  691. var log = NLog.LogManager.GetCurrentClassLogger();
  692. log.Info("Start to Zeroelementprocess!");
  693. this.Cursor = System.Windows.Forms.Cursors.WaitCursor;
  694. List<COTSParticleClr> ParticleClrs = new List<COTSParticleClr>();
  695. ParticleClrs = GetParticleClrFromFields(resultfile.GetList_OTSField());
  696. if (m_ReportApp.m_RptConfigFile.Systype == OTS_SysType_ID.IncA)
  697. {
  698. string MeasurementType = GetMeasurementType(resultfile);
  699. if (MeasurementType =="0"|| MeasurementType=="1")
  700. {
  701. OTSCLRINTERFACE.COTSClassifyEngineClr EngineClr = new COTSClassifyEngineClr(EngineType.InclutionEng, "NoSTDDB");
  702. ParticleClrs = ZeroElementProcess(EngineClr, ParticleClrs);
  703. }
  704. //string libname = resultfile.GetSTDName();
  705. string libname = GetStandardLibraryName(resultfile);
  706. if (!libname.Contains(".db"))
  707. {
  708. libname += ".db";
  709. }
  710. if (libname.ToLower() != "nostddb" && libname.ToLower() != "nostddb.db")
  711. {
  712. if (!File.Exists(".\\Config\\SysData\\" + libname))
  713. {
  714. MessageBox.Show("未加载到标准库!");
  715. return;
  716. }
  717. OTSCLRINTERFACE.COTSClassifyEngineClr EngineClr2 = new COTSClassifyEngineClr(EngineType.ExpressionClassifyEng, libname);
  718. ParticleClrs = ZeroElementProcess(EngineClr2, ParticleClrs);
  719. }
  720. }
  721. else
  722. {
  723. //string libname = resultfile.GetSTDName();
  724. string libname = GetStandardLibraryName(resultfile);
  725. if (!libname.Contains(".db"))
  726. {
  727. libname += ".db";
  728. }
  729. if (libname.ToLower() != "nostddb" && libname.ToLower() != "nostddb.db")
  730. {
  731. if (!File.Exists(".\\Config\\SysData\\" + libname))
  732. {
  733. MessageBox.Show("未加载到标准库!");
  734. return;
  735. }
  736. OTSCLRINTERFACE.COTSClassifyEngineClr EngineClr = new COTSClassifyEngineClr(EngineType.ExpressionClassifyEng, libname);
  737. ParticleClrs = ZeroElementProcess(EngineClr, ParticleClrs);
  738. }
  739. }
  740. log.Info("begin particle data db saving...");
  741. if(UpdateElementofParticles(ParticleClrs,resultfile.GetResultDBPath()))
  742. {
  743. MessageBox.Show("零元素归一化完毕,请重启报告以便数据生效!");
  744. }
  745. else
  746. {
  747. }
  748. this.Cursor = System.Windows.Forms.Cursors.Default;
  749. }
  750. List<COTSParticleClr> ZeroElementProcess(OTSCLRINTERFACE.COTSClassifyEngineClr ClassifyEngineClr, List<COTSParticleClr> allParticles)
  751. {
  752. foreach (COTSParticleClr particleClr in allParticles)
  753. {
  754. ClassifyEngineClr.ZeroElementProcess(particleClr);
  755. }
  756. return allParticles;
  757. }
  758. List<COTSParticleClr> GetParticleClrFromFields(List<Field> allFields)
  759. {
  760. List<COTSParticleClr> ParticleClrs = new List<COTSParticleClr>();
  761. foreach (var f in allFields)
  762. {
  763. var parts = f.ParticleList;
  764. foreach (var p in parts)
  765. {
  766. COTSParticleClr part = new COTSParticleClr();
  767. COTSFeatureClr fea = new COTSFeatureClr();
  768. part.SetFeature(fea);
  769. var xray = part.GetXray();
  770. foreach (var ele in p.ElementList)
  771. {
  772. CElementChemistryClr eleclr = new CElementChemistryClr();
  773. eleclr.SetName(ele.Name);
  774. eleclr.SetPercentage(ele.Percentage);
  775. xray.AddQuantifyElement(eleclr);
  776. }
  777. part.SetFieldId(p.FieldId);
  778. part.SetAnalysisId(p.XrayId);
  779. part.SetParticleId(p.ParticleId);
  780. part.SetXray(xray);
  781. ParticleClrs.Add(part);
  782. }
  783. }
  784. return ParticleClrs;
  785. }
  786. public bool UpdateElementofParticles(List<COTSParticleClr> Parts, string dbfile)
  787. {
  788. CIncAFileMgr pDBFileMgr = new CIncAFileMgr(dbfile);
  789. CPosXrayDBMgr pXrayDBMgr = pDBFileMgr.GetPosXrayDBMgr();
  790. CElementChemistryDB xraydb = pXrayDBMgr.GetElementChemistryDB();
  791. List<CPosXrayClr> ches = new List<CPosXrayClr>();
  792. foreach (COTSParticleClr part in Parts)
  793. {
  794. part.GetXray().SetIndex(part.GetParticleId());
  795. part.GetXray().SetScanFieldId(part.GetFieldId());
  796. ches.Add(part.GetXray());
  797. }
  798. xraydb.RemoveAllRows();
  799. try
  800. {
  801. xraydb.SaveElementChemistriesList_Batch(ches);
  802. }
  803. catch(Exception ex)
  804. {
  805. MessageBox.Show(ex.ToString());
  806. return false;
  807. }
  808. return true;
  809. }
  810. private void treeView1_NodeMouseHover(object sender, TreeNodeMouseHoverEventArgs e)
  811. {
  812. e.Node.ToolTipText = e.Node.Tag.ToString();
  813. }
  814. }
  815. }