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();
}
}
}
}