EDA365电子工程师网
标题:
[求助]在Set telskill窗口输入程序名,正常;但在command输入指令,Form中按钮不可用
[打印本页]
作者:
yihafewu
时间:
2018-2-5 13:09
标题:
[求助]在Set telskill窗口输入程序名,正常;但在command输入指令,Form中按钮不可用
以下程序,在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
作者:
deargds
时间:
2018-2-27 13:50
16.6测试没问题
作者:
yihafewu
时间:
2018-2-27 14:01
deargds 发表于 2018-2-27 13:50
16.6测试没问题
版主大哥,感谢你的回复。我的版本也是16.6,可就是不行。
不研究它了,还是自己的基本功不够扎实,还给老师了。
欢迎光临 EDA365电子工程师网 (https://bbs.elecnest.cn/)
Powered by Discuz! X3.2