VisionPro_9.5中ToolBlock脚本编写&通过脚本绘制Record显示简单示例

1. 导读:

前面有一篇博客分享了如何使用C#调用ToolBlock,以完成一个简单的视觉开发项目。今天主要分享一下在ToolBlock中,如何编写运行脚本,主要包括以下几个方面的演示:

  1. ToolBlock添加输入项,主要用于用户界面参数修改,然后以参数的形式传入ToolBlock,以影响算法工具。
  2. 通过函数绘制自定义图形Graphics,然后将其打印到ToolBlock的某一个图层中(在VP中常说的Record类似于PS中的图层)。
  3. 输出一个不常用的数据类型,PMAlign工具的运行结果对象,也就是CogPMAlignResults类型。

最终效果:
VisionPro_9.5中ToolBlock脚本编写&通过脚本绘制Record显示简单示例_第1张图片

2. 实现步骤:

  1. 在ToolBlock中添加一个CogPMAlignTool 工具,然后选择一张边缘对比较好的图像,训练模板。
    VisionPro_9.5中ToolBlock脚本编写&通过脚本绘制Record显示简单示例_第2张图片
  2. 选择ToolBlock的输出引脚类型–CogPMAlignResults
    VisionPro_9.5中ToolBlock脚本编写&通过脚本绘制Record显示简单示例_第3张图片
  3. 为当前ToolBlocl编写脚本,注意:这里选择C#高级脚本模式。
public class CogToolBlockAdvancedScript : CogToolBlockAdvancedScriptBase
{
       
  private Cognex.VisionPro.ToolBlock.CogToolBlock mToolBlock;
  private CogPMAlignTool pmaTool = new CogPMAlignTool();
  private CogGraphicCollection graphicList = new CogGraphicCollection();
  public override bool GroupRun(ref string message, ref CogToolResultConstants result)
  {
     
     //if (System.Diagnostics.Debugger.IsAttached) System.Diagnostics.Debugger.Break();
    graphicList.Clear();
   
    //初始化PMAlign工具
    pmaTool = mToolBlock.Tools["CogPMAlignTool1"]as CogPMAlignTool;
    
    //将ToolBlock的Inputs[SetCount]引脚设置为PMAlignTool的预期查找数量
    pmaTool.RunParams.ApproximateNumberToFind = (int) mToolBlock.Inputs["SetCount"].Value;

     //运行PMAlign工具
    pmaTool.Run();
    
     //获取结果,并将自定义图像添加到画板中
    foreach (CogPMAlignResult item in pmaTool.Results)
    {
     
      graphicList.Add(CreateCircle(item.GetPose().TranslationX, item.GetPose().TranslationY, 50, CogColorConstants.Green));
      graphicList.Add(CreatLabel("Score:" + item.Score.ToString("0.000"), 12, item.GetPose().TranslationX - 30, item.GetPose().TranslationY - 25, CogColorConstants.Green));
    }

    //将PMAlign工具的结果集合绑定到ToolBlock的输出
    mToolBlock.Outputs["ResultList"].Value = pmaTool.Results;
    
    //如果ToolBlock内的运行流程是自定义的,则返回false,否则如果按照正常流程执行则返回true
    return false;
  }
  
   /// 
  /// 绘制矩形
  /// 
  private CogRectangle CreatRectangle(double Postion_X, double Postion_Y, double Weight, double Height, CogColorConstants Color)
  {
     
    CogRectangle Rectangle = new CogRectangle();
    Rectangle.X = Postion_X;
    Rectangle.Y = Postion_Y;
    Rectangle.SetCenterWidthHeight(Rectangle.X, Rectangle.Y, Weight, Height);
    Rectangle.Color = Color;
    Rectangle.LineStyle = CogGraphicLineStyleConstants.Solid;
    Rectangle.LineWidthInScreenPixels = 5;
    return Rectangle;
  }

   /// 
  /// 绘制标签
  /// 
  private CogGraphicLabel CreatLabel(string text, float size, double x, double y, CogColorConstants Color)
  {
     
    CogGraphicLabel label = new CogGraphicLabel();
    label.Font = new Font("Arial", size, FontStyle.Bold, GraphicsUnit.Point);
    label.Color = Color;
    label.SetXYText(x, y, text);
    label.Alignment = CogGraphicLabelAlignmentConstants.TopLeft;
    return label;
  }

   /// 
  /// 绘制圆形
  /// 
  private CogCircle CreateCircle(double Center_X,double Center_Y,double Radius,CogColorConstants color)
  {
     
    CogCircle circle = new CogCircle();
    circle.CenterX = Center_X;
    circle.CenterY = Center_Y;
    circle.Radius = Radius;
    circle.Color = color;
    circle.LineStyle=CogGraphicLineStyleConstants.Solid;
    circle.LineWidthInScreenPixels = 3;
    return circle;
  }

   /// 
  /// 当上一次的记录发生改变,并正在重构时调用此函数
  /// 
  /// 新的运行记录
  public override void ModifyLastRunRecord(Cognex.VisionPro.ICogRecord lastRecord)
  {
     
    // 遍历画板,然后将自定义图形添加到ToolBlock的新的绘制记录上
    foreach (ICogGraphic item in graphicList)
    {
     
      mToolBlock.AddGraphicToRunRecord(item, lastRecord, "CogPMAlignTool1.InputImage", "Script");
    }
  }
}
  1. 开发程序中,在ToolBlock的Ran事件回调函数中显示,并获取结果。
 private void OnToolBlockRan(object sender, EventArgs e)
 {
     
     cogRecordDisplay2.Image = null;
     //将当前ToolBlock的Record显示在RecordDisplay控件上
     cogRecordDisplay2.Record = (CogRecord)cogToolBlock2.CreateLastRunRecord().SubRecords[0];
     cogRecordDisplay2.Fit(true);

     //获取ToolBlock的输出结果,然后显示DataGridView控件中
     List<DataObj> dataList = new List<DataObj>();
     CogPMAlignResults resultList = (CogPMAlignResults)cogToolBlock2.Outputs["ResultList"].Value;
     foreach (CogPMAlignResult item in resultList)
     {
     
        dataList.Add(new DataObj(item.ID, item.GetPose().TranslationX, item.GetPose().TranslationY, item.GetPose().Rotation, item.GetPose().Scaling, item.Score));
     }
     dgv_DataList.DataSource = dataList;
 }

以上如有错误,欢迎指正,谢谢。。

你可能感兴趣的:(Vision_Pro,c#)