using HalconDotNet;
using LB_VisionControls;
using Newtonsoft.Json.Linq;
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 OpenCvSharp;
using System.Diagnostics;
namespace LB_VisionProcesses.Alogrithms
{
public partial class TAlgorithmEdit : UserControl
{
public IProcess Subject;
public UserHSmartWindowControl inputImageHSmartWindowControl = new UserHSmartWindowControl();
public UserHSmartWindowControl recordImageHSmartWindowControl = new UserHSmartWindowControl();
public ToolTip lblMsgToolTip = new ToolTip();
public bool Result
{
get
{
if (Subject == null)
{
return false;
}
return Subject.Result;
}
set
{
if (Subject != null)
{
Subject.Result = value;
}
}
}
public string Msg
{
get
{
if (Subject == null)
{
return "算法为空";
}
return Subject.Msg.Trim();
}
}
public Object OutputImage
{
get
{
if (Subject == null)
{
return null;
}
return Subject.OutputImage;
}
}
public Object InputImage
{
get
{
if (Subject == null)
{
return null;
}
return Subject.InputImage;
}
set
{
Subject.InputImage = value;
if (InputImage == null)
{
return;
}
if (InputImage is HObject)
{
inputImageHSmartWindowControl.ShowHoImage((HObject)value);
}
else if (InputImage is Bitmap)
{
TAlgorithm.Bitmap2HObject((Bitmap)value, out HObject image);
inputImageHSmartWindowControl.ShowHoImage(image);
}
else if (InputImage is Mat)
{
TAlgorithm.Mat2HObject((Mat)value, out HObject image);
inputImageHSmartWindowControl.ShowHoImage(image);
}
}
}
public TAlgorithmEdit() { }
public TAlgorithmEdit(TAlgorithm subject = null)
{
if (subject != null)
{
Subject = subject;
}
else
{
Subject = new TAlgorithm();
}
this.Dock = DockStyle.Fill;
lblMsgToolTip.AutoPopDelay = 5000; // 提示显示5秒后消失
lblMsgToolTip.InitialDelay = 500; // 鼠标悬停500毫秒后显示提示
InitializeComponent();
}
///
/// 运行算子
///
///
///
///
///
///
///
public virtual bool Run()
{
//运行前需要更新输入参数Paras
UpdataInputs();
Subject.Run();
return Subject.Result;
}
///
/// 更新运行参数
///
public virtual void UpdataInputs()
{
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(HEllipse):
{
HEllipse hEllipse = (HEllipse)inputImageHSmartWindowControl.oRoi;
Subject.Params.ROI
= new HEllipse(hEllipse.X - Subject.Params.Fixture.X, hEllipse.Y - Subject.Params.Fixture.Y
, hEllipse.Phi, hEllipse.Radius1, hEllipse.Radius2, hEllipse.StartPhi, hEllipse.EndPhi);
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 virtual void LoadParas()
{
Type type = Subject.Params.ROI?.GetType();
switch (type)
{
case Type t when t == typeof(HRectangle2):
{
inputImageHSmartWindowControl.oRoi
= new HRectangle2(Subject.Params.ROI.X + Subject.Params.Fixture.X, Subject.Params.ROI.Y + Subject.Params.Fixture.Y
, Subject.Params.ROI.Phi + Subject.Params.Fixture.Phi, ((HRectangle2)Subject.Params.ROI).Width, ((HRectangle2)Subject.Params.ROI).Height);
break;
}
case Type t when t == typeof(HCircle):
{
inputImageHSmartWindowControl.oRoi
= new HCircle(Subject.Params.ROI.X + Subject.Params.Fixture.X, Subject.Params.ROI.Y + Subject.Params.Fixture.Y
, ((HCircle)Subject.Params.ROI).Radius);
break;
}
case Type t when t == typeof(HEllipse):
{
inputImageHSmartWindowControl.oRoi
= new HEllipse(Subject.Params.ROI.X + Subject.Params.Fixture.X, Subject.Params.ROI.Y + Subject.Params.Fixture.Y
, ((HEllipse)Subject.Params.ROI).Phi, ((HEllipse)Subject.Params.ROI).Radius1, ((HEllipse)Subject.Params.ROI).Radius2
, ((HEllipse)Subject.Params.ROI).StartAngle, ((HEllipse)Subject.Params.ROI).EndAngle);
break;
}
case Type t when t == typeof(HSegment):
{
inputImageHSmartWindowControl.oRoi
= new HSegment(((HSegment)Subject.Params.ROI).StartX + Subject.Params.Fixture.X, ((HSegment)Subject.Params.ROI).StartY + Subject.Params.Fixture.Y
, ((HSegment)Subject.Params.ROI).EndX + Subject.Params.Fixture.X, ((HSegment)Subject.Params.ROI).EndY + Subject.Params.Fixture.Y);
break;
}
default:
{
inputImageHSmartWindowControl.oRoi = null;
break;
}
}
}
///
/// 更新运行结果
///
public virtual void UpdataOutputs() { }
public virtual void btnRun_Click(object sender, EventArgs e) { }
public virtual 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]);
InputImage = ho_Image;
}
}
}
public virtual void btnSaveParas_Click(object sender, EventArgs e)
{
UpdataInputs();
// 创建 SaveFileDialog 实例
using (SaveFileDialog saveFileDialog = new SaveFileDialog())
{
// 设置对话框标题
saveFileDialog.Title = "保存文件";
// 设置默认路径
saveFileDialog.InitialDirectory = Application.StartupPath;
// 设置文件类型过滤器
saveFileDialog.Filter = "文本文件 (*.json)|*.json|所有文件 (*.*)|*.*";
// 设置默认文件名
saveFileDialog.FileName = "Algorithm_1.json";
// 显示对话框并检查用户是否点击了保存按钮
if (saveFileDialog.ShowDialog() == DialogResult.OK)
{
// 获取用户选择的文件路径
string fullPath = saveFileDialog.FileName;
Debug.WriteLine("选择的文件路径是: " + fullPath);
Subject.strProcessName = Path.GetFileNameWithoutExtension(fullPath);
//Subject.oRoi = inputImageHSmartWindowControl.oRoi;
Subject.Save(System.IO.Path.GetDirectoryName(fullPath));
}
}
}
public virtual void btnLoadParas_Click(object sender, EventArgs e)
{
OpenFileDialog openFileDialog = new OpenFileDialog();
// 设置文件对话框的属性
openFileDialog.Multiselect = false; // 不允许多选
// 设置文件过滤器,支持多种文件类型
openFileDialog.Filter = "Ini Files (*.json)|*.json|All Files (*.*)|*.*";
// 显示文件对话框
DialogResult result = openFileDialog.ShowDialog();
// 处理对话框返回结果
if (result == DialogResult.OK)
{
// 获取用户选择的文件名
string[] selectedFiles = openFileDialog.FileNames;
if (selectedFiles.Length > 0)
{
Subject.Load(selectedFiles[0]);
LoadParas();
}
}
}
public virtual void ckbDrawRoi_CheckedChanged(object sender, EventArgs e) { }
public virtual void cmbTypeRoi_SelectedIndexChanged(object sender, EventArgs e) { }
public virtual void cmbFixture_SelectedIndexChanged(object sender, EventArgs e) { }
}
}