一种用于器件聚拢的功能
在16.x版本的平台上,具体功能和用法见说明。由于不常布局,写完之后用的不多,里面有些地方不太完善,但不影响使用效果,我也没心思改了,谁有兴趣拿去改改,改好了贴上来分享。;************************************************************************************;Symbol Gather beta1.0
;
;功能概述:类似Protel交互布局时器件的聚拢。
;
;使用说明: 首先加载此il文件,在pcbenv文件目录下的allegro.ilinit最后一行添加
; load("symbol_gather.il"),axlCmdRegister("gs" 'gather_sym)中的"gs"
; 为启动命令关键字,可以自定义此关键字。
;
;功能明细 1. 通过在CIW窗口输入gs或者其他已经自定义的命令,启动功能窗体。
; 2. 在打开Gather Symbols窗口后,应点击Start/End命令来激活交互功能(此按钮为避免内存浪费)
; 3. 聚拢功能是以激活高亮器件的操作来执行的,如若需要聚拢必须(只允许)先高亮这些目标器件。
; 6. 窗口中的Hilight按钮的意义是:通过点击按钮可以执行高亮操作。
; 4. 可在Capture或Concept HDL原理图交互高亮器件,在功能窗口将显示这些目标器件位号。
; 5. 若Active Symbols表中有位号显示,则表示可以执行Gather命令执行内聚。
; 6. 点击Gather按钮,则将产生内聚示意图。
; 7. 当布局结束必须点击Start/End来结束命令。
;
;
;作者:chen_ck
;
;升级历史
axlCmdRegister("gs" , 'gather_sym)
defun( gather_sym ()
let( (path p)
Path = "./_gathersym.form"
p = outfile( Path "w")
fprintf(p "FILE_TYPE=FORM_DEFN VERSION=2\n")
fprintf(p "FORM\n")
fprintf(p "FIXED\n")
fprintf(p "PORT 30 11\n")
fprintf(p "HEADER \"Gather Symbol\"\n")
fprintf(p "TILE\n")
fprintf(p "TEXT \"Active Symbols:\"\n")
fprintf(p "FLOC 3 1\n")
fprintf(p "ENDTEXT\n")
fprintf(p "FIELD ref_sym\n")
fprintf(p "FLOC 2 3\n")
fprintf(p "LIST \"\" 10 10\n")
fprintf(p "OPTIONS multiselect\n")
fprintf(p "ENDFIELD\n")
fprintf(p "FIELD gather\n")
fprintf(p "FLOC 15 4\n")
fprintf(p "MENUBUTTON \"Gather\" 12 5\n")
fprintf(p "ENDFIELD\n")
fprintf(p "FIELD hilight\n")
fprintf(p "FLOC 15 10\n")
fprintf(p "MENUBUTTON \"Hilight\" 12 5\n")
fprintf(p "ENDFIELD\n")
fprintf(p "FIELD startend\n")
fprintf(p "FLOC 15 16\n")
fprintf(p "MENUBUTTON \"Start/End\" 12 5\n")
fprintf(p "ENDFIELD\n")
fprintf(p "TEXT \"Gather Mode:\"\n")
fprintf(p "FLOC 15 21\n")
fprintf(p "ENDTEXT\n")
fprintf(p "TEXT\n")
fprintf(p "FLOC 25 21\n")
fprintf(p "INFO msg 20\n")
fprintf(p "FSIZE 20 2\n")
fprintf(p "ENDTEXT\n")
fprintf(p "ENDTILE\n")
fprintf(p "ENDFORM\n")
close(p)
axlFormCreate('gather"_gathersym" '("msglines" 1) 'gatherCB t nil)
axlUIWPerm(gather t)
axlFormDisplay(gather)
deleteFile(Path)
);let
kg = 0
axlFormSetField( gather "msg" "OFF")
);
defun( gatherCB (gather)
targ = nil
case(gather->curField
("gather"
if(reflist == nil
then
axlUIWPrint(gather "Please Hilight symbols First!")
else
output())
);#1
("hilight"
if(kg == 0
then
axlUIWPrint(gather "Please Enable START/END Mode!")
else
hilight()
);if
);#2
("startend"
tig_Ld_Uld()
);#3
);case
case(gather->doneState
(3 axlTriggerClear('xprobe 'myxprobe))
);case
reflist = nil
);defun
defun( hilight ()
targ = nil
axlFormListDeleteAll(gather "ref_sym" )
axlShell("hilight")
);
defun(myxprobe (items)
if(car(items) == 'highlight
then
targ = cons(caadr(items)->refdes targ)
);if
axlFormListDeleteAll(gather "ref_sym" )
when(member(nil targ) targ = remove(nil targ))
targ = unique(targ)
axlFormSetField( gather "ref_sym" targ)
reflist = targ
);defun
defun( tig_Ld_Uld ()
if(kg == 0
then
kg = 1
axlTriggerSet('xprobe 'myxprobe)
axlFormSetField( gather "msg" "ON")
else
kg = 0
axlTriggerClear('xprobe 'myxprobe)
axlFormSetField( gather "msg" "OFF")
)
);defun
defun(output ()
axlShell("done")
axlClearSelSet()
axlSetFindFilter(?enabled list( "noall" "symbols") ?onButtons list( "noall" "symbols"))
sym = makeTable("Symbol" nil)
k = 0
LenX = 0
LenY = 0
foreach(db reflist
k++ ;
sym = gensym()
tmp = car(axlSelectByName("REFDES" db))
sym->db = tmp
foreach(db0 tmp->children
layer = cadr(parseString(db0->layer "/"))
if(layer == "PLACE_BOUND_TOP" || layer == "PLACE_BOUND_BOTTOM"
then
box = db0->bBox
);if
);foreach
sym->lenH = xCoord(cadr(box)) - xCoord(car(box))
sym->lenV = yCoord(cadr(box)) - yCoord(car(box))
sym->Xo = xCoord(car(box))
sym->Yo = yCoord(car(box))
path = list( 0 : 0
sym->lenH : 0
sym->lenH : sym->lenV
0 : sym->lenV
0 : 0
);path list
outline = axlPathStart(path)
sym->otl = outline
LenX = LenX + sym->lenH
LenY = LenY + sym->lenV
);foreach
PlenX1 = 0
PlenX2 = 0
PlenX3 = 0
Rsec = 0
Rtht = 0
PlenY = 0
PlenY1 = 0
for(i 1 k
if(PlenX1 <= LenX / 3
then
PlenX1 = PlenX1 + sym->lenH
org = -(PlenX1 - sym->lenH) : PlenY
else if(PlenX2 <= LenX / 3
then
when(PlenX2 == 0 Rsec = sym->lenH)
PlenX2 = PlenX2 + sym->lenH
PlenY = sym->lenV +50
org = -(PlenX2 - Rsec ) : PlenY
when(PlenY1 == 0 PlenY1 = PlenY)
else
when(PlenX3 == 0 Rtht = sym->lenH)
PlenX3 = PlenX3 + sym->lenH
PlenY = PlenY1 + sym->lenV +50
org = -(PlenX3 - Rtht ) : PlenY
);else if
);if
axlAddSimpleMoveDynamics(org outline "path" ?ref_point 0:0)
sym->Xt = - car(org)
sym->Yt = - cadr(org)
);for
if(pic = axlEnterPoint()
then
move(pic)
);if
);defun
defun( move (pick)
for(i 1 k
relaxy = car(pick) - sym->Xo + sym->Xt : cadr(pick) - sym->Yo + sym->Yt
axlTransformObject(sym->db, ?move relaxy)
);
axlClearDynamics()
axlFormListDeleteAll(gather "ref_sym" )
);defun
感谢分享…… 布局很有用。多谢
感谢分享……
布局很有用。多谢 谢谢楼主分享
感谢分享~~~~~~~~~~~~~ :lol:lol:lol:lol:lol:lol:lol:lol:lol 很好用的样子,试试 布局很有用。多谢