gilsoto13 发表于 2022-7-6 12:26:24

选择集团的所有实例

大家好。。。
 
问题是。。。我经常使用lisp例程来选择拾取块的所有实例,但现在我意识到它不适用于动态块,因为它们的每个新副本或插入都会得到一个新的注释性名称。
 
我知道可以从动态块中添加有效块名。。但我不知道如何修改例程,使其同时适用于正常和动态。。。以下是两个代码。。。第一种是针对普通块的。。另一个是我在augi中找到的一系列线,它们与使用vla获得有效块名有关。
 

(defun c:SB2 ()
(COND (T (SETVAR "CMDECHO" 0)
(SETQ L1 nil)
(WHILE (= L1 nil)
(SETQ L1(ENTSEL "Pick BLOCK to acquire its instances in the drawing...")))
(SETQ L1 (ENTGET (CAR L1)) L1 (CDR (ASSOC 2 L1))L1 (SSGET "X" (LIST (CONS 2 L1))))
(PRINC)
)
)
)


 

(setq Sel (entsel "\n Select block to select likewise: "))
(setq Obj (vlax-ename->vla-object (car Sel)))
(= (vla-get-ObjectName Obj) "AcDbBlockReference")
(= (vla-get-IsDynamicBlock obj) :vlax-true)
(setq BlkName (vla-get-EffectiveName Obj)); end and


 
谁能让这个成为某人。lsp是否与动态块和正常块一起工作?

ronjonp 发表于 2022-7-6 12:36:14

这应该满足您的需求:
 
