VisionPro 9.5中使用C#调用QuickBuild操作

在VisionPro中,常见的操作是:

  1. 将产品多种型号分别定义成多个QuickBuild。(PS: 产品A调用QuickBuild1,产品B调用QuickBuild2)
    JobManager
  2. 一个QuickBuild(JobManager)文件下可以包括若干个作业(Job),如果一个项目连接多个工业相机,那么可以将相机单独绑定到Job上。
    Job
  3. Job中可以包含采像工具、ToolBlock、ToolGroup和各种算法工具。
    CogJob
  4. 结果输出,可以通过添加已发送项的方式,将单个Job执行结果输出。
    添加输出

这里主要实现模拟四个相机从分别读取OCR字符,然后将字符的个数打印到CogRecordDisplay的左上角。效果如下:

接下来,上代码:

  1. 实例化CogManager(作业管理器)、CogJob(作业)、CogJobIndependent(类似于TaskHelper的存在,欢迎纠错)对象。
   private CogJobManager myJobManager;
   private List<CogJob> myJobs = new List<CogJob>();
   private List<CogJobIndependent> myIndependentJobs = new List<CogJobIndependent>();
  1. 初始化对象,并订阅结果可用事件(UserResultAvailable)
 myJobManager = CogSerializer.LoadObjectFromFile(Application.StartupPath + @"\QuickBuild\QuickBuild1.vpp") as CogJobManager;
               //将作业管理器中的作业遍历到作业集合中
                for (int i = 0; i < myJobManager.JobCount; i++)
                {
                    myJobs.Add(myJobManager.Job(i));
                    myIndependentJobs.Add(myJobs[i].OwnedIndependent);
                }
                myJobManager.UserQueueFlush(); //用户队列刷新
                myJobManager.FailureQueueFlush(); //故障队列刷新
                for (int i = 0; i < myJobManager.JobCount; i++)
                {
                    myJobs[i].ImageQueueFlush();
                    myIndependentJobs[i].RealTimeQueueFlush();
                }
                this.Invoke(new Action(() => 
                {
                    cogJobManagerEdit1.Subject = myJobManager; //将工程文件显示到JobManager控件中
                }));
               
                //订阅完成事件
                myJobManager.Stopped += new CogJobManager.CogJobManagerStoppedEventHandler((sender, e) => { });
                //订阅结果可用事件
                myJobManager.UserResultAvailable += new CogJobManager.CogUserResultAvailableEventHandler(OnUserResultAvailable);
  1. 在OnUserResultAvailable事件的回调函数中,添加显示、获取结果代码
  private void OnUserResultAvailable(object sender, CogJobManagerActionEventArgs e)
        {
           //由于CogManager对象是在异步线程中创建的,所以需要使用主线程的Invoke()方法调用
            this.Invoke(new Action(() =>
            {
                ICogRecord record = myJobManager.UserResult();
                ICogRecord tmpRecord;
                  switch (record.SubRecords["JobName"].Content.ToString())
                {
                    case "Camera_1":
                    	//获取当前Job的已发送项结果
                        tmpRecord = record.SubRecords["StringLength"];
                        lbl_ResultStrLength1.Text = tmpRecord.Content.ToString();
                        
                        tmpRecord = record.SubRecords["ShowLastRunRecordForUserQueue"];
                        tmpRecord = tmpRecord.SubRecords["LastRun"];
                        tmpRecord = tmpRecord.SubRecords["Image Source.OutputImage"];
                        cogRecordDisplay4.InteractiveGraphics.Clear();
                        cogRecordDisplay4.Record = tmpRecord;
                        cogRecordDisplay4.Fit(true);
                        break;
                        case "Camera_2":
                        tmpRecord = record.SubRecords["StringLength"];
                        lbl_ResultStrLength2.Text = tmpRecord.Content.ToString();
                         
                        tmpRecord = record.SubRecords["ShowLastRunRecordForUserQueue"];
                        tmpRecord = tmpRecord.SubRecords["LastRun"];
                        tmpRecord = tmpRecord.SubRecords["Image Source.OutputImage"];                        cogRecordDisplay5.InteractiveGraphics.Clear();
                        cogRecordDisplay5.Record = tmpRecord;
                        cogRecordDisplay5.Fit(true);
                        break;
                         case "Camera_3":
                        tmpRecord = record.SubRecords["StringLength"];
                        lbl_ResultStrLength3.Text = tmpRecord.Content.ToString();
                        
                        tmpRecord = record.SubRecords["ShowLastRunRecordForUserQueue"];
                        tmpRecord = tmpRecord.SubRecords["LastRun"];
                        tmpRecord = tmpRecord.SubRecords["Image Source.OutputImage"];
                        cogRecordDisplay7.InteractiveGraphics.Clear();
                        cogRecordDisplay7.Record = tmpRecord;
                        cogRecordDisplay7.Fit(true);
                        break;
                          case "Camera_4":
                        tmpRecord = record.SubRecords["StringLength"];
                        lbl_ResultStrLength4.Text = tmpRecord.Content.ToString();
                        
                        tmpRecord = record.SubRecords["ShowLastRunRecordForUserQueue"];
                        tmpRecord = tmpRecord.SubRecords["LastRun"];
                        tmpRecord = tmpRecord.SubRecords["Image Source.OutputImage"];
                        cogRecordDisplay6.InteractiveGraphics.Clear();
                        cogRecordDisplay6.Record = tmpRecord;
                        cogRecordDisplay6.Fit(true);
                        break;
  		}
            }));
        }
  1. 执行CogManager作业管理器
  	private void btn_QuickBuildRun_Click(object sender, EventArgs e)
        {
            myJobManager.Run();
        }

如何使用ToolGroup?

ToolGroup
以上面的例子为例,可以在每个Job中都通过引入CogOCRMaxTool工具LineResult.Count引脚的方式获取字符总数。也可以通过在ToolGroup中添加脚本的方式获取。

  1. 在初始化函数 Initialize()中,添加输入输出引脚
 public override void Initialize(CogToolGroup host)
  {
    // DO NOT REMOVE - Call the base class implementation first - DO NOT REMOVE
    base.Initialize(host);
    
    this.toolGroup.DefineScriptTerminal( input,"Input", true);
    this.toolGroup.DefineScriptTerminal( output,"Output", false);
  }
  1. 定义输入输出变量,在GroupRun()方法中获取输入值,并判断字符个数后输出
 public string input = "";
 public int output;
 public override bool GroupRun(ref string message, ref CogToolResultConstants result)
  {
     string str = this.toolGroup.GetScriptTerminalData("Input").ToString();
     output = str.Length;
     this.toolGroup.SetScriptTerminalData("Output",output);
    
     return false;
  }
  1. 连接输入、输出 (可以传递给其他工具,也可以直接添加到已发送项) 引脚

    关于ToolGroup和ToolBlock的使用和区别,后面会更新详细的文档。
    【END】
  • 8
    点赞
  • 68
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值