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

这边文章的目的是给予那些在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辅助类

using System;
using System.Diagnostics;
using System.IO;
using System.Runtime.InteropServices; public class Genesis
{ public string prefix, lmc, msg;
public string READANS, COMANS, PAUSANS, MOUSEANS;
public int STATUS=0;
public System.IO.StreamReader conv;
public System.IO.StreamReader @in; public Genesis()
{
//exe程序发送指令需要以这个字符串开头,genesis才会识别
this.prefix = "@%#%@";
this.blank();
return;
} public virtual void blank()
{
this.STATUS = 0;
this.READANS = "";
this.COMANS = "";
this.PAUSANS = "";
this.MOUSEANS = "";
return;
}
/// <summary>
/// 执行指令
/// </summary>
/// <param name="cmd"></param>
/// <param name="arg"></param>
/// <returns></returns> public virtual int sendCmd(string cmd, string arg)
{ this.blank(); this.lmc = this.prefix + cmd + " " + arg + "\n";
Console.Write(this.lmc); return 0;
} /// <summary>
/// 执行genesis2000 line mode command动作
/// </summary>
/// <param name="arg">指令</param>
/// <returns></returns>
public virtual int COM(string arg)
{ this.sendCmd("COM", arg); try
{ int.TryParse(Console.ReadLine(),out STATUS);
this.COMANS = Console.ReadLine();
this.READANS = this.COMANS;
}
catch (IOException e)
{ Console.WriteLine("IO Error: " + e.Message);
}
return this.STATUS;
} /// <summary>
/// 用于暂停当前运行程序,等待用户做其它动作后继续执行程序或无条件退出程序。
/// </summary>
/// <param name="msg"></param>
/// <returns></returns>
public virtual int PAUSE(string msg)
{ this.sendCmd("PAUSE", msg); try
{ int.TryParse(Console.ReadLine(), out this.STATUS);
this.READANS = Console.ReadLine();
this.PAUSANS = Console.ReadLine();
}
catch (IOException e)
{
Console.WriteLine("IO Error: " + e.Message);
}
return this.STATUS;
}
/// <summary>
/// 设置活动工作界面
/// </summary>
/// <param name="arg">指令</param>
/// <returns></returns>
public virtual int AUX(string arg)
{
this.sendCmd("AUX", msg); try
{
//this.STATUS = this.in.readLine();
this.STATUS = int.Parse(Console.ReadLine());
this.COMANS = Console.ReadLine();
}
catch (IOException e)
{
Console.WriteLine("IO Error: " + e.Message);
}
return this.STATUS;
} /// <summary>
/// 用于获取鼠标点击位置坐标。
/// </summary>
/// <param name="msg"></param>
/// <param name="mode"></param>
/// <returns></returns> public virtual int MOUSE(string msg, string mode)
{ this.sendCmd("MOUSE " + mode, msg); try
{ int.TryParse(Console.ReadLine(),out STATUS);
this.READANS = Console.ReadLine();
this.MOUSEANS = Console.ReadLine();
} catch (IOException e)
{
Console.WriteLine("IO Error: " + e.Message);
}
return this.STATUS;
} /// <summary>
/// 指令的主要目的是当我们有些程序需要用超级用户才能执行的时候,我们用SU_ON打开超级用户,然后执行程序。
/// </summary>
/// <returns></returns>
public virtual int SU_ON()
{
this.sendCmd("SU_ON", "");
return 0;
}
/// <summary>
/// 为退出由SU_ON打开的超级用户模式
/// </summary>
/// <returns></returns>
public virtual int SU_OFF()
{
this.sendCmd("SU_OFF", "");
return 0;
}
/// <summary>
/// VON主要用于取得VOF的结果,然后执行其它的一些指令
/// </summary>
/// <returns></returns>
public virtual int VON()
{
this.sendCmd("VON", "");
return 0;
}
/// <summary>
/// 该指令主要用于设置执行有可能出现错误的动作,并利用status得到结果,并经常结合VON使用
/// </summary>
/// <returns></returns> public virtual int VOF()
{
this.sendCmd("VOF", "");
return 0;
} }

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

添加一个Form

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

