2014-05-12 51 views
0

這似乎是一個普遍的問題,但我試圖使其具體。在Matlab GUI刷新功能中刪除以前的drawig的優雅方式

我在寫一個MATLAB GUI,利用鼠標事件。

刷新功能是這樣的,並撥動它放到click事件:

function callback(obj, event) 

scatter(vx, vy, 'ro'); 

end 

當然,經過幾次點擊的數字變成了一個爛攤子。我必須在刷新期間刪除先前的圖紙

======的main.m

global f 
f = line(0,0); 

====== callback.m

function callback(obj, event) 

global f 

delete f 

f = scatter(vx, vy, 'ro'); 

end 

======

此代碼的工作,但在我製作程序後更加難看複雜。其實我真正的這個程序的版本是這樣的:

f.r = line(0,0); 
f.l = line(0,0); 
f.P.l = line(0,0); 
f.P.t = line(0,0); 
... 

所以在這裏我不知道如何寫在MATLAB圖形用戶界面,優雅刪除以前的圖紙刷新功能?

回答

0

使用更結構化的方式來組織數據。這樣的事情:

% main.m 
function myMain 

    f = [ 
     line(0,0); % right 
     line(0,0); % left 
     line(0,0); % P.right 
     line(0,0); % P.left 
    ]; 

    set(gca, 'UserData', f); 

    % ...etc. 


end 

% callback.m 
function callback(obj, event) 

    f = get(gca, 'UserData'); 

    delete(f(ishandle(f))); 

    f = scatter(vx, vy, 'ro'); 
    set(gca, 'UserData', f); 

    % ...etc. 

end 

(這只是一個選擇;當然有更多的方法來做你的要求)。

gca可能被obj替代或明確通過。你也可以通過f左右,或使callback嵌套in. Point is,全球`可以很容易地避免,你應該這樣做,因爲它通常promotes bad and risky style

如果你堅持命名的地塊,你也可以使用結構:

% ... 
f.r = line(0,0); f.P.l = line(0,0); 
f.l = line(0,0); f.P.t = line(0,0); 
% ... 

在這種情況下,你可以使用動態結構引用刪除您的地塊:

function callback(obj,event, f) 

    % ... 

    delete_all_plots(f); 

    function delete_all_fields(f) 
     fn = fieldnames(f); 
     for ii = 1:numel(fn) 
      field = f.(fn{ii}); 
      if isstruct(field) 
       delete_all_fields(field); 
      else 
       if ishandle(field) 
        delete(field) 
       end 
      end 
     end 
    end   
end 

但你可以看,這是相對於簡單的平面陣列而言不必要的複雜,所以我不會選擇這個選項。