(defun c:SObjekty ()
;;; definice nové funkce kresli
  (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-ova souřadnice středu sostř. kružnic
	(cons "stredkey"     "0.0")		;;; y-ova souřadnice středu sostř. kružnic
	(cons "stredkez"     "0.0")		;;; z-ova souřadnice středu sostř. kružnic
	(cons "strednex"     "0.0")		;;; x-ova souřadnice středu sostř. n-uhelníků
	(cons "stredney"     "0.0")		;;; y-ova souřadnice středu sostř. n-uhelníků
	(cons "strednez"     "0.0")		;;; z-ova souřadnice středu sostř. 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")		;;; poloměr n - úhelníku (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 (slider)
	(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")		;;; zadání hodnot pomocí příkazového řádku
    (if	(= (so:zadej_hodnoty) T)
      (so:vykresli)			;;; vykreslení požadovaného objektu,
      					;;; v případě že byly zadány hodnoty
    )
  )
  (if (= zadani "dialog")		;;; adání hodnot pomocí dialogového boxu
    (if	(= (so:dialog) T)
      (so:vykresli)			;;; vykreslení požadovaného objektu,
      					;;; v případě že byly zadány hodnoty  
    )
  )
  (princ "Funkce c:SObjekty dokončila činnost")	;;; informace o ukončení funkce
  (princ)
)

 
(defun so:dialog (/ id co_delat vysledek)
  (princ "Tady bude v budoucnu dialogový box!")
  T						;;; aby se daly otestovat i návazné funkce
)


(defun so:naskruh ()
  (princ "Tady bude nastavení všech přepínačů dialogového boxu pro volbu kružnice!")
  (princ)
)

(defun so:nasnuhe ()
  (princ "Tady bude nastavení všech přepínačů dialogového boxu pro volbu n-úhelníku!")
  (princ)
)

(defun zaokr_string (string)
  (princ "Tady bude převodní funkce řetězec reprezentující float -> řetězec reprezentující int!")
  (princ)
)

(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 nadřazené funkci
)

(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 ( 0 potvrzení zadání je ENTREM)
      (setq polomerk (getreal "\n Zadej poloměr kružnice: "))
      			;;; zjistě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í hodnoty poloměru kružnice do asoc. seznamu gl_pam_hodnoty

      (initget 1)	;;; kontrola zadání číselné hodnoty ( 0 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 ( 0 potvrzení zadání je ENTREM)
      (setq vzdalenostk (getreal "\n Zadej vzdálenost mezi kružnicemi: "))
			;;; zadání vzdálenosti 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)
    )    
  )
  
  (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: "))
			;;; zadání početu 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
      (initget 7)	;;; kontrola zadání číselné hodnoty (zakaz zadání
      			;;; záporné hodnoty a 0), potvrzení zadání je ENTREM
      (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
      (setq pocetn (getint "\n Zadej počet n-úhelníků: "))
			;;; zadání hodnoty početu kreslených n-úhelníků
      (initget 7)	;;; kontrola zadání číselné hodnoty (zakaz zadání
      			;;; záporné hodnoty a 0), potvrzení zadání je ENTREM
      (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
      (setq vzdalenostn (getreal "\n Zadej vzdálenost mezi n-úhelníky: "))
			;;; zadání vzdálenosti 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 minimální 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
        )
      )			;;; ošetření chybného zadání

      (if (< polomerne 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 "polomerne" "30")
	      (assoc "polomerne" gl_pam_hodnoty)
	      gl_pam_hodnoty
	    )
          )		;;; oprava hodnoty v proměnné gl_pam_hodnoty
	)
      )
      (setq vysledek T)
    )
  )
  vysledek
)

(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
  )
)

(defun so: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
        )
      )
    )
  )
)

(defun so:kresli_nuhelnik (/ stred_nu pocvrcholu polomer pol_kresl pocet vzdalenost)
;;; vykreslení n-úhelníku
;;;; stred_nu   - souřadnice středu (real.číslo, real.číslo, real.číslo)
;;;; pocvrcholu - celé číslo reprezentující počet vrcholů n-úhelníku
;;;; polomer    - real.číslo reprezentující poloměr první vepsané kružnice
;;;; pol_kresl  - real.číslo reprezentující poloměr vepsaných kružnic
;;;; pocet      - celé číslo reprezentující počet kreslených soustředných n-úhelníků
;;;; vzdalenost - real.číslo reprezentující 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 tří řetězců reprezentujících souřadnice
  		;;; do proměnné stred (položky stred jsou typu float)
  (setq pocvrcholu (atoi (cdr (assoc "pocvrcholune" gl_pam_hodnoty))))
		;;; získání počtu vrcholů n-úhelníku z asoc. seznamu gl_pam_hodnoty
  (setq polomer    (atof (cdr (assoc "polomerne"    gl_pam_hodnoty))))
		;;; získání poloměru první vepsané kružnice z asoc. seznamu gl_pam_hodnoty
  (setq pocet      (atoi (cdr (assoc "pocetne"      gl_pam_hodnoty))))
		;;; získání početu kreslených n-úhelníků z asoc. seznamu gl_pam_hodnoty
  (setq vzdalenost (atof (cdr (assoc "vzdalenostne" gl_pam_hodnoty))))
		;;; získání vzdálenosti mezi n-úhelníky z asoc. seznamu gl_pam_hodnoty
  (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í aktuálního poloměru vepsané kružnice, kresleného n-uhelníku
    (command "_polygon" pocvrcholu stred_nu "O" pol_kresl)
    		;;; vykresli n-úhelníku
    (setq pocet (- pocet 1))	;;; zmenši počet n-úhelníků o 1
  )
)

(defun so:kresli_kruznici (/ stred_kr polomer pol_kresl pocet vzdalenost)
  (princ "Tady bude vykreslení kružnice - ponecháno pro zkoušku uživatelkem!")
  (princ)
)

(defun so:vazba_prvku (val why editbox slider)
  (princ "Tady bude provázání odpovídajících dialogových prvků (slider - editbox)!")
  (princ)
)

(princ "\nFunkce se spouští příkazem  (c:SObjekty)  v IDE Visual LISPu")
(princ "\nFunkce se spouští příkazem  SObjekty v AutoCADu")