Outro dia um camarada me perguntou como alterar o valor de um atributo dinâmico em um bloco.
Bom escrevi um pequeno programa para exemplificar, segue:
;subrotina que retorna a lista de atributos dinamicos de um bloco
;vlabloc é o ponteiro VLA para o bloco
(defun get-dynamic-attributes (vlabloc)
;(vl-load-com)
(mapcar '(lambda (p) (cons (vla-get-PropertyName p) p))
(vlax-safearray->list
(vlax-variant-value
(vla-GetDynamicBlockProperties vlabloc)))))
;exemplo de uso:
;|
carrega as funções vl
(vl-load-com)
;selecione um bloco dinamico na tela
(setq bloco (vlax-ename->vla-object (car (entsel "\nSelecione o bloco"))))
;pega a lista de atributos:
(setq atts (get-dynamic-attributes bloco))
;da lista, pegue o atributo COMPRIMENTO:
(setq attComprimento (cdr (assoc "COMPRIMENTO" atts)))
;alerta sobre o valor atual
(alert (strcat "O valor atual é: " (rtos (vlax-variant-value (vla-get-value attComprimento)) 2 3)))
;redefine o valor para outro valor qualquer
(vla-put-value attComprimento 2.0)
;alerta para o novo valor:
(alert (strcat "O valor atual é: " (rtos (vlax-variant-value (vla-get-value attComprimento)) 2 3)))
|;
É simples, né? O exemplo te ensina a listar os atributos, que você poderá pegar e alterar.
;subrotina que retorna a lista de atributos dinamicos de um bloco
;vlabloc é o ponteiro VLA para o bloco
(defun get-dynamic-attributes (vlabloc)
;(vl-load-com)
(mapcar '(lambda (p) (cons (vla-get-PropertyName p) p))
(vlax-safearray->list
(vlax-variant-value
(vla-GetDynamicBlockProperties vlabloc)))))
;exemplo de uso:
;|
carrega as funções vl
(vl-load-com)
;selecione um bloco dinamico na tela
(setq bloco (vlax-ename->vla-object (car (entsel "\nSelecione o bloco"))))
;pega a lista de atributos:
(setq atts (get-dynamic-attributes bloco))
;da lista, pegue o atributo COMPRIMENTO:
(setq attComprimento (cdr (assoc "COMPRIMENTO" atts)))
;alerta sobre o valor atual
(alert (strcat "O valor atual é: " (rtos (vlax-variant-value (vla-get-value attComprimento)) 2 3)))
;redefine o valor para outro valor qualquer
(vla-put-value attComprimento 2.0)
;alerta para o novo valor:
(alert (strcat "O valor atual é: " (rtos (vlax-variant-value (vla-get-value attComprimento)) 2 3)))
|;
É simples, né? O exemplo te ensina a listar os atributos, que você poderá pegar e alterar.
Estou desenvolvendo um código em VBA. Estou tentando receber uma informação de um bloco dinâmico através do comando "GetDynamicBlockProperties" desta maneira
ResponderExcluirvisibility1 = block.GetDynamicBlockProperties.Item("Visibility1").Value
distance1 = block.GetDynamicBlockProperties.Item("Distance1").Value
Só que está retornando em branco. Não retorna erro mas a Mleader é gerada em branco. Obs: O bloco é dinâmico possui esses parâmetros que estão ticados aí "Visibility1" e "Distance1", os blocos possuem valores válidos.
é uma mleader, ou um bloco?
Excluira mleader não tem propriedades dinamicas
se vc fez um bloco que imita a mleader, então deve ter acesso as propriedades dinamicas que criou.
Se está fazendo no VBA usando o editor VBA do cad, pode postar o restante do código, ou um trecho que mostre a obtenção desse visibility.
observe este código:
;escolhe o bloco
(setq bloco (vlax-ename->vla-object (car (entsel "\nSelecione o bloco"))))
;obtem todas as propriedades dinamicas
(setq props (vlax-safearray->list (vlax-variant-value (vla-GetDynamicBlockProperties bloco))))
;procura a propriedade "Visibility1"
(setq visibility nil)
(foreach prop props
(if (= "Visibility1" (vla-get-PropertyName prop))
(setq visibility prop)
))
(if visibility
(alert (strcat "O valor é: " (vlax-variant-value (vla-get-Value visibility ))))
(alert "nao achei")
)
Esta em lisp, mas é bem compreensível quals funções usar no seu código vba:
bloco.GetDynamicBlockProperties
um looping para procurar a propriedade certa pelo seu nome:
prop.PropertyName
e depois obter o valor:
prop.Value