source: trunk/src/set_object.m @ 491

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

fix the the way to deal with filter fields using tps
fix the main projection plane in uvmat

File size: 31.3 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:u
10% data: structure describing the object properties
11%    .Style=...
12%    .ProjMode
13%    .CoordType: 'phys' or 'px'
14%    .num_DX,.num_DY,.num_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 26-Jan-2012 22:00:47
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%      .Name : class of object ('POINTS','LINE',....)
68%      .num_DX,num_DY,num_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)
86set(hObject,'WindowButtonDownFcn',{'mouse_down'})%set mouse click action function
87set(hObject,'DeleteFcn',{@closefcn})
88
89% fill the interface as set in the input data:
90if exist('data','var')
91    if isfield(data,'Coord') &&size(data.Coord,2)==3
92        set(handles.z_slider,'Visible','on')
93    else
94        set(handles.z_slider,'Visible','off')
95    end
96    if isfield(data,'TypeMenu')
97        set(handles.Type,'String',data.TypeMenu)
98    end
99    if isfield(data,'ProjModeMenu')
100        set(handles.ProjMode,'UserData',data.ProjModeMenu)% data.ProjModeMenu as default menu (used in Type_Callback)
101    end
102    errormsg=fill_GUI(data,handles);
103    if ~isempty(errormsg)
104        msgbox_uvmat('ERROR','bad data input in set_object')
105        return
106    end
107    Type_Callback(hObject, eventdata, handles)% update the GUI set_object depending on the object type   
108
109    if isfield(data,'RangeZ') && length(ZBounds) >= 2
110        set(handles.num_RangeZ_2,'String',num2str(max(data.RangeZ),3))
111        DZ=max(data.RangeZ);%slider step
112        if ~isnan(ZBounds(1)) && ZBounds(2)~=ZBounds(1)
113            rel_step(1)=min(DZ/(ZBounds(2)-ZBounds(1)),0.2);%must be smaller than 1
114            rel_step(2)=0.1;
115            set(handles.z_slider,'Visible','on')
116            set(handles.z_slider,'Min',ZBounds(1))
117            set(handles.z_slider,'Max',ZBounds(2))
118            set(handles.z_slider,'SliderStep',rel_step)
119            set(handles.z_slider,'Value',(ZBounds(1)+ZBounds(2))/2)
120        end
121    end
122    if isfield(data,'RangeX')
123        if ischar(data.RangeX)
124            data.RangeX=str2num(data.RangeX);
125        end
126        set(handles.num_RangeX_2,'String',num2str(max(data.RangeX),3))
127        set(handles.num_RangeX_1,'String',num2str(min(data.RangeX),3))
128    end
129    if isfield(data,'RangeY')
130        if ischar(data.RangeY)
131            data.RangeY=str2num(data.RangeY);
132        end
133        set(handles.num_RangeY_2,'String',num2str(max(data.RangeY),3))
134        set(handles.num_RangeY_1,'String',num2str(min(data.RangeY),3))
135    end
136    if isfield(data,'RangeZ')
137        if ischar(data.RangeZ)
138            data.RangeZ=str2num(data.RangeZ);
139        end
140        set(handles.num_RangeZ_2,'String',num2str(max(data.RangeZ),3))
141        if numel(data.RangeZ)>=2
142            set(handles.num_RangeZ_1,'String',num2str(min(data.RangeZ),3))
143        end
144    end 
145    if isfield(data,'Angle') && isequal(numel(data.Angle),3)
146         set(handles.num_Angle_1,'String',num2str(data.Angle(1)))
147         set(handles.num_Angle_2,'String',num2str(data.Angle(2)))
148         set(handles.num_Angle_3,'String',num2str(data.Angle(3)))
149    end
150end
151% if enable_plot
152%    set(handles.PLOT,'enable','on')
153% else
154% enable the PLOT (REFRESH) button by default
155%defaul settings
156set(get(handles.set_object,'children'),'enable','on')
157   set(handles.PLOT,'enable','off')
158% end
159huvmat=findobj(allchild(0),'tag','uvmat');
160UvData=get(huvmat,'UserData');
161pos_uvmat=get(huvmat,'Position');
162%position the set_object GUI with respect to uvmat
163if isfield(UvData,'SetObjectOrigin')
164    pos_set_object(1:2)=UvData.SetObjectOrigin + pos_uvmat(1:2);
165    pos_set_object(3:4)=UvData.SetObjectSize .* pos_uvmat(3:4);
166    set(hObject,'Position',pos_set_object)
167end
168
169%------------------------------------------------------------------------
170% --- Outputs from this function are returned to the command line.
171function varargout = set_object_OutputFcn(hObject, eventdata, handles)
172%------------------------------------------------------------------------
173% Get default command line output from handles structure
174varargout{1} = handles.output;
175varargout{2}=handles;
176
177%------------------------------------------------------------------------
178% executed when closing the GUI set_object
179function closefcn(gcbo,eventdata)
180%------------------------------------------------------------------------
181huvmat=findobj(allchild(0),'Tag','uvmat');%find the current uvmat interface handle
182if ~isempty(huvmat)
183    hhuvmat=guidata(huvmat);
184%     set(hhuvmat.ViewObject_1,'value',0)% desactivate the two view buttons
185    set(hhuvmat.ViewObject,'value',0)%
186    set(hhuvmat.edit_object,'Value',0)% desactivate the edit option
187    set(hhuvmat.edit_object,'BackgroundColor',[0.7 0.7 0.7])%put unactivated buttons to gree
188    % deselect the object in ListObject when view_field is closed
189    if isempty(findobj(allchild(0),'Tag','view_field'))
190        ObjIndex=get(hhuvmat.ListObject,'Value');
191        ObjIndex=ObjIndex(1);%keep only the first object selected
192        set(hhuvmat.ListObject,'Value',ObjIndex)
193        % draw all object colors in blue (unselected) in uvmat
194        hother=[findobj(hhuvmat.axes3,'Tag','proj_object');findobj(hhuvmat.axes3,'Tag','DeformPoint')];%find all the proj object and deform point representations
195        for iobj=1:length(hother)
196            if isequal(get(hother(iobj),'Type'),'rectangle')||isequal(get(hother(iobj),'Type'),'patch')
197                set(hother(iobj),'EdgeColor','b')
198                if isequal(get(hother(iobj),'FaceColor'),'m')
199                    set(hother(iobj),'FaceColor','b')
200                end
201            elseif isequal(get(hother(iobj),'Type'),'image')
202                Acolor=get(hother(iobj),'CData');
203                Acolor(:,:,1)=zeros(size(Acolor,1),size(Acolor,2));
204                set(hother(iobj),'CData',Acolor);
205            else
206                set(hother(iobj),'Color','b')
207            end
208            set(hother(iobj),'Selected','off')
209        end
210    end
211end
212hseries=findobj(allchild(0),'Name','series');%find the current series interface handle
213if ~isempty(hseries)
214    hhseries=guidata(hseries);
215    set(hhseries.GetObject,'Value',0)
216    set(hhseries.GetObject,'BackgroundColor',[0 1 0])%put unactivated buttons to green
217end
218
219
220%------------------------------------------------------------------------
221% --- Executes on selection change in Type.
222function Type_Callback(hObject, eventdata, handles)
223%------------------------------------------------------------------------
224%style_prev=get(handles.Type,'UserData');%previous object style
225ListType=get(handles.Type,'String');
226Type=ListType{get(handles.Type,'Value')};
227% make correspondance between different object styles
228Coord=get(handles.Coord,'Data');
229
230%% set the number of lines in the Coord table depending on object type
231switch Type
232    case{'line'}
233        if size(Coord,1)<2
234            if isequal(size(Coord,2),3)
235                Coord=[Coord; 0 0 0];%add a line for edition (3D case)
236            else
237                Coord=[Coord; 0 0]; %add a line for edition (2D case)
238            end
239        else
240            Coord=Coord(1:2,:);
241        end
242    case{'rectangle','ellipse','plane','volume'}
243        Coord=Coord(1,:);
244end
245set(handles.Coord,'Data',Coord)
246
247%% set the projection menu and the corresponding options
248if isempty(get(handles.ProjMode,'UserData'))
249    switch Type
250        case {'points','line','polyline','plane'}
251            menu_proj={'projection';'interp';'filter';'none'};
252        case {'polygon','rectangle','ellipse'}
253            menu_proj={'inside';'outside';'mask_inside';'mask_outside'};
254        case 'volume'
255            menu_proj={'interp';'none'};
256        otherwise
257            menu_proj={'projection';'interp';'filter';'none'};%default
258    end
259else
260    menu_proj=get(handles.ProjMode,'UserData');
261end
262ProjModeList=get(handles.ProjMode,'String');
263menu_index=find(strcmp(ProjModeList{get(handles.ProjMode,'Value')},menu_proj));
264if isempty(menu_index)
265    menu_index=1;%
266end
267set(handles.ProjMode,'Value',menu_index);% value index must not exceed the menu length
268set(handles.ProjMode,'String',menu_proj)
269ProjMode_Callback(hObject, eventdata, handles)
270
271%------------------------------------------------------------------------
272% --- Executes on selection change in ProjMode.
273function ProjMode_Callback(hObject, eventdata, handles)
274menu=get(handles.ProjMode,'String');
275value=get(handles.ProjMode,'Value');
276ProjMode=menu{value};
277menu=get(handles.Type,'String');
278value=get(handles.Type,'Value');
279ObjectStyle=menu{value};
280%%%%%%%%% TODO
281test3D=0; %TODO: update  test3D=isequal(get(handles.ZObject,'Visible'),'on');%3D case
282%%%%%%%%%
283%default setting
284set(handles.num_Angle_1,'Visible','off')
285set(handles.num_Angle_2,'Visible','off')
286set(handles.num_Angle_3,'Visible','off')
287set(handles.num_RangeX_1,'Visible','off')
288set(handles.num_RangeX_2,'Visible','off')
289set(handles.num_RangeY_1,'Visible','off')
290if isequal(ProjMode,'interp')
291    set(handles.num_RangeY_2,'Visible','off')
292else
293    set(handles.num_RangeY_2,'Visible','on')
294end
295if strcmp(ObjectStyle,'rectangle')||strcmp(ObjectStyle,'ellipse')
296    set(handles.num_RangeX_2,'Visible','on')
297else
298   set(handles.num_RangeX_2,'Visible','off')
299end
300set(handles.num_RangeZ_1,'Visible','off')
301set(handles.num_RangeZ_2,'Visible','off')
302set(handles.num_DX,'Visible','off')
303set(handles.num_DY,'Visible','off')
304set(handles.num_DZ,'Visible','off')
305
306switch ObjectStyle
307    case 'points'
308        set(handles.num_RangeY_2,'TooltipString','num_YMax: range of projection around each point')
309%         set(handles.XObject,'TooltipString','XObject: set of x coordinates of the points')
310%         set(handles.YObject,'TooltipString','YObject: set of y coordinates of the points')
311%         set(handles.ZObject,'TooltipString','ZObject: set of z coordinates of the points')
312    case {'line','polyline','polygon'}
313        set(handles.num_RangeY_2,'TooltipString','num_YMax: range of projection around the line')
314         set(handles.Coord,'TooltipString','Coord: table of x,y, z coordinates defining the line')
315%         set(handles.YObject,'TooltipString','YObject: set of y coordinates defining the line')
316%         set(handles.ZObject,'TooltipString','ZObject: set of z coordinates defining the line')
317        if isequal(ProjMode,'interp')|| isequal(ProjMode,'filter')
318            set(handles.num_DX,'Visible','on')
319            set(handles.num_DX,'TooltipString','num_DX: mesh for the interpolated field along the line')
320        end       
321    case {'rectangle','ellipse'}
322        set(handles.num_RangeX_2,'TooltipString',['num_XMax: half length of the ' ObjectStyle])
323        set(handles.num_RangeY_2,'TooltipString',['num_YMax: half width of the ' ObjectStyle])
324%         set(handles.XObject,'TooltipString',['XObject:  x coordinate of the ' Type ' centre'])
325%         set(handles.YObject,'TooltipString',['YObject:  y coordinate of the ' Type ' centre'])
326    case {'plane'} 
327        set(handles.num_Angle_3,'Visible','on')
328        set(handles.num_RangeX_1,'Visible','on')
329        set(handles.num_RangeX_2,'Visible','on')
330        set(handles.num_RangeY_1,'Visible','on')
331        set(handles.num_RangeY_2,'Visible','on')
332%         set(handles.XObject,'TooltipString',['XObject:  x coordinate of the axis origin for the ' Type])
333%         set(handles.YObject,'TooltipString',['YObject:  y coordinate of the axis origin for the ' Type])
334        set(handles.num_RangeZ_2,'TooltipString','num_ZMax: range of projection normal to the plane')
335        if test3D
336            set(handles.num_Angle_2,'Visible','on')
337            set(handles.num_Angle_1,'Visible','on')
338            set(handles.num_RangeZ_2,'Visible','on')
339        end
340        if isequal(ProjMode,'interp')|| isequal(ProjMode,'filter')
341            set(handles.num_DX,'Visible','on')
342            set(handles.num_DY,'Visible','on')
343        else
344            set(handles.num_DX,'Visible','off')
345            set(handles.num_DY,'Visible','off')
346        end
347        if  isequal(ProjMode,'interp')
348            set(handles.num_DZ,'Visible','on') 
349        end
350     case {'volume'} 
351        set(handles.num_RangeX_1,'Visible','on')
352        set(handles.num_RangeX_2,'Visible','on')
353        set(handles.num_RangeY_1,'Visible','on')
354        set(handles.num_RangeY_2,'Visible','on')
355        set(handles.XObject,'TooltipString',['XObject:  x coordinate of the axis origin for the ' ObjectStyle])
356        set(handles.YObject,'TooltipString',['YObject:  y coordinate of the axis origin for the ' ObjectStyle])
357        set(handles.num_Angle_1,'Visible','on')
358        set(handles.num_Angle_2,'Visible','on')
359        set(handles.num_Angle_3,'Visible','on')
360        set(handles.num_RangeZ_1,'Visible','on')
361        set(handles.num_RangeZ_2,'Visible','on')
362        if isequal(ProjMode,'interp')|| isequal(ProjMode,'filter')
363            set(handles.num_DX,'Visible','on')
364            set(handles.num_DY,'Visible','on')
365            set(handles.num_DZ,'Visible','on')
366        else
367            set(handles.num_DX,'Visible','off')
368            set(handles.num_DY,'Visible','off')
369            set(handles.num_DZ,'Visible','off')
370        end
371end
372%------------------------------------------------------------------------
373
374%------------------------------------------------------------------------
375function num_Angle_1_Callback(hObject, eventdata, handles)
376update_slider(hObject, eventdata,handles)
377%------------------------------------------------------------------------
378%------------------------------------------------------------------------
379function num_Angle_2_Callback(hObject, eventdata, handles)
380update_slider(hObject, eventdata,handles)
381%------------------------------------------------------------------------
382function update_slider(hObject, eventdata,handles)
383%rotation angles
384PlaneAngle(1)=str2num(get(handles.num_Angle_1,'String'));%first  angle in degrees
385PlaneAngle(2)=str2num(get(handles.num_Angle_2,'String'));%second  angle in degrees
386PlaneAngle(3)=str2num(get(handles.num_Angle_3,'String'));%second  angle in degrees
387om=norm(PlaneAngle);%norm of rotation angle in radians
388OmAxis=PlaneAngle/om; %unit vector marking the rotation axis
389cos_om=cos(pi*om/180);
390sin_om=sin(pi*om/180);
391coeff=OmAxis(3)*(1-cos_om);
392%components of the unity vector norm_plane normal to the projection plane
393norm_plane(1)=OmAxis(1)*coeff+OmAxis(2)*sin_om;
394norm_plane(2)=OmAxis(2)*coeff-OmAxis(1)*sin_om;
395norm_plane(3)=OmAxis(3)*coeff+cos_om;
396huvmat=findobj('Tag','uvmat');%find the current uvmat interface handle
397UvData=get(huvmat,'UserData');%Data associated to the current uvmat interface
398if isfield(UvData,'X') & isfield(UvData,'Y') & isfield(UvData,'Z')
399    Z=norm_plane(1)*(UvData.X)+norm_plane(2)*(UvData.Y)+norm_plane(3)*(UvData.Z);
400    set(handles.z_slider,'Min',min(Z))
401    set(handles.z_slider,'Max',max(Z))
402    ZMax_Callback(hObject, eventdata, handles)
403end
404%------------------------------------------------------------------------
405function num_DX_Callback(hObject, eventdata, handles)
406%------------------------------------------------------------------------
407%------------------------------------------------------------------------
408function num_DY_Callback(hObject, eventdata, handles)
409%------------------------------------------------------------------------
410%------------------------------------------------------------------------
411function num_DZ_Callback(hObject, eventdata, handles)
412%------------------------------------------------------------------------
413
414
415%------------------------------------------------------------------------
416% --- Executes on button press in PLOT: refresh the current object , plot the object and its projected field
417function PLOT_Callback(hObject, eventdata, handles)
418
419%% read the object parameters in the GUI set_object
420ObjectData=read_GUI(handles.set_object);%read the parameters defining the object in the GUI set_object
421if iscell(ObjectData.Coord)%check for empty line
422    ObjectData.Coord=[0 0 0];
423    hhset_object=guidata(handles.set_object);
424    set(hhset_object.Coord,'Data',ObjectData.Coord)
425end
426checknan=isnan(sum(ObjectData.Coord,2));%check for NaN lines
427if ~isempty(checknan)
428    ObjectData.Coord(checknan,:)=[];%remove the NaN lines
429end
430ObjectName=ObjectData.Name;%name of the current object defined in set_object
431if isempty(ObjectName)
432     ObjectName=ObjectData.Type;% name the object by the object type type by default
433end
434
435%% read the current object selection in the GUI uvmat
436huvmat=findobj('tag','uvmat');%find the current uvmat GUI handle
437UvData=get(huvmat,'UserData');%Data associated to the GUI uvmat
438hhuvmat=guidata(huvmat);%handles of the objects children of the  GUI uvmat
439ListObject=get(hhuvmat.ListObject,'String');% list of objects displayed in uvmat
440IndexObj=get(hhuvmat.ListObject,'Value');% index of the selected object for display in uvmat
441%set or modify(edit mode) the nameof the currently selected object
442detectname=1;
443ObjectNameNew=ObjectName;
444vers=0;% index of the name
445ListOther=ListObject;
446ListOther(IndexObj)=[];
447while ~isempty(detectname)
448    detectname=find(strcmp(ObjectNameNew,ListOther),1);%test the existence of the proposed name in the list
449    if detectname% if the object name already exists
450        indstr=regexp(ObjectNameNew,'\D');%indices of non number characters
451        if indstr(end)<length(ObjectNameNew) %object name ends by a number
452            vers=str2double(ObjectNameNew(indstr(end)+1:end))+1;
453            ObjectNameNew=[ObjectNameNew(1:indstr(end)) num2str(vers)];
454        else
455            vers=vers+1;
456            ObjectNameNew=[ObjectNameNew(1:indstr(end)) '_' num2str(vers)];
457        end
458    end
459end
460ObjectName=ObjectNameNew;
461set(handles.Name,'String',ObjectName)% display the default name in set_object
462ListObject{IndexObj}=ObjectName;
463set(hhuvmat.ListObject,'String',ListObject);%complement the object list
464set(hhuvmat.ViewObject,'Value',1)% indicate that the currently selected objected is viewed on set_object
465check_handle=isfield(UvData.Object{IndexObj},'DisplayHandle') && isfield(UvData.Object{IndexObj}.DisplayHandle,'uvmat')...
466    && ~isempty(UvData.Object{IndexObj}.DisplayHandle.uvmat) && ishandle(UvData.Object{IndexObj}.DisplayHandle.uvmat);
467if check_handle
468    obj_handle=UvData.Object{IndexObj}.DisplayHandle.uvmat;
469end
470UvData.Object{IndexObj}=ObjectData;%record the current object properties in uvmat
471if check_handle
472    UvData.Object{IndexObj}.DisplayHandle.uvmat=obj_handle; %preserve the object plot handle if valid
473else
474    UvData.Object{IndexObj}.DisplayHandle.uvmat=hhuvmat.axes3; %axes taken as object display handle by defualt
475end
476%set(hhuvmat.edit_object,'Value',1)% set the current object to edit mode
477
478%% plot the field projected on the object
479hview_field=[];%default
480IndexObj_1=get(hhuvmat.ListObject_1,'Value');
481if strcmp(ObjectData.ProjMode,'mask_inside')||strcmp(ObjectData.ProjMode,'mask_outside')||strcmp(ObjectData.ProjMode,'none')
482    PlotType='text';
483else
484    [ProjData,errormsg]= proj_field(UvData.Field,ObjectData);%project the current field of uvmat on ObjectData
485    if ~isempty(errormsg)
486        msgbox_uvmat('ERROR', errormsg)
487        return
488    end   
489    if isequal(IndexObj_1,IndexObj) % if  the projection is in uvmat
490         PlotType=plot_field(ProjData,hhuvmat.axes3,read_GUI(get(hhuvmat.axes3,'parent')));%update the current uvmat plot
491    else  % if the projection is in view_field
492        hview_field=findobj(allchild(0),'tag','view_field');
493        if isempty(hview_field)
494            hview_field=view_field(ProjData); %open the view_field GUI for plot
495        else
496            hhview_field=guidata(hview_field);
497            [PlotType,PlotParam]=plot_field(ProjData,hhview_field.axes3,read_GUI(hview_field));%update an existing  plot in view_field
498            write_plot_param(hhview_field,PlotParam); %update the display of plotting parameters for the current object
499        end
500        haxes=findobj(hview_field,'tag','axes3');
501        Data=get(hview_field,'UserData');
502        if strcmp(get(haxes,'Visible'),'off')%sempty(PlotParam.Coordinates)% case of no plot display (pure text table)
503            h_TableDisplay=findobj(hview_field,'tag','TableDisplay');
504            pos_table=get(h_TableDisplay,'Position');
505            pos=get(hview_field,'Position');
506            set(hview_field,'Position',[pos(1)+pos(3)-pos_table(3) pos(2)+pos(4)-pos_table(4) pos_table(3) pos_table(4)])
507            drawnow
508            set(hview_field,'UserData',Data);% restore the previously stored GUI position after GUI resizing
509        else
510            set(hview_field,'Position',Data.GUISize)
511        end
512      %  set(hhuvmat.ViewField,'Value',1)% indicate that the field projection on the current object is plotted in view_field
513    end
514end
515
516%% update the object plot
517hobject=UvData.Object{IndexObj}.DisplayHandle.uvmat;
518% if we are editing the object used for projection in uvmat
519if isequal(IndexObj_1,IndexObj)
520    %update the representation of the current object for projection field represented in view_field
521    for iobj=1:numel(UvData.Object)
522        UvData.Object{iobj}.DisplayHandle.uvmat=...
523            plot_object(UvData.Object{iobj},UvData.Object{IndexObj_1},UvData.Object{iobj}.DisplayHandle.uvmat,'b');
524    end
525else %  we are editing the object used for projection field represented in view_field
526    %update the representation of the current object in uvmat
527    UvData.Object{IndexObj}.DisplayHandle.uvmat=...
528             plot_object(UvData.Object{IndexObj},UvData.Object{IndexObj_1},UvData.Object{IndexObj}.DisplayHandle.uvmat,'m');
529    %indicate the object index in the user data of the object plot (needed for further mouse editing)
530    ObjectInfo=get(UvData.Object{IndexObj}.DisplayHandle.uvmat,'UserData');
531    ObjectInfo.IndexObj=IndexObj;
532    set(UvData.Object{IndexObj}.DisplayHandle.uvmat,'UserData',ObjectInfo)
533    % update the representation of all objects in view_field
534    for iobj=1:numel(UvData.Object)
535        if isfield(UvData.Object{iobj}.DisplayHandle,'view_field')
536            UvData.Object{iobj}.DisplayHandle.view_field=...
537                plot_object(UvData.Object{iobj},UvData.Object{iobj},UvData.Object{iobj}.DisplayHandle.view_field,'b');
538        end
539    end
540end
541set(huvmat,'UserData',UvData)
542
543%% update the GUI uvmat
544set(hhuvmat.MenuEditObject,'enable','on')
545set(hhuvmat.edit_object,'Value',1) % set uvmat to object edit mode to allow further object update
546set(hhuvmat.edit_object,'BackgroundColor',[1 1 0]);% paint the edit text in yellow
547set(hhuvmat.ViewField,'Value',1)
548
549%------------------------------------------------------------------------
550% --- Executes on button press in MenuCoord.
551function MenuCoord_Callback(hObject, eventdata, handles)
552%------------------------------------------------------------------------
553%----------------------------------------------------
554function num_RangeY_1_Callback(hObject, eventdata, handles)
555%------------------------------------------------------------------------
556
557function num_RangeZ_1_Callback(hObject, eventdata, handles)
558%------------------------------------------------------------------------
559
560function num_RangeZ_2_Callback(hObject, eventdata, handles)
561DZ=str2num(get(handles.num_RangeZ_2,'String'));
562ZMin=get(handles.z_slider,'Min');
563ZMax=get(handles.z_slider,'Max');
564if ~isequal(ZMax-ZMin,0)
565    rel_step(1)=DZ/(ZMax-ZMin);
566    rel_step(2)=0.2;
567    set(handles.z_slider,'SliderStep',rel_step)
568end
569%------------------------------------------------------------------------
570function num_RangeY_2_Callback(hObject, eventdata, handles)
571%------------------------------------------------------------------------
572
573function num_RangeX_1_Callback(hObject, eventdata, handles)
574%------------------------------------------------------------------------
575
576function num_RangeX_2_Callback(hObject, eventdata, handles)
577%------------------------------------------------------------------------
578%------------------------------------------------------------------------
579function SAVE_Callback(hObject, eventdata, handles)
580% ------------------------------------------------------
581%Object=read_set_object(handles);
582Object=read_GUI(handles.set_object);
583huvmat=findobj('Tag','uvmat');
584% UvData=get(huvmat,'UserData');
585if isempty(huvmat)
586    huvmat=findobj(allchild(0),'Name','series');
587end
588hchild=get(huvmat,'Children');
589hrootpath=findobj(hchild,'Tag','RootPath');
590if isempty(hrootpath)
591    RootPath='';
592else
593    RootPath=get(hrootpath,'String');
594    if iscell(RootPath)
595        RootPath=RootPath{1};
596    end
597end
598title={'object name'};
599dir_save=uigetdir(RootPath);
600ObjectName=get(handles.Name,'String');
601if ~isempty(ObjectName)&&~strcmp(ObjectName,'')
602    def={fullfile(dir_save,[ObjectName '.xml'])};
603else
604    def={fullfile(dir_save,[Object.Style '.xml'])};
605end
606displ_txt='save object as an .xml file';%default display
607menu=get(handles.ProjMode,'String');
608value=get(handles.ProjMode,'Value');
609ProjMode=menu{value};
610if strcmp(ProjMode,'mask_inside')||strcmp(ProjMode,'mask_outside')
611    displ_txt='save mask contour as an .xml file: to create a mask image, use save_mask on the GUI uvmat (lower right)';
612end
613answer=msgbox_uvmat('INPUT_TXT','save object as an .xml file',def);
614if ~isempty(answer)
615    t=struct2xml(Object);
616    t=set(t,1,'name','ProjObject');
617    save(t,answer{1})
618end
619msgbox_uvmat('CONFIRMATION',[answer{1}  ' saved'])
620
621%------------------------------------------------------------------------
622% --- Executes on slider movement.
623function z_slider_Callback(hObject, eventdata, handles)
624%---------------------------------------------------------
625Z_value=get(handles.z_slider,'Value');
626%rotation angles
627PlaneAngle=[0 0 0];
628norm_plane=[0 0 1];
629cos_om=1;
630sin_om=0;
631
632PlaneAngle(1)=str2double(get(handles.num_Angle_1,'String'));%first  angle in degrees
633PlaneAngle(2)=str2double(get(handles.num_Angle_2,'String'));%second  angle in degrees
634PlaneAngle(3)=str2double(get(handles.num_Angle_3,'String'));%second  angle in degrees
635PlaneAngle=(pi/180)*PlaneAngle;
636om=norm(PlaneAngle);%norm of rotation angle in radians
637if isequal(om,0)
638    norm_plane=[0 0 1];
639else
640    OmAxis=PlaneAngle/om; %unit vector marking the rotation axis
641    cos_om=cos(om);
642    sin_om=sin(om);
643    coeff=OmAxis(3)*(1-cos_om);
644    %components of the unity vector norm_plane normal to the projection plane
645    norm_plane(1)=OmAxis(1)*coeff+OmAxis(2)*sin_om;
646    norm_plane(2)=OmAxis(2)*coeff-OmAxis(1)*sin_om;
647    norm_plane(3)=OmAxis(3)*coeff+cos_om;
648end
649
650% update graph
651PLOT_Callback(hObject, eventdata, handles)
652
653%------------------------------------------------------------------------
654% --- Executes on button press in HELP.
655function HELP_Callback(hObject, eventdata, handles)
656%------------------------------------------------------------------------
657path_to_uvmat=which ('uvmat');% check the path of uvmat
658pathelp=fileparts(path_to_uvmat);
659helpfile=fullfile(pathelp,'uvmat_doc','uvmat_doc.html');
660if ~isempty(dir(helpfile)), msgbox_uvmat('ERROR','Please put the help file uvmat_doc.html in the sub-directory /uvmat_doc of the UVMAT package')
661    addpath (fullfile(pathelp,'uvmat_doc'))
662    web([helpfile '#set_object'])
663end
664%------------------------------------------------------------------------
665
666function Name_Callback(hObject, eventdata, handles)
667% hObject    handle to Name (see GCBO)
668% eventdata  reserved - to be defined in a future version of MATLAB
669% handles    structure with handles and user data (see GUIDATA)
670
671% Hints: get(hObject,'String') returns contents of Name as text
672%        str2double(get(hObject,'String')) returns contents of Name as a double
673
674%------------------------------------------------------------------------
675% --- Executes when entered data in editable cell(s) in Coord.
676function Coord_CellEditCallback(hObject, eventdata, handles)
677%------------------------------------------------------------------------
678ListType=get(handles.Type,'String');
679Type=ListType{get(handles.Type,'Value')};
680switch Type
681    % add lines if multi line input needed
682    case{'points','polyline','polygon'}
683        Coord=get(handles.Coord,'Data');
684        if ~isnan(Coord(end,1))
685            if isequal(size(Coord,2),3)
686                %Coord=[Coord;{[]} {[]} {[]}];%add a line for edition (3D case)
687                Coord=[Coord;NaN NaN NaN]; %add a line for edition (3D case)
688            else
689                Coord=[Coord;NaN NaN]; %add a line for edition (2D case)
690            end
691            set(handles.Coord,'Data',Coord)
692        end
693end
694
695
696
697function num_Angle_3_Callback(hObject, eventdata, handles)
698% hObject    handle to num_Angle_3 (see GCBO)
699% eventdata  reserved - to be defined in a future version of MATLAB
700% handles    structure with handles and user data (see GUIDATA)
701
702% Hints: get(hObject,'String') returns contents of num_Angle_3 as text
703%        str2double(get(hObject,'String')) returns contents of num_Angle_3 as a double
Note: See TracBrowser for help on using the repository browser.