Pegar o mesmo valor do teclado quando acessar novamente

Dúvidas sobre AutoLISP...

Moderador: Moderadores

Responder
Avatar do usuário
gustavolisp
Bronze 2/3
Bronze 2/3
Mensagens: 226
Registrado em: Qui 02 Nov 2006 12:00:00 am

Pegar o mesmo valor do teclado quando acessar novamente

Mensagem por gustavolisp »

Boa noite a todos...

Tenho essa lisp para abrir vãos de portas e janelas em paredes sólidas. Estou querendo dar uma incrementada nela, basicamente em três pontos:

[lsp]
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun c:vao()
(DEFUN *ERROR* (MSG)
(if autosnapmode(setvar "autosnap" autosnapmode))
(PROMPT (STRCAT "\nERRO : " MSG))
(PRINC)
)
(setq hpeitoril(getdist"\nAltura do peitoril:<90>"))
(if (= hpeitoril nil)(setq hpeitoril 90))
(setq alt(getdist "\nAltura da janela:<130>"))
(if (= alt nil)(setq alt 130))
(setq parede (ssget))
(while
(setq autonaspmode (getvar "autosnap"))
(setvar "autosnap" 39)
(setq p1(getpoint "\nSelecione o primeiro canto em planta:"))
(initget 32)
(setq p2(getpoint p1 "\nSelecione o segundo canto em planta:"))
(command "box" p1 p2 alt)
(setq vão(entlast))
(command "move" vão "" (list 0 0 0) (list 0 0 hpeitoril))
(command "subtract" parede "" vão "")
)
(setvar "autosnap" autosnapmode)
(princ)
)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;outros atalhos
(defun c:vão()
(c:vao)
)
[/lsp]

- O primeiro seria o seguinte, quando eu acesso ela a primeira vez, dou a opção de 90 e 130 entre parênteses, pois são os valores que mais uso. Eu gostaria de saber se tem como na próxima vez que eu acessar, estejam setados os valores que eu digitei. Por exemplo, na primeira vez que eu uso, eu defino os valores para 180 e 60, quero que ao acessar novamente ela me sete na seqüencia <180> e <60>.
- O segundo seria colocar uma atalho no primeiro getpoint para [Poliline], ou seja se eu clicar ele considere o clique como meu p1 e continue a rotina para pegar o p2 e desenhar a box, mas se eu teclar o P <enter>, ele mude a rotina para mim desenhar uma pline.
- O terceiro seria no mesmo local do segundo, que seria para trocar os valores de altura no meio da rotina, creio que se resolva de mesma forma do segundo...

portanto a linha:


[lsp]
(setq p1(getpoint "\nSelecione o primeiro canto em planta:"))
[/lsp]

deve ficar:

[lsp]
(setq p1(getpoint "\nSelecione o primeiro canto em planta:[Poliline, Trocar alturas]"))
[/lsp]

valeu...
Avatar do usuário
ederson
Prata 1/3
Prata 1/3
Mensagens: 414
Registrado em: Qua 21 Jul 2004 12:00:00 am
Localização: Belo Horizonte

Mensagem por ederson »

[lsp](setq lst_alturasdospeitoris (list 130 90))[/lsp]
[lsp](vlax-ldata-put "alturadospeitoris" "valores" lst_alturasdospeitoris)[/lsp]
e por último:
[lsp](if (vlax-ldata-get "alturadospeitoris" "valores") (alert "existe uma lista de alturas") (alert "não existe uma lista de alturas"))[/lsp]

Já as outras dúvidas, talvez isso clareie...
[lsp](vl-cmdf "_.saveas")
(while (wcmatch (getvar "cmdnames") "*SAVE*") (vl-cmdf pause))[/lsp]
Ederson Ambrosio
031 8893-2947
BH-MG
Avatar do usuário
ederson
Prata 1/3
Prata 1/3
Mensagens: 414
Registrado em: Qua 21 Jul 2004 12:00:00 am
Localização: Belo Horizonte

Mensagem por ederson »

