12/31/2006

產生繪圖資料

(編譯及圖示摘自mathworks.com)

上面的圖無法順利執行,主要是回叫程式及相關程式未能配套演出。這時必須利用改變 M檔案之內容。當此程式執行時,必須由程式產生所需之資料。這些程式由許多函數組成,其中包括:

  1. 啟動函數(Opening function):在GUI介面出現前先行執行之程式。有些必須事先設定之初值及各項資料可列於此啟動函數之內。此時也可以將handles結構資料儲存於guidata之內。
  2. 輸出函數(Output function):必要時部份運作資料若必須輸出至指令行。
  3. 回叫函數(Callbacks):當使用者作動介面上之元件時,對應須執行之函數。
上述各函數都是函數的型式,且各有函數名稱。其輸入參數則與handles結構有關,其中包括:

  • 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之程式碼。茲分別說明如下。

  1. 首先,利用程式編輯器並將前節所儲存之simple_gui.m程式打開。在編輯器之指令行內有一個letter f on the toolbar 之符號,按下後會出現選單,就其中選擇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);

  1. 在上面啟用函數之程式碼中,必須在第七行下面(即% varargin...之後)加入下面一段程式碼,以產生適當之資料供繪圖:
    • % Create the data to plot.
      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)
開頭之六行執行程式可以利用 MATLAB 原有之函數指令 peaks,membrane, 及sinc產生相關之資料。這些資料必須置放於一個以 handles 為名之結構矩陣中,利用此參數作為傳遞資料給對應之回叫函數之橋樑,亦即成為呼叫函數之輸入值。對應於GUI圖面之各元件之回叫函數將由handles之參數結構中取得所需之資料。

加入程式中之最後兩行之目的則在獲得現存資料,令立即以surf指令先顯示其外觀圖。也是執行此程式時,且在使用者尚未下任何指令前之見面禮。執行後,其圖形之最終界面表示如下: