明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 3984|回复: 17

[源码] 转发 改块的颜色

  [复制链接]
发表于 2021-12-31 02:33:45 | 显示全部楼层 |阅读模式
;;改块的颜色

(defun c:ChBlkColor (/ ChBlkColor SS blks I Obj BnLst)
  (defun ChBlkColor (Blks Obj Color / BlkName oName)
    (if (and (= (vla-get-ObjectName obj) "AcDbBlockReference")
             (= (vla-get-HasAttributes obj) :vlax-true)
        )
      (foreach x (vlax-invoke obj 'getattributes)
        (vla-put-color x Color)
      )
    )
    (setq BlkName (vla-get-name obj))
    (if (not (member BlkName bnlst))
      (progn
        (setq bnlst (cons BlkName BnLst))
        (vlax-for X (vla-item Blks BlkName)
          (setq oName (vla-get-ObjectName X))
          (cond ((wcmatch oName "*Dimension,AcDbLeader,AcDbFcf")
                 (vla-put-DimensionLineColor X Color)
                 (if (wcmatch oName "*Dimension")
                   (progn
                     (vla-put-ExtensionLineColor X Color)
                     (if (setq BlkName (assoc 2 (entget (vlax-vla-object->ename X))))
                       (vlax-for X (vla-item Blks (cdr BlkName))
                         (vla-put-color X Color)
                       )
                     )
                   )
                 )
                 (if (wcmatch oName "*Dimension,AcDbFcf")
                   (vla-put-TextColor X Color)
                 )
                )
                ((= oName "AcDbBlockReference")
                 (ChBlkColor Blks X Color)
                )
          )
          (vla-put-color X Color)
        )
      )
    )
    (vla-UpDate obj)
  )
  (if (and (setq ss (ssget '((0 . "insert"))))
           (or $ChBlkColor$ (setq $ChBlkColor$ 7))
           (setq $ChBlkColor$ (acad_colordlg $ChBlkColor$))
      )
    (progn
      (setq blks (vla-get-blocks (vla-get-activedocument (vlax-get-acad-object))))
      (repeat (setq i (sslength ss))
        (setq obj (vlax-ename->vla-object (ssname ss (setq i (1- i)))))
        (ChBlkColor Blks Obj $ChBlkColor$)
      )
    )
  )
  (princ)
)


评分

参与人数 5明经币 +5 收起 理由
趣意人生 + 1 优秀
alexmai + 1 赞一个!
bssurvey + 1 赞一个!
panliang9 + 1 不错
yanshengjiang + 1

查看全部评分

发表于 2024-10-22 16:18:43 | 显示全部楼层
(defun c:ChBlkColor (/ ChBlkColor SS blks I Obj BnLst)
  ;; 定义一个命令级别的函数 ChBlkColor,允许从 AutoCAD 命令行调用
  (defun ChBlkColor (Blks Obj Color / BlkName oName)
    ;; 定义一个内部递归函数 ChBlkColor,用于处理块的颜色和图层设置
    (if (and (= (vla-get-ObjectName obj) "AcDbBlockReference") ;; 检查对象是否为块引用
             (= (vla-get-HasAttributes obj) :vlax-true))       ;; 检查块是否包含属性
      (foreach x (vlax-invoke obj 'getattributes)              ;; 遍历块的所有属性
        (vla-put-color x Color)                                ;; 设置属性的颜色
        (if (not (= (vla-get-layer x) "0"))                    ;; 如果属性的图层不是 "0"
          (vla-put-layer x "0")                                ;; 将属性的图层设置为 "0"
        )
      )
    )
    (setq BlkName (vla-get-name obj))                          ;; 获取块的名称
    (if (not (member BlkName bnlst))                           ;; 如果块名称不在已处理的列表中
      (progn
        (setq bnlst (cons BlkName BnLst))                      ;; 将块名称添加到已处理列表中
        (vlax-for X (vla-item Blks BlkName)                    ;; 遍历块中的所有对象
          (setq oName (vla-get-ObjectName X))                  ;; 获取对象的名称
          (cond
            ((wcmatch oName "*Dimension,AcDbLeader,AcDbFcf")   ;; 如果对象是尺寸、引线或填充字符
              (vla-put-DimensionLineColor X Color)             ;; 设置尺寸线颜色
              (if (wcmatch oName "*Dimension")                 ;; 如果对象是尺寸
                (progn
                  (vla-put-ExtensionLineColor X Color)         ;; 设置延伸线颜色
                  (if (setq BlkName (assoc 2 (entget (vlax-vla-object->ename X)))) ;; 获取尺寸关联的块名称
                    (vlax-for X (vla-item Blks (cdr BlkName)) ;; 遍历关联块中的所有对象
                      (vla-put-color X Color)                 ;; 设置对象颜色
                      (if (not (= (vla-get-layer X) "0"))     ;; 如果对象的图层不是 "0"
                        (vla-put-layer X "0")                 ;; 将对象的图层设置为 "0"
                      )
                    )
                  )
                )
              )
              (if (wcmatch oName "*Dimension,AcDbFcf")         ;; 如果对象是尺寸或填充字符
                (vla-put-TextColor X Color)                    ;; 设置文字颜色
              )
            )
            ((= oName "AcDbBlockReference")                    ;; 如果对象是块引用
              (ChBlkColor Blks X Color)                        ;; 递归调用 ChBlkColor 处理嵌套块
            )
            (t                                                ;; 处理其他类型的对象
              (vla-put-color X Color)                          ;; 设置对象颜色
              (if (not (= (vla-get-layer X) "0"))             ;; 如果对象的图层不是 "0"
                (vla-put-layer X "0")                          ;; 将对象的图层设置为 "0"
              )
            )
          )
        )
      )
    )
    ;; 处理动态块
    (if (and (= (vla-get-ObjectName obj) "AcDbBlockReference") ;; 检查对象是否为块引用
             (vlax-property-available-p obj 'DynamicBlock))    ;; 检查块是否为动态块
      (progn
        (vlax-for Param (vla-get-Parameters obj)               ;; 遍历动态块的所有参数
          (if (and (vlax-property-available-p Param 'Type)     ;; 检查参数是否有类型属性
                   (= (vla-get-Type Param) acParameterPoint))  ;; 检查参数类型是否为点
            (vlax-for Action (vla-get-Actions Param)           ;; 遍历参数的所有动作
              (if (and (vlax-property-available-p Action 'Type) ;; 检查动作是否有类型属性
                       (= (vla-get-Type Action) acActionStretch)) ;; 检查动作类型是否为拉伸
                (vlax-for Item (vla-get-Items Action)          ;; 遍历动作的所有项
                  (if (and (vlax-property-available-p Item 'Object) ;; 检查项是否有对象属性
                           (setq oName (vla-get-ObjectName Item))) ;; 获取对象的名称
                    (progn
                      (vla-put-color Item Color)               ;; 设置对象颜色
                      (if (not (= (vla-get-layer Item) "0"))   ;; 如果对象的图层不是 "0"
                        (vla-put-layer Item "0")               ;; 将对象的图层设置为 "0"
                      )
                    )
                  )
                )
              )
            )
          )
        )
      )
    )
    (vla-UpDate obj)                                           ;; 更新对象以反映更改
  )
  ;; 主函数逻辑
  (if (and (setq ss (ssget '((0 . "insert"))))                 ;; 获取用户选择的所有插入对象
           (or $ChBlkColor$ (setq $ChBlkColor$ 7))             ;; 如果没有先前选择的颜色,默认使用颜色 7 (白色)
           (setq $ChBlkColor$ (acad_colordlg $ChBlkColor$)))   ;; 打开颜色选择对话框,让用户选择颜色
    (progn
      (setq blks (vla-get-blocks (vla-get-activedocument (vlax-get-acad-object)))) ;; 获取当前文档中的所有块
      (repeat (setq i (sslength ss))                           ;; 遍历选择集中的所有对象
        (setq obj (vlax-ename->vla-object (ssname ss (setq i (1- i))))) ;; 获取选择集中的每个对象
        (ChBlkColor Blks Obj $ChBlkColor$)                     ;; 调用 ChBlkColor 处理对象
      )
    )
  )
  (princ)                                                      ;; 结束函数,抑制输出
) 我改了一下,可以归层,但是有一个问题,有些动态块内部图元改颜色和图层改不了?哪位大神帮忙修改一下。
发表于 2024-1-25 17:52:06 | 显示全部楼层
bai2000 发表于 2023-11-24 09:35
只能改单个块的颜色,同名块的颜色没同时更新,希望能改进

Re刷新一下,就更新了,这个确实挺好用,跟那个好帮手里的一样功能
发表于 2024-10-4 10:59:02 | 显示全部楼层
zyxi19 发表于 2024-9-27 22:37
大佬,有改单个块,其余同名块不变色的吗

那得把块做成动态块,否则块不可以各种颜色。要么就是用布局控制显示颜色方式实现。
发表于 2022-8-22 15:45:19 | 显示全部楼层
谢谢,,非常好用
发表于 2022-8-23 08:00:48 | 显示全部楼层
谢谢,确实很好用
发表于 2023-11-24 08:36:59 | 显示全部楼层
不得不说,真的非常好用
发表于 2023-11-24 09:35:54 | 显示全部楼层
只能改单个块的颜色,同名块的颜色没同时更新,希望能改进
发表于 2024-1-25 19:34:30 | 显示全部楼层
谢谢楼主分享
发表于 2024-2-29 08:39:05 | 显示全部楼层
可以批量选择,可同时修改嵌套块,很好用。
发表于 2024-7-10 13:05:11 | 显示全部楼层
感谢作者的分享!
发表于 2024-9-5 20:44:47 | 显示全部楼层
要是能改单个块的颜色就好了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-2-21 03:38 , Processed in 0.197973 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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