(defun c:getblk    (/ e name n out ss x rjp-getblockname)
(defun rjp-getblockname (obj)
   (if    (vlax-property-available-p obj 'effectivename)
   (vla-get-effectivename obj)
   (vla-get-name obj)
   )
)
(if (setq x   (ssget '((0 . "INSERT")))
       x   (ssname x 0)
       name (rjp-getblockname (vlax-ename->vla-object x))
       ss   (ssget "_X" '((0 . "INSERT")))
       n   -1
       out   (ssadd)
   )
   (while (setq e (ssname ss (setq n (1+ n))))
   (if (= (rjp-getblockname (vlax-ename->vla-object e)) name)
   (ssadd e out)
   )
   )
)
(sssetfirst nil out)
(princ)
)

gilsoto13 发表于 2022-7-6 12:39:03

 
嗯。。不是真的。。。实际上,它可以选择图形中的所有块。。。我想我需要更具体一点。。。
 
我使用的例程允许我选择一个块。。。然后将当前图形中选定块的所有实例放入autocad选择内存中。。。然后,我可以使用任何其他例程应用于所有对象,方法是在选择对象时使用“上一个”选项选择它们。。。
 
这很有用。。但不适用于动态块。。
 
你发布的这个。。。选择所有块(normal和dinamic),现在我认为它很有用。。但我想要的是一个类似的lisp,只获得一个选定块的所有实例,正常或动态。最好使用“previous”选项而不是夹点,因为我使用的一些lisp例程不接受夹点,只是在一些提示后进行常规选择。

gile 发表于 2022-7-6 12:43:14

你好
 
下面是一个根据动态特性值选择动态块的例程。
 
;;; SSD R2.3 (gile) 14/07/2008
;;; Select dynamic blocks according to dynamic properties values
;;; Using:
;;; To make a selection, enter ssd at command prompt or,
;;; within a modification command, type (ssd) at "Select objects: " prompt
;;; Select a source dynamic block
;;; Choose properties values to filter in the dialog box (an empty tile means "all vaue")
(defun ssd (/ DynBlkPropValue ss blk name pop ret fuzz sel res)
(vl-load-com)
;; DynBlkPropValue
;; Dialog box to choose dynamic properties values
;;
;; Argument : the dynamic properties list (vla-object list)
(defun DynBlkPropValue (lst / tmp file pn av dcl_id val)
   (setq tmp(vl-filename-mktemp "Tmp.dcl")
file (open tmp "w")
   )
   (write-line
   (strcat
"DynBlkProps:dialog{label=\"Dynamic block filter\";"
":text{label=\"Block name: \""
(vl-prin1-to-string name)
";}spacer;:boxed_column{label=\"Dynamic properties\";"
   )
   file
   )
   (foreach p lst
   (setq pn (vla-get-PropertyName p))
   (cond
((setq av (vlax-get p 'AllowedValues))
(setq pop
        (cons (cons pn (cons "" (mapcar 'vl-princ-to-string av)))
              pop
        )
)
(write-line
   (strcat
   ":popup_list{label="
   (vl-prin1-to-string pn)
   ";key="
   (vl-prin1-to-string pn)
   ";edit_width=25;allow_accept=true;}"
   )
   file
)
)
((/= pn "Origin")
(setq fuzz (cons pn fuzz))
(write-line
   (strcat
   ":row{:edit_box{label="
   (vl-prin1-to-string pn)
   ";key="
   (vl-prin1-to-string pn)
   ";edit_width=12;allow_accept=true;}"
   ":edit_box{label=\"Fuzz\";key="
   (vl-prin1-to-string (strcat pn "_fuzz"))
   ";value=\"0.0\";edit_width=6;allow_accept=true;}}"
   )
   file
)
)
   )
   )
   (write-line
   (strcat
"}spacer;:radio_row{key=\"selset\";"
":radio_button{label=\"All drawing\";key=\"all\";value=\"1\";}"
":radio_button{label=\"Selection\";key=\"sel\";}}"
"spacer;ok_cancel;}"
   )
   file
   )
   (close file)
   (setq dcl_id (load_dialog tmp))
   (if        (not (new_dialog "DynBlkProps" dcl_id))
   (exit)
   )
   (foreach p pop
   (start_list (car p))
   (mapcar 'add_list (cdr p))
   (end_list)
   )
   (action_tile
   "accept"
   "(foreach p (mapcar 'vla-get-PropertyName lst)
   (if (assoc p pop)
   (setq val (nth (atoi (get_tile p)) (cdr (assoc p pop))))
   (setq val (get_tile p)))
   (if (and val (/= val \"\"))
   (setq ret (cons (cons p val) ret))))
   (setq fuzz (mapcar (function (lambda (x)
   (cons x (get_tile (strcat x \"_fuzz\"))))) fuzz))
   (and (not ret) (setq ret T))
   (setq sel (get_tile \"selset\"))
   (done_dialog)"
   )
   (action_tile "cancel" "(setq ret nil)")
   (start_dialog)
   (unload_dialog dcl_id)
   (vl-file-delete tmp)
   ret
)
;;----------------------------------------------------;;
(and
   (or
   (and
(setq ss (cadr (ssgetfirst)))
(= 1 (sslength ss))
(setq blk (vlax-ename->vla-object (ssname ss 0)))
(sssetfirst nil nil)
   )
   (and
(sssetfirst nil nil)
(setq blk (car (entsel)))
(setq blk (vlax-ename->vla-object blk))
   )
   )
   (= (vla-get-ObjectName blk) "AcDbBlockReference")
   (= (vla-get-IsDynamicBlock blk) :vlax-true)
   (setq name (vla-get-EffectiveName blk))
   (DynBlkPropValue
   (vlax-invoke blk 'getDynamicBlockProperties)
   )
   (if        (= sel "all")
   (ssget "_X"
   (list '(0 . "INSERT") (cons 2 (strcat name ",`*U*")))
   )
   (ssget (list '(0 . "INSERT") (cons 2 (strcat name ",`*U*")))
   )
   )
   (setq res (ssadd))
   (vlax-for b        (setq ss (vla-get-ActiveSelectionSet
                   (vla-get-activeDocument
                     (vlax-get-acad-object)
                   )
               )
        )
   (if
(and
(= (vla-get-EffectiveName b) name)
(or
    (= ret T)
    ((lambda (lst)
       (apply
       '=
       (cons
           T
           (mapcar
             (function
             (lambda (p / n v l u f)
               (setq n (car p)
                     l (assoc n lst)
                     u (vla-get-UnitsType (caddr l))
               )
               (equal        (cond
                          ((= 0 u) (cdr p))
                          ((= 1 u) (angtof (cdr p)))
                          (T (distof (cdr p)))
                        )
                        (cadr l)
                        (if (and (setq f (cdr (assoc n fuzz)))
                               (numberp (read f))
                          )
                          (atof f)
                          0.0
                        )
               )
             )
             )
             ret
           )
       )
       )
   )
      (mapcar
        (function
          (lambda (p / n v)
          (list
              (setq n (vla-get-PropertyName p))
              (vlax-get p 'Value)
              p
          )
          )
        )
        (vlax-invoke b 'getDynamicBlockProperties)
      )
    )
)
)
(ssadd (vlax-vla-object->ename b) res)
   )
   )
   (vla-delete ss)
)
res
)
;;; Calling function
(defun c:ssd ()
(sssetfirst nil (ssd))
(princ)
)

ronjonp 发表于 2022-7-6 12:53:04

这很奇怪。。。。我更新了上面的代码。现在试试看。

gilsoto13 发表于 2022-7-6 12:55:49

 
很好。。。我们要赢了。我想我可以留下来。
 
再一次关于我一直在制作的积木系列。。我一直在忙着为我的新房子浇混凝土。。。但是现在我有了所有的lisp工具来快速完成它。。。我希望再过两周就全部完成。。。

gilsoto13 发表于 2022-7-6 13:03:49

好啊
 
它正在工作。。。事实上,这就是我想要的。。Gilles的很好。。即使它有一些很好的选择。。。但我有点习惯于每天只为特定目的多次选择块类型,只需选择它。。。你的更快,所以我想我会用你的。。。
 
谢谢Ron。。。
 
这比我想象的要难。。。
 
 

Tommy78 发表于 2022-7-6 13:07:29

哇,很棒的剧本,真是节省时间!
它们应该在qs或filter imo中包含类似的内容。

JeepMaster 发表于 2022-7-6 13:15:12

谢谢Gile的ssd。lsp我已经找了一段时间了。现在我不必孤立我的区块来计算它们。

gilsoto13 发表于 2022-7-6 13:20:01

 
嘿,罗恩。。。
 
我不明白。。。昨天很好。。。但现在我得到了这个错误。。。
 

; error: no function definition: VLAX-ENAME->VLA-OBJECT

 
你知道会发生什么吗?
页: [1] 2
查看完整版本: 选择集团的所有实例