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"
Ola Neyton,
ResponderExcluirNã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
passar ent para qual função?
ResponderExcluirnao precisa esse entget aí...
Olá,
ResponderExcluir(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!
você definiu a sua propria função DXF...
ResponderExcluiraí não vai mesmo
leia o "popup" que "cai" na tela quando você acessa este blog
Olá Neyton,
ResponderExcluirto 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+
bem, não é bem assim a sintaxe
ResponderExcluirno 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
Ótimo Neyton,
ResponderExcluirMas 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
o dxf para o valor é 1
ResponderExcluirveja no help, attrib dxf group codes