Dokončená funkce SObjekty() s dialogovými boxy

Přehled informací

Hlavní funkce SObjekty()

Funkce SObjekty() definuje nový příkaz AutoCADu SObjekty. Zadá-li uživatel tento příkaz do příkazové řádky, jsou zobrazeny doplňující otázky pro zadání hodnot od uživatele. Po jejich zodpovězení je zobrazen určený obrazec.

Hlavní části funkce:

V těle funkce je nejprve definovaná proměnná obsahující asociační seznam s uloženým nastavením všech inicializačních hodnot nastavení pro vykreslení výsledných obrazců. Následuje získání a uložení hodnoty do proměnné zadani, která určuje jakým způsobem bude chtít uživatel zadávat hodnoty (dialogovým boxem: zadani = "dialog" nebo pomocí příkazového řádku zadani = "prikaz"). Po zjištění způsobu zadávání hodnot je zavolána funkce pro zadání parametrů so:zadej_hodnoty (v případě, že uživatel požaduje zadávání pomocí příkazového řádku) nebo so:dialog (v případu, že uživatel požaduje zadávání pomocí dialogu). Každá z výše uvedených funkcí vrací v případě správného zadání hodnotu T (v případě jakékoliv chyby hodnotu nil). Vrácená hodnota je otestována a rovná-li se T je zavolána funkce so:vykresli(), která vykreslí daný obrazec, v opačném případě dojde k ukončení aplikace.

Vlastní kód funkce:

(defun c:SObjekty ()
      ;;; definice nové funkce, která bude vyvolána příkazem SObjekty
 (setq gl_pam_hodnoty
      ;;; globální proměnná uchovávající jednotlivá nastavení
  (list
   (cons "co_kreslit" "Kruznice") ;;; určení co se bude kreslit
   (cons "stredkex" "0.0")      ;;; x souř. středu soustř. kružnic
   (cons "stredkey" "0.0")      ;;; y souř. středu soustř. kružnic
   (cons "stredkez" "0.0")      ;;; z souř. středu soustř. kružnic
   (cons "strednex" "0.0")      ;;; x souř. středu soustř. n-uhelníků
   (cons "stredney" "0.0")      ;;; y souř. středu soustř. n-uhelníků
   (cons "strednez" "0.0")      ;;; z souř. středu soustř. n-uhelníků
   (cons "pocvrcholune" "3")    ;;; počet vrcholů n-úhelníku (editbox)
   (cons "pocvrcholuns" "3")    ;;; počet vrcholů n-úhelníku (slider)
   (cons "polomerne" "3")       ;;; poloměr n-úhelníku (editbox)
   (cons "polomerns" "3")       ;;; počet n-úhelníků (slider)
   (cons "pocetne" "1")         ;;; počet n-úhelníků (editbox)
   (cons "pocetns" "1")         ;;; počet n-úhelníků (slider)
   (cons "vzdalenostne" "1")    ;;; vzdálenost mezi n-úhelníky (editbox)
   (cons "vzdalenostns" "1")    ;;; vzdálenost mezi n-úhelníky (slider)
   (cons "polomerke" "1")       ;;; poloměr kružnice (editbox)
   (cons "polomerks" "1")       ;;; poloměr kružnice (slider)
   (cons "pocetke" "1")         ;;; počet kružnic (editbox)
   (cons "pocetks" "1")         ;;; počet kružnic (slider)
   (cons "vzdalenostke" "1")    ;;; vzdálenost mezi kružnicemi (editbox)
   (cons "vzdalenostks" "1")    ;;; vzdálenost mezi kružnicemi
   (cons "kruz_stred_but" "0")  ;;; tlačítko - stred kruznice
   (cons "nuhel_stred_but" "0") ;;; tlačítko - stred n-úhelníku
  )
 )
 (setq zadani (so:zpusob_zadani))
      ;;; nastavení proměnné určující jakým způsobem se mají zadat informace
 (if (= zadani "prikaz")
  (progn
      ;;; zadání hodnot pomocí příkazového řádku
   (if (= (so:zadej_hodnoty) T)
    (progn
     (so:vykresli)
      ;;; vykreslení požadovaného objektu v případě že byly zadány hodnoty
     (princ "Funkce c:SObjekty dokončila činnost")
     (exit)                     ;;; ukončení funkce
    )
   )
  )
 )
 (if (= zadani "dialog")
  (progn
         ;;; zadání hodnot pomocí dialogového boxu
   (if (= (so:dialog) T)
    (progn
     (so:vykresli)
         ;;; vykreslení požadovaného objektu, v případě že byly zadány hodnoty
     (princ "Funkce c:SObjekty dokončila činnost")
     (exit)                     ;;; ukončení funkce
    )
   )
  )
 )
 (princ "Funkce c:SObjekty dokončila činnost")
         ;;; informace o ukončení funkce
 (princ)
)

