chuankay 发表于 2014-5-15 16:41:28

一种用于器件聚拢的功能

在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




   

375259768 发表于 2014-5-15 16:56:45

感谢分享……

vivienluo 发表于 2014-5-15 21:17:33

布局很有用。多谢

笨笨猪 发表于 2014-5-15 23:52:21


感谢分享……

bingshuihuo 发表于 2014-5-16 08:48:43


布局很有用。多谢

owencai 发表于 2014-5-17 21:35:17

谢谢楼主分享

stevenzhu 发表于 2014-8-27 21:33:12

感谢分享~~~~~~~~~~~~~

menglide 发表于 2014-8-31 16:51:48

:lol:lol:lol:lol:lol:lol:lol:lol:lol

cuiergongzhu 发表于 2015-8-28 09:21:28

很好用的样子,试试

bingshuihuo 发表于 2015-9-2 17:03:15

布局很有用。多谢
页: [1] 2 3 4
查看完整版本: 一种用于器件聚拢的功能