using HalconDotNet; using LB_VisionControls; using LB_VisionProcesses.Alogrithms.Halcon; using System.Diagnostics; namespace LB_VisionProcesses.Alogrithms { public partial class CreateFixtureToolEdit : TAlgorithmEdit { public CreateFixtureToolEdit(CreateFixtureTool subject = null) { if (subject != null && subject is CreateFixtureTool) { Subject = subject; } else { Subject = new CreateFixtureTool(); } this.Dock = DockStyle.Fill; InitializeComponent(); } /// /// 控件加载事件 /// /// /// private void CreateFixtureToolEdit_Load(object sender, EventArgs e) { pnlInputImage.Controls.Add(inputImageHSmartWindowControl); inputImageHSmartWindowControl.Dock = DockStyle.Fill; pnlRecordImage.Controls.Add(recordImageHSmartWindowControl); recordImageHSmartWindowControl.Dock = DockStyle.Fill; //遍历可以选择的Roi类型枚举 foreach (var value in Enum.GetValues(typeof(RoiType))) { cmbTypeRoi.Items.Add(value.ToString()); } cmbTypeRoi.Text = RoiType.None.ToString(); LoadParas(); if (Subject.Result) { lblResult.BackColor = Color.Green; lblResult.Text = "True"; } else { lblResult.BackColor = Color.Red; lblResult.Text = "False"; } lblMsg.Text = Msg.Length > 50 ? Msg.Substring(0, 50) : Msg; lblMsgToolTip.SetToolTip(BtmStatusStrip, Msg); lblRunTime.Text = $"{Subject.RunTime}ms"; } /// /// 更新运行参数 /// public override void UpdataInputs() { //设置运行参数 double dResult = 0; Subject.Params.Inputs["X"] = double.TryParse(dtxtX.Text, out dResult) ? dResult : Subject.Params.Inputs["X"]; Subject.Params.Inputs["Y"] = double.TryParse(dtxtY.Text, out dResult) ? dResult : Subject.Params.Inputs["Y"]; Subject.Params.Inputs["Phi"] = double.TryParse(dtxtPhi.Text, out dResult) ? dResult : Subject.Params.Inputs["Phi"]; Subject.Params.Inputs["Name"] = Convert.ToString(dtxtName.Text); Type type = inputImageHSmartWindowControl.oRoi?.GetType(); switch (type) { case Type t when t == typeof(HRectangle2): { HRectangle2 hRectangle2 = (HRectangle2)inputImageHSmartWindowControl.oRoi; Subject.Params.ROI = new HRectangle2(hRectangle2.X - Subject.Params.Fixture.X, hRectangle2.Y - Subject.Params.Fixture.Y , hRectangle2.Phi - Subject.Params.Fixture.Phi, hRectangle2.Width, hRectangle2.Height); break; } case Type t when t == typeof(HCircle): { HCircle hCircle = (HCircle)inputImageHSmartWindowControl.oRoi; Subject.Params.ROI = new HCircle(hCircle.X - Subject.Params.Fixture.X, hCircle.Y - Subject.Params.Fixture.Y, hCircle.Radius); break; } case Type t when t == typeof(HSegment): { HSegment hSegment = (HSegment)inputImageHSmartWindowControl.oRoi; Subject.Params.ROI = new HSegment(hSegment.StartX - Subject.Params.Fixture.X, hSegment.StartY - Subject.Params.Fixture.Y , hSegment.EndX - Subject.Params.Fixture.X, hSegment.EndY - Subject.Params.Fixture.Y); break; } default: { Subject.Params.ROI = new ROI(); break; } } } /// /// 加载运行参数 /// public override void LoadParas() { this.BeginInvoke(new Action(() => { double X = 0, Y = 0, Phi = 0; string Name = string.Empty; if (Subject.Params.Inputs["X"] is List && (Subject.Params.Inputs["X"] as List).Count > 0) { X = (Subject.Params.Inputs["X"] as List)[0]; Y = (Subject.Params.Inputs["Y"] as List)[0]; Phi = (Subject.Params.Inputs["Phi"] as List)[0]; Name = (string)Subject.Params.Inputs["Name"]; } else if (Subject.Params.Inputs.ContainsKey("X") && Subject.Params.Inputs["X"] is double) { X = (double)Subject.Params.Inputs["X"]; Y = (double)Subject.Params.Inputs["Y"]; Phi = (double)Subject.Params.Inputs["Phi"]; Name = (string)Subject.Params.Inputs["Name"]; } dtxtX.Text = X.ToString(); dtxtY.Text = Y.ToString(); dtxtPhi.Text = Phi.ToString(); dtxtName.Text = Subject.Params.Inputs["Name"].ToString(); if (Subject.InputImage is HObject) { inputImageHSmartWindowControl.ShowHoImage((HObject)Subject.InputImage); } if (Subject.Params.ROI != null) { Type type = Subject.Params.ROI.GetType(); switch (type) { case Type t when t == typeof(HRectangle2): { cmbTypeRoi.Text = RoiType.Rectangle2.ToString(); break; } case Type t when t == typeof(HCircle): { cmbTypeRoi.Text = RoiType.Circle.ToString(); break; } default: { Debug.WriteLine("Unknown type."); break; } } if (cmbTypeRoi.Text.ToString() != "None") { ckbDrawRoi.Checked = false; Thread.Sleep(50); ckbDrawRoi.Checked = true; } } inputImageHSmartWindowControl.oRoi = Subject.Params.ROI; })); } /// /// 更新输出结果 /// public override void UpdataOutputs() { //this.BeginInvoke(new Action(() => //{ // //存在反序列化错乱的情况需要使用自定义的转换器 //})); } /// /// 点击运行 /// /// /// public override void btnRun_Click(object sender, EventArgs e) { if (Subject.InputImage != null) { InputImage = Subject.InputImage; } DateTime StartTime = DateTime.Now; Run(); //更新日志与结果 this.BeginInvoke(new Action(() => { if (Subject.Result) { lblResult.BackColor = Color.Green; lblResult.Text = "True"; recordImageHSmartWindowControl.SetColor("green"); } else { lblResult.BackColor = Color.Red; lblResult.Text = "False"; recordImageHSmartWindowControl.SetColor("red"); } lblMsg.Text = Msg.Length > 50 ? Msg.Substring(0, 50) : Msg; lblMsgToolTip.SetToolTip(BtmStatusStrip, Msg); lblRunTime.Text = $"{(DateTime.Now - StartTime).TotalMilliseconds}ms"; UpdataOutputs(); imgTabControl.SelectedTab = tabPageRecordImage; if (Subject.InputImage != null && Subject.InputImage is HObject) { HOperatorSet.GetImageSize((HObject)Subject.InputImage, out HTuple ho_ImageWidth, out HTuple ho_ImageHeight); recordImageHSmartWindowControl.ShowHoImage((HObject)Subject.InputImage); } //先判断子类再判断父类 if (Subject.Record != null && Subject.Record is MsgRecord msgRecord) { recordImageHSmartWindowControl.DispObj(msgRecord.RecordObject_OK, true); recordImageHSmartWindowControl.DispObj(msgRecord.RecordObject_NG, false); for (int i = 0; i < msgRecord.Msg.Length; i++) { recordImageHSmartWindowControl.ShowMsg(msgRecord.Msg[i] , 1 == msgRecord.Result[i] ? true : false, msgRecord.Column[i], msgRecord.Row[i]); } } else if (Subject.Record != null && Subject.Record is ObjectRecord objRecord) { recordImageHSmartWindowControl.DispObj(objRecord.RecordObject_OK, true); recordImageHSmartWindowControl.DispObj(objRecord.RecordObject_NG, false); } GC.Collect(); })); } public override void btnLoadImage_Click(object sender, EventArgs e) { OpenFileDialog openFileDialog = new OpenFileDialog(); // 设置文件对话框的属性 openFileDialog.Multiselect = false; // 不允许多选 // 设置文件过滤器,支持多种文件类型 openFileDialog.Filter = "Image Files (*.png;*.jpg;*.jpeg;*.bmp)|*.png;*.jpg;*.jpeg;*.bmp|All Files (*.*)|*.*"; // 显示文件对话框 DialogResult result = openFileDialog.ShowDialog(); // 处理对话框返回结果 if (result == DialogResult.OK) { // 获取用户选择的文件名 string[] selectedFiles = openFileDialog.FileNames; if (selectedFiles.Length > 0) { HOperatorSet.ReadImage(out HObject ho_Image, selectedFiles[0]); //判断是否为灰度图 using (HDevDisposeHelper dh = new HDevDisposeHelper()) { HOperatorSet.CountChannels(ho_Image, out HTuple hv_Channels); if (hv_Channels.TupleInt() != 1) { if (hv_Channels.TupleInt() == 4) { HOperatorSet.Decompose4(ho_Image, out HObject R, out HObject G, out HObject B, out _); HOperatorSet.Compose3(R, G, B, out ho_Image); } HOperatorSet.Rgb1ToGray(ho_Image, out ho_Image); //更新日志与结果 this.BeginInvoke(new Action(() => { lblMsg.Text = "导入图片非灰度图,自动转换为灰度图"; })); } InputImage = ho_Image; imgTabControl.SelectedTab = tabPageInputImage; } } } } public override void btnSaveParas_Click(object sender, EventArgs e) { //保存前需要更新输入参数Inputs UpdataInputs(); // 创建 SaveFileDialog 实例 using (SaveFileDialog saveFileDialog = new SaveFileDialog()) { // 设置对话框标题 saveFileDialog.Title = "保存文件"; // 设置默认路径 saveFileDialog.InitialDirectory = Application.StartupPath; // 设置文件类型过滤器 saveFileDialog.Filter = "文本文件 (*.json)|*.json|所有文件 (*.*)|*.*"; // 设置默认文件名 saveFileDialog.FileName = Subject.strProcessName + ".json"; // 显示对话框并检查用户是否点击了保存按钮 if (saveFileDialog.ShowDialog() == DialogResult.OK) { // 获取用户选择的文件路径 string fullPath = saveFileDialog.FileName; Debug.WriteLine("选择的文件路径是: " + fullPath); Subject.strProcessName = Path.GetFileNameWithoutExtension(fullPath); Subject.Save(Path.GetDirectoryName(fullPath)); } } } public override void ckbDrawRoi_CheckedChanged(object sender, EventArgs e) { if (ckbDrawRoi.Checked) { inputImageHSmartWindowControl.bAollowDraw = true; imgTabControl.SelectedTab = tabPageInputImage; } else { inputImageHSmartWindowControl.bAollowDraw = false; Subject.Params.ROI = new ROI(); } } } }