Funkce so:zpusob_zadani()

Funkce so.zpusob_zadani() vyzve nejprve uživatele, aby určil jakým způsobem bude chtít zadávat hodnoty nastavení soustředných objektů. Hodnota je uložena do proměnné výsledek, která je zavolána na konci funkce = návratová hodnota.

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 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
)

Příkaz initget 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).

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, zákaz 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, zákaz 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, zákaz 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, zákaz 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
)

Funkce so:dialog()

Funkce so:dialog() umožňuje zobrazení dialogového boxu, nastavuje / získává hodnoty dialogového boxu. Při ukončení funkce je vrácena hodnota T - v případě, že dialog byl ukončen tlačítkem OK a uživatel si přeje vykreslit obrazec. V případě, že je dialog stornován je vrácena hodnota nil a obrazec není vykreslen.

Hlavní části funkce:

Na začátku funkce so:dialog() musíme nejprve načíst dialogový box a předat jméno načteného dialogového boxu k uložení do proměnné id pro další použití. Dále musíme nastavit pomocnou proměnnou co_delat, abychom mohli schovat dialogový box při zadávání středu obrazce. Inicializační hodnota proměnné je 2 (znamená vstup do smyčky spravující dialogový box). Pro zapamatování nastavení prvků dialogu použijeme připravený asociační seznam uložený v proměnné gl_pam_hodnoty. Princip skrytí dialogu je vysvětlen v lekci Práce s dialogovým boxem.

Po úspěšném načtení dialogu ze souboru .dcl a vstoupení do smyčky while musíme zkontrolovat jestli soubor obsahuje požadovaný dialog. Neobsahuje-li soubor požadovaný dialog ukončíme činnost funkce so:dialog i nadřazené funkce SObjekty() a zobrazí se chybová zpráva.

Proběhli-li všechny uvedené testy dialogu v pořádku, předají se hodnoty z asociačního seznamu obsahující nastavení dialogových prvků gl_pom_hodnoty jednotlivým prvkům dialogového boxu. Předání se uskuteční pomocí příkazu set_tile ... .

Princip nastavení dialogových prvků - funkce získá pomocí funkce assoc tečka dvojici klíč.hodnota z asociačního seznamu gl_pom_hodnoty. Výsledek je předán funkci cdr, která rozdělí tečka dvojici a část "hodnota" předá funkci set_tile, která na takto získanou hodnotou nastaví dialogový prvek s klíčem "jméno_prvku". Je důležité si uvědomit, že proměnná hodnota musí být typu řetězec.

Obrácený postup - získání hodnoty z dialogového prvku se uskuteční pomocí funkce action_tile. Příkaz action_tile se aktivuje při uživatelově interakci s dialogovým prvkem. Funkce action_tile předá hodnotu, na kterou byl dialogový prvek nastaven a kód určující jaká akce uživatele vyvolala akci dialogového prvku. Tyto dvě hodnoty jsou předány zpracující_funkci, která vyhodnotí akci.

Na závěr funkce SObjekty je zavolán příkaz unload_dialog, který odstraní dialog z paměti. Proměnná vysledek je volána na konci funkce jako návratová hodnota funkce so:dialog(). Je-li hodnota vysledek = T znamená to, že zadání hodnot pomocí dialogu proběhla OK. Je-li vysledek = nil, znamená to, že zadání hodnot pomocí dialogu neproběhla v pořádku. V tomto případu nebude nic vykresleno.

Vlastní kód funkce:

