Atributo de blocos

Em vários forums eu vi gente perguntando como que faz para acessar os atributos de um bloco... bem, um exemplo:
(defun get-entname-of-tag  (ent tag / tmp)
  (
setq tmp
      (vl-catch-all-apply
        '(lambda nil
           (setq ent (vlax-ename->vla-object
                       (ename-of ent))
                 tmp (cadr
    (assoc (strcase tag)
           (
mapcar
             '(lambda (x)
                (
list
                  (strcase (vla-get-tagstring x))
                  (
vlax-vla-object->ename x)))
             (
3d-of-vla (vla-getattributes ent))
                                )))))))
  (
if (not (vl-catch-all-error-p tmp))
    tmp))



com este exemplo, pode-se acessar a ename do atributo de um bloco, fornecendo à rotina a string do nome do atributo... com isso ja estaremos aptos a aplicar entmods nele!!!

12 comentários:

  1. Olá Neyton,

    Sou admirador dos teus conhecimentos. REalmente tais publicaçõestem ajudado a muitos e principalmente para iniciantes em autolisp.

    Parabéns!

    Bom, nesta rotina é passado o ent e o tag, podes confirmar o que é exatamente cada um deles? o nome do bloco e identificador???

    Obrigado

    ResponderExcluir
  2. Ent é o ENAME da entidade, aquilo que a função abaixo retorna:

    ( car ( entsel "\nSelecione um bloco: " ) )

    que é algo assim: < Entity name #123456 >

    e tag é uma string, que identifica o atributo

    o retorno é outra ENAME, so que do atributo, do qual você pode extrair a ELIST, que contem todos os DXF, ou algo assim:

    ( (0 . "ATTRIB") (8 . "0") ... )

    ResponderExcluir
  3. Estou tendo dificuldades tb.
    Preciso apenas extrair este valor para inserir em alguns calculos

    como faria apenas a linha para extrair o valo?

    estou tentando algo do tipo
    (setq CT (entsel "\nSelecione a cota:"))
    mas ele me retorna a entity name. Como posso estrair o valor do atributo?

    ResponderExcluir
  4. com a entityname do bloco, voce obtem a entityname do atributo do qual voce quer obter o valor, usando a lisp deste post

    de posse deste entityname, voce pode obter o seu valor:

    ;selecione o bloco
    ( setq bloco ( car ( entsel "\nselecione o bloco" )))

    ;pergunte o atributo
    (setq attname ( getstring "\nqual o nome do atributo ?" ) )

    ;pega o ename do atributo
    (setq att_entity ( get-entname-of-tag bloco attname ) )

    ;pega o valor do mesmo
    ( setq valor ( cdr (assoc 1 (entget att_entity ) ) )

    ResponderExcluir
  5. Bom dia Neyton.
    fiz conforme vc orientou.
    mas qdo carrego o lisp q criei, dá o seguinte erro "; error: malformed list on input" por causa dessa linha
    ;pega o valor do mesmo
    ( setq valor ( cdr (assoc 1 (entget att_entity ) ) )
    oq pode estar acontecendo de errado?
    grato

    ResponderExcluir
  6. poe mais um parenteses fechando :
    ( setq valor ( cdr (assoc 1 (entget att_entity ) ) ) )

    ResponderExcluir
  7. bom dia Neyton.
    consegui extrair o valor do bloco
    mas qdo uso ele na seguinte rotina
    volta com erro "; error: bad argument type: numberp:" e o valor doa atributo
    a rotina é esta
    ;Entrada de Informações
    (setq CT (vl-string-subst "." (chr 44) (strcat VALOR)))
    (setq PR (getreal "\nEntre com a profundidade: "))

    ;Solução
    (setq SOL (- CT PR))

    ResponderExcluir
  8. o valor do atributo é uma string

    se vc quer usar o valor numerico, tem que converter com a função ATOF

    ResponderExcluir
  9. Olá Neyton.
    Muito obrigado pela ajuda. Consegui fazer o lisp.
    Parabens pelo blog.
    abras

    ResponderExcluir
  10. boa tarde, espero q possa me ajudar...

    estou tentando montar uma rotina lisp igual do eattext, só que ela é para o intelicad, pois, não existe esse comando no intelicad.

    pode me ajudar?

    ResponderExcluir
  11. Larissa Borges4/6/12 16:38

    Boa tarde, Neyton
    Do nada todos meus arquivos do Cad, estão demorando para abrir, e no fim quando abrem aparece uma mensagem de erro: "malformed list on input". Até se eu apro o cad sem abrir um arquivo pre existente da o mesmo erro. O que é isso? como corrigir?
    Espero que vc posso me ajudar.
    Desde já Agradeço

    ResponderExcluir
  12. Boa tarde

    Tenho uma rotina aonde é inserido um bloco que tem um atributo, esse atributo é uma variável que informo antes de inserir o bloco, gostaria que quando inserisse o bloco a rotina já usasse essa variável com o atributo, mas não estou conseguindo resolver esse problema, alguém poderia me dar uma dica de como resolver isso.
    Segue abaixo parte da minha rotina que está com problemas.

    (setq AlPLTC_tx (strcat "h=" (rtos AlPLTC 2 1) "m")); variável que recebe o valor da altura da placa

    (command "_-insert" "C:\\Arquivos_Autolisp\\Biblioteca\\Placa Trânsito_Ø40-teste" PtInBlPlT "1" "1" 0)

    PtInBlPlT é o ponto de inserção do bloco

    ResponderExcluir