using SmartCoalApplication.Core; using SmartCoalApplication.SystemLayer; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using SmartCoalApplication.Base.AutoMeasure; using System.Xml; using OpenCvSharp; using SmartCoalApplication.Base.MeasureModel; using SmartCoalApplication.Base.CommTool; using System.IO; using Resources; using SmartCoalApplication.Annotation; using SmartCoalApplication.Base.SettingModel; using SmartCoalApplication.Core.DbOpreate.DbModel; using SmartCoalApplication.Resources; using SmartCoalApplication.AutomaticMeasurement.Model; using System.Text.RegularExpressions; namespace SmartCoalApplication.AutomaticMeasurement { internal partial class AutomaticMeasurement : Form { private MeasureInfoModel infoModel;//窗體共用,傳遞信息 private int erjimuluCount = new int();//有检验项目的分类数目 private List bitmaps = new List();//每次添加的图片 private List bitNames = new List();//每次添加的图片的名称 private List filePathList = new List(); private Kongjian kongjians = new Kongjian();//自动显示的控件 private int[] counts;//计数器,每行显示5张图 public List> pictures = new List>();//所有的图片集合 private List> pictureNames = new List>();//所有的图片名称集合 private List> picturePathNames = new List>();//所有的图片名称集合 private List erjimulusName = new List();//分类名称 Dictionary _listHoleType = new Dictionary(); Dictionary _listHoleTypePos = new Dictionary(); private MeasureMaintenanceTypeList measureMaintenanceTypeList; private AppWorkspace appWorkspace; private Dictionary> everyHoleImg = new Dictionary>(); private Dictionary> everyHoleImgGraphicsList = new Dictionary>(); private Dictionary> everyHoleImgisConductive = new Dictionary>(); private Dictionary> everyHoleImgisFanweibuchang = new Dictionary>(); private Dictionary> everyHoleImgisErzhichuli = new Dictionary>(); Dictionary> pidRuleDic = new Dictionary>(); /// /// 树状结构数据 /// protected MeasureMaintenanceTreeData measureMaintenanceTreeData; /// /// 换算完的标尺信息,包含所有系统内得单位 /// public Dictionary rules = new Dictionary(); public AutomaticMeasurement(AppWorkspace appWorkspace) { var res = getResult("[[100-50] - [200 - 50 + (100 - 50 + (200 - 100) + [50])]] - 100"); InitializeComponent(); InitializeComponent2(); this.Icon = PdnInfo.AppIcon; this.appWorkspace = appWorkspace; //初始化數據 infoModel = new MeasureInfoModel(); infoModel.stop = 0; CreatHoleType(); #region [测试分类下拉选] string filePath = Application.StartupPath + "\\Config\\" + Program.instance.SettingPrefix + "\\MeasureMaintenanceTypeList.xml"; if (!System.IO.File.Exists(filePath)) { measureMaintenanceTypeList = new MeasureMaintenanceTypeList(); measureMaintenanceTypeList.measureMaintenanceTypeList = new List(); } else { measureMaintenanceTypeList = XmlSerializeHelper.DESerializer(FileOperationHelper.ReadStringFromFile(filePath, FileMode.Open)); } comboMingcheng.DataSource = measureMaintenanceTypeList.measureMaintenanceTypeList; this.comboMingcheng.SelectedIndexChanged -= new System.EventHandler(this.comboBox4_SelectedIndexChanged); comboMingcheng.DisplayMember = "measureMaintenanceName"; this.comboMingcheng.SelectedIndexChanged += new System.EventHandler(this.comboBox4_SelectedIndexChanged); this.FormClosing += new FormClosingEventHandler(AutoFormClosed); #endregion #region [获取各项下拉选值] ReadXml2(); #endregion this.comboBox4_SelectedIndexChanged(null, null); } /// /// 获取绝对值 /// private double getResult(string formula) { formula = formula.Replace("[", "Math.abs(").Replace("]", ")"); double res = Math.Abs(Convert.ToDouble(FormulaHelper.CaleByFormule(formula))); return res; } private void AutoFormClosed(object sender, FormClosingEventArgs e) { for (int i = 0; i < pictures.Count; i++) { for (int k = 0; k < pictures[i].Count; k++) { if (pictures[i][k] != null) { pictures[i][k].Dispose(); } } } } /// /// /// private void InitializeComponent2() { this.Text = PdnResources.GetString("NewStartTestProcedure"); this.groupBox2.Text = PdnResources.GetString("NewSelectTestProcedure"); this.label1.Text = PdnResources.GetString("NewName"); this.groupBox1.Text = PdnResources.GetString("NewOperation"); this.buttonCancelMeasurement.Text = PdnResources.GetString("NewCancelMeasurement"); this.buttonStartMeasuring.Text = PdnResources.GetString("NewStartMeasuring"); this.label14.Text = PdnResources.GetString("NewDefaultRuler"); this.label13.Text = PdnResources.GetString("NewRuler"); this.groupBox3.Text = PdnResources.GetString("NewEssentialInformation"); this.label11.Text = PdnResources.GetString("NewUnit") + ":"; this.label10.Text = PdnResources.GetString("NewLayers") + ":"; this.label7.Text = PdnResources.GetString("NewUseFactory") + ":"; this.label6.Text = PdnResources.GetString("NewElectroplatingLine") + ":"; this.label5.Text = PdnResources.GetString("NewMadeOf") + ":"; this.label4.Text = PdnResources.GetString("NewBatchNumber") + ":"; this.label3.Text = PdnResources.GetString("NewOrderNo") + ":"; this.label2.Text = PdnResources.GetString("NewItemNo") + ":"; this.label8.Text = PdnResources.GetString("NewLaboratory") + ":"; this.label9.Text = PdnResources.GetString("NewFrequency") + ":"; this.groupBox4.Text = PdnResources.GetString("NewcCassification"); this.groupOutInfo.Text = PdnResources.GetString("NewOutputInformation"); } /// /// 从硬盘选择多张图片 /// private List ChooseImagesFromImgDisk(List imageNames, string id) { List listBitmap = new List(); bitNames = new List(); filePathList = new List(); string pPath = null; foreach (string imgName in imageNames) { if (pPath == null) pPath = System.IO.Path.GetDirectoryName(imgName); string xmlPath = pPath + "\\" + Path.GetFileNameWithoutExtension(imgName) + ".xml"; double ruleData = 1; ConfigModel configModel = Program.instance.configModel; //如果xml存在 if (System.IO.File.Exists(xmlPath)) { var configModel1 = XmlSerializeHelper.DESerializer(FileOperationHelper.ReadStringFromFile(xmlPath, FileMode.Open)); ruleData = configModel1.rule.pixel_length == 0 ? 1 : Convert.ToDouble(configModel1.rule.physical_length / configModel1.rule.pixel_length); InitRulerInfo(configModel1.rule.ruler_units, ruleData); } else { MeasureMaintenanceType measureMaintenanceType = (MeasureMaintenanceType)comboMingcheng.SelectedItem; if (measureMaintenanceTreeData != null) { MeasureMaintenanceTreeSpecificData data; this.appWorkspace.RecursionGetData(id, measureMaintenanceTreeData.MeasureMaintenanceTreeDataList, out data); if (data.ruleMessage != null) { ruleData = data.ruleMessage.pixelLength == 0 ? 1 : Convert.ToDouble(data.ruleMessage.physicalLength / Convert.ToDecimal(data.ruleMessage.pixelLength)); InitRulerInfo(data.ruleMessage.rulerUnits, ruleData); } else { if (measureMaintenanceType.ruleMessage != null) { ruleData = measureMaintenanceType.ruleMessage.pixelLength == 0 ? 1 : Convert.ToDouble(measureMaintenanceType.ruleMessage.physicalLength / Convert.ToDecimal(measureMaintenanceType.ruleMessage.pixelLength)); InitRulerInfo(measureMaintenanceType.ruleMessage.rulerUnits, ruleData); } else { List list = Program.instance.mic_rulersAll; var ruler = list.Where(m => m.id.Equals(configModel.RulerId)).FirstOrDefault(); if (ruler != null) { ruleData = ruler.pixel_length == 0 ? 1 : Convert.ToDouble(ruler.physical_length / Convert.ToDecimal(ruler.pixel_length)); InitRulerInfo(ruler.ruler_units, ruleData); } } } } else { if (measureMaintenanceType.ruleMessage != null) { ruleData = measureMaintenanceType.ruleMessage.pixelLength == 0 ? 1 : Convert.ToDouble(measureMaintenanceType.ruleMessage.physicalLength / Convert.ToDecimal(measureMaintenanceType.ruleMessage.pixelLength)); InitRulerInfo(measureMaintenanceType.ruleMessage.rulerUnits, ruleData); } else { List list = Program.instance.mic_rulersAll; var ruler = list.Where(m => m.id.Equals(configModel.RulerId)).FirstOrDefault(); if (ruler != null) { ruleData = ruler.pixel_length == 0 ? 1 : Convert.ToDouble(ruler.physical_length / Convert.ToDecimal(ruler.pixel_length)); InitRulerInfo(ruler.ruler_units, ruleData); } } } } if (this.rules.ContainsKey(configModel.Unit)) { this.rules.TryGetValue(configModel.Unit, out ruleData); } if (pidRuleDic.ContainsKey(id)) { if (pidRuleDic[id].ContainsKey(Path.GetFileName(imgName))) { pidRuleDic[id][Path.GetFileName(imgName)] = ruleData; } else { pidRuleDic[id].Add(Path.GetFileName(imgName), ruleData); } } else { Dictionary dataKeyValue = new Dictionary(); dataKeyValue.Add(Path.GetFileName(imgName), ruleData); pidRuleDic.Add(id, dataKeyValue); } Image image = Image.FromFile(imgName); listBitmap.Add(new Bitmap(image)); bitNames.Add(System.IO.Path.GetFileName(imgName)); filePathList.Add(System.IO.Path.GetDirectoryName(imgName)); } return listBitmap; } /// /// 从硬盘选择多张图片 /// private List ChooseImagesFromHardDisk(string id) { var openFileDialog = new OpenFileDialog { Filter = "*.jpg,*jpeg,*.bmp,*.ico,*.png,*.tif,*.wmf|*.jpg;*jpeg;*.bmp;*.ico;*.png;*.tif;*.wmf" }; openFileDialog.Multiselect = true; if (openFileDialog.ShowDialog() == DialogResult.OK) { string pPath = null;// System.IO.Path.GetDirectoryName(cmbInput.Text); string[] imageNames = openFileDialog.FileNames; List listBitmap = new List(); bitNames = new List(); filePathList = new List(); foreach (string imgName in imageNames) { if (pPath == null) pPath = System.IO.Path.GetDirectoryName(imgName); string xmlPath = pPath + "\\" + Path.GetFileNameWithoutExtension(imgName) + ".xml"; double ruleData = 1; ConfigModel configModel = Program.instance.configModel; //如果xml存在 if (System.IO.File.Exists(xmlPath)) { var configModel1 = XmlSerializeHelper.DESerializer(FileOperationHelper.ReadStringFromFile(xmlPath, FileMode.Open)); ruleData = configModel1.rule.pixel_length == 0 ? 1 : Convert.ToDouble(configModel1.rule.physical_length / configModel1.rule.pixel_length); InitRulerInfo(configModel1.rule.ruler_units, ruleData); } else { MeasureMaintenanceType measureMaintenanceType = (MeasureMaintenanceType)comboMingcheng.SelectedItem; if (measureMaintenanceTreeData != null) { MeasureMaintenanceTreeSpecificData data; this.appWorkspace.RecursionGetData(id, measureMaintenanceTreeData.MeasureMaintenanceTreeDataList, out data); if (data.ruleMessage != null) { ruleData = data.ruleMessage.pixelLength == 0 ? 1 : Convert.ToDouble(data.ruleMessage.physicalLength / Convert.ToDecimal(data.ruleMessage.pixelLength)); InitRulerInfo(data.ruleMessage.rulerUnits, ruleData); } else { if (measureMaintenanceType.ruleMessage != null) { ruleData = measureMaintenanceType.ruleMessage.pixelLength == 0 ? 1 : Convert.ToDouble(measureMaintenanceType.ruleMessage.physicalLength / Convert.ToDecimal(measureMaintenanceType.ruleMessage.pixelLength)); InitRulerInfo(measureMaintenanceType.ruleMessage.rulerUnits, ruleData); } else { List list = Program.instance.mic_rulersAll; var ruler = list.Where(m => m.id.Equals(configModel.RulerId)).FirstOrDefault(); if (ruler != null) { ruleData = ruler.pixel_length == 0 ? 1 : Convert.ToDouble(ruler.physical_length / Convert.ToDecimal(ruler.pixel_length)); InitRulerInfo(ruler.ruler_units, ruleData); } } } } else { if (measureMaintenanceType.ruleMessage != null) { ruleData = measureMaintenanceType.ruleMessage.pixelLength == 0 ? 1 : Convert.ToDouble(measureMaintenanceType.ruleMessage.physicalLength / Convert.ToDecimal(measureMaintenanceType.ruleMessage.pixelLength)); InitRulerInfo(measureMaintenanceType.ruleMessage.rulerUnits, ruleData); } else { List list = Program.instance.mic_rulersAll; var ruler = list.Where(m => m.id.Equals(configModel.RulerId)).FirstOrDefault(); if (ruler != null) { ruleData = ruler.pixel_length == 0 ? 1 : Convert.ToDouble(ruler.physical_length / Convert.ToDecimal(ruler.pixel_length)); InitRulerInfo(ruler.ruler_units, ruleData); } } } } if (this.rules.ContainsKey(configModel.Unit)) { this.rules.TryGetValue(configModel.Unit, out ruleData); } if (pidRuleDic.ContainsKey(id)) { if (pidRuleDic[id].ContainsKey(Path.GetFileName(imgName))) { pidRuleDic[id][Path.GetFileName(imgName)] = ruleData; } else { pidRuleDic[id].Add(Path.GetFileName(imgName), ruleData); } } else { Dictionary dataKeyValue = new Dictionary(); dataKeyValue.Add(Path.GetFileName(imgName), ruleData); pidRuleDic.Add(id, dataKeyValue); } Image image = Image.FromFile(imgName); listBitmap.Add(new Bitmap(image)); bitNames.Add(System.IO.Path.GetFileName(imgName)); filePathList.Add(System.IO.Path.GetDirectoryName(imgName)); } return listBitmap; } else { return null; } } /// /// 初始化标尺信息,图片对应的xml中读取 /// 然后根据标尺的单位,换算出所有单位的数据 /// public void InitRulerInfo(int units,double unitLength) { this.rules.Clear(); switch (units) { case (int)1://英寸 this.rules.Add(1, unitLength); //英寸 this.rules.Add(7, 1000 * unitLength); //米尔 this.rules.Add(2, 2.54 * unitLength); //厘米 this.rules.Add(3, 25.4 * unitLength); //毫米 this.rules.Add(4, 25400 * unitLength); //微米 this.rules.Add(5, 25400000 * unitLength); //纳米 break; case (int)7://米尔 this.rules.Add(1, 0.001 * unitLength); //英寸 this.rules.Add(7, unitLength); //米尔 this.rules.Add(2, 0.00254 * unitLength); //厘米 this.rules.Add(3, 0.0254 * unitLength); //毫米 this.rules.Add(4, 25.4 * unitLength); //微米 this.rules.Add(5, 25400 * unitLength); //纳米 break; case (int)2://厘米 this.rules.Add(1, 0.3937008 * unitLength); //英寸 this.rules.Add(7, 393.7008 * unitLength); //米尔 this.rules.Add(2, unitLength); //厘米 this.rules.Add(3, 10 * unitLength); //毫米 this.rules.Add(4, 10000 * unitLength); //微米 this.rules.Add(5, 10000000 * unitLength); //纳米 break; case (int)3://毫米 this.rules.Add(1, 0.0393701 * unitLength); //英寸 this.rules.Add(7, 39.3701 * unitLength); //米尔 this.rules.Add(2, 0.1 * unitLength); //厘米 this.rules.Add(3, unitLength); //毫米 this.rules.Add(4, 1000 * unitLength); //微米 this.rules.Add(5, 1000000 * unitLength); //纳米 break; case (int)4://微米 this.rules.Add(1, 0.00003937007874 * unitLength); //英寸 this.rules.Add(7, 0.03937007874 * unitLength); //米尔 this.rules.Add(2, 0.0001 * unitLength); //厘米 this.rules.Add(3, 0.001 * unitLength); //毫米 this.rules.Add(4, unitLength); //微米 this.rules.Add(5, 1000 * unitLength); //纳米 break; case (int)5://纳米 this.rules.Add(1, 3.9370e-8 * unitLength); //英寸 this.rules.Add(7, 3.9370e-5 * unitLength); //米尔 this.rules.Add(2, 1e-7 * unitLength); //厘米 this.rules.Add(3, 1e-6 * unitLength); //毫米 this.rules.Add(4, 0.001 * unitLength); //微米 this.rules.Add(5, unitLength); //纳米 break; } } /// /// 點擊下拉列表時顯示(選擇規程名稱) /// 顯示輸出信息、基礎信息以及圖片分類信息 /// private void comboBox4_SelectedIndexChanged(object sender, EventArgs e) { if (comboMingcheng.SelectedIndex == -1) { return; } #region [读取树状结构] MeasureMaintenanceType measureMaintenanceType = (MeasureMaintenanceType)comboMingcheng.SelectedItem; string filePath = Application.StartupPath + "\\Config\\" + Program.instance.SettingPrefix + "\\MeasureMaintenanceType\\"; var fileName = measureMaintenanceType.measureMaintenanceName; filePath = $"{filePath}{fileName}.xml"; if (System.IO.File.Exists(filePath)) { measureMaintenanceTreeData = XmlSerializeHelper.DESerializer(FileOperationHelper.ReadStringFromFile(filePath, FileMode.Open)); } #endregion #region [获取标尺] if (measureMaintenanceType.ruleMessage != null) { //计算每像素物理长度 double proportion = Math.Round((double)measureMaintenanceType.ruleMessage.physicalLength / measureMaintenanceType.ruleMessage.pixelLength, 4); string content = proportion.ToString() + InvariantData.unitsDictionary[(int)((MeasurementUnit)(Enum.ToObject(typeof(MeasurementUnit), measureMaintenanceType.ruleMessage.rulerUnits)))].ToString() + "/" + PdnResources.GetString("MeasurementUnit.Pixel"); label14.Text = $"{measureMaintenanceType.ruleMessage.ruleName} {content}"; } else { List list = Program.instance.mic_rulersAll; ConfigModel configModel = Program.instance.configModel; var ruler = list.Where(m => m.id.Equals(configModel.RulerId)).FirstOrDefault(); if (ruler != null) { double proportion = ruler.pixel_length == 0 ? 1 : Math.Round((double)ruler.physical_length / ruler.pixel_length, 4); string content = proportion.ToString() + InvariantData.unitsDictionary[(int)((MeasurementUnit)(Enum.ToObject(typeof(MeasurementUnit), ruler.ruler_units)))].ToString() + "/" + PdnResources.GetString("MeasurementUnit.Pixel"); label14.Text = $"{ruler.ruler_name} {content}"; } else { label14.Text = PdnResources.GetString("NewBatchNumber") + ":1/1"; } } #endregion #region [基础信息赋值] textLiaohao.Text = string.Empty;//料號 comboBanci.SelectedIndex = -1;//班次 comboShiyanshi.SelectedIndex = -1;//實驗室 comboShiyongchangqu.SelectedIndex = -1;//使用廠區 comboZhichengbie.SelectedIndex = -1;//製成別 textDanhao.Text = string.Empty;//單號 textPihao.Text = string.Empty;//批號 comboCengbie.SelectedIndex = -1;//層別 comboDianduxianbie.Text = string.Empty;//電鍍綫別 textLiaohao.Text = measureMaintenanceType.measureMaintenanceBasicDataList[0].measureMaintenanceBasicDataValue;//料號 comboBanci.SelectedItem = measureMaintenanceType.measureMaintenanceBasicDataList[1].measureMaintenanceBasicDataValue;//班次 comboShiyanshi.SelectedItem = measureMaintenanceType.measureMaintenanceBasicDataList[2].measureMaintenanceBasicDataValue;//實驗室 comboShiyongchangqu.SelectedItem = measureMaintenanceType.measureMaintenanceBasicDataList[3].measureMaintenanceBasicDataValue;//使用廠區 comboZhichengbie.SelectedItem = measureMaintenanceType.measureMaintenanceBasicDataList[4].measureMaintenanceBasicDataValue;//製成別 textDanhao.Text = measureMaintenanceType.measureMaintenanceBasicDataList[5].measureMaintenanceBasicDataValue;//單號 textPihao.Text = measureMaintenanceType.measureMaintenanceBasicDataList[6].measureMaintenanceBasicDataValue;//批號 comboCengbie.SelectedItem = measureMaintenanceType.measureMaintenanceBasicDataList[7].measureMaintenanceBasicDataValue;//層別 comboDianduxianbie.Text = measureMaintenanceType.measureMaintenanceBasicDataList[8].measureMaintenanceBasicDataValue;//電鍍綫別 if (measureMaintenanceType.ruleMessage != null) { label12.Text = InvariantData.unitsDictionary[(int)((MeasurementUnit)(Enum.ToObject(typeof(MeasurementUnit), measureMaintenanceType.ruleMessage.rulerUnits)))].ToString();//單位 } else { List list = Program.instance.mic_rulersAll; ConfigModel configModel = Program.instance.configModel; var ruler = list.Where(m => m.id.Equals(configModel.RulerId)).FirstOrDefault(); if (ruler != null) { label12.Text = InvariantData.unitsDictionary[configModel.Unit].ToString();//單位 } } #endregion OutInfoShow(); OperationControlInitialization(); this.everyHoleImgGraphicsList.Clear(); this.everyHoleImgisConductive.Clear(); this.everyHoleImgisFanweibuchang.Clear(); this.everyHoleImgisErzhichuli.Clear(); } /// /// 輸出信息顯示 /// private void OutInfoShow() { if (comboMingcheng.SelectedIndex == -1) { return; } MeasureMaintenanceType measureMaintenanceType = (MeasureMaintenanceType)comboMingcheng.SelectedItem; panelOutInfo.Controls.Clear(); int height = 38; int width = (groupOutInfo.Size.Width - 14) / 4; string[] titles = { PdnResources.GetString("NewHoleTypeName"), PdnResources.GetString("NewTestItemsName"), PdnResources.GetString("NewSpecificationName"), PdnResources.GetString("NewMeasuringPositionName") }; string[] titleNames = { "kongxing", "jianyanxiangmu", "guige", "celiangweizhi" }; List