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

目录

  • 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");

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

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

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

相关文章

Java新提案,最终还是靠近C#了

Java是一门非常优秀的编程语言&#xff0c;特别是生态繁荣&#xff0c;成熟的轮子很多&#xff0c;各种解决方案都有&#xff0c;要开发一个项目&#xff0c;只需把轮子组装&#xff0c;并根据自己的项目&#xff0c;进行自定义修改&#xff0c;可以极大地提升开发效率。 曾经…

【算法】【算法杂谈】判断点是否在三角形内部(面积法和向量法)

目录 前言问题介绍解决方案代码编写java语言版本c语言版本c语言版本 思考感悟写在最后 前言 当前所有算法都使用测试用例运行过&#xff0c;但是不保证100%的测试用例&#xff0c;如果存在问题务必联系批评指正~ 在此感谢左大神让我对算法有了新的感悟认识&#xff01; 问题介…

react-antd-procomponents组件库 ProTable表格实现跨页多选。

table表格多选时所需要的api 1.onSelect - 单行选择(用户手动选择/取消选择某行的回调) 2.onSelectMultiple - 多行选择&#xff08;用户使用键盘 shift 选择多行的回调&#xff09; 3.onSelectAll - 全选全不选(用户手动选择/取消选择所有行的回调) 4.onChange - 每次选择行都…

Page管理机制

Page页分类 Buffer Pool 的底层采用链表数据结构管理Page。在InnoDB访问表记录和索引时会在Page页中缓存&#xff0c;以后使用可以减少磁盘IO操作&#xff0c;提升效率 Page根据状态可以分为三种类型&#xff1a; - free page &#xff1a; 空闲page&#xff0c;未被使用 - …

耐腐蚀高速电动针阀在半导体硅片清洗机化学药液流量控制中的应用

摘要&#xff1a;化学药液流量的精密控制是半导体湿法清洗工艺中的一项关键技术&#xff0c;流量控制要求所用调节针阀一是开度电动可调、二是具有不同的口径型号、三是高的响应速度&#xff0c;四是具有很好的耐腐蚀性&#xff0c;这些都是目前提升半导体清洗设备性能需要解决…

2023/4/25总结

刷题&#xff1a; 第一周任务 - Virtual Judge (vjudge.net) 1.这一题的思路就是先排除前面和后面相等的&#xff0c;然后找到不等的情况&#xff0c;不等情况的下标开始前后都走&#xff0c;看看是不是和b数组构成了一个升序数组即可。 #include<stdio.h> #define Ma…

【数据结构】链表详解

本片要分享的内容是链表&#xff0c;为方便阅读以下为本片目录 目录 1.顺序表的问题及思考 1.链表的遍历 2.头部插入 2.1开辟空间函数分装 3.尾部插入 纠正 4.尾部删除 5.头部删除 6.数据查找 7.任意位置插入 1.顺序表的问题及思考 上一篇中讲解了顺序表中增删查…

从源码全面解析LinkedBlockingQueue的来龙去脉

一、引言 并发编程在互联网技术使用如此广泛&#xff0c;几乎所有的后端技术面试官都要在并发编程的使用和原理方面对小伙伴们进行 360 的刁难。 二、使用 对于阻塞队列&#xff0c;想必大家应该都不陌生&#xff0c;我们这里简单的介绍一下&#xff0c;对于 Java 里面的阻塞…

Python | 基于LendingClub数据的分类预测研究Part01——问题重述+特征选择+算法对比

欢迎交流学习~~ 专栏&#xff1a; 机器学习&深度学习 本文利用Python对数据集进行数据分析&#xff0c;并用多种机器学习算法进行分类预测。 具体文章和数据集可以见我所发布的资源&#xff1a;发布的资源 Python | 基于LendingClub数据的分类预测研究Part01——问题重述特…

在.NET Core中正确使用HttpClient的方式

HttpClient 是 .NET Framework、.NET Core 或 .NET 5以上版本中的一个类&#xff0c;用于向 Web API 发送 HTTP 请求并接收响应。它提供了一些简单易用的方法&#xff0c;如 GET、POST、PUT 和 DELETE&#xff0c;可以很容易地构造和发送 HTTP 请求&#xff0c;并处理响应数据。…

