找回密码
 注册
楼主: qq1283287782
打印 上一主题 下一主题

十天学会SKILL

    [复制链接]
  • TA的每日心情
    开心
    2021-12-28 15:35
  • 签到天数: 1 天

    [LV.1]初来乍到

    781#
    发表于 2021-12-28 13:56 | 只看该作者
    等级不够看不了 可以分享一份到我邮箱吗?谢谢 303882115@qq.com
  • TA的每日心情
    开心
    2021-12-28 15:35
  • 签到天数: 1 天

    [LV.1]初来乍到

    782#
    发表于 2021-12-28 14:04 | 只看该作者
    严重鄙视楼主,新人贴还不让信任看,权限整那么高干嘛呢?
  • TA的每日心情
    开心
    2021-12-28 15:35
  • 签到天数: 1 天

    [LV.1]初来乍到

    783#
    发表于 2021-12-28 14:05 | 只看该作者
    希望楼主一致对外开发,谢谢!
  • TA的每日心情
    开心
    2021-12-30 15:04
  • 签到天数: 1 天

    [LV.1]初来乍到

    784#
    发表于 2021-12-29 11:42 | 只看该作者
    怎么没有看到附件
  • TA的每日心情
    开心
    2025-5-28 15:49
  • 签到天数: 77 天

    [LV.6]常住居民II

    789#
    发表于 2022-1-10 09:27 | 只看该作者
    学习一下学习一下

    该用户从未签到

    790#
    发表于 2022-1-10 09:28 | 只看该作者
    楼主,级别太低了看不了
  • TA的每日心情
    开心
    2022-12-29 15:10
  • 签到天数: 27 天

    [LV.4]偶尔看看III

    792#
    发表于 2022-1-10 15:39 | 只看该作者
    看看大佬操作,感谢大佬分享

    该用户从未签到

    793#
    发表于 2022-2-16 16:13 | 只看该作者
    6666666666666666666666

    点评

    真的是很实用,我试试看  详情 回复 发表于 2022-3-3 16:15

    该用户从未签到

    794#
    发表于 2022-2-17 15:38 | 只看该作者

    学习目的:搭建一个简单的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.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 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.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三态选择框
    以上函数会根据用户所选结果返回一个值,我们可以判断这个返回值来进行相关的操作。



    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.7//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.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)


    ;使用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三态选择框
    以上函数会根据用户所选结果返回一个值,我们可以判断这个返回值来进行相关的操作。



    axlUIMultipleChoice("Pick 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 "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文件的方法来创建窗体,结合前面了解过的文件输入输出端口,比较容易实现。

    示例如下:


    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 "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文件示例,可以参考一下。








    该用户从未签到

    795#
    发表于 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文件示例,可以参考一下。

    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

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

    EDA365公众号

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

    GMT+8, 2025-6-2 03:34 , Processed in 0.109375 second(s), 24 queries , Gzip On.

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

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

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