找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

巢课
电巢直播8月计划
查看: 1923|回复: 12
打印 上一主题 下一主题

菜菜skill的学习知识~~

[复制链接]

47

主题

266

帖子

2730

积分

四级会员(40)

Rank: 4Rank: 4Rank: 4Rank: 4

积分
2730
跳转到指定楼层
1#
发表于 2012-7-14 11:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
首先说明:以下内容是我在别的网上找到的,最后发现好像是这个论坛版主写的,唯一比较遗憾的是只写到了一半!!
咱只说一句话,版主,把剩下的五天抽个时间写一下!!

谢谢了!!

本论坛地址:
https://www.eda365.com/forum.php? ... EC%D1%A7%BB%E1Skill
https://www.eda365.com/forum.php? ... EC%D1%A7%BB%E1Skill
https://www.eda365.com/forum.php? ... EC%D1%A7%BB%E1Skill
https://www.eda365.com/forum.php? ... EC%D1%A7%BB%E1Skill
https://www.eda365.com/forum.php? ... EC%D1%A7%BB%E1Skill

目  录
十天学会Skill之第一天        1
十天学会Skill之第二天        4
十天学会Skill之第三天        8
十天学会Skill之第四天        9
十天学会Skill之第五天        11

十天学会Skill之第一天
学习目的:搭建一个简单的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
如图:


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

4,来完成第一个Hello World程序。
用文本编辑器打开test.il文件,将以下蓝色部分代码复制到test.il文件中并保存,


<------我是分隔线----->
axlCmdRegister("test",'test)
defun( test ()
     axlUIConfirm(strcat("Hello ",axlGetVariable("username")))
)
<------我是分隔线----->
回到allegro界面,按F11,再按F12.看下执行效果。


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

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

有时间可以先看下以下帮助文件:
X:\Cadence\SPB_15.5\doc\sklanguser\sklanguser.pdf
X:\Cadence\SPB_15.5\doc\sklangref\sklangref.pdf
X:\Cadence\SPB_15.5\doc\algroskill\algroskill.pdf


十天学会Skill之第二天
学习目的:了解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.5\doc\sklanguser\sklanguser.pdf
其它数据类型如symbol,defstruct,array等请参考
X:\Cadence\SPB_15.5\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 do something
        )
)
上面示例中使用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 when cond 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 for foreach

;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.5\doc\sklanguser\sklanguser.pdf
X:\Cadence\SPB_15.5\doc\sklangref\sklangref.pdf


十天学会Skill之第三天

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

一,创建,删除目录等

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)


;使用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这行内容了。


十天学会Skill之第四天

学习目的:了解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之第五天

学习目的:了解Skill与Allegro交互接口,创建一个简单的窗体实例。

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

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



axlUIMultipleChoice("ick a choice" list("a" "b" "c"));多项选择



axlUIPrompt( "Enter Your name" "Cat" ) ;提示用户输入内容并返回
axlUIConfirm( "Hello" );弹出提示框


以上两个函数组合一下执行
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();关闭进度条
)



弹出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.5//share//pcb//text//forms//createsplitplane.form")

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

示例如下:


defun( test ()
        f = "/test.form"; 定义test.form文件
        p = outfile(f "w")
        fprintf(p "FILE_TYPE=FORM_DEFN VERSION=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.5\share\pcb\examples\skill\form\basic目录下有非常详细的FORM文件示例,可以参考一下。

本帖子中包含更多资源

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

x

评分

参与人数 1贡献 +10 收起 理由
XYX365 + 10 支持!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏5 支持!支持! 反对!反对!

57

主题

1857

帖子

7919

积分

六级会员(60)

Rank: 6Rank: 6

积分
7919
2#
发表于 2012-7-15 11:16 | 只看该作者
支持!支持!支持!支持!支持!

117

主题

2352

帖子

1万

积分

EDA365特邀版主

Rank: 6Rank: 6

积分
13799

最佳敬业奖

3#
发表于 2012-7-15 21:52 | 只看该作者
未完待续{:soso_e187:}
谁画出这天地 又画下我和你

47

主题

266

帖子

2730

积分

四级会员(40)

Rank: 4Rank: 4Rank: 4Rank: 4

积分
2730
4#
 楼主| 发表于 2012-7-15 22:47 | 只看该作者
版主,辛苦了~~

0

主题

11

帖子

29

积分

二级会员(20)

Rank: 2Rank: 2

积分
29
5#
发表于 2012-8-8 15:10 | 只看该作者
推推 很詳細~~

59

主题

451

帖子

826

积分

三级会员(30)

Rank: 3Rank: 3Rank: 3

积分
826
6#
发表于 2012-10-13 11:17 | 只看该作者
我也认真看过   版主 写的skill学习 资料 有点困难
   虽然前面 看的还是比较好 但是后面有点 确实吃力  
现在只是 处在用的阶段 希望 各位大能 能写出更好 更多的 skill来 共大家学习参考

0

主题

431

帖子

2033

积分

四级会员(40)

Rank: 4Rank: 4Rank: 4Rank: 4

积分
2033
7#
发表于 2018-1-31 11:47 | 只看该作者
謝謝分享~

14

主题

130

帖子

324

积分

三级会员(30)

Rank: 3Rank: 3Rank: 3

积分
324
8#
发表于 2018-1-31 12:03 | 只看该作者
Thanks for Sharing!

0

主题

78

帖子

170

积分

二级会员(20)

Rank: 2Rank: 2

积分
170
9#
发表于 2018-2-1 09:49 | 只看该作者
谢谢分享

8

主题

436

帖子

727

积分

三级会员(30)

Rank: 3Rank: 3Rank: 3

积分
727
10#
发表于 2018-3-22 17:28 | 只看该作者
支持支持

7

主题

58

帖子

83

积分

二级会员(20)

Rank: 2Rank: 2

积分
83
11#
发表于 2018-6-25 17:22 | 只看该作者
很好,感谢分享

13

主题

124

帖子

235

积分

三级会员(30)

Rank: 3Rank: 3Rank: 3

积分
235
12#
发表于 2018-6-26 13:00 | 只看该作者
学习了。。。。

53

主题

647

帖子

1460

积分

四级会员(40)

Rank: 4Rank: 4Rank: 4Rank: 4

积分
1460
13#
发表于 2018-6-26 14:28 | 只看该作者
继续加油1
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

巢课

技术风云榜

关于我们|手机版|EDA365 ( 粤ICP备18020198号 )

GMT+8, 2024-9-17 03:07 , Processed in 0.083089 second(s), 38 queries , Gzip On.

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

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

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