明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1608|回复: 7

判断两个text是否重叠

[复制链接]
发表于 2005-12-26 12:43 | 显示全部楼层 |阅读模式

我写了一个判断两个text是否重迭的程序,觉得有点啰嗦,不知诸位有什么更加方便的方法?

;调用方式
;(if_text_attach (entget (car (entsel))) (entget (car (entsel))))

(defun if_text_attach (text1 text2 /  text1_rec text2_rec text1_cor text2_cor text1_cor_x text1_cor_y
                                      text2_cor_x text2_cor_y dis1_x dis1_y dis2_x dis2_y list1_x list1_y
                                      1l_b_x 1l_b_y 1r_t_x 1r_t_y 1l_t_x 1l_t_y 1r_b_x 1r_b_y
                                      2l_b_x 2l_b_y 2r_t_x 2r_t_y 2l_t_x 2l_t_y 2r_b_x 2r_b_y
                                      num)

  (setq text1_rec (textbox text1)) ;得到字的框
  (setq text2_rec (textbox text2))
  (get_2_number (car text1_rec));取出框的坐标信息
  (setq 1l_b_x list1_x
        1l_b_y list1_y
  )
  (get_2_number (cadr text1_rec))
  (setq 1r_t_x list1_x
        1r_t_y list1_y
  )
  (get_2_number (car text2_rec))
  (setq 2l_b_x list1_x
        2l_b_y list1_y
  )
  (get_2_number (cadr text2_rec))
  (setq 2r_t_x list1_x
        2r_t_y list1_y
  )
(setq dis1_x (- 1r_t_x 1l_b_x)) ;得出矩形框的边长
(setq dis1_y (- 1r_t_y 1l_b_y))
(setq dis2_x (- 2r_t_x 2l_b_x))
(setq dis2_y (- 2r_t_y 2l_b_y))

(setq text1_cor (cdr (assoc 10 text1))) ;取出文的控制点(默认在左下角)
   (setq text1_cor_x (car text1_cor)
         text1_cor_y (cadr text1_cor)
   )
(setq text2_cor (cdr (assoc 10 text2)))
   (setq text2_cor_x (car text2_cor)
         text2_cor_y (cadr text2_cor)
   )

;算出两个文本各自四个角点的坐标值
(setq 1l_b_x text1_cor_x)
(setq 1l_b_y text1_cor_y)
(setq 1r_t_x (+ text1_cor_x dis1_x))
(setq 1r_t_y (+ text1_cor_y dis1_y))
(setq 1l_t_x text1_cor_x)
(setq 1l_t_y (+ text1_cor_y dis1_y))
(setq 1r_b_x (+ text1_cor_x dis1_x))
(setq 1r_b_y text1_cor_y)

(setq 2l_b_x text2_cor_x)
(setq 2l_b_y text2_cor_y)
(setq 2r_t_x (+ text2_cor_x dis2_x))
(setq 2r_t_y (+ text2_cor_y dis2_y))
(setq 2l_t_x text2_cor_x)
(setq 2l_t_y (+ text2_cor_y dis2_y))
(setq 2r_b_x (+ text2_cor_x dis2_x))
(setq 2r_b_y text2_cor_y)
 
;判断四个角点是不是在另一个text之内
 (cond ((and (and (< 1l_b_x 2r_t_x) (> 1l_b_x 2l_b_x)) (and (< 1l_b_y 2r_t_y) (> 1l_b_y 2l_b_y))) (setq num 1))
       ((and (and (< 1r_t_x 2r_t_x) (> 1r_t_x 2l_b_x)) (and (< 1r_t_y 2r_t_y) (> 1r_t_y 2l_b_y))) (setq num 1))
       ((and (and (< 1l_t_x 2r_t_x) (> 1l_t_x 2l_b_x)) (and (< 1l_t_y 2r_t_y) (> 1l_t_y 2l_b_y))) (setq num 1))
       ((and (and (< 1r_b_x 2r_t_x) (> 1r_b_x 2l_b_x)) (and (< 1r_b_y 2r_t_y) (> 1r_b_y 2l_b_y))) (setq num 1))

       ((and (and (< 2l_b_x 1r_t_x) (> 2l_b_x 1l_b_x)) (and (< 2l_b_y 1r_t_y) (> 2l_b_y 1l_b_y))) (setq num 1))
       ((and (and (< 2r_t_x 1r_t_x) (> 2r_t_x 1l_b_x)) (and (< 2r_t_y 1r_t_y) (> 2r_t_y 1l_b_y))) (setq num 1))
       ((and (and (< 2l_t_x 1r_t_x) (> 2l_t_x 1l_b_x)) (and (< 2l_t_y 1r_t_y) (> 2l_t_y 1l_b_y))) (setq num 1))
       ((and (and (< 2r_b_x 1r_t_x) (> 2r_b_x 1l_b_x)) (and (< 2r_b_y 1r_t_y) (> 2r_b_y 1l_b_y))) (setq num 1))
 )

 (if (= num 1)
    (princ  " This tow text is attached.")
    (princ  " This tow text is separated.")
 )

    
)

(defun get_2_number (a / )
  (setq list1_x (car a))
  (setq list1_y (cadr a))
)

"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2006-1-15 22:45 | 显示全部楼层

我这个用来查重迭的相同内容文字

