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. )




网友答: 感谢分享!!!

网友答: 本帖最后由 wudechao 于 2025-12-26 13:02 编辑

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

网友答: 学习学习学习

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

CAD还有其他专业呢,这个功能室内专业经常用,对室内二次开发的插件都有这个功能: 海龙、快图、源泉、imini
  • 上一篇:修改图块基点(已解决)
  • 下一篇:没有了