1. ;;;;;;;;;;;;;;;;块内所有对象的图层移动到当前层,颜色改为随层(包括嵌套块)
  2. (defun c:vvx (/ blkrefs ss i blkref blkname totalCount result processedBlocks allProcessedBlocks)
  3.   ; 错误处理函数
  4.   (defun *error* (msg)
  5.     (if (not (wcmatch (strcase msg) "*BREAK*,*CANCEL*,*EXIT*"))
  6.       (princ (strcat "\n错误: " msg))
  7.     )
  8.     (setvar "CMDECHO" 1)  ; 确保命令回显恢复
  9.     (princ)
  10.   )
  11.   
  12.   ; 递归函数:处理块定义及其嵌套块
  13.   (defun ProcessBlockDefinition (blkname processedBlocks / blkdef ent obj subBlkName count)
  14.     (setq count 0)
  15.    
  16.     ; 检查是否已经处理过此块(避免无限递归)
  17.     (if (not (member blkname processedBlocks))
  18.       (progn
  19.         ; 添加到已处理列表
  20.         (setq processedBlocks (cons blkname processedBlocks))
  21.         
  22.         ; 获取块定义
  23.         (if (setq blkdef (tblobjname "BLOCK" blkname))
  24.           (progn
  25.             (setq ent (entnext blkdef))  ; 获取块定义中的第一个图元
  26.             
  27.             ; 遍历块定义中的所有图元
  28.             (while (and ent (not (eq "ENDBLK" (cdr (assoc 0 (entget ent))))))
  29.               (setq obj (entget ent))
  30.               
  31.               ; 检查是否为嵌套块引用
  32.               (if (= "INSERT" (cdr (assoc 0 obj)))
  33.                 (progn
  34.                   ; 获取嵌套块名
  35.                   (setq subBlkName (cdr (assoc 2 obj)))
  36.                   
  37.                   ; 递归处理嵌套块,传递已处理块列表
  38.                   (setq countResult (ProcessBlockDefinition subBlkName processedBlocks))
  39.                   (setq count (+ count (car countResult)))
  40.                   (setq processedBlocks (cadr countResult))
  41.                   
  42.                   ; 修改嵌套块引用本身的图层和颜色
  43.                   (setq obj (subst (cons 8 (getvar "CLAYER")) (assoc 8 obj) obj)) ; 修改图层
  44.                   (setq obj (subst (cons 62 256) (assoc 62 obj) obj)) ; 修改颜色为随层
  45.                   (if (entmod obj)
  46.                     (setq count (1+ count))
  47.                   )
  48.                 )
  49.                 ; 不是块引用,直接修改图层和颜色
  50.                 (progn
  51.                   (setq obj (subst (cons 8 (getvar "CLAYER")) (assoc 8 obj) obj)) ; 修改图层
  52.                   (setq obj (subst (cons 62 256) (assoc 62 obj) obj)) ; 修改颜色为随层
  53.                   (if (entmod obj)
  54.                     (setq count (1+ count))
  55.                   )
  56.                 )
  57.               )
  58.               
  59.               (setq ent (entnext ent))  ; 获取下一个图元
  60.             )
  61.           )
  62.           (princ (strcat "\n警告: 无法找到块定义 "" blkname """))
  63.         )
  64.       )
  65.       ; 如果已经处理过,返回0
  66.       (setq count 0)
  67.     )
  68.    
  69.     (list count processedBlocks)  ; 返回处理的对象数量和更新后的已处理块列表
  70.   )
  71.   
  72.   (setvar "CMDECHO" 0)  ; 关闭命令回显
  73.   
  74.   ; 选择多个块参照
  75.   (princ "\n选择块参照(可多选): ")
  76.   (if (setq ss (ssget '((0 . "INSERT"))))
  77.     (progn
  78.       (setq totalCount 0)
  79.       (setq allProcessedBlocks '())  ; 所有已处理块列表
  80.       (setq blkrefs '())  ; 存储所有选择的块名
  81.       
  82.       ; 先收集所有选择的块名
  83.       (setq i 0)
  84.       (repeat (sslength ss)
  85.         (setq blkref (ssname ss i))
  86.         (setq blkname (cdr (assoc 2 (entget blkref))))
  87.         (if (not (member blkname blkrefs))
  88.           (setq blkrefs (cons blkname blkrefs))
  89.         )
  90.         (setq i (1+ i))
  91.       )
  92.       
  93.       (princ (strcat "\n已选择 " (itoa (length blkrefs)) " 个不同的块"))
  94.       
  95.       ; 处理每个块
  96.       (foreach blkname blkrefs
  97.         (princ (strcat "\n正在处理块: " blkname))
  98.         
  99.         ; 处理块定义及其所有嵌套块
  100.         (setq result (ProcessBlockDefinition blkname allProcessedBlocks))
  101.         (setq blockCount (car result))
  102.         (setq allProcessedBlocks (cadr result))
  103.         (setq totalCount (+ totalCount blockCount))
  104.         
  105.         (princ (strcat " - 处理了 " (itoa blockCount) " 个对象"))
  106.       )
  107.       
  108.       ; 刷新图形以显示更改
  109.       (command "_.REGEN")
  110.       
  111.       (princ (strcat "\n\n已处理 " (itoa (length blkrefs)) " 个块内的 " (itoa totalCount) " 个对象的图层和颜色"))
  112.       (princ (strcat "\n图层设置为: " (getvar "CLAYER") ",颜色设置为: 随层"))
  113.       (if (> (length allProcessedBlocks) (length blkrefs))
  114.         (princ (strcat "\n处理的块包括: " (vl-princ-to-string allProcessedBlocks)))
  115.       )
  116.     )
  117.     (princ "\n未选择对象或选择无效。")
  118.   )
  119.   
  120.   (setvar "CMDECHO" 1)  ; 恢复命令回显
  121.   (princ)
  122. )




网友答: 在浩辰CAD2019上试了一下,可以用!减少了大量图层。线型、线宽保持不变。
现在的图纸图层多(不信我附张图,你数一下有多少图层)。
要炸开块处理工作量大,这个程序很实用。

网友答:
yjwht 发表于 2025-12-26 14:11
在浩辰CAD2019上试了一下,可以用!减少了大量图层。线型、线宽保持不变。
现在的图纸图层多(不信我附张 ...

layer界面选中图层可以直接合并的。

网友答: 本帖最后由 yjwht 于 2025-12-26 19:22 编辑
kozmosovia 发表于 2025-12-26 14:17
layer界面选中图层可以直接合并的。

AutoCAD可以直接合并,浩辰CAD中没有,如下图。不过浩辰也有转换图层的功能C:\Users\admin\Desktop\Snipaste_2025-12-26_19-13-18.png

网友答: 感谢分享!
  • 上一篇:升级HB批量快速填充不调用系统对话框直接填充带
  • 下一篇:没有了