using Microsoft.Office.Core; using OpenCvSharp; using Resources; using SmartCoalApplication.Annotation; using SmartCoalApplication.Annotation.Enum; using SmartCoalApplication.Annotation.Measure; using SmartCoalApplication.AutomaticMeasurement.Model; using SmartCoalApplication.Base; using SmartCoalApplication.Base.AutoMeasure; using SmartCoalApplication.Base.CommTool; using SmartCoalApplication.Base.FunctionModel; using SmartCoalApplication.Base.MeasureModel; using SmartCoalApplication.Core; using SmartCoalApplication.Core.CustomControl; using SmartCoalApplication.Core.DbOpreate.DbModel; using SmartCoalApplication.PluginAssemblys; using SmartCoalApplication.Resources; using SPCwebServiceDll; using System; using System.Collections.Generic; using System.Data; using System.Drawing; using System.Drawing.Drawing2D; using System.Drawing.Imaging; using System.Dynamic; using System.IO; using System.Linq; using System.Reflection; using System.Text.RegularExpressions; using System.Windows.Forms; using static SmartCoalApplication.AutomaticMeasurement.Model.SpcApiSchemesModel; using Excel = Microsoft.Office.Interop.Excel; namespace SmartCoalApplication.AutomaticMeasurement { public partial class ResultsView : PdnBaseForm { /// /// 分析结果图集合 /// private List resultMatList = new List(); /// /// 分析结果图集合 /// private List realResultMatList = new List(); private MeasureInfoModel infoModel = new MeasureInfoModel(); /// /// 图像面板 /// private DocumentWorkspaceWindow documentWorkspace; private Bitmap bitmap; private AppWorkspace appWorkspace; private CommonControlButtons commonControlButtons; private int selectedNum = 0; private MeasureMaintenanceType measureMaintenanceType; private MeasureMaintenanceTreeData measureMaintenanceTypeList; private Dictionary> pidRuleDic; private Dictionary> LineShowDic = new Dictionary>(); private int successNum = 0; private int failNum = 0; private string filePath; private Dictionary graphicsListDic = new Dictionary(); //像素跟踪窗口 private PixelTrackingDialog pixelTrackingDialog; private bool pixelTrackingEnabled = false; /// /// hint 提示信息 /// private ToolTip toolTip; /// /// SPC接口 字段配置方案 /// private SpcApiSchemesModel spcApiSchemesModel = new SpcApiSchemesModel(); /// /// 公式符号 /// private string[] symbolArray = new string[] { "+", "-", "*", "/" }; private Dictionary _listHoleType; private NameRuleListDetails thisNameRuleListDetails; private bool isSPCItemNull = false; private List hasDelResultMatList = new List(); /// /// 辅助线的横线和竖线 /// private GraphicsPath path, path1; internal ResultsView(MeasureInfoModel infoModel, List measureInfoResultModels, AppWorkspace appWorkspace, BeingExecuted beingExecuted, Dictionary _listHoleType) { this.resultMatList.AddRange(measureInfoResultModels); this.realResultMatList.AddRange(measureInfoResultModels); this.infoModel = infoModel; InitializeComponent(); InitializeComponent2(); this._listHoleType = _listHoleType; this.FormClosing += new FormClosingEventHandler(ResultsViewClosing); this.comboStatus.Items.AddRange(new object[] { PdnResources.GetString("NewWhole"), PdnResources.GetString("NewNormal"), PdnResources.GetString("NewAbnormal")}); InitializeCombo(); this.Icon = PdnInfo.AppIcon; this.filePath = beingExecuted.filePath; this.measureMaintenanceType = beingExecuted.measureMaintenanceType; this.pidRuleDic = beingExecuted.pidRuleDic; #region [组织应该展示的线 去除不应该展示的线] foreach (var item in this.measureMaintenanceType.MeasureMaintenanceTreeFourthDataList) { if (this.LineShowDic.ContainsKey(item.HoleTypeId)) { foreach (var item2 in item.FormulaExpressionLineID) { if (!this.LineShowDic[item.HoleTypeId].Contains(item2)) { this.LineShowDic[item.HoleTypeId].Add(item2); } } } else { List list = new List(); foreach (var item2 in item.FormulaExpressionLineID) { if (!list.Contains(item2)) { list.Add(item2); } } this.LineShowDic.Add(item.HoleTypeId, list); } } foreach (var item in resultMatList) { List removeList = new List(); if (this.LineShowDic.ContainsKey(item.parentId)) { foreach (var item2 in item.dataInforList) { if (!this.LineShowDic[item.parentId].Contains(item2.ID)) { removeList.Add(item2); } } foreach (var item2 in removeList) { item.dataInforList.Remove(item2); } } } #endregion [组织应该展示的线 去除不应该展示的线] measureInfoResultModels.Clear(); beingExecuted.Close(); beingExecuted.Dispose(); infoModel = null; GC.Collect(); this.appWorkspace = appWorkspace; #region [搜索项下拉选] string filePath; if (Program.instance.configModel.Language == 1) { filePath = Application.StartupPath + "\\Config\\" + Program.instance.SettingPrefix + "\\basicTreeDataSimple.xml"; } else { filePath = Application.StartupPath + "\\Config\\" + Program.instance.SettingPrefix + "\\basicTreeDataTraditional.xml"; } if (System.IO.File.Exists(filePath)) { MeasureMaintenanceTreeSpecificData measureMaintenanceTreeSpecificData = new MeasureMaintenanceTreeSpecificData(); measureMaintenanceTreeSpecificData.MeasureMaintenanceTreeSpecificDataId = "0"; measureMaintenanceTreeSpecificData.MeasureMaintenanceTreeSpecificName = "全部"; List measureMaintenanceTypes = new List() { measureMaintenanceTreeSpecificData }; measureMaintenanceTypeList = XmlSerializeHelper.DESerializer(FileOperationHelper.ReadStringFromFile(filePath, FileMode.Open)); var selectedList = resultMatList.GroupBy(m => m.parentId); foreach (var item in selectedList) { MeasureMaintenanceTreeSpecificData sonData; this.appWorkspace.RecursionGetData(item.Key, measureMaintenanceTypeList.MeasureMaintenanceTreeDataList, out sonData); if (sonData != null) { measureMaintenanceTypes.Add(sonData); } } this.comboClassification.SelectedIndexChanged -= new System.EventHandler(this.comboClassification_SelectedIndexChanged); comboClassification.DataSource = measureMaintenanceTypes; comboClassification.DisplayMember = "MeasureMaintenanceTreeSpecificName"; this.comboClassification.SelectedIndexChanged += new System.EventHandler(this.comboClassification_SelectedIndexChanged); } #endregion [搜索项下拉选] #region [图片集合初始化] InitPicList(); #endregion [图片集合初始化] #region [图像面板相关] // //初始化图像控件 // this.documentWorkspace = new DocumentWorkspaceWindow(this.appWorkspace, 1); this.documentWorkspace.Cursor = Cursors.Default; this.documentWorkspace.Dock = DockStyle.Fill; //this.documentWorkspace.HookMouseEvents(); this.documentWorkspace.Visible = true; //this.documentWorkspace.panel.Click += new EventHandler(this.documentWorkspace_panel_Click); //this.documentWorkspace.panel.MouseDown += new MouseEventHandler(this.documentWorkspace_panel_MouseDown); //this.documentWorkspace.panel.Paint += new PaintEventHandler(this.panelPaint); this.documentWorkspace.panel.MouseMove += new MouseEventHandler(this.documentWorkspace_panel_MouseMove); this.documentWorkspace.panel.MouseWheel += new MouseEventHandler(this.documentWorkspace_panel_MouseWheel); this.documentWorkspace.panel.MouseUp += new MouseEventHandler(this.documentWorkspace_panel_MouseUp); this.groupBox4.Controls.Add(this.documentWorkspace); PdnBaseForm.RegisterFormHotKey(Keys.Delete, OnDeleteHotKeyPressed); #endregion [图像面板相关] this.commonControlButtons = new CommonControlButtons(this.documentWorkspace.Width - 25); this.commonControlButtons.Dock = DockStyle.Top; this.commonControlButtons.Height = 30; this.commonControlButtons.HideZoomToWindowAndActualSize(); this.commonControlButtons.ShowRight(); this.groupBox4.Controls.Add(commonControlButtons); InitCommonButtonEvent(); label3.Visible = false; label4.Visible = false; label5.Visible = false; this.Resize += new EventHandler(DialogResize); this.Shown += new EventHandler(shownMethod); this.toolTip = new ToolTip(); var oldNameRuleListDetails = Program.instance.fileNameRule.NameRuleList.Where(m => m.ID == this.measureMaintenanceType.NameRuleID).FirstOrDefault(); this.yuLan(oldNameRuleListDetails); } public void yuLan(NameRuleListDetails nameRuleListDetails) { if (nameRuleListDetails == null) { this.textBox5.Text = DateTime.Now.ToString("yyyyMMddhhmmss") + "切片报告.xls"; return; } string ruleName = string.Empty; string ruleGain = string.Empty; if (this.measureMaintenanceType.ruleMessage != null) { ruleName = this.measureMaintenanceType.ruleMessage.ruleName; ruleGain = this.measureMaintenanceType.ruleMessage.ruleGain.ToString(); } else { List list = Program.instance.mic_rulersAll; var ruler = list.Where(m => m.id.Equals(Program.instance.configModel.RulerId)).FirstOrDefault(); if (ruler != null) { ruleName = ruler.ruler_name; ruleGain = ruler.gain_multiple.ToString(); } } NamingRuleHelper namingRuleHelper = new NamingRuleHelper(); this.textBox5.Text = namingRuleHelper.GetNameFromXml(nameRuleListDetails, ruleName, ruleGain, this.measureMaintenanceType, "") + ".xls"; } private void ResultsViewClosing(object sender, FormClosingEventArgs e) { this.realResultMatList.Clear(); this.resultMatList.Clear(); this.hasDelResultMatList.Clear(); GC.Collect(); } private void InitializeComponent2() { this.Text = PdnResources.GetString("NewResultsView"); this.groupBox1.Text = PdnResources.GetString("NewOperation"); this.checkBox2.Text = PdnResources.GetString("NewDisplayDrawingRange"); this.checkBox1.Text = PdnResources.GetString("NewOpenReport"); this.checkBox3.Text = PdnResources.GetString("ResultView.checkBox3"); // 开启像素追踪 this.button1.Text = PdnResources.GetString("ResultView.button1"); // 再次分析 this.button2.Text = PdnResources.GetString("ResultView.button2"); // 绘制范围 this.button3.Text = PdnResources.GetString("ResultView.button3"); // 全选 this.button4.Text = PdnResources.GetString("ResultView.button4"); // 全不选 this.button5.Text = PdnResources.GetString("ResultView.button5"); // 反选 this.button6.Text = PdnResources.GetString("ResultView.button6"); // 命名规则 this.buttonGenerateReport.Text = PdnResources.GetString("NewGenerateReport"); // 生成报告 this.label2.Text = PdnResources.GetString("NewStatus") + ":"; this.label1.Text = PdnResources.GetString("NewClassification") + ":"; this.groupBox2.Text = PdnResources.GetString("Newlist"); this.groupBox3.Text = PdnResources.GetString("NewAddSketchLine"); this.groupBox4.Text = PdnResources.GetString("NewPicture"); this.checkBox4.Text = PdnResources.GetString("ResultView.checkBox4"); this.button7.Text = PdnResources.GetString("NewSelectTemplate"); } private void documentWorkspace_panel_MouseWheel(object sender, MouseEventArgs e) { } private void shownMethod(object sender, EventArgs e) { #region [默认选中] int choose = 0; foreach (var item in this.resultMatList) { if (item.dataInforList.Where(m => m.value == 0).ToList().Count() > 0) { choose = this.resultMatList.IndexOf(item); break; } } if (this.listView1.Items.Count > 0) { this.listView1.Focus(); //滚动到指定的行位置 this.listView1.EnsureVisible(choose); this.listView1.Items[choose].Focused = true; this.listView1.Items[choose].Selected = true; if (choose == 0) { listView1_SelectedIndexChanged(null, null); } } #endregion [默认选中] } private void DialogResize(object sender, EventArgs e) { this.commonControlButtons.reset(this.documentWorkspace.Width - 25); } private bool OnDeleteHotKeyPressed(Keys keys) { if (this.listView1.SelectedItems == null || this.listView1.SelectedItems.Count == 0) { return false; } if (this.listView1.SelectedItems.Count > 1) { var index = this.listView1.SelectedItems[0].Index; this.listView1.Items[index].Focused = true; } if (this.listView1.FocusedItem != null && this.listView1.FocusedItem.Selected) { string id = this.listView1.FocusedItem.Tag.ToString(); var result = this.resultMatList.Where(m => m.ID == id).FirstOrDefault(); int index = 0; if (result != null) { index = this.resultMatList.IndexOf(result); } if (this.documentWorkspace.GraphicsList != null && this.documentWorkspace.GraphicsList.Count > 0) { var list = this.resultMatList[index].dataInforList.Where(m => m.deleteFlag == 2).ToList(); for (int i = this.documentWorkspace.GraphicsList.Count - 1; i >= 0; i--) { if (this.documentWorkspace.GraphicsList[i].objectType != DrawClass.Measure) { continue; } if (this.documentWorkspace.GraphicsList[i].Selected == true) { var data = list.Where(m => m.aliasName == ((MeasureDrawObject)this.documentWorkspace.GraphicsList[i]).aliasName).FirstOrDefault(); if (data != null) { int dataIndex = list.IndexOf(data); list[dataIndex].value = 0; list[dataIndex].deleteFlag = 1; list[dataIndex].point1 = new System.Drawing.Point(0, 0); list[dataIndex].point2 = new System.Drawing.Point(0, 0); this.documentWorkspace.GraphicsList.RemoveObj(this.documentWorkspace.GraphicsList[i]); } } } InitButtonList(); } this.successNum = this.resultMatList[index].dataInforList.Where(m => m.value != 0).Count(); this.failNum = this.resultMatList[index].dataInforList.Where(m => m.value == 0).Count(); label4.Text = $"已绘制{this.successNum}条"; label5.Text = $"剩余{this.failNum}条"; #region [重置列表] //this.imageList1.Images.Clear(); //this.listView1.Items.Clear(); //InitPicList(); //this.listView1.Focus(); ////滚动到指定的行位置 //this.listView1.EnsureVisible(index); //this.listView1.Items[index].Focused = true; //this.listView1.Items[index].Selected = true; this.listView1.Items[index].BackColor = this.resultMatList[index].dataInforList.Where(m => m.value == 0).FirstOrDefault() == null ? Color.White : Color.Red; this.listView1.Refresh(); #endregion [重置列表] this.documentWorkspace.Refresh(); } return true; } #region 公共按钮 private void InitCommonButtonEvent() { this.commonControlButtons.zoomInButton.Click += new EventHandler(zoomInButton_Click); this.commonControlButtons.zoomOutButton.Click += new EventHandler(zoomOutButton_Click); this.commonControlButtons.zoomToWindowButton.Click += new EventHandler(zoomToWindowButton_Click); this.commonControlButtons.actualSizeButton.Click += new EventHandler(actualSizeButton_Click); this.commonControlButtons.pointerButton.Click += new EventHandler(pointerButton_Click); this.commonControlButtons.mobileModeButton.Click += new EventHandler(mobileModeButton_Click); this.commonControlButtons.zoomInFirst.Click += new EventHandler(zoomInFirst_Click); this.commonControlButtons.zoomInLast.Click += new EventHandler(zoomInLast_Click); this.commonControlButtons.zoomInNext.Click += new EventHandler(zoomInNext_Click); this.commonControlButtons.zoomInZuihou.Click += new EventHandler(zoomInZuihou_Click); } private void zoomInFirst_Click(object sender, EventArgs e) { if (listView1.Items.Count > 0) { listView1.Focus(); listView1.SelectedItems.Clear(); //滚动到指定的行位置 this.listView1.EnsureVisible(0); this.listView1.Items[0].Focused = true; this.listView1.Items[0].Selected = true; } } private void zoomInLast_Click(object sender, EventArgs e) { if (this.listView1.SelectedItems == null || this.listView1.SelectedItems.Count == 0) { return; } if (this.listView1.SelectedItems.Count > 1) { var index = this.listView1.SelectedItems[0].Index; this.listView1.SelectedItems.Clear(); this.listView1.Items[index].Focused = true; this.listView1.Items[index].Selected = true; } if (this.listView1.FocusedItem != null && this.listView1.FocusedItem.Selected) { int index = this.listView1.FocusedItem.Index; if (index != 0) { listView1.Focus(); listView1.SelectedItems.Clear(); //滚动到指定的行位置 this.listView1.EnsureVisible(index - 1); this.listView1.Items[index - 1].Focused = true; this.listView1.Items[index - 1].Selected = true; } } } private void zoomInNext_Click(object sender, EventArgs e) { if (this.listView1.SelectedItems == null || this.listView1.SelectedItems.Count == 0) { return; } if (this.listView1.SelectedItems.Count > 1) { var index = this.listView1.SelectedItems[this.listView1.SelectedItems.Count - 1].Index; this.listView1.SelectedItems.Clear(); this.listView1.Items[index].Focused = true; this.listView1.Items[index].Selected = true; } if (this.listView1.FocusedItem != null && this.listView1.FocusedItem.Selected) { if (this.listView1.FocusedItem != null && this.listView1.FocusedItem.Selected) { int index = this.listView1.FocusedItem.Index; if (index != this.listView1.Items.Count - 1) { listView1.Focus(); listView1.SelectedItems.Clear(); //滚动到指定的行位置 this.listView1.EnsureVisible(index + 1); this.listView1.Items[index + 1].Focused = true; this.listView1.Items[index + 1].Selected = true; } } } } private void zoomInZuihou_Click(object sender, EventArgs e) { if (listView1.Items.Count > 0) { listView1.Focus(); listView1.SelectedItems.Clear(); //滚动到指定的行位置 this.listView1.EnsureVisible(this.listView1.Items.Count - 1); this.listView1.Items[this.listView1.Items.Count - 1].Focused = true; this.listView1.Items[this.listView1.Items.Count - 1].Selected = true; } } private void zoomInButton_Click(object sender, EventArgs e) { if (this.bitmap != null) this.documentWorkspace.ZoomIn(); } private void zoomOutButton_Click(object sender, EventArgs e) { if (this.bitmap != null) this.documentWorkspace.ZoomOut(); } private void zoomToWindowButton_Click(object sender, EventArgs e) { this.documentWorkspace.ZoomBasis = ZoomBasis.FitToWindow; } private void actualSizeButton_Click(object sender, EventArgs e) { this.documentWorkspace.ZoomBasis = ZoomBasis.ScaleFactor; this.documentWorkspace.ScaleFactor = ScaleFactor.OneToOne; } private void pointerButton_Click(object sender, EventArgs e) { this.documentWorkspace.ActiveTool = Annotation.Enum.DrawToolType.Pointer; } private void mobileModeButton_Click(object sender, EventArgs e) { this.documentWorkspace.ActiveTool = Annotation.Enum.DrawToolType.MoveMode; } #endregion 公共按钮 //下拉列表初始化 private void InitializeCombo() { this.comboStatus.SelectedIndexChanged -= new System.EventHandler(this.comboStatus_SelectedIndexChanged); comboStatus.SelectedIndex = 0; this.comboStatus.SelectedIndexChanged += new System.EventHandler(this.comboStatus_SelectedIndexChanged); } public void InitPicList() { //初始化图片列表 for (int i = 0; i < this.resultMatList.Count; i++) { Mat mat = new Mat(); Cv2.CvtColor(this.resultMatList[i].resultMat, mat, ColorConversionCodes.BGRA2BGR); this.imageList1.Images.Add("img" + i, CreateThumbnail(mat)); this.listView1.Items.Add("", i); this.listView1.Items[i].ImageIndex = i; this.listView1.Items[i].Tag = this.resultMatList[i].ID; this.listView1.Items[i].Text = this.resultMatList[i].fileName; this.listView1.Items[i].BackColor = this.resultMatList[i].dataInforList.Where(m => m.value == 0).FirstOrDefault() == null ? Color.White : Color.Red; mat.Dispose(); } } /// /// 创建缩略图 /// public Bitmap CreateThumbnail(Mat mat) { Bitmap origin = OpenCvSharp.Extensions.BitmapConverter.ToBitmap(mat); Bitmap bitmap; if (origin.Width > origin.Height) { bitmap = MakeThumbnail(origin, 90, 90, "W"); } else if (origin.Height > origin.Width) { bitmap = MakeThumbnail(origin, 90, 90, "H"); } else { bitmap = MakeThumbnail(origin, 90, 90, "W"); } return bitmap; } /// /// 生成缩略图 /// /// 源图片 /// 缩略图宽度 /// 缩略图高度 /// 生成缩略图的方式 public static Bitmap MakeThumbnail(Image originalImage, int width, int height, string mode) { int towidth = width; int toheight = height; int x = 0; int y = 0; int ow = originalImage.Width; int oh = originalImage.Height; switch (mode) { case "HW"://指定高宽缩放(可能变形) break; case "W"://指定宽,高按比例 toheight = originalImage.Height * width / originalImage.Width; break; case "H"://指定高,宽按比例 towidth = originalImage.Width * height / originalImage.Height; break; case "Cut"://指定高宽裁减(不变形) if ((double)originalImage.Width / (double)originalImage.Height > (double)towidth / (double)toheight) { oh = originalImage.Height; ow = originalImage.Height * towidth / toheight; y = 0; x = (originalImage.Width - ow) / 2; } else { ow = originalImage.Width; oh = originalImage.Width * height / towidth; x = 0; y = (originalImage.Height - oh) / 2; } break; default: break; } //新建一个bmp图片 Bitmap bitmap = new System.Drawing.Bitmap(towidth, toheight); //新建一个画板 Graphics g = System.Drawing.Graphics.FromImage(bitmap); //设置高质量插值法 g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High; //设置高质量,低速度呈现平滑程度 g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality; //清空画布并以透明背景色填充 g.Clear(Color.Transparent); //在指定位置并且按指定大小绘制原图片的指定部分 g.DrawImage(originalImage, new Rectangle(0, 0, towidth, toheight), new Rectangle(x, y, ow, oh), GraphicsUnit.Pixel); return bitmap; } /// /// 改变图片选择 /// /// /// private void listView1_SelectedIndexChanged(object sender, EventArgs e) { if (this.listView1.FocusedItem != null && this.listView1.FocusedItem.Selected) { string id = this.listView1.FocusedItem.Tag.ToString(); var result = this.resultMatList.Where(m => m.ID == id).FirstOrDefault(); int index = 0; if (result != null) { index = this.resultMatList.IndexOf(result); } label3.Visible = true; label4.Visible = true; label5.Visible = true; Mat mat = new Mat(); Cv2.CvtColor(this.resultMatList[index].resultMat, mat, ColorConversionCodes.BGRA2BGR); if (pixelTrackingDialog != null) { pixelTrackingDialog.Mat = mat; } this.bitmap = OpenCvSharp.Extensions.BitmapConverter.ToBitmap(mat); Document document = Document.FromMat(mat); this.documentWorkspace.Document = document; this.documentWorkspace.Visible = true; label3.Text = $"共{this.resultMatList[index].allLineNum}条输出线"; this.successNum = this.resultMatList[index].dataInforList.Where(m => m.value != 0).Count(); this.failNum = this.resultMatList[index].dataInforList.Where(m => m.value == 0).Count(); label4.Text = $"已绘制{this.successNum}条"; label5.Text = $"剩余{this.failNum}条"; InitButtonList(); #region [往面板上绘制测量线] this.documentWorkspace.GraphicsList.Clear(); DrawLine(index); if (checkBox2.Checked) { if (this.resultMatList[index].GraphicsListList.Count > 0) { this.resultMatList[index].GraphicsListList[0].canMove = false; GraphicsList graphicsList = new GraphicsList(); graphicsList.Add(this.resultMatList[index].GraphicsListList[0].Clone(this.documentWorkspace)); graphicsList[0].Selected = false; this.documentWorkspace.GraphicsList.Add(graphicsList[0]); } this.documentWorkspace.Refresh(); } #endregion [往面板上绘制测量线] } else { label3.Visible = false; label4.Visible = false; label5.Visible = false; } } private void DrawLine(int index) { var list = this.resultMatList[index].dataInforList; this.documentWorkspace.GraphicsList.Clear(); List lines = new List(); foreach (var item in list) { if (item.value == 0) { continue; } double unit = 1; if (this.pidRuleDic.ContainsKey(this.resultMatList[index].parentId)) { if (this.pidRuleDic[this.resultMatList[index].parentId].ContainsKey(this.resultMatList[index].fileName)) { unit = this.pidRuleDic[this.resultMatList[index].parentId][this.resultMatList[index].fileName]; } } this.appWorkspace.setUnitNum(unit); var point1 = item.point1; var point2 = item.point2; switch (item.drawType) { case "MeasureLine": MeasureLine line = new MeasureLine(this.documentWorkspace, point1, point2, item.aliasName, unit); line.moved = true; line.ISurfaceBox = this.documentWorkspace; lines.Add(line); break; case "MeasureVLine": MeasureVLine vline = new MeasureVLine(this.documentWorkspace, point1, point2, item.aliasName, unit); vline.moved = true; vline.ISurfaceBox = this.documentWorkspace; lines.Add(vline); break; case "MeasureHLine": MeasureHLine hline = new MeasureHLine(this.documentWorkspace, point1, point2, item.aliasName, unit); hline.moved = true; hline.ISurfaceBox = this.documentWorkspace; lines.Add(hline); break; } } this.documentWorkspace.GraphicsList.AddRange(lines); this.documentWorkspace.GraphicsList.UnselectAll(); this.documentWorkspace.Refresh(); } /// /// 生成失败线的按钮 /// private void InitButtonList() { this.panel2.Controls.Clear(); string id = this.listView1.FocusedItem.Tag.ToString(); var result = this.resultMatList.Where(m => m.ID == id).FirstOrDefault(); int dataIndex = 0; if (result != null) { dataIndex = this.resultMatList.IndexOf(result); } var list = this.resultMatList[dataIndex].dataInforList.Where(m => m.value.Equals(0)).ToList(); //var list = this.resultMatList[dataIndex].dataInforList; int index = 0; foreach (var item in list) //for (int i = list.Count - 1; i >= 0; i--) { if (item.value.Equals(0)) { //int index = list.IndexOf(item); Button button = new Button(); if (index == 0) { button.Location = new System.Drawing.Point(17, 35); } else { button.Location = new System.Drawing.Point(17, 35 + 23 * index + 10 * index); } button.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2); button.Name = item.drawType + (index + 1).ToString(); button.Size = new System.Drawing.Size(75, 23); button.TabIndex = 0; button.Tag = item.aliasName; if (this.resultMatList[dataIndex].parentId.Equals("100209")) { button.Text = "曡構"; } else { button.Text = item.name; } button.UseVisualStyleBackColor = true; button.Click += new System.EventHandler(this.buttonShanchu_Click); panel2.Controls.Add(button); index++; } //var item = list[i]; } } private bool checkIsNum(string num) { try { int strNum = Convert.ToInt32(num); return true; } catch (Exception) { return false; } } private void buttonShanchu_Click(object sender, EventArgs e) { Button button = (Button)sender; this.selectedNum = Convert.ToInt32(button.Name.Substring(button.Name.Length - 1, 1)); var drawTypeName = button.Name.Substring(0, button.Name.Length - 1); if(checkIsNum(drawTypeName.Substring(drawTypeName.Length - 1, 1))) { drawTypeName = drawTypeName.Substring(0, drawTypeName.Length - 1); this.selectedNum = Convert.ToInt32(button.Name.Substring(button.Name.Length - 2, 2)); } //this.pixelTrackingEnabled = false; this.appWorkspace.setAliasName(button.Tag.ToString()); switch (drawTypeName) { case "MeasureLine": this.documentWorkspace.activeTool = DrawToolType.MeasureLine; break; case "MeasureVLine": this.documentWorkspace.activeTool = DrawToolType.MeasureVLine; break; case "MeasureHLine": this.documentWorkspace.activeTool = DrawToolType.MeasureHLine; break; } } private void documentWorkspace_panel_MouseUp(object sender, MouseEventArgs e) { if (this.listView1.SelectedItems == null || this.listView1.SelectedItems.Count == 0) { return; } if (this.listView1.SelectedItems.Count > 1) { var index = this.listView1.SelectedItems[0].Index; this.listView1.Items[index].Focused = true; } if (this.selectedNum == 0) { string id = this.listView1.FocusedItem.Tag.ToString(); var result = this.resultMatList.Where(m => m.ID == id).FirstOrDefault(); int index = 0; if (result != null) { index = this.resultMatList.IndexOf(result); } if (this.documentWorkspace.GraphicsList != null && this.documentWorkspace.GraphicsList.Count > 0) { var list = this.resultMatList[index].dataInforList.Where(m => m.deleteFlag == 2).ToList(); for (int i = this.documentWorkspace.GraphicsList.Count - 1; i >= 0; i--) { if (this.documentWorkspace.GraphicsList[i].objectType != DrawClass.Measure) { continue; } var data = list.Where(m => m.aliasName == ((MeasureDrawObject)this.documentWorkspace.GraphicsList[i]).aliasName).FirstOrDefault(); if (data != null) { MeasureDrawObject measureDrawObject = (MeasureDrawObject)this.documentWorkspace.GraphicsList[i]; int dataIndex = list.IndexOf(data); list[dataIndex].value = measureDrawObject.length; list[dataIndex].point1 = new System.Drawing.Point(Convert.ToInt32(measureDrawObject.startPoint.X), Convert.ToInt32(measureDrawObject.startPoint.Y)); list[dataIndex].point2 = new System.Drawing.Point(Convert.ToInt32(measureDrawObject.endPoint.X), Convert.ToInt32(measureDrawObject.endPoint.Y)); } } } } else { string id = this.listView1.FocusedItem.Tag.ToString(); var result = this.resultMatList.Where(m => m.ID == id).FirstOrDefault(); int dataIndex = 0; if (result != null) { dataIndex = this.resultMatList.IndexOf(result); } var list = this.resultMatList[dataIndex].dataInforList.Where(m => m.value.Equals(0)).ToList(); //var list = this.resultMatList[dataIndex].dataInforList; if (this.documentWorkspace.GraphicsList.Count == 0) { return; } if(list == null || list.Count == 0) { return; } var gra = (DrawObject)this.documentWorkspace.GraphicsList[0]; DataInfor data = new DataInfor(); data.name = list[this.selectedNum - 1].name; data.aliasName = list[this.selectedNum - 1].aliasName; data.point1 = new System.Drawing.Point((int)gra.startPoint.X, (int)gra.startPoint.Y); data.point2 = new System.Drawing.Point((int)gra.endPoint.X, (int)gra.endPoint.Y); data.value = gra.length; data.drawType = list[this.selectedNum - 1].drawType; data.ID = list[this.selectedNum - 1].ID; int index = this.resultMatList[dataIndex].dataInforList.IndexOf(list[this.selectedNum - 1]); this.resultMatList[dataIndex].dataInforList.RemoveAt(index); this.resultMatList[dataIndex].dataInforList.Insert(index, data); if (data.value != 0) { this.selectedNum = 0; } this.successNum = this.resultMatList[dataIndex].dataInforList.Where(m => m.value != 0).Count(); this.failNum = this.resultMatList[dataIndex].dataInforList.Where(m => m.value == 0).Count(); label4.Text = $"已绘制{this.successNum}条"; label5.Text = $"剩余{this.failNum}条"; InitButtonList(); //this.imageList1.Images.Clear(); //this.listView1.Items.Clear(); //InitPicList(); //this.listView1.Focus(); ////滚动到指定的行位置 //this.listView1.EnsureVisible(dataIndex); //this.listView1.Items[dataIndex].Focused = true; //this.listView1.Items[dataIndex].Selected = true; this.listView1.Items[dataIndex].BackColor = this.resultMatList[dataIndex].dataInforList.Where(m => m.value == 0).FirstOrDefault() == null ? Color.White : Color.Red; this.listView1.Refresh(); } } /// /// 不可点击空白区域 /// /// /// private void listView1_MouseUp(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Left) { if (listView1.SelectedItems.Count > 0) { } else if (listView1.SelectedItems.Count <= 0)//点击空白区 { if (this.listView1.FocusedItem != null) { ListViewItem item = this.listView1.GetItemAt(e.X, e.Y); if (item == null) { this.listView1.FocusedItem.Selected = true; } } } } } /// /// 分类选择 /// /// /// // TODO:筛选bug private void comboClassification_SelectedIndexChanged(object sender, EventArgs e) { MeasureMaintenanceTreeSpecificData data = (MeasureMaintenanceTreeSpecificData)comboClassification.SelectedItem; this.listView1.Items.Clear(); this.imageList1.Images.Clear(); this.documentWorkspace.Visible = false; int index = comboStatus.SelectedIndex; this.resultMatList.Clear(); if (data.MeasureMaintenanceTreeSpecificDataId.Equals("0")) { switch (index) { case 0: this.resultMatList.AddRange(this.realResultMatList); InitPicList(); break; case 1: List list = this.realResultMatList.Where(m => m.dataInforList.Where(n => n.value == 0).Count() == 0).ToList(); //初始化图片列表 for (int i = 0; i < list.Count; i++) { MeasureInfoResultModel measureInfoResultModel = new MeasureInfoResultModel(); measureInfoResultModel.ID = list[i].ID; measureInfoResultModel.allLineNum = list[i].allLineNum; measureInfoResultModel.dataInforList = list[i].dataInforList; measureInfoResultModel.failNum = list[i].failNum; measureInfoResultModel.fileName = list[i].fileName; measureInfoResultModel.GraphicsListList = list[i].GraphicsListList; measureInfoResultModel.imgStatus = list[i].imgStatus; measureInfoResultModel.isConductive = list[i].isConductive; measureInfoResultModel.isFanweibuchang = list[i].isFanweibuchang; measureInfoResultModel.isErzhichuli = list[i].isErzhichuli; measureInfoResultModel.OriginalImage = list[i].OriginalImage; measureInfoResultModel.parentId = list[i].parentId; measureInfoResultModel.resultMat = list[i].resultMat; measureInfoResultModel.successNum = list[i].successNum; this.resultMatList.Add(measureInfoResultModel); Mat mat = new Mat(); Cv2.CvtColor(list[i].resultMat, mat, ColorConversionCodes.BGRA2BGR); this.imageList1.Images.Add("img" + i, CreateThumbnail(mat)); this.listView1.Items.Add("", i); this.listView1.Items[i].Tag = list[i].ID; this.listView1.Items[i].ImageIndex = i; this.listView1.Items[i].Text = list[i].fileName; this.listView1.Items[i].BackColor = list[i].dataInforList.Where(m => m.value == 0).FirstOrDefault() == null ? Color.White : Color.Red; } break; case 2: List list1 = this.realResultMatList.Where(m => m.dataInforList.Where(n => n.value == 0).Count() != 0).ToList(); ; //初始化图片列表 for (int i = 0; i < list1.Count; i++) { MeasureInfoResultModel measureInfoResultModel = new MeasureInfoResultModel(); measureInfoResultModel.ID = list1[i].ID; measureInfoResultModel.allLineNum = list1[i].allLineNum; measureInfoResultModel.dataInforList = list1[i].dataInforList; measureInfoResultModel.failNum = list1[i].failNum; measureInfoResultModel.fileName = list1[i].fileName; measureInfoResultModel.GraphicsListList = list1[i].GraphicsListList; measureInfoResultModel.imgStatus = list1[i].imgStatus; measureInfoResultModel.isConductive = list1[i].isConductive; measureInfoResultModel.isFanweibuchang = list1[i].isFanweibuchang; measureInfoResultModel.isErzhichuli = list1[i].isErzhichuli; measureInfoResultModel.OriginalImage = list1[i].OriginalImage; measureInfoResultModel.parentId = list1[i].parentId; measureInfoResultModel.resultMat = list1[i].resultMat; measureInfoResultModel.successNum = list1[i].successNum; this.resultMatList.Add(measureInfoResultModel); Mat mat = new Mat(); Cv2.CvtColor(list1[i].resultMat, mat, ColorConversionCodes.BGRA2BGR); this.imageList1.Images.Add("img" + i, CreateThumbnail(mat)); this.listView1.Items.Add("", i); this.listView1.Items[i].Tag = list1[i].ID; this.listView1.Items[i].ImageIndex = i; this.listView1.Items[i].Text = list1[i].fileName; this.listView1.Items[i].BackColor = list1[i].dataInforList.Where(m => m.value == 0).FirstOrDefault() == null ? Color.White : Color.Red; } break; } } else { switch (index) { case 0: List list2 = this.realResultMatList.Where(m => m.parentId.Equals(data.MeasureMaintenanceTreeSpecificDataId)).ToList(); ; //初始化图片列表 for (int i = 0; i < list2.Count; i++) { MeasureInfoResultModel measureInfoResultModel = new MeasureInfoResultModel(); measureInfoResultModel.ID = list2[i].ID; measureInfoResultModel.allLineNum = list2[i].allLineNum; measureInfoResultModel.dataInforList = list2[i].dataInforList; measureInfoResultModel.failNum = list2[i].failNum; measureInfoResultModel.fileName = list2[i].fileName; measureInfoResultModel.GraphicsListList = list2[i].GraphicsListList; measureInfoResultModel.imgStatus = list2[i].imgStatus; measureInfoResultModel.isConductive = list2[i].isConductive; measureInfoResultModel.isFanweibuchang = list2[i].isFanweibuchang; measureInfoResultModel.isErzhichuli = list2[i].isErzhichuli; measureInfoResultModel.OriginalImage = list2[i].OriginalImage; measureInfoResultModel.parentId = list2[i].parentId; measureInfoResultModel.resultMat = list2[i].resultMat; measureInfoResultModel.successNum = list2[i].successNum; this.resultMatList.Add(measureInfoResultModel); Mat mat = new Mat(); Cv2.CvtColor(list2[i].resultMat, mat, ColorConversionCodes.BGRA2BGR); this.imageList1.Images.Add("img" + i, CreateThumbnail(mat)); this.listView1.Items.Add("", i); this.listView1.Items[i].Tag = list2[i].ID; this.listView1.Items[i].ImageIndex = i; this.listView1.Items[i].Text = list2[i].fileName; this.listView1.Items[i].BackColor = list2[i].dataInforList.Where(m => m.value == 0).FirstOrDefault() == null ? Color.White : Color.Red; } break; case 1: List list = this.realResultMatList.Where(m => m.parentId.Equals(data.MeasureMaintenanceTreeSpecificDataId) && m.dataInforList.Where(n => n.value == 0).Count() == 0).ToList(); ; //初始化图片列表 for (int i = 0; i < list.Count; i++) { MeasureInfoResultModel measureInfoResultModel = new MeasureInfoResultModel(); measureInfoResultModel.ID = list[i].ID; measureInfoResultModel.allLineNum = list[i].allLineNum; measureInfoResultModel.dataInforList = list[i].dataInforList; measureInfoResultModel.failNum = list[i].failNum; measureInfoResultModel.fileName = list[i].fileName; measureInfoResultModel.GraphicsListList = list[i].GraphicsListList; measureInfoResultModel.imgStatus = list[i].imgStatus; measureInfoResultModel.isConductive = list[i].isConductive; measureInfoResultModel.isFanweibuchang = list[i].isFanweibuchang; measureInfoResultModel.isErzhichuli = list[i].isErzhichuli; measureInfoResultModel.OriginalImage = list[i].OriginalImage; measureInfoResultModel.parentId = list[i].parentId; measureInfoResultModel.resultMat = list[i].resultMat; measureInfoResultModel.successNum = list[i].successNum; this.resultMatList.Add(measureInfoResultModel); Mat mat = new Mat(); Cv2.CvtColor(list[i].resultMat, mat, ColorConversionCodes.BGRA2BGR); this.imageList1.Images.Add("img" + i, CreateThumbnail(mat)); this.listView1.Items.Add("", i); this.listView1.Items[i].Tag = list[i].ID; this.listView1.Items[i].ImageIndex = i; this.listView1.Items[i].Text = list[i].fileName; this.listView1.Items[i].BackColor = list[i].dataInforList.Where(m => m.value == 0).FirstOrDefault() == null ? Color.White : Color.Red; } break; case 2: List list1 = this.realResultMatList.Where(m => m.parentId.Equals(data.MeasureMaintenanceTreeSpecificDataId) && m.dataInforList.Where(n => n.value == 0).Count() != 0).ToList(); //初始化图片列表 for (int i = 0; i < list1.Count; i++) { MeasureInfoResultModel measureInfoResultModel = new MeasureInfoResultModel(); measureInfoResultModel.ID = list1[i].ID; measureInfoResultModel.allLineNum = list1[i].allLineNum; measureInfoResultModel.dataInforList = list1[i].dataInforList; measureInfoResultModel.failNum = list1[i].failNum; measureInfoResultModel.fileName = list1[i].fileName; measureInfoResultModel.GraphicsListList = list1[i].GraphicsListList; measureInfoResultModel.imgStatus = list1[i].imgStatus; measureInfoResultModel.isConductive = list1[i].isConductive; measureInfoResultModel.isFanweibuchang = list1[i].isFanweibuchang; measureInfoResultModel.isErzhichuli = list1[i].isErzhichuli; measureInfoResultModel.OriginalImage = list1[i].OriginalImage; measureInfoResultModel.parentId = list1[i].parentId; measureInfoResultModel.resultMat = list1[i].resultMat; measureInfoResultModel.successNum = list1[i].successNum; this.resultMatList.Add(measureInfoResultModel); Mat mat = new Mat(); Cv2.CvtColor(list1[i].resultMat, mat, ColorConversionCodes.BGRA2BGR); this.imageList1.Images.Add("img" + i, CreateThumbnail(mat)); this.listView1.Items.Add("", i); this.listView1.Items[i].Tag = list1[i].ID; this.listView1.Items[i].ImageIndex = i; this.listView1.Items[i].Text = list1[i].fileName; this.listView1.Items[i].BackColor = list1[i].dataInforList.Where(m => m.value == 0).FirstOrDefault() == null ? Color.White : Color.Red; } break; } } this.bitmap = null; } /// /// 状态选择 /// /// /// private void comboStatus_SelectedIndexChanged(object sender, EventArgs e) { int index = comboStatus.SelectedIndex; this.listView1.Items.Clear(); this.imageList1.Images.Clear(); this.documentWorkspace.Visible = false; this.resultMatList.Clear(); MeasureMaintenanceTreeSpecificData data = (MeasureMaintenanceTreeSpecificData)comboClassification.SelectedItem; switch (index) { case 0: List list2; if (data.MeasureMaintenanceTreeSpecificDataId.Equals("0")) { list2 = this.realResultMatList; } else { list2 = this.realResultMatList.Where(m => m.parentId.Equals(data.MeasureMaintenanceTreeSpecificDataId)).ToList(); } //初始化图片列表 for (int i = 0; i < list2.Count; i++) { MeasureInfoResultModel measureInfoResultModel = new MeasureInfoResultModel(); measureInfoResultModel.ID = list2[i].ID; measureInfoResultModel.allLineNum = list2[i].allLineNum; measureInfoResultModel.dataInforList = list2[i].dataInforList; measureInfoResultModel.failNum = list2[i].failNum; measureInfoResultModel.fileName = list2[i].fileName; measureInfoResultModel.GraphicsListList = list2[i].GraphicsListList; measureInfoResultModel.imgStatus = list2[i].imgStatus; measureInfoResultModel.isConductive = list2[i].isConductive; measureInfoResultModel.isFanweibuchang = list2[i].isFanweibuchang; measureInfoResultModel.isErzhichuli = list2[i].isErzhichuli; measureInfoResultModel.OriginalImage = list2[i].OriginalImage; measureInfoResultModel.parentId = list2[i].parentId; measureInfoResultModel.resultMat = list2[i].resultMat; measureInfoResultModel.successNum = list2[i].successNum; this.resultMatList.Add(measureInfoResultModel); Mat mat = new Mat(); Cv2.CvtColor(list2[i].resultMat, mat, ColorConversionCodes.BGRA2BGR); this.imageList1.Images.Add("img" + i, CreateThumbnail(mat)); this.listView1.Items.Add("", i); this.listView1.Items[i].Tag = list2[i].ID; this.listView1.Items[i].ImageIndex = i; this.listView1.Items[i].Text = list2[i].fileName; this.listView1.Items[i].BackColor = list2[i].dataInforList.Where(m => m.value == 0).FirstOrDefault() == null ? Color.White : Color.Red; } break; case 1: List list; if (data.MeasureMaintenanceTreeSpecificDataId.Equals("0")) { list = this.realResultMatList.Where(m => m.dataInforList.Where(n => n.value == 0).Count() == 0).ToList(); } else { list = this.realResultMatList.Where(m => m.parentId.Equals(data.MeasureMaintenanceTreeSpecificDataId) && m.dataInforList.Where(n => n.value == 0).Count() == 0).ToList(); } //初始化图片列表 for (int i = 0; i < list.Count; i++) { MeasureInfoResultModel measureInfoResultModel = new MeasureInfoResultModel(); measureInfoResultModel.ID = list[i].ID; measureInfoResultModel.allLineNum = list[i].allLineNum; measureInfoResultModel.dataInforList = list[i].dataInforList; measureInfoResultModel.failNum = list[i].failNum; measureInfoResultModel.fileName = list[i].fileName; measureInfoResultModel.GraphicsListList = list[i].GraphicsListList; measureInfoResultModel.imgStatus = list[i].imgStatus; measureInfoResultModel.isConductive = list[i].isConductive; measureInfoResultModel.isFanweibuchang = list[i].isFanweibuchang; measureInfoResultModel.isErzhichuli = list[i].isErzhichuli; measureInfoResultModel.OriginalImage = list[i].OriginalImage; measureInfoResultModel.parentId = list[i].parentId; measureInfoResultModel.resultMat = list[i].resultMat; measureInfoResultModel.successNum = list[i].successNum; this.resultMatList.Add(measureInfoResultModel); Mat mat = new Mat(); Cv2.CvtColor(list[i].resultMat, mat, ColorConversionCodes.BGRA2BGR); this.imageList1.Images.Add("img" + i, CreateThumbnail(mat)); this.listView1.Items.Add("", i); this.listView1.Items[i].Tag = list[i].ID; this.listView1.Items[i].ImageIndex = i; this.listView1.Items[i].Text = list[i].fileName; this.listView1.Items[i].BackColor = list[i].dataInforList.Where(m => m.value == 0).FirstOrDefault() == null ? Color.White : Color.Red; } break; case 2: List list1; if (data.MeasureMaintenanceTreeSpecificDataId.Equals("0")) { list1 = this.realResultMatList.Where(m => m.dataInforList.Where(n => n.value == 0).Count() != 0).ToList(); } else { list1 = this.realResultMatList.Where(m => m.parentId.Equals(data.MeasureMaintenanceTreeSpecificDataId) && m.dataInforList.Where(n => n.value == 0).Count() != 0).ToList(); } //初始化图片列表 for (int i = 0; i < list1.Count; i++) { MeasureInfoResultModel measureInfoResultModel = new MeasureInfoResultModel(); measureInfoResultModel.ID = list1[i].ID; measureInfoResultModel.allLineNum = list1[i].allLineNum; measureInfoResultModel.dataInforList = list1[i].dataInforList; measureInfoResultModel.failNum = list1[i].failNum; measureInfoResultModel.fileName = list1[i].fileName; measureInfoResultModel.GraphicsListList = list1[i].GraphicsListList; measureInfoResultModel.imgStatus = list1[i].imgStatus; measureInfoResultModel.isConductive = list1[i].isConductive; measureInfoResultModel.isFanweibuchang = list1[i].isFanweibuchang; measureInfoResultModel.isErzhichuli = list1[i].isErzhichuli; measureInfoResultModel.OriginalImage = list1[i].OriginalImage; measureInfoResultModel.parentId = list1[i].parentId; measureInfoResultModel.resultMat = list1[i].resultMat; measureInfoResultModel.successNum = list1[i].successNum; this.resultMatList.Add(measureInfoResultModel); Mat mat = new Mat(); Cv2.CvtColor(list1[i].resultMat, mat, ColorConversionCodes.BGRA2BGR); this.imageList1.Images.Add("img" + i, CreateThumbnail(mat)); this.listView1.Items.Add("", i); this.listView1.Items[i].Tag = list1[i].ID; this.listView1.Items[i].ImageIndex = i; this.listView1.Items[i].Text = list1[i].fileName; this.listView1.Items[i].BackColor = list1[i].dataInforList.Where(m => m.value == 0).FirstOrDefault() == null ? Color.White : Color.Red; } break; } this.bitmap = null; } /// /// 生成报告 /// /// /// private void buttonGenerateReport_Click(object sender, EventArgs e) { if (listView1.Items.Count == 0) { MessageBox.Show(PdnResources.GetString("NewNoDataGenerateReport") + "!"); return; } if (string.IsNullOrEmpty(measureMaintenanceType.templateFilePath) || !System.IO.File.Exists(measureMaintenanceType.templateFilePath)) { MessageBox.Show(PdnResources.GetString("NoTemplateSelected")); OpenFileDialog dialog = new OpenFileDialog(); dialog.Filter = "Excel文件|*.xls;*.xlsx"; dialog.Title = "选择模板"; dialog.Multiselect = false; //该值确定是否可以选择多个文件 if (dialog.ShowDialog() != DialogResult.OK) { return; } string file = dialog.FileName; measureMaintenanceType.templateFilePath = file; } #region [上传数据库组织数据] bool needUploadData = false; bool needSPCUploadData = false; //配置文档中关于接口的相关配置项 string userName = Program.instance.configModel.UserName; string passWord = Program.instance.configModel.PassWord; string equId = Program.instance.configModel.EquId; string groupId = Program.instance.configModel.GroupId; string funId = Program.instance.configModel.FunId; string funId2 = Program.instance.configModel.FunId2; string funId3 = Program.instance.configModel.FunId3; string createdate = DateTime.Now.ToString("yyyy-MM-dd"); string mainID = Guid.NewGuid().ToString(); string paraname = "ID|Name| RulerName| RulerPixelLength| RulerPhysicalLength| PartNo| UseFactory|OrderNum|Laboratory|BatchNumber|Shift|ProcessType|Level1| ElectroplatingLine|Unit|Remark "; string rulerName = this.measureMaintenanceType.ruleMessage == null ? string.Empty : this.measureMaintenanceType.ruleMessage.ruleName; decimal rulerPhysicalLength = this.measureMaintenanceType.ruleMessage == null ? 0 : this.measureMaintenanceType.ruleMessage.physicalLength; float rulerPixelLength = this.measureMaintenanceType.ruleMessage == null ? 0 : this.measureMaintenanceType.ruleMessage.pixelLength; if (string.IsNullOrEmpty(this.measureMaintenanceType.measureMaintenanceContent)) { this.measureMaintenanceType.measureMaintenanceContent = "默認備註"; } //实验室需要的数据字段,一个主表两个子表。有递进关系 string paravalue = $"{mainID}|{this.measureMaintenanceType.measureMaintenanceName}|{rulerName}|{rulerPixelLength}|{rulerPhysicalLength}|{this.measureMaintenanceType.measureMaintenanceBasicDataList[0].measureMaintenanceBasicDataValue}|{this.measureMaintenanceType.measureMaintenanceBasicDataList[3].measureMaintenanceBasicDataValue}|{this.measureMaintenanceType.measureMaintenanceBasicDataList[5].measureMaintenanceBasicDataValue}|{this.measureMaintenanceType.measureMaintenanceBasicDataList[2].measureMaintenanceBasicDataValue}|{this.measureMaintenanceType.measureMaintenanceBasicDataList[6].measureMaintenanceBasicDataValue}|{this.measureMaintenanceType.measureMaintenanceBasicDataList[1].measureMaintenanceBasicDataValue}|{this.measureMaintenanceType.measureMaintenanceBasicDataList[4].measureMaintenanceBasicDataValue}|{this.measureMaintenanceType.measureMaintenanceBasicDataList[7].measureMaintenanceBasicDataValue}|{this.measureMaintenanceType.measureMaintenanceBasicDataList[8].measureMaintenanceBasicDataValue}|{this.measureMaintenanceType.measureMaintenanceBasicDataList[9].measureMaintenanceBasicDataValue}|{this.measureMaintenanceType.measureMaintenanceContent}"; string paraname2 = "ID|MainId|HoleType|TestItem|SpecificationCondition|scnum|scrangegreatenum|Judgment "; string paraname3 = "ID|Name|Value|FilePath|DataId|MainId "; #endregion [上传数据库组织数据] //SPC上传 switch (Program.instance.configModel.autoSPCUpload) { case 1: needSPCUploadData = true; if (string.IsNullOrEmpty(this.measureMaintenanceType.measureMaintenanceBasicDataList[0].measureMaintenanceBasicDataValue)) { ResultViewItemNo resultViewItemNo = new ResultViewItemNo(this); resultViewItemNo.StartPosition = FormStartPosition.CenterParent; resultViewItemNo.ShowDialog(); return; } break; case 2: needSPCUploadData = false; break; case 3: if (!this.isSPCItemNull) { DialogResult result = MessageBox.Show(PdnResources.GetString("UpdateSpc"), PdnResources.GetString("NewTips"), MessageBoxButtons.OKCancel); if (result == DialogResult.OK) { needSPCUploadData = true; if (string.IsNullOrEmpty(this.measureMaintenanceType.measureMaintenanceBasicDataList[0].measureMaintenanceBasicDataValue)) { ResultViewItemNo resultViewItemNo = new ResultViewItemNo(this); resultViewItemNo.StartPosition = FormStartPosition.CenterParent; resultViewItemNo.ShowDialog(); return; } } } break; } //实验室上传 switch (Program.instance.configModel.autoUpload) { case 1: needUploadData = true; try { var resultData = webServiceDll.ws.sendDataToSerGrp(userName, passWord, equId, groupId, funId, paraname, paravalue, createdate); writeLog(resultData, "0003上传回参"); } catch (Exception ex) { writeLog(ex.Message); } break; case 2: needUploadData = false; break; case 3: DialogResult result = MessageBox.Show(PdnResources.GetString("NewUploadDatabase") + "?", PdnResources.GetString("NewTips"), MessageBoxButtons.OKCancel); if (result == DialogResult.OK) { needUploadData = true; try { var resultData = webServiceDll.ws.sendDataToSerGrp(userName, passWord, equId, groupId, funId, paraname, paravalue, createdate); writeLog(resultData, "0003上传回参"); } catch (Exception ex) { writeLog(ex.Message); } } break; } string fileName = DateTime.Now.ToString("yyyyMMddhhmmss") + "切片报告.xls"; #region [命名规则] string ruleName = string.Empty; string ruleGain = string.Empty; if (this.measureMaintenanceType.ruleMessage != null) { ruleName = this.measureMaintenanceType.ruleMessage.ruleName; ruleGain = this.measureMaintenanceType.ruleMessage.ruleGain.ToString(); } else { List list = Program.instance.mic_rulersAll; var ruler = list.Where(m => m.id.Equals(Program.instance.configModel.RulerId)).FirstOrDefault(); if (ruler != null) { ruleName = ruler.ruler_name; ruleGain = ruler.gain_multiple.ToString(); } } NamingRuleHelper namingRuleHelper = new NamingRuleHelper(); if (this.thisNameRuleListDetails == null) { if (!string.IsNullOrEmpty(this.measureMaintenanceType.NameRuleID)) { NameRuleListDetails nameRuleListDetails = Program.instance.fileNameRule.NameRuleList.Where(m => m.ID == this.measureMaintenanceType.NameRuleID).FirstOrDefault(); if (nameRuleListDetails != null) { fileName = namingRuleHelper.GetNameFromXml(nameRuleListDetails, ruleName, ruleGain, this.measureMaintenanceType, this.filePath) + ".xls"; if (nameRuleListDetails.isContinue) { nameRuleListDetails.NowNumber += 1; } string stageModelXml = XmlSerializeHelper.XmlSerialize(Program.instance.fileNameRule); FileOperationHelper.WriteStringToFile(stageModelXml, Application.StartupPath + "\\Config\\" + Program.instance.SettingPrefix + "\\FileNameRule.xml", FileMode.Create); } } } else { fileName = namingRuleHelper.GetNameFromXml(this.thisNameRuleListDetails, ruleName, ruleGain, this.measureMaintenanceType, this.filePath) + ".xls"; if (this.thisNameRuleListDetails.isContinue) { this.thisNameRuleListDetails.NowNumber += 1; } } if (string.IsNullOrEmpty(fileName) || fileName.Equals(".xls")) { fileName = DateTime.Now.ToString("yyyyMMddhhmmss") + "切片报告.xls"; } #endregion string path = this.filePath + "\\" + fileName; string temp = Application.StartupPath + "\\Config\\" + Program.instance.SettingPrefix + "\\TempFile"; if (!System.IO.Directory.Exists(temp)) { System.IO.Directory.CreateDirectory(temp); } string tempFilePath = Application.StartupPath + "\\Config\\" + Program.instance.SettingPrefix + "\\TempFile\\" + fileName; //List thisResultMatList = new List(); //for (int i = 0; i < this.listView1.SelectedItems.Count; i++) //{ // int index = this.listView1.SelectedItems[i].Index; // thisResultMatList.Add(this.resultMatList[index]); //} ProgressThreadProcClass procClass = new ProgressThreadProcClass(); int itemCount = 100; ProgressThreadProcClass.IFileTransferProgressEvents progressEvents = new ProgressThreadProcClass.IFileTransferProgressEvents(); System.Threading.ThreadStart copyThreadProc = delegate () { #region [对公式进行赋值] MeasureInfoExportModel measureInfoExportModel = OrganizeResultData(this.resultMatList); #endregion [对公式进行赋值] #region [组织数据 开整!] Excel.Application excelApp = new Excel.Application(); Excel.Workbook workBook = excelApp.Workbooks.Open(this.measureMaintenanceType.templateFilePath); try { Excel.Names wbNames = workBook.Names; int columnValue = 0; int rowValue = 0; int dataColumnValue = 0; int dataCowValue = 0; //根据单元格名称放值 foreach (var item in this.measureMaintenanceType.measureMaintenanceBasicDataList) { int index = this.measureMaintenanceType.measureMaintenanceBasicDataList.IndexOf(item); foreach (Excel.Name n in wbNames) { if (n.Name.Equals(item.measureMaintenanceBasicDataPosition)) { n.RefersToRange.Value = item.measureMaintenanceBasicDataValue; if (item.measureMaintenanceBasicDataIndex == 10) { n.RefersToRange.Value = $"{DateTime.Now.Year}年{DateTime.Now.Month}月{DateTime.Now.Day}日"; } } if (n.Name.Equals("Value1")) { dataColumnValue = n.RefersToRange.Column; dataCowValue = n.RefersToRange.Row + 1; } if (n.Name.Equals("Judgment")) { columnValue = n.RefersToRange.Column; rowValue = n.RefersToRange.Row; } } } DataTable dataTable = new DataTable(); var workSheet = (Microsoft.Office.Interop.Excel.Worksheet)workBook.Worksheets[1]; Excel.Range range = workSheet.Range["Judgment"]; if (this.measureMaintenanceType.outputPicturesNum > 5) { double width = Convert.ToDouble(((Excel.Range)workSheet.Columns[columnValue - 1]).ColumnWidth); for (int i = 6; i <= this.measureMaintenanceType.outputPicturesNum; i++) { #region [添加列] range.EntireColumn.Insert(Excel.XlInsertShiftDirection.xlShiftToRight, Excel.XlInsertFormatOrigin.xlFormatFromRightOrBelow); workSheet.Cells[rowValue, columnValue] = i.ToString(); workBook.Names.Add($"Value{i}", workSheet.Cells[rowValue, columnValue], true); ((Excel.Range)workSheet.Columns[columnValue]).ColumnWidth = width; //合并单元格 Excel.Range range1 = workSheet.Range[workSheet.Cells[rowValue, columnValue], workSheet.Cells[rowValue + 1, columnValue]]; range1.Merge(0); columnValue++; #endregion [添加列] } } #region [分组铺数据] var HoleTypeList = measureInfoExportModel.measureInfoExportDataModelList; int realDataRowValue = dataCowValue; int secondRowValue = dataCowValue + 1; int firstRowValue = dataCowValue + 1; Excel.Range range2 = workSheet.Range["Standard"]; int dataIndex = 1; Dictionary> spcDataList = new Dictionary>(); foreach (var item in HoleTypeList) { this.Invoke(new Action(() => { progressEvents.SetStringProgress(PdnResources.GetString("Dealing") + dataIndex + PdnResources.GetString("GeCeLiangFenLiangZhong")); })); List dynamicList = new List(); int rowIndex = -1; foreach (var item2 in item.itemTypeList) { string dataId = Guid.NewGuid().ToString(); int index = -1; foreach (var item3 in item2.LineDataList) { int realDataColumnValue = dataColumnValue; //添加1行 range2.EntireRow.Insert(Excel.XlInsertShiftDirection.xlShiftDown, Excel.XlInsertFormatOrigin.xlFormatFromRightOrBelow); #region [量测位置] workSheet.Cells[realDataRowValue + 1, dataColumnValue - 1] = item3.name; workSheet.Cells[realDataRowValue + 1, dataColumnValue - 1].HorizontalAlignment = Excel.XlHAlign.xlHAlignCenter; workSheet.Cells[realDataRowValue + 1, dataColumnValue - 1].VerticalAlignment = Excel.XlVAlign.xlVAlignCenter; Excel.Range range3 = workSheet.Range[workSheet.Cells[realDataRowValue + 1, dataColumnValue - 1], workSheet.Cells[realDataRowValue + 1, dataColumnValue - 1]]; range3.BorderAround(Excel.XlLineStyle.xlContinuous, Excel.XlBorderWeight.xlThin, Excel.XlColorIndex.xlColorIndexAutomatic, System.Drawing.Color.Black.ToArgb()); #endregion [量测位置] #region [数据] string douData = "0"; //如果是最大值 最小值 平均值 则只取一个值 if (item3.isMaxOrMin) { switch (item3.typeCase) { case 1: douData = Math.Round(item3.value.Max(), Program.instance.decimalPlaces).ToString(); break; case 2: douData = Math.Round(item3.value.Min(), Program.instance.decimalPlaces).ToString(); break; case 3: douData = Math.Round(item3.value.Average(), Program.instance.decimalPlaces).ToString(); break; } workSheet.Cells[realDataRowValue + 1, realDataColumnValue] = douData; dynamic dy = new ExpandoObject(); dy.name = item3.name; dy.dataId = dataId; dy.dataType = 1; dy.testItems = item2.TestItems; dy.value = workSheet.Cells[realDataRowValue + 1, realDataColumnValue]; dynamicList.Add(dy); if (spcDataList.ContainsKey(item2.TestItems)) { spcDataList[item2.TestItems].Add(dy); } else { spcDataList.Add(item2.TestItems, new List() { dy }); } workSheet.Cells[realDataRowValue + 1, realDataColumnValue].HorizontalAlignment = Excel.XlHAlign.xlHAlignCenter; workSheet.Cells[realDataRowValue + 1, realDataColumnValue].VerticalAlignment = Excel.XlVAlign.xlVAlignCenter; //合并单元格 Excel.Range range15 = workSheet.Range[workSheet.Cells[realDataRowValue + 1, realDataColumnValue], workSheet.Cells[realDataRowValue + 1, realDataColumnValue + (this.measureMaintenanceType.outputPicturesNum - 1)]]; double doubleData = Convert.ToDouble(douData); if (!outOk(doubleData, item2.Specification)) { range15.Cells.Interior.Color = Color.FromArgb(0, 0, 255).ToArgb(); } range15.Merge(0); range15.BorderAround(Excel.XlLineStyle.xlContinuous, Excel.XlBorderWeight.xlThin, Excel.XlColorIndex.xlColorIndexAutomatic, System.Drawing.Color.Black.ToArgb()); realDataRowValue++; } else { foreach (var item4 in item3.value) { workSheet.Cells[realDataRowValue + 1, realDataColumnValue] = item4; workSheet.Cells[realDataRowValue + 1, realDataColumnValue].HorizontalAlignment = Excel.XlHAlign.xlHAlignCenter; workSheet.Cells[realDataRowValue + 1, realDataColumnValue].VerticalAlignment = Excel.XlVAlign.xlVAlignCenter; Excel.Range range1 = workSheet.Range[workSheet.Cells[realDataRowValue + 1, realDataColumnValue], workSheet.Cells[realDataRowValue + 1, realDataColumnValue]]; dynamic dy = new ExpandoObject(); dy.name = item3.name; dy.dataId = dataId; dy.testItems = item2.TestItems; dy.dataType = 2; dy.value = item4; dy.imgIndex = item3.value.IndexOf(item4); dynamicList.Add(dy); if (spcDataList.ContainsKey(item2.TestItems)) { spcDataList[item2.TestItems].Add(dy); } else { spcDataList.Add(item2.TestItems, new List() { dy }); } if (item3.NgValue.Contains(item4)) { if (double.IsInfinity(item4) || double.IsNaN(item4)) { workSheet.Cells[realDataRowValue + 1, realDataColumnValue] = "error"; workSheet.Cells[realDataRowValue + 1, realDataColumnValue].HorizontalAlignment = Excel.XlHAlign.xlHAlignCenter; workSheet.Cells[realDataRowValue + 1, realDataColumnValue].VerticalAlignment = Excel.XlVAlign.xlVAlignCenter; range1 = workSheet.Range[workSheet.Cells[realDataRowValue + 1, realDataColumnValue], workSheet.Cells[realDataRowValue + 1, realDataColumnValue]]; } range1.Cells.Interior.Color = Color.FromArgb(0, 0, 255).ToArgb(); } range1.BorderAround(Excel.XlLineStyle.xlContinuous, Excel.XlBorderWeight.xlThin, Excel.XlColorIndex.xlColorIndexAutomatic, System.Drawing.Color.Black.ToArgb()); realDataColumnValue++; } realDataRowValue++; } #endregion [数据] index++; rowIndex++; } #region [规格] var spec = item2.Specification; string data = string.Empty; string SpecificationCondition = "Unconditional"; decimal SpecificationCOnditionNum = 0; decimal SpecificationCOnditionRangeGreateNum = 0; List list = new List(); if (!string.IsNullOrEmpty(spec) && !spec.Contains("-")) { list = spec.Split('X').ToList(); if (list.Count == 2) { list[0] = list[0].Replace("<=", "LQ").Replace("<", "L"); list[1] = list[1].Replace("<=", "LQ").Replace("<", "L"); if (string.IsNullOrEmpty(list[0]) && string.IsNullOrEmpty(list[1])) { } else if (string.IsNullOrEmpty(list[0])) { if (list[1].Contains("LQ")) { data = $"{list[1].Replace("LQ", "<=")}"; SpecificationCondition = "LessEqual"; SpecificationCOnditionNum = Convert.ToDecimal(list[1].Replace("LQ", "")); } else { data = $"{list[1].Replace("L", "<")}"; SpecificationCondition = "Less"; SpecificationCOnditionNum = Convert.ToDecimal(list[1].Replace("L", "")); } } else if (string.IsNullOrEmpty(list[1])) { if (list[0].Contains("LQ")) { data = $"{list[0].Replace("LQ", "<=")}"; SpecificationCondition = "GreaterEqual"; SpecificationCOnditionNum = Convert.ToDecimal(list[0].Replace("LQ", "")); } else { data = $"{list[0].Replace("L", "<")}"; SpecificationCondition = "Greater"; SpecificationCOnditionNum = Convert.ToDecimal(list[0].Replace("L", "")); } } else { data = $"{spec.Replace("<=", "").Replace("<", "").Replace("X", "~")}"; SpecificationCondition = "Range"; SpecificationCOnditionNum = Convert.ToDecimal(list[0].Replace("LQ", "").Replace("L", "")); SpecificationCOnditionRangeGreateNum = Convert.ToDecimal(list[1].Replace("LQ", "").Replace("L", "")); } } } workSheet.Cells[secondRowValue, dataColumnValue - 2] = data; workSheet.Cells[secondRowValue, dataColumnValue - 2].HorizontalAlignment = Excel.XlHAlign.xlHAlignCenter; workSheet.Cells[secondRowValue, dataColumnValue - 2].VerticalAlignment = Excel.XlVAlign.xlVAlignCenter; //合并单元格 Excel.Range range5 = workSheet.Range[workSheet.Cells[secondRowValue, dataColumnValue - 2], workSheet.Cells[secondRowValue + index, dataColumnValue - 2]]; range5.Merge(0); range5.BorderAround(Excel.XlLineStyle.xlContinuous, Excel.XlBorderWeight.xlThin, Excel.XlColorIndex.xlColorIndexAutomatic, System.Drawing.Color.Black.ToArgb()); #endregion [规格] #region [检测项目] workSheet.Cells[secondRowValue, dataColumnValue - 3] = item2.TestItems; workSheet.Cells[secondRowValue, dataColumnValue - 3].HorizontalAlignment = Excel.XlHAlign.xlHAlignCenter; workSheet.Cells[secondRowValue, dataColumnValue - 3].VerticalAlignment = Excel.XlVAlign.xlVAlignCenter; //合并单元格 Excel.Range range4 = workSheet.Range[workSheet.Cells[secondRowValue, dataColumnValue - 3], workSheet.Cells[secondRowValue + index, dataColumnValue - 3]]; range4.Merge(0); range4.BorderAround(Excel.XlLineStyle.xlContinuous, Excel.XlBorderWeight.xlThin, Excel.XlColorIndex.xlColorIndexAutomatic, System.Drawing.Color.Black.ToArgb()); #endregion [检测项目] #region [判断] string resultData; string Judgment = "N/A"; if (!string.IsNullOrEmpty(spec) && !spec.Equals("-") && item.matList.Count != 0) { resultData = "V"; if (!item2.isOk) { workSheet.Cells[secondRowValue, columnValue + 1] = resultData; workSheet.Cells[secondRowValue, columnValue + 1].HorizontalAlignment = Excel.XlHAlign.xlHAlignCenter; workSheet.Cells[secondRowValue, columnValue + 1].VerticalAlignment = Excel.XlVAlign.xlVAlignCenter; Judgment = "NG"; } else { workSheet.Cells[secondRowValue, columnValue] = resultData; workSheet.Cells[secondRowValue, columnValue].HorizontalAlignment = Excel.XlHAlign.xlHAlignCenter; workSheet.Cells[secondRowValue, columnValue].VerticalAlignment = Excel.XlVAlign.xlVAlignCenter; Judgment = "OK"; } //合并单元格 Excel.Range range8 = workSheet.Range[workSheet.Cells[secondRowValue, columnValue], workSheet.Cells[secondRowValue + index, columnValue]]; range8.Merge(0); range8.BorderAround(Excel.XlLineStyle.xlContinuous, Excel.XlBorderWeight.xlThin, Excel.XlColorIndex.xlColorIndexAutomatic, System.Drawing.Color.Black.ToArgb()); //合并单元格 Excel.Range range9 = workSheet.Range[workSheet.Cells[secondRowValue, columnValue + 1], workSheet.Cells[secondRowValue + index, columnValue + 1]]; range9.Merge(0); range9.BorderAround(Excel.XlLineStyle.xlContinuous, Excel.XlBorderWeight.xlThin, Excel.XlColorIndex.xlColorIndexAutomatic, System.Drawing.Color.Black.ToArgb()); } else { resultData = "N/A"; workSheet.Cells[secondRowValue, columnValue] = resultData; workSheet.Cells[secondRowValue, columnValue].HorizontalAlignment = Excel.XlHAlign.xlHAlignCenter; workSheet.Cells[secondRowValue, columnValue].VerticalAlignment = Excel.XlVAlign.xlVAlignCenter; //合并单元格 Excel.Range range7 = workSheet.Range[workSheet.Cells[secondRowValue, columnValue], workSheet.Cells[secondRowValue + index, columnValue + 1]]; range7.Merge(0); range7.BorderAround(Excel.XlLineStyle.xlContinuous, Excel.XlBorderWeight.xlThin, Excel.XlColorIndex.xlColorIndexAutomatic, System.Drawing.Color.Black.ToArgb()); } #endregion [判断] #region [上传数据库] if (needUploadData) { string paravalue2 = string.Empty; paravalue2 = $"{dataId}|{mainID}|{item.HoleType}|{item2.TestItems}|{SpecificationCondition}|{SpecificationCOnditionNum}|{SpecificationCOnditionRangeGreateNum}|{Judgment}"; try { var result1 = webServiceDll.ws.sendDataToSerGrp(userName, passWord, equId, groupId, funId2, paraname2, paravalue2, createdate); writeLog(result1, "0004上传回参"); } catch (Exception ex) { writeLog(ex.Message); } } #endregion [上传数据库] secondRowValue += (index + 1); } #region [孔型] workSheet.Cells[firstRowValue, dataColumnValue - 4] = item.HoleType; workSheet.Cells[firstRowValue, dataColumnValue - 4].HorizontalAlignment = Excel.XlHAlign.xlHAlignCenter; workSheet.Cells[firstRowValue, dataColumnValue - 4].VerticalAlignment = Excel.XlVAlign.xlVAlignCenter; //合并单元格 Excel.Range range6 = workSheet.Range[workSheet.Cells[firstRowValue, dataColumnValue - 4], workSheet.Cells[firstRowValue + rowIndex, dataColumnValue - 4]]; range6.Merge(0); range6.BorderAround(Excel.XlLineStyle.xlContinuous, Excel.XlBorderWeight.xlThin, Excel.XlColorIndex.xlColorIndexAutomatic, System.Drawing.Color.Black.ToArgb()); #endregion [孔型] #region [图片] List pathList = new List(); //合并单元格 Excel.Range range10 = workSheet.Range["Dan"]; int lastCol = range10.Column; Excel.Range range11 = workSheet.Range[workSheet.Cells[firstRowValue, columnValue + 2], workSheet.Cells[firstRowValue + rowIndex, lastCol + 1]]; range11.Merge(0); range11.BorderAround(Excel.XlLineStyle.xlContinuous, Excel.XlBorderWeight.xlThin, Excel.XlColorIndex.xlColorIndexAutomatic, System.Drawing.Color.Black.ToArgb()); float PicLeft, PicTop, PicWidth, PicHeight; int haltWidth = Convert.ToInt32(range11.Width / ((item.matList.Count) == 0 ? 1 : item.matList.Count)); int Index = 0; foreach (var mat in item.matList) { this.Invoke(new Action(() => { progressEvents.SetStringProgress((PdnResources.GetString("Dealing") + dataIndex + PdnResources.GetString("GeCeLiangFenLiangZhong") + ",第" + (Index + 1) + "/" + item.matList.Count + PdnResources.GetString("Image"))); })); string ImgPath = SaveAllImage(mat, item.GraphicsListList[Index]); pathList.Add(ImgPath); PicWidth = (float)(5.2d / 0.035d); PicTop = Convert.ToSingle(range11.Top); PicLeft = Convert.ToSingle(range11.Left + PicWidth * Index + 10); PicHeight = (float)(3.6d / 0.035d); //workSheet.Shapes.AddPicture2(ImgPath, MsoTriState.msoFalse, MsoTriState.msoTrue, PicLeft, PicTop, PicWidth, PicHeight, MsoPictureCompress.msoPictureCompressFalse); workSheet.Shapes.AddPicture(ImgPath, MsoTriState.msoFalse, MsoTriState.msoTrue, PicLeft, PicTop, PicWidth, PicHeight); Index++; } firstRowValue += (rowIndex + 1); #endregion [图片] #region [上传数据库] if (needUploadData) { try { #region [上传FTP] string ftpStr = DateTime.Now.ToString("yyyyMMdd"); try { FTPWebsiteHelper fTPWebsiteHelper = new FTPWebsiteHelper(); fTPWebsiteHelper.ftpPath = Program.instance.configModel.FTPURL; fTPWebsiteHelper.ftpUserID = Program.instance.configModel.FTPUserName; fTPWebsiteHelper.ftpPassword = Program.instance.configModel.FTPPassword; //fTPWebsiteHelper.ftpPath = "ftp://127.0.0.1"; //fTPWebsiteHelper.ftpUserID = "admin"; //fTPWebsiteHelper.ftpPassword = "123456"; foreach (var file in pathList) { fTPWebsiteHelper.UpLoadFile(file); } ftpStr = fTPWebsiteHelper.ftpStr; } catch (Exception ex) { writeLog(ex.Message, "FTP错误"); } #endregion [上传FTP] foreach (dynamic dy in dynamicList) { string dataFilePath = string.Empty; if (dy.dataType == 1) { //foreach (var file in pathList) //{ // FileInfo fileInf = new FileInfo(file); // dataFilePath += $"{Program.instance.configModel.FTPFilePath + "/" + fileInf.Name},"; //} } else { FileInfo fileInf = new FileInfo(pathList[dy.imgIndex]); dataFilePath = $"{Program.instance.configModel.FTPFilePath + "/" + ftpStr + "/" + fileInf.Name}"; } string paravalue3 = $"{Guid.NewGuid().ToString()}| {dy.name}|{dy.value}|{dataFilePath}|{dy.dataId}|{mainID}"; var result2 = webServiceDll.ws.sendDataToSerGrp(userName, passWord, equId, groupId, funId3, paraname3, paravalue3, createdate); //writeLog(result2, "0004上传回参"); } } catch (Exception ex) { writeLog(ex.Message); } } #endregion [上传数据库] dataIndex++; } #endregion [分组铺数据] //SPC上传 #region [上传数据库] if (needSPCUploadData) { Scheme schemeModel = getSpcApiSetting(); if (schemeModel != null) { try { //通过“料号获取SPC管制清单” var rs = ws.getctrlitem(this.measureMaintenanceType.measureMaintenanceBasicDataList[0].measureMaintenanceBasicDataValue /*料号*/); string daStr = DateTime.Now.ToString("yyyy-MM-dd HH:ss"); if (rs.msg.Contains("OK")) { int spcDataIndex = 0; foreach (var spcData in rs.ds.Tables[0].Rows) { string dateStr = string.Empty;//时间 string dataStr = string.Empty;//数据 var filegroup = rs.ds.Tables[0].Rows[spcDataIndex]["filegroup"].ToString();//SPC群組 var filename = rs.ds.Tables[0].Rows[spcDataIndex]["filename"].ToString();//SPC檔案 var ctrlitem = rs.ds.Tables[0].Rows[spcDataIndex]["ctrlitem"].ToString();//管制项目 var spsize = rs.ds.Tables[0].Rows[spcDataIndex]["spsize"].ToString();//切片数量 //系统中“电镀线别”为空直接退出 if (string.IsNullOrEmpty(this.measureMaintenanceType.measureMaintenanceBasicDataList[8].measureMaintenanceBasicDataValue)) { break; } //SPC檔案中不包括“电镀线别” if (!filename.Contains(this.measureMaintenanceType.measureMaintenanceBasicDataList[8].measureMaintenanceBasicDataValue /*电镀线别*/)) { spcDataIndex++; continue; } spcDataIndex++; int count = Convert.ToInt32(spsize); int needCount = 0;//需要的检测项目数量 var dataList = spcDataList.Values.ToList();//当前检测项目及测量数据信息 foreach (var item in dataList) { foreach (dynamic dy in item)//从SPC檔案筛选出当前使用的检测项目及测量数据(SPC檔案包含全部检测项目,需要挑选中使用的) { if (!filename.Contains(dy.testItems)) { continue; } if (needCount >= count) { break; } dateStr += $"{daStr}|";//系统当前时间 dataStr += $"{dy.value}|";//测量值 needCount++; } } //如果筛选出来的检测项目数量小于切片数量.余下的切片对应的数据设置为0。 if (needCount < count) { for (int i = 1; i <= (count - needCount); i++) { dateStr += $"{daStr}|"; dataStr += $"{0}|"; } } dateStr = dateStr.Remove(dateStr.Length - 1, 1); dataStr = dataStr.Remove(dataStr.Length - 1, 1); writeLog(count.ToString() + "和" + dateStr + "和" + dataStr, "SPC上传接口参数展示"); var interfacePassWord = Program.instance.configModel.interfacePassWord; //根据配置文件组织数据 int t = 0; List paraList = new List(); foreach (Item item in schemeModel.items) { try { t = int.Parse(item.filedNum.Trim()); paraList.Add(measureMaintenanceType.measureMaintenanceBasicDataList[t - 1].measureMaintenanceBasicDataValue); } catch (Exception) { paraList.Add(""); continue; } } //var result = ws.spcapi(interfacePassWord, "filegroup", "filename", "ctrlitem", "dateStr", "dataStr", "count", paraList[0], paraList[1], paraList[2], paraList[3], paraList[4], paraList[5], paraList[6], paraList[7], paraList[8], paraList[9], paraList[10], paraList[11], paraList[12], paraList[13], paraList[14], paraList[15], paraList[16], paraList[17], paraList[18], paraList[19]); var result = ws.spcapi(interfacePassWord, filegroup.ToString(), filename.ToString(), ctrlitem.ToString(), dateStr, dataStr, count.ToString(), paraList[0], paraList[1], paraList[2], paraList[3], paraList[4], paraList[5], paraList[6], paraList[7], paraList[8], paraList[9], paraList[10], paraList[11], paraList[12], paraList[13], paraList[14], paraList[15], paraList[16], paraList[17], paraList[18], paraList[19]); //if (result.Contains("NG")) //{ // writeLog( result, "SPC上传接口错误"); //} writeLog(result, "SPC上传接口调用结果反馈"); } } else { writeLog(rs.msg, "SPC-料号获取SPC管制清单方法错误"); } } catch (Exception ex) { writeLog(ex.Message, "SPC下拉接口错误"); } } else { writeLog("请检测配置文档", "SPC配置返回空"); } } #endregion object nothing = Type.Missing; workBook.SaveAs(tempFilePath, nothing, nothing, nothing, nothing, nothing, Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlExclusive, nothing, nothing, nothing, nothing, nothing); } catch (Exception ex) { writeLog(ex.Message); } finally { if (excelApp != null) { if (excelApp != null && workBook != null) workBook.Close(false); excelApp.Quit(); OfficeFileHandleHelper.Kill(excelApp); } progressEvents.EndOperation(OperationResult.Finished); } #endregion [组织数据 开整!] }; procClass.StartProgressAction(this, itemCount, copyThreadProc, progressEvents, null); string filePath = Application.StartupPath + "\\Config\\" + Program.instance.SettingPrefix + "\\TempImg"; #region [复制文件到另一个文件夹] try { FileOperationHelper.CopyFile(tempFilePath, this.filePath, "", true); Directory.Delete(temp, true); } catch (Exception ex) { } #endregion [复制文件到另一个文件夹] try { if (Directory.Exists(filePath)) { Directory.Delete(filePath, true); } } catch (Exception ex) { } if (checkBox1.Checked) { if (!OfficeFileHandleHelper.OpenOfficeFile(path)) MessageBox.Show(PdnResources.GetString("Menu.Fileopenfailed.Text")); } this.isSPCItemNull = false; MessageBox.Show(PdnResources.GetString("NewExportSucceeded")); } /// /// 读取SPCApi配置方案 /// private Scheme getSpcApiSetting() { string filePath; filePath = Application.StartupPath + "\\Config\\" + Program.instance.SettingPrefix + "\\SpcApiSchemes.xml"; if (System.IO.File.Exists(filePath)) { spcApiSchemesModel = XmlSerializeHelper.DESerializer(FileOperationHelper.ReadStringFromFile(filePath, FileMode.Open)); if (spcApiSchemesModel.schemes.Count > 0) { Scheme schemeModel = new Scheme(); int cnt = 0; foreach (Scheme scheme in spcApiSchemesModel.schemes) { if (scheme.isUse) { cnt = cnt + 1; schemeModel = scheme; } } if (cnt == 1) { if ( schemeModel.items.Count == 20) { return schemeModel; } else { writeLog("栏位总数必须为20!", "SPC上传接口错误"); return null; } } else { writeLog("接口数据项配置错误,无启用方案或启用方案不唯一!", "SPC上传接口错误"); return null; } } else { writeLog("接口数据项配置错误,未找到可用配置!", "SPC上传接口错误"); return null; } } else { writeLog("配置文件不存在!","SPC上传接口错误"); return null; } } /// /// 组织最终导出数据 /// private MeasureInfoExportModel OrganizeResultData(List thisResultMatList) { MeasureInfoExportModel measureInfoExportModel = new MeasureInfoExportModel(); var HoleTypeList = this.measureMaintenanceType.MeasureMaintenanceTreeFourthDataList.GroupBy(m => m.HoleType); #region [先整理下整体的数据] #region [特殊处理下叠构] var resList = thisResultMatList.Where(m => m.parentId.Equals("100209")).ToList(); if (resList.Count > 0) { foreach (var item in resList) { List nameList = item.dataInforList.Select(m => m.name).ToList(); var ls = item.dataInforList.OrderBy(m => m.point1.Y).ToList(); for (int i = 0; i < ls.Count(); i++) { ls[i].name = nameList[i]; } } thisResultMatList.RemoveAll(m => m.parentId.Equals("100209")); thisResultMatList.AddRange(resList); } #endregion [特殊处理下叠构] var dataList = HoleTypeList.ToList(); for (int i = dataList.Count - 1; i >= 0; i--) { var data = dataList[i]; var resultDataList = thisResultMatList.Where(m => m.parentId.Equals(data.First().HoleTypeId)).ToList(); var a = Math.Ceiling(Convert.ToDouble(resultDataList.Count()) / Convert.ToDouble(this.measureMaintenanceType.outputPicturesNum)); if (a > 0) { for (int j = 1; j <= a; j++) { dataList.Insert(i + j, data); } dataList.RemoveAt(i); } } #endregion [先整理下整体的数据] string name = string.Empty; int startNum = 0; foreach (var item in dataList) { MeasureInfoExportDataModel measureInfoExportDataModel = new MeasureInfoExportDataModel(); measureInfoExportDataModel.HoleType = item.Key; measureInfoExportDataModel.HoleTypeId = item.FirstOrDefault().HoleTypeId; var resultDataList = thisResultMatList.Where(m => m.parentId.Equals(measureInfoExportDataModel.HoleTypeId)).ToList(); if (name.Equals(item.Key)) { startNum++; } else { name = item.Key; startNum = 0; } resultDataList = resultDataList.Skip(this.measureMaintenanceType.outputPicturesNum * startNum).Take(this.measureMaintenanceType.outputPicturesNum).ToList(); //添加图片及名称 foreach (var result in resultDataList) { var list = result.dataInforList; List lines = new List(); GraphicsList graphicsList = new GraphicsList(); if (result.GraphicsListList != null) { for (int i = 0; i < result.GraphicsListList.Count; i++) { graphicsList.Add(result.GraphicsListList[i]); } } if (checkBox2.Checked) { if (graphicsList.Count > 0) { graphicsList[0].Selected = false; lines.Add(graphicsList[0]); } graphicsList = new GraphicsList(); } else { graphicsList = new GraphicsList(); } //if (result.GraphicsListList != null) //{ // if (checkBox2.Checked) // { // if (result.GraphicsListList.Count > 0) // { // lines.Add(result.GraphicsListList[0]); // } // } // result.GraphicsListList = new GraphicsList(); //} //else //{ // result.GraphicsListList = new GraphicsList(); //} var documentWorkspace1 = new DocumentWorkspaceWindow(this.appWorkspace); Document document = Document.FromMat(result.resultMat); documentWorkspace1.Document = document; double unit = 1; if (this.pidRuleDic.ContainsKey(result.parentId)) { if (this.pidRuleDic[result.parentId].ContainsKey(result.fileName)) { unit = this.pidRuleDic[result.parentId][result.fileName]; } } foreach (var draw in list) { if (draw.value == 0) { continue; } switch (draw.drawType) { case "MeasureLine": MeasureLine line = new MeasureLine(documentWorkspace1, draw.point1, draw.point2, draw.aliasName, unit); line.moved = true; line.ISurfaceBox = documentWorkspace1; lines.Add(line); break; case "MeasureVLine": MeasureVLine vline = new MeasureVLine(documentWorkspace1, draw.point1, draw.point2, draw.aliasName, unit); vline.moved = true; vline.ISurfaceBox = documentWorkspace1; lines.Add(vline); break; case "MeasureHLine": MeasureHLine hline = new MeasureHLine(documentWorkspace1, draw.point1, draw.point2, draw.aliasName, unit); hline.moved = true; hline.ISurfaceBox = documentWorkspace1; lines.Add(hline); break; } } graphicsList.AddRange(lines); measureInfoExportDataModel.matList.Add(result.resultMat); measureInfoExportDataModel.fileNameList.Add(result.fileName); measureInfoExportDataModel.GraphicsListList.Add(graphicsList); } var itemTypeList = item.GroupBy(m => m.TestItems); foreach (var item2 in itemTypeList) { ItemType itemType = new ItemType(); itemType.TestItems = item2.Key; itemType.Specification = item2.FirstOrDefault().Specification; itemType.isOk = true; foreach (var item3 in item2) { LineData lineData = new LineData(); lineData.name = item3.FormulaName; lineData.isOk = true; lineData.isMaxOrMin = (item3.FormulaExpression.Contains("最大值") || item3.FormulaExpression.Contains("最小值") || item3.FormulaExpression.Contains("平均值")); if (item3.FormulaExpression.Contains("最大值")) { lineData.typeCase = 1; } else if (item3.FormulaExpression.Contains("最小值")) { lineData.typeCase = 2; } else if (item3.FormulaExpression.Contains("平均值")) { lineData.typeCase = 3; } //计算结果 foreach (var data in resultDataList) { double result; double unit = 1; if (this.pidRuleDic.ContainsKey(data.parentId)) { if (this.pidRuleDic[data.parentId].ContainsKey(data.fileName)) { unit = this.pidRuleDic[data.parentId][data.fileName]; } } outPutResult(data.dataInforList, lineData.isMaxOrMin, item3.FormulaExpression, unit, lineData.typeCase, out result); result = Math.Round(result, Program.instance.decimalPlaces); lineData.value.Add(result); if (double.IsInfinity(result) || double.IsNaN(result)) { lineData.NgValue.Add(result); lineData.isOk = false; itemType.isOk = false; } else { if (!outOk(result, item3.Specification)) { lineData.NgValue.Add(result); lineData.isOk = false; itemType.isOk = false; } } } itemType.LineDataList.Add(lineData); } measureInfoExportDataModel.itemTypeList.Add(itemType); } measureInfoExportModel.measureInfoExportDataModelList.Add(measureInfoExportDataModel); } return measureInfoExportModel; } /// /// 返回公式所得值 /// /// /// /// /// private double outPutResult(List dataInforList, bool isMaxOrMin, string formula, double unit, int typeCase, out double result) { if (isMaxOrMin) { var str = formula.Split('\\').ToList(); str.RemoveAt(str.Count - 1); List resultList = new List(); foreach (var everyStr in str) { var data = dataInforList.Where(m => m.aliasName.Equals(everyStr)).FirstOrDefault(); if (data != null) { resultList.Add(data.value * unit); } else { resultList.Add(0); } } switch (typeCase) { case 1: result = resultList.Max(); break; case 2: result = resultList.Min(); break; case 3: result = resultList.Average(); break; default: result = 0; break; } } else { foreach (var item in dataInforList) { if (formula.Contains(item.aliasName)) { formula = formula.Replace(item.aliasName, (item.value * unit).ToString()); } } if (formula.Contains("[")) { result = getResult(formula); } else { result = Convert.ToDouble(FormulaHelper.CaleByFormule(formula)); } } return result; } /// /// 获取绝对值 /// private double getResult(string formula) { formula = formula.Replace("[", "Math.abs(").Replace("]", ")"); double res = Math.Abs(Convert.ToDouble(FormulaHelper.CaleByFormule(formula))); return res; } /// /// 计算单个绝对值 /// 传出绝对值结尾的下一个字符的位置pos /// 并返回绝对值计算结果 /// /// /// private string calcuAbsVal(string formula, out int pos) { string result = ""; bool inBra = false; int braCount = 0; pos = 0; int i = 1; while(i < formula.Length) { if(formula[i] == '[') { return calcuAbsVal(formula.Substring(i), out i); } else if (formula[i] == ']') { // 记录该绝对值结束的位置 pos = i + 1; string temp = FormulaHelper.CaleByFormule(formula.Substring(1, i)); if(Convert.ToDouble(temp) < 0) { temp = temp.Replace("-", ""); } return temp; } } return FormulaHelper.CaleByFormule(result); } /// /// 返回是否合格 /// /// private bool outOk(double result, string specification) { specification = specification.Replace("<=", "LQ").Replace("<", "L"); List list; if (!string.IsNullOrEmpty(specification)) { if (specification.Contains('-')) { return true; } list = specification.Split('X').ToList(); if (list.Count == 2) { if (string.IsNullOrEmpty(list[0])) { if (list[1].Contains("LQ")) { return result <= Convert.ToDouble(list[1].Replace("LQ", "")); } else { return result < Convert.ToDouble(list[1].Replace("L", "")); } } else if (string.IsNullOrEmpty(list[1])) { if (list[0].Contains("LQ")) { return result >= Convert.ToDouble(list[0].Replace("LQ", "")); } else { return result > Convert.ToDouble(list[0].Replace("L", "")); } } else { bool right = true; bool left = true; if (list[1].Contains("LQ")) { right = result <= Convert.ToDouble(list[1].Replace("LQ", "")); } else { right = result < Convert.ToDouble(list[1].Replace("L", "")); } if (list[0].Contains("LQ")) { left = result >= Convert.ToDouble(list[0].Replace("LQ", "")); } else { left = result > Convert.ToDouble(list[0].Replace("L", "")); } return right && left; } } else { return true; } } return true; } /// /// 保存图片到本地 /// /// private string SaveAllImage(Mat mat, GraphicsList graphicsList) { string filePath = Application.StartupPath + "\\Config\\" + Program.instance.SettingPrefix + "\\TempImg\\"; if (!Directory.Exists(filePath)) { Directory.CreateDirectory(filePath); } Bitmap bitmap = OpenCvSharp.Extensions.BitmapConverter.ToBitmap(mat); Graphics graphics = Graphics.FromImage(bitmap); if (graphicsList != null && graphicsList.Count > 0) { graphicsList.DrawPicture(graphics); } string fileName = filePath + Guid.NewGuid().ToString() + ".jpg"; ImageCodecInfo icf = GdiPlusFileType.GetImageCodecInfo(ImageFormat.Jpeg); EncoderParameters parms = new EncoderParameters(1); EncoderParameter parm; if (Program.instance.isCompression) { parm = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, 50L); } else { parm = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, 75L); } parms.Param[0] = parm; bitmap.Save(fileName, icf, parms); return fileName; } /// /// 显示绘制范围 /// /// /// private void checkBox2_CheckedChanged(object sender, EventArgs e) { this.documentWorkspace.GraphicsList.DeleteAllView(); if (this.listView1.FocusedItem != null && this.listView1.FocusedItem.Selected) { if (checkBox2.Checked) { string id = this.listView1.FocusedItem.Tag.ToString(); var result = this.resultMatList.Where(m => m.ID == id).FirstOrDefault(); int dataIndex = 0; if (result != null) { dataIndex = this.resultMatList.IndexOf(result); } if (this.resultMatList[dataIndex].GraphicsListList.Count > 0) { this.resultMatList[dataIndex].GraphicsListList[0].canMove = false; GraphicsList graphicsList = new GraphicsList(); graphicsList.Add(this.resultMatList[dataIndex].GraphicsListList[0].Clone(this.documentWorkspace)); graphicsList[0].Selected = false; this.documentWorkspace.GraphicsList.Add(graphicsList[0]); } } else { this.documentWorkspace.GraphicsList.DeleteAllView(); } this.documentWorkspace.Refresh(); } } private void writeLog(string error, string typeName = "") { string filePath = Application.StartupPath + "\\Config\\" + Program.instance.SettingPrefix + "\\ErrorLog"; if (!Directory.Exists(filePath)) { Directory.CreateDirectory(filePath); } using (StreamWriter sw = new StreamWriter(filePath + "\\" + DateTime.Now.ToString("yyyy-MM-dd-HH-mm-ss") + typeName + "log.txt")) { sw.WriteLine(error); } } /// /// 开启像素跟踪 /// /// /// private void checkBox3_CheckedChanged(object sender, EventArgs e) { if (checkBox3.Checked) { pixelTrackingDialog = (PixelTrackingDialog)Application.OpenForms["PixelTrackingDialog"];//尝试获取已经弹出的窗口对象 if (pixelTrackingDialog == null) { pixelTrackingDialog = new PixelTrackingDialog(this.appWorkspace); } this.pixelTrackingEnabled = true; this.pixelTrackingDialog.TransferEvent += checkBox3Change; FloatingFormMethod.ShowResultFloatForm(this, pixelTrackingDialog, this.appWorkspace); } else { pixelTrackingDialog = (PixelTrackingDialog)Application.OpenForms["PixelTrackingDialog"];//尝试获取已经弹出的窗口对象 this.pixelTrackingEnabled = false; if (pixelTrackingDialog != null) { pixelTrackingDialog.Close(); } } } private void checkBox3Change() { this.checkBox3.Checked = false; } /// /// 像素跟踪 /// 需要增加标记,在进行比如图像旋转等直接在当前 /// 面板进行图像大小变化操作的,需要停止像素跟踪, /// 处理完成之后在恢复,否则可能会导致读取内存异常 /// /// public void SetImageAndData(System.Drawing.Point location, DocumentView doc) { if (this.pixelTrackingDialog != null) { this.pixelTrackingDialog.SetImageAndData(location, doc); } } private DateTime _time; private void documentWorkspace_panel_MouseMove(object sender, MouseEventArgs e) { if (this.pixelTrackingEnabled && this.pixelTrackingDialog != null) { if ((DateTime.Now - _time).TotalMilliseconds > 20) { this.SetImageAndData(this.documentWorkspace.CalcPixelPoint(e.Location), this.documentWorkspace); _time = DateTime.Now; } } int count = this.documentWorkspace.GraphicsList.SelectionCount; if (count == 1) { DrawObject drawObject = this.documentWorkspace.GraphicsList.Selection.ToList()[0]; if (drawObject.objectType == DrawClass.Measure) { MeasureDrawObject measureDrawObject = (MeasureDrawObject)drawObject; RectangleF rectangle = measureDrawObject.GetBoundingBox(); Rectangle newRectangle; switch (measureDrawObject.drawToolType) { case DrawToolType.MeasureLine: newRectangle = new Rectangle((int)(rectangle.X - 20), (int)(rectangle.Y - 20), (int)(rectangle.Width + 20), (int)(rectangle.Height + 20)); break; case DrawToolType.MeasureHLine: newRectangle = new Rectangle((int)(rectangle.X - 20), (int)(rectangle.Y - 20), (int)(rectangle.Width + 20), 40); break; case DrawToolType.MeasureVLine: newRectangle = new Rectangle((int)(rectangle.X - 20), (int)(rectangle.Y - 20), 40, (int)(rectangle.Height + 20)); break; default: newRectangle = new Rectangle((int)(rectangle.X - 20), (int)(rectangle.Y - 20), 40, (int)(rectangle.Height + 20)); break; } if (newRectangle.Contains(this.documentWorkspace.CalcPixelPoint(e.Location))) { string name = this.appWorkspace.getRealName(this.measureMaintenanceTypeList.MeasureMaintenanceTreeDataList, measureDrawObject.aliasName); this.toolTip.Show(name, this.documentWorkspace, new System.Drawing.Point(e.Location.X + 10, e.Location.Y + 10)); } else { this.toolTip.Hide(this.documentWorkspace); } } } } /// /// 绘制范围 /// /// /// private void button2_Click(object sender, EventArgs e) { if (this.listView1.SelectedItems == null || this.listView1.SelectedItems.Count == 0) { return; } List bitmaps = new List(); List nameList = new List(); Dictionary imgGraphicsList = new Dictionary(); Dictionary ImgisConductive = new Dictionary(); Dictionary ImgisFanweibuchang = new Dictionary(); Dictionary ImgisErzhichuli = new Dictionary(); Dictionary needShowDaoDianbu = new Dictionary(); Dictionary needShowFanweibuchang = new Dictionary(); Dictionary needShowErzhichuli = new Dictionary(); Dictionary correspondNum = new Dictionary(); for (int i = 0; i < this.listView1.SelectedItems.Count; i++) { var index = this.listView1.SelectedItems[i].Index; Bitmap bitmap = OpenCvSharp.Extensions.BitmapConverter.ToBitmap(this.resultMatList[index].resultMat); bitmaps.Add(bitmap); nameList.Add(this.listView1.SelectedItems[i].Text); bool show; bool showFanweibuchang; bool showErzhichuli; string id = this.resultMatList[index].parentId; MeasureMaintenanceTreeSpecificData data; this.appWorkspace.RecursionGetData(id, this.measureMaintenanceTypeList.MeasureMaintenanceTreeDataList, out data); if (data.MeasureMaintenanceTreeSpecificDataParentId == "9") { show = true; } else { show = false; } if (data.MeasureMaintenanceTreeSpecificDataParentId == "10" && data.MeasureMaintenanceTreeSpecificDataId == "100300") { showFanweibuchang = true; } else { showFanweibuchang = false; } if (true && data.MeasureMaintenanceTreeSpecificDataParentId == "7" && data.MeasureMaintenanceTreeSpecificDataId == "100176") { showErzhichuli = true; } else { showErzhichuli = false; } GraphicsList graphicsList = new GraphicsList(); for (int j = 0; j < this.resultMatList[index].GraphicsListList.Count; j++) { if (this.resultMatList[index].GraphicsListList[j].drawToolType == DrawToolType.ViewRectangle) { graphicsList.Add(this.resultMatList[index].GraphicsListList[j]); } } needShowDaoDianbu.Add(index, show); needShowFanweibuchang.Add(index, showFanweibuchang); needShowErzhichuli.Add(index, showErzhichuli); imgGraphicsList.Add(index, graphicsList); ImgisConductive.Add(index, this.resultMatList[index].isConductive); ImgisFanweibuchang.Add(index, this.resultMatList[index].isFanweibuchang); ImgisErzhichuli.Add(index, this.resultMatList[index].isErzhichuli); correspondNum.Add(i, index); } ResultsViewRange from2 = new ResultsViewRange(bitmaps, nameList, this, this.appWorkspace, imgGraphicsList, ImgisConductive, needShowDaoDianbu, ImgisFanweibuchang, needShowFanweibuchang, ImgisErzhichuli, needShowErzhichuli, correspondNum); from2.StartPosition = FormStartPosition.CenterParent; from2.ShowDialog(); } public void getList(Dictionary dataList) { foreach (var item in dataList) { this.resultMatList[item.Key].GraphicsListList = item.Value; var result = this.realResultMatList.Where(m => m.ID == this.resultMatList[item.Key].ID).FirstOrDefault(); if (result != null) { result.GraphicsListList = item.Value; } } } public void getBoolList(Dictionary dataList) { foreach (var item in dataList) { this.resultMatList[item.Key].isConductive = item.Value; var result = this.realResultMatList.Where(m => m.ID == this.resultMatList[item.Key].ID).FirstOrDefault(); if (result != null) { result.isConductive = item.Value; } } } public void getErzhichuliList(Dictionary dataList) { foreach (var item in dataList) { this.resultMatList[item.Key].isErzhichuli = item.Value; var result = this.realResultMatList.Where(m => m.ID == this.resultMatList[item.Key].ID).FirstOrDefault(); if (result != null) { result.isErzhichuli = item.Value; } } } public void getFanweibuchangList(Dictionary dataList) { foreach (var item in dataList) { this.resultMatList[item.Key].isFanweibuchang = item.Value; var result = this.realResultMatList.Where(m => m.ID == this.resultMatList[item.Key].ID).FirstOrDefault(); if (result != null) { result.isFanweibuchang = item.Value; } } } public void getMatList(Dictionary bitmapData) { foreach (var item in bitmapData) { this.resultMatList[item.Key].resultMat = OpenCvSharp.Extensions.BitmapConverter.ToMat(item.Value); this.imageList1.Images[item.Key] = CreateThumbnail(this.resultMatList[item.Key].resultMat); for (int i = 0; i < this.resultMatList[item.Key].dataInforList.Count; i++) { this.resultMatList[item.Key].dataInforList[i].point1 = new System.Drawing.Point(0, 0); this.resultMatList[item.Key].dataInforList[i].point2 = new System.Drawing.Point(0, 0); this.resultMatList[item.Key].dataInforList[i].value = 0; } this.listView1.Refresh(); } this.listView1_SelectedIndexChanged(null, null); } /// /// 再次分析 /// /// /// // TODO:bug private void button1_Click(object sender, EventArgs e) { this.documentWorkspace.activeTool = DrawToolType.Pointer; if (this.listView1.SelectedItems == null || this.listView1.SelectedItems.Count == 0) { return; } List indexList = new List(); for (int i = 0; i < this.listView1.SelectedItems.Count; i++) { int index = this.listView1.SelectedItems[i].Index; indexList.Add(index); } ProgressThreadProcClass procClass = new ProgressThreadProcClass(); int itemCount = 100; ProgressThreadProcClass.IFileTransferProgressEvents progressEvents = new ProgressThreadProcClass.IFileTransferProgressEvents(); System.Threading.ThreadStart copyThreadProc = delegate () { for (int i = 0; i < indexList.Count; i++) { var resultMat = this.resultMatList[indexList[i]]; string className = InvariantData.path_auto + $".{this._listHoleType[resultMat.parentId]}"; GraphicsList graphicsList = resultMat.GraphicsListList; bool isErzhichuli = resultMat.isErzhichuli; bool isFanweibuchang = resultMat.isFanweibuchang; bool isConductive = resultMat.isConductive; bool position = resultMat.isPosition; var currentParam = (AutoMeasureAnalysis)Assembly.Load(InvariantData.auto_Data).CreateInstance(className); Mat thisMat = resultMat.resultMat.Clone(); currentParam.setErzhichuli(isErzhichuli); currentParam.setFanweibuchang(isFanweibuchang); currentParam.setBool(isConductive); currentParam.setIsNewSuanfa(position); try { GraphicsList newGraphicsList = new GraphicsList(); for (int j = 0; j < resultMat.GraphicsListList.Count; j++) { if (resultMat.GraphicsListList[j].drawToolType == DrawToolType.ViewRectangle) { newGraphicsList.Add(resultMat.GraphicsListList[j]); } } if (newGraphicsList.Count == 0) { currentParam.Compute(thisMat, false, 0, 0); } else { int X = (int)newGraphicsList[0].Rectangle.X; int Y = (int)newGraphicsList[0].Rectangle.Y; int reWidth = (int)newGraphicsList[0].Rectangle.Width; int reHeight = (int)newGraphicsList[0].Rectangle.Height; Bitmap newBitmap = OpenCvSharp.Extensions.BitmapConverter.ToBitmap(thisMat); if (newGraphicsList[0].Rectangle.Contains(new RectangleF(0, 0, newBitmap.Width, newBitmap.Height))) { X = 0; Y = 0; reWidth = newBitmap.Width; reHeight = newBitmap.Height; } else { if (newGraphicsList[0].Rectangle.IntersectsWith(new RectangleF(0, 0, newBitmap.Width, newBitmap.Height))) { RectangleF rectangleF = new RectangleF(newGraphicsList[0].Rectangle.X, newGraphicsList[0].Rectangle.Y,newGraphicsList[0].Rectangle.Width, newGraphicsList[0].Rectangle.Height); rectangleF.Intersect(new RectangleF(0, 0, newBitmap.Width, newBitmap.Height)); X = (int)rectangleF.X; Y = (int)rectangleF.Y; reWidth = (int)rectangleF.Width; reHeight = (int)rectangleF.Height; } } Mat mat = new Mat(thisMat, new Rect(X, Y, reWidth, reHeight)); currentParam.Compute(mat, true, X, Y); } } catch (Exception ex) { } resultMat.resultMat = thisMat; resultMat.allLineNum = currentParam.number; resultMat.successNum = currentParam.success; resultMat.failNum = currentParam.wrongNumber; resultMat.dataInforList.Clear(); List listdata = new List(); foreach (var dataInfo in currentParam.dataInfors) { DataInfor dataInfor = new DataInfor(); dataInfor.drawType = dataInfo.drawType; dataInfor.value = dataInfo.value; dataInfor.point1 = dataInfo.point1; dataInfor.point2 = dataInfo.point2; dataInfor.name = dataInfo.name; dataInfor.aliasName = dataInfo.aliasName; dataInfor.ID = dataInfo.ID; dataInfor.deleteFlag = dataInfo.deleteFlag; listdata.Add(dataInfor); } resultMat.dataInforList.AddRange(listdata); } progressEvents.EndOperation(OperationResult.Finished); }; procClass.StartProgressAction(this, itemCount, copyThreadProc, progressEvents, null); for (int i = 0; i < this.listView1.SelectedItems.Count; i++) { var index = this.listView1.SelectedItems[i].Index; this.listView1.SelectedItems[i].BackColor = this.resultMatList[index].dataInforList.Where(m => m.value == 0).FirstOrDefault() == null ? Color.White : Color.Red; if (i == 0) { this.listView1.Items[index].Focused = true; } } this.listView1.Refresh(); #region [组织应该展示的线 去除不应该展示的线] foreach (var item in resultMatList) { List removeList = new List(); if (this.LineShowDic.ContainsKey(item.parentId)) { foreach (var item2 in item.dataInforList) { if (!this.LineShowDic[item.parentId].Contains(item2.ID)) { removeList.Add(item2); } } foreach (var item2 in removeList) { item.dataInforList.Remove(item2); } } } #endregion [组织应该展示的线 去除不应该展示的线] listView1_SelectedIndexChanged(null, null); } /// /// 全选 /// /// /// private void button3_Click(object sender, EventArgs e) { for (int i = 0; i < this.listView1.Items.Count; i++) { this.listView1.Items[i].Selected = true; if (i == 0) { this.listView1.Items[i].Focused = true; } } } /// /// 全不选 /// /// /// private void button4_Click(object sender, EventArgs e) { for (int i = 0; i < this.listView1.Items.Count; i++) { this.listView1.Items[i].Selected = false; if (i == 0) { this.listView1.Items[i].Selected = true; this.listView1.Items[i].Focused = true; } } } /// /// 反选 /// /// /// private void button5_Click(object sender, EventArgs e) { for (int i = 0; i < this.listView1.Items.Count; i++) { this.listView1.Items[i].Selected = !this.listView1.Items[i].Selected; } if (this.listView1.SelectedItems.Count > 0) { this.listView1.SelectedItems[0].Focused = true; this.listView1_SelectedIndexChanged(null, null); } } /// /// 命名规则 /// /// /// private void button6_Click(object sender, EventArgs e) { //NameRuleListDetails nameRuleListDetails = new NameRuleListDetails(); //if (this.thisNameRuleListDetails == null) //{ // if (!string.IsNullOrEmpty(this.measureMaintenanceType.NameRuleID)) // { // var oldNameRuleListDetails = Program.instance.fileNameRule.NameRuleList.Where(m => m.ID == this.measureMaintenanceType.NameRuleID).FirstOrDefault(); // if (oldNameRuleListDetails != null) // { // nameRuleListDetails.ContinueNumber = oldNameRuleListDetails.ContinueNumber; // nameRuleListDetails.DigitNum = oldNameRuleListDetails.DigitNum; // nameRuleListDetails.ID = oldNameRuleListDetails.ID; // nameRuleListDetails.isContinue = oldNameRuleListDetails.isContinue; // nameRuleListDetails.Name = oldNameRuleListDetails.Name; // nameRuleListDetails.NameFormat = oldNameRuleListDetails.NameFormat; // nameRuleListDetails.NowNumber = oldNameRuleListDetails.NowNumber; // nameRuleListDetails.Text = oldNameRuleListDetails.Text; // nameRuleListDetails.ZTextOne = oldNameRuleListDetails.ZTextOne; // nameRuleListDetails.ZTextTwo = oldNameRuleListDetails.ZTextTwo; // } // } //} //else { // nameRuleListDetails = this.thisNameRuleListDetails; //} using (ResultViewNameRule2 af = new ResultViewNameRule2(this,this.measureMaintenanceType)) { af.StartPosition = FormStartPosition.CenterScreen; af.ShowDialog(); } } public void NameRuleCallBack(NameRuleListDetails nameRuleListDetails) { if(nameRuleListDetails != null) this.measureMaintenanceType.NameRuleID = nameRuleListDetails.ID; if (nameRuleListDetails != null) this.thisNameRuleListDetails = nameRuleListDetails; this.yuLan(nameRuleListDetails); } public void itemNumCallBack(string itemNum) { this.measureMaintenanceType.measureMaintenanceBasicDataList[0].measureMaintenanceBasicDataValue = itemNum; this.isSPCItemNull = true; buttonGenerateReport_Click(null, null); } /// /// 选择模板 /// /// /// private void button7_Click(object sender, EventArgs e) { OpenFileDialog dialog = new OpenFileDialog(); dialog.Filter = "Excel文件|*.xls;*.xlsx"; dialog.Title = "选择模板"; dialog.Multiselect = false; //该值确定是否可以选择多个文件 if (dialog.ShowDialog() != DialogResult.OK) { return; } string file = dialog.FileName; measureMaintenanceType.templateFilePath = file; MessageBox.Show("模板更换成功!"); } /// /// 图片删除 /// /// /// private void button8_Click(object sender, EventArgs e) { if (this.listView1.SelectedItems == null || this.listView1.SelectedItems.Count == 0) { return; } this.listView1.SelectedIndexChanged -= listView1_SelectedIndexChanged; for (int i = this.listView1.SelectedItems.Count - 1; i >= 0; i--) { string id = this.listView1.SelectedItems[i].Tag.ToString(); var result = this.resultMatList.Where(m => m.ID == id).FirstOrDefault(); if (result != null) { this.hasDelResultMatList.Add(result); this.resultMatList.Remove(result); var realresult = this.realResultMatList.Where(m => m.ID == id).FirstOrDefault(); if (realresult != null) { this.realResultMatList.Remove(realresult); } } this.listView1.Items.Remove(this.listView1.SelectedItems[i]); } this.listView1.SelectedIndexChanged += listView1_SelectedIndexChanged; if (this.listView1.Items.Count > 0) { this.listView1.Items[0].Focused = true; this.listView1.Items[0].Selected = true; this.listView1_SelectedIndexChanged(null, null); } else { this.documentWorkspace.Visible = false; if (panel2.Controls != null) { foreach (Control c in panel2.Controls) { c.Visible = false; } } } this.listView1.Refresh(); } /// /// 图片恢复 /// /// /// private void button9_Click(object sender, EventArgs e) { int count = this.listView1.Items.Count; this.hasDelResultMatList.Reverse(); for (int i = 0; i < this.hasDelResultMatList.Count; i++) { Mat mat = new Mat(); Cv2.CvtColor(this.hasDelResultMatList[i].resultMat, mat, ColorConversionCodes.BGRA2BGR); this.imageList1.Images.Add("img" + count, CreateThumbnail(mat)); this.listView1.Items.Add("", count); this.listView1.Items[count].ImageIndex = count; this.listView1.Items[count].Tag = this.hasDelResultMatList[i].ID; this.listView1.Items[count].Text = this.hasDelResultMatList[i].fileName; this.listView1.Items[count].BackColor = this.hasDelResultMatList[i].dataInforList.Where(m => m.value == 0).FirstOrDefault() == null ? Color.White : Color.Red; count++; mat.Dispose(); this.resultMatList.Add(this.hasDelResultMatList[i]); this.realResultMatList.Add(this.hasDelResultMatList[i]); } comboClassification_SelectedIndexChanged(sender, e); comboStatus_SelectedIndexChanged(sender, e); this.listView1.Refresh(); this.hasDelResultMatList.Clear(); } /// /// 勾选辅助线 /// /// /// private void checkBox4_CheckedChanged(object sender, EventArgs e) { this.documentWorkspace.auxiliaryLineEnabled = !this.documentWorkspace.auxiliaryLineEnabled; if (this.documentWorkspace.auxiliaryLineEnabled) { this.documentWorkspace.girdLineColour = Program.instance.configModel.girdLineColour; this.documentWorkspace.girdLineStyle = Program.instance.configModel.girdLineStyle; this.documentWorkspace.girdLineWidth = Program.instance.configModel.girdLineWidth; } this.documentWorkspace.Refresh(); } public string getMeasureMaintenanceTypeID() { return this.measureMaintenanceType.NameRuleID; } /// /// 结果预览 /// /// /// private void button10_Click(object sender, EventArgs e) { string titleName = measureMaintenanceType.measureMaintenanceName; #region [组织预览数据] MeasureInfoExportModel measureInfoExportModel = OrganizePreviewResultData(this.resultMatList); #endregion ResultViewPreview resultViewPreview = new ResultViewPreview(this,titleName, this.measureMaintenanceType.outputPicturesNum, measureInfoExportModel); resultViewPreview.StartPosition = FormStartPosition.CenterParent; resultViewPreview.ShowDialog(); } /// /// 组织预览数据 /// private MeasureInfoExportModel OrganizePreviewResultData(List thisResultMatList) { MeasureInfoExportModel measureInfoExportModel = new MeasureInfoExportModel(); var HoleTypeList = this.measureMaintenanceType.MeasureMaintenanceTreeFourthDataList.GroupBy(m => m.HoleType); #region [先整理下整体的数据] #region [特殊处理下叠构] var resList = thisResultMatList.Where(m => m.parentId.Equals("100209")).ToList(); if (resList.Count > 0) { foreach (var item in resList) { List nameList = item.dataInforList.Select(m => m.name).ToList(); var ls = item.dataInforList.OrderBy(m => m.point1.Y).ToList(); for (int i = 0; i < ls.Count(); i++) { ls[i].name = nameList[i]; } } thisResultMatList.RemoveAll(m => m.parentId.Equals("100209")); thisResultMatList.AddRange(resList); } #endregion [特殊处理下叠构] var dataList = HoleTypeList.ToList(); for (int i = dataList.Count - 1; i >= 0; i--) { var data = dataList[i]; var resultDataList = thisResultMatList.Where(m => m.parentId.Equals(data.First().HoleTypeId)).ToList(); var a = Math.Ceiling(Convert.ToDouble(resultDataList.Count()) / Convert.ToDouble(this.measureMaintenanceType.outputPicturesNum)); if (a > 0) { for (int j = 1; j <= a; j++) { dataList.Insert(i + j, data); } dataList.RemoveAt(i); } } #endregion [先整理下整体的数据] string name = string.Empty; int startNum = 0; foreach (var item in dataList) { MeasureInfoExportDataModel measureInfoExportDataModel = new MeasureInfoExportDataModel(); measureInfoExportDataModel.HoleType = item.Key; measureInfoExportDataModel.HoleTypeId = item.FirstOrDefault().HoleTypeId; var resultDataList = thisResultMatList.Where(m => m.parentId.Equals(measureInfoExportDataModel.HoleTypeId)).ToList(); if (name.Equals(item.Key)) { startNum++; } else { name = item.Key; startNum = 0; } resultDataList = resultDataList.Skip(this.measureMaintenanceType.outputPicturesNum * startNum).Take(this.measureMaintenanceType.outputPicturesNum).ToList(); var itemTypeList = item.GroupBy(m => m.TestItems); foreach (var item2 in itemTypeList) { ItemType itemType = new ItemType(); itemType.TestItems = item2.Key; itemType.Specification = item2.FirstOrDefault().Specification; itemType.isOk = true; foreach (var item3 in item2) { LineData lineData = new LineData(); lineData.name = item3.FormulaName; lineData.isOk = true; lineData.isMaxOrMin = (item3.FormulaExpression.Contains("最大值") || item3.FormulaExpression.Contains("最小值") || item3.FormulaExpression.Contains("平均值")); if (item3.FormulaExpression.Contains("最大值")) { lineData.typeCase = 1; } else if (item3.FormulaExpression.Contains("最小值")) { lineData.typeCase = 2; } else if (item3.FormulaExpression.Contains("平均值")) { lineData.typeCase = 3; } //计算结果 foreach (var data in resultDataList) { double result; double unit = 1; if (this.pidRuleDic.ContainsKey(data.parentId)) { if (this.pidRuleDic[data.parentId].ContainsKey(data.fileName)) { unit = this.pidRuleDic[data.parentId][data.fileName]; } } outPutResult(data.dataInforList, lineData.isMaxOrMin, item3.FormulaExpression, unit, lineData.typeCase, out result); result = Math.Round(result, Program.instance.decimalPlaces); lineData.value.Add(result); lineData.matIndex.Add(this.resultMatList.IndexOf(data)); if (double.IsInfinity(result) || double.IsNaN(result)) { lineData.NgValue.Add(result); lineData.isOk = false; itemType.isOk = false; } else { if (!outOk(result, item3.Specification)) { lineData.NgValue.Add(result); lineData.isOk = false; itemType.isOk = false; } } } itemType.LineDataList.Add(lineData); } measureInfoExportDataModel.itemTypeList.Add(itemType); } measureInfoExportModel.measureInfoExportDataModelList.Add(measureInfoExportDataModel); } return measureInfoExportModel; } public void returnMatView(int index) { for (int i = 0; i < this.listView1.Items.Count; i++) { this.listView1.Items[i].Selected = false; } this.listView1.Focus(); //滚动到指定的行位置 this.listView1.EnsureVisible(index); this.listView1.Items[index].Focused = true; this.listView1.Items[index].Selected = true; } } }