我自己的编写环境
- VS2017,VS2022是不行的添加加载工具项时会卡死,其它的也就没试过了
- 使用的是C#进行编写
- VisionPro为8.3版本,囊中羞涩嘛,可以看看VisionPro学习笔记—加载图片、转为灰色图、取相机列表和VisionPro学习笔记可能对你有一定的帮助
首先创建C#自定义控件
- 选择Windows 窗体控件库 进行创建,名称按照自己的来,然后就是框架了不要选择太高我这里选择的是4.5
2. 引用Cognex.VisionPro和Cognex.VisionPro.Controls,如果没有就先去工具箱添加工具项
还有一个简单的方法,就是在添加好工具项后找一个控件cogPMAlignEditV2直接添加到自定义控件中就行了会自动引用的把其它的删除掉留下Cognex.VisionPro和Cognex.VisionPro.Controls就行(不删也行不影响使用)
3. 将自定义控件名称修改成myCogToolEdit方便使用
4. 进入myCogToolEdit代码页修改页面继承接口为CogToolEditControlBaseV2并且添加命名空间using Cognex.VisionPro回到自定义控件界面就变成VisionPro自定义控件的基础界面了
5. 添加一个名为myCogTool1的类文件
6. 将类的命名空间改为Cognex.VisionPro.ExtraTools
7. 将类设置成公开类并且继承与CogToolBase,再使用C#的实现抽象类的功能自动添加特定函数并删除函数中的throw new NotImplementedException();
再进行一些处理
using Cognex.VisionPro.Implementation;
using myCogTool;
using System;
using System.ComponentModel;
using System.Runtime.Serialization;
using System.Windows.Forms;
namespace Cognex.VisionPro.ExtraTools
{
[Serializable]
[CogDefaultToolInputTerminal(0, "InputImage", "InputImage")]
[CogDefaultToolOutputTerminal(0, "MaskImage", "MaskImage")]
[Editor(typeof(myCogToolEdit), typeof(Control))]
public class myCogTool1:CogToolBase
{
/// <summary>
/// 用默认值初始化一个新对象
/// </summary>
public myCogTool1()
{
}
/// <summary>
/// 拷贝构造函数。用另一个对象的成员值初始化一个对象
/// </summary>
/// <param name="src">要复制的工具</param>
public myCogTool1(myCogTool1 src) : base(src)
{
}
/// <summary>
/// 克隆功能,使用复制构造函数将类克隆为新对象
/// </summary>
/// <returns></returns>
protected override object Clone()
{
Object newObj = new myCogTool1(this);
return newObj;
}
/// <summary>
/// Required for saving the tool. No code needed in this
/// function as it is handled by the base class
///保存工具时需要。此文件中不需要任何代码函数,因为它是由基类处理的
/// </summary>
/// <param name="info"></param>
/// <param name="context"></param>
private myCogTool1(SerializationInfo info, StreamingContext context) : base(info, context)
{
}
/// <summary>
/// 由CreateCurrentRecord方法调用,用于创建包含工具当前状态的记录。
/// </summary>
/// <param name="newRecord">新创建的当前记录,派生工具可以向其添加新的子记录</param>
/// <param name="currentRecordEnable">CurrentRecordEnable属性的值</param>
protected override void InternalCreateCurrentRecord(ICogRecord newRecord, int currentRecordEnable)
{
}
/// <summary>
/// 由CreateLastRunRecord方法调用,用于创建包含工具在最后一次调用其Run方法后的状态的记录。
/// </summary>
/// <param name="newRecord">新创建的LastRun记录,派生工具可以向其添加新的子记录</param>
/// <param name="lastRunRecordEnable">lastunrecordenable属性在最后一次调用其Run方法时的值</param>
/// <param name="lastRunRecordDiagEnable">lastunrecorddiagenable属性在最后一次调用其Run方法时的值</param>
protected override void InternalCreateLastRunRecord(ICogRecord newRecord, int lastRunRecordEnable, int lastRunRecordDiagEnable)
{
}
/// <summary>
/// 由Run方法调用,以执行工具的主要处理
/// </summary>
/// <param name="message">可以在InternalRun函数中设置,以便在RunStatus对象中保存消息</param>
/// <returns></returns>
protected override CogToolResultConstants InternalRun(ref string message)
{
message = "消息已经弹出";
MessageBox.Show("这是由自定义控件myCogTool弹出的窗口");
return CogToolResultConstants.Accept;
}
}
}
- 再在自定义控件代码页添加一个Subject属性就大功告成了
public myCogTool1 Subject
{
get { return (Cognex.VisionPro.ExtraTools.myCogTool1)base.GetSubject(); }
set
{
if (base.GetSubject() != value)
{
base.SetSubject(value);
}
}
}
这里有点问题就是Cognex.VisionPro.ExtraTools这一段
- 启动生成,然后你会看到一个界面然后你点击Run按钮会发现没有弹出窗口,因为还要进行处理
生成VTT文件
- 新建一个项目设置成启动项并且引用上面生成的自定义控件(myCogTool.dll)
public Form1()
{
InitializeComponent();
myCogTool1 mycogTool = new myCogTool1();
CogSerializer.SaveObjectToFile(mycogTool, Directory.GetCurrentDirectory() + "\\myCogTool.vtt");
}
- 生成后在bin\Debug文件中找到下面两个文件
将myCogTool.dll文件放到VisionPro的安装目录
将myCogTool.vtt文件放到VisionPro的安装目录下Templates\Tools\Extra Tools文件夹中,如果没有自己创建一下Extra Tools文件夹
- 控件图标的话就和文件名称一样就行myCogTool.ico,打开VisionPro的工具箱就能看到了
4.点击运行就能看到了,两种方式运行都行