【VM服务管家】VM4.2平台SDK_6.4 结果获取类

news2024/11/17 3:39:15

目录

  • 2.4.1 数据结果:通过流程输出或者模块输出获取数据结果的方法
  • 2.4.2 流程回调:某个流程运行开始与结束的回调方法

2.4.1 数据结果:通过流程输出或者模块输出获取数据结果的方法

描述
环境:VM4.2 + VS2013及以上
现象:方案或流程运行执行之后,就可以获取结果(建议将结果获取写在回调函数里),可以通过流程或者模块的输出获取渲染结果和数据结果,推荐使用流程的输出,符合高内聚低耦合,渲染结果通过绑定渲染控件进行显示,数据结果分为整型、浮点型、字符串型和图像型等等,VM二次开发如何获取数据结果?
解答
数据结果的获取可以通过流程的输出或者模块的输出,推荐使用通过流程的输出,符合高内聚低耦合的思想,VM4.2二次开发相比较VM4.0二次开发获取数据结果有一些更新,详细介绍如下所示:
1 通过流程的输出获取数据结果
1.1 流程配置-输出设置
在这里插入图片描述

1.2 获取整型、浮点型、字符串型数据

C#
VmProcedure vmprocess = (VmProcedure)VmSolution.Instance["流程1"];
var moduResult = vmprocess.ModuResult;
string str = moduResult.GetOutputInt(“out”).pIntVal[0].ToString();                
string str1 = moduResult.GetOutputFloat(“out0”).pFloatVal[0].ToString();
string str2 = moduResult.GetOutputString("out1").astStringVal[0].strValue;
//获取流程结果列表,str3与str2结果一致
List<VmDynamicIODefine.IoNameInfo> ioNameInfos = VmProcess.ModuResult.GetAllOutputNameInfo();
string str3 = VmProcess.ModuResult.GetOutputString(ioNameInfos[2].Name).astStringVal[0].strValue;

1.3 获取图像数据
流程输出设置中输出IMAGE类型的图像数据,能通过前面参数名称ImageD直接获取。

C#
ImageBaseData_V2 processImageData = VmProcess1.ModuResult.GetOutputImageV2("ImageD");
int width = processImageData.Width;//宽
int height = processImageData.Height;//高
IntPtr imageByte = processImageData.ImageData;//数据
VMPixelFormat pixelformat = processImageData.Pixelformat;//格式

2 通过模块的输出获取数据结果 (与4.0二次开发相比无变化)
2.1 获取模块的浮点型数据

C#
IMVSCircleFindModuTool tool = (IMVSCircleFindModuTool)VmSolution.Instance["流程1.圆查找1"];
var moduResult = tool.ModuResult;
string circleX = moduResult.OutputCircle.CenterPoint.X.ToString();
string circleY = moduResult.OutputCircle.CenterPoint.Y.ToString();
string circleR = moduResult.OutputCircle.Radius.ToString();

2.2 获取图像数据,针对有图像输出的模块,例如,输出图像模块,注意像素格式17301505为MONO8灰度图,像素格式 35127316为RGB24彩色图。

C#
SaveImageTool saveImage=(SaveImageTool)VmSolution.Instance[“流程1.输出图像1”];
Var saveImageResult=saveIamge.ModuResult.OutputImage;
byte[] imageData= saveImageResult.ImageData;
int imagePixelformat= saveImageResult.Pixelformat;

问题根因
不熟悉如何获取数据结果。

2.4.2 流程回调:某个流程运行开始与结束的回调方法

描述
环境:VM4.2 + VS2013及以上
现象:除了所有流程运行结束的回调方法,如何注册某一流程开始与结束回调函数。
解答
1、C#中调用某个流程的开始与结束回调
加载sol文件后,根据流程名称注册流程开始和结束回调函数代码如下,其中textBoxProcessName.Text为流程名。

c#
try  
{  
    m_VmPrc = (VmProcedure)VmSolution.Instance[textBoxProcessName.Text];  
    if (null == m_VmPrc)  
    {  
        MessageBoxButtons msgType = MessageBoxButtons.OK;  
        DialogResult diagMsg = MessageBox.Show(textBoxProcessName.Text + " name procedure does't exist", "Prompt", msgType);  
        if (diagMsg == DialogResult.OK)  
        {  
            return;  
        }  
    }  
    m_VmPrc.OnWorkBeginStatusCallBack += M_VmPrc_OnWorkBeginStatusCallBack;  
    m_VmPrc.OnWorkEndStatusCallBack += M_VmPrc_OnWorkEndStatusCallBack;  
}  
catch (VmException ex)  
{  
    string strMsg = "Process failed. Error Code: " + Convert.ToString(ex.errorCode, 16);  
    listBoxMsg.Items.Add(strMsg);  
    listBoxMsg.TopIndex = listBoxMsg.Items.Count - 1;  
    return;  
}  

