【04】VM二次开发——渲染及数据结果获取,显示在Winform界面 【条码/一维码识别】
·
1 VM方案——获取条码信息----脚本打印日志到本地
通过编写脚本,将获取条码信息 打印日志到本地;
脚本模块使用的是C#语言。
1.1 案例介绍
案例步骤如下:
1,用GetStringValue函数分别获取条码信息;
2,通过FileStream类操作流写入信息到本地;
3,并通过SetstringValue函数输出打印日志的状态信息,给到下一个模块。


1.2 添加及编辑脚本
添加一个脚本模块,双击打开,在原有的脚本 模板上添加代码

双击打开,在原有的脚本 模板上添加代码

代码编辑如下;
注意需要引用 命名空间
using System.IO;

using System;
using System.Text;
using System.Windows.Forms;
using System.IO;
using Script.Methods;
public partial class UserScript:ScriptMethods,IProcessMethods
{
//********输入变量**********
string Barcode; //条码
//*******输出变量**********
string writeSucceedOrFailed; //日志写入状态;
/// <summary>
/// 预编译时变量初始化
/// </summary>
public void Init()
{
//变量初始化,其余变量可在该函数中添加
}
/// <summary>
/// Enter the process function when running code once
/// 流程执行一次进入Process函数
/// </summary>
/// <returns></returns>
public bool Process()
{
//每次执行将进入该函数,此处添加所需的逻辑流程处理
GetStringValue("barcode",ref Barcode); //获取条码信息
try
{
using(FileStream fsWrite = new FileStream(@"E:\VM_test\Log.txt",FileMode.Append,FileAccess.Write) )
{
string str= "条码信息:"+ Barcode ;
byte[] buffer=Encoding.Default.GetBytes(str+"\r\n");
fsWrite.Write(buffer,0,buffer.Length);
}
writeSucceedOrFailed="写入OKAY";
}
catch
{
writeSucceedOrFailed="写入失败";
}
SetStringValue("stateOutput",writeSucceedOrFailed); //输出日志打印状态
return true;
}
}
运行后在指定路径 "E:\VM_test\Log.txt"下产生了 Log.txt文件夹,并记录了条码信息


2 获取流程1的结果
想要获取上面的VM方案,将结果显示在Winform界面上;

点击流程1左边的设置按钮

在输出设置中配置输出数据,条码个数,条码信息
在显示设置中配置渲染结果

配置好流程输出后点击确定保存,
关闭VM软件,
3 Winform程序开发
进入VS二次开发程序进行设置;
接着上一讲的 方案加载、执行及保存(按钮事件)的程序接续写

显示渲染结果,需要使用到vmRenderControl控件;
从工具箱中拖出控件到图像显示区,然后在控件属性中将Dock的值改为Fill;


获取结果,分为渲染结果和数据结果;
- 渲染结果显示在界面上,
- 数据结果获取后用户可进行输出或其它处理,本示例将数据结果显示在消息区;
接着上一讲的代码继续写,在方案执行按钮下面添加一下代码
private void button3_Click(object sender, EventArgs e)
{
VmSolution.Instance.SyncRun();//此函数,会同步执行一次方案中的所有流程
listBox1.Items.Add("方案执行一次成功!");
listBox1.TopIndex = listBox1.Items.Count - 1;
//获取结果,分为渲染结果和数据结果;
//渲染结果显示在界面上,
//数据结果获取后用户可进行输出或其它处理,本示例将数据结果显示在消息区;
//将其与先前VM中配置好输出的流程1进行绑定
VmProcedure vmProcess1 = (VmProcedure)VmSolution.Instance["流程1"];
//然后将渲染控件的显示源ModuleSource绑定流程1对象
vmRenderControl1.ModuleSource = vmProcess1;
//通过此代码即可获取到格式化中订阅的条码识别结果strValue
string barCodeResult = vmProcess1.ModuResult.GetOutputString("out1").astStringVal[0].strValue;
string barNum = vmProcess1.ModuResult.GetOutputInt("out0").pIntVal[0].ToString();
listBox1.Items.Add("条码识别结果:" + barCodeResult);
listBox1.TopIndex = listBox1.Items.Count - 1;
listBox1.Items.Add("条码个数:" + barNum);
listBox1.TopIndex = listBox1.Items.Count - 1;
}
4 运行结果

