USER2128
发表于 2016-7-29 08:55:02
fl202 发表于 2016-7-26 15:29 static/image/common/back.gif
遇到嵌套块是很烦的。好多人定义块时,对象没有在0层(习惯非常不好)。这样最后出图图纸上图层特别多,清理 ...
;;; 将图中所有块(含嵌套块)内所有对象更改到0图层,颜色随层.
;;; 由“USER”根据“fl202”原作进行改动.
(defun c:tt (/ BLK E L N X)
(setvar "clayer" "0")
(while (setq bLk (tblnext "block" (not bLk)))
(if (not (member (setq n (cdr (assoc 2 bLk))) L))
(progn
(setq e (tblobjname "block" n)
l (cons n l)
)
(while (setq e (entnext e))
(setq x (entget e))
(entmod (subst '(8 . "0") (assoc 8 x) x))
)
)
)
)
(command "_.regen")
(princ)
)
clinber
发表于 2016-7-29 10:38:03
清理嵌套图块 by masterlongno function definition: DCL-FORM-SHOW
masterlong
发表于 2016-7-29 10:45:07
将嵌套块内的图元
统一到某个图层
很多时候这样处理
麻烦会更大
以建筑底图清理为例
当墙、门窗、家具等等做成了一个图块
如果进行了图层归并
那这个图就等同于废了
因为接下来
是没办法在建筑底图上进行后续设计的
这一点
设备专业的应该能够有体会
fl202
发表于 2016-7-29 11:11:22
本帖最后由 fl202 于 2016-7-29 11:14 编辑
masterlong 发表于 2016-7-29 10:45 static/image/common/back.gif
将嵌套块内的图元
统一到某个图层
很多时候这样处理
如果建立块时,对象全部在0层。那么这个块在插入时,插入“1”层,则随1层的性质(线宽/颜色等等)。
将嵌套块内图元全部归到0层,如果该块在“墙”层,purge时,“墙”层有对象,并不会清理掉“墙”层。
图也不会变为废图。你可以试试。
一个图纸中有很多嵌套块,产生了很多乱七八糟的层,这样总层数特别多。层的各种操作,比如切换到墙层,要从众多的层中找到墙层,很费眼力的。
masterlong
发表于 2016-7-29 12:20:26
层并不是因为嵌套块而产生的
嵌套块里也不是只有一类图元
块内图层合并
就建筑领域而言
只有家具洁具
或者厂房设计中工艺设备有用
前提是这些东西
还不能和其它类别混在一起做成嵌套块
换句话说
图层合并是在嵌套块清理了以后使用的
如果你从来不曾
在图层归并操作后遇到麻烦
那么恭喜你
给你提资的同事的绘图习惯相当良好
fl202
发表于 2016-7-29 13:02:31
masterlong 发表于 2016-7-29 12:20 static/image/common/back.gif
层并不是因为嵌套块而产生的
嵌套块里也不是只有一类图元
块内图层合并
如果是非0层块,在插入块的同时,图纸中会增加该块定义时所设定的层。
将块或者嵌套块内对象改为0层后,在清理合并图层,可以缩减层的数量,减少文件大小,另对图纸中的内容不产生影响。
你可以先试试楼上的程序再说。
masterlong
发表于 2016-7-29 13:55:57
你提供的程序我自己编的有
只想问你一个问题
当墙家具轴线尺寸标注
混在一起做成了块
请问这种情况下
图层归并到了0层
然后你准备将这个块放到哪个层
墙?家具?轴线?标注?or 0层?
masterlong
发表于 2016-7-29 18:40:12
本帖最后由 masterlong 于 2016-7-29 18:50 编辑
虽然这个帖子讨论的是嵌套块的清理
不过既然已经歪了楼
那就贴一个合并图层的函数
块的图层合并
是必须采用递归的
;;
;;递归方式块合并图层(不能处理块内属性)
;;使用举例:::(bch "沙发" "z_家具" 33);;图层"z_家具"需预先设定
;;
;|
(setq *acad*(vlax-get-acad-object)
*doc* (vla-get-ActiveDocument *acad*)
)
(command "layer" "m" "z_ 家具" "")
|;
(defun bch ( bname layname layco / blkdef obj objname )
(if (not
(vl-catch-all-error-p
(setq blkdef (vl-catch-all-apply 'vla-item (list (vla-get-blocks *doc*) bname)))
)
)
(vlax-for obj blkdef
(if (= "AcDbBlockReference" (setq objname (vla-get-ObjectName obj)))
(progn
(vla-put-layer obj layname)
(vla-put-color obj layco)
(bch (vla-get-name obj) layname layco)
;; (setq inb (cons (vla-get-name obj) inb)) ;;合并完成后,inb将用于过滤选择图块
)
(progn
(vla-put-layer obj layname)
(vla-put-color obj 0)
;;(if (= "AcDbText" objname) ;;解除屏蔽,可以顺便统一字型
;; (vla-put-StyleName obj "hztxt")
;;)
)
)
)
)
)
顺便说下0层做块的个人看法
一般情况下不建议在0层做块
除非块本身对放置在哪个层没有要求
如果一个块做出来
只想放置在特定层
那么就在特定层上做块、插块
如果希望改颜色
基准图元采用byblock
这样最重要的好处是
图块一旦炸碎
炸碎的图元依然在你指定的图层上
而不是都去了0层
假设多个层的0层图块意外炸碎
所有的图元都在0层
那可是想分都分不开了
magicheno
发表于 2020-5-24 00:10:37
这整个执行之后把CAD都弄崩了不知道为啥
magicheno
发表于 2020-5-24 00:11:06
而且执行不了的,搞不清楚为什么