(defun so:dialog (/ id co_delat vysledek)

 (setq id (load_dialog "d:/vyber.dcl"))
         ;;; předání jména dialogového boxu
         ;;; nezapomeňte nastavit správnou cestu k souboru

 (setq co_delat 2)

 (while (>= co_delat 2)
         ;;; opakuj pokud nenastane změna

  (if (not (new_dialog "vyber" id))
         ;;; není-li jméno dialogu vyber tak skonči
   (exit)
  )

  (start_list "popup")     ;;; vytvoření položek popup listu
   (add_list "N úhelník")  ;;; přidání položky "N úhelník"
   (add_list "Kružnice")   ;;; přidání položky "Kružnice"
  (end_list)               ;;; konec seznamu položek popup listu

         ;;; nastavení hodnot dialogových prvků:
  (set_tile "polomerke"    (cdr (assoc "polomerke"    gl_pam_hodnoty)))
  (set_tile "polomerks"    (cdr (assoc "polomerks"    gl_pam_hodnoty))) 
  (set_tile "pocetke"      (cdr (assoc "pocetke"      gl_pam_hodnoty)))
  (set_tile "pocetks"      (cdr (assoc "pocetks"      gl_pam_hodnoty)))
  (set_tile "vzdalenostke" (cdr (assoc "vzdalenostke" gl_pam_hodnoty)))
  (set_tile "vzdalenostks" (cdr (assoc "vzdalenostks" gl_pam_hodnoty)))
  (set_tile "polomerne"    (cdr (assoc "polomerne"    gl_pam_hodnoty)))
  (set_tile "polomerns"    (cdr (assoc "polomerns"    gl_pam_hodnoty)))
  (set_tile "pocetne"      (cdr (assoc "pocetne"      gl_pam_hodnoty)))
  (set_tile "pocetns"      (cdr (assoc "pocetns"      gl_pam_hodnoty)))
  (set_tile "vzdalenostne" (cdr (assoc "vzdalenostne" gl_pam_hodnoty)))
  (set_tile "vzdalenostns" (cdr (assoc "vzdalenostns" gl_pam_hodnoty)))
  (set_tile "pocvrcholune" (cdr (assoc "pocvrcholune" gl_pam_hodnoty)))
  (set_tile "pocvrcholuns" (cdr (assoc "pocvrcholuns" gl_pam_hodnoty)))
  (set_tile "stredkex"     (cdr (assoc "stredkex"     gl_pam_hodnoty)))
  (set_tile "stredkey"     (cdr (assoc "stredkey"     gl_pam_hodnoty)))
  (set_tile "stredkez"     (cdr (assoc "stredkez"     gl_pam_hodnoty)))
  (set_tile "strednex"     (cdr (assoc "strednex"     gl_pam_hodnoty)))
  (set_tile "stredney"     (cdr (assoc "stredney"     gl_pam_hodnoty)))
  (set_tile "strednez"     (cdr (assoc "strednez"     gl_pam_hodnoty)))

  (action_tile "kruznice" "(so:naskruh)")
         ;;; je-li vybrán radio_button "kruznice" zavolej funkci (so:naskruh)
  (action_tile "nuhelnik" "(so:nasnuhe)")
         ;;; je-li vybrán radio_button "nuhelnik" zavolej funkci (so:nasnuhe)
  (action_tile "popup" "(progn
                       (if (= $value \"0\") (so:nasnuhe))
                       (if (= $value \"1\") (so:naskruh))
                      )"
  )
         ;;; je-li vybrána položka popup_listu "N úhelník" zavolej (nasnuhe)
         ;;; je-li vybrána položka popup_listu "Kružnice" zavolej (naskruh)
  (action_tile "polomerks"
         "(so:vazba_prvku $value $reason \"polomerke\" \"polomerks\")"
  )
  (action_tile "pocetks" 
         "(so:vazba_prvku $value $reason \"pocetke\" \"pocetks\")"
  )
  (action_tile "vzdalenostks" 
         "(so:vazba_prvku $value $reason \"vzdalenostke\" \"vzdalenostks\")"
  )
  (action_tile "polomerns"
         "(so:vazba_prvku $value $reason \"polomerne\" \"polomerns\")"
  )
  (action_tile "pocetns" 
         "(so:vazba_prvku $value $reason \"pocetne\" \"pocetns\")"
  )
  (action_tile "vzdalenostns"
         "(so:vazba_prvku $value $reason \"vzdalenostne\" \"vzdalenostns\")"
  )
  (action_tile "pocvrcholuns"
         "(so:vazba_prvku $value $reason \"pocvrcholune\" \"pocvrcholuns\")"
  )
         ;;; je-li změněn některý posuvník "slider.." zavolej so:vazba_prvků
  (action_tile "stredkex" 
         "(setq gl_pam_hodnoty
           (subst
            (cons \"stredkex\" $value)
            (assoc \"stredkex\" gl_pam_hodnoty)
            gl_pam_hodnoty
           )
         )"
  ) 
  (action_tile "stredkey" 
         "(setq gl_pam_hodnoty
           (subst
            (cons \"stredkey\" $value)
            (assoc \"stredkey\" gl_pam_hodnoty)
            gl_pam_hodnoty
           )
         )"
  ) 
  (action_tile "stredkez" 
         "(setq gl_pam_hodnoty
           (subst
            (cons \"stredkez\" $value)
            (assoc \"stredkez\" gl_pam_hodnoty)
            gl_pam_hodnoty
           )
         )"
  )      ;;; je-li změněn některý editbox středu kružnice nastav hodnoty
  (action_tile "polomerke" 
         "(so:vazba_prvku $value $reason \"polomerke\" \"polomerks\")"
  )
  (action_tile "pocetke"
         "(so:vazba_prvku (zaokr_string $value)
                $reason \"pocetke\" \"pocetks\"
         )"
  )
  (action_tile "vzdalenostke"
         "(so:vazba_prvku $value $reason \"vzdalenostke\" \"vzdalenostks\")"
  )      ;;; je-li změněn některý editbox zavolej funkci so:vazba_prvku
  (action_tile "strednex" 
         "(setq gl_pam_hodnoty
           (subst
            (cons \"strednex\" $value)
            (assoc \"strednex\" gl_pam_hodnoty)
            gl_pam_hodnoty
           )
         )"
  ) 
  (action_tile "stredney" 
         "(setq gl_pam_hodnoty
           (subst
            (cons \"stredney\" $value)
            (assoc \"stredney\" gl_pam_hodnoty)
            gl_pam_hodnoty
           )
         )"
  ) 
  (action_tile "strednez" 
         "(setq gl_pam_hodnoty
           (subst
            (cons \"strednez\" $value)
            (assoc \"strednez\" gl_pam_hodnoty)
            gl_pam_hodnoty
           )
         )"
  )      ;;; je-li změněn některý editbox středu n-úhelníku nastav hodnoty
  (action_tile "polomerne" 
         "(so:vazba_prvku $value $reason \"pocvrcholune\" \"polomerns\")"
  )
  (action_tile "pocetne" 
         "(so:vazba_prvku (zaokr_string $value) 
                $reason \"pocetne\" \"pocetns\"
         )"
  )
  (action_tile "vzdalenostne" 
         "(so:vazba_prvku $value 
                $reason \"vzdalenostne\" \"vzdalenostns\")"
  )
  (action_tile "pocvrcholune"
         "(so:vazba_prvku (zaokr_string $value) 
                $reason \"pocvrcholune\" \"pocvrcholuns\"
         )"
  )      ;;; je-li změněn některý editbox zavolej funkci so:vazba_prvku
         ;;; pozor hodnota $value je u některých prvků zaokrouhlena
  (action_tile "kruz_stred_but" "(done_dialog 4)")
         ;;; je-li zmáčknuto tlačítko "kruz_stred_but" zavolej
         ;;; funkci done_dialog s hodnotou 4
  (action_tile "nuhel_stred_but" "(done_dialog 4)")
         ;;; je-li zmáčknuto tlačítko "nuhel_stred_but" zavolej
         ;;; funkci done_dialog s hodnotou 4
  (action_tile "accept" "(done_dialog 1)")
         ;;; je-li zmáčknuto "accept" zavolej done_dialog s hodnotou 1
  (action_tile "cancel" "(done_dialog 0)")
         ;;; je-li zmáčknuto "cancel" zavolej done_dialog s hodnotou 0

  (if (= (cdr (assoc "co_kreslit" gl_pam_hodnoty)) "Kruznice")
         ;;; je-li nastaveno kresleni kruznice
   (so:naskruh)         ;;; zavolej funkci (so:naskruh)
  )

  (if (= (cdr (assoc "co_kreslit" gl_pam_hodnoty)) "N-uhelnik") 
         ;;; není-li nastaveno kresleni kruznice
   (so:nasnuhe)         ;;; zavolej funkci (so:nasnuhe)
  )

  (setq co_delat (start_dialog))
         ;;; nastaví proměnnou na hodnotu získanou od funkce
         ;;; start_dialog (hodnota s kterou končí funkce done_dialog)

  (cond
         ;;; určení další činnosti
   ((= co_delat 0) (setq vysledek nil))
         ;;; uživatel stornoval dialog = konec funkce
   ((= co_delat 1) (setq vysledek T))
         ;;; uživatel potvrdil dialog, zavolej funkci (vykresli)
   ((= co_delat 4)
         ;;; uživatel zmáčkl tlačítko pro zadání souřadnic středu
    (so:nastav_stred 
     (getpoint "\nVýběr bodu:")
    )
   )                    ;;; zavolej funkci nastav_střed
  )
 )

 (unload_dialog id)     ;;; odstraní dialog id z paměti

 vysledek               ;;; vrácení výsledku funkce (jestli proběhla OK)
)

Funkce so:naskruh()

Funkce so:naskruh() nejprve zajistí nastavení položky co_kreslit na hodnotu "Kruznice" - znamená bude se kreslit kružnice. Následuje nastavení odpovídajících dialogových prvků. Do popup seznamu je nastavena hodnota "Kružnice". Dialogové prvky příslušné ke kružnici jsou aktivovány. Naopak prvky dialogu nastavující n-úhelník jsou deaktivovány.

Hlavní části funkce:

Vlastní kód funkce

(defun naskruh ()
         ;;; nastavení hodnot (přepínačů) a viditelnosti prvků pro kružnici
 
 (setq gl_pam_hodnoty 
  (subst 
   (cons "co_kreslit" "Kruznice")
   (assoc "co_kreslit" gl_pam_hodnoty)
   gl_pam_hodnoty
  )
 )

         ;;; nastavení prvků:
 (set_tile "kruznice" "1")   ;;; radio_buttonu "kruznice" jako zvýrazněný
 (set_tile "nuhelnik" "0")   ;;; radio_buttonu "n uhelnik" jako nezvýrazněný
 (set_tile "popup" "1")      ;;; popup_listu na hodnotu "Kružnice"
 
         ;;; deaktivování prvků příslušných k n-úhelníku:
 (mode_tile "strednex" 1)        ;;; deaktivování edit_boxu "strednex"
 (mode_tile "stredney" 1)        ;;; deaktivování edit_boxu "stredney"
 (mode_tile "strednez" 1)        ;;; deaktivování edit_boxu "strednez"
 (mode_tile "polomerne" 1)       ;;; deaktivování edit_boxu "polomerne"
 (mode_tile "pocetne" 1)         ;;; deaktivování edit_boxu "pocetne"
 (mode_tile "vzdalenostne" 1)    ;;; deaktivování edit_boxu "vzdalenostne"
 (mode_tile "pocvrcholune" 1)    ;;; deaktivování edit_boxu "pocvrcholune"
 (mode_tile "polomerns" 1)       ;;; deaktivování slideru "polomerns"
 (mode_tile "pocetns" 1)         ;;; deaktivování slideru "pocetns"
 (mode_tile "vzdalenostns" 1)    ;;; deaktivování slideru "vzdalenostns"
 (mode_tile "pocvrcholuns" 1)    ;;; deaktivování slideru "pocvrcholuns"
 (mode_tile "nuhel_stred_but" 1) ;;; deaktivování tlačítka "nuhel_stred_but"

         ;;; aktivování prvků příslušných ke kružnici:
 (mode_tile "polomerks" 0)       ;;; aktivování slideru "polomerks"
 (mode_tile "pocetks" 0)         ;;; aktivování slideru "pocetks"
 (mode_tile "vzdalenostks" 0)    ;;; aktivování slideru "vzdalenostks"
 (mode_tile "stredkex" 0)        ;;; aktivování edit_boxu "stredkex"
 (mode_tile "stredkey" 0)        ;;; aktivování edit_boxu "stredkey"
 (mode_tile "stredkez" 0)        ;;; aktivování edit_boxu "stredkez"
 (mode_tile "polomerke" 0)       ;;; aktivování edit_boxu "polomerke"
 (mode_tile "pocetke" 0)         ;;; aktivování edit_boxu "pocetke"
 (mode_tile "vzdalenostke" 0)    ;;; aktivování edit_boxu "vzdalenostke"
 (mode_tile "kruz_stred_but" 0)  ;;; aktivování tlačítka "kruz_stred_but"
)

Funkce so:nasnuhe()

Funkce so:nasnuhe() nejprve zajistí nastavení položky co_kreslit na hodnotu "N-uhelnik" - bude se kreslit n-úhelník. Následuje nastavení odpovídajících dialogových prvků. Do popup seznamu je nastavena hodnota "N-úhelník". Dialogové prvky příslušné k n-úhelníku jsou aktivovány. Naopak prvky dialogu nastavující kružnici jsou deaktivovány.

Hlavní části funkce:

Vlastní kód funkce

(defun nasnuhe ()
         ;;; nastavení hodnot (přepínačů) a viditelnosti prvků pro n-úhelník
 
 (setq gl_pam_hodnoty 
  (subst 
   (cons "co_kreslit" "N-uhelnik")
   (assoc "co_kreslit" gl_pam_hodnoty) gl_pam_hodnoty)
   gl_pam_hodnoty
  )
 )

         ;;; nastavení prvků
 (set_tile "kruznice" "0")  ;;; radio_button "kruznice" jako nezvýrazněný
 (set_tile "nuhelnik" "1")  ;;; radio_button "n uhelnik" jako zvýrazněný
 (set_tile "popup" "0")     ;;; popup_list na hodnotu "N - úhelník"

         ;;; deaktivování prvků příslušných ke kružnici:
 (mode_tile "polomerks" 1)      ;;; deaktivování slideru "polomerks"
 (mode_tile "pocetks" 1)        ;;; deaktivování slideru "pocetks"
 (mode_tile "vzdalenostks" 1)   ;;; deaktivování slideru "vzdalenostks"
 (mode_tile "stredkex" 1)       ;;; deaktivování edit_boxu "stredkex"
 (mode_tile "stredkey" 1)       ;;; deaktivování edit_boxu "stredkey"
 (mode_tile "stredkez" 1)       ;;; deaktivování edit_boxu "stredkez"
 (mode_tile "polomerke" 1)      ;;; deaktivování edit_boxu "polomerke"
 (mode_tile "pocetke" 1)        ;;; deaktivování edit_boxu "pocetke"
 (mode_tile "vzdalenostke" 1)   ;;; deaktivování edit_boxu "vzdalenostke"
 (mode_tile "kruz_stred_but" 1) ;;; deaktivování tlačítka "kruz_stred_but"

         ;;; aktivování prvků příslušných k n-úhelníku:
 (mode_tile "strednex" 0)        ;;; aktivování edit_boxu "strednex"
 (mode_tile "stredney" 0)        ;;; aktivování edit_boxu "stredney"
 (mode_tile "strednez" 0)        ;;; aktivování edit_boxu "strednez"
 (mode_tile "polomerne" 0)       ;;; aktivování edit_boxu "polomerne"
 (mode_tile "pocetne" 0)         ;;; aktivování edit_boxu "pocetne"
 (mode_tile "vzdalenostne" 0)    ;;; aktivování edit_boxu "vzdalenostne"
 (mode_tile "pocvrcholune" 0)    ;;; aktivování edit_boxu "pocvrcholune"
 (mode_tile "polomerns" 0)       ;;; aktivování slideru "polomerns"
 (mode_tile "pocetns" 0)         ;;; aktivování slideru "pocetns"
 (mode_tile "vzdalenostns" 0)    ;;; aktivování slideru "vzdalenostns"
 (mode_tile "pocvrcholuns" 0)    ;;; aktivování slideru "pocvrcholuns"
 (mode_tile "nuhel_stred_but" 0) ;;; aktivování tlačítka "nuhel_stred_but"
)

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ězce. 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
    )
   )
  )
 )
)

