【飞鸟集】再谈块的重新定义和全部实体改颜色
以前曾经发了一个能把CAD中所有实体(包括块和嵌套块中所有单独实体)颜色都改颜色的程序.其中龙龙仔版主提出:对于已经插入的属性无效。后来没有深入下去修改程序。
今天在autodesk讨论组中又看到了这个话题。其中一个程序的思路跟我的思路很相似,且能对属性块有效,下面把它贴出来。
(defun c:CCC ()
(vl-load-com)
(vlax-for Blk (vla-get-Blocks
(vla-get-ActiveDocument
(vlax-get-Acad-Object)
)
)
(vlax-for Obj Blk
(vla-put-Color Obj 256) ;256随层
(if (= (vla-get-ObjectName Obj) "AcDbBlockReference")
(foreach Att (vlax-invoke Obj 'GetAttributes)
(vla-put-Color Att 256);256随层
)
)
)
)
)
Gilles Chanteau在这个讨论中发了一个很好的程序,能实现对块内的实体全部修改的程序。
这个程序的功能是:
对图块内所有实体,包括嵌套块,单个图元全部改变其属性(图层,颜色,线型,线宽)
命令为: edit_bloc
这是其加载后的效果:
下面是其改变后的效果:
程序的源文件:
对话框文件:
编译后的文件:
raimo 发表于 2011-8-27 07:53 static/image/common/back.gif
改底图比较好的小工具...
能不能出个简单版的lsp..不要对话框..只需要直接将所需要的块变成一个颜色(不变层 ...
试试这个,好像可以的
;;;运行命令test
(defun c:test (/ i ent sel obj lst LayLst)
(setq *App (vlax-get-acad-object))
(setq *Doc (vla-get-ActiveDocument *APP))
(setq *BLK (vla-get-blocks *DoC))
(setq i 0)
(setq LayLst (Get_Layer_Status *Doc))
(UnLock_All_Layers *DOC)
(UnFreeze_All_Layers *DOC)
(if (setq sel (ssget '((0 . "INSERT"))))
(repeat (sslength sel)
(setq ent (ssname sel i))
(setq obj (vlax-ename->vla-object ent))
(setq lst (entget ent))
(change-color obj)
(setq i (1+ i))
)
(princ "\n你没有选择物体!")
)
(Restore_Layer_Status LayLst)
(princ)
)
;;;主要函数
(defun change-color (obj / name blks)
(vla-put-color obj AcByLayer); 要加出错处理,因为有的可能被锁定
(if (or
(= (vla-get-objectname obj) "AcDbBlockReference")
(= (vla-get-objectname obj) "AcDbMInsertBlock")
)
(progn
(foreach Att (vlax-invoke Obj 'GetAttributes)
(vla-put-layer Att "0")
(vla-put-Color Att AcByLayer) ; 这一行用于处理属性随层
)
(setq name (vla-get-name obj)) ; 取得块名
(setq blks (vla-item *BLK name))
(vlax-for n blks
(change-color n); 递归进去,用于处理嵌套
)
)
(vla-put-layer obj "0"); 如果不改为0层,则有的可能不变色
)
)
;;; 以下函数仅仅为防止出错用
;;; 得到图层状态
(defun Get_Layer_Status (*DOC / V_LIST L_LIST C_LIST T_LIST W_LIST)
(vlax-for n (vla-get-layers *DOC)
(setq V_List (cons (cons n (vla-get-LayerOn n)) V_List)
L_List (cons (cons n (vla-get-Lock n)) L_List)
C_List (cons (cons n (vla-get-TrueColor n)) C_List)
T_List (cons (cons n (vla-get-Linetype n)) T_List)
W_List (cons (cons n (vla-get-LineWeight n)) W_List)
F_List (cons (cons n (vla-get-Freeze n)) F_List)
)
)
(List V_List L_List C_List T_List W_List F_List)
)
;;;恢复图层状态
(defun Restore_Layer_status (LayLst)
(mapcar
(function
(lambda (x y)
(foreach n X
(if (/= (strcase (setq name (vla-get-name (car n))))
(strcase (getvar "clayer"))
) ;非当前层
(vlax-put-property (car n) y (cdr n))
;;对于当前层
(if (/= y "Freeze");排除冻结操作,以防出错
(vlax-put-property (car n) y (cdr n))
)
)
)
)
)
LayLst
(list "Layeron" "Lock" "TrueColor" "LineType" "LineWeight" "Freeze")
)
)
;;;解锁所有图层
(defun UnLock_All_Layers (*DOC)
(vlax-for n (vla-get-layers *DOC)
(vla-put-lock n :vlax-false)
)
)
;;;解冻所有图层
(defun UnFreeze_All_Layers (*DOC)
(vlax-for n (vla-get-layers *DOC)
(if (/= (strcase (vla-get-name n))
(strcase (getvar "clayer"))
)
(vla-put-Freeze n :vlax-false)
)
)
) 很好→很棒!很好~很棒!!很好……很棒!!! 多谢大师,留个脚印慢慢学习 好 ,感谢分享挺好使 这个好啊,修改底图特好使 很早以前发过类似的东西,结论是除了MLINE不能修改 改底图比较好的小工具...
能不能出个简单版的lsp..不要对话框..只需要直接将所需要的块变成一个颜色(不变层,只改颜色) 没看明白应该怎么用 搞个中文版吧 真是精辟
页:
[1]
2