实例介绍
【实例简介】
目的://此示例程序显示如何使用类HDevEngine和HDevOpMultiWindowImpl //来实现鳍检测应用程序。
//几乎所有应用程序的功能都包含在// HDevelop程序fin_detection.hdev中,该程序可以在//目录hdevelop中找到。
//当您单击按钮Load时,加载HDevelop程序,当您单击//执行它时执行。
// HDevOpMultiWindowImpl类实现了HDevelop的内部//运算符。
27.2例子
本节介绍如何使用基于C#和Visual Basic .NET的示例应用程序的HDevEngine / .NET,它们位于子目录 %HALCONEXAMPLES%\ hdevengine \ c#和 %HALCONEXAMPLES%\ hdevengine \ vb.net。在下文中,我们仅描述C#示例; 除了两种语言之间的标准差异外,Visual Basic .NET版本是相同的。此外,与C#版本相比,Visual Basic .NET版本不包含对Linux的支持。
执行HDevelop程序(“执行HDevelop程序”部分),
执行HDevelop程序(“执行HDevelop程序”一节)和
显示操作员(“显示”部分),
错误处理(“错误处理”部分),和
多线程(“创建多线程应用程序”一节)。
27.2.1执行HDevelop程序
在本节中,我们将介绍如何使用HDevEngine加载和执行HDevelop程序。代码片段来自示例应用程序 ExecProgram,它检查塑料部件的边界是否有鳍。图27.1显示了该应用程序的屏幕截图; 它包含两个用于加载和执行HDevelop程序的按钮。
图片/ exec_program_dotnet_h12
图27.1:执行检测边界上的鳍的HDevelop程序。
27.2.1.1第1步:初始化
首先,我们创建主HDevEngine类HDevEngine的全局实例 。
private HDevEngine MyEngine = new HDevEngine();
加载表单后,我们将路径存储到HDevelop程序并使用方法SetProcedurePath设置外部过程路径:
String ProgramPathString;
private void ExecProgramForm_Load(object sender,System.EventArgs e)
{
string halconExamples = HSystem.GetSystem(“example_dir”);
string ProcedurePath = halconExamples @“\ hdevengine \ procedures”;
ProgramPathString = halconExamples
@ “\ hdevengine \ hdevelop \ fin_detection.hdev”;
if(!HalconAPI.isWindows)
{
ProcedurePath = ProcedurePath.Replace('\\','/');
ProgramPathString = ProgramPathString.Replace('\\','/');
}
MyEngine.SetProcedurePath(ProcedurePath);
}
请注意,只有在HDevelop程序调用外部过程时才需要后者。
27.2.1.2第2步:加载程序
单击按钮加载HDevelop程序时,将创建HDevProgram类的实例,并将程序路径作为参数。此外,创建HDevProgramCall的实例供以后使用。构造函数中发生的异常(例如,因为未正确指定文件名)是使用标准C#错误处理机制处理的:
private void LoadBtn_Click(object sender,System.EventArgs e)
{
尝试
{
HDevProgram Program = new HDevProgram(ProgramPathString);
ProgramCall = new HDevProgramCall(Program);
}
catch(HDevEngineException Ex)
{
MessageBox.Show(Ex.Message,“HDevEngine异常”);
返回;
}
catch(例外)
{
返回;
}
//启用执行按钮
ExecuteBtn.Enabled = true;
}
有关错误处理的更多信息,请参见 “错误处理”部分。
27.2.1.3第3步:执行程序
单击按钮执行程序时,将调用方法mHDEExecuteName:
private void ExecuteBtn_Click(object sender,System.EventArgs e)
{
尝试
{
尝试
{
ProgramCall.Execute();
}
catch(HDevEngineException Ex)
{
MessageBox.Show(Ex.Message,“HDevEngine异常”);
返回;
}
}
catch(例外)
{
}
}
27.2.1.4第4步:获得结果
这就是执行HDevelop程序所需要做的一切。您还可以使用方法GetCtrlVarTuple访问其“结果”,即其变量。在示例程序中,查询提取的fin的区域,然后显示:
双FinArea;
FinArea = ProgramCall.GetCtrlVarTuple(“FinArea”);
Window.SetTposition(150,20);
Window.WriteString(“Fin Area:”);
请注意,只有在程序终止时才能访问程序变量。
27.2.1.5概述:显示结果
如何在程序运行时显示结果将在“显示”部分中介绍 。
27.2.2执行HDevelop程序
【实例截图】
【核心代码】
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using HalconDotNet;
namespace ExecProgram
{
/// <summary>
/// ExecProgramForm 类窗体
/// </summary>
public class ExecProgramForm : System.Windows.Forms.Form
{
private HalconDotNet.HWindowControl WindowControl;
internal System.Windows.Forms.Button LoadBtn;
internal System.Windows.Forms.Button ExecuteBtn;
/// <summary>
/// 必需的设计变量-组件
/// </summary>
private System.ComponentModel.Container components = null;
//第1步:初始化创建主 HDevEngine 类 HDevEngine 的全局实例 。
private HDevEngine MyEngine = new HDevEngine();
// 程序调用的实例
private HDevProgramCall ProgramCall;
// halcon文件的path //1-2加载表单后,我们将路径存储到HDevelop程序并使用方法 SetProcedurePath 设置外部过程路径
String ProgramPathString;
// Hw
private HWindow Hw;
/// <summary>
/// A-主窗体加载
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void ExecProgramForm_Load(object sender, System.EventArgs e)
{
// 外部程序的路径
//string halconExamples = HSystem.GetSystem("example_dir"); //"C:\\Users\\Public\\Documents\\MVTec\\HALCON-12.0\\examples"
string halconExamples = ("A:\\5-亿善插针有无检测");
string ProcedurePath = halconExamples @"\hdevengine\procedures";
ProgramPathString = halconExamples @"\Blob分析出仿真.hdev";
MyEngine.SetProcedurePath(ProcedurePath); //使用方法 SetProcedurePath 设置外部过程路径
// 禁用执行按钮
ExecuteBtn.Enabled = false;
}
/// <summary>
/// B-Hw 加载初始化
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void WindowControl_HInitWindow(object sender, System.EventArgs e)
{
Hw = WindowControl.HalconWindow;
// Warning: Convenience implementation for rerouting display operators is not thread-safe, use it only to execute programs in the main thread.警告:重新路由显示操作符的便捷实现不是线程安全的,仅用于在主线程中执行程序。
MyEngine.SetHDevOperators(new HDevOpMultiWindowImpl(Hw)); //// HDevOpMultiWindowImpl类实现了HDevelop的内部运算符。
}
//C-2第2步:加载程序按钮
private void LoadBtn_Click(object sender, System.EventArgs e)
{
try
{
//初始化创建主 Program实例 。
HDevProgram Program = new HDevProgram(ProgramPathString);
ProgramCall = new HDevProgramCall(Program);
}
catch (HDevEngineException Ex)
{
MessageBox.Show(Ex.Message, "HDevEngine 异常");
return;
}
//启用执行按钮
ExecuteBtn.Enabled = true;
}
//D-第3步:执行程序按钮
private void ExecuteBtn_Click(object sender, System.EventArgs e)
{
double Length1;
try
{
ProgramCall.Execute(); //执行实例
Length1 = ProgramCall.GetCtrlVarTuple("Length1"); // 获取控件变量的值(在main中)
}
catch (HDevEngineException Ex)
{
MessageBox.Show(Ex.Message, "HDevEngine 异常");
return;
}
// 第4步:获得结果display result
Hw.SetTposition(150, 20);
Hw.WriteString("Length1: ");
Hw.WriteString(String.Format("{0:G}", Length1));
}
public ExecProgramForm()
{
InitializeComponent();
//
// TODO: 在InitializeComponent调用后添加任何构造函数代码
//
}
/// <summary>
/// 清理正在使用的所有资源。
/// </summary>
protected override void Dispose( bool disposing )
{
if( disposing )
{
if (components != null)
{
components.Dispose();
}
}
base.Dispose( disposing );
}
#region Designer支持所需的方法Windows Form Designer generated code
/// <summary>
/// Designer支持所需的方法 - 不要修改
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.WindowControl = new HalconDotNet.HWindowControl();
this.LoadBtn = new System.Windows.Forms.Button();
this.ExecuteBtn = new System.Windows.Forms.Button();
this.SuspendLayout();
//
// WindowControl
//
this.WindowControl.BackColor = System.Drawing.Color.Black;
this.WindowControl.BorderColor = System.Drawing.Color.Black;
this.WindowControl.ImagePart = new System.Drawing.Rectangle(0, 0, 768, 576);
this.WindowControl.Location = new System.Drawing.Point(9, 9);
this.WindowControl.Name = "WindowControl";
this.WindowControl.Size = new System.Drawing.Size(850, 409);
this.WindowControl.TabIndex = 0;
this.WindowControl.WindowSize = new System.Drawing.Size(850, 409);
this.WindowControl.HInitWindow = new HalconDotNet.HInitWindowEventHandler(this.WindowControl_HInitWindow);
//
// LoadBtn
//
this.LoadBtn.Location = new System.Drawing.Point(944, 17);
this.LoadBtn.Name = "LoadBtn";
this.LoadBtn.Size = new System.Drawing.Size(100, 24);
this.LoadBtn.TabIndex = 3;
this.LoadBtn.Text = "加载hdev";
this.LoadBtn.Click = new System.EventHandler(this.LoadBtn_Click);
//
// ExecuteBtn
//
this.ExecuteBtn.Location = new System.Drawing.Point(944, 81);
this.ExecuteBtn.Name = "ExecuteBtn";
this.ExecuteBtn.Size = new System.Drawing.Size(100, 25);
this.ExecuteBtn.TabIndex = 6;
this.ExecuteBtn.Text = "执行hdev ";
this.ExecuteBtn.Click = new System.EventHandler(this.ExecuteBtn_Click);
//
// ExecProgramForm
//
this.AutoScaleBaseSize = new System.Drawing.Size(6, 14);
this.ClientSize = new System.Drawing.Size(1079, 443);
this.Controls.Add(this.ExecuteBtn);
this.Controls.Add(this.LoadBtn);
this.Controls.Add(this.WindowControl);
this.Name = "ExecProgramForm";
this.Text = "HDevEngine";
this.Load = new System.EventHandler(this.ExecProgramForm_Load);
this.ResumeLayout(false);
}
#endregion
[STAThread]
static void Main()
{
Application.Run(new ExecProgramForm());
}
}
//#region 来自网络,参考学习用
//public class Engine
//{
// private HDevEngine engine = new HDevEngine(); //engine类
// private HDevProgramCall programCall;
// private string programPath;
// private string procedurePath;
// private HDevOpMultiWindowImpl MyHDevOperatorImpl; // HDevOpMultiWindowImpl类实现了HDevelop的内部运算符。
// public void initialengine(string filename)
// {
// programPath = System.Environment.CurrentDirectory @"" filename ".hdev";
// procedurePath = System.Environment.CurrentDirectory @"";
// if (!HalconAPI.isWindows)
// {
// }
// engine.SetProcedurePath(procedurePath);
// // viewPort.HalconWindow.SetLineWidth(4);
// MyHDevOperatorImpl = new HDevOpMultiWindowImpl( );
// engine.SetHDevOperators(MyHDevOperatorImpl);
// }
// public void loadengine()
// {
// try
// {
// HDevProgram program = new HDevProgram(programPath);
// programCall = new HDevProgramCall(program);
// }
// catch { }
// }
// public void disposeengine()
// {
// try
// {
// programCall.Dispose();
// }
// catch { }
// }
// public void inspectengine()
// {
// try
// {
// programCall.Execute();
// }
// catch { }
// }
//}
//
// #endregion
}
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明
网友评论
我要评论