明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1151|回复: 3

[讨论] 文字碰撞程序求优化

[复制链接]
发表于 2015-9-18 09:48 | 显示全部楼层 |阅读模式
如果文字或者标注里面的文字, 如果有碰撞,
则圈出来他们,感觉速度不行,求优化速度!
基本的算法原理,源代码里面有!
  1. ;获得标注中的多行文字的文字框的坐标, 返回四个点组成的list (包含中心点, 直径*0.6),默认对齐方式71 是5
  2. ;(entget ssn)
  3. (defun getdimlist(ssn / ABC ABCNAME ABCNAMEDATA GD ITTYPE KD KKK PT10 PTA PTB PTC PTD ROT )
  4.     ;获得标注所对应的块名, 通过块名找到块组码, 再找到图元名
  5.     (setq abc (tblsearch "BLOCK" (cdr(assoc 2 (entget ssn)))))
  6.     (setq abcname (cdr(assoc -2 abc)))
  7.     ;通过循环获得标注文字,是多行文字!
  8.     (setq kkk 8888)
  9.     (while kkk
  10.         (if (and
  11.               (setq ittype (cdr(assoc 0 (entget abcname))))
  12.               (equal ittype "MTEXT")
  13.             )
  14.             (setq kkk nil)
  15.             (if(setq abcname (entnext abcname))
  16.               (progn
  17.                   (setq ittype (cdr(assoc 0 (entget abcname))))
  18.                   (if (equal ittype "MTEXT")
  19.                       (setq kkk nil)
  20.                   )
  21.               )
  22.             )
  23.         )
  24.     )
  25.     ;找到了多行文字, 现在要求返回坐标, 先找到插入点, 宽度\高度
  26.     (setq abcnamedata (entget abcname))
  27.     (setq pt10(cdr(assoc 10 abcnamedata)));插入点
  28.     (setq kd  (cdr(assoc 42 abcnamedata)))
  29.     (setq gd  (cdr(assoc 43 abcnamedata)))
  30.     (setq rot (cdr(assoc 50 abcnamedata)))
  31.     (setq pta (polar(polar pt10 rot (* 0.5 kd))(+ rot(* 0.5 pi))(* 0.5 gd)))
  32.     (setq ptb (polar pta (+ rot pi)kd))
  33.     (setq ptc (polar ptb (+ rot (* 1.5 pi))gd))
  34.     (setq ptd (polar ptc rot kd))
  35.     (list pta ptb ptc ptd pt10 (* 0.6 (distance pta ptc)))
  36. )
  37. ;获得单行文字的包围坐标,中心点,半径
  38. (defun gettextlist(ssn / GD KD KDGD PT10 PTA PTB PTC PTD ROT SSDATA)
  39.   (setq ssdata (entget ssn))
  40.   (setq kdgd (nth 1 (textbox ssdata)))
  41.   (setq kd (nth 0 kdgd))
  42.   (setq gd (nth 1 kdgd))
  43.   (setq pta (cdr(assoc 10 ssdata)))
  44.   (setq rot (cdr(assoc 50 ssdata)))
  45.   (setq ptb (polar pta rot kd))
  46.   (setq ptc (polar ptb (+ rot (* 0.5 pi))gd))
  47.   (setq ptd (polar ptc (+ rot (* 1.0 pi))kd))
  48.   (setq pt10 (mapcar(function(lambda(x y)(* 0.5 (+ x y))))pta ptc))
  49.   (list pta ptb ptc ptd pt10 (* 0.6 (distance pta ptc)))
  50. )

  51. ;主要程序, 检查文字碰撞, 如果有碰撞,则包围圈
  52. ;基本思路:先通过找文字与尺寸标注里面的文字, 然后找到包围文字的四边形,再通过四边形选择四边形,如果
  53. ;四边形的个数大于1,则表示文字有碰撞,否则文字不碰撞.
  54. (defun c:tt( / ENTYPE I PT1 PT2 PT3 PT4 PTABCD PTBJ PTCENTER PTLIST SS SS2 SSA SSB SSDATA SSN TCACOLOR TCANAME)
  55.   (prompt"\n检查标注文字以及文字碰撞,碰撞则单独一个图层画圆圈出来!")
  56.   (if(and(setq ss (ssget(list
  57.                             (cons -4 "<OR")
  58.                                 (cons 0 "TEXT,DIMENSION")
  59.                                 (cons -4 "<AND")
  60.                                     (cons 0 "LWPOLYLINE")
  61.                                     (cons 8 "CGM_REC_")
  62.                                     (cons 90 4)
  63.                                     (cons 62 44)
  64.                                     (cons 70 1)
  65.                                 (cons -4 "AND>")
  66.                                 (cons -4 "<AND")
  67.                                     (cons 0 "LWPOLYLINE")
  68.                                     (cons 8 "CGM_重叠矩形")
  69.                                     (cons 90 4)
  70.                                     (cons 62 1)
  71.                                     (cons 70 1)
  72.                                 (cons -4 "AND>")
  73.                             (cons -4 "OR>")
  74.                         )))
  75.          (or
  76.              (setq i -1 ssa (ssadd) ssb (ssadd))
  77.              (repeat(sslength ss)
  78.                  (setq i (1+ i))
  79.                  (setq ssn (ssname ss i))
  80.                  (setq entype (cdr(assoc 0 (entget ssn))))
  81.                  (if(equal entype "LWPOLYLINE")
  82.                      (setq ssb (ssadd ssn ssb))
  83.                      (setq ssa (ssadd ssn ssa))
  84.                  )
  85.              )
  86.              (setq ss ssa)
  87.              (if(>(sslength ssb)0)(command"_ERASE" ssb ""))
  88.              T
  89.          )
  90.      )
  91.     (progn
  92.       (setq i -1)
  93.       (setq tcaname "CGM_REC_" tcacolor 44)
  94.       (repeat(sslength ss)
  95.         (setq i (1+ i))
  96.         (setq ssn (ssname ss i))
  97.         (setq ssdata (entget ssn))
  98.         (if (equal(cdr(assoc 0 ssdata))"TEXT")
  99.           (setq ptlist (gettextlist ssn))
  100.           (setq ptlist (getdimlist ssn))
  101.         )
  102.         (setq pt1 (nth 0 ptlist))
  103.         (setq pt2 (nth 1 ptlist))
  104.         (setq pt3 (nth 2 ptlist))
  105.         (setq pt4 (nth 3 ptlist))
  106.         (setq ptabcd (list pt1 pt2 pt3 pt4)
  107.               ptcenter (nth 4 ptlist)
  108.               ptbj     (nth 5 ptlist)
  109.         )
  110.         (makerec pt1 pt2 pt3 pt4 tcaname tcacolor)
  111.       );repeat
  112.       ;通过多段线选择,看选择到的多段线的个数是否大于1,大于1则重叠!
  113.       (if(setq ss (ssget"X"(list
  114.                             (cons 0 "LWPOLYLINE")
  115.                             (cons 8 tcaname)
  116.                             (cons 90 4)
  117.                             (cons 62 tcacolor)
  118.                             (cons 70 1)
  119.                         )))
  120.         (progn
  121.           (setq i -1)
  122.           (repeat(sslength ss)
  123.             (setq i (1+ i))
  124.             (setq ssdata (entget(ssname ss i)))
  125.             (setq ptlist (mapcar 'cdr (vl-remove-if(function(lambda(x)(/=(car x)10)))ssdata)))
  126.             (if (and
  127.                   (setq ss2 (ssget "CP" ptlist (list
  128.                                                     (cons 0 "LWPOLYLINE")
  129.                                                     (cons 8 tcaname)
  130.                                                     (cons 90 4)
  131.                                                     (cons 62 tcacolor)
  132.                                                     (cons 70 1)
  133.                                                )))
  134.                   (>(sslength ss2)1)
  135.                 )
  136.               (progn
  137.                   (makerec (nth 0 ptlist) (nth 1 ptlist) (nth 2 ptlist) (nth 3 ptlist) "CGM_重叠矩形" 1)
  138.               )
  139.             )
  140.           );repeat
  141.           (command"_ERASE" ss "")
  142.         )
  143.       );if
  144.     )
  145.   )
  146. )

  147. ;生成矩形多段线,用来被判定!
  148. (defun makerec(pt1 pt2 pt3 pt4 tcname tccolor / )
  149.     (entmake
  150.       (list
  151.           (cons 0 "LWPOLYLINE")
  152.           (cons 100 "AcDbEntity")
  153.           (cons 67 0)
  154.           (cons 410 "Model")
  155.           (cons 8 tcname)
  156.           (cons 100 "AcDbPolyline")
  157.           (cons 90 4)
  158.           (cons 62 tccolor)
  159.           (cons 70 1)
  160.           (cons 43 0.0)
  161.           (cons 38 0.0)
  162.           (cons 39 0.0)
  163.           (cons 10 pt1)
  164.           (cons 40 0.0)
  165.           (cons 41 0.0)
  166.           (cons 42 0.0)
  167.           (cons 10 pt2)
  168.           (cons 40 0.0)
  169.           (cons 41 0.0)
  170.           (cons 42 0.0)
  171.           (cons 10 pt3)
  172.           (cons 40 0.0)
  173.           (cons 41 0.0)
  174.           (cons 42 0.0)
  175.           (cons 10 pt4)
  176.           (cons 40 0.0)
  177.           (cons 41 0.0)
  178.           (cons 42 0.0)
  179.           (list 210 0.0 0.0 1.0)
  180.       )
  181.     )
  182. )
需要下载代码的,可以直接下载附件

本帖子中包含更多资源

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

x
"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2015-9-21 09:50 | 显示全部楼层
顶一下,对学习标注文字避让应该很有用,谢谢分享!
发表于 2015-9-21 19:32 | 显示全部楼层
建议直接从CGM_REC_图层的矩形中创建一个有碰撞的矩形列表clash,在判断前首先判断矩形是否属于clash,如果属于直接跳过,否则才执行选择判断,如果只有一个实体,可直接删除该矩形,否则将选中的实体全部加入clash,这样应该可以减少逐一运算的个数,提高速度。
如此处理完成后,图内剩下的CGM_REC_图层矩形即为有碰撞的位置。
 楼主| 发表于 2015-9-25 12:28 | 显示全部楼层
mmmmmm 发表于 2015-9-21 19:32
建议直接从CGM_REC_图层的矩形中创建一个有碰撞的矩形列表clash,在判断前首先判断矩形是否属于clash,如果 ...

不是太明白啥意思?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-3-29 16:11 , Processed in 0.216617 second(s), 30 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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