1 function xtable_edit(action,varargin)
\r
2 % Sorry, I didn't have enough time to write nice and documented GUI code.
\r
4 % Toolbox for nonlinear filtering.
\r
5 % Copyright (C) 2005 Jakob Rosén <jakob.rosen@gmail.com>
\r
7 % This program is free software; you can redistribute it and/or
\r
8 % modify it under the terms of the GNU General Public License
\r
9 % as published by the Free Software Foundation; either version 2
\r
10 % of the License, or (at your option) any later version.
\r
12 % This program is distributed in the hope that it will be useful,
\r
13 % but WITHOUT ANY WARRANTY; without even the implied warranty of
\r
14 % MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
\r
15 % GNU General Public License for more details.
\r
17 % You should have received a copy of the GNU General Public License
\r
18 % along with this program; if not, write to the Free Software
\r
19 % Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
\r
21 %myfont='FixedWidth';
\r
24 if strcmp(action,'init');
\r
25 parentfig=varargin{1};
\r
28 callback=varargin{4};
\r
30 % Make the GUI show the correct information
\r
31 if strcmp(caller,'h')||strcmp(caller,'hu')
\r
32 if strcmp(obj.wchar,'w')
\r
33 set(obj,'wchar','e');
\r
36 if strcmp(obj.wchar,'e')
\r
37 set(obj,'wchar','w');
\r
43 interpolate=obj.interpolate;
\r
52 t_first=num2str(Ts(1));
\r
53 t_last=num2str(Ts(end));
\r
56 hf=figure('Name','xtable object editor');
\r
58 uicontrol('Style','Text','String','3d expression matrix:','Units','normalized','Position',[0.0,0.90,0.4,0.05],'HorizontalAlign','Left','Fontname',myfont);
\r
59 uicontrol('Style','Edit','String','','Units','normalized','Position',[0.4,0.90,0.4,0.05],'Tag','expression_edit','Callback',['xtable_edit(''expression_import'',',num2str(hf),')'],'Fontname',myfont);
\r
60 uicontrol('Style','Pushbutton','String','Import','Units','normalized','Position',[0.85,0.90,0.15,0.05],'Callback',['xtable_edit(''expression_import'',',num2str(hf),')'],'Fontname',myfont);
\r
62 uicontrol('Style','Text','String','Sample point vector:','Units','normalized','Position',[0.0,0.82,0.4,0.05],'HorizontalAlign','Left','Fontname',myfont);
\r
63 uicontrol('Style','Edit','String','','Units','normalized','Position',[0.4,0.82,0.4,0.05],'Tag','Ts_edit','Callback',['xtable_edit(''Ts_import'',',num2str(hf),')'],'Fontname',myfont);
\r
64 uicontrol('Style','Pushbutton','String','Import','Units','normalized','Position',[0.85,0.82,0.15,0.05],'Callback',['xtable_edit(''Ts_import'',',num2str(hf),')'],'Fontname',myfont);
\r
66 uicontrol('Style','Text','String','gradx (for EKF):','Units','normalized','Position',[0.0,0.74,0.4,0.05],'HorizontalAlign','Left','Fontname',myfont);
\r
67 uicontrol('Style','Edit','String','','Units','normalized','Position',[0.4,0.74,0.4,0.05],'Tag','gradx_edit','Callback',['xtable_edit(''gradx_import'',',num2str(hf),')'],'Fontname',myfont);
\r
68 uicontrol('Style','Pushbutton','String','Import','Units','normalized','Position',[0.85,0.74,0.15,0.05],'Callback',['xtable_edit(''gradx_import'',',num2str(hf),')'],'Fontname',myfont);
\r
70 uicontrol('Style','Text','String',sprintf('grad%s (for EKF):',obj.wchar),'Units','normalized','Position',[0.0,0.66,0.4,0.05],'HorizontalAlign','Left','Fontname',myfont);
\r
71 uicontrol('Style','Edit','String','','Units','normalized','Position',[0.4,0.66,0.4,0.05],'Tag','gradw_edit','Callback',['xtable_edit(''gradw_import'',',num2str(hf),')'],'Fontname',myfont);
\r
72 uicontrol('Style','Pushbutton','String','Import','Units','normalized','Position',[0.85,0.66,0.15,0.05],'Callback',['xtable_edit(''gradw_import'',',num2str(hf),')'],'Fontname',myfont);
\r
84 gxn=sprintf('%d x %d x %d',size(gradx,1),size(gradx,2),size(gradx,3));
\r
90 gwn=sprintf('%d x %d x %d',size(gradw,1),size(gradw,2),size(gradw,3));
\r
95 uicontrol('Style','Text','String','Expression size:','Units','normalized','Position',[0.0,p+0.60,0.4,0.05],'HorizontalAlign','Left','Fontname',myfont);
\r
96 uicontrol('Style','Text','String',sprintf('%d x %d',size(array,1),size(array,2)),'Units','normalized','Position',[0.4,p+0.60,0.4,0.05],'Tag','expression_size','HorizontalAlign','Left','Fontname',myfont);
\r
97 uicontrol('Style','Text','String','Number of expressions:','Units','normalized','Position',[0.0,p+0.55,0.4,0.05],'HorizontalAlign','Left','Fontname',myfont);
\r
98 uicontrol('Style','Text','String',num2str(n),'Units','normalized','Position',[0.4,p+0.55,0.4,0.05],'Tag','expression_number','HorizontalAlign','Left','Fontname',myfont);
\r
99 uicontrol('Style','Text','String','Number of sample points:','Units','normalized','Position',[0.0,p+0.5,0.4,0.05],'HorizontalAlign','Left','Fontname',myfont);
\r
100 uicontrol('Style','Text','String',num2str(length(Ts)),'Units','normalized','Position',[0.4,p+0.5,0.4,0.05],'Tag','Ts_number','HorizontalAlign','Left','Fontname',myfont);
\r
101 uicontrol('Style','Text','String','First sample point:','Units','normalized','Position',[0.0,p+0.45,0.4,0.05],'HorizontalAlign','Left','Fontname',myfont);
\r
102 uicontrol('Style','Text','String',t_first,'Units','normalized','Position',[0.4,p+0.45,0.4,0.05],'Tag','Ts_first','HorizontalAlign','Left','Fontname',myfont);
\r
103 uicontrol('Style','Text','String','Last sample point:','Units','normalized','Position',[0.0,p+0.4,0.4,0.05],'HorizontalAlign','Left','Fontname',myfont);
\r
104 uicontrol('Style','Text','String',t_last,'Units','normalized','Position',[0.4,p+0.4,0.4,0.05],'Tag','Ts_last','HorizontalAlign','Left','Fontname',myfont);
\r
106 uicontrol('Style','Text','String','gradx size:','Units','normalized','Position',[0.0,0.2,0.4,0.05],'HorizontalAlign','Left','Fontname',myfont);
\r
107 uicontrol('Style','Text','String',gxn,'Units','normalized','Position',[0.4,0.2,0.4,0.05],'Tag','gradx_size','HorizontalAlign','Left','Fontname',myfont);
\r
108 uicontrol('Style','Text','String',sprintf('grad%s size:',obj.wchar),'Units','normalized','Position',[0.0,0.15,0.4,0.05],'HorizontalAlign','Left','Fontname',myfont);
\r
109 uicontrol('Style','Text','String',gwn,'Units','normalized','Position',[0.4,0.15,0.4,0.05],'Tag','gradw_size','HorizontalAlign','Left','Fontname',myfont);
\r
111 uicontrol('Style','Text','String','Interpolation:','Units','normalized','Position',[0.0,0.02,0.4,0.05],'HorizontalAlign','Left','Fontname',myfont);
\r
112 uicontrol('Style','Radiobutton','String','None','Value',~interpolate,'Units','normalized','Position',[0.4,0.02,0.2,0.05],'Tag','radio1','Callback',['xtable_edit(''radio1'',',num2str(hf),')'],'HorizontalAlign','Left','Fontname',myfont);
\r
113 uicontrol('Style','Radiobutton','String','Linear','Value',interpolate,'Units','normalized','Position',[0.6,0.02,0.2,0.05],'Tag','radio2','Callback',['xtable_edit(''radio2'',',num2str(hf),')'],'HorizontalAlign','Left','Fontname',myfont);
\r
115 uicontrol('Style','Pushbutton','String','Save','Units','normalized','Position',[0.8,0.02,0.1,0.05],'Callback',['xtable_edit(''save'',',num2str(hf),')'],'Fontname',myfont);
\r
116 uicontrol('Style','Pushbutton','String','Cancel','Units','normalized','Position',[0.9,0.02,0.1,0.05],'Callback',['delete(',num2str(hf),')'],'Fontname',myfont);
\r
119 handles=guihandles(hf);
\r
120 handles.array=array;
\r
122 handles.caller=caller;
\r
123 handles.callback=callback;
\r
124 handles.parentfig=parentfig;
\r
125 handles.interpolate=interpolate;
\r
127 handles.gradx=gradx;
\r
128 handles.gradw=gradw;
\r
129 handles.wchar=obj.wchar;
\r
130 guidata(hf,handles);
\r
132 xtable_edit('check',hf);
\r
135 elseif strcmp(action,'radio1')
\r
137 handles=guidata(hf);
\r
138 set(handles.radio1,'value',1);
\r
139 set(handles.radio2,'value',0);
\r
140 handles.interpolate=false;
\r
141 guidata(hf,handles);
\r
143 elseif strcmp(action,'radio2')
\r
145 handles=guidata(hf);
\r
146 set(handles.radio2,'value',1);
\r
147 set(handles.radio1,'value',0);
\r
148 handles.interpolate=true;
\r
149 guidata(hf,handles);
\r
151 elseif strcmp(action,'expression_import')
\r
153 handles=guidata(hf);
\r
154 expr_str=get(handles.expression_edit,'String');
\r
155 if isempty(expr_str)
\r
156 msgbox('Error! Empty field');
\r
159 array=evalin('base',expr_str,'[]');
\r
161 % An error occured while importing
\r
162 msgbox('Error! Did you type the correct name of the object?');
\r
164 elseif ~isa(array,'double')
\r
165 msgbox('Error! The object must be a matrix consisting of doubles!');
\r
167 elseif ndims(array)~=3
\r
168 msgbox('The data array must be three-dimensional!');
\r
171 set(handles.expression_size,'String',sprintf('%d x %d',size(array,1),size(array,2)));
\r
172 set(handles.expression_number,'String',num2str(size(array,3)));
\r
175 handles.array=array;
\r
176 guidata(hf,handles);
\r
178 elseif strcmp(action,'Ts_import')
\r
180 handles=guidata(hf);
\r
181 expr_str=get(handles.Ts_edit,'String');
\r
182 if isempty(expr_str)
\r
183 msgbox('Error! Empty field');
\r
186 Ts=evalin('base',expr_str,'[]');
\r
188 % An error occured while importing
\r
189 msgbox('Error! Did you type the correct name of the object?');
\r
191 elseif ~isa(Ts,'double')
\r
192 msgbox('Error! The object must be a matrix consisting of doubles!');
\r
194 elseif min(size(Ts,1),size(Ts,2))~=1||ndims(Ts)>2
\r
195 msgbox('The data matrix must be one-dimensional!');
\r
198 set(handles.Ts_number,'String',num2str(length(Ts)));
\r
199 set(handles.Ts_first,'String',num2str(Ts(1)));
\r
200 set(handles.Ts_last,'String',num2str(Ts(end)));
\r
204 guidata(hf,handles);
\r
206 elseif strcmp(action,'gradx_import')
\r
208 handles=guidata(hf);
\r
209 expr_str=get(handles.gradx_edit,'String');
\r
210 if isempty(expr_str)
\r
213 grad=evalin('base',expr_str,'[]');
\r
215 % An error occured while importing
\r
216 msgbox('Error! Did you type the correct name of the object?');
\r
218 elseif ~isa(grad,'double')
\r
219 msgbox('Error! The object must be a matrix consisting of doubles!');
\r
221 elseif ndims(grad)~=3
\r
222 msgbox('The gradient array must be three-dimensional!');
\r
230 gxn=sprintf('%d x %d x %d',size(grad,1),size(grad,2),size(grad,3));
\r
233 set(handles.gradx_size,'String',gxn);
\r
234 handles.gradx=grad;
\r
235 guidata(hf,handles);
\r
237 elseif strcmp(action,'gradw_import')
\r
239 handles=guidata(hf);
\r
240 expr_str=get(handles.gradw_edit,'String');
\r
241 if isempty(expr_str)
\r
244 grad=evalin('base',expr_str,'[]');
\r
246 % An error occured while importing
\r
247 msgbox('Error! Did you type the correct name of the object?');
\r
249 elseif ~isa(grad,'double')
\r
250 msgbox('Error! The object must be a matrix consisting of doubles!');
\r
252 elseif ndims(grad)~=3
\r
253 msgbox('The gradient array must be three-dimensional!');
\r
261 gwn=sprintf('%d x %d x %d',size(grad,1),size(grad,2),size(grad,3));
\r
264 set(handles.gradw_size,'String',gwn);
\r
265 handles.gradw=grad;
\r
266 guidata(hf,handles);
\r
268 elseif strcmp(action,'save')
\r
271 handles=guidata(hf);
\r
273 caller=handles.caller;
\r
276 if isempty(handles.array)
\r
277 msgbox('The expression array must not be empty!');
\r
281 if isempty(handles.Ts)
\r
282 msgbox('The sample points vector must not be empty!');
\r
286 if length(handles.Ts)~=size(handles.array,3)
\r
287 msgbox('Error! The number of expressions and the number of sample points must be equal!');
\r
291 if ~isempty(handles.gradx)
\r
292 if sum(size(handles.gradx)~=size(handles.array))
\r
293 msgbox('Error! The gradients need to have the same size as the data array.');
\r
298 if ~isempty(handles.gradw)
\r
299 if sum(size(handles.gradw)~=size(handles.array))
\r
300 msgbox('Error! The gradients need to have the same size as the data array.');
\r
306 % if handles.interpolation&&size(array,3)<2
\r
307 % msgbox('The number of expressions must be at least 2 in interpolation mode.');
\r
310 set(obj,'array',handles.array);
\r
311 set(obj,'Ts',handles.Ts);
\r
312 set(obj,'interpolate',handles.interpolate);
\r
313 set(obj,'gradx',handles.gradx);
\r
314 set(obj,'gradw',handles.gradw);
\r
316 parentfig=handles.parentfig;
\r
317 parenthandles=guidata(parentfig);
\r
319 parenthandles.(caller)=obj;
\r
320 guidata(parentfig,parenthandles); % Save data
\r
322 eval(handles.callback);
\r