source: trunk/src/set_object.m @ 591

Last change on this file since 591 was 591, checked in by sommeria, 11 years ago

various updates, in particular modification of series to do calculations in the cluster

File size: 32.2 KB
Line 
1%'set_object': GUI to edit a projection object
2%------------------------------------------------------------------------
3% function hset_object= set_object(data, PlotHandles,ZBounds)
4% associated with the GUI set_object.fig
5%
6% OUTPUT:
7% hset_object: handle of the GUI figure
8%
9% INPUT: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.set_object);
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.PlotAxes,'Tag','proj_object');findobj(hhuvmat.PlotAxes,'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.CheckObject,'Value',0)
216    set(hhseries.CheckObject,'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_lin';'interp_tps';'none'};
252        case {'polygon','rectangle','ellipse'}
253            menu_proj={'inside';'outside';'mask_inside';'mask_outside'};
254        case 'volume'
255            menu_proj={'interp_lin';'none'};
256        otherwise
257            menu_proj={'projection';'interp_lin';'interp_tps';'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_lin')|| isequal(ProjMode,'interp_tps')
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_lin')|| isequal(ProjMode,'interp_tps')
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_lin')|| isequal(ProjMode,'interp_tps')
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_lin')
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_lin')|| isequal(ProjMode,'interp_tps')
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
419set(handles.PLOT,'BackgroundColor',[1 1 0])
420drawnow
421
422%% read the object parameters in the GUI set_object
423ObjectData=read_GUI(handles.set_object);%read the parameters defining the object in the GUI set_object
424if iscell(ObjectData.Coord)%check for empty line
425    ObjectData.Coord=[0 0 0];
426    hhset_object=guidata(handles.set_object);
427    set(hhset_object.Coord,'Data',ObjectData.Coord)
428end
429checknan=isnan(sum(ObjectData.Coord,2));%check for NaN lines
430if ~isempty(checknan)
431    ObjectData.Coord(checknan,:)=[];%remove the NaN lines
432end
433ObjectName=ObjectData.Name;%name of the current object defined in set_object
434if isempty(ObjectName)
435     ObjectName=ObjectData.Type;% name the object by the object type type by default
436end
437
438%% read the current object selection in the GUI uvmat
439huvmat=findobj('tag','uvmat');%find the current uvmat GUI handle
440UvData=get(huvmat,'UserData');%Data associated to the GUI uvmat
441hhuvmat=guidata(huvmat);%handles of the objects children of the  GUI uvmat
442ListObject=get(hhuvmat.ListObject,'String');% list of objects displayed in uvmat
443IndexObj=get(hhuvmat.ListObject,'Value');% index of the selected object for display in uvmat
444%set or modify(edit mode) the nameof the currently selected object
445detectname=1;
446ObjectNameNew=ObjectName;
447vers=0;% index of the name
448ListOther=ListObject;
449ListOther(IndexObj)=[];
450while ~isempty(detectname)
451    detectname=find(strcmp(ObjectNameNew,ListOther),1);%test the existence of the proposed name in the list
452    if detectname% if the object name already exists
453        indstr=regexp(ObjectNameNew,'\D');%indices of non number characters
454        if indstr(end)<length(ObjectNameNew) %object name ends by a number
455            vers=str2double(ObjectNameNew(indstr(end)+1:end))+1;
456            ObjectNameNew=[ObjectNameNew(1:indstr(end)) num2str(vers)];
457        else
458            vers=vers+1;
459            ObjectNameNew=[ObjectNameNew(1:indstr(end)) '_' num2str(vers)];
460        end
461    end
462end
463ObjectName=ObjectNameNew;
464set(handles.Name,'String',ObjectName)% display the default name in set_object
465ListObject{IndexObj}=ObjectName;
466set(hhuvmat.ListObject,'String',ListObject);%complement the object list
467set(hhuvmat.ViewObject,'Value',1)% indicate that the currently selected objected is viewed on set_object
468check_handle=isfield(UvData.Object{IndexObj},'DisplayHandle') && isfield(UvData.Object{IndexObj}.DisplayHandle,'uvmat')...
469    && ~isempty(UvData.Object{IndexObj}.DisplayHandle.uvmat) && ishandle(UvData.Object{IndexObj}.DisplayHandle.uvmat);
470if check_handle
471    obj_handle=UvData.Object{IndexObj}.DisplayHandle.uvmat;
472end
473UvData.Object{IndexObj}=ObjectData;%record the current object properties in uvmat
474if check_handle
475    UvData.Object{IndexObj}.DisplayHandle.uvmat=obj_handle; %preserve the object plot handle if valid
476else
477    UvData.Object{IndexObj}.DisplayHandle.uvmat=hhuvmat.PlotAxes; %axes taken as object display handle by defualt
478end
479%set(hhuvmat.edit_object,'Value',1)% set the current object to edit mode
480
481%% plot the field projected on the object
482hview_field=[];%default
483IndexObj_1=get(hhuvmat.ListObject_1,'Value');
484if strcmp(ObjectData.ProjMode,'mask_inside')||strcmp(ObjectData.ProjMode,'mask_outside')||strcmp(ObjectData.ProjMode,'none')
485    PlotType='text';
486else
487    % create tps coeff if needed for ProjMode 'interp_tps'
488    if strcmp(ObjectData.ProjMode,'interp_tps')&&~isfield(UvData.Field,'Coord_tps')
489        %UvData.Field=calc_tps(UvData.Field,1);
490        [UvData.Field,errormsg]=tps_coeff_field(UvData.Field,1);
491        if ~isempty(errormsg)
492            msgbox_uvmat('ERROR', ['set_object/tps_coeff_field/' errormsg])
493            set(handles.PLOT,'enable','on')
494            return
495        end
496    end
497    [ProjData,errormsg]= proj_field(UvData.Field,ObjectData);%project the current field of uvmat on ObjectData
498    if ~isempty(errormsg)
499        msgbox_uvmat('ERROR', ['set_object/proj_field/' errormsg])
500        set(handles.PLOT,'enable','on')
501        return
502    end
503    if isequal(IndexObj_1,IndexObj) % if  the projection is in uvmat
504        PlotType=plot_field(ProjData,hhuvmat.PlotAxes,read_GUI(get(hhuvmat.PlotAxes,'parent')));%update the current uvmat plot
505    else  % if the projection is in view_field
506        hview_field=findobj(allchild(0),'tag','view_field');
507        if isempty(hview_field)
508            hview_field=view_field(ProjData); %open the view_field GUI for plot
509        else
510            hhview_field=guidata(hview_field);
511            [PlotType,PlotParam]=plot_field(ProjData,hhview_field.PlotAxes,read_GUI(hview_field));%update an existing  plot in view_field
512            errormsg=fill_GUI(PlotParam,hview_field);
513            if ~isempty(errormsg)
514                msgbox_uvmat('ERROR',errormsg)
515                return
516            end
517            %     write_plot_param(hhview_field,PlotParam); %update the display of plotting parameters for the current object
518        end
519        haxes=findobj(hview_field,'tag','axes3');
520        Data=get(hview_field,'UserData');
521        if strcmp(get(haxes,'Visible'),'off')%sempty(PlotParam.Coordinates)% case of no plot display (pure text table)
522            h_TableDisplay=findobj(hview_field,'tag','TableDisplay');
523            pos_table=get(h_TableDisplay,'Position');
524            pos=get(hview_field,'Position');
525            set(hview_field,'Position',[pos(1)+pos(3)-pos_table(3) pos(2)+pos(4)-pos_table(4) pos_table(3) pos_table(4)])
526            drawnow
527            set(hview_field,'UserData',Data);% restore the previously stored GUI position after GUI resizing
528        else
529            set(hview_field,'Position',Data.GUISize)
530        end
531        %  set(hhuvmat.ViewField,'Value',1)% indicate that the field projection on the current object is plotted in view_field
532    end
533end
534
535%% update the object plot
536hobject=UvData.Object{IndexObj}.DisplayHandle.uvmat;
537% if we are editing the object used for projection in uvmat
538if isequal(IndexObj_1,IndexObj)
539    %update the representation of the current object for projection field represented in view_field
540    for iobj=1:numel(UvData.Object)
541        UvData.Object{iobj}.DisplayHandle.uvmat=...
542            plot_object(UvData.Object{iobj},UvData.Object{IndexObj_1},UvData.Object{iobj}.DisplayHandle.uvmat,'b');
543    end
544else %  we are editing the object used for projection field represented in view_field
545    %update the representation of the current object in uvmat
546    UvData.Object{IndexObj}.DisplayHandle.uvmat=...
547             plot_object(UvData.Object{IndexObj},UvData.Object{IndexObj_1},UvData.Object{IndexObj}.DisplayHandle.uvmat,'m');
548    %indicate the object index in the user data of the object plot (needed for further mouse editing)
549    ObjectInfo=get(UvData.Object{IndexObj}.DisplayHandle.uvmat,'UserData');
550    ObjectInfo.IndexObj=IndexObj;
551    set(UvData.Object{IndexObj}.DisplayHandle.uvmat,'UserData',ObjectInfo)
552    % update the representation of all objects in view_field
553    for iobj=1:numel(UvData.Object)
554        if isfield(UvData.Object{iobj}.DisplayHandle,'view_field')
555            UvData.Object{iobj}.DisplayHandle.view_field=...
556                plot_object(UvData.Object{iobj},UvData.Object{iobj},UvData.Object{iobj}.DisplayHandle.view_field,'b');
557        end
558    end
559end
560set(huvmat,'UserData',UvData)
561
562%% update the GUI uvmat
563set(hhuvmat.MenuEditObject,'enable','on')
564set(hhuvmat.edit_object,'Value',1) % set uvmat to object edit mode to allow further object update
565set(hhuvmat.edit_object,'BackgroundColor',[1 1 0]);% paint the edit text in yellow
566set(hhuvmat.ViewField,'Value',1)
567% set(handles.PLOT,'enable','on')
568set(handles.PLOT,'BackgroundColor',[1 0 0])
569%------------------------------------------------------------------------
570% --- Executes on button press in MenuCoord.
571function MenuCoord_Callback(hObject, eventdata, handles)
572%------------------------------------------------------------------------
573%----------------------------------------------------
574function num_RangeY_1_Callback(hObject, eventdata, handles)
575%------------------------------------------------------------------------
576
577function num_RangeZ_1_Callback(hObject, eventdata, handles)
578%------------------------------------------------------------------------
579
580function num_RangeZ_2_Callback(hObject, eventdata, handles)
581DZ=str2num(get(handles.num_RangeZ_2,'String'));
582ZMin=get(handles.z_slider,'Min');
583ZMax=get(handles.z_slider,'Max');
584if ~isequal(ZMax-ZMin,0)
585    rel_step(1)=DZ/(ZMax-ZMin);
586    rel_step(2)=0.2;
587    set(handles.z_slider,'SliderStep',rel_step)
588end
589%------------------------------------------------------------------------
590function num_RangeY_2_Callback(hObject, eventdata, handles)
591%------------------------------------------------------------------------
592
593function num_RangeX_1_Callback(hObject, eventdata, handles)
594%------------------------------------------------------------------------
595
596function num_RangeX_2_Callback(hObject, eventdata, handles)
597%------------------------------------------------------------------------
598%------------------------------------------------------------------------
599function SAVE_Callback(hObject, eventdata, handles)
600% ------------------------------------------------------
601%Object=read_set_object(handles);
602Object=read_GUI(handles.set_object);
603huvmat=findobj('Tag','uvmat');
604% UvData=get(huvmat,'UserData');
605if isempty(huvmat)
606    huvmat=findobj(allchild(0),'Name','series');
607end
608hchild=get(huvmat,'Children');
609hrootpath=findobj(hchild,'Tag','RootPath');
610if isempty(hrootpath)
611    RootPath='';
612else
613    RootPath=get(hrootpath,'String');
614    if iscell(RootPath)
615        RootPath=RootPath{1};
616    end
617end
618title={'object name'};
619dir_save=uigetdir(RootPath);
620ObjectName=get(handles.Name,'String');
621if ~isempty(ObjectName)&&~strcmp(ObjectName,'')
622    def={fullfile(dir_save,[ObjectName '.xml'])};
623else
624    def={fullfile(dir_save,[Object.Style '.xml'])};
625end
626displ_txt='save object as an .xml file';%default display
627menu=get(handles.ProjMode,'String');
628value=get(handles.ProjMode,'Value');
629ProjMode=menu{value};
630if strcmp(ProjMode,'mask_inside')||strcmp(ProjMode,'mask_outside')
631    displ_txt='save mask contour as an .xml file: to create a mask image, use save_mask on the GUI uvmat (lower right)';
632end
633answer=msgbox_uvmat('INPUT_TXT','save object as an .xml file',def);
634if ~isempty(answer)
635    t=struct2xml(Object);
636    t=set(t,1,'name','ProjObject');
637    save(t,answer{1})
638end
639msgbox_uvmat('CONFIRMATION',[answer{1}  ' saved'])
640
641%------------------------------------------------------------------------
642% --- Executes on slider movement.
643function z_slider_Callback(hObject, eventdata, handles)
644%---------------------------------------------------------
645Z_value=get(handles.z_slider,'Value');
646%rotation angles
647PlaneAngle=[0 0 0];
648norm_plane=[0 0 1];
649cos_om=1;
650sin_om=0;
651
652PlaneAngle(1)=str2double(get(handles.num_Angle_1,'String'));%first  angle in degrees
653PlaneAngle(2)=str2double(get(handles.num_Angle_2,'String'));%second  angle in degrees
654PlaneAngle(3)=str2double(get(handles.num_Angle_3,'String'));%second  angle in degrees
655PlaneAngle=(pi/180)*PlaneAngle;
656om=norm(PlaneAngle);%norm of rotation angle in radians
657if isequal(om,0)
658    norm_plane=[0 0 1];
659else
660    OmAxis=PlaneAngle/om; %unit vector marking the rotation axis
661    cos_om=cos(om);
662    sin_om=sin(om);
663    coeff=OmAxis(3)*(1-cos_om);
664    %components of the unity vector norm_plane normal to the projection plane
665    norm_plane(1)=OmAxis(1)*coeff+OmAxis(2)*sin_om;
666    norm_plane(2)=OmAxis(2)*coeff-OmAxis(1)*sin_om;
667    norm_plane(3)=OmAxis(3)*coeff+cos_om;
668end
669
670% update graph
671PLOT_Callback(hObject, eventdata, handles)
672
673%------------------------------------------------------------------------
674% --- Executes on button press in HELP.
675function HELP_Callback(hObject, eventdata, handles)
676%------------------------------------------------------------------------
677path_to_uvmat=which ('uvmat');% check the path of uvmat
678pathelp=fileparts(path_to_uvmat);
679helpfile=fullfile(pathelp,'uvmat_doc','uvmat_doc.html');
680if ~isempty(dir(helpfile)), msgbox_uvmat('ERROR','Please put the help file uvmat_doc.html in the sub-directory /uvmat_doc of the UVMAT package')
681    addpath (fullfile(pathelp,'uvmat_doc'))
682    web([helpfile '#set_object'])
683end
684%------------------------------------------------------------------------
685
686function Name_Callback(hObject, eventdata, handles)
687% hObject    handle to Name (see GCBO)
688% eventdata  reserved - to be defined in a future version of MATLAB
689% handles    structure with handles and user data (see GUIDATA)
690
691% Hints: get(hObject,'String') returns contents of Name as text
692%        str2double(get(hObject,'String')) returns contents of Name as a double
693
694%------------------------------------------------------------------------
695% --- Executes when entered data in editable cell(s) in Coord.
696function Coord_CellEditCallback(hObject, eventdata, handles)
697%------------------------------------------------------------------------
698ListType=get(handles.Type,'String');
699Type=ListType{get(handles.Type,'Value')};
700switch Type
701    % add lines if multi line input needed
702    case{'points','polyline','polygon'}
703        Coord=get(handles.Coord,'Data');
704        if ~isnan(Coord(end,1))
705            if isequal(size(Coord,2),3)
706                %Coord=[Coord;{[]} {[]} {[]}];%add a line for edition (3D case)
707                Coord=[Coord;NaN NaN NaN]; %add a line for edition (3D case)
708            else
709                Coord=[Coord;NaN NaN]; %add a line for edition (2D case)
710            end
711            set(handles.Coord,'Data',Coord)
712        end
713end
714
715
716
717function num_Angle_3_Callback(hObject, eventdata, handles)
718% hObject    handle to num_Angle_3 (see GCBO)
719% eventdata  reserved - to be defined in a future version of MATLAB
720% handles    structure with handles and user data (see GUIDATA)
721
722% Hints: get(hObject,'String') returns contents of num_Angle_3 as text
723%        str2double(get(hObject,'String')) returns contents of num_Angle_3 as a double
Note: See TracBrowser for help on using the repository browser.