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

而且执行不了的,搞不清楚为什么
页: 1 [2] 3
查看完整版本: 嵌套块清理(odcl)