秋枫 发表于 2010-11-13 14:19:00

有没有好办法对动态图块块名用ssget选择过滤?

<p>动态图块的插入实例,每个一实例用Entget得到的都匿名块。不能直接取得块名。</p>
<p>&nbsp;</p>
<p>如果用遍历选择集后处理的办法效率比较低,有没有好一点的高效的办法?</p>

ucuc2003 发表于 2022-7-17 00:56:20

;取得块名name
(setq en (car (entsel "\n选择块:")))
   (or
      (eq "TCH_BLOCK_INSERT" (cdr (assoc 0 (entget en))))
      (eq "INSERT" (cdr (assoc 0 (entget en))))
      (alert "没有选择块!")
    )
   (setq xobj (vlax-ename->vla-object en))
   (setq name (vlax-get-property xobj 'EffectiveName))

jzh56088 发表于 2022-7-8 11:25:21

snddd2000 发表于 2013-12-21 13:48


新手请教,这代码怎么变成可编译的lsp文件呀?

jzh56088 发表于 2022-7-8 11:30:57

新手请教下,这代码怎么变成可编译的lsp文件?

carrot1983 发表于 2010-11-13 14:54:00

秋枫发表于2010-11-13 14:19:00static/image/common/back.gif动态图块的插入实例,每个一实例用Entget得到的都匿名块。不能直接取得块名。 如果用遍历选择集后处理的办法效率比较低,有没有好一点的高效的办法?站内搜索更多有关的信息动态图块的出现,是在CAD2006以后的事情了,相信楼主也知道CAD2000以后的visualLISP 函数就一直没有增强。
ssget 函数也一样。

用遍历选择集后处理的办法,效率应该不会低到哪里去。


(-1 . <图元名: 7eb585b0>)
(0 . "INSERT")
(5 . "E7E")
(102 . "{ACAD_XDICTIONARY")
(360 . <图元名: 7eb585b8>)
(102 . "}")
(330 . <图元名: 7ef68cf8>)
(100 . "AcDbEntity")
(67 . 0)
(410 . "Model")
(8 . "0")
(100 . "AcDbBlockReference")
(2 . "*U14")
(10 1501.85 633.74 0.0)
(41 . 25.4)
(42 . 25.4)
(43 . 25.4)
(50 . 0.0)
(70 . 0)
(71 . 0)
(44 . 0.0)
(45 . 0.0)
(210 0.0 0.0 1.0)




(defun SSGET-DYNBLK->ENTS (SS NAME / E ENTS N)
;; By carrot1983 11/13/10
(repeat (setq N (sslength SS))
    (and (setq E (ssname SS (setq N (1- N))))
(setq O (vlax-ename->vla-object E))
(= (vla-get-isdynamicblock O) :vlax-true)
(= (vla-get-effectivename O) NAME)
(setq ENTS (cons E ENTS))
    )
)
ENTS
)

(defun C:TT ()
(setq SS (ssget '((0 . "INSERT"))))
(setq ENTS (SSGET-DYNBLK->ENTS SS "树 - 英制"))
(print ENTS)
(princ)
)

danxingpen 发表于 2010-11-13 15:32:00

<p>对于编程来说,无名块其实也是一个有名块,只不过他们的名字是系统管理的而已。动态块的选择和选择无名块不一样吗?</p>
<p><font face="Verdana">(setq tmpp(ssget "x" (list (cons 0 "INSERT")(cons 2 (strcat "`" (vla-get-name <font face="Verdana">(vlax-ename-&gt;vla-object(car(entsel "\n选择无名块:")))</font>))))))</font></p>

zhongys 发表于 2010-11-13 17:16:00

danxingpen发表于2010-11-13 15:32:00static/image/common/back.gif对于编程来说,无名块其实也是一个有名块,只不过他们的名字是系统管理的而已。动态块的选择和选择无名块不一样吗?
(setq tmpp(ssget \"x\" (list (cons 0 \"INSERT\")(cons 2 (strcat \"`\"


<p><font face="Verdana">命令: (cons 2 (strcat "`"((_&gt; (vla-get-name (vlax-ename-&gt;vla-object(car(entsel "\n选择无名块:"))))))</font></p>
<p>&nbsp;</p>
<p><font face="Verdana">选择无名块:(2 . "`*U340")</font></p>
<p>&nbsp;</p>
<p><font face="Verdana">命令: (ssget "x" (list (cons 0 "INSERT")(2 . "`*U340")))</font></p><font face="Verdana">
<p><br/>; 错误: *error* 函数中出错AutoCAD 变量设置被拒绝: "osmode" nil</p>
<p>&nbsp;</p>
<p>不行的,SSGET要如何处理才能选择"*U"这一类的无名块</p>
<p><br/>&nbsp;</p></font>

zhongys 发表于 2010-11-13 17:22:00

<font face="Verdana">命令: (ssget "x" (list '(0 . "INSERT")'(2 . "*U340")))<br/>nil</font>

danxingpen 发表于 2010-11-14 08:07:00

呵呵,楼上的看完整了吗?(ssget "x" (list '(0 . "INSERT")'(2 . "`*U340")))

秋枫 发表于 2010-11-28 22:37:59

先谢谢二楼提供思路的实现。虽然就是原来的思路。

三楼可能没有明白我的意思。选择是一样的,只是有一点特殊。我和问题不是匿名块和普通块的区别,而是动态块和普通块的区别。

动态块的块名不反映在第一级的dxf表中,在第一级的dxf表中只有一个匿名,这意味着已知动态块的块名,不能高效地通过SSGET的DXF过滤出来,必须选择块后遍历选择集才知道有没有选中,选中几个。

snddd2000 发表于 2011-3-9 14:02:16

可以试试
(setq ss1 (ssget '((0 . "INSERT") (2 . "`*U*") )))
但是没法分辨出不同的动态块

redcat 发表于 2011-3-9 14:30:32

本帖最后由 redcat 于 2011-3-9 14:33 编辑

在萝卜的基础上改了一下(效率低主要是在enamel转换为object上),代码如下:
(defun ssget-dynblk->ents (ss name / ents)
(if ss
    (vlax-for n      (vla-get-activeselectionset (vla-get-activedocument (vlax-get-acad-object)))
      (if (and (= (vla-get-isdynamicblock n) :vlax-true) (= (vla-get-effectivename n) name))
      (setq ents (cons n ents))
      ) ;_ 结束if
    ) ;_ 结束vlax-for
) ;_ 结束if
ents
) ;_ 结束defun


(defun C:TT (/ ss ents)
(vla-eval (vlax-get-acad-object) "Thisdrawing.Activeselectionset.Delete")
(if (setq ss (ssget '((0 . "INSERT"))))
    (progn (setq ents (ssget-dynblk->ents ss "树 - 英制"))
         (print ents)
    ) ;_ 结束progn
) ;_ 结束if
(princ)
) ;_ 结束defun

snddd2000 发表于 2011-3-10 10:40:46

本帖最后由 snddd2000 于 2012-12-27 17:02 编辑

我这里也有别人的代码分享下,是用两个函数完成的

(defun test ( block )
(ssget
    (list
      (cons 0 "INSERT")
      (cons 2
      (
          (lambda ( s )
            (foreach anon (LM:AnonymousInstancesof block)
            (setq s (strcat s ",`" anon))
            )
            s
          )
          block
      )
      )
    )
)
)

(defun LM:AnonymousInstancesof ( block / def rec nme ref lst )
(while (setq def (tblnext "BLOCK" (null def)))
    (if (= 1 (logand 1 (cdr (assoc 70 def))))
      (progn
      (setq rec
          (entget
            (cdr
            (assoc 330
                (entget
                  (tblobjname "BLOCK" (setq nme (cdr (assoc 2 def))))
                )
            )
            )
          )
      )
      (while (setq ref (assoc 331 rec))
          (if
            (and
            (eq block (vla-get-effectivename (vlax-ename->vla-object (cdr ref))))
            (not (member nme lst))
            )
            (setq lst (cons nme lst))
          )
          (setq rec (cdr (member (assoc 331 rec) rec)))
      )
      )
    )
)
(reverse lst)
)最后调用(test "动态块块名"),返回选择集 这是leemac的,但是在图中有表格的时候会没有反应,我自己又重写了一个。
页: [1] 2 3
查看完整版本: 有没有好办法对动态图块块名用ssget选择过滤?