edata 发表于 2025-7-25 15:23:05

给个简单的例子.
(defun GetA3Blocks (/ ss i ent blk_info minpt maxpt scale bbox_list)
;;; 搜索图中所有名为"A3图框"的图块并返回包围盒信息
(setq bbox_list '())
(if (setq ss (ssget "_X" '((0 . "INSERT") (2 . "A3图框"))))
    (progn
      (setq i 0)
      (repeat (sslength ss)
      (setq ent (ssname ss i)
            blk_info (entget ent))
      (setq scale (cdr (assoc 41 blk_info))); 获取X方向比例因子
      (setq blk_obj (vlax-ename->vla-object ent))
      (vla-getboundingbox blk_obj 'minpt 'maxpt)
      (setq minpt (vlax-safearray->list minpt)
            maxpt (vlax-safearray->list maxpt))
      ; 添加到返回列表: (比例 ((左下点) (右上点)))
      (setq bbox_list (cons (list scale (list minpt maxpt)) bbox_list))
      (setq i (1+ i))
      )
    )
)
(reverse bbox_list); 返回结果列表
)

(defun PointInBoundingBox (pt minpt maxpt)
;;; 判断点是否在包围盒内
(and
    (>= (car pt) (car minpt))
    (>= (cadr pt) (cadr minpt))
    (<= (car pt) (car maxpt))
    (<= (cadr pt) (cadr maxpt))
)
)

(defun c:Dli ( / pt block_list found scale dimstyle oldDimStyle currDimStyle)
;;; 主命令函数
(setq block_list (GetA3Blocks)); 获取所有A3图框信息

(if (null block_list)
    (princ "\n未找到A3图框!")
    (progn
      (setq pt (getpoint "\n请拾取标注点: "))
      (if pt
      (progn
          ; 查找包含点的图框
          (setq found nil)
          (foreach block_info block_list
            (setq minpt (caadr block_info)
                  maxpt (cadadr block_info))
            (if (PointInBoundingBox pt minpt maxpt)
            (setq found block_info)
            )
          )
         
          (if found
            (progn
            (setq scale (car found)
                  dimstyle (strcat "dim-" (itoa (fix scale))))
            
            ; 检查标注样式是否存在
            (if (tblsearch "DIMSTYLE" dimstyle)
                (progn
                  (setq doc(vla-get-activedocument (vlax-get-acad-object)))
                  (setq oldDimStyle(vla-get-activeDimStyle doc))
                  (setq currDimStyle(vla-item (vla-get-dimstyles doc) dimstyle))
                  
                  (vla-put-ActiveDimStyle doc currDimStyle)
                  (princ (strcat "\n切换到标注样式: " dimstyle))
                  
                  ; 绘制标注
                  (command "_.DIMLINEAR" pt pause pause)
                  (vla-put-ActiveDimStyle doc oldDimStyle)
                )
                (princ (strcat "\n标注样式" dimstyle "不存在!"))
            )
            )
            (princ "\n拾取点不在任何A3图框范围内!")
          )
      )
      (princ "\n未拾取点!")
      )
    )
)
(princ)
)

(princ "\nDli命令已加载,输入Dli启动")
(princ)

mokson 发表于 2025-7-25 17:47:16

edata 发表于 2025-7-25 15:23
给个简单的例子.

感谢你的实例,便好像不支持动态块的图框,获取不了动态块图框的名称

edata 发表于 2025-7-25 18:00:51

可以参考, (ssget '((2 . "`*U*,图框"))),
https://www.cnblogs.com/edata/p/6797362.html
页: 1 2 [3]
查看完整版本: 如何用反应器取得块对象的名称?