Funkce so:vykresli()

Funkce so:vykresli() nejprve 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). Podle zjištěné hodnoty je provedena další činnost.

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
 )
)

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
 )
)

Funkce so:kresli_kruznici()

Funkce so:kresli_kruznici() zajistí vykreslení soustředných kružnic. Funkce so:kresli_kruznici() nejprve načte hodnoty jednotlivých souřadnic středu kružnic ("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_kr. Poté funkce zjistí všechny potřebné hodnoty pro zadání kreslené kružnice. Následuje vykreslení jednotlivých kružnic.

Hlavní části funkce:

Vlastní kód funkce:

(defun so:kresli_kruznici (/ stred_kr polomer pol_kresl pocet vzdalenost)
         ;;; vykreslení kružnice
         ;;;; stred_kr - 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

 (setq stred_kr
  (list
   (atof (cdr (assoc "stredkex" gl_pam_hodnoty)))
   (atof (cdr (assoc "stredkey" gl_pam_hodnoty)))
   (atof (cdr (assoc "stredkez" gl_pam_hodnoty)))
  )
 )
         ;;; převod řetězců souřadnic do proměnné stred 
         ;;; získání hodnot z asociačního seznamu gl_pam_hodnoty

 (setq polomer (atof (cdr (assoc "polomerke" gl_pam_hodnoty))))
         ;;; uložení hodnoty poloměru
 (setq pocet (atoi (cdr (assoc "pocetke" gl_pam_hodnoty))))
         ;;; počet kreslených kružnic
 (setq vzdalenost (atof (cdr (assoc "vzdalenostke" gl_pam_hodnoty))))
         ;;; vzdálenost mezi kružnicemi
 (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))))
         ;;; nastav aktuální poloměr
  (command "_circle" stred_kr pol_kresl)
         ;;; vykresli kružnici se středem stred_kr a poloměrem pol_kresl
  (setq pocet (- pocet 1))
         ;;; zmenši počet kružnic o 1
 )
)

