WPF+Halcon 培训项目实战(11):HS组件封装

文章目录

  • 前言
  • 相关链接
  • 项目专栏
  • 运行环境
  • 匹配图片
  • 封装组件
    • 新增类库项目
    • 选择依赖顺序并添加Nuget
    • 修改原本矩形方法
    • 运行结果:
  • 对矩形进行抽象封装
    • 抽象基类
    • 矩形抽象改造
  • 圆形抽象封装
    • 代码
    • 运行结果

前言

为了更好地去学习WPF+Halcon,我决定去报个班学一下。原因无非是想换个工作。相关的教学视频来源于下方的Up主的提供的教程。这里只做笔记分享,想要源码或者教学视频可以和他联系一下。

相关链接

微软系列技术教程 WPF 年度公益课程

Halcon开发 CSDN博客专栏

个人学习的Gitee 项目地址仓库

项目专栏

WPF+Halcon实战项目

运行环境

  • .net core 8.0
  • visual studio 2022
  • halcon HDevelop 20.11
  • windows 11

匹配图片

在这里插入图片描述

封装组件

Halcon官方的代码很多都是基于String的类型判断,我们要对Halcon的代码进行一步简单的封装。

新增类库项目

在这里插入图片描述
在这里插入图片描述

选择依赖顺序并添加Nuget

让我们的WPF主程序依赖于HalconExtension类库

在这里插入图片描述

添加Nuget

在这里插入图片描述

修改原本矩形方法

原来的方法

             // 显示绘制图案
             HalconWindow.HalconWindow.AttachDrawingObjectToWindow(rect);
             // 去除绘制图案
             //HalconWindow.HalconWindow.DetachDrawingObjectFromWindow(rect);

             rect.OnDrag(new HDrawingObject.HDrawingObjectCallbackClass((id, window, type) =>
             {
                 var hv_type = id.GetDrawingObjectParams("type");
                 var row1 = id.GetDrawingObjectParams("row1");
                 var row2 = id.GetDrawingObjectParams("row2");
                 var column1 = id.GetDrawingObjectParams("column1");
                 var column2 = id.GetDrawingObjectParams("column2");
                 //打印坐标
                 NLogHelper.Debug($"拖动事件: {hv_type}:{row1} {column1} {row2} {column2} ");
             }));

现在的方法:

using HalconDotNet;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace HalconExtension.Models
{
    /// <summary>
    /// 矩形封装
    /// </summary>
    public class HRectangleObj
    {
        public HTuple HType { get; private set; }
        public HTuple Row1 { get; private set; }
        public HTuple Row2 { get; private set; }
        public HTuple Column1 { get; private set; }
        public HTuple Column2 { get; private set; }
        public HDrawingObject DrawingObject { get; set; }
        /// <summary>
        /// HS组件主题
        /// </summary>
        public HSmartWindowControlWPF WindowControlWPF { get; set; }


        public Action<HRectangleObj> RefleshCallBack { get; set; }

        /// <summary>
        /// 初始化构造函数
        /// </summary>
        /// <param name="windowControlWPF"></param>
        /// <param name="row1"></param>
        /// <param name="column1"></param>
        /// <param name="row2"></param>
        /// <param name="column2"></param>
        public HRectangleObj(HSmartWindowControlWPF windowControlWPF,HTuple row1,HTuple column1,HTuple row2,HTuple column2)
        {
            WindowControlWPF = windowControlWPF;
            Row1 = row1;
            Column1 = column1;
            Row2 = row2;
            Column2 = column2;
            DrawingObject = HDrawingObject.CreateDrawingObject(HDrawingObject.HDrawingObjectType.RECTANGLE1,Row1,Column1,Row2,Column2);
        }

        /// <summary>
        /// 默认构造函数
        /// </summary>
        /// <param name="windowControl"></param>
        public HRectangleObj(HSmartWindowControlWPF windowControl)
        {
            WindowControlWPF = windowControl;
            Row1 = 0;
            Column1 = 0;
            Row2 = 100;
            Column2 = 100;
            DrawingObject = HDrawingObject.CreateDrawingObject(HDrawingObject.HDrawingObjectType.RECTANGLE1, Row1, Column1, Row2, Column2);
            
            //添加更新事件
            DrawingObject.OnDrag(Reflash);
            DrawingObject.OnResize(Reflash);
        }


        /// <summary>
        /// 显示图像
        /// </summary>
        public void Show()
        {
            WindowControlWPF.HalconWindow.AttachDrawingObjectToWindow(DrawingObject);
        }


        /// <summary>
        /// 分离图像
        /// </summary>
        public void Close()
        {
            WindowControlWPF.HalconWindow.DetachDrawingObjectFromWindow(DrawingObject);
        }

        /// <summary>
        /// 序列化输出
        /// </summary>
        /// <returns></returns>
        public override string ToString()
        {

            return JsonConvert.SerializeObject(new
            {
                type = HType.ToString(),
                row1 = TwoDecimalPlaces(Row1),
                column1 = TwoDecimalPlaces(Column1),
                row2 = TwoDecimalPlaces(Row2),
                column2 = TwoDecimalPlaces(Column2)
            });
        }

        public void Reflash(HDrawingObject drawid, HWindow window, string type)
        {
            HType = drawid.GetDrawingObjectParams("type");
            Row1 = drawid.GetDrawingObjectParams("row1");
            Row2 = drawid.GetDrawingObjectParams("row2");
            Column1 = drawid.GetDrawingObjectParams("column1");
            Column2 = drawid.GetDrawingObjectParams("column2");

            //将本身回调
            RefleshCallBack(this);
        }

        /// <summary>
        /// 保留两位小数
        /// </summary>
        /// <returns></returns>
        private string TwoDecimalPlaces(HTuple value)
        {
            return decimal.Round(decimal.Parse(value.ToString()), 2).ToString();
        }

    }
}

