_

[LISP] uruchomienie z ostatnią wart. zmiennej

Forum poświęcone flagowemu produktowi oraz aplikacjom pochodnym Autodesku. To jedyne forum mające w tytule nazwę programu, a to ze względu na jego olbrzymią popularność w Polsce. Można tutaj umieszczać również posty z ogólnie pojętej tematyki "Kreślarskie 2D".

[LISP] uruchomienie z ostatnią wart. zmiennej

Postprzez wilda » lis 20, 2021 13:57

Nie mam za bardzo pojęcia jak można rozwiązać poniższy problem:
Napisałem takiego lispa, który wstawia bloki o różnych nazwach na zdefiniowane warstwy.
Lisp podpięty jest do przycisków w których zdefiniowane są różne nazwy bloku.

Kod: Zaznacz cały
^C^C^P(if C:wstaw_blok (princ) (load "wstaw_blok.lsp"));wstaw_blok nazwabloku1


Jak to zrobić, żeby po ponownym uruchomieniu, nie z przycisku program uruchamiał się z ostatnio zdefiniowaną nazwą bloku, a nie prosił o podanie nazwy bloku.

Lisp uruchamiany jest jak poniżej. Już próbowałem z if nazwabloku = nil, null, not iiii nie działa.
Kod: Zaznacz cały
(defun c:wstaw_blok ()
(setq nazwabloku (getstring "podaj nazwę bloku"))   ;pobiera nazwę bloku zdefiniowaną w przycisku
....
Załączniki
wstawblok.gif
wilda
 
Posty: 270
Dołączył(a): gru 18, 2007 21:41

Re: [LISP] uruchomienie z ostatnią wart. zmiennej

Postprzez kojacek » lis 20, 2021 16:19

wilda napisał(a):Nie mam za bardzo pojęcia jak można rozwiązać poniższy problem:
Napisałem takiego lispa, który wstawia bloki o różnych nazwach na zdefiniowane warstwy.
Lisp podpięty jest do przycisków w których zdefiniowane są różne nazwy bloku.

Kod: Zaznacz cały
^C^C^P(if C:wstaw_blok (princ) (load "wstaw_blok.lsp"));wstaw_blok nazwabloku1


Jak to zrobić, żeby po ponownym uruchomieniu, nie z przycisku program uruchamiał się z ostatnio zdefiniowaną nazwą bloku, a nie prosił o podanie nazwy bloku.

Lisp uruchamiany jest jak poniżej. Już próbowałem z if nazwabloku = nil, null, not iiii nie działa.
Kod: Zaznacz cały
(defun c:wstaw_blok ()
(setq nazwabloku (getstring "podaj nazwę bloku"))   ;pobiera nazwę bloku zdefiniowaną w przycisku
....



Użyj zmiennej globalnej. Widzę że w kodzie nie używasz zniennych lokalnych (zatem wszystkie masz globalne). Czyli możesz
zrobić tak:
Kod: Zaznacz cały
(if
  (not nazwabloku)
  (setq nazwabloku (getstring "podaj nazwę bloku"))
  nazwabloku
)

Ogólnie rzecz ujmując, unikanie tworzenia zmiennych lokalnych jest błędem. Podobnie niefortunne może być pobranie nazwy bloku z getstring (bez sprawdzenia poprawności, istnienia bloku etc.)
O zmiennych poczytaj tutaj: https://kojacek.wordpress.com/2015/12/20/symbole-zmienne/
Avatar użytkownika
kojacek
 
Posty: 5571
Dołączył(a): paź 03, 2005 20:17

Re: [LISP] uruchomienie z ostatnią wart. zmiennej

Postprzez wilda » lis 22, 2021 14:26

Działa wyśmienicie, ale nie do końca tak jak bym oczekiwał.
Program w momencie uruchomienia pobiera nazwę bloku zapisaną w przycisku. W każdym przycisku zapisana jest inna nazwa bloku do wstawienia.
Kod: Zaznacz cały
^C^C^P(if C:wstaw_blok (princ) (load "wstaw_blok.lsp"));wstaw_blok nazwabloku1

Przy podanym warunku if ... not ... przy pierwszym uruchomieniu z przycisku program pobiera wartość zmiennej "nazwabloku" i przy każdym następnym uruchomieniu bez względu na to przy pomocy jakiego przycisku zostanie uruchomiony zawsze warunek jest spełniony - wstawiany jest blok wczytany przy pierwszym uruchomieniu.

Myślałem że się tak da, że jeżeli uruchamiam program z przycisków to program pobiera wartość zmiennej "nazwabloku" zapisany w poleceniu przypisanym do każdego przycisku, a dopiero gdy przy ponownym uruchomieniu polecenia, bez korzystania z przycisku a więc bez pobrania nazwy warstwy program przyjmowałby ostatnio pobraną wartość zmiennej "nazwabloku"
coś w tym stylu:
Kod: Zaznacz cały
(if
  (not (setq nazwabloku (getstring "podaj nazwę bloku")))
  (setq nazwabloku nazwabloku0)
)
...
(setq nazwabloku0 nazwabloku)

...ale program wyświetla okno do wprowadzenia nazwy bloku i jak się nie poda to kończy działanie.
wilda
 
Posty: 270
Dołączył(a): gru 18, 2007 21:41


Powrót do AutoCAD

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników