Doplnění kódu zástupných funkcí - bez dialogových boxů

Dalším krokem v napsání aplikace bez dialogových boxů je samozřejmě doplnění kódu zástupných funkcí.

Přehled informací

Doplnění kódu funkce so:zpusob_zadani()

První zástupnou funkcí, které dopíšeme kód, je funkce so:zpusob_zadani(). Funkce so:zpusob_zadani() určuje jakým způsobem budou získány hodnoty od uživatele (pomocí dialogového boxu nebo příkazového řádku).

Proměnná vysledek je volána na konci funkce z důvodu předání hodnoty do nadřazené funkce. (V AutoLISPu je poslední hodnota volaná ve funkci předána nadřazené funkci).

Hlavní části funkce:

Vlastní kód funkce:

(defun so:zpusob_zadani (/ vysledek)
              ;;; funkce vrací řetězec určující způsob zadání hodnot
 (initget "D P _dialog prikaz")
              ;;; určení možných vstupních hodnot

 (setq vysledek
  (getkword 
      "Jakým způsobem si přejete zadat hodnoty (Dialog / Příkazový_ řádek)? :"
  )
 )            ;;; získání klíčového slova pro pokračování
 vysledek
              ;;; předání návratové hodnoty
)

Ve funkci so:zpusob_zadani () si všimněte použití příkazu initget, který definuje dvě klíčová písmena po jejichž zadání (na dotaz funkce getkword) je vrácena hodnota "dialog" nebo "prikaz" (hodnota dialog je vrácena po zadání D, hodnota prikaz je vrácena po zadání P).

Doplnění kódu funkce so:zadej_hodnoty()

Funkce so:zadej_hodnoty() zjistí nejprve od uživatele jaký objekt se bude kreslit. Zadanou hodnotu uloží do asociačního seznamu gl_pam_hodnoty. Poté uživateli postupně zobrazí dotaz na zadání všech hodnot odpovídajících jeho volbě (požadavku co chce kreslit). Všechny zadávané hodnoty jsou ošetřeny na správný vstup funkcí initget s argumentem. Zadané hodnoty jsou opět uloženy do asociačního seznamu gl_pam_hodnoty. Na konci funkce je vyhodnocena proměnná vysledek, výsledek je vrácen do nadřazené funkce (funkce, která vyvolala funkci so:zadej_hodnoty()). Je-li vrácena hodnota T, bylo provedeno korektní zadání hodnot a nadřazená funkce může pokračovat v činnosti, jinak je funkce ukončena bez vykreslení.

Hlavní části funkce:

Vlastní kód funkce:

