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

news2024/11/29 8:02:32

目录

  • 2.3.1 渲染结果:通过绑定流程或模块获取渲染结果的方法
  • 2.3.2 渲染控件:渲染控件加载本地图像的方法
  • 2.3.3 渲染控件:渲染控件上自定义图形的方法
  • 2.3.4 参数控件:参数配置控件绑定模块的方法
  • 2.3.5 控件颜色:控件颜色修改的方法
  • 2.3.6 VM嵌入:嵌入用户软件界面的方法
  • 2.3.7 参数控件:隐藏参数设置控件上某些参数的方法
  • 2.3.8 渲染控件:通过鼠标点击获取渲染控件像素坐标的方法
  • 2.3.9 控件显示:控件显示所加载的流程的方法
  • 2.3.10 前端界面控件:前端界面控件大小自适应的方法
  • 2.3.11 渲染控件:渲染控件存图的方法

2.3.1 渲染结果:通过绑定流程或模块获取渲染结果的方法

描述
环境:VM4.0.0 + VS2015及以上
现象:方案或流程运行执行之后,就可以获取结果,可以通过获取渲染结果和数据结果,渲染结果通过绑定渲染控件进行显示。
解答
渲染结果的显示可以通过渲染控件绑定流程或者模块,推荐使用绑定流程,符合高内聚低耦合的思想(绑定流程可以实现单个渲染控件绑定多个算法模块渲染结果)。详细介绍如下所示:
1 通过绑定流程显示渲染结果,一个渲染控件同时只能绑定一个流程,如需绑定多个流程,需要分时绑定,或使用多个渲染控件。
1.1 流程配置-显示设置
在这里插入图片描述

1.2 绑定流程

C#
VmProcedure VmProcess = (VmProcedure)VmSolution.Instance["流程1"];//实例化流程1
vmRenderControl.ModuleSource=VmProcess;

C++ MFC
IVmProcedure *vmprc = (IVmProcedure*)(*m_pVmSol)["流程1"];
m_ctrlRender.SetParamsInfo(vmprc ->GetControlInfo());

C++ Qt
IVmProcedure *vmprc = (IVmProcedure*)(*m_pVmSol)["流程1"];
ui.axWidget_Cam1->dynamicCall("SetParamsInfo(qlongqlong)",(qlonglong)(vmprc->GetControlInfo()));

2 通过绑定模块显示渲染结果,只能渲染某个模块的渲染结果。

C#
IMVSCircleFindModuCs.IMVSCircleFindModuTool circleTool=(IMVSCircleFindModuCs.IMVSCircleFindModuTool)VmSolution.Instance["流程1.圆查找1"];
vmRenderControl.ModuleSource= circleTool;

C++ MFC
IMVSCircleFindModuTool * pCirFindObject = (IMVSCircleFindModuTool *)(*m_pVmSol)["流程1.圆查找1"];
m_ctrlRender.SetParamsInfo(pCirFindObject ->GetControlInfo());

C++ Qt
IMVSCircleFindModuTool * pCirFindObject = (IMVSCircleFindModuTool *)(*m_pVmSol)["流程1.圆查找1"];
ui.axWidget_Cam1->dynamicCall("SetParamsInfo(qlongqlong)",(qlonglong)(pCirFindObject ->GetControlInfo()));

3 环境配置没有问题,程序编译运行都没有报错的情况下,但渲染控件界面不显示渲染结果时,可以使用刷新接口。

C#
vmRenderControl1.UpdateVMResultShow();

问题根因
不熟悉如何获取渲染结果

2.3.2 渲染控件:渲染控件加载本地图像的方法

描述
环境:VM4.0.0 + VS2015及以上
现象:渲染控件如何显示本地图像?
解答
思路:在2.3.1中,可以通过绑定流程或者模块来显示图像和渲染效果。因此,第一步,可以使用在VM软件平台中给图像源模块添加本地图像,或者通过图像源模块的接口来获取本地图像(参考2.2.4);第二步,渲染控件绑定图像源模块或者绑定流程(流程中提前配置显示设置:订阅图像源模块)。示例代码如下:

