Uživatelské aplikace návrh GUI části programu v Matlabu přednáška předmětu A2B99MAA, 12.týden Miloslav Čapek K13117, B2-819
Obsah přednášky grafické rozhraní jako část programu koncepce v Matlabu, identifikátory objektů vlastnosti grafických objektů (set, get, uložení reference) callback funkce (tvorba, volání, editace) jednotlivé grafické objekty přehled root (funkce monitor), figure axes, axis ui-objekty kontextové menu, kurzor, ikony, menu předdefinované bloky techniky návrhu grafického rozhraní návrh jednoduchého programu (rozbor, návrh, test) I. příklady realizovaných aplikací dotazy, diskuze literatura program cvičení II.
Programování v MATLABu ZNALOST tvorby funkčního kódu (funkce, matice, indexace) ZNALOST tvorby vlastních funkcí (hlavní, vedlejší, ) ZNALOST efektivního návrhu a programování Matlabu GUI TVORBA plnohodnotné aplikace/toolboxu/ 1/63
GUI (Graphical User Interface) user uživatel? GUI aplikace function3 function1 function2 GUI: Rozhraní, které umožňuje uživateli působit na běh programu a program jako takový ovládat. 2/63
Příklad grafického rozhraní Počáteční stav Konečný stav funkce programu 1) co má GUI umět (všechny funkce a ability budoucí aplikace)? 2) vstupy, výstupy a práva uživatele 3) seznam operací, event. nákres na papír 3/63
GUI v Matlabu ukázky1 4/63
GUI v Matlabu ukázky2 5/63
GUI v Matlabu ukázky3 6/63
Koncepce grafického systému Matlabu grafické funkce Matlabu lze rozdělit na: funkce vyšší úrovně funkce nižší úrovně funkce obsluhují v obou případech sadu grafických objektů (většina bude probrána dále) na vyšší úrovni přistupujeme k jednotlivým funkcím a vlastnosti objektů ovlivňujeme pouze parametry volané funkce na nižší úrovni vyvoláváme přímo objekty a pracujeme s nimi (můžeme tedy měnit fonty, barvy, tloušťky čar a další) 7/63
2D grafy v Matlabu (vyšší úroveň) root >> plot(linspace(1,10,10)) >> stem(linspace(1,10,10)) >> % a další 8/63
3D grafy v Matlabu (vyšší úroveň) root >> [X,Y] = meshgrid(-3:.125:3); >> Z = sin(x) + cos(y); >> mesh(x,y,z); >> axis([-3 3-3 3-2 2]) 9/63
Z čeho je složen GUI Matlabu? monitor ~ root okno aplikace ~ figure kreslící prostor ~ axes grafické prvky ~ uiobjects 10/63
Nižší úroveň tvorby grafiky v Matlabu objekty jsou rozděleny podle logické závislosti root figure uibottongroup uiobjects uicontrol uicontextmenu axes uimenu Core objects Plot objects Group objects line, text, surface, patch, image, uipanel uitoolbar uitable uipushtool uitoggletool Annotation objects kompletní rozdělení je velmi komplikované 11/63
Přehled ui- objektů uitoolbar uimenu uitable uicontextmenu uipanel uibottongroup uicontrol 12/63
Přehled uicontrol text edit pushbutton checkbox popupmenu slider togglebutton radiobutton listbox uitable axes uibuttongroup uipanel 13/63
Příklad: moje tlačítko (uiobjekt) vytvořím tlačítko moje tlačítko klik function myfunc(pushref,event) % tato funkce je vedlejsi % pushref: reference na objekt % moje tlačítko % event: další informace o události telo funkce end vlastnost typ uiobjektu font písma velikost písma řez písma barva písma rozměr tlačítka umístění tlačítka barva tlačítka moje tlačítko pushbutton MS Sans Serif 11 bold k (black) [0.48 0.84 0.2 0.13] normalized y možná nastavení edit / text / Arial / Verdana / {1, } normal / italic [r g b] normalized / pixels [x1 y1 x_size y_size] (viz dále) [r g b] callback funkce @myfunc(scr,evnt) jakákoliv definice callback funkce 14/63
Identifikátor objektu (handle) Každý samostaný objekt má Matlabu handle). svůj identifikátor (řečí Tyto handely jsou v podstatě referencí na existující objekt. Handle Matlab vytvoří vždy, je na uživateli jeho uchování. Složité grafy (vrstevnice) mohou mít více identifikátorů. root má vždy handle = 0, figure zpravidla celé kladné číslo, ostatní objekty mají za handle kladné reálné číslo. handely >> fighandle = figure; >> axhandle = axes; Číslo uložené v proměnné fighandle existuje i po uzavření okna, již se ale nejedná o handle. 15/63
Vlastnosti objektu všechny objekty mají množinu vlastností, které říkají, jak bude objekt zobrazen a jak s ním bude zacházeno objekt je tvořen množinou implicitních hodnot vlastností tyto hodnoty můžeme číst a ve většině případů i nastavit názvy vlastností nejsou case sensitive, dokonce lze některé názvy vlastností i zkrátit, pokud stále vyjadřují danou vlastnost >> figure('color','b'); >> figure('color','b'); >> fighandle = figure('position',[100 100 200 200]); >> fighandle = figure('pos',[100 100 200 200]); vlastnosti lze definovat dvojím způsobem: při vzniku objektu později po vytvoření objektu pomocí funkce set 16/63
Společné vlastnosti následující vlastnosti jsou společné všem objektům: ButtonDownFcn Children Clipping CreateFcn, DeleteFcn ChangeFcn BusyAction HandleVisibility Interruptible Parent Selected SelectionHighlight Tag Type UserData Visible Funkce, která se spustí při stisku myši nad objektem axes. Bude popsáno dále. Identifikátory (handely) všech potomků tohoto objektu. Umožní / zakáže ořezávání. Funkce, která se spustí při vytvoření (před zobrazením) / smazání objektu. Funkce, která se spustí při změně objektu. Řídí mód přerušení callback funkcí (řazení do fronty / zahazování). Určuje viditelnost identifikátorů objektů. Určuje, zda je možno přerušit callback funkci (její vykonávání). Identifikátor rodiče (nadřazeného objektu, viz schéma). Indikuje, zda byl objekt vybrán můžeme se ptát, zda je objekt aktivní. Určuje, zda se objekt po vybrání zvýrazní. Uživatelem specifikovaný popis objektu (vhodný pro pozdější správu a hledání obj). Typ objektu ( figure / edit / text / ) Místo, kam si může uživatel uložit libovolná data pro vlastní použití. Určuje, zda je objekt viditelný. 17/63
Funkce set pokud jsme nenastavili hodnotu vlastnosti při vzniku objektu, nebo ji chceme změnit, použijeme funkci set set(hndl,'propertyname',propertyvalue,...) vytvoříme osy dodatečně změníme jejich barvu dodatečně přidáme y-ovou mřížku >> axes; >> set(gca,'color','y'); >> set(gca,'ygrid','on'); funkce set lze využít na všechny grafické objekty 18/63
Funkce get můžeme vyvolat hodnotu vlastnosti grafického objektu PropertyValue = get(h,'propertyname'); ponechme strukturu z minulého slajdu a najděme barvu a velikost os >> axcolor = get(gca,'color') axcolor = 1 1 0 >> axsize = get(gca,'pos') axsize = 0.1300 0.1100 0.7750 0.8150 funkce get lze využít na všechny grafické objekty, více informací viz help get 19/63
Implicitní vlastnosti všechny vlastnosti mají své implicitní (~defaultní) hodnoty lze definovat i vlastní implicitní hodnoty postup hledání (dokud není nalezena implicitní hodnota zadaná uživatelem, nebo vestavěná) aktuální objekt postupně předci objektu >> set(gcf, DefaultLineColor, w ) na jaký(é) objekt(y) klíč. slovo typ objektu vlastnost zadáním hodnoty factory nastavíme vlastnost na vestavěnou hodnotu pokud chceme definovat některé hodnoty trvale (vždy), využijeme skript startup.m popisovaný v minulé přednášce 20/63
GUI: pozice a rozměry Matlab slučuje velikost objektu a jeho umístění do jedné matice dva způsoby zadání absolutně v pixelech (A) normalizovaně (B) [left bottom width height] %% A) uicontrol('units',pixels',... 'Style','Text','Position',[50 150 75 25],... %% B) uicontrol('units','normalized',... 'Style','Text','Position',[.05.12 0.075 0.02],... 21/63
Callback funkce Nad každým objektem jsou definované operace, které může uživatel využít (klik na tlačítko, výběr z nabídky, ). Tyto operace jsou obsluhovány pomocí tzv. callback funkcí. Jinak řečeno, pokud uživatel klikne na tlačítko, aktivuje se callback funkce této události (je-li definována). Pokud nemá být GUI statický, musí vždy obsahovat alespoň jednu callback funkci. Hodnoty callback funkcí jsou uloženy jako vlastnosti objektu lze je měnit, mazat, kopírovat function soucet(a,b) % secte dve zadana cisla vytvoreni GUIe, definice callback funkce (funkce na zadani hodnot) function mojetlacitko(hndl,evnt) telo vedlejsi funkce end end klik aktivace callback funkce function mojetlacitko(hndl,evnt) % provede secteni cisel nacti hodnoty a, b c = a + b; uloz c, resp. vypis vysledky end 22/63
Typy callback funkcí Callback CellEditCallback CellSelectionCallback ButtonDownFcn ClickedCallback CreateFcn, DeleteFcn OffCallback, OnCallback ResizeFcn SelectionChangeFcn KeyPressFcn KeyReleaseFcn WindowButtonDownFcn WindowButtonMotionFcn WindowButtonUpFcn WindowKeyPressFcn WindowKeyReleaseFcn WindowScrollWheelFcn CloseRequestFcn Provede context menu, se při uiobjects typickém užití ui komponenty (klik tlačítka, vyběr menu,...). Reaguje uitable na změnu hodnoty v tabulce uitable. Reaguje uitable na výběr libovolné buňky v tabulce uitable. Vyhodnotí axes, figure, se button vždy, když group, je panel, kurzor uiobjects nad objektem axes a klikne se myší. Reaguje push tool, na toggle klik myši tool na tlačítka push nebo toggle. Vyhodnotí axes, button se group, právě context pokud je menu, daný objekt figure, vytvořen menu, panel, / smazán. uiobjects, Vyhodnotí toggle tool se, pokud je stav toggle tlačítka změněn na off / on. Aktivuje figure, panel, se, když button uživatel groupzmění velikost figure, panel nebo button group. Reaguje button group na změnu aktivního knoflíku, nebo toggle tlačítka ve skupině. Zavolá figure, uiobjects callback, pokud je stisknuta klávesa (a figure aktivní). Zavolá figure callback, pokud je uvolněn stisk klávesy (a figure aktivní). Reaguje figure na klik myši (libovolné tlačítko) uvnitř figure. Reaguje figure na pohyb myši uvnitř figure. Reaguje figure na uvolnění stisku tlačítka myši (libovolné tlačítko) uvnitř figure. Reaguje figure na stisk (tl/kl), pokud je figure nebo některý jeho potomek aktivní. Reaguje figure na uvolnění stisku (tlačítka/klávesy), pokud je figure nebo -//-. Reaguje figure na pohyb rolovacího kolečka myši (pokud je figure aktivní). Volá figurecallback funkci právě pokud je uzavíráno aktivní okno figure. 23/63
Vyhodnocení callback funkce zpravidla má každá eventualita vlastní callback (výběr Ano má jiný callback než výběr Ne ) callback funkce je vyhodnocena jako řetězec (funkcí) eval je vyhodnocena v základním pracovním prostoru Matlabu tomu odpovídají možné strategie zápisu: >> hb = uicontrol('style','pushbutton','string','plot line') >> set(hb,'callback','plot(rand(20,3))') % definice callback funkce >> set(hb,'callback','plot(myvar)') % zmena callback funkce figure uicontrol('style','slider',... 'Callback',@dispSliderValue); function display_slider_value(... hobject,eventdata) disp(['slider moved to '... num2str(get(hobject,'value'))]); set(hb,'callback',@(scr,event)plotfcn(xdata,ydata,graphcolor)); 24/63
Funkce findobj najde objekt(y) s požadovanou vlastností vrací jejich identifikátor (event. pole indentifikátorů) h = findobj h = findobj('propertyname',propertyvalue,...) >> fighndl = gcf % fighndl = figure; >> axshndl = gca % axshndl = figure; >> htx1 = uicontrol('style','text','string','hello','tag','tx'); >> htx2 = uicontrol('style','text','string','test1','tag','tx2'); >> h = findobj('style','text') h = 0.0072 171.0071 >> h = findobj('style','text','-and','tag','tx') h = 0.0072 25/63
Funkce findall, allchild findall: najde všechny grafické objekty (včetně skrytých), handle_list může být např. gcf object_handles = findall(handle_list) object_handles = findall(handle_list,'property','value',...) allchild: najde všechny potomky vybraného objektu (včetně skrytých) pokud je handle_list vektor indentifikátorů, vrací Matlab pole buněk child_handles = allchild(handle_list) empty matrix >> axes >> get(gca,'children') >> allchild(gca) 4 handely 26/63
Funkce gcf, gca a gco slouží k jednoduchému přístupu k identifikátorům objektů, které jsou právě aktivní, konkrétně jde o: gcf (vrací identifikátor aktuálního objektu figure) gca (vrací identifikátor aktuálního objektu axes) gco (vrací identifikátor objektu, na který se naposledy kliklo myší, tolerance u čar je 5 pixelů) >> figure >> fighandle = gcf; tyto funkce můžeme využít jako vstupní identifikátor pro jiné funkce vyžadující handle objektu figure nebo axes >> set(gcf,'color',[0 0 0]) 27/63
Funkce ishandle jedna z mnoha funkcí detekujících stav v Matlabu (is*) ishandle vrací true, je-li argument funkce handle, v opačném případě vrací false >> fighndl = figure; >> ishandle(fighndl) ans = 1 >> delete(fighndl) >> ishandle(fighndl) ans = 0 28/63
Funkce copyobj tyto funkce umožňují ovlivnit životní cyklu objektu copyobj: zkopíruje objekt a jeho potomky new_handle = copyobj(h,p) >> hf = figure >> ha = axes >> hl1 = line([.1.8],[0.5 0.5]) >> hl2 = copyobj(hl1,ha) >> ishandle(hl1) && ishandle(hl2) ans = 1 29/63
Funkce delete a reset tyto funkce umožňují ovlivnit životní cyklu objektu delete: odstraní soubor(y) nebo grafický objekt(y) i s jeho potomky delete(filename1, filename2,...) delete(handle_array) >> delete(hf) % viz predesly priklad >> ishandle(hl1) && ishandle(hl2) ans = 0 reset: nastaví všechny hodnoty objektu zpět na implicitní reset(h) 30/63
root (vlastnosti monitoru) v Matlabu odpovídá obrazovce počítače je unikátní (handle = 0) všechny další objekty jsou potomky >> dispnfo = get(0); >> dispsize = get(0, ScreenSize ); >> figsize = [400 200]; >> fighndl = figure( pos,... [(dispsize(3)-figsize(1))/2... (dispsize(4)-figsize(2))/2... figsize(1) figsize(2)]); 200 400 [760 500] [left bottom width height] vytvoří okno (figure) o velikosti figsize(1) x figsize(2) přesně uprostřed obrazovky 31/63
figure objekt figure vytváří samostatné grafické okno všechny event. okna jsou potomkem objektu root všechny podružné grafické objekty jsou potomkem objektu figure a jsou v daném okně zobrazeny voláme-li podružnou funkci bez existence okna, vytvoří se nové figure má mnoho vlastností (viz get(figure)) >> figure; >> fighandle =... figure( Color, r ); >> axes; 32/63
axes, axis definují oblast v grafickém okně, kam jsou umísťovány potomci objektu axes nejčastější využití axes ja jako os grafu/obrázku (2D i 3D) všechny podružné objekty k objektu axes generují osy i pokud zatím neexistují (podobně jako u figure) axes má mnoho vlastností (viz get(axes)) >> line([.1.9],[0 1],'LineWidth',3) >> axis([0 1 0 1]) >> fighndl = gcf fighndl = 1 >> axshndl = gca axshndl = 171.0031 >> line([.8.2],[.1.6],'linewidth',2) >> axis([0 2 0 1]) 33/63
line, patch, surface, image, text line: využíváme při tvorbě grafů (plot, plot3, contour, ) patch: vyplněné (barevné) mnohoúhelníky, funkce fill, fill3 surface: čtyřúhelníky (vrcholy definované prvky třírozměrné matice), mohou být kresleny jako plné (pcolor, surf), barevně interpolované, nebo drátové (mesh) image: výsledek transformace prvků matice na indexy aktuální mapy barev (generovány funkcí image) text: znakové řetězce (text, gtext, title, xlabel,ylabel,zlabel) všechny tyto objekty jsou potomky objektu axes (tj. lze je realizovat pouze nad tímto objektem vykreslení v osách) ke všem objektům lze přistupovat i přímo, tvořit je, nastavovat a měnit jejich vlastnosti, kopírovat a mazat je 34/63
Skupina uiobjects: uimenu lze definovat klávesové zkratky (např. CTRL+L) v menu se lze pohybovat pomocí ALT+písmeno callback funkce lze přiřadit 490 řádek kódu uiobjects uimenu uicontextmenu uipanel uitoolbar uicontrol uitable uibottongroup více viz help uimenu 35/63
Skupina uiobjects: uicontextmenu vytvoří kontextové menu lze ho vyvolat pravým klikem myši výběr položky z menu aktivuje zadaný callback uiobjects >> fighndl = figure; >> cmenu = uicontextmenu; >> axshndl = axes('parent',fighndl,'uicontextmenu',cmenu); >> uimenu(cmenu,'label','vyber1','callback',@callbackfcn1); >> uimenu(cmenu,'label','vyber2','callback',@callbackfcn2,... 'Separator','on'); >> uimenu(cmenu,'label','vyber3','callback',@callbackfcn3); uimenu uicontextmenu uipanel uitoolbar uicontrol uitable uibottongroup 36/63
Skupina uiobjects: uipanel vytvoří panel, který je rodičem dalších objektů (uicontrol) objekty uvnitř jsou orientovány vzhledem k panelu uiobjects uimenu uicontextmenu uipanel >> fghnd = figure; >> h1p = uipanel('title','hlavni panel',... 'FontSize',12,'BackgroundColor',... 'white','position',[.25.25.4.25]); >> h2p = uipanel('parent',h1p,... 'Title','sub-panel','FontSize',12,... 'Position',[.25.25.7.7]); uitoolbar uicontrol uitable uibottongroup lze nastavovat barvu pozadí, šírku rámečku a mnoho dalšího více viz help uipanel 37/63
Skupina uiobjects: uitable vytvoří 2D tabulku, komponent může být umístěn kdekoliv v okně figure uiobjects uimenu uicontextmenu uipanel uitoolbar >> figure >> t = uitable; >> set(t,'data',magic(10)); >> set(t,'columnwidth',{35}) uicontrol uitable uibottongroup tabulka může mít celou řadu vlastností i prvků (check, popup) callback funkce výběru změny buňky, více viz help uitable 38/63
Skupina uicontrol: text umístí na zvolené místo text zpravidla se využívá jako popiska dalších prvků nebo informační text pro uživatele lze nastavit font, řez, velikost, barva (textu i pozadí), uicontrol text edit pushbutton >> figure >> text1 = uicontrol(... 'Units','Normalized',... 'Style','Text',... 'Position',[.35.45 0.3 0.1],... 'Tag','txtMAA1',... 'FontSize',10,... 'BackgroundColor',[.8.5.8],... 'HorizontalAlignment','center',... 'String','Toto je text k MAA'); togglebutton radiobutton checkbox listbox slider popupmenu 39/63
Skupina uicontrol: edit umožňuje načíst řetězec programátor si tento řetězec musí dále zpracovat (užití funkcí str2num, str2double atp.) uživatel může pracovat i pomocí (CTRL+C,V,X,A,H) string obsahuje vložený řetězec pomocí edit lze vytvořit v Matlabu např. konzoly uicontrol text edit pushbutton togglebutton radiobutton checkbox listbox slider popupmenu 40/63
Skupina uicontrol: pushbutton jednostavové tlačítko callback funkce je vyvolána jeho stisknutím nastavení vzhledu je podobné jako u objektu text uicontrol text edit pushbutton togglebutton radiobutton checkbox listbox slider popupmenu 41/63
Skupina uicontrol: radiobutton stavy vybrán nevybrán (hodnoty max-min) tyto prvky lze sdružovat do větších skupin button group (objekt uibuttongroup) při vyvolání callback funkce lze získat informaci z kterého prvku uživatel přepnul na který uicontrol text edit pushbutton togglebutton radiobutton checkbox listbox slider popupmenu 42/63
Skupina uicontrol: checkbox podobné jako radiobutton zaškrtávácí políčko (s doprovodným textem) callback vyvolán změnou stavu uicontrol text edit function checkboxfcn(hobj) % osetreno %% zjisteni, zda je check vybran if (get(hobject,'value') % vybran %... else % nevybran %... end pushbutton togglebutton radiobutton checkbox listbox slider popupmenu 43/63
Skupina uicontrol: listbox zobrazuje seznam, lze vybrat jednu nebo i více položek vlastnost string obsahuje seznam řetězců (položek) vlastnost value obsahuje matici vybraných položek hodnoty max a min ovlivňují výběr uicontrol text edit pushbutton togglebutton radiobutton checkbox listbox slider popupmenu 44/63
Skupina uicontrol: slider na vstupu numerický rozsah (min-max) uživatel se pohybuje po skocích (sliderstep) jezdcem uicontrol text Požadujeme: rozsah: <2,10> krok tažením: 0.4 krok kliknutím: 1 počáteční hodnota: 6.5 slider_step(1) = 0.4/(10-2); slider_step(2) = 1/(10-2); set(sliderhndl, sliderstep,... slider_step, max,10,... min,2, Value,6.5); edit pushbutton togglebutton radiobutton checkbox listbox slider popupmenu 45/63
Skupina uicontrol: popupmenu klik na šipku zobrazí seznam, z něj lze vybrat jednu položku string obsahuje seznam řetězců value obsahuje index vybrané položky uicontrol text edit function popupfcn(hobj) % osetreno val = get(hobj,'value'); string_list = get(hobj,'string'); selected_string = string_list{val}; %... pushbutton togglebutton radiobutton checkbox listbox slider popupmenu 46/63
uitoolbar, colormap funkce lze využívat i ve vlastním GUIi (brush, pan, zoom, datacursormode) klik volání vlastní callback funkce takto je ikona nakreslena v m-souboru pics = [1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1;... 1.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6 1;... 1.6 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1.6 1;... 1.6 1 0 0 0 1 0 0 0 0 0 1 1 1 1 1 1.6 1;... 1.6 1 0 1 1 0 1 1 0 1 1 1 1 1 1 1 1.6 1;... 1.6 1 0 1 1 0 1 1 0 1 1 1 1 1 1 1 1.6 1;... 1.6 1 0 0 0 1 1 1 0 1 1 1 1 1 1 1 1.6 1;... 1.6 1 0 1 1 1 1 1 0 1 1 1 0 0 0 0 1.6 1;... 1.6 1 0 1 1 1 1 1 0 1 1 1 1 1 0 0 1.6 1;... 1.6 1 0 1 1 1 1 1 0 1 1 1 1 0 1 0 1.6 1;... 1.6 1 1 1 1 1 1 1 1 1 1 1 0 1 1 0 1.6 1;... 1.6 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1.6 1;... 1.6 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1.6 1;... 1.6 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1.6 1;... 1.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6 1;... 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1]; icon(:,:,1) =.85. * pics; icon(:,:,2) =.98. * pics; icon(:,:,3) =.85. * pics; vlastní barevné mapy, vlastní rozsahy, 47/63
Dialogové boxy v Matlabu nejčastější operace uživatel GUI jsou předdefinovány ty nejužívanější jsou zobrazeny níže (většina): user helpdlg msgbox warndlg errordlg GUI inputdlg listdlg questdlg file uigetdir uigetfile uiopen file uiputfile uisave user waitbar 48/63
Příklad1: msgbox msgbox zobrazí zprávu pro uživatele h = msgbox(message,title); h = msgbox(message,title,'custom',icondata,iconcmap); >> h = msgbox({'toto je zprava pro studenty MAA.',... 'ZDE muze byt text'},'moje zprava') 49/63
Příklad2: questdlg questdlg zobrazí otázku, vrátí odpověď (okno je modal) button = questdlg('qstring') button = questdlg('qstring','title',... 'str1','str2','str3',default) >> button = questdlg('ukoncit aplikaci?',... 'Konec aplikace','ano','ne','ano') 50/63
Příklad3: uigetfile uigetfile uživatel může vybrat soubor(y) ze souborového systému uigetfile [FileName,PathName,FilterIndex] = uigetfile(... FilterSpec,DialogTitle,DefaultName) >> [FileName,PathName] =... uigetfile('*.m',... 'Select the M-file'); 51/63
Příklad4: uiputfile uiputfile otevře dialog pro ukládání soubor(ů) uiputfile [FileName,PathName,FilterIndex] = uiputfile(... FilterSpec,DialogTitle,DefaultName) >> [file,path] =... uiputfile('*.mat',... 'Ulozit workspace jako:',... 'defaultfile.mat') 52/63
Příklad5: waitbar waitbar zobrazuje stav procesu h = waitbar(x,'message') waitbar(x,'message',property_name,property_value,...) >> h = waitbar(0,'please wait...'); kroku = 1000; for i = 1:kroku waitbar(i/kroku); end close(h); 53/63
Techniky návrhu GUI - rozdělení existuje několik přístupů (metodik) na tvorbu GUIe návrh pomocí nástroje GUIDE >> guide switch-board technika využití vedlejších a nested funkcí jako callback funkcí plně OOP přístup (vč. OO funkční části kódů) 54/63
Uchovávání dat v GUI Jak uchovávat data (zadaná i handely objektů) v GUI? globální proměnné (krajní možnost) použití vlastnosti UserData (záleží na velikosti aplikace) použití funkcí guidata nebo setappdata a getappdata plně OOP přístup (vč. OO funkční části kódů, i tak se neubráníme využití jedné z výše uvedených strategií) 55/63
Funkce guidata funkce umožňuje uložit nebo získat GUI data usnadňuje programátorovi přístup k datům (rozhraní) postup bývá následující: získáme kopii dat data = guidata(object_handle) provedeme změnu dat / potřebný výpočet pokud se data změnila, uložíme guidata(object_handle,data) guidata(object_handle,data) data = guidata(object_handle) >> fhndl = figure( Toolbar, none ); >> allfighndl = guihandles(fhndl); >> guidata(fhndl,allfighndl); function mycallback() %... myallfighndl = guidata(gcbo); myallfighndl.time = clock; Guidata(gcbo,myAllFigHndl); funkce guihandles vrací indentifikátory všech viditelných objektů ve figure funkce gcbo vrací identifikátor objektu, jehož callback je právě vyhodnocován 56/63
Funkce setappdata a getappdata setappdata: umožní definovat nová data (dvojice jménohodnota) pro danou aplikaci setappdata(object_handle,'name',value) getappdata: umožní získat dříve definovaná data z vybraného objektu value = getappdata(object_handle,name) values = getappdata(object_handle) 57/63
Návrh jednoduchého programu (#1) co by měl umět: co chceme ovlivňovat na vstupu: požadované výstupy: použité objekty: callback funkce: uložení identifikátorů: styl programování: 58/63
Návrh jednoduchého programu (#2) nákres GUIe, umístění callback funkcí, duplicity? realizace 59/63
Návrh jednoduchého programu (#3) oživení test 60/63
GUI: Závěrečné shrnutí Vždy promyslet co má GUI umět a jak. Nákres GUIe!!! Definice callback funkcí, hlaviček funkcí, vstupů a výstupů. Budu využívat reference na objekty? Kam je budu ukládat? GUI by měl být přehledný, bez slepých uliček a chyb. TVORBA GUIe + oživení 61/63
Literatura K.Zaplatílek, B.Doňar: MATLAB - Matlab pro začátečníky K.Zaplatílek, B.Doňar: MATLAB - Tvorba uživatelských aplikací Mathworks: Creating Graphical User Interfaces (dokumentace pdf) Mathworks: Graphics (dokumentace pdf) Mathworks: Programming Tips (dokumentace pdf) P.Marchand, O.T.Holland: Graphics and GUIs with Matlab B.R.Hunt, R.L.Lipsman, J.M.Rosenberg: A Guide to Matlab fórum na www.mathworks.com internet, google 62/63
Program cvičení, náhradní test Program cvičení: Vzhledem k volnu ST 12.5. by cvičení někdo měl a někdo ne cvičení je zrušeno (resp. jeho náplň). Připravené cvičení bude k dipozici na moodlu. Zájemci nechť si prostudují samostatně. Náhradní test: Všichni, kdo mají nárok (a chtějí) mohou psát náhradní test. Na náhradní, resp. opravné testy se hlašte do KOSu. Podle zaplnění mohou být přidány termíny. 63/63
Děkuji za pozornost miloslav.capek@fel.cvut.cz