source: trunk/src/set_object.m @ 227

Last change on this file since 227 was 227, checked in by sommeria, 10 years ago

add function sub_field_series to apply the sub_field operation to a series of fileds (for instance subtracting a background to an image series)

File size: 34.2 KB
Line 
1%'set_object': GUI to edit a projection object
2%------------------------------------------------------------------------
3% function hset_object= set_object(data, PlotHandles,ZBounds)
4% associated with the GUI set_object.fig
5%
6% OUTPUT:
7% hset_object: handle of the GUI figure
8%
9% INPUT:
10% data: structure describing the object properties
11%    .Style=...
12%    .ProjMode
13%    .CoordType: 'phys' or 'px'
14%    .DX,.DY,.DZ : mesh along each dirction
15%    .RangeX, RangeY
16%    .Coord(j,i), i=1, 2, 3,  components x, y, z of j=1...n position(s) characterizing the object components
17% PlotHandles: handles for projection plots NO MORE USED
18% Zbounds: bounds on Z ( 3D case)
19%
20%AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
21%  Copyright Joel Sommeria, 2008, LEGI / CNRS-UJF-INPG, sommeria@coriolis-legi.org.
22%AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
23%     This file is part of the toolbox UVMAT.
24%
25%     UVMAT is free software; you can redistribute it and/or modify
26%     it under the terms of the GNU General Public License as published by
27%     the Free Software Foundation; either version 2 of the License, or
28%     (at your option) any later version.
29%
30%     UVMAT is distributed in the hope that it will be useful,
31%     but WITHOUT ANY WARRANTY; without even the implied warranty of
32%     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
33%     GNU General Public License (file UVMAT/COPYING.txt) for more details.
34%AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
35
36function varargout = set_object(varargin)
37
38% Last Modified by GUIDE v2.5 24-Nov-2008 14:29:06
39
40% Begin initialization code - DO NOT PLOT
41gui_Singleton = 1;
42gui_State = struct('gui_Name',       mfilename, ...
43                   'gui_Singleton',  gui_Singleton, ...
44                   'gui_OpeningFcn', @set_object_OpeningFcn, ...
45                   'gui_OutputFcn',  @set_object_OutputFcn, ...
46                   'gui_LayoutFcn',  [] , ...
47                   'gui_Callback',   []);
48if nargin & ischar(varargin{1})
49    gui_State.gui_Callback = str2func(varargin{1});
50end
51
52if nargout
53    [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
54else
55    gui_mainfcn(gui_State, varargin{:});
56end
57% End initialization code - DO NOT PLOT
58%------------------------------------------------------------------------
59%------------------------------------------------------------------------
60% --- Executes just before set_object is made visible.
61%INPUT:
62% handles: handles of the set_object interface elements
63%'IndexObj': NON USED ANYMORE (To suppress) index of the object (on the UvData list) that set_object will modify
64%        if =[] or absent: index still undefined (create mode in uvmat)
65%        if=0; no associated object (used for series), the button 'PLOT' is  then unvisible
66%'data': read from an existing object selected in the interface
67%      .TITLE : class of object ('POINTS','LINE',....)
68%      .DX,DY,DZ; meshes for regular grids
69%      .Coord: object position coordinates
70%      .ParentButton: handle of the uicontrol object calling the interface
71% PlotHandles: set of handles of the elements contolling the plotting of the projected field:
72%  if =[] or absent, no plot (mask mode in uvmat)
73% parameters on the uvmat interface (obtained by 'get_plot_handle.m')
74function set_object_OpeningFcn(hObject, eventdata, handles, data, PlotHandles,ZBounds)
75%-------------------------------------------------------------------
76% Choose default command line output for set_object
77handles.output = hObject;
78% Update handles structure
79guidata(hObject, handles);
80
81%default
82if ~exist('ZBounds','var')
83    ZBounds=0; %default
84end
85set(hObject,'KeyPressFcn',{'keyboard_callback',handles})%set keyboard action function (allow action on uvmat when set_object is in front)
86enable_plot=0;%default: does not allow plot of object and projection
87
88% fill the interface as set in the input data:
89if exist('data','var')
90    if isfield(data,'enable_plot')
91        enable_plot=data.enable_plot;%test to desable button PLOT (display mode)
92    end
93    if isfield(data,'Name')
94        set(handles.TITLE,'String',data.Name)
95    end
96    if ~isfield(data,'NbDim')||~isequal(data.NbDim,3)%2D case
97        set(handles.ZObject,'Visible','off')
98        set(handles.z_slider,'Visible','off')
99    else
100        set(handles.ZObject,'Visible','on')
101        set(handles.z_slider,'Visible','on')
102        if isfield(data,'Coord') && size(data.Coord,2)==3
103            set(handles.ZObject,'String',num2str(data.Coord(1,3),4))
104        end
105    end
106    if isfield(data,'StyleMenu')
107        set(handles.ObjectStyle,'String',data.StyleMenu);
108    end
109    if isfield(data,'Style')
110        menu=get(handles.ObjectStyle,'String');
111        for iline=1:length(menu)
112            if isequal(menu{iline},data.Style)
113                set(handles.ObjectStyle,'Value',iline)
114                break
115            end
116        end
117    end
118    ObjectStyle_Callback(hObject, eventdata, handles)
119    if isfield(data,'ProjMenu')
120        set(handles.ProjMode,'String',data.ProjMenu);%overset the standard menu
121    end
122    if isfield(data,'ProjMode')
123        menu=get(handles.ProjMode,'String');
124        for iline=1:length(menu)
125            if isequal(menu{iline},data.ProjMode)
126                set(handles.ProjMode,'Value',iline)
127                break
128            end
129        end
130    end
131    ProjMode_Callback(hObject, eventdata, handles)
132    if isfield(data,'Coord')
133        if ischar(data.Coord)
134            data.Coord=str2num(data.Coord);
135        elseif iscell(data.Coord)
136            CoordCell=data.Coord;
137            data.Coord=zeros(numel(CoordCell),3);
138            data.Coord(:,3)=zeros(numel(CoordCell),1); % z component set to 0 by default
139            for iline=1:numel(CoordCell)
140                line_vec=str2num(CoordCell{iline});
141                if numel(line_vec)==2
142                    data.Coord(iline,1:2)=str2num(CoordCell{iline});
143                else
144                    data.Coord(iline,:)=str2num(CoordCell{iline});
145                end
146            end
147        end
148        if size(data.Coord,2)>=2
149            sizcoord=size(data.Coord);
150            for i=1:sizcoord(1)
151                XObject{i}=num2str(data.Coord(i,1),4);
152                YObject{i}=num2str(data.Coord(i,2),4);
153            end
154            set(handles.XObject,'String',XObject)
155            set(handles.YObject,'String',YObject)
156            if sizcoord(2)>3
157                for i=1:sizcoord(1)
158                    ZObject{i}=num2str(data.Coord(i,3),4);
159                end
160                set(handles.ZObject,'String',ZObject)
161            end
162        end
163    end
164    if isfield(data,'DX')
165        if ~ischar(handles.DX)
166            data.DX=num2str(data.DX,3);
167        end
168        set(handles.DX,'String',data.DX)
169    end
170    if isfield(data,'DY')
171        if ~ischar(handles.DY)
172            data.DY=num2str(data.DY,3);
173        end
174        set(handles.DY,'String',data.DX)
175    end
176    if isfield(data,'RangeZ') && length(ZBounds) >= 2
177        set(handles.ZMax,'String',num2str(max(data.RangeZ),3))
178        DZ=max(data.RangeZ);%slider step
179        if ~isnan(ZBounds(1)) && ZBounds(2)~=ZBounds(1)
180            rel_step(1)=min(DZ/(ZBounds(2)-ZBounds(1)),0.2);%must be smaller than 1
181            rel_step(2)=0.1;
182            set(handles.z_slider,'Visible','on')
183            set(handles.z_slider,'Min',ZBounds(1))
184            set(handles.z_slider,'Max',ZBounds(2))
185            set(handles.z_slider,'SliderStep',rel_step)
186            set(handles.z_slider,'Value',(ZBounds(1)+ZBounds(2))/2)
187        end
188    end
189    if isfield(data,'RangeX')
190        if ischar(data.RangeX)
191            data.RangeX=str2num(data.RangeX);
192        end
193        set(handles.XMax,'String',num2str(max(data.RangeX),3))
194        set(handles.XMin,'String',num2str(min(data.RangeX),3))
195    end
196    if isfield(data,'RangeY')
197        if ischar(data.RangeY)
198            data.RangeY=str2num(data.RangeY);
199        end
200        set(handles.YMax,'String',num2str(max(data.RangeY),3))
201        set(handles.YMin,'String',num2str(min(data.RangeY),3))
202    end
203    if isfield(data,'RangeZ')
204        if ischar(data.RangeZ)
205            data.RangeZ=str2num(data.RangeZ);
206        end
207        set(handles.ZMax,'String',num2str(max(data.RangeZ),3))
208        if numel(data.RangeZ)>=2
209            set(handles.ZMin,'String',num2str(min(data.RangeZ),3))
210        end
211    end 
212    if isfield(data,'Angle') && isequal(numel(data.Angle),3)
213         set(handles.Phi,'String',num2str(data.Angle(1)))
214         set(handles.Theta,'String',num2str(data.Angle(2)))
215         set(handles.Psi,'String',num2str(data.Angle(3)))
216    end
217    if isfield(data,'DZ')
218        if ~ischar(handles.DZ)
219            data.DY=num2str(data.DZ,3);
220        end
221        set(handles.DZ,'String',data.DZ)
222    end
223    if isfield(data,'CoordUnit')
224        set(handles.CoordUnit,'String',data.CoordUnit)
225    end
226end
227if enable_plot
228   set(handles.PLOT,'enable','on')
229else
230   set(handles.PLOT,'enable','off')
231end
232huvmat=findobj(allchild(0),'tag','uvmat');
233UvData=get(huvmat,'UserData');
234pos_uvmat=get(huvmat,'Position');
235%position the set_object GUI with respect to uvmat
236if isfield(UvData,'SetObjectOrigin')
237    pos_set_object(1:2)=UvData.SetObjectOrigin + pos_uvmat(1:2);
238    pos_set_object(3:4)=UvData.SetObjectSize .* pos_uvmat(3:4);
239    set(hObject,'Position',pos_set_object)
240end
241
242%------------------------------------------------------------------------
243% --- Outputs from this function are returned to the command line.
244function varargout = set_object_OutputFcn(hObject, eventdata, handles)
245%------------------------------------------------------------------------
246% Get default command line output from handles structure
247varargout{1} = handles.output;
248varargout{2}=handles;
249
250%------------------------------------------------------------------------
251% --- Executes on selection change in ObjectStyle.
252function ObjectStyle_Callback(hObject, eventdata, handles)
253%------------------------------------------------------------------------
254style_prev=get(handles.ObjectStyle,'UserData');%previous object style
255str=get(handles.ObjectStyle,'String');
256val=get(handles.ObjectStyle,'Value');
257style=str{val};
258% make correspondance between different object styles
259Xcolumn=get(handles.XObject,'String');
260Ycolumn=get(handles.YObject,'String');
261if ischar(Xcolumn)
262    sizchar=size(Xcolumn);
263    for icol=1:sizchar(1)
264        Xcolumn_cell{icol}=Xcolumn(icol,:);
265    end
266    Xcolumn=Xcolumn_cell;
267end
268if ischar(Ycolumn)
269    sizchar=size(Ycolumn);
270    for icol=1:sizchar(1)
271        Ycolumn_cell{icol}=Ycolumn(icol,:);
272    end
273    Ycolumn=Ycolumn_cell;
274end
275Zcolumn={};%default
276z_new={};
277if isequal(get(handles.ZObject,'Visible'),'on')
278    %data.NbDim=3; %test 3D object
279    Zcolumn=get(handles.ZObject,'String');
280    if ischar(Zcolumn)
281        Zcolumn={Zcolumn};
282    end
283end
284x_new{1}=Xcolumn{1};
285y_new{1}=Ycolumn{1};
286if ~isempty(Zcolumn)
287    z_new{1}=Zcolumn{1};
288end
289if isequal(style,'line')
290    if strcmp(style_prev,'rectangle')||strcmp(style_prev,'ellipse')
291        XMax=get(handles.XMax,'String');
292        YMax=get(handles.YMax,'String');
293        x_new{2}=num2str(XMax,4);
294        y_new{2}=num2str(YMax,4);
295        set(handles.XObject,'String',x_new)
296        set(handles.YObject,'String',y_new)
297        set(handles.ZObject,'String',z_new)
298    end
299elseif isequal(style,'polyline')
300elseif strcmp(style,'rectangle')|| strcmp(style,'ellipse')
301     set(handles.XObject,'String',x_new)
302     set(handles.YObject,'String',y_new)
303     set(handles.ZObject,'String',z_new)
304end
305
306switch style
307    case {'points','line','polyline','plane'}
308        menu_proj={'projection';'interp';'filter';'none'};
309    case {'polygon','rectangle','ellipse'}
310        menu_proj={'inside';'outside';'mask_inside';'mask_outside'};
311    case 'volume'
312        menu_proj={'interp';'none'};
313end   
314proj_index=get(handles.ProjMode,'Value');
315if proj_index<numel(menu_proj)
316    set(handles.ProjMode,'Value',1);% value index must not exceed the menu length
317end
318set(handles.ProjMode,'String',menu_proj)
319ProjMode_Callback(hObject, eventdata, handles)
320%store the current option
321str=get(handles.ObjectStyle,'String');
322val=get(handles.ObjectStyle,'Value');
323set(handles.ObjectStyle,'UserData',style)
324
325%------------------------------------------------------------------------
326function xObject_Callback(hObject, eventdata, handles)
327
328%------------------------------------------------------------------------
329function yObject_Callback(hObject, eventdata, handles)
330
331%------------------------------------------------------------------------
332% --- Executes on selection change in zObject.
333function zObject_Callback(hObject, eventdata, handles)
334%------------------------------------------------------------------------
335
336%------------------------------------------------------------------------
337% --- Executes on selection change in ProjMode.
338function ProjMode_Callback(hObject, eventdata, handles)
339menu=get(handles.ProjMode,'String');
340value=get(handles.ProjMode,'Value');
341ProjMode=menu{value};
342menu=get(handles.ObjectStyle,'String');
343value=get(handles.ObjectStyle,'Value');
344ObjectStyle=menu{value};
345test3D=isequal(get(handles.ZObject,'Visible'),'on');%3D case
346
347%default setting
348set(handles.Phi,'Visible','off')
349set(handles.Theta,'Visible','off')
350set(handles.Psi,'Visible','off')
351set(handles.XMin,'Visible','off')
352set(handles.XMax,'Visible','off')
353set(handles.YMin,'Visible','off')
354if isequal(ProjMode,'interp')
355    set(handles.YMax,'Visible','off')
356else
357    set(handles.YMax,'Visible','on')
358end
359if strcmp(ObjectStyle,'rectangle')||strcmp(ObjectStyle,'ellipse')
360    set(handles.XMax,'Visible','on')
361else
362   set(handles.XMax,'Visible','off')
363end
364set(handles.ZMin,'Visible','off')
365set(handles.ZMax,'Visible','off')
366set(handles.DX,'Visible','off')
367set(handles.DY,'Visible','off')
368set(handles.DZ,'Visible','off')
369
370switch ObjectStyle
371    case 'points'
372        set(handles.YMax,'TooltipString','YMax: range of averaging around each point')
373        set(handles.XObject,'TooltipString','XObject: set of x coordinates of the points')
374        set(handles.YObject,'TooltipString','YObject: set of y coordinates of the points')
375        set(handles.ZObject,'TooltipString','ZObject: set of z coordinates of the points')
376    case {'line','polyline','polygon'}
377        set(handles.YMax,'TooltipString','YMax: range of averaging around the line')
378        set(handles.XObject,'TooltipString','XObject: set of x coordinates defining the line')
379        set(handles.YObject,'TooltipString','YObject: set of y coordinates defining the line')
380        set(handles.ZObject,'TooltipString','ZObject: set of z coordinates defining the line')
381        if isequal(ProjMode,'interp')|| isequal(ProjMode,'filter')
382            set(handles.DX,'Visible','on')
383            set(handles.DX,'TooltipString','DX: mesh for the interpolated field along the line')
384        end       
385    case {'rectangle','ellipse'}
386        set(handles.XMax,'TooltipString',['XMax: half length of the ' ObjectStyle])
387        set(handles.YMax,'TooltipString',['YMax: half width of the ' ObjectStyle])
388        set(handles.XObject,'TooltipString',['XObject:  x coordinate of the ' ObjectStyle ' centre'])
389        set(handles.YObject,'TooltipString',['YObject:  y coordinate of the ' ObjectStyle ' centre'])
390    case {'plane'} 
391        set(handles.Psi,'Visible','on')
392        set(handles.XMin,'Visible','on')
393        set(handles.XMax,'Visible','on')
394        set(handles.YMin,'Visible','on')
395        set(handles.YMax,'Visible','on')
396        set(handles.XObject,'TooltipString',['XObject:  x coordinate of the axis origin for the ' ObjectStyle])
397        set(handles.YObject,'TooltipString',['YObject:  y coordinate of the axis origin for the ' ObjectStyle])
398        set(handles.ZMax,'TooltipString','ZMax: range of projection normal to the plane')
399        if test3D
400            set(handles.Theta,'Visible','on')
401            set(handles.Phi,'Visible','on')
402            set(handles.ZMax,'Visible','on')
403        end
404        if isequal(ProjMode,'interp')|| isequal(ProjMode,'filter')
405            set(handles.DX,'Visible','on')
406            set(handles.DY,'Visible','on')
407        else
408            set(handles.DX,'Visible','off')
409            set(handles.DY,'Visible','off')
410        end
411        if  isequal(ProjMode,'interp')
412            set(handles.DZ,'Visible','on') 
413        end
414     case {'volume'} 
415        set(handles.XMin,'Visible','on')
416        set(handles.XMax,'Visible','on')
417        set(handles.YMin,'Visible','on')
418        set(handles.YMax,'Visible','on')
419        set(handles.XObject,'TooltipString',['XObject:  x coordinate of the axis origin for the ' ObjectStyle])
420        set(handles.YObject,'TooltipString',['YObject:  y coordinate of the axis origin for the ' ObjectStyle])
421        set(handles.Phi,'Visible','on')
422        set(handles.Theta,'Visible','on')
423        set(handles.Psi,'Visible','on')
424        set(handles.ZMin,'Visible','on')
425        set(handles.ZMax,'Visible','on')
426        if isequal(ProjMode,'interp')|| isequal(ProjMode,'filter')
427            set(handles.DX,'Visible','on')
428            set(handles.DY,'Visible','on')
429            set(handles.DZ,'Visible','on')
430        else
431            set(handles.DX,'Visible','off')
432            set(handles.DY,'Visible','off')
433            set(handles.DZ,'Visible','off')
434        end
435end
436%------------------------------------------------------------------------
437
438%------------------------------------------------------------------------
439function Phi_Callback(hObject, eventdata, handles)
440update_slider(hObject, eventdata,handles)
441%------------------------------------------------------------------------
442%------------------------------------------------------------------------
443function Theta_Callback(hObject, eventdata, handles)
444update_slider(hObject, eventdata,handles)
445%------------------------------------------------------------------------
446function update_slider(hObject, eventdata,handles)
447%rotation angles
448PlaneAngle(1)=str2num(get(handles.Phi,'String'));%first  angle in degrees
449PlaneAngle(2)=str2num(get(handles.Theta,'String'));%second  angle in degrees
450PlaneAngle(3)=str2num(get(handles.Psi,'String'));%second  angle in degrees
451om=norm(PlaneAngle);%norm of rotation angle in radians
452OmAxis=PlaneAngle/om; %unit vector marking the rotation axis
453cos_om=cos(pi*om/180);
454sin_om=sin(pi*om/180);
455coeff=OmAxis(3)*(1-cos_om);
456%components of the unity vector norm_plane normal to the projection plane
457norm_plane(1)=OmAxis(1)*coeff+OmAxis(2)*sin_om;
458norm_plane(2)=OmAxis(2)*coeff-OmAxis(1)*sin_om;
459norm_plane(3)=OmAxis(3)*coeff+cos_om;
460huvmat=findobj('Tag','uvmat');%find the current uvmat interface handle
461UvData=get(huvmat,'UserData');%Data associated to the current uvmat interface
462if isfield(UvData,'X') & isfield(UvData,'Y') & isfield(UvData,'Z')
463    Z=norm_plane(1)*(UvData.X)+norm_plane(2)*(UvData.Y)+norm_plane(3)*(UvData.Z);
464    set(handles.z_slider,'Min',min(Z))
465    set(handles.z_slider,'Max',max(Z))
466    ZMax_Callback(hObject, eventdata, handles)
467end
468%------------------------------------------------------------------------
469function DX_Callback(hObject, eventdata, handles)
470%------------------------------------------------------------------------
471%------------------------------------------------------------------------
472function DY_Callback(hObject, eventdata, handles)
473%------------------------------------------------------------------------
474%------------------------------------------------------------------------
475function DZ_Callback(hObject, eventdata, handles)
476%------------------------------------------------------------------------
477
478%------------------------------------------------------------------------
479%-----------------------------------------------------
480% --- Executes on button press in OPEN: DESACTIVATED use uvmat browser
481function OPEN_Callback(hObject, eventdata, handles)
482%get the object file
483oldfile=' ';
484huvmat=findobj('Tag','uvmat');
485hchild=get(huvmat,'Children');
486hrootpath=findobj(hchild,'Tag','RootPath');
487if ~isempty(hrootpath)
488    oldfile=get(hrootpath,'String');
489    if iscell(oldfile)
490        oldfile=oldfile{1};
491    end
492end
493[FileName, PathName, filterindex] = uigetfile( ...
494       {'*.xml;*.mat', ' (*.xml,*.mat)';
495       '*.xml',  '.xml files '; ...
496        '*.mat',  '.mat matlab files '}, ...
497        'Pick a file',oldfile);
498fileinput=[PathName FileName];%complete file name
499testblank=findstr(fileinput,' ');%look for blanks
500if ~isempty(testblank)
501    msgbox_uvmat('ERROR','forbidden input file name: contain blanks')
502    return
503end
504sizf=size(fileinput);
505if (~ischar(fileinput)||~isequal(sizf(1),1)),return;end
506
507%read the file
508 t=xmltree(fileinput);
509 s=convert(t);
510 if ~isfield(s,'Style')
511     s.Style='points';
512 end
513 if ~isfield(s,'ProjMode')
514     s.ProjMode='none';
515 end
516teststyle=0;
517
518switch s.Style
519    case {'points','line','polyline','plane'}
520        menu_proj={'projection';'interp';'filter';'none'};
521    case {'polygon','rectangle','ellipse'}
522        menu_proj={'inside';'outside';'mask_inside';'mask_outside'};
523    case 'volume'
524        menu_proj={'none'};
525end
526set(handles.ObjectStyle,'String',menu_proj)
527menu=get(handles.ObjectStyle,'String');
528for iline=1:length(menu)
529    if isequal(menu{iline},s.Style)
530        set(handles.ObjectStyle,'Value',iline)
531        teststyle=1;
532        break
533    end
534end
535testmode=0;
536%menu=get(handles.ProjMode,'String');
537for iline=1:length(menu_proj)
538    if isequal(menu_proj{iline},s.ProjMode)
539        set(handles.ProjMode,'Value',iline)
540        testmode=1;
541        break
542    end
543end
544
545ProjMode_Callback(hObject, eventdata, handles);%visualize the appropriate edit boxes
546if isfield(s,'XMax')
547    set(handles.XMax,'String',s.XMax)
548end
549if isfield(s,'XMin')
550    set(handles.XMin,'String',s.XMin)
551end
552if isfield(s,'YMax')
553    set(handles.YMax,'String',s.YMax)
554end
555if isfield(s,'YMin')
556    set(handles.YMin,'String',s.YMin)
557end
558Range=0;
559if isfield(s,'Range')
560    if ischar(s.Range)
561        Range=str2num(s.Range);
562    else
563        Range(1,:)=str2num(s.Range{1});
564        Range(2,:)=str2num(s.Range{2});
565    end
566end
567if size(Range,2)>=3
568    if size(Range,1)>=2
569       set(handles.ZMin,'String',num2str(Range(2,3),3))
570    end
571    if size(Range,1)>=2
572       set(handles.ZMax,'String',num2str(Range(1,3),3))
573    end
574end
575if size(Range,2)>=2
576    if size(Range,1)>=2
577       set(handles.YMin,'String',num2str(Range(2,2),3))
578    end
579    if size(Range,1)>=2
580       set(handles.YMax,'String',num2str(Range(1,2),3))
581    end
582end
583if size(Range,2)>=1
584    if size(Range,1)>=2
585       set(handles.XMin,'String',num2str(Range(2,1),3))
586    end
587    if size(Range,1)>=2
588       set(handles.XMax,'String',num2str(Range(1,1),3))
589    end
590end
591if isfield(s,'RangeX') & ischar(s.RangeX)
592     RangeX=str2num(s.RangeX);
593    set(handles.XMax,'String',num2str(max(RangeX),3))
594    set(handles.XMin,'String',num2str(min(RangeX),3))
595end
596
597if isfield(s,'RangeY')
598    if ischar(s.RangeY)
599        RangeY=str2num(s.RangeY);
600        set(handles.YMax,'String',num2str(max(RangeY),3))
601        set(handles.YMin,'String',num2str(min(RangeY),3))
602    end
603end
604if isfield(s,'RangeZ')
605    if ischar(s.RangeZ)
606        RangeZ=str2num(s.RangeZ);
607        set(handles.ZMax,'String',num2str(max(RangeZ),3))
608        set(handles.ZMin,'String',num2str(min(RangeZ),3))
609    end
610end
611if isfield(s,'Phi')
612    set(handles.Psi,'String',s.Phi)%old definition
613end
614if isfield(s,'Angle')&& isequal(numel(s.Angle),3)
615    set(handles.Phi,'String',s.Angle(1))
616    set(handles.Theta,'String',s.Angle(2))
617    set(handles.Psi,'String',s.Angle(3))
618end
619% if isfield(s,'Psi')
620%     set(handles.Psi,'String',s.Psi)
621% end
622
623if isfield(s,'DX')
624    set(handles.DX,'String',s.DX)
625end
626if isfield(s,'DY')
627    set(handles.DY,'String',s.DY)
628end
629if ~isfield(s,'Coord')
630    XObject='0';%default
631    YObject='0';
632elseif ischar(s.Coord)
633    line=str2num(s.Coord);
634    XObject=num2str(line(1),4);
635    YObject=num2str(line(2),4);
636else
637    for i=1:length(s.Coord)
638        line=str2num(s.Coord{i});
639        XObject{i}=num2str(line(1),4);
640        YObject{i}=num2str(line(2),4);
641    end
642end
643set(handles.XObject,'String',XObject)
644set(handles.YObject,'String',YObject)
645%METTRA A JOUR ASPECT DE L'INTERFACE (COMME set_object_Opening
646%------------------------------------------------------------------------
647%----------------------------------------------------
648% executed when closing: set the parent interface button to value 0
649function closefcn(gcbo,eventdata,parent_button)
650
651huvmat=findobj(allchild(0),'Name','uvmat');%find the current uvmat interface handle
652if ~isempty(huvmat)
653    hhuvmat=guidata(huvmat);
654%     set(hhuvmat.create,'Value',0)
655%     set(hhuvmat.create,'BackgroundColor',[0 1 0])%put unactivated buttons to green
656%     set(hhuvmat.LINE,'Value',0)
657%     set(hhuvmat.LINE,'BackgroundColor',[0 1 0])%put unactivated buttons to green
658%     set(hhuvmat.PATCH,'Value',0)
659%     set(hhuvmat.PATCH,'BackgroundColor',[0 1 0])%put unactivated buttons to green
660%     set(hhuvmat.PLANE,'Value',0)
661%     set(hhuvmat.PLANE,'BackgroundColor',[0 1 0])%put unactivated buttons to green
662%     set(hhuvmat.VOLUME,'Value',0)
663%     set(hhuvmat.VOLUME,'BackgroundColor',[0 1 0])%put unactivated buttons to green
664    set(hhuvmat.edit,'Value',0)
665    set(hhuvmat.edit,'BackgroundColor',[0.7 0.7 0.7])%put unactivated buttons to gree
666end
667hseries=findobj(allchild(0),'Name','series');%find the current series interface handle
668if ~isempty(hseries)
669    hhseries=guidata(hseries);
670    set(hhseries.GetObject,'Value',0)
671    set(hhseries.GetObject,'BackgroundColor',[0 1 0])%put unactivated buttons to green
672end
673
674%------------------------------------------------------------------------
675% --- Executes on button press in PLOT: PLOT the defined object and its projected field
676function PLOT_Callback(hObject, eventdata, handles)
677
678%% reading the object parameters on the GUI uvmat
679huvmat=findobj('tag','uvmat');%find the current uvmat interface handle
680UvData=get(huvmat,'UserData');%Data associated to the GUI uvmat
681hhuvmat=guidata(huvmat);%handles in the uvmat GUI
682ObjectName=get(handles.TITLE,'String');%name of the current object
683ListObject=get(hhuvmat.list_object_1,'String');%position in the objet list
684IndexObj_1=get(hhuvmat.list_object_1,'Value');
685if isequal(get(hhuvmat.list_object_2,'Visible'),'on')
686    IndexObj_2=get(hhuvmat.list_object_2,'Value');
687    List2=get(hhuvmat.list_object_2,'String');
688    if IndexObj_2==length(List2)
689        IndexObj_2=[];% '...' selected
690    end
691else
692    IndexObj_2=[];
693end
694testnew=0;
695ObjectData=read_set_object(handles);%read the input parameters defining the object in the GUI set_object
696if strcmp(ListObject{IndexObj_1},ObjectName)% we are editing the object whose projection is viewed in the uvmat frame
697    IndexObj=IndexObj_1;
698    projview='uvmat';
699elseif ~isempty(IndexObj_2) && IndexObj_2<=numel(ListObject)&& strcmp(ListObject{IndexObj_2},ObjectName)% we are editing the object whose projection is viewed in view_field 
700    IndexObj=IndexObj_2;
701    projview='view_field';
702else %new object
703    testnew=1;
704    IndexObj=numel(ListObject)+1;
705    projview='view_field';
706end
707if strcmp(projview,'view_field')
708    hview_field=findobj(allchild(0),'tag','view_field');
709    if isempty(hview_field)
710        hview_field=view_field;
711%     elseif strcmp(ObjectData.ProjMode,'none')||strcmp(ObjectData.ProjMode,'mask_inside')||strcmp(ObjectData.ProjMode,'mask_outside')
712    end
713    PlotHandles=guidata(hview_field);
714    plotaxes=PlotHandles.axes3;%handle of axes3 in view_field
715else
716    PlotHandles=hhuvmat;
717    plotaxes=hhuvmat.axes3;%handle of axes3 in view_field
718end   
719
720%% naming the object
721if length(ObjectName)<1% name of object not defined in set_object
722    ObjectName=[num2str(IndexObj) '-' ObjectData.Style];%default name
723elseif ~get(hhuvmat.edit_object,'Value')%not in edit mode (new object created)
724    detectname=1;
725    ObjectNameNew=ObjectName;
726    vers=0;
727    while detectname==1
728        detectname=find(strcmp(ObjectNameNew,ListObject),1);%test the existence of the proposed name in the list
729        if detectname% if the object name already exists
730            indstr=regexp(ObjectNameNew,'\D');
731            if indstr(end)<length(ObjectNameNew) %object name ends by a number
732                vers=str2double(ObjectNameNew(indstr(end)+1:end))+1;
733                ObjectNameNew=[ObjectNameNew(1:indstr(end)) num2str(vers)];
734            else
735                vers=vers+1;
736                ObjectNameNew=[ObjectNameNew(1:indstr(end)) '_' num2str(vers)];     
737            end
738        end
739    end
740    ObjectName=ObjectNameNew;
741end
742ListObject{IndexObj,1}=ObjectName;
743set(hhuvmat.list_object_1,'String',ListObject)
744set(hhuvmat.list_object_2,'String',[ListObject;{'...'}])
745
746%% update the object plot and projection field
747if testnew
748    set(hhuvmat.list_object_2,'Value',IndexObj)
749    ObjectData.DisplayHandle_uvmat=hhuvmat.axes3;
750    ObjectData.DisplayHandle_view_field=[];
751else
752    if isfield(UvData.Object{IndexObj},'DisplayHandle_uvmat')% save the previous object graph handles
753        ObjectData.DisplayHandle_uvmat=UvData.Object{IndexObj}.DisplayHandle_uvmat;
754    else
755        ObjectData.DisplayHandle_uvmat=hhuvmat.axes3;%there is no object handle, than the axes handles is used as input
756    end
757    if isfield(UvData.Object{IndexObj},'DisplayHandle_view_field')% save the previous object graph handles
758        ObjectData.DisplayHandle_view_field=UvData.Object{IndexObj}.DisplayHandle_view_field;
759    else
760        ObjectData.DisplayHandle_view_field=[];
761    end
762end
763UvData.Object{IndexObj}=ObjectData;%update the current object properties
764UvData.Object=update_obj(UvData,IndexObj_1,IndexObj_2);
765set(huvmat,'UserData',UvData)
766
767%% plot the field projected on the object and store in the corresponding figue
768[ProjData,errormsg]= proj_field(UvData.Field,ObjectData);%project the current interface field on ObjectData
769if ~isempty(errormsg)
770    msgbox_uvmat('ERROR', errormsg)
771    return
772end
773PlotParam=read_plot_param(PlotHandles);
774[PlotType,Object_out{IndexObj}.PlotParam,plotaxes]=plot_field(ProjData,plotaxes,PlotParam);%update an existing field plot
775
776%% update the GUI uvmat
777hhuvmat=guidata(huvmat);%handles of elements in the uvmat GUI
778set(hhuvmat.MenuEditObject,'enable','on')
779set(hhuvmat.edit_object,'Value',1) % set uvmat to object edit mode to allow further object update
780set(hhuvmat.edit_object,'BackgroundColor',[1 1 0]);% paint the edit text in yellow
781%UvData.MouseAction='edit_object'; % set the edit button to 'on'
782
783%------------------------------------------------------------------------
784% --- Executes on button press in MenuCoord.
785function MenuCoord_Callback(hObject, eventdata, handles)
786%------------------------------------------------------------------------
787%----------------------------------------------------
788function YMin_Callback(hObject, eventdata, handles)
789%------------------------------------------------------------------------
790
791function ZMin_Callback(hObject, eventdata, handles)
792%------------------------------------------------------------------------
793
794function ZMax_Callback(hObject, eventdata, handles)
795DZ=str2num(get(handles.ZMax,'String'));
796ZMin=get(handles.z_slider,'Min');
797ZMax=get(handles.z_slider,'Max');
798if ~isequal(ZMax-ZMin,0)
799    rel_step(1)=DZ/(ZMax-ZMin);
800    rel_step(2)=0.2;
801    set(handles.z_slider,'SliderStep',rel_step)
802end
803%------------------------------------------------------------------------
804function YMax_Callback(hObject, eventdata, handles)
805%------------------------------------------------------------------------
806
807function XMin_Callback(hObject, eventdata, handles)
808%------------------------------------------------------------------------
809
810function XMax_Callback(hObject, eventdata, handles)
811%------------------------------------------------------------------------
812%------------------------------------------------------------------------
813function SAVE_Callback(hObject, eventdata, handles)
814% ------------------------------------------------------
815Object=read_set_object(handles);
816huvmat=findobj('Tag','uvmat');
817% UvData=get(huvmat,'UserData');
818if isempty(huvmat)
819    huvmat=findobj(allchild(0),'Name','series');
820end
821hchild=get(huvmat,'Children');
822hrootpath=findobj(hchild,'Tag','RootPath');
823if isempty(hrootpath)
824    RootPath='';
825else
826    RootPath=get(hrootpath,'String');
827    if iscell(RootPath)
828        RootPath=RootPath{1};
829    end
830end
831title={'object name'};
832dir_save=uigetdir(RootPath);
833ObjectName=get(handles.TITLE,'String');
834if ~isempty(ObjectName)&&~strcmp(ObjectName,'')
835    def={fullfile(dir_save,[ObjectName '.xml'])};
836else
837    def={fullfile(dir_save,[Object.Style '.xml'])};
838end
839displ_txt='save object as an .xml file';%default display
840menu=get(handles.ProjMode,'String');
841value=get(handles.ProjMode,'Value');
842ProjMode=menu{value};
843if strcmp(ProjMode,'mask_inside')||strcmp(ProjMode,'mask_outside')
844    displ_txt='save mask contour as an .xml file: to create a mask image, use save_mask on the GUI uvmat (lower right)';
845end
846answer=msgbox_uvmat('INPUT_TXT','save object as an .xml file',def);
847if ~isempty(answer)
848    t=struct2xml(Object);
849    save(t,answer{1})
850end
851msgbox_uvmat('CONFIRMATION',[answer{1}  ' saved'])
852
853%------------------------------------------------------------------------
854% --- Executes on slider movement.
855function z_slider_Callback(hObject, eventdata, handles)
856%---------------------------------------------------------
857Z_value=get(handles.z_slider,'Value');
858%rotation angles
859PlaneAngle=[0 0 0];
860norm_plane=[0 0 1];
861cos_om=1;
862sin_om=0;
863
864PlaneAngle(1)=str2double(get(handles.Phi,'String'));%first  angle in degrees
865PlaneAngle(2)=str2double(get(handles.Theta,'String'));%second  angle in degrees
866PlaneAngle(3)=str2double(get(handles.Psi,'String'));%second  angle in degrees
867PlaneAngle=(pi/180)*PlaneAngle;
868om=norm(PlaneAngle);%norm of rotation angle in radians
869if isequal(om,0)
870    norm_plane=[0 0 1];
871else
872    OmAxis=PlaneAngle/om; %unit vector marking the rotation axis
873    cos_om=cos(om);
874    sin_om=sin(om);
875    coeff=OmAxis(3)*(1-cos_om);
876    %components of the unity vector norm_plane normal to the projection plane
877    norm_plane(1)=OmAxis(1)*coeff+OmAxis(2)*sin_om;
878    norm_plane(2)=OmAxis(2)*coeff-OmAxis(1)*sin_om;
879    norm_plane(3)=OmAxis(3)*coeff+cos_om;
880end
881
882%set new plane position and update graph
883set(handles.XObject,'String',num2str(norm_plane(1)*Z_value,4))
884set(handles.YObject,'String',num2str(norm_plane(2)*Z_value,4))
885set(handles.ZObject,'String',num2str(norm_plane(3)*Z_value,4))
886PLOT_Callback(hObject, eventdata, handles)
887
888%------------------------------------------------------------------------
889% --- Executes on button press in HELP.
890function HELP_Callback(hObject, eventdata, handles)
891%------------------------------------------------------------------------
892path_to_uvmat=which ('uvmat');% check the path of uvmat
893pathelp=fileparts(path_to_uvmat);
894helpfile=fullfile(pathelp,'uvmat_doc','uvmat_doc.html');
895if isempty(dir(helpfile)), msgbox_uvmat('ERROR','Please put the help file uvmat_doc.html in the sub-directory /uvmat_doc of the UVMAT package')
896else
897    addpath (fullfile(pathelp,'uvmat_doc'))
898    web([helpfile '#set_object'])
899end
900%------------------------------------------------------------------------
901
902
Note: See TracBrowser for help on using the repository browser.