Troque o [lsp]"_.save"[/lsp] por [lsp]"PLINE"[/lsp]
Ederson Ambrosio
031 8893-2947
BH-MG
Avatar do usuário
evairpu
Bronze 1/3
Bronze 1/3
Mensagens: 152
Registrado em: Seg 04 Ago 2008 12:00:00 am
Localização: Jarinú/SP

Mensagem por evairpu »

Segue exemplo:

[lsp]
(defun c:VAO ()
(VAO_DIC)
(setq DYNMODE (getvar "dynmode"))
(setvar "dynmode" 3)
(initget 1 "Sim Não")
(setq ALTERA
(getkword
"\n Alterar medidas para criação do vão? [Sim/Não] "
) ;_ fin de getkword
) ;_ fin de setq
(Cond ((= ALTERA "Sim") (ALTERA_VAO))
((= ALTERA "Não") (princ))
)
(DESENHA)
(setvar "dynmode" DYNMODE)
) ;_ fin de defun


(defun VAO_DIC ()
(vl-load-com)
(if (not (dictsearch (namedobjdict) "VAO_DIC"))
(progn (vlax-ldata-put "VAO_DIC" "H_PEITORIL" 90)
(vlax-ldata-put "VAO_DIC" "H_JANELA" 130)
(vlax-ldata-put "VAO_DIC" "S_PAREDE" 15)
) ;_ fin de progn
) ;_ fin de if
) ;_ fin de defun


(defun ALTERA_VAO ()
(vlax-ldata-put "VAO_DIC" "H_PEITORIL" (getint "\nQual a altura do peitoril?"))
(vlax-ldata-put "VAO_DIC" "H_JANELA" (getint "\nQual a altura da janela?"))
(vlax-ldata-put "VAO_DIC" "S_PAREDE" (getint "\nQual a espessura da parde?"))
)


(defun DESENHA ()
; AQUI VOCÊ DESENVOLVE O CÓDIGO EFETIVO PARA ABERTURA DOS VÃOS
(princ)
)
[/lsp]


A principal diferença é que ao invés de você acessar os valores com as variáveis, você vai acessar com uma verificação de seu dicionário interno a este projeto... Por exemplo, ao invés de usar...

[lsp]
(setq EXEMPLO_01 150)
(setq EXEMPLO_02 100)
(print (- EXEMPLO_01 EXEMPLO_02))
[/lsp]

...você deverá usar:

[lsp]
(VLAX-LDATA-PUT "TESTE" "EXEMPLO_01" 150)
(VLAX-LDATA-PUT "TESTE" "EXEMPLO_02" 100)
(PRINT (- (VLAX-LDATA-GET "TESTE" "EXEMPLO_01") (VLAX-LDATA-GET "TESTE" "EXEMPLO_02")))
[/lsp]

Onde, TESTE é o nome do dicionário interno para o arquivo, e EXEMPLO_02 e EXEMPLO_02 fazem a vez das variáveis...


Com isso acredito que você resolva seus 1º e 3º problemas... Agora quanto a esta segunda parte da polyline eu vou ficar te devendo...


Sou novato na "coisa" de AutoLISP, mas pelo o que tenho estudado é +/- por aí. Pessoas com mais experiência me corrijam por favor se eu tiver dito alguma abobrinha.

Espero de alguma forma ter lhe ajudado.
Até mais....
Avatar do usuário
gustavolisp
Bronze 2/3
Bronze 2/3
Mensagens: 226
Registrado em: Qui 02 Nov 2006 12:00:00 am

Mensagem por gustavolisp »

obrigado pela atenção...