注消流程开始和结束回调函数代码如下。

try  
{  
    m_VmPrc = (VmProcedure)VmSolution.Instance[textBoxProcessName.Text];  
    if (null == m_VmPrc)  
    {  
        MessageBoxButtons msgType = MessageBoxButtons.OK;  
        DialogResult diagMsg = MessageBox.Show(textBoxProcessName.Text + " name procedure does't exist", "Prompt", msgType);  
        if (diagMsg == DialogResult.OK)  
        {  
            return;  
        }  
    }  
   m_VmPrc.OnWorkBeginStatusCallBack -= M_VmPrc_OnWorkBeginStatusCallBack;  
   m_VmPrc.OnWorkEndStatusCallBack -= M_VmPrc_OnWorkEndStatusCallBack;  
}  
catch (VmException ex)  
{  
    string strMsg = "Process failed. Error Code: " + Convert.ToString(ex.errorCode, 16);  
    listBoxMsg.Items.Add(strMsg);  
    listBoxMsg.TopIndex = listBoxMsg.Items.Count - 1;  
    return;  
} 

测试用回调函数如下。

private void M_VmPrc_OnWorkBeginStatusCallBack(object sender, EventArgs e)  
{  
    Console.WriteLine($"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")} 流程开始");  
    //获取此流程中的模块结果
} 
private void M_VmPrc_OnWorkEndStatusCallBack(object sender, EventArgs e)  
{  
    Console.WriteLine($"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")} 流程结束");  
}

单次运行流程 m_VmPrc.Run(),执行效果如下,说明首先执行的是M_VmPrc_OnWorkBeginStatusCallBack函数,然后执行的是M_VmPrc_OnWorkEndStatusCallBack函数;
2、C++ 中调用某个流程的开始与结束回调
注册回调,只需要创建一个流程事件类,这个流程事件类继承IVmProcedureEvent,代码如下所示:

class MyProcedureEvent :public  IVmProcedureEvent
{
public:
	virtual void  OnWorkBeginStatusCallBack(IN const IMVS_PF_MODULE_WORK_STAUS *const pstWorkStatus, IN void *const pUser) override;
	virtual void  OnWorkEndStatusCallBack(IN const IMVS_PF_MODULE_WORK_STAUS *const pstWorkStatus, IN void *const pUser) override;

};

然后用户程序在主窗口类中,创建一个MyProcedureEvent实例,如下:

MyProcedureEvent myProcedureEvent;
例如:我们要注册流程1的结果回调,只需要在流程1加载完成的地方插入代码,调用注册回调的接口,典型的代码如下:

IVmSolution* vmSolution = LoadSolution(solPath, "");
IVmProcedure* vmProcedure = (IVmProcedure*)((*vmSolution)["流程1"]);
vmProcedure->RegisterCallBackEvent((IVmProcedureEvent*)&myProcedureEvent,this);

剩下就是用户在MyProcedureEvent类中,实现OnWorkEndStatusCallBack方法即可,比如在OnWorkEndStatusCallBack中获取流程1的运行结果,代码如下:

vector matchX;
vector matchY;
vector matchR;

void MyProcedureEvent::OnWorkEndStatusCallBack(IN const IMVS_PF_MODULE_WORK_STAUS * const pstWorkStatus, IN void * const pUser)
{
	try
	{
		CMFCVM42DemoDlg* pDlg = (CMFCVM42DemoDlg*)pUser;
		ObjectList list = pDlg->m_pSolution->GetAllProcedureObjects();  //获取当前方案的所有流程
		IVmProcedure* procedure1 = (IVmProcedure*)(list.pObjects[0]);   //获取第一个流程
		//获取配置的matchX,matchY,matchR 输出
		FloatDataArray matchXArray = procedure1->GetResult()->GetOutputFloat("matchX");
		FloatDataArray matchYArray = procedure1->GetResult()->GetOutputFloat("matchY");
		FloatDataArray matchRArray = procedure1->GetResult()->GetOutputFloat("matchR");
		
		for (int i = 0; i < matchXArray.nValueNum; i++)
		{
			matchX.push_back(matchXArray.pFloatVal[i]);
			matchY.push_back(matchYArray.pFloatVal[i]);
			matchR.push_back(matchRArray.pFloatVal[i]);
		}
	}
	catch (CVmException ex)
	{
		throw CVmException(ex);
	}
}

