Twórcom ZWCADa nie udało się dotychczas opracować środowiska programistycznego dla LISP. O ile jest mi wiadomo, prace takie trwają, niestety przewidywany czas realizacji nie jest mi znany, do czasu wydania takiego środowiska musimy więc radzić sobie ogólnie dostępnymi narzędziami. Dobra wiadomość jest taka, że wystarczy zwykły podstawowy edytor tekstu np. Notatnik. Ja używam programu Notepad++ (do pobrania poniżej) z kilku powodów:

  1. Kolorowanie składni. Dzięki temu łatwo jest czytać kod, wiemy co jest nazwą funkcji, a co jej parametrami. Można też w łatwy sposób sprawdzić które nawiasy są pozamykane (a to bardzo ważne a można się w tym pogubić, po kliknięciu nawiasu podświetla nam się odpowiadający mu nawias otwierający lub zamykający.
  2. Kolorowanie wystąpień wyrazów. Dzięki temu łatwiej jest odnaleźć te same funkcje, zmienne itp
  3. Autouzupełnianie. Domyślnie jest to wyłączone, ale można ustawić podpowiedzi czyli zaczynamy pisać np. nazwę funkcji, a program podpowiada resztę. Mała rzecz a cieszy, zwłaszcza, gdy trzeba napisać np. vlax-ename->vla-object.
  4. Makra. Istnieje możliwość nagrywania makr i przypisywania im skrótów klawiaturowych.
  5. Zwijanie wierszy. Przy większych plikach znalezienie np. określonej funkcji może być uciążliwe, dzięki tej opcji możemy zwinąć wiele wierszy i widoczna będzie tylko pierwsza linia.
  6. Program jest darmowy.

Debugowanie możemy wykonać jedynie w ZWCAD (do pobrania poniżej) przez wykonanie programu i sprawdzanie zachowania.

W pewnym sensie ta część naszego kursu LISP może być najtrudniejsza, jest to rozdział dla początkujących. Chciałbym w nim omówić najbardziej podstawowe wyrażenia. dla osób niemających wcześniej styczności z programowaniem, opanowanie tej części jest konieczne dla zrozumienia sensu kolejnych części. Osoby, które poznały wcześniej jakieś języki programowania również znajdą tu coś dla siebie, czyli syntezę składni wyrażeń używanych w LISPie.

Podstawowe pojęcia LISPa:

  • ; (średnik) - oznacza komentarz, to co jest w linii za znakiem komentarza nie będzie interpretowane przez program. Jeśli chcemy skomentować więcej niż jedną linię, możemy posłużyć się znakami ;| aby rozpocząć komentarz. Znacznik ten musi być zakończony znakami |;
  • nil – oznacza nic, (dla znających C, to jest to to samo co null W lispie null znaczy coś innego, o tym później) . Można by zadać sobie pytanie po co komu nic czyli nil. A nil jest bardzo ważnym wyrażeniem, najważniejszą jego funkcją jest sprawdzenie warunków (o warunkach niżej). Nil jest wartością zmiennych, którym nie są przypisane wartości. Wiele funkcji zwraca nil jeśli nie zostało poprawnie wykonanych, część funkcji zwraca nil zawsze np. command. Jeśli natomiast analizujemy typy danych, to nil jest równoważne wartości false w zmiennej typu logicznego (boolean). Przeciwieństwem do nil jest t. t jest równoznaczne wartości true zmiennej typu logicznego.
  • listy – są podstawowym elementem używanym w programach lispowych. Można nawet zaryzykować stwierdzenie, że wszystko w LISPie oparte jest na listach. Listą jest każde wyrażenie, nawet znane nam już

(command ”Line” P1 P2 ””)

Nawet najprostsze rzeczy można skomplikować, tak też jest w LISPie. Prostą kreskę można narysować na trzy sposoby, każdy z nich ma swoje wady, niektóre mają nawet zalety. A sposoby są następujące:

  1. Używając funkcji command
  2. AutoLISP
  3. VisualLISP

COMMAND

Używanie funkcji command jest najprostszym sposobem tworzenia obiektów. Nazwę funcji wpisujemy command, następnie nazwę polecenia ZWCADa np. "_LINE" a dalej parametry typowe dla wywołanego polecenia ZWCADa, w przykładzie linii, jako kolejne parametry wpisujemy współrzędne punktów jako listy, żeby zakończyć polecenie konieczne jest dodanie na końcu pustego tekstu co będzie równoznaczne z naciśnięciem [ENTER] czyli zakończeniem działania funkcji.

(command "LINE" (list 0 0 0)(list 10 10 10) "")

W podobny sposób możemy utworzyć np. warstwę

(command "_-layer" "n" "Warstwacommand" "c" 8 "Warstwacommand" "s" "Warstwacommand" "")

Na przykładzie tym zobaczyć możemy, że command może zawierać całą sekwencję czynności, tutaj wywołane jest polecenie -layer, a kolejne wywoływane opcje powodują:
"n" - utworzenie nowej warstwy, po czym wpisujemy nazwę naszej nowej warstwy
"c" - kolor warstwy, której nazwę podajemy dalej
"s" - ustawia jako aktualną warstwę, której nazwę podajemy po opcji s
"" - konieczne jest jeszcze tylko zamknięcie polecenia, i nasza warstwa jest utworzona i ustawiona jako aktualna

Jak już wspomniałem, każde rozwiązanie ma swoje wady i zalety, wśród zalet tworzenia elementów przez command wyróżnić należy prostotę tego rozwiązania. Jeśli znamy polecenia ZWCADa, nie ma problemu, z tworzeniem funkcji automatyzującej rysowanie.
Wadą tego rozwiązania jest brak kontroli nad tym co się dzieje w czasie wykonywania skryptu. Command zawsze zwraca nil, niezależnie od tego, czy uda się poprawnie wykonać polecenie, czy nie. Dodatkowo, w historii poleceń wyświetlane są wszystkie polecenia, które się wykonuje, co w pewnym sensie ujawnia strukturę naszego programu, a to prowokuje do dłubania w naszym kodzie osoby, które niekoniecznie powinny to robić.

Instrukcje warunkowe

if

If to podstawowa instrukcja warunkowa. Służy do podejmowania decyzji np. wykonywania kodu po zaistnieniu określonych warunków. Jej konstrukcja jest następująca

(if warunek
(polecenie1)
(polecenie2)
)

Jeśli warunek jest spełniony wykonywane jest polecenie1. Jeśli natomiast warunek nie jest spełniony, wykonywane jest polecenie2 Więcej o samych warunkach na końcu tej części

(setq SelDist (getdist))
(if (> SelDist 10)
(progn
(print "Wartość jest większa niż progowa")
(setq OutVal SelDist )
)
(progn
(print "Wskazałeś wartość mniejszą nież progowa")
(setq OutVal 0)
)
)
(print OutVal)
 

Wskaż punkt: getpoint, getcorner

(getpoint [Punkt] [Wiadomość])
(getcorner [Punkt] [Wiadomość])

Funkcja getpoint pozwala użytkownikowi na wskazanie punktu. Może on być podany klikając myszką w punkt, lub wpisując na klawiaturze współrzędne.
Istnieje też możliwość, że wyświetlona będzie dodatkowo pomocnicza linia łącząca inny punkt z aktualnym położeniem myszki.
Ostatni parametr to podpowiedź. Jest ona wyświetlana w linii poleceń i pod wskaźnikiem myszki jeśli włączona jest opcja [DYN]
Przykłady:

(setq P1 (getpoint "Wskaż punkt"))
(setq P2 (getpoint P1 "Wskaż drugi punkt"))

getcorner Jest to funkcja podobna do getpoint z tą różnicą, że jako linię pomocniczą nie rysuje linii od punktu początkowego do wskaźnika myszki, a prostokąt, gdzie punkty początkowy i wskaźnik myszki są narożnikami tymczasowego prostokąta.

(setq Pc (getcorner P1 "Wskaż narożnik"))

Podaj liczbę - getreal, getint, getdist

(getreal [Wiadomość])
(getint [Wiadomość])
(getdist [Wiadomość])

Przykład 1

Koniec tego teoretyzowania :-). W tej "lekcji" zrobimy coś praktycznego. Przykład, którym się posłużę, będzie prosił użytkownika o wskazanie punktu, a następnie w miejscu wskazanym wstawiony zostanie krzyżyk opisujący współrzędne, X i Y.

