source: trunk/src/set_object.m @ 211

Last change on this file since 211 was 206, checked in by sommeria, 14 years ago

bug fixes to deal with volumes, storage of ACTION menu in series fixed

File size: 33.6 KB
RevLine 
[204]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
[206]82if ~exist('ZBounds','var')
83    ZBounds=0; %default
[204]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
[206]179        if ~isnan(ZBounds(1)) && ZBounds(2)~=ZBounds(1)
[204]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
[206]424        if  isequal(ProjMode,'interp')
[204]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])
[206]435%         if test3D
[204]436            set(handles.Theta,'Visible','on')
437            set(handles.Psi,'Visible','on')
438            set(handles.ZMin,'Visible','on')
439            set(handles.ZMax,'Visible','on')
[206]440%         end
[204]441        if isequal(ProjMode,'interp')|| isequal(ProjMode,'filter')
442            set(handles.DX,'Visible','on')
443            set(handles.DY,'Visible','on')
[206]444            set(handles.DZ,'Visible','on')
[204]445        else
446            set(handles.DX,'Visible','off')
447            set(handles.DY,'Visible','off')
[206]448            set(handles.DZ,'Visible','off')
[204]449        end
450end
451%------------------------------------------------------------------------
452
453%------------------------------------------------------------------------
454function Phi_Callback(hObject, eventdata, handles)
455update_slider(hObject, eventdata,handles)
456%------------------------------------------------------------------------
457%------------------------------------------------------------------------
458function Theta_Callback(hObject, eventdata, handles)
459update_slider(hObject, eventdata,handles)
460%------------------------------------------------------------------------
461function update_slider(hObject, eventdata,handles)
462%rotation angles
463Phi=(pi/180)*str2num(get(handles.Phi,'String'));%first Euler angle in radian
464Theta=(pi/180)*str2num(get(handles.Theta,'String'));%second Euler angle in radian
465
466%components of the unitiy vector normal to the projection plane
467NormVec_X=-sin(Phi)*sin(Theta);
468NormVec_Y=cos(Phi)*sin(Theta);
469NormVec_Z=cos(Theta);
470huvmat=findobj('Tag','uvmat');%find the current uvmat interface handle
471UvData=get(huvmat,'UserData');%Data associated to the current uvmat interface
472if isfield(UvData,'X') & isfield(UvData,'Y') & isfield(UvData,'Z')
473    Z=NormVec_X *(UvData.X)+NormVec_Y *(UvData.Y)+NormVec_Z *(UvData.Z);
474    set(handles.z_slider,'Min',min(Z))
475    set(handles.z_slider,'Max',max(Z))
476    ZMax_Callback(hObject, eventdata, handles)
477end
478%------------------------------------------------------------------------
479function DX_Callback(hObject, eventdata, handles)
480%------------------------------------------------------------------------
481%------------------------------------------------------------------------
482function DY_Callback(hObject, eventdata, handles)
483%------------------------------------------------------------------------
484%------------------------------------------------------------------------
485function DZ_Callback(hObject, eventdata, handles)
486%------------------------------------------------------------------------
487
488%------------------------------------------------------------------------
489%-----------------------------------------------------
490% --- Executes on button press in OPEN: DESACTIVATED use uvmat browser
491function OPEN_Callback(hObject, eventdata, handles)
492%get the object file
493oldfile=' ';
494huvmat=findobj('Tag','uvmat');
495hchild=get(huvmat,'Children');
496hrootpath=findobj(hchild,'Tag','RootPath');
497if ~isempty(hrootpath)
498    oldfile=get(hrootpath,'String');
499    if iscell(oldfile)
500        oldfile=oldfile{1};
501    end
502end
503[FileName, PathName, filterindex] = uigetfile( ...
504       {'*.xml;*.mat', ' (*.xml,*.mat)';
505       '*.xml',  '.xml files '; ...
506        '*.mat',  '.mat matlab files '}, ...
507        'Pick a file',oldfile);
508fileinput=[PathName FileName];%complete file name
509testblank=findstr(fileinput,' ');%look for blanks
510if ~isempty(testblank)
511    msgbox_uvmat('ERROR','forbidden input file name: contain blanks')
512    return
513end
514sizf=size(fileinput);
515if (~ischar(fileinput)||~isequal(sizf(1),1)),return;end
516
517%read the file
518 t=xmltree(fileinput);
519 s=convert(t);
520 if ~isfield(s,'Style')
521     s.Style='points';
522 end
523 if ~isfield(s,'ProjMode')
524     s.ProjMode='none';
525 end
526teststyle=0;
527
528switch s.Style
529    case {'points','line','polyline','plane'}
530        menu_proj={'projection';'interp';'filter';'none'};
531    case {'polygon','rectangle','ellipse'}
532        menu_proj={'inside';'outside';'mask_inside';'mask_outside'};
533    case 'volume'
534        menu_proj={'none'};
535end
536set(handles.ObjectStyle,'String',menu_proj)
537menu=get(handles.ObjectStyle,'String');
538for iline=1:length(menu)
539    if isequal(menu{iline},s.Style)
540        set(handles.ObjectStyle,'Value',iline)
541        teststyle=1;
542        break
543    end
544end
545testmode=0;
546%menu=get(handles.ProjMode,'String');
547for iline=1:length(menu_proj)
548    if isequal(menu_proj{iline},s.ProjMode)
549        set(handles.ProjMode,'Value',iline)
550        testmode=1;
551        break
552    end
553end
554
555ProjMode_Callback(hObject, eventdata, handles);%visualize the appropriate edit boxes
556if isfield(s,'XMax')
557    set(handles.XMax,'String',s.XMax)
558end
559if isfield(s,'XMin')
560    set(handles.XMin,'String',s.XMin)
561end
562if isfield(s,'YMax')
563    set(handles.YMax,'String',s.YMax)
564end
565if isfield(s,'YMin')
566    set(handles.YMin,'String',s.YMin)
567end
568Range=0;
569if isfield(s,'Range')
570    if ischar(s.Range)
571        Range=str2num(s.Range);
572    else
573        Range(1,:)=str2num(s.Range{1});
574        Range(2,:)=str2num(s.Range{2});
575    end
576end
577if size(Range,2)>=3
578    if size(Range,1)>=2
579       set(handles.ZMin,'String',num2str(Range(2,3),3))
580    end
581    if size(Range,1)>=2
582       set(handles.ZMax,'String',num2str(Range(1,3),3))
583    end
584end
585if size(Range,2)>=2
586    if size(Range,1)>=2
587       set(handles.YMin,'String',num2str(Range(2,2),3))
588    end
589    if size(Range,1)>=2
590       set(handles.YMax,'String',num2str(Range(1,2),3))
591    end
592end
593if size(Range,2)>=1
594    if size(Range,1)>=2
595       set(handles.XMin,'String',num2str(Range(2,1),3))
596    end
597    if size(Range,1)>=2
598       set(handles.XMax,'String',num2str(Range(1,1),3))
599    end
600end
601if isfield(s,'RangeX') & ischar(s.RangeX)
602     RangeX=str2num(s.RangeX);
603    set(handles.XMax,'String',num2str(max(RangeX),3))
604    set(handles.XMin,'String',num2str(min(RangeX),3))
605end
606
607if isfield(s,'RangeY')
608    if ischar(s.RangeY)
609        RangeY=str2num(s.RangeY);
610        set(handles.YMax,'String',num2str(max(RangeY),3))
611        set(handles.YMin,'String',num2str(min(RangeY),3))
612    end
613end
614if isfield(s,'RangeZ')
615    if ischar(s.RangeZ)
616        RangeZ=str2num(s.RangeZ);
617        set(handles.ZMax,'String',num2str(max(RangeZ),3))
618        set(handles.ZMin,'String',num2str(min(RangeZ),3))
619    end
620end
621if isfield(s,'Phi')
622    set(handles.Phi,'String',s.Phi)
623end
624if isfield(s,'Theta')
625    set(handles.Theta,'String',s.Theta)
626end
627if isfield(s,'Psi')
628    set(handles.Psi,'String',s.Psi)
629end
630
631if isfield(s,'DX')
632    set(handles.DX,'String',s.DX)
633end
634if isfield(s,'DY')
635    set(handles.DY,'String',s.DY)
636end
637if ~isfield(s,'Coord')
638    XObject='0';%default
639    YObject='0';
640elseif ischar(s.Coord)
641    line=str2num(s.Coord);
642    XObject=num2str(line(1),4);
643    YObject=num2str(line(2),4);
644else
645    for i=1:length(s.Coord)
646        line=str2num(s.Coord{i});
647        XObject{i}=num2str(line(1),4);
648        YObject{i}=num2str(line(2),4);
649    end
650end
651set(handles.XObject,'String',XObject)
652set(handles.YObject,'String',YObject)
653%METTRA A JOUR ASPECT DE L'INTERFACE (COMME set_object_Opening
654%------------------------------------------------------------------------
655%----------------------------------------------------
656% executed when closing: set the parent interface button to value 0
657function closefcn(gcbo,eventdata,parent_button)
658
659huvmat=findobj(allchild(0),'Name','uvmat');%find the current uvmat interface handle
660if ~isempty(huvmat)
661    hhuvmat=guidata(huvmat);
662%     set(hhuvmat.create,'Value',0)
663%     set(hhuvmat.create,'BackgroundColor',[0 1 0])%put unactivated buttons to green
664%     set(hhuvmat.LINE,'Value',0)
665%     set(hhuvmat.LINE,'BackgroundColor',[0 1 0])%put unactivated buttons to green
666%     set(hhuvmat.PATCH,'Value',0)
667%     set(hhuvmat.PATCH,'BackgroundColor',[0 1 0])%put unactivated buttons to green
668%     set(hhuvmat.PLANE,'Value',0)
669%     set(hhuvmat.PLANE,'BackgroundColor',[0 1 0])%put unactivated buttons to green
670%     set(hhuvmat.VOLUME,'Value',0)
671%     set(hhuvmat.VOLUME,'BackgroundColor',[0 1 0])%put unactivated buttons to green
672    set(hhuvmat.edit,'Value',0)
673    set(hhuvmat.edit,'BackgroundColor',[0.7 0.7 0.7])%put unactivated buttons to gree
674end
675hseries=findobj(allchild(0),'Name','series');%find the current series interface handle
676if ~isempty(hseries)
677    hhseries=guidata(hseries);
678    set(hhseries.GetObject,'Value',0)
679    set(hhseries.GetObject,'BackgroundColor',[0 1 0])%put unactivated buttons to green
680end
681
682%------------------------------------------------------------------------
683% --- Executes on button press in PLOT: PLOT the defined object and its projected field
684function PLOT_Callback(hObject, eventdata, handles)
685
686%% reading the object parameters on the GUI uvmat
687huvmat=findobj('tag','uvmat');%find the current uvmat interface handle
688UvData=get(huvmat,'UserData');%Data associated to the GUI uvmat
689hhuvmat=guidata(huvmat);%handles in the uvmat GUI
690ObjectName=get(handles.TITLE,'String');%name of the current object
691ListObject=get(hhuvmat.list_object_1,'String');%position in the objet list
692IndexObj_1=get(hhuvmat.list_object_1,'Value');
693if isequal(get(hhuvmat.list_object_2,'Visible'),'on')
694    IndexObj_2=get(hhuvmat.list_object_2,'Value');
695    List2=get(hhuvmat.list_object_2,'String');
696    if IndexObj_2==length(List2)
697        IndexObj_2=[];% '...' selected
698    end
699else
700    IndexObj_2=[];
701end
702testnew=0;
703ObjectData=read_set_object(handles);%read the input parameters defining the object in the GUI set_object
704if strcmp(ListObject{IndexObj_1},ObjectName)% we are editing the object whose projection is viewed in the uvmat frame
705    IndexObj=IndexObj_1;
706    projview='uvmat';
707elseif ~isempty(IndexObj_2) && IndexObj_2<=numel(ListObject)&& strcmp(ListObject{IndexObj_2},ObjectName)% we are editing the object whose projection is viewed in view_field 
708    IndexObj=IndexObj_2;
709    projview='view_field';
710else %new object
711    testnew=1;
712    IndexObj=numel(ListObject)+1;
713    projview='view_field';
714end
715if strcmp(projview,'view_field')
716    hview_field=findobj(allchild(0),'tag','view_field');
717    if isempty(hview_field)
718        hview_field=view_field;
719%     elseif strcmp(ObjectData.ProjMode,'none')||strcmp(ObjectData.ProjMode,'mask_inside')||strcmp(ObjectData.ProjMode,'mask_outside')
720    end
721    PlotHandles=guidata(hview_field);
722    plotaxes=PlotHandles.axes3;%handle of axes3 in view_field
723else
724    PlotHandles=hhuvmat;
725    plotaxes=hhuvmat.axes3;%handle of axes3 in view_field
726end   
727
728%% naming the object
729if length(ObjectName)<1% name of object not defined in set_object
730    ObjectName=[num2str(IndexObj) '-' ObjectData.Style];%default name
731elseif ~get(hhuvmat.edit_object,'Value')%not in edit mode (new object created)
732    detectname=1;
733    ObjectNameNew=ObjectName;
734    vers=0;
735    while detectname==1
736        detectname=find(strcmp(ObjectNameNew,ListObject),1);%test the existence of the proposed name in the list
737        if detectname% if the object name already exists
738            indstr=regexp(ObjectNameNew,'\D');
739            if indstr(end)<length(ObjectNameNew) %object name ends by a number
740                vers=str2double(ObjectNameNew(indstr(end)+1:end))+1;
741                ObjectNameNew=[ObjectNameNew(1:indstr(end)) num2str(vers)];
742            else
743                vers=vers+1;
744                ObjectNameNew=[ObjectNameNew(1:indstr(end)) '_' num2str(vers)];     
745            end
746        end
747    end
748    ObjectName=ObjectNameNew;
749end
750ListObject{IndexObj,1}=ObjectName;
751set(hhuvmat.list_object_1,'String',ListObject)
752set(hhuvmat.list_object_2,'String',[ListObject;{'...'}])
753
754%% update the object plot and projection field
755if testnew
756    set(hhuvmat.list_object_2,'Value',IndexObj)
757    ObjectData.DisplayHandle_uvmat=hhuvmat.axes3;
758    ObjectData.DisplayHandle_view_field=[];
759else
760    if isfield(UvData.Object{IndexObj},'DisplayHandle_uvmat')% save the previous object graph handles
761        ObjectData.DisplayHandle_uvmat=UvData.Object{IndexObj}.DisplayHandle_uvmat;
762    else
763        ObjectData.DisplayHandle_uvmat=hhuvmat.axes3;%there is no object handle, than the axes handles is used as input
764    end
765    if isfield(UvData.Object{IndexObj},'DisplayHandle_view_field')% save the previous object graph handles
766        ObjectData.DisplayHandle_view_field=UvData.Object{IndexObj}.DisplayHandle_view_field;
767    else
768        ObjectData.DisplayHandle_view_field=[];
769    end
770end
771UvData.Object{IndexObj}=ObjectData;%update the current object properties
772UvData.Object=update_obj(UvData,IndexObj_1,IndexObj_2);
773set(huvmat,'UserData',UvData)
774
775%% plot the field projected on the object and store in the corresponding figue
[206]776'TESTproj'
777ProjData= proj_field(UvData.Field,ObjectData)%project the current interface field on ObjectData
[204]778PlotParam=read_plot_param(PlotHandles);
779[PlotType,Object_out{IndexObj}.PlotParam,plotaxes]=plot_field(ProjData,plotaxes,PlotParam);%update an existing field plot
780
781%% update the GUI uvmat
782hhuvmat=guidata(huvmat);%handles of elements in the uvmat GUI
783set(hhuvmat.MenuEditObject,'enable','on')
784set(hhuvmat.edit_object,'Value',1) % set uvmat to object edit mode to allow further object update
785set(hhuvmat.edit_object,'BackgroundColor',[1 1 0]);% paint the edit text in yellow
786%UvData.MouseAction='edit_object'; % set the edit button to 'on'
787
788%------------------------------------------------------------------------
789% --- Executes on button press in MenuCoord.
790function MenuCoord_Callback(hObject, eventdata, handles)
791%------------------------------------------------------------------------
792%----------------------------------------------------
793function YMin_Callback(hObject, eventdata, handles)
794%------------------------------------------------------------------------
795
796function ZMin_Callback(hObject, eventdata, handles)
797%------------------------------------------------------------------------
798
799function ZMax_Callback(hObject, eventdata, handles)
800DZ=str2num(get(handles.ZMax,'String'));
801ZMin=get(handles.z_slider,'Min');
802ZMax=get(handles.z_slider,'Max');
803if ~isequal(ZMax-ZMin,0)
804    rel_step(1)=DZ/(ZMax-ZMin);
805    rel_step(2)=0.2;
806    set(handles.z_slider,'SliderStep',rel_step)
807end
808%------------------------------------------------------------------------
809function YMax_Callback(hObject, eventdata, handles)
810%------------------------------------------------------------------------
811
812function XMin_Callback(hObject, eventdata, handles)
813%------------------------------------------------------------------------
814
815function XMax_Callback(hObject, eventdata, handles)
816%------------------------------------------------------------------------
817%------------------------------------------------------------------------
818function SAVE_Callback(hObject, eventdata, handles)
819% ------------------------------------------------------
820Object=read_set_object(handles);
821huvmat=findobj('Tag','uvmat');
822% UvData=get(huvmat,'UserData');
823if isempty(huvmat)
824    huvmat=findobj(allchild(0),'Name','series');
825end
826hchild=get(huvmat,'Children');
827hrootpath=findobj(hchild,'Tag','RootPath');
828if isempty(hrootpath)
829    RootPath='';
830else
831    RootPath=get(hrootpath,'String');
832    if iscell(RootPath)
833        RootPath=RootPath{1};
834    end
835end
836title={'object name'};
837dir_save=uigetdir(RootPath);
838ObjectName=get(handles.TITLE,'String');
839if ~isempty(ObjectName)&&~strcmp(ObjectName,'')
840    def={fullfile(dir_save,[ObjectName '.xml'])};
841else
842    def={fullfile(dir_save,[Object.Style '.xml'])};
843end
844displ_txt='save object as an .xml file';%default display
845menu=get(handles.ProjMode,'String');
846value=get(handles.ProjMode,'Value');
847ProjMode=menu{value};
848if strcmp(ProjMode,'mask_inside')||strcmp(ProjMode,'mask_outside')
849    displ_txt='save mask contour as an .xml file: to create a mask image, use save_mask on the GUI uvmat (lower right)';
850end
851answer=msgbox_uvmat('INPUT_TXT','save object as an .xml file',def);
852if ~isempty(answer)
853    t=struct2xml(Object);
854    save(t,answer{1})
855end
856msgbox_uvmat('CONFIRMATION',[answer{1}  ' saved'])
857%------------------------------------------------------------------------
858%------------------------------------------------------------------------
859% --- Executes on slider movement.
860function z_slider_Callback(hObject, eventdata, handles)
861%---------------------------------------------------------
862%A ADAPTER
863Z_value=get(handles.z_slider,'Value');
864
865%rotation angles
866Phi=(pi/180)*str2num(get(handles.Phi,'String'));%first Euler angle in radian
867Theta=(pi/180)*str2num(get(handles.Theta,'String'));%second Euler angle in radian
868
869%components of the unity vector normal to the projection plane
870NormVec_X=-sin(Phi)*sin(Theta);
871NormVec_Y=cos(Phi)*sin(Theta);
872NormVec_Z=cos(Theta);
873
874%set new plane position and update graph
875set(handles.XObject,'String',num2str(NormVec_X*Z_value,4))
876set(handles.YObject,'String',num2str(NormVec_Y*Z_value,4))
877set(handles.ZObject,'String',num2str(NormVec_Z*Z_value,4))
878PLOT_Callback(hObject, eventdata, handles)
879%------------------------------------------------------------------------
880%------------------------------------------------------------------------
881% --- Executes on button press in HELP.
882function HELP_Callback(hObject, eventdata, handles)
883path_to_uvmat=which ('uvmat');% check the path of uvmat
884pathelp=fileparts(path_to_uvmat);
885helpfile=fullfile(pathelp,'uvmat_doc','uvmat_doc.html');
886if isempty(dir(helpfile)), msgbox_uvmat('ERROR','Please put the help file uvmat_doc.html in the sub-directory /uvmat_doc of the UVMAT package')
887else
888    addpath (fullfile(pathelp,'uvmat_doc'))
889    web([helpfile '#set_object'])
890end
891%------------------------------------------------------------------------
892
893
Note: See TracBrowser for help on using the repository browser.