Genesis2000使用c#開發腳本


這邊文章的目的是給予那些在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運行腳本了

在文本框里面輸入想要新建的工作名稱點擊開始按鈕運行

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM