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
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%
[445]9% INPUT:u
[204]10% data: structure describing the object properties
11%    .Style=...
12%    .ProjMode
13%    .CoordType: 'phys' or 'px'
[379]14%    .num_DX,.num_DY,.num_DZ : mesh along each dirction
[204]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
[379]38% Last Modified by GUIDE v2.5 26-Jan-2012 22:00:47
[204]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
[379]67%      .Name : class of object ('POINTS','LINE',....)
68%      .num_DX,num_DY,num_DZ; meshes for regular grids
[204]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)
[309]86set(hObject,'WindowButtonDownFcn',{'mouse_down'})%set mouse click action function
[402]87set(hObject,'DeleteFcn',{@closefcn})
[204]88
89% fill the interface as set in the input data:
90if exist('data','var')
[379]91    if isfield(data,'Coord') &&size(data.Coord,2)==3
92        set(handles.z_slider,'Visible','on')
93    else
[204]94        set(handles.z_slider,'Visible','off')
95    end
[387]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
[591]102    errormsg=fill_GUI(data,handles.set_object);
[410]103    if ~isempty(errormsg)
104        msgbox_uvmat('ERROR','bad data input in set_object')
105        return
106    end
[387]107    Type_Callback(hObject, eventdata, handles)% update the GUI set_object depending on the object type   
108
[204]109    if isfield(data,'RangeZ') && length(ZBounds) >= 2
[379]110        set(handles.num_RangeZ_2,'String',num2str(max(data.RangeZ),3))
[204]111        DZ=max(data.RangeZ);%slider step
[206]112        if ~isnan(ZBounds(1)) && ZBounds(2)~=ZBounds(1)
[204]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
[379]126        set(handles.num_RangeX_2,'String',num2str(max(data.RangeX),3))
127        set(handles.num_RangeX_1,'String',num2str(min(data.RangeX),3))
[204]128    end
129    if isfield(data,'RangeY')
130        if ischar(data.RangeY)
131            data.RangeY=str2num(data.RangeY);
132        end
[379]133        set(handles.num_RangeY_2,'String',num2str(max(data.RangeY),3))
134        set(handles.num_RangeY_1,'String',num2str(min(data.RangeY),3))
[204]135    end
136    if isfield(data,'RangeZ')
137        if ischar(data.RangeZ)
138            data.RangeZ=str2num(data.RangeZ);
139        end
[379]140        set(handles.num_RangeZ_2,'String',num2str(max(data.RangeZ),3))
[204]141        if numel(data.RangeZ)>=2
[379]142            set(handles.num_RangeZ_1,'String',num2str(min(data.RangeZ),3))
[204]143        end
144    end 
[212]145    if isfield(data,'Angle') && isequal(numel(data.Angle),3)
[379]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)))
[204]149    end
150end
[402]151% if enable_plot
152%    set(handles.PLOT,'enable','on')
153% else
154% enable the PLOT (REFRESH) button by default
[427]155%defaul settings
156set(get(handles.set_object,'children'),'enable','on')
[204]157   set(handles.PLOT,'enable','off')
[402]158% end
[204]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%------------------------------------------------------------------------
[402]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);
[424]184%     set(hhuvmat.ViewObject_1,'value',0)% desactivate the two view buttons
[410]185    set(hhuvmat.ViewObject,'value',0)%
186    set(hhuvmat.edit_object,'Value',0)% desactivate the edit option
[402]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
[511]194        hother=[findobj(hhuvmat.PlotAxes,'Tag','proj_object');findobj(hhuvmat.PlotAxes,'Tag','DeformPoint')];%find all the proj object and deform point representations
[402]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);
[533]215    set(hhseries.CheckObject,'Value',0)
216    set(hhseries.CheckObject,'BackgroundColor',[0 1 0])%put unactivated buttons to green
[402]217end
218
219
220%------------------------------------------------------------------------
[379]221% --- Executes on selection change in Type.
222function Type_Callback(hObject, eventdata, handles)
[204]223%------------------------------------------------------------------------
[379]224%style_prev=get(handles.Type,'UserData');%previous object style
225ListType=get(handles.Type,'String');
226Type=ListType{get(handles.Type,'Value')};
[204]227% make correspondance between different object styles
[379]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,:);
[204]244end
[379]245set(handles.Coord,'Data',Coord)
[204]246
[379]247%% set the projection menu and the corresponding options
[387]248if isempty(get(handles.ProjMode,'UserData'))
249    switch Type
250        case {'points','line','polyline','plane'}
[581]251            menu_proj={'projection';'interp_lin';'interp_tps';'none'};
[387]252        case {'polygon','rectangle','ellipse'}
253            menu_proj={'inside';'outside';'mask_inside';'mask_outside'};
254        case 'volume'
[581]255            menu_proj={'interp_lin';'none'};
[387]256        otherwise
[581]257            menu_proj={'projection';'interp_lin';'interp_tps';'none'};%default
[387]258    end
259else
260    menu_proj=get(handles.ProjMode,'UserData');
261end
[410]262ProjModeList=get(handles.ProjMode,'String');
263menu_index=find(strcmp(ProjModeList{get(handles.ProjMode,'Value')},menu_proj));
264if isempty(menu_index)
265    menu_index=1;%
[204]266end
[410]267set(handles.ProjMode,'Value',menu_index);% value index must not exceed the menu length
[204]268set(handles.ProjMode,'String',menu_proj)
269ProjMode_Callback(hObject, eventdata, handles)
[379]270
[204]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};
[379]277menu=get(handles.Type,'String');
278value=get(handles.Type,'Value');
[204]279ObjectStyle=menu{value};
[379]280%%%%%%%%% TODO
281test3D=0; %TODO: update  test3D=isequal(get(handles.ZObject,'Visible'),'on');%3D case
282%%%%%%%%%
[204]283%default setting
[379]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')
[589]290if isequal(ProjMode,'interp_lin')|| isequal(ProjMode,'interp_tps')
[379]291    set(handles.num_RangeY_2,'Visible','off')
[204]292else
[379]293    set(handles.num_RangeY_2,'Visible','on')
[204]294end
295if strcmp(ObjectStyle,'rectangle')||strcmp(ObjectStyle,'ellipse')
[379]296    set(handles.num_RangeX_2,'Visible','on')
[204]297else
[379]298   set(handles.num_RangeX_2,'Visible','off')
[204]299end
[379]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')
[204]305
306switch ObjectStyle
307    case 'points'
[379]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')
[204]312    case {'line','polyline','polygon'}
[379]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')
[581]317        if isequal(ProjMode,'interp_lin')|| isequal(ProjMode,'interp_tps')
[379]318            set(handles.num_DX,'Visible','on')
319            set(handles.num_DX,'TooltipString','num_DX: mesh for the interpolated field along the line')
[204]320        end       
321    case {'rectangle','ellipse'}
[379]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'])
[204]326    case {'plane'} 
[379]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')
[204]335        if test3D
[379]336            set(handles.num_Angle_2,'Visible','on')
337            set(handles.num_Angle_1,'Visible','on')
338            set(handles.num_RangeZ_2,'Visible','on')
[204]339        end
[581]340        if isequal(ProjMode,'interp_lin')|| isequal(ProjMode,'interp_tps')
[379]341            set(handles.num_DX,'Visible','on')
342            set(handles.num_DY,'Visible','on')
[204]343        else
[379]344            set(handles.num_DX,'Visible','off')
345            set(handles.num_DY,'Visible','off')
[204]346        end
[581]347        if  isequal(ProjMode,'interp_lin')
[379]348            set(handles.num_DZ,'Visible','on') 
[204]349        end
350     case {'volume'} 
[379]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')
[204]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])
[379]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')
[581]362        if isequal(ProjMode,'interp_lin')|| isequal(ProjMode,'interp_tps')
[379]363            set(handles.num_DX,'Visible','on')
364            set(handles.num_DY,'Visible','on')
365            set(handles.num_DZ,'Visible','on')
[204]366        else
[379]367            set(handles.num_DX,'Visible','off')
368            set(handles.num_DY,'Visible','off')
369            set(handles.num_DZ,'Visible','off')
[204]370        end
371end
372%------------------------------------------------------------------------
373
374%------------------------------------------------------------------------
[379]375function num_Angle_1_Callback(hObject, eventdata, handles)
[204]376update_slider(hObject, eventdata,handles)
377%------------------------------------------------------------------------
378%------------------------------------------------------------------------
[379]379function num_Angle_2_Callback(hObject, eventdata, handles)
[204]380update_slider(hObject, eventdata,handles)
381%------------------------------------------------------------------------
382function update_slider(hObject, eventdata,handles)
383%rotation angles
[379]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
[212]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;
[204]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')
[212]399    Z=norm_plane(1)*(UvData.X)+norm_plane(2)*(UvData.Y)+norm_plane(3)*(UvData.Z);
[204]400    set(handles.z_slider,'Min',min(Z))
401    set(handles.z_slider,'Max',max(Z))
402    ZMax_Callback(hObject, eventdata, handles)
403end
404%------------------------------------------------------------------------
[379]405function num_DX_Callback(hObject, eventdata, handles)
[204]406%------------------------------------------------------------------------
407%------------------------------------------------------------------------
[379]408function num_DY_Callback(hObject, eventdata, handles)
[204]409%------------------------------------------------------------------------
410%------------------------------------------------------------------------
[379]411function num_DZ_Callback(hObject, eventdata, handles)
[204]412%------------------------------------------------------------------------
413
414
415%------------------------------------------------------------------------
[432]416% --- Executes on button press in PLOT: refresh the current object , plot the object and its projected field
[204]417function PLOT_Callback(hObject, eventdata, handles)
418
[508]419set(handles.PLOT,'BackgroundColor',[1 1 0])
420drawnow
421
[410]422%% read the object parameters in the GUI set_object
[388]423ObjectData=read_GUI(handles.set_object);%read the parameters defining the object in the GUI set_object
[397]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
[388]429checknan=isnan(sum(ObjectData.Coord,2));%check for NaN lines
430if ~isempty(checknan)
431    ObjectData.Coord(checknan,:)=[];%remove the NaN lines
432end
[402]433ObjectName=ObjectData.Name;%name of the current object defined in set_object
[309]434if isempty(ObjectName)
[432]435     ObjectName=ObjectData.Type;% name the object by the object type type by default
[204]436end
[413]437
[432]438%% read the current object selection in the GUI uvmat
[413]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
[432]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
[445]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)];
[204]460        end
461    end
[445]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
[491]473UvData.Object{IndexObj}=ObjectData;%record the current object properties in uvmat
[445]474if check_handle
475    UvData.Object{IndexObj}.DisplayHandle.uvmat=obj_handle; %preserve the object plot handle if valid
476else
[511]477    UvData.Object{IndexObj}.DisplayHandle.uvmat=hhuvmat.PlotAxes; %axes taken as object display handle by defualt
[204]478end
[491]479%set(hhuvmat.edit_object,'Value',1)% set the current object to edit mode
[309]480
[413]481%% plot the field projected on the object
[432]482hview_field=[];%default
[445]483IndexObj_1=get(hhuvmat.ListObject_1,'Value');
[388]484if strcmp(ObjectData.ProjMode,'mask_inside')||strcmp(ObjectData.ProjMode,'mask_outside')||strcmp(ObjectData.ProjMode,'none')
485    PlotType='text';
486else
[581]487    % create tps coeff if needed for ProjMode 'interp_tps'
[586]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
[508]496    end
[388]497    [ProjData,errormsg]= proj_field(UvData.Field,ObjectData);%project the current field of uvmat on ObjectData
498    if ~isempty(errormsg)
[586]499        msgbox_uvmat('ERROR', ['set_object/proj_field/' errormsg])
[508]500        set(handles.PLOT,'enable','on')
[388]501        return
[586]502    end
[445]503    if isequal(IndexObj_1,IndexObj) % if  the projection is in uvmat
[586]504        PlotType=plot_field(ProjData,hhuvmat.PlotAxes,read_GUI(get(hhuvmat.PlotAxes,'parent')));%update the current uvmat plot
[491]505    else  % if the projection is in view_field
[413]506        hview_field=findobj(allchild(0),'tag','view_field');
507        if isempty(hview_field)
[429]508            hview_field=view_field(ProjData); %open the view_field GUI for plot
[413]509        else
510            hhview_field=guidata(hview_field);
[511]511            [PlotType,PlotParam]=plot_field(ProjData,hhview_field.PlotAxes,read_GUI(hview_field));%update an existing  plot in view_field
[591]512            errormsg=fill_GUI(PlotParam,hview_field);
[569]513            if ~isempty(errormsg)
514                msgbox_uvmat('ERROR',errormsg)
515                return
516            end
[586]517            %     write_plot_param(hhview_field,PlotParam); %update the display of plotting parameters for the current object
[413]518        end
[429]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
[586]531        %  set(hhuvmat.ViewField,'Value',1)% indicate that the field projection on the current object is plotted in view_field
[388]532    end
[227]533end
[429]534
[432]535%% update the object plot
536hobject=UvData.Object{IndexObj}.DisplayHandle.uvmat;
[445]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');
[432]543    end
[445]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
[432]558    end
559end
560set(huvmat,'UserData',UvData)
561
[204]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
[427]566set(hhuvmat.ViewField,'Value',1)
[508]567% set(handles.PLOT,'enable','on')
568set(handles.PLOT,'BackgroundColor',[1 0 0])
[204]569%------------------------------------------------------------------------
570% --- Executes on button press in MenuCoord.
571function MenuCoord_Callback(hObject, eventdata, handles)
572%------------------------------------------------------------------------
573%----------------------------------------------------
[379]574function num_RangeY_1_Callback(hObject, eventdata, handles)
[204]575%------------------------------------------------------------------------
576
[379]577function num_RangeZ_1_Callback(hObject, eventdata, handles)
[204]578%------------------------------------------------------------------------
579
[379]580function num_RangeZ_2_Callback(hObject, eventdata, handles)
581DZ=str2num(get(handles.num_RangeZ_2,'String'));
[204]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%------------------------------------------------------------------------
[379]590function num_RangeY_2_Callback(hObject, eventdata, handles)
[204]591%------------------------------------------------------------------------
592
[379]593function num_RangeX_1_Callback(hObject, eventdata, handles)
[204]594%------------------------------------------------------------------------
595
[379]596function num_RangeX_2_Callback(hObject, eventdata, handles)
[204]597%------------------------------------------------------------------------
598%------------------------------------------------------------------------
599function SAVE_Callback(hObject, eventdata, handles)
600% ------------------------------------------------------
[379]601%Object=read_set_object(handles);
602Object=read_GUI(handles.set_object);
[204]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);
[379]620ObjectName=get(handles.Name,'String');
[204]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);
[477]636    t=set(t,1,'name','ProjObject');
[204]637    save(t,answer{1})
638end
639msgbox_uvmat('CONFIRMATION',[answer{1}  ' saved'])
[227]640
[204]641%------------------------------------------------------------------------
642% --- Executes on slider movement.
643function z_slider_Callback(hObject, eventdata, handles)
644%---------------------------------------------------------
645Z_value=get(handles.z_slider,'Value');
646%rotation angles
[227]647PlaneAngle=[0 0 0];
648norm_plane=[0 0 1];
649cos_om=1;
650sin_om=0;
651
[379]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
[227]655PlaneAngle=(pi/180)*PlaneAngle;
[212]656om=norm(PlaneAngle);%norm of rotation angle in radians
[227]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
[204]669
[388]670% update graph
[204]671PLOT_Callback(hObject, eventdata, handles)
[227]672
[204]673%------------------------------------------------------------------------
674% --- Executes on button press in HELP.
675function HELP_Callback(hObject, eventdata, handles)
[227]676%------------------------------------------------------------------------
[204]677path_to_uvmat=which ('uvmat');% check the path of uvmat
678pathelp=fileparts(path_to_uvmat);
679helpfile=fullfile(pathelp,'uvmat_doc','uvmat_doc.html');
[388]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')
[204]681    addpath (fullfile(pathelp,'uvmat_doc'))
682    web([helpfile '#set_object'])
683end
684%------------------------------------------------------------------------
685
[379]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)
[204]690
[379]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');
[388]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)
[379]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.