C# 
//使用VM软件平台已经给图像源模块添加本地图像,再使用渲染控件绑定模块
ImageSourceModuleTool testImage = (ImageSourceModuleIool)VmSolution.Instance["流程1.图像源1"];
vmRenderControl.ModuleSource= testImage;

MFC
在这里插入图片描述

Qt
在这里插入图片描述

问题根因
不熟悉如何使用渲染控件显示本地图像

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

描述
环境:VM4.0.0 + VS2015及以上
现象:如何在渲染控件上绘图?
解答
引用VMControls.WPF.dll,手动添加这个dll后,属性的复制到本地改为false。创建所需shape的对象,给对象属性赋值。调用VMRenderConTrol.DrawShape()函数,在控件上画出想要的图形。注意:模块的渲染效果和自定义图形建议放在不同的线程里渲染,且如果连续运行如果自定义图形跟不上,渲染前要加个延时。示例代码如下:

C# 
Task.Run(()=>
{
	System.Threading.Thread.Sleep(50);
	This.BeginInvoke(new Action(()=>
	{
		//画线
		VMControls.WPF.LineEx line = new VMControls.WPF.LineEx();
		line.StartPointX = 10; 
		line.StartPointY = 10; 
		line.EndPointX = 1000; 
		line.EndPointY = 1000;
		line.Opacity = 1; 
		int nArgb = 0; 
		nArgb += 100 << 16;
		nArgb += 200 << 8; 
		nArgb += 150; 
		line.Color = nArgb;
		line.FillColor = nArgb; 
		line.StrokeThickness = 10;
		vmRenderControl.DrawShape(line);
		//画矩形
		VMControls.WPF.RectangleEx rect = new VMControls.WPF.RectangleEx();
		rect.CenterX = 1000;
		rect.CenterX = 1000;
		rect.Width = 500;
		rect.Height = 500;                           
		vmRenderControl1.DrawShape(rect);
		//画文本
		VMControls.WPF.TextEx text = new VMControls.WPF.TextEx();
		text.Content = "1111111111111111";
		text.FontSize = 30;
		text.PositionX = 500;
		text.PositionY = 500;
		text.Opacity = 2;
		text.Color = nArgb;
		text.FillColor = nArgb;
		text.StrokeThickness = 10;
		vmRenderControl1.DrawShape(text);
		//画圆
		VMControls.WPF.CircleEx circle = new VMControls.WPF.CircleEx();
		circle.CenterX = 2000;
		circle.CenterY = 2000;
		circle.Color = nArgb;
		circle.FillColor = nArgb;
		circle.MajorRadius = 50;//外半径和内半径不等时,则是椭圆
		circle.MinorRadius = 50;
		circle.Opacity = 2;
		circle.StrokeThickness = 3;
		vmRenderControl1.DrawShape(circle);
	}),null);
});
 
Qt
//矩形框颜色颜色
int nArgb = 0;
nArgb += 255 << 16;
nArgb += 0 << 8;
nArgb += 0;

RectangleEx rectangle = { 0 };
rectangle.CenterX = 550;
rectangle.CenterY = 550;
rectangle.Width = 250;
rectangle.Height = 200;
rectangle.Angle = 25;
rectangle.Opacity = 0.5;
rectangle.SkewAngle = 0;
rectangle.Color = nArgb;
rectangle.FillColor = nArgb;
rectangle.StrokeThickness = 3;
//绘制矩形
ui->axWidget_render->dynamicCall("SetRectangle(qlonglong)", reinterpret_cast(&rectangle));

问题根因
不熟悉如何使用渲染控件显示本地图像

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

描述
环境:VM4.0.0 + VS2015及以上
现象:参数控件如何设定参数?
解答
参数配置控件的使用需要绑定相应的参数
1)C#中

IMVSCircleFindModuTool circleFindModule = (IMVSCircleFindModuTool)VmSolution.Instance["流程1.圆查找1"];
//普通的参数配置控件
vmParamsConfigControl1.ParamsConfig = circleFindModule.Params;
//带渲染的参数配置控件
vmParamsConfigWithRenderControl1.ModuleSource = circleFindModule;
当不确定具体是哪一个模块时,使用IVmModule类,示例如下: 
IVmModule module = (VmModule)VmSolution.Instance[ "流程名.模块名"];
vmParamsConfigWithRenderControl1.ModuleSource = module;

