这是我自学程序以来在博客园的第一篇博客,如有不好的地方请大家指正,谢谢!

这边文章的目的是给予那些在PCB使用Genesis2000程序脚本开发的人员提供.net平台下的开发方法。

目前genesis脚本的开发的语言主要为cshell,perl和tcl,相对于学过c#的人需要学习成本,我打听过用C#开发脚本的接口的价格最少都需要1000块钱,本着开源的思想我吧这几天研究的成果公布发表给大家!

1.genesis脚本的运行机制(这里拿cshell来说),(以我的电脑来举例子)首先程序要运行c:\genesis\e100\all\scr_start.csh,然后运行c:\genesis\sys\hooks\script_start.csh,最后再运行脚本;

详细看附件

2.不管怎么样子的脚本都是基于命令行的,如windows上的cmd;

知道了这两个条件下面我们开始编写genesis辅助类

  1. using System;
  2. using System.Diagnostics;
  3. using System.IO;
  4. using System.Runtime.InteropServices;
  5.  
  6. public class Genesis
  7. {
  8.  
  9. public string prefix, lmc, msg;
  10. public string READANS, COMANS, PAUSANS, MOUSEANS;
  11. public int STATUS=0;
  12. public System.IO.StreamReader conv;
  13. public System.IO.StreamReader @in;
  14.  
  15. public Genesis()
  16. {
  17. //exe程序发送指令需要以这个字符串开头,genesis才会识别
  18. this.prefix = "@%#%@";
  19. this.blank();
  20. return;
  21. }
  22.  
  23. public virtual void blank()
  24. {
  25. this.STATUS = 0;
  26. this.READANS = "";
  27. this.COMANS = "";
  28. this.PAUSANS = "";
  29. this.MOUSEANS = "";
  30. return;
  31. }
  32. /// <summary>
  33. /// 执行指令
  34. /// </summary>
  35. /// <param name="cmd"></param>
  36. /// <param name="arg"></param>
  37. /// <returns></returns>
  38.  
  39. public virtual int sendCmd(string cmd, string arg)
  40. {
  41.  
  42. this.blank();
  43.  
  44. this.lmc = this.prefix + cmd + " " + arg + "\n";
  45. Console.Write(this.lmc);
  46.  
  47. return 0;
  48. }
  49.  
  50. /// <summary>
  51. /// 执行genesis2000 line mode command动作
  52. /// </summary>
  53. /// <param name="arg">指令</param>
  54. /// <returns></returns>
  55. public virtual int COM(string arg)
  56. {
  57.  
  58. this.sendCmd("COM", arg);
  59.  
  60. try
  61. {
  62.  
  63. int.TryParse(Console.ReadLine(),out STATUS);
  64. this.COMANS = Console.ReadLine();
  65. this.READANS = this.COMANS;
  66. }
  67. catch (IOException e)
  68. {
  69.  
  70. Console.WriteLine("IO Error: " + e.Message);
  71. }
  72. return this.STATUS;
  73. }
  74.  
  75. /// <summary>
  76. /// 用于暂停当前运行程序,等待用户做其它动作后继续执行程序或无条件退出程序。
  77. /// </summary>
  78. /// <param name="msg"></param>
  79. /// <returns></returns>
  80. public virtual int PAUSE(string msg)
  81. {
  82.  
  83. this.sendCmd("PAUSE", msg);
  84.  
  85. try
  86. {
  87.  
  88. int.TryParse(Console.ReadLine(), out this.STATUS);
  89. this.READANS = Console.ReadLine();
  90. this.PAUSANS = Console.ReadLine();
  91. }
  92. catch (IOException e)
  93. {
  94. Console.WriteLine("IO Error: " + e.Message);
  95. }
  96. return this.STATUS;
  97. }
  98. /// <summary>
  99. /// 设置活动工作界面
  100. /// </summary>
  101. /// <param name="arg">指令</param>
  102. /// <returns></returns>
  103. public virtual int AUX(string arg)
  104. {
  105. this.sendCmd("AUX", msg);
  106.  
  107. try
  108. {
  109. //this.STATUS = this.in.readLine();
  110. this.STATUS = int.Parse(Console.ReadLine());
  111. this.COMANS = Console.ReadLine();
  112. }
  113. catch (IOException e)
  114. {
  115. Console.WriteLine("IO Error: " + e.Message);
  116. }
  117. return this.STATUS;
  118. }
  119.  
  120. /// <summary>
  121. /// 用于获取鼠标点击位置坐标。
  122. /// </summary>
  123. /// <param name="msg"></param>
  124. /// <param name="mode"></param>
  125. /// <returns></returns>
  126.  
  127. public virtual int MOUSE(string msg, string mode)
  128. {
  129.  
  130. this.sendCmd("MOUSE " + mode, msg);
  131.  
  132. try
  133. {
  134.  
  135. int.TryParse(Console.ReadLine(),out STATUS);
  136. this.READANS = Console.ReadLine();
  137. this.MOUSEANS = Console.ReadLine();
  138. }
  139.  
  140. catch (IOException e)
  141. {
  142. Console.WriteLine("IO Error: " + e.Message);
  143. }
  144. return this.STATUS;
  145. }
  146.  
  147. /// <summary>
  148. /// 指令的主要目的是当我们有些程序需要用超级用户才能执行的时候,我们用SU_ON打开超级用户,然后执行程序。
  149. /// </summary>
  150. /// <returns></returns>
  151. public virtual int SU_ON()
  152. {
  153. this.sendCmd("SU_ON", "");
  154. return 0;
  155. }
  156. /// <summary>
  157. /// 为退出由SU_ON打开的超级用户模式
  158. /// </summary>
  159. /// <returns></returns>
  160. public virtual int SU_OFF()
  161. {
  162. this.sendCmd("SU_OFF", "");
  163. return 0;
  164. }
  165. /// <summary>
  166. /// VON主要用于取得VOF的结果,然后执行其它的一些指令
  167. /// </summary>
  168. /// <returns></returns>
  169. public virtual int VON()
  170. {
  171. this.sendCmd("VON", "");
  172. return 0;
  173. }
  174. /// <summary>
  175. /// 该指令主要用于设置执行有可能出现错误的动作,并利用status得到结果,并经常结合VON使用
  176. /// </summary>
  177. /// <returns></returns>
  178.  
  179. public virtual int VOF()
  180. {
  181. this.sendCmd("VOF", "");
  182. return 0;
  183. }
  184.  
  185. }

  有了这个类我们的开发就可以开始了,打开vs,新建一个控制台程序

