Při tvorbě uživatelského rozhraní využívejte maximálně obrázku výsledného dialogového okna. Všímejte si hlavně hierarchického uspořádání jednotlivých prvků. Uspořádání vám pomůže při vlastní tvorbě dialogu.
Aby byl kód funkce co nejefektivnější, rozdělíme aplikaci na tři funkce:
Další doporučení:
Pro uživatele, kteří zabloudili při tvorbě kódu uvádíme jednotlivé ucelené části kódu. Pokud si nebudete jisti funkcí některého příkazu, stačí kliknout nad příkazem a zobrazí se Vám referenční příručka se zobrazeným příkazem.
zoom:dialog { // jméno nového dialogového boxu label = "Změna měřítka"; // název vypsaný na otevřeném dialogu otevřeného dialogu :boxed_row { // uspořádání prvků do orámovaného řádku label = "Zadání hodnoty"; // název orámované části vypsaný v dialogu :boxed_column { // uspořádání prvku do orámovaného sloupce label = "Slider"; // název orámované části vypsaný v dialogu :slider { // definice vlastností dialogového prvku SLIDER key = "slider"; // klíč sloužící k identifikaci dialogového prvku při // programovém zpracování v AutoLISPu nebo ADSRX min_value = 1; // min. hodnota jezdce max_value = 10; // max. hodnota jezdce } } :boxed_column { // uspořádání prvku do orámovaného sloupce label = "Edit box"; // název orámované části vypsaný v dialogu :edit_box { // definice vlastností dialogového prvku edit_box key = "editbox"; // klíč sloužící k identifikaci dialogového prvku při // programovém zpracování v AutoLISPu nebo ADSRX } } } :boxed_radio_column { // orámovaná skupina radio_tlačítek key = "vyber"; // klíč sloužící k identifikaci dialogového prvku // při programovém zpracování v AutoLISPu nebo ADSRX label = "Volba typu"; // název skupiny radio_tlačítek vypsaný v dialogu :radio_button { // definice vlastností dialogového prvku radio_button key = "zvetseni"; // klíč sloužící k identifikaci dialogového prvku při // programovém zpracování v AutoLISPu nebo ADSRX label = "Zvětšení"; // název radio_tlačítka vypsaný v dialogu } :radio_button { // definice vlastností dialogového prvku radio_button key = "zmenseni"; // klíč sloužící k identifikaci dialogového prvku při // programovém zpracování v AutoLISPu nebo ADSRX label = "Zmenšení"; // název radio_tlačítka vypsaný v dialogu } } ok_cancel; // předdefinovaný dialogový prvek, zde tlačítka OK a CANCEL }
(defun c:meritko () ;;; definice nové funkce meritko (setq id (load_dialog "d:/meritko.dcl")) ;;; předání jména dialogového boxu (if (not (new_dialog "zoom" id)) (exit) ) ;;; v případě nesouhlasného jména dialogového ;;; panelu (v našem případě zoom - jméno na začátku ;;; souboru.dcl) ukončí činnost (setq hodn 1) ;;; nastavení pomocné proměnné - hodnota zvěšení (set_tile "vyber" "zvetseni") ;;; nastavení radiotlačítka "zvetseni" ze skupiny ;;; "vyber" na aktivní = zvýrazněné (action_tile "slider" "(slider_action $value $reason)") ;;; získání hodnoty při aktivaci dialogového prvku ;;; "slider" a zavolání funkce slider_action ;;; s parametry hodnota a důvod (action_tile "editbox" "(ebox_action $value $reason)") ;;; získání hodnoty při aktivaci dialogového prvku ;;; "editbox" a zavolání funkce ebox_action ;;; s parametry hodnota a důvod (action_tile "zvetseni" "(setq radio 0)") ;;; při zmáčknutí radio_tlačítka "zvetseni" ;;; se nastaví proměnná radio na 0 (action_tile "zmenseni" "(setq radio 1)") ;;; při zmáčknutí radio_tlačítka "zmenseni" se ;;; nastaví proměnná radio na 1 (action_tile "accept" "(progn (done_dialog) (setq ok 1) )" ) ;;; při aktivaci tlačítka "accept" = OK se ukončí dial. box ;;; a nastaví se pomocná proměnná signalizující, že dial. box ;;; byl ukončen tlačítkem OK = potvrzení změn (action_tile "cancel" "(progn (term_dialog) (setq ok 0) )" ) ;;; při aktivaci tlačítka "cancel" = ZRUS se ukončí ;;; dial. box a nastaví se pomocná proměnná signalizující, ;;; že dialogový box byl zrušen = nepotvrdit změny (start_dialog) ;;; zahájen dialogu (unload_dialog id) ;;; odstranění dialogu ;;; zpracování/nezpracování hodnot získaných z dial. boxu (if (= ok 1) ;;; dialog ukončen OK: (progn (if (= radio 0) ;;; rozhodnutí zda zvětšovat/zmenšovat podle hodnoty ;;; radio_tlačítek (command "zoom" "_S" hodn) ;;; zvětšení (progn (setq hodn (/ 1.0 hodn)) (command "zoom" "_S" hodn) ;;; zmenšení ) ) ) ;;; CANCEL: (setq ok 0) ;;; vrácení pomocné proměnné na 0 ) )
Při vyvolání akce posuvníku SLIDER je nutné nastavit odpovídající hodnotu v
prvku EDIT_BOX. Toto nastavení vám umožní funkce slider_action:
(defun slider_action (val why) ;;; funkce, která v případě aktivace slideru nastaví ;;; odpovídající hodnotu v edit_boxu (if (or (= why 2) (= why 1)) ;;; v případě splněných podmínek nastav edit_box, ;;; 1 = zmáčknutí entru, 2 = selekce z edit_boxu (progn (set_tile "editbox" val) ;;; nastavení hodnoty v edit_boxu (setq hodn (atoi val)) ;;; nastavení pomocné proměnné hodnota zvětšení z proměnné ;;; val pomocí konverze_string -> integer ) ) )
Při vyvolání akce textového pole EDIT_BOXu je nutné nastavit odpovídající hodnotu v prvku SLIDER. Toto nastavení Vám umožní funkce ebox_action:
(defun ebox_action (val why) ;;; funkce, která v případě aktivace edit_boxu nastaví ;;; odpovídající hodnotu na slideru (setq hodn (atoi val)) ;;; nastavení pomocné proměnné hodnota zvětšení z proměnné ;;; val pomocí konverze_string -> integer (if (> hodn 10) ;;; v případě, že je hodnota zvětšení/zmenšení větší než 10 ;;; (max. hodnota slideru), pak nastav zvětšení/zmenšení na 10 (progn (setq val "10") (set_tile "editbox" val) ) ) (if (or (= why 2) (= why 1)) ;;; v případě splněných podmínek nastav slider ;;; 1 = zmáčknutí entru, 2 = selekce z edit_boxu (set_tile "slider" val) ) )