- 积分
- 15661
- 明经币
- 个
- 注册时间
- 2012-8-20
- 在线时间
- 小时
- 威望
-
- 金钱
- 个
- 贡献
-
- 激情
-
|
如果文字或者标注里面的文字, 如果有碰撞,
则圈出来他们,感觉速度不行,求优化速度!
基本的算法原理,源代码里面有! - ;获得标注中的多行文字的文字框的坐标, 返回四个点组成的list (包含中心点, 直径*0.6),默认对齐方式71 是5
- ;(entget ssn)
- (defun getdimlist(ssn / ABC ABCNAME ABCNAMEDATA GD ITTYPE KD KKK PT10 PTA PTB PTC PTD ROT )
- ;获得标注所对应的块名, 通过块名找到块组码, 再找到图元名
- (setq abc (tblsearch "BLOCK" (cdr(assoc 2 (entget ssn)))))
- (setq abcname (cdr(assoc -2 abc)))
- ;通过循环获得标注文字,是多行文字!
- (setq kkk 8888)
- (while kkk
- (if (and
- (setq ittype (cdr(assoc 0 (entget abcname))))
- (equal ittype "MTEXT")
- )
- (setq kkk nil)
- (if(setq abcname (entnext abcname))
- (progn
- (setq ittype (cdr(assoc 0 (entget abcname))))
- (if (equal ittype "MTEXT")
- (setq kkk nil)
- )
- )
- )
- )
- )
- ;找到了多行文字, 现在要求返回坐标, 先找到插入点, 宽度\高度
- (setq abcnamedata (entget abcname))
- (setq pt10(cdr(assoc 10 abcnamedata)));插入点
- (setq kd (cdr(assoc 42 abcnamedata)))
- (setq gd (cdr(assoc 43 abcnamedata)))
- (setq rot (cdr(assoc 50 abcnamedata)))
- (setq pta (polar(polar pt10 rot (* 0.5 kd))(+ rot(* 0.5 pi))(* 0.5 gd)))
- (setq ptb (polar pta (+ rot pi)kd))
- (setq ptc (polar ptb (+ rot (* 1.5 pi))gd))
- (setq ptd (polar ptc rot kd))
- (list pta ptb ptc ptd pt10 (* 0.6 (distance pta ptc)))
- )
- ;获得单行文字的包围坐标,中心点,半径
- (defun gettextlist(ssn / GD KD KDGD PT10 PTA PTB PTC PTD ROT SSDATA)
- (setq ssdata (entget ssn))
- (setq kdgd (nth 1 (textbox ssdata)))
- (setq kd (nth 0 kdgd))
- (setq gd (nth 1 kdgd))
- (setq pta (cdr(assoc 10 ssdata)))
- (setq rot (cdr(assoc 50 ssdata)))
- (setq ptb (polar pta rot kd))
- (setq ptc (polar ptb (+ rot (* 0.5 pi))gd))
- (setq ptd (polar ptc (+ rot (* 1.0 pi))kd))
- (setq pt10 (mapcar(function(lambda(x y)(* 0.5 (+ x y))))pta ptc))
- (list pta ptb ptc ptd pt10 (* 0.6 (distance pta ptc)))
- )
- ;主要程序, 检查文字碰撞, 如果有碰撞,则包围圈
- ;基本思路:先通过找文字与尺寸标注里面的文字, 然后找到包围文字的四边形,再通过四边形选择四边形,如果
- ;四边形的个数大于1,则表示文字有碰撞,否则文字不碰撞.
- (defun c:tt( / ENTYPE I PT1 PT2 PT3 PT4 PTABCD PTBJ PTCENTER PTLIST SS SS2 SSA SSB SSDATA SSN TCACOLOR TCANAME)
- (prompt"\n检查标注文字以及文字碰撞,碰撞则单独一个图层画圆圈出来!")
- (if(and(setq ss (ssget(list
- (cons -4 "<OR")
- (cons 0 "TEXT,DIMENSION")
- (cons -4 "<AND")
- (cons 0 "LWPOLYLINE")
- (cons 8 "CGM_REC_")
- (cons 90 4)
- (cons 62 44)
- (cons 70 1)
- (cons -4 "AND>")
- (cons -4 "<AND")
- (cons 0 "LWPOLYLINE")
- (cons 8 "CGM_重叠矩形")
- (cons 90 4)
- (cons 62 1)
- (cons 70 1)
- (cons -4 "AND>")
- (cons -4 "OR>")
- )))
- (or
- (setq i -1 ssa (ssadd) ssb (ssadd))
- (repeat(sslength ss)
- (setq i (1+ i))
- (setq ssn (ssname ss i))
- (setq entype (cdr(assoc 0 (entget ssn))))
- (if(equal entype "LWPOLYLINE")
- (setq ssb (ssadd ssn ssb))
- (setq ssa (ssadd ssn ssa))
- )
- )
- (setq ss ssa)
- (if(>(sslength ssb)0)(command"_ERASE" ssb ""))
- T
- )
- )
- (progn
- (setq i -1)
- (setq tcaname "CGM_REC_" tcacolor 44)
- (repeat(sslength ss)
- (setq i (1+ i))
- (setq ssn (ssname ss i))
- (setq ssdata (entget ssn))
- (if (equal(cdr(assoc 0 ssdata))"TEXT")
- (setq ptlist (gettextlist ssn))
- (setq ptlist (getdimlist ssn))
- )
- (setq pt1 (nth 0 ptlist))
- (setq pt2 (nth 1 ptlist))
- (setq pt3 (nth 2 ptlist))
- (setq pt4 (nth 3 ptlist))
- (setq ptabcd (list pt1 pt2 pt3 pt4)
- ptcenter (nth 4 ptlist)
- ptbj (nth 5 ptlist)
- )
- (makerec pt1 pt2 pt3 pt4 tcaname tcacolor)
- );repeat
- ;通过多段线选择,看选择到的多段线的个数是否大于1,大于1则重叠!
- (if(setq ss (ssget"X"(list
- (cons 0 "LWPOLYLINE")
- (cons 8 tcaname)
- (cons 90 4)
- (cons 62 tcacolor)
- (cons 70 1)
- )))
- (progn
- (setq i -1)
- (repeat(sslength ss)
- (setq i (1+ i))
- (setq ssdata (entget(ssname ss i)))
- (setq ptlist (mapcar 'cdr (vl-remove-if(function(lambda(x)(/=(car x)10)))ssdata)))
- (if (and
- (setq ss2 (ssget "CP" ptlist (list
- (cons 0 "LWPOLYLINE")
- (cons 8 tcaname)
- (cons 90 4)
- (cons 62 tcacolor)
- (cons 70 1)
- )))
- (>(sslength ss2)1)
- )
- (progn
- (makerec (nth 0 ptlist) (nth 1 ptlist) (nth 2 ptlist) (nth 3 ptlist) "CGM_重叠矩形" 1)
- )
- )
- );repeat
- (command"_ERASE" ss "")
- )
- );if
- )
- )
- )
- ;生成矩形多段线,用来被判定!
- (defun makerec(pt1 pt2 pt3 pt4 tcname tccolor / )
- (entmake
- (list
- (cons 0 "LWPOLYLINE")
- (cons 100 "AcDbEntity")
- (cons 67 0)
- (cons 410 "Model")
- (cons 8 tcname)
- (cons 100 "AcDbPolyline")
- (cons 90 4)
- (cons 62 tccolor)
- (cons 70 1)
- (cons 43 0.0)
- (cons 38 0.0)
- (cons 39 0.0)
- (cons 10 pt1)
- (cons 40 0.0)
- (cons 41 0.0)
- (cons 42 0.0)
- (cons 10 pt2)
- (cons 40 0.0)
- (cons 41 0.0)
- (cons 42 0.0)
- (cons 10 pt3)
- (cons 40 0.0)
- (cons 41 0.0)
- (cons 42 0.0)
- (cons 10 pt4)
- (cons 40 0.0)
- (cons 41 0.0)
- (cons 42 0.0)
- (list 210 0.0 0.0 1.0)
- )
- )
- )
需要下载代码的,可以直接下载附件
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?注册
x
|