frmMeasureRstMgr.cs 33 KB

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