banboshi_V1/halftoneproject-master/AssistClient/UI/UIDefectLib.cs
2023-10-31 13:19:29 +08:00

241 lines
8.6 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using Advantech.Motion;
using Newtonsoft.Json;
using OpenCvSharp;
using AssistClient.Device;
using AssistClient.Utils;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
using static AssistClient.Device.DefectLib;
namespace AssistClient.UI
{
public partial class UIDefectLib : UserControl
{
SynchronizationContext SyncContext = null;
public Action<string> GetParamsEvent;
//
private DefectLibProp prop = new DefectLibProp(Config.Defect_CutSize,Config.Defect_ReSize,Config.Defect_Thresholds);
private DefectLib dev;
public UIDefectLib()
{
InitializeComponent();
propertyGrid1.PropertyValueChanged += propertyGrid1_PropertyValueChanged;
refreshUIState();
//获取UI线程同步上下文
SyncContext = SynchronizationContext.Current;
//init();
}
private string szLog;
private void refreshUIState()
{
foreach (ToolStripItem item in this.toolStrip1.Items)
{
if (item.Text == "打开设备")
item.Visible = (dev == null || !dev.IsInit);
else
this.propertyGrid1.Enabled = item.Enabled = !(dev == null || !dev.IsInit);
}
}
public void init()
{
this.tbtnSave.Visible = tssSave.Visible = (GetParamsEvent != null);
this.propertyGrid1.SelectedObject = prop;
dev = new DefectLib();
dev.WarningEvent = (level, info) =>
{
szLog = $"({level}){info}";
txtLog.Text = $"({level}){info}";
};
//DATA
dev.finishEvent += new System.Action<DefectTask>((task) =>
{
DateTime t1= DateTime.Now;
var t2=t1-task.nowTime;
var t3= t2.Milliseconds;
prop.InformationList = JsonConvert.SerializeObject(task.informationList);
prop.resultInfo = task.isSucceed ? "成功" : task.resultInfo;
this.refreshUI();
});
if (!dev.start())
{
this.closeDev();
return;
}
refreshUIState();
}
public string getParamsData()
{
return prop.serialize();
}
public void setParamsData(string json)
{
if (json == "") return;
prop.deserialize(json);
this.propertyGrid1.Refresh();
}
private void refreshUI()
{
SyncContext.Post(m =>
{
var result = m as string;
propertyGrid1.Refresh();
//txtLog.Text = szLog;//不显示
//tbtnJogOnOff.Text = (prop.AxState == AxisState.STA_AX_EXT_JOG) ? "关闭Jog" : "开启Jog";
//tbtnLeft.Enabled = tbtnRight.Enabled = (prop.AxState == AxisState.STA_AX_EXT_JOG);
}, "异步操作完成结果");
}
private void closeDev()
{
try
{
if (dev == null)
return;
dev.stop();
}
catch (Exception ex)
{
refreshUIState();
MessageBox.Show(ex.Message, "失败", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
protected override void OnHandleDestroyed(EventArgs e)
{
base.OnHandleDestroyed(e);
// 在此添加需要手动释放资源的代码
this.closeDev();
}
private void tbtnRun_Click(object sender, EventArgs e)
{
if (!Util.IsNumber(prop.ThresholdsClass.Replace("-", "").Replace(",", "").Replace(";", "").Replace(".", "")))
{
txtLog.Text = "种类阀值只可输入数字!";
return;
}
if (!verifyThresholdsCount(prop.ThresholdsClass, prop.ThresholdsClassCount))
{
txtLog.Text = "输入种类阀值与数量不一致!";
return;
}
try
{
prop.resultInfo = "";
dev.add(new DefectTask()
{
nowTime= DateTime.Now,
bmp=new Mat(prop.BmpPath),
cut_size=prop.CutSize,
resize=prop.Resize,
thresholds=prop.Thresholds,
thresholdsClass = prop.ThresholdsClass,
//finishEvent = (res) =>
//{
//}
});
}
catch(Exception ex)
{
MessageBox.Show(ex.Message, "失败", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void tbtnExport_Click(object sender, EventArgs e)
{
string filePath = FileUtil.saveAsFile($"DefectLib Config.json", "JSON|*.json");
if (filePath != "")
{
string jsonText = prop.serialize();
File.WriteAllText(filePath, jsonText);
MessageBox.Show("保存成功!", "成功", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
private void tbtnImport_Click(object sender, EventArgs e)
{
string filePath = FileUtil.openFile("JSON|*.json");
if (filePath != "")
{
string jsonText = File.ReadAllText(filePath);
prop.deserialize(jsonText);
this.propertyGrid1.Refresh();
//this.propertyGrid1.SelectedObject= prop;
//MessageBox.Show("加载成功!", "成功", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
private void propertyGrid1_PropertyValueChanged(object s, PropertyValueChangedEventArgs e)
{
//其中包含了两个重要的属性OldValue和ChangeItem。
//ChangeItem是“PropertyDescriptorGridEntry”类型。一般可以通过ChangeItem.PropertyDescriptor.ComponentType查找到属性的实际类型。
//而通过ChangeItem的Label则可以查看到当前在属性编辑输入框中显示的值。
string className = e.ChangedItem.PropertyDescriptor.ComponentType.Name;
string propertyName = e.ChangedItem.PropertyDescriptor.Name;
var oldValue = e.OldValue;
var newValue = e.ChangedItem.Value;
switch (propertyName)
{
case "ThresholdsClass":
if(!Util.IsNumber(newValue.ToString().Replace("-","").Replace(",", "").Replace(";", "").Replace(".", "")))
txtLog.Text = "种类阀值只可输入数字!";
else if (!verifyThresholdsCount(newValue.ToString(), prop.ThresholdsClassCount))
txtLog.Text = "输入种类阀值与数量不一致!";
else
txtLog.Text = "";
break;
case "ThresholdsClassCount":
if (!verifyThresholdsCount(prop.ThresholdsClass, (int)newValue))
txtLog.Text = "输入种类阀值与数量不一致!";
else
txtLog.Text = "";
break;
}
}
private void tbtnSave_Click(object sender, EventArgs e)
{
if (!Util.IsNumber(prop.ThresholdsClass.Replace("-", "").Replace(",", "").Replace(";", "").Replace(".", "")))
{
txtLog.Text = "种类阀值只可输入数字!";
return;
}
if (!verifyThresholdsCount(prop.ThresholdsClass, prop.ThresholdsClassCount))
{
txtLog.Text = "输入种类阀值与数量不一致!";
return;
}
GetParamsEvent?.Invoke(prop.serialize());
}
private void tsbtnOpenDev_Click(object sender, EventArgs e)
{
szLog = txtLog.Text = "";
this.init();
}
private bool verifyThresholdsCount(string szThresholdsClass,int iThresholdsClassCount)
{
return szThresholdsClass.Trim().TrimEnd(new char[] { ',', ';' })
.Split(new char[] { ',', ';' }).Count() == iThresholdsClassCount;
}
}
}