运行代码

            InitRectangleBtn = new RelayCommand(() =>
            {
                MsgHelper.Info("生成矩形");
                //rect = HDrawingObject.CreateDrawingObject(HDrawingObject.HDrawingObjectType.RECTANGLE1, 100, 200, 300, 400);


                 显示绘制图案
                //HalconWindow.HalconWindow.AttachDrawingObjectToWindow(rect);
                 去除绘制图案
                HalconWindow.HalconWindow.DetachDrawingObjectFromWindow(rect);

                //rect.OnDrag(new HDrawingObject.HDrawingObjectCallbackClass((id, window, type) =>
                //{
                //    var hv_type = id.GetDrawingObjectParams("type");
                //    var row1 = id.GetDrawingObjectParams("row1");
                //    var row2 = id.GetDrawingObjectParams("row2");
                //    var column1 = id.GetDrawingObjectParams("column1");
                //    var column2 = id.GetDrawingObjectParams("column2");
                //    //打印坐标
                //    NLogHelper.Debug($"拖动事件: {hv_type}:{row1} {column1} {row2} {column2} ");
                //}));
                //初始化对象
                RectangleObj = new HRectangleObj(HalconWindow);
                //刷新回调里面进行打印
                RectangleObj.RefleshCallBack = (obj) =>
                {
                    NLogHelper.Debug(obj.ToString());
                };
                //显示对象
                RectangleObj.Show();
            });

运行结果:

在这里插入图片描述

对矩形进行抽象封装

抽象就是abstract,简单来说就是认为所有的基类都有相同的函数,比如ToString,Show,Close等。抽象更利于我们的代码的规划。

其实很多语法是程序自己给自己加限制,就是强迫自己按照某个逻辑进行代码开发。典型的例子就是JS转TS。这里不展开说明

抽象基类

using HalconDotNet;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace HalconExtension.Models
{
    public abstract class HObjBase
    {
        /// <summary>
        /// HS组件主题
        /// </summary>
        public HSmartWindowControlWPF WindowControlWPF { get; set; }



        public HDrawingObject DrawingObject { get; set; }

        public HTuple HType { get; private set; }
        public HObjBase(HSmartWindowControlWPF windowControlWPF)
        {
            WindowControlWPF = windowControlWPF;

        }

        /// <summary>
        /// 显示图像
        /// </summary>
        public void Show()
        {
            WindowControlWPF.HalconWindow.AttachDrawingObjectToWindow(DrawingObject);
        }


        /// <summary>
        /// 分离图像
        /// </summary>
        public void Close()
        {
            WindowControlWPF.HalconWindow.DetachDrawingObjectFromWindow(DrawingObject);
        }

        /// <summary>
        /// 保留两位小数
        /// </summary>
        /// <returns></returns>
        public string TwoDecimalPlaces(HTuple value)
        {
            return decimal.Round(decimal.Parse(value.ToString()), 2).ToString();
        }

        /// <summary>
        /// 序列化
        /// </summary>
        /// <returns></returns>
        public abstract override string ToString();

        /// <summary>
        /// 刷新事件
        /// </summary>
        public abstract void Reflash(HDrawingObject drawid, HWindow window, string type);
    }
}

