source: aedes_export_gui.m @ 200

Last change on this file since 200 was 200, checked in by tjniskan, 7 years ago
  • Fixed a Windows related bug in aedes_export_gui.m
  • Fixed reading of 2dseq data with more that 4 dimensions

M aedes_readbruker.m
M aedes_export_gui.m
M aedes_revision.m

File size: 58.0 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       
123  fig_w = 350;
124  fig_h = 585;
125        fig_location = aedes_dialoglocation([fig_w,fig_h]);
126        fig_pos = [fig_location(1) fig_location(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','aedes_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                        'enable','on','value',[1:length(ROI)])
473                set(H.DRAW_ROIS,'value',1)
474  end
475  tmp=get(H.DRAW_ROIS,'position');
476  H.DRAW_SLICENBR = uicontrol('parent',H.OPTIONS_UIPANEL,...
477                              'units','pixel',...
478                              'position',[tmp(1) tmp(2)-60 130 20],...
479                              'style','checkbox',...
480                              'string','Draw Slice Nbr.',...
481                              'value',0,...
482                                                          'backgroundcolor',GD.col.frame);
483  tmp=get(H.DRAW_SLICENBR,'position');
484  H.DRAW_FILENAME = uicontrol('parent',H.OPTIONS_UIPANEL,...
485                              'units','pixel',...
486                              'position',[tmp(1) tmp(2)-23 130 20],...
487                              'style','checkbox',...
488                              'string','Draw File Name',...
489                              'value',0,...
490                                                          'backgroundcolor',GD.col.frame);
491  tmp=get(H.DRAW_FILENAME,'position');
492  H.DRAW_COLORBAR = uicontrol('parent',H.OPTIONS_UIPANEL,...
493                              'units','pixel',...
494                              'position',[tmp(1) tmp(2)-23 130 20],...
495                              'style','checkbox',...
496                              'string','Draw Colorbar',...
497                              'value',0,...
498                                                          'backgroundcolor',GD.col.frame);
499  tmp=get(H.DRAW_COLORBAR,'position');
500  H.DRAW_OVERLAY = uicontrol('parent',H.OPTIONS_UIPANEL,...
501                              'units','pixel',...
502                              'position',[tmp(1) tmp(2)-23 130 20],...
503                              'style','checkbox',...
504                              'string','Draw Overlay',...
505                              'value',0,...
506                                                          'backgroundcolor',GD.col.frame);
507  if isempty(overlay)
508                set(H.DRAW_OVERLAY,'enable','off')
509        else
510                set(H.DRAW_OVERLAY,'value',1)
511  end
512  tmp=get(H.OPTIONS_UIPANEL,'position');
513 
514  % Export and Cancel buttons
515  H.EXPORT_BTN = uicontrol('parent',H.MAINFIG,...
516                       'units','pixel',...
517                       'position',[tmp(1) tmp(2)-30-5 77.5 30],...
518                       'string','Export...',...
519                       'style','pushbutton',...
520                       'callback',@l_CheckOptions);
521  tmp = get(H.EXPORT_BTN,'position');
522  H.CANCEL_BTN = uicontrol('parent',H.MAINFIG,...
523                           'units','pixel',...
524                           'position',[tmp(1)+tmp(3)+5 tmp(2:4)],...
525                           'string','Cancel',...
526                           'style','pushbutton',...
527                           'callback','close(gcbf)');
528 
529  % Initialize some internal variables
530  Dat.SliceInd = 1:Dat.XSize;
531 
532 
533end % function l_DrawGui(h,
534
535%%%%%%%%%%%%%%%%%%%%%%%%%%%%
536%
537% GUI callbacks
538%
539%%%%%%%%%%%%%%%%%%%%%%%%%%%%
540function l_ChangeFileFormat(h,evd)
541
542popupval = get(H.FILE_FORMAT_POPUP,'value');
543
544if popupval==1
545  set([H.QUALITY_TX,H.QUALITY_EDIT],'visible','on')
546  set(H.COMPRESSION_CHBOX,'visible','off')
547elseif popupval==2
548  set([H.QUALITY_TX,H.QUALITY_EDIT],'visible','off')
549  set(H.COMPRESSION_CHBOX,'visible','on')
550else
551  set([H.QUALITY_TX,H.QUALITY_EDIT,H.COMPRESSION_CHBOX],...
552      'visible','off')
553end
554 
555
556end % function l_ChangeFileFormat(h,
557
558function l_FilePrefixEditKeyPress(h,evd)
559
560% This ugly stabbing of Matlab doesn't work anymore correctly with newer
561% versions so return immediately...
562return 
563
564% Switch focus between uicontrols (a Matlab bug workaround)
565uicontrol(H.DUMMYUICH)
566uicontrol(H.FILEPREFIX_EDIT)
567
568% Call drawnow twice to refresh the editbox (yet another Matlab bug
569% workaround)
570drawnow
571drawnow
572
573% Query the editbox string value
574str=get(H.FILEPREFIX_EDIT,'string');
575if isempty(str)
576  return
577end
578
579% If the string contains forbidden characters, display error and remove
580% the last character
581ind=ismember(str,'\/:*?"<>|');
582if any(ind)
583  warndlg({'A file name cannot contain any of the following characters:',...
584           '','\/:*?"<>|'},'Forbidden character entered.','modal')
585  str(ind)=[];
586  set(H.FILEPREFIX_EDIT,'string',str)
587  uicontrol(H.DUMMYUICH)
588  uicontrol(H.FILEPREFIX_EDIT)
589  drawnow
590  drawnow
591end
592
593
594end % function l_FilePrefixEditKeyPress(h,
595
596function l_DrawRoisCheckBoxCB(h,evd)
597
598if get(H.DRAW_ROIS,'value')
599  set(H.ROI_LBOX,'enable','on')
600else
601  set(H.ROI_LBOX,'enable','off')
602end
603
604end % function l_DrawRoisCheckBoxCB(h,
605
606%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
607function l_FilesSelectionCB(h,evd)
608
609if ~isempty(evd)
610  if evd.NewValue==H.MOSAIC_FILES
611    child_h = findobj(H.EXPORT_TYPE,'type','uicontrol');
612    %child_h=get(H.EXPORT_TYPE,'children');
613    %child_h = child_h(child_h~=H.FILETYPE_OPTIONS);
614    set(child_h,'enable','off')
615    set([H.ROWS_TX,H.ROWS_EDIT,H.COLS_TX,H.COLS_EDIT],'enable','on')
616    %set([H.FILE_FORMAT_TX,H.FILE_FORMAT_POPUP,...
617    %    H.OUTDIR_TX,H.OUTDIR_EDIT,H.BROWSE_BTN],'enable','off')
618  else
619    child_h = findobj(H.EXPORT_TYPE,'type','uicontrol');
620    %child_h=get(H.EXPORT_TYPE,'children');
621    %child_h = child_h(child_h~=H.FILETYPE_OPTIONS);
622    set(child_h,'enable','on')
623    %set(get(H.EXPORT_TYPE,'children'),'enable','on')
624    set([H.ROWS_TX,H.ROWS_EDIT,H.COLS_TX,H.COLS_EDIT],'enable','off')
625    %set([H.FILE_FORMAT_TX,H.FILE_FORMAT_POPUP,...
626    %    H.OUTDIR_TX,H.OUTDIR_EDIT,H.BROWSE_BTN],'enable','on')
627  end
628end
629
630end % function l_FilesSelectionCB
631
632%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
633function l_ChangeResolutionQuality(h,evd)
634
635if h==H.RESOLUTION_EDIT
636  res_val=floor(str2num(get(H.RESOLUTION_EDIT,'string')));
637  if isempty(res_val) || ~isreal(res_val) || res_val<0 || res_val>1200
638    hh=errordlg(['Invalid value for resolution! The value must be between ' ...
639                 '0-1200 dpi.'],'Error!','modal');
640    set(H.RESOLUTION_EDIT,'string',get(H.RESOLUTION_EDIT,'userdata'))
641    return
642  else
643    set(H.RESOLUTION_EDIT,'string',num2str(res_val),...
644                      'userdata',num2str(res_val))
645  end
646elseif h==H.QUALITY_EDIT
647  qval = floor(str2num(get(H.QUALITY_EDIT,'string')));
648  if isempty(qval) || ~isreal(qval) || qval<1 || qval>100
649    hh=errordlg('Invalid value for quality! The value must be between 1-100%.',...
650                'Error!','modal');
651    set(H.QUALITY_EDIT,'string',get(H.QUALITY_EDIT,'userdata'))
652    return
653  else
654    set(H.QUALITY_EDIT,'string',num2str(qval),...
655                      'userdata',num2str(qval))
656  end
657end
658
659end % function l_ChangeResolutionQuality(h,
660
661%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
662function l_CheckMosaic(h,evd)
663
664if ~isempty(h)
665
666  % Check that the value is numeric
667  val = str2num(get(h,'string'));
668  if isempty(val) || ~isreal(val) || val<=0
669    errordlg('Invalid row/column value!','Error. Invalid value!','modal');
670    set(H.COLS_EDIT,'string',get(H.COLS_EDIT,'userdata'))
671    set(H.ROWS_EDIT,'string',get(H.ROWS_EDIT,'userdata'))
672    return
673  end
674
675  total_sz = length(Dat.SliceInd);
676 
677  if val>total_sz
678    val = total_sz;
679  end
680
681  % Set values for mosaic rows/columns
682  if h==H.ROWS_EDIT
683    rows = val;
684    cols = ceil(total_sz/rows);
685    set(H.COLS_EDIT,'string',num2str(cols),...
686                    'userdata',num2str(cols))
687    set(H.ROWS_EDIT,'string',num2str(val))
688  elseif h==H.COLS_EDIT
689    cols = val;
690    rows = ceil(total_sz/cols);
691    set(H.ROWS_EDIT,'string',num2str(rows),...
692                    'userdata',num2str(rows))
693    set(H.COLS_EDIT,'string',num2str(val))
694  end
695 
696else
697 
698% $$$   % Keep number of rows constant and change the number of columns
699% $$$   total_sz = length(Dat.SliceInd);
700% $$$   val = str2num(get(H.ROWS_EDIT,'string'));
701% $$$   if val>total_sz
702% $$$     val = total_sz;
703% $$$   end
704% $$$   rows = val;
705% $$$   cols = ceil(total_sz/rows);
706% $$$   set(H.COLS_EDIT,'string',num2str(cols),...
707% $$$                   'userdata',num2str(cols))
708% $$$   set(H.ROWS_EDIT,'string',num2str(val))
709 
710  % Keep number of columns constant and change the number of rows
711  total_sz = length(Dat.SliceInd);
712  val = str2num(get(H.COLS_EDIT,'string'));
713  if val>total_sz
714    val = total_sz;
715  end
716  cols = val;
717  rows = ceil(total_sz/cols);
718  set(H.ROWS_EDIT,'string',num2str(rows),...
719                  'userdata',num2str(rows))
720  set(H.COLS_EDIT,'string',num2str(val))
721 
722end
723
724end % function l_CheckMosaic(h,
725
726%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
727function l_CheckOutputDir(h,evd)
728
729if h==H.BROWSE_BTN % Called from browse btn
730 
731  try
732    filepath=getpref('Aedes','ExportFileDir');
733  catch
734    filepath='';
735  end
736  filepath = uigetdir(filepath);
737  if isequal(filepath,0)
738    return
739  end
740  filepath = [filepath,filesep];
741  setpref('Aedes','ExportFileDir',filepath)
742  set(H.OUTDIR_EDIT,'string',filepath)
743 
744elseif h==H.OUTDIR_EDIT % Called from outdir edit
745 
746  filepath=get(H.OUTDIR_EDIT,'string');
747 
748  % Check if the inputted directory exists
749  if ~isdir(filepath)
750    errordlg({'The export path','',...
751              ['"',filepath,'"'],'','does not exist!'},...
752             'Error! File path does not exist!','modal')
753    return
754  end
755 
756  if filepath(end)~=filesep
757    filepath(end+1)=filesep;
758    set(H.OUTDIR_EDIT,'string',filepath)
759  end
760 
761end
762
763end % function l_CheckOutputDir(h,
764
765%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
766function l_CheckCustomSliceSelection(h,evd)
767
768% Get selected direction
769selobj=get(H.RADIOGRP_DIR,'selectedobject');
770if selobj==H.XDIR_RADIO
771  sz = Dat.XSize;
772elseif selobj==H.YDIR_RADIO
773  sz = Dat.YSize;
774else
775  sz = Dat.ZSize;
776end
777
778%% Get custom string
779str = get(H.CUSTOM_EDIT,'string');
780if isempty(str)
781  hh=warndlg('The custom text field cannot be empty!',...
782            'Invalid expression','modal');
783  set(H.CUSTOM_EDIT,'string',get(H.CUSTOM_EDIT,'userdata'))
784  return
785end
786
787%% Check that the string contains only valid characters
788tmp_ind=ismember(str,'0123456789end:,*+-/');
789if ~all(tmp_ind)
790  hh=warndlg(['The custom text "' str '" contains invalid characters'],...
791            'Invalid expression','modal');
792  set(H.CUSTOM_EDIT,'string',get(H.CUSTOM_EDIT,'userdata'))
793  return
794end
795
796% replace 'end' statement with ROI size
797custom_str=strrep(str,'end','sz');
798slice_ind=[];
799
800% Try to evaluate the index string
801try
802  eval(['slice_ind=[' custom_str '];']);
803catch
804  hh=warndlg({['Could not evaluate expression "' custom_str '".'],...
805             ['Custom string has to be a valid Matlab vector expression.']},...
806            'Could not evaluate expression','modal');
807  set(H.CUSTOM_EDIT,'string',get(H.CUSTOM_EDIT,'userdata'))
808  return
809end
810
811% Sort indices and make sure that all indices are unique
812%slice_ind=unique(slice_ind);
813
814% Make sure that min>=1 and max<=sz
815if max(slice_ind)>sz
816  hh=warndlg({['Could not evaluate expression "' custom_str '".'],...
817             'Maximum slice index exceeds the number of slices.'},...
818            'Could not evaluate expression','modal');
819  set(H.CUSTOM_EDIT,'string',get(H.CUSTOM_EDIT,'userdata'))
820  return
821end
822if min(slice_ind)<1
823  hh=warndlg({['Could not evaluate expression "' custom_str '".'],...
824             ['Slice indices have to be larger than zero.']},...
825            'Could not evaluate expression','modal');
826  set(H.CUSTOM_EDIT,'string',get(H.CUSTOM_EDIT,'userdata'))
827  return
828end
829
830Dat.SliceInd = slice_ind;
831set(H.CUSTOM_EDIT,'userdata',str)
832
833l_CheckMosaic([],[])
834
835end % function l_CheckCustomSliceSelection(h,
836
837%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
838function l_DirChangeFcn(h,evd)
839
840set(H.CUSTOM_EDIT,'string','1:end')
841if get(H.XDIR_RADIO,'value')==1
842  Dat.SliceInd = 1:Dat.XSize;
843elseif get(H.YDIR_RADIO,'value')==1
844  Dat.SliceInd = 1:Dat.YSize;
845else
846  Dat.SliceInd = 1:Dat.ZSize;
847end
848
849l_CheckMosaic([],[])
850
851end % function l_DirChangeFcn(h,
852
853%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
854function l_SliceSelection(h,evd)
855
856if h==H.RADIOGRP_SLICE
857  if evd.NewValue==H.ALL_SLICES
858    % Disable Custom slice editbox if All Slices is selected
859    set(H.CUSTOM_EDIT,'enable','off')
860    if get(H.XDIR_RADIO,'value')==1
861      Dat.SliceInd = 1:Dat.XSize;
862    elseif get(H.YDIR_RADIO,'value')==1
863      Dat.SliceInd = 1:Dat.YSize;
864    else
865      Dat.SliceInd = 1:Dat.ZSize;
866    end
867  else
868    set(H.CUSTOM_EDIT,'enable','on')
869  end
870end
871
872l_CheckMosaic([],[])
873
874end % function l_SliceSelection(h,
875
876%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
877% Check Options and continue
878%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
879function l_CheckOptions(h,evd)
880
881% Check output dir
882if get(H.SEP_FILES,'value')==1
883  createMosaic = false;
884  outdir = get(H.OUTDIR_EDIT,'string');
885  if ~isdir(outdir)
886    hh=errordlg({'The output directory',...
887               ['"',outdir,'"'],'does not exist!'},'Error!','modal');
888    return
889  end
890else
891  outdir = get(H.OUTDIR_EDIT,'string');
892  createMosaic = true;
893end
894
895if outdir(end)~=filesep
896  outdir(end+1)=filesep;
897end
898
899% Check File Format Options
900useCompression = logical(get(H.COMPRESSION_CHBOX,'value'));
901resolution = get(H.RESOLUTION_EDIT,'string');
902quality = str2num(get(H.QUALITY_EDIT,'string'));
903
904% Get file prefix (for separate files)
905filePrefix = get(H.FILEPREFIX_EDIT,'string');
906
907% If the string contains forbidden characters, display error and return
908ind=ismember(filePrefix,'\/:*?"<>|');
909if any(ind)
910  hh=warndlg({'A file name cannot contain any of the following characters:',...
911        '','\/:*?"<>|'},'Forbidden character entered.','modal');
912  uiwait(hh)
913  uicontrol(H.DUMMYUICH)
914  uicontrol(H.FILEPREFIX_EDIT)
915  drawnow
916  drawnow
917  return
918end
919
920% Check direction
921if get(H.XDIR_RADIO,'value')==1
922  sliceDir = 1;
923elseif get(H.YDIR_RADIO,'value')==1
924  sliceDir = 2;
925elseif get(H.ZDIR_RADIO,'value')==1
926  sliceDir = 3;
927end
928
929% Check additional options
930if get(H.DRAW_ROIS,'value')==1
931  drawRois = true;
932  roi_ind=get(H.ROI_LBOX,'value');
933  if isempty(roi_ind)
934    drawRois = false;
935  end
936else
937  drawRois = false;
938  roi_ind = [];
939end
940if get(H.DRAW_SLICENBR,'value')==1
941  drawSliceNbr = true;
942else
943  drawSliceNbr = false;
944end
945if get(H.DRAW_FILENAME,'value')==1
946  drawFileName = true;
947else
948  drawFileName = false;
949end
950if get(H.DRAW_COLORBAR,'value')==1
951  drawColorbar = true;
952else
953  drawColorbar = false;
954end
955if get(H.DRAW_OVERLAY,'value')==1
956  drawOverlay = true;
957else
958  drawOverlay = false;
959end
960
961% Check Colormap
962if isempty(colmap_in)
963  colmap = gray(256);
964else
965  colmap = colmap_in;
966end
967
968% % Check Clim
969% if isempty(Clim_in)
970%   colmap = gray(256);
971% else
972%   colmap = colmap_in;
973% end
974
975
976
977% Draw Mosaic figure
978%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
979if createMosaic
980 
981        %% Show wait dialog
982        [wait_h,txh]=aedes_calc_wait('Creating mosaic from slices...');
983       
984  % Estimate space for the mosaic
985  cols=str2num(get(H.COLS_EDIT,'string'));
986  rows=str2num(get(H.ROWS_EDIT,'string'));
987       
988        aedes_createmosaic(DATA,ROI,overlay,...
989                'slicedir',sliceDir,...
990                'drawslicenbr',drawSliceNbr,...
991                'drawrois',drawRois,...
992                'drawfilename',drawFileName,...
993                'drawcolorbar',drawColorbar,...
994                'drawoverlay',drawOverlay,...
995                'colormap',colmap,...
996                'cols',cols,...
997                'rows',rows,...
998                'roiind',roi_ind,...
999                'sliceind',Dat.SliceInd,...
1000                'clim',Clim_in,...
1001                'vol',Dat.currentVol,...
1002                'roitransp',roiTransp,...
1003                'showRoiEdges',showRoiEdges);
1004       
1005%       if Dat.isDataMixed
1006%     data_sz=size(DATA{Dat.SliceInd(1)}.FTDATA);
1007%   else
1008%     if sliceDir==1
1009%       data_sz=size(DATA{1}.FTDATA(:,:,Dat.SliceInd(1),Dat.currentVol));
1010%     elseif sliceDir==2
1011%       data_sz=size(squeeze(DATA{1}.FTDATA(:,Dat.SliceInd(1),:,Dat.currentVol)));
1012%     else
1013%       data_sz=size(squeeze(DATA{1}.FTDATA(Dat.SliceInd(1),:,:,Dat.currentVol)));
1014%     end
1015%       end
1016%   
1017%   % Determine figure size
1018%   scrsz = get(0,'screensize'); % Get current display resolution
1019%   scrsz(4) = scrsz(4)-45-70; % The 47px is for taskbar,
1020%   scrsz(3) = scrsz(3)-16;
1021%   gap=3;
1022%   fig_w = cols*data_sz(2)+(cols+1)*gap;
1023%   fig_h = rows*data_sz(1)+(rows+1)*gap;
1024%   
1025%   if fig_w>scrsz(3) || fig_h>scrsz(4)
1026%     
1027%     aratio_w=[fig_w fig_h]./fig_w;
1028%     aratio_h=[fig_w fig_h]./fig_h;
1029%     for ii=1:2
1030%       if fig_w>scrsz(3)
1031%         tmp=aratio_w*scrsz(3);
1032%         fig_w = tmp(1);
1033%         fig_h = tmp(2);
1034%       elseif fig_h>scrsz(4)
1035%         tmp=aratio_h*scrsz(4);
1036%         fig_w = tmp(1);
1037%         fig_h = tmp(2);
1038%       end
1039%     end
1040%   end
1041%   
1042%   %% Determine paper orientation
1043%   if fig_w>fig_h
1044%     paperorient = 'landscape';
1045%     
1046%     %% Determine paperposition
1047%     papersize = [29.7 21.0];
1048%     tmp=[fig_w,fig_h]./fig_h;
1049%     pap_h = tmp(2)*(papersize(2)-2);
1050%     pap_w = tmp(1)*(papersize(2)-2);
1051%     if pap_w>(papersize(1)-2)
1052%       pap_h=((papersize(1)-2)/pap_w)*pap_h;
1053%       pap_w = papersize(1)-2;
1054%     end
1055%     paperpos = [papersize(1)/2-pap_w/2 ...
1056%                 papersize(2)/2-pap_h/2 ...
1057%                 pap_w ...
1058%                 pap_h];
1059%   else
1060%     paperorient = 'portrait';
1061%
1062%     %% Determine paperposition
1063%     papersize = [21.0 29.7];
1064%     tmp=[fig_w,fig_h]./fig_w;
1065%     pap_h = tmp(2)*(papersize(1)-2);
1066%     pap_w = tmp(1)*(papersize(1)-2);
1067%     if pap_h>(papersize(2)-2)
1068%       pap_w=((papersize(2)-2)/pap_h)*pap_w;
1069%       pap_h = papersize(2)-2;
1070%     end
1071%     paperpos = [papersize(1)/2-pap_w/2 ...
1072%                 papersize(2)/2-pap_h/2 ...
1073%                 pap_w ...
1074%                 pap_h];
1075%   end
1076%   
1077%   
1078%   
1079%   % Draw the mosaic figure
1080%   fh = figure('position',[scrsz(3)/2-fig_w/2+4 ...
1081%                       scrsz(4)/2-fig_h/2+45 fig_w fig_h],...
1082%               'visible','on',...
1083%               'inverthardcopy','off',...
1084%               'renderer','opengl',...%'painters',...
1085%               'numbertitle','off',...
1086%               'name','Mosaic View',...
1087%               'colormap',colmap,...
1088%               'color','w',...
1089%               'papertype','a4',...
1090%               'paperpositionmode','manual',...
1091%               'paperorientation',paperorient,...
1092%               'paperunits','centimeters',...
1093%               'paperposition',paperpos);
1094%   set(fh,'paperunits','inches')
1095%   if ( roiTransp==0 | not(drawRois)) && not(drawOverlay)
1096%       set(fh,'renderer','painters');
1097%   end
1098%   
1099%   % Set resolution information in the figure
1100%   if ispref('Aedes','ExportMosaicImageResolution')
1101%       default_resolution = getpref('Aedes','ExportMosaicImageResolution');
1102%   else
1103%       default_resolution = 300;
1104%   end
1105%   setappdata(fh,'Exportsetup',struct('Resolution',default_resolution))
1106%   
1107%   %% Set header text
1108%   if ~Dat.isDataMixed
1109%     hs = getappdata(fh,'PrintHeaderHeaderSpec');
1110%     if isempty(hs)
1111%       hs = struct('dateformat','none',...
1112%                   'string',[date,',  ',...
1113%                           strrep(strrep(DATA{1}.HDR.fpath,'\','\\'),'_','\_'),...
1114%                           strrep(strrep(DATA{1}.HDR.fname,'\','\\'),'_','\_')],...
1115%                   'fontname','Times',...
1116%                   'fontsize',12,...          % in points
1117%                   'fontweight','normal',...
1118%                   'fontangle','normal',...
1119%                   'margin',15);            % in points
1120%     end
1121%     setappdata(fh,'PrintHeaderHeaderSpec',hs)
1122%   end
1123%   
1124%   
1125%   % Look for custom aspect ratio
1126%   if ispref('Aedes','ExportMosaicUseCustomAspectRatio')
1127%     data_aspectratio = getpref('Aedes','ExportMosaicUseCustomAspectRatio');
1128%   else
1129%     data_aspectratio = [1 1 1];
1130%   end
1131%   
1132%   %% images and axes
1133%   count=1;
1134%   gap_w=gap/fig_w;
1135%   gap_h=gap/fig_h;
1136%   for ii=1:rows
1137%     for kk=1:cols
1138%       ax=axes('parent',fh,...
1139%               'units','normal',...
1140%               'position',[(kk-1)*((1-(cols+1)*gap_w)/cols)+kk*gap_w ...
1141%               (rows-ii)*((1-(rows+1)*gap_h)/rows)+(rows+1-ii)*gap_h ...
1142%               (1-(cols+1)*gap_w)/cols (1-(rows+1)*gap_h)/rows],...
1143%               'visible','off',...
1144%               'ydir','reverse',...
1145%               'xtick',[],...
1146%               'ytick',[],...
1147%               'xticklabel',[],...
1148%               'yticklabel',[],...
1149%               'DataAspectRatio',data_aspectratio,...
1150%               'PlotBoxAspectRatio',[data_sz(2) data_sz(1) 1],...
1151%               'PlotBoxAspectRatioMode','manual');
1152%         if strcmpi(get(fh,'renderer'),'opengl')
1153%               roi_ax = axes('parent',fh,...
1154%                 'units','normal',...
1155%                 'position',[(kk-1)*((1-(cols+1)*gap_w)/cols)+kk*gap_w ...
1156%                 (rows-ii)*((1-(rows+1)*gap_h)/rows)+(rows+1-ii)*gap_h ...
1157%                 (1-(cols+1)*gap_w)/cols (1-(rows+1)*gap_h)/rows],...
1158%                 'visible','off',...
1159%                 'ydir','reverse',...
1160%                 'xtick',[],...
1161%                 'ytick',[],...
1162%                 'xticklabel',[],...
1163%                 'yticklabel',[],...
1164%                 'DataAspectRatio',data_aspectratio,...
1165%                 'PlotBoxAspectRatio',[data_sz(2) data_sz(1) 1],...
1166%                 'PlotBoxAspectRatioMode','manual');
1167%               overlay_ax = axes('parent',fh,...
1168%                 'units','normal',...
1169%                 'position',[(kk-1)*((1-(cols+1)*gap_w)/cols)+kk*gap_w ...
1170%                 (rows-ii)*((1-(rows+1)*gap_h)/rows)+(rows+1-ii)*gap_h ...
1171%                 (1-(cols+1)*gap_w)/cols (1-(rows+1)*gap_h)/rows],...
1172%                 'visible','off',...
1173%                 'ydir','reverse',...
1174%                 'xtick',[],...
1175%                 'ytick',[],...
1176%                 'xticklabel',[],...
1177%                 'yticklabel',[],...
1178%                 'DataAspectRatio',data_aspectratio,...
1179%                 'PlotBoxAspectRatio',[data_sz(2) data_sz(1) 1],...
1180%                 'PlotBoxAspectRatioMode','manual');
1181%         end
1182%       if count<=length(Dat.SliceInd)
1183%         
1184%         if Dat.isDataMixed
1185%           imdata=DATA{Dat.SliceInd(count)}.FTDATA;
1186%         else
1187%           if sliceDir==1
1188%             imdata=DATA{1}.FTDATA(:,:,Dat.SliceInd(count),Dat.currentVol);
1189%             if drawOverlay
1190%               if overlay.isOverlayRGB
1191%                 overlay_data = squeeze(overlay.ImageOverlay(:,:,Dat.SliceInd(count),:));
1192%               else
1193%                 overlay_data = overlay.ImageOverlay(:,:,Dat.SliceInd(count),Dat.currentVol);
1194%               end
1195%             end
1196%           elseif sliceDir==2
1197%             imdata=squeeze(DATA{1}.FTDATA(:,Dat.SliceInd(count),:,Dat.currentVol));
1198%             if drawOverlay
1199%               if overlay.isOverlayRGB
1200%                 overlay_data = squeeze(overlay.ImageOverlay(:,Dat.SliceInd(count),:,:));
1201%               else
1202%                 overlay_data = squeeze(overlay.ImageOverlay(:,Dat.SliceInd(count),:,Dat.currentVol));
1203%               end
1204%             end
1205%           else
1206%             imdata=squeeze(DATA{1}.FTDATA(Dat.SliceInd(count),:,:,Dat.currentVol));
1207%             if drawOverlay
1208%               if overlay.isOverlayRGB
1209%                 overlay_data = squeeze(overlay.ImageOverlay(Dat.SliceInd(count),:,:,:));
1210%               else
1211%                 overlay_data = squeeze(overlay.ImageOverlay(Dat.SliceInd(count),:,:,Dat.currentVol));
1212%               end
1213%             end
1214%           end
1215%         end
1216%         
1217%         
1218%         
1219%         %% Plot image
1220%         h=image('parent',ax,...
1221%                 'cdata',imdata,...
1222%                 'cdatamapping','scaled');
1223%                         
1224%               % Plot overlay
1225%               if drawOverlay
1226%                 if ~overlay.isOverlayRGB
1227%                       ov_cmap = overlay.ImageOverlayCmap;
1228%                       ov_clim = round(((overlay.ImageOverlayClim-overlay.ImOverlayMin)*256)./...
1229%                         (overlay.ImOverlayMax-overlay.ImOverlayMin));
1230%                       if ov_clim(1)==ov_clim(2)
1231%                         if ov_clim(1)==0
1232%                               ov_clim(2)=1;
1233%                         elseif ov_clim(1)==256
1234%                               ov_clim(1)=255;
1235%                         end
1236%                       end
1237%                       ov_thold = round(((overlay.ImageOverlayThold-overlay.ImOverlayMin)*256)/...
1238%                         (overlay.ImOverlayMax-overlay.ImOverlayMin));
1239%                 end
1240%                 ov_alpha_val = overlay.ImageOverlayAlpha;
1241%                 
1242%                 if ~overlay.isOverlayRGB
1243%                       % Convert indexed image to RGB image
1244%                       %slice1_ind=overlay.ImageOverlay(:,:,Dat.Slices(1),Dat.CurrentVol);
1245%                       overlay_ind=double(overlay_data);
1246%                       
1247%                       % Get thresholded alpha indices
1248%                       if overlay.ImageOverlayTholdDirPos==1
1249%                         overlay_alpha_th = overlay_ind<ov_thold;
1250%                       else
1251%                         overlay_alpha_th = overlay_ind>ov_thold;
1252%                       end
1253%                       
1254%                       % Get clim alpha indices
1255%                       overlay_alpha_clim = ( overlay_ind>=ov_clim(1) & overlay_ind<=ov_clim(2) );
1256%                       
1257%                       overlay_ind(overlay_ind<ov_clim(1))=ov_clim(1);
1258%                       overlay_ind(overlay_ind>ov_clim(2))=ov_clim(2);
1259%                       
1260%                       overlay_ind=ceil((overlay_ind-ov_clim(1))./diff(ov_clim)*255+1);
1261%                       
1262%                       sz = size(overlay_ind);
1263%                       overlay_im = zeros([sz(1) sz(2) 3],'single');
1264%                       overlay_im(:,:,1)= reshape(ov_cmap(overlay_ind,1),sz);
1265%                       overlay_im(:,:,2)= reshape(ov_cmap(overlay_ind,2),sz);
1266%                       overlay_im(:,:,3)= reshape(ov_cmap(overlay_ind,3),sz);
1267%                 else
1268%                       overlay_im = overlay_data;
1269%                 end
1270%                 
1271%                 overlay_alpha = zeros(size(overlay_ind));
1272%                 overlay_alpha(overlay_alpha_clim) = ov_alpha_val;
1273%                 overlay_alpha(overlay_alpha_th) = 0;
1274%                 
1275%                 h=image('parent',overlay_ax,...
1276%                       'cdata',overlay_im,...
1277%                       'cdatamapping','scaled',...
1278%                       'AlphaDataMapping','none',...
1279%                       'AlphaData',overlay_alpha,...
1280%                       'visible','on');
1281%                 
1282%               end
1283%               
1284%         %% Check Clim
1285%         if isempty(Clim_in)
1286%           clim = [min(min(imdata)) max(max(imdata))];
1287%           set(ax,'clim',clim)
1288%         elseif size(Clim_in,1)>1
1289%           set(ax,'clim',Clim_in(Dat.SliceInd(count),:))
1290%         else
1291%           clim = Clim_in;
1292%           set(ax,'clim',clim)
1293%         end
1294%         
1295%         % Draw ROIs
1296%         if drawRois
1297%           for tt=1:length(roi_ind)
1298%             if Dat.isDataMixed
1299%               roidata = ROI(roi_ind(tt)).voxels{Dat.SliceInd(count)};
1300%             else
1301%               if sliceDir==1
1302%                 roidata = ROI(roi_ind(tt)).voxels{1}(:,:,Dat.SliceInd(count),Dat.currentVol);
1303%               elseif sliceDir==2
1304%                 roidata = squeeze(ROI(roi_ind(tt)).voxels{1}(:,Dat.SliceInd(count),:,Dat.currentVol));
1305%               else
1306%                 roidata = squeeze(ROI(roi_ind(tt)).voxels{1}(Dat.SliceInd(count),:,:,Dat.currentVol));
1307%               end
1308%               if isempty(find(roidata))
1309%                 continue;
1310%               end
1311%                       end
1312%                       
1313%                       if strcmpi(get(fh,'renderer'),'opengl')
1314%                         roidata=uint8(roidata);
1315%                         cdata = zeros([size(roidata) 3],'uint8');
1316%                         if ROI(roi_ind(tt)).color(1)~=0
1317%                               cdata(:,:,1) = roidata*ROI(roi_ind(tt)).color(1);
1318%                         end
1319%                         if ROI(roi_ind(tt)).color(2)~=0
1320%                               cdata(:,:,2) = roidata*ROI(roi_ind(tt)).color(2);
1321%                         end
1322%                         if ROI(roi_ind(tt)).color(3)~=0
1323%                               cdata(:,:,3) = roidata*ROI(roi_ind(tt)).color(3);
1324%                         end
1325%                         alphadata=double(roidata)*roiTransp;
1326%                         
1327%                         h=image('parent',roi_ax,'cdata',cdata,...
1328%                               'AlphaDataMapping','none',...
1329%                               'cdatamapping','scaled',...
1330%                               'AlphaData',alphadata,...
1331%                               'visible','on');
1332%                       end
1333%                         
1334%                       if showRoiEdges
1335%                         B=bwboundaries(roidata,4,'holes');
1336%                         for jj=1:length(B)
1337%                               boundary = B{jj};
1338%                               line('parent',ax,...
1339%                                 'xdata',boundary(:,2),'ydata',boundary(:,1),...
1340%                                 'color',ROI(roi_ind(tt)).color./255,...
1341%                                 'tag','roiedge',...
1342%                                 'linewidth',0.5,...
1343%                                 'linestyle','-',...
1344%                                 'hittest','off');
1345%                         end % for jj=1:length(B)
1346%                       end
1347%           end % for tt=1:length(roi_ind)
1348%         end % if drawRois
1349%         
1350%         % Draw slice number and filename
1351%         if drawSliceNbr || drawFileName
1352%           if (rows*cols)<=50
1353%             fontsz=8;
1354%           elseif (rows*cols)>50 & (rows*cols)<100
1355%             fontsz=7;
1356%           else
1357%             fontsz=6;
1358%           end
1359%           if drawSliceNbr && drawFileName
1360%             if Dat.isDataMixed
1361%               fname = DATA{Dat.SliceInd(count)}.HDR.fname;
1362%               fpath = DATA{Dat.SliceInd(count)}.HDR.fpath;
1363%             else
1364%               fname=DATA{1}.HDR.fname;
1365%               fpath = DATA{1}.HDR.fpath;
1366%             end
1367%             if strcmp(fname,'fid')
1368%               [fp,fn,fe]=fileparts(fpath(1:end-1));
1369%               fname = [fn,fe];
1370%             end
1371%             slicetxt = sprintf('%03d: %s',Dat.SliceInd(count),fname);
1372%           elseif drawFileName
1373%             if Dat.isDataMixed
1374%               fname = DATA{Dat.SliceInd(count)}.HDR.fname;
1375%               fpath = DATA{Dat.SliceInd(count)}.HDR.fpath;
1376%             else
1377%               fname=DATA{1}.HDR.fname;
1378%               fpath = DATA{1}.HDR.fpath;
1379%             end
1380%             if strcmp(fname,'fid')
1381%               [fp,fn,fe]=fileparts(fpath(1:end-1));
1382%               fname = [fn,fe];
1383%             end
1384%             slicetxt = fname;
1385%           elseif drawSliceNbr
1386%             slicetxt = sprintf('%03d',Dat.SliceInd(count));
1387%           end
1388%           tx_slice=text('parent',ax,...
1389%                         'units','normal',...
1390%                         'position',[0.01 0.99],...
1391%                         'verticalalign','top',...
1392%                         'horizontalalign','left',...
1393%                         'interpreter','none',...
1394%                         'string',slicetxt,...
1395%                         'backgroundcolor','w',...
1396%                         'clipping','off',...
1397%                         'fontsize',fontsz);
1398%                               end
1399%         
1400%         count=count+1;
1401%       end % if count<=length(Dat.
1402%     end % for kk=1:cols
1403%   end % for ii=1:rows
1404 
1405 
1406  delete(wait_h)
1407 
1408% Draw separate files
1409%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1410else
1411 
1412  % Get file extension
1413  fext_val = get(H.FILE_FORMAT_POPUP,'value');
1414  if fext_val==1
1415    fext = 'jpg';
1416    print_type = 'jpeg';
1417    quality = sprintf('%02d',quality);
1418  elseif fext_val==2
1419    fext = 'tif';
1420    quality = '';
1421    if useCompression
1422      print_type = 'tiff';
1423    else
1424      print_type = 'tiffnocompression';
1425    end
1426  elseif fext_val==3
1427    fext = 'png';
1428    print_type = 'png';
1429    quality = '';
1430  elseif fext_val==4
1431    fext = 'bmp';
1432    print_type = 'bmp';
1433    quality = '';
1434  elseif fext_val==5
1435    fext = 'eps';
1436    print_type = 'epsc2';
1437    quality = '';
1438  end
1439
1440  % Create file names
1441  fnames={};
1442  for ii=1:length(Dat.SliceInd)
1443    fnames{ii}=sprintf('%s_%03d.%s',filePrefix,Dat.SliceInd(ii),fext);
1444  end
1445
1446  % Get file names from the output directory
1447  tmp=dir(outdir);
1448  outdir_files={tmp(~[tmp(:).isdir]).name};
1449
1450  if ~isunix % Check file names, in windows ignore case
1451    ind=ismember(lower(fnames),lower(outdir_files));
1452  else
1453    ind=ismember(fnames,outdir_files);
1454  end
1455  if any(ind)
1456    % Warn if some files are about to be overwritten
1457    overwrited_files = {fnames{ind}};
1458
1459    % Limit the file list to 20 files
1460    if length(overwrited_files)>20
1461      overwrited_files = {overwrited_files{1:20}};
1462      overwrited_files{end+1}='...';
1463    end
1464
1465    resp=questdlg({['The following files already exist in the output directory' ...
1466      ' "',outdir,'"'],'','(NOTE: max. 20 files shown here)','',...
1467      overwrited_files{:},'',...
1468      'Do you want to overwrite these files?'},...
1469      'Overwrite Existing Files?','Overwrite','Abort','Abort');
1470    if strcmpi(resp,'Abort')
1471      return
1472    end
1473  end
1474
1475  % Initialize waitbar
1476  wbar_h = aedes_wbar(0,sprintf('Creating %s-image %d/%d to folder\n"%s"',...
1477    upper(fext),0,length(fnames),outdir));
1478
1479  % Print images to files
1480  for ii=1:length(Dat.SliceInd)
1481
1482    % Initialize waitbar
1483    aedes_wbar(ii/length(fnames),wbar_h,sprintf('Creating %s-image %d/%d to folder\n"%s"',...
1484      upper(fext),ii,length(fnames),...
1485      outdir));
1486
1487
1488    % Image data
1489    if Dat.isDataMixed
1490      imdata = DATA{Dat.SliceInd(ii)}.FTDATA;
1491    else
1492      if sliceDir==1
1493        imdata = DATA{1}.FTDATA(:,:,Dat.SliceInd(ii),Dat.currentVol);
1494        if drawOverlay
1495          if overlay.isOverlayRGB
1496            overlay_data = squeeze(overlay.ImageOverlay(:,:,Dat.SliceInd(ii),:));
1497          else
1498            overlay_data = overlay.ImageOverlay(:,:,Dat.SliceInd(ii),Dat.currentVol);
1499          end
1500        end
1501      elseif sliceDir==2
1502        imdata = squeeze(DATA{1}.FTDATA(:,Dat.SliceInd(ii),:,Dat.currentVol));
1503        if drawOverlay
1504          if overlay.isOverlayRGB
1505            overlay_data = squeeze(overlay.ImageOverlay(:,Dat.SliceInd(ii),:,:));
1506          else
1507            overlay_data = squeeze(overlay.ImageOverlay(:,Dat.SliceInd(ii),:,Dat.currentVol));
1508          end
1509        end
1510      else
1511        imdata = squeeze(DATA{1}.FTDATA(Dat.SliceInd(ii),:,:,Dat.currentVol));
1512        if drawOverlay
1513          if overlay.isOverlayRGB
1514            overlay_data = squeeze(overlay.ImageOverlay(Dat.SliceInd(ii),:,:,:));
1515          else
1516            overlay_data = squeeze(overlay.ImageOverlay(Dat.SliceInd(ii),:,:,Dat.currentVol));
1517          end
1518        end
1519      end
1520    end
1521
1522    sz = size(imdata);
1523               
1524                % A fix for Windows 7. It appears that in Windows 7 one cannot create a
1525                % figure window that is narrower than the buttons in the top right
1526                % corner...
1527                if ispc && any(sz<128)
1528                        sz = ceil((128/max(sz))*sz);
1529                end
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                               
1635                                overlay_alpha = zeros(size(overlay_ind));
1636                                overlay_alpha(overlay_alpha_clim) = ov_alpha_val;
1637                                overlay_alpha(overlay_alpha_th) = 0;
1638      else
1639        overlay_im = overlay_data;
1640                                overlay_alpha = ov_alpha_val;
1641      end
1642
1643     
1644
1645      h=image('parent',overlay_ax,...
1646        'cdata',overlay_im,...
1647        'cdatamapping','scaled',...
1648        'AlphaDataMapping','none',...
1649        'AlphaData',overlay_alpha,...
1650        'visible','on');
1651    end
1652
1653    % Draw ROIs
1654    if drawRois
1655      for kk=1:length(roi_ind)
1656        if Dat.isDataMixed
1657          roidata = ROI(roi_ind(kk)).voxels{Dat.SliceInd(ii)};
1658        else
1659          if sliceDir==1
1660            roidata = ROI(roi_ind(kk)).voxels{1}(:,:,Dat.SliceInd(ii),Dat.currentVol);
1661          elseif sliceDir==2
1662            roidata = squeeze(ROI(roi_ind(kk)).voxels{1}(:,Dat.SliceInd(ii),:,Dat.currentVol));
1663          else
1664            roidata = squeeze(ROI(roi_ind(kk)).voxels{1}(Dat.SliceInd(ii),:,:,Dat.currentVol));
1665          end
1666          if isempty(find(roidata))
1667            continue;
1668          end
1669        end
1670
1671        if strcmpi(get(fh,'renderer'),'opengl')
1672          roidata=uint8(roidata);
1673          cdata = zeros([size(roidata) 3],'uint8');
1674          if ROI(roi_ind(kk)).color(1)~=0
1675            cdata(:,:,1) = roidata*ROI(roi_ind(kk)).color(1);
1676          end
1677          if ROI(roi_ind(kk)).color(2)~=0
1678            cdata(:,:,2) = roidata*ROI(roi_ind(kk)).color(2);
1679          end
1680          if ROI(roi_ind(kk)).color(3)~=0
1681            cdata(:,:,3) = roidata*ROI(roi_ind(kk)).color(3);
1682          end
1683          alphadata=double(roidata)*roiTransp;
1684
1685          h=image('parent',roi_ax,'cdata',cdata,...
1686            'AlphaDataMapping','none',...
1687            'cdatamapping','scaled',...
1688            'AlphaData',alphadata,...
1689            'visible','on');
1690        end
1691
1692        if showRoiEdges
1693          B=bwboundaries(roidata,4,'holes');
1694          for jj=1:length(B)
1695            boundary = B{jj};
1696            line('parent',ax,...
1697              'xdata',boundary(:,2),'ydata',boundary(:,1),...
1698              'color',ROI(roi_ind(kk)).color./255,...
1699              'tag','roiedge',...
1700              'linewidth',0.5,...
1701              'linestyle','-',...
1702              'hittest','off');
1703          end
1704        end
1705      end
1706    end
1707
1708    % Draw slice number
1709    if drawSliceNbr
1710      if drawFileName
1711        slicenbr = sprintf('%03d:',Dat.SliceInd(ii));
1712      else
1713        slicenbr = sprintf('%03d',Dat.SliceInd(ii));
1714      end
1715      tx_nbr=text('parent',ax,...
1716        'units','normal',...
1717        'position',[0.015 0.965],...
1718        'interpreter','none',...
1719        'string',slicenbr,...
1720        'backgroundcolor','w',...
1721        'clipping','off',...
1722        'fontsize',7);
1723    end
1724
1725    % Draw file name text
1726    if drawFileName
1727      if drawSliceNbr
1728        tmp_ext=get(tx_nbr,'extent');
1729      else
1730        tmp_ext=[0.015 0.965 0 0];
1731      end
1732      if Dat.isDataMixed
1733        fname = DATA{Dat.SliceInd(ii)}.HDR.fname;
1734        fpath = DATA{Dat.SliceInd(ii)}.HDR.fpath;
1735      else
1736        fname=DATA{1}.HDR.fname;
1737        fpath = DATA{1}.HDR.fpath;
1738      end
1739      if strcmp(fname,'fid')
1740        [fp,fn,fe]=fileparts(fpath(1:end-1));
1741        fname = [fn,fe];
1742      end
1743      tx_fname=text('parent',ax,...
1744        'units','normal',...
1745        'position',[tmp_ext(1)+tmp_ext(3) 0.965],...
1746        'interpreter','none',...
1747        'string',fname,...
1748        'backgroundcolor','w',...
1749        'clipping','off',...
1750        'fontsize',7);
1751    end
1752
1753    % $$$     % Draw slice number
1754    % $$$     if drawSliceNbr
1755    % $$$       tx=text('parent',ax,...
1756    % $$$               'units','normal',...
1757    % $$$               'position',[0.015 0.965],...
1758    % $$$               'string',sprintf('%03d',Dat.SliceInd(ii)),...
1759    % $$$               'backgroundcolor','w',...
1760    % $$$               'fontsize',7);
1761    % $$$     end
1762
1763    % Print figure
1764    print(fh,['-d',print_type,quality],['-r',resolution],[outdir,fnames{ii}]);
1765
1766    delete(fh);
1767  end
1768
1769  % Delete waitbar
1770  delete(wbar_h)
1771 
1772end
1773
1774end % function l_CheckOptions(h,
1775
1776%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1777% Close figure
1778%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1779function l_Close(h,evd)
1780
1781% Store figure handle before clearing variables
1782fig_h = H.MAINFIG;
1783
1784% Clear public variables
1785clear H Dat DATA ROI
1786
1787% Close figure
1788delete(fig_h);
1789
1790end % function l_Close(h,
1791
1792end
Note: See TracBrowser for help on using the repository browser.

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