明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2601|回复: 10

[已解答] 各位老师帮我看看这个图的扩展数据如何筛选

[复制链接]
发表于 2014-10-23 14:27 | 显示全部楼层 |阅读模式
5明经币
首先,图形都是由块组成的,然后每个边都有各自的扩展数据
同一个边
块分解之前的扩展数据是:
((-1 . <图形名: 7d9c9ca0>) (0 . INSERT) (330 . <图形名: 7e567dc0>) (5 . 4264) (100 .
AcDbEntity) (67 . 0) (410 . Model) (8 . GD24_F$R99$FG$BL_GAIKEI) (62 . 7) (6 .
Continuous) (100 . AcDbBlockReference) (2 . GD24_F$R99$FG$BL_LOWER) (10
-191114.0 17082.9 -18338.2) (41 . 1.0) (42 . 1.0) (43 . 1.0) (50 . 0.0) (70 .
0) (71 . 0) (44 . 0.0) (45 . 0.0) (210 0.0 0.0 1.0) (-3 (GAIKEI (1000 . W LOWER
C - -)) (KAKOUSHIRO (1000 . 0 0 0 0 0 0)) (TORITSUKE (1000 . WT S GD24_GWL
17.8013 -) (1013 -0.0963596 0.947234 0.305717))))
分解之后:
((-1 . <图形名: 7d9c9d38>) (0 . LINE) (330 . <图形名: 7e567dc0>) (5 . 4277) (100 .
AcDbEntity) (67 . 0) (410 . Model) (8 . 0) (62 . 1) (6 . ByBlock) (100 .
AcDbLine) (10 3464.55 0.0 0.0) (11 3693.37 23.2772 2.49565e-009) (210 0.0 0.0
1.0) (-3 (YOUSETSU_KAKOU (1000 . K 0.0 45.0 0.0 27.2 0.0 0 11 1 0.0 0.0 0.0 0.0
0 0.0 0.0))))

问题就来了,分解之前和分解之后的扩展数据发生了变化
如何能选中分解之前的含有YOUSETSU_KAKOU ”K”扩展数据呢?同一个边分解的前后却发生了变化。

实在不行的话,那么把它分解然后选中含有YOUSETSU_KAKOU ”K”  的扩展数据。

