执行按钮命令与方法执行[NonSerialized]privateCommandBase_ExecuteCommand;publicCommandBaseExecuteCommand{get{if(_ExecuteCommandnull){_ExecuteCommandnewCommandBase((obj){ExeModule();});}return_ExecuteCommand;}}publicoverrideboolExeModule(){// 重置计时器Stopwatch.Restart();try{// 安全检测// 用户需要选择第几张图像// 表格里需要有图像if(nImageIndexnull||ImageParam.Count0){// 否则显示执行 失败模块变红ChangeModuleRunStatus(eRunStatus.NG);returnfalse;}// 标记记录是否找到了 匹配的图像初始为falseboolbImagefalse;// 从变量系统中解析出当前索引的实际值intnIndexConvert.ToInt32(GetLinkValue(nImageIndex));// 遍历表格每个图像数据for(inti0;iImageParam.Count;i){// 对索引// 判断有没有链接图像if(nIndexImageParam[i].IndexImageParam[i].InputImage.Text!){// 拿图并显示GetDispImage(ImageParam[i].InputImage.Text,true);bImagetrue;}}if(DispImagenull||!DispImage.IsInitialized()||bImagefalse){// 显示操作失败ChangeModuleRunStatus(eRunStatus.NG);returnfalse;}// 把ROI、文字显示到图像上ShowHRoi();// 所有顺利执行完则显示操作成功ChangeModuleRunStatus(eRunStatus.OK);returntrue;}catch(Exceptionex){ChangeModuleRunStatus(eRunStatus.NG);Logger.GetExceptionMsg(ex);returnfalse;}}ExeModule()逐行讲解先给一个一句话总结这个方法做的事情是——“根据用户选的索引从表格里找到对应的图像链接把上游模块的图像拿过来显示”。代码拆解 第一段准备工作 前置校验Stopwatch.Restart();// ① 启动秒表计时本次执行用了多久try{if(nImageIndexnull||ImageParam.Count0){ChangeModuleRunStatus(eRunStatus.NG);returnfalse;}通俗解释Stopwatch.Restart()像一个秒表每次执行前归零重新计时执行完毕后会在ChangeModuleRunStatus里把耗时记录到ModuleParam.ElapsedTimeif (nImageIndex null || ImageParam.Count 0)两层安全检查nImageIndex null用户还没选用第几张图索引都没链接过变量那没法执行ImageParam.Count 0表格里一行都没有用户还没点过添加也没法执行ChangeModuleRunStatus(eRunStatus.NG)把模块状态标记为NG失败流程编辑器中这个模块会变红return false告诉上层我执行失败了 第二段获取索引值boolbImagefalse;intnIndexConvert.ToInt32(GetLinkValue(nImageIndex));通俗解释nImageIndex是一个LinkVarModel它的Text存的是链接变量名如全局变量.图像索引Value存的是实际值GetLinkValue(nImageIndex)从变量系统中解析出当前索引的实际值。比如用户链接了变量当前工位当前值是 2那nIndex就是 2bImage false一个标记记录是否找到了匹配的图像初始为 falseGetLinkValue是ModuleBase上的方法它做了什么事它去变量系统里根据链接变量名找到对应模块的输出变量返回它的实际值。支持int、double、string、bool、数组等多种类型。 第三段按索引查表取图 ——核心逻辑for(inti0;iImageParam.Count;i)// 遍历表格每一行{if(nIndexImageParam[i].Index// 索引对上了吗ImageParam[i].InputImage.Text!)// 这行链接了图像吗{GetDispImage(ImageParam[i].InputImage.Text,true);// ★ 拿图bImagetrue;// 标记找到了}}通俗解释这是一个对号入座的过程。打个比方你有一个图像池表格索引图像链接0Camera1.顶视图1Camera2.侧视图2Camera3.底视图如果用户选了索引1那循环走到 i1 时nIndex(1) ImageParam[1].Index(1)✅且InputImage.Text Camera2.侧视图不是空的于是执行GetDispImage(Camera2.侧视图, true)——去上游模块 Camera2 那里把侧视图拿过来赋值给DispImage并渲染到 Halcon 窗口上bImage true“好的我找到了对应的图”GetDispImage做了什么它接收一个变量名Camera2.侧视图通过Prj.GetParamByName()找到这个变量的实际图像对象RImage或HImage然后赋值给DispImage。 第四段兜底校验if(DispImagenull||!DispImage.IsInitialized()||bImagefalse){ChangeModuleRunStatus(eRunStatus.NG);returnfalse;}通俗解释三种情况任意一种发生都算失败。条件含义DispImage null拿回来的图像对象是空的!DispImage.IsInitialized()图像对象虽然存在但没初始化Halcon 中的无效图像bImage false循环跑完了没找到任何匹配的行索引不匹配或都没链接三种情况都说明没有有效图像可以显示标记 NG 并返回 false。 第五段成功收尾ShowHRoi();// ① 把 ROI框、圆、文字标注绘制到图像上ChangeModuleRunStatus(eRunStatus.OK);// ② 标记为 OK绿色returntrue;通俗解释ShowHRoi()把当前模块的 ROI 集合mHRoi渲染到DispImage上——比如在图像上画检测框、十字线、测量结果文字等ChangeModuleRunStatus(eRunStatus.OK)标记模块执行成功流程编辑器中这个模块变绿同时记录耗时return true告诉上层我执行成功了⚫ 第六段异常兜底catch(Exceptionex){ChangeModuleRunStatus(eRunStatus.NG);Logger.GetExceptionMsg(ex);returnfalse;}通俗解释无论前面哪一步崩了比如索引值不是数字、图像变量不存在、Halcon 异常等都会被 catch 住标记 NG 记录日志不会让整个程序崩溃。整体流程图用户点击执行 │ ▼ Stopwatch 开始计时 │ ▼ nImageIndex 为空 或 表格为空 ──是──→ NG ❌ │否 ▼ 从变量系统解析 nIndex 的实际值 比如全局变量.图像索引 → 值1 │ ▼ 遍历 ImageParam 表格每一行 找 Index1 且 InputImage.Text 不为空的行 │ ├── 找到了 → GetDispImage (去上游拿HImage) │ bImage true │ └── 没找到 → bImage false │ ▼ DispImage 有效吗bImage 为 true 吗 │ │ 是 否 │ │ ▼ ▼ ShowHRoi() 叠加标注 NG ❌ OK ✅这个方法体现了典型的视觉模块执行模式拉取输入变量 → 执行核心逻辑 → 校验结果 → 渲染输出 → 更新状态。在后续视频中你会在几乎所有模块里看到类似的骨架结构。
执行按钮命令与方法
发布时间:2026/6/4 19:52:22
执行按钮命令与方法执行[NonSerialized]privateCommandBase_ExecuteCommand;publicCommandBaseExecuteCommand{get{if(_ExecuteCommandnull){_ExecuteCommandnewCommandBase((obj){ExeModule();});}return_ExecuteCommand;}}publicoverrideboolExeModule(){// 重置计时器Stopwatch.Restart();try{// 安全检测// 用户需要选择第几张图像// 表格里需要有图像if(nImageIndexnull||ImageParam.Count0){// 否则显示执行 失败模块变红ChangeModuleRunStatus(eRunStatus.NG);returnfalse;}// 标记记录是否找到了 匹配的图像初始为falseboolbImagefalse;// 从变量系统中解析出当前索引的实际值intnIndexConvert.ToInt32(GetLinkValue(nImageIndex));// 遍历表格每个图像数据for(inti0;iImageParam.Count;i){// 对索引// 判断有没有链接图像if(nIndexImageParam[i].IndexImageParam[i].InputImage.Text!){// 拿图并显示GetDispImage(ImageParam[i].InputImage.Text,true);bImagetrue;}}if(DispImagenull||!DispImage.IsInitialized()||bImagefalse){// 显示操作失败ChangeModuleRunStatus(eRunStatus.NG);returnfalse;}// 把ROI、文字显示到图像上ShowHRoi();// 所有顺利执行完则显示操作成功ChangeModuleRunStatus(eRunStatus.OK);returntrue;}catch(Exceptionex){ChangeModuleRunStatus(eRunStatus.NG);Logger.GetExceptionMsg(ex);returnfalse;}}ExeModule()逐行讲解先给一个一句话总结这个方法做的事情是——“根据用户选的索引从表格里找到对应的图像链接把上游模块的图像拿过来显示”。代码拆解 第一段准备工作 前置校验Stopwatch.Restart();// ① 启动秒表计时本次执行用了多久try{if(nImageIndexnull||ImageParam.Count0){ChangeModuleRunStatus(eRunStatus.NG);returnfalse;}通俗解释Stopwatch.Restart()像一个秒表每次执行前归零重新计时执行完毕后会在ChangeModuleRunStatus里把耗时记录到ModuleParam.ElapsedTimeif (nImageIndex null || ImageParam.Count 0)两层安全检查nImageIndex null用户还没选用第几张图索引都没链接过变量那没法执行ImageParam.Count 0表格里一行都没有用户还没点过添加也没法执行ChangeModuleRunStatus(eRunStatus.NG)把模块状态标记为NG失败流程编辑器中这个模块会变红return false告诉上层我执行失败了 第二段获取索引值boolbImagefalse;intnIndexConvert.ToInt32(GetLinkValue(nImageIndex));通俗解释nImageIndex是一个LinkVarModel它的Text存的是链接变量名如全局变量.图像索引Value存的是实际值GetLinkValue(nImageIndex)从变量系统中解析出当前索引的实际值。比如用户链接了变量当前工位当前值是 2那nIndex就是 2bImage false一个标记记录是否找到了匹配的图像初始为 falseGetLinkValue是ModuleBase上的方法它做了什么事它去变量系统里根据链接变量名找到对应模块的输出变量返回它的实际值。支持int、double、string、bool、数组等多种类型。 第三段按索引查表取图 ——核心逻辑for(inti0;iImageParam.Count;i)// 遍历表格每一行{if(nIndexImageParam[i].Index// 索引对上了吗ImageParam[i].InputImage.Text!)// 这行链接了图像吗{GetDispImage(ImageParam[i].InputImage.Text,true);// ★ 拿图bImagetrue;// 标记找到了}}通俗解释这是一个对号入座的过程。打个比方你有一个图像池表格索引图像链接0Camera1.顶视图1Camera2.侧视图2Camera3.底视图如果用户选了索引1那循环走到 i1 时nIndex(1) ImageParam[1].Index(1)✅且InputImage.Text Camera2.侧视图不是空的于是执行GetDispImage(Camera2.侧视图, true)——去上游模块 Camera2 那里把侧视图拿过来赋值给DispImage并渲染到 Halcon 窗口上bImage true“好的我找到了对应的图”GetDispImage做了什么它接收一个变量名Camera2.侧视图通过Prj.GetParamByName()找到这个变量的实际图像对象RImage或HImage然后赋值给DispImage。 第四段兜底校验if(DispImagenull||!DispImage.IsInitialized()||bImagefalse){ChangeModuleRunStatus(eRunStatus.NG);returnfalse;}通俗解释三种情况任意一种发生都算失败。条件含义DispImage null拿回来的图像对象是空的!DispImage.IsInitialized()图像对象虽然存在但没初始化Halcon 中的无效图像bImage false循环跑完了没找到任何匹配的行索引不匹配或都没链接三种情况都说明没有有效图像可以显示标记 NG 并返回 false。 第五段成功收尾ShowHRoi();// ① 把 ROI框、圆、文字标注绘制到图像上ChangeModuleRunStatus(eRunStatus.OK);// ② 标记为 OK绿色returntrue;通俗解释ShowHRoi()把当前模块的 ROI 集合mHRoi渲染到DispImage上——比如在图像上画检测框、十字线、测量结果文字等ChangeModuleRunStatus(eRunStatus.OK)标记模块执行成功流程编辑器中这个模块变绿同时记录耗时return true告诉上层我执行成功了⚫ 第六段异常兜底catch(Exceptionex){ChangeModuleRunStatus(eRunStatus.NG);Logger.GetExceptionMsg(ex);returnfalse;}通俗解释无论前面哪一步崩了比如索引值不是数字、图像变量不存在、Halcon 异常等都会被 catch 住标记 NG 记录日志不会让整个程序崩溃。整体流程图用户点击执行 │ ▼ Stopwatch 开始计时 │ ▼ nImageIndex 为空 或 表格为空 ──是──→ NG ❌ │否 ▼ 从变量系统解析 nIndex 的实际值 比如全局变量.图像索引 → 值1 │ ▼ 遍历 ImageParam 表格每一行 找 Index1 且 InputImage.Text 不为空的行 │ ├── 找到了 → GetDispImage (去上游拿HImage) │ bImage true │ └── 没找到 → bImage false │ ▼ DispImage 有效吗bImage 为 true 吗 │ │ 是 否 │ │ ▼ ▼ ShowHRoi() 叠加标注 NG ❌ OK ✅这个方法体现了典型的视觉模块执行模式拉取输入变量 → 执行核心逻辑 → 校验结果 → 渲染输出 → 更新状态。在后续视频中你会在几乎所有模块里看到类似的骨架结构。