source: trunk/src/set_object.m @ 183

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

small bug repair: reading movies in read_fields, plotting rectangles and ellipes

File size: 33.9 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('ZBound','var')
83    ZBound=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 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,'Phi')
213        if ~ischar(handles.Phi)
214            data.DY=num2str(data.Phi,3);
215        end
216         set(handles.Phi,'String',data.Phi)
217    end
218    if isfield(data,'Theta')
219        if ~ischar(handles.Theta)
220            data.DY=num2str(data.Theta,3);
221        end
222        set(handles.Theta,'String',data.Theta)
223    end
224    if isfield(data,'Psi')
225         if ~ischar(handles.Psi)
226            data.DY=num2str(data.Psi,3);
227        end
228         set(handles.Psi,'String',data.Psi)
229    end 
230    if isfield(data,'DZ')
231        if ~ischar(handles.DZ)
232            data.DY=num2str(data.DZ,3);
233        end
234        set(handles.DZ,'String',data.DZ)
235    end
236    if isfield(data,'CoordUnit')
237        set(handles.CoordUnit,'String',data.CoordUnit)
238    end
239end
240if enable_plot
241   set(handles.PLOT,'enable','on')
242else
243   set(handles.PLOT,'enable','off')
244end
245huvmat=findobj(allchild(0),'tag','uvmat');
246UvData=get(huvmat,'UserData');
247pos_uvmat=get(huvmat,'Position');
248%position the set_object GUI with respect to uvmat
249if isfield(UvData,'SetObjectOrigin')
250    pos_set_object(1:2)=UvData.SetObjectOrigin + pos_uvmat(1:2);
251    pos_set_object(3:4)=UvData.SetObjectSize .* pos_uvmat(3:4);
252    set(hObject,'Position',pos_set_object)
253end
254
255%------------------------------------------------------------------------
256% --- Outputs from this function are returned to the command line.
257function varargout = set_object_OutputFcn(hObject, eventdata, handles)
258%------------------------------------------------------------------------
259% Get default command line output from handles structure
260varargout{1} = handles.output;
261varargout{2}=handles;
262
263%------------------------------------------------------------------------
264% --- Executes on selection change in ObjectStyle.
265function ObjectStyle_Callback(hObject, eventdata, handles)
266%------------------------------------------------------------------------
267style_prev=get(handles.ObjectStyle,'UserData');%previous object style
268str=get(handles.ObjectStyle,'String');
269val=get(handles.ObjectStyle,'Value');
270style=str{val};
271% make correspondance between different object styles
272Xcolumn=get(handles.XObject,'String');
273Ycolumn=get(handles.YObject,'String');
274if ischar(Xcolumn)
275    sizchar=size(Xcolumn);
276    for icol=1:sizchar(1)
277        Xcolumn_cell{icol}=Xcolumn(icol,:);
278    end
279    Xcolumn=Xcolumn_cell;
280end
281if ischar(Ycolumn)
282    sizchar=size(Ycolumn);
283    for icol=1:sizchar(1)
284        Ycolumn_cell{icol}=Ycolumn(icol,:);
285    end
286    Ycolumn=Ycolumn_cell;
287end
288Zcolumn={};%default
289z_new={};
290if isequal(get(handles.ZObject,'Visible'),'on')
291    data.NbDim=3; %test 3D object
292    Zcolumn=get(handles.ZObject,'String');
293    if ischar(Zcolumn)
294        Zcolumn={Zcolumn};
295    end
296end
297x_new{1}=Xcolumn{1};
298y_new{1}=Ycolumn{1};
299if ~isempty(Zcolumn)
300    z_new{1}=Zcolumn{1};
301end
302if isequal(style,'line')
303    if strcmp(style_prev,'rectangle')||strcmp(style_prev,'ellipse')
304        XMax=get(handles.XMax,'String');
305        YMax=get(handles.YMax,'String');
306        x_new{2}=num2str(XMax,4);
307        y_new{2}=num2str(YMax,4);
308        set(handles.XObject,'String',x_new)
309        set(handles.YObject,'String',y_new)
310        set(handles.ZObject,'String',z_new)
311    end
312elseif isequal(style,'polyline')
313elseif strcmp(style,'rectangle')|| strcmp(style,'ellipse')
314     set(handles.XObject,'String',x_new)
315     set(handles.YObject,'String',y_new)
316     set(handles.ZObject,'String',z_new)
317end
318
319switch style
320    case {'points','line','polyline','plane'}
321        menu_proj={'projection';'interp';'filter';'none'};
322    case {'polygon','rectangle','ellipse'}
323        menu_proj={'inside';'outside';'mask_inside';'mask_outside'};
324    case 'volume'
325        menu_proj={'interp';'none'};
326end   
327proj_index=get(handles.ProjMode,'Value');
328if proj_index<numel(menu_proj)
329    set(handles.ProjMode,'Value',1);% value index must not exceed the menu length
330end
331set(handles.ProjMode,'String',menu_proj)
332ProjMode_Callback(hObject, eventdata, handles)
333%store the current option
334str=get(handles.ObjectStyle,'String');
335val=get(handles.ObjectStyle,'Value');
336set(handles.ObjectStyle,'UserData',style)
337
338%------------------------------------------------------------------------
339function xObject_Callback(hObject, eventdata, handles)
340
341%------------------------------------------------------------------------
342function yObject_Callback(hObject, eventdata, handles)
343
344%------------------------------------------------------------------------
345% --- Executes on selection change in zObject.
346function zObject_Callback(hObject, eventdata, handles)
347%------------------------------------------------------------------------
348
349%------------------------------------------------------------------------
350% --- Executes on selection change in ProjMode.
351function ProjMode_Callback(hObject, eventdata, handles)
352menu=get(handles.ProjMode,'String');
353value=get(handles.ProjMode,'Value');
354ProjMode=menu{value};
355menu=get(handles.ObjectStyle,'String');
356value=get(handles.ObjectStyle,'Value');
357ObjectStyle=menu{value};
358test3D=isequal(get(handles.ZObject,'Visible'),'on');%3D case
359
360%default setting
361set(handles.Phi,'Visible','off')
362set(handles.Theta,'Visible','off')
363set(handles.Psi,'Visible','off')
364set(handles.XMin,'Visible','off')
365set(handles.XMax,'Visible','off')
366set(handles.YMin,'Visible','off')
367if isequal(ProjMode,'interp')
368    set(handles.YMax,'Visible','off')
369else
370    set(handles.YMax,'Visible','on')
371end
372if strcmp(ObjectStyle,'rectangle')||strcmp(ObjectStyle,'ellipse')
373    set(handles.XMax,'Visible','on')
374else
375   set(handles.XMax,'Visible','off')
376end
377set(handles.ZMin,'Visible','off')
378set(handles.ZMax,'Visible','off')
379set(handles.DX,'Visible','off')
380set(handles.DY,'Visible','off')
381set(handles.DZ,'Visible','off')
382
383switch ObjectStyle
384    case 'points'
385        set(handles.YMax,'TooltipString','YMax: range of averaging around each point')
386        set(handles.XObject,'TooltipString','XObject: set of x coordinates of the points')
387        set(handles.YObject,'TooltipString','YObject: set of y coordinates of the points')
388        set(handles.ZObject,'TooltipString','ZObject: set of z coordinates of the points')
389    case {'line','polyline','polygon'}
390        set(handles.YMax,'TooltipString','YMax: range of averaging around the line')
391        set(handles.XObject,'TooltipString','XObject: set of x coordinates defining the line')
392        set(handles.YObject,'TooltipString','YObject: set of y coordinates defining the line')
393        set(handles.ZObject,'TooltipString','ZObject: set of z coordinates defining the line')
394        if isequal(ProjMode,'interp')|| isequal(ProjMode,'filter')
395            set(handles.DX,'Visible','on')
396            set(handles.DX,'TooltipString','DX: mesh for the interpolated field along the line')
397        end       
398    case {'rectangle','ellipse'}
399        set(handles.XMax,'TooltipString',['XMax: half length of the ' ObjectStyle])
400        set(handles.YMax,'TooltipString',['YMax: half width of the ' ObjectStyle])
401        set(handles.XObject,'TooltipString',['XObject:  x coordinate of the ' ObjectStyle ' centre'])
402        set(handles.YObject,'TooltipString',['YObject:  y coordinate of the ' ObjectStyle ' centre'])
403    case {'plane'} 
404        set(handles.Phi,'Visible','on')
405        set(handles.XMin,'Visible','on')
406        set(handles.XMax,'Visible','on')
407        set(handles.YMin,'Visible','on')
408        set(handles.YMax,'Visible','on')
409        set(handles.XObject,'TooltipString',['XObject:  x coordinate of the axis origin for the ' ObjectStyle])
410        set(handles.YObject,'TooltipString',['YObject:  y coordinate of the axis origin for the ' ObjectStyle])
411        set(handles.ZMax,'TooltipString','ZMax: range of projection normal to the plane')
412        if test3D
413            set(handles.Theta,'Visible','on')
414            set(handles.Psi,'Visible','on')
415            set(handles.ZMax,'Visible','on')
416        end
417        if isequal(ProjMode,'interp')|| isequal(ProjMode,'filter')
418            set(handles.DX,'Visible','on')
419            set(handles.DY,'Visible','on')
420        else
421            set(handles.DX,'Visible','off')
422            set(handles.DY,'Visible','off')
423        end
424        if isequal(ObjectStyle,'volume') && isequal(ProjMode,'interp')
425            set(handles.DZ,'Visible','on') 
426        end
427     case {'volume'} 
428        set(handles.Phi,'Visible','on')
429        set(handles.XMin,'Visible','on')
430        set(handles.XMax,'Visible','on')
431        set(handles.YMin,'Visible','on')
432        set(handles.YMax,'Visible','on')
433        set(handles.XObject,'TooltipString',['XObject:  x coordinate of the axis origin for the ' ObjectStyle])
434        set(handles.YObject,'TooltipString',['YObject:  y coordinate of the axis origin for the ' ObjectStyle])
435        if test3D
436            set(handles.Theta,'Visible','on')
437            set(handles.Psi,'Visible','on')
438            set(handles.ZMin,'Visible','on')
439            set(handles.ZMax,'Visible','on')
440        end
441        if isequal(ProjMode,'interp')|| isequal(ProjMode,'filter')
442            set(handles.DX,'Visible','on')
443            set(handles.DY,'Visible','on')
444        else
445            set(handles.DX,'Visible','off')
446            set(handles.DY,'Visible','off')
447        end
448        if isequal(ObjectStyle,'volume') && isequal(ProjMode,'interp')
449            set(handles.DZ,'Visible','on') 
450        end
451end
452%------------------------------------------------------------------------
453
454%------------------------------------------------------------------------
455function Phi_Callback(hObject, eventdata, handles)
456update_slider(hObject, eventdata,handles)
457%------------------------------------------------------------------------
458%------------------------------------------------------------------------
459function Theta_Callback(hObject, eventdata, handles)
460update_slider(hObject, eventdata,handles)
461%------------------------------------------------------------------------
462function update_slider(hObject, eventdata,handles)
463%rotation angles
464Phi=(pi/180)*str2num(get(handles.Phi,'String'));%first Euler angle in radian
465Theta=(pi/180)*str2num(get(handles.Theta,'String'));%second Euler angle in radian
466
467%components of the unitiy vector normal to the projection plane
468NormVec_X=-sin(Phi)*sin(Theta);
469NormVec_Y=cos(Phi)*sin(Theta);
470NormVec_Z=cos(Theta);
471huvmat=findobj('Tag','uvmat');%find the current uvmat interface handle
472UvData=get(huvmat,'UserData');%Data associated to the current uvmat interface
473if isfield(UvData,'X') & isfield(UvData,'Y') & isfield(UvData,'Z')
474    Z=NormVec_X *(UvData.X)+NormVec_Y *(UvData.Y)+NormVec_Z *(UvData.Z);
475    set(handles.z_slider,'Min',min(Z))
476    set(handles.z_slider,'Max',max(Z))
477    ZMax_Callback(hObject, eventdata, handles)
478end
479%------------------------------------------------------------------------
480function DX_Callback(hObject, eventdata, handles)
481%------------------------------------------------------------------------
482%------------------------------------------------------------------------
483function DY_Callback(hObject, eventdata, handles)
484%------------------------------------------------------------------------
485%------------------------------------------------------------------------
486function DZ_Callback(hObject, eventdata, handles)
487%------------------------------------------------------------------------
488
489%------------------------------------------------------------------------
490%-----------------------------------------------------
491% --- Executes on button press in OPEN: DESACTIVATED use uvmat browser
492function OPEN_Callback(hObject, eventdata, handles)
493%get the object file
494oldfile=' ';
495huvmat=findobj('Tag','uvmat');
496hchild=get(huvmat,'Children');
497hrootpath=findobj(hchild,'Tag','RootPath');
498if ~isempty(hrootpath)
499    oldfile=get(hrootpath,'String');
500    if iscell(oldfile)
501        oldfile=oldfile{1};
502    end
503end
504[FileName, PathName, filterindex] = uigetfile( ...
505       {'*.xml;*.mat', ' (*.xml,*.mat)';
506       '*.xml',  '.xml files '; ...
507        '*.mat',  '.mat matlab files '}, ...
508        'Pick a file',oldfile);
509fileinput=[PathName FileName];%complete file name
510testblank=findstr(fileinput,' ');%look for blanks
511if ~isempty(testblank)
512    msgbox_uvmat('ERROR','forbidden input file name: contain blanks')
513    return
514end
515sizf=size(fileinput);
516if (~ischar(fileinput)||~isequal(sizf(1),1)),return;end
517
518%read the file
519 t=xmltree(fileinput);
520 s=convert(t);
521 if ~isfield(s,'Style')
522     s.Style='points';
523 end
524 if ~isfield(s,'ProjMode')
525     s.ProjMode='none';
526 end
527teststyle=0;
528
529switch s.Style
530    case {'points','line','polyline','plane'}
531        menu_proj={'projection';'interp';'filter';'none'};
532    case {'polygon','rectangle','ellipse'}
533        menu_proj={'inside';'outside';'mask_inside';'mask_outside'};
534    case 'volume'
535        menu_proj={'none'};
536end
537set(handles.ObjectStyle,'String',menu_proj)
538menu=get(handles.ObjectStyle,'String');
539for iline=1:length(menu)
540    if isequal(menu{iline},s.Style)
541        set(handles.ObjectStyle,'Value',iline)
542        teststyle=1;
543        break
544    end
545end
546testmode=0;
547%menu=get(handles.ProjMode,'String');
548for iline=1:length(menu_proj)
549    if isequal(menu_proj{iline},s.ProjMode)
550        set(handles.ProjMode,'Value',iline)
551        testmode=1;
552        break
553    end
554end
555
556ProjMode_Callback(hObject, eventdata, handles);%visualize the appropriate edit boxes
557if isfield(s,'XMax')
558    set(handles.XMax,'String',s.XMax)
559end
560if isfield(s,'XMin')
561    set(handles.XMin,'String',s.XMin)
562end
563if isfield(s,'YMax')
564    set(handles.YMax,'String',s.YMax)
565end
566if isfield(s,'YMin')
567    set(handles.YMin,'String',s.YMin)
568end
569Range=0;
570if isfield(s,'Range')
571    if ischar(s.Range)
572        Range=str2num(s.Range);
573    else
574        Range(1,:)=str2num(s.Range{1});
575        Range(2,:)=str2num(s.Range{2});
576    end
577end
578if size(Range,2)>=3
579    if size(Range,1)>=2
580       set(handles.ZMin,'String',num2str(Range(2,3),3))
581    end
582    if size(Range,1)>=2
583       set(handles.ZMax,'String',num2str(Range(1,3),3))
584    end
585end
586if size(Range,2)>=2
587    if size(Range,1)>=2
588       set(handles.YMin,'String',num2str(Range(2,2),3))
589    end
590    if size(Range,1)>=2
591       set(handles.YMax,'String',num2str(Range(1,2),3))
592    end
593end
594if size(Range,2)>=1
595    if size(Range,1)>=2
596       set(handles.XMin,'String',num2str(Range(2,1),3))
597    end
598    if size(Range,1)>=2
599       set(handles.XMax,'String',num2str(Range(1,1),3))
600    end
601end
602if isfield(s,'RangeX') & ischar(s.RangeX)
603     RangeX=str2num(s.RangeX);
604    set(handles.XMax,'String',num2str(max(RangeX),3))
605    set(handles.XMin,'String',num2str(min(RangeX),3))
606end
607
608if isfield(s,'RangeY')
609    if ischar(s.RangeY)
610        RangeY=str2num(s.RangeY);
611        set(handles.YMax,'String',num2str(max(RangeY),3))
612        set(handles.YMin,'String',num2str(min(RangeY),3))
613    end
614end
615if isfield(s,'RangeZ')
616    if ischar(s.RangeZ)
617        RangeZ=str2num(s.RangeZ);
618        set(handles.ZMax,'String',num2str(max(RangeZ),3))
619        set(handles.ZMin,'String',num2str(min(RangeZ),3))
620    end
621end
622if isfield(s,'Phi')
623    set(handles.Phi,'String',s.Phi)
624end
625if isfield(s,'Theta')
626    set(handles.Theta,'String',s.Theta)
627end
628if isfield(s,'Psi')
629    set(handles.Psi,'String',s.Psi)
630end
631
632if isfield(s,'DX')
633    set(handles.DX,'String',s.DX)
634end
635if isfield(s,'DY')
636    set(handles.DY,'String',s.DY)
637end
638if ~isfield(s,'Coord')
639    XObject='0';%default
640    YObject='0';
641elseif ischar(s.Coord)
642    line=str2num(s.Coord);
643    XObject=num2str(line(1),4);
644    YObject=num2str(line(2),4);
645else
646    for i=1:length(s.Coord)
647        line=str2num(s.Coord{i});
648        XObject{i}=num2str(line(1),4);
649        YObject{i}=num2str(line(2),4);
650    end
651end
652set(handles.XObject,'String',XObject)
653set(handles.YObject,'String',YObject)
654%METTRA A JOUR ASPECT DE L'INTERFACE (COMME set_object_Opening
655%------------------------------------------------------------------------
656%----------------------------------------------------
657% executed when closing: set the parent interface button to value 0
658function closefcn(gcbo,eventdata,parent_button)
659
660huvmat=findobj(allchild(0),'Name','uvmat');%find the current uvmat interface handle
661if ~isempty(huvmat)
662    hhuvmat=guidata(huvmat);
663%     set(hhuvmat.create,'Value',0)
664%     set(hhuvmat.create,'BackgroundColor',[0 1 0])%put unactivated buttons to green
665%     set(hhuvmat.LINE,'Value',0)
666%     set(hhuvmat.LINE,'BackgroundColor',[0 1 0])%put unactivated buttons to green
667%     set(hhuvmat.PATCH,'Value',0)
668%     set(hhuvmat.PATCH,'BackgroundColor',[0 1 0])%put unactivated buttons to green
669%     set(hhuvmat.PLANE,'Value',0)
670%     set(hhuvmat.PLANE,'BackgroundColor',[0 1 0])%put unactivated buttons to green
671%     set(hhuvmat.VOLUME,'Value',0)
672%     set(hhuvmat.VOLUME,'BackgroundColor',[0 1 0])%put unactivated buttons to green
673    set(hhuvmat.edit,'Value',0)
674    set(hhuvmat.edit,'BackgroundColor',[0.7 0.7 0.7])%put unactivated buttons to gree
675end
676hseries=findobj(allchild(0),'Name','series');%find the current series interface handle
677if ~isempty(hseries)
678    hhseries=guidata(hseries);
679    set(hhseries.GetObject,'Value',0)
680    set(hhseries.GetObject,'BackgroundColor',[0 1 0])%put unactivated buttons to green
681end
682
683%------------------------------------------------------------------------
684% --- Executes on button press in PLOT: PLOT the defined object and its projected field
685function PLOT_Callback(hObject, eventdata, handles)
686
687%% reading the object parameters on the GUI uvmat
688huvmat=findobj('tag','uvmat');%find the current uvmat interface handle
689UvData=get(huvmat,'UserData');%Data associated to the GUI uvmat
690hhuvmat=guidata(huvmat);%handles in the uvmat GUI
691ObjectName=get(handles.TITLE,'String');%name of the current object
692ListObject=get(hhuvmat.list_object_1,'String');%position in the objet list
693IndexObj_1=get(hhuvmat.list_object_1,'Value');
694if isequal(get(hhuvmat.list_object_2,'Visible'),'on')
695    IndexObj_2=get(hhuvmat.list_object_2,'Value');
696    List2=get(hhuvmat.list_object_2,'String');
697    if IndexObj_2==length(List2)
698        IndexObj_2=[];% '...' selected
699    end
700else
701    IndexObj_2=[];
702end
703testnew=0;
704PlotHandles=get_plot_handles(hhuvmat);
705projview='view_field';%default
706if strcmp(ListObject{IndexObj_1},ObjectName)% we are editing the object whose projection is viewed in the uvmat frame
707    IndexObj=IndexObj_1;
708    projview='uvmat';
709     plotaxes=hhuvmat.axes3;%handle of axes3 in view_field
710elseif ~isempty(IndexObj_2) && IndexObj_2<=numel(ListObject)&& strcmp(ListObject{IndexObj_2},ObjectName)% we are editing the object whose projection is viewed in view_field 
711    IndexObj=IndexObj_2;
712else %new object
713    testnew=1;
714    IndexObj=numel(ListObject)+1;
715    hview_field=findobj(allchild(0),'tag','view_field');
716    if ~isempty(hview_field)
717        PlotHandles=guidata(hview_field);
718        plotaxes=PlotHandles.axes3;%handle of axes3 in view_field
719    end
720end
721if strcmp(projview,'view_field')
722    hview_field=findobj(allchild(0),'tag','view_field');
723    if isempty(hview_field)
724        hview_field=view_field;
725    end
726    PlotHandles=guidata(hview_field);
727    plotaxes=PlotHandles.axes3;%handle of axes3 in view_field
728end   
729ObjectData=read_set_object(handles);%read the input parameters defining the object in the GUI set_object
730
731%% naming the object
732if length(ObjectName)<1% name of object not defined in set_object
733    ObjectName=[num2str(IndexObj) '-' ObjectData.Style];%default name
734elseif ~get(hhuvmat.edit_object,'Value')%not in edit mode (new object created)
735    detectname=1;
736    ObjectNameNew=ObjectName;
737    vers=0;
738    while detectname==1
739        detectname=find(strcmp(ObjectNameNew,ListObject),1);%test the existence of the proposed name in the list
740        if detectname% if the object name already exists
741            indstr=regexp(ObjectNameNew,'\D');
742            if indstr(end)<length(ObjectNameNew) %object name ends by a number
743                vers=str2double(ObjectNameNew(indstr(end)+1:end))+1;
744                ObjectNameNew=[ObjectNameNew(1:indstr(end)) num2str(vers)];
745            else
746                vers=vers+1;
747                ObjectNameNew=[ObjectNameNew(1:indstr(end)) '_' num2str(vers)];     
748            end
749        end
750    end
751    ObjectName=ObjectNameNew;
752end
753ListObject{IndexObj,1}=ObjectName;
754set(hhuvmat.list_object_1,'String',ListObject)
755set(hhuvmat.list_object_2,'String',[ListObject;{'...'}])
756
757%% update the object plot and projection field
758if testnew
759    set(hhuvmat.list_object_2,'Value',IndexObj)
760    ObjectData.DisplayHandle_uvmat=hhuvmat.axes3;
761    ObjectData.DisplayHandle_view_field=[];
762else
763    if isfield(UvData.Object{IndexObj},'DisplayHandle_uvmat')% save the previous object graph handles
764        ObjectData.DisplayHandle_uvmat=UvData.Object{IndexObj}.DisplayHandle_uvmat;
765    else
766        ObjectData.DisplayHandle_uvmat=hhuvmat.axes3;%there is no object handle, than the axes handles is used as input
767    end
768    if isfield(UvData.Object{IndexObj},'DisplayHandle_view_field')% save the previous object graph handles
769        ObjectData.DisplayHandle_view_field=UvData.Object{IndexObj}.DisplayHandle_view_field;
770    else
771        ObjectData.DisplayHandle_view_field=[];
772    end
773end
774UvData.Object{IndexObj}=ObjectData;%update the current object properties
775UvData.Object=update_obj(UvData,IndexObj_1,IndexObj_2);
776
777%% plot the field projected on the object and store it the corresponding figue
778get(plotaxes,'tag')
779ProjData= proj_field(UvData.Field,ObjectData);%project the current interface field on ObjectData
780[PlotType,Object_out{IndexObj}.PlotParam,plotaxes]=plot_field(ProjData,plotaxes,PlotHandles);%update an existing field plot
781if strcmp(projview,'view_field')
782    ViewFieldData=get(hview_field,'UserData');
783    ViewFieldData.axes3=ObjectData;
784    set(hview_field,'UserData',ViewFieldData)
785else
786    UvData.axes3=ObjectData;
787end
788
789%% update the GUI uvmat
790hhuvmat=guidata(huvmat);%handles of elements in the uvmat GUI
791set(hhuvmat.MenuEditObject,'enable','on')
792set(hhuvmat.edit_object,'Value',1) % set uvmat to object edit mode to allow further object update
793set(hhuvmat.edit_object,'BackgroundColor',[1 1 0]);% paint the edit text in yellow
794%UvData.MouseAction='edit_object'; % set the edit button to 'on'
795set(huvmat,'UserData',UvData)
796%------------------------------------------------------------------------
797% --- Executes on button press in MenuCoord.
798function MenuCoord_Callback(hObject, eventdata, handles)
799%------------------------------------------------------------------------
800%----------------------------------------------------
801function YMin_Callback(hObject, eventdata, handles)
802%------------------------------------------------------------------------
803
804function ZMin_Callback(hObject, eventdata, handles)
805%------------------------------------------------------------------------
806
807function ZMax_Callback(hObject, eventdata, handles)
808DZ=str2num(get(handles.ZMax,'String'));
809ZMin=get(handles.z_slider,'Min');
810ZMax=get(handles.z_slider,'Max');
811if ~isequal(ZMax-ZMin,0)
812    rel_step(1)=DZ/(ZMax-ZMin);
813    rel_step(2)=0.2;
814    set(handles.z_slider,'SliderStep',rel_step)
815end
816%------------------------------------------------------------------------
817function YMax_Callback(hObject, eventdata, handles)
818%------------------------------------------------------------------------
819
820function XMin_Callback(hObject, eventdata, handles)
821%------------------------------------------------------------------------
822
823function XMax_Callback(hObject, eventdata, handles)
824%------------------------------------------------------------------------
825%------------------------------------------------------------------------
826function SAVE_Callback(hObject, eventdata, handles)
827% ------------------------------------------------------
828Object=read_set_object(handles);
829huvmat=findobj('Tag','uvmat');
830% UvData=get(huvmat,'UserData');
831if isempty(huvmat)
832    huvmat=findobj(allchild(0),'Name','series');
833end
834hchild=get(huvmat,'Children');
835hrootpath=findobj(hchild,'Tag','RootPath');
836if isempty(hrootpath)
837    RootPath='';
838else
839    RootPath=get(hrootpath,'String');
840    if iscell(RootPath)
841        RootPath=RootPath{1};
842    end
843end
844title={'object name'};
845dir_save=uigetdir(RootPath);
846ObjectName=get(handles.TITLE,'String');
847if ~isempty(ObjectName)&&~strcmp(ObjectName,'')
848    def={fullfile(dir_save,[ObjectName '.xml'])};
849else
850    def={fullfile(dir_save,[Object.Style '.xml'])};
851end
852displ_txt='save object as an .xml file';%default display
853menu=get(handles.ProjMode,'String');
854value=get(handles.ProjMode,'Value');
855ProjMode=menu{value};
856if strcmp(ProjMode,'mask_inside')||strcmp(ProjMode,'mask_outside')
857    displ_txt='save mask contour as an .xml file: to create a mask image, use save_mask on the GUI uvmat (lower right)';
858end
859answer=msgbox_uvmat('INPUT_TXT','save object as an .xml file',def);
860if ~isempty(answer)
861    t=struct2xml(Object);
862    save(t,answer{1})
863end
864msgbox_uvmat('CONFIRMATION',[answer{1}  ' saved'])
865%------------------------------------------------------------------------
866%------------------------------------------------------------------------
867% --- Executes on slider movement.
868function z_slider_Callback(hObject, eventdata, handles)
869%---------------------------------------------------------
870%A ADAPTER
871Z_value=get(handles.z_slider,'Value');
872
873%rotation angles
874Phi=(pi/180)*str2num(get(handles.Phi,'String'));%first Euler angle in radian
875Theta=(pi/180)*str2num(get(handles.Theta,'String'));%second Euler angle in radian
876
877%components of the unity vector normal to the projection plane
878NormVec_X=-sin(Phi)*sin(Theta);
879NormVec_Y=cos(Phi)*sin(Theta);
880NormVec_Z=cos(Theta);
881
882%set new plane position and update graph
883set(handles.XObject,'String',num2str(NormVec_X*Z_value,4))
884set(handles.YObject,'String',num2str(NormVec_Y*Z_value,4))
885set(handles.ZObject,'String',num2str(NormVec_Z*Z_value,4))
886PLOT_Callback(hObject, eventdata, handles)
887%------------------------------------------------------------------------
888%------------------------------------------------------------------------
889% --- Executes on button press in HELP.
890function HELP_Callback(hObject, eventdata, handles)
891path_to_uvmat=which ('uvmat');% check the path of uvmat
892pathelp=fileparts(path_to_uvmat);
893helpfile=fullfile(pathelp,'uvmat_doc','uvmat_doc.html');
894if isempty(dir(helpfile)), msgbox_uvmat('ERROR','Please put the help file uvmat_doc.html in the sub-directory /uvmat_doc of the UVMAT package')
895else
896    addpath (fullfile(pathelp,'uvmat_doc'))
897    web([helpfile '#set_object'])
898end
899%------------------------------------------------------------------------
900
901
Note: See TracBrowser for help on using the repository browser.