using OTS.WinFormsUI.Docking; using OTSCLRINTERFACE; using OTSCommon; using OTSCommon.Model; using OTSIncAReportApp.OTSDataMgrFunction; using OTSIncAReportApp.OTSSampleReportInfo; using OTSIncAReportApp.SysMgrTools; using OTSModelSharp; using OTSModelSharp.DTLBase; using System; using System.Collections; using System.Collections.Generic; using System.Drawing; using System.IO; using System.Runtime.InteropServices; using System.Windows.Forms; namespace OTSIncAReportApp { /// /// 显示测量结果树控件主窗体 /// public partial class frmMeasureRstMgr : DockContent { #region 变量定义 /// /// 主框架窗体,全局变量 /// private frmReportApp m_ReportApp = null; private frmReportConditionChoose m_ConditionChoose; private ResultDataMgr m_RstDataMgr; /// /// 树窗口类 /// private OTSTreeViewData m_TreeViewData = null; /// /// 测量结果样品节点 /// public TreeNode m_WorkSampleNode = null; /// /// 工作样品属性参数 /// public CTreeSampleRst m_WorkSampleParam = new CTreeSampleRst(); /// /// 当前工作样品名 /// private String m_WorkSampleName = ""; /// /// 当前鼠标点击节点 /// int treeNodeSample = -1; Hashtable table; #endregion #region 构造函数和窗体加载 /// /// 构造函数 /// /// public frmMeasureRstMgr(frmReportApp reportApp) { InitializeComponent(); m_ReportApp = reportApp; m_ConditionChoose = reportApp.m_conditionChoose; m_RstDataMgr = reportApp.m_rstDataMgr; m_TreeViewData = new OTSTreeViewData(this); #region 国际化语言 OTSCommon.Language lan = new OTSCommon.Language(this); table = lan.GetNameTable(this.Name); #endregion } /// /// 窗体加载 /// /// /// private void OTSMeasureRetMgrWindow_Load(object sender, EventArgs e) { treeView1.LabelEdit = true;//TreeView可编辑状态。 } #endregion #region 外部接口函数及相关常量定义 /// /// 发送消息 /// /// /// /// /// /// [DllImport("user32.dll", CharSet = CharSet.Auto)] private static extern IntPtr SendMessage(IntPtr hWnd, int Msg, IntPtr wParam, ref TVITEM lParam); private const int TVIF_STATE = 0x8; private const int TVIS_STATEIMAGEMASK = 0xF000; private const int TV_FIRST = 0x1100; private const int TVM_SETITEM = TV_FIRST + 63; [StructLayout(LayoutKind.Sequential, Pack = 8, CharSet = CharSet.Auto)] private struct TVITEM { public int mask; public IntPtr hItem; public int state; public int stateMask; [MarshalAs(UnmanagedType.LPTStr)] public string lpszText; public int cchTextMax; public int iImage; public int iSelectedImage; public int cChildren; public IntPtr lParam; } #endregion #region 树控件相关事件 /// /// 树控件点击是否选择右键 /// /// /// private void treeView1_Click(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Right)//判断你点的是不是右键 { contextMenuStrip1.Show(); } } /// /// 左键选择树节点事件 /// /// /// private void treeView1_AfterSelect(object sender, TreeViewEventArgs e) { //鼠标选中 if (e.Action == TreeViewAction.ByMouse || e.Action == TreeViewAction.ByKeyboard) { if (e.Node.IsSelected) { //判断的选中的CHECKBOX和焦点都在当前被选择的节点上,切换当前工作样品 m_WorkSampleNode = e.Node; treeView1.SelectedNode = e.Node; //当前被选中 treeView1.Refresh(); } } } /// /// 当Checkbox的状态发生变化时,响应事件 /// /// /// private void treeView1_AfterCheck(object sender, TreeViewEventArgs e) { if (e.Action == TreeViewAction.ByMouse) { //判断是否由鼠标触发的 TreeNode TN = e.Node;//点击的节点 if (TN.Checked) { //若是选中,遍历父节点,所属的父节点应为选中 { if (TN.Parent != null) { TN.Parent.Checked = true; if (TN.Parent.Parent != null) { TN.Parent.Parent.Checked = true; } } DG_Check(TN, true); //本身节点之下还有子节点,遍历,全选中 } else { //若是取消选中 DG_Check(TN, false);//本身节点之下还有子节点,遍历,全取消选中 if (TN.Parent != null) { //若有父节点,判断此次取消选中后,是否兄弟节点也是没选中 TreeNode TNP = TN.Parent; bool YXZ = false;//有选中的,以此来判断否兄弟节点也是没选中 foreach (TreeNode childTN in TNP.Nodes) { if (childTN.Checked) { YXZ = true;//还有选中的兄弟节点 break; } } TNP.Checked = YXZ;//将遍历结果赋给父节点 } } } } /// /// 删除测量结果事件 /// /// /// private void RDeleteNode_Click(object sender, EventArgs e) { TreeNode tn = new TreeNode(); tn = treeView1.SelectedNode; tn.Remove(); } /// /// 显示树节点 /// /// /// private void treeView1_DrawNode(object sender, DrawTreeNodeEventArgs e) { e.DrawDefault = true; } /// /// 当鼠标点击选择了 /// /// /// public void TreeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e) { TreeNode tn = (TreeNode)e.Node; treeNodeSample = e.Node.Index; string treeNodeName = e.Node.Text; //正常indexadd值应该哪个为true哪个给它 int indexadd = e.Node.Index; string checkednode = ""; foreach (TreeNode item in treeView1.Nodes) { if (item.Checked) { checkednode = checkednode + "+" + item.Text; } } if (checkednode.LastIndexOf("+") > 1) { checkednode = checkednode.Substring(1); } else { checkednode = ""; } if (treeView1.Nodes.Count>1&&e.Button == MouseButtons.Left)//判断按下鼠标右键 { //插入多数据源选项 m_ReportApp.MoreSource = checkednode; m_ConditionChoose.SetDefaultConditionValue(); m_ConditionChoose.DisCurrentPicProperty();//刷新 } if (e.Button == MouseButtons.Right)//判断按下鼠标右键 { Point ClickPoint = new Point(e.X, e.Y); TreeNode CurrentNode = treeView1.GetNodeAt(ClickPoint); if (CurrentNode == null && null == CurrentNode.Parent)//判断选择的是不是一个节点 { CurrentNode.ContextMenuStrip = contextMenuStrip2; } else { CurrentNode.ContextMenuStrip = contextMenuStrip1; m_WorkSampleNode = CurrentNode; } } this.Focus(); } public void AddSampleResult(string str_path) { if (m_RstDataMgr.AddDataResult(str_path)) { m_ConditionChoose.SetDefaultConditionValue(); m_ConditionChoose.GetWorkingPictureConditionVal(); m_ReportApp.m_RstWindow.Show(m_ReportApp.DockWindowPanel); //在treeview上添加测量结果 m_TreeViewData.DisplayWorkSampleTree(this.m_RstDataMgr.ResultFilesList); //在grid上添加测量结果 m_ConditionChoose.DisCurrentPicProperty(); //根据标签索引 显示默认的数据图表for test m_ConditionChoose.ShowsTheDefaultPic();//显示图表 } else { m_TreeViewData.DisplayWorkSampleTree(this.m_RstDataMgr.ResultFilesList); m_ConditionChoose.SetDefaultConditionValue(); m_ConditionChoose.DisCurrentPicProperty(); } } /// /// 树节点删除事件 /// /// /// private void RDeleteNode_Click_1(object sender, EventArgs e) { RemoveSample(); } //ReportApp窗口给 RetMgrWindow 发送窗口删除样品回复 public void RemoveSample() { if (this.treeView1.SelectedNode == null) return; string str1 = table["str1"].ToString(); string str2 = table["str2"].ToString(); string sDeleteSampleName = str1; var sDeletSName = this.treeView1.SelectedNode.Text; sDeleteSampleName += sDeletSName; sDeleteSampleName += str2; if (DialogResult.OK == MessageBox.Show(sDeleteSampleName, "Tip", MessageBoxButtons.OKCancel, MessageBoxIcon.Warning)) { //删除当前选中的节点 treeView1.Nodes.Remove(this.treeView1.SelectedNode); //移除当前工作样品 if ("" == sDeletSName) { return; } //重新获取Treeview上的工作样品节点 this.m_TreeViewData.GetTreeWorkSampleNode(sDeletSName); //设置工作样品焦点 this.m_TreeViewData.ReSetWorkSampleFoucs(); //当节点全部删除完时刷新树以及主窗口的控件 if (treeView1.Nodes.Count == 0) { //treeView1.Nodes.Clear(); //如果已经没有测量结果,则将报告程序初始化到刚打开的状态 m_ReportApp.InitReportProState(); } else { //重新加载grid窗口 m_ConditionChoose.DisCurrentPicProperty(); //删除树上的节点 m_WorkSampleName = m_ReportApp.m_rstDataMgr.GetSampleName(); m_TreeViewData.GetTreeWorkSampleNode(m_WorkSampleName); } } m_RstDataMgr.RemoveDataResult(sDeletSName); var rstlist = m_ConditionChoose.m_conditionData.GetComboDownListByItemName(OTS_REPORT_PROP_GRID_ITEMS.DATA_SOURCE); rstlist.Remove(sDeletSName); m_ConditionChoose.m_conditionData.SetComboDownListByItemName(OTS_REPORT_PROP_GRID_ITEMS.DATA_SOURCE, rstlist); if (rstlist.Count > 0) { m_ConditionChoose.m_conditionData.SetPropByPropItemName(OTS_REPORT_PROP_GRID_ITEMS.DATA_SOURCE, rstlist[0]); m_ConditionChoose.m_conditionData.SetItemvalByItemName(OTS_REPORT_PROP_GRID_ITEMS.DATA_SOURCE, 0); } m_ConditionChoose.DisCurrentPicProperty(); } //切换当前工作样品 //string sNewWorkSample : 新的工作样品名 public void MeasureApp_SwitchSample(string sNewName) { m_TreeViewData.SetNewWorkSample(sNewName); } #endregion #region 相关树控件方法 //是否为选择工作样品的节点(窗口切换) public void SelectWorkSampleNode() { try { //是否添加结果文件 if (m_RstDataMgr.ResultFilesList.Count != 0) { if (m_RstDataMgr.GetWorkingResultId() != -1) if (m_RstDataMgr.ResultFilesList[m_RstDataMgr.GetWorkingResultId()] != null) { string workSampleName = m_RstDataMgr.ResultFilesList[m_RstDataMgr.GetWorkingResultId()].anotherFileName; //设置工作样品 if (m_ReportApp.m_RstWindow.treeView1.Nodes.Count > 0) { foreach (TreeNode item in m_ReportApp.m_RstWindow.treeView1.Nodes) { //设置选择TreeNode if (item.Text == workSampleName) { m_ReportApp.m_RstWindow.treeView1.SelectedNode = item; break; } } } } } } catch (Exception) { } } /// /// 设置树控件各节点的状态 /// /// /// private void DG_Check(TreeNode TN, bool flag) { if (TN.Nodes.Count > 0) { foreach (TreeNode childTN in TN.Nodes) { childTN.Checked = flag; DG_Check(childTN, flag); } } } /// /// 隐藏树节点,复选框 /// /// /// public void HideCheckBox(TreeView tvw, TreeNode node) { TVITEM tvi = new TVITEM(); tvi.hItem = node.Handle; tvi.mask = TVIF_STATE; tvi.stateMask = TVIS_STATEIMAGEMASK; tvi.state = 0; SendMessage(tvw.Handle, TVM_SETITEM, IntPtr.Zero, ref tvi); } #endregion #region 多数据源操作部份相关 private void button1_Click(object sender, EventArgs e) { frmMultiSourceSelect frm_Mss = new frmMultiSourceSelect(this.treeView1); if (frm_Mss.ShowDialog() == DialogResult.OK) { //判断是否选择了两个以上的选项, int iselectcount = 0; //第一次更新各选项值 for (int i = 0; i < frm_Mss.treeView1.Nodes.Count; i++) { this.treeView1.Nodes[i].Checked = frm_Mss.treeView1.Nodes[i].Checked; if (frm_Mss.treeView1.Nodes[i].Checked == true) { iselectcount++; } } //主动去更新让其选择上多数据源或非多数据源 if (iselectcount >= 2) { //获取 //OTSSampleMeaInfo SMInfo = new OTSSampleMeaInfo(); //DataMgrFun dataMgr = m_ReportApp.m_DataMgrFun; //dataMgr.SetSampleParamVal(OTS_RETORT_PROP_GRID_ITEMS.DATA_SOURCE, OTS_ITEM_TYPES.COMBO, 0); //获取属性窗口更新显示 //dataMgr.GetWorkSamplePropertyVal(ref SMInfo); //m_ReportApp.m_PropWindow.DisProperyWindow(SMInfo); //显示默认的图表 //m_ReportApp.m_PropWindow.m_SampleGrid.ShowDataDiagram(); } else { //单一选项时,也要对该属性窗口进行切换 for (int i = 0; i < frm_Mss.treeView1.Nodes.Count; i++) { if (frm_Mss.treeView1.Nodes[i].Checked == true) { //OTSSampleMeaInfo SMInfo = new OTSSampleMeaInfo(); //DataMgrFun dataMgr = m_ReportApp.m_DataMgrFun; //dataMgr.SetSampleParamVal(OTS_RETORT_PROP_GRID_ITEMS.DATA_SOURCE, OTS_ITEM_TYPES.COMBO, i); ////获取属性窗口更新显示 //dataMgr.GetWorkSamplePropertyVal(ref SMInfo); //m_ReportApp.m_PropWindow.DisProperyWindow(SMInfo); ////显示默认的图表 //m_ReportApp.m_PropWindow.m_SampleGrid.ShowDataDiagram(); } } } } } #endregion private void 计算边界颗粒合成ToolStripMenuItem_Click(object sender, EventArgs e) { if (this.treeView1.SelectedNode == null) return; //string sDeleteSampleName = str1; var SampleName = this.treeView1.SelectedNode.Text; var resultfile= m_RstDataMgr.GetResultFileObjByName(SampleName); if (resultfile == null) return; var log = NLog.LogManager.GetCurrentClassLogger(); log.Info("Merging big particles which are crossing the field edge!"); this.Cursor = System.Windows.Forms.Cursors.WaitCursor; int scanfldsize = (int)resultfile.GetScanFieldSizeX(); List mergedParticles = new List(); double pixelSize = resultfile.GetPixelSize(); Size s = new Size(resultfile.GetImageWidth(), resultfile.GetImageHeight()); MergeBigBoundaryParticles(resultfile.List_OTSField, pixelSize, scanfldsize, s, ref mergedParticles); var prm = new COTSImgProcPrmClr(); //prm.SetOverlapParam(resultfile.get) OTSCLRINTERFACE.ImageProForClr imgpro = new OTSCLRINTERFACE.ImageProForClr(prm); foreach (COTSParticleClr part in mergedParticles) { imgpro.CalcuParticleImagePropertes(part, pixelSize); } string libname = resultfile.GetSTDName(); int steelTech = resultfile.GetIncASteeltech(); ClassifyParticle(mergedParticles, libname, m_ReportApp.m_RptConfigFile.Systype, steelTech); log.Info("begin merged particle data db saving..."); SaveMergedParticles(mergedParticles,resultfile.GetResultDBPath()); MessageBox.Show("边界颗粒合成完成!"); this.Cursor = System.Windows.Forms.Cursors.Default; } public bool MergeBigBoundaryParticles(List allFields, double pixelSize, int scanFieldSize, System.Drawing.Size ResolutionSize, ref List mergedParts) { List fldclrs = new List(); var prm = new COTSImgProcPrmClr(); ImageProForClr imgpro = new ImageProForClr(prm); foreach (var f in allFields) { COTSFieldDataClr fldclr = new COTSFieldDataClr(); PointF p1 = f.GetOTSPosition(); System.Drawing.Point p2 = new System.Drawing.Point((int)p1.X, (int)p1.Y); fldclr.SetPosition((int)p1.X, (int)p1.Y); fldclr.SetImageWidth(ResolutionSize.Width); fldclr.SetImageHeight(ResolutionSize.Height); var parts = f.ParticleList; foreach (var p in parts) { COTSParticleClr part = new COTSParticleClr(); COTSFeatureClr fea = new COTSFeatureClr(); List segs = new List(); foreach (var s in p.SegmentList) { COTSSegmentClr seg = new COTSSegmentClr(); seg.SetStart(s.Start); seg.SetHeight(s.Height); seg.SetLength(s.Length); segs.Add(seg); } fea.SetSegmentsList(segs,true); part.SetFeature(fea); var xray = part.GetXray(); foreach (var ele in p.ElementList) { CElementChemistryClr eleclr = new CElementChemistryClr(); eleclr.SetName(ele.Name); eleclr.SetPercentage(ele.Percentage); xray.AddQuantifyElement(eleclr); } part.SetFieldId(p.FieldId); part.SetAnalysisId(p.XrayId); part.SetXray(xray); part.SetActualArea(p.Area); part.SetSEMPos(new Point(p.PosX, p.PosY)); part.CalCoverRectFromSegment(); part.CalXrayPos(); fldclr.AddParticle(part); } fldclrs.Add(fldclr); } imgpro.MergeBigBoundaryParticles(fldclrs, pixelSize, scanFieldSize, ResolutionSize, mergedParts); return true; } private bool ClassifyParticle(List parts,string libname, OTS_SysType_ID systype,int steeltech) { bool r = true; try { if (systype == OTS_SysType_ID.IncA) { r= COffLineClassifyLogic.ClassifyIncA(parts, libname,steeltech); } else if (systype == OTS_SysType_ID.CleannessA) { r= COffLineClassifyLogic.ClassifyCleannessA(parts, libname); } return r; } catch (Exception e) { NLog.LogManager.GetCurrentClassLogger().Error("merged parts classify failed. " + e.Message); return false; } } public bool SaveMergedParticles(List mergedParts,string dbfile) { CIncAFileMgr pDBFileMgr = new CIncAFileMgr(dbfile); var mergedpartdb = pDBFileMgr.GetMergedParticleDB(); mergedpartdb.RemoveAllRows(); foreach (COTSParticleClr part in mergedParts) { mergedpartdb.SaveAParticle(part, part.GetXray(), (Point)part.GetSEMPos()); } CPosXrayDBMgr pXrayDBMgr = pDBFileMgr.GetPosXrayDBMgr(); CElementChemistryDB xraydb = pXrayDBMgr.GetElementChemistryDB(); List ches = new List(); foreach (COTSParticleClr part in mergedParts) { ches.Add(part.GetXray()); } xraydb.SaveElementChemistriesList_Batch(ches); return true; } private void ToolStripMenuItem_Zeroelementprocess_Click(object sender, EventArgs e) { if (this.treeView1.SelectedNode == null) return; var SampleName = this.treeView1.SelectedNode.Text; var resultfile = m_RstDataMgr.GetResultFileObjByName(SampleName); if (resultfile == null) return; var log = NLog.LogManager.GetCurrentClassLogger(); log.Info("Start to Zeroelementprocess!"); this.Cursor = System.Windows.Forms.Cursors.WaitCursor; List ParticleClrs = new List(); ParticleClrs = GetParticleClrFromFields(resultfile.List_OTSField); if (m_ReportApp.m_RptConfigFile.Systype == OTS_SysType_ID.IncA) { if (resultfile.GetUseSysSTD()) { OTSCLRINTERFACE.COTSClassifyEngineClr EngineClr = new COTSClassifyEngineClr(EngineType.InclutionEng, "NoSTDDB"); ParticleClrs = ZeroElementProcess(EngineClr, ParticleClrs); } string libname = resultfile.GetSTDName(); if (!libname.Contains(".db")) { libname += ".db"; } if (libname.ToLower() != "nostddb" && libname.ToLower() != "nostddb.db") { if (!File.Exists(".\\Config\\SysData\\" + libname)) { MessageBox.Show("未加载到标准库!"); return; } OTSCLRINTERFACE.COTSClassifyEngineClr EngineClr2 = new COTSClassifyEngineClr(EngineType.ExpressionClassifyEng, libname); ParticleClrs = ZeroElementProcess(EngineClr2, ParticleClrs); } } else { string libname = resultfile.GetSTDName(); if (!libname.Contains(".db")) { libname += ".db"; } if (libname.ToLower() != "nostddb" && libname.ToLower() != "nostddb.db") { if (!File.Exists(".\\Config\\SysData\\" + libname)) { MessageBox.Show("未加载到标准库!"); return; } OTSCLRINTERFACE.COTSClassifyEngineClr EngineClr = new COTSClassifyEngineClr(EngineType.ExpressionClassifyEng, libname); ParticleClrs = ZeroElementProcess(EngineClr, ParticleClrs); } } log.Info("begin particle data db saving..."); if(UpdateElementofParticles(ParticleClrs,resultfile.GetResultDBPath())) { MessageBox.Show("零元素归一化完毕,请重启报告以便数据生效!"); } else { } this.Cursor = System.Windows.Forms.Cursors.Default; } List ZeroElementProcess(OTSCLRINTERFACE.COTSClassifyEngineClr ClassifyEngineClr, List allParticles) { foreach (COTSParticleClr particleClr in allParticles) { ClassifyEngineClr.ZeroElementProcess(particleClr); } return allParticles; } List GetParticleClrFromFields(List allFields) { List ParticleClrs = new List(); foreach (var f in allFields) { var parts = f.ParticleList; foreach (var p in parts) { COTSParticleClr part = new COTSParticleClr(); COTSFeatureClr fea = new COTSFeatureClr(); part.SetFeature(fea); var xray = part.GetXray(); foreach (var ele in p.ElementList) { CElementChemistryClr eleclr = new CElementChemistryClr(); eleclr.SetName(ele.Name); eleclr.SetPercentage(ele.Percentage); xray.AddQuantifyElement(eleclr); } part.SetFieldId(p.FieldId); part.SetAnalysisId(p.XrayId); part.SetParticleId(p.ParticleId); part.SetXray(xray); ParticleClrs.Add(part); } } return ParticleClrs; } public bool UpdateElementofParticles(List Parts, string dbfile) { CIncAFileMgr pDBFileMgr = new CIncAFileMgr(dbfile); CPosXrayDBMgr pXrayDBMgr = pDBFileMgr.GetPosXrayDBMgr(); CElementChemistryDB xraydb = pXrayDBMgr.GetElementChemistryDB(); List ches = new List(); foreach (COTSParticleClr part in Parts) { part.GetXray().SetIndex(part.GetParticleId()); part.GetXray().SetScanFieldId(part.GetFieldId()); ches.Add(part.GetXray()); } xraydb.RemoveAllRows(); try { xraydb.SaveElementChemistriesList_Batch(ches); } catch(Exception ex) { MessageBox.Show(ex.ToString()); return false; } return true; } private void treeView1_NodeMouseHover(object sender, TreeNodeMouseHoverEventArgs e) { e.Node.ToolTipText = e.Node.Tag.ToString(); } } }