在Matlab GUI刷新功能中删除先前绘图的优雅方式



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

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

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

function callback(obj, event)
scatter(vx, vy, 'ro');
end

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

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

使用更结构化的方式来组织数据。类似这样的东西:

% 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

(这只是一种选择;当然还有很多方法可以满足你的要求(。

CCD_ 2可以被CCD_。您也可以传递f,或者使callback嵌套的in. Point is,全局``可以很容易地避免,因为它通常会促进糟糕和有风险的风格。

如果你坚持命名地块,你也可以使用结构:

% ...
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

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

最新更新