矩形抽象改造

using HalconDotNet;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace HalconExtension.Models
{
    /// <summary>
    /// 矩形封装
    /// </summary>
    public class HRectangleObj : HObjBase
    {
        public HTuple HType { get; private set; }
        public HTuple Row1 { get; private set; }
        public HTuple Row2 { get; private set; }
        public HTuple Column1 { get; private set; }
        public HTuple Column2 { get; private set; }

        /// <summary>
        /// 刷新回调
        /// </summary>
        public Action<HRectangleObj> RefleshCallBack { get; set; }

        /// <summary>
        /// 初始化构造函数
        /// </summary>
        /// <param name="windowControlWPF"></param>
        /// <param name="row1"></param>
        /// <param name="column1"></param>
        /// <param name="row2"></param>
        /// <param name="column2"></param>
        public HRectangleObj(HSmartWindowControlWPF windowControlWPF, HTuple row1, HTuple column1, HTuple row2, HTuple column2) : base(windowControlWPF)
        {
            //WindowControlWPF = windowControlWPF;
            Row1 = row1;
            Column1 = column1;
            Row2 = row2;
            Column2 = column2;
            DrawingObject = HDrawingObject.CreateDrawingObject(HDrawingObject.HDrawingObjectType.RECTANGLE1, Row1, Column1, Row2, Column2);

			//添加更新事件
            DrawingObject.OnDrag(Reflash);
            DrawingObject.OnResize(Reflash);
        }

        /// <summary>
        /// 默认构造函数
        /// </summary>
        /// <param name="windowControl"></param>
        public HRectangleObj(HSmartWindowControlWPF windowControl) : base(windowControl)
        {

            Row1 = 0;
            Column1 = 0;
            Row2 = 100;
            Column2 = 100;
            DrawingObject = HDrawingObject.CreateDrawingObject(HDrawingObject.HDrawingObjectType.RECTANGLE1, Row1, Column1, Row2, Column2);

            //添加更新事件
            DrawingObject.OnDrag(Reflash);
            DrawingObject.OnResize(Reflash);
        }



        /// <summary>
        /// 序列化输出
        /// </summary>
        /// <returns></returns>
        public override string ToString()
        {

            return JsonConvert.SerializeObject(new
            {
                type = HType.ToString(),
                row1 = TwoDecimalPlaces(Row1),
                column1 = TwoDecimalPlaces(Column1),
                row2 = TwoDecimalPlaces(Row2),
                column2 = TwoDecimalPlaces(Column2)
            });
        }

        public override void Reflash(HDrawingObject drawid, HWindow window, string type)
        {
            HType = drawid.GetDrawingObjectParams("type");
            Row1 = drawid.GetDrawingObjectParams("row1");
            Row2 = drawid.GetDrawingObjectParams("row2");
            Column1 = drawid.GetDrawingObjectParams("column1");
            Column2 = drawid.GetDrawingObjectParams("column2");

            //将本身回调
            RefleshCallBack(this);
        }



    }
}

圆形抽象封装

如果集成抽象的对象只有一个,那么抽象就没有意义了。抽象一定是多个类继承才有使用的实际意义。

代码

using HalconDotNet;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Data.Common;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace HalconExtension.Models
{
    public class HCircleObj : HObjBase
    {
        public HTuple Row { get; set; }

        public HTuple Column { get; set; }

        public HTuple Radius { get; set; }

        public HTuple HType { get; private set; }

        /// <summary>
        /// 刷新回调
        /// </summary>
        public Action<HCircleObj> RefleshCallBack { get; set; }

        public HCircleObj(HSmartWindowControlWPF windowControlWPF, HTuple row, HTuple col, HTuple radius):base(windowControlWPF)
        {
            Row = row;
            Column = col;
            Radius = radius;

            DrawingObject = HDrawingObject.CreateDrawingObject(HDrawingObject.HDrawingObjectType.CIRCLE, Row, Column, Radius);

            //添加更新事件
            DrawingObject.OnDrag(Reflash);
            DrawingObject.OnResize(Reflash);
        }

        public HCircleObj(HSmartWindowControlWPF windowControlWPF) : this(windowControlWPF,64,64,64)
        {
        }

        public override void Reflash(HDrawingObject drawid, HWindow window, string type)
        {
            HType = drawid.GetDrawingObjectParams("type");
            Row = drawid.GetDrawingObjectParams("row");
            Column = drawid.GetDrawingObjectParams("column");
            Radius = drawid.GetDrawingObjectParams("radius");

            //将本身回调
            RefleshCallBack(this);
        }

        public override string ToString()
        {
            return JsonConvert.SerializeObject(new
            {
                type = HType.ToString(),
                row = TwoDecimalPlaces(Row),
                column = TwoDecimalPlaces(Column),
                radius = TwoDecimalPlaces(Radius),
            });
        }
    }
}

