LISP实现插入图块并单独设置刚插入实例的可见性状态
动态块实例独立设置可见性的解决方案
核心需求
现有动态块可见性设置方案会修改所有实例,需实现循环插入时单独配置每个新实例的可见性状态,同时替代command+explode的低效操作方式。
可见性状态中英对应
原英文状态与中文翻译对应:
- "1" → "1"
- "left 1" → "左侧1"
- "right 1" → "右侧1"
- "2" → "2"
- "left 2" → "左侧2"
- "right 2" → "右侧2"
- "3" → "3"
用entmake实现独立设置可见性
实现逻辑
- 提取目标动态块的定义数据,定位可见性参数
- 通过
entmake创建块插入实例,直接为当前实例指定专属可见性值,不修改全局块定义 - 无需炸开块,保留动态块的可编辑特性
示例代码
;; 定义修改动态块实例可见性的函数 (defun set-dynblk-visibility (ent visibility-state / blkdef props prop) (setq blkdef (entget (cdr (assoc 2 (entget ent))))) ;; 遍历块定义的动态属性节点 (setq props (member '(100 . "AcDbBlockReference") blkdef)) (setq prop (member '(100 . "AcDbDynamicBlockReferenceProperty") props)) (while prop (if (= (cdr (assoc 300 prop)) "Visibility") (progn ;; 替换当前实例的可见性状态值 (setq prop (subst (cons 301 visibility-state) (assoc 301 prop) prop)) (entmod (append (subseq blkdef 0 (- (length blkdef) (length props))) prop)) ) ) (setq prop (member '(100 . "AcDbDynamicBlockReferenceProperty") (cdr prop))) ) ) ;; 封装插入+设置可见性的函数 (defun insert-with-visibility (blkname scale rotation pt visibility / new-ent) ;; 用entmake创建块插入实例 (setq new-ent (entmake (list '(0 . "INSERT") (cons 2 blkname) (cons 10 pt) (cons 41 scale) (cons 42 scale) (cons 43 scale) (cons 50 rotation) '(100 . "AcDbBlockReference") '(70 . 0) ) ) ) ;; 为当前实例设置指定可见性 (set-dynblk-visibility new-ent visibility) new-ent ) ;; 循环插入调用示例 (setq blkcb "你的目标块名" scl 1.0 xyzcb '(0 0 0)) ;; 插入带"左侧1"可见性的块 (insert-with-visibility blkcb scl 0 xyzcb "左侧1") ;; 插入带"右侧2"可见性的块(偏移位置) (insert-with-visibility blkcb scl 0 '(10 0 0) "右侧2") ;; 可结合循环逻辑批量生成不同可见性的块实例
方案优势
- 替代
command函数,避免命令行交互的不稳定问题 - 仅修改当前插入实例的可见性,不会影响其他已存在的块实例
- 保留动态块结构,无需炸开,后续仍可编辑调整
注意事项
- 确保目标块是动态块,且包含名为
Visibility的可见性参数 - 传入的可见性状态名称需与块定义中的中文名称完全匹配
- 若块存在嵌套动态属性,需调整函数的属性遍历逻辑适配
内容的提问来源于stack exchange,提问作者Jesse O'Neill
相关产品推荐
相关产品推荐