添加一个Form

在program类里面的main函数里面添加如下的代码

Application.Run(new Form1());

在form里面添加一个按钮来测试代码

双击开始按钮写点击事件的代码

  1. private void button1_Click(object sender, EventArgs e)
  2. {
  3.  
  4. string dbname = "genesis";
  5. string jobname = textBox1.Text;
  6.  
  7. Console.WriteLine("Instantiated the Genesis Object...");
  8.  
  9. string msg = "Welcome to the Java test Script...apparently its working...";
  10. Console.WriteLine(msg);
  11.  
  12. gen.PAUSE(msg);
  13.  
  14. gen.COM("create_entity,job=,is_fw=no,type=job,name=" + jobname + ",db=" + dbname + ",fw_type=form");
  15. gen.COM("clipb_open_job,job=" + jobname + ",update_clipboard=view_job");
  16. gen.COM("open_job,job=" + jobname);
  17. gen.COM("open_entity,job=" + jobname + ",type=matrix,name=matrix,iconic=no");
  18. gen.COM("matrix_add_step,job=" + jobname + ",matrix=matrix,step=test,col=1");
  19. gen.COM("matrix_add_layer,job=" + jobname + ",matrix=matrix,layer=lay1,row=1,context=board,type=signal,polarity=positive");
  20. gen.COM("matrix_add_layer,job=" + jobname + ",matrix=matrix,layer=lay2,row=2,context=board,type=signal,polarity=positive");
  21.  
  22. string msg2 = "Now we'll open the newly created step...";
  23. Console.WriteLine(msg2);
  24.  
  25. gen.PAUSE(msg2);
  26.  
  27. gen.COM("open_entity,job=" + jobname + ",type=step,name=test,iconic=no");
  28. string group = gen.COMANS;
  29. gen.PAUSE("Group number is " + group);
  30.  
  31. gen.COM("units,type=inch");
  32. gen.COM("display_layer,name=lay1,display=yes,number=1");
  33. gen.COM("work_layer,name=lay1");
  34. gen.COM("display_layer,name=lay2,display=yes,number=2");
  35. gen.COM("profile_rect,x1=0,y1=0,x2=5,y2=5");
  36. gen.COM("zoom_home");
  37. gen.COM("add_line,attributes=no,xs=0.6239601378,ys=0.5049917323,xe=4.6505824803,ye=4.5865225394,symbol=r40,polarity=positive");
  38. gen.COM("work_layer,name=lay2");
  39. gen.COM("add_line,attributes=no,xs=0.5049917323,ys=4.4675541339,xe=4.4584027559,ye=0.4409318898,symbol=r40,polarity=positive");
  40.  
  41. gen.MOUSE("Click a point", "p");
  42. Console.WriteLine("Mouseans : " + gen.MOUSEANS);
  43.  
  44. Console.WriteLine("Checking return of Genesis object...");
  45. Console.WriteLine("genStatus : " + Convert.ToString(gen.STATUS));
  46. Console.WriteLine("genComans : " + gen.COMANS);
  47.  
  48. string msg3 = "Now we'll clean up...";
  49. Console.WriteLine(msg3);
  50.  
  51. gen.PAUSE(msg3);
  52.  
  53. gen.COM("check_inout,mode=in,type=job,job=" + jobname);
  54. gen.COM("close_job,job=" + jobname);
  55. gen.COM("close_form,job=" + jobname);
  56. gen.COM("close_flow,job=" + jobname);
  57. gen.COM("delete_entity,job=,type=job,name=" + jobname);
  58.  
  59. Console.WriteLine("genStatus : " + Convert.ToString(gen.STATUS));
  60. Console.WriteLine("genComans : " + gen.COMANS);
  61.  
  62. string msg4 = "Thats it...";
  63. Console.WriteLine(msg4);
  64.  
  65. gen.PAUSE(msg4);
  66.  
  67. Application.Exit();
  68.  
  69. }

  genesis和程序之间的通讯都是通过Console类来实现的

