学习目的:搭建一个简单的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,cons,remove,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. 局部变量的定义,使用let 或prog 函数,如果不需要在函数内使用跳转函数或者返回值的话使用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)
)
ps optional 与 @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.jpg2010-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.jpg2010-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");创建名为test的ECSET
axlChangeWidth(line_id, 20.0);改变线宽
...
2. 什么是DBID
设计文件就是一个储存了实际设计信息与逻辑信息的数据库,其中的每一个对象都有自己唯一的ID ,我们可以通过对这些ID 来操作对象,跟DBID 相关的一些函数
axlIsDBIDType(ID); 判断给定的变量是否是DBID 类型
axlDbidName(ID); 返回DBID 的名称
在获取一个对象的DBID 后,我们可以获得该对象的一些属性,比如层面,端点坐标,半径,中心点,宽度等等,不同的DB 类型有不同的属性。
示例: 获取当前设计中的所有NET 的名称列表, 并保存到当前目录下的allnet.txt 中,参考上次写文件的示例。
all = axlDBGetDesign() -> nets ;获取所有NET的DBID
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文件示例,可以参考一下。
|