source: trunk/src/mouse_up.m @ 213

Last change on this file since 213 was 210, checked in by sommeria, 13 years ago

correction bug for vector plot (Fixscale did not work), extensions for 3D fields

File size: 20.0 KB
Line 
1%'mouse_up': function  activated when the mouse button is released
2%------------------------------------------------------------------------
3% function mouse_up(hObject,eventdata,handles)
4% activated by the command:
5% set(hObject,'WindowButtonUpFcn',{'mouse_up'}),
6% where hObject is the handle of the figure
7
8%AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
9%  Copyright Joel Sommeria, 2008, LEGI / CNRS-UJF-INPG, sommeria@coriolis-legi.org.
10%AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
11%     This file is part of the toolbox UVMAT.
12%
13%     UVMAT is free software; you can redistribute it and/or modify
14%     it under the terms of the GNU General Public License as published by
15%     the Free Software Foundation; either version 2 of the License, or
16%     (at your option) any later version.
17%
18%     UVMAT is distributed in the hope that it will be useful,
19%     but WITHOUT ANY WARRANTY; without even the implied warranty of
20%     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
21%     GNU General Public License (file UVMAT/COPYING.txt) for more details.
22%AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
23
24function mouse_up(hObject,eventdata,handles)
25%MouseAction='none'; %default
26test_zoom=0;%default
27test_ruler=0;%default
28currentfig=hObject;
29tagfig=get(currentfig,'tag');
30currentaxes=gca; %store the current axes handle
31AxeData=get(currentaxes,'UserData');
32if isfield(AxeData,'CurrentOrigin')
33    CurrentOrigin=AxeData.CurrentOrigin;
34end
35if isfield(AxeData,'ParentRect')% case of a zoom plot as current axis
36    parentaxes=get(AxeData.ParentRect,'parent');
37    AxeData=get(parentaxes,'UserData');
38    controlGUI=get(parentaxes,'parent');%handles of the GUI parent of the zoom plot
39    hhcurrentfig=guidata(controlGUI);
40    testsubplot=1;
41else
42    hhcurrentfig=guidata(currentfig);%the current figure is a GUI (uvmat or view_field)
43    testsubplot=0;
44end
45test_zoom=get(hhcurrentfig.zoom,'Value');
46
47huvmat=findobj(allchild(0),'tag','uvmat');%find the uvmat interface handle
48if ~isempty(huvmat)
49    hhuvmat=guidata(huvmat);
50    UvData=get(huvmat,'UserData');
51   test_ruler=~test_zoom && isequal(get(hhuvmat.MenuRuler,'checked'),'on');%test for ruler  action, second priority
52end
53test_drawing=0;%default
54
55%% finalize the fabrication or the translation/deformation of an object and plot the corresponding projected field
56if ~isempty(huvmat) && isfield(AxeData,'Drawing') && ~isequal(AxeData.Drawing,'off') && isfield(AxeData,'CurrentObject')...
57           && ~isempty(AxeData.CurrentObject) && ishandle(AxeData.CurrentObject)
58    xy=get(currentaxes,'CurrentPoint');%xy(1,1),xy(1,2): current x,y positions in axes coordinates
59    PlotData=get(AxeData.CurrentObject,'UserData');%get data attached to the current projection object 
60    IndexObj=PlotData.IndexObj;
61    ObjectData=UvData.Object{IndexObj};   
62    ObjectData.enable_plot=1;
63   
64    % ending translation
65    if isequal(AxeData.Drawing,'translate')
66        XYData=AxeData.CurrentOrigin;
67        DX=xy(1,1)-XYData(1);%translation from initial position
68        DY=xy(1,2)-XYData(2);
69        ObjectData.Coord(:,1)=ObjectData.Coord(:,1)+DX;
70        ObjectData.Coord(:,2)=ObjectData.Coord(:,2)+DY;
71       
72    %ending object deformation
73    elseif isequal(AxeData.Drawing,'deform')
74        ind_move=AxeData.CurrentIndex;
75        ObjectData.Coord(ind_move,1)=xy(1,1);
76        ObjectData.Coord(ind_move,2)=xy(1,2);
77       
78    %creating object   
79    else   
80        if strcmp(ObjectData.Style,'line')||strcmp(ObjectData.Style,'polyline')||...
81                strcmp(ObjectData.Style,'polygon')||strcmp(ObjectData.Style,'points')
82            if isfield(AxeData,'ObjectCoord') && size(AxeData.ObjectCoord,2)==3
83              xy(1,3)=AxeData.ObjectCoord(1,3); % z coordinate of the mouse: to generalise ...
84            else
85                 xy(1,3)=0; % z coordinate set to 0 by default
86            end
87            if ~isequal(ObjectData.Coord,xy(1,:))
88                ObjectData.Coord=[ObjectData.Coord ;xy(1,:)];% append the coordiantes marked by the mouse to the eobject
89            end
90        elseif isequal(ObjectData.Style,'rectangle')||isequal(ObjectData.Style,'ellipse')||isequal(ObjectData.Style,'volume')
91            XYData=AxeData.CurrentOrigin;
92            ObjectData.Coord(1,1)=(xy(1,1)+XYData(1))/2;%origin rectangle, x coordinate
93            ObjectData.Coord(1,2)=(xy(1,2)+XYData(2))/2;
94            ObjectData.RangeX=abs(xy(1,1)-XYData(1))/2;%rectangle width
95            ObjectData.RangeY=abs(xy(1,2)-XYData(2))/2;%rectangle height
96        elseif isequal(ObjectData.Style,'plane') %case of 'plane'
97            DX=(xy(1,1)-ObjectData.Coord(1,1));
98            DY=(xy(1,2)-ObjectData.Coord(1,2));
99            ObjectData.Phi=(angle(DX+i*DY))*180/pi;%rectangle width
100            if isfield(ObjectData,'RangeX')
101                XMax=sqrt(DX*DX+DY*DY);
102                if XMax>max(ObjectData.RangeX)
103                    ObjectData.RangeX=[min(ObjectData.RangeX) XMax];
104                end
105            end
106        end
107    end
108    if strcmp(ObjectData.Style,'rectangle')||strcmp(ObjectData.Style,'ellipse')
109        NbDefPoint=1; 
110    elseif strcmp(ObjectData.Style,'line')|| strcmp(ObjectData.Style,'plane');
111        NbDefPoint=2;
112    else
113         NbDefPoint=3;
114    end
115   
116    %show object coordinates in the GUI set_object
117    h_set_object=findobj(allchild(0),'Tag','set_object');
118    hh_set_object=guidata(h_set_object);
119    set(hh_set_object.XObject,'String',num2str(ObjectData.Coord(:,1),4));
120    set(hh_set_object.YObject,'String',num2str(ObjectData.Coord(:,2),4));
121    set(hh_set_object.ZObject,'String',num2str(ObjectData.Coord(:,3),4));
122    if strcmp(ObjectData.Style,'rectangle')||strcmp(ObjectData.Style,'ellipse')
123        set(hh_set_object.XMax,'String',num2str(ObjectData.RangeX,4));
124        set(hh_set_object.YMax,'String',num2str(ObjectData.RangeY,4));
125    end
126    if NbDefPoint<=2 || isequal(get(currentfig,'SelectionType'),'alt') ||...
127              strcmp(AxeData.Drawing,'translate') || strcmp(AxeData.Drawing,'deform');%stop drawing
128        AxeData.CurrentOrigin=[]; %suppress the current origin
129       if isequal(ObjectData.Style,'line') && size(ObjectData.Coord,1)<=1
130           AxeData.Drawing='off';
131           set(currentaxes,'UserData',AxeData);
132            return % line needs at leqst two points
133       end
134       if  ~isempty(ObjectData)
135%              testmask=0;
136%              hmask=findobj(huvmat,'Tag','makemask');
137%              if ~isempty(hmask)
138%                 testmask=get(hmask,'Value');
139%              end
140
141            %% update the object representation
142            ObjectData.DisplayHandle_uvmat=UvData.Object{IndexObj}.DisplayHandle_uvmat;
143            ObjectData.DisplayHandle_view_field=UvData.Object{IndexObj}.DisplayHandle_view_field;
144            UvData.Object{IndexObj}=ObjectData;%update the current object properties
145            hhuvmat=guidata(huvmat);
146            IndexObj_1=get(hhuvmat.list_object_1,'Value');
147            IndexObj_2=get(hhuvmat.list_object_2,'Value');
148            UvData.Object=update_obj(UvData,IndexObj_1,IndexObj_2);
149
150            %% plot the field projected on the object
151            ProjData= proj_field(UvData.Field,ObjectData);%project the current interface field on ObjectData
152            if ~isempty(ProjData)
153                if strcmp(tagfig,'uvmat')% uvmat plot selected, projection plot seen on view_field
154                    hview_field=findobj(allchild(0),'tag','view_field');
155                    if isempty(hview_field)
156                        hview_field=view_field;
157                    end
158                    ViewFieldData=get(hview_field,'UserData');
159                    ViewFieldData.axes3=ProjData;
160                    set(hview_field,'UserData',ViewFieldData)
161                    hh_plotfield=guidata(hview_field);
162                else
163                    UvData.axes3=ProjData;
164                    hh_plotfield=hhuvmat;
165                end
166                [PlotType,PlotParam]=plot_field(ProjData,hh_plotfield.axes3,read_plot_param(hh_plotfield));%update an existing field plot
167                write_plot_param(hh_plotfield,PlotParam); %update the display of plotting parameters for the current object
168            end
169            set(hhuvmat.edit_object,'BackgroundColor',[1 1 0]);% paint the edit text in yellow
170            set(hhuvmat.edit_object,'Value',1);%
171            set(hhuvmat.edit_object,'Enable','on');%
172            set(hhuvmat.MenuEditObject,'Enable','on');%
173            set(hhuvmat.MenuEdit,'Enable','on');%
174        end
175    else
176       AxeData.CurrentOrigin=[xy(1,1) xy(1,2)]; %the current point becomes the new current origin
177       test_drawing=1;%allow continuation of drawing object
178       UvData.Object{IndexObj}=ObjectData;
179    end
180    hother=findobj('Tag','deformpoint');%find all the deformpoints
181    set(hother,'Color','b');%reset all the deformpoints in 'blue'
182else
183    test_drawing=0;
184end
185
186%% creation of a new zoom plot
187if isequal(get(currentfig,'SelectionType'),'normal');%if left button has been pressed
188    hparentfig=currentfig;
189    %open or update a new zoom figure if a rectangle has been drawn
190    if ishandle(currentaxes);
191        if isfield(AxeData,'CurrentRectZoom') && ~isempty(AxeData.CurrentRectZoom) && ishandle(AxeData.CurrentRectZoom)
192            PosRect=get(AxeData.CurrentRectZoom,'Position');
193            if isfield(AxeData,'CurrentVec') && ~isempty(AxeData.CurrentVec) && ishandle(AxeData.CurrentVec)
194                delete(AxeData.CurrentVec)
195            end
196            if ~testsubplot
197                hfig2=figure;%create new figure
198                set(hfig2,'name','zoom')
199                set(hfig2,'Units','normalized')
200                set(hfig2,'Position',[0.2 0.33 0.6 0.6]);
201                map=colormap(currentaxes);
202                colormap(map);%transmit the current colormap to the zoom fig
203                set(hfig2,'Position',[0.2 0.33 0.6 0.6]);         
204                set(hfig2,'Unit','normalized')
205                set(hfig2,'KeyPressFcn',{@keyboard_callback,handles})%set keyboard action function
206                set(hfig2,'WindowButtonMotionFcn',{@mouse_motion,handles})%set mouse action function
207                set(hfig2,'WindowButtonDownFcn',{@mouse_down})%set mouse click action function
208                set(hfig2,'WindowButtonUpFcn',{@mouse_up,handles})
209                set(hfig2,'DeleteFcn',{@close_fig,AxeData.CurrentRectZoom,'zoom'})
210                set(hfig2,'UserData',AxeData.CurrentRectZoom)% record the parent object (zoom rectangle) in the new fig
211                AxeData.ZoomAxes=copyobj(currentaxes,hfig2); %copy the current graph axes to the zoom figure
212                ChildAxeData=get(AxeData.ZoomAxes,'UserData');
213                if isfield(ChildAxeData,'ParentGUI')
214                    ChildAxeData=rmfield(ChildAxeData,'ParentGUI');%no parent GUI, e.g. uvmat,  for the new plot
215                end
216                %figure(hfig2)
217                %set(0,'CurrentFigure',hfig2)% the zoom figure becomes the current figure
218                set(AxeData.ZoomAxes,'Position',[0.1300    0.1100    0.7750    0.8150])% standard axes position on a figure
219                hcol=findobj(hparentfig,'Tag','Colorbar'); %look for colorbar axes
220                if ~isempty(hcol)
221                    hcol_new=colorbar;
222                    YTick=get(hcol,'YTick');
223                    YTicklabel=get(hcol,'Yticklabel');
224                    colbarlim=get(hcol,'YLim');
225                    newcolbarlim=get(hcol_new,'YLim');
226                    scale_bar=(newcolbarlim(2)-newcolbarlim(1))/(colbarlim(2)-colbarlim(1));
227                    YTick_rescaled=newcolbarlim(1)+scale_bar*(YTick-colbarlim(1));
228                    set(hcol_new,'YTick',YTick_rescaled);
229                    set(hcol_new,'Yticklabel',YTicklabel);
230                end
231            end
232    %             if ishandle(AxeData.ZoomAxes)
233%             hnew_rect=findobj(AxeData.ZoomAxes,'Tag','rect_zoom');
234%             if ~isempty(hnew_rect)
235%                 delete(hnew_rect);
236
237                ChildAxeData.CurrentRectZoom=[]; % no rect zoom in the new window
238                ChildAxeData.Drawing='off';
239                ChildAxeData.ParentRect=AxeData.CurrentRectZoom;%set the rectangle as a 'parent' associated to the new axe
240                PosRect=CurrentOrigin;
241                xy=get(currentaxes,'CurrentPoint');%xy(1,1),xy(1,2): current x,y positions in axes coordinates
242                set(AxeData.ZoomAxes,'Xlim',[PosRect(1) xy(1,1)])
243                set(AxeData.ZoomAxes,'Ylim',[PosRect(2) xy(1,2)])
244%             end
245            set(AxeData.ZoomAxes,'UserData',ChildAxeData);%update the AxeData of the new axes
246        end
247    end
248end
249
250%% zoom in or out by a factor 2 if no new figure is created
251if test_zoom
252    xy=get(currentaxes,'CurrentPoint');%xy(1,1),xy(1,2): current x,y positions in axes coordinates
253    xlim=get(currentaxes,'XLim');
254    ylim=get(currentaxes,'YLim');
255    if  isequal(get(currentfig,'SelectionType'),'normal');%if left button has been pressed, zoom in by a factor of 2
256        xlim(1)=0.5*xy(1,1)+0.5*xlim(1);
257        xlim(2)=0.5*xy(1,1)+0.5*xlim(2);
258        set(currentaxes,'XLim',xlim)
259        ylim(2)=0.5*xy(1,2)+0.5*ylim(2);
260        ylim(1)=0.5*xy(1,2)+0.5*ylim(1);
261        set(currentaxes,'YLim',ylim)
262        %zoom out by a factor of 2 out when the right mouse button has been used
263    else%if isequal(get(currentfig,'SelectionType'),'alt'); %if right button has been pressed
264        xlim(1)=2*xlim(1)-xy(1,1);
265        xlim(2)=2*xlim(2)-xy(1,1);
266        ylim(1)=2*ylim(1)-xy(1,2);
267        ylim(2)=2*ylim(2)-xy(1,2);
268        %             ylim_new(1)=(1+alpha)*ylim(1)/2+(1-alpha)*ylim(2)/2;
269        %             ylim_new(2)=(1-alpha)*ylim(1)/2+(1+alpha)*ylim(2)/2;
270        if isfield(AxeData,'RangeX')&& isfield(AxeData,'RangeY')
271            xlim(1)=max(AxeData.RangeX(1),xlim(1));
272            xlim(2)=min(AxeData.RangeX(2),xlim(2));
273            ylim(1)=max(AxeData.RangeY(1),ylim(1));
274            ylim(2)=min(AxeData.RangeY(2),ylim(2));
275            if isequal(xlim,AxeData.RangeX) && isequal(ylim,AxeData.RangeY)
276                set(hhuvmat.zoom,'Value',0)
277                set(hhuvmat.zoom,'BackgroundColor',[0.7 0.7 0.7])
278                set(hhuvmat.FixLimits,'Value',0)
279                set(hhuvmat.FixLimits,'BackgroundColor',[0.7 0.7 0.7])
280            end
281        end
282        set(currentaxes,'XLim',xlim)
283        set(currentaxes,'YLim',ylim)
284        %test whther zoom out is operating (to inactivate AxedAta
285        if ~isfield(AxeData,'CurrentXLim')|| ~isequal(xlim,AxeData.CurrentXLim)
286            AxeData.CurrentXLim=xlim;%
287        end
288    end
289%     if isfield(AxeData,'ParentRect')% update the position of the parent rectangle represneting the field
290%         hparentrect=AxeData.ParentRect;
291%         xlim=get(currentaxes,'XLim');
292%         ylim=get(currentaxes,'YLim');
293%         rect([1 2])=[xlim(1) ylim(1)];
294%         rect([3 4])=[xlim(2)-xlim(1) ylim(2)-ylim(1)];
295%         set(hparentrect,'Position',rect)
296    if isfield(AxeData,'LimEditBox')&& AxeData.LimEditBox% update display of the GUI containing the axis (uvmat or view_field)
297        set(hhcurrentfig.MinX,'String',num2str(xlim(1)))
298        set(hhcurrentfig.MaxX,'String',num2str(xlim(2)))
299        set(hhcurrentfig.MinY,'String',num2str(ylim(1)))
300        set(hhcurrentfig.MaxY,'String',num2str(ylim(2)))
301    end
302end
303
304%% editing calibration point
305if ~test_zoom && isfield(AxeData,'Drawing') && isequal(AxeData.Drawing,'calibration')
306    h_geometry_calib=findobj(allchild(0),'tag','geometry_calib'); %find the geomterty_calib GUI
307    if ~isempty(h_geometry_calib)
308        hh_geometry_calib=guidata(h_geometry_calib);
309        edit_test=get(hh_geometry_calib.edit_append,'Value');
310        hh=findobj(currentaxes,'tag','calib_points');%look for handle of calibration points
311        if ~isempty(hh) && edit_test
312            index_point=get(hh,'UserData');
313            set(hh,'UserData',[])%remove edit mode
314            h_ListCoord=hh_geometry_calib.ListCoord; %handles of the coordinate list
315            Coord=get(h_ListCoord,'String');
316            data=read_geometry_calib(Coord);
317            %         val=get(h_ListCoord,'Value');
318            xy=get(currentaxes,'CurrentPoint');%xy(1,1),xy(1,2): current x,y positions in axes coordinates
319            data.Coord(index_point,4)=xy(1,1);
320            data.Coord(index_point,5)=xy(1,2);
321            for ipoint=1:size(data.Coord,1)
322                for jcoord=1:5
323                    Coord_cell{ipoint,jcoord}=num2str(data.Coord(ipoint,jcoord),4);%display coordiantes with 4 digits
324                end
325            end
326            Tabchar=cell2tab(Coord_cell,' | ');
327            Tabchar=[Tabchar ;{'......'}];
328            set(h_ListCoord,'String',Tabchar)
329            %         coord_str=Coord{index_point}; %current line (string)
330            %         k=findstr('|',coord_str);%find separator indices on the string
331            %         blanks=blank
332            %         xy=get(currentaxes,'CurrentPoint');%xy(1,1),xy(1,2): current x,y positions in axes coordinates
333            %         if numel(k)>=3
334            %             coord_str=[coord_str(1:k(3)-1) ' | ' num2str(xy(1,1),4) ' | ' num2str(xy(1,2),4)]; %update the pixel information while preserving phys coord
335            %         else
336            %             coord_str=[ '    |    '  '    |    '  '    |    ' num2str(xy(1,1),4) '    |    ' num2str(xy(1,2),4)];
337            %         end
338            %         Coord{index_point}=coord_str;
339            %         set(h_ListCoord,'String',Coord)
340            %         data=read_geometry_calib(Coord);%transform char cell to numbers
341            set(hh,'XData',data.Coord(:,4))
342            set(hh,'YData',data.Coord(:,5))
343        end
344    end
345end
346
347
348%% finalising ruler
349if test_ruler
350    set(hhuvmat.MenuRuler,'checked','off')%desable the ruler option in uvmat 
351    xy=get(currentaxes,'CurrentPoint');% get the current mouse coordinates
352    RulerCoord=[AxeData.RulerCoord ;xy(1,1:2)];% append the recorded ruler origin to the current mouse coordinates
353    RulerCoord=diff(RulerCoord,1);% coordiante difference between segment end and beginning
354    RulerCoord=RulerCoord(1)+i*RulerCoord(2);
355    distance=abs(RulerCoord);
356    azimuth=(180/pi)*angle(RulerCoord);
357    msgbox_uvmat('RULER','',['length: ' num2str(distance,3) ',  angle(degrees): ' num2str(azimuth,3)])
358    delete(AxeData.RulerHandle)%delete the ruler graphic object
359    AxeData=rmfield(AxeData,'RulerHandle');%remove the ruler handle in AxeData
360    AxeData.Drawing='off';%exit the ruler drawing mode
361end
362
363%% display the data of the current object selected with the mouse right click
364if isequal(get(currentfig,'SelectionType'),'alt') && ~test_zoom && (~isfield(AxeData,'Drawing')||~isequal(AxeData.Drawing,'create'))
365    hother=findobj('Tag','proj_object');%find all the proj objects
366    nbselect=0;
367    %test the existence of selected objects:
368    for iproj=1:length(hother);
369        iselect=isequal(get(hother(iproj),'Selected'),'on');%reset all the proj objects in 'blue' by default
370        nbselect=nbselect+iselect;
371    end
372    hother=findobj('Tag','proj_object','Type','line');%find all the proj objects
373    set(hother,'Color','b');%reset all the proj objects in 'blue' by default
374    set(hother,'Selected','off')
375    hother=findobj('Tag','proj_object','Type','rectangle');
376    set(hother,'EdgeColor','b');
377    set(hother,'Selected','off')
378    hother=findobj('Tag','proj_object','Type','patch');
379    set(hother,'FaceColor','b');   
380    if isequal(get(gco,'Type'),'image')
381        currentobj=get(gco,'parent');%parent axes of the image
382    else
383        currentobj=gco;%default
384    end
385    if ((nbselect==0) && isequal(get(currentobj,'Type'),'axes')) || isequal(currentobj,huvmat)
386        currentfig=get(currentobj,'parent');
387        figname=get(currentfig,'name');
388        eval(['global Data_' figname])
389        eval(['Data_' figname '=get(currentobj,''UserData'')']);
390        evalin('base',['global Data_' figname])%make CurData global in the workspace
391        objtype=get(currentobj,'Type');
392        display(['UserData of ' objtype ':'])
393        evalin('base',['Data_' figname]) %display CurData in the workspace
394        commandwindow %brings the Matlab command window to the front
395    end
396end
397
398%% update
399if test_drawing==0
400        AxeData.Drawing='off';%stop current drawing action
401end
402set(currentaxes,'UserData',AxeData);
403if ~isempty(huvmat)
404    set(huvmat,'UserData',UvData);
405end
406
407   
408
Note: See TracBrowser for help on using the repository browser.