找回密码
 注册
查看: 53335|回复: 949
打印 上一主题 下一主题

十天学会SKILL

    [复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2015-1-10 18:28 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
给大家学习用啊
游客,如果您要查看本帖隐藏内容请回复

该用户从未签到

推荐
发表于 2015-1-12 09:56 | 只看该作者
楼主,看不到呀,有心的话发到我邮箱,Thanks in advanced! 1260523452@qq.com

点评

学习目的:搭建一个简单的Allegro Skill调试环境,写出第一个HELLO WORLD程序. 1,首先选择一款适合自己的文本编辑器,免费的有SciTE, Notepad ++, 收费的有Ultra Edit,CodeWright. 以上几款软件均有语法高亮文件。  详情 回复 发表于 2022-2-17 15:40

该用户从未签到

推荐
发表于 2022-2-17 15:40 | 只看该作者
1285803871 发表于 2015-1-12 09:56
楼主,看不到呀,有心的话发到我邮箱,Thanks in advanced!

学习目的:搭建一个简单的Allegro Skill调试环境,写出第一个HELLO WORLD程序.
1,首先选择一款适合自己的文本编辑器,免费的有SciTE, Notepad ++, 收费的有Ultra Edit,CodeWright. 以上几款软件均有语法高亮文件。推荐使用SciTE, Notepad ++。

2,在PCBENV目录下新建一个文本文件,改名为test.il,后面范例中的编写都在这个文件中完成,如果不知道PCBENV在哪里,参考以下方法:
     1.通过查看电脑环境变量中的HOME变量值. 例如HOME变量为d:\ ,对应的目录应为d:\pcbenv
     2.直接在ALLEGRO 命令行输入echo $localenv 也可以得到实际的环境变量目录。


3,注册快捷键以方便调试,编辑ENV文件,添加如下两行,F11为载入test.il, F12为执行test命令。
alias F11 skill load('"test.il"')
alias F12 test
如图:
file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image002.jpg
2010-1-26 15:25 上传

以后,我们就可以在test.il文件中书写代码,保存后,在Allegro中按F11就会载入,然后按F12就可以执行命令test,后面会讲到这个test命令是如何注册的。

4,来完成第一个HelloWorld程序。
用文本编辑器打开test.il文件,将以下蓝色部分代码复制到test.il文件中并保存,
file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image004.jpg
2010-1-26 15:27 上传

<------
我是分隔线----->
axlCmdRegister("test",'test)
defun( test ()
     axlUIConfirm(strcat("Hello",axlGetVariable("username")))
)
<------我是分隔线----->

回到allegro界面,按F11,再按F12.看下执行效果。
file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image006.jpg
2010-1-26 15:26 上传

这个Hello World程序用到了axlUIConfirm,strcat, axlGetVariable这几个函数。
axlGetVariable("username")来获取Username
strcat:在本例中将Hello这个字符串与用户名合并成一个字符串。
axlUIConfirm:弹出提示框,内容为刚才strcat合并后的字符串。


今天先到这里,大家先把这个Hello world程序调试出来。另外这个系列教程是让大家入门的,大家觉得写的浅也不要责怪。

有时间可以先看下以下帮助文件:
X:\Cadence\SPB_15.7\doc\sklanguser\sklanguser.pdf
X:\Cadence\SPB_15.7\doc\sklangref\sklangref.pdf
X:\Cadence\SPB_15.7\doc\algroskill\algroskill.pdf
十天学会Skill之第二天
By deargds
https://www.eda365.com
学习目的:了解SKILL的一些基础,变量,函数,以及流程控制。

一,我们先了解以下几种数据类型,

整数:integer例如:2, 8, 6
浮点数:float例如:2.3, 9.3265, 0.5, .8,
字符串:string例如:“Hello!”
原子类型:atom例如:t , nil , unbound
链表:list例如:list(1,2,3)'(1,2,3)

给变量赋值,除了使用=之外,还可以使用set函数.
set(a,"hello")

数据类型可使用type函数来查询
例如:a = 1
那么type(a)的返回值为fixnum
a = "string"
type(a)返回值为string

另外链表类型非常有用,在skill中有一系列的函数是针对链表操作的,示例如下:
a = list(5,6,7);定义链表a,内容为5 6 7.
如果想得到链表中第一个值,使用car函数即可,car(a)的结果为5
另外还有append1,consremove,reverse,nth等许多函数,大家自己先看HELP吧。
X:\Cadence\SPB_15.7\doc\sklanguser\sklanguser.pdf
其它数据类型如symbol,defstruct,array等请参考
X:\Cadence\SPB_15.7\doc\sklanguser\sklanguser.pdf

二,函数的定义

1.通常使用defun或者procedure来自定义一个函数,两者的作用是一样的,区别只在乎在书写格式的差别
defun(test ()
        ;you can do something
)

procedure(test()
        ;you can do something
)
上面两句同样是定义了一个test函数,defun定义时在函数名后要有一个空格。

2.局部变量的定义,使用letprog函数,如果不需要在函数内使用跳转函数或者返回值的话使用let即可。
defun(test ()
        let((a)
                ;you can dosomething
        )
)
上面示例中使用let定义了a为局部变量,其它函数无法访问。

3.函数的参数类型@rest  @optional  @key

@rest不确定数目的参数,可以有多个参数。
defun( test ( @rest a )
        println(a)
)

@optional可选择的参数,在调用该函数时,可以忽略此参数。
defun(test (@optional a )
        println(a)
)

@key指定参数的固定值。
defun(test (a b @key (c 3))
        println(c)
)

psoptional @key 不能同时出现在函数参数定义中。

三,流程控制

1.条件判断if whencond unless
双向判断
if( 3 > 1 then
        println("You know too much!")
else
        println("hehe")
)

when( 3 > 1
        println("You know too much!")
)

unless( 3 < 1
        println("You know too much!")
)
;多向判断
cond(
        (2 > 0 ,println(2))
        (3 < 0 ,println(3))
)
2.循环语句while forforeach

;while示例
i = 0;定义i的初值为0
while((i <= 10)
        i = i + 1;
自加一次
        println(i)
)


;for示例
sum = 0;定义sun的初值为0
for( i 1 10
        sum = sum + i;
自加一次
        println(sun)
)


;foreach语句,方便用来循环链表类型
foreach( x '(1 2 3 4)
        println(x)
)

3.选择语句case caseq
i = 5 + 6
case( i
        (5 println("no"))
        (11 println("yes"))
        (t 'Other)
)

上面简单介绍需要了解的基本知识,另外想学好SKILL,帮助文件是一定要看的,这个教程只是帮大家入门,不可能过多地去重复教程上已经有的内容。
X:\Cadence\SPB_15.7\doc\sklanguser\sklanguser.pdf
X:\Cadence\SPB_15.7\doc\sklangref\sklangref.pdf
学习目的:了解Skill与Allegro交互接口,创建一个简单的窗体实例。

一,了解Skill中常用的一些交互函数

axlUIYesNo("Are you ready?");弹出YES NO选择框
axlUIYesNoCancel("Are you ready?");弹出YES NO CANCEL三态选择框
以上函数会根据用户所选结果返回一个值,我们可以判断这个返回值来进行相关的操作。

file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image008.jpg
2010-3-8 11:42 上传


axlUIMultipleChoice("ick a choice"list("a" "b" "c"));
多项选择
file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image010.jpg
2010-3-8 11:42 上传


axlUIPrompt( "Enter Your name""Cat" ) ;
提示用户输入内容并返回
axlUIConfirm( "Hello" );弹出提示框
file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image012.jpg
2010-3-8 11:42 上传

以上两个函数组合一下执行
axlUIConfirm(axlUIPrompt("Enter Your name" "Cat" ))

axlMeterCreate;创建进度条,需与其它函数配合使用
axlMeterUpdate
axlMeterDestroy

创建进度条示例:
defun(test ()
        axlMeterCreate("test","", t);创建进度条
        for(n 1 4
                sleep(1);延迟1秒
                axlMeterUpdate(n*25 "test");更新进度
        )
        axlMeterDestroy();关闭进度条
)
file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image014.jpg
2010-3-8 11:44 上传


弹出NET选择框
axlUIDataBrowse('NET '(RETRIEVE_NAME)"test" t)
建议查看下axlUIDataBrowse函数的详细说明

二,创建程序交互窗口

Skill的窗体是通过对应的form文件来进行描述的,每个不同的窗体对应不同的FORM文件,里面包括了窗体的属性,每个控件的位置,大小,相关的属性等描述。
FORM文件内容示例:

FILE_TYPE=FORM_DEFN VERSION=2
FORM
FIXED
PORT 42 5
HEADER "rogress Meter"

TILE

TEXT
TLOC 1 3
INFO progressText 40
ENDTEXT

FIELD bar
FLOC 1 1
PROGRESS 41 3
ENDFIELD

ENDTILE

ENDFORM

SKILL内置了一些WIN32控件,如按钮,文本框,单选,复选,列表,树状列表,下拉列表,进度条等,
在FORM文件中,每个控件都有自己的FIELD名称,可以通过FIELD来访问该控件以获取和设置控件的值。

在编写好Form文件后,可以通过axlFormTest()函数来进行测试,
例如axlFormTest("C://Cadence//SPB_15.7//share//pcb//text//forms//createsplitplane.form")

实际的Skill程序中为了方便,通常都会使用动态生成Form文件的方法来创建窗体,结合前面了解过的文件输入输出端口,比较容易实现。

示例如下:
file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image016.jpg
2010-3-8 11:44 上传

defun( test ()
        f = "/test.form";
定义test.form文件
        p = outfile(f"w")
        fprintf(p "FILE_TYPE=FORM_DEFNVERSION=2\n")
        fprintf(p "FORM\n")
        fprintf(p "FIXED\n")
        fprintf(p "ORT 22 8\n")
        fprintf(p "HEADER\"TEST\"\n")
        fprintf(p "TILE\n")
        fprintf(p,"FIELD tip\n\n");开始写入文本框定义
        fprintf(p,"FLOC 1 1\n");定义坐标位置
        fprintf(p,"STRFILLIN 15 40\n");控件尺寸
        fprintf(p,"ENDFIELD\n\n")
        fprintf(p "FIELD pop\n");开始写入按钮POP定义
        fprintf(p "FLOC 1 4\n")
        fprintf(p "MENUBUTTON\"Pop\" 8 3\n")
        fprintf(p "ENDFIELD\n")
        fprintf(p "FIELD close\n");开始写入按钮EXIT定义
        fprintf(p "FLOC 10 4\n")
        fprintf(p "MENUBUTTON\"Exit\" 8 3\n")
        fprintf(p "ENDFIELD\n")
        fprintf(p "ENDTILE\n")
        fprintf(p "ENDFORM\n")
        close(p);test.form文件写入结束
        
        h = axlFormCreate((gensym)f nil 'test_call t);调用axlFormCreate函数根据test.form文件创建窗体,并关联窗体回调函数test_call
        axlFormDisplay(h);显示窗体
)

defun( test_call (h)
        case( h-> curField ;获取当前窗体激活的控件
               ("pop"
                       axlUIConfirm(axlFormGetField(h "tip"));获取FIELD为tip的控件内容,并弹出
                )
               ("close"
                       axlFormClose(h);关闭窗体
                       deleteFile(f);删除生成的FORM文件
                )
        )
)

在回调函数中经常用到的函数及属性
axlFormSetField;设置控件值
axlFormGetField;获取控件值
axlFormSetFieldEditable;禁用/允许控件
axlFormSetFieldVisible;隐藏/显示控件
formHandle -> curField;返回窗体当前活动的控件。
formHandle -> curValue;返回窗体当前活动控件的值,类型与FORM文件中所定义类型一致,也可以通过axlFormCreate定义为string类型。


另外在帮助文件X:\Cadence\SPB_15.7\share\pcb\examples\skill\form\basic目录下有非常详细的FORM文件示例,可以参考一下。
十天学会Skill之第三天
By deargds
https://www.eda365.com

学习目的:如何操作,读写文件。

一,创建,删除目录等

1.
在当前打开的目录下创建test子目录,也可以使用绝对路径。
createDir("./test")
createDir("c:/test")

2.删除目录,也可以使用绝对路径。
deleteDir("./test")
deleteDir("c:/test")

3.检查目录是否存在
isDir("c:/test")

4.检查目录是否可读写
isReadable("c:/test")
isExecutable("c:/test")

5.同样也可以用isReadable,isExecutable来判断文件是否可读写。
c:/test/1.txt 实际不存在,所以以下执行结果返回为nil,所以在读写文件之前我们可以用来作判断。
isReadable("c:/test/1.txt")
isExecutable("c:/test/1.txt")


ps:另外还有isFileName,isFile,isLargeFile,isExecutable等相关函数请参考帮助

二,如何读取文件

1.
首先要定义一个文件输入端口类型
c:/test/1.txt文件的实际内容如下:
<----c:/test/1.txt---->
Monday
Tuesday
Wednesday
Thursday
Friday
Saturday
Sunday
<----c:/test/1.txt---->

现在我们将每行的内容读出并在ALLEGRO界面中弹出提示。
;首先使用infile定义一个文件输入端口类型weekport,
weekport = infile("c:/test/1.txt")
;现在用gets对weekport进行读取
gets(i,weekport)
;现在文件的第一行就读到变量i中了,下面直接调用AXL函数弹出
axlUIConfirm(i)

file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image018.jpg
2010-1-29 18:08 上传

;使用while循环读出每一行,直到文件结尾
while( gets(i,weekport)
axlUIConfirm(i);会弹出每一行的内容
)

;在读取结束后,要记得使用close函数关闭端口
close(weekport)


三,如何写入文件

与读取类似,写入文件需要用outfile定义一个写入端口
;写入到"c:/test/1.txt" 中,如果是添加模式的话outfile要用参数"a"
wport = outfile("c:/test/1.txt")
;写入端口
fprintf(wport,"Hello,world!")
;关闭端口
close(wport)

;c:/test/1.txt文件中就已经写入Hello world这行内容了。


以上大概介绍了读写文件的一般流程,大家自己可以对照帮助看一下相关函数的用法,特别是格式化输出函数fprintf。
十天学会Skill之第四天
By deargds
https://www.eda365.com

学习目的:了解AXL函数,Allegro PCB用户模型。

一,认识AXL函数
AXL函数就是Allegro提供的一系列设计接口函数,通过这些函数,我们能够对设计文件及用户接口进行互动操作,来实现各种不同的功能。
1.部分AXL示例:
axlUIConfirm("Hello,world!");弹出提示框
axlUIControl('screen);
获取屏幕分辨率
axlUIDataBrowse('NET '(RETRIEVE_NAME) "hi" t);
弹出NET选择框
axlVisibleGet();
获取当前所有显示的层面
axlCNSEcsetCreate("Test");
创建名为testECSET
axlChangeWidth(line_id, 20.0);
改变线宽
...
2.什么是DBID

设计文件就是一个储存了实际设计信息与逻辑信息的数据库,其中的每一个对象都有自己唯一的ID,我们可以通过对这些ID来操作对象,跟DBID相关的一些函数
axlIsDBIDType(ID);判断给定的变量是否是DBID类型
axlDbidName(ID);返回DBID的名称
在获取一个对象的DBID后,我们可以获得该对象的一些属性,比如层面,端点坐标,半径,中心点,宽度等等,不同的DB类型有不同的属性。
示例:获取当前设计中的所有NET的名称列表,并保存到当前目录下的allnet.txt中,参考上次写文件的示例。
all = axlDBGetDesign() -> nets ;获取所有NETDBID
wport = outfile("./allnet.txt");
定义输入端口
foreach(n all
fprintf(wport,n -> name);
获得NETNAME
)
close(wport);
关闭端口

二,Allegro PCB用户模型

PCB的设计文件是一个包含了所有设计信息的数据库,Allegro PCB用户模型封装了数据库的一些信息,我们可以通过一些对象来获取我们需要得到的内容。
示例:
获取所有component
axlDBGetDesign() -> components
获取所有net
axlDBGetDesign() -> nets
获取所有matchgroup
axlDBGetDesign() -> matchgroup
如果要访问其它一些对象,如TEXT,CLINE,VIA等,则可以使用Selection and Find Functions.
示例:
axlClearSelSet()
axlSetFindFilter( ?enabled (list "noall" "invisible""clinesegs") , ?onButtons (list "clinesegs"));使用AXL函数axlSetFindFilter设置FIND过滤条件
all_cline = axlGetSelSet(axlAddSelectAll()) ;
全选,当前设计中所有的clinesegs放入all_cline变量中。
;下面利用foreach循环来访问每一个clinesegs,
foreach(i all_cline
when(i->width < 4              ;
判断线宽是否小于4,如果小于4则高亮
  axlHighlightObject(i)  ;
高亮i
)
)
十天学会Skill之第五天
By deargds
https://www.eda365.com
学习目的:了解Skill与Allegro交互接口,创建一个简单的窗体实例。

一,了解Skill中常用的一些交互函数

axlUIYesNo("Are you ready?");弹出YES NO选择框
axlUIYesNoCancel("Are you ready?");弹出YES NO CANCEL三态选择框
以上函数会根据用户所选结果返回一个值,我们可以判断这个返回值来进行相关的操作。

file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image019.jpg
2010-3-8 11:42 上传


axlUIMultipleChoice("Pick a choice"list("a" "b" "c"));
多项选择
file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image020.jpg
2010-3-8 11:42 上传


axlUIPrompt( "Enter Your name""Cat" ) ;
提示用户输入内容并返回
axlUIConfirm( "Hello" );弹出提示框
file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image021.gif
2010-3-8 11:42 上传

以上两个函数组合一下执行
axlUIConfirm(axlUIPrompt("Enter Your name" "Cat" ))

axlMeterCreate;创建进度条,需与其它函数配合使用
axlMeterUpdate
axlMeterDestroy

创建进度条示例:
defun(test ()
        axlMeterCreate("test","", t);创建进度条
        for(n 1 4
                sleep(1);延迟1秒
                axlMeterUpdate(n*25 "test");更新进度
        )
        axlMeterDestroy();关闭进度条
)
file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image022.gif
2010-3-8 11:44 上传


弹出NET选择框
axlUIDataBrowse('NET '(RETRIEVE_NAME)"test" t)
建议查看下axlUIDataBrowse函数的详细说明

二,创建程序交互窗口

Skill的窗体是通过对应的form文件来进行描述的,每个不同的窗体对应不同的FORM文件,里面包括了窗体的属性,每个控件的位置,大小,相关的属性等描述。
FORM文件内容示例:

FILE_TYPE=FORM_DEFN VERSION=2
FORM
FIXED
PORT 42 5
HEADER "Progress Meter"

TILE

TEXT
TLOC 1 3
INFO progressText 40
ENDTEXT

FIELD bar
FLOC 1 1
PROGRESS 41 3
ENDFIELD

ENDTILE

ENDFORM

SKILL内置了一些WIN32控件,如按钮,文本框,单选,复选,列表,树状列表,下拉列表,进度条等,
在FORM文件中,每个控件都有自己的FIELD名称,可以通过FIELD来访问该控件以获取和设置控件的值。

在编写好Form文件后,可以通过axlFormTest()函数来进行测试,
例如axlFormTest("C://Cadence//SPB_15.7//share//pcb//text//forms//createsplitplane.form")

实际的Skill程序中为了方便,通常都会使用动态生成Form文件的方法来创建窗体,结合前面了解过的文件输入输出端口,比较容易实现。

示例如下:
file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image023.gif
2010-3-8 11:44 上传

defun( test ()
        f = "/test.form";
定义test.form文件
        p = outfile(f"w")
        fprintf(p "FILE_TYPE=FORM_DEFNVERSION=2\n")
        fprintf(p "FORM\n")
        fprintf(p "FIXED\n")
        fprintf(p "PORT 22 8\n")
        fprintf(p "HEADER\"TEST\"\n")
        fprintf(p "TILE\n")
        fprintf(p,"FIELD tip\n\n");开始写入文本框定义
        fprintf(p,"FLOC 1 1\n");定义坐标位置
        fprintf(p,"STRFILLIN 15 40\n");控件尺寸
        fprintf(p,"ENDFIELD\n\n")
        fprintf(p "FIELD pop\n");开始写入按钮POP定义
        fprintf(p "FLOC 1 4\n")
        fprintf(p "MENUBUTTON\"Pop\" 8 3\n")
        fprintf(p "ENDFIELD\n")
        fprintf(p "FIELD close\n");开始写入按钮EXIT定义
        fprintf(p "FLOC 10 4\n")
        fprintf(p "MENUBUTTON\"Exit\" 8 3\n")
        fprintf(p "ENDFIELD\n")
        fprintf(p "ENDTILE\n")
        fprintf(p "ENDFORM\n")
        close(p);test.form文件写入结束
        
        h = axlFormCreate((gensym)f nil 'test_call t);调用axlFormCreate函数根据test.form文件创建窗体,并关联窗体回调函数test_call
        axlFormDisplay(h);显示窗体
)

defun( test_call (h)
        case( h-> curField ;获取当前窗体激活的控件
               ("pop"
                       axlUIConfirm(axlFormGetField(h "tip"));获取FIELD为tip的控件内容,并弹出
                )
               ("close"
                       axlFormClose(h);关闭窗体
                       deleteFile(f);删除生成的FORM文件
                )
        )
)

在回调函数中经常用到的函数及属性
axlFormSetField;设置控件值
axlFormGetField;获取控件值
axlFormSetFieldEditable;禁用/允许控件
axlFormSetFieldVisible;隐藏/显示控件
formHandle -> curField;返回窗体当前活动的控件。
formHandle -> curValue;返回窗体当前活动控件的值,类型与FORM文件中所定义类型一致,也可以通过axlFormCreate定义为string类型。


另外在帮助文件X:\Cadence\SPB_15.7\share\pcb\examples\skill\form\basic目录下有非常详细的FORM文件示例,可以参考一下。

该用户从未签到

6#
发表于 2015-1-14 16:31 | 只看该作者
谢谢   学习下了

该用户从未签到

7#
发表于 2015-1-14 16:32 | 只看该作者
怎么没有看到附件

该用户从未签到

8#
发表于 2015-1-14 16:45 | 只看该作者
研究下skill去

该用户从未签到

9#
发表于 2015-1-15 11:51 | 只看该作者
不是10天吗?怎么只有3天的内容
  • TA的每日心情
    开心
    2021-10-28 15:28
  • 签到天数: 2 天

    [LV.1]初来乍到

    13#
    发表于 2015-1-21 15:01 | 只看该作者
    严重鄙视楼主,新人贴还不让信任看,权限整那么高干嘛呢?

    该用户从未签到

    15#
    发表于 2015-2-23 07:59 | 只看该作者
    过来看看了、
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    EDA365公众号

    关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

    GMT+8, 2024-11-22 16:45 , Processed in 0.109375 second(s), 29 queries , Gzip On.

    深圳市墨知创新科技有限公司

    地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

    快速回复 返回顶部 返回列表