(defun so:dialog (/ id co_delat vysledek)

  (setq id (load_dialog "d:/vyber.dcl"))	;;; předání jména dialogového boxu
    ;;; CESTU K UMÍSTĚNÍ DIALOGU SE MUSÍ AKTUALIZOVAT PODLE AKTUALNÍHO UMÍSTĚNÍ

  (setq co_delat 2)
  (while (>= co_delat 2)			;;; opakuj pokud nenastane zmena
    (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)

    ;;; 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 funkci (so:nasnuhe)
		;;; je-li vybrána položka popup_listu "Kružnice" zavolej funkci (so: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 funkci 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 odpovídající 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 odpovídající 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 tlačítko "accept"
    		;;; zavolej funkci done_dialog s hodnotou 1
    (action_tile "cancel" "(done_dialog 0)")
		;;; je-li zmáčknuto tlačítko "cancel"
    		;;; zavolej funkci done_dialog s hodnotou 0
    (if (= (cdr (assoc "co_kreslit" gl_pam_hodnoty)) "Kruznice")
			;;; je-li nastaveno kresleni kruznice
      (so:naskruh)	;;; zavolej fukci (so:naskruh)
    )
    (if (= (cdr (assoc "co_kreslit" gl_pam_hodnoty)) "N-uhelnik")
			;;; není-li nastaveno kresleni n-úhelníku
      (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 funce
      ((= co_delat 1) (setq vysledek T))	;;; uživatel potvrdil dialog,
      						;;; zavolej funkci (vykresli)
      ((= co_delat 4) (so:nastav_stred (getpoint "\nVýběr bodu:")))
				;;; uživatel zmáčkl tlačítko pro zadání souřadnic středu
	    			;; zavolej funkci nastav_střed
    )
  )
  (unload_dialog id)		;;; odstraní dialog id z paměti
    vysledek			;;; vrácení výsledku funkce (jestli proběhla OK)
)


(defun so:naskruh ()
;;; nastavení hodnot (přepínačů) a viditelnosti prvků pro   nabídku kružnice
  (setq gl_pam_hodnoty 
    (subst
      (cons "co_kreslit" "Kruznice")
      (assoc "co_kreslit" gl_pam_hodnoty)
      gl_pam_hodnoty
    )
  )			;;; nastavení aktuálního objeku v asoc. seznamu na hodnotu "Kruznice"

  (set_tile "kruznice" "1")	;;; nastavení radio_buttunu "kruznice" jako zvýrazněný
  (set_tile "nuhelnik" "0")	;;; nastavení radio_buttunu "n uhelnik" jako nezvýrazněný
  (set_tile "popup"    "1")	;;; nastavení 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_boxuu "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"
)
  


(defun so:nasnuhe ()
;;; nastavení hodnot (přepínačů) a viditelnosti prvků pro   nabídku n-úhelník
  (setq gl_pam_hodnoty 
    (subst
      (cons "co_kreslit" "N-uhelnik")
      (assoc "co_kreslit" gl_pam_hodnoty)
      gl_pam_hodnoty
    )
  )		;;; nastavení aktuálního objeku v asoc. seznamu na hodnotu "Kruznice"
  
  (set_tile "kruznice" "0")	;;; nastavení radio_buttunu "kruznice" jako nezvýrazněný
  (set_tile "nuhelnik" "1")	;;; nastavení radio_buttunu "n uhelnik" jako zvýrazněný
  (set_tile "popup"    "0")	;;; nastavení popup_listu 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_boxuu "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" 
)

(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))
;;; zjistení jaká akce uživatele způsobila akci dialogu
;;; 2 = opustě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 jestli nezadáváme počet vrcholů n-úhelníku <   3
      )
      (if (and (= editbox "polomerne") (< edit_hodnota 30))
	(setq val "30")	;;; kontrola jestli nezadáváme poloměr opsané kružnice n-úhelníku   < 3
      )
      (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
	)
      )
    )
  )
)