实例介绍
【实例简介】
目的://此示例程序显示如何使用类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程序
【实例截图】
【核心代码】
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 | 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 }<span><span> </span></span> |
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明
网友评论
我要评论