Application.Run(new Form1());

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

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

  private void button1_Click(object sender, EventArgs e)
{ string dbname = "genesis";
string jobname = textBox1.Text; Console.WriteLine("Instantiated the Genesis Object..."); string msg = "Welcome to the Java test Script...apparently its working...";
Console.WriteLine(msg); gen.PAUSE(msg); gen.COM("create_entity,job=,is_fw=no,type=job,name=" + jobname + ",db=" + dbname + ",fw_type=form");
gen.COM("clipb_open_job,job=" + jobname + ",update_clipboard=view_job");
gen.COM("open_job,job=" + jobname);
gen.COM("open_entity,job=" + jobname + ",type=matrix,name=matrix,iconic=no");
gen.COM("matrix_add_step,job=" + jobname + ",matrix=matrix,step=test,col=1");
gen.COM("matrix_add_layer,job=" + jobname + ",matrix=matrix,layer=lay1,row=1,context=board,type=signal,polarity=positive");
gen.COM("matrix_add_layer,job=" + jobname + ",matrix=matrix,layer=lay2,row=2,context=board,type=signal,polarity=positive"); string msg2 = "Now we'll open the newly created step...";
Console.WriteLine(msg2); gen.PAUSE(msg2); gen.COM("open_entity,job=" + jobname + ",type=step,name=test,iconic=no");
string group = gen.COMANS;
gen.PAUSE("Group number is " + group); gen.COM("units,type=inch");
gen.COM("display_layer,name=lay1,display=yes,number=1");
gen.COM("work_layer,name=lay1");
gen.COM("display_layer,name=lay2,display=yes,number=2");
gen.COM("profile_rect,x1=0,y1=0,x2=5,y2=5");
gen.COM("zoom_home");
gen.COM("add_line,attributes=no,xs=0.6239601378,ys=0.5049917323,xe=4.6505824803,ye=4.5865225394,symbol=r40,polarity=positive");
gen.COM("work_layer,name=lay2");
gen.COM("add_line,attributes=no,xs=0.5049917323,ys=4.4675541339,xe=4.4584027559,ye=0.4409318898,symbol=r40,polarity=positive"); gen.MOUSE("Click a point", "p");
Console.WriteLine("Mouseans : " + gen.MOUSEANS); Console.WriteLine("Checking return of Genesis object...");
Console.WriteLine("genStatus : " + Convert.ToString(gen.STATUS));
Console.WriteLine("genComans : " + gen.COMANS); string msg3 = "Now we'll clean up...";
Console.WriteLine(msg3); gen.PAUSE(msg3); gen.COM("check_inout,mode=in,type=job,job=" + jobname);
gen.COM("close_job,job=" + jobname);
gen.COM("close_form,job=" + jobname);
gen.COM("close_flow,job=" + jobname);
gen.COM("delete_entity,job=,type=job,name=" + jobname); Console.WriteLine("genStatus : " + Convert.ToString(gen.STATUS));
Console.WriteLine("genComans : " + gen.COMANS); string msg4 = "Thats it...";
Console.WriteLine(msg4); gen.PAUSE(msg4); Application.Exit(); }

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

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

