2017-08-04 19 views
0

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.

Post 1

Post 2

Post 3

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 

Répondre

0

Avec Jan Simon guideline, je me suis ce qui manquait dans le code:

Dans le mouseDown rappel (la fonction imbriquée dans pushbutton_vertline_Callback), je manquais d'obtenir la copie mise à jour des poignées. Donc, j'avais besoin d'ajouter cette ligne à cette fonction imbriquée:

handles = guidata(hObject);