source: aedes_export_gui.m @ 126

Last change on this file since 126 was 126, checked in by tjniskan, 9 years ago
  • Hotfix for plotting multivolume mosaics. Hopefully didn't break

anything...

M aedes.m
M aedes_export_gui.m
M aedes_revision.m

File size: 57.6 KB
Line 
1function aedes_export_gui(DATA,ROI,Clim_in,colmap_in,roiTransp,showRoiEdges,overlay,currentVol)
2% AEDES_EXPORT_GUI - Graphical user interface for exporting mri images
3%   
4%
5% Synopsis:
6%
7% Description:
8%
9% Examples:
10%
11% See also:
12%       AEDES
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% Public variables
32H=[];
33Dat=[];
34
35if nargin==0
36  error('Too few input arguments!')
37elseif nargin==1
38  ROI = [];
39else
40  % Check ROI structure
41  if ~isempty(ROI) && ( ~isstruct(ROI) || ~isfield(ROI,'voxels') )
42    error('Invalid ROI structure!')
43  end
44end
45
46if ~exist('Clim_in','var')
47  Clim_in = [];
48end
49if ~exist('colmap_in','var')
50  colmap_in = [];
51end
52if ~exist('overlay','var')
53  overlay = [];
54end
55if ~exist('showRoiEdges','var')
56  showRoiEdges = false;
57end
58if ~exist('roiTransp','var')
59  roiTransp = 1;
60end
61if ~exist('currentVol','var')
62  currentVol = 1;
63end
64% $$$ if ~exist('flip_in','var')
65% $$$   flip_in = [];
66% $$$ end
67% $$$ if ~exist('rotation_in','var')
68% $$$   rotation_in = [];
69% $$$ end
70
71% Check DATA structure
72Dat.currentVol = currentVol;
73showError = false;
74Dat.isDataMixed = false;
75if isstruct(DATA)
76  if ~isfield(DATA,'FTDATA')
77    showError = true;
78  else
79    DATA = {DATA};
80  end
81elseif iscell(DATA)
82  if ~isstruct(DATA{1})
83    showError = true;
84  else
85    if length(DATA)>1
86      Dat.isDataMixed = true;
87    end
88  end
89else
90  showError = true;
91end
92
93if showError
94  error('First input argument must be a valid DATA-form structure!')
95  return
96end
97
98% Store data sizes in all directions
99if Dat.isDataMixed
100  Dat.XSize = length(DATA);
101  Dat.YSize = 0;
102  Dat.ZSize = 0;
103else
104  Dat.XSize = size(DATA{1}.FTDATA,3);
105  Dat.YSize = size(DATA{1}.FTDATA,1);
106  Dat.ZSize = size(DATA{1}.FTDATA,2);
107  Dat.VSize = size(DATA{1}.FTDATA,4);
108end
109
110% Draw GUI figure and uicontrols
111H=l_DrawGui;
112
113
114%%%%%%%%%%%%%%%%%%%%%%%%
115% Draw GUI
116%%%%%%%%%%%%%%%%%%%%%%%%
117function H=l_DrawGui
118
119  %% Load default font and colors
120  GD=aedes_gui_defaults;
121 
122  % Position figure to the center of the screen
123  scrsz = get(0,'screensize');
124  fig_w = 350;
125  fig_h = 585;
126  fig_pos = [scrsz(3)/2-fig_w/2 scrsz(4)/2-fig_h/2 fig_w fig_h];
127 
128  %% Main Figure ----------------------------
129  H.MAINFIG = figure('Units','Pixel', ...
130                     'position',fig_pos,...
131                     'Name','Export Dialog', ...
132                     'Numbertitle','off', ...
133                     'Tag','export_fig', ...
134                     'Color',GD.col.mainfig, ...
135                     'Toolbar','none', ...
136                     'Menubar','none', ...
137                     'DoubleBuffer','on', ...
138                     'DockControls','off',...
139                     'renderer','painters',...
140                     'KeyPressFcn','',...
141                     'Closereq',@l_Close,...
142                     'Handlevisibility','off',...
143                     'windowstyle','normal');
144  set(H.MAINFIG,'resize','off')
145 
146  %% Uipanels --------------------------------
147 
148  % Export options
149  H.EXPORT_TYPE = uipanel('parent',H.MAINFIG,...
150                          'units','pixel',...
151                          'position',[10 fig_h-10-210 330 210],...
152                          'title','Export Type and Path',...
153                                                  'backgroundcolor',GD.col.frame);
154  H.FILE_FORMAT_TX = uicontrol('parent',H.EXPORT_TYPE,...
155                               'units','pixel',...
156                               'position',[10 170 80 15],...
157                               'string','File Format:',...
158                               'horizontalalign','left',...
159                               'style','text',...
160                                                           'backgroundcolor',GD.col.frame);
161  tmp=get(H.FILE_FORMAT_TX,'position');
162  H.FILE_FORMAT_POPUP = uicontrol('parent',H.EXPORT_TYPE,...
163                                  'units','pixel',...
164                                  'position',[tmp(1)+tmp(3) tmp(2) 225 18],...
165                                  'style','popup',...
166                                  'string',...
167                                  {'JPG - JPEG Files',...
168                      'TIFF - Tagged Image File Format',...
169                      'PNG - Portable Network Graphics',...
170                      'BMP - Windows Bitmap',...
171                      'EPS - Encapsulated PostScript'},...
172                                  'backgroundcolor','w',...
173                                  'callback',@l_ChangeFileFormat);
174  H.FILETYPE_OPTIONS = uipanel('parent',H.EXPORT_TYPE,...
175                               'units','pixel',...
176                               'position',[tmp(1)+tmp(3) tmp(2)-80 225 75],...
177                               'title','File Format Options',...
178                                                           'backgroundcolor',GD.col.frame);
179  H.RESOLUTION_TX = uicontrol('parent',H.FILETYPE_OPTIONS,...
180                              'units','pixel',...
181                              'position',[30 35 80 15],...
182                              'string','Resolution (dpi):',...
183                              'horizontalalign','left',...
184                              'style','text',...
185                                                          'backgroundcolor',GD.col.frame);
186  tmp=get(H.RESOLUTION_TX,'position');
187  H.RESOLUTION_EDIT = uicontrol('parent',H.FILETYPE_OPTIONS,...
188                                'units','pixel',...
189                                'position',[tmp(1)+tmp(3)+10 tmp(2) 50 18],...
190                                'backgroundcolor','w',...
191                                'horizontalalign','center',...
192                                'style','edit',...
193                                'string','96',...
194                                'userdata','96',...
195                                'callback',@l_ChangeResolutionQuality);
196  H.COMPRESSION_CHBOX = uicontrol('parent',H.FILETYPE_OPTIONS,...
197                                  'units','pixel',...
198                                  'position',[tmp(1) tmp(2)-25 150 18],...
199                                  'horizontalalign','center',...
200                                  'style','checkbox',...
201                                  'string','Use Compression',...
202                                  'value',1,...
203                                  'visible','off',...
204                                                                  'backgroundcolor',GD.col.frame);
205  H.QUALITY_TX = uicontrol('parent',H.FILETYPE_OPTIONS,...
206                           'units','pixel',...
207                           'position',[tmp(1) tmp(2)-25 75 18],...
208                           'string','Quality (%):',...
209                           'horizontalalign','left',...
210                           'style','text',...
211                                                   'backgroundcolor',GD.col.frame);
212  tmp2=get(H.QUALITY_TX,'position');
213  tmp3=get(H.RESOLUTION_EDIT,'position');
214  H.QUALITY_EDIT = uicontrol('parent',H.FILETYPE_OPTIONS,...
215                             'units','pixel',...
216                             'position',[tmp3(1) tmp2(2) 50 18],...
217                             'horizontalalign','center',...
218                             'style','edit',...
219                             'backgroundcolor','w',...
220                             'string','80',...
221                             'value',1,...
222                             'visible','on',...
223                             'userdata','80',...
224                             'callback',@l_ChangeResolutionQuality);
225  tmp2=get(H.FILETYPE_OPTIONS,'position');
226  tmp=get(H.FILE_FORMAT_TX,'position');
227  H.FILEPREFIX_TX = uicontrol('parent',H.EXPORT_TYPE,...
228                              'units','pixel',...
229                              'position',[tmp(1) tmp2(2)-tmp(4)-20 tmp(3:4)],...
230                              'string','File Prefix:',...
231                              'horizontalalign','left',...
232                              'style','text',...
233                                                          'backgroundcolor',GD.col.frame);
234  tmp=get(H.FILEPREFIX_TX,'position');
235  H.FILEPREFIX_EDIT = uicontrol('parent',H.EXPORT_TYPE,...
236                                'units','pixel',...
237                                'position',[tmp(1)+tmp(3) tmp(2) 225 18],...
238                                'backgroundcolor','w',...
239                                'horizontalalign','left',...
240                                'style','edit',...
241                                'string','mrimage',...
242                                'keypressfcn',@l_FilePrefixEditKeyPress);
243  % This dummy uicontrol is used to safely shift focus
244  % between uicontrols. Focus shift is used as a workaround to a Matlab
245  % keypressfcn bug with editboxes...
246  H.DUMMYUICH = uicontrol('parent',H.EXPORT_TYPE,...
247                          'units','pixel',...
248                          'position',[-20 0 2 2],...
249                          'style','pushbutton',...
250                          'visible','on');
251  H.OUTDIR_TX = uicontrol('parent',H.EXPORT_TYPE,...
252                          'units','pixel',...
253                          'position',[tmp(1) tmp(2)-25 90 15],...
254                          'string','Output directory:',...
255                          'horizontalalign','left',...
256                          'style','text',...
257                                                  'backgroundcolor',GD.col.frame);
258  tmp=get(H.OUTDIR_TX,'position');
259  H.OUTDIR_EDIT = uicontrol('parent',H.EXPORT_TYPE,...
260                            'units','pixel',...
261                            'position',[tmp(1) tmp(2)-18 280 18],...
262                            'string','',...
263                            'backgroundcolor','w',...
264                            'horizontalalign','left',...
265                            'style','edit',...
266                            'callback',@l_CheckOutputDir);
267  % Set default output directory
268  try
269    filepath=getpref('Aedes','ExportFileDir');
270    set(H.OUTDIR_EDIT,'string',filepath)
271  catch
272    set(H.OUTDIR_EDIT,'string',[pwd,filesep])
273  end
274  tmp=get(H.OUTDIR_EDIT,'position');
275  H.BROWSE_BTN = uicontrol('parent',H.EXPORT_TYPE,...
276                           'units','pixel',...
277                           'position',[tmp(1)+tmp(3)+2 tmp(2) 25 18],...
278                           'string','...',...
279                           'style','pushbutton',...
280                           'callback',@l_CheckOutputDir);
281 
282  % Separate files/mosaic uipanel
283  tmp=get(H.EXPORT_TYPE,'position');
284  H.FILES_UIPANEL = uipanel('parent',H.MAINFIG,...
285                            'units','pixel',...
286                            'position',[tmp(1) tmp(2)-10-120 160 120],...
287                            'title','Files',...
288                                                        'backgroundcolor',GD.col.frame);
289  set(H.MAINFIG,'color',get(H.FILES_UIPANEL,'backgroundcolor'));
290  H.RADIOGRP_FILES = uibuttongroup('parent',H.FILES_UIPANEL,...
291                                   'units','pixel',...
292                                   'position',[5 5 150 100],...
293                                   'bordertype','none',...
294                                   'selectionchangefcn',@l_FilesSelectionCB,...
295                                                                   'backgroundcolor',GD.col.frame);
296  H.SEP_FILES = uicontrol('parent',H.RADIOGRP_FILES,...
297                          'units','pixel',...                       
298                          'position',[10 75 130 25],...
299                          'style','radio',...
300                          'string','Separate Files',...
301                          'value',1,...
302                                                  'backgroundcolor',GD.col.frame);
303  tmp=get(H.SEP_FILES,'position');
304  H.MOSAIC_FILES = uicontrol('parent',H.RADIOGRP_FILES,...
305                             'units','pixel',...                       
306                             'position',[tmp(1) tmp(2)-tmp(4) tmp(3:4)],...
307                             'style','radio',...
308                             'string','Mosaic',...
309                             'value',0,...
310                                                         'backgroundcolor',GD.col.frame);
311  tmp=get(H.MOSAIC_FILES,'position');
312  H.ROWS_TX = uicontrol('parent',H.RADIOGRP_FILES,...
313                        'units','pixel',...
314                        'position',[40 tmp(2)-20 50 15],...
315                        'style','text',...
316                        'horizontalalign','left',...
317                        'string','Rows:',...
318                        'enable','off',...
319                                                'backgroundcolor',GD.col.frame);
320  H.ROWS_EDIT = uicontrol('parent',H.RADIOGRP_FILES,...
321                          'units','pixel',...
322                          'position',[90 tmp(2)-20 50 18],...
323                          'style','edit',...
324                          'backgroundcolor','w',...
325                          'string','',...
326                          'enable','off',...
327                          'callback',@l_CheckMosaic);
328  tmp=get(H.ROWS_TX,'position');
329  H.COLS_TX = uicontrol('parent',H.RADIOGRP_FILES,...
330                        'units','pixel',...
331                        'position',[tmp(1) tmp(2)-25 tmp(3:4)],...
332                        'style','text',...
333                        'horizontalalign','left',...
334                        'string','Columns:',...
335                        'enable','off',...
336                                                'backgroundcolor',GD.col.frame);
337  H.COLS_EDIT = uicontrol('parent',H.RADIOGRP_FILES,...
338                          'units','pixel',...
339                          'position',[90 tmp(2)-25 50 18],...
340                          'style','edit',...
341                          'backgroundcolor','w',...
342                          'string','',...
343                          'enable','off',...
344                          'callback',@l_CheckMosaic);
345 
346  % Set default values for mosaic rows/columns
347  rows = floor(sqrt(Dat.XSize));
348  cols = ceil(Dat.XSize/rows);
349  set(H.ROWS_EDIT,'string',num2str(rows),...
350                  'userdata',num2str(rows))
351  set(H.COLS_EDIT,'string',num2str(cols),...
352                  'userdata',num2str(cols))
353 
354  % X-dir, Y-dir, Z-dir
355  tmp=get(H.FILES_UIPANEL,'position');
356  H.DIR_UIPANEL = uipanel('parent',H.MAINFIG,...
357                          'units','pixel',...
358                          'position',[180 tmp(2) tmp(3) tmp(4)],...
359                          'title','Slice Direction',...
360                                                  'backgroundcolor',GD.col.frame);
361  H.RADIOGRP_DIR = uibuttongroup('parent',H.DIR_UIPANEL,...
362                                 'units','pixel',...
363                                 'position',[5 5 150 100],...
364                                 'bordertype','none',...
365                                 'selectionchangefcn',@l_DirChangeFcn,...
366                                                                 'backgroundcolor',GD.col.frame);
367  H.XDIR_RADIO = uicontrol('parent',H.RADIOGRP_DIR,...
368                           'units','pixel',...                       
369                           'position',[10 65 130 25],...
370                           'style','radio',...
371                           'string','X-Direction',...
372                           'value',1,...
373                                                   'backgroundcolor',GD.col.frame);
374  tmp=get(H.XDIR_RADIO,'position');
375  H.YDIR_RADIO = uicontrol('parent',H.RADIOGRP_DIR,...
376                           'units','pixel',...                       
377                           'position',[tmp(1) tmp(2)-tmp(4) tmp(3:4)],...
378                           'style','radio',...
379                           'string','Y-Direction',...
380                           'value',0,...
381                                                   'backgroundcolor',GD.col.frame);
382  tmp=get(H.YDIR_RADIO,'position');
383  H.ZDIR_RADIO = uicontrol('parent',H.RADIOGRP_DIR,...
384                           'units','pixel',...                       
385                           'position',[tmp(1) tmp(2)-tmp(4) tmp(3:4)],...
386                           'style','radio',...
387                           'string','Z-Direction',...
388                           'value',0,...
389                                                   'backgroundcolor',GD.col.frame);
390  if Dat.isDataMixed
391    % Disable Y- and Z-radio buttons for mixed data
392    set([H.YDIR_RADIO,H.ZDIR_RADIO],'enable','off')
393  end
394 
395  % Slice selection
396  tmp=get(H.FILES_UIPANEL,'position');
397  H.SLICE_UIPANEL = uipanel('parent',H.MAINFIG,...
398                            'units','pixel',...
399                            'position',[10 tmp(2)-180-10 tmp(3) 180],...
400                            'title','Slice Selection',...
401                                                        'backgroundcolor',GD.col.frame);
402  H.RADIOGRP_SLICE = uibuttongroup('parent',H.SLICE_UIPANEL,...
403                                   'units','pixel',...
404                                   'position',[5 5 150 120],...
405                                   'bordertype','none',...
406                                   'selectionchangefcn',@l_SliceSelection,...
407                                                                   'backgroundcolor',GD.col.frame);
408  H.ALL_SLICES = uicontrol('parent',H.RADIOGRP_SLICE,...
409                           'units','pixel',...                       
410                           'position',[10 135 130 25],...
411                           'style','radio',...
412                           'string','All Slices',...
413                           'value',1,...
414                                                   'backgroundcolor',GD.col.frame);
415  tmp=get(H.ALL_SLICES,'position');
416  H.CUSTOM_SLICES = uicontrol('parent',H.RADIOGRP_SLICE,...
417                              'units','pixel',...                       
418                              'position',[tmp(1) tmp(2)-tmp(4) tmp(3:4)],...
419                              'style','radio',...
420                              'string','Custom Slices',...
421                              'value',0,...
422                                                          'backgroundcolor',GD.col.frame);
423  tmp=get(H.CUSTOM_SLICES,'position');
424  H.CUSTOM_EDIT = uicontrol('parent',H.RADIOGRP_SLICE,...
425                            'units','pixel',...                       
426                            'position',[tmp(1)+20 tmp(2)-tmp(4)+5 110 18],...
427                            'style','edit',...
428                            'backgroundcolor','w',...
429                            'horizontalalign','left',...
430                            'string','1:end',...
431                            'userdata','1:end',...
432                            'enable','off',...
433                            'callback',@l_CheckCustomSliceSelection);
434 
435  % Additional Options
436  tmp=get(H.FILES_UIPANEL,'position');
437  H.OPTIONS_UIPANEL = uipanel('parent',H.MAINFIG,...
438                              'units','pixel',...
439                              'position',[180 tmp(2)-10-180 160 180],...
440                              'title','Additional Options',...
441                                                          'backgroundcolor',GD.col.frame);
442  if isempty(ROI)
443    roi_enable = 'off';
444  else
445    roi_enable = 'on';
446  end
447  H.DRAW_ROIS = uicontrol('parent',H.OPTIONS_UIPANEL,...
448                          'units','pixel',...
449                          'position',[10 140 130 25],...
450                          'style','checkbox',...
451                          'string','Draw ROIs',...
452                          'value',0,...
453                          'enable',roi_enable,...
454                          'callback',@l_DrawRoisCheckBoxCB,...
455                                                  'backgroundcolor',GD.col.frame);
456  if isempty(ROI)
457    % Disable "Draw ROIs" checkbox if ROIs are not available
458    set(H.DRAW_ROIS,'value',0,'enable','off')
459  end
460  tmp=get(H.DRAW_ROIS,'position');
461  H.ROI_LBOX = uicontrol('parent',H.OPTIONS_UIPANEL,...
462                         'units','pixel',...
463                         'position',[tmp(1)+20 tmp(2)-40 110 40],...
464                         'style','listbox',...
465                         'backgroundcolor','w',...
466                         'min',1,'max',3,...
467                         'string',{''},...
468                         'enable','off');
469  if ~isempty(ROI)
470    Dat.RoiLabels = {ROI(:).label};
471    set(H.ROI_LBOX,'string',Dat.RoiLabels)
472  end
473  tmp=get(H.DRAW_ROIS,'position');
474  H.DRAW_SLICENBR = uicontrol('parent',H.OPTIONS_UIPANEL,...
475                              'units','pixel',...
476                              'position',[tmp(1) tmp(2)-60 130 20],...
477                              'style','checkbox',...
478                              'string','Draw Slice Nbr.',...
479                              'value',1,...
480                                                          'backgroundcolor',GD.col.frame);
481  tmp=get(H.DRAW_SLICENBR,'position');
482  H.DRAW_FILENAME = uicontrol('parent',H.OPTIONS_UIPANEL,...
483                              'units','pixel',...
484                              'position',[tmp(1) tmp(2)-23 130 20],...
485                              'style','checkbox',...
486                              'string','Draw File Name',...
487                              'value',1,...
488                                                          'backgroundcolor',GD.col.frame);
489  tmp=get(H.DRAW_FILENAME,'position');
490  H.DRAW_COLORBAR = uicontrol('parent',H.OPTIONS_UIPANEL,...
491                              'units','pixel',...
492                              'position',[tmp(1) tmp(2)-23 130 20],...
493                              'style','checkbox',...
494                              'string','Draw Colorbar',...
495                              'value',0,...
496                                                          'backgroundcolor',GD.col.frame);
497  tmp=get(H.DRAW_COLORBAR,'position');
498  H.DRAW_OVERLAY = uicontrol('parent',H.OPTIONS_UIPANEL,...
499                              'units','pixel',...
500                              'position',[tmp(1) tmp(2)-23 130 20],...
501                              'style','checkbox',...
502                              'string','Draw Overlay',...
503                              'value',0,...
504                                                          'backgroundcolor',GD.col.frame);
505  if isempty(overlay)
506        set(H.DRAW_OVERLAY,'enable','off')
507  end
508  tmp=get(H.OPTIONS_UIPANEL,'position');
509 
510  % Export and Cancel buttons
511  H.EXPORT_BTN = uicontrol('parent',H.MAINFIG,...
512                       'units','pixel',...
513                       'position',[tmp(1) tmp(2)-30-5 77.5 30],...
514                       'string','Export...',...
515                       'style','pushbutton',...
516                       'callback',@l_CheckOptions);
517  tmp = get(H.EXPORT_BTN,'position');
518  H.CANCEL_BTN = uicontrol('parent',H.MAINFIG,...
519                           'units','pixel',...
520                           'position',[tmp(1)+tmp(3)+5 tmp(2:4)],...
521                           'string','Cancel',...
522                           'style','pushbutton',...
523                           'callback','close(gcbf)');
524 
525  % Initialize some internal variables
526  Dat.SliceInd = 1:Dat.XSize;
527 
528 
529end % function l_DrawGui(h,
530
531%%%%%%%%%%%%%%%%%%%%%%%%%%%%
532%
533% GUI callbacks
534%
535%%%%%%%%%%%%%%%%%%%%%%%%%%%%
536function l_ChangeFileFormat(h,evd)
537
538popupval = get(H.FILE_FORMAT_POPUP,'value');
539
540if popupval==1
541  set([H.QUALITY_TX,H.QUALITY_EDIT],'visible','on')
542  set(H.COMPRESSION_CHBOX,'visible','off')
543elseif popupval==2
544  set([H.QUALITY_TX,H.QUALITY_EDIT],'visible','off')
545  set(H.COMPRESSION_CHBOX,'visible','on')
546else
547  set([H.QUALITY_TX,H.QUALITY_EDIT,H.COMPRESSION_CHBOX],...
548      'visible','off')
549end
550 
551
552end % function l_ChangeFileFormat(h,
553
554function l_FilePrefixEditKeyPress(h,evd)
555
556% This ugly stabbing of Matlab doesn't work anymore correctly with newer
557% versions so return immediately...
558return 
559
560% Switch focus between uicontrols (a Matlab bug workaround)
561uicontrol(H.DUMMYUICH)
562uicontrol(H.FILEPREFIX_EDIT)
563
564% Call drawnow twice to refresh the editbox (yet another Matlab bug
565% workaround)
566drawnow
567drawnow
568
569% Query the editbox string value
570str=get(H.FILEPREFIX_EDIT,'string');
571if isempty(str)
572  return
573end
574
575% If the string contains forbidden characters, display error and remove
576% the last character
577ind=ismember(str,'\/:*?"<>|');
578if any(ind)
579  warndlg({'A file name cannot contain any of the following characters:',...
580           '','\/:*?"<>|'},'Forbidden character entered.','modal')
581  str(ind)=[];
582  set(H.FILEPREFIX_EDIT,'string',str)
583  uicontrol(H.DUMMYUICH)
584  uicontrol(H.FILEPREFIX_EDIT)
585  drawnow
586  drawnow
587end
588
589
590end % function l_FilePrefixEditKeyPress(h,
591
592function l_DrawRoisCheckBoxCB(h,evd)
593
594if get(H.DRAW_ROIS,'value')
595  set(H.ROI_LBOX,'enable','on')
596else
597  set(H.ROI_LBOX,'enable','off')
598end
599
600end % function l_DrawRoisCheckBoxCB(h,
601
602%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
603function l_FilesSelectionCB(h,evd)
604
605if ~isempty(evd)
606  if evd.NewValue==H.MOSAIC_FILES
607    child_h = findobj(H.EXPORT_TYPE,'type','uicontrol');
608    %child_h=get(H.EXPORT_TYPE,'children');
609    %child_h = child_h(child_h~=H.FILETYPE_OPTIONS);
610    set(child_h,'enable','off')
611    set([H.ROWS_TX,H.ROWS_EDIT,H.COLS_TX,H.COLS_EDIT],'enable','on')
612    %set([H.FILE_FORMAT_TX,H.FILE_FORMAT_POPUP,...
613    %    H.OUTDIR_TX,H.OUTDIR_EDIT,H.BROWSE_BTN],'enable','off')
614  else
615    child_h = findobj(H.EXPORT_TYPE,'type','uicontrol');
616    %child_h=get(H.EXPORT_TYPE,'children');
617    %child_h = child_h(child_h~=H.FILETYPE_OPTIONS);
618    set(child_h,'enable','on')
619    %set(get(H.EXPORT_TYPE,'children'),'enable','on')
620    set([H.ROWS_TX,H.ROWS_EDIT,H.COLS_TX,H.COLS_EDIT],'enable','off')
621    %set([H.FILE_FORMAT_TX,H.FILE_FORMAT_POPUP,...
622    %    H.OUTDIR_TX,H.OUTDIR_EDIT,H.BROWSE_BTN],'enable','on')
623  end
624end
625
626end % function l_FilesSelectionCB
627
628%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
629function l_ChangeResolutionQuality(h,evd)
630
631if h==H.RESOLUTION_EDIT
632  res_val=floor(str2num(get(H.RESOLUTION_EDIT,'string')));
633  if isempty(res_val) || ~isreal(res_val) || res_val<0 || res_val>1200
634    hh=errordlg(['Invalid value for resolution! The value must be between ' ...
635                 '0-1200 dpi.'],'Error!','modal');
636    set(H.RESOLUTION_EDIT,'string',get(H.RESOLUTION_EDIT,'userdata'))
637    return
638  else
639    set(H.RESOLUTION_EDIT,'string',num2str(res_val),...
640                      'userdata',num2str(res_val))
641  end
642elseif h==H.QUALITY_EDIT
643  qval = floor(str2num(get(H.QUALITY_EDIT,'string')));
644  if isempty(qval) || ~isreal(qval) || qval<1 || qval>100
645    hh=errordlg('Invalid value for quality! The value must be between 1-100%.',...
646                'Error!','modal');
647    set(H.QUALITY_EDIT,'string',get(H.QUALITY_EDIT,'userdata'))
648    return
649  else
650    set(H.QUALITY_EDIT,'string',num2str(qval),...
651                      'userdata',num2str(qval))
652  end
653end
654
655end % function l_ChangeResolutionQuality(h,
656
657%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
658function l_CheckMosaic(h,evd)
659
660if ~isempty(h)
661
662  % Check that the value is numeric
663  val = str2num(get(h,'string'));
664  if isempty(val) || ~isreal(val) || val<=0
665    errordlg('Invalid row/column value!','Error. Invalid value!','modal');
666    set(H.COLS_EDIT,'string',get(H.COLS_EDIT,'userdata'))
667    set(H.ROWS_EDIT,'string',get(H.ROWS_EDIT,'userdata'))
668    return
669  end
670
671  total_sz = length(Dat.SliceInd);
672 
673  if val>total_sz
674    val = total_sz;
675  end
676
677  % Set values for mosaic rows/columns
678  if h==H.ROWS_EDIT
679    rows = val;
680    cols = ceil(total_sz/rows);
681    set(H.COLS_EDIT,'string',num2str(cols),...
682                    'userdata',num2str(cols))
683    set(H.ROWS_EDIT,'string',num2str(val))
684  elseif h==H.COLS_EDIT
685    cols = val;
686    rows = ceil(total_sz/cols);
687    set(H.ROWS_EDIT,'string',num2str(rows),...
688                    'userdata',num2str(rows))
689    set(H.COLS_EDIT,'string',num2str(val))
690  end
691 
692else
693 
694% $$$   % Keep number of rows constant and change the number of columns
695% $$$   total_sz = length(Dat.SliceInd);
696% $$$   val = str2num(get(H.ROWS_EDIT,'string'));
697% $$$   if val>total_sz
698% $$$     val = total_sz;
699% $$$   end
700% $$$   rows = val;
701% $$$   cols = ceil(total_sz/rows);
702% $$$   set(H.COLS_EDIT,'string',num2str(cols),...
703% $$$                   'userdata',num2str(cols))
704% $$$   set(H.ROWS_EDIT,'string',num2str(val))
705 
706  % Keep number of columns constant and change the number of rows
707  total_sz = length(Dat.SliceInd);
708  val = str2num(get(H.COLS_EDIT,'string'));
709  if val>total_sz
710    val = total_sz;
711  end
712  cols = val;
713  rows = ceil(total_sz/cols);
714  set(H.ROWS_EDIT,'string',num2str(rows),...
715                  'userdata',num2str(rows))
716  set(H.COLS_EDIT,'string',num2str(val))
717 
718end
719
720end % function l_CheckMosaic(h,
721
722%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
723function l_CheckOutputDir(h,evd)
724
725if h==H.BROWSE_BTN % Called from browse btn
726 
727  try
728    filepath=getpref('Aedes','ExportFileDir');
729  catch
730    filepath='';
731  end
732  filepath = uigetdir(filepath);
733  if isequal(filepath,0)
734    return
735  end
736  filepath = [filepath,filesep];
737  setpref('Aedes','ExportFileDir',filepath)
738  set(H.OUTDIR_EDIT,'string',filepath)
739 
740elseif h==H.OUTDIR_EDIT % Called from outdir edit
741 
742  filepath=get(H.OUTDIR_EDIT,'string');
743 
744  % Check if the inputted directory exists
745  if ~isdir(filepath)
746    errordlg({'The export path','',...
747              ['"',filepath,'"'],'','does not exist!'},...
748             'Error! File path does not exist!','modal')
749    return
750  end
751 
752  if filepath(end)~=filesep
753    filepath(end+1)=filesep;
754    set(H.OUTDIR_EDIT,'string',filepath)
755  end
756 
757end
758
759end % function l_CheckOutputDir(h,
760
761%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
762function l_CheckCustomSliceSelection(h,evd)
763
764% Get selected direction
765selobj=get(H.RADIOGRP_DIR,'selectedobject');
766if selobj==H.XDIR_RADIO
767  sz = Dat.XSize;
768elseif selobj==H.YDIR_RADIO
769  sz = Dat.YSize;
770else
771  sz = Dat.ZSize;
772end
773
774%% Get custom string
775str = get(H.CUSTOM_EDIT,'string');
776if isempty(str)
777  hh=warndlg('The custom text field cannot be empty!',...
778            'Invalid expression','modal');
779  set(H.CUSTOM_EDIT,'string',get(H.CUSTOM_EDIT,'userdata'))
780  return
781end
782
783%% Check that the string contains only valid characters
784tmp_ind=ismember(str,'0123456789end:,*+-/');
785if ~all(tmp_ind)
786  hh=warndlg(['The custom text "' str '" contains invalid characters'],...
787            'Invalid expression','modal');
788  set(H.CUSTOM_EDIT,'string',get(H.CUSTOM_EDIT,'userdata'))
789  return
790end
791
792% replace 'end' statement with ROI size
793custom_str=strrep(str,'end','sz');
794slice_ind=[];
795
796% Try to evaluate the index string
797try
798  eval(['slice_ind=[' custom_str '];']);
799catch
800  hh=warndlg({['Could not evaluate expression "' custom_str '".'],...
801             ['Custom string has to be a valid Matlab vector expression.']},...
802            'Could not evaluate expression','modal');
803  set(H.CUSTOM_EDIT,'string',get(H.CUSTOM_EDIT,'userdata'))
804  return
805end
806
807% Sort indices and make sure that all indices are unique
808%slice_ind=unique(slice_ind);
809
810% Make sure that min>=1 and max<=sz
811if max(slice_ind)>sz
812  hh=warndlg({['Could not evaluate expression "' custom_str '".'],...
813             'Maximum slice index exceeds the number of slices.'},...
814            'Could not evaluate expression','modal');
815  set(H.CUSTOM_EDIT,'string',get(H.CUSTOM_EDIT,'userdata'))
816  return
817end
818if min(slice_ind)<1
819  hh=warndlg({['Could not evaluate expression "' custom_str '".'],...
820             ['Slice indices have to be larger than zero.']},...
821            'Could not evaluate expression','modal');
822  set(H.CUSTOM_EDIT,'string',get(H.CUSTOM_EDIT,'userdata'))
823  return
824end
825
826Dat.SliceInd = slice_ind;
827set(H.CUSTOM_EDIT,'userdata',str)
828
829l_CheckMosaic([],[])
830
831end % function l_CheckCustomSliceSelection(h,
832
833%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
834function l_DirChangeFcn(h,evd)
835
836set(H.CUSTOM_EDIT,'string','1:end')
837if get(H.XDIR_RADIO,'value')==1
838  Dat.SliceInd = 1:Dat.XSize;
839elseif get(H.YDIR_RADIO,'value')==1
840  Dat.SliceInd = 1:Dat.YSize;
841else
842  Dat.SliceInd = 1:Dat.ZSize;
843end
844
845l_CheckMosaic([],[])
846
847end % function l_DirChangeFcn(h,
848
849%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
850function l_SliceSelection(h,evd)
851
852if h==H.RADIOGRP_SLICE
853  if evd.NewValue==H.ALL_SLICES
854    % Disable Custom slice editbox if All Slices is selected
855    set(H.CUSTOM_EDIT,'enable','off')
856    if get(H.XDIR_RADIO,'value')==1
857      Dat.SliceInd = 1:Dat.XSize;
858    elseif get(H.YDIR_RADIO,'value')==1
859      Dat.SliceInd = 1:Dat.YSize;
860    else
861      Dat.SliceInd = 1:Dat.ZSize;
862    end
863  else
864    set(H.CUSTOM_EDIT,'enable','on')
865  end
866end
867
868l_CheckMosaic([],[])
869
870end % function l_SliceSelection(h,
871
872%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
873% Check Options and continue
874%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
875function l_CheckOptions(h,evd)
876
877% Check output dir
878if get(H.SEP_FILES,'value')==1
879  createMosaic = false;
880  outdir = get(H.OUTDIR_EDIT,'string');
881  if ~isdir(outdir)
882    hh=errordlg({'The output directory',...
883               ['"',outdir,'"'],'does not exist!'},'Error!','modal');
884    return
885  end
886else
887  outdir = get(H.OUTDIR_EDIT,'string');
888  createMosaic = true;
889end
890
891if outdir(end)~=filesep
892  outdir(end+1)=filesep;
893end
894
895% Check File Format Options
896useCompression = logical(get(H.COMPRESSION_CHBOX,'value'));
897resolution = get(H.RESOLUTION_EDIT,'string');
898quality = str2num(get(H.QUALITY_EDIT,'string'));
899
900% Get file prefix (for separate files)
901filePrefix = get(H.FILEPREFIX_EDIT,'string');
902
903% If the string contains forbidden characters, display error and return
904ind=ismember(filePrefix,'\/:*?"<>|');
905if any(ind)
906  hh=warndlg({'A file name cannot contain any of the following characters:',...
907        '','\/:*?"<>|'},'Forbidden character entered.','modal');
908  uiwait(hh)
909  uicontrol(H.DUMMYUICH)
910  uicontrol(H.FILEPREFIX_EDIT)
911  drawnow
912  drawnow
913  return
914end
915
916% Check direction
917if get(H.XDIR_RADIO,'value')==1
918  sliceDir = 1;
919elseif get(H.YDIR_RADIO,'value')==1
920  sliceDir = 2;
921elseif get(H.ZDIR_RADIO,'value')==1
922  sliceDir = 3;
923end
924
925% Check additional options
926if get(H.DRAW_ROIS,'value')==1
927  drawRois = true;
928  roi_ind=get(H.ROI_LBOX,'value');
929  if isempty(roi_ind)
930    drawRois = false;
931  end
932else
933  drawRois = false;
934  roi_ind = [];
935end
936if get(H.DRAW_SLICENBR,'value')==1
937  drawSliceNbr = true;
938else
939  drawSliceNbr = false;
940end
941if get(H.DRAW_FILENAME,'value')==1
942  drawFileName = true;
943else
944  drawFileName = false;
945end
946if get(H.DRAW_COLORBAR,'value')==1
947  drawColorbar = true;
948else
949  drawColorbar = false;
950end
951if get(H.DRAW_OVERLAY,'value')==1
952  drawOverlay = true;
953else
954  drawOverlay = false;
955end
956
957% Check Colormap
958if isempty(colmap_in)
959  colmap = gray(256);
960else
961  colmap = colmap_in;
962end
963
964% % Check Clim
965% if isempty(Clim_in)
966%   colmap = gray(256);
967% else
968%   colmap = colmap_in;
969% end
970
971
972
973% Draw Mosaic figure
974%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
975if createMosaic
976 
977  % Estimate space for the mosaic
978  cols=str2num(get(H.COLS_EDIT,'string'));
979  rows=str2num(get(H.ROWS_EDIT,'string'));
980  if Dat.isDataMixed
981    data_sz=size(DATA{Dat.SliceInd(1)}.FTDATA);
982  else
983    if sliceDir==1
984      data_sz=size(DATA{1}.FTDATA(:,:,Dat.SliceInd(1),Dat.currentVol));
985    elseif sliceDir==2
986      data_sz=size(squeeze(DATA{1}.FTDATA(:,Dat.SliceInd(1),:,Dat.currentVol)));
987    else
988      data_sz=size(squeeze(DATA{1}.FTDATA(Dat.SliceInd(1),:,:,Dat.currentVol)));
989    end
990  end
991 
992  % Determine figure size
993  scrsz = get(0,'screensize'); % Get current display resolution
994  scrsz(4) = scrsz(4)-45-70; % The 47px is for taskbar,
995  scrsz(3) = scrsz(3)-16;
996  gap=3;
997  fig_w = cols*data_sz(2)+(cols+1)*gap;
998  fig_h = rows*data_sz(1)+(rows+1)*gap;
999 
1000  if fig_w>scrsz(3) || fig_h>scrsz(4)
1001   
1002    aratio_w=[fig_w fig_h]./fig_w;
1003    aratio_h=[fig_w fig_h]./fig_h;
1004    for ii=1:2
1005      if fig_w>scrsz(3)
1006        tmp=aratio_w*scrsz(3);
1007        fig_w = tmp(1);
1008        fig_h = tmp(2);
1009      elseif fig_h>scrsz(4)
1010        tmp=aratio_h*scrsz(4);
1011        fig_w = tmp(1);
1012        fig_h = tmp(2);
1013      end
1014    end
1015  end
1016 
1017  %% Determine paper orientation
1018  if fig_w>fig_h
1019    paperorient = 'landscape';
1020   
1021    %% Determine paperposition
1022    papersize = [29.7 21.0];
1023    tmp=[fig_w,fig_h]./fig_h;
1024    pap_h = tmp(2)*(papersize(2)-2);
1025    pap_w = tmp(1)*(papersize(2)-2);
1026    if pap_w>(papersize(1)-2)
1027      pap_h=((papersize(1)-2)/pap_w)*pap_h;
1028      pap_w = papersize(1)-2;
1029    end
1030    paperpos = [papersize(1)/2-pap_w/2 ...
1031                papersize(2)/2-pap_h/2 ...
1032                pap_w ...
1033                pap_h];
1034  else
1035    paperorient = 'portrait';
1036
1037    %% Determine paperposition
1038    papersize = [21.0 29.7];
1039    tmp=[fig_w,fig_h]./fig_w;
1040    pap_h = tmp(2)*(papersize(1)-2);
1041    pap_w = tmp(1)*(papersize(1)-2);
1042    if pap_h>(papersize(2)-2)
1043      pap_w=((papersize(2)-2)/pap_h)*pap_w;
1044      pap_h = papersize(2)-2;
1045    end
1046    paperpos = [papersize(1)/2-pap_w/2 ...
1047                papersize(2)/2-pap_h/2 ...
1048                pap_w ...
1049                pap_h];
1050  end
1051 
1052 
1053  %% Show wait dialog
1054  [wait_h,txh]=aedes_calc_wait('Creating mosaic from slices...');
1055 
1056  % Draw the mosaic figure
1057  fh = figure('position',[scrsz(3)/2-fig_w/2+4 ...
1058                      scrsz(4)/2-fig_h/2+45 fig_w fig_h],...
1059              'visible','on',...
1060              'inverthardcopy','off',...
1061              'renderer','opengl',...%'painters',...
1062              'numbertitle','off',...
1063              'name','Mosaic View',...
1064              'colormap',colmap,...
1065              'color','w',...
1066              'papertype','a4',...
1067              'paperpositionmode','manual',...
1068              'paperorientation',paperorient,...
1069              'paperunits','centimeters',...
1070              'paperposition',paperpos);
1071  set(fh,'paperunits','inches')
1072  if ( roiTransp==0 | not(drawRois)) && not(drawOverlay)
1073        set(fh,'renderer','painters');
1074  end
1075 
1076  % Set resolution information in the figure
1077  if ispref('Aedes','ExportMosaicImageResolution')
1078        default_resolution = getpref('Aedes','ExportMosaicImageResolution');
1079  else
1080        default_resolution = 300;
1081  end
1082  setappdata(fh,'Exportsetup',struct('Resolution',default_resolution))
1083 
1084  %% Set header text
1085  if ~Dat.isDataMixed
1086    hs = getappdata(fh,'PrintHeaderHeaderSpec');
1087    if isempty(hs)
1088      hs = struct('dateformat','none',...
1089                  'string',[date,',  ',...
1090                          strrep(strrep(DATA{1}.HDR.fpath,'\','\\'),'_','\_'),...
1091                          strrep(strrep(DATA{1}.HDR.fname,'\','\\'),'_','\_')],...
1092                  'fontname','Times',...
1093                  'fontsize',12,...          % in points
1094                  'fontweight','normal',...
1095                  'fontangle','normal',...
1096                  'margin',15);            % in points
1097    end
1098    setappdata(fh,'PrintHeaderHeaderSpec',hs)
1099  end
1100 
1101 
1102  %% images and axes
1103  count=1;
1104  gap_w=gap/fig_w;
1105  gap_h=gap/fig_h;
1106  for ii=1:rows
1107    for kk=1:cols
1108      ax=axes('parent',fh,...
1109                'units','normal',...
1110                'position',[(kk-1)*((1-(cols+1)*gap_w)/cols)+kk*gap_w ...
1111                (rows-ii)*((1-(rows+1)*gap_h)/rows)+(rows+1-ii)*gap_h ...
1112                (1-(cols+1)*gap_w)/cols (1-(rows+1)*gap_h)/rows],...
1113                'visible','off',...
1114                'ydir','reverse',...
1115                'xtick',[],...
1116                'ytick',[],...
1117                'xticklabel',[],...
1118                'yticklabel',[],...
1119                'DataAspectRatio',[1 1 1],...
1120                'PlotBoxAspectRatio',[data_sz(2) data_sz(1) 1],...
1121                'PlotBoxAspectRatioMode','manual');
1122          if strcmpi(get(fh,'renderer'),'opengl')
1123                roi_ax = axes('parent',fh,...
1124                  'units','normal',...
1125                  'position',[(kk-1)*((1-(cols+1)*gap_w)/cols)+kk*gap_w ...
1126                  (rows-ii)*((1-(rows+1)*gap_h)/rows)+(rows+1-ii)*gap_h ...
1127                  (1-(cols+1)*gap_w)/cols (1-(rows+1)*gap_h)/rows],...
1128                  'visible','off',...
1129                  'ydir','reverse',...
1130                  'xtick',[],...
1131                  'ytick',[],...
1132                  'xticklabel',[],...
1133                  'yticklabel',[],...
1134                  'DataAspectRatio',[1 1 1],...
1135                  'PlotBoxAspectRatio',[data_sz(2) data_sz(1) 1],...
1136                  'PlotBoxAspectRatioMode','manual');
1137                overlay_ax = axes('parent',fh,...
1138                  'units','normal',...
1139                  'position',[(kk-1)*((1-(cols+1)*gap_w)/cols)+kk*gap_w ...
1140                  (rows-ii)*((1-(rows+1)*gap_h)/rows)+(rows+1-ii)*gap_h ...
1141                  (1-(cols+1)*gap_w)/cols (1-(rows+1)*gap_h)/rows],...
1142                  'visible','off',...
1143                  'ydir','reverse',...
1144                  'xtick',[],...
1145                  'ytick',[],...
1146                  'xticklabel',[],...
1147                  'yticklabel',[],...
1148                  'DataAspectRatio',[1 1 1],...
1149                  'PlotBoxAspectRatio',[data_sz(2) data_sz(1) 1],...
1150                  'PlotBoxAspectRatioMode','manual');
1151          end
1152      if count<=length(Dat.SliceInd)
1153       
1154        if Dat.isDataMixed
1155          imdata=DATA{Dat.SliceInd(count)}.FTDATA;
1156        else
1157          if sliceDir==1
1158            imdata=DATA{1}.FTDATA(:,:,Dat.SliceInd(count),Dat.currentVol);
1159            if drawOverlay
1160              if overlay.isOverlayRGB
1161                overlay_data = squeeze(overlay.ImageOverlay(:,:,Dat.SliceInd(count),:));
1162              else
1163                overlay_data = overlay.ImageOverlay(:,:,Dat.SliceInd(count),Dat.currentVol);
1164              end
1165            end
1166          elseif sliceDir==2
1167            imdata=squeeze(DATA{1}.FTDATA(:,Dat.SliceInd(count),:,Dat.currentVol));
1168            if drawOverlay
1169              if overlay.isOverlayRGB
1170                overlay_data = squeeze(overlay.ImageOverlay(:,Dat.SliceInd(count),:,:));
1171              else
1172                overlay_data = squeeze(overlay.ImageOverlay(:,Dat.SliceInd(count),:,Dat.currentVol));
1173              end
1174            end
1175          else
1176            imdata=squeeze(DATA{1}.FTDATA(Dat.SliceInd(count),:,:,Dat.currentVol));
1177            if drawOverlay
1178              if overlay.isOverlayRGB
1179                overlay_data = squeeze(overlay.ImageOverlay(Dat.SliceInd(count),:,:,:));
1180              else
1181                overlay_data = squeeze(overlay.ImageOverlay(Dat.SliceInd(count),:,:,Dat.currentVol));
1182              end
1183            end
1184          end
1185        end
1186       
1187       
1188       
1189        %% Plot image
1190        h=image('parent',ax,...
1191                  'cdata',imdata,...
1192                  'cdatamapping','scaled');
1193                         
1194                % Plot overlay
1195                if drawOverlay
1196                  if ~overlay.isOverlayRGB
1197                        ov_cmap = overlay.ImageOverlayCmap;
1198                        ov_clim = round(((overlay.ImageOverlayClim-overlay.ImOverlayMin)*256)./...
1199                          (overlay.ImOverlayMax-overlay.ImOverlayMin));
1200                        if ov_clim(1)==ov_clim(2)
1201                          if ov_clim(1)==0
1202                                ov_clim(2)=1;
1203                          elseif ov_clim(1)==256
1204                                ov_clim(1)=255;
1205                          end
1206                        end
1207                        ov_thold = round(((overlay.ImageOverlayThold-overlay.ImOverlayMin)*256)/...
1208                          (overlay.ImOverlayMax-overlay.ImOverlayMin));
1209                  end
1210                  ov_alpha_val = overlay.ImageOverlayAlpha;
1211                 
1212                  if ~overlay.isOverlayRGB
1213                        % Convert indexed image to RGB image
1214                        %slice1_ind=overlay.ImageOverlay(:,:,Dat.Slices(1),Dat.CurrentVol);
1215                        overlay_ind=double(overlay_data);
1216                       
1217                        % Get thresholded alpha indices
1218                        if overlay.ImageOverlayTholdDirPos==1
1219                          overlay_alpha_th = overlay_ind<ov_thold;
1220                        else
1221                          overlay_alpha_th = overlay_ind>ov_thold;
1222                        end
1223                       
1224                        % Get clim alpha indices
1225                        overlay_alpha_clim = ( overlay_ind>=ov_clim(1) & overlay_ind<=ov_clim(2) );
1226                       
1227                        overlay_ind(overlay_ind<ov_clim(1))=ov_clim(1);
1228                        overlay_ind(overlay_ind>ov_clim(2))=ov_clim(2);
1229                       
1230                        overlay_ind=ceil((overlay_ind-ov_clim(1))./diff(ov_clim)*255+1);
1231                       
1232                        sz = size(overlay_ind);
1233                        overlay_im = zeros([sz(1) sz(2) 3],'single');
1234                        overlay_im(:,:,1)= reshape(ov_cmap(overlay_ind,1),sz);
1235                        overlay_im(:,:,2)= reshape(ov_cmap(overlay_ind,2),sz);
1236                        overlay_im(:,:,3)= reshape(ov_cmap(overlay_ind,3),sz);
1237                  else
1238                        overlay_im = overlay_data;
1239                  end
1240                 
1241                  overlay_alpha = zeros(size(overlay_ind));
1242                  overlay_alpha(overlay_alpha_clim) = ov_alpha_val;
1243                  overlay_alpha(overlay_alpha_th) = 0;
1244                 
1245                  h=image('parent',overlay_ax,...
1246                        'cdata',overlay_im,...
1247                        'cdatamapping','scaled',...
1248                        'AlphaDataMapping','none',...
1249                        'AlphaData',overlay_alpha,...
1250                        'visible','on');
1251                 
1252                end
1253               
1254        %% Check Clim
1255        if isempty(Clim_in)
1256          clim = [min(min(imdata)) max(max(imdata))];
1257          set(ax,'clim',clim)
1258        elseif size(Clim_in,1)>1
1259          set(ax,'clim',Clim_in(Dat.SliceInd(count),:))
1260        else
1261          clim = Clim_in;
1262          set(ax,'clim',clim)
1263        end
1264       
1265        % Draw ROIs
1266        if drawRois
1267          for tt=1:length(roi_ind)
1268            if Dat.isDataMixed
1269              roidata = ROI(roi_ind(tt)).voxels{Dat.SliceInd(count)};
1270            else
1271              if sliceDir==1
1272                roidata = ROI(roi_ind(tt)).voxels{1}(:,:,Dat.SliceInd(count),Dat.currentVol);
1273              elseif sliceDir==2
1274                roidata = squeeze(ROI(roi_ind(tt)).voxels{1}(:,Dat.SliceInd(count),:,Dat.currentVol));
1275              else
1276                roidata = squeeze(ROI(roi_ind(tt)).voxels{1}(Dat.SliceInd(count),:,:,Dat.currentVol));
1277              end
1278              if isempty(find(roidata))
1279                continue;
1280              end
1281                        end
1282                       
1283                        if strcmpi(get(fh,'renderer'),'opengl')
1284                          roidata=uint8(roidata);
1285                          cdata = zeros([size(roidata) 3],'uint8');
1286                          if ROI(roi_ind(tt)).color(1)~=0
1287                                cdata(:,:,1) = roidata*ROI(roi_ind(tt)).color(1);
1288                          end
1289                          if ROI(roi_ind(tt)).color(2)~=0
1290                                cdata(:,:,2) = roidata*ROI(roi_ind(tt)).color(2);
1291                          end
1292                          if ROI(roi_ind(tt)).color(3)~=0
1293                                cdata(:,:,3) = roidata*ROI(roi_ind(tt)).color(3);
1294                          end
1295                          alphadata=double(roidata)*roiTransp;
1296                         
1297                          h=image('parent',roi_ax,'cdata',cdata,...
1298                                'AlphaDataMapping','none',...
1299                                'cdatamapping','scaled',...
1300                                'AlphaData',alphadata,...
1301                                'visible','on');
1302                        end
1303                         
1304                        if showRoiEdges
1305                          B=bwboundaries(roidata,4,'holes');
1306                          for jj=1:length(B)
1307                                boundary = B{jj};
1308                                line('parent',ax,...
1309                                  'xdata',boundary(:,2),'ydata',boundary(:,1),...
1310                                  'color',ROI(roi_ind(tt)).color./255,...
1311                                  'tag','roiedge',...
1312                                  'linewidth',0.5,...
1313                                  'linestyle','-',...
1314                                  'hittest','off');
1315                          end % for jj=1:length(B)
1316                        end
1317          end % for tt=1:length(roi_ind)
1318        end % if drawRois
1319       
1320        % Draw slice number and filename
1321        if drawSliceNbr || drawFileName
1322          if (rows*cols)<=50
1323            fontsz=8;
1324          elseif (rows*cols)>50 & (rows*cols)<100
1325            fontsz=7;
1326          else
1327            fontsz=6;
1328          end
1329          if drawSliceNbr && drawFileName
1330            if Dat.isDataMixed
1331              fname = DATA{Dat.SliceInd(count)}.HDR.fname;
1332              fpath = DATA{Dat.SliceInd(count)}.HDR.fpath;
1333            else
1334              fname=DATA{1}.HDR.fname;
1335              fpath = DATA{1}.HDR.fpath;
1336            end
1337            if strcmp(fname,'fid')
1338              [fp,fn,fe]=fileparts(fpath(1:end-1));
1339              fname = [fn,fe];
1340            end
1341            slicetxt = sprintf('%03d: %s',Dat.SliceInd(count),fname);
1342          elseif drawFileName
1343            if Dat.isDataMixed
1344              fname = DATA{Dat.SliceInd(count)}.HDR.fname;
1345              fpath = DATA{Dat.SliceInd(count)}.HDR.fpath;
1346            else
1347              fname=DATA{1}.HDR.fname;
1348              fpath = DATA{1}.HDR.fpath;
1349            end
1350            if strcmp(fname,'fid')
1351              [fp,fn,fe]=fileparts(fpath(1:end-1));
1352              fname = [fn,fe];
1353            end
1354            slicetxt = fname;
1355          elseif drawSliceNbr
1356            slicetxt = sprintf('%03d',Dat.SliceInd(count));
1357          end
1358          tx_slice=text('parent',ax,...
1359                        'units','normal',...
1360                        'position',[0.01 0.99],...
1361                        'verticalalign','top',...
1362                        'horizontalalign','left',...
1363                        'interpreter','none',...
1364                        'string',slicetxt,...
1365                        'backgroundcolor','w',...
1366                        'clipping','off',...
1367                        'fontsize',fontsz);
1368        end
1369       
1370% $$$         % Draw file name text
1371% $$$         if drawFileName
1372% $$$           if (rows*cols)<=50
1373% $$$             fontsz=8;
1374% $$$           elseif (rows*cols)>50 & (rows*cols)<100
1375% $$$             fontsz=7;
1376% $$$           else
1377% $$$             fontsz=6;
1378% $$$           end
1379% $$$           if drawSliceNbr
1380% $$$             tmp_ext=get(tx_nbr,'extent');
1381% $$$           else
1382% $$$             tmp_ext=[0.01 0.99 0 0];
1383% $$$           end
1384% $$$           if Dat.isDataMixed
1385% $$$             fname = DATA{Dat.SliceInd(count)}.HDR.fname;
1386% $$$             fpath = DATA{Dat.SliceInd(count)}.HDR.fpath;
1387% $$$           else
1388% $$$             fname=DATA{1}.HDR.fname;
1389% $$$             fpath = DATA{1}.HDR.fpath;
1390% $$$           end
1391% $$$           if strcmp(fname,'fid')
1392% $$$             [fp,fn,fe]=fileparts(fpath(1:end-1));
1393% $$$             fname = [fn,fe];
1394% $$$           end
1395% $$$           tx_fname=text('parent',ax,...
1396% $$$                         'units','normal',...
1397% $$$                         'position',[tmp_ext(1)+tmp_ext(3) 0.99],...
1398% $$$                         'verticalalign','top',...
1399% $$$                         'horizontalalign','left',...
1400% $$$                         'interpreter','none',...
1401% $$$                         'string',fname,...
1402% $$$                         'backgroundcolor','w',...
1403% $$$                         'clipping','off',...
1404% $$$                         'fontsize',fontsz);
1405% $$$         end
1406       
1407        count=count+1;
1408      end % if count<=length(Dat.
1409    end % for kk=1:cols
1410  end % for ii=1:rows
1411 
1412 
1413  delete(wait_h)
1414 
1415% Draw separate files
1416%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1417else
1418 
1419  % Get file extension
1420  fext_val = get(H.FILE_FORMAT_POPUP,'value');
1421  if fext_val==1
1422    fext = 'jpg';
1423    print_type = 'jpeg';
1424    quality = sprintf('%02d',quality);
1425  elseif fext_val==2
1426    fext = 'tif';
1427    quality = '';
1428    if useCompression
1429      print_type = 'tiff';
1430    else
1431      print_type = 'tiffnocompression';
1432    end
1433  elseif fext_val==3
1434    fext = 'png';
1435    print_type = 'png';
1436    quality = '';
1437  elseif fext_val==4
1438    fext = 'bmp';
1439    print_type = 'bmp';
1440    quality = '';
1441  elseif fext_val==5
1442    fext = 'eps';
1443    print_type = 'epsc2';
1444    quality = '';
1445  end
1446
1447  % Create file names
1448  fnames={};
1449  for ii=1:length(Dat.SliceInd)
1450    fnames{ii}=sprintf('%s_%03d.%s',filePrefix,Dat.SliceInd(ii),fext);
1451  end
1452
1453  % Get file names from the output directory
1454  tmp=dir(outdir);
1455  outdir_files={tmp(~[tmp(:).isdir]).name};
1456
1457  if ~isunix % Check file names, in windows ignore case
1458    ind=ismember(lower(fnames),lower(outdir_files));
1459  else
1460    ind=ismember(fnames,outdir_files);
1461  end
1462  if any(ind)
1463    % Warn if some files are about to be overwritten
1464    overwrited_files = {fnames{ind}};
1465
1466    % Limit the file list to 20 files
1467    if length(overwrited_files)>20
1468      overwrited_files = {overwrited_files{1:20}};
1469      overwrited_files{end+1}='...';
1470    end
1471
1472    resp=questdlg({['The following files already exist in the output directory' ...
1473      ' "',outdir,'"'],'','(NOTE: max. 20 files shown here)','',...
1474      overwrited_files{:},'',...
1475      'Do you want to overwrite these files?'},...
1476      'Overwrite Existing Files?','Overwrite','Abort','Abort');
1477    if strcmpi(resp,'Abort')
1478      return
1479    end
1480  end
1481
1482  % Initialize waitbar
1483  wbar_h = aedes_wbar(0,sprintf('Creating %s-image %d/%d to folder\n"%s"',...
1484    upper(fext),0,length(fnames),outdir));
1485
1486  % Print images to files
1487  for ii=1:length(Dat.SliceInd)
1488
1489    % Initialize waitbar
1490    aedes_wbar(ii/length(fnames),wbar_h,sprintf('Creating %s-image %d/%d to folder\n"%s"',...
1491      upper(fext),ii,length(fnames),...
1492      outdir));
1493
1494
1495    % Image data
1496    if Dat.isDataMixed
1497      imdata = DATA{Dat.SliceInd(ii)}.FTDATA;
1498    else
1499      if sliceDir==1
1500        imdata = DATA{1}.FTDATA(:,:,Dat.SliceInd(ii),Dat.currentVol);
1501        if drawOverlay
1502          if overlay.isOverlayRGB
1503            overlay_data = squeeze(overlay.ImageOverlay(:,:,Dat.SliceInd(ii),:));
1504          else
1505            overlay_data = overlay.ImageOverlay(:,:,Dat.SliceInd(ii),Dat.currentVol);
1506          end
1507        end
1508      elseif sliceDir==2
1509        imdata = squeeze(DATA{1}.FTDATA(:,Dat.SliceInd(ii),:,Dat.currentVol));
1510        if drawOverlay
1511          if overlay.isOverlayRGB
1512            overlay_data = squeeze(overlay.ImageOverlay(:,Dat.SliceInd(ii),:,:));
1513          else
1514            overlay_data = squeeze(overlay.ImageOverlay(:,Dat.SliceInd(ii),:,Dat.currentVol));
1515          end
1516        end
1517      else
1518        imdata = squeeze(DATA{1}.FTDATA(Dat.SliceInd(ii),:,:,Dat.currentVol));
1519        if drawOverlay
1520          if overlay.isOverlayRGB
1521            overlay_data = squeeze(overlay.ImageOverlay(Dat.SliceInd(ii),:,:,:));
1522          else
1523            overlay_data = squeeze(overlay.ImageOverlay(Dat.SliceInd(ii),:,:,Dat.currentVol));
1524          end
1525        end
1526      end
1527    end
1528
1529    sz = size(imdata);
1530
1531    % Create invisible figure
1532    if drawColorbar
1533      sz(2)=sz(2)+65;
1534    end
1535    fh = figure('position',[300 200 sz(2) sz(1)],...
1536      'visible','off',...
1537      'inverthardcopy','off',...
1538      'renderer','opengl',...
1539      'paperpositionmode','auto',...
1540      'color','w');
1541    if ( roiTransp==0 | not(drawRois)) && not(drawOverlay)
1542      set(fh,'renderer','painters');
1543    end
1544
1545    % Create axes
1546    if isempty(Clim_in)
1547      clim = [min(min(imdata)) max(max(imdata))];
1548    elseif size(Clim_in,1)>1
1549      clim = Clim_in(Dat.SliceInd(ii),:);
1550    else
1551      clim = Clim_in;
1552    end
1553    ax = axes('parent',fh,...
1554      'units','normal',...
1555      'position',[0 0 1 1],...
1556      'clim',clim,...
1557      'xlim',[0.5 sz(2)+0.5],...
1558      'ylim',[0.5 sz(1)+0.5],...
1559      'ydir','reverse',...
1560      'visible','off');
1561    if strcmpi(get(fh,'renderer'),'opengl')
1562      roi_ax = axes('parent',fh,...
1563        'units','normal',...
1564        'position',[0 0 1 1],...
1565        'visible','off',...
1566        'ydir','reverse',...
1567        'xlim',[0.5 sz(2)+0.5],...
1568        'ylim',[0.5 sz(1)+0.5]);
1569      overlay_ax = axes('parent',fh,...
1570        'units','normal',...
1571        'units','normal',...
1572        'position',[0 0 1 1],...
1573        'visible','off',...
1574        'ydir','reverse',...
1575        'xlim',[0.5 sz(2)+0.5],...
1576        'ylim',[0.5 sz(1)+0.5]);
1577    end
1578
1579    % Create image
1580    im = image('parent',ax,...
1581      'cdatamapping','scaled',...
1582      'cdata',imdata);
1583    set(fh,'colormap',colmap)
1584
1585    % Draw Colorbar
1586    if drawColorbar
1587      colorbar('peer',ax,'East',...
1588        'fontsize',7);
1589    end
1590
1591    % Plot overlay
1592    if drawOverlay
1593      if ~overlay.isOverlayRGB
1594        ov_cmap = overlay.ImageOverlayCmap;
1595        ov_clim = round(((overlay.ImageOverlayClim-overlay.ImOverlayMin)*256)./...
1596          (overlay.ImOverlayMax-overlay.ImOverlayMin));
1597        if ov_clim(1)==ov_clim(2)
1598          if ov_clim(1)==0
1599            ov_clim(2)=1;
1600          elseif ov_clim(1)==256
1601            ov_clim(1)=255;
1602          end
1603        end
1604        ov_thold = round(((overlay.ImageOverlayThold-overlay.ImOverlayMin)*256)/...
1605          (overlay.ImOverlayMax-overlay.ImOverlayMin));
1606      end
1607      ov_alpha_val = overlay.ImageOverlayAlpha;
1608
1609      if ~overlay.isOverlayRGB
1610        % Convert indexed image to RGB image
1611        %slice1_ind=overlay.ImageOverlay(:,:,Dat.Slices(1),Dat.CurrentVol);
1612        overlay_ind=double(overlay_data);
1613
1614        % Get thresholded alpha indices
1615        if overlay.ImageOverlayTholdDirPos==1
1616          overlay_alpha_th = overlay_ind<ov_thold;
1617        else
1618          overlay_alpha_th = overlay_ind>ov_thold;
1619        end
1620
1621        % Get clim alpha indices
1622        overlay_alpha_clim = ( overlay_ind>=ov_clim(1) & overlay_ind<=ov_clim(2) );
1623
1624        overlay_ind(overlay_ind<ov_clim(1))=ov_clim(1);
1625        overlay_ind(overlay_ind>ov_clim(2))=ov_clim(2);
1626
1627        overlay_ind=ceil((overlay_ind-ov_clim(1))./diff(ov_clim)*255+1);
1628
1629        sz = size(overlay_ind);
1630        overlay_im = zeros([sz(1) sz(2) 3],'single');
1631        overlay_im(:,:,1)= reshape(ov_cmap(overlay_ind,1),sz);
1632        overlay_im(:,:,2)= reshape(ov_cmap(overlay_ind,2),sz);
1633        overlay_im(:,:,3)= reshape(ov_cmap(overlay_ind,3),sz);
1634      else
1635        overlay_im = overlay_data;
1636      end
1637
1638      overlay_alpha = zeros(size(overlay_ind));
1639      overlay_alpha(overlay_alpha_clim) = ov_alpha_val;
1640      overlay_alpha(overlay_alpha_th) = 0;
1641
1642      h=image('parent',overlay_ax,...
1643        'cdata',overlay_im,...
1644        'cdatamapping','scaled',...
1645        'AlphaDataMapping','none',...
1646        'AlphaData',overlay_alpha,...
1647        'visible','on');
1648    end
1649
1650    % Draw ROIs
1651    if drawRois
1652      for kk=1:length(roi_ind)
1653        if Dat.isDataMixed
1654          roidata = ROI(roi_ind(kk)).voxels{Dat.SliceInd(ii)};
1655        else
1656          if sliceDir==1
1657            roidata = ROI(roi_ind(kk)).voxels{1}(:,:,Dat.SliceInd(ii),Dat.currentVol);
1658          elseif sliceDir==2
1659            roidata = squeeze(ROI(roi_ind(kk)).voxels{1}(:,Dat.SliceInd(ii),:,Dat.currentVol));
1660          else
1661            roidata = squeeze(ROI(roi_ind(kk)).voxels{1}(Dat.SliceInd(ii),:,:,Dat.currentVol));
1662          end
1663          if isempty(find(roidata))
1664            continue;
1665          end
1666        end
1667
1668        if strcmpi(get(fh,'renderer'),'opengl')
1669          roidata=uint8(roidata);
1670          cdata = zeros([size(roidata) 3],'uint8');
1671          if ROI(roi_ind(kk)).color(1)~=0
1672            cdata(:,:,1) = roidata*ROI(roi_ind(kk)).color(1);
1673          end
1674          if ROI(roi_ind(kk)).color(2)~=0
1675            cdata(:,:,2) = roidata*ROI(roi_ind(kk)).color(2);
1676          end
1677          if ROI(roi_ind(kk)).color(3)~=0
1678            cdata(:,:,3) = roidata*ROI(roi_ind(kk)).color(3);
1679          end
1680          alphadata=double(roidata)*roiTransp;
1681
1682          h=image('parent',roi_ax,'cdata',cdata,...
1683            'AlphaDataMapping','none',...
1684            'cdatamapping','scaled',...
1685            'AlphaData',alphadata,...
1686            'visible','on');
1687        end
1688
1689        if showRoiEdges
1690          B=bwboundaries(roidata,4,'holes');
1691          for jj=1:length(B)
1692            boundary = B{jj};
1693            line('parent',ax,...
1694              'xdata',boundary(:,2),'ydata',boundary(:,1),...
1695              'color',ROI(roi_ind(kk)).color./255,...
1696              'tag','roiedge',...
1697              'linewidth',0.5,...
1698              'linestyle','-',...
1699              'hittest','off');
1700          end
1701        end
1702      end
1703    end
1704
1705    % Draw slice number
1706    if drawSliceNbr
1707      if drawFileName
1708        slicenbr = sprintf('%03d:',Dat.SliceInd(ii));
1709      else
1710        slicenbr = sprintf('%03d',Dat.SliceInd(ii));
1711      end
1712      tx_nbr=text('parent',ax,...
1713        'units','normal',...
1714        'position',[0.015 0.965],...
1715        'interpreter','none',...
1716        'string',slicenbr,...
1717        'backgroundcolor','w',...
1718        'clipping','off',...
1719        'fontsize',7);
1720    end
1721
1722    % Draw file name text
1723    if drawFileName
1724      if drawSliceNbr
1725        tmp_ext=get(tx_nbr,'extent');
1726      else
1727        tmp_ext=[0.015 0.965 0 0];
1728      end
1729      if Dat.isDataMixed
1730        fname = DATA{Dat.SliceInd(ii)}.HDR.fname;
1731        fpath = DATA{Dat.SliceInd(ii)}.HDR.fpath;
1732      else
1733        fname=DATA{1}.HDR.fname;
1734        fpath = DATA{1}.HDR.fpath;
1735      end
1736      if strcmp(fname,'fid')
1737        [fp,fn,fe]=fileparts(fpath(1:end-1));
1738        fname = [fn,fe];
1739      end
1740      tx_fname=text('parent',ax,...
1741        'units','normal',...
1742        'position',[tmp_ext(1)+tmp_ext(3) 0.965],...
1743        'interpreter','none',...
1744        'string',fname,...
1745        'backgroundcolor','w',...
1746        'clipping','off',...
1747        'fontsize',7);
1748    end
1749
1750    % $$$     % Draw slice number
1751    % $$$     if drawSliceNbr
1752    % $$$       tx=text('parent',ax,...
1753    % $$$               'units','normal',...
1754    % $$$               'position',[0.015 0.965],...
1755    % $$$               'string',sprintf('%03d',Dat.SliceInd(ii)),...
1756    % $$$               'backgroundcolor','w',...
1757    % $$$               'fontsize',7);
1758    % $$$     end
1759
1760    % Print figure
1761    print(fh,['-d',print_type,quality],['-r',resolution],[outdir,fnames{ii}]);
1762
1763    delete(fh);
1764  end
1765
1766  % Delete waitbar
1767  delete(wbar_h)
1768 
1769end
1770
1771end % function l_CheckOptions(h,
1772
1773%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1774% Close figure
1775%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1776function l_Close(h,evd)
1777
1778% Store figure handle before clearing variables
1779fig_h = H.MAINFIG;
1780
1781% Clear public variables
1782clear H Dat DATA ROI
1783
1784% Close figure
1785delete(fig_h);
1786
1787end % function l_Close(h,
1788
1789end
Note: See TracBrowser for help on using the repository browser.

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