明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 7304|回复: 27

[求助]求图块改颜色的程序

  [复制链接]
发表于 2009-3-27 12:23:00 | 显示全部楼层 |阅读模式

别人做过来的块,很不规范,块里的对象颜色没有随层,块也没有定义到0层,尤其是块里套块的情况

现在求一下这样的小程序:

1.保留目前块所在的层,但是块的定义是在0层定义的

2.块中所有对象的颜色都随层

3.块里套块情况也要处理

总之,打个比方,经过处理后,一个块还是保留它目前的层,比如"家具层",这个块的颜色已经都变成"家具层",的颜色8

我觉得这样的程序挺实用的,不知道说清楚没有,谢谢

发表于 2009-3-27 16:59:00 | 显示全部楼层
本帖最后由 作者 于 2009-3-28 10:51:00 编辑

是 vlax-ename->vla-object 吧,
(vl-load-com)

;;网站的网页程序的关系,直接复制代码有问题,重发一下
;;-------------------------------------------------------------------
(defun c:ChColor (/ SS BLKS I BNLst)
  (princ "\n选择要修改颜色的对象: ")
  (if (and (setq SS (ssget))
           (or $ChColor$ (setq $ChColor$ 7))
           (setq $ChColor$ (acad_colordlg $ChColor$))
      )
    (progn
      (setq BLKS  (vla-get-blocks (vla-get-activedocument (vlax-get-acad-object))))
      (defun ChColor (OBJ / oName BlkName)
        (setq oName (vla-get-ObjectName OBJ))
        (cond
          ((wcmatch oName "*Dimension,AcDbLeader,AcDbFcf")
           (vla-put-DimensionLineColor OBJ $ChColor$)
           (if (wcmatch oName "*Dimension")
             (progn
               (vla-put-ExtensionLineColor OBJ $ChColor$)
               (if (setq BlkName (assoc 2 (entget (vlax-vla-object->ename OBJ))))
                 (vlax-for OBJ (vla-item Blks (cdr BlkName))
                   (vla-put-color OBJ $ChColor$)
                 )
               )
             )
           )
           (if (wcmatch oName "*Dimension,AcDbFcf")
             (vla-put-TextColor OBJ $ChColor$)
           )
          )
          ((= oName "AcDbBlockReference")
           (setq BlkName (vla-get-name OBJ))
           (if (not (member BlkName BNLst))
             (progn
               (setq BNLst (cons BlkName BNLst))
               (vlax-for X (vla-item Blks BlkName)
                 (ChColor X)
               )
             )
           )
           (if (= (vla-get-HasAttributes OBJ) :vlax-true)
             (foreach X (vlax-invoke OBJ 'getattributes)
               (vla-put-color X $ChColor$)
             )
           )
          )
        )
        (vla-put-color obj $ChColor$)
      )
      (repeat (setq I (sslength SS))
        (setq OBJ (vlax-ename->vla-object (ssname SS (setq I (1- I)))))
        (ChColor OBJ)
      )
    )
  )
  (princ)
)

回复 支持 1 反对 0

使用道具 举报

发表于 2020-3-31 23:32:32 | 显示全部楼层
请问:为追求速度,不要弹出选颜色的对话框,要改哪里呢?
例如一个命令对应一种颜色)
(defun c:V1 ()   (command "change" (ssget) "" "p" "c" "1" "")(princ))
(defun c:V2 ()   (command "change" (ssget) "" "p" "c" "2" "")(princ))

发表于 2009-3-27 14:37:00 | 显示全部楼层
 楼主| 发表于 2009-3-27 16:41:00 | 显示全部楼层
楼上的程序运行中出错,不知道为什么望赐教
发表于 2009-3-27 16:49:00 | 显示全部楼层
本帖最后由 作者 于 2009-3-27 17:06:28 编辑

可能是未加载函数

(setq SS (lt:ssget '("\n选择要修改颜色的对象: ")))
->

(setq SS (ssget))

发表于 2009-3-27 16:51:00 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
发表于 2009-3-27 17:04:00 | 显示全部楼层

;;改块的

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

发表于 2009-3-27 17:08:00 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
发表于 2009-3-27 17:11:00 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
发表于 2009-3-27 17:16:00 | 显示全部楼层
本帖最后由 作者 于 2009-3-27 17:18:53 编辑

本帖7 、8楼没用任何自定义函数啊!!

怪事!!为什么我用没问题??(问题好像有一个,就是在 UpDate,空了修改)

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

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

本版积分规则

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

GMT+8, 2025-2-21 03:34 , Processed in 0.195090 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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