MATLAB GUIDE
MATLAB GUIDE prawdopodobnie powoli zacznie odchodzić na emeryturę, jednak póki co jest jeszcze popularnym narzędziem. GUIDE jest intuicyjny w użyciu, jednak od czasu do czasu pojawiają się problemy z osiągnięciem przez użytkownika zamierzonego efektu. Dziś o dosyć częstym problemie – jak zmusić narzędzie do zapisania wyniku pracy w formie matlabowej zmiennej. W czym rzecz? Programy tworzone z pomocą GUIDE nie muszą stanowić zamkniętego, gotowego rozwiązania jakiegoś problemu. Zazwyczaj są jedynie pomocą na drodze do osiągnięcia końcowego wyniku. Często zdarza się, że chcemy przetworzyć jakieś dane i pośredni wynik zamierzamy poddać dalszej analizie w MATLABie, a tutaj GUIDE nie chce od razu współpracować. Poniżej program, który przemnaża dane wejściowe przez dwa.
Przykładowe GUI jest bardzo proste
Wygenerowany kod pozostaje bez zmian za wyjątkiem sekcji pushbutton1_Callback
, gdzie znajdują się 3 wiersze:
x = get(handles.edit1, 'String'); y = str2num(x) * 2; set(handles.text2, 'String', num2str(y));
Aplikacja działa oczywiście bezbłędnie, jednak chcielibyśmy, żeby po wciśnięciu przycisku "Oblicz" wynik trafił również do zmiennej w workspace, dlatego należy wprowadzić pewne zmiany.
Aplikację stworzoną w GUIDE można uruchomić, prosząc o zwrócenie argumentu wyjściowego, a my decydujemy, co ma tam trafić.
Po pierwsze zatem, na liście wygenerowanych funkcji należy znaleźć OutputFcn i zapisać, co chcielibyśmy otrzymać.
varargout{1} = handles.text2.String;
Jeśli na tym etapie spróbujemy przetestować aplikację, okaże się, że nie wszystko działa jeszcze jak powinno.
Out = X2
Out = 'Wynik'
Wynik pojawi się jak tylko uruchomimy aplikację, zanim zdążymy „wyklikać” cokolwiek. W naszym przypadku będzie to po prostu słowo ‘Wynik’.
Kolejna niezbędna zmiana, to modyfikacja ostatniej linii w OpenningFnc
. Znajduje się tam polecenie uiwait(handles.figure1)
, należy usunąć poprzedzający je znak komentarza. Dzięki temu MATLAB wstrzyma się z wykonaniem OutputFnc
do czasu aż mu na to pozwolimy. Dane na wyjściu mogą pojawić się w momencie wciśnięcia przycisku pushbutton1
, stąd kolejna modyfikacja.
function pushbutton1_Callback(hObject, eventdata, handles) % hObject handle to pushbutton1 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) x = get(handles.edit1, 'String'); y = str2num(x) * 2; set(handles.text2, 'String', num2str(y)); uiresume(handles.figure1);
Teraz aplikacja powinna działać zgodnie z planem, w momencie wciśnięcia przycisku zostaną wykonane obliczenia, a wynik trafi do Command Window.