现在程序写好了,但在测试程序之前我们需要把src_start.csh文件修改一下让它支持直接实行EXE文件

  1. #!/bin/csh
  2. #
  3. # Mike J. Hopkins
  4. # Genesis 2000 scr_start.csh
  5. # revision 1.4.1
  6. #
  7. # This version of the scr_start.csh script includes
  8. # support for the Python programming language,
  9. # as well as Java and binary execuables...
  10. #
  11. #
  12. if($?GENESIS_DIR)then
  13. set _genesis_root=$GENESIS_DIR
  14. else
  15. set _genesis_root=/genesis
  16. endif
  17.  
  18. if($?GENESIS_EDIR)then
  19. set _genesis_edir=$GENESIS_EDIR
  20. else
  21. set _genesis_edir=e$GENESIS_VER
  22. endif
  23.  
  24. if($_genesis_edir =~ /* || $_genesis_edir =~ ?:*)then
  25. set path=($_genesis_edir/all $path)
  26. else
  27. set path=($_genesis_root/$_genesis_edir/all $path)
  28. endif
  29.  
  30. set STATUS=0
  31. set PROG=$1
  32. if(! -e $PROG)then
  33. set PROG_STATUS=1
  34. goto end
  35. endif
  36.  
  37. # define aliases
  38. set DIR_PREFIX='@%#%@'
  39.  
  40. alias VON 'echo "${DIR_PREFIX}VON";'
  41. alias VOF 'echo "${DIR_PREFIX}VOF";'
  42.  
  43. alias SU_ON 'echo "${DIR_PREFIX}SU_ON";'
  44. alias SU_OFF 'echo "${DIR_PREFIX}SU_OFF";'
  45.  
  46. alias PAUSE 'echo "${DIR_PREFIX}PAUSE \!:*"; \\
  47. set STATUS=$<; set READANS=$<; set PAUSANS=$<; \\
  48. if ($PAUSANS != "OK") exit'
  49. alias MOUSE 'echo "${DIR_PREFIX}MOUSE \!:*"; \\
  50. set STATUS=$<; set READANS=$<; set MOUSEANS="$<"'
  51. alias COM 'echo "${DIR_PREFIX}COM \!:*"; \\
  52. set STATUS=$<; set READANS="$<"; set COMANS=($READANS)'
  53. alias AUX 'echo "${DIR_PREFIX}AUX \!:*"; \\
  54. set STATUS=$<; set READANS="$<"; set COMANS=($READANS)'
  55.  
  56. set argv = ($2)
  57.  
  58. #executing hook script
  59. if(-e $_genesis_root/sys/hooks/script_start.csh)then
  60. source $_genesis_root/sys/hooks/script_start.csh
  61. endif
  62.  
  63. # check first line of program
  64. set _HEAD=`head -1 $PROG`
  65. set _EXT=`echo $PROG:e`
  66.  
  67. if("$_HEAD" =~ *perl*)then
  68. echo "Executing Perl Program $PROG $argv"
  69. perl $PROG $argv
  70. set PROG_STATUS=$status
  71. else if("$_HEAD" =~ *python*)then
  72. echo "Executing Python Program $PROG $argv"
  73. python $PROG $argv
  74. set PROG_STATUS=$status
  75. else if("$_HEAD" =~ *wish*)then
  76. setenv TCSHONLYSTARTEXES 1
  77. echo "Executing TCL Program $PROG $argv"
  78. $_genesis_root/sys/hooks/wish_start.tcl $PROG $argv
  79. set PROG_STATUS=$status
  80. else if ("$_EXT" =~ [Cc][Ll][Aa][Ss][Ss]) then
  81. set JPATH = `echo $PROG:h`
  82. set JPROG = `echo $PROG:t`
  83. set JCLASS = `echo $JPROG:r`
  84. setenv CLASSPATH $JPATH
  85. echo "Set CLASSPATH to: $CLASSPATH"
  86. echo "Executing JavaClass $JCLASS $argv"
  87. echo "..."
  88. java $JCLASS $argv
  89. set PROG_STATUS=$status
  90. else if ("$_EXT" =~ [Ee][Xx][Ee]) then
  91. echo "Executing Compiled Program $PROG $argv"
  92. $PROG $argv
  93. set PROG_STATUS=$status
  94. else
  95. echo "Executing C Shell Program $PROG"
  96. source $PROG
  97. set PROG_STATUS=$status
  98. endif
  99.  
  100. end:
  101. exit($PROG_STATUS)

 改好保存下面可以打开genesis运行脚本了

在文本框里面输入想要新建的工作名称点击开始按钮运行

程序写到这里就完成了!有不明白的可以联系我!307209239@qq.com

Genesis2000使用c#开发脚本的更多相关文章

  1. LoadRunner:VuGen开发脚本步骤(一)

    一.测试过程 1.规划测试:分析应用程序.定义测试目标.方案实施. 2.创建Vuser脚本. 3.创建方案:方案包括运行 Vuser 的计算机的列表.运行 Vuser 脚本的列表以及在方案执行期间运行 ...

  2. linux基础 -nginx和nfs代理 开发脚本自动部署及监控

    开发脚本自动部署及监控 1.编写脚本自动部署反向代理.web.nfs: (1).部署nginx反向代理三个web服务,调度算法使用加权轮询:  (2).所有web服务使用共享存储nfs,保证所有web ...

  3. linux开发脚本自动部署及监控

    linux开发脚本自动部署及监控 开发脚本自动部署及监控一.编写脚本自动部署反向代理.web.nfs:要求:1.部署nginx反向代理三个web服务,调度算法使用加权轮询: #!/bin/sh ngx ...

  4. 使用Jena RDF API 开发脚本语言管理资源描述框架模型

    摘要 资源描述框架(Resource Description Framework RDF)是一种以XML格式描述元数据的标准格式.Jena是一种用于将关系数据库或是文本文件中所表示的数据建立为元数据模 ...

  5. Genesis2000用c#开发外挂

    先上官方的说明 gateway is a command line utility for sending messages and commands to Genesis processes. Th ...

  6. 【unity3d游戏开发脚本笔记之一:坐标系选择对物体运动的影响】

    时间:2016年9月24日17:38:21   作者:yexiaopeng 博客园     在unity3d的世界中,其坐标系可分为四种,世界坐标系-WorldSpace   本地坐标系-LocalS ...

  7. 简单的WPS二次开发脚本

    详细信息见:http://bbs.wps.cn/thread-22427301-1-1.html 下载:WPS2013专业版:WPS2013Pro_normal.exe 调用脚本(xl.vbs)内容如 ...

  8. LoadRunner:VuGen开发脚本步骤(二)

    一.介绍 Loadrunner的场景能够描述在测试活动中发生的各种事件.一个场景包括一个运行虚拟用 户活动的Load Generator 机器列表,一个测试脚本的列表以及大量的虚拟用户和虚拟用户组 二 ...

  9. Unity 3D 开发 —— 脚本编程

    Unity 相关资源 Unity 官网 :http://www.unity3D.com Unity 论坛 : http://forum.unity3d.com/forum.php Unity 问答 : ...

随机推荐

  1. 【优雅代码】深入浅出 妙用Javascript中apply、call、bind

    这篇文章实在是很难下笔,因为网上相关文章不胜枚举. 巧合的是前些天看到阮老师的一篇文章的一句话: “对我来说,博客首先是一种知识管理工具,其次才是传播工具.我的技术文章,主要用来整理我还不懂的知识.我 ...

  2. 进一步封装highchart,打造自己的图表插件:jHighChart.js

    Highcharts 是一个用纯JavaScript编写的一个图表库, 能够很简单便捷的在web网站或是web应用程序添加有交互性的图表.支持的图表类型有曲线图.区域图.柱状图.饼状图.散状点图和综合 ...

  3. 几个SQL小知识

    写在前面的话:之前做的一个项目,数据库及系统整体构架设计完成之后,和弟兄们经过一段时间的编码,系统如期上线,刚开始运行一切良好,后来随着数据量的急剧膨胀,慢慢出现了很多莫名其妙的问题,经过调试,修改了 ...

  4. 通过圆形载入View了解自定义View

    这是自定义View的第一篇文章,通过制作简单的自定义View来了解自定义View的流程. 自定义View是Android学习和开发中必不可少的一部分.通过自定义View我们可以制作丰富绚丽的控件,自定 ...

  5. WebDriver--操控浏览器

    前一篇讲述了元素的定位方法,现在开始练习如何写自动化测试脚本 我使用的编辑工具是PyCharm,今后该博客中所写的有关Python脚本,都是在该工具中编写的. WebDriver提供了控制浏览器大小. ...

  6. WebDriver API元素的定位

    一.以下截图为用FireBug定位的用火狐(Firefox)浏览器打开的百度首页,下面所讲述的八种定位方法,就是以该截图中的百度输入框为例子. ①.FireBug是Firefox浏览器下的开发类插件, ...

  7. Ado.Net Destination 用法

    Ado Net Destination Component 使用Ado net Connection manager,其Data Access Mode 只有一种, table or view,组件的 ...

  8. MVC:The name 'Scripts' does not exist in the current context

    汇总:http://www.cnblogs.com/dunitian/p/4523006.html#efmvc 解决:在View下面的Web.Config的namespaces添加 <add n ...

  9. Wireshark图解教程(简介、抓包、过滤器)

    开篇语 Wireshark是世界上最流行的网络分析工具.这个强大的工具可以捕捉网络中的数据,并为用户提供关于网络和上层协议的各种信息.与很多其他网络工具一样,Wireshark也使用pcap netw ...

  10. 处理UnicodeDecodeError: ‘XXX' codec can't decode bytes in position...的问题

    错误信息: UnicodeDecodeError: ‘XXX' codec can't decode bytes in position 2-5: illegal multibyte sequence ...