source: trunk/src/mouse_motion.m @ 412

Last change on this file since 412 was 399, checked in by sommeria, 12 years ago

implementation of thin plate interpolation (proj on planes with mode 'filter'), rationalisation of variable formats in civ_matlab

File size: 22.3 KB
Line 
1%'mouse_motion': permanently called by mouse motion over a figure (Callback for 'WindowButtonMotionFcn' of the figure)
2%-----------------------------------------------------------------------
3%
4% function mouse_motion(hObject,eventdata,handles)
5% activated by the command:
6% set(hObject,'WindowButtonMotionFcn',{'mouse_motion',handles})
7% where hObject is the handle of the figure
8%
9%AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
10%  Copyright Joel Sommeria, 2008, LEGI / CNRS-UJF-INPG, sommeria@coriolis-legi.org.
11%AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
12%     This file is part of the toolbox UVMAT.
13%
14%     UVMAT is free software; you can redistribute it and/or modify
15%     it under the terms of the GNU General Public License as published by
16%     the Free Software Foundation; either version 2 of the License, or
17%     (at your option) any later version.
18%
19%     UVMAT is distributed in the hope that it will be useful,
20%     but WITHOUT ANY WARRANTY; without even the implied warranty of
21%     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
22%     GNU General Public License (file UVMAT/COPYING.txt) for more details.
23%AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
24
25function mouse_motion(hObject,eventdata,handles)
26
27if ~exist('handles','var')
28    return
29end
30FigData=get(hObject,'UserData');
31
32if ishandle(FigData)% case of a zoom plot, the handle of the parent rectangle is stored in UserData, its parent is the plotting axes of the rectangle
33    currentfig=get(get(FigData,'parent'),'parent');
34else
35    currentfig=hObject;%usual plot
36end
37hhcurrentfig=guidata(currentfig);
38test_zoom=get(hhcurrentfig.CheckZoom,'Value');%test for zoom activated on the current figure
39test_draw=0;%test for mouse drawing of object, =0 by default
40test_object=0; %test for object editing or creation
41test_edit_object=0;% edit test for mouse shap: an arrow
42test_zoom_draw=0; % test for zoom drawing
43test_ruler=0;%test for active ruler
44% test_piv=0;% test for PIV correlation display
45huvmat=findobj(allchild(0),'tag','uvmat');%find the uvmat interface handle
46if ~isempty(huvmat)
47    hhuvmat=guidata(huvmat);
48    test_edit_object=get(hhuvmat.edit_object,'Value');
49    test_ruler=isequal(get(hhuvmat.MenuRuler,'checked'),'on');
50end
51test_piv=0;
52if isfield(FigData,'CivHandle')
53    if ~ishandle(FigData.CivHandle)
54        delete(hObject)
55        return
56    end
57    hhciv=guidata(FigData.CivHandle);
58    test_piv=1;
59end
60
61%find the current axe 'haxes' and display the current mouse position or uicontrol tag
62text_displ_1='';
63text_displ_2='';
64text_displ_3='';
65text_displ_4='';
66
67AxeData=[];%default
68mouse=[];
69xy=[];%default
70
71pointershape='arrow';% default pointer is an arrow
72
73xy_fig=get(hObject,'CurrentPoint');% current point of the current figure (gcbo)
74hchild=get(hObject,'Children');%handles of all objects in the current figure
75
76%% loop on all the objects in the current figure and detect whether the mouse is over a plot  axes
77haxes=[];
78for ichild=1:length(hchild)
79    obj_pos=get(hchild(ichild),'Position');
80    if numel(obj_pos)~=4% for some versions of matlab a uicontextmenu appears
81        continue
82    end%position of the object
83    if xy_fig(1) >=obj_pos(1) && xy_fig(2) >= obj_pos(2)&& xy_fig(1) <=obj_pos(1)+obj_pos(3) && xy_fig(2) <= obj_pos(2)+obj_pos(4);
84        htype=get(hchild(ichild),'Type');%type of the crrent child
85        %if the mouse is over an axis, look at the data
86        if strcmp(htype,'axes')
87            haxes=hchild(ichild);
88            xy=get(haxes,'CurrentPoint');%xy(1,1),xy(1,2): current x,y positions in axes coordinates
89            AxeData=get(haxes,'UserData');% data attached to the axis
90            if isfield(AxeData,'Drawing')&& ~isempty(AxeData.Drawing)
91                test_draw=~isequal(AxeData.Drawing,'off');%=1 if mouse drawing of object is active
92            end
93            test_zoom_draw=test_draw && isequal(AxeData.Drawing,'zoom')&& isfield(AxeData,'CurrentOrigin') && isequal(get(gcf,'SelectionType'),'normal');
94            test_object=test_draw && isfield(AxeData,'CurrentObject') && ~isempty(AxeData.CurrentObject) && ishandle(AxeData.CurrentObject);
95            if ~test_edit_object && ~test_zoom_draw && ~test_ruler
96                pointershape='crosshair';%set pointer with cross shape (default when mouse is over an axis)
97            end
98            FigData=get(currentfig,'UserData');
99            tagaxes=get(haxes,'tag');
100            if isfield(FigData,tagaxes)
101                eval(['Field=FigData.' tagaxes ';'])
102                if isfield(Field,'ListVarName')
103                    [CellVarIndex,NbDim,VarType]=find_field_indices(Field);%analyse the physical fields contained in Field
104                    text_displ_1='';
105                    text_displ_2='';
106                    text_displ_3='';
107                    text_displ_4='';
108                    ivec=[];
109                    xName='';
110                    z=[];
111                    for icell=1:numel(CellVarIndex)%look for all physical fields
112                        if NbDim(icell)>=2 % select 2D field
113                            if  isfield(Field,'Mesh') && ~isempty(Field.Mesh)&& ~isempty(VarType{icell}.coord_x) && ~isempty(VarType{icell}.coord_y)%case of unstructured data
114                                eval(['X=Field.' Field.ListVarName{VarType{icell}.coord_x} ';'])
115                                eval(['Y=Field.' Field.ListVarName{VarType{icell}.coord_y} ';'])
116                                flag_vec=(X<(xy(1,1)+Field.Mesh/3) & X>(xy(1,1)-Field.Mesh/3)) & ...%flagx=1 for the vectors with x position selected by the mouse
117                                    (Y<(xy(1,2)+Field.Mesh/3) & Y>(xy(1,2)-Field.Mesh/3));%f
118                                ivec=find(flag_vec,1);% search the (first) selected vector index ivec
119                                hhh=findobj(haxes,'Tag','vector_marker');
120                                if ~isempty(ivec)
121                                    % mark the vectors with a circle in the absence of other operations
122                                    if ~test_object && ~test_edit_object && ~test_ruler
123                                        pointershape='arrow'; %mouse indicates  the detection of a vector
124                                        if isempty(hhh)
125                                            set(0,'CurrentFigure',currentfig)
126                                            set(currentfig,'CurrentAxes',haxes)
127                                            rectangle('Curvature',[1 1],...
128                                                'Position',[X(ivec)-Field.Mesh/2 Y(ivec)-Field.Mesh/2 Field.Mesh Field.Mesh],'EdgeColor','m',...
129                                                'LineStyle','-','Tag','vector_marker');
130                                        else
131                                            set(hhh,'Visible','on')
132                                            set(hhh,'Position',[X(ivec)-Field.Mesh/2 Y(ivec)-Field.Mesh/2 Field.Mesh Field.Mesh])
133                                        end
134                                    end
135                                    %display the field values
136                                    for ivar=1:numel(CellVarIndex{icell})
137                                        VarName=Field.ListVarName{CellVarIndex{icell}(ivar)};
138                                        eval(['VarVal=Field.' VarName '(ivec);'])
139                                        var_text=[VarName '=' num2str(VarVal,3) ','];
140                                        if isequal(ivar,VarType{icell}.coord_x)||isequal(ivar,VarType{icell}.coord_y)||isequal(ivar,VarType{icell}.coord_z)
141                                            text_displ_1=[text_displ_1 var_text];
142                                        elseif isequal(ivar,VarType{icell}.vector_x)||isequal(ivar,VarType{icell}.vector_y)||isequal(ivar,VarType{icell}.vector_z)
143                                            text_displ_3=[text_displ_3 var_text];
144                                        else
145                                            text_displ_4=[text_displ_4 var_text];
146                                        end
147                                    end
148                                else
149                                    if ~isempty(hhh)
150                                        set(hhh,'Visible','off')
151                                    end
152                                end
153                            elseif numel(VarType{icell}.coord) >=2 & VarType{icell}.coord > 0 %structured coordinates
154                                yName=Field.ListVarName{VarType{icell}.coord(1)};
155                                xName=Field.ListVarName{VarType{icell}.coord(2)};
156                                 eval(['y=Field.' yName ';'])
157                                 eval(['x=Field.' xName ';'])
158                                VarName=Field.ListVarName{CellVarIndex{icell}(1)};
159                                eval(['nxy=size(Field.' VarName ');']);
160                                MaxAY=max(y(1),y(end)); %#ok<COLND>
161                                MinAY=min(y(1),y(end)); %#ok<COLND>
162                                if (xy(1,1)>x(1))&(xy(1,1)<x(end))&(xy(1,2)<MaxAY)&(xy(1,2)>MinAY) %#ok<COLND>
163                                    indx0=1+round((nxy(2)-1)*(xy(1,1)-x(1))/(x(end)-x(1)));%#ok<COLND> % index x of pixel
164                                    indy0=1+round((nxy(1)-1)*(xy(1,2)-y(1))/(y(end)-y(1)));%#ok<COLND> % index y of pixel
165                                    if indx0>=1 & indx0<=nxy(2) & indy0>=1 & indy0<=nxy(1)
166                                        text_displ_2=['i='  num2str(indx0) ',j=' num2str(indy0) ','];
167                                        for ivar=1:numel(CellVarIndex{icell})
168                                            VarName=Field.ListVarName{CellVarIndex{icell}(ivar)};
169                                            eval(['VarVal=Field.' VarName '(indy0,indx0,:);'])
170                                            var_text=[VarName '=' num2str(VarVal) ','];
171                                            text_displ_2=[text_displ_2 var_text];
172                                        end
173                                    end
174                                end
175                            end
176                        end
177                    end
178              % display the current x,y coordinates in the absence of detected vector
179                    if isempty(ivec)
180                        if isempty(xName)
181                            xName='x';
182                            yName='y';
183                        end
184                        text_displ_1=[xName '=' num2str(xy(1,1),3) ', ' yName '=' num2str(xy(1,2),3) ','];
185                    end
186              %display the z coordinate if defined by the projection plane
187                    if isfield(Field,'PlaneCoord')
188%                             ZIndex=Field.ZIndex;
189                        if size(Field.PlaneCoord)>=[1 3]
190                            z=Field.PlaneCoord(1,3);
191                            if isfield(Field,'PlaneAngle')&&~isequal(Field.PlaneAngle,[0 0 0])
192                                om=norm(Field.PlaneAngle);%norm of rotation angle in radians
193                                OmAxis=Field.PlaneAngle/om; %unit vector marking the rotation axis
194                                cos_om=cos(pi*om/180);
195                                sin_om=sin(pi*om/180);
196                                coeff=OmAxis(3)*(1-cos_om);
197                                norm_plane(1)=OmAxis(1)*coeff+OmAxis(2)*sin_om;
198                                norm_plane(2)=OmAxis(2)*coeff-OmAxis(1)*sin_om;
199                                norm_plane(3)=OmAxis(3)*coeff+cos_om;
200                                Z0=norm_plane*Field.PlaneCoord'/norm_plane(3);
201                                z=Z0-norm_plane(1)*xy(1,1)/norm_plane(3)-norm_plane(2)*xy(1,2)/norm_plane(3);
202                            end
203                        end
204                    end
205                    if ~isempty(z)
206                        text_displ_1=[text_displ_1 ' z=' num2str(z,3)];
207                    end
208               % case of PIV correlation display
209                    if test_piv
210                        par=read_GUI(hhciv.Civ1);
211                        [dd,ind_pt]=min(abs(Field.X-xy(1,1))+abs(Field.Y-xy(1,2)));
212                        xround=Field.X(ind_pt);
213                        yround=Field.Y(ind_pt);
214                        par.Grid=[xround size(Field.A,1)-yround+1];
215                        % mark the correlation box with a rectangle
216                        par.ImageA=Field.A;
217                        par.ImageB=Field.B;
218                        par.ImageHeight=size(par.ImageA,1);
219                        par.ImageWidth=size(par.ImageA,2);
220                        Param.Civ1=par;
221                        ibx2=floor((par.Bx-1)/2);
222                        iby2=floor((par.By-1)/2);
223                        isx2=floor((par.Searchx-1)/2);
224                        isy2=floor((par.Searchy-1)/2);
225                        shiftx=par.Shiftx;
226                        shifty=par.Shifty;     
227                        hhh=findobj(haxes,'Tag','PIV_box_marker');
228                        hhhh=findobj(haxes,'Tag','PIV_search_marker');
229                        if isempty(hhh)
230                            set(0,'CurrentFigure',currentfig)
231                            set(currentfig,'CurrentAxes',haxes)
232                            rectangle('Curvature',[0 0],...
233                                'Position',[xround-ibx2 yround-iby2 2*ibx2 2*iby2],'EdgeColor','m',...
234                                'LineStyle','-','Tag','PIV_box_marker');
235                            rectangle('Curvature',[0 0],...
236                                'Position',[xround-isx2+shiftx yround-isy2+shifty 2*isx2 2*isy2],'EdgeColor','m',...
237                                'LineStyle','- -','Tag','PIV_search_marker');
238                        else
239                            set(hhh,'Position',[xround-ibx2 yround-iby2 2*ibx2 2*iby2])
240                            set(hhhh,'Position',[xround-isx2+shiftx yround-isy2+shifty 2*isx2 2*isy2])
241                        end
242                        [Data,errormsg,result_conv]= civ_matlab(Param);
243                        if ~isempty(errormsg)
244                            text_displ_4=errormsg;
245                        else
246                            rangx(1)=-(isx2-ibx2)+shiftx;
247                            rangx(2)=isx2-ibx2+shiftx;
248                            rangy(1)=-(isy2-iby2)-shifty;
249                            rangy(2)=(isy2-iby2)-shifty;
250                            hcorr=[];
251                            if isfield(AxeData,'CurrentCorrImage')
252                                hcorr=AxeData.CurrentCorrImage;
253                                if ~ishandle(hcorr)
254                                    hcorr=[];
255                                end
256                            end
257                            if isempty(hcorr)
258                                corrfig=findobj(allchild(0),'tag','corrfig');
259                                if ~isempty(corrfig)
260                                    set(0,'CurrentFigure',corrfig(1))
261                                    AxeData.CurrentCorrImage=imagesc(rangx,-rangy,result_conv,[0 1]);
262                                    AxeData.CurrentVector=line([0 Data.Civ1_U],[0 Data.Civ1_V],'Tag','vector');
263                                    colorbar
264                                    set(haxes,'UserData',AxeData)
265                                    set(get(AxeData.CurrentCorrImage,'parent'),'YDir','normal')
266                                end
267                            else
268                                set(AxeData.CurrentCorrImage,'CData',result_conv)
269                                set(AxeData.CurrentCorrImage,'XData',rangx)
270                                set(AxeData.CurrentCorrImage,'YData',-rangy)
271                                set(AxeData.CurrentVector,'XData',[0 Data.Civ1_U],'YData',[0 Data.Civ1_V])
272                            end
273                        end
274                    end
275                end
276            end
277        end
278    end
279end
280if ~isempty(text_displ_1)
281set(handles.text_display,'String',[{text_displ_1};{text_displ_2};{text_displ_3};{text_displ_4}])
282else
283   set(handles.text_display,'String',get(handles.text_display,'UserData'))
284end
285
286%%%%%%%%%%%%%
287%% draw a zoom rectangle if no object creation is selected
288if test_zoom_draw
289   xy_rect=AxeData.CurrentOrigin;
290   if ~isempty(xy_rect)
291        rect(1)=min(xy(1,1),xy_rect(1));%origin rectangle, x coordinate
292        rect(2)=min(xy(1,2),xy_rect(2));%origin rectangle, y coordinate
293        rect(3)=abs(xy(1,1)-xy_rect(1));%rectangle width
294        rect(4)=abs(xy(1,2)-xy_rect(2));%rectangle height
295        if rect(3)>0 & rect(4)>0
296            if isfield(AxeData,'CurrentRectZoom')& ishandle(AxeData.CurrentRectZoom)
297                set(AxeData.CurrentRectZoom,'Position',rect);%update the rectangle position
298            else
299                AxeData.CurrentRectZoom=rectangle('Position',rect,'LineStyle',':','Tag','rect_zoom');
300                set(haxes,'UserData',AxeData)
301            end
302        end
303   end
304    pointershape='arrow';
305end
306
307%%%%%%%%%%%%%%%%%
308%% create or modify an object
309if ~isempty(huvmat) && test_object
310    PlotData=get(AxeData.CurrentObject,'UserData');
311    huvmat=findobj(allchild(0),'Name','uvmat');%find the uvmat interface handle
312    if ~isempty(huvmat)
313        UvData=get(huvmat,'UserData');
314        if ~isfield(PlotData,'IndexObj')
315             return
316        end
317        ObjectData=UvData.Object{PlotData.IndexObj};
318        XYData=AxeData.CurrentOrigin;
319        if isequal(AxeData.Drawing,'create') && isfield(AxeData,'CurrentOrigin') && ~isempty(AxeData.CurrentOrigin)
320           if strcmp(ObjectData.Type,'line')||strcmp(ObjectData.Type,'polyline')||strcmp(ObjectData.Type,'polygon')||strcmp(ObjectData.Type,'points')
321              ObjectData.Coord=[ObjectData.Coord ;xy(1,1:2)];
322             % ObjectData.Coord(end,:)=xy(1,:);
323           elseif strcmp(ObjectData.Type,'rectangle')||strcmp(ObjectData.Type,'ellipse')||strcmp(ObjectData.Type,'volume')
324              ObjectData.Coord(1,1)=(xy(1,1)+XYData(1))/2;%origin rectangle, x coordinate
325              ObjectData.Coord(1,2)=(xy(1,2)+XYData(2))/2;
326              ObjectData.RangeX=abs(xy(1,1)-XYData(1))/2;%rectangle width
327              ObjectData.RangeY=abs(xy(1,2)-XYData(2))/2;%rectangle height
328           elseif isequal(ObjectData.Type,'plane') %case of 'plane'
329                DX=(xy(1,1)-ObjectData.Coord(1,1));
330                DY=(xy(1,2)-ObjectData.Coord(1,2));
331                ObjectData.Phi=(angle(DX+i*DY))*180/pi;%rectangle widt
332                if isfield(ObjectData,'RangeX')
333                    XMax=sqrt(DX*DX+DY*DY);
334                    if XMax>max(ObjectData.RangeX)
335                        ObjectData.RangeX=[min(ObjectData.RangeX) XMax];
336                    end
337                end
338           end
339            plot_object(ObjectData,[],AxeData.CurrentObject,'m');
340            pointershape='crosshair';
341        elseif  isequal(AxeData.Drawing,'translate')
342            DX=xy(1,1)-XYData(1);%translation from initial position
343            DY=xy(1,2)-XYData(2);
344            ObjectData.Coord(:,1)=ObjectData.Coord(:,1)+DX;
345            ObjectData.Coord(:,2)=ObjectData.Coord(:,2)+DY;
346            plot_object(ObjectData,[],AxeData.CurrentObject,'m');
347            pointershape='fleur';
348        elseif  isequal(AxeData.Drawing,'deform')
349            ind_move=AxeData.CurrentIndex;
350            ObjectData.Coord(ind_move,1)=xy(1,1);
351            ObjectData.Coord(ind_move,2)=xy(1,2);
352            plot_object(ObjectData,[],AxeData.CurrentObject,'m');
353            pointershape='circle';
354        end
355    end
356end   
357
358%% detect calibration points if the GUI geometry_calib is opened
359h_geometry_calib=findobj(allchild(0),'Name','geometry_calib'); %find the geomterty_calib GUI
360if ~test_zoom && ~isempty(h_geometry_calib)
361    pointershape='crosshair';%default for geometry_calib: ready to create new points
362    hh_geometry_calib=guidata(h_geometry_calib);
363    if  ~isempty(xy) && isfield(hh_geometry_calib,'ListCoord')
364        h_ListCoord=hh_geometry_calib.ListCoord; %findobj(h_geometry_calib,'Tag','ListCoord');
365        Coord=get(h_ListCoord,'String');
366        data=read_geometry_calib(Coord);%transform char cell to numbers
367        if size(data.Coord,2)>=5
368            XCoord=(data.Coord(:,4));
369            YCoord=(data.Coord(:,5));
370            xy=get(haxes,'CurrentPoint');%xy(1,1),xy(1,2): current x,y positions in axes coordinates
371            if ~isempty(xy)
372                xlim=get(haxes,'XLim');
373                ind_range_x=abs((xlim(2)-xlim(1))/50);
374                ylim=get(haxes,'YLim');
375                ind_range_y=abs((ylim(2)-ylim(1))/50);
376                ind_range=sqrt(ind_range_x*ind_range_y);
377                index_point=find((XCoord<xy(1,1)+ind_range) & (XCoord>xy(1,1)-ind_range) & ...%flagx=1 for the vectors with x position selected by the mouse
378                              (YCoord<xy(1,2)+ind_range) & (YCoord>xy(1,2)-ind_range),1);%find the first calibration point in the neighborhood of the mouse
379                if ~isempty(index_point)
380                    pointershape='arrow';% default pointer is an arrow
381                end
382                hh=findobj('Tag','calib_points');%look for handle of calibration points
383               if ~isempty(hh) && ~isempty(get(hh,'UserData')) && get(hh_geometry_calib.edit_append,'Value')
384                    index_point=get(hh,'UserData');
385                    XCoord(index_point)=xy(1,1);
386                    YCoord(index_point)=xy(1,2);
387                    set(hh,'XData',XCoord)
388                    set(hh,'YData',YCoord)
389               end
390                if ~isempty(index_point)
391                    set(h_ListCoord,'Value',index_point)%mrk the point on the GUI geometry_calib
392                    hhh=findobj('Tag','calib_marker');%look for handle of point marker (circle)
393                    if ~isempty(hhh)
394                        set(hhh,'Position',[XCoord(index_point)-ind_range/2 YCoord(index_point)-ind_range/2 ind_range ind_range])
395                    end
396                end
397            end
398        end
399    end
400end
401
402%% draw ruler
403if test_ruler && isfield(AxeData,'Drawing') && isequal(AxeData.Drawing,'ruler')
404    if isfield(AxeData,'RulerHandle')
405        pointershape='crosshair'; %give  the mouse pointer a cross shape
406        RulerCoord=[AxeData.RulerCoord ;xy(1,1:2)]; %coordinates defining the ruler segment
407        set(AxeData.RulerHandle,'XData',RulerCoord(:,1));% updtate the x coordinates for the ruler graphic object
408        set(AxeData.RulerHandle,'YData',RulerCoord(:,2));% updtate the y coordinates for the ruler graphic object
409    end
410end
411
412%% update the mouse pointer
413set(currentfig,'Pointer',pointershape);
Note: See TracBrowser for help on using the repository browser.