frmMeasureRstMgr.cs 24 KB

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