Funkce zaokr_string(string)

Funkce zaokr_string (string) převede řetězec reprezentující číselnou hodnotu ("typu float") na řetězec reprezentující celočíselnou hodnotu. Funkce je volána s parametrem typu řetězec.

Vlastní kód funkce:

(defun zaokr_string (string)
         ;;; funkce pro převod řetězce reprezentujícího reálné číslo
         ;;; na řetězec reprezentující celé číslo
 (setq str (atoi string))
         ;;; převede řetězec na celé číslo
 (setq string (vl-princ-to-string str))
         ;;; převede číslo na řetězec
)

Funkce so:vazba_prvku()

Funkce so:vazba_prvku() provádí svázání prvků editbox a slider na odpovídající hodnoty. Funkce so:vazba_prvku() nejprve otestuje jestli akce v dialogovém boxu byla typu 1 nebo 2 (vybrání prvku nebo opuštění editboxu). Jestli ano tak je hodnota získaná z dialogového prvku převedena na hodnotu typu reálné číslo a uložena v proměnné edit_hodnota. Následně jsou zkontrolovány rozsahy zadávaných hodnot, případně nastaveny na správné hodnoty. Po provedení korekcí jsou již správné hodnoty uloženy do asociačního seznamu a nastaveny v dialogovém panelu.