下面是小弟写的一个简陋的代码
迫不得已,在分解之后选中含有"K"的扩展数据结果还是没有选中
(defun c:K3 (/ ss)
     (setvar "cmdecho" 0)
     (SETQ ss (ssget "x" '((-3 ("YOUSETSU_KAKOU")(1000 . "K")))))
     (if (= ss (getvar ""))
     (vl-exit-with-error "")
     )
     (princ (strcat "\n 〓共选中了【" (itoa (sslength ss)) "】个対象〓 "))
     (sssetfirst nil ss)
  (setvar "cmdecho" 1)
(princ)
)

附件已上传,请各位老师帮帮忙
附件: 您需要 登录 才可以下载或查看,没有账号?注册

最佳答案

"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2014-10-23 14:27 | 显示全部楼层
本帖最后由 vectra 于 2014-10-23 20:02 编辑

  1. (defun get-block-names (/ blocks doc dxf rt)
  2.   (setq        doc    (vla-get-activedocument (vlax-get-acad-object))
  3.         blocks (vla-get-blocks doc)
  4.   )

  5.   (vlax-for block blocks
  6.     (if        (= :vlax-false (vla-get-islayout block))
  7.       (vlax-for        ent block
  8.         (setq dxf (entget (vlax-vla-object->ename ent) '("YOUSETSU_KAKOU"))
  9.               dxf (cdr (assoc -3 dxf))
  10.         )
  11.         (if (and dxf
  12.                  (vl-string-search "K" (cdr (cadar dxf)))
  13.                  (not (member (vla-get-name block) rt))
  14.             )
  15.           (setq rt (cons (vla-get-name block) rt))
  16.         )
  17.       )
  18.     )
  19.   )
  20.   rt
  21. )

  22. (defun concrete        (lst / rt)
  23.   (setq        rt  (car lst)
  24.         lst (cdr lst)
  25.   )
  26.   (while lst
  27.     (setq rt  (strcat rt "," (car lst))
  28.           lst (cdr lst)
  29.     )
  30.   )
  31.   rt
  32. )
  33. ;;;_$ (concrete '("2" "1" "1"))
  34. ;;;"2,1,1"

  35. (defun c:k3 (/ names ss)
  36.   (setq names (get-block-names))
  37.   (if names
  38.     (progn
  39.       (setq names (concrete names)
  40.             ss          (ssget "X" (list '(0 . "INSERT") (cons 2 names)))
  41.       )
  42.       (sssetfirst nil ss)
  43.     )
  44.   )
  45. )
回复

使用道具 举报

发表于 2014-10-23 15:58 | 显示全部楼层
xdata 1013 是一个随着父图元旋转和镜像(而不是移动、缩放或拉伸)的三维点 , 分解后就可能变化
回复

使用道具 举报

发表于 2014-10-23 16:25 | 显示全部楼层
楼主没有理解 “块定义”、“INSERT”、图元、块定义内的图元的关系。筛选分解前图元扩展数据需要在块定义中遍历图元。

ssget 仅支持-3段过滤,即(-3 ("YOUSETSU_KAKOU"),其它扩展数据需遍历选择集并进行判断比较来筛选
回复

使用道具 举报

 楼主| 发表于 2014-10-23 16:29 | 显示全部楼层
vectra 发表于 2014-10-23 16:25
楼主没有理解 “块定义”、“INSERT”、图元、块定义内的图元的关系。筛选分解前图元扩展数据需要在块定义中 ...

谢谢您的点评,刚刚结束扩展数据把明经翻遍了也没找到合适的方法。
您能否帮兄弟一个忙,谢谢了
回复

使用道具 举报

 楼主| 发表于 2014-10-23 16:31 | 显示全部楼层
ivde 发表于 2014-10-23 15:58
xdata 1013 是一个随着父图元旋转和镜像(而不是移动、缩放或拉伸)的三维点 , 分解后就可能变化

我想再不分解的情况下选中对象,有什么办法吗?
回复

使用道具 举报

 楼主| 发表于 2014-10-23 17:10 | 显示全部楼层
vectra 发表于 2014-10-23 16:49

谢谢您耐心的回答
现在的这段代码,只能在块分解后才能被选中。可否实现在块不被分解的状态被下选中呢?
因为这方面没有接触过,所以能否实现实在不是很清楚,可能要求有些无理
回复

使用道具 举报

发表于 2014-10-23 17:26 | 显示全部楼层
如果知道符合要求的那些块的名字,剩下的你可以搞定吗?

  1. (defun test (/ blocks doc dxf rt)
  2.   (setq        doc    (vla-get-activedocument (vlax-get-acad-object))
  3.         blocks (vla-get-blocks doc)
  4.   )

  5.   (vlax-for block blocks
  6.     (if        (= :vlax-false (vla-get-islayout block))
  7.       (vlax-for        ent block
  8.         (setq dxf (entget (vlax-vla-object->ename ent) '("YOUSETSU_KAKOU"))
  9.               dxf (cdr (assoc -3 dxf))
  10.         )
  11.         (if (and dxf
  12.                  (vl-string-search "K" (cdr (cadar dxf)))
  13.                  (not (member (vla-get-name block) rt))
  14.             )
  15.           (setq rt (cons (vla-get-name block) rt))
  16.         )
  17.       )
  18.     )
  19.   )
  20.   rt
  21. )
回复

使用道具 举报

 楼主| 发表于 2014-10-23 18:07 | 显示全部楼层
vectra 发表于 2014-10-23 17:26
如果知道符合要求的那些块的名字,剩下的你可以搞定吗?

我确实愚笨,恳请兄弟能否写个完整的,刚才自己弄了一下没得出结果
给您添麻烦了

点评

代码已更新 未经严格测试 请自行测试  发表于 2014-10-23 20:02
回复

使用道具 举报

 楼主| 发表于 2014-10-23 20:15 来自手机 | 显示全部楼层
只差一步,大家帮忙完善一下吧
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-4-26 15:01 , Processed in 0.583838 second(s), 34 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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