明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
12
返回列表 发新帖
楼主: liushengri

[求助]图块改层

[复制链接]
发表于 2022-3-31 16:21:16 | 显示全部楼层
KO你 发表于 2019-12-12 18:59
块内的图层,颜色,线宽处理
快捷键  bb  块内实体处理
(vl-load-com)

挺好用的,但是能选择几个批量一起改吗
发表于 2022-4-13 00:28:55 | 显示全部楼层
zazhz123 发表于 2022-3-31 16:21
挺好用的,但是能选择几个批量一起改吗

你可以把多个对象组成一个块来弄,再分解开就行了,技巧方法有时比工具实用哈
发表于 2022-4-25 09:07:27 | 显示全部楼层
KO你 发表于 2022-4-13 00:28
你可以把多个对象组成一个块来弄,再分解开就行了,技巧方法有时比工具实用哈

谢谢热心的您指导。
发表于 2022-6-22 14:45:37 | 显示全部楼层
非常好用,非常感谢
发表于 2025-7-31 16:23:46 | 显示全部楼层
zazhz123 发表于 2022-3-31 16:21
挺好用的,但是能选择几个批量一起改吗

能批量操作,图层选择一个实体提取图层
(vl-load-com)

(defun select-layer-from-entity (/ ent ename layername)
  (princ "\n请选择一个图元,用于提取目标图层:")
  (setq ent (entsel))
  (if ent
    (progn
      (setq ename (vlax-ename->vla-object (car ent)))
      (setq layername (vla-get-layer ename))
      layername
    )
    (progn
      (princ "\n未选中有效对象,操作取消。")
      nil
    )
  )
)

(defun select-color ()
  (acad_colordlg 256)
)

(defun confirm (msg default / rt)
  (initget "Y D ")
  (setq rt (getkword (strcat msg " <" default ">: ")))
  (if (or (null rt) (= rt default)) t nil)
)

(defun walk (blk layerName colorValue lwFlag /)
  (vlax-for x blk
    (if (= "AcDbBlockReference" (vla-get-objectname x))
      (walk
        (vla-item
          (vla-get-blocks (vla-get-activedocument (vlax-get-acad-object)))
          (vla-get-name x))
        layerName colorValue lwFlag
      )
    )

    (if layerName
      (vla-put-layer x layerName)
    )

    (if colorValue
      (vla-put-color x colorValue)
    )

    (if lwFlag
      (progn
        (vla-put-lineweight x -1)
        (if (= "AcDbPolyline" (vla-get-objectname x))
          (vla-put-constantwidth x 0.0)
        )
      )
    )
  )
)

(defun c:bb (/ ss doc blocks i blk blkname layerName colorValue lwFlag)
  (setq doc    (vla-get-activedocument (vlax-get-acad-object))
        blocks (vla-get-blocks doc)
        ss     (ssget '((0 . "INSERT")))
  )

  (if ss
    (progn
      ;; 图层通过选中图元提取
      (setq layerName (select-layer-from-entity))
      (if layerName
        (progn
          (setq colorValue (select-color))
          (setq lwFlag (confirm "是否将线宽重置为默认? [是(Y)/否(D)]" "Y"))

          (repeat (setq i (sslength ss))
            (setq blk     (vlax-ename->vla-object (ssname ss (setq i (1- i))))
                  blkname (vla-get-name blk))
            (if (not (vlax-property-available-p blk 'path))
              (walk (vla-item blocks blkname) layerName colorValue lwFlag)
            )
          )
          (command "_.regen")
        )
        (princ "\n图层提取失败,操作终止。")
      )
    )
    (princ "\n未选中任何块对象。")
  )
  (princ)
)
回复 支持 反对

使用道具 举报

发表于 2025-7-31 16:26:00 | 显示全部楼层
按照大神思路修改批量操作,图层为选择一个实体提取图层名,有乱码的保存成ANSI的txt,再修改为lsp
(vl-load-com)

(defun select-layer-from-entity (/ ent ename layername)
  (princ "\n请选择一个图元,用于提取目标图层:")
  (setq ent (entsel))
  (if ent
    (progn
      (setq ename (vlax-ename->vla-object (car ent)))
      (setq layername (vla-get-layer ename))
      layername
    )
    (progn
      (princ "\n未选中有效对象,操作取消。")
      nil
    )
  )
)

(defun select-color ()
  (acad_colordlg 256)
)

(defun confirm (msg default / rt)
  (initget "Y D ")
  (setq rt (getkword (strcat msg " <" default ">: ")))
  (if (or (null rt) (= rt default)) t nil)
)

(defun walk (blk layerName colorValue lwFlag /)
  (vlax-for x blk
    (if (= "AcDbBlockReference" (vla-get-objectname x))
      (walk
        (vla-item
          (vla-get-blocks (vla-get-activedocument (vlax-get-acad-object)))
          (vla-get-name x))
        layerName colorValue lwFlag
      )
    )

    (if layerName
      (vla-put-layer x layerName)
    )

    (if colorValue
      (vla-put-color x colorValue)
    )

    (if lwFlag
      (progn
        (vla-put-lineweight x -1)
        (if (= "AcDbPolyline" (vla-get-objectname x))
          (vla-put-constantwidth x 0.0)
        )
      )
    )
  )
)

(defun c:bb (/ ss doc blocks i blk blkname layerName colorValue lwFlag)
  (setq doc    (vla-get-activedocument (vlax-get-acad-object))
        blocks (vla-get-blocks doc)
        ss     (ssget '((0 . "INSERT")))
  )

  (if ss
    (progn
      ;; 图层通过选中图元提取
      (setq layerName (select-layer-from-entity))
      (if layerName
        (progn
          (setq colorValue (select-color))
          (setq lwFlag (confirm "是否将线宽重置为默认? [是(Y)/否(D)]" "Y"))

          (repeat (setq i (sslength ss))
            (setq blk     (vlax-ename->vla-object (ssname ss (setq i (1- i))))
                  blkname (vla-get-name blk))
            (if (not (vlax-property-available-p blk 'path))
              (walk (vla-item blocks blkname) layerName colorValue lwFlag)
            )
          )
          (command "_.regen")
        )
        (princ "\n图层提取失败,操作终止。")
      )
    )
    (princ "\n未选中任何块对象。")
  )
  (princ)
)
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-8-20 17:22 , Processed in 0.184445 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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