(defun so:zadej_hodnoty (/ vysledek)
         ;;; funkce pro zadání hodnot
 (setq vysledek nil)
 (initget "K N _Kruznice N-uhelnik ")
         ;;; určení možných vstupních hodnot
 (setq co_kreslit 
  (getkword "Jaké objekty mám kreslit (Kružnice / N úhelník)? :")
 )       ;;; získání klíčového slova pro pokračování
 (setq gl_pam_hodnoty
  (subst
   (cons "co_kreslit" co_kreslit)
   (assoc "co_kreslit" gl_pam_hodnoty)
   gl_pam_hodnoty
  )
 )
 (so:nastav_stred (getpoint "\nZadej střed obrazce: "))
 (if (= co_kreslit "Kruznice")
         ;;; uživatel požaduje kreslit kružnici
  (progn
   (initget 1)
         ;;; kontrola zadání číselné hodnoty, potvrzení zadání je ENTREM
   (setq polomerk (getreal "\n Zadej poloměr kružnice: "))
         ;;; zjištění hodnoty poloměru
   (setq gl_pam_hodnoty 
    (subst 
     (cons "polomerke" (vl-princ-to-string polomerk))
     (assoc "polomerke" gl_pam_hodnoty)
     gl_pam_hodnoty
    )
   )     ;;; uložení poloměru kružnice do asoc. seznamu gl_pam_hodnoty
   (initget 1)
         ;;; kontrola zadání číselné hodnoty, potvrzení zadání je ENTREM
   (setq pocetk (getint "\n Zadej počet nakreslených kružnic: "))
         ;;; zadání počtu kreslených kružnic
   (setq gl_pam_hodnoty 
    (subst 
     (cons "pocetke" (itoa pocetk))
     (assoc "pocetke" gl_pam_hodnoty)
     gl_pam_hodnoty
    )
   )     ;;; uložení počtu kružnic z proměnné pocetk
         ;;; do asoc. seznamu gl_pam_hodnoty
   (initget 1)
         ;;; kontrola zadání číselné hodnoty, potvrzení zadání je ENTREM
   (setq vzdalenostk (getreal "\n Zadej vzdálenost mezi kružnicemi: "))
         ;;; vzdálenost mezi kružnicemi
   (setq gl_pam_hodnoty 
    (subst 
     (cons "vzdalenostke" (vl-princ-to-string vzdalenostk))
     (assoc "vzdalenostke" gl_pam_hodnoty)
     gl_pam_hodnoty
    )
   )     ;;; uložení vzdálenosti mezi kružnicemi z proměnné
         ;;; vzdalenostk do asoc. seznamu gl_pam_hodnoty
   (setq vysledek T)         ;;; zadání hodnot proběhlo OK
  )
 )
 (if (= co_kreslit "N-uhelnik")
         ;;; uživatel požaduje kreslit n-úhelník
  (progn
   (initget 7)
         ;;; kontrola zadání číselné hodnoty, zakaz zadání záporné hodnoty a 0
         ;;; potvrzení zadání je ENTREM
   (setq pocvrcholun (getint "\n Zadej počet vrcholů n-úhelníku: "))
         ;;; počet vrcholů n-úhelníku
   (setq gl_pam_hodnoty 
    (subst 
     (cons "pocvrcholune" (itoa pocvrcholun))
     (assoc "pocvrcholune" gl_pam_hodnoty)
     gl_pam_hodnoty
    )
   )     ;;; uložení počtu vrcholů z proměnné pocvrcholun
         ;;; do asoc. seznamu gl_pam_hodnoty
   (initget 7)
         ;;; kontrola zadání číselné hodnoty, zakaz zadání záporné hodnoty a 0
         ;;; potvrzení zadání je ENTREM
   (setq polomern (getreal "\n Zadej poloměr opsané kružnice n-úhelníku: "))
         ;;; zadání hodnoty poloměru první vepsané kružnice
   (setq gl_pam_hodnoty 
    (subst 
     (cons "polomerne" (vl-princ-to-string polomern))
     (assoc "polomerne" gl_pam_hodnoty)
     gl_pam_hodnoty
    )
   )     ;;; uložení poloměru první vepsané kružnice z proměnné
         ;;; polomern do asoc. seznamu gl_pam_hodnoty
   (initget 7)
         ;;; kontrola zadání číselné hodnoty, zakaz zadání záporné hodnoty a 0
         ;;; potvrzení zadání je ENTREM
   (setq pocetn (getint "\n Zadej počet n-úhelníků: "))
         ;;; počet kreslených n-úhelníků
   (setq gl_pam_hodnoty 
    (subst 
     (cons "pocetne" (itoa pocetn))
     (assoc "pocetne" gl_pam_hodnoty)
     gl_pam_hodnoty
    )
   )     ;;; uložení počtu kreslených n-úhelníků z proměnné pocetne
         ;;; do asoc. seznamu gl_pam_hodnoty
   (initget 7)
         ;;; kontrola zadání číselné hodnoty, zakaz zadání záporné hodnoty a 0
         ;;; potvrzení zadání je ENTREM
   (setq vzdalenostn (getreal "\n Zadej vzdálenost mezi n-úhelníky: "))
         ;;; vzdálenost mezi n-úhelníky
   (setq gl_pam_hodnoty 
    (subst 
     (cons "vzdalenostne" (vl-princ-to-string vzdalenostn))
     (assoc "vzdalenostne" gl_pam_hodnoty)
     gl_pam_hodnoty
    )
   )     ;;; uložení vzdálenosti mezi n-úhelníky z proměnné 
         ;;; vzdalenostne do asoc. seznamu gl_pam_hodnoty
   (if (< pocvrcholun 3)						
         ;;; ošetření chybného zadání
    (progn
     (princ "\n Zvětšil jsem počet vrcholů n-úhelníku na min. počet 3")
     (setq gl_pam_hodnoty
      (subst
       (cons "pocvrcholune" "3")
       (assoc "pocvrcholune" gl_pam_hodnoty)
       gl_pam_hodnoty
      )
     )   ;;; oprava hodnoty v proměnné gl_pam_hodnoty
    )
   )
   (if (< polomern 30)
         ;;; ošetření chybného zadání
    (progn
     (princ "\n Zvětšil jsem poloměr n-úhelníku počet 30")
     (setq gl_pam_hodnoty
      (subst
       (cons "pocvrcholune" "3")
       (assoc "pocvrcholune" gl_pam_hodnoty)
       gl_pam_hodnoty
      )
     )        ;;; oprava hodnoty v proměnné gl_pam_hodnoty
    )
   )
   (setq vysledek T)    ;;; zadání hodnot proběhlo OK
  )
 )
 vysledek     ;;; předání výsledku do nadřazené funkce
)

