Is it possible to determine (using LISP) which dynamic block property object is the Visibility Parameter for the block?
Previously, I have used:
(car
(vl-member-if
(function
(lambda ( a )
(and
(setq a (vlax-get a 'allowedvalues))
(listp a)
(vl-every '(lambda ( b ) (eq 'STR (type b))) a)
)
)
)
(vlax-invoke <VLA-object> 'getdynamicblockproperties)
)
)
As used in this example to count dynamic blocks by Visibility state:
(defun c:dbcount ( / _Assoc++ _PadBetween lst prp ss ) ;; © Lee Mac 2011
(defun _Assoc++ ( key alist )
(
(lambda ( pair )
(if pair
(subst (cons key (1+ (cdr pair))) pair alist)
(cons (cons key 1) alist)
)
)
(assoc key alist)
)
)
(defun _PadBetween ( s1 s2 ch ln )
(
(lambda ( a b c )
(repeat (- ln (length b) (length c)) (setq c (cons a c)))
(vl-list->string (append b c))
)
(ascii ch)
(vl-string->list s1)
(vl-string->list s2)
)
)
(if (ssget "_X" (list '(0 . "INSERT") (cons 410 (getvar 'CTAB))))
(progn
(vlax-for obj
(setq ss
(vla-get-activeselectionset
(vla-get-activedocument (vlax-get-acad-object))
)
)
(if
(and (eq :vlax-true (vla-get-isdynamicblock obj))
(setq prp
(car
(vl-member-if
(function
(lambda ( a )
(and (setq a (vlax-get a 'allowedvalues)) (listp a)
(vl-every '(lambda ( b ) (eq 'STR (type b))) a)
)
)
)
(vlax-invoke obj 'getdynamicblockproperties)
)
)
)
)
(setq lst (_Assoc++ (vlax-get prp 'value) lst))
)
)
(vla-delete ss)
(princ (_PadBetween "\nVisibility State" "Count" "." 41))
(princ (_PadBetween "\n" "" "=" 41))
(foreach x (vl-sort lst '(lambda ( a b ) (< (car a) (car b))))
(princ (_PadBetween (strcat "\n" (car x)) (itoa (cdr x)) "." 41))
)
(textpage)
)
)
(princ)
)
(vl-load-com) (princ)
However, this approach fails when the dynamic block has a Lookup parameter, so I wonder if someone knows a better way?
Any advice is appreciated.
Lee