【VM服务管家】VM4.2平台SDK_6.3 控件嵌入类

news2024/11/17 4:37:55

目录

  • 2.3.1 渲染控件:渲染控件上自定义图形的方法
  • 2.3.2 参数控件:参数配置控件绑定模块的方法
  • 2.3.3 控件颜色:控件颜色修改方法
  • 2.3.4 独立控件:二次开发单独显示Group的方法
  • 2.3.5 取流控件:实时取流控件的使用方法
  • 2.3.6 渲染控件:渲染控件绘制ROI的方法
  • 2.3.7 控件语言:控件设置为英文的方法
  • 2.3.8 控件报错:子窗口包含主界面控件及其它控件时报错的解决方法
  • 2.3.9 图像传入:给渲染控件传入图像的方法
  • 2.3.10 主界面控件:主界面控件添加参数修改记录并将记录保存至本地的方法
  • 2.3.11 渲染控件:渲染控件绘制十字方法

2.3.1 渲染控件:渲染控件上自定义图形的方法

描述
环境:VM4.2 + VS2013及以上
现象:VM4.2如何在渲染控件上自定义图形?
解答
VM4.2二次开发相比较VM4.0二次开发,渲染控件上自定义图形有一些更新,除了接口vmRenderControl.DrawShape(),新增加一个接口vmRenderControl.AddShape(),前者是立刻绘制,后者是在下次刷新渲染时自动绘制。所以在VM4.0二次开发回调函数中图像渲染并添加自定义图形时, DrawShape接口函数前需要添加延时,不然回调中的图像渲染还没更新,自定义的图形已经调用DrawShape函数,从而导致自定义图形不能很好的渲染在图像上。在VM4.2二次开发中使用AddShape接口就不要加延时,它会在图像渲染结束后再绘制自定义图形。
手动添加引用VMControls.WPF.dll、WindowsBase.dll,添加后,引用属性【复制本地】改为false;渲染控件需要先绑定图像,再调用渲染控件的AddShape绘图接口;支持直线、圆形、矩形、文本等图形元素绘制;绘制时机:流程运行结束,在流程结果回调函数中绘制。下面绘制了直线和文本,其它图形依次类推。

C#
//绘制直线
VMControls.WPF.LineEx line = new VMControls.WPF.LineEx(new System.Windows.Point(100, 100), new System.Windows.Point(600, 600), stroke: "#FF0000", strokeThickness: 10);
vmRenderControl1.AddShape(line);
//绘制文本
VMControls.WPF.TextEx text = new VMControls.WPF.TextEx("欢迎使用VM4.2二次开发!", new System.Windows.Point(1000, 1000), fontSize: 20, stroke: "#FF0000");
vmRenderControl1.AddShape(text);

问题根因
不熟悉如何绘制自定义图形。

2.3.2 参数控件:参数配置控件绑定模块的方法

