明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1487|回复: 15

[经验] 多行文字 包围盒

[复制链接]
发表于 2024-8-28 17:06:19 | 显示全部楼层 |阅读模式
  1. ;选择集包围盒 -Lee Mac
  2. (defun LM:ssboundingbox(sel / idxllp ls1 ls2 obj urp)
  3. (repeat (setq idx(sslength sel))
  4. (setq obj (vlax-ename->vla-object(ssname sel(setq idx (1- idx)))))
  5. (if (and (vlax-method-applicable-p obj 'getboundingbox)
  6. (not (vl-catch-all-error-p (vl-catch-all-apply 'vla-getboundingbox (list obj 'llp 'urp))))
  7. )
  8. (setq ls1 (cons (vlax-safearray->list llp) ls1)
  9. ls2 (cons (vlax-safearray->list urp) ls2)
  10. )
  11. )
  12. )
  13. (if (and ls1 ls2)
  14. (mapcar '(lambda ( a b ) (apply 'mapcar (cons a b))) '(min max) (list ls1 ls2))
  15. )   
  16. )
以上是 lee 大佬的集合包围盒,发现对包含多行文字并不准确,不知有没有大佬有好的,可以分享下?不胜感激!
"觉得好,就打赏"
还没有人打赏,支持一下
 楼主| 发表于 2024-8-29 11:20:14 | 显示全部楼层
本帖最后由 yaojing38 于 2024-8-29 11:22 编辑

谢谢大佬们的解答,,摸了一点门道,,扩展了下
  1. ;选择集包围盒 -Lee Mac
  2. (defun LM:ssboundingboxex(sel / idxllp ls1 ls2 obj urp)
  3. (repeat (setq idx(sslength sel))
  4. (setq ent (ssname sel (setq idx (1- idx))))
  5. (if (= "MTEXT" (cdr (assoc 0  (entget ent))))
  6. (progn
  7.         (if (setq box11 (MTEXTBOX ent))
  8.         
  9.         (setq ls1 (cons (cadr box11) ls1)
  10. ls2 (cons (car box11) ls2)
  11. )
  12. )
  13.         
  14. )
  15. (progn
  16. (setq obj (vlax-ename->vla-object(ssname sel idx)))
  17. (if (and (vlax-method-applicable-p obj 'getboundingbox)
  18. (not (vl-catch-all-error-p (vl-catch-all-apply 'vla-getboundingbox (list obj 'llp 'urp))))
  19. )
  20. (setq ls1 (cons (vlax-safearray->list llp) ls1)
  21. ls2 (cons (vlax-safearray->list urp) ls2)
  22. )
  23. )
  24. )
  25. )
  26. )
  27. (if (and ls1 ls2 (princ ls1))
  28. (mapcar '(lambda ( a b ) (apply 'mapcar (cons a b))) '(min max) (list ls1 ls2))
  29. )   
  30. )
  31. ;选择集包围盒 -Lee Mac
  32. (defun LM:ssboundingbox(sel / idxllp ls1 ls2 obj urp)
  33. (repeat (setq idx(sslength sel))
  34. (setq obj (vlax-ename->vla-object(ssname sel(setq idx (1- idx)))))
  35. (if (and (vlax-method-applicable-p obj 'getboundingbox)
  36. (not (vl-catch-all-error-p (vl-catch-all-apply 'vla-getboundingbox (list obj 'llp 'urp))))
  37. )
  38. (setq ls1 (cons (vlax-safearray->list llp) ls1)
  39. ls2 (cons (vlax-safearray->list urp) ls2)
  40. )
  41. )
  42. )
  43. (if (and ls1 ls2)
  44. (mapcar '(lambda ( a b ) (apply 'mapcar (cons a b))) '(min max) (list ls1 ls2))
  45. )   
  46. )
  47. ;获取文本框四点坐标
  48. (Defun MTEXTBOX        (obj1 / B ENX H J N O R W)
  49.   (if (and (= "MTEXT" (cdr (assoc 0 (setq enx (entget obj1)))))
  50.            (setq n (cdr (assoc 210 enx))
  51.                  b (trans (cdr (assoc 10 enx)) 0 n)
  52.                                                      r (angle '(0.0 0.0 0.0) (trans (cdr (assoc 11 enx)) 0 n))
  53.                                                      r1 (angle  '(0.0 0.0 0.0) (trans (cdr (assoc 10 enx)) 0 n))
  54.                                                      w (cdr (assoc 42 enx))
  55.                  h (cdr (assoc 43 enx))
  56.                  j (cdr (assoc 71 enx))
  57.                  o (list
  58.                      (cond ((member j '(2 5 8)) (/ w -2.0))
  59.                            ((member j '(3 6 9)) (- w))
  60.                            (0.0)
  61.                      )
  62.                      (cond ((member j '(1 2 3)) (- h))
  63.                            ((member j '(4 5 6)) (/ h -2.0))
  64.                            (0.0)
  65.                      )
  66.                    )
  67.            )
  68.       )
  69.                
  70.                  ;(list (list (- (car o)) (- (cadr o)))
  71.    ;       (list (+ (car o) w) (- (cadr o)))
  72.    ;       (list (+ (car o) w) (+ (cadr o) h))
  73.    ;       (list (- (car o)) (+ (cadr o) h))
  74.    ; )
  75.                 (setq box1
  76.     (list  
  77.                              ;(list (- (car o)) (- (cadr o)))
  78.                              (polar (polar (list (+ (car o) w) (- (cadr o)))  r1 (distance '(0 0 0) b)) (* -0.5 pi) h)
  79.           ;(list (+ (car o) w) (- (cadr o)))
  80.            ;(list (+ (car o) w) (+ (cadr o) h))
  81.                              (polar (polar (list (- (car o)) (+ (cadr o) h)) r1 (distance '(0 0 0) b)) (* -0.5 pi) h)
  82.                         
  83.                         
  84.                 )
  85.                 )
  86.           ;(list (- (car o)) (+ (cadr o) h))
  87.     )
  88.         
  89.         (vl-cmdf "RECTANG" (car box1) (cadr box1))
  90.         box1
  91.   )

点评

四点不是WCS 的  发表于 2024-8-29 20:35
有矩形四个点坐标,直接command polyline或者entmake就行,不需要再返回去算来生成矩形  发表于 2024-8-29 11:39
 楼主| 发表于 2024-8-30 14:11:28 | 显示全部楼层
本帖最后由 yaojing38 于 2024-8-30 14:44 编辑

谢谢您的代码!
  1. <div class="blockcode"><blockquote>;Example
  2. ;(AQX: GETMTEXTBOX (car(entsel)) 0.0)
  3. ;((97346.9291.883)(61132.620869.7)(56983.413567.6)(93197.6-7010.23))
  4. ;直接获取文本框四点坐标
  5. (Defun AQX:GETMTEXTBOX (obj off / MXV B ENX H J L M N O P R W)
  6.   (Defun mxv (m v)
  7.     (mapcar '(lambda (r) (apply '+ (mapcar '* r v))) m)
  8.   )
  9.   (setq enx (entget obj))
  10.   (if (null off)
  11.     (setq off 0.0)
  12.   )
  13.   (if
  14.     (setq l
  15.      (cond
  16.        ((= "TEXT" (cdr (assoc 0 enx)))
  17.         (setq b (cdr (assoc 10 enx))
  18.         r (cdr (assoc 50 enx))
  19.         l (textbox enx)
  20.         )
  21.         (list
  22.         (list (- (caar l) off) (- (cadar l) off))
  23.         (list (+ (caadr l) off) (- (cadar l) off))
  24.         (list (+ (caadr l) off) (+ (cadadr l) off))
  25.         (list (- (caar l) off) (+ (cadadr l) off))
  26.         )
  27.        )
  28.        ((= "MTEXT" (cdr (assoc 0 enx)))
  29.         (setq n (cdr (assoc 210 enx))
  30.         b (trans (cdr (assoc 10 enx)) 0 n)
  31.         r (angle '(0.0 0.0 0.0) (trans (cdr (assoc 11 enx)) 0 n))
  32.         w (cdr (assoc 42 enx))
  33.         h (cdr (assoc 43 enx))
  34.         j (cdr (assoc 71 enx))
  35.         o (list
  36.       (cond
  37.         ((member j '(2 5 8)) (/ w -2.0))
  38.         ((member j '(3 6 9)) (- w))
  39.         (0.0)
  40.       )
  41.       (cond
  42.         ((member j '(1 2 3)) (- h))
  43.         ((member j '(4 5 6)) (/ h -2.0))
  44.         (0.0)
  45.       )
  46.           )
  47.         )
  48.         (list
  49.         (list (- (car o) off) (- (cadr o) off))
  50.         (list (+ (car o) w off) (- (cadr o) off))
  51.         (list (+ (car o) w off) (+ (cadr o) h off))
  52.         (list (- (car o) off) (+ (cadr o) h off))
  53.         )
  54.        )
  55.      )
  56.     )
  57.   ((lambda (m)
  58.    (mapcar '(lambda (p) (mapcar '+ (mxv m p) b)) l))
  59.    (list
  60.    (list (cos r) (sin (- r)) 0.0)
  61.    (list (sin r) (cos r) 0.0)
  62.    '(0.0 0.0 1.0)
  63.    )
  64.   )
  65.   )
  66. )

发表于 2024-8-28 18:07:43 | 显示全部楼层
本帖最后由 kozmosovia 于 2024-8-28 18:08 编辑

直接获取文本框四点坐标
(Defun MTEXTBOX        (obj / B ENX H J N O R W)
  (if (and (= "MTEXT" (cdr (assoc 0 (setq enx (entget obj)))))
           (setq n (cdr (assoc 210 enx))
                 b (trans (cdr (assoc 10 enx)) 0 n)
                 r (angle '(0.0 0.0 0.0) (trans (cdr (assoc 11 enx)) 0 n))
                 w (cdr (assoc 42 enx))
                 h (cdr (assoc 43 enx))
                 j (cdr (assoc 71 enx))
                 o (list
                     (cond ((member j '(2 5 8)) (/ w -2.0))
                           ((member j '(3 6 9)) (- w))
                           (0.0)
                     )
                     (cond ((member j '(1 2 3)) (- h))
                           ((member j '(4 5 6)) (/ h -2.0))
                           (0.0)
                     )
                   )
           )
      )
    (list (list (- (car o)) (- (cadr o)))
          (list (+ (car o) w) (- (cadr o)))
          (list (+ (car o) w) (+ (cadr o) h))
          (list (- (car o)) (+ (cadr o) h))
    )
  )
)
发表于 2024-8-28 17:23:34 | 显示全部楼层
都是炸开再获取的.
除非你愿意做一个渲染文字的功能,不过凭借lisp的技术栈应该做不到.
我也是经过好几年学习才知道文字渲染是怎么做的.
发表于 2024-8-28 17:28:49 | 显示全部楼层
影响多行文字包围盒的因素是这个,你提前把这个值改成0,再获取就行了。

本帖子中包含更多资源

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

x
发表于 2024-8-28 17:43:37 | 显示全部楼层
aws 发表于 2024-8-28 17:28
影响多行文字包围盒的因素是这个,你提前把这个值改成0,再获取就行了。

但是宽度决定了换行符插入
发表于 2024-8-28 17:49:57 | 显示全部楼层
支持一下,很厉害
发表于 2024-8-28 19:43:56 来自手机 | 显示全部楼层
大佬厉害啊
 楼主| 发表于 2024-8-29 11:23:28 | 显示全部楼层
kozmosovia 发表于 2024-8-28 18:07
直接获取文本框四点坐标
(Defun MTEXTBOX        (obj / B ENX H J N O R W)
  (if (and (= "MTEXT" (cdr ...

这个可以,,谢谢!
发表于 2024-8-29 23:33:50 | 显示全部楼层
楼上的代码要要怎样运行的?lisp吗
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-2-21 03:07 , Processed in 0.177363 second(s), 29 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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