【Excel统计分析插件】上海道宁为您提供统计分析、数据可视化和建模软件——Analyse-it

Analyse-it是Microsoft Excel中的 统计分析插件 它为Microsoft Excel带来了 易于使用的统计软件 Analyse-it在软件中 引入了一些新的创新统计分析 Analyse-it与 许多Excel加载项开发人员不同 使用完善的软件开发和QA实践 包括单元/集成/系统测试 敏捷开发、代码审查 …

虹科案例|虹科Micronor光纤传感器,实现核磁共振新应用!

PART 1 背景介绍 光纤传感器已成为推动MRI最新功能套件升级和新MRI设备设计背后的关键技术。将患者的某些活动与MRI成像系统同步是越来越受重视的需求。磁场强度随着每一代的发展而增大&#xff0c;因此&#xff0c;组件的电磁透明度在每一代和新应用中变得更加重要。 光学传…

《Netty》从零开始学netty源码(四十六)之PooledByteBuf

PooledByteBuf Netty中一大块内存块PoolChunk默认大小为4MB&#xff0c;为了尽可能充分利用内存会将它切成很多块PooledByteBuf&#xff0c;PooledByteBuf的类关系图如下&#xff1a; PooledUnsafeDirectByteBuf与PooledUnsafeHeapByteBuf直接暴露对象的底层地址。 PooledByt…

【英语】100个句子记完7000个托福单词

其实主要的7000词其实是在主题归纳里面&#xff0c;不过过一遍100个句子也挺好的&#xff0c;反正也不多。 文章目录 Sentence 01Sentence 02Sentence 03Sentence 04Sentence 05Sentence 06Sentence 07Sentence 08Sentence 09Sentence 10Sentence 11Sentence 12Sentence 13Sent…

数据分析中常见标准的参考文献

做数据分析过程中&#xff0c;有些分析法方法的标准随便一搜就能找到&#xff0c;不管是口口相传还是默认&#xff0c;大家都按那样的标准做了。日常分析不细究出处还可以&#xff0c;但是正式的学术论文你需要为你写下的每一句话负责&#xff0c;每一个判断标准都应该有参考文…

Docker | 解决docker 容器中csv文件乱码的情况

问题描述&#xff1a;在Ubuntu docker容器中&#xff0c;打开.csv文件时显示乱码 问题如图 错误分析&#xff1a; 用locale查看所用容器支持的字符集 从输出可以看到&#xff0c;系统使用的是POSIX字符集&#xff0c;POSIX字符集是不支持中韩文的&#xff0c;而UTF-8是支持中…

刷题4.28

1、 开闭原则软件实体&#xff08;模块&#xff0c;类&#xff0c;方法等&#xff09;应该对扩展开放&#xff0c;对修改关闭&#xff0c;即在设计一个软件系统模块&#xff08;类&#xff0c;方法&#xff09;的时候&#xff0c;应该可以在不修改原有的模块&#xff08;修改关…

vue之--使用TypeScript

搭配 TypeScript 使用 Vue​ 像 TypeScript 这样的类型系统可以在编译时通过静态分析检测出很多常见错误。这减少了生产环境中的运行时错误&#xff0c;也让我们在重构大型项目的时候更有信心。通过 IDE 中基于类型的自动补全&#xff0c;TypeScript 还改善了开发体验和效率。…

【Android Framework (八) 】- Service

文章目录 知识回顾启动第一个流程initZygote的流程system_serverServiceManagerBinderLauncher的启动AMS 前言源码分析1.startService2.bindService 拓展知识1:Service的两种启动方式对Service生命周期有什么影响&#xff1f;2:Service的启动流程3:Service的onStartCommand返回…

nginx(七十二)nginx中与cookie相关的细节探讨

背景知识铺垫 一 nginx中与cookie相关 ① Cookie请求头内容回顾 cookie的形式和属性 ② nginx获取cookie值的两种方法 1) $http_cookie -->获取Cookie请求头"所有值"2) $COOKIE_flag -->获取Cookie请求头的"某个key"[1]、脱敏场景在日志中只…