WinForm之配方模块

加载配方
新建配方
删除配方
保存配方
切换配方
btn_LoadRecipe
btn_CreateRecipe
btn_DeleteRecipe
btn_SaveRecipe
btn_SaveAsRecipe
cbb_SelectRecipe
propertyGrid_Recipe
一 新建配方

RecipeForm
txt_RecipeName
确认
private void materialButton1_Click(object sender, EventArgs e)
{
ZWModel zWModel = new ZWModel();
XmlSerializerHelper.WriteXML(zWModel, Path.Combine("./Recipes", txt_RecipeName.Text.Trim() + ".xml"), typeof(ZWModel));
var mainForm = Application.OpenForms.OfType<Form1>().FirstOrDefault();
mainForm.Invoke(new Action(() =>
{
mainForm.cbb_SelectRecipe.Items.Clear();
string[] filePath = Directory.GetFiles("./Recipes");
foreach (string item in filePath)
{
string RecipeName = Path.GetFileName(item);
mainForm.cbb_SelectRecipe.Items.Add(RecipeName);
}
}));
this.Close();
}
新建配方
private void materialButton2_Click(object sender, EventArgs e)
{
RecipeForm recipeForm = new RecipeForm();
recipeForm.ShowDialog();
}
二 选择配方显示

private void cbb_SelectRecipe_SelectedIndexChanged(object sender, EventArgs e)
{
string recipe = cbb_SelectRecipe.Text;
ZWModel zWModel= (ZWModel)XmlSerializerHelper.ReadXML(Path.Combine("./Recipes", recipe),typeof(ZWModel));
propertyGrid_Recipe.SelectedObject = zWModel;
}
三 当前使用配方的显示和保存
cbb_SelectedRecipe

AppParameter
public class AppParameter
{
public static string Version { get; set; } = "0.0.1";
public string CameraSeriesNum { get; set; } =string.Empty;
public string Ip { get; set; } = "127.0.0.1";
public int Port { get; set; } = 8080;
public string RecipeName = string.Empty;
}
加载配方显示
string[] filePath = Directory.GetFiles("./Recipes");
foreach (string item in filePath)
{
string RecipeName = Path.GetFileName(item);
cbb_SelectRecipe.Items.Add(RecipeName);
cbb_SelectedRecipe.Items.Add(RecipeName);
}
保存软件参数
private void btn_SaveGlobalPatamters_Click(object sender, EventArgs e)
{
AppParameter appParameter = new AppParameter();
appParameter.Ip = txt_Ip.Text.Trim();
appParameter.Port = Convert.ToInt32(txt_Port.Text.Trim());
appParameter.CameraSeriesNum = txt_CameraSeriesNum.Text.Trim();
appParameter.RecipeName = cbb_SelectedRecipe.Text.Trim();
XmlSerializerHelper.WriteXML(appParameter, @"D:\\AOI软件参数\\AppParameter.xml",typeof(AppParameter));
MessageBox.Show("保存成功!");
}
读取显示软件参数
if (File.Exists(@"D:\\AOI软件参数\\AppParameter.xml"))
{
AppParameter appParameter = (AppParameter)XmlSerializerHelper.ReadXML(@"D:\\AOI软件参数\\AppParameter.xml", typeof(AppParameter));
txt_Ip.Text = appParameter.Ip;
txt_Port.Text= appParameter.Port.ToString();
txt_CameraSeriesNum.Text= appParameter.CameraSeriesNum;
cbb_SelectedRecipe.Text = appParameter.RecipeName;
}
else
{
AppParameter appParameter = new AppParameter();
txt_Ip.Text = appParameter.Ip;
txt_Port.Text= appParameter.Port.ToString();
txt_CameraSeriesNum.Text= appParameter.CameraSeriesNum;
cbb_SelectedRecipe.Text= appParameter.RecipeName;
}
三 配方的加载
全局变量定义
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WinForm之AOI外观检测.Models;
namespace WinForm之AOI外观检测
{
public class GlobalParamters
{
public static bool IsOnline =false;
public static ZWModel CurrAlgoParam = new ZWModel();
}
}
窗口构造器中添加
if (File.Exists(@"D:\\AOI软件参数\\AppParameter.xml"))
{
AppParameter appParameter = (AppParameter)XmlSerializerHelper.ReadXML(@"D:\\AOI软件参数\\AppParameter.xml", typeof(AppParameter));
txt_Ip.Text = appParameter.Ip;
txt_Port.Text = appParameter.Port.ToString();
txt_CameraSeriesNum.Text = appParameter.CameraSeriesNum;
cbb_SelectedRecipe.Text = appParameter.RecipeName;
}
else
{
AppParameter appParameter = new AppParameter();
txt_Ip.Text = appParameter.Ip;
txt_Port.Text = appParameter.Port.ToString();
txt_CameraSeriesNum.Text = appParameter.CameraSeriesNum;
cbb_SelectedRecipe.Text = appParameter.RecipeName;
}
ZWModel zWModel = (ZWModel)XmlSerializerHelper.ReadXML(Path.Combine("./Recipes", cbb_SelectedRecipe.Text.Trim()), typeof(ZWModel));
propertyGrid1.SelectedObject = zWModel;
GlobalParamters.CurrAlgoParam = zWModel;