Doplnění kódu funkce so:nastav_stred()

Funkce so:nastav_stred() je volána s parametrem stred (souřadnice středu obrazce). Jednotlivé souřadnice (x, y, z) jsou převedeny na řetězece. Poté si funkce zjistí jaký obrazec požaduje uživatel kreslit (zjistí se z položky asociačního seznamu "co_kreslit"). Následně funkce uloží souřadnice středu do položek asociačního seznamu gl_pam_hodnoty, které odpovídají požadavku na kreslení objektu (ke kružnicím nebo n - úhelníkům).

Hlavní části funkce:

Vlastní kód funkce:

(defun nastav_stred (stred / stredx stredy stredz)
         ;;; funkce pro nastavení hodnot souřadnic středu
         ;;; do globální proměnné gl_pam_hodnoty
 (setq stredx (strcat (vl-princ-to-string (car stred))))
 (setq stredy (strcat (vl-princ-to-string (cadr stred))))
 (setq stredz (strcat (vl-princ-to-string (caddr stred))))
 (if (= (cdr (assoc "co_kreslit" gl_pam_hodnoty)) "Kruznice")
         ;;; jaký střed se nastavuje
  (progn
         ;;; nastavujeme střed kružnice
   (setq gl_pam_hodnoty
    (subst 
     (cons "stredkex" stredx) 
     (assoc "stredkex" gl_pam_hodnoty)
     gl_pam_hodnoty
    )
   )
   (setq gl_pam_hodnoty
    (subst 
     (cons "stredkey" stredy) 
     (assoc "stredkey" gl_pam_hodnoty)
     gl_pam_hodnoty
    )
   )
   (setq gl_pam_hodnoty
    (subst 
     (cons "stredkez" stredz) 
     (assoc "stredkez" gl_pam_hodnoty)
     gl_pam_hodnoty
    )
   )
  )
 )
 (if (= (cdr (assoc "co_kreslit" gl_pam_hodnoty)) "N-uhelnik")
         ;;; jaký střed se nastavuje
  (progn
         ;;; nastavujeme střed "N-uhelnik"
   (setq gl_pam_hodnoty
    (subst 
     (cons "strednex" stredx) 
     (assoc "strednex" gl_pam_hodnoty)
     gl_pam_hodnoty
    )
   )
   (setq gl_pam_hodnoty
    (subst 
     (cons "stredney" stredy) 
     (assoc "stredney" gl_pam_hodnoty)
     gl_pam_hodnoty
    )
   )
   (setq gl_pam_hodnoty
    (subst 
     (cons "strednez" stredz) 
     (assoc "strednez" gl_pam_hodnoty)
     gl_pam_hodnoty
    )
   )
  )
 )
)

Doplnění kódu funkce so:vykresli()

Funkce so:vykresli() zjistí (z asociačního seznamu - proměnné gl_pam_hodnoty) hodnotu jaký obrazec se má kreslit ("Kruznice" - kresli kružnici, "N-uhelnik" - kresli n - úhelník) a zavolá příslušnou funkci.

V kódu funkce je dobré si všimnout definování lokální proměnné co_kresli - lokální proměnná se definuje za znakem svislého lomítka. Lokálních proměnných může být neomezený počet, lomítko se uvádí pouze jedno.

Důležité: za znakem lomítka musí být jedna mezera jinak bude AutoLISP hlásit chybu!

Hlavní části funkce:

Vlastní kód funkce:


(defun so:vykresli(/ co_kreslit)
 (setq co_kreslit (cdr (assoc "co_kreslit" gl_pam_hodnoty)))
         ;;; získání klíčového slova pro určení dalšího postupu pokračování
 (if (= co_kreslit "Kruznice")
         ;;; uživatel požaduje kreslit kružnici
  (so:kresli_kruznici)
         ;;; volání funkce pro vykreslení kružnice
 )
 (if (= co_kreslit "N-uhelnik")
         ;;; uživatel požaduje kreslit n-úhelník
  (so:kresli_nuhelnik)
         ;;; volání funkce pro vykreslení n-úhelníku
 )
)

Doplnění kódu funkce so:kresli_nuhelnik()

