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;

image

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;
 }

 

posted @ 2025-12-14 20:33  ꧁执笔小白꧂  阅读(6)  评论(0)    收藏  举报