Recuperar valor de atributo

Bom, continuando com as rotinas, na rotina Rtc3 que postei tem uma função que recupera o valor dos atributos de um bloco... Outra coisa que vejo muito em forums sobre o assunto.. parece que quanto mais tu responde essa dúvida mais ela aparece... mas vá lá, vejam como eu faço:
(defun get-tag-prop (ent tag / pass str)
  (
setq ent (ename-of ent)
        tag (strcase tag)
        pass t)
  (
while pass
    (setq ent (entnext ent)
          str (dxf 2 ent)
          pass (if str
                  (/= tag (strcase str)))))
  (
if str (dxf 1 ent) nil))

Onde "ent" é a "entity name" do bloco e "tag" é uma string com o nome do atributo que se quer resgatar o valor

já para atribuir o valor a um atributo, tenho esta rotina:
(defun set-dxf-tag (ent dx tag val / tmp)
  (
setq ent (ename-of ent)
    val (if (listp tag) val (list val))
    dx  (if (listp dx) dx (list dx))
    tag (mapcar 'strcase (if (listp tag) tag (list tag))))
  (
repeat (length tag)
    (
setq tmp (get-entname-of-tag ent (car tag)))
    (
if tmp (remake-ent tmp (car dx) (car val)))
    (
setq tag (cdr tag)
      dx  (if (= 1 (length dx)) dx (cdr dx))
      val (if (= 1 (length val)) val (cdr val))))
  (
dxf 5 ent))

alem de alterar o valor do atributo, ela também serve para alterar qualquer outro dxf deste atributo, como o layer por exemplo...
sendo "ent" a referência ao BLOCO, pode ser HANDLE, ENAME, VLA
"dx" é um número inteiro, que representa o dxf... exemplo: 8 significa layer
"tag" é uma string, que o nome do atributo
"val" é qualquer valor aceito pelo dxf que você passar para a variável "dx"
exemplo:
(set-dxf-tag ent_bloco 8 "tag1" "layerx")
fará o layer do atributo de nome "tag1" passar para "layerx"

8 comentários:

  1. Ola Neyton,

    Não estou conseguindo passar o ent por parâmetro, para pegálo estou usando:

    (setq ent ( entget ( car (entsel "\nSelecione alguma coisa" ) ) ))

    ai aparece a mensagem: função dxf incorreta...

    Obrigado desde já!
    meu email: doctorgil@ig.com.br

    ResponderExcluir
  2. Anônimo6/3/08 08:55

    passar ent para qual função?

    nao precisa esse entget aí...

    ResponderExcluir
  3. Olá,

    (defun get-tag-prop (ent tag / pass str)

    Como faço então para passar o "ent"??

    Com ( entget ( car (entsel "\nSelecione alguma coisa" ) ) )

    passa, porém da o erro: função dxf incorreta...

    Valeu pela força!

    ResponderExcluir
  4. Anônimo6/3/08 15:21

    você definiu a sua propria função DXF...

    aí não vai mesmo

    leia o "popup" que "cai" na tela quando você acessa este blog

    ResponderExcluir
  5. Olá Neyton,

    to tentando alterar um atributo de um bloco que contem a scala.. então:

    (set-dxf-tag isoa4t 2 "scale" "1:1")

    onde isoa4t é o nome do bloco... mas acredito que existe um problema onde digito o "2", pois não sei qual é o valor/dxf referente ao atributo de tag "scale"... podes me ajudar?

    Agradeço e parabenizo-te por tal iniciativa que representa este teu blog.
    Através deste muitos podem esclarecer dúvidas e buscar informações muito importantes.

    Além de tudo a qualidade das tuas publicações é ótima.

    Obrigado.
    At+

    ResponderExcluir
  6. Anônimo6/3/08 18:14

    bem, não é bem assim a sintaxe

    no seu caso, isso deve funcionar:

    ( setq ent
    ( car
    ( entsel "\nSelecione o bloco" )
    )
    )

    (
    set-dxf-tag
    ent
    '(40 ;dxf da escala em X
    41 ;dxf da escala em Y
    42 ;dxf da escala em Z
    )
    "DN"
    10 ;valor da escala
    )

    onde "DN" é o nome do atributo
    10 é a escala que estou aplicando, esta escala é absoluta, 1:1 é 1, 1:10 é 0.1

    ent é uma ENAME, obtido pelo setq acima

    ResponderExcluir
  7. Ótimo Neyton,

    Mas na verdade o que eu preciso não é mudar a escala propriamente dita, mas sim mudar um atributo de texto.
    exemplo:

    (set-dxf-tag isoa4t ? "aplication" "civil")

    No lugaro do ?, tenho que colocar por exemplo 8 para alterar o layer, mas minha dúvida é o que usar para alterar um atributo de texto normal, pois só sei o nome do atributo.

    Se caso vc conhecer um outro método sem a interação du usuário, também agradeceria.
    Algo do tipo:

    (command "attedit" "ISOA4T" "aplication" eletric civil)

    Obrigado pela força mais uma vez.

    Abraço

    ResponderExcluir
  8. Anônimo7/3/08 21:26

    o dxf para o valor é 1
    veja no help, attrib dxf group codes

    ResponderExcluir