动态图块的插入实例,每个一实例用Entget得到的都匿名块。不能直接取得块名。

 

如果用遍历选择集后处理的办法效率比较低,有没有好一点的高效的办法?



网友答: ;;;===========================================================
;;; 函数名: ssgetblock-X2
;;; 功能: 通过窗口选择方式选择指定名称列表中的图块
;;; 参数:
;;;   pt1 - 窗口选择第一点
;;;   pt2 - 窗口选择第二点  
;;;   blknamelst - 图块名称列表
;;; 返回值: 包含符合条件图块的选择集
;;; (setq pt1 (getpoint "\n指定第一角点: "))
;;  (setq pt2 (getcorner pt1 "\n指定第二角点: ")))
;;  (ssgetblock-X2 pt1 pt2 '("DESK" "COMPUTER"))
;;;===========================================================
(defun ssgetblock-X2 ( pt1 pt2 blknamelst / ss0 n count ent0 str BlkName0)
  (setq ss0 (ssget "X" '((0 . "INSERT"))))
  (setq        n     0
        count (sslength ss0)
        str   ""
  )
  (repeat count
    (setq ent0 (ssname ss0 n))
    (setq BlkName0 (vla-get-effectivename
                     (vlax-ename->vla-object ent0)
                   )
    )
    (if        (member BlkName0 blknamelst)
      (setq str (strcat str ",`" (cdr (assoc 2 (entget ent0)))))
    )
    (setq n (1+ n))
  )                                        ;end repeat
  (ssget "W" pt1 pt2  (list (cons 0 "INSERT") (cons 2 str)))
)

;;收集图中的所有此块名的dxf的2组码,作为ssget的过滤条件
(defun ssgetblock (blkname / ss0 n count ent0 str BlkName0)
  (setq ss0 (ssget "X" '((0 . "INSERT"))))
  (setq   n     0
                count (sslength ss0)
                str   ""
  )
  (repeat count
    (setq ent0 (ssname ss0 n))
    (setq BlkName0 (vla-get-effectivename
                     (vlax-ename->vla-object ent0)
                   )
    )
    (if        (= blkname BlkName0)
      (setq str (strcat str ",`" (cdr (assoc 2 (entget ent0)))))
    )
    (setq n (1+ n))
  )                                        ;end repeat
  (ssget (list (cons 0 "INSERT") (cons 2 str)))
)


网友答:   ;取得块名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))

网友答:
snddd2000 发表于 2013-12-21 13:48

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


网友答:
秋枫发表于2010-11-13 14:19:00动态图块的插入实例,每个一实例用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)

  1. (defun SSGET-DYNBLK->ENTS (SS NAME / E ENTS N)
  2.   ;; By carrot1983 11/13/10
  3.   (repeat (setq N (sslength SS))
  4.     (and (setq E (ssname SS (setq N (1- N))))
  5.   (setq O (vlax-ename->vla-object E))
  6.   (= (vla-get-isdynamicblock O) :vlax-true)
  7.   (= (vla-get-effectivename O) NAME)
  8.   (setq ENTS (cons E ENTS))
  9.     )
  10.   )
  11.   ENTS
  12. )

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


网友答:

对于编程来说,无名块其实也是一个有名块,只不过他们的名字是系统管理的而已。动态块的选择和选择无名块不一样吗?

(setq tmpp(ssget "x" (list (cons 0 "INSERT")(cons 2 (strcat "`" (vla-get-name (vlax-ename->vla-object(car(entsel "\n选择无名块:")))))))))



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

命令: (cons 2 (strcat "`"((_> (vla-get-name (vlax-ename->vla-object(car(entsel "\n选择无名块:"))))))

 

选择无名块2 . "`*U340")

 

命令: (ssget "x" (list (cons 0 "INSERT")(2 . "`*U340")))


; 错误: *error* 函数中出错AutoCAD 变量设置被拒绝: "osmode" nil

 

不行的,SSGET要如何处理才能选择"*U"这一类的无名块


 



网友答: 命令: (ssget "x" (list '(0 . "INSERT")'(2 . "*U340")))
nil


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

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

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

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

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

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

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


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


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

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

  1. (defun test ( block )
  2.   (ssget
  3.     (list
  4.       (cons 0 "INSERT")
  5.       (cons 2
  6.         (
  7.           (lambda ( s )
  8.             (foreach anon (LM:AnonymousInstancesof block)
  9.               (setq s (strcat s ",`" anon))
  10.             )
  11.             s
  12.           )
  13.           block
  14.         )
  15.       )
  16.     )
  17.   )
  18. )

  19. (defun LM:AnonymousInstancesof ( block / def rec nme ref lst )
  20.   (while (setq def (tblnext "BLOCK" (null def)))
  21.     (if (= 1 (logand 1 (cdr (assoc 70 def))))
  22.       (progn
  23.         (setq rec
  24.           (entget
  25.             (cdr
  26.               (assoc 330
  27.                 (entget
  28.                   (tblobjname "BLOCK" (setq nme (cdr (assoc 2 def))))
  29.                 )
  30.               )
  31.             )
  32.           )
  33.         )
  34.         (while (setq ref (assoc 331 rec))
  35.           (if
  36.             (and
  37.               (eq block (vla-get-effectivename (vlax-ename->vla-object (cdr ref))))
  38.               (not (member nme lst))
  39.             )
  40.             (setq lst (cons nme lst))
  41.           )
  42.           (setq rec (cdr (member (assoc 331 rec) rec)))
  43.         )
  44.       )
  45.     )
  46.   )
  47.   (reverse lst)
  48. )
最后调用(test "动态块块名"),返回选择集 这是leemac的,但是在图中有表格的时候会没有反应,我自己又重写了一个。
  • 上一篇:文字炸开后不连接
  • 下一篇:没有了