je un guide simple avec 2 boutons poussoirs:guidata mise à jour de « poignées » dans le Guide des fonctions imbriquées
bouton # 1 parcelles un graphique sinus.
Le bouton # 2 ajoute une ligne verticale "mobile" au graphique.
Tout fonctionne bien et je peux faire glisser la ligne verticale comme vous le souhaitez. Ce que j'essaie de faire maintenant est d'enregistrer x-position de ligne verticale (x_history) comme je le déplace et enregistrer cette x_history aux poignées (via guidata) de telle sorte que si j'arrête de bouger la ligne (mouse- vers le haut) et ensuite reprendre le déplacement de la ligne (souris vers le bas et le déplacement de la souris) Je peux restaurer x_history précédent à partir des poignées (via guidata). Le problème auquel je suis confronté est que chaque fois que la souris remonte les poignées réinitialise (!) Le champ x_history (supprime le champ), donc je perds l'enregistrement précédent de x_history quand je reprends la souris et déplace le ligne.
Qu'est-ce qui me manque ici? PS: J'ai trouvé ces messages pertinents mais pas exactement applicables à mon cas étant donné la présence de fonctions imbriquées.
Merci,
Alborz
Voici le code:
function varargout = plot_test(varargin)
gui_Singleton = 1;
gui_State = struct('gui_Name', mfilename, ...
'gui_Singleton', gui_Singleton, ...
'gui_OpeningFcn', @plot_vertline_handles_OpeningFcn, ...
'gui_OutputFcn', @plot_vertline_handles_OutputFcn, ...
'gui_LayoutFcn', [] , ...
'gui_Callback', []);
if nargin && ischar(varargin{1})
gui_State.gui_Callback = str2func(varargin{1});
end
if nargout
[varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
gui_mainfcn(gui_State, varargin{:});
end
end
function plot_vertline_handles_OpeningFcn(hObject,~,handles,varargin)
handles.output = hObject;
guidata(hObject, handles);
end
function varargout = plot_vertline_handles_OutputFcn(~,~,handles)
varargout{1} = handles.output;
end
%% Vertline Callback
function pushbutton_vertline_Callback(hObject,~,handles) %#ok<*DEFNU>
axis_h = handles.axis_h;
vertline_h = line('parent',axis_h,'xdata',[1 1],'ydata',[-1 1],...
'ButtonDownFcn', @mouseDown);
handles.vertline_h = vertline_h;
guidata(hObject,handles)
function mouseDown(~,~)
mousedown = true;
handles.mousedown = mousedown;
guidata(hObject,handles)
end
end
%% Plot Callback
function pushbutton_plot_Callback(hObject,~,handles)
clc;
open_figs_h = get(0,'children');
close(open_figs_h(2:end));
x = -pi:0.01:pi;
y = sin(x);
fig_h = figure('units','normalized','outerposition',[0.2 0.2 .5 .5],...
'WindowButtonMotionFcn', @MouseMove, 'WindowButtonUpFcn', @MouseUp);
axis_h = axes('parent',fig_h,'position',[0.1 0.1 .8 .8]);
line('parent',axis_h,'xdata',x,'ydata',y);
handles.axis_h = axis_h;
guidata(hObject,handles);
function MouseUp(~,~)
handles = guidata(hObject);
handles.mousedown = 0;
guidata(hObject,handles);
end
function MouseMove(~,~)
try handles = guidata(hObject);catch, end
if isfield(handles,'mousedown')
mousedown = handles.mousedown;
else
mousedown = 0;
end
if mousedown
x_current = get(axis_h,'CurrentPoint');
vertline_h = handles.vertline_h;
set (vertline_h, 'XData',[x_current(1,1) x_current(1,1)]);
if isfield(handles,'x_history')
disp('Field "x_history" Exists in handles')
handles.x_history = [handles.x_history x_current(1,1)]
else
disp('Field "x_history" Does Not Exist in handles')
handles.x_history = x_current(1,1)
end
guidata(hObject,handles);
end
end
end