WinForm之配方模块

该文章已生成可运行项目,

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

    // 保存XML
    XmlSerializerHelper.WriteXML(zWModel, Path.Combine("./Recipes", txt_RecipeName.Text.Trim() + ".xml"), typeof(ZWModel));

    // 更新UI
    // 获取主窗体
    var mainForm = Application.OpenForms.OfType<Form1>().FirstOrDefault();

    // 更新UI
    mainForm.Invoke(new Action(() =>
    {
        // 更新配方列表

        // 清除已有的
        mainForm.cbb_SelectRecipe.Items.Clear();

        // 获取所有配方xml文件
        string[] filePath = Directory.GetFiles("./Recipes");
        // 显示到主控件上
        foreach (string item in filePath)
        {
            // 获取文件名称
            string RecipeName = Path.GetFileName(item);
            // 加到下拉框里
            mainForm.cbb_SelectRecipe.Items.Add(RecipeName);
        }
    }));


    // 关闭窗口
    this.Close();

}

新建配方

  /// <summary>
  /// 新建配方
  /// </summary>
  /// <param name="sender"></param>
  /// <param name="e"></param>
  private void materialButton2_Click(object sender, EventArgs e)
  {
      RecipeForm recipeForm = new RecipeForm();
      recipeForm.ShowDialog();
  }

二 选择配方显示

在这里插入图片描述

        /// <summary>
        /// 选择配方进行显示
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        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

 /// <summary>
 /// 软件参数
 /// </summary>
 public class AppParameter
 {
     /// <summary>
     /// 软件版本(静态的)
     /// </summary>
     public static string Version { get; set; } = "0.0.1";

     /// <summary>
     /// 相机序列号
     /// </summary>
     public string CameraSeriesNum { get; set; } =string.Empty;

     /// <summary>
     /// 服务端IP
     /// </summary>
     public string Ip { get; set; } = "127.0.0.1";

     /// <summary>
     /// 服务端端口
     /// </summary>
     public int Port { get; set; } = 8080;

     /// <summary>
     /// 配方
     /// </summary>
     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);
       }

保存软件参数

       /// <summary>
       /// 保存参数
       /// </summary>
       /// <param name="sender"></param>
       /// <param name="e"></param>
       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("保存成功!");
       }

读取显示软件参数

      // 如果存在全局参数xml文件,则读取,否则使用初始参数
      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
    {

        /// <summary>
        /// 是否在线模式
        /// </summary>
        public static bool IsOnline =false;

        /// <summary>
        /// 当前配方参数(算法参数)
        /// </summary>
        public static ZWModel CurrAlgoParam = new ZWModel();
    }
}

窗口构造器中添加


            // 如果存在全局参数xml文件,则读取,否则使用初始参数
            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);

六 切换配方

在这里插入图片描述

    /// <summary>
    /// 当前配方
    /// </summary>
    public string CurrRecipeName;
            Log.Info("欢迎进入-AOI视觉外观缺陷检测系统");

            // 如果存在全局参数xml文件,则读取,否则使用初始参数
            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();
   /// <summary>
   /// 切换配方
   /// </summary>
   /// <param name="sender"></param>
   /// <param name="e"></param>
   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;
       }
   }

七 删除配方

   
        /// <summary>
        /// 删除配方
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        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));

                    // 刷新UI列表

                    // 清除已有的
                    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("未选择删除配方!");
            }

        }

完善新建配方

在这里插入图片描述

   /// <summary>
   /// 创建配方
   /// </summary>
   /// <param name="sender"></param>
   /// <param name="e"></param>
   private void materialButton1_Click(object sender, EventArgs e)
   {
       ZWModel zWModel = new ZWModel();

       // 保存XML
       XmlSerializerHelper.WriteXML(zWModel, Path.Combine("./Recipes", txt_RecipeName.Text.Trim() + ".xml"), typeof(ZWModel));

       // 更新UI
       // 获取主窗体
       var mainForm = Application.OpenForms.OfType<MainForm>().FirstOrDefault();

       // 更新UI
       mainForm.Invoke(new Action(() =>
       {
           // 更新配方列表

           // 清除已有的
           mainForm.cbb_SelectRecipe.Items.Clear();
           // 清除已有的
           mainForm.cbb_SelectedRecipe.Items.Clear();
           // 获取所有配方xml文件
           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();

   }

八 保存配方

        /// <summary>
        /// 保存配方
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        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("未选择保存配方!");
            }
        }

九 另存为配方

    /// <summary>
    /// 另存为配方
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    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);
                }
            }
        }
    }

十 加载配方

        /// <summary>
        /// 加载配方
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        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;
            // 保存本地xml

            XmlSerializerHelper.WriteXML(zWModelParam, Path.Combine("./Recipes", cbb_SelectedRecipe.Text.Trim()), typeof(ZWModel));

            MessageBox.Show("保存成功!");

        }
本文章已经生成可运行项目
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值