Kier. MTR Programowanie w MATLABie Laboratorium Ćw. 6 Zasady programowania obiektowego w grafice na przykładzie interfejsu graficznego użytkownika (GUI) 1. Wprowadzenie Model obiektowy grafiki Grafika w MATLABie jest oparta na modelu obiektowym zorganizowanym w sposób hierarchiczny, którego schemat przedstawiono na rys. 1. Obiektami graficznymi są linie, osie, powierzchnie, teksty, okna graficzne a także cały ekran, który nadrzędnym obiektem nazywanym Root. Podobne obiekty są elementami tej samej klasy. W klasie określone są: atrybuty będące zmiennymi przechowującymi parametry obiektu metody będące funkcjami, które mogą być wykonywane obiekty będące elementami danej klasy. Przez zmianę wartości atrybutów możliwe jest modyfikowanie elementów istniejącego rysunku. Root Figure Figure Annotation Objects Illustration Objects UI Objects Axes Text Line Obiekt rodzicielski (ang. parent) Root może posiadać wiele obiektów potomnych (children), którymi są okna graficzne, czyli obiekty typu Figure. Z kolei obiektami potomnymi obiektu Figure mogą być: UI Objects elementy interfejsu graficznego użytkownika, takie jak przyciski, okienka dialogowe, opis, suwaki, zwijane menu, menu klasyczne, Axes - osie współrzędnych, którego potomkami mogą być m. in. : - Image obraz, - Patch naklejka, - Surface powierzchnia, - Text napis, - Line linia, - Polygon wielokąt, i inne Rys. 1. Hierarchiczna struktura obiektów graficznych w MATLABie Annotation Objects linie, strzałki, proste kształty geometryczne i tekst, Illustration Objects legenda, skala kolorów. 1
Przy tworzeniu obiektu graficznego przypisywana jest mu unikatowa struktura (w starszych wersjach była to liczba) nazywana uchwytem (handle). Za jego pomocą możliwa jest identyfikacja obiektu. Uchwyt można przypisać dowolnej zmiennej. Identyfikatorami aktywnych obiektów są: gcf identyfikator aktualnego okna graficznego (figure), gca identyfikator aktualnego układu osi współrzędnych (axis), gco identyfikator aktualnego obiektu (object), 0 (zero) identyfikator obiektu Root. Wybrane funkcje operujące na oknach graficznych przedstawia tab. 1. Funkcja h = figure; figure(n); clf; close; close(h); close all; close all hidden refresh(h); h=gca; Tab. 1. Funkcje realizujące operacje na oknach graficznych Opis tworzy nowe okno i zwraca jego identyfikator h (handle) okno o podanym identyfikatorze staje się oknem aktywnym usuwa wszystkie obiekty z aktywnego okna zamyka bieżące aktywne okno graficzne zamyka okno w identyfikatorze h zamyka wszystkie otwarte okna zamyka wszystkie ukryte okna odświeża okno o identyfikatorze h zwraca identyfikator (uchwyt) aktywnego układu osi wykresu Do pobierania wartości wskazanego atrybutu obiektu służy polecenie get(handle, nazwa_atrybutu ) zaś nadawanie atrybutom nowej wartości realizuje polecenie set(handle, nazwa_atrybutu, wartość) Tworzenie programu z GUI Utworzenie nowego programu z GUI realizuje się przez wybranie opcji New Graphical User Interface. Otwarte zostaje okno graficzne wraz z paskiem narzędziowym, z którego można pobierać komponenty interfejsu. Umieszczenie komponentów powoduje wygenerowanie edytowalnego kodu programu. Do programisty należy oprogramowanie sposobu obsługi poszczególnych elementów graficznych, zdarzeń, błędów i in. W wygenerowanym kodzie danemu elementowi interfejsu odpowiada wywołanie funkcji uicontrol, które ma postać: id = uicontrol(idf, nazwa_wlasnosci1, wartosc1, nazwa_wlasnosci2, wartosc2,...) gdzie: idf identyfikator okna, wewnątrz którego ma zostać utworzony element; jeżeli jest on pominięty, to tworzony element pojawi się w aktywnym oknie, nazwa_wlasnosci, wartosc przypisanie wybranej własność nowej wartości. Przykładowo, wywołanie uicontrol( style, pushbutton, position, [10 10 100 200], string, Kasuj,... callback, cla ) spowoduje umieszczenie w oknie przycisku o podanych rozmiarach i położeniu, z zapisem Kasuj, a po kliknięciu w przycisk i zwolnieniu przecisku myszy wykonana zostanie funkcja cla (usunięcie wszystkich elementów związanych z aktywnymi osiami wykresu). Część własności występuje w większości dostępnych rodzajów komponentów GUI. Wśród własności tych wyróżnić można: Position - określa położenie i rozmiary elementu (prostokąta) względem aktywnego rysunku (okna) za pomocą 4-elementowego wektora: [xp, yp, a, b] gdzie 2
xp lewy dolny róg prostokąta w osi x względem dołu rysunku (okna), yp lewy dolny róg prostokąta w osi y względem dołu rysunku (okna), a szerokość prostokąta, b wysokość prostokąta. Położenie lewego dolnego rogu elementu jest odniesione do lewego dolnego rogu rysunku. Style określa typ elementu; opis wybranych typów zawiera tab. 2. Callback określa akcję podejmowaną po uaktywnieniu elementu, np. wywołanie funkcji, skryptu, zmiennej, itp. Kiedy element jest uaktywniany, MATLAB traktuje łańcuch stanowiący wartość własności jako argument funkcji eval. Wykonanie eval odbywa się w przestrzeni roboczej MATLABa, co oznacza, że można odwoływać się do zmiennych zdefiniowanych w przestrzeni roboczej. ButtonDownFcn określa akcję po naciśnięciu myszką danego elementu. Units określa jednostki, w których podawane są własności Position: inches (cale), centimeters (centmetry), normalized (ułamki wymiarów aktywnego rysunku; pozwala na skalowanie wielkości elementów), points (punkty, 1 pt =1/72 cala), pixels (punkty ekranu). String łańcuch będący nazwą elementu; w przypadku pól edycyjnych własność ta zawiera edytowany tekst. HorizontalAlignment położenie etykiety określonej przez String: left (wyrównanie do lewej), right (wyrównanie do prawej), center (wyśrodkowanie). Value liczba określającą aktualny stan elementu. Własność ta jest modyfikowana automatycznie przez MATLAB, albo za pomocą funkcji set. Na własność Value wpływają własności Min oraz Max: - przyciski mają własność Value równą własności Min, - przełączniki i wyłączniki mają wartość Min w stanie wyłączonym i Max w stanie załączonym, - suwaki mają w dolnej granicy Min, a w górnej Max. Max, Min określają granice zmian Value. BackgroundColor kolor tła w zakresie danego elementu; domyślnie kolor szary, co opowiada wektrowi w modelu RGB równemu [0.5 0.5 0.5], ForegroungColor kolor kreski w zakresie danego elementu, domyślnie kolor czarny, co opowiada wektrowi w modelu RGB równemu [0 0 0]. Tab. 2. Wybrane wartości właściwości Style Wartości właściwości Style 'pushbutton' Przykład 'togglebutton' 'checkbox' 'radiobutton' 'edit' text 3
'slider' 'listbox' 'popupmenu' Innym sposobem określania właściwości wybranego elementu GUI jest wykorzystanie interaktywnego narzędzia Property Inspector. Wyświetla ono w formie graficznej wszystkie właściwości danego obiektu i pozwala na ustawienie ich wartości. Okna dialogowe W programach często zachodzi potrzeba otwarcia plików do zapisu lub odczytu. Aby uniknąć podawania ścieżki dostępu od niego można wykorzystać dostępne okna dialogowe, które zwracają ścieżki dostępu i nazwy do wskazanych plików. Do funkcji otwierających okna dialogowe należą: [nazwa_pliku,sciezka] = uiputfile(plik,tytul) wyświetlane jest okno dialogowe umożliwiające wybór ścieżki do zapisywania pliku, przy czym: plik łańcuch zawierający domyślną nazwę pliku lub szablon w postaci *.m, *.* tytul łańcuch tytułu okna, np. Zapisz jako, Zapisz. Zwracana jest nazwa pliku i ścieżka dostępu. [nazwa_pliku,sciezka] = uiputfile(filtr,tytul) wyświetlane jest okno dialogowe umożliwiające wybór ścieżki i istniejącego pliku, przy czym: filtr łańcuch zawierający domyślną nazwę pliku lub szablon w postaci *.m, *.* tytul łańcuch tytułu okna, np. Otwórz Zwracana jest nazwa pliku i ścieżka dostępu. Aplikacje MATLABa MATLAB oferuje szereg aplikacji, które są programami wyposażonymi w GUI. Lista dostępnych aplikacji jest dostępna na zakładce APPS. Uruchomienie aplikacji odbywa się przez kliknięcie jej ikony. Możliwe jest także tworzenie własnych aplikacji. Pomocne w tworzeniu aplikacji jest narzędzie App Designer, dostępne w najnowszych wersjach MATLABa. Elementy interfejsu pobiera się z biblioteki Component Library. Program pracuje w widoku Design View, w którym umieszcza się elementy graficzne. Na tej podstawie generowany jest kod, który można edytować w oknie Code View. Do programisty należy oprogramowanie obsługi poszczególnych elementów graficznych interfejsu, obsługa zdarzeń, błędów i in. 2. Ćwiczenie laboratoryjne Przeanalizować działanie przykładowego programu sincos_gui rysującego wykresy w oparciu o parametry pobrane z elementów interfejsu GUI. 3. Zadania laboratoryjne 1. Zmodyfikować program sincos_gui tak, aby każdy z obu wykresów pobierał dane dotyczące amplitudy i częstotliwości z niezależnej pary suwaków. 2. Opracować program wyposażony w GUI, który przelicza jednostki, np. jednostki prędkości z km/h na m/s i odwrotnie, jednostki temperatury z K na o C i odwrotnie. Za pomocą pól 4
kombi (styl 'popupmenu') należy wybrać jednostkę danej wejściowej i jednostkę docelową. W edytowalnym polu tekstowym należy wpisać wartość do przeliczenia, a w innym nieedytowalnym polu tekstowym powinien być wyświetlony wynik. Przeliczenie należy uruchomić przyciskiem. 5