描述
环境:VM4.2 + VS2013及以上
现象:如何给参数配置控件绑定指定模块?
解答

  1. 参数配置控件绑定模块方法(C#),示例代码如下。
C#

// 参数配置控件模块绑定
private void button3_Click(object sender, EventArgs e)
{
    try
    {
        //参数配置
        var blobTool = (VMControls.Interface.IVmModule)VmSolution.Instance["流程1.BLOB分析1"];
        //参数配置控件
        vmParamsConfigControl1.ModuleSource=blobTool;
        //参数配置控件带渲染
        vmParamsConfigWithRenderControl1.ModuleSource = blobTool;
    }
    catch (VmException ex)
    {
        MessageBox.Show(Convert.ToString(ex.errorCode, 16));
    }
}

2.参数配置控件绑定模块方法(C++),代码如下。

C++
//参数设置
void CMFCApplication5Dlg::OnBnClickedButton4()
{
	// TODO: 在此添加控件通知处理程序代码
	try
	{
		auto pObject = (CModuParamsBase*)(*m_pVmSol)[“流程1.圆查找1”];
		m_ParamsRender.SetParamsInfo(pObject, "");
	}
	catch (CVmException ex)
	{
		CString strTemp;
		strTemp.Format(_T("%d"), ex.GetErrorCode());
	}
}

3.绑定效果
在这里插入图片描述

问题根因
不熟悉控件的资源绑定方法。

2.3.3 控件颜色:控件颜色修改方法

描述
环境:VM4.2 + VS2013及以上
现象:如何修改控件颜色?
解答

  1. 修改控件背景色,示例代码(C#)如下。注意:渲染控件颜色修改的前提是渲染控件已经绘制到窗口中。
    当通过拖拉渲染控件到窗口中时,控件颜色修改只能写在窗口初始化之后,如Load事件中或按钮事件中;
    当通过动态定义渲染控件到窗口中时,控件颜色修改只能写在窗口Add渲染控件之后,如this.Controls.Add(vmRenderControl1)之后。
C#
private void button16_Click(object sender, EventArgs e)
{
    string str = "#DD22AA";//十六进制颜色码
    vmRenderControl1.SetBackground(str);
}

2.修改控件背景色,示例代码(C++)如下。

C++
//修改控件背景色
int CMFCApplication5Dlg::SetBackGroundColor()
{
	// TODO: 在此处添加实现代码.
	CString str("#DD22AA");//十六进制颜色码
	m_RenderCtr.SetBackground(str.GetBuffer());
	return 0;
}

3.修改效果
在这里插入图片描述

问题根因
不熟悉控件接口。

2.3.4 独立控件:二次开发单独显示Group的方法

描述
环境:VM4.2 + VS2013及以上
现象:如何单独显示Group(.gro后缀)文件?
解答

  1. 首先需要在界面上拖拽SingleModuleSetConfigControl控件,该控件专门用于显示Group。
    2.加载Group文件并绑定到该控件的ModuleSource属性,代码如下。
C#
private void button16_Click(object sender, EventArgs e)
{
    vmSingleModuleSetConfigControl1.ModuleSource = VmSolution.LoadIndependentGroup("D://Files//test.gro");
}

3.显示效果
在这里插入图片描述

问题根因
不熟悉控件的资源绑定方法。

2.3.5 取流控件:实时取流控件的使用方法

描述
环境:VM4.2 + VS2013及以上
现象:VM4.2新增了一个控件,实时取流控件。
解答
1.在工具箱添加控件后,就可以拖拽实时取流控件VmRealTimeAcqControl到窗体中进行使用。
2.拖拉控件后,还需要将全局相机与控件进行绑定,代码如下所示:

C#
GlobalCameraModuleCs.GlobalCameraModuleTool cameraModu=(GlobalCameraModuleCs.GlobalCameraModuleTool)VmSolution.Instance["全局相机1"];
vmRealTimeAcqControl1.ModuleSource = cameraModu;
vmRealTimeAcqControl1.StartGrabbing();//开始采集
vmRealTimeAcqControl1.Stop Grabbing();//停止采集

问题根因
不熟悉实时取流控件的使用。

2.3.6 渲染控件:渲染控件绘制ROI的方法

描述
环境:VM4.2.0 + VS2013及以上
现象:VM二次开发,如何在渲染控件上绘制ROI,以实现界面快速建模、调整模块ROI?
解答
安装20220914及后续补丁包,注册GAC后,在二次开发软件中注册ROI绘制事件。示例代码如下:

C#
using VMControls.RenderInterface;
using VMControls.Interface;
using VMControls.Winform.Release;

// 注册ROI绘制事件
vmRenderControl1.IsShowCustomROIMenu = true;
vmRenderControl1.OnCustomRoiAddEvent -= VmRenderControl1_OnCustomRoiAddEvent;
vmRenderControl1.OnCustomRoiAddEvent += VmRenderControl1_OnCustomRoiAddEvent;

// ROI绘制事件
private void VmRenderControl1_OnCustomRoiAddEvent(object sender, VMControls.RenderInterface.RoiEventArgs e)
{
	roi = e.Roi;
	roi.DataChangedCommand = new DelegateCommand<IROI>(OnDataChangedCommandExcute);
    if (roi is IRectROI rect)  // 绘制的ROI为矩形
	{
	// Avoid表示ROI类型为屏蔽区
	if (!(rect.UseType == ROIUseType.Avoid)) { // To Do Code }
	// To Do Code 例如设置模块ROI、例如模板匹配建模等
	}
}

// ROI修改事件
private void OnDataChangedCommandExcute(IROI obj)
{
	if (roi is IRectROI rect)  // 绘制的ROI为矩形
	{ 
	if (!(rect.UseType == ROIUseType.Avoid)) //屏蔽区
	{ // To Do Code }
	// To Do Code 例如设置模块ROI、例如模板匹配建模等
	}
}

问题根因
不熟悉渲染控件的相关事件。

2.3.7 控件语言:控件设置为英文的方法

描述
环境:VM4.2+VS2013及以上
现象:如何设置控件为英文?
解答
在VM4.0的二次开发中,控件设置为英文的相关配置文件在debug路径中LangCFG文件中,修改配置文件LanguageSet.cfg。在VM4.2的二次开发中,因为debug中没有进行拷贝操作,所以修改配置文件路径如下图所示,zh-cn表示中文,英文则用en-us。
在这里插入图片描述

上图中是手动打开配置文件直接进行修改,也可以通过代码来修改配置文件:

C#
///修改对应cfg文件内容,切换中文
string path2 =Path+ "Development\\V4.x\\ComControls\\Assembly\\LangCFG\\LanguageSet.cfg";
string[] filelines = File.ReadAllLines(path2);
filelines[2] = "  <LangSet>zh-cn</LangSet>";
File.WriteAllLines(path2, filelines);

///修改对应文件内容,切换英文
string path2 =Path+ "Development\\V4.x\\ComControls\\Assembly\\LangCFG\\LanguageSet.cfg";
string[] filelines = File.ReadAllLines(path2);
filelines[2] = "  <LangSet>en-us</LangSet>";
File.WriteAllLines(path2, filelines);

注意:切换后VM二次开发需要重新启动才会生效
问题根因
不熟悉如何修改VM4.2二次开发控件的语言

2.3.8 控件报错:子窗口包含主界面控件及其它控件时报错的解决方法

描述
环境:VM4.0及以上 + VS2013及以上
现象:子窗口包含主界面控件(VmMainViewConfigControl)及其它控件时,打开子窗口报错如下所示。
在这里插入图片描述

解答
将子窗口中的VM控件的属性【TopStop】都改为false即可。
在这里插入图片描述

问题根因
主界面控件机制问题,VM4.3将会改善。

2.3.9 图像传入:给渲染控件传入图像的方法

描述
环境:VM4.0及以上 + VS2013及以上
现象:VM二次开发如何将在渲染控件上显示本地图像?
解答
1.可以通过模块的方式,再将渲染控件绑定模块或流程来显示本地图像,也可以通过VmRnderControl控件的ImageSource属性来设置图像。
2.首先需要继承IImaageData接口实现图像数据类。示例代码如下:

C#
public class ImageSource : VMControls.RenderInterface.IImageData
{
    public ImageSource(int width, int height, byte[] buffer, VMPixelFormat pixelformat)
    {
        Width = width;
        Height = height;
        PixelFormat = pixelformat == VMPixelFormat.VM_PIXEL_MONO_08 ? "Gray8" : "Rgb24";
        int channels = pixelformat == VMPixelFormat.VM_PIXEL_MONO_08 ? 1 : 3;
        if (buffer.Length != width * height * channels)
            throw new Exception("buffer is error");
        Buffer = new byte[buffer.Length];
        Array.Copy(buffer, Buffer, buffer.Length);
    }

    public int Width { get; set; }

    public int Height { get; set; }

    public byte[] Buffer { get; set; }

    public string MemoryAddress
    {
        get
        {
            GCHandle gCHandle = GCHandle.Alloc(Buffer, GCHandleType.WeakTrackResurrection);
            IntPtr bufferAddress = GCHandle.ToIntPtr(gCHandle);
            return bufferAddress.ToString();
        }
    }

    public string PixelFormat { get; }
}

3.使用OpenCV等接口获取本地图像数据流并转换成ImageSource类型显示,示例代码如下:

C#
private void button1_Click(object sender, EventArgs e)
{
    OpenFileDialog openFile = new OpenFileDialog();
    if (openFile.ShowDialog() == DialogResult.OK)
    {
        pictureBox1.Image = Image.FromFile(openFile.FileName);
        var mat = Cv2.ImRead(openFile.FileName);
        byte[] imageByte = new byte[mat.Width * mat.Height * mat.Channels()];
        ImageSource imageSource = null;
        if (mat.Channels() == 1)
        {
            imageSource = new ImageSource(mat.Width, mat.Height, imageByte, VMPixelFormat.VM_PIXEL_MONO_08);
        }
        else
        {
            //OpenCV为BGR VM 为RGB通道
            Cv2.CvtColor(mat,mat,ColorConversionCodes.BGR2RGB);
            Marshal.Copy(mat.Data, imageByte, 0, imageByte.Length);
            imageSource = new ImageSource(mat.Width, mat.Height, imageByte, VMPixelFormat.VM_PIXEL_RGB24_C3);
        }
        if(imageSource!=null)
        vmRenderControl1.ImageSource = imageSource;
   }
}

注意事项:灰度图读取到的如果是三通道需先转成单通道图像,彩色图需要交换下R和G通道,即用Cv2.CvtColor转换一下。
问题根因
不熟ImageSource属性及接口。

2.3.10 主界面控件:主界面控件添加参数修改记录并将记录保存至本地的方法

描述
环境:VM4.2 + VS2013及以上
现象:在VisionMaster软件里,修改模块参数值时,右下角的状态栏会显示修改记录并且记录至本地日志,而在VM二次开发里不会显示修改和记录日志。
在这里插入图片描述

解答
当前VM二次开发默认不支持,要支持需手动添加代码Apps.XmlParser.ParamTab.NameValueItem.logManager = new Apps.XmlUI.UILogManager(false);加载到程序初始化函数里。其中,添加引用集Apps.XmlParser.dll和Apps.XmlUI.dll在VM安装路径“VisionMaster4.2.0\Development\V4.x\ComControls\Assembly”下。
示例代码如下:

C# 
public Form1()
{
InitializeComponent();
Apps.XmlParser.ParamTab.NameValueItem.logManager = new Apps.XmlUI.UILogManager(false);
}

添加后,控件日志显示如下:
在这里插入图片描述

并且,在二次开发应用程序exe同级下的log/UI/SystemLog.log就会记录模块参数修改的日志。
注:若没有该log,请将VisionMaster路径“VisionMaster4.2.0\Development\V4.x
\ComControls\Assembly”下的第一个文件夹“3rdLib”拷贝替换至二次开发应用程序exe同级路径下。
问题根因
某些功能接口不对外开放,需手动添加。

2.3.11 渲染控件:渲染控件绘制十字方法

描述
环境:VM4.2 + VS2013及以上
现象:如何在vmRenderControl控件上显示十字线?
解答

  1. 使用控件AddShape()接口显示十字线(渲染控件渲染时机为流程执行结束回调,适合静态显示),示例代码如下;
C#

/// <summary>
/// 流程工作状态回调
/// </summary>
/// <param name="workStatusInfo"></param>
private void VmSolution_OnWorkStatusEvent(VM.PlatformSDKCS.ImvsSdkDefine.IMVS_MODULE_WORK_STAUS workStatusInfo)
{
    if (workStatusInfo.nWorkStatus == 0 && workStatusInfo.nProcessID == 10000)//流程空闲且为流程1
    {
        if (vmRenderControl1.ImageSource != null)
        {
            var width = vmRenderControl1.ImageSource.Width;
            var height = vmRenderControl1.ImageSource.Height;
            var lineY = new LineEx(new System.Windows.Point(width / 2, 0), new System.Windows.Point(width / 2, height), stroke: "#4400FF");
            var lineX = new LineEx(new System.Windows.Point(0, height / 2), new System.Windows.Point(width, height / 2), stroke: "#4400FF");
            renderControl.vmRenderControl1.AddShape(lineX);
            renderControl.vmRenderControl1.AddShape(lineY);
        }
    }
}
  1. 使用几何创建模块生成直线的方式创建十字线(推荐);
    在这里插入图片描述
    在这里插入图片描述

最终二次开发渲染控件显示效果如图所示:
在这里插入图片描述

问题根因
不熟悉渲染控件的使用。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【2023年第十一届泰迪杯数据挖掘挑战赛】B题:产品订单的数据分析与需求预测 23页论文及实现代码

【2023年第十一届泰迪杯数据挖掘挑战赛】B题&#xff1a;产品订单的数据分析与需求预测 23页论文及实现代码 相关链接 &#xff08;1&#xff09;建模方案 【2023年第十一届泰迪杯数据挖掘挑战赛】B题&#xff1a;产品订单的数据分析与需求预测 建模及python代码详解 问题一…

python为什么长期霸占榜首

Python霸占榜首 只因它真的很强 Python&#xff0c;年龄可能比很多读者都要大&#xff0c;但是它在更新快速的编程界却一直表现出色&#xff0c;甚至有人把它比作是编程界的《葵花宝典》&#xff0c;只是Python的速成之法相较《葵花宝典》有过之而无不及。 Python简洁&#x…

【Hello Network】UDP协议

作者&#xff1a;小萌新 专栏&#xff1a;网络 作者简介&#xff1a;大二学生 希望能和大家一起进步 本篇博客简介&#xff1a;简单介绍传输层和UDP协议 UDP协议 传输层端口号端口号范围划分知名端口号端口号与进程netstat与iostatpidof UDP协议UDP协议格式udp的数据封装udp的数…

2.2磁盘分区

2.2 磁盘分区 一个磁盘可以被划分为多个分区&#xff0c;有一个磁盘并且将他们划分为C;D;E盘&#xff0c;那个C,D,E就是分区&#xff08;partition&#xff09;。 2.2.1 磁盘连接的方式与设备文件名的关系 个人计算机常见的磁盘接口有两种&#xff0c;分别是SATA与SAS接口&…

精品:Stimulsoft Forms 2023.2.2

Stimulsoft Forms 是一种用于创建、编辑、填写、发布、分发交互式表单和收集结果的工具。我们的产品可嵌入到应用程序中&#xff0c;并允许您创建各种自定义填充模板。丰富的功能使模板具有真正的交互性。用户会收到 PDF 格式的可填写表格&#xff0c;他们可以在任何支持此格式…

ZooKeeper安装与配置集群

简介: ZooKeeper是一个分布式的&#xff0c;开放源码的分布式应用程序协调服务&#xff0c;是Google的Chubby一个开源的实现&#xff0c;是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件&#xff0c;提供的功能包括&#xff1a;配置维护、域名服务、分布…

ChatGPT初尝试——合并Excel表格【AI版】

ChatGPT真的能提升生产力吗&#xff1f;【AI版】 无意间的刷到的视频一、提需求二、ChatGPT用Python编写代码三、意外的解释四、ChatGPT改用Java编写代码五、GPT第二次生成Java代码尾巴 无意间的刷到的视频 晚上在家刷视频&#xff0c;突然看到一个在讲关于AI编程的视频&#…

网络安全:网络信息安全的概述.

网络安全&#xff1a;网络信息安全的概述 网络信息安全是一门涉及计算机科学&#xff0c;网络技术&#xff0c;通信技术、密码技术、信息安全技术、应用数学、数论、信息论等多种学科的综合性学科。 它主要是指网络系统的硬件、软件及其系统中的数据受到保护&#xff0c;不受…

深度学习 -- Pytorch学习 数据集API Dataset与DataLoader 重载鸢尾花数据集

前言 在模型训练的步骤中&#xff0c;数据的部分非常重要&#xff0c;它的过程主要分为数据收集、数据划分、数据读取、数据预处理。 数据收集的有原始样本和标签(Img&#xff0c;label) 数据集的划分需要分为训练集、验证集、测试集。 训练集负责训练模型&#xff0c;验证集…

C++基础知识快速入门

目录 一, 命名空间 1.1命名空间使用命名空间中成员该如何使用呢&#xff1f; 1.2 命名空间其他2种使用方式&#xff1a; 1. using 将其中一个成员引入 2. using namespace 二&#xff0c;C输入&输出 &#xff08;简单运用&#xff09; 2. 1 头文件 2. 2 cout 与 …

2023年软件测试常见面试题100%问必背全套教程

随着数字化时代的到来&#xff0c;软件测试越来越受到重视。在未来的几年里&#xff0c;软件测试将继续成为信息技术领域中的热门职业之一。如果你是一名正在寻找或准备进入软件测试行业的人&#xff0c;那么这套常见面试题全套教程对你来说会非常有用。 这套教程旨在帮助你了…

MySQL主从同步配置

Mysql 主从同步原理 就是基于数据库里面的那个 binlog 文件进行数据同步 具体步骤&#xff1a; step1&#xff1a;master将数据改变记录到二进制日志&#xff08;binary log&#xff09;中。step2&#xff1a; 当slave上执行 start slave 命令之后&#xff0c;slave会创建一个…

Unity 后处理(Post-Processing) -- (2)创建后处理配置文件

通过前面一小节&#xff0c;我们初步认识了后处理是什么&#xff0c;在Unity中简单的试了试后处理的效果。本节我们来创建一个我们自己的后处理配置文件&#xff08;post-processing profile&#xff09;。 一个后处理配置文件包含了一系列为了达到特定视觉效果的后处理效果的配…

C51 - DS18B20

Thermometer 1> 实验概述2> 硬件设计3> DS18B204> 单总线&#xff08;1-Wire&#xff09;通讯协议4.1> 复位时序4.2> 写-DS18B20时序4.3> 读-DS18B20时序4.4> 命令 5> 程序设计5.1> 编程思路5.2> 代码实现 6> 联调测试 1> 实验概述 实现…

Redis集合底层实现原理

目录 本章重点简单动态字符串SDS集合底层实现原理zipListlistPackskipListquickListKey 与Value中元素的数量 本章重点 掌握Redis简单动态字符串了解Redis集合底层实现原理 简单动态字符串SDS SDS简介 我们Redis中无论是key还是value其数据类型都是字符串.我们Redis中的字符…

从入门到精通:30天速成黑客教程到底有多狠?

首先我谈下对黑客&网络安全的认知&#xff0c;其实最重要的是兴趣热爱&#xff0c;不同于网络安全工程师&#xff0c;他们大都是培训机构培训出来的&#xff0c;具备的基本都是防御和白帽子技能&#xff0c;他们绝大多数的人看的是工资&#xff0c;他们是为了就业而学习&am…

ShardingSphere学习笔记

目录 1. 概述 1.1 分库分表是什么 1.2 分库分表方式 1.2.1 垂直分表 1.2.2 垂直分库 1.2.3 水平分库 1.2.4 水平分表 1.3 小结 1.3 分库分表带来的问题 1.3.1 事务一致性问题 1.3.2 跨节点关联查询 1.3.3 跨节点分页、排序函数 1.3.4 主键避重 1.3.5 公共表 2. …

JavaSE基础(二)—— 类型转换、运算符、键盘录入

目录 一、类型转换 1. 自动类型转换 1.1 自动类型转换的底层原理&#xff1a; ​1.2 自动类型转换的其他形式​编辑 2. 表达式的自动类型转换 3. 强制类型转换 3.1 强制类型转换底层原理​编辑 3.2 注意事项 二、运算符 1. 算数运算符 1.1 案例&#xff1a;数值拆分…

【群智能算法】一种改进的哈里斯鹰优化算法 IHHO算法[1]【Matlab代码#17】

文章目录 1. 原始HHO算法2. 改进的哈里斯鹰优化算法2.1 动态自适应逃逸能量E2.2 拉普拉斯交叉算子2.3 动态自适应权重 3. 部分代码展示4. 仿真图展示5. 资源获取 1. 原始HHO算法 详细介绍此处略&#xff0c;可参考HHO算法介绍 2. 改进的哈里斯鹰优化算法 2.1 动态自适应逃逸…

【算法】刷题中的位运算

作者&#xff1a;指针不指南吗 专栏&#xff1a;算法篇 &#x1f43e;人类做题的过程&#xff0c;其实是暴搜的过程&#x1f43e; 文章目录 1.位运算概述2.位运算符3.位运算应用3.1整数的奇偶性判断3.2有关 2 的幂的应用3.3lowbit(x)返回x的最后一位13.4二进制数中1的个数3.5求…