明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 743|回复: 12

[源码] 将图块及其内部所有实体改为0层

[复制链接]
发表于 2025-12-26 11:33:33 | 显示全部楼层 |阅读模式
  1. ;;; 将图块及其内部所有实体改为0层
  2. (defun c:sbb (/ selectionSet count blockEntity blockName blockDef blockEntities entity)
  3.   (if (setq selectionSet (ssget '((0 . "INSERT"))))
  4.     (progn
  5.       (setq count 0)
  6.       (repeat (sslength selectionSet)
  7.         (setq blockEntity (ssname selectionSet count))
  8.         (setq blockName (cdr (assoc 2 (entget blockEntity))))
  9.         (setq blockDef (tblobjname "block" blockName))
  10.         
  11.         ;; 获取并处理图块定义中的实体
  12.         (if blockDef
  13.           (progn
  14.             (setq blockEntities (ayGetAllEntInBLK blockName))
  15.             
  16.             ;; 修改图块内部所有实体的图层和颜色
  17.             (foreach entity blockEntities
  18.               (changeEntityLayerAndColor entity)
  19.             )
  20.           )
  21.         )
  22.         
  23.         ;; 修改图块插入点本身的图层
  24.         (changeEntityLayerAndColor blockEntity)
  25.         
  26.         (setq count (1+ count))
  27.       )
  28.       (command "regen")
  29.       (princ (strcat "\n已处理 " (itoa count) " 个图块"))
  30.     )
  31.     (princ "\n未选择到图块")
  32.   )
  33.   (princ)
  34. )

  35. ;;; 修改实体的图层和颜色
  36. (defun changeEntityLayerAndColor (entityName / entityData)
  37.   (if (entget entityName)
  38.     (progn
  39.       (setq entityData (entget entityName))
  40.       
  41.       ;; 修改图层为"0"
  42.       (setq entityData (subst (cons 8 "0") (assoc 8 entityData) entityData))
  43.       
  44.       ;; 如果存在颜色,改为随层(256表示ByLayer)
  45.       (if (assoc 62 entityData)
  46.         (setq entityData (subst (cons 62 256) (assoc 62 entityData) entityData))
  47.       )
  48.       
  49.       (entmod entityData)
  50.       (entupd entityName)  ;; 更新显示
  51.     )
  52.   )
  53. )

  54. ;;;***********************************************************
  55. ;;; 获取图块内的所有非图块对象(含嵌套块中的)实体名称
  56. ;;;***********************************************************
  57. (defun ayGetAllEntInBLK (blkName / blkDef entityList entity entityType nestedName nestedDef)
  58.   (setq blkDef (tblobjname "block" blkName))
  59.   (setq entityList nil)
  60.   
  61.   (if blkDef
  62.     (progn
  63.       (setq entity (entnext blkDef))
  64.       
  65.       (while entity
  66.         (setq entityType (cdr (assoc 0 (entget entity))))
  67.         
  68.         (cond
  69.           ((= entityType "INSERT")
  70.            ;; 处理嵌套块
  71.            (setq nestedName (cdr (assoc 2 (entget entity))))
  72.            (if (not (member nestedName '("*MODEL_SPACE" "*PAPER_SPACE" "*PAPER_SPACE0")))
  73.              (progn
  74.                ;; 将嵌套块本身加入列表
  75.                (setq entityList (cons entity entityList))
  76.                ;; 递归获取嵌套块内部实体
  77.                (setq entityList (append (ayGetAllEntInBLK nestedName) entityList))
  78.              )
  79.            )
  80.           )
  81.          
  82.           ((/= entityType "ENDBLK")
  83.            ;; 添加非块结束标记的实体
  84.            (setq entityList (cons entity entityList))
  85.           )
  86.         )
  87.         
  88.         (setq entity (entnext entity))
  89.       )
  90.     )
  91.   )
  92.   
  93.   entityList
  94. )


评分

参与人数 1明经币 +1 收起 理由
不一样地设计 + 1 很给力!

查看全部评分

"觉得好,就打赏"
还没有人打赏,支持一下
回复

使用道具 举报

 楼主| 发表于 2025-12-31 10:16:14 | 显示全部楼层
本帖最后由 小毛草 于 2025-12-31 10:20 编辑

增加可以保留线型和颜色选择,让你们自已选择用那一个了!
  1. ;;; 全局变量,用于记忆是否保留线型和颜色
  2. (setq *SBB-RETAIN-PROPERTIES* nil)

  3. ;;; 将图块及其内部所有实体改为0层
  4. (defun c:sbb (/ selectionSet count blockEntity blockEntities entity key gr olderr)
  5.   ;; 定义错误处理函数
  6.   (defun *error* (msg)
  7.     (if (not (member msg '("Function cancelled" "quit / exit abort")))
  8.       (princ (strcat "\n错误: " msg))
  9.     )
  10.     ; 恢复原来的错误处理函数
  11.     (setq *error* olderr)
  12.     (princ)
  13.   )
  14.   
  15.   ; 保存原来的错误处理函数
  16.   (setq olderr *error*)
  17.   
  18.   ;; 显示当前设置
  19.   (princ (strcat "\n当前设置: "
  20.                  (if *SBB-RETAIN-PROPERTIES*
  21.                      "保留原线型和颜色"
  22.                      "修改为0层并随层")
  23.                  " (按S键切换, 按ESC或右键退出)"))
  24.   
  25.   ; 循环处理
  26.   (setq key nil)
  27.   (while (and (not key) (setq gr (grread T 15 0)))
  28.     (cond
  29.       ((= (car gr) 2) ; 键盘输入
  30.        (cond
  31.          ((or (= (cadr gr) 13) (= (cadr gr) 32)) ; 回车或空格键
  32.           (setq key T) ; 退出循环
  33.          )
  34.          ((or (= (cadr gr) 83) (= (cadr gr) 115)) ; S或s键 - 切换方式
  35.           (setq *SBB-RETAIN-PROPERTIES* (not *SBB-RETAIN-PROPERTIES*))
  36.           (princ (strcat "\r当前设置: "
  37.                          (if *SBB-RETAIN-PROPERTIES*
  38.                              "保留原线型和颜色"
  39.                              "修改为0层并随层")
  40.                          " (左键确认选择进行选择图块,按S键切换, 按ESC或右键退出)"))
  41.          )
  42.          ((= (cadr gr) 27) ; ESC键退出
  43.           (setq key T)
  44.           (princ "\n命令结束")
  45.          )
  46.          (T
  47.           ; 其他按键,继续等待
  48.          )
  49.        )
  50.       )
  51.       ((= (car gr) 3) ; 鼠标左键点击
  52.        ;; 开始选择图块
  53.        (princ "\n选择图块: ")
  54.       
  55.        (if (setq selectionSet (ssget '((0 . "INSERT"))))
  56.          (progn
  57.            (setq count 0)
  58.            (repeat (sslength selectionSet)
  59.              (setq blockEntity (ssname selectionSet count))
  60.              (setq blockEntities (ayGetAllEntInBLK blockEntity))
  61.             
  62.              ;; 修改图块内部所有实体的图层
  63.              (foreach entity blockEntities
  64.                (changeEntityProperties entity *SBB-RETAIN-PROPERTIES*)
  65.              )
  66.             
  67.              ;; 修改图块本身的图层
  68.              (changeEntityProperties blockEntity *SBB-RETAIN-PROPERTIES*)
  69.             
  70.              (setq count (1+ count))
  71.            )
  72.            (command "regen")
  73.            (princ (strcat "\n已处理 " (itoa count) " 个图块"))
  74.            
  75.            ;; 显示当前设置,等待下一次操作
  76.            (princ (strcat "\n当前设置: "
  77.                           (if *SBB-RETAIN-PROPERTIES*
  78.                               "保留原线型和颜色"
  79.                               "修改为0层并随层")
  80.                           " (左键确认选择进行选择图块,按S键切换, 按ESC或右键退出)"))
  81.          )
  82.          (princ "\n未选择到图块")
  83.        )
  84.       )
  85.       ((= (car gr) 11) ; 鼠标右键
  86.        (setq key T) ; 退出循环
  87.        (princ "\n命令结束")
  88.       )
  89.       ((= (car gr) 25) ; 取消操作
  90.        (setq key T)
  91.        (princ "\n命令结束")
  92.       )
  93.       (T
  94.        ; 其他输入,继续等待
  95.       )
  96.     )
  97.   )
  98.   
  99.   ;; 恢复原来的错误处理函数
  100.   (setq *error* olderr)
  101.   
  102.   (princ)
  103. )

  104. ;;; 修改实体的属性
  105. (defun changeEntityProperties (entityName retainProperties / entityData)
  106.   (setq entityData (entget entityName))
  107.   
  108.   ;; 修改图层为"0"
  109.   (setq entityData (subst (cons 8 "0") (assoc 8 entityData) entityData))
  110.   
  111.   ;; 如果不保留属性,则修改颜色和线型为随层
  112.   (if (not retainProperties)
  113.     (progn
  114.       ;; 修改颜色为随层(0)
  115.       (if (assoc 62 entityData)
  116.         (setq entityData (subst (cons 62 0) (assoc 62 entityData) entityData))
  117.         (setq entityData (append entityData (list (cons 62 0))))
  118.       )
  119.       
  120.       ;; 修改线型为随层
  121.       (if (assoc 6 entityData)
  122.         (setq entityData (subst (cons 6 "ByLayer") (assoc 6 entityData) entityData))
  123.         (setq entityData (append entityData (list (cons 6 "ByLayer"))))
  124.       )
  125.       
  126.       ;; 修改线型比例为1
  127.       (if (assoc 48 entityData)
  128.         (setq entityData (subst (cons 48 1.0) (assoc 48 entityData) entityData))
  129.       )
  130.     )
  131.   )
  132.   
  133.   (entmod entityData)
  134. )

  135. ;;;***********************************************************
  136. ;;; 获取图块内的所有非图块对象(含嵌套块中的)名称 函数
  137. ;;;***********************************************************
  138. (defun ayGetAllEntInBLK (blkEntName / blockName blockDef nextEntity entityType entityList)
  139.   (setq blockName (cdr (assoc 2 (entget blkEntName))))
  140.   (setq blockDef (tblobjname "Block" blockName))
  141.   
  142.   (while (setq nextEntity (entnext blockDef))
  143.     (setq entityType (cdr (assoc 0 (entget nextEntity))))
  144.    
  145.     (if (= entityType "INSERT")
  146.       (progn
  147.         (setq entityList (cons nextEntity entityList))
  148.         (setq entityList (append (ayGetAllEntInBLK nextEntity) entityList))
  149.       )
  150.       (setq entityList (cons nextEntity entityList))
  151.     )
  152.    
  153.     (setq blockDef nextEntity)
  154.   )
  155.   
  156.   entityList
  157. )


回复 支持 反对

使用道具 举报

发表于 2025-12-26 12:51:52 | 显示全部楼层
本帖最后由 wudechao 于 2025-12-26 13:02 编辑

单一功能的图元,改为图块内为0层还算可以,布局里面视口控制哪个图层显示很好用,假如图块是多种不同功能图元,改为0层,副作用很大,很难管理。比如在建筑提资给其它专业的图,建筑大佬做很多任意的图块,图块中的东西很任意,比如柱子图层,剪力墙图层,墙图层,窗户图层等等都放在一个图块里。这种乱七八糟的图块,很伤脑筋。炸开也不是,不炸做0图层图块也不是。比如一个超大地下室平面,每个塔楼就是一个图块,这种按塔楼的图块里面是不能改为0图层的了,但是这图块外面所在的图层改为什么图层才好用?这个种乱七八糟的图块,图层如何管理是个难点。单一功能的图层的图块,比如集水井,窗户,门,这种图块改为0图层,非常好,在布局很好控制显示和关闭。
回复 支持 反对

使用道具 举报

发表于 2025-12-26 13:19:16 | 显示全部楼层
wudechao 发表于 2025-12-26 12:51
单一功能的图元,改为图块内为0层还算可以,布局里面视口控制哪个图层显示很好用,假如图块是多种不同功能 ...

CAD还有其他专业呢,这个功能室内专业经常用,对室内二次开发的插件都有这个功能: 海龙、快图、源泉、imini
回复 支持 反对

使用道具 举报

发表于 2025-12-26 12:59:58 | 显示全部楼层
学习学习学习
回复 支持 反对

使用道具 举报

发表于 2025-12-27 14:29:53 | 显示全部楼层
谢谢分享,运行测试反应时间有点久
回复 支持 反对

使用道具 举报

发表于 2025-12-30 17:36:48 | 显示全部楼层
点赞,下载,收藏!
回复 支持 反对

使用道具 举报

发表于 2025-12-30 19:03:48 | 显示全部楼层
刚好能用到
回复 支持 反对

使用道具 举报

发表于 2025-12-30 21:11:19 | 显示全部楼层
感谢分享!很有用,要是能只改0层,保留图里的线型和颜色就更好了。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2026-1-23 16:55 , Processed in 1.950887 second(s), 29 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表