Funkce so:kresli_nuhelnik() zajistí vykreslení soustředných n-úhelníků. Funkce so:kresli_nuhelnik() nejprve načte hodnoty jednotlivých souřadnic středu n-úhelníku ("strednex", "stredney" a "strednez"), tyto hodnoty jsou převedeny z řetězce na hodnoty typu reálné číslo, sdruženy do tečka trojice (formát zadání bodu) a uloženy do proměnné stred_nu. Poté funkce zjistí všechny potřebné hodnoty pro zadání kresleného n-úhelníku. Následuje vykreslení jednotlivých n-úhelníků.

Hlavní části funkce:

Vlastní kód funkce:

(defun kresli_nuhelnik (/ stred_nu pocvrcholu polomer 
                                            pol_kresl pocet vzdalenost)
         ;;; vykreslení n-úhelníku
         ;;;; stred - souřadnice středu (real.číslo, real.číslo, real.číslo)
         ;;;; pocvrcholu - celé číslo počet vrcholů n-úhelníku
         ;;;; polomer - real.číslo poloměr první vepsané kružnice
         ;;;; pol_kresl - real.číslo poloměr vepsaných kružnic
         ;;;; pocet - celé číslo počet kreslených soustředných n-úhelníků
         ;;;; vzdalenost - real.číslo vzdálenost mezi n-úhelníky
 (setq stred_nu
  (list
   (atof (cdr (assoc "strednex" gl_pam_hodnoty)))
   (atof (cdr (assoc "stredney" gl_pam_hodnoty)))
   (atof (cdr (assoc "strednez" gl_pam_hodnoty)))
  )
 )       ;;; převod řetězců reprezentujících souřadnice do proměnné stred
         ;;; (položky stred jsou typu float)
         ;;; získání hodnot z asociačního seznamu gl_pam_hodnoty
 (setq pocvrcholu (atoi (cdr (assoc "pocvrcholune" gl_pam_hodnoty))))
         ;;; počtu vrcholů n-úhelníku
 (setq polomer (atof (cdr (assoc "polomerne" gl_pam_hodnoty))))
         ;;; poloměru první vepsané kružnice
 (setq pocet (atoi (cdr (assoc "pocetne" gl_pam_hodnoty))))
         ;;; počet kreslených n-úhelníků
 (setq vzdalenost (atof (cdr (assoc "vzdalenostne" gl_pam_hodnoty))))
         ;;; vzdálenosti mezi n-úhelníky
 (command )
         ;;; ukončení všech předchozích příkazů
 (while (> pocet 0)
         ;;; dokud je co kreslit opakuj
  (setq pol_kresl (+ polomer (* vzdalenost (- pocet 1))))
         ;;; nastavení poloměru vepsané kružnice, kresleného n-uhelníku
  (command "_polygon" pocvrcholu stred_nu "_I" pol_kresl)
         ;;; vykresli n-úhelník
  (setq pocet (- pocet 1))
         ;;; zmenši počet n-úhelníků o 1
 )
)

Nápověda pro funkce so:kresli_kruznici()

Poslední funkcí, do které je potřeba doplnit kód, je funkce pro vykreslení kružnice so:kresli_kruznici(). Následujících pár řádků ukazuje správnou hlavičku funkce a seznam všech proměnných, které budete potřebovat při tvorbě funkce.

 
(defun so:kresli_kruznici ( stred_kr / polomer pol_kresl pocet vzdalenost)
              ;;; vykreslení kružnice
              ;;;; stred - souř. středu (real.číslo, real.číslo, real.číslo)
              ;;;; polomer - real.číslo poloměr první kružnice
              ;;;; pol_kresl - real.číslo poloměr vykreslované kružnice
              ;;;; pocet - celé číslo počet kreslených soustředných kružnic
              ;;;; vzdalenost - real.číslo vzdálenost mezi kružnicemi
 (princ "Toto je zástupná funkce kresli_kruznici.")
 (princ "Kód funkce si doplní uživatel za úkol sám.") 
)

Zbytek kódu funkce so:kresli_kruznici() si doplní jako cvičení uživatel sám.

Rada - vycházejte z funkce so:kresli_nuhelnik(). Dejte si pozor na správnou kontrolu vstupních hodnot (příkaz initget). Při tvorbě funkce můžete využít i referenční příručku AutoLISPu.

Nápověda pro ztracené uživatele při tvorbě funkce so:kresli_kružnici()

Ztratíte-li se při psaní funkce so:kresli_kruznici() můžete si přečíst rozsáhlejší nápovědu.

Zdrojový soubor

Kód hlavní funkce SObjekty() a kódy všech zástupných funkcí definovaných zde jsou podrobně popsány na následující stránce pásma Kompletní aplikace - funkce bez dialogových boxů .