四 全局静态参数的作用:跨类跨线程传递参数
五 在线模式算法参数的调用问题

HObject defectRegion = AlgorithmService.Instance.DetectZW(info.Image, GlobalParamters.CurrAlgoParam);
六 切换配方

public string CurrRecipeName;
Log.Info("欢迎进入-AOI视觉外观缺陷检测系统");
if (File.Exists(@"D:\\AOI软件参数\\AppParameter.xml"))
{
AppParameter appParameter = (AppParameter)XmlSerializerHelper.ReadXML(@"D:\\AOI软件参数\\AppParameter.xml", typeof(AppParameter));
txt_Ip.Text = appParameter.Ip;
txt_Port.Text = appParameter.Port.ToString();
txt_CameraSeriesNum.Text = appParameter.CameraSeriesNum;
cbb_SelectedRecipe.Text = appParameter.RecipeName;
}
else
{
AppParameter appParameter = new AppParameter();
txt_Ip.Text = appParameter.Ip;
txt_Port.Text = appParameter.Port.ToString();
txt_CameraSeriesNum.Text = appParameter.CameraSeriesNum;
cbb_SelectedRecipe.Text = appParameter.RecipeName;
}
CurrRecipeName = cbb_SelectedRecipe.Text.Trim();
private void materialButton16_Click(object sender, EventArgs e)
{
DialogResult result = MessageBox.Show(
"确定要切换配方吗?",
"确认",
MessageBoxButtons.YesNo,
MessageBoxIcon.Question);
if (result == DialogResult.Yes)
{
ZWModel zWModel = (ZWModel)XmlSerializerHelper.ReadXML(Path.Combine("./Recipes", cbb_SelectedRecipe.Text.Trim()), typeof(ZWModel));
propertyGrid1.SelectedObject = zWModel;
GlobalParamters.CurrAlgoParam = zWModel;
CurrRecipeName = cbb_SelectedRecipe.Text;
}
else
{
cbb_SelectedRecipe.Text = CurrRecipeName;
}
}
七 删除配方
private void materialButton13_Click(object sender, EventArgs e)
{
if (cbb_SelectRecipe.Text.Length > 0)
{
DialogResult result = MessageBox.Show(
"确定删除配方吗?",
"确认",
MessageBoxButtons.YesNo,
MessageBoxIcon.Question);
if (result == DialogResult.Yes)
{
string recipeName = cbb_SelectRecipe.Text.Trim();
File.Delete(Path.Combine("./Recipes", recipeName));
cbb_SelectRecipe.Items.Clear();
cbb_SelectedRecipe.Items.Clear();
string[] filePath = Directory.GetFiles("./Recipes");
foreach (string item in filePath)
{
string RecipeName = Path.GetFileName(item);
cbb_SelectRecipe.Items.Add(RecipeName);
cbb_SelectedRecipe.Items.Add(RecipeName);
}
}
else
{
}
}
else
{
MessageBox.Show("未选择删除配方!");
}
}
完善新建配方