2)MFC中

IMVSCircleFindModuTool * pCirFindObject = (IMVSCircleFindModuTool *)(*m_pVmSol)["流程1.圆查找1"];
if (NULL == pCirFindObject) return;
CircleFindParams * pCirFindParam = pCirFindObject->GetParamObj();
if (NULL == pCirFindParam) return;
CCircleFindDlg::GetExeFilePath();
m_ctrlParamRender.SetParamsInfo(pCirFindParam->GetControlInfo(), m_strFilePath.c_str());

3)Qt中

//获得指向圆查找模块的指针
IMVSCircleFindModuTool *circleFindMou=static_cast<IMVSCircleFindModuTool*>((*m_pVmSol)["流程1.圆查找1"]);

//获得圆查找模块的参数
ParamCtrlInput *param=reinterpret_cast<ParamCtrlInput*>(circleFindMou ->GetParamObj());
ParamBaseEx stParamData={0};
stParamData.Handle=param->Handle;
stParamData.ModuId=param->ModuId;
stParamData.TimeOut=0;

//绑定参数渲染控件
ui->axWidget_3->dynamicCall("SetParamsInfo(qlonglong)",reinterpret_cast<qlonglong>(&stParamData));

问题根因
不熟悉参数配置控件的使用

2.3.5 控件颜色:控件颜色修改的方法

描述
环境:VM4.0.0 + VS2015及以上
现象:简易修改VM控件的颜色?
解答
对二次开发中嵌入控件的颜色进行修改,具体代码如下:

C# 
string colorinfo = "ColorStyle3";
AppColorService.CurColorDefine = colorinfo;

“ColorStyle3”文件在VM安装路径的ColorStyle文件夹下面,其中内容如下图所示,客户可以自行编辑XAML文件,修改自己想要控件的颜色即可生效
在这里插入图片描述

默认控件颜色:
v

修改后控件颜色:
在这里插入图片描述

问题根因
不了解VM控件颜色可以改变。

2.3.6 VM嵌入:嵌入用户软件界面的方法

描述
环境:VM4.0.0 + VS2015及以上
现象:将VM整体嵌入到客户软件界面中?
解答
将VM软件整体嵌入到客户软件中,需要利用Panel控件,并且需要先启动VM软件,具体代码如下:

C# 
[DllImport("User32.dll", EntryPoint = "SetParent")]
public static extern int SetParent(IntPtr hWndChild, IntPtr hWndNewParent);

[DllImport("user32.dll", CharSet = CharSet.Auto)]
public static extern int MoveWindow(IntPtr hWnd, int x, int y, int nWidth, int nHeight, bool BRePaint);

// Start the process
  p = System.Diagnostics.Process.Start
(@"D: \VisionMaster4.0.0\Applications\VisionMaster.exe");
// Wait for process to be created and enter idle condition
  p.WaitForInputIdle();
// Get the main handle
appWin = p.MainWindowHandle;
//需要等待p启动,可自行判断,可加上Thread.Sleep(10000);            
SetParent(appWin, panel1.Handle);//this在这里是Panel控件
MoveWindow(appWin, 0, 0, this.panel1.Width, this.panel1.Height, true);

最终效果如下图所示,VM就整体嵌入到客户软件的Panel空间中,并且可以保持VM所具备的功能
在这里插入图片描述

问题根因
不了解Panel控件用法,如何嵌入第三方程序。

2.3.7 参数控件:隐藏参数设置控件上某些参数的方法

描述
环境:VM4.0.0 + VS2015及以上
现象:如何隐藏参数设置控件上的某些参数?
解答
可以通过修改VM配置文件,来决定参数设置控件上某些参数的隐藏与否。这里以隐藏圆查找模块的运行参数中的卡尺数量为例。步骤如下:

  1. 隐藏之前,绑定圆查找模块的参数控件上运行参数如下:
    在这里插入图片描述

  2. 在二次开发程序中找到圆查找模块的配置路径\VMTest\VMTest \bin\Debug\Module(sp)\x64\Location\IMVSCircleFindModu路径下找到IMVSCircleFindModuAlgorithmTab.xml配置文件,双击打开配置文件。
    在这里插入图片描述

  3. 找到运行参数中卡尺数量的位置处,找到属性Beginner,
    在这里插入图片描述

  4. 将Beginner修改为 False </CustomVisi ble>
    在这里插入图片描述

  5. 隐藏之后的绑定圆查找模块的参数控件的运行参数如下:
    在这里插入图片描述

