明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1784|回复: 13

[提问] 如何获取图块(包括块中块,属性等等)的图层

[复制链接]
发表于 2020-1-24 09:19:11 | 显示全部楼层 |阅读模式
本帖最后由 wudechao 于 2021-11-10 00:45 编辑

请教一个问题,如何获取图块(包括块中块,属性等等)的图层?我想把图块的图层关闭,总是不完美,获取的图层不完美。因为建筑图很多是用图块,想关闭某个图块不显示,总是关不全。cad的图层关闭对图块也是不行,关不全。
发表于 2020-2-2 11:12:34 | 显示全部楼层
;;说明:获取块选择集所有块内图元所有图层
(defun c:tt (/ bock-name layer-lst name-lst ss t-get-bock-all-name t-get-lst-unique)
        ;;说明:删除表里的重复元素
        ;;参数:l:表 [list]
        ;;返回:表 [list]
        ;;用法T-get-lst-Unique '(1 2 5 8 2 3 2 5 2 6))-->'(1 2 5 8 3 6)
        (defun T-get-lst-Unique (l)
                (if l
                        (cons
                                (car l)
                                (T-get-lst-Unique (vl-remove (car l) (cdr l)))
                        )
                )
        )
        ;;说明:获取块内所有图元名(含嵌套块)
        ;;参数:bock-name:块名 [ename]
        ;;返回:图元名表 [list]
        (defun T-get-bock-all-name (bock-name / dxf last-name name name-lst)
                (setq last-name (tblobjname "block" (cdr (assoc 2 (entget bock-name)))))
                (while (setq last-name (entnext last-name))
                        (setq dxf (entget last-name))
                        (setq name (cdr (assoc -1 dxf)))
                        (if (= (cdr (assoc 0 dxf)) "INSERT")
                                (setq name-lst (T-get-lst-Unique (append name-lst (T-get-bock-all-name name))))
                                (setq name-lst (append name-lst (list name)))
                        )
                )
                name-lst
        )
        (if (setq ss (ssget '((0 . "INSERT"))))
                (progn
                        (while (setq bock-name (ssname ss 0))
                                (setq name-lst (append name-lst (T-get-bock-all-name bock-name)))
                                (setq ss (ssdel bock-name ss))
                        )
                        (foreach x name-lst
                                (setq layer-lst (T-get-lst-Unique (append layer-lst (list (vla-get-Layer (vlax-ename->vla-object x))))))
                        )
                )
                layer-lst
        )
)
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2021-11-9 15:25:31 | 显示全部楼层
本帖最后由 wudechao 于 2021-11-9 16:02 编辑
taoyi0727 发表于 2020-2-2 11:12
;;说明:获取块选择集所有块内图元所有图层
(defun c:tt (/ bock-name layer-lst name-lst ss t-get-bock-a ...

我修改一下 T-get-bock-all-name函数,cons比append快,某些情况下快10倍   

(defun T-get-bock-all-name (bock-name / dxf last-name name name-lst)
                (setq last-name (tblobjname "block" (cdr (assoc 2 (entget bock-name)))))
                (while (setq last-name (entnext last-name))
                        (setq dxf (entget last-name))
                        (setq name (cdr (assoc -1 dxf)))
                        (if (= (cdr (assoc 0 dxf)) "INSERT")
                                (foreach x (T-get-bock-all-name name)
                                 (setq name-lst (cons x name-lst))
                               )
                                (setq name-lst (cons name name-lst))
                        )
                )
              (setq name-lst (T-get-lst-Unique name-lst))
                name-lst
        )
 楼主| 发表于 2020-2-2 05:11:09 | 显示全部楼层
真的没有办法了吗?
发表于 2020-2-2 11:13:45 | 显示全部楼层
剩下的你自己写了
上面这个是获取所有图层名
 楼主| 发表于 2020-2-2 13:03:10 | 显示全部楼层
taoyi0727 发表于 2020-2-2 11:13
剩下的你自己写了
上面这个是获取所有图层名

非常感谢!我试一试。
 楼主| 发表于 2021-11-9 08:46:12 | 显示全部楼层
本帖最后由 wudechao 于 2021-11-9 08:52 编辑
taoyi0727 发表于 2020-2-2 11:12
;;说明:获取块选择集所有块内图元所有图层
(defun c:tt (/ bock-name layer-lst name-lst ss t-get-bock-a ...

你这个T-get-lst-Unique函数有bug,在我的电脑图块超过6000个图元,必死机,这个问题困扰我一年多,我以为是哪里出错,总是找不到原因。前几天QQ群讨论用vl-position比vl-remove快,灵机一动,改用大海的修改版本试一试,结果意外修正了这个bug,而且速度快了一倍。(defun T-get-lst-Unique (lst / s-car new)
  (while lst
    (setq s-car (car lst))
    (if (vl-position s-car new)
      nil
      (setq new (cons s-car new))
    )
    (setq lst (cdr lst))
  )
  (setq new (reverse new))
  new
)
发表于 2021-11-9 10:32:55 | 显示全部楼层
接下来是要把获取的这些图层名关闭吗
 楼主| 发表于 2021-11-9 16:13:23 | 显示全部楼层
本帖最后由 wudechao 于 2021-11-9 16:17 编辑
20060510412 发表于 2021-11-9 10:32
接下来是要把获取的这些图层名关闭吗

图层隔离或图层关闭,目前测试到autocad2021为止,没有一个cad的隔离命令能关闭或者锁定图块的图层的(隔离不彻底,仅仅锁定几个图层),天正物体图层的操作我也有了方法,枚举法,一种种天正类型获取,太费劲。
发表于 2021-11-13 17:14:57 | 显示全部楼层
CAD自带的 layfrz 命令就可以
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-15 10:44 , Processed in 0.180341 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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