p1 cel

Kod rysujący taki znaczek wyglądałby następująco:

Okienka dialogowe

W programach, nawet najprostszych nakładkach potrzebne są okienka dialogowe. W LISP okienka dialogowe można tworzyć za pośrednictwem mechanizmów DCL. DCL pozwala na tworzenie jedynie bardzo prostych okienek. Możliwe jest użycie pól tekstowych, przycisków, list, opcji, suwaków i tekstów. Wszystkie są szczegółowo opisane w helpie, więc nie będę się tu skupiał nad dokładnym opisaniem każdego elementu okienka (czasem można się spotkać z określeniem, że są to "wycinki", ja może zostanę przy określeniu "elementy" albo "kontrolki"). Chciałbym opisać zasadę działania okienek, jak zacząć pracę z nimi, kilka interesujących możliwości, które nie są oczywiste przy pierwszym spotkaniu z DCL. W poszukiwaniu szczegółów zapraszam do lektury helpa lub dyskusji na forum.
Opinie na temat DCL są ogólnie podzielone. Wielu twórców nakładek ma złe zdanie na temat DCL, ja też się ku temu zdaniu przychylam. DCL ma wiele ograniczeń, które powodują, że jeśli mam do stworzenia nakładkę z okienkami, wybieram VBA.

Kilka właściwości, które powodują, że DCL nie jest zbyt poręczy w użyciu:

  • Trudności w ustawieniu kontrolek w okienku
  • Brak możliwości tworzenia okienek niemodalnych
  • Brak możliwości dodawania innych kontrolek
  • Brak obiektowości elementów
  • Brak możliwości zmian dynamicznych (w czasie działania programu])

Istnieją środowiska pozwalające na rozszerzenie możliwości DCL, jest to OpenDCL i ObjectDCL. Dają one o wiele większe możliwości, jak np.: Tworzenie okienek niemodalnych, Okienka podobne do okna właściwości, Dodatkowe konktolki jak np. zakładki, kalendarz, kontrolki obiektowe, podgląd bloków i inne. Ten kurs ma być jednak poświęcony podstawom LISP, a ja nie znam tych rozszerzeń na tyle, żeby móc doradzać którekolwiek z nich, więc nie będę się więcej wgłębiał w dodatkowe DCLe.

Podkategorie