(defun c:txtdbl (/  ss_txt  txtback i_poot  txt1  txt2
   txt3  pt1  pt2  txtstra txthigh pt2x
   pt2y  pt2x1
  )
  (initget 7)
  (setq ss_ec (getstring "Seclet Object / Layer Name/ <All>:"))
  (if (or (= ss_ec "a")
   (= ss_ec "A")
   (= ss_ec "all")
   (= ss_ec "ALL")
      )
    (progn
      (setq ss_txt (ssget "x" (list (cons 0 "text"))))
      (command "layer" "n" "text" "")
      (command "change" ss_txt "" "p" "la" "text" "" "")
      (setq txtback ss_txt)
      (setq txtnum (sslength txtback))
      (setq i_poot 0)
      (setq dt nil)
      (if (< ipoot txtnum)
 (while
   (setq txt1 (entget (ssname txtback i_poot)))
    (setq txtstra (assoc 10 txt1))
    (setq txthigh (assoc 40 txt1))
    (setq pt1 (cdr txtstra))
    (setq pt2x (cadr txtstra))
    (setq pt2y (+ (caddr txtstra) (cdr txthigh)))
    (setq pt2x1 (+ pt2x 0.0000001))
    (setq pt2 (list pt2x1 pt2y))
    (setq txt2 (ssget "c" pt1 pt2 '((8 . "text"))))
    (if (/= txt2 nil)
      (progn
        (setq txtnum2 (sslength txt2))
        (if (/= txtnum2 1)
   (progn
     (setq i_txtnum 1)
     (while
       (if (< i_txtnum txtnum2)
         (progn
    (setq txt3 (ssname txt2 i_txtnum))
    (command "layer" "n" "doublue" "")
    (command "change"   txt3   ""
      "p"   "la"   "doublue"
      ""   ""
     )
    (setq i_txtnum (1+ i_txtnum))
         )
       )
     )
   )
        )
      )
      (setq dt txt2)
    )
    (setq i_poot (+ i_poot 1))
 )
      )
    )
  )
)

 

 

 

发表于 2006-1-16 11:11 | 显示全部楼层
本帖最后由 作者 于 2006-1-16 11:40:11 编辑

取得文字边框用Textbox函数好像不行哦

看看试验,选同一文字对象,两个函数返回结果:

命令: (textbox (list (assoc '1 (entget(car(entsel))))))
选择对象: ((0.0 0.0 0.0) (6.66667 2.5 0.0))
命令: (acet-ent-geomextents  (car(entsel)))
选择对象: ((5088.16 -748.792 0.0) (5094.94 -742.705 0.0))

说明Textbox函数只能取得文字串的总宽度和文字高度,而Acet-函数得到的是包围文字的实际范围框的左下角点和右上角点坐标

发表于 2006-3-28 19:00 | 显示全部楼层

两个TEXT重迭的定义是怎么样的?

发表于 2006-3-28 19:21 | 显示全部楼层
4楼提的问题有道理,以我的观点,只要有点迭加就应该算重迭,也许楼主要的是完全重迭的
发表于 2006-3-28 19:49 | 显示全部楼层
  1. (defun c:test ()
  2.   (setq e1 (car (entsel))
  3. e2 (car (entsel))
  4.   )
  5.   (test-ch e1 e2)
  6. )
  7. (load "xyp_lib.vlx")   ;版本 V.20060314
  8. ;|下载和加载通用函数(可在签名栏直接下载后放到搜索路径下)
  9. 利用以下任何一种方式(首选第一种)即可加载和运行通用函数内的所有子程序:
  10. ★1·在acad.lsp中增加(load"xyp_lib")
  11. ■2·在每个程序内增加(load"xyp_lib")
  12. ■3·在command下,输入(load"xyp_lib")
  13. ■4·在菜单.mnl中增加(load"xyp_lib")
  14. ■5·将xyp_lib.vlx文件直接拽到cad屏幕
  15. [COLOR=red] ★通用函数下载地址:[/COLOR]
  16. [url]http://bbs.mjtd.com/forum.php?mod=viewthread&tid=37554[/url]
  17. |;
  18. (defun test-ch (s1 s2)
  19.   (setq t1    (xyp-get-dxf 1 s1)
  20. t2    (xyp-get-dxf 1 s2)
  21. pt1-1 (xyp-get-MinMaxPoint s1 1)
  22. pt1-9 (xyp-get-MinMaxPoint s1 9)
  23. pt2-1 (xyp-get-MinMaxPoint s2 1)
  24. pt2-9 (xyp-get-MinMaxPoint s2 9)
  25. a51-1 (xyp-get-dxf 51 s1)
  26. a51-2 (xyp-get-dxf 51 s2)
  27.   )
  28.   (if (and (not (equal s1 s2))
  29.     (equal t1 t2)
  30.     (equal pt1-1 pt2-1)
  31.     (equal pt1-9 pt2-9)
  32.     (equal a51-1 a51-2)
  33.       )
  34.     T
  35.     NIL
  36.   )
  37. )
发表于 2006-3-29 19:46 | 显示全部楼层

我觉得用textbox也许能行吧

如果两个文字一样的话,这个矩形框就应该是一样的

还有一点就是文字的基点。

这两点加在一起,应该可以了。

发表于 2006-3-30 17:28 | 显示全部楼层
    (setq en_data (entget en))
    (setq dxf10 (cdr (assoc 10 en_data)))
    (setq tbox (textbox en_data))
    (setq pt1 (mapcar '+ (car tbox) dxf10))
    (setq pt2 (mapcar '+ (cadr tbox) dxf10))
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-6-24 19:47 , Processed in 0.147783 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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