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 大佬的集合包围盒,发现对包含多行文字并不准确,不知有没有大佬有好的,可以分享下?不胜感激!


网友答: 本帖最后由 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.   )


网友答: 本帖最后由 yaojing38 于 2024-8-30 14:44 编辑
kozmosovia 发表于 2024-8-30 13:54
完整的函数
https://zhuanlan.zhihu.com/p/25228344

谢谢您的代码!
  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. )



网友答: 本帖最后由 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))
    )
  )
)


网友答: 都是炸开再获取的.
除非你愿意做一个渲染文字的功能,不过凭借lisp的技术栈应该做不到.
我也是经过好几年学习才知道文字渲染是怎么做的.

网友答: 影响多行文字包围盒的因素是这个,你提前把这个值改成0,再获取就行了。


网友答:
aws 发表于 2024-8-28 17:28
影响多行文字包围盒的因素是这个,你提前把这个值改成0,再获取就行了。

但是宽度决定了换行符插入

网友答: 支持一下,很厉害

网友答: 大佬厉害啊

网友答:
kozmosovia 发表于 2024-8-28 18:07
直接获取文本框四点坐标
(Defun MTEXTBOX        (obj / B ENX H J N O R W)
  (if (and (= "MTEXT" (cdr ...

这个可以,,谢谢!

网友答: 楼上的代码要要怎样运行的?lisp吗
  • 上一篇:蛇形敷设长度系数计算
  • 下一篇:没有了