;;;块易编 ;;;命令 B1 : 一键进/出在位编辑 (保存修改) ;;;命令 B2 : 一键进/出块编辑器 (保存修改) (vl-load-com) ;;; ----------------------------------------------------------- ;;; 辅助函数:获取块的有效名称 ;;; ----------------------------------------------------------- (defun Get-Effective-Name (ent / blkref name) (if (setq blkref (vlax-ename->vla-object ent)) (if (vlax-property-available-p blkref 'EffectiveName) (setq name (vla-get-EffectiveName blkref)) (setq name (cdr (assoc 2 (entget ent)))) ) ) name ) ;;; ----------------------------------------------------------- ;;; 命令 B1:在位编辑 (RefEdit) - VLA 强制执行版 ;;; ----------------------------------------------------------- (defun c:B1 (/ ss ent doc) (setq doc (vla-get-ActiveDocument (vlax-get-acad-object))) (if (/= (getvar "REFEDITNAME") "") ;; --- 退出逻辑 --- (progn (princ "\n正在保存修改并退出在位编辑...") (command "_REFCLOSE" "_Save") ) ;; --- 进入逻辑 --- (progn ;; 检查预选或点选 (if (or (setq ss (ssget "_I" '((0 . "INSERT")))) (setq ss (ssget ":E:S" '((0 . "INSERT")))) ) (progn (setq ent (ssname ss 0)) ;; 清除当前选择集,防止干扰 (sssetfirst nil nil) ;; 重新选中该物体 (sssetfirst nil (ssadd ent)) ;; 使用 vla-SendCommand 模拟最快捷的键盘流 ;; \r 代表 Enter。序列:-REFEDIT -> O (确定) -> Enter (接受默认层级) -> A (全部) -> Y (属性) (vla-SendCommand doc (strcat "-REFEDIT" " " "O" " " "\r" "A" " " "Y" " ")) (princ "\n已发送进入指令。") ) (princ "\n未选择块。") ) ) ) (princ) ) ;;; ----------------------------------------------------------- ;;; 命令 B2:块编辑器 (BEdit) - 保持稳定 ;;; ----------------------------------------------------------- (defun c:B2 (/ ss ent blkName) (if (= (getvar "BLOCKEDITOR") 1) (progn (princ "\n正在保存并退出块编辑器...") (command "_BSAVE") (command "_BCLOSE") ) (progn (if (or (setq ss (ssget "_I" '((0 . "INSERT")))) (setq ss (ssget ":E:S" '((0 . "INSERT")))) ) (progn (setq ent (ssname ss 0)) (setq blkName (Get-Effective-Name ent)) (command "_BEDIT" blkName) ) (princ "\n未选择块。") ) ) ) (princ) ) ;;; 加载提示 (princ "\n块易编 命令 B1 : 一键进/出在位编辑 (保存修改)/命令 B2 : 一键进/出块编辑器 (保存修改) ") (princ)