【问题标题】:Elegant way of deleting previous drawig in Matlab GUI refresh function在 Matlab GUI 刷新功能中删除先前绘图的优雅方法
【发布时间】:2014-05-12 11:36:01
【问题描述】:

这似乎是一个普遍的问题,但我正在努力使其具体化。

我正在编写一个 MATLAB GUI,利用鼠标事件。

刷新功能是这样的,切换到click事件:

function callback(obj, event)

scatter(vx, vy, 'ro');

end

当然,点击几下后,数字就会变得一团糟。我必须在刷新期间删除以前的绘图

====== main.m

global f
f = line(0,0);

====== 回调.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 GUI 中编写刷新函数以优雅地删除以前的图形?

【问题讨论】:

    标签: matlab user-interface


    【解决方案1】:

    使用更结构化的方式来组织您的数据。像这样的:

    % 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,或者使callbacknestedinmain. Point is,global`可以很容易地避免,你应该这样做,因为它通常是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
    

    但是正如您所看到的,与简单的平面数组相比,这不必要地复杂,所以我不会选择这个选项。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-12
      • 2015-08-27
      • 1970-01-01
      • 1970-01-01
      • 2016-12-31
      • 1970-01-01
      • 1970-01-01
      • 2011-06-13
      相关资源
      最近更新 更多