同理:VM中隐藏模块的某些参数,同样是打开模块的xml文件,在VM安装路径中,VM4.0.0\VisionMaster4.0.0\Applications\Module(sp)\x64\Location\IMVS
CircleFindModu路径下找到IMVSCircleFindModuAlgorithmTab.xml配置文件
问题根因
不熟悉配置文件修改方式。

2.3.8 渲染控件:通过鼠标点击获取渲染控件像素坐标的方法

描述
环境:VM4.0.0 + VS2015及以上
现象:如何通过鼠标事件获取渲染控件上的图像坐标?
解答
通过鼠标事件获取渲染控件指定位置图像坐标,示例代码如下。

C#
// 注册鼠标点击事件
public OneWindowUserControl(MainWindow mainWindow)
{
    InitializeComponent();
    RenderImage1.OnMouseLeftButtonDownPixelChanged += RenderImage_OnMouseLeftButtonDownPixelChanged1;
}

// 获取锚点事件
private void RenderImage_OnMouseLeftButtonDownPixelChanged1(int x, int y)
{
    try
    {
        var pointX = x;
        var pointY = y;
        MessageBox.Show("锚点获取成功");
    }
    catch (Exception ex)
    {
        MessageBox.Show("获取锚点失败" + ex.ToString());
    }
}

问题根因
不熟悉控件事件。

2.3.9 控件显示:控件显示所加载的流程的方法

描述
环境:VM4.0 + VS2015及以上
问题:基于对话框的MFC程序,在主窗口放置了一个VmMainView控件,程序初始化时可以显示,但是加载方案完成时,不会显示已经加载的流程,如下图所示:
在这里插入图片描述

解答
使用了带有流程显示的控件,如VmMainView控件,需要在控件的初始化代码GetObjectPointer( )之前,调用一次CreateSolutionInstance( ),这样流程加载完成的时候,VmMainView控件就能显示加载的流程了。所以:关键代码如下:

CreateSolutionInstance();
mainViewControl.GetObjectPointer();

问题根因
CreateSolutionInstance( )需要在控件初始化时调用一次,用来提前绑定VmMainView控件关联的方案。

2.3.10 前端界面控件:前端界面控件大小自适应的方法

描述
环境:VM4.0 + VS2015及以上
现象:WinForm中使用前端界面控件,设置Anchor/Dock属性后控件内的元素不随界面放缩,如何实现前端界面大小自适应?
解答

  1. 首先需要在界面上拖拽vmFrontendControl控件(该控件专门用于显示VM方案的前端界面)并设置好Anchor/Dock属性。
    2.方案加载完成后加载前端界面资源,代码如下。
C#
private void button16_Click(object sender, EventArgs e)
{
    vmFrontendControl.LoadFrontendSource();
}

3.给控件添加大小变化事件,在前端控件大小改变时调用控件的AutoChangeSize接口。

C#
private void vmFrontendControl_SizeChanged(object sender, EventArgs e)
{
    vmFrontendControl.AutoChangeSize();
}

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

问题根因
不熟悉控件内容放缩接口的调用时机。

2.3.11 渲染控件:渲染控件存图的方法

描述
环境:VM4.0 + VS2015及以上
现象:常见的存图方法有输出图像模块以及渲染控件存图,渲染控件存图的方法如何实现?
解答
渲染控件存图代码如下所示,但推荐使用输出图像模块进行存图。因为渲染时机是在回调结束之后的,所以在回调函数中进行渲染控件存图,保存的图片会是未完成渲染的。在Run接口之后直接使用渲染控件存图也会是渲染控件上无图或者未渲染完成。在button事件中进行渲染控件存图,才能正常存图。

