Matlab GUI轴从数据光标中提取位置 [英] Matlab GUI axes extract position from datacursor

查看:87
本文介绍了Matlab GUI轴从数据光标中提取位置的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

希望任何人都可以帮助我.

hope anyone can help me.

我尝试在GUI中加载并显示图像. 之后,我激活了datacursormode.现在,我想从datacursor对象中提取位置,并将信息保存到全局变量中以处理此数据.

I try to load and display a image in my GUI. After that i activate datacursormode. Now I want to extract the position from my datacursor object and save the informations into a global variable to work on this data.

这是我的代码:

function varargout = myGui(varargin)

% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct('gui_Name',       mfilename, ...
               'gui_Singleton',  gui_Singleton, ...
               'gui_OpeningFcn', @myGui_OpeningFcn, ...
               'gui_OutputFcn',  @myGui_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 initialization code - DO NOT EDIT


% --- Executes just before myGui is made visible.

% Choose default command line output for myGui
handles.output = hObject;

path = uigetimagefile;
img = imread(path);

axes(handles.axes1);

imshow(img);

dcm_obj = datacursormode(handles.figure1);
datacursormode on;
set(dcm_obj,'UpdateFcn', @myupdatefcn );


handles.pos = hObject;
handles.pos = get(0,'userdata');
set(handles.txt1,'String',num2str(handles.pos));
guidata(hObject, handles);


% --- Outputs from this function are returned to the command line.
function varargout = myGui_OutputFcn(hObject, eventdata, handles) 

% Get default command line output from handles structure
varargout{1} = handles.output;

在一个额外的.m文件中,我具有"myupdatefcn",如thi

And in a extra .m file i have the 'myupdatefcn' like thi

function txt = myupdatefcn(~, event_obj)
posi = event_obj.Position;
disp(['You clicked X:',num2str(posi(1)),', Y:',num2str(posi(2))]);
txt = {'Point to Compute'};
set(0,'userdata',posi(1));
end

任何人都可以搬离我该怎么办?

Can anyone explane how I can do this?

谢谢

推荐答案

您的GUI组织似乎有些混乱.您必须小心将多余的代码放在GUIDE生成的.m文件中的位置.

You GUI organization seems a bit chaotic. You have to be careful where you place the extra code in the .m file generated by the GUIDE.

我建议您通过调用自己的初始化函数来替换放置在函数中间的所有代码:

I suggest you replace all the code you placed in the middle of the function by a call to your own initialization function:

myGuiInitialization(handles) ;

然后,在同一文件(在底部)中,添加以下代码:

Then, in the same file (at the bottom), add the following code:

function myGuiInitialization(handles)
% path = uigetimagefile;       %// uncomment that to retrieve your intital functionality
% img = imread(path);          %// uncomment that to retrieve your intital functionality
img = imread('peppers.png') ;  %// Delete that to retrieve your intital functionality

himg = imshow(img, 'Parent',handles.axes1) ;    %// get the handle of the image graphic object (needed to attach the datatip to it)

dcm_obj  = datacursormode(handles.figure1);     %// get the handle of the datacursor object
set(dcm_obj,'UpdateFcn', @myDatatipUpdateFcn ); %// assign it a callback
dcm_obj.createDatatip(himg) ;                   %// create a new DATATIP and attach it to the image object

这将加载图像,创建数据提示并将其关联到回调.

This will load an image, create a datatip and associate a callback to it.

您管理数据提示更新的单独功能变为:

Your separate function managing the datatip update becomes:

function txt = myDatatipUpdateFcn(hobj, event_obj)

   handles = guidata( event_obj.Target ) ;  %// retrieve the collection of GUI graphic object handles
   pointPosition = event_obj.Position;      %// get the position of the datatip

   %// Store the position in the figure "appdata", named "pointPosition"
   setappdata( handles.figure1 , 'pointPosition' , pointPosition )  

   %// now we've saved the position in the appdata, you can also display it
   %// on the datatip itself
   txt = {'Point to Compute: ';...
         ['X:',num2str(pointPosition(1))]; ...
         ['Y:',num2str(pointPosition(2))] } ;

现在,每次移动数据提示时,最后一个点的位置都会保存在图 AppData 中.我建议您使用函数 setappdata

Now every time the datatip will be moved, the last point position will be saved in the figure AppData. I recommend you use the function setappdata and getappdata instead of the old userdata (it's a thing of the past, avoid it if you can).

特别地,不建议分配对象0userdata的方式,因为这将存储在主根对象中.如果关闭gui,这些数据可能仍然存在. setappdata将存储附加到您的GUI的数据,这是一种更简洁的方法(当关闭gui时,数据将随gui一起消失).

Specially, the way you were doing it, assigning the userdata of the object 0 is not recommeded, because that will be stored in the main root object. If you close your gui these data may still exist. The setappdata will store data attached to your GUI, which is a much cleaner way (when your gui is closed the data disappear with your gui).

现在,当您想对保存在AppData中的点位置进行某些操作时,只需使用getappdata进行检索即可.

Now when you want to do something with your point position saved in your AppData, you can just retrieve them with getappdata.

就本示例而言,我在图形上创建了一个按钮.按下时,它将检索点位置并将其显示在文本框中.

For the purpose of this example, I created a pushbutton on the figure. When pushed, it will retrieve the point position and display it in the textbox.

创建按钮时,GUIDE将在gui主函数中为其创建一个空的回调.将以下代码放入其中:

When you create the pushbutton, the GUIDE will create an empty callback for it in the gui main function. Place the following code in it:

% --- Executes on button press in pushbutton1.
function pushbutton1_Callback(hObject, eventdata, handles)

%// retrieve the point position saved in the figure appdata named "pointPosition"
pointPosition = getappdata( handles.figure1 , 'pointPosition' ) ;
%// that's it, you have your point position, now do whatever you need with it

%// prepare a test string with the position and display it in the label
txtstr = sprintf('Point to compute: X=%d , Y=%d',pointPosition) ;
set(handles.txt1,'String',txtstr);

此代码将产生如下内容:

This code will produce something like that:

数据提示标签将在每次移动时更新位置,但是底部的文本标签仅在您按下按钮时才会更新.

The datatip label will update position at every move, but the text label at the bottom will only be updated when you press the pushbutton.

这篇关于Matlab GUI轴从数据光标中提取位置的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