各位老师帮我看看这个图的扩展数据如何筛选
首先,图形都是由块组成的,然后每个边都有各自的扩展数据同一个边
块分解之前的扩展数据是:
((-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)
)
附件已上传,请各位老师帮帮忙
本帖最后由 vectra 于 2014-10-23 20:02 编辑
(defun get-block-names (/ blocks doc dxf rt)
(setq doc (vla-get-activedocument (vlax-get-acad-object))
blocks (vla-get-blocks doc)
)
(vlax-for block blocks
(if (= :vlax-false (vla-get-islayout block))
(vlax-for ent block
(setq dxf (entget (vlax-vla-object->ename ent) '("YOUSETSU_KAKOU"))
dxf (cdr (assoc -3 dxf))
)
(if (and dxf
(vl-string-search "K" (cdr (cadar dxf)))
(not (member (vla-get-name block) rt))
)
(setq rt (cons (vla-get-name block) rt))
)
)
)
)
rt
)
(defun concrete (lst / rt)
(setq rt(car lst)
lst (cdr lst)
)
(while lst
(setq rt(strcat rt "," (car lst))
lst (cdr lst)
)
)
rt
)
;;;_$ (concrete '("2" "1" "1"))
;;;"2,1,1"
(defun c:k3 (/ names ss)
(setq names (get-block-names))
(if names
(progn
(setq names (concrete names)
ss (ssget "X" (list '(0 . "INSERT") (cons 2 names)))
)
(sssetfirst nil ss)
)
)
)
xdata 1013 是一个随着父图元旋转和镜像(而不是移动、缩放或拉伸)的三维点 , 分解后就可能变化 楼主没有理解 “块定义”、“INSERT”、图元、块定义内的图元的关系。筛选分解前图元扩展数据需要在块定义中遍历图元。
ssget 仅支持-3段过滤,即(-3 ("YOUSETSU_KAKOU"),其它扩展数据需遍历选择集并进行判断比较来筛选 vectra 发表于 2014-10-23 16:25 static/image/common/back.gif
楼主没有理解 “块定义”、“INSERT”、图元、块定义内的图元的关系。筛选分解前图元扩展数据需要在块定义中 ...
谢谢您的点评,刚刚结束扩展数据把明经翻遍了也没找到合适的方法。
您能否帮兄弟一个忙,谢谢了 ivde 发表于 2014-10-23 15:58 static/image/common/back.gif
xdata 1013 是一个随着父图元旋转和镜像(而不是移动、缩放或拉伸)的三维点 , 分解后就可能变化
我想再不分解的情况下选中对象,有什么办法吗? vectra 发表于 2014-10-23 16:49 static/image/common/back.gif
谢谢您耐心的回答
现在的这段代码,只能在块分解后才能被选中。可否实现在块不被分解的状态被下选中呢?
因为这方面没有接触过,所以能否实现实在不是很清楚,可能要求有些无理 如果知道符合要求的那些块的名字,剩下的你可以搞定吗?
(defun test (/ blocks doc dxf rt)
(setq doc (vla-get-activedocument (vlax-get-acad-object))
blocks (vla-get-blocks doc)
)
(vlax-for block blocks
(if (= :vlax-false (vla-get-islayout block))
(vlax-for ent block
(setq dxf (entget (vlax-vla-object->ename ent) '("YOUSETSU_KAKOU"))
dxf (cdr (assoc -3 dxf))
)
(if (and dxf
(vl-string-search "K" (cdr (cadar dxf)))
(not (member (vla-get-name block) rt))
)
(setq rt (cons (vla-get-name block) rt))
)
)
)
)
rt
) vectra 发表于 2014-10-23 17:26 static/image/common/back.gif
如果知道符合要求的那些块的名字,剩下的你可以搞定吗?
我确实愚笨,恳请兄弟能否写个完整的,刚才自己弄了一下没得出结果
给您添麻烦了 只差一步,大家帮忙完善一下吧
页:
[1]
2