C#
vmRenderControl1.SaveOriginalImage("E:\\VSVM4.2\\VMTestB\\original.bmp");
vmRenderControl1.SaveRenderedImage("E:\\VSVM4.2\\VMTestB\\RenderImage.bmp");

问题根因
不熟悉渲染控件存图接口

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

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

相关文章

【AGC】质量服务数据分析问题

【关键字】 AGC、质量、数据分析 【问题描述】 开发者反馈在应用中集成了AGC的相关服务&#xff0c;在查看平台数据时遇到了一些问题。具体如下所述&#xff1a; 我发现平台的App卸载量每个月都非常高&#xff0c;卸载量/新下载量近80%&#xff0c;很异常&#xff0c;所以想…

【VM服务管家】VM4.x算子SDK开发_3.2 公用工具类

目录 3.2.1 图像载入&#xff1a;本地图像的载入方法3.2.2 相机取流&#xff1a;相机SDK取流的方法3.2.3 输入图像&#xff1a;给算子模块输入图像数据的方法3.2.4 实时取流&#xff1a;实时取流的实现方法3.2.5 卡尺ROI&#xff1a;卡尺型ROI的生成方法3.2.6 DL算子耗时&#…

【VM服务管家】VM4.2软件使用_5.3 环境配置类

目录 1.1.1 用户权限&#xff1a;普通用户权限使用VM的方法1.1.2 脚本环境&#xff1a;联合OpenCV开发的环境配置方法1.1.3 环境配置&#xff1a;规避流程运行时卡死的方法 1.1.1 用户权限&#xff1a;普通用户权限使用VM的方法 描述 环境&#xff1a;VM4.2 现象&#xff1a;生…

JPA实战

常见 ORM 框架 **Mybatis(ibatis)&#xff1a;**一款优秀的持久层框架&#xff0c;它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息&#xff0c;将接口和 …

【深圳】IBM V3500存储维修 更换控制器故障

冠峰科技-爱科技爱分享 今天给大家分享的是深圳.福田区一个电商客户公司一台IBM Storwize v3500存储控制器故障从远程诊断 收集日志 分析结果的实际案例&#xff0c;如图所示通过存储管理口登陆进去后直接看到少了一个控制器&#xff0c; 按照惯例&#xff0c;还是得登陆到服…

linux智能网关4G离散数据采集分析HDMI广告牌

数字城市的4G边缘计算网关是一种具有强大处理能力、智能控制和现场数据采集能力的计算设备。其主要特点包括以下方面&#xff1a; 系统平台&#xff1a;基于Linux或Debian系统&#xff0c;可灵活开发各种应用程序。IO接口&#xff1a;2DI、2DO数字输入输出接口&#xff0c;可以…

JAVASE的全面总结

&#xff08;未完待续&#xff09; 五、子类与继承 5.1 子类与父类 继承是一种由已有的类创建新类的机制。利用继承&#xff0c;我们可以先创建一个共有属性的一般类&#xff0c;根据该一般类再创建具有特殊属性的新类&#xff0c;新类继承一般类的状态和行为&#xff0c;并…

golang - switch

switch 的使用 switch 语句用于基于不同条件执行不同操作&#xff0c;&#xff0c;直每一个 case 分支都是唯一的&#xff0c;从上到下逐一测试到匹配为止匹配项后面也不需要再加 break switch 表达式 {case 表达式1, 表达式2, ... :语句块1case 表达式2, 表达式3, ... :语句块…

Linux LD链接器 -静、动库编译or链接

文章目录 程序链接动态链接静态链接 目标文件链接打包为动态打包为静态总结 动态链接- 动态链接&#xff1a;在运行、加载时&#xff0c;在内存中完成链接的过程- 动态共享库&#xff1a;用于动态链接的系统库、特性是可以加载无需重定位的代码 got表(Global Offset Table)延时…

SpringBoot核心配置全面总结

目录 1、application. properties核心文件 2、 application.yml配置文件&#xff08;推荐配置风格&#xff09; 3、SpringBoot多环境配置 4、SpringBoot自定义配置 1&#xff09;Value注解 2&#xff09; ConfigurationProperties 5. 远程配置中心&#xff08;目前生产…

