EDA365电子论坛网

标题: 求一个判断两个位号是否重叠的方法? [打印本页]

作者: yneda    时间: 2013-11-25 10:54
标题: 求一个判断两个位号是否重叠的方法?
本帖最后由 yneda 于 2013-11-25 11:05 编辑

如题,请高手指导下。
我是这样做的:

1、box = dbid_refdes->bBox,然后用这个box去框选,如果框选目标超过1两个则认为有可能重叠。
2、在上面框选的list里去排查:
prog((bOverLap)
     bOverLap = nil   
     foreach(item1 l_selects
            foreach(item2 remove(item1 l_selects)
                   if(caddr(axlAirGap(item1 item2)) == 0.0 then
                       bOverLap = t
                       renturn(bOverLap )
                      ) ;end if
             );end foreach
   );end foreach
return(bOverLap)
);end prog

这样再输出,可排查一部分,但发现还是有误报,因为我们调位号的时候因为空间有限,总是挨的非常的近,看上去虽然没重叠,但skill认为重叠了
主要是 axlAirGap(item1 item2)) == 0.0,虽然间距为0,但它们之间还是距离的,主要有是refdes有justify这个属性,有左对齐,右对齐等,虽然我们打印成PDF的时候,从图纸上看是没有重叠,skill还是报错了,当然只要不是挨的非常近的都不报错。


不知道还有没更好的判断方法,求指导,谢谢!
作者: betamelody    时间: 2013-11-25 13:55
axlAirGap有参数的,具体在哪一层做airgap比较要有说法
TEXT可以先转换成line然后比较
作者: XYX365    时间: 2013-11-26 08:24
這裡面有一個skill(丝印覆盖检查Text Overlap Check / check_text_overlap.il)你可以參考看看
https://www.eda365.com/forum.php? ... hlight=%BB%AA%CE%AA

作者: yneda    时间: 2013-11-26 11:24
betamelody 发表于 2013-11-25 13:55
axlAirGap有参数的,具体在哪一层做airgap比较要有说法
TEXT可以先转换成line然后比较

Text可以转换成Line?请问如何转换?要用到什么函数,我去查查看。
作者: betamelody    时间: 2013-11-26 15:37
https://www.eda365.com/forum.php? ... ghlight=TEXT%2BLINE
作者: yneda    时间: 2013-12-2 17:11
本帖最后由 yneda 于 2013-12-3 10:19 编辑
betamelody 发表于 2013-11-26 15:37
https://www.eda365.com/forum.php? ... ghlight=TEXT%2BLINE


版主你好,关于text to line的问题,我找到了一个用宏来实现的方法,但是调试时有一个问题,解决不了,麻烦你有时间帮忙看看,谢谢了,正好这几天没项目,一直在纠结这个问题。


;下面是代码,主要功能是把refdes 转换成Line,最终要得到 list(dibd_refdes list(line_segs)),但没完全写完,因为转换的时候就出错了。
alist = list(dibd_refdes1 dibd_refdes2)
TestMain(alist)

procedure(TestMain(o_dbidText)
     let((p tmpDbidText )
             p = axlVisibleGet()
             axlVisibleDesign(nil)
             axlVisibleLayer("MANUFACTURING/DETAILS" t)
         
             foreach(item o_dbidText
                 tmpDbidText = fnText2Text(item "MANUFACTURING/DETAILS") ;在新层里copy一个text,这样在bBox框选Text to Line的时候,防止多选。
                     fnText2Line(tmpDbidText "DETAILS");把新创建的text,在同层转换成Line
                     axlDeleteObject(tmpDbidText );删除刚创建的临时Text
                    );end foreach

                 axlVisibleSet(p)
                 axlShell("redraw")
                 t
                );end let
        );end procedure

procedure(fnText2Text(dbid_Text t_layer)
     let((myorient ret text xy block rotation isMirrored justify)
                 text = dbid_Text->text
                 xy = dbid_Text->xy
                 block = dbid_Text->textBlock
                 rotation = dbid_Text->rotation
                 isMirrored = dbid_Text->isMirrored
                 justify = dbid_Text->justify
             myorient = make_axlTextOrientation(?textBlock text, ?rotation rotation, ?mirrored isMirrored, ?justify justify)
                 ret = caar(axlDBCreateText(text, xy, myorient, t_layer, nil))
                );end let
        );end procedure

procedure(fnText2Line(dbid_Text t_sublayer)
     let((x1 y1 x2 y2 row1 row2 row3 row4 row5 row6 row7 row8 row9 row10 row11)
                 x1 = caar(dbid_Text->bBox)
                 y1 = cadar(dbid_Text->bBox)
                 x2 = caadr(dbid_Text->bBox)
                 y2 = cadadr(dbid_Text->bBox)
                 
                 row1 = "create detail; "
                 row2 = sprintf(nil "FORM mini subclass %s; " t_sublayer)
                 row3 = "FORM mini scale_factor 1.00; "
                 row4 = "FORM mini filled_pads YES; "
                 row5 = "FORM find all_off; "
                 row6 = "FORM find text YES; "
                 row7 = sprintf(nil "pick %L %L; " x1 y1)
                 row8 = sprintf(nil "pick %L %L; " x2 y2)
                 row9 = sprintf(nil "pick %L %L; " x1 y1)
                 row10 = sprintf(nil "prepopup %L %L; " x1 y1)
                 row11 ="Done"
                 axlShell(strcat(row1 row2 row3 row4 row5 row6 row7 row8 row9 row10 row11))
                 t
                );end let
        );end procedure

;调试的结果是,第一次循环到dibd_refdes1没问题,但到了dibd_refdes2的时候,提示axlDBCreateText这个函数运行错误,text = nil,所只转换了一个,不知道错在那里,或者有没有其它方法来转换,求指点,谢谢!







作者: yneda    时间: 2013-12-2 17:22
XYX365 发表于 2013-11-26 08:24
這裡面有一個skill(丝印覆盖检查Text Overlap Check / check_text_overlap.il)你可以參考看看
http://www. ...

Hi XYX365
    谢谢你提供的参考文件,我试了下还是有些误报,我想转成Line来比较,只要两个refdes_line里有任意两个Line seg相交,就认为这两个refdes有重叠,因为要把调好的丝印要打印成PDF,所以调丝印的时候,位号是靠的很近很近,现在要检查没有叠在一起就行了,用bBox或修正的bBox来判断还是有误报。
作者: molin    时间: 2013-12-3 11:18
https://www.eda365.com/thread-94250-1-1.html我这个帖子SKILL有这个功能 ,强大 的!!!
作者: betamelody    时间: 2013-12-3 12:44
yneda 发表于 2013-12-2 17:11
版主你好,关于text to line的问题,我找到了一个用宏来实现的方法,但是调试时有一个问题,解决不了, ...

将临时Text记录在一个list中   所有动作完成后一起删除
作者: betamelody    时间: 2013-12-3 12:46
yneda 发表于 2013-12-2 17:22
Hi XYX365
    谢谢你提供的参考文件,我试了下还是有些误报,我想转成Line来比较,只要两个refdes_line ...

定义"叠在一起"
作者: kkman2000    时间: 2015-8-22 09:33
支持支持支持  非常感謝




欢迎光临 EDA365电子论坛网 (https://bbs.eda365.com/) Powered by Discuz! X3.2