概述
您好,看见您在其他帖子的回复 提到了handles一有变化,就要保存。我想到了困扰我已久的一个问题。
程序如下:function [] = GUI_25()
S.ln = []; % This holds the handles to the points.
S.fh = figure('units','pixels',...
'position',[200 200 500 500],...
'menubar','none',...
'name','GUI_25',...
'numbertitle','off',...
'resize','off');
S.ax = axes('xlim',[0 1],'ylim',[0 1]);
title('Click to add points. Right click for options.','fontw','bold')
S.cm = uicontextmenu;
S.um(1) = uimenu(S.cm,...
'label','Delete Points',...
'Callback', {@um1_call,S});
S.um(2) = uimenu(S.cm,...
'label','Rand Colors',...
'Callback', {@um2_call,S});
set(S.ax,'buttondownfcn',{@ax_bdfcn,S},'uicontextmenu',S.cm)
function [] = ax_bdfcn(varargin)
% Serves as the buttondownfcn for the axes.
S = varargin{3}; % Get the structure.
seltype = get(S.fh,'selectiontype'); % Right-or-left click?
L = length(S.ln);
if strmatch(seltype,'normal')
p = get(S.ax, 'currentpoint'); % Get the position of the mouse.
S.ln(L+1) = line(p(1),p(3),'Marker','+'); % Make our plot.
set(S.ln(L+1),'uicontextmenu',S.cm) % So user can click a point too.
end
% Update structure.
set(S.ax,'ButtonDownFcn',{@ax_bdfcn,S})
set(S.um(:),{'callback'},{{@um1_call,S};{@um2_call,S}})
function [] = um1_call(varargin)
% Callback for uimenu to delete the points.
S = varargin{3}; % Get the structure.
delete(S.ln(:)); % Delete all the lines.
S.ln = []; % And reset the structure.
set(S.ax,'ButtonDownFcn',{@ax_bdfcn,S})
function [] = um2_call(varargin)
% Callback for uimenu to change the colors of the points.
S = varargin{3}; % Get the structure.
L = length(S.ln); % The number of points.
set(S.ln(:),{'color'},mat2cell(0+.75*rand(L,3),ones(1,L),3 )) % Color mat.
在function [] = ax_bdfcn(varargin)函数里S.ln
发生了变化,就要在函数的结尾set(S.ax,'ButtonDownFcn',{@ax_bdfcn,S})
set(S.um(:),{'callback'},{{@um1_call,S};{@um2_call,S}})
将变化后的句柄结构体重新作为callback函数的新输入量有点类似您说的更新保存handles
我在set(S.ax,'ButtonDownFcn',{@ax_bdfcn,S})
set(S.um(:),{'callback'},{{@um1_call,S};{@um2_call,S}})
前面加上注释符号%后发现程序也确实无法正常运转。但是我从程序中看,觉得即使不用这样的语句,一定条件下程序也可正常执行。
我们假设不要在函数function [] = um1_call(varargin)中最后一句set(S.ax,'ButtonDownFcn',{@ax_bdfcn,S})
而ax_bdfcn函数主要执行的就是在坐标轴上的鼠标点击点的坐标表现出来,并通过S.ln(L+1) = line(p(1),p(3),'Marker','+')赋予S.ln。通过程序我们可以看到当舍去set(S.ax,'ButtonDownFcn',{@ax_bdfcn,S})后,在执行完um1_call后,即删除axes上已标记的点(S.ln=[]),在重新标记点(调用function [] = ax_bdfcn(varargin))依然能正常标记鼠标点击过的位置。可是我要再一次删除后面标记的点时,发现程序无法执行了,我猜想是因为第一次删除时 没有将变化的句柄结构体重新作为ax-bdfcn的输入参数。但是我觉得即使上次删除时S.ln的置零没有保存,在function [] = ax_bdfcn(varargin)依然可以S.ln不为零的基础上继续存储数据,而无论S如何,在 um1_call(varargin)函数里的delete(S.lnS.ln = [];依然是可以正常的对标记的点删除。可是程序报错恰恰是在delete(S.ln(:));
老师,你觉得为什么错了
有点长,十分感谢老师
最后
以上就是完美仙人掌为你收集整理的matlab currentpoint,Matlab的axes的CurrentPoint的数据用的是什么格式?的全部内容,希望文章能够帮你解决matlab currentpoint,Matlab的axes的CurrentPoint的数据用的是什么格式?所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复