
- ;;; 将图块及其内部所有实体改为0层
- (defun c:sbb (/ selectionSet count blockEntity blockName blockDef blockEntities entity)
- (if (setq selectionSet (ssget '((0 . "INSERT"))))
- (progn
- (setq count 0)
- (repeat (sslength selectionSet)
- (setq blockEntity (ssname selectionSet count))
- (setq blockName (cdr (assoc 2 (entget blockEntity))))
- (setq blockDef (tblobjname "block" blockName))
-
- ;; 获取并处理图块定义中的实体
- (if blockDef
- (progn
- (setq blockEntities (ayGetAllEntInBLK blockName))
-
- ;; 修改图块内部所有实体的图层和颜色
- (foreach entity blockEntities
- (changeEntityLayerAndColor entity)
- )
- )
- )
-
- ;; 修改图块插入点本身的图层
- (changeEntityLayerAndColor blockEntity)
-
- (setq count (1+ count))
- )
- (command "regen")
- (princ (strcat "\n已处理 " (itoa count) " 个图块"))
- )
- (princ "\n未选择到图块")
- )
- (princ)
- )
- ;;; 修改实体的图层和颜色
- (defun changeEntityLayerAndColor (entityName / entityData)
- (if (entget entityName)
- (progn
- (setq entityData (entget entityName))
-
- ;; 修改图层为"0"
- (setq entityData (subst (cons 8 "0") (assoc 8 entityData) entityData))
-
- ;; 如果存在颜色,改为随层(256表示ByLayer)
- (if (assoc 62 entityData)
- (setq entityData (subst (cons 62 256) (assoc 62 entityData) entityData))
- )
-
- (entmod entityData)
- (entupd entityName) ;; 更新显示
- )
- )
- )
- ;;;***********************************************************
- ;;; 获取图块内的所有非图块对象(含嵌套块中的)实体名称
- ;;;***********************************************************
- (defun ayGetAllEntInBLK (blkName / blkDef entityList entity entityType nestedName nestedDef)
- (setq blkDef (tblobjname "block" blkName))
- (setq entityList nil)
-
- (if blkDef
- (progn
- (setq entity (entnext blkDef))
-
- (while entity
- (setq entityType (cdr (assoc 0 (entget entity))))
-
- (cond
- ((= entityType "INSERT")
- ;; 处理嵌套块
- (setq nestedName (cdr (assoc 2 (entget entity))))
- (if (not (member nestedName '("*MODEL_SPACE" "*PAPER_SPACE" "*PAPER_SPACE0")))
- (progn
- ;; 将嵌套块本身加入列表
- (setq entityList (cons entity entityList))
- ;; 递归获取嵌套块内部实体
- (setq entityList (append (ayGetAllEntInBLK nestedName) entityList))
- )
- )
- )
-
- ((/= entityType "ENDBLK")
- ;; 添加非块结束标记的实体
- (setq entityList (cons entity entityList))
- )
- )
-
- (setq entity (entnext entity))
- )
- )
- )
-
- entityList
- )
网友答: 感谢分享!!!网友答: 本帖最后由 wudechao 于 2025-12-26 13:02 编辑
单一功能的图元,改为图块内为0层还算可以,布局里面视口控制哪个图层显示很好用,假如图块是多种不同功能图元,改为0层,副作用很大,很难管理。比如在建筑提资给其它专业的图,建筑大佬做很多任意的图块,图块中的东西很任意,比如柱子图层,剪力墙图层,墙图层,窗户图层等等都放在一个图块里。这种乱七八糟的图块,很伤脑筋。炸开也不是,不炸做0图层图块也不是。比如一个超大地下室平面,每个塔楼就是一个图块,这种按塔楼的图块里面是不能改为0图层的了,但是这图块外面所在的图层改为什么图层才好用?这个种乱七八糟的图块,图层如何管理是个难点。单一功能的图层的图块,比如集水井,窗户,门,这种图块改为0图层,非常好,在布局很好控制显示和关闭。网友答: 学习学习学习网友答:
wudechao 发表于 2025-12-26 12:51
单一功能的图元,改为图块内为0层还算可以,布局里面视口控制哪个图层显示很好用,假如图块是多种不同功能 ...
CAD还有其他专业呢,这个功能室内专业经常用,对室内二次开发的插件都有这个功能: 海龙、快图、源泉、imini