Cadence Skill 论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3369|回复: 0

[求助]在Set telskill窗口输入程序名,正常;但在command输入指令,Form中按钮不可用

[复制链接]
发表于 2018-2-5 13:12:46 | 显示全部楼层 |阅读模式
以下程序,在command窗口输入stackvias,只能弹出Form,不能进行“Delete”等操作;
但是,在Set telskill窗口,输入Stack_Vias_(),能进行“Delete”等操作。


axlCmdRegister("stackvias" `Stack_Vias_)

procedure( Stack_Vias_()
        stackvia=nil
        collect_stack_vias()        
        if( length(StackViaXYList)==0 then
                axlUIConfirm("There are no Stack Via.") ;若不存在重叠过孔,则弹出对话框
        else
                Create_sv_Form()  
                myform2=axlFormCreate( (gensym) form_file nil 'Form_Action t)
                axlMsgPut("%d stack vias exist."  length(StackViaXYList)) ;在command框里显示内容
                axlUIWPrint(myform2 sprintf(nil "%d stack vias exist."  length(StackViaXYList))) ;在Form底下显示内容
                axlFormListDeleteAll(myform2 "List1")
                axlFormSetField(myform2 "List1" StackViaXYList) ;把StackViaXYList的内容显示到Form list里。
                ;axlFormListSelect(myform2 "List1" selected_list) ;高亮选择的对象
                axlClearSelSet()
                axlFormSetInfo(myform2 "Msg_Field" "Please select vias from the list above.")
                axlFormDisplay(myform2)
        );if                                 
);procedure

procedure( collect_stack_vias()
        index_dbid_list = nil
        index_dbid_list_list = nil
        StackViaXYList = nil        
        index_num = 0
        axlClearSelSet()
        axlVisibleDesign(nil)
        axlVisibleLayer( "VIA CLASS/TOP" t)
        axlVisibleLayer( "BOARD GEOMETRY/OUTLINE" t)
        axlVisibleUpdate(t)
        axlSetFindFilter(?enabled `("NOALL" "VIAS") ?onButtons `("VIAS"))
        vias = axlGetSelSet(axlAddSelectAll())        
        foreach( via  vias
                axlClearSelSet()
                axlSetFindFilter(?enabled `("NOALL" "VIAS") ?onButtons `("VIAS"))
                lx=car(via->xy)-0.5 ;mm为单位时的设置
                ly=cadr(via->xy)-0.5
                ux=car(via->xy)+0.5
                uy=cadr(via->xy)+0.5
                axlAddSelectBox(list(lx:ly ux:uy))
                if( axlGetSelSetCount()>1  then ;axlGetSelSetCount()>1,表示存在重叠过孔
                        index_dbid_list = list(index_num via) ;编号和过孔dbid组合。为每个过孔添加一个编号,是为了在执行Delete时不会删错dbid。
                        index_dbid_list_list = cons(index_dbid_list index_dbid_list_list) ;index_dbid_list_list = (... (编号1 VIA1_dbid) (编号0 VIA0_dbid))。好像传不到后面去。
                        
                        StackVia_XY = "  " ;设定StackVia_XY为字符串类型
                        sprintf(StackVia_XY "%L" via->xy) ;把过孔坐标变成字符串,例如"(50.56 28.8)"
                        sprintf(StackVia_index "VIA%d" index_num) ;把编号和字符串"VIA"结合成新字符串,例如"VIA1"
                        StackVia_XY_index = strcat(StackVia_XY "  " StackVia_index) ;把过孔坐标字符串、空格字符串和编号字符串进行结合,组成新的字符串,例如"(50.56 28.8)  VIA1"。
                        StackViaXYList = cons(StackVia_XY_index StackViaXYList) ;举例:StackViaXYList =(... "(54.4 28.16)  VIA2" "(50.56 28.8)  VIA1" "(50.56 28.8)  VIA0")
                        index_num++
                );if                                
        );foreach        
        ;index_dbid_list_list
);procedure

procedure( Create_sv_Form()
form_file = "d_form.form"
myform = outfile(form_file "w")
fprintf(myform "FILE_TYPE=FORM_DEFN VERSION=2\n")
fprintf(myform "FORM AUTOGREYTEXT\n")
fprintf(myform "FIXED\n")
fprintf(myform "PORT 30 45\n")
fprintf(myform "HEADER \"Stack Vias\"\n\n")
fprintf(myform "TILE\n\n")

fprintf(myform "TEXT \"Stack Vias:\"\n")
fprintf(myform "TLOC 2 1\n")
fprintf(myform "ENDTEXT \n\n\n")

fprintf(myform "FIELD List1\n")
fprintf(myform "FLOC 2 3\n")
fprintf(myform "LIST \"\" 27 8\n")
fprintf(myform "FGROUP \"Form1\"\n")
fprintf(myform "OPTIONS multiselect\n")
fprintf(myform "ENDFIELD \n\n")

fprintf( myform "TEXT\n")
fprintf( myform "TLOC 2 18\n") ;控制语句显示位置
fprintf( myform "INFO Msg_Field 30\n") ;这里的30控制INFO显示内容的长度
fprintf( myform "ENDTEXT\n")

fprintf(myform "FIELD Delete\n")
fprintf(myform "FLOC 11 20\n")
fprintf(myform "MENUBUTTON \"Delete\" 9 3\n")
fprintf(myform "FGROUP \"Form1\"\n")
fprintf(myform "ENDFIELD \n\n")

fprintf(myform "ENDTILE\n\n")
fprintf(myform "ENDFORM\n\n")

close(myform)
)

procedure( Form_Action(myform2)
        case(myform2->curField
        
                ("List1"                                
                        selected_list = axlFormListGetSelItems(myform2 "List1") ;当前Form List中被选中的项的list
                        ;使窗口跳转到当前选择的过孔
                        foreach(sel_via selected_list        ;访问每个选中的Form List项
                                foreach(com_list index_dbid_list_list ;访问每个重叠过孔的(序号 过孔dbid)组合。 index_dbid_list_list 看前面。
                                        index_num2 = nth(0 com_list) ;提取编号
                                        via_dbid = nth(1 com_list) ;提取过孔dbid
                                        Via_XY = "  "
                                        sprintf(Via_XY "%L" via_dbid->xy)
                                        sprintf(Via_index "VIA%d" index_num2)
                                        Via_XY_index = strcat(Via_XY "  " Via_index)
                                        ;以下是跳转语句
                                        if(Via_XY_index == sel_via then
                                                selected_via_dbid_x = car(via_dbid->xy)
                                                selected_via_dbid_y = cadr(via_dbid->xy)
                                                lx = selected_via_dbid_x - 5 ;mm为单位时的设置
                                                ly = selected_via_dbid_y - 5
                                                hx = selected_via_dbid_x + 5
                                                hy = selected_via_dbid_y + 5
                                                window_bbox = list(lx:ly hx:hy)
                                                axlWindowBoxSet( window_bbox)
                                        );if
                                );foreach
                        );foreach                        
                );List1
               
                ("Delete"                        
                        ;删除list里选中的项                                
                        axlFormListDeleteItem(myform2 "List1" selected_list)
                        
                        ;删除PCB中的过孔                        
                        foreach(sel_via selected_list        
                                foreach(com_list index_dbid_list_list
                                        index_num2 = nth(0 com_list)
                                        via_dbid = nth(1 com_list)
                                        Via_XY = "  "
                                        sprintf(Via_XY "%L" via_dbid->xy)
                                        sprintf(Via_index "VIA%d" index_num2)
                                        Via_XY_index = strcat(Via_XY "  " Via_index)
                                        if(Via_XY_index==sel_via then
                                                axlDeleteObject( via_dbid t)                                                
                                        );if
                                );foreach        
                        );foreach                                                        
                );delete
               
        );case
);procedure        

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

本版积分规则

Archiver|手机版|网站地图|Cadence Skill 论坛 ( 蜀ICP备13024417号 )

GMT+8, 2024-11-23 20:05 , Processed in 0.122408 second(s), 16 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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