运行结果

HCircleObj(windowControlWPF, 64, 64, 64);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/280639.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2023 搞懂git 工作目录---暂存区---本地仓库---版本库

最近了解了下git的底层原理&#xff08;大神录制的视频放在最下方&#xff09;&#xff0c;记录下&#xff1a; 工作区 就是存放待提交文件的目录&#xff08;下图图解标注&#xff09;比如pyhon_test目录暂存区 .git目录下的index文件 对应的指令 git add本地仓库 .gi…

数据库的学习笔记——第一篇

SQL通用语法 SQL语句 DDL 数据定义 数据库、表字段 DML 数据操作 增删改 DQL 数据查询 查询表中记录 DCL 数据控制 创建用户、控制用户权限 DLL语句——数据库操作 SHOW DATABASES; # 查询数据库SELECT DATABASE(); # 查询当前数据库CREATE DATABASE [IF …

链表的一些典型问题

求链表的中间节点/倒数第K个节点 等类似的随机访问&#xff0c;可以考虑用快慢指针 例 求链表的中间节点 可以定义两个指针&#xff0c;一个一次走两步一个一次走一步&#xff0c;当走的快的走到NULL时&#xff0c;走的慢的就是链表的中间节点。&#xff08;此法求出的偶数个…

uni-app uni-app内置组件

锋哥原创的uni-app视频教程&#xff1a; 2023版uniapp从入门到上天视频教程(Java后端无废话版)&#xff0c;火爆更新中..._哔哩哔哩_bilibili2023版uniapp从入门到上天视频教程(Java后端无废话版)&#xff0c;火爆更新中...共计23条视频&#xff0c;包括&#xff1a;第1讲 uni…

Oracle OCP怎么样线上考试呢

大家好&#xff01;今天咱们就来聊聊Oracle OCP这个让人又爱又恨的认证。为啥说又爱又恨呢&#xff1f;因为它既是IT界的“金字招牌”&#xff0c;又是一块硬骨头&#xff0c;不是那么容易啃下来的。好了&#xff0c;废话不多说&#xff0c;我们直奔主题&#xff0c;来看看关于…

Android Studio下载gradle失败

1、打开Android Studio设置Gradle的地方&#xff0c;点击左上角的File->Settings查看gradle存放路径 C:\Users\Administrator.gradle\wrapper\dists\gradle-5.4.1-all\3221gyojl5jsh0helicew7rwx 2、找到正在下载的gradle版本&#xff0c;Android Studio取消下载gradle&…

Spark编程实验四:Spark Streaming编程

目录 一、目的与要求 二、实验内容 三、实验步骤 1、利用Spark Streaming对三种类型的基本数据源的数据进行处理 2、利用Spark Streaming对Kafka高级数据源的数据进行处理 3、完成DStream的两种有状态转换操作 4、把DStream的数据输出保存到文本文件或MySQL数据库中 四…

利用 IntelliJ IDEA 整合 GitHub 实现项目版本控制与协作管理

目录 前言1 设置GitHub登录账号2 将项目分享到GitHub3 IntelliJ IDEA 中导入Github项目4 往GitHub推送代码4.1 Commit Change&#xff08;提交到本地库&#xff09;4.2 Git -> Repository -> Push&#xff08;推送到远程库&#xff09; 5 拉取远程库代码到本地6 克隆远程…

CSS之元素转换

我想大家在写代码时有一个疑问&#xff0c;块级元素可以转换成其他元素吗&#xff1f; 让我为大家介绍一下元素转换 1.display:block(转换成块元素) display&#xff1a;block可以把我们的行内元素或者行内块元素转换成块元素 接下来让我为大家演示一下&#xff1a; <!DO…

sklearn 中matplotlib编制图表