http协议(一)/应用层

学习目标&#xff1a;⭐理解应用层的作用&#xff0c;理解协议&#xff0c;理解序列化和反序列化&#xff0c;并且实现网络版计算器⭐HTTP协议。⭐手写一个简单的http协议。 应用层 我们写的一个个解决实际问题, 满足我们日常需求的网络程序, 都是在应用层。 协议/序列化与反…

第三节:支持向量机分类预测

0、介绍 监督学习&#xff08;英语&#xff1a;Supervised learning&#xff09;是机器学习中最为常见、应用最为广泛的分支之一。本次实验将带你了解监督学习中运用十分广泛的支持向量机&#xff0c;并学会使用 scikit-learn 来构建预测模型&#xff0c;用于解决实际问题。 知…

都什么年代了,还在用Excel和ACCESS做应用系统?快来学Eversheet

表格用的越久&#xff0c;就越头疼 稍微有规模的企业&#xff0c;各种表格都会多如牛毛&#xff0c;一堆堆的&#xff0c;有时候这里一张&#xff0c;那里一张&#xff0c;容易整乱&#xff0c;更容易丢失。不管你是用WPS还是用Excel&#xff0c;有些问题你还是依旧解决不了。…

【VM服务管家】VM4.x算法模块开发_4.1 开发配置类

目录 4.1.1 算法开发&#xff1a;算法模块的开发流程4.1.2 参数操作&#xff1a;获取与设置模块参数的方法4.1.3 文件交互&#xff1a;文件交互操作的配置方法4.1.4 输出显示&#xff1a;设置输出并显示在VM界面的方法4.1.5 模板配置&#xff1a;模板配置界面的实现方法4.1.6 命…

中文译英文 模型

Helsinki-NLP/opus-mt-zh-en Hugging FaceWe’re on a journey to advance and democratize artificial intelligence through open source and open science.https://huggingface.co/Helsinki-NLP/opus-mt-zh-en?text%E6%88%91%E5%8F%AB%E6%B2%83%E5%B0%94%E5%A4%AB%E5%86%8…

【Java入门合集】第一章Java概述

【Java入门合集】第一章Java概述 博主&#xff1a;命运之光 专栏&#xff1a;JAVA入门 学习目标 1.理解JVM、JRE、JDK的概念&#xff1b; 2.掌握Java开发环境的搭建,环境变量的配置&#xff1b; 3.掌握Java程序的编写、编译和运行&#xff1b; 4.学会编写第一个Java程序&#x…

Python 科研绘图可视化(后处理)Matplotlib - RGBAxes

Introduction 科研可视化是将数据和信息转化为可视化形式的过程&#xff0c;旨在通过图形化展示数据和信息&#xff0c;使得科研工作者能够更好地理解和分析数据&#xff0c;并从中发现新的知识和洞见。科研可视化可以应用于各种领域&#xff0c;如生物学、物理学、计算机科学…

一文带你入门C++类和对象【十万字详解,一篇足够了】

本文字数较多&#xff0c;建议电脑端访问。不多废话&#xff0c;正文开始 文章目录 ———————————————【类和对象 筑基篇】 ———————————————一、前言二、面向过程与面向对象三、结构体与类1、C中结构体的变化2、C中结构体的具体使用3、结构体 --&…

3.6 Linux shell脚本编程(概念、变量、语句)

目录 shell脚本概述 shell脚本编写步骤 第一个shell脚本文件 shell脚本变量 变量的介绍 变量的作用 变量的命名要求 变量的分类 用户自定义变量 取值 用户自定义变量-数组 只读变量 位置变量与预定义变量 环境变量 shell语句 shell程序 说明性语句&#xff08…

MATLAB连续时间信号的实现和时域基本运算(八)

1、实验目的&#xff1a; 1&#xff09;熟悉常用连续时间信号的实现方法&#xff1b; 2&#xff09;掌握连续时间信号的时域基本运算&#xff1b; 3&#xff09;掌握实现基本函数及其运算的函数的使用方法&#xff1b; 4&#xff09;加深对信号基本运算的理解。 2、实验内容&am…