bom, acabei resolvendo o primeiro problema com uma gambiarras feiosas hehe,
[lsp]
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun c:vao()
(DEFUN *ERROR* (MSG)
(if autosnapmode(setvar "autosnap" autosnapmode))
(PROMPT (STRCAT "\nERRO : " MSG))
(PRINC)
)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;peitoril
(if (= hpeitoril_temp nil)(setq hpeitoril_temp 90))
(setq palavra (rtos hpeitoril_temp))
(setq pergunta (strcat "Altura do peitoril em osso:<" palavra ">"))
(setq hpeitoril(getdist pergunta))
(if (= hpeitoril nil)(setq hpeitoril hpeitoril_temp))
(setq hpeitoril_temp hpeitoril)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;vão
(if (= alt_temp nil)(setq alt_temp 120))
(setq palavra2 (rtos alt_temp))
(setq pergunta2 (strcat "Altura do vão:<" palavra2 ">"))
(setq alt(getdist pergunta2))
(if (= alt nil)(setq alt alt_temp))
(setq alt_temp alt)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;parede
(setq parede (entsel "\nSelecione a parede:"))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;desenha o vão repetivamente
(while
(setq autonaspmode (getvar "autosnap"))
(setvar "autosnap" 39)
(setq p1(getpoint "\nSelecione o primeiro canto em planta:"))
(initget 32)
(setq p2(getpoint p1 "\nSelecione o segundo canto em planta:"))
(command "box" p1 p2 alt)
(setq vão(entlast))
(command "move" vão "" (list 0 0 0) (list 0 0 hpeitoril))
(command "subtract" parede "" vão "")
)
(setvar "autosnap" autosnapmode)
(princ)
)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;outros atalhos
(defun c:vão()
(c:vao)
)
[/lsp]

depois vou estudar melhor essas dicas de salvar lista, acho que será bem útil em outras lisps também

quanto as outras dúvidas, meu maior problema é sair do comando para executar as outras ações. Quero que fique mais ou menos como o comando circle. No meu caso, se eu clicar na tela ele segue na rotina de pegar outro ponto e desenhar retangulo, se eu entrar com o P ele vá para a rotina de poliline ou o T , volte ao início da rotina, onde se especifícam as alturas. Mas sem me perguntar nada, ou seja se eu não entrar com nenhum dado ele continue na sequencia de pegar dois pontos e fazer a caixa.

desculpem, ainda sou meio limitado no desenvolvimento de autolisps hehe

abraço...
Avatar do usuário
evairpu
Bronze 1/3
Bronze 1/3
Mensagens: 152
Registrado em: Seg 04 Ago 2008 12:00:00 am
Localização: Jarinú/SP

Mensagem por evairpu »

A principal diferença entre se trabalhar com variáveis e de se trabalhar com um dicionário interno, é na depois de fechar e abrir novamente o projeto.
Com as variáveis, você manterá na memória os dados inseridos apenas enquanto este projeto está aberto, sendo que quando você abre novamente o projeto, seus últimos valores terão sido perdidos.
Já, trabalhando com o dicionário interno, você mesmo fechando o projeto, ao reabrí-lo ele ainda terá mantido todos os últimos valores inseridos...

Dependendo do caso, vale a pena dedicar alguns minutos e adaptar o código para se trabalhar com um dicionário....



Até mais...
Avatar do usuário
gustavolisp
Bronze 2/3
Bronze 2/3
Mensagens: 226
Registrado em: Qui 02 Nov 2006 12:00:00 am

Mensagem por gustavolisp »

hummm, isso me parece bem interessante, vou tentar utilizar em outras lisps....
valeu...
e onde ficam armazenados esses dados, no próprio dwg?
Avatar do usuário
evairpu
Bronze 1/3
Bronze 1/3
Mensagens: 152
Registrado em: Seg 04 Ago 2008 12:00:00 am
Localização: Jarinú/SP

Mensagem por evairpu »

Exatamente... Isso fica armazenado no próprio arquivo DWG...
Se você for abrir o projeto em um outro computador, mesmo assim ele ainda terá memorizado estes valores... Mas para acessá-los é preciso da rotina...

Mesmo que você use uma rotina para cada um dos teus projetos, serão criados dicionários independentes para cada um deles, nos quais você pode usar diferentes valores e mantê-los como default para uma próxima vez que você for usar estes projetos.

O exemplo que eu mandei acima faz exatamente isso que você deseja... Caso você não entenda a lógica usada, fala ae que eu tento colocar uns comentários no código para te ajudar a entender...


Até mais...
Avatar do usuário
gustavolisp
Bronze 2/3
Bronze 2/3
Mensagens: 226
Registrado em: Qui 02 Nov 2006 12:00:00 am

Mensagem por gustavolisp »

vou tentar nesta mesmo, depois coloco os resultados...

valeu...
Responder