-
2023年4月15日发(作者:运行时错误1004)
学习目的:搭建一个简单的AllegroSkill调试环境,写出第一个HELLOWORLD
程序.
1,首先选择一款适合自己的文本编辑器,免费的有SciTE,Notepad++,收费
的有UltraEdit,CodeWright.以上几款软件均有语法高亮文件。推荐使用
SciTE,Notepad++。
2,在PCBENV目录下新建一个文本文件,改名为,后面范例中的编写都
在这个文件中完成,如果不知道PCBENV在哪里,参考以下方法:
1.通过查看电脑环境变量中的HOME变量值.例如HOME变量为d:,
对应的目录应为d:pcbenv
2.直接在ALLEGRO命令行输入echo$localenv也可以得到实际的环
境变量目录。
3,注册快捷键以方便调试,编辑ENV文件,添加如下两行,F11为载入,
F12为执行test命令。
aliasF11skillload('""')
aliasF12test
如图:
以后,我们就可以在文件中书写代码,保存后,在Allegro中按F11
就会载入,然后按F12就可以执行命令test,后面会讲到这个test命令是如何
注册的。
4,来完成第一个HelloWorld程序。
用文本编辑器打开文件,将以下蓝色部分代码复制到文件中并
保存,
<------我是分隔线----->
axlCmdRegister("test",'test)defun(test()
axlUIConfirm(strcat("Hello",axlGetVariable("username")))
)
<------我是分隔线----->
回到allegro界面,按F11,再按F12.看下执行效果。
这个HelloWorld程序用到了axlUIConfirm,strcat,axlGetVariable这几个函
数。
axlGetVariable("username")来获取Username
strcat:在本例中将Hello这个字符串与用户名合并成一个字符串。
axlUIConfirm:弹出提示框,内容为刚才strcat合并后的字符串。
今天先到这里,大家先把这个Helloworld程序调试出来。另外这个系列教程是
让大家入门的,大家觉得写的浅也不要责怪。
有时间可以先看下以下帮助文件:
X:CadenceSPB_
X:CadenceSPB_
X:CadenceSPB_
十天学会Skill之第二天Bydeargds
学习目的:了解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)的返回值为fixnuma="string"
type(a)返回值为string
另外链表类型非常有用,在skill中有一系列的函数是针对链表操作的,示例如下:
a=list(5,6,7);定义链表a,内容为567.
如果想得到链表中第一个值,使用car函数即可,car(a)的结果为5
另外还有append1,cons,remove,reverse,nth等许多函数,大家自己先看HELP吧。
X:CadenceSPB_
其它数据类型如symbol,defstruct,array等请参考
X:CadenceSPB_
二,函数的定义
1.通常使用defun或者procedure来自定义一个函数,两者的作用是一样的,区别只在乎在书
写格式的差别defun(test()
;youcandosomething
)
procedure(test()
;youcandosomething
)
上面两句同样是定义了一个test函数,defun定义时在函数名后要有一个空格。
2.局部变量的定义,使用let或prog函数,如果不需要在函数内使用跳转函数或者返回值的
话使用let即可。
defun(test()
let((a)
;youcandosomething
)
)
上面示例中使用let定义了a为局部变量,其它函数无法访问。
3.函数的参数类型@rest@optional@key
@rest不确定数目的参数,可以有多个参数。
defun(test(@resta)
println(a)
)
@optional可选择的参数,在调用该函数时,可以忽略此参数。
defun(test(@optionala)
println(a)
)
@key指定参数的固定值。
defun(test(ab@key(c3))
println(c)
)
ps:@optional与@key不能同时出现在函数参数定义中。
三,流程控制
1.条件判断ifwhencondunless,
双向判断if(3>1then
println("Youknowtoomuch!")else
println("hehe")
)
when(3>1
println("Youknowtoomuch!")
)
unless(3<1
println("Youknowtoomuch!")
)
;多向判断cond(
(2>0,println(2))
(3<0,println(3))
)
2.循环语句whileforforeach
;while示例
i=0;定义i的初值为0
while((i<=10)
i=i+1;自加一次
println(i)
)
;for示例
sum=0;定义sun的初值为0for(i110
sum=sum+i;自加一次
println(sun)
)
;foreach语句,方便用来循环链表类型
foreach(x'(1234)
println(x)
)
3.选择语句casecaseq
i=5+6case(i
(5println("no"))
(11println("yes"))
(t'Other)
)
上面简单介绍需要了解的基本知识,另外想学好SKILL,帮助文件是一定要看的,这个教程
只是帮大家入门,不可能过多地去重复教程上已经有的内容。
X:CadenceSPB_
X:CadenceSPB_
学习目的:了解Skill与Allegro交互接口,创建一个简单的窗体实例。
一,了解Skill中常用的一些交互函数
axlUIYesNo("Areyouready?");弹出YESNO选择框
axlUIYesNoCancel("Areyouready?");弹出YESNOCANCEL三态选择框
以上函数会根据用户所选结果返回一个值,我们可以判断这个返回值来进行相关
的操作。
axlUIMultipleChoice("Pickachoice"list("a""b""c"));多项选择
axlUIPrompt("EnterYourname""Cat");提示用户输入内容并返回
axlUIConfirm("Hello");弹出提示框
以上两个函数组合一下执行
axlUIConfirm(axlUIPrompt("EnterYourname""Cat"))
axlMeterCreate;创建进度条,需与其它函数配合使用
axlMeterUpdate
axlMeterDestroy
创建进度条示例:
defun(test()
axlMeterCreate("test","",t);创建进度条
for(n14
sleep(1);延迟1秒
axlMeterUpdate(n*25"test");更新进度
)
axlMeterDestroy();关闭进度条)
弹出NET选择框
axlUIDataBrowse('NET'(RETRIEVE_NAME)"test"t)
建议查看下axlUIDataBrowse函数的详细说明
二,创建程序交互窗口
Skill的窗体是通过对应的form文件来进行描述的,每个不同的窗体对应不同
的FORM文件,里面包括了窗体的属性,每个控件的位置,大小,相关的属性等
描述。
FORM文件内容示例:
FILE_TYPE=FORM_DEFNVERSION=2
FORMFIXED
PORT425
HEADER"ProgressMeter"
TILE
TEXT
TLOC13
INFOprogressText40
ENDTEXT
FIELDbarFLOC11
PROGRESS413
ENDFIELD
ENDTILE
ENDFORM
SKILL内置了一些WIN32控件,如按钮,文本框,单选,复选,列表,树状列表,
下拉列表,进度条等,
在FORM文件中,每个控件都有自己的FIELD名称,可以通过FIELD来访问该控
件以获取和设置控件的值。
在编写好Form文件后,可以通过axlFormTest()函数来进行测试,例如
axlFormTest("C://Cadence//SPB_15.7//share//pcb//text//forms//createsp
")
实际的Skill程序中为了方便,通常都会使用动态生成Form文件的方法来创建
窗体,结合前面了解过的文件输入输出端口,比较容易实现。
示例如下:
defun(test()
f="/";定义文件
p=outfile(f"w")
fprintf(p"FILE_TYPE=FORM_DEFNVERSION=2n")
fprintf(p"FORMn")
fprintf(p"FIXEDn")
fprintf(p"PORT228n")
fprintf(p"HEADER"TEST"n")
fprintf(p"TILEn")
fprintf(p,"FIELDtipnn");开始写入文本框定义
fprintf(p,"FLOC11n");定义坐标位置
fprintf(p,"STRFILLIN1540n");控件尺寸
fprintf(p,"ENDFIELDnn")
fprintf(p"FIELDpopn");开始写入按钮POP定义
fprintf(p"FLOC14n")
fprintf(p"MENUBUTTON"Pop"83n")
fprintf(p"ENDFIELDn")
fprintf(p"FIELDclosen");开始写入按钮EXIT定义
fprintf(p"FLOC104n")
fprintf(p"MENUBUTTON"Exit"83n")
fprintf(p"ENDFIELDn")
fprintf(p"ENDTILEn")
fprintf(p"ENDFORMn")
close(p);文件写入结束
h=axlFormCreate((gensym)fnil'test_callt);调用
axlFormCreate函数根据文件创建窗体,并关联窗体回调函数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:CadenceSPB_15.7sharepcbexamplesskillformbasic目录下有非常
详细的FORM文件示例,可以参考一下。
十天学会Skill之第三天Bydeargds
学习目的:如何操作,读写文件。
一,创建,删除目录等
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/实际不存在,所以以下执行结果返回为nil,所以在读写文件之
前我们可以用来作判断。
isReadable("c:/test/")
isExecutable("c:/test/")
ps:另外还有isFileName,isFile,isLargeFile,isExecutable等相关函数请
参考帮助
二,如何读取文件
1.首先要定义一个文件输入端口类型
c:/test/文件的实际内容如下:
<----c:/test/---->
Monday
Tuesday
Wednesday
Thursday
Friday
SaturdaySunday
<----c:/test/---->
现在我们将每行的内容读出并在ALLEGRO界面中弹出提示。
;首先使用infile定义一个文件输入端口类型weekport,
weekport=infile("c:/test/")
;现在用gets对weekport进行读取gets(i,weekport)
;现在文件的第一行就读到变量i中了,下面直接调用AXL函数弹出
axlUIConfirm(i)
;使用while循环读出每一行,直到文件结尾while(gets(i,weekport)
axlUIConfirm(i);会弹出每一行的内容
)
;在读取结束后,要记得使用close函数关闭端口
close(weekport)
三,如何写入文件
与读取类似,写入文件需要用outfile定义一个写入端口
;写入到"c:/test/"中,如果是添加模式的话outfile要用参数"a"
wport=outfile("c:/test/")
;写入端口
fprintf(wport,"Hello,world!")
;关闭端口
close(wport)
;c:/test/文件中就已经写入Helloworld这行内容了。
以上大概介绍了读写文件的一般流程,大家自己可以对照帮助看一下相关函数的
用法,特别是格式化输出函数fprintf。
十天学会Skill之第四天Bydeargds
学习目的:了解AXL函数,AllegroPCB用户模型。
一,认识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的名称列表,并保存到当前目录下的中,参考上次
写文件的示例。
all=axlDBGetDesign()->nets;获取所有NET的DBID
wport=outfile("./");定义输入端口foreach(nall
fprintf(wport,n->name);获得NETNAME)
close(wport);关闭端口
二,AllegroPCB用户模型
PCB的设计文件是一个包含了所有设计信息的数据库,AllegroPCB用户模型封装了数据库
的一些信息,我们可以通过一些对象来获取我们需要得到的内容。
示例:
获取所有component
axlDBGetDesign()->components
获取所有net
axlDBGetDesign()->nets
获取所有matchgroup
axlDBGetDesign()->matchgroup
如果要访问其它一些对象,如TEXT,CLINE,VIA等,则可以使用SelectionandFindFunctions.
示例:
axlClearSelSet()
axlSetFindFilter(?enabled(list"noall""invisible""clinesegs"),?onButtons(list"clinesegs"));使
用AXL函数axlSetFindFilter设置FIND过滤条件
all_cline=axlGetSelSet(axlAddSelectAll());全选,当前设计中所有的clinesegs放入all_cline变
量中。
;下面利用foreach循环来访问每一个clinesegs,
foreach(iall_cline
when(i->width<4;判断线宽是否小于4,如果小于4则高亮
axlHighlightObject(i);高亮i
)
)
十天学会Skill之第五天Bydeargds
学习目的:了解Skill与Allegro交互接口,创建一个简单的窗体实例。
一,了解Skill中常用的一些交互函数
axlUIYesNo("Areyouready?");弹出YESNO选择框
axlUIYesNoCancel("Areyouready?");弹出YESNOCANCEL三态选择框
以上函数会根据用户所选结果返回一个值,我们可以判断这个返回值来进行相关
的操作。
axlUIMultipleChoice("Pickachoice"list("a""b""c"));多项选择
axlUIPrompt("EnterYourname""Cat");提示用户输入内容并返回
axlUIConfirm("Hello");弹出提示框
以上两个函数组合一下执行
axlUIConfirm(axlUIPrompt("EnterYourname""Cat"))
axlMeterCreate;创建进度条,需与其它函数配合使用
axlMeterUpdate
axlMeterDestroy
创建进度条示例:
defun(test()
axlMeterCreate("test","",t);创建进度条
for(n14
sleep(1);延迟1秒
axlMeterUpdate(n*25"test");更新进度
)
axlMeterDestroy();关闭进度条)
弹出NET选择框
axlUIDataBrowse('NET'(RETRIEVE_NAME)"test"t)
建议查看下axlUIDataBrowse函数的详细说明
二,创建程序交互窗口
Skill的窗体是通过对应的form文件来进行描述的,每个不同的窗体对应不同
的FORM文件,里面包括了窗体的属性,每个控件的位置,大小,相关的属性等
描述。
FORM文件内容示例:
FILE_TYPE=FORM_DEFNVERSION=2
FORMFIXED
PORT425
HEADER"ProgressMeter"
TILE
TEXT
TLOC13
INFOprogressText40
ENDTEXT
FIELDbarFLOC11
PROGRESS413
ENDFIELD
ENDTILE
ENDFORM
SKILL内置了一些WIN32控件,如按钮,文本框,单选,复选,列表,树状列表,
下拉列表,进度条等,
在FORM文件中,每个控件都有自己的FIELD名称,可以通过FIELD来访问该控
件以获取和设置控件的值。
在编写好Form文件后,可以通过axlFormTest()函数来进行测试,例如
axlFormTest("C://Cadence//SPB_15.7//share//pcb//text//forms//createsp
")
实际的Skill程序中为了方便,通常都会使用动态生成Form文件的方法来创建
窗体,结合前面了解过的文件输入输出端口,比较容易实现。
示例如下:
defun(test()
f="/";定义文件
p=outfile(f"w")
fprintf(p"FILE_TYPE=FORM_DEFNVERSION=2n")
fprintf(p"FORMn")
fprintf(p"FIXEDn")
fprintf(p"PORT228n")
fprintf(p"HEADER"TEST"n")
fprintf(p"TILEn")
fprintf(p,"FIELDtipnn");开始写入文本框定义
fprintf(p,"FLOC11n");定义坐标位置
fprintf(p,"STRFILLIN1540n");控件尺寸
fprintf(p,"ENDFIELDnn")
fprintf(p"FIELDpopn");开始写入按钮POP定义
fprintf(p"FLOC14n")
fprintf(p"MENUBUTTON"Pop"83n")
fprintf(p"ENDFIELDn")
fprintf(p"FIELDclosen");开始写入按钮EXIT定义
fprintf(p"FLOC104n")
fprintf(p"MENUBUTTON"Exit"83n")
fprintf(p"ENDFIELDn")
fprintf(p"ENDTILEn")
fprintf(p"ENDFORMn")
close(p);文件写入结束
h=axlFormCreate((gensym)fnil'test_callt);调用
axlFormCreate函数根据文件创建窗体,并关联窗体回调函数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:CadenceSPB_15.7sharepcbexamplesskillformbasic目录下有非常
详细的FORM文件示例,可以参考一下。
-
更多推荐
skill
发布评论