0

これが正しい方法であるかどうかはわかりませんが、呼び出されたときに基本的に4つのプロットをリセットする関数が必要です。軸に表示するプロットをドロップダウンで選択できるようにhandles.distplot1、プロットを などとして保存します。handles.distplot2いくつかの異なるイベントの後にこれらのプロットをリセットする必要があるため、当然のことながら、それらを関数に入れ、コードの冗長性を回避したいと考えています。私は次のような機能を願っています

function setupDistPlots(hObject, eventdata, handles)
    % filler data for surfc
    x = [1 2];
    z = zeros(2);
    % setup blank plots for funtion to work with
    a = figure(1); set(a, 'Visible', 'off')
    handles.distplot1 = surfc(x, x, z);
    b = figure(2); set(b, 'Visible', 'off');
    handles.distplot2 = bar(NaN);
    c = figure(3); set(c, 'Visible', 'off')
    handles.distplot3 = surfc(x, x, z);
    d = figure(4); set(d, 'Visible', 'off')
    handles.distplot4 = bar(NaN);
    guidata(hObject, handles);

意図したとおりに動作するはずですが、それを呼び出す方法がわかりません。オープニング機能で試してみましたが、後でsetupDistPlots(hObject, eventdata, handles)アクセスしようとすると次のエラーが表示されます。handles.distplot1

Reference to non-existent field 'distplot1'.

Error in tabbedGUI>distanceToggle_Callback (line 212)
                distribution(hObject,
                handles.distplot1, ...

Error in gui_mainfcn (line 95)
        feval(varargin{:});

Error in tabbedGUI (line 45)
    gui_mainfcn(gui_State, varargin{:});

Error in
@(hObject,eventdata)tabbedGUI('distanceToggle_Callback',hObject,eventdata,guidata(hObject))


Error while evaluating UIControl Callback

編集:また、私が改善できることをすべて指摘してください。私が Matlab で行うことはすべて、より良い方法があるに違いないと感じています。

edit2: オープニング関数の問題は、オープニング関数setupDistPlotsの呼び出しの前にguidata(hObject, handles)呼び出していました。ただし、ボタンを押して「setupDistPlots」を再度呼び出すと、次のエラーが発生します。

Error using matlab.graphics.primitive.Data/set
Invalid or deleted object.

Error in andrewDistribution (line 45)
    set(hplot1, 'xData', x1, 'yData', y1, 'zData', zeros(length(x1)))

Error in tabbedGUI>distanceToggle_Callback (line 200)
                distribution(hObject, handles.distplot1, ...

Error in gui_mainfcn (line 95)
        feval(varargin{:});

Error in tabbedGUI (line 45)
    gui_mainfcn(gui_State, varargin{:});

Error in @(hObject,eventdata)tabbedGUI('distanceToggle_Callback',hObject,eventdata,guidata(hObject))


Error while evaluating UIControl Callback
4

1 に答える 1

1

最初の試みは次のようになったと思います。

% --- Executes just before testgui is made visible.
function testgui_OpeningFcn(hObject, eventdata, handles, varargin)
% Choose default command line output for testgui
handles.output = hObject;

setupDistPlots(hObject, eventdata, handles)

% Update handles structure
guidata(hObject, handles);

コメントで説明されているように、使用handlesして GUI に保存された構造への変更は、GUIDE の後続の呼び出しによって上書きされています。簡単な答えは、すべてを記述どおりに機能させるために後置することです。setupDistPlotsguidataguidatasetupDistPlots guidata


今、より長い答え。MATLAB 関数ではなく、MATLAB スクリプトの操作に慣れていると思います。スクリプトがベース ワークスペースを共有する場合、関数はそれぞれ、メモリ内に独自の個別のワークスペースを持ちますOpeningFcn書かれているように、構造を変更したことを知る方法はないため、渡されhandlesた の値を使用して変更を喜んで上書きします。これを回避するには、変更を行ったことを に知らせる何らかの方法を含める必要があります。handlessetupDistPlotsOpeningFcn

1 つの方法は、次の出力を指定することですsetupDistPlots

function handles = setupDistPlots(hObject, eventdata, handles)
    % filler data for surfc
    x = [1 2];
    z = zeros(2);
    % setup blank plots for funtion to work with
    a = figure(1); set(a, 'Visible', 'off')
    handles.distplot1 = surfc(x, x, z);
    b = figure(2); set(b, 'Visible', 'off');
    handles.distplot2 = bar(NaN);
    c = figure(3); set(c, 'Visible', 'off')
    handles.distplot3 = surfc(x, x, z);
    d = figure(4); set(d, 'Visible', 'off')
    handles.distplot4 = bar(NaN);

setupDistPlotsGUIDE コードの呼び出しの前に配置guidataします。

% --- Executes just before testgui is made visible.
function testgui_OpeningFcn(hObject, eventdata, handles, varargin)
% Choose default command line output for testgui
handles.output = hObject;

handles = setupDistPlots(hObject, eventdata, handles);

% Update handles structure
guidata(hObject, handles);
于 2016-03-07T15:01:18.217 に答える