问题根因
不熟悉流程相关回调函。

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

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

相关文章

从不自量力到 AI 助力,我如何翻译完一整本英文书

披露和声明&#xff1a; 本文提及的翻译作品系使用 AI 技术制作&#xff0c;并经人工调整&#xff0c;具体步骤如文中所述。本文在后期修改过程中使用 ChatGPT 辅助&#xff0c;目的为精简原版中的口语化表述。我的英文水平有限&#xff0c;翻译这本书主要是为了自我学习&…

自动驾驶— Planning - Udacity Self-Driving Car Engineer

第六讲规划 6.1规划简介 在规划中&#xff0c;我们结合了高清地图、定位和预测来构建车辆的轨迹。规划的第一步是路线导航&#xff0c;重点是如何在地图上从A到B。路由以地图数据作为输入&#xff0c;并输出可导航路径。手机上的导航系统就是路线规划的一个例子。在Apollo中&…

高性能——零拷贝

目录 背景 零拷贝定义 传统I/O执行流程 背景 零拷贝算是一个老生常谈的问题啦&#xff0c;很多顶级框架都用到了零拷贝来提升性能&#xff0c;比如我们经常接触到的Kafka 、RocketMQ、Netty 。 零拷贝定义 “拷贝”:就是指数据从一个存储区域转移到另一个存储区域.“零”…

games103——作业2

实验二主要使用隐式积分法以及PBD法完成布料仿真 完整项目已上传至github。 文章目录 基于物理的方法弹簧系统单个弹簧多个弹簧弹簧网络结构化弹簧网络(Structured Spring Networks)非结构化弹簧网络(Unstructured Spring Networks)三角网格表示 代码 求解质量弹簧系统的显示积…

UG NX二次开发(C++)-用UF_OBJ_cycle_objs_in_part遍历对象

文章目录 1、前言2、在UG NX中创建多个体3、创建UF_OBJ_cycle_objs_in_part的使用函数3.1 首先声明函数&#xff1a;3.2定义函数代码3.3 函数调用代码3.4 测试结果 1、前言 UG NX二次开发中&#xff0c;比如体、面、边等&#xff0c;在NXOpen中可以通过Collection来实现&#…

华硕ROG|玩家国度冰刃6双屏GX650RX Windows11原厂预装系统 工厂模式恢复安装带ASUSRecevory一键还原

华硕ROG|玩家国度 冰刃6双屏 GX650RX Windows11原厂预装系统 工厂模式恢复安装带ASUSRecevory一键还原 文件地址&#xff1a;https://pan.baidu.com/s/1snKOsH3OMl3GZLqeAf-GLA?pwd8888 华硕工厂恢复系统 &#xff0c;安装结束后带隐藏分区以及机器所有驱动软件 需准备一个…

【告警通知】Java项目统一异常捕获处理【钉钉告警推送消息】

基础描述 在实际业务中&#xff0c;很多时候都是被动获取系统业务异常&#xff0c;如通过业务部门或者通过客户反馈说某个功能不行时&#xff0c;这样显得系统很被动和呆板在SpringBoot中有统一异常处理可以来实现&#xff0c;当我们检测到非业务异常时&#xff0c;比如空指针…

《SpringBoot中间件设计与实战》第2章 服务治理,超时熔断

需求背景 在流量较大的场景下,举个例子,用户在电商平台下单后开始跳转到在线收银台进行支付。由于支付渠道和网络环境随时都有可能发生问题,那么你该怎么保证支付系统的可靠性呢? 保证支付系统的可靠性需要考虑的点非常多,但这里有一个最直接和重点的内容就支付响应时长…

【王道·计算机网络】第三章 数据链路层【未完】

一、功能 研究思想&#xff1a;水平方向个数据链路层的差距 1.1 数据链路层基本概念 结点&#xff1a;主机、路由器链路&#xff1a;网络中两个节点之间的物理通道&#xff0c;传输介质包含&#xff1a;双绞线、光纤、微波。分为&#xff1a;有线链路、无线链路数据链路&…

TIM输入不捕获-STM32

