source: aedes_roi_copy_gui.m @ 148

Last change on this file since 148 was 148, checked in by tjniskan, 8 years ago
  • Added aedes_roifill.m for doing binary flood fill operation. This is

much slower than using the imfill-function, but does not dependend on
Image Processing toolbox. The goal is to make Aedes run with just the
base Matlab install. DICOM support will probably be the last obstacle
in achieving this, because it's going to be a great pain in the a to
code...

  • Fixed overwriting ROIs in aedes_roi_copy_gui.m and added additional

information in the ROI copy button tooltips.

  • Some further iterations to the new readvnmr-function.

M aedes_roi_copy_gui.m
M aedes_getmatlabversion.m
M aedes_readvnmr.m
M aedes.m
M aedes_helpabout.m
M aedes_readfid.m
M aedes_revision.m
A aedes_roifill.m

File size: 12.0 KB
Line 
1function [slice_ind,dir_ind,roilabel,copytype] = aedes_roi_copy_gui(ROI,roi_ind)
2% AEDES_ROI_COPY_GUI -
3%   
4%
5% Synopsis:
6%
7% Description:
8%
9% Examples:
10%
11% See also:
12%
13
14% This function is a part of Aedes - A graphical tool for analyzing
15% medical images
16%
17% Copyright (C) 2006 Juha-Pekka Niskanen <Juha-Pekka.Niskanen@uku.fi>
18%
19% Department of Physics, Department of Neurobiology
20% University of Kuopio, FINLAND
21%
22% This program may be used under the terms of the GNU General Public
23% License version 2.0 as published by the Free Software Foundation
24% and appearing in the file LICENSE.TXT included in the packaging of
25% this program.
26%
27% This program is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
28% WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
29
30
31% Initialize public variables
32H = [];
33slice_ind=[];
34roilabel = [];
35copytype=[];
36dir_ind = [];
37cancel=0;
38
39%% Determine if ROI is for normal or mixed type data
40if length(ROI(1).voxels)>1
41  isMixedType = true;
42else
43  isMixedType = false;
44end
45
46H = l_DrawGUI(ROI,roi_ind);
47fig_h = H.FH;
48
49%% Wait for exit
50waitfor(fig_h)
51if cancel
52  slice_ind=[];
53  roilabel=[];
54  dir_ind=[];
55end
56clear H
57return
58
59%%%%%%%%%%%%%%%%%%%%%%%%%
60% Draw GUI
61%%%%%%%%%%%%%%%%%%%%%%%%%
62function H=l_DrawGUI(ROI,roi_ind)
63
64%% Parse ROI structure
65roi_labels = {ROI(:).label};
66
67
68%% Load default font and colors
69FigColor=get(0,'DefaultUicontrolBackgroundcolor');
70GD=aedes_gui_defaults;
71GD.col.mainfig = FigColor;%[236 233 216]./255;
72fig_h = 415;%395;
73fig_w = 250;
74scrsz = get(0,'screensize');
75fig_pos = [scrsz(3)/2-fig_w/2 scrsz(4)/2-fig_h/2 fig_w fig_h];
76
77
78%% The main figure
79H.FH = figure('position',fig_pos,...
80              'Units','Pixel', ...
81              'Name','Copy ROI', ...
82              'Numbertitle','off', ...
83              'Tag','roi_copy_fig', ...
84              'Color',FigColor,...%[236 233 216]./255, ...
85              'Toolbar','none', ...
86              'Menubar','none', ...
87              'DoubleBuffer','on', ...
88              'DockControls','off',...
89              'renderer','painters',...
90              'KeyPressFcn','',...
91              'resize','off',...
92              'windowstyle','modal');
93fh = H.FH;
94
95%% Select ROI text
96h1 = uicontrol('parent',fh,...
97               'units','pixels',...
98               'position',[10 fig_h-10-15 170 15],...
99               'style','text',...
100               'horizontalalign','left',...
101               'backgroundcolor',FigColor,...[236 233 216]./255,...
102               'string','Select ROI(s) to be copied');
103
104%% ROI label popupmenu
105tmp=get(h1,'extent');
106H.ROILBOX = uicontrol('parent',fh,...
107                      'units','pixels',...
108                      'position',[10 fig_h-25-65 230 65],...
109                      'style','listbox',...
110                      'string',roi_labels,...
111                      'value',roi_ind,...
112                      'min',0,'max',2,...
113                      'backgroundcolor','w');
114
115
116tmp=get(H.ROILBOX,'position');
117%% Source select popup
118% $$$ H.SOURCEPOPUP = uicontrol('parent',fh,...
119% $$$                           'units','pixels',...
120% $$$                           'position',[tmp(1) tmp(2)-tmp(4)-5 tmp(3) tmp(4)],...
121% $$$                           'style','popup',...
122% $$$                           'string',,...
123% $$$                           'value',1,...
124% $$$                           'backgroundcolor','w');
125
126%% Direction uipanel
127% $$$ h1 = uipanel('parent',fh,...
128% $$$              'units','pixels',...
129% $$$              'position',[5 tmp(2)-90-15 240 90],...
130% $$$              'title','Direction',...
131% $$$              'backgroundcolor',GD.col.mainfig);
132% $$$ tmp=get(h1,'position');
133
134%% Button group for direction radiobuttons
135H.DIRBTNGRP = uibuttongroup('parent',fh,...
136                      'units','pixels',...
137                      'position',[5 tmp(2)-105-15 240 105],...
138                      'title','Copy Direction',...
139                      'backgroundcolor',GD.col.mainfig);
140H.XRADIO = uicontrol('parent',H.DIRBTNGRP,...
141                     'units','pixel',...
142                     'position',[15 70 150 15],...
143                     'style','radio',...
144                     'string','X direction (slice)',...'value',1,...
145                     'backgroundcolor',GD.col.mainfig);
146tmp=get(H.XRADIO,'position');
147H.YRADIO = uicontrol('parent',H.DIRBTNGRP,...
148                     'units','pixel',...
149                     'position',[15 tmp(2)-20 150 15],...
150                     'style','radio',...
151                     'string','Y direction (column)',...'value',0,...
152                     'backgroundcolor',GD.col.mainfig);
153tmp=get(H.YRADIO,'position');
154H.ZRADIO = uicontrol('parent',H.DIRBTNGRP,...
155                     'units','pixel',...
156                     'position',[15 tmp(2)-20 150 15],...
157                     'style','radio',...
158                     'string','Z direction (row)',...'value',0,...
159                     'backgroundcolor',GD.col.mainfig);
160tmp=get(H.ZRADIO,'position');
161H.VRADIO = uicontrol('parent',H.DIRBTNGRP,...
162                     'units','pixel',...
163                     'position',[15 tmp(2)-20 150 15],...
164                     'style','radio',...
165                     'string','V direction (volume)',...'value',0,...
166                     'backgroundcolor',GD.col.mainfig,...
167                                         'enable','off');
168if size(ROI(1).voxels{1},4)>1
169  set(H.VRADIO,'enable','on')
170  set(H.DIRBTNGRP,'SelectedObject',H.VRADIO)
171else
172  set(H.DIRBTNGRP,'SelectedObject',H.XRADIO)
173end
174tmp=get(H.DIRBTNGRP,'position');
175
176
177%% Copy type btngroup
178H.CPTYPEGRP = uibuttongroup('parent',fh,...
179                            'units','pixels',...
180                            'position',[5 tmp(2)-70-10 240 70],...
181                            'title','Copy type',...
182                            'backgroundcolor',GD.col.mainfig);
183H.APPENDRADIO = uicontrol('parent',H.CPTYPEGRP,...
184                          'units','pixel',...
185                          'position',[15 35 150 15],...
186                          'style','radio',...
187                          'string','Append',...
188                          'backgroundcolor',GD.col.mainfig);
189tmp=get(H.APPENDRADIO,'position');
190H.OVERWRITERADIO = uicontrol('parent',H.CPTYPEGRP,...
191                             'units','pixel',...
192                             'position',[15 tmp(2)-25 80 15],...
193                             'style','radio',...
194                             'string','Overwrite',...
195                             'backgroundcolor',GD.col.mainfig);
196set(H.CPTYPEGRP,'SelectedObject',H.APPENDRADIO)
197%if ~isMixedType
198%  set([H.APPENDRADIO,H.OVERWRITERADIO],'enable','off')
199%end
200%% Slice selection btngroup
201tmp=get(H.CPTYPEGRP,'position');
202H.SLBTNGRP = uibuttongroup('parent',fh,...
203                     'units','pixels',...
204                     'position',[5 tmp(2)-70-10 240 70],...
205                     'title','Copy ROI to...',...
206                     'backgroundcolor',GD.col.mainfig);
207
208H.ALLRADIO = uicontrol('parent',H.SLBTNGRP,...
209                       'units','pixel',...
210                       'position',[15 35 150 15],...
211                       'style','radio',...
212                       'string','All slices/volumes',...
213                       'backgroundcolor',GD.col.mainfig);
214tmp=get(H.ALLRADIO,'position');
215
216H.CUSTOMRADIO = uicontrol('parent',H.SLBTNGRP,...
217                          'units','pixel',...
218                          'position',[15 tmp(2)-25 80 15],...
219                          'style','radio',...
220                          'string','Custom',...
221                          'backgroundcolor',GD.col.mainfig);
222tmp=get(H.CUSTOMRADIO,'position');
223H.CUSTOMEDIT = uicontrol('parent',H.SLBTNGRP,...
224                         'units','pixel',...
225                         'position',[85 tmp(2) 145 18],...
226                         'style','edit',...
227                         'backgroundcolor','w',...
228                         'horizontalalign','left',...
229                         'string','1:end',...
230                         'enable','off');
231set(H.SLBTNGRP,'SelectedObject',H.ALLRADIO,...
232               'SelectionChangeFcn',@l_SelectCustom)
233
234tmp=get(H.SLBTNGRP,'position');
235H.CANCELBTN = uicontrol('parent',fh,...
236                        'units','pixel',...
237                        'position',[175 tmp(2)-10-25 70 25],...
238                        'string','Cancel',...
239                        'callback',@l_Cancel);
240H.OKBTN = uicontrol('parent',fh,...
241                    'units','pixel',...
242                    'position',[100 tmp(2)-10-25 70 25],...
243                    'string','OK',...
244                    'callback',@l_CheckValues);
245
246%% If the ROI is for mixed type data, disable Y and Z buttons
247if isMixedType
248  set([H.YRADIO,H.ZRADIO],'enable','off','value',0)
249  set(H.XRADIO,'value',1)
250end
251
252end % function H=l_DrawGUI()
253
254
255%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
256% Select ALL/CUSTOM slices
257%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
258  function l_SelectCustom(h,evd)
259 
260  if evd.NewValue==H.CUSTOMRADIO
261    set(H.CUSTOMEDIT,'enable','on')
262  else
263    set(H.CUSTOMEDIT,'enable','off')
264  end
265 
266  end % function l_SelectCustom(h,
267
268
269%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
270% Check values when OK is pressed
271%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
272  function l_CheckValues(h,evd)
273 
274  %% Get handle to the selected radio button
275  h=get(H.DIRBTNGRP,'SelectedObject');
276 
277  %% Get ROI label
278  roi_vals=get(H.ROILBOX,'value');
279  if isempty(roi_vals)
280    warndlg('No ROI(s) selected! Please, select at least one ROI.',...
281            'Error','modal');
282    return
283  end
284  str=get(H.ROILBOX,'string');
285  roilabel = {str{roi_vals}};
286 
287  %% ROI index
288  %roi_ind=find(strcmp({ROI(:).label},str));
289  roi_ind=1;
290 
291  %% Copy Type
292  hCpType=get(H.CPTYPEGRP,'SelectedObject');
293  if hCpType==H.APPENDRADIO
294    copytype='append';
295  else
296    copytype='overwrite';
297  end
298 
299  %% Determine ROI size in the selected direction
300  if isMixedType
301    sz=length(ROI(roi_ind).voxels);
302  else 
303    if h==H.XRADIO
304      sz=size(ROI(roi_ind).voxels{1},3);
305      dir_ind=1;
306    elseif h==H.YRADIO
307      sz=size(ROI(roi_ind).voxels{1},2);
308      dir_ind=2;
309        elseif h==H.ZRADIO
310      sz=size(ROI(roi_ind).voxels{1},1);
311      dir_ind=3;
312        elseif h==H.VRADIO
313          sz=size(ROI(roi_ind).voxels{1},4);
314      dir_ind=4;
315    end
316  end
317 
318  %% Check if all slices or custom radio button is selected
319  h2=get(H.SLBTNGRP,'SelectedObject');
320 
321  if h2==H.ALLRADIO
322    slice_ind = 1:sz;
323  else %% Parse the custom string
324   
325    %% Get custom string
326    custom_str = get(H.CUSTOMEDIT,'string');
327   
328    %% Check that the string contains only valid characters
329    tmp_ind=ismember(custom_str,'0123456789end:,*+-/');
330    if ~all(tmp_ind)
331      h=warndlg(['The custom text "' custom_str '" contains invalid characters'],...
332                'Invalid expression','modal');
333      uiwait(h)
334      return
335    end
336   
337    % replace 'end' statement with ROI size
338    custom_str=strrep(custom_str,'end','sz');
339   
340    % Try to evaluate the index string
341    try
342      eval(['slice_ind=[' custom_str '];']);
343    catch
344      h=warndlg({['Could not evaluate expression "' custom_str '".'],...
345                 ['Custom string has to be a valid Matlab vector expression.']},...
346                'Could not evaluate expression','modal');
347      uiwait(h)
348      return
349    end
350   
351    % Sort indices and make sure that all indices are unique
352    slice_ind=unique(slice_ind);
353   
354    % Make sure that min>=1 and max<=sz
355    if max(slice_ind)>sz
356      h=warndlg({['Could not evaluate expression "' custom_str '".'],...
357                 'Maximum slice index exceeds the number of slices.'},...
358                'Could not evaluate expression','modal');
359      uiwait(h)
360      return
361    end
362    if min(slice_ind)<1
363      h=warndlg({['Could not evaluate expression "' custom_str '".'],...
364                 ['Slice indices have to be larger than zero.']},...
365                'Could not evaluate expression','modal');
366      uiwait(h)
367      return
368    end
369   
370  end
371 
372  % If this point is reached, all is well and we can exit normally
373  delete(H.FH)
374 
375  end % function l_CheckValues(h,
376
377
378%%%%%%%%%%%%%%%%%%%%%%
379% Cancel is pressed
380%%%%%%%%%%%%%%%%%%%%%%
381  function l_Cancel(h,evd)
382 
383  %% Set the cancel flag and resume with exit
384  cancel=1;
385 
386  delete(H.FH)
387 
388  end % function l_Cancel(h,
389end
Note: See TracBrowser for help on using the repository browser.

Powered by Trac 1.0.9.Copyright © Juha-Pekka Niskanen 2008