C#+VisionMaster联合开发(二)_操作流程
1、获取方案中的流程列表
// 加载流程列表
ProcessInfoList processInfoList = VmSolutionMain.GetAllProcedureList();
if (processInfoList.nNum > 0)
{
var processNames = processInfoList.astProcessInfo.ToList().Where(a => !string.IsNullOrEmpty(a.strProcessName)).Select(a => a.strProcessName).ToList();
}
2、获取流程对象
VmProcedure procedure = (VmProcedure)VmSolutionMain[processName];
if (procedure == null)
{
MessageBox.Show($"未在VM方案中找到流程【{processName}】", "异常", MessageBoxButtons.OK, MessageBoxIcon.Hand);
return;
}
3、单次执行
procedure.Run(); // 单次执行Run 或 SyncRun
4、连续执行
procedure.ContinuousRunEnable = true; // 开始连续运行
procedure.ContinuousRunEnable = false; // 停止连续运行
5、设置‘连续执行’间隔值
procedure.SetContinousRunInterval(intervalTime); // intervalTime为uint型值,单位ms
6、启用/禁用流程
// 写法一
VmSolutionMain.EnableProcedure(processName); // 启用;processName为流程名
VmSolutionMain.DisableProcedure(processName); // 禁用;processName为流程名
// 写法二
vmProcedure.IsEnabled = true; // 启用;vmProcedure为流程对象
vmProcedure.IsEnabled = false; // 禁用;vmProcedure为流程对象
7、删除流程
VmSolutionMain.DeleteOneProcedure(processName); // processName为流程名
8、导入流程
// 前提是 提前打开了一个VM方案,即VmSolutionMain有值
VmProcedure vmProcedure = VmProcedure.Load(processFilePath, processPwd);
9、导出流程
VmProcedure vmProcedure = (VmProcedure)VmSolutionMain[processName];
if (vmProcedure == null)
{
MessageBox.Show($"‘导出流程’失败!未在VM方案中找到流程【{processName}】", "异常", MessageBoxButtons.OK, MessageBoxIcon.Hand);
return;
}
string saveAsResult = vmProcedure.SaveAs(filePath, processPwd); // filePath为保存路径
ShowLog("导出流程’执行完成!" + saveAsResult);
10、获取流程中的模块列表
ModuleInfoList moduleList = vmProcedure.GetAllModuleList(); // 获取所有模块列表;vmProcedure为流程对象
if (moduleList.nNum > 0)
{
List<string> modileNames = moduleList.astModuleInfo.Select(a => a.strDisplayName).ToList();
}
11、获取流程输入参数列表
// 获取该流程中的所有输入参数列表
List<VmDynamicIODefine.IoNameInfo> inNameInfos = vmProcedure.ModuParams.GetAllInputNameInfo(); // 参数名称、参数类型
cmbProcessParamName.DataSource = inNameInfos?.Select(a => a.Name)?.ToList();
//cmbProcessParamType.Text = inNameInfos.Where(a => a.Name == processParamName).FirstOrDefault().TypeName.ToString();
12、读写流程输入参数值
// 读取
var paramValue = vmProcedure.Inputs.GetIO(processParamName).GetValue(0, 1); // vmProcedure流程对象,processParamName参数名;自己研究慢慢学吧
txtProcessParamValue.Text = paramValue?.ToString();
// 写入,以下操作试过都不行;我推荐将输入参数关联到全局变量(如图),给全局变量赋值即可;
//vmProcedure.ModuParams.SetParamValue(processParamName, processParamValue);
//vmProcedure.Params.Data = processParamValue;

