Usando vla-GetDynamicBlockProperties

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.

2 comentários:

  1. Anônimo4/1/24 10:15

    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
    visibility1 = 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.

    ResponderExcluir
    Respostas
    1. é uma mleader, ou um bloco?
      a 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


      Excluir