千秋雪 发表于 2017-12-18 23:32:57

求教,如何选取炸开后尺寸文本?

(defun c:tt ()
(setq ent (entsel))
(if (= (cdr (assoc 0 (entget (car ent)))) "dimension")
    (progn
      (command "undo" "be")
      (command "explode" ent)
      (setq ss (ssget "p" '((0 . "*TEXT")))) ;选取炸开后尺寸文本
      (setq ent (entget (ssname ss 0)))
      (command "undo" "e")
      (command "u");undo退反上面操作
    )
ent ;试图保持变量 ent的值,不知是否这么搞,但未成功
)
(setq obj (vlax-ename->vla-object (car ent)))
(vla-GetBoundingBox obj 'pta 'ptb)
(setq pt1 (vlax-safearray->list pta))
(setq pt3 (vlax-safearray->list ptb))
(setq pt2 (list (car pt3) (cadr pt1)))
(setq pt4 (list (car pt1) (cadr pt3)))
(command "pline" "none" pt1 "none" pt2 "none" pt3 "none" pt4 "c")

(setq thh (cdr (assoc 1 (entget (car ent))))) ;测试,验证undo退反操作后,ent的值还在不在。
(princ thh) ;经测试,点选文字 thh有值,点选尺寸实体, thh无值

(princ)
)

请教各位大神,上面,undo退反操作后,如何保持作为文字选取的值?谢谢各位。

琴剑江山_10184 发表于 2017-12-19 14:19:43

(defun c:tt (/ ENT OBJ PT1 PT2 PT3 PT4 PTA PTB SS THH)
(setq ent (entsel))
(if (= (cdr (assoc 0 (entget (car ent)))) "DIMENSION")
    (progn
      (command "explode" ent)
      (setq ss (ssget "p" '((0 . "*TEXT"))))
      (setq ent (ssname ss 0))
      (setq thh (cdr (assoc 1 (entget ent))))
      (setq obj (vlax-ename->vla-object ent))
      (vla-GetBoundingBox obj 'pta 'ptb)
      (setq pt1 (vlax-safearray->list pta))
      (setq pt3 (vlax-safearray->list ptb))
      (setq pt2 (list (car pt3) (cadr pt1)))
      (setq pt4 (list (car pt1) (cadr pt3)))
      (command "undo" "1")
      (command "pline" "none" pt1 "none" pt2 "none" pt3        "none" pt4 "c")      
      (princ thh)
      (princ)
    )
)
)

千秋雪 发表于 2017-12-19 20:57:33

琴剑江山_10184 发表于 2017-12-19 14:19


谢谢你,把功能部分放里面好是好,不过,针对“text" "mtext"实体,又要搞多一组功能部分的代码,这样一来显得有点长,我原想炸开后,选了文字,让它与“text" "mtext"共用那部分功能代码,我知道这样有点钻牛角尖,只是奇怪,即便undo做了退反操作,但程序未结束,变量ss 和 ent应该还在内存上,很难理解它们的值怎就没了。一点疑问,,,说了出来,有点啰嗦,,
谢谢你

xyp1964 发表于 2017-12-19 23:53:40



xazhji 发表于 2017-12-20 08:22:38

AutoCAD的标注样式里,就有标注文字加边框的功能,无需进行编程的。
页: [1]
查看完整版本: 求教,如何选取炸开后尺寸文本?