5 Form1完整代码
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using VM.Core;
using VM.PlatformSDKCS;
namespace test1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
OpenFileDialog openFileDialog = new OpenFileDialog();
openFileDialog.Filter = "Vm Sol File|*.sol*";//选择后缀为.sol的文件,VM方案的后缀均为.sol
DialogResult openFileResult = openFileDialog.ShowDialog();
if (DialogResult.OK == openFileResult)
{
textBox1.Text = openFileDialog.FileName;
}
listBox1.Items.Add("选择路径成功!");
listBox1.TopIndex = listBox1.Items.Count - 1;
}
private void button4_Click(object sender, EventArgs e)
{
VmSolution.Load(textBox1.Text);//函数中的参数为方案的路径,直接使用文本框textBox1的文本内容;
listBox1.Items.Add("方案加载成功!");
listBox1.TopIndex = listBox1.Items.Count - 1;
}
private void button3_Click(object sender, EventArgs e)
{
VmSolution.Instance.SyncRun();//此函数,会同步执行一次方案中的所有流程
listBox1.Items.Add("方案执行一次成功!");
listBox1.TopIndex = listBox1.Items.Count - 1;
//获取结果,分为渲染结果和数据结果;
//渲染结果显示在界面上,
//数据结果获取后用户可进行输出或其它处理,本示例将数据结果显示在消息区;
//将其与先前VM中配置好输出的流程1进行绑定
VmProcedure vmProcess1 = (VmProcedure)VmSolution.Instance["流程1"];
//然后将渲染控件的显示源ModuleSource绑定流程1对象
vmRenderControl1.ModuleSource = vmProcess1;
//通过此代码即可获取到格式化中订阅的条码识别结果strValue
string barCodeResult = vmProcess1.ModuResult.GetOutputString("out1").astStringVal[0].strValue;
string barNum = vmProcess1.ModuResult.GetOutputInt("out0").pIntVal[0].ToString();
listBox1.Items.Add("条码识别结果:" + barCodeResult);
listBox1.TopIndex = listBox1.Items.Count - 1;
listBox1.Items.Add("条码个数:" + barNum);
listBox1.TopIndex = listBox1.Items.Count - 1;
}
private void button2_Click(object sender, EventArgs e)
{
VmSolution.Save(); //Save函数是将方案保存到原始路径直接替换原方案;
//VmSolution.SaveAs("path");//而SaveAs是将方案另存至自定义的路径
listBox1.Items.Add("方案保存成功!");
listBox1.TopIndex = listBox1.Items.Count - 1;
}
}
}
上面的代码,变量名没有修改;
为了提高代码的可读性,变量的名字尽可能地包含功能信息;如下面这样
private void buttonChooseSoluPath_Click(object sender, EventArgs e)
{
OpenFileDialog openFileDialog = new OpenFileDialog();
openFileDialog.Filter = "Vm Sol File|*.sol*";//选择后缀为.sol的文件,VM方案的后缀均为.sol
DialogResult openFileResult = openFileDialog.ShowDialog();
if (DialogResult.OK == openFileResult)
{
textBoxSolutionPath.Text = openFileDialog.FileName;
}
listBoxMsg.Items.Add("选择路径成功!");
listBoxMsg.TopIndex = listBoxMsg.Items.Count - 1;
}
private void buttonLoadSolution_Click(object sender, EventArgs e)
{
VmSolution.Load(textBoxSolutionPath.Text);//函数中的参数为方案的路径,直接使用文本框textBox1的文本内容;
listBoxMsg.Items.Add("方案加载成功!");
listBoxMsg.TopIndex = listBoxMsg.Items.Count - 1;
}
private void buttonExecute_Click(object sender, EventArgs e)
{
VmSolution.Instance.SyncRun();//此函数,会同步执行一次方案中的所有流程
listBoxMsg.Items.Add("方案执行一次成功!");
listBoxMsg.TopIndex = listBoxMsg.Items.Count - 1;
//获取结果,分为渲染结果和数据结果;
//渲染结果显示在界面上,
//数据结果获取后用户可进行输出或其它处理,本示例将数据结果显示在消息区;
//将其与先前VM中配置好输出的流程1进行绑定
VmProcedure vmProcess1 = (VmProcedure)VmSolution.Instance["流程1"];
//然后将渲染控件的显示源ModuleSource绑定流程1对象
vmRenderControl1.ModuleSource = vmProcess1;
}
private void buttonSave_Click(object sender, EventArgs e)
{
VmSolution.Save(); //Save函数是将方案保存到原始路径直接替换原方案;
//VmSolution.SaveAs("path");//而SaveAs是将方案另存至自定义的路径
listBoxMsg.Items.Add("方案保存成功!");
listBoxMsg.TopIndex = listBoxMsg.Items.Count - 1;
}
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐




所有评论(0)