-

skill
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

更多推荐

skill