source: aedes_export_gui.m

Last change on this file was 213, checked in by tjniskan, 3 years ago
  • Fixed Aedes for Handle Graphics version 2 (HG2).

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

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