明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
楼主: 54256

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

  [复制链接]
发表于 2009-3-27 17:31:00 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
发表于 2009-3-27 17:35:00 | 显示全部楼层
本帖啊,置顶的帖子因为使用论坛的代码自动着色功能而出错

本帖子中包含更多资源

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

x
 楼主| 发表于 2009-3-27 19:39:00 | 显示全部楼层
caoyin大哥,麻烦说下6楼和7楼的区别,另外6楼的我加载就错误
发表于 2009-3-28 00:01:00 | 显示全部楼层

希望这个程序是你所需要的。

本帖子中包含更多资源

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

x
发表于 2009-3-28 10:52:00 | 显示全部楼层
54256发表于2009-3-27 19:39:00caoyin大哥,麻烦说下6楼和7楼的区别,另外6楼的我加载就错误

不好意思,多了一个闭括号

区别不大,一个是修改所有对象,一个是修改块的

发表于 2009-3-28 11:14:00 | 显示全部楼层
highflybir发表于2009-3-28 0:01:0046698希望这个程序是你所需要的。

程序有点问题,差冻结的不能处理 
 
隐藏的可以处理,就差冻结 
 
执行命令的时候,选择图块时,直接在命令行输入 all  选择 全部

发表于 2009-3-28 14:43:00 | 显示全部楼层
本帖最后由 作者 于 2009-3-28 14:45:19 编辑

增加一个子函数,对付冻结的图层:
  1. ;; 解除图层冻结  BY 木子CAD 小李子 2009-3-28
  2. (defun c:test (/ *app *doc *blk)
  3.   (setq *App (vlax-get-acad-object))
  4.   (setq *Doc (vla-get-ActiveDocument *APP))
  5.    (vlax-for n (vla-get-layers *DOC)
  6. (if (/= (strcase (vla-get-name n))
  7.      (strcase (getvar "clayer"))
  8. )
  9.     (vla-put-Freeze n :vlax-false) ;(vlax-dump-object n t)
  10. )
  11.   )
  12.   (command "regen") ;(vla-regen)
  13. )
  14. (defun C:LayUnFrz (/ acadDocument theLayers)
  15.   (vl-load-com)
  16.   (setq acadDocument (vla-get-activedocument (vlax-get-acad-object)))
  17.   (setq theLayers (vla-get-layers acadDocument))
  18.   (vlax-for item theLayers
  19.     (if (/= (strcase (vla-get-name item))
  20.      (strcase (getvar "clayer"))
  21. )
  22.       (vlax-put-property item "Freeze" ':vlax-false)
  23.     )
  24.   )
  25.   (princ)
  26. )
发表于 2009-3-28 15:24:00 | 显示全部楼层
最后修改的程序,增加图层冻结情况的处理,完整程序代码如下:
  1. ;;;运行命令test
  2. (defun c:test (/ i ent sel obj lst LayLst)
  3.   (setq *App (vlax-get-acad-object))
  4.   (setq *Doc (vla-get-ActiveDocument *APP))
  5.   (setq *BLK (vla-get-blocks *DoC))
  6.   (setq i 0)
  7.   (setq LayLst (Get_Layer_Status *Doc))
  8.   (UnLock_All_Layers *DOC)
  9.   (UnFreeze_All_Layers *DOC)
  10.   (if (setq sel (ssget '((0 . "INSERT"))))
  11.     (repeat (sslength sel)
  12.       (setq ent (ssname sel i))
  13.       (setq obj (vlax-ename->vla-object ent))
  14.       (setq lst (entget ent))
  15.       (change-color obj)
  16.       (setq i (1+ i))
  17.     )
  18.     (princ "\n你没有选择物体!")
  19.   )
  20.   (Restore_Layer_Status LayLst)
  21.   (princ)
  22. )
  23. ;;;主要函数
  24. (defun change-color (obj / name blks)
  25.   (vla-put-color obj AcByLayer)  ; 要加出错处理,因为有的可能被锁定
  26.   (if (or
  27. (= (vla-get-objectname obj) "AcDbBlockReference")
  28. (= (vla-get-objectname obj) "AcDbMInsertBlock")
  29.       )
  30.     (progn
  31.       (foreach Att (vlax-invoke Obj 'GetAttributes)
  32. (vla-put-layer Att "0")
  33. (vla-put-Color Att AcByLayer) ; 这一行用于处理属性随层
  34.       )
  35.       (setq name (vla-get-name obj)) ; 取得块名
  36.       (setq blks (vla-item *BLK name))
  37.       (vlax-for n blks
  38. (change-color n)  ; 递归进去,用于处理嵌套
  39.       )
  40.     )
  41.     (vla-put-layer obj "0")  ; 如果不改为0层,则有的可能不变色
  42.   )
  43. )
  44. ;;; 以下函数仅仅为防止出错用
  45. ;;; 得到图层状态
  46. (defun Get_Layer_Status (*DOC / V_LIST L_LIST C_LIST T_LIST W_LIST)
  47.   (vlax-for n (vla-get-layers *DOC)
  48.     (setq V_List (cons (cons n (vla-get-LayerOn n)) V_List)
  49.    L_List (cons (cons n (vla-get-Lock n)) L_List)
  50.    C_List (cons (cons n (vla-get-TrueColor n)) C_List)
  51.    T_List (cons (cons n (vla-get-Linetype n)) T_List)
  52.    W_List (cons (cons n (vla-get-LineWeight n)) W_List)
  53.    F_List (cons (cons n (vla-get-Freeze n)) F_List)
  54.     )
  55.   )
  56.   (List V_List L_List C_List T_List W_List F_List)
  57. )
  58. ;;;恢复图层状态
  59. (defun Restore_Layer_status (LayLst)
  60.   (mapcar
  61.     (function
  62.       (lambda (x y)
  63. (foreach n X
  64.    (if (/= (strcase (setq name (vla-get-name (car n))))
  65.     (strcase (getvar "clayer"))
  66.        )    ;非当前层
  67.      (vlax-put-property (car n) y (cdr n))
  68.      ;;对于当前层
  69.      (if (/= y "Freeze")  ;排除冻结操作,以防出错
  70.        (vlax-put-property (car n) y (cdr n))
  71.      )
  72.    )
  73. )
  74.       )
  75.     )
  76.     LayLst
  77.     (list "Layeron" "Lock" "TrueColor" "LineType" "LineWeight" "Freeze")
  78.   )
  79. )
  80. ;;;解锁所有图层
  81. (defun UnLock_All_Layers (*DOC)
  82.   (vlax-for n (vla-get-layers *DOC)
  83.     (vla-put-lock n :vlax-false)
  84.   )
  85. )
  86. ;;;解冻所有图层
  87. (defun UnFreeze_All_Layers (*DOC)
  88.   (vlax-for n (vla-get-layers *DOC)
  89.     (if (/= (strcase (vla-get-name n))
  90.      (strcase (getvar "clayer"))
  91. )
  92.       (vla-put-Freeze n :vlax-false)
  93.     )
  94.   )
  95. )
发表于 2011-11-19 01:38:21 | 显示全部楼层
改块的程序非常棒 要是改块的时候不跳出来选择颜色对话框就好了
发表于 2012-5-6 00:11:34 | 显示全部楼层
caoyin 发表于 2009-3-27 17:04
;;改块的(defun c:ChBlkColor (/ ChBlkColor SS blks I Obj BnLst)  (defun ChBlkColor (Blks Obj Col ...

改块子对象颜色好实现吗?

点评

当然,不是有源码吗  发表于 2012-5-6 04:46
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-2-22 05:27 , Processed in 0.140579 second(s), 20 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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