2012-01-02 4 views
1

Я хочу создать небольшой скрипт, в котором я могу систематически анализировать множество графиков matlab. С помощью сценария я должен щелкнуть по некоторым точкам на графике, а затем скрипт сохранит эти значения. У меня есть теперь, что функция обратного вызова имеет координаты, но я хочу, чтобы эти значения в основном файле сохранялись. Но функция set не может получать значения из функции. Как я могу создать еще одну конструкцию, чтобы избежать этого? [x, y] = set (f, 'ButtonDownFcn', {@ Click_CallBack a}); не работает unfortunalty ..Matlab как сделать возвращаемые значения обратного вызова?

function process_plot() 
    dataset_dia = input('diameter?') 
    dataset_length = input('length?') 


    h = gcf; 
    a = gca; 
    f =get(gca,'Children'); 
    set(h, 'Pointer', 'fullcrosshair'); 
    set(f,'ButtonDownFcn',{@Click_CallBack a}); 

    save(strcat(dataset_dia, '.mat'), x, y); 

end 

Функция, которая извлекает координаты из участка:

function [x, y]= Click_CallBack(h,e,a) 
point = get(a,'CurrentPoint'); x = point(1); 
y = point(4); 
fprintf(1,'X,Y = %.2f,%.2f\n',x,y); 
end 
+3

Вы должны прочитать часть соответствующей части документации Matlab по вопросу передачи данных в графическом интерфейсе, я думаю, что они могут быть полезны в вашем случае: [Способы управления данными в программном графическом интерфейсе] (http: // www.mathworks.fr/help/techdoc/creating_guis/f13-998352.html) и [Обмен данными между обратными вызовами GUI] (http://www.mathworks.fr/help/techdoc/creating_guis/f13-998449.html# f13-1000011) – Aabaz

ответ

0

Вы могли бы сделать что-то вроде следующего. Щелкните левой кнопкой мыши, чтобы сохранить точки в пользовательских данных, затем щелкните правой кнопкой мыши, когда закончите выбор, чтобы записать их в файл MAT.

function process_plot() 
f =get(gca,'Children'); 
set(gcf, 'Pointer', 'fullcrosshair'); 
set(f,'ButtonDownFcn',{@Click_CallBack gca}); 

function [x, y]= Click_CallBack(h,e,a) 
userData = get(a,'userData'); %Store x,y in axis userData 
switch get(ancestor(a,'figure'),'SelectionType') 
    case 'normal' %left click  
     point = get(a,'CurrentPoint'); 
     userData(end+1,:) = [point(1,1) point(1,2)]; 
     set(a,'userData',userData) 
     fprintf(1,'X,Y = %.2f,%.2f\n',point(1,1),point(1,2)); 
    otherwise %alternate click 
     % Reset figure pointer 
     set(ancestor(a,'figure'), 'Pointer','arrow'); 
     %Clear button down fcn to prevent errors later 
     set(get(gca,'Children'),'ButtonDownFcn',[]); 
     %Wipe out userData 
     set(a,'userData',[]); 
     x = userData(:,1); 
     y = userData(:,2); 
     save('myMatFile', 'x', 'y'); %Save to MAT file ... replace name 
end 

Это, конечно, если вы не используете данные о оси для чего-то еще. Также обратите внимание, что текущая точка, полученная во время нажатия кнопки, фактически не будет отображаться в вашем графическом наборе данных. Это только текущие позиции курсоров над вашими нарисованными линиями. Если вам нужны фактические точки в построенных строках, вам придется искать в ваших данных ближайшую точку к найденной позиции курсора.

Смежные вопросы