找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

巢课
电巢直播8月计划
查看: 906|回复: 10
打印 上一主题 下一主题

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

[复制链接]

57

主题

181

帖子

2349

积分

四级会员(40)

Rank: 4Rank: 4Rank: 4Rank: 4

积分
2349
跳转到指定楼层
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还是报错了,当然只要不是挨的非常近的都不报错。


不知道还有没更好的判断方法,求指导,谢谢!
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏1 支持!支持! 反对!反对!

7

主题

444

帖子

4989

积分

EDA365版主(50)

Rank: 5

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

57

主题

1857

帖子

7919

积分

六级会员(60)

Rank: 6Rank: 6

积分
7919
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

57

主题

181

帖子

2349

积分

四级会员(40)

Rank: 4Rank: 4Rank: 4Rank: 4

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

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

7

主题

444

帖子

4989

积分

EDA365版主(50)

Rank: 5

积分
4989
5#
发表于 2013-11-26 15:37 | 只看该作者

57

主题

181

帖子

2349

积分

四级会员(40)

Rank: 4Rank: 4Rank: 4Rank: 4

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






57

主题

181

帖子

2349

积分

四级会员(40)

Rank: 4Rank: 4Rank: 4Rank: 4

积分
2349
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来判断还是有误报。

39

主题

228

帖子

968

积分

三级会员(30)

Rank: 3Rank: 3Rank: 3

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

7

主题

444

帖子

4989

积分

EDA365版主(50)

Rank: 5

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

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

7

主题

444

帖子

4989

积分

EDA365版主(50)

Rank: 5

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

定义"叠在一起"

1

主题

209

帖子

173

积分

二级会员(20)

Rank: 2Rank: 2

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

本版积分规则

关闭

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

巢课

技术风云榜

关于我们|手机版|EDA365 ( 粤ICP备18020198号 )

GMT+8, 2024-11-15 07:12 , Processed in 0.061515 second(s), 32 queries , Gzip On.

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

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

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