代码 # 导入pandas库&#xff0c;并为其设置别名pd import pandas as pd import matplotlib.pyplot as plt# 使用pandas的read_csv函数读取名为iris.csv的文件&#xff0c;将数据存储在iris_data变量中 iris_data pd.read_csv(data/iris.txt,sep\t)# 使用groupby方法按照&quo…

gitlab 11.11.8的备份与恢复及500错误的修复

gitlab已经集成了非常方便的备份和恢复命令&#xff0c;只要我们执行这些命令就能完成gitlab的备份与恢复了。 我想gitlab备份与恢复的目的无非就是将已经运行了很久的旧的gitlab服务&#xff0c;迁移到新的服务器上。如果你旧的gitlab上项目很少&#xff0c;就需要考虑迁移服…

Spring知识02

1、这边是做单元测试的 2、项目部署上线的时候需要把Test那里注解掉 3、pom.xml的坐标系&#xff0c;用来导出包给别人用 4、项目名称&#xff0c;artifactId&#xff0c;name属性名保持一致 5、maven中央仓库那里可以看到导包之后会随着附加的内容 6、class.getSingleName获取…

初识javaWeb

一、JavaWeb是什么&#xff1f; 1、概念 javaWeb指的是使用java语言进行互联网领域项目开发的技术栈——进行web项目开发所需的技术的集合。 -Web前端——在浏览器中用户可以看到的网页 -Web后端——为前端提供数据的程序 2、Web项目 java语言是可以进行多种类型的项目开发&a…

Matplotlib_布局格式定方圆

文章目录 一、子图1.使用 plt.subplots 绘制均匀状态下的子图2.使用 GridSpec 绘制非均匀子图 二、子图上的方法 一、子图 1.使用 plt.subplots 绘制均匀状态下的子图 返回元素分别是画布和子图构成的列表&#xff0c;第一个数字为行&#xff0c;第二个为列 figsize 参数可以…

ESP32入门六(读取引脚的模拟信号[3]:信号出现误差的原因[硬件篇])

在之前的文章中&#xff0c;我们介绍了ESP32在读取模拟信号时出现的误差的软件方面原因&#xff0c;在这一篇中&#xff0c;将会介绍并测试由于硬件或其它方面导致数据出现误差的原因。 一、厂商原因 首先&#xff0c;我们需要知道&#xff0c;在每块EPS32中&#xff0c;在出…

LeetCode二叉树路径和专题:最大路径和与路径总和计数的策略

目录 437. 路径总和 III 深度优先遍历 前缀和优化 124. 二叉树中的最大路径和 437. 路径总和 III 给定一个二叉树的根节点 root &#xff0c;和一个整数 targetSum &#xff0c;求该二叉树里节点值之和等于 targetSum 的 路径 的数目。 路径 不需要从根节点开始&#xf…

2023年03月18日_微软office365 copilot相关介绍

文章目录 Copilot In WordCopilot In PowerpointCopilot In ExcelCopilot In OutlookCopilot In TeamsBusiness Chat1 - copilot in word2 - copilot in excel3 - copilot in powerpoint4 - copilot in outlook5 - copilot in teams6 - business chat word 1、起草草稿 2、自动…

2023年03月17日_微软和谷歌办公AI的感慨

2023年3月17日 最近这个科技圈的消息 有点爆炸的让人应接不暇了 各种大公司简直就是神仙打架 你从来没有见过这么密集的 这么高频的产品发布 昨天微软是发布了Office 365 Copilot 在里边提供了大量的AI的功能 然后谷歌呢也发布了这个Google Workspace AI 也是跟365 Cop…

深入浅出理解TensorFlow的padding填充算法

一、参考资料 notes_on_padding_2 二、TensorFlow的padding算法 本文以TensorFlow v2.14.0版本为例&#xff0c;介绍TensorFlow的padding算法。 1. 引言 tf.nn.conv2d and tf.nn.max_pool2d 函数都有padding参数&#xff0c;在执行函数之前&#xff0c;都需要进行填充padd…

uniapp中uview组件库的丰富Upload 上传上午用法

目录 基础用法 #上传视频 #文件预览 #隐藏上传按钮 #限制上传数量 #自定义上传样式 API #Props #Methods #Slot #Events 基础用法 可以通过设置fileList参数(数组&#xff0c;元素为对象)&#xff0c;显示预置的图片。其中元素的url属性为图片路径 <template>…