這邊文章的目的是給予那些在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運行腳本了
在文本框里面輸入想要新建的工作名稱點擊開始按鈕運行