明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
楼主: masterlong

[源码] 嵌套块清理(odcl)

[复制链接]
发表于 2016-7-29 08:55:02 | 显示全部楼层
fl202 发表于 2016-7-26 15:29
遇到嵌套块是很烦的。好多人定义块时,对象没有在0层(习惯非常不好)。这样最后出图图纸上图层特别多,清理 ...
  1. ;;; 将图中所有块(含嵌套块)内所有对象更改到0图层,颜色随层.
  2. ;;; 由“USER”根据“fl202”原作进行改动.
  3. (defun c:tt (/ BLK E L N X)
  4.   (setvar "clayer" "0")
  5.   (while (setq bLk (tblnext "block" (not bLk)))
  6.     (if (not (member (setq n (cdr (assoc 2 bLk))) L))
  7.       (progn
  8.   (setq e (tblobjname "block" n)
  9.         l (cons n l)
  10.         )
  11.   (while (setq e (entnext e))
  12.     (setq x (entget e))
  13.     (entmod (subst '(8 . "0") (assoc 8 x) x))
  14.     )
  15.   )
  16.       )
  17.     )
  18.   (command "_.regen")
  19.   (princ)
  20.   )

点评

完美!  发表于 2016-7-29 10:37
发表于 2016-7-29 10:38:03 | 显示全部楼层
清理嵌套图块    by masterlongno function definition: DCL-FORM-SHOW
 楼主| 发表于 2016-7-29 10:45:07 | 显示全部楼层
将嵌套块内的图元
统一到某个图层
很多时候这样处理
麻烦会更大

以建筑底图清理为例
当墙、门窗、家具等等做成了一个图块
如果进行了图层归并
那这个图就等同于废了
因为接下来
是没办法在建筑底图上进行后续设计的
这一点
设备专业的应该能够有体会
发表于 2016-7-29 11:11:22 | 显示全部楼层
本帖最后由 fl202 于 2016-7-29 11:14 编辑
masterlong 发表于 2016-7-29 10:45
将嵌套块内的图元
统一到某个图层
很多时候这样处理

如果建立块时,对象全部在0层。那么这个块在插入时,插入“1”层,则随1层的性质(线宽/颜色等等)。

将嵌套块内图元全部归到0层,如果该块在“墙”层,purge时,“墙”层有对象,并不会清理掉“墙”层。
图也不会变为废图。你可以试试。

一个图纸中有很多嵌套块,产生了很多乱七八糟的层,这样总层数特别多。层的各种操作,比如切换到墙层,要从众多的层中找到墙层,很费眼力的。
 楼主| 发表于 2016-7-29 12:20:26 来自手机 | 显示全部楼层
层并不是因为嵌套块而产生的
嵌套块里也不是只有一类图元
块内图层合并
就建筑领域而言
只有家具洁具
或者厂房设计中工艺设备有用
前提是这些东西
还不能和其它类别混在一起做成嵌套块
换句话说
图层合并是在嵌套块清理了以后使用的
如果你从来不曾
在图层归并操作后遇到麻烦
那么恭喜你
给你提资的同事的绘图习惯相当良好
发表于 2016-7-29 13:02:31 | 显示全部楼层
masterlong 发表于 2016-7-29 12:20
层并不是因为嵌套块而产生的
嵌套块里也不是只有一类图元
块内图层合并

如果是非0层块,在插入块的同时,图纸中会增加该块定义时所设定的层。
将块或者嵌套块内对象改为0层后,在清理合并图层,可以缩减层的数量,减少文件大小,另对图纸中的内容不产生影响。

你可以先试试楼上的程序再说。
 楼主| 发表于 2016-7-29 13:55:57 来自手机 | 显示全部楼层
你提供的程序我自己编的有

只想问你一个问题
当墙家具轴线尺寸标注
混在一起做成了块
请问这种情况下
图层归并到了0层
然后你准备将这个块放到哪个层
墙?家具?轴线?标注?or 0层?
 楼主| 发表于 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层
那可是想分都分不开了

评分

参与人数 1明经币 +1 收起 理由
USER2128 + 1 赞一个!

查看全部评分

发表于 2020-5-24 00:10:37 | 显示全部楼层
这整个执行之后把CAD都弄崩了不知道为啥
发表于 2020-5-24 00:11:06 | 显示全部楼层
而且执行不了的,搞不清楚为什么
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-17 05:41 , Processed in 0.172989 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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