TIM输入不捕获-STM32 IC(Input Capture) 输入捕获 输入捕获模式下&#xff0c;当通道输入引脚出现指定电平跳变时&#xff0c;当前CNT的值将被锁存到CCR中&#xff0c;可用于测量PWM波形的频率、占空比、脉冲间隔、电平持续时间等参数 每个高级定时器和通用定时器都拥有4个输入…

【Linux】进程学习(2)---理解进程操作

文章目录 查看进程通过系统目录查看通过ps命令查看 通过系统调用获取进程标识符通过系统调用创建进程初识fork函数fork函数的返回值 进程状态阻塞与运行状态Linux内核源码中的进程状态运行状态-R浅度睡眠状态-S深度睡眠状态-D暂停状态-T僵尸状态-Z死亡状态-X 查看进程 通过系统…

操作系统引导(开机过程)

操作系统安装在C盘中&#xff0c;其一步步启动的过程如下&#xff1a; 操作系统要启动&#xff0c;操作系统的数据需要先被放入主存里。 如图所示&#xff0c;计算机的主存由RAM和ROM组成&#xff0c;ROM芯片被集成在电脑主板上&#xff0c;里面存储的是BIOS&#xff08;Basic…

【组合数学算贡献+枚举】CF816div2 C. Monoblock

题解都看了半天才懂 Problem - C - Codeforces 题意&#xff1a; 思路&#xff1a; 一开始的思路是这样的&#xff1a; 只能说&#xff0c;想到了更换枚举对象&#xff0c;然后组合数学算贡献 也想到了修改操作与&#xff08;a[i]和a[i-1]&#xff09;有关 但是我想的是枚…

在Linux上搭建gitlab以及自动化编译部署的完整流程

一、安装gitlab 首先下载gitlab的安装包&#xff0c;地址如下&#xff1a; https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/ubuntu/pool/bionic/main/g/gitlab-ce/ 然后安装下载的包即可&#xff0c;一般还需要安装openssh-server等依赖包&#xff0c;在安装gitlab包之前可以…

【MongoDB】二、MongoDB数据库的基本操作

【MongoDB】二、MongoDB数据库的基本操作 实验目的实验内容任务一&#xff1a;&#xff08;1&#xff09;创建数据库newdb&#xff08;2&#xff09;在数据库newdb中创建集合mycollection&#xff08;3&#xff09;在集合mycollection中插入以下数据&#xff1a;&#xff08;4&…

如何安装 Auto GPT 4:分步指南

动动发财的小手&#xff0c;点个赞吧&#xff01; 您对尝试最新最好的文本生成技术感到兴奋吗&#xff1f; Auto GPT 4 因其令人印象深刻的功能而广为人知&#xff0c;但启动和运行它似乎令人望而生畏。幸运的是&#xff0c;我们在这里[1]提供安装 Auto GPT 4 的分步指南。 1. …

快手sig3 48位-unidbg

研究某手app的小伙伴都了解sig3有两个版本&#xff0c;低版本的是42位&#xff0c;高版本的48位。 废话不多说&#xff0c;先抓个包&#xff1a; 上一个当前最新版本的48位sig3&#xff0c;我们以搜索接口为例&#xff0c;效果如图&#xff1a; 在上面可以看到使用unidbg的方式…

【深度学习】计算机视觉(11)——Faster RCNN(工具篇)

文章目录 1 gcc编译报错1.1 错误提示“ld: cannot find -lm/-lc/-lpthread”1.2 解决方法&#xff1a;安装glibc工具1.3 解决方法&#xff1a;修改sources.list1.4 解决方法&#xff1a;软连接 2 Permission denied3 运行报错3.1 module tensorflow has no attribute 3.2 No mo…

火山 xl,xa,xg,xk,xh,xm 六神签名参数

火山 xl,xa,xg,xk,xh,xm 六神签名参数 27/100 发布文章 weixin_38819889 未选择任何文件 new 纯属技术研究&#xff0c;如有侵权&#xff0c;请联系删除。 抓个包&#xff0c;在火山最新的15.6版本中&#xff0c;已经新增加了2个参数x-helios&#xff0c;x-medusa 前段时间do…

IDEA Java 第一个mybatis入门程序

文章目录 准备mysql 开始新建maven项目maven添加引用mybatis配置文件工具类创建实例类添加mappermappermapper.xml 测试类 发现问题org.apache.ibatis.binding.BindingException: Type interface com.cpyy.mapper.UserMapper is not known to the MapperRegistry.The error may…