AutoCAD... AutoLISP... VisualLISP...

  [32] spiral.lsp

index  

  LISP jest jak wino - im starszy tym lepszy... Poniżej przedstawiam kod jednego z pierwszych programów lispowych dostępnych dla AutoCAD-a. Został napisany w 1985 (jak mówi stopka) był dołączony do pierwszego wydania AutoCAD-a z wbudowanym AutoLISP-em. Była to wersja oznaczona numerem 2.18 i została wydana w styczniu 1986 roku! (v2.1 - AutoCAD Release 6 - maj 1985). W polskiej wersji AutoCAD-a spiral.lsp zadebiutował w roku 1988 (AutoCAD Release 10) - była to też piersza polska wersja AutoCAD-a. Stąd też pochodzi przedstawiony poniżej kod programu:
;******************************** SPIRAL.LSP ********************************
;
; Autor programu:  Kelvin R. Throop, Autodesk  stycze¤ 1985
; Wersja polska: G. Burda, APLIKOM  27-4-89
;
; Program rysuje spiral‘.
; Wczytanie i wywo’anie programu przez wpisanie  "spiral" lub:
;
;       (cspiral <# obrot˘w> <žrodek> 
;                <# punkt˘w na obr˘t>).
;**************************************************************************

(defun cspiral (ntimes bpoint cfac lppass / ang dist tp ainc dinc circle bs cs)
        (setq cs (getvar "cmdecho"))    ; zapami‘tanie wartožci zmiennych
        (setq bs (getvar "blipmode"))   ; "cmdecho" i "blipmode"
        (setvar "blipmode" 0)           ; wy’†czenie "blipmode"
        (setvar "cmdecho" 0)            ; wy’†czenie "cmdecho"
        (setq circle (* 3.141596235 2))
        (setq ainc (/ circle lppass))
        (setq dinc (/ cfac lppass))
        (setq ang 0.0)
        (setq dist 0.0)
        ;*(command "plinia" bpoint)        ; pocz†tek spirali od žrodka i...
        (command "_.pline" bpoint)
        (repeat ntimes
           (repeat lppass
              (setq tp (polar bpoint (setq ang (+ ang ainc))
                          (setq dist (+ dist dinc))))
              (command tp)              ; kontynuacja do nast‘pnego punktu...
           )
        )
        (command)                       ; a§ do zako¤czenia spirali.
        (setvar "blipmode" bs)          ; odtworzenie zapami‘tanej "blipmode"
        (setvar "cmdecho" cs)           ; odtworzenie zapami‘tanej "cmdecho"
        nil
)
;
;       Interaktywne generowanie spirali
;
(defun C:SPIRAL ( / nt bp cf lp)
        (initget 1)                  ; bp nie mo§e by zerowe
        (setq bp (getpoint "\n˜rodek spirali: "))
        (initget 7)                  ; nt nie mo§e by zerowe, ujemne lub puste
        (setq nt (getint "\nLiczba obrot˘w: "))
        (initget 3)                  ; cf nie mo§e by zerowe, ujemne lub puste
        (setq cf (getdist "\nPrzyrost na obr˘t: "))
        (initget 6)                  ; lp nie mo§e by zerowe lub ujemne
        (setq lp (getint "\nIlož punkt˘w na obr˘t <30>: "))
        (cond ((null lp) (setq lp 30)))
        (cspiral nt bp cf lp)
)
Na szczególną uwagę zasługuje fakt że ten lisp również działa w aktualnych wersjach AutoCAD-a. Jedyną zmianą jaką pozwoliłem sobie zrobić w tym kodzie to zamiana argumentu "PLINIA" na "_.PLINE" w wywołaniu funkcji command. Bez tej zmiany program mógłby działać tylko w wersji polskiej.
Warto również zwrócić uwagę na linię (setq circle (* 3.141596235 2)) - liczba pi przedstawiona wprost... ponieważ specjalny symbol pi pojawił się w AutoLISP-ie dopiero w 1990 roku. Nieczytelność polskich znaków spowodowany jest stosowaną wówczas stroną kodową dla języka polskiego (wtedy chyba DOS-852 jeśli dobrze pamiętam?).

Nie pamiętam już czy to ten sam lisp, jednak z pewnością jest jednym z pierwszych z którymi się zetknąłem, wtedy jescze nie wiedząc jeszcze, jak bardzo interesujące może być zapisywanie czekokolwiek w nawiasach... :)