using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Bro.UI.HalconDisplay;
using System.IO;
using Newtonsoft.Json;
using Bro.UI.HalconDisplay.ViewROI;
using HalconDotNet;
namespace M423project
{
///
/// add by Patrick 2020-2-18
///
/// 编辑电池在位判断使用的框位置/大小和相关阈值
///
public partial class CtrlSetBatteryCheckROI : UserControl
{
public static event Action OnSettingSaved;
public const string SettingPath = "BatteryCheckSetting.json";
HalconDisplay halconDisplay = new HalconDisplay();
BatteryCheckSetting batteryCheckSetting = new BatteryCheckSetting();
BatteryCheckSetting BatteryCheckSetting
{
get { return batteryCheckSetting; }
set
{
if (value != batteryCheckSetting)
{
batteryCheckSetting = value;
}
}
}
public CtrlSetBatteryCheckROI()
{
InitializeComponent();
halconDisplay.Dock = DockStyle.Fill;
plDisplay.Controls.Add(halconDisplay);
halconDisplay.OnROIChanged += halconDisplay_OnROIChanged;
}
private void halconDisplay_OnROIChanged(object sender, Bro.UI.HalconDisplay.ViewROI.ROI NewROI)
{
if (NewROI is ROIRectangle1)
{
BatteryCheckSetting.Rect = NewROI as ROIRectangle1;
SetROILabel();
}
}
private void SetROILabel()
{
RemoveEvent();
nudStartX.Value = (decimal)BatteryCheckSetting.StartPoint.X;
nudStartY.Value = (decimal)BatteryCheckSetting.StartPoint.Y;
nudEndX.Value = (decimal)BatteryCheckSetting.EndPoint.X;
nudEndY.Value = (decimal)BatteryCheckSetting.EndPoint.Y;
RegisterEvent();
}
private void nudStartY_ValueChanged(object sender, EventArgs e)
{
BatteryCheckSetting.StartPoint = new PointF((float)nudStartX.Value, (float)nudStartY.Value);
BatteryCheckSetting.EndPoint = new PointF((float)nudEndX.Value, (float)nudEndY.Value);
halconDisplay.ROIController.ROIList = new System.Collections.ArrayList();
halconDisplay.ROIController.ROIList.Add(BatteryCheckSetting.Rect);
halconDisplay.Refresh();
}
private void btnSave_Click(object sender, EventArgs e)
{
BatteryCheckSetting.IsEnabled = true;
BatteryCheckSetting.MinArea = (int)nudMin.Value;
BatteryCheckSetting.MaxArea = (int)nudMax.Value;
string path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, SettingPath);
using (StreamWriter writer = new StreamWriter(path, false, Encoding.UTF8))
{
writer.WriteLine(JsonConvert.SerializeObject(BatteryCheckSetting));
writer.Flush();
writer.Close();
}
OnSettingSaved?.Invoke(BatteryCheckSetting);
MessageBox.Show("配置保存完成!");
}
private void CtrlSetBatteryCheckROI_Load(object sender, EventArgs e)
{
LoadSetting();
}
private void LoadSetting()
{
string path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, SettingPath);
if (File.Exists(path))
{
using (StreamReader reader = new StreamReader(path, System.Text.Encoding.UTF8))
{
var dataLine = reader.ReadToEnd();
BatteryCheckSetting = JsonConvert.DeserializeObject(dataLine);
}
}
else
{
BatteryCheckSetting = new BatteryCheckSetting();
}
halconDisplay.ROIController.ROIList = new System.Collections.ArrayList();
halconDisplay.ROIController.ROIList.Add(BatteryCheckSetting.Rect);
SetROILabel();
nudMin.Value = BatteryCheckSetting.MinArea;
nudMax.Value = BatteryCheckSetting.MaxArea;
}
private void RegisterEvent()
{
nudStartX.ValueChanged += nudStartY_ValueChanged;
nudStartY.ValueChanged += nudStartY_ValueChanged;
nudEndX.ValueChanged += nudStartY_ValueChanged;
nudEndY.ValueChanged += nudStartY_ValueChanged;
}
private void RemoveEvent()
{
nudStartX.ValueChanged -= nudStartY_ValueChanged;
nudStartY.ValueChanged -= nudStartY_ValueChanged;
nudEndX.ValueChanged -= nudStartY_ValueChanged;
nudEndY.ValueChanged -= nudStartY_ValueChanged;
}
#region 图片载入
private void btnLoadSingleImage_Click(object sender, EventArgs e)
{
OpenFileDialog ofd = new OpenFileDialog();
ofd.Filter = "TIFF图片|*.tif|JPG图片|*.jpg|BMP图片|*.bmp";
ofd.Multiselect = false;
if (ofd.ShowDialog() != DialogResult.OK)
{
return;
}
LoadImagFile(ofd.FileName);
}
private void LoadImagFile(string imgPath)
{
HImage img = new HImage();
img.ReadImage(imgPath);
halconDisplay.Image = img;
halconDisplay.Refresh();
txtImgPath.Text = imgPath;
}
#endregion
int imgIndex = 0;
int ImgIndex
{
get { return imgIndex; }
set
{
imgIndex = value;
btnPre.Visible = imgIndex > 0;
btnNext.Visible = (imgFileList.Count > 0 && imgIndex < imgFileList.Count - 1);
if (imgFileList.Count > 0 && imgIndex >= 0 && imgIndex < imgFileList.Count)
{
LoadImagFile(imgFileList[imgIndex]);
}
}
}
List imgFileList = new List();
private void btnLoadImageFolder_Click(object sender, EventArgs e)
{
List imgExtensions = new List() { ".BMP", ".JPG", ".TIF" };
FolderBrowserDialog fbd = new FolderBrowserDialog();
if (fbd.ShowDialog() == DialogResult.OK)
{
imgFileList = Directory.GetFiles(fbd.SelectedPath).Where(u =>
{
string s = u.ToUpper();
return imgExtensions.Any(ext => s.EndsWith(ext));
}).ToList();
if (imgFileList.Count == 0)
{
MessageBox.Show($"当前文件夹中没有图片文件,目前支持{string.Join(",", imgExtensions)}格式");
return;
}
ImgIndex = 0;
}
}
private void btnPre_Click(object sender, EventArgs e)
{
ImgIndex--;
}
private void btnNext_Click(object sender, EventArgs e)
{
ImgIndex++;
}
}
}
public class BatteryCheckSetting
{
private ROIRectangle1 rect = new ROIRectangle1();
[JsonIgnore]
public ROIRectangle1 Rect
{
get
{
rect.SetRect(StartPoint, EndPoint);
return rect;
}
set
{
var data = rect.getModelData().DArr;
StartPoint = new PointF((float)data[1], (float)data[0]);
EndPoint = new PointF((float)data[3], (float)data[2]);
}
}
public PointF StartPoint { get; set; } = new PointF(50, 50);
public PointF EndPoint { get; set; } = new PointF(150, 150);
public int MinArea { get; set; } = 0;
public int MaxArea { get; set; } = 0;
public bool IsEnabled { get; set; } = false;
}