2017-02-14 14 views
1

Я работаю над графическим интерфейсом в MATLAB; Я использовал GUIDE в командном окне. У меня есть несколько кнопок. Теперь проблема, у меня есть функция, в pusbhbutton4, и когда я нажимаю на нее, я хочу построить результат по трем конкретным осям (10 - 12). Но не работает.Построение в осях по функции

Код:

function pointsQRS = MyCustomPushButtonFunctionQRS10(VxQRS, VyQRS, VzQRS) 
VxQRS=[[0:length(VxQRS)-1]' VxQRS]; 
axes(handles.axes10); 
plot(VxQRS(:,2)); 
grid on 
Vx_QRS=ginput; 
x_pointsQRS=VxQRS(Vx_QRS(1,1)<=VxQRS(:,1) & Vx_QRS(2,1)>=VxQRS(:,1),:); 
m=1; 


VyQRS=[[0:length(VyQRS)-1]' VyQRS]; 
axes(handles.axes11); 
plot(VyQRS(:,2)); 
grid on 
Vy_QRS=ginput; 
y_pointsQRS=VyQRS(Vy_QRS(1,1)<=VyQRS(:,1) & Vy_QRS(2,1)>=VyQRS(:,1),:); 
if size(y_pointsQRS,1)<m 
m=2; 
end 


    VzQRS=[[0:length(VzQRS)-1]' VzQRS]; 
    axes(handles.axes12); 
    plot(VzQRS(:,2)); 
    grid on 

    Vz_QRS=ginput; 
    z_pointsQRS=VzQRS(Vz_QRS(1,1)<=VzQRS(:,1) & Vz_QRS(2,1)>=VzQRS(:,1),:); 
    if size(z_pointsQRS,1)<m 
    m=3; 
    end 



    switch m 
    case 1 
    x_pointQRS=x_pointsQRS;                 
    y_pointQRS=y_pointsQRS(x_pointsQRS(1,1)<=y_pointsQRS(:,1) & x_pointsQRS(end,1)>=y_pointsQRS(:,1),:); 
    z_pointQRS=z_pointsQRS(x_pointsQRS(1,1)<=z_pointsQRS(:,1) & x_pointsQRS(end,1)>=z_pointsQRS(:,1),:); 
case 2 
    y_pointQRS=y_pointsQRS; 
    x_pointQRS=x_pointsQRS(y_pointsQRS(1,1)<=x_pointsQRS(:,1) & y_pointsQRS(end,1)>=x_pointsQRS(:,1),:); 
    z_pointQRS=x_pointsQRS(y_pointsQRS(1,1)<=z_pointsQRS(:,1) & y_pointsQRS(end,1)>=z_pointsQRS(:,1),:); 
case 3 
    z_pointQRS=z_pointsQRS; 
    x_pointQRS=x_pointsQRS(z_pointsQRS(1,1)<=x_pointsQRS(:,1) & z_pointsQRS(end,1)>=x_pointsQRS(:,1),:); 
    y_pointQRS=y_pointsQRS(z_pointsQRS(1,1)<=y_pointsQRS(:,1) & z_pointsQRS(end,1)>=y_pointsQRS(:,1),:); 
end 


size_min=min([size(x_pointQRS,1) size(y_pointQRS,1) size(z_pointQRS,1)]) 
pointsQRS([1:size_min],:)=[x_pointQRS([1:size_min],2)  y_pointQRS([1:size_min],2) z_pointQRS([1:size_min],2)]; 
     if size_min==0 
     error('Wrong.'); 
     end 
     end 

Код кнопки:

% --- Executes on button press in pushbutton4. 
function pushbutton4_Callback(hObject, eventdata, Data) 
% hObject handle to pushbutton4 (see GCBO) 
% eventdata reserved - to be defined in a future version of MATLAB 
% handles structure with handles and user data (see GUIDATA) 


pointsQRS = MyCustomPushButtonFunctionQRS10(Data.fileData(:,1), Data.fileData(:,2), Data.fileData(:,3)) 


save 'pointsQRS.mat' -mat pointsQRS 

Ошибка Я все еще получаю:

Undefined variable "handles" or class "handles.axes10". 

Error in MyCustomPushButtonFunctionQRS10 (line 3) 
axes(handles.axes10); 

Error in VKG_Zobrazovac>pushbutton4_Callback (line 156) 
pointsQRS = MyCustomPushButtonFunctionQRS10(Data.fileData(:,1), Data.fileData(:,2), Data.fileData(:,3)) 

Error in gui_mainfcn (line 95) 
     feval(varargin{:}); 

Error in VKG_Zobrazovac (line 42) 
    gui_mainfcn(gui_State, varargin{:}); 

Error in @(hObject,eventdata)VKG_Zobrazovac('pushbutton4_Callback',hObject,eventdata,guidata(hObject)) 


Error while evaluating UIControl Callback 

Не могли бы вы дать мне подсказку, как это сделать работать должным образом?

ответ

2

Вы не передавая handles-структуру для MyCustomPushButtonFunctionQRS10 (или как вы это называете, Data), поэтому он не имеет возможности доступа к axes ручки, хранящиеся в handles. Вы должны передать handles в качестве входного аргумента.

pointsQRS = MyCustomPushButtonFunctionQRS10(Data.fileData(:,1), ... 
              Data.fileData(:,2), ... 
              Data.fileData(:,3), ... 
              Data) 

И тогда ваш обратный вызов будет принимать четвертого вход

function pointsQRS = MyCustomPushButtonFunctionQRS10(VxQRS, VyQRS, VzQRS, handles) 

Кроме того, я бы рекомендовал использовать 'Parent' свойства plot указать родительскую ось, а не с помощью axes.

plot(VxQRS(:,2), 'Parent', handles.axes10); 
grid(handles.axes10, 'on') 
Vx_QRS = ginput(handles.axes10); 
+0

Почему это лучше? –

+0

@ john.steak Потому что есть много вещей, которые могут модифицировать «текущие оси», что будет использовать «plot», если вы явно не укажете его. Если вы хотите, чтобы ваш дисплей был невосприимчив к ошибочным щелчкам пользователя, вам нужно всегда указывать «Parent» явно. Это особенно актуально при разработке графического интерфейса. – Suever

+0

Спасибо вам большое! –