source: an2_export_gui.m @ 59

Last change on this file since 59 was 59, checked in by tjniskan, 11 years ago
  • Fixed an indexing bug in export dialog

M an2_export_gui.m
M an2_revision.m

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

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