private void materialButton1_Click(object sender, EventArgs e)
{
ZWModel zWModel = new ZWModel();
XmlSerializerHelper.WriteXML(zWModel, Path.Combine("./Recipes", txt_RecipeName.Text.Trim() + ".xml"), typeof(ZWModel));
var mainForm = Application.OpenForms.OfType<MainForm>().FirstOrDefault();
mainForm.Invoke(new Action(() =>
{
mainForm.cbb_SelectRecipe.Items.Clear();
mainForm.cbb_SelectedRecipe.Items.Clear();
string[] filePath = Directory.GetFiles("./Recipes");
foreach (string item in filePath)
{
string RecipeName = Path.GetFileName(item);
mainForm.cbb_SelectRecipe.Items.Add(RecipeName);
mainForm.cbb_SelectedRecipe.Items.Add(RecipeName);
}
}));
this.Close();
}
八 保存配方
private void btn_SaveRecipe_Click(object sender, EventArgs e)
{
if (cbb_SelectRecipe.Text.Length > 0)
{
string recipeName = cbb_SelectRecipe.Text.Trim();
XmlSerializerHelper.WriteXML((ZWModel)propertyGrid_Recipe.SelectedObject, Path.Combine("./Recipes", recipeName), typeof(ZWModel));
MessageBox.Show("保存成功!");
}
else
{
MessageBox.Show("未选择保存配方!");
}
}
九 另存为配方
private void btn_SaveAsRecipe_Click(object sender, EventArgs e)
{
using (SaveFileDialog saveFileDialog = new SaveFileDialog())
{
saveFileDialog.Filter = "XML 文件 (*.xml)|*.xml|所有文件 (*.*)|*.*";
saveFileDialog.FilterIndex = 1;
saveFileDialog.RestoreDirectory = true;
saveFileDialog.Title = "另存为 xml文件";
saveFileDialog.DefaultExt = "xml";
if (saveFileDialog.ShowDialog() == DialogResult.OK)
{
try
{
string filePath = saveFileDialog.FileName;
XmlSerializerHelper.WriteXML(propertyGrid_Recipe.SelectedObject, filePath, typeof(ZWModel));
MessageBox.Show("文件已成功保存!", "成功", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
catch (Exception ex)
{
MessageBox.Show($"保存文件时出错: {ex.Message}", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}
}
十 加载配方
private void btn_LoadRecipe_Click(object sender, EventArgs e)
{
try
{
OpenFileDialog openFileDialog = new OpenFileDialog();
if(openFileDialog.ShowDialog() == DialogResult.OK)
{
string filePath = openFileDialog.FileName;
File.Copy(filePath,Path.Combine("Recipes",Path.GetFileName(filePath)),true);
cbb_SelectRecipe.Items.Clear();
cbb_SelectedRecipe.Items.Clear();
string[] filePaths = Directory.GetFiles("./Recipes");
foreach (string item in filePaths)
{
string RecipeName = Path.GetFileName(item);
cbb_SelectRecipe.Items.Add(RecipeName);
cbb_SelectedRecipe.Items.Add(RecipeName);
}
}
}
catch (Exception ex)
{
Log.Error($"加载配方失败,错误信息:{ex.Message}");
}
}
十一 算法调试界面保存参数修改
private void materialButton10_Click(object sender, EventArgs e)
{
ZWModel zWModelParam = (ZWModel)propertyGrid1.SelectedObject;
GlobalParamters.CurrAlgoParam = zWModelParam;
XmlSerializerHelper.WriteXML(zWModelParam, Path.Combine("./Recipes", cbb_SelectedRecipe.Text.Trim()), typeof(ZWModel));
MessageBox.Show("保存成功!");
}