產生繪圖資料
(編譯及圖示摘自mathworks.com)
上面的圖無法順利執行,主要是回叫程式及相關程式未能配套演出。這時必須利用改變 M檔案之內容。當此程式執行時,必須由程式產生所需之資料。這些程式由許多函數組成,其中包括:
- 啟動函數(Opening function):在GUI介面出現前先行執行之程式。有些必須事先設定之初值及各項資料可列於此啟動函數之內。此時也可以將handles結構資料儲存於guidata之內。
- 輸出函數(Output function):必要時部份運作資料若必須輸出至指令行。
- 回叫函數(Callbacks):當使用者作動介面上之元件時,對應須執行之函數。
- hObject:回叫元件或介面圖之握把。
- handles:以handles為名之結構矩陣。
若執行當中,handles結構矩陣中之項目內容變更,則必須用guidata再度儲存,以維持最新資料:
guidata(hObject, handles)
當Guide執行完畢後,會自動在此程式檔案中產生所需要配合的函數名稱及內容。其中不少是相同的說明文件,但它只是制式的格式,內容仍需要配合實際的需要。
啟動函數
在這些函數當中,有一個函數稱為啟動函數(opening function),亦即執行該程式之後,此啟用函數先執行需要步驟,然後等待使用者輸入資料或選擇所要之動作按鈕。啟用函數也是一種函數的型式,由GUIDE自動產生。通常,程式設計者可以在這裡作修改或添加所需要之資料。由於啟動函數執行前,所有gui元件均已形成,所以幾乎所有的工作,諸如產生資料、畫圖或影像,或由uiwait指令隔離的gui等均可在此執行。
啟動函數之典型格式如下:
function my_gui_OpeningFcn(hObject, eventdata, handles, varargin)
其中my_gui為此介面之檔名。其中hObject與handles兩參數前面已有討論,其他輸入參數則有eventdata與 varargin。前者為matlab公司自行保留使用之變數,後者則為輸入指令行(若有的話)之參數。這些參數可以在指令行下該檔指令時使用。例如:
>>my_gui('Position', [70 45 75 20])
這個位置參數會被引入,然後改變其位置屬性。
以本例為例,由於使用者必須由peaks、membrane及sinc三個函數中取得資料,但在程式執行之初,使用者仍然來不及選擇那一種函數。因此必須事先預設一個函數(例如peaks),使程式執行之初,立即選擇此項資料並加以顯示。
本例中,為達到其原有之目的,必須在啟用函數內增加三組產生peaks、membrane及sinc之程式碼。茲分別說明如下。
- 首先,利用程式編輯器並將前節所儲存之simple_gui.m程式打開。在編輯器之指令行內有一個 之符號,按下後會出現選單,就其中選擇simple_gui_OpeningFcn這一項,其內容如下:
function varargout = sinple_gui(varargin)
% SINPLE_GUI M-file for sinple_gui.fig
% -----
% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct('gui_Name', mfilename, ...
'gui_Singleton', gui_Singleton, ...
'gui_OpeningFcn', @sinple_gui_OpeningFcn, ...
'gui_OutputFcn', @sinple_gui_OutputFcn, ...
'gui_LayoutFcn', [] , ...
'gui_Callback', []);
if nargin && ischar(varargin{1})
gui_State.gui_Callback = str2func(varargin{1});
end
if nargout
[varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
gui_mainfcn(gui_State, varargin{:});
end
% End initialization code - DO NOT EDIT
% --- Executes just before sinple_gui is made visible.
function sinple_gui_OpeningFcn(hObject, eventdata, handles, varargin)
handles.peaks=peaks(35);
handles.membrane=membrane;
[x,y] = meshgrid(-8:.5:8);
r = sqrt(x.^2+y.^2) + eps;
sinc = sin(r)./r;
handles.sinc = sinc;
% Set the current data value.
handles.current_data = handles.peaks;
surf(handles.current_data)
% Choose default command line output for sinple_gui
handles.output = hObject;
% Update handles structure
guidata(hObject, handles);
% --- Outputs from this function are returned to the command line.
function varargout = sinple_gui_OutputFcn(hObject, eventdata, handles)
varargout{1} = handles.output;
% --- Executes on button press in pushbutton1.
function pushbutton1_Callback(hObject, eventdata, handles)
surf(handles.current_data);
% --- Executes on button press in pushbutton2.
function pushbutton2_Callback(hObject, eventdata, handles)
mesh(handles.current_data);
% --- Executes on button press in pushbutton3.
function pushbutton3_Callback(hObject, eventdata, handles)
contour(handles.current_data);
function edit1_Callback(hObject, eventdata, handles)
% --- Executes during object creation, after setting all properties.
function edit1_CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'),
get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
% --- Executes on selection change in popupmenu1.
function popupmenu1_Callback(hObject, eventdata, handles)
str = get(hObject, 'String');
val = get(hObject,'Value');
% Set current data to the selected data set.
switch str{val};
case 'Peaks' % User selects peaks.
handles.current_data = handles.peaks;
case 'Membrane' % User selects membrane.
handles.current_data = handles.membrane;
case 'Sinc' % User selects sinc.
handles.current_data = handles.sinc;
end
% Save the handles structure.
guidata(hObject,handles)
% --- Executes during object creation, after setting all properties.
function popupmenu1_CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'),
get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
此時游標移至啟用函數中之這一部份:% --- Executes just before simple_gui is made visible.
function simple_gui_OpeningFcn(hObject, eventdata, handles, varargin)
% This function has no output args, see OutputFcn.
% hObject handle to figure
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% varargin command line arguments to simple_gui (see VARARGIN)
% Choose default command line output for simple_gui
handles.output = hObject;
% Update handles structure
guidata(hObject, handles);
% UIWAIT makes simple_gui wait for user response (see UIRESUME)
% uiwait(handles.figure1);
加入程式中之最後兩行之目的則在獲得現存資料,令立即以surf指令先顯示其外觀圖。也是執行此程式時,且在使用者尚未下任何指令前之見面禮。執行後,其圖形之最終界面表示如下:
沒有留言:
張貼留言