#!/bin/csh
#
# Mike J. Hopkins
# Genesis 2000 scr_start.csh
# revision 1.4.1
#
# This version of the scr_start.csh script includes
# support for the Python programming language,
# as well as Java and binary execuables...
#
#
if($?GENESIS_DIR)then
set _genesis_root=$GENESIS_DIR
else
set _genesis_root=/genesis
endif if($?GENESIS_EDIR)then
set _genesis_edir=$GENESIS_EDIR
else
set _genesis_edir=e$GENESIS_VER
endif if($_genesis_edir =~ /* || $_genesis_edir =~ ?:*)then
set path=($_genesis_edir/all $path)
else
set path=($_genesis_root/$_genesis_edir/all $path)
endif set STATUS=0
set PROG=$1
if(! -e $PROG)then
set PROG_STATUS=1
goto end
endif # define aliases
set DIR_PREFIX='@%#%@' alias VON 'echo "${DIR_PREFIX}VON";'
alias VOF 'echo "${DIR_PREFIX}VOF";' alias SU_ON 'echo "${DIR_PREFIX}SU_ON";'
alias SU_OFF 'echo "${DIR_PREFIX}SU_OFF";' alias PAUSE 'echo "${DIR_PREFIX}PAUSE \!:*"; \\
set STATUS=$<; set READANS=$<; set PAUSANS=$<; \\
if ($PAUSANS != "OK") exit'
alias MOUSE 'echo "${DIR_PREFIX}MOUSE \!:*"; \\
set STATUS=$<; set READANS=$<; set MOUSEANS="$<"'
alias COM 'echo "${DIR_PREFIX}COM \!:*"; \\
set STATUS=$<; set READANS="$<"; set COMANS=($READANS)'
alias AUX 'echo "${DIR_PREFIX}AUX \!:*"; \\
set STATUS=$<; set READANS="$<"; set COMANS=($READANS)' set argv = ($2) #executing hook script
if(-e $_genesis_root/sys/hooks/script_start.csh)then
source $_genesis_root/sys/hooks/script_start.csh
endif # check first line of program
set _HEAD=`head -1 $PROG`
set _EXT=`echo $PROG:e` if("$_HEAD" =~ *perl*)then
echo "Executing Perl Program $PROG $argv"
perl $PROG $argv
set PROG_STATUS=$status
else if("$_HEAD" =~ *python*)then
echo "Executing Python Program $PROG $argv"
python $PROG $argv
set PROG_STATUS=$status
else if("$_HEAD" =~ *wish*)then
setenv TCSHONLYSTARTEXES 1
echo "Executing TCL Program $PROG $argv"
$_genesis_root/sys/hooks/wish_start.tcl $PROG $argv
set PROG_STATUS=$status
else if ("$_EXT" =~ [Cc][Ll][Aa][Ss][Ss]) then
set JPATH = `echo $PROG:h`
set JPROG = `echo $PROG:t`
set JCLASS = `echo $JPROG:r`
setenv CLASSPATH $JPATH
echo "Set CLASSPATH to: $CLASSPATH"
echo "Executing JavaClass $JCLASS $argv"
echo "..."
java $JCLASS $argv
set PROG_STATUS=$status
else if ("$_EXT" =~ [Ee][Xx][Ee]) then
echo "Executing Compiled Program $PROG $argv"
$PROG $argv
set PROG_STATUS=$status
else
echo "Executing C Shell Program $PROG"
source $PROG
set PROG_STATUS=$status
endif end:
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. 干货!表达式树解析"框架"(3)

    最新设计请移步 轻量级表达式树解析框架Faller http://www.cnblogs.com/blqw/p/Faller.html 这应该是年前最后一篇了,接下来的时间就要陪陪老婆孩子了 关于表达 ...

  2. Worktile 技术架构概要

    其实早就该写这篇博客了,一直说忙于工作没有时间,其实时间挤挤总会有的,可能就是因为懒吧!从2013年11月一直拖到现在,今天就简单谈谈 Worktile 的技术架构吧 . Worktile 自上线到现 ...

  3. Hystrix框架1--入门

    介绍 在开发应用中或多或少会依赖各种外界的服务,利用各个服务来完成自己的业务需求,现在流行的微服务架构更是离不开各个服务之间的调用,这就导致整体应用的可用性依赖于各个依赖服务的可用性. 比如一个依赖3 ...

  4. angular-ui分页组件

    http://angular-ui.github.io/bootstrap/#/pagination 分页组件只提供生成分页按钮,数据的显示需要使用ng-repeat, 注意设置 items-per- ...

  5. springboot学习笔记(一)

    一.什么是SpringBoot 描述:Spring Boot是Spring社区发布的一个开源项目,旨在帮助开发者快速并且更简单的构建项目.大多数SpringBoot项目只需要很少的配置文件.二.Spr ...

  6. Hello Blog

    转眼之间,工作已经快五年了. 五年走的时候不觉得,当真正过来了,一回头,才真正体会到什么叫时间匆匆. 做了五年的技术,算是多有波折.想一想,做技术真的挺需要耐得住寂寞的,毕竟花花世界,压力太大,诱惑太 ...

  7. MongoDB 维护Replica Set

    在每个MongoDB(版本 3.2.9) Instance中,都有一个本地数据库(local),用于存储 Replication 进程的信息和本地数据.local 数据库的特性是:位于local数据库 ...

  8. 轻量级前端MVVM框架avalon源码分析-总结

    距avalon0.7版本发布有一段时间,由于之前的稳定性,就停止一段时间更新,期间研究了下Knockout源码,也尝试写了一个小型的mvvm的实现模型,仅仅只是仿造ko的核心实现,把无关的东西给剥离掉 ...

  9. JMM和happens-before原则

    JMM: Java Memory Model(Java内存模型),围绕着在并发过程中如何处理可见性.原子性.有序性这三个特性而建立的模型. 可见性: JMM提供了volatile变量定义.final. ...

  10. iOS开发之新浪微博山寨版代码优化

    之前发表过一篇博客“IOS开发之新浪围脖”,在编写代码的时候太偏重功能的实现了,写完基本功能后看着代码有些别扭,特别是用到的四种cell的类,重复代码有点多,所以今天花点时间把代码重构一下.为了减少代 ...