找回密码
 注册
关于网站域名变更的通知
查看: 1871|回复: 10
打印 上一主题 下一主题

求一个判断两个位号是否重叠的方法?

[复制链接]
  • TA的每日心情
    无聊
    2022-6-24 15:35
  • 签到天数: 2 天

    [LV.1]初来乍到

    跳转到指定楼层
    1#
    发表于 2013-11-25 10:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

    EDA365欢迎您登录!

    您需要 登录 才可以下载或查看,没有帐号?注册

    x
    本帖最后由 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还是报错了,当然只要不是挨的非常近的都不报错。


    不知道还有没更好的判断方法,求指导,谢谢!

    该用户从未签到

    2#
    发表于 2013-11-25 13:55 | 只看该作者
    axlAirGap有参数的,具体在哪一层做airgap比较要有说法
    TEXT可以先转换成line然后比较

    该用户从未签到

    3#
    发表于 2013-11-26 08:24 | 只看该作者
    這裡面有一個skill(丝印覆盖检查Text Overlap Check / check_text_overlap.il)你可以參考看看
    https://www.eda365.com/forum.php? ... hlight=%BB%AA%CE%AA
  • TA的每日心情
    无聊
    2022-6-24 15:35
  • 签到天数: 2 天

    [LV.1]初来乍到

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

    Text可以转换成Line?请问如何转换?要用到什么函数,我去查查看。

    该用户从未签到

    5#
    发表于 2013-11-26 15:37 | 只看该作者
  • TA的每日心情
    无聊
    2022-6-24 15:35
  • 签到天数: 2 天

    [LV.1]初来乍到

    6#
     楼主| 发表于 2013-12-2 17:11 | 只看该作者
    本帖最后由 yneda 于 2013-12-3 10:19 编辑


    版主你好,关于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,所只转换了一个,不知道错在那里,或者有没有其它方法来转换,求指点,谢谢!






  • TA的每日心情
    无聊
    2022-6-24 15:35
  • 签到天数: 2 天

    [LV.1]初来乍到

    7#
     楼主| 发表于 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来判断还是有误报。

    该用户从未签到

    8#
    发表于 2013-12-3 11:18 | 只看该作者
    https://www.eda365.com/thread-94250-1-1.html我这个帖子SKILL有这个功能 ,强大 的!!!

    该用户从未签到

    9#
    发表于 2013-12-3 12:44 | 只看该作者
    yneda 发表于 2013-12-2 17:11
    版主你好,关于text to line的问题,我找到了一个用宏来实现的方法,但是调试时有一个问题,解决不了, ...

    将临时Text记录在一个list中   所有动作完成后一起删除

    该用户从未签到

    10#
    发表于 2013-12-3 12:46 | 只看该作者
    yneda 发表于 2013-12-2 17:22
    Hi XYX365
        谢谢你提供的参考文件,我试了下还是有些误报,我想转成Line来比较,只要两个refdes_line ...

    定义"叠在一起"

    该用户从未签到

    11#
    发表于 2015-8-22 09:33 | 只看该作者
    支持支持支持  非常感謝
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

    推荐内容上一条 /1 下一条

    EDA365公众号

    关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

    GMT+8, 2025-6-8 19:08 , Processed in 0.078125 second(s), 23 queries , Gzip On.

    深圳市墨知创新科技有限公司

    地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

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