13、获取流程输出参数列表
// 获取该流程中的所有结果(输出)参数列表
List<VmDynamicIODefine.IoNameInfo> outNameInfos = vmProcedure.ModuResult.GetAllOutputNameInfo(); // 参数名称、参数类型
cmbResultParamName.DataSource = outNameInfos?.Select(a => a.Name)?.ToList();
//cmbResultParamType.Text = outNameInfos.Where(a => a.Name == resultParamName).FirstOrDefault().TypeName.ToString();
14、读取流程输出参数值
这里我贴段代码,自己分拣需要的吧
VmProcedure vmProcedure = (VmProcedure)VmSolutionMain[processName];
switch (resultParamType)
{
case "IMVS_GRAP_TYPE_INT": // 整型
IntDataArray stIntRes = vmProcedure.ModuResult.GetOutputInt(resultParamName); // 获取整型输出
dataStr = stIntRes.nValueNum < 1 ? "" : string.Join(",", stIntRes.pIntVal);
ShowLog($"‘获取 结果参数值’执行完成!结果内容[{stIntRes.nValueNum}]:{dataStr}");
break;
case "IMVS_GRAP_TYPE_FLOAT": // 浮点型
FloatDataArray stFloatRes = vmProcedure.ModuResult.GetOutputFloat(resultParamName); // 获取浮点型输出
dataStr = stFloatRes.nValueNum < 1 ? "" : string.Join(",", stFloatRes.pFloatVal);
ShowLog($"‘获取 结果参数值’执行完成!结果内容[{stFloatRes.nValueNum}]:{dataStr}");
break;
case "IMVS_GRAP_TYPE_STRING": // 字符串型
StringDataArray stStringRes = vmProcedure.ModuResult.GetOutputString(resultParamName); // 获取字符串型输出
dataStr = stStringRes.nValueNum < 1 ? "" : stStringRes.astStringVal.Select(x => x.strValue).First();
ShowLog($"‘获取 结果参数值’执行完成!结果内容[{stStringRes.nValueNum}]:{dataStr}");
break;
case "IMVS_BASE_TYPE_IMAGE_DATA": // 图像数据
ImageBaseData stImgRes = vmProcedure.ModuResult.GetOutputImageV2(resultParamName); // 获取图像结果
if (stImgRes != null)
{
Bitmap bitmap = stImgRes.ToBitmap();
picResult1.Image = bitmap;
}
break;
case "IMVS_GRAP_TYPE_PIXELIMAGE": // 带有类别信息的图像
PixelImage stImgRes2 = vmProcedure.ModuResult.GetOutputPixelImage(resultParamName); // 获取带类别信息的图
List<ClassInfo> Infos = stImgRes2.Info;
if (Infos.Count > 0)
{
foreach (ClassInfo classInfo in Infos)
{
dataStr += $"[类别信息Name:{classInfo.Name},GrayValue:{classInfo.GrayValue}];";
}
}
ShowLog($"‘获取 结果参数值’执行完成!结果内容[{Infos.Count}]:{dataStr}");
if (stImgRes2.Image != null)
{
Mat mat1 = ImgConvertTools.ImageBaseData_V2ToMat(stImgRes2.Image);
Bitmap bitmap1 = BitmapConverter.ToBitmap(mat1);
picResult1.Image = bitmap1;
}
break;
case "IMVS_GRAP_TYPE_POINT_I": // 点
case "IMVS_GRAP_TYPE_POINT_F": // 浮点型点
case "IMVS_GRAP_TYPE_POINTSET": // 点集
case "IMVS_GRAP_TYPE_MATCHOUTLINE": // 轮廓点
List<VM.PlatformSDKCS.PointF> stPtsetRes = vmProcedure.ModuResult.GetOutputPointArray(resultParamName); // 获取点集型输出
if (stPtsetRes.Count > 0)
{
foreach (VM.PlatformSDKCS.PointF pointF in stPtsetRes)
{
dataStr += $"({pointF.X},{pointF.Y}),";
}
}
ShowLog($"‘获取 结果参数值’执行完成!结果内容[{stPtsetRes.Count}]:{dataStr}");
break;
case "IMVS_GRAP_TYPE_LINE": // 直线
List<Line> stLineRes = vmProcedure.ModuResult.GetOutputLineArray(resultParamName); // 获取直线型输出
if (stLineRes.Count > 0)
{
foreach (Line line in stLineRes)
{
dataStr += $"[起点:({line.StartPoint.X},{line.StartPoint.Y}),终点:({line.EndPoint.X},{line.EndPoint.Y}),角度:{line.Angle}];";
}
}
ShowLog($"‘获取 结果参数值’执行完成!结果内容[{stLineRes.Count}]:{dataStr}");
break;
case "IMVS_GRAP_TYPE_CIRCLE": // 圆形
List<Circle> stCircleRes = vmProcedure.ModuResult.GetOutputCircleArray(resultParamName); // 获取圆形型输出
if (stCircleRes.Count > 0)
{
foreach (Circle circle in stCircleRes)
{
dataStr += $"[中心点:({circle.CenterPoint.X},{circle.CenterPoint.Y}),半径:{circle.Radius}];";
}
}
ShowLog($"‘获取 结果参数值’执行完成!结果内容[{stCircleRes.Count}]:{dataStr}");
break;
case "IMVS_GRAP_TYPE_ANNULUS": // 圆弧
List<Annulus> stAnnulusRes = vmProcedure.ModuResult.GetOutputAnnulusArray(resultParamName); // 获取圆弧型输出
if (stAnnulusRes.Count > 0)
{
foreach (Annulus annulus in stAnnulusRes)
{
dataStr += $"[中心点:({annulus.CenterPoint.X},{annulus.CenterPoint.Y}),圆弧内径:{annulus.InnerRadius},圆弧外径:{annulus.OuterRadius},起始角度:{annulus.StartAngle},检测范围:{annulus.AngleExtend}];";
}
}
ShowLog($"‘获取 结果参数值’执行完成!结果内容[{stAnnulusRes.Count}]:{dataStr}");
break;
case "IMVS_GRAP_TYPE_RECT_F": // 不带角度的矩形
case "IMVS_GRAP_TYPE_RECT_I": // 矩形
case "IMVS_GRAP_TYPE_RECT_BOX": // 矩形
List<RectF> stRectFRes = vmProcedure.ModuResult.GetOutputRectArray(resultParamName); // 获取矩形型输出
if (stRectFRes.Count > 0)
{
foreach (RectF rectF in stRectFRes)
{
dataStr += $"[中心点:({rectF.RectPoint.X},{rectF.RectPoint.Y}),宽:{rectF.RectWidth},高:{rectF.RectHeight}];";
}
}
ShowLog($"‘获取 结果参数值’执行完成!结果内容[{stRectFRes.Count}]:{dataStr}");
break;
case "IMVS_GRAP_TYPE_POLYGON": // 多边形
List<Polygon> stPolygonRes = vmProcedure.ModuResult.GetOutputPolygonArray(resultParamName); // 获取多边形型输出
if (stPolygonRes.Count > 0)
{
foreach (Polygon polygon in stPolygonRes)
{
dataStr += $"[";
foreach (VM.PlatformSDKCS.PointF pointF in polygon.VertexPoints)
{
dataStr += $"({pointF.X},{pointF.Y}),];";
}
dataStr += $"];";
}
}
ShowLog($"‘获取 结果参数值’执行完成!结果内容[{stPolygonRes.Count}]:{dataStr}");
break;
case "IMVS_GRAP_TYPE_FIXTURE": // 位置修正
case "IMVS_GRAP_TYPE_DEFECT_FIXTURE": // 缺陷检测修正信息
List<Fixture> stFixtureRes = vmProcedure.ModuResult.GetOutputFixtureArray(resultParamName); // 获取位置修正型输出
if (stFixtureRes.Count > 0)
{
foreach (Fixture fixture in stFixtureRes)
{
dataStr += $"[最小宽度:({fixture.stInitPoint.X},{fixture.stInitPoint.Y}),最大宽度:({fixture.fInitAngle},平均宽度:{fixture.fInitScaleX}),近似面积:{fixture.fInitScaleY}];";
}
}
ShowLog($"‘获取 结果参数值’执行完成!结果内容[{stFixtureRes.Count}]:{dataStr}");
break;
case "IMVS_GRAP_TYPE_POSTURE": // 位姿
List<Posture> stPostureRes = vmProcedure.ModuResult.GetOutputPostureArray(resultParamName); // 获取位姿型输出
if (stPostureRes.Count > 0)
{
foreach (Posture posture in stPostureRes)
{
dataStr += $"[PointF:({posture.stPoint.X},{posture.stPoint.Y}),R:({posture.R}];";
}
}
ShowLog($"‘获取 结果参数值’执行完成!结果内容[{stPostureRes.Count}]:{dataStr}");
break;
case "IMVS_GRAP_TYPE_CLASSINFO": // 类别信息
List<ClassInfo> stClassInfoRes = vmProcedure.ModuResult.GetOutputClassInfoArray(resultParamName); // 获取类别信息型输出
if (stClassInfoRes.Count > 0)
{
foreach (ClassInfo classInfo in stClassInfoRes)
{
dataStr += $"[类别信息Name:{classInfo.Name},GrayValue:{classInfo.GrayValue}];";
}
}
ShowLog($"‘获取 结果参数值’执行完成!结果内容[{stClassInfoRes.Count}]:{dataStr}");
break;
case "IMVS_GRAP_TYPE_BYTE": // 二进制
StringData stStringDataRes = vmProcedure.ModuResult.GetOutputByteArray(resultParamName); // 获取二进制型输出
ShowLog($"‘获取 结果参数值’执行完成!结果内容:{stStringDataRes.strValue}");
break;
default:
break;
}
本文来自博客园,作者:꧁执笔小白꧂,转载请注明原文链接:https://www.cnblogs.com/qq2806933146xiaobai/p/19349814

浙公网安备 33010602011771号