选择集团的所有实例
大家好。。。问题是。。。我经常使用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是否与动态块和正常块一起工作? 这应该满足您的需求:
(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)
)
嗯。。不是真的。。。实际上,它可以选择图形中的所有块。。。我想我需要更具体一点。。。
我使用的例程允许我选择一个块。。。然后将当前图形中选定块的所有实例放入autocad选择内存中。。。然后,我可以使用任何其他例程应用于所有对象,方法是在选择对象时使用“上一个”选项选择它们。。。
这很有用。。但不适用于动态块。。
你发布的这个。。。选择所有块(normal和dinamic),现在我认为它很有用。。但我想要的是一个类似的lisp,只获得一个选定块的所有实例,正常或动态。最好使用“previous”选项而不是夹点,因为我使用的一些lisp例程不接受夹点,只是在一些提示后进行常规选择。 你好
下面是一个根据动态特性值选择动态块的例程。
;;; 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)
)
这很奇怪。。。。我更新了上面的代码。现在试试看。
很好。。。我们要赢了。我想我可以留下来。
再一次关于我一直在制作的积木系列。。我一直在忙着为我的新房子浇混凝土。。。但是现在我有了所有的lisp工具来快速完成它。。。我希望再过两周就全部完成。。。 好啊
它正在工作。。。事实上,这就是我想要的。。Gilles的很好。。即使它有一些很好的选择。。。但我有点习惯于每天只为特定目的多次选择块类型,只需选择它。。。你的更快,所以我想我会用你的。。。
谢谢Ron。。。
这比我想象的要难。。。
哇,很棒的剧本,真是节省时间!
它们应该在qs或filter imo中包含类似的内容。 谢谢Gile的ssd。lsp我已经找了一段时间了。现在我不必孤立我的区块来计算它们。
嘿,罗恩。。。
我不明白。。。昨天很好。。。但现在我得到了这个错误。。。
; error: no function definition: VLAX-ENAME->VLA-OBJECT
你知道会发生什么吗?
页:
[1]
2