frmMeasureRstMgr.cs 30 KB

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