Vlastní kód funkce:

(defun so:vazba_prvku (val why editbox slider)
         ;;; funkce pro nastavení odpovídajících prvků na stejné hodnoty
         ;;; příklad editbox1 a slider1 atd.
         ;;; val - nastavovaná hodnota
         ;;; why - určuje jaká akce uživatele vyvolala akci dialogového prvku
         ;;; editbox - jméno prvku typu editbox
         ;;; slider - jméno odpovídajícího prvku typu slider

 (if (or (= why 2) (= why 1))
         ;;; zjištění jaká akce uživatele způsobila akci dialogu
         ;;; 2 = opuštění editboxu
         ;;; 1 = uživatel vybral prvek (příklad ENTREM)

  (progn
   (setq edit_hodnota (atof val))
         ;;; převedení řetězce reprezentujícího nastavenou hodnotu na číslo

   (if (> edit_hodnota 100)
    (setq val "100")
         ;;; je-li číslo mimo rozsah prvku, proveď korekci
   )
   (if (< edit_hodnota 0)
    (setq val "0")
         ;;; je-li číslo mimo rozsah prvku, proveď korekci
   )
   (if (and (= editbox "pocvrcholune") (< edit_hodnota 3))
    (setq val "3")
         ;;; kontrola zadání počtu vrcholů n-úhelníku < 3
   )
   (if (and (= editbox "polomerne") (< edit_hodnota 30))
    (setq val "30")
         ;;; kontrola zadání poloměru opsané kružnice n-úhelníku < 30
   )

   (set_tile editbox val)      ;;; nastavení editboxu na správnou hodnotu
   (set_tile slider val)       ;;; nastavení slideru na správnou hodnotu

   (setq gl_pam_hodnoty
    (subst 
     (cons editbox val) 
     (assoc editbox gl_pam_hodnoty) 
     gl_pam_hodnoty
    )
   )
   (setq gl_pam_hodnoty
    (subst 
     (cons slider val)
     (assoc slider gl_pam_hodnoty)
     gl_pam_hodnoty
    )
   )
  )
 )
)