source: trunk/src/uvmat.m @ 623

Last change on this file since 623 was 623, checked in by sommeria, 11 years ago

waitbar system for series improved to aloow use as stand alone fcts.

to add at the head of series fcts:
hseries=findobj(allchild(0),'Tag','series');
RUNHandle=findobj(hseries,'Tag','RUN');%handle of RUN button in GUI series
WaitbarHandle?=findobj(hseries,'Tag','Waitbar');%handle of waitbar in GUI series

call to waitbar:

update_waitbar(WaitbarHandle?,index/nbfield)
if ishandle(RUNHandle) && ~strcmp(get(RUNHandle,'BusyAction?'),'queue')

disp('program stopped by user')
break

end

File size: 230.1 KB
Line 
1%'uvmat': function associated with the GUI 'uvmat.fig' for images and data field visualization
2%------------------------------------------------------------------------
3% function huvmat=uvmat(input)
4%
5%OUTPUT
6% huvmat=current handles of the GUI uvmat.fig
7%%
8%
9%INPUT:
10% input: input file name (if character chain), or input image matrix to
11% visualize, or Matlab structure representing  netcdf fieldname (with fieldname
12% ListVarName....)
13%
14%AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
15%  Copyright Joel Sommeria,  2008, LEGI / CNRS-UJF-INPG, joel.sommeria@legi.grenoble-inp.fr.
16%AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
17%     This open is part of the toolbox UVMAT.
18%
19%     UVMAT is free software; you can redistribute it and/or modify
20%     it under the terms of the GNU General Public License as published by
21%     the Free Software Foundation; either version 2 of the License, or
22%     (at your option) any later version.
23%
24%     UVMAT is distributed in the hope that it will be useful,
25%     but WITHOUT ANY WARRANTY; without even the implied warranty of
26%     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
27%     GNU General Public License (open UVMAT/COPYING.txt) for more details.
28%AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
29%
30% Information stored on the interface:(use 'Export/field in workspace' in
31% the menu bar of uvmat to retrieve it)
32%          .OpenParam: structure containing parameters defined when uvmat is opened
33%                       .PosColorbar: position (1x4 vector)of the colorbar (relative to the fig uvmat)
34%                       .PosGeometryCalib: size of set_object
35%                       .NbBuiltin: nbre of functions always displayed in TransformName menu
36%          .ProjObject: cell array of structures representing the current projection objects, as produced by 'set_object.m'={[]} by default
37%          .NewSeries: =0/1 flag telling whether a new field series has been opened
38%          .FileName_1: name of the current second field (used to detect a  constant field during file scanning)
39%          .FileType: current file type, as defined by the fct  get_file_type.m)
40%          .i1_series,.i2_series,.j1_series,.j1_series: series of i1,i2,j1,j2 indices detected in the input dir,set by  the fct find_file_series
41%          .MovieObject: current movie object
42%          .TimeUnit: unit for time
43%          .XmlData: cell array of 1 or 2 structures representing the xml files associated with the input fieldname (containing timing  and geometry calibration)
44%          .Field: cell array of 1 or 2 structures representing the current  input field(s)
45%          .PlotAxes: field structure representing the current field plotted  on the main axes  (used for mouse operations)
46%          .HistoAxes: idem for histogram axes
47
48% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%   DATA FLOW  (for run0_Callback) %%%%%%%%%%%%%%%%%%%%:
49%
50%
51% 1) Input filenames are determined by MenuBrowse (first field), MenuBrowse_1
52% (second field), or by the stored file name .FileName_1, or as an input of uvmat.
53% 2) These functions call 'uvmat/display_file_name.m' which detects the file series, and fills the file index boxes
54% 3) Then 'uvmat/update_rootinfo.m' Updates information about a new field series (indices to scan, timing, calibration from an xml file)
55% 4) Then fieldname are opened and visualised by the main sub-function 'uvmat/refresh_field.m'
56% The function first reads the name of the input file(s) (one or two) from the edit boxes  of the GUI
57% It then reads the input file(s) with the function read_field.m and perform the following list of operations:
58%
59%    %%%%%%%%  structure of uvmat/refresh_field.m %%%%%%%%
60%
61%           Main input open       second input open_1       
62%                    |                   | 
63%             read_field.m            read_field.m
64%                    |                   |
65%                 Field{1}            Field{2}               
66%                    |                   |                                 
67%                    --->transform fct<---             transform (e.g. phys.m) and combine input fieldname 
68%                            |                                   
69%                        (tps_coeff_field.m)               calculate tps coefficients (for filter projection or spatial derivatives).
70%                            |
71%                       UvData.Field-------------->histogram
72%               _____________|____________
73%              |                          |                   
74%        proj_field.m               proj_field.m       project the field on the projection objects (use set_field_list.m)           
75%              |                          |
76%         UvData.PlotAxes          ViewData.PlotAxes (on view_field)
77%              |                          |
78%       plot_field.m (uvmat)       plot_field.m (view_field)      plot the projected fieldname
79%
80%
81%%%%%%%%%%%%%%    SCALARS: %%%%%%%%%%%%??%%%
82% scalars are displayed either as an image or countour plot, either as a color of
83% velocity vectors. The scalar values in the first case is represented by
84% UvData.Field.A, and by UvData.Field.C in the second case. The corresponding set of X
85% and Y coordinates are represented by UvData.Field.AX and UvData.Field.AY, and .X and
86% .Y for C (the same as velocity vectors). If A is a nxxny matrix (scalar
87% on a regtular grid), then .AX andf.AY contains only two elements, represneting the
88% coordinates of the four image corners. The scalar name is represented by
89% the strings .AName and/or .CName.
90% If the scalar exists in an input open (image or scalar stored under its
91% name in a netcdf open), it is directly read at the level of Field{1}or Field{2}.
92% Else only its name AName is recorded in Field{i}, and its field is then calculated
93%by the fuction calc_scal after the coordinate transform or after projection on an edit_object
94     
95% Properties attached to plotting figures (standard Matlab properties):
96%    'CurrentAxes'= gca or get(gcf,'CurrentAxes');
97%    'CurrentPoint'=get(gcf,'CurrentPoint'): figure coordinates of the point over which the mouse is positioned
98%    'CurrentCharacter'=get(gcf,'CurrentCharacter'): last character typed  over the figure where the mouse is positioned
99%    'WindowButtonMotionFcn': function permanently called by mouse motion over the figure
100%    'KeyPressFcn': function called by pressing a key on the key board
101%    'WindowButtonDownFcn':  function called by pressing the mouse over the  figure
102%    'WindowButtonUpFcn': function called by releasing  the mouse pressure over the  figure
103
104% Properties attached to plotting axes:
105%    'CurrentPoint'=get(gca,'CurrentPoint'); (standard Matlab) same as for the figure, but position in plot coordinates.
106%     AxeData:=get(gca,'UserData');
107%     AxeData.Drawing  = create: create a new object
108%                       = deform: modify an existing object by moving its defining create
109%                      = off: no current drawing action
110%                     = translate: translate an existing object
111%                    = calibration: move a calibration point
112%                    = CheckZoom: isolate a subregion for CheckZoom in=1 if an object is being currently drawn, 0 else (set to 0 by releasing mouse button)
113%            .CurrentOrigin: Origin of a curently drawn edit_object
114%            .CurrentLine: currently drawn menuline (A REVOIR)
115%            .CurrentObject: handle of the currently drawn edit_object
116%            .CurrentRectZoom: current rectangle used for CheckZoom
117
118% Properties attached to projection objects (create, menuline, menuplane...):
119%    'Tag'='proj_object': for all projection objects
120%    ObjectData.Type=...: style of projection object:
121%              .ProjMode
122%              .Coord: defines the position of the object
123%              .XMin,YMin....
124%              .XMax,YMax....
125%              .DX,DY,DZ
126%              .Phi, .Theta, .Psi : Euler angles
127%              .X,.Y,.U,.V.... : field data projected on the object
128%              .IndexObj: index in the list of UvData.ProjObject
129           %during plotting
130%               .plotaxes: handles of the current axes used to plot the  result of field projection on the object
131%               .plothandle: vector of handle(s) of the object graphic represnetation in all the opened plotting axes
132% To each projection object #iobj, corresponds an axis
133% Object{iobj}.plotaxes and nbobj representation graphs  Object{iobj}.plothandles(:) (where nbobj is the
134% nbre of current objects opened in uvmat. Note that Object{iobj}.plothandles(iobj)=[] : an object is not represented in its own projection field;
135
136%------------------------------------------------------------------------
137%------------------------------------------------------------------------
138%  I - MAIN FUNCTION uvmat
139%------------------------------------------------------------------------
140%------------------------------------------------------------------------
141function varargout = uvmat(varargin)
142
143% Begin initialization code - DO NOT EDIT
144gui_Singleton = 1;
145gui_State = struct('gui_Name',          mfilename, ...
146                   'gui_Singleton',     gui_Singleton, ...
147                   'gui_OpeningFcn',    @uvmat_OpeningFcn, ...
148                   'gui_OutputFcn',     @uvmat_OutputFcn, ...
149                   'gui_LayoutFcn',     [], ...
150                   'gui_Callback',      []);
151if nargin && ischar(varargin{1})&& ~isempty(regexp(varargin{1},'_Callback','once'))
152    gui_State.gui_Callback = str2func(varargin{1});
153end
154
155if nargout
156    varargout{1:nargout} = gui_mainfcn(gui_State, varargin{:});
157else
158    gui_mainfcn(gui_State, varargin{:});
159end
160% End initialization code - DO NOT EDIT
161
162%------------------------------------------------------------------------
163% --- Executes just before the GUI uvmat is made visible.
164function uvmat_OpeningFcn(hObject, eventdata, handles, input )
165%------------------------------------------------------------------------
166
167%% Choose default command menuline output for uvmat (standard GUI)
168handles.output = hObject;
169
170%% Update handles structure (standard GUI)
171guidata(hObject, handles);
172
173%% add the path to uvmat (useful if uvmat has been opened in the working directory and a working directory change occured)
174path_uvmat=fileparts(which('uvmat'));
175
176%% set the position of the GUI, colorbar and ancillary GUIs:
177set(hObject,'Units','pixels')%
178set(0,'Units','pixels');
179ScreenSize=get(0,'ScreenSize');%size of the current screen
180Width=1050;
181Height=700;
182%adjust to screen size (reduced by a min margin)
183RescaleFactor=min((ScreenSize(3)-80)/Width,(ScreenSize(4)-80)/Height);
184if RescaleFactor>1
185    RescaleFactor=RescaleFactor/2+1/2; %reduce the rescale factor to provide an increased margin for a big screen
186end
187Width=Width*RescaleFactor;
188Height=Height*RescaleFactor;
189LeftX=80*RescaleFactor;%position of the left fig side, in pixels (put to the left side, with some margin)
190LowY=round(ScreenSize(4)/2-Height/2); % put at the middle height on the screen
191set(hObject,'Position',[LeftX LowY Width Height])
192
193%set(hObject,'Units','Normalized')
194
195%UvData.OpenParam.PosColorbar=[0.8450    0.0900    0.0190    0.3600];
196UvData.OpenParam.PosColorbar=[0.805 0.022 0.019 0.445];
197%UvData.OpenParam.PosSetObject=[-0.05 -0.03 0.3 0.7]; %position for set_object
198UvData.OpenParam.PosGeometryCalib=[0.95 -0.03 0.28 1 ];%position for geometry_calib (TO IMPROVE)
199% UvData.OpenParam.CalSize=[0.28 1];
200% UvData.PlotAxes=[];%initiate the record of plotted field
201% UvData.axes2=[];
202% UvData.axes1=[];
203AxeData.LimEditBox=1; %initialise AxeData
204set(handles.PlotAxes,'UserData',AxeData)
205
206%% set functions for the mouse and keyboard
207set(hObject,'KeyPressFcn',{'keyboard_callback',handles})%set keyboard action function
208set(hObject,'WindowButtonMotionFcn',{'mouse_motion',handles})%set mouse action functio
209set(hObject,'WindowButtonDownFcn',{'mouse_down'})%set mouse click action function
210set(hObject,'WindowButtonUpFcn',{'mouse_up',handles})
211set(hObject,'DeleteFcn',{@closefcn})%
212
213%% initialisation
214set(handles.FieldName,'Value',1)
215set(handles.FieldName,'string',{''})
216UvData.ProjObject={[]};
217
218%% TRANSFORM menu: builtin fcts
219transform_menu={'';'sub_field';'phys';'phys_polar'};
220UvData.OpenParam.NbBuiltin=numel(transform_menu); %number of functions
221transform_path=fullfile(path_uvmat,'transform_field');
222path_list=cell(UvData.OpenParam.NbBuiltin,1);
223path_list{1}='';
224for ilist=2:UvData.OpenParam.NbBuiltin
225path_list{ilist}=transform_path; % set transform_path to the path_list
226end
227
228%% load the list of previously browsed files in menus Open, Open_1 and TransformName
229 dir_perso=prefdir; % path to the directory .matlab containing the personal data of the current user
230 profil_perso=fullfile(dir_perso,'uvmat_perso.mat');% personal data file uvmat_perso.mat' in .matlab
231 if exist(profil_perso,'file')
232     h=load (profil_perso);
233     if isfield(h,'MenuFile')% load the menu of previously opened files
234         for ifile=1:min(length(h.MenuFile),5)
235             set(handles.(['MenuFile_' num2str(ifile)]),'Label',h.MenuFile{ifile});
236             set(handles.(['MenuFile_' num2str(ifile) '_1']),'Label',h.MenuFile{ifile});
237         end
238     end
239     if isfield(h,'RootPath')
240         set(handles.RootPath,'UserData',h.RootPath); %store the previous campaign in the UserData of RootPath
241     end
242     if isfield(h,'transform_fct') && iscell(h.transform_fct) % load the menu of transform fct set by user
243         for ilist=1:length(h.transform_fct);
244             if exist(h.transform_fct{ilist},'file')
245                 [path,file]=fileparts(h.transform_fct{ilist});
246                 transform_menu=[transform_menu; {file}];
247                 path_list=[path_list; {path}];
248             end
249         end
250     end
251 end
252transform_menu=[transform_menu;{'more...'}];%append the option more.. to the menu
253set(handles.TransformName,'String',transform_menu)% display the menu of transform fcts
254set(handles.TransformName,'UserData',path_list)% store the corresponding list of path in UserData of uicontrol transform_fct
255set(handles.TransformPath,'String','')
256set(handles.TransformPath,'UserData',[])
257
258%% case of an input argument for uvmat
259testinputfield=0;
260inputfile=[];
261Field=[];
262if exist('input','var')
263    if ishandle(handles.UVMAT_title)
264        delete(handles.UVMAT_title)
265    end   
266    if isstruct(input)
267        if isfield(input,'InputFile')
268            inputfile=input.InputFile;
269        end
270        if isfield(input,'TimeIndex')
271            set(handles.i1,num2str(input.TimeIndex))
272        end
273        if isfield(input,'FieldsString')
274            UvData.FieldsString=input.FieldsString;
275        end
276    elseif ischar(input)% file name introduced as input
277           inputfile=input;
278    elseif isnumeric(input)%simple matrix introduced as input
279        sizinput=size(input);
280        if sizinput(1)<=1 || sizinput(2)<=1
281            msgbox_uvmat('ERROR','bad input for uvmat: file name, structure or numerical matrix accepted')
282            return
283        end
284        UvData.Field.ListVarName={'A','coord_y','coord_x'};
285        UvData.Field.VarDimName={{'coord_y','coord_x'},'cord_y','coord_x'};
286        UvData.Field.A=input;
287        UvData.Field.coord_x=[0.5 size(input,2)-0.5];
288        UvData.Field.coord_y=[size(input,1)-0.5 0.5];
289        testinputfield=1;
290    end
291else
292    %% check the path and date of modification of all functions in uvmat
293    path_to_uvmat=which ('uvmat');% check the path detected for source file uvmat
294    [infomsg,date_str,svn_info]=check_files;%check the path of the functions called by uvmat.m   
295    date_str=['last modification: ' date_str];
296    if ishandle(handles.UVMAT_title)
297        set(handles.UVMAT_title,'String',...
298            [{'Copyright  LEGI UMR 5519 /CNRS-UJF-Grenoble INP, 2010'};...
299            {'GNU General Public License'};...
300            {path_to_uvmat};...
301            {date_str};...
302            infomsg]);
303    end
304end
305set(handles.uvmat,'UserData',UvData)
306if ~isempty(inputfile)
307    %%%%% display the input field %%%%%%%
308    display_file_name(handles,inputfile)
309    %%%%%%%
310end
311
312set_vec_col_bar(handles) %update the display of color code for vectors
313
314%------------------------------------------------------------------------
315% --- Outputs from this function are returned to the command menuline.
316function varargout = uvmat_OutputFcn(hObject, eventdata, handles)
317varargout{1} = handles.output;% the only output argument is the handle to the GUI figure
318
319%------------------------------------------------------------------------
320% --- executed when closing uvmat: delete or desactivate the associated figures if exist
321function closefcn(gcbo,eventdata)
322%------------------------------------------------------------------------
323hh=findobj(allchild(0),'tag','view_field');
324if ~isempty(hh)
325    delete(hh)
326end
327hh=findobj(allchild(0),'tag','geometry_calib');
328if ~isempty(hh)
329    delete(hh)
330end
331hh=findobj(allchild(0),'tag','set_object');
332if ~isempty(hh)
333    hhh=findobj(hh,'tag','PLOT');
334    set(hhh,'enable','off')
335end
336
337%------------------------------------------------------------------------
338%------------------------------------------------------------------------
339%  II - FUNCTIONS FOR INTRODUCING THE INPUT FILES
340% automatically sets the global properties when the rootfile name is introduced
341% then activate the view-field action if selected
342% it is activated either by clicking on the RootPath window or by the
343% browser
344%------------------------------------------------------------------------
345%------------------------------------------------------------------------
346% --- Executes on the menu Open/Browse...
347% search the files, recognize their type according to their name and fill the rootfile input windows
348function MenuBrowse_Callback(hObject, eventdata, handles)
349[RootPath,SubDir,RootFile,FileIndices,FileExt]=read_file_boxes(handles);
350oldfile=[fullfile(RootPath,SubDir,RootFile) FileIndices FileExt];
351if isempty(oldfile) %loads the previously stored file name and set it as default in the file_input box
352    oldfile=get(handles.RootPath,'UserData');
353end
354fileinput=uigetfile_uvmat('select an input file:',oldfile);
355
356%% display the selected field and related information
357if ~isempty(fileinput)
358    display_file_name(handles,fileinput)
359end
360
361% -----------------------------------------------------------------------
362% --- Executes on the menu Open/Browse campaign...
363% search the file inside a campaign, using the GUI view_data
364function MenuBrowseCampaign_Callback(hObject, eventdata, handles)
365% -----------------------------------------------------------------------
366RootPath=get(handles.RootPath,'String');
367if isempty(RootPath)
368    RootPath=get(handles.RootPath,'UserData');%use Rootpath recored from the personal file at uvmat opening
369end
370CampaignPath=fileparts(fileparts(RootPath));
371DirFull = uigetdir(CampaignPath,'Select a Campaign dir, then press OK');
372if ~ischar(DirFull)|| ~exist(DirFull,'dir')
373    return
374end
375OutPut=browse_data(DirFull);% open the GUI browse_data to get select a campaign dir, experiment and device
376if ~isfield(OutPut,'Campaign')
377    return
378end
379DirName=fullfile(OutPut.Campaign,OutPut.Experiment{1},OutPut.Device{1});
380hdir=dir(DirName); %list files and dirs
381for ilist=1:numel(hdir)
382    if ~isequal(hdir(ilist).isdir,1)%look for files, not dir
383        FileName=hdir(ilist).name;
384        FileType=get_file_type(fullfile(DirName,FileName));
385        switch FileType
386            case {'image','multimage','civx','civdata','netcdf'}
387            break
388        end
389    end
390end
391
392%% display the selected field and related information
393display_file_name( handles,fullfile(DirName,FileName))
394
395% -----------------------------------------------------------------------
396% --- Open again the file whose name has been recorded in MenuFile_1
397function MenuFile_1_Callback(hObject, eventdata, handles)
398%------------------------------------------------------------------------
399fileinput=get(handles.MenuFile_1,'Label');
400display_file_name( handles,fileinput)
401
402% -----------------------------------------------------------------------
403% --- Open again the file whose name has been recorded in MenuFile_2
404function MenuFile_2_Callback(hObject, eventdata, handles)
405%------------------------------------------------------------------------
406fileinput=get(handles.MenuFile_2,'Label');
407display_file_name(handles,fileinput)
408
409% -----------------------------------------------------------------------
410% --- Open again the file whose name has been recorded in MenuFile_3
411function MenuFile_3_Callback(hObject, eventdata, handles)
412%------------------------------------------------------------------------
413fileinput=get(handles.MenuFile_3,'Label');
414display_file_name(handles,fileinput)
415
416% -----------------------------------------------------------------------
417% --- Open again the file whose name has been recorded in MenuFile_4
418function MenuFile_4_Callback(hObject, eventdata, handles)
419%------------------------------------------------------------------------
420fileinput=get(handles.MenuFile_4,'Label');
421display_file_name(handles,fileinput)
422
423% -----------------------------------------------------------------------
424% --- Open again the file whose name has been recorded in MenuFile_5
425function MenuFile_5_Callback(hObject, eventdata, handles)
426%------------------------------------------------------------------------
427fileinput=get(handles.MenuFile_5,'Label');
428display_file_name(handles,fileinput)
429
430%------------------------------------------------------------------------
431% --- Executes on the menu Open/Browse_1 for the second input field,
432%     search the files, recognize their type according to their name and fill the rootfile input windows
433function MenuBrowse_1_Callback(hObject, eventdata, handles)
434%------------------------------------------------------------------------
435RootPath=get(handles.RootPath,'String');
436SubDir=get(handles.SubDir,'String');
437fileinput_1=uigetfile_uvmat('select a second input file:',fullfile(RootPath,SubDir));
438if ~isempty(fileinput_1)
439    % [FileName, PathName] = uigetfile({'*.*','All Files(*.*)'},'Pick a file',RootPath);
440    % if ~ischar(FileName),return,end %abandon if the browser is cancelled
441    % fileinput_1=[PathName FileName];%complete file name
442   
443    % refresh the current displayed field
444    set(handles.SubField,'Value',1)
445    display_file_name(handles,fileinput_1,2)
446   
447    %update list of recent files in the menubar
448    MenuFile_1=fileinput_1;
449    MenuFile_2=get(handles.MenuFile_1,'Label');
450    MenuFile_3=get(handles.MenuFile_2,'Label');
451    MenuFile_4=get(handles.MenuFile_3,'Label');
452    MenuFile_5=get(handles.MenuFile_4,'Label');
453    set(handles.MenuFile_1,'Label',MenuFile_1)
454    set(handles.MenuFile_2,'Label',MenuFile_2)
455    set(handles.MenuFile_3,'Label',MenuFile_3)
456    set(handles.MenuFile_4,'Label',MenuFile_4)
457    set(handles.MenuFile_5,'Label',MenuFile_5)
458    set(handles.MenuFile_1_1,'Label',MenuFile_1)
459    set(handles.MenuFile_2_1,'Label',MenuFile_2)
460    set(handles.MenuFile_3_1,'Label',MenuFile_3)
461    set(handles.MenuFile_4_1,'Label',MenuFile_4)
462    set(handles.MenuFile_5_1,'Label',MenuFile_5)
463end
464
465% --------------------------------------------------------------------
466function MenuBrowseCampaign_1_Callback(hObject, eventdata, handles)
467% -----------------------------------------------------------------------
468CampaignPath=fileparts(fileparts(get(handles.RootPath,'String')));
469DirFull = uigetdir(CampaignPath,'Select a Campaign dir, then press OK');
470if ~ischar(DirFull)|| ~exist(DirFull,'dir')
471    return
472end
473OutPut=browse_data(DirFull);% open the GUI browse_data to get select a campaign dir, experiment and device
474if ~isfield(OutPut,'Campaign')
475    return
476end
477DirName=fullfile(OutPut.Campaign,OutPut.Experiment{1},OutPut.Device{1});
478hdir=dir(DirName); %list files and dirs
479for ilist=1:numel(hdir)
480    if ~isequal(hdir(ilist).isdir,1)%look for files, not dir
481        FileName=hdir(ilist).name;
482        FileType=get_file_type(fullfile(DirName,FileName));
483        switch FileType
484            case {'image','multimage','civx','civdata','netcdf'}
485            break
486        end
487    end
488end
489
490%% display the selected field and related information
491set(handles.SubField,'Value',1)
492display_file_name( handles,fullfile(DirName,FileName),2)
493
494% -----------------------------------------------------------------------
495% --- Open again as second field the file whose name has been recorded in MenuFile_1
496function MenuFile_1_1_Callback(hObject, eventdata, handles)
497% -----------------------------------------------------------------------
498fileinput_1=get(handles.MenuFile_1_1,'Label');
499set(handles.SubField,'Value',1)
500display_file_name(handles,fileinput_1,2)
501
502% -----------------------------------------------------------------------
503% --- Open again as second field the file whose name has been recorded in MenuFile_2
504function MenuFile_2_1_Callback(hObject, eventdata, handles)
505% -----------------------------------------------------------------------
506fileinput_1=get(handles.MenuFile_2_1,'Label');
507set(handles.SubField,'Value',1)
508display_file_name(handles,fileinput_1,2)
509
510% -----------------------------------------------------------------------
511% --- Open again as second field the file whose name has been recorded in MenuFile_3
512function MenuFile_3_1_Callback(hObject, eventdata, handles)
513% -----------------------------------------------------------------------
514fileinput_1=get(handles.MenuFile_3_1,'Label');
515set(handles.SubField,'Value',1)
516display_file_name(handles,fileinput_1,2)
517
518% -----------------------------------------------------------------------
519% --- Open again as second field the file whose name has been recorded in MenuFile_4
520function MenuFile_4_1_Callback(hObject, eventdata, handles)
521% -----------------------------------------------------------------------
522fileinput_1=get(handles.MenuFile_4_1,'Label');
523set(handles.SubField,'Value',1)
524display_file_name(handles,fileinput_1,2)
525
526% -----------------------------------------------------------------------
527% --- Open again as second field the file whose name has been recorded in MenuFile_5
528function MenuFile_5_1_Callback(hObject, eventdata, handles)
529% -----------------------------------------------------------------------
530fileinput_1=get(handles.MenuFile_5_1,'Label');
531set(handles.SubField,'Value',1)
532display_file_name(handles,fileinput_1,2)
533
534%------------------------------------------------------------------------
535% --- Called by action in RootPath edit box
536function RootPath_Callback(hObject,eventdata,handles)
537%------------------------------------------------------------------------
538% read the current input file name:
539[RootPath,SubDir,RootFile,FileIndices,FileExt]=read_file_boxes(handles);
540if ~exist(fullfile(RootPath,SubDir),'dir')
541    msgbox_uvmat('ERROR',['directory ' fullfile(RootPath,SubDir) ' does not exist'])
542    return
543end
544% detect the file type, get the movie object if relevant, and look for the corresponding file series:
545[RootPath,SubDir,RootFile,i1_series,i2_series,j1_series,j2_series,tild,FileType,FileInfo,MovieObject]=find_file_series(fullfile(RootPath,SubDir),[RootFile FileIndices FileExt]);
546% initiate the input file series and refresh the current field view:
547update_rootinfo(handles,i1_series,i2_series,j1_series,j2_series,FileType,MovieObject,1);
548
549%-----------------------------------------------------------------------
550% --- Called by action in RootPath_1 edit box
551function RootPath_1_Callback(hObject,eventdata,handles)
552% -----------------------------------------------------------------------
553% update_rootinfo_1(hObject,eventdata,handles)
554[RootPath,SubDir,RootFile,FileIndices,FileExt]=read_file_boxes_1(handles);
555if ~exist(fullfile(RootPath,SubDir),'dir')
556    msgbox_uvmat('ERROR',['directory ' fullfile(RootPath,SubDir) ' does not exist'])
557    return
558end
559% detect the file type, get the movie object if relevant, and look for the corresponding file series:
560[RootPath,SubDir,RootFile,i1_series,i2_series,j1_series,j2_series,tild,FileType,MovieObject]=find_file_series(fullfile(RootPath,SubDir),[RootFile FileIndices FileExt]);
561% initiate the input file series and refresh the current field view:
562update_rootinfo(handles,i1_series,i2_series,j1_series,j2_series,FileType,MovieObject,2);
563
564%------------------------------------------------------------------------
565% --- Called by action in RootFile edit box
566function SubDir_Callback(hObject, eventdata, handles)
567%------------------------------------------------------------------------
568%refresh the menu of input fieldname
569Fields_Callback(hObject, eventdata, handles);
570% refresh the current field view
571run0_Callback(hObject, eventdata, handles);
572
573%------------------------------------------------------------------------
574% --- Called by action in RootFile edit box
575function RootFile_Callback(hObject, eventdata, handles)
576%------------------------------------------------------------------------
577RootPath_Callback(hObject,eventdata,handles)
578
579%-----------------------------------------------------------------------
580% --- Called by action in RootFile_1 edit box
581function RootFile_1_Callback(hObject, eventdata, handles)
582% -----------------------------------------------------------------------
583RootPath_1_Callback(hObject,eventdata,handles)
584
585%------------------------------------------------------------------------
586% --- Called by action in FileIndex edit box
587function FileIndex_Callback(hObject, eventdata, handles)
588%------------------------------------------------------------------------
589[tild,tild,tild,i1,i2,j1,j2]=fileparts_uvmat(get(handles.FileIndex,'String'));
590set(handles.i1,'String',num2str(i1));
591set(handles.i2,'String',num2str(i2));
592set(handles.j1,'String',num2str(j1));
593set(handles.j2,'String',num2str(j2));
594
595% refresh the current field view
596run0_Callback(hObject, eventdata, handles)
597
598%------------------------------------------------------------------------
599% --- Called by action in FileIndex_1 edit box
600function FileIndex_1_Callback(hObject, eventdata, handles)
601%------------------------------------------------------------------------
602run0_Callback(hObject, eventdata, handles)
603
604%------------------------------------------------------------------------
605% --- Called by action in NomType edit box
606function NomType_Callback(hObject, eventdata, handles)
607%------------------------------------------------------------------------
608i1=str2num(get(handles.i1,'String'));
609i2=str2num(get(handles.i2,'String'));
610j1=str2num(get(handles.j1,'String'));
611j2=str2num(get(handles.j2,'String'));
612FileIndex=fullfile_uvmat('','','','',get(handles.NomType,'String'),i1,i2,j1,j2);
613set(handles.FileIndex,'String',FileIndex)
614% refresh the current settings and refresh the field view
615RootPath_Callback(hObject,eventdata,handles)
616
617%------------------------------------------------------------------------
618% --- Called by action in NomType edit box
619function NomType_1_Callback(hObject, eventdata, handles)
620%------------------------------------------------------------------------
621i1=str2num(get(handles.i1,'String'));
622i2=str2num(get(handles.i2,'String'));
623j1=str2num(get(handles.j1,'String'));
624j2=str2num(get(handles.j2,'String'));
625FileIndex=fullfile_uvmat('','','','',get(handles.NomType_1,'String'),i1,i2,j1,j2);
626set(handles.FileIndex_1,'String',FileIndex)
627% refresh the current settings and refresh the field view
628RootPath_1_Callback(hObject,eventdata,handles)
629
630%------------------------------------------------------------------------
631% --- Fills the edit boxes RootPath, RootFile,NomType...from an input file name 'fileinput'
632function display_file_name(handles,fileinput,index)
633%------------------------------------------------------------------------
634%% look for the input file existence
635if ~exist(fileinput,'file')
636    msgbox_uvmat('ERROR',['input file ' fileinput  ' does not exist'])
637    return
638end
639
640%% set the mouse pointer to 'watch'
641set(handles.uvmat,'Pointer','watch')
642set(handles.RootPath,'BackgroundColor',[1 1 0])
643drawnow
644
645%% define the relevant handles for the first field series (index=1) or the second file series (index=2)
646if ~exist('index','var')
647    index=1;
648end
649if index==1
650    handles_RootPath=handles.RootPath;
651    handles_SubDir=handles.SubDir;
652    handles_RootFile=handles.RootFile;
653    handles_FileIndex=handles.FileIndex;
654    handles_NomType=handles.NomType;
655    handles_FileExt=handles.FileExt;
656elseif index==2
657    handles_RootPath=handles.RootPath_1;
658    handles_SubDir=handles.SubDir_1;
659    handles_RootFile=handles.RootFile_1;
660    handles_FileIndex=handles.FileIndex_1;
661    handles_NomType=handles.NomType_1;
662    handles_FileExt=handles.FileExt_1;
663    set(handles.RootPath_1,'Visible','on')
664    set(handles.RootFile_1,'Visible','on')
665    set(handles.SubDir_1,'Visible','on');
666    set(handles.FileIndex_1,'Visible','on');
667    set(handles.FileExt_1,'Visible','on');
668    set(handles.NomType_1,'Visible','on');
669end
670
671%% detect root name, nomenclature and indices in the input file name:
672[FilePath,FileName,FileExt]=fileparts(fileinput);
673% detect the file type, get the movie object if relevant, and look for the corresponding file series:
674% the root name and indices may be corrected by including the first index i1 if a corresponding xml file exists
675[RootPath,SubDir,RootFile,i1_series,i2_series,j1_series,j2_series,NomType,FileType,FileInfo,MovieObject,i1,i2,j1,j2]=find_file_series(FilePath,[FileName FileExt]);
676
677%% open the file or fill the GUI uvmat according to the detected file type
678switch FileType
679    case ''
680        msgbox_uvmat('ERROR','invalid input file type')
681    case 'txt'
682        edit(fileinput)
683    case 'figure'                           %display matlab figure
684        hfig=open(fileinput);
685        set(hfig,'WindowButtonMotionFcn','mouse_motion')%set mouse action functio
686        set(hfig,'WindowButtonUpFcn','mouse_up')%set mouse click action function
687        set(hfig,'WindowButtonUpFcn','mouse_down')%set mouse click action function
688    case 'xml'                % edit xml files
689        t=xmltree(fileinput);
690        % the xml file marks a project or project link, open datatree_browser
691        if strcmp(get(t,1,'name'),'Project')&& exist(regexprep(fileinput,'.xml$',''),'dir')
692            datatree_browser(fileinput)
693        else % other xml file, open the xml editor
694            editxml(fileinput);
695        end
696    case 'xls'% Excel file opended by editxml
697        editxml(fileinput);
698    otherwise
699        set(handles_RootPath,'String',RootPath);
700        rootname=fullfile(RootPath,SubDir,RootFile);
701        set(handles_SubDir,'String',['/' SubDir]);
702        set(handles_RootFile,'String',['/' RootFile]); %display the separator
703        indices=fileinput(length(rootname)+1:end);
704        indices(end-length(FileExt)+1:end)=[]; %remove extension
705        set(handles_FileIndex,'String',indices);
706        set(handles_NomType,'String',NomType);
707        set(handles_FileExt,'String',FileExt);
708        if index==1
709            % fill file index counters if the first file series is opened
710            set(handles.i1,'String',num2str(i1));
711            set(handles.i2,'String',num2str(i2));
712            set(handles.j1,'String',num2stra(j1,NomType));
713            set(handles.j2,'String',num2stra(j2,NomType));
714        else %read the current field index to synchronise with the first series
715            i1_s=str2num(get(handles.i1,'String'));
716            i2_0=str2num(get(handles.i2,'String'));
717            if ~isempty(i2_0)
718                i2_s=i2_0;
719            else
720               i2_s=i2;
721            end
722            j1_0=stra2num(get(handles.j1,'String'));
723            if ~isempty(j1_0)
724                j1_s=j1_0;
725            else
726                j1_s=j1;
727            end
728            j2_0=stra2num(get(handles.j2,'String'));
729            if ~isempty(j2_0)
730                j2_s=j2_0;
731            else
732                j2_s=j2;
733            end
734        end
735       
736        % synchronise indices of the second  input file if it exists
737        if get(handles.SubField,'Value')==1% if the subfield button is activated, update the field numbers
738            Input=read_GUI(handles.InputFile);
739            if ~isfield(Input,'RootPath_1')||strcmp(Input.RootPath_1,'"')
740                Input.RootPath_1=Input.RootPath;
741            end
742            if ~isfield(Input,'SubDir_1')||strcmp(Input.SubDir_1,'"')
743                Input.SubDir_1=Input.SubDir;
744            end
745            if ~isfield(Input,'RootFile_1')||strcmp(Input.RootFile_1,'"')
746                Input.RootFile_1=Input.RootFile;
747            end
748            if ~isfield(Input,'FileExt_1')||strcmp(Input.FileExt_1,'"')
749                Input.FileExt_1=Input.FileExt;
750            end
751            if ~isfield(Input,'NomType_1')||strcmp(Input.NomType_1,'"')
752                Input.NomType_1=Input.NomType;
753            end
754            %updtate the indices of the second field series to correspond to the newly opened one
755            FileName_1=fullfile_uvmat(Input.RootPath_1,Input.SubDir_1,Input.RootFile_1,Input.FileExt_1,Input.NomType_1,i1_s,i2_s,j1_s,j2_s);
756            if exist(FileName_1,'file')
757                FileIndex_1=fullfile_uvmat('','','','',Input.NomType_1,i1_s,i2_s,j1_s,j2_s);
758            else
759                FileIndex_1=fullfile_uvmat('','','','',Input.NomType_1,i1,i2,j1,j2);
760                msgbox_uvmat('WARNING','unable to synchronise the indices of the two series')
761            end
762            set(handles.FileIndex_1,'String',FileIndex_1)
763        end
764       
765        %enable other menus
766        set(handles.MenuOpen_1,'Enable','on')
767        set(handles.MenuFile_1_1,'Enable','on')
768        set(handles.MenuFile_2_1,'Enable','on')
769        set(handles.MenuFile_3_1,'Enable','on')
770        set(handles.MenuFile_4_1,'Enable','on')
771        set(handles.MenuFile_5_1,'Enable','on')
772        set(handles.MenuExport,'Enable','on')
773        set(handles.MenuExportFigure,'Enable','on')
774        set(handles.MenuExportMovie,'Enable','on')
775        set(handles.MenuTools,'Enable','on')
776
777        % initiate input file series and refresh the current field view:     
778        update_rootinfo(handles,i1_series,i2_series,j1_series,j2_series,FileType,MovieObject,index);
779
780end
781
782%% update list of recent files in the menubar and save it for future opening
783MenuFile=[{get(handles.MenuFile_1,'Label')};{get(handles.MenuFile_2,'Label')};...
784    {get(handles.MenuFile_3,'Label')};{get(handles.MenuFile_4,'Label')};{get(handles.MenuFile_5,'Label')}];
785str_find=strcmp(fileinput,MenuFile);
786if isempty(find(str_find,1))
787    MenuFile=[{fileinput};MenuFile];%insert the current file if not already in the list
788end
789for ifile=1:min(length(MenuFile),5)
790    set(handles.(['MenuFile_' num2str(ifile)]),'Label',MenuFile{ifile});
791    set(handles.(['MenuFile_' num2str(ifile) '_1']),'Label',MenuFile{ifile});
792end
793dir_perso=prefdir;
794profil_perso=fullfile(dir_perso,'uvmat_perso.mat');
795if exist(profil_perso,'file')
796    save (profil_perso,'MenuFile','RootPath','-append'); %store the file names for future opening of uvmat
797else
798    save (profil_perso,'MenuFile','RootPath','-V6'); %store the file names for future opening of uvmat
799end
800
801%% set back the mouse pointer to arrow
802set(handles.uvmat,'Pointer','arrow')
803
804
805%------------------------------------------------------------------------
806% --- Update information about a new field series (indices to scan, timing,
807%     calibration from an xml file, then refresh current plots
808
809function update_rootinfo(handles,i1_series,i2_series,j1_series,j2_series,FileType,VideoObject,index)
810%------------------------------------------------------------------------
811%% define the relevant handles depending on the index (1=first file series, 2= second file series)
812if ~exist('index','var')
813    index=1;
814end
815if index==1
816    handles_RootPath=handles.RootPath;
817    handles_Fields=handles.FieldName;
818elseif index==2
819    handles_RootPath=handles.RootPath_1;
820    handles_Fields=handles.FieldName_1;
821end
822
823set(handles_RootPath,'BackgroundColor',[1 1 0])
824drawnow
825set(handles.FieldName,'UserData',[])% reinialize data from uvmat opening
826UvData=get(handles.uvmat,'UserData');%huvmat=handles of the uvmat interface
827UvData.NewSeries=1; %flag for run0: begin a new series
828UvData.FileName_1='';% name of the current second field (used to detect a  constant field during file scanning)
829UvData.FileType{index}=FileType;
830UvData.i1_series{index}=i1_series;
831UvData.i2_series{index}=i2_series;
832UvData.j1_series{index}=j1_series;
833UvData.j2_series{index}=j2_series;
834set(handles.FixVelType,'Value',0); %desactivate fixed veltype
835if index==1
836    [RootPath,SubDir,RootFile,FileIndices,FileExt]=read_file_boxes(handles);
837else
838    [RootPath,SubDir,RootFile,FileIndices,FileExt]=read_file_boxes_1(handles);
839end
840FileName=[fullfile(RootPath,SubDir,RootFile) FileIndices FileExt];
841FileBase=fullfile(RootPath,RootFile);
842if ~exist(FileName,'file')
843   msgbox_uvmat('ERROR',['input file ' FileName ' not found']);
844    return
845end
846
847%% read timing and total frame number from the current file (movie files) !! may be overrid by xml file
848XmlData.Time=[];%default
849XmlData.GeometryCalib=[];%default
850TimeUnit='';%default
851Time=[];
852imainfo=[];
853ColorType='falsecolor'; %default
854UvData.MovieObject{index}=VideoObject;
855if ~isempty(VideoObject)
856    imainfo=get(VideoObject);
857    TimeUnit='s';
858    if isempty(j1_series); %frame index along i
859        Time=zeros(imainfo.NumberOfFrames+1,2);
860        Time(:,2)=(0:1/imainfo.FrameRate:(imainfo.NumberOfFrames)/imainfo.FrameRate)';
861    else
862        Time=[0;ones(size(i1_series,3)-1,1)]*(0:1/imainfo.FrameRate:(imainfo.NumberOfFrames)/imainfo.FrameRate);
863    end
864    set(handles.Dt_txt,'String',['Dt=' num2str(1000/imainfo.FrameRate) 'ms']);%display the elementary time interval in millisec
865    ColorType='truecolor';
866elseif ~isempty(FileExt(2:end))&&(~isempty(imformats(FileExt(2:end))) || isequal(FileExt,'.vol'))%&& isequal(NomType,'*')% multi-frame image
867%     testima=1;
868    if ~isequal(SubDir,'')
869        imainfo=imfinfo([fullfile(RootPath,SubDir,RootFile) FileIndices FileExt]);
870    else
871        imainfo=imfinfo([FileBase FileIndices FileExt]);
872    end
873    ColorType=imainfo.ColorType;%='truecolor' for color images
874end
875if isfield(imainfo,'Width') && isfield(imainfo,'Height')
876    if length(imainfo)>1
877        set(handles.num_Npx,'String',num2str(imainfo(1).Width));%fills nbre of pixels x box
878        set(handles.num_Npy,'String',num2str(imainfo(1).Height));%fills nbre of pixels x box
879    else
880        set(handles.num_Npx,'String',num2str(imainfo.Width));%fills nbre of pixels x box
881        set(handles.num_Npy,'String',num2str(imainfo.Height));%fills nbre of pixels x box
882    end
883else
884    set(handles.num_Npx,'String','');%fills nbre of pixels x box
885    set(handles.num_Npy,'String','');%fills nbre of pixels x box
886end
887set(handles.CheckBW,'Value',strcmp(ColorType,'grayscale'))% select handles.CheckBW if grayscale image
888
889%% read parameters (time, geometric calibration..) from a documentation file (.xml advised)
890XmlFileName=find_imadoc(RootPath,SubDir,RootFile,FileExt);
891[tild,tild,DocExt]=fileparts(XmlFileName);
892warntext='';%default warning message
893NbSlice=1;%default
894ImaDoc_str='';
895set(handles.RootPath,'BackgroundColor',[1 1 1])
896if ~isempty(XmlFileName)
897    set(handles.view_xml,'Visible','on')
898    set(handles.view_xml,'BackgroundColor',[1 1 0])% paint  to yellow color to indicate reading of the xml file
899    set(handles.view_xml,'String','view .xml')
900    drawnow
901    [XmlDataRead,warntext]=imadoc2struct(XmlFileName);
902    if ~isempty(warntext)
903        msgbox_uvmat('WARNING',warntext)
904    end
905    if ~isempty(XmlDataRead)
906        ImaDoc_str=['view ' DocExt];   
907        XmlData=XmlDataRead;
908        if isfield(XmlData,'TimeUnit')
909            if isfield(XmlData,'TimeUnit')&& ~isempty(XmlData.TimeUnit)
910                TimeUnit=XmlData.TimeUnit;
911            end
912        end
913        set(handles.view_xml,'BackgroundColor',[1 1 1])% paint black to white
914        drawnow
915        if isfield(XmlData, 'GeometryCalib') && ~isempty(XmlData.GeometryCalib)
916            if isfield(XmlData.GeometryCalib,'VolumeScan') && isequal(XmlData.GeometryCalib.VolumeScan,'y')
917                set (handles.slices,'String','volume')
918            end
919            hgeometry_calib=findobj('tag','geometry_calib');
920            if ~isempty(hgeometry_calib)
921                GUserData=get(hgeometry_calib,'UserData');
922                if ~(isfield(GUserData,'XmlInputFile') && strcmp(GUserData.XmlInputFile,XmlFileName))
923                    answer=msgbox_uvmat('INPUT_Y-N','replace the display of geometry_calib with the new input data?');
924                    if strcmp(answer,'Yes')
925                        geometry_calib(XmlFileName);%diplay the new calibration points and parameters in geometry_calib
926                    end
927                end
928            end
929        end
930    end
931end
932if ~(isfield(XmlData,'Time')&& ~isempty(XmlData.Time))
933    XmlData.Time=Time; %time set by video
934end
935if isempty(ImaDoc_str)
936    set(handles.view_xml,'Visible','off')
937else
938    set(handles.view_xml,'String',ImaDoc_str)
939end
940
941%% store last index in handles.lat_i and .last_j
942nbfield=max(max(max(i2_series)));
943if isempty(nbfield)
944    nbfield=max(max(max(i1_series)));
945end
946nbfield_j=max(max(max(j2_series)));
947if isempty(nbfield_j)
948    nbfield_j=max(max(max(j1_series)));
949end
950if ~isempty(XmlData.Time)
951    %transform .Time to a column vector if it is a line vector the nomenclature uses a single index
952    if isequal(size(XmlData.Time,1),1)
953        %NomType=get(handles.NomType,'String');
954        XmlData.Time=(XmlData.Time)';
955    end
956end
957last_i_cell=get(handles.last_i,'String');
958if isempty(nbfield)
959    last_i_cell{index}='';
960else
961    last_i_cell{index}=num2str(nbfield);
962end
963set(handles.last_i,'String',last_i_cell)
964last_j_cell=get(handles.last_j,'String');
965if isempty(nbfield_j)
966     last_j_cell{index}='';
967else
968     last_j_cell{index}=num2str(nbfield_j);
969end
970set(handles.last_j,'String',last_j_cell);
971
972%% store geometric calibration in UvData
973if isfield(XmlData,'GeometryCalib')
974    GeometryCalib=XmlData.GeometryCalib;
975    if isempty(GeometryCalib)
976        set(handles.pxcm,'String','')
977        set(handles.pycm,'String','')
978        set(handles.TransformName,'Value',1); %  no transform by default
979    else
980        if (isfield(GeometryCalib,'R')&& ~isequal(GeometryCalib.R(2,1),0) && ~isequal(GeometryCalib.R(1,2),0)) ||...
981            (isfield(GeometryCalib,'kappa1')&& ~isequal(GeometryCalib.kappa1,0))
982            set(handles.pxcm,'String','var')
983            set(handles.pycm,'String','var')
984        elseif isfield(GeometryCalib,'fx_fy')
985            pixcmx=GeometryCalib.fx_fy(1);%*GeometryCalib.R(1,1)*GeometryCalib.sx/(GeometryCalib.Tz*GeometryCalib.dpx);
986            pixcmy=GeometryCalib.fx_fy(2);%*GeometryCalib.R(2,2)/(GeometryCalib.Tz*GeometryCalib.dpy);
987            set(handles.pxcm,'String',num2str(pixcmx))
988            set(handles.pycm,'String',num2str(pixcmy))
989        end
990        if ~get(handles.CheckFixLimits,'Value')
991            set(handles.TransformName,'Value',3); % phys transform by default if fixedLimits is off
992        end
993        if isfield(GeometryCalib,'SliceCoord')           
994           siz=size(GeometryCalib.SliceCoord);
995           if siz(1)>1
996               NbSlice=siz(1);
997               set(handles.slices,'Visible','on')
998               set(handles.slices,'Value',1)
999           end
1000           if isfield(GeometryCalib,'VolumeScan') && isequal(GeometryCalib.VolumeScan,'y')
1001               set(handles.num_NbSlice,'Visible','off')
1002           else
1003               set(handles.num_NbSlice,'Visible','on')
1004               set(handles.num_NbSlice,'String',num2str(NbSlice))
1005           end
1006           slices_Callback([],[], handles)
1007        end           
1008    end
1009end
1010
1011%% update the data attached to the uvmat interface
1012if ~isempty(TimeUnit)
1013    set(handles.time_txt,'String',['time (' TimeUnit ')'])
1014end
1015UvData.TimeUnit=TimeUnit;
1016UvData.XmlData{index}=XmlData;
1017UvData.NewSeries=1;
1018% UvData.MovieObject=MovieObject;
1019
1020%display warning message
1021if ~isequal(warntext,'')
1022    msgbox_uvmat('WARNING',warntext);
1023end
1024
1025%% set default options in menu 'FieldName'
1026switch FileType
1027    case {'civx','civdata'}
1028%         [FieldList,ColorList]=calc_field;
1029        [FieldList,ColorList]=set_field_list('U','V','C');
1030        set(handles_Fields,'String',[{'image'};FieldList;{'get_field...'}]);%standard menu for civx data
1031        set(handles_Fields,'Value',2) % set menu to 'velocity
1032        if index==1
1033            set(handles.FieldName_1,'Value',1);
1034            set(handles.FieldName_1,'String',[{''};{'image'};FieldList;{'get_field...'}]);%standard menu for civx data reproduced for the second field
1035        end
1036        set(handles.ColorScalar,'Value',1)
1037        set(handles.ColorScalar,'String',ColorList)
1038        set(handles.Vectors,'Visible','on')
1039        set(handles.Coord_x,'Value',1);
1040        set(handles.Coord_x,'String',{'X'});
1041        set(handles.Coord_y,'Value',1);
1042        set(handles.Coord_y,'String',{'Y'});
1043    case 'netcdf'
1044        set(handles_Fields,'Value',1)
1045        set(handles_Fields,'String',{'get_field...'})
1046        FieldName_Callback([],[], handles)
1047%         hget_field=get_field(FileName);
1048%         hhget_field=guidata(hget_field);
1049%         get_field('RUN_Callback',hhget_field.RUN,[],hhget_field);
1050    otherwise
1051        set(handles_Fields,'Value',1) % set menu to 'image'
1052        set(handles_Fields,'String',{'image'})
1053        set(handles.Coord_x,'Value',1);
1054        set(handles.Coord_x,'String',{'AX'});
1055        set(handles.Coord_y,'Value',1);
1056        set(handles.Coord_y,'String',{'AY'});
1057end
1058set(handles.uvmat,'UserData',UvData)
1059
1060%% set index navigation options and refresh plots
1061scan_option='i';%default
1062state_j='off'; %default
1063if index==2
1064    if get(handles.scan_j,'Value')
1065        scan_option='j'; %keep the scan option for the second file series
1066    end
1067    if strcmp(get(handles.j1,'Visible'),'on')
1068        state_j='on';
1069    end
1070end
1071[ref_j,ref_i]=find(squeeze(i1_series(1,:,:)));
1072if ~isempty(j1_series)
1073        state_j='on';
1074        if index==1
1075            if isequal(ref_i,ref_i(1)*ones(size(ref_j)))% if ref_i is always equal to its first value
1076                scan_option='j'; %scan j indext               
1077            end
1078        end
1079end
1080if isequal(scan_option,'i')
1081    diff_ref_i=diff(ref_i,1);
1082    if isempty(diff_ref_i)
1083        diff_ref_i=1;
1084    end
1085    if isequal (diff_ref_i,diff_ref_i(1)*ones(size(diff_ref_i)))
1086        set(handles.num_IndexIncrement,'String',num2str(diff_ref_i(1)))
1087    end
1088     set(handles.scan_i,'Value',1)
1089     scan_i_Callback([],[], handles);
1090else
1091    diff_ref_j=diff(ref_j);
1092    if isempty(diff_ref_j)
1093        diff_ref_j=1;
1094    end
1095    if isequal (diff_ref_j,diff_ref_j(1)*ones(size(diff_ref_j)))
1096        set(handles.num_IndexIncrement,'String',num2str(diff_ref_j(1)))
1097    end
1098     set(handles.scan_j,'Value',1)
1099     scan_j_Callback([],[], handles);
1100end
1101set(handles.scan_j,'Visible',state_j)
1102set(handles.j1,'Visible',state_j)
1103set(handles.j2,'Visible',state_j)
1104set(handles.last_j,'Visible',state_j);
1105set(handles.frame_j,'Visible',state_j);
1106set(handles.j_text,'Visible',state_j);
1107if ~isempty(i2_series)||~isempty(j2_series)
1108    set(handles.CheckFixPair,'Visible','on')
1109elseif index==1
1110    set(handles.CheckFixPair,'Visible','off')
1111end
1112
1113%% apply the effect of the transform fct and view the field 
1114transform=get(handles.TransformPath,'UserData');
1115if index==2 && (~isa(transform,'function_handle')||nargin(transform)<3)
1116    set(handles.TransformName,'value',2); % set transform to sub_field if the current fct doe not accept two input fields
1117end
1118TransformName_Callback([],[],handles)
1119mask_test=get(handles.CheckMask,'value');
1120if mask_test
1121    MaskData=get(handles.CheckMask,'UserData');
1122    if isfield(MaskData,'maskhandle') && ishandle(MaskData.maskhandle)
1123          delete(MaskData.maskhandle)    %delete old mask
1124    end
1125    CheckMask_Callback([],[],handles)
1126end
1127
1128%------------------------------------------------------------------------
1129% --- switch file index scanning options scan_i and scan_j in an exclusive way
1130function scan_i_Callback(hObject, eventdata, handles)
1131%------------------------------------------------------------------------
1132if get(handles.scan_i,'Value')==1
1133%     set(handles.scan_i,'BackgroundColor',[1 1 0])
1134    set(handles.scan_j,'Value',0)
1135else
1136%     set(handles.scan_i,'BackgroundColor',[0.831 0.816 0.784])
1137    set(handles.scan_j,'Value',1)
1138end
1139scan_j_Callback(hObject, eventdata, handles)
1140
1141%------------------------------------------------------------------------
1142% --- switch file index scanning options scan_i and scan_j in an exclusive way
1143function scan_j_Callback(hObject, eventdata, handles)
1144%------------------------------------------------------------------------
1145if get(handles.scan_j,'Value')==1
1146%     set(handles.scan_j,'BackgroundColor',[1 1 0])
1147    set(handles.scan_i,'Value',0)
1148%     set(handles.scan_i,'BackgroundColor',[0.831 0.816 0.784])
1149%     NomType=get(handles.NomType,'String');
1150%     switch NomType
1151%     case {'_1_1-2','#_ab','%3dab'},% pair with j index
1152%         set(handles.CheckFixPair,'Visible','on')% option fixed pair on/off made visible (choice of avaible pair with buttons + and - if ='off')
1153%     otherwise
1154%         set(handles.CheckFixPair,'Visible','off')
1155%     end
1156else
1157%     set(handles.scan_j,'BackgroundColor',[0.831 0.816 0.784])
1158    set(handles.scan_i,'Value',1)
1159%     set(handles.scan_i,'BackgroundColor',[1 1 0])
1160    set(handles.CheckFixPair,'Visible','off')
1161end
1162
1163%------------------------------------------------------------------------
1164function i1_Callback(hObject, eventdata, handles)
1165%------------------------------------------------------------------------
1166update_ij(handles,1)
1167
1168%------------------------------------------------------------------------
1169function i2_Callback(hObject, eventdata, handles)
1170%------------------------------------------------------------------------
1171update_ij(handles,2)
1172
1173%------------------------------------------------------------------------
1174function j1_Callback(hObject, eventdata, handles)
1175%------------------------------------------------------------------------
1176update_ij(handles,3)
1177
1178%------------------------------------------------------------------------
1179function j2_Callback(hObject, eventdata, handles)
1180%------------------------------------------------------------------------
1181update_ij(handles,4)
1182
1183%------------------------------------------------------------------------
1184%--- update the index display after action on edit boxes i1, i2, j1 or j2
1185function update_ij(handles,index_rank)
1186NomType=get(handles.NomType,'String');
1187indices=get(handles.FileIndex,'String');
1188[tild,tild,tild,i1,i2,j1,j2]=fileparts_uvmat(indices);% the indices for the second series taken from FileIndex
1189switch index_rank
1190    case 1
1191        indices=fullfile_uvmat('','','','',NomType,stra2num(get(handles.i1,'String')),i2,j1,j2);
1192        set(handles.i1,'BackgroundColor',[0.7 0.7 0.7])% mark the edit box in grey, then RUN0 will mark it in white for confirmation
1193    case 2
1194        indices=fullfile_uvmat('','','','',NomType,i1,stra2num(get(handles.i2,'String')),j1,j2);
1195        set(handles.i2,'BackgroundColor',[0.7 0.7 0.7])% mark the edit box in grey, then RUN0 will mark it in white for confirmation
1196    case 3
1197        indices=fullfile_uvmat('','','','',NomType,i1,i2,stra2num(get(handles.j1,'String')),j2);
1198        set(handles.j1,'BackgroundColor',[0.7 0.7 0.7])% mark the edit box in grey, then RUN0 will mark it in white for confirmation
1199    case 4
1200        indices=fullfile_uvmat('','','','',NomType,i1,i2,j1,stra2num(get(handles.j2,'String')));
1201        set(handles.j2,'BackgroundColor',[0.7 0.7 0.7])% mark the edit box in grey, then RUN0 will mark it in white for confirmation
1202end
1203set(handles.FileIndex,'String',indices)
1204set(handles.FileIndex,'BackgroundColor',[0.7 0.7 0.7])% mark the edit box in grey, then RUN0 will mark it in white for confirmation
1205% update the second index if relevant
1206if strcmp(get(handles.FileIndex_1,'Visible'),'on')
1207    NomType_1=get(handles.NomType_1,'String');
1208    indices_1=get(handles.FileIndex_1,'String');
1209    [tild,tild,tild,i1_1,i2_1,j1_1,j2_1]=fileparts_uvmat(indices_1);% the indices for the second series taken from FileIndex_1
1210    switch index_rank
1211        case 1
1212            indices_1=fullfile_uvmat('','','','',NomType_1,stra2num(get(handles.i1,'String')),i2_1,j1_1,j2_1);
1213        case 2
1214            indices_1=fullfile_uvmat('','','','',NomType_1,i1_1,stra2num(get(handles.i2,'String')),j1_1,j2_1);
1215        case 3
1216            indices_1=fullfile_uvmat('','','','',NomType_1,i1_1,i2_1,stra2num(get(handles.j1,'String')),j2_1);
1217        case 4
1218            indices_1=fullfile_uvmat('','','','',NomType_1,i1_1,i2_1,j1_1,stra2num(get(handles.j2,'String')));
1219    end
1220    set(handles.FileIndex_1,'String',indices_1)
1221    set(handles.FileIndex_1,'BackgroundColor',[0.7 0.7 0.7])% mark the edit box in grey, then RUN0 will mark it in white for confirmation
1222end
1223   
1224%------------------------------------------------------------------------
1225
1226%------------------------------------------------------------------------
1227function slices_Callback(hObject, eventdata, handles)
1228%------------------------------------------------------------------------
1229if strcmp(get(handles.slices,'String'),'slices')
1230    if get(handles.slices,'Value')==1
1231        set(handles.num_NbSlice,'Visible','on')
1232        set(handles.z_text,'Visible','on')
1233        set(handles.z_index,'Visible','on')
1234        num_NbSlice_Callback(hObject, eventdata, handles)
1235    else
1236        set(handles.num_NbSlice,'Visible','off')
1237        set(handles.z_text,'Visible','off')
1238        set(handles.z_index,'Visible','off')
1239        set(handles.masklevel,'Value',1)
1240        set(handles.masklevel,'String',{'1'})
1241    end
1242end
1243
1244%------------------------------------------------------------------------
1245function num_NbSlice_Callback(hObject, eventdata, handles)
1246%------------------------------------------------------------------------
1247mode=get(handles.slices,'String');
1248nb_slice_str=get(handles.num_NbSlice,'String');
1249if strcmp(mode,'volume')
1250    z=stra2num(get(handles.j1,'String'));
1251else
1252    num=str2double(get(handles.i1,'String'));
1253    nbslice=str2double(get(handles.num_NbSlice,'String'));
1254    z=mod(num-1,nbslice)+1;
1255end
1256set(handles.z_index,'String',num2str(z))
1257for ilist=1:nbslice
1258    list_index{ilist,1}=num2str(ilist);
1259end   
1260set(handles.masklevel,'String',list_index)
1261set(handles.masklevel,'Value',z)
1262
1263%------------------------------------------------------------------------
1264% --- Executes on button press in view_xml.
1265function view_xml_Callback(hObject, eventdata, handles)
1266%------------------------------------------------------------------------
1267%[FileName,RootPath,FileBase,FileIndices,FileExt]=read_file_boxes(handles);
1268 [RootPath,SubDir,RootFile,FileIndices,FileExt]=read_file_boxes(handles);
1269FileBase=fullfile(RootPath,RootFile);
1270option=get(handles.view_xml,'String');
1271if isequal(option,'view .xml')
1272    FileXml=fullfile(RootPath,[SubDir '.xml']);
1273    if ~exist(FileXml,'file')% case of civ files , removes the extension for subdir
1274        FileXml=fullfile(RootPath,[regexprep(SubDir,'\..+$','') '.xml']);
1275    end
1276    heditxml=editxml(FileXml);
1277end
1278
1279%------------------------------------------------------------------------
1280% --- Executes on button press in CheckMask.
1281function CheckMask_Callback(hObject, eventdata, handles)
1282%------------------------------------------------------------------------
1283%case of view mask selection
1284if isequal(get(handles.CheckMask,'Value'),1)
1285     [RootPath,SubDir,RootFile,FileIndices,FileExt]=read_file_boxes(handles);
1286     FileBase=fullfile(RootPath,RootFile);
1287    num_i1=stra2num(get(handles.i1,'String'));
1288    num_j1=stra2num(get(handles.j1,'String'));
1289    currentdir=pwd; 
1290    cd(RootPath);
1291    maskfiles=dir('*_*mask_*.png');%look for a mask file
1292    cd(currentdir);%come back to the working directory
1293    mdetect=0;
1294    if ~isempty(maskfiles)
1295        for ilist=1:length(maskfiles)
1296            maskname=maskfiles(ilist).name;% take the first mask file in the list
1297            [tild,tild,tild,tild,tild,tild,tild,MaskExt,Mask_NomType{ilist}]=fileparts_uvmat(maskname);
1298             [tild,Name]=fileparts(maskname);
1299            Namedouble=double(Name);
1300            val=(48>Namedouble)|(Namedouble>57);% select the non-numerical characters
1301            ind_mask=findstr('mask',Name);
1302            i=ind_mask-1;
1303            while val(i)==0 && i>0
1304                i=i-1;
1305            end
1306            nbmask_str=str2num(Name(i+1:ind_mask-1));
1307            if ~isempty(nbmask_str)
1308                nbslice(ilist)=nbmask_str; % number of different masks (slices)
1309            end
1310        end
1311        if isequal(min(nbslice),max(nbslice))
1312            nbslice=nbslice(1);
1313        else
1314            msgbox_uvmat('ERROR','several inconsistent mask sets coexist in the current image directory')
1315            return
1316        end
1317        if ~isempty(nbslice) && Name(i)=='_'
1318            Mask.Base=[FileBase Name(i:ind_mask+3)];
1319            Mask.NbSlice=nbslice;
1320            num_i1=mod(num_i1-1,nbslice)+1;
1321            Mask.NomType=regexprep(Mask_NomType{1},'0','');%remove '0' in nom type for masks
1322            [RootPath,RootFile]=fileparts(Mask.Base);
1323            maskname=fullfile_uvmat(RootPath,'',RootFile,'.png',Mask.NomType,num_i1,[],num_j1);
1324            %maskname=name_generator(Mask.Base,num_i1,num_j1,'.png',Mask.NomType);%
1325            mdetect=exist(maskname,'file');
1326            if mdetect
1327                set(handles.num_NbSlice,'String',Name(i+1:ind_mask-1));
1328                 set(handles.num_NbSlice,'BackgroundColor',[1 1 0])
1329                set(handles.CheckMask,'UserData',Mask);
1330                set(handles.CheckMask,'BackgroundColor',[1 1 0])
1331                if nbslice > 1
1332                    set(handles.slices,'value',1)
1333                    slices_Callback(hObject, eventdata, handles)
1334                end
1335            end
1336        end
1337    end
1338    errormsg=[];%default
1339    if mdetect==0
1340        [FileName, PathName, filterindex] = uigetfile( ...
1341            {'*.png', ' (*.png)';
1342            '*.png',  '.png files '; ...
1343            '*.*', 'All Files (*.*)'}, ...
1344            'Pick a mask file *.png',FileBase);
1345        if ~ischar(FileName),return,end %abandon if the browser is cancelled
1346        maskname=fullfile(PathName,FileName);
1347        [RootDir,SubDir,RootFile,tild,tild,tild,tild,tild,Mask.NomType]=fileparts_uvmat(maskname);
1348        Mask.Base=fullfile(RootDir,SubDir,RootFile);
1349        Mask.NbSlice=1;
1350        set(handles.CheckMask,'UserData',Mask);
1351        set(handles.CheckMask,'BackgroundColor',[1 1 0])
1352    end
1353    if isempty(errormsg)
1354        errormsg=update_mask(handles,num_i1,num_j1);
1355    end
1356    if ~isempty(errormsg)
1357            set(handles.CheckMask,'Value',0)
1358            set(handles.CheckMask,'BackgroundColor',[0.7 0.7 0.7])
1359     end
1360else % desactivate mask display
1361    MaskData=get(handles.CheckMask,'UserData');
1362    if isfield(MaskData,'maskhandle') && ishandle(MaskData.maskhandle)
1363          delete(MaskData.maskhandle)   
1364    end
1365    set(handles.CheckMask,'UserData',[])   
1366    UvData=get(handles.uvmat,'UserData');
1367    if isfield(UvData,'MaskName')
1368        UvData=rmfield(UvData,'MaskName');
1369        set(handles.uvmat,'UserData',UvData)
1370    end
1371    set(handles.CheckMask,'BackgroundColor',[0.7 0.7 0.7])
1372end
1373
1374%------------------------------------------------------------------------
1375function errormsg=update_mask(handles,num_i1,num_j1)
1376%------------------------------------------------------------------------
1377errormsg=[];%default
1378MaskData=get(handles.CheckMask,'UserData');
1379if isfield(MaskData,'maskhandle')&& ishandle(MaskData.maskhandle)
1380    uistack(MaskData.maskhandle,'top');
1381end
1382num_i1_mask=mod(num_i1-1,MaskData.NbSlice)+1;
1383[RootPath,RootFile]=fileparts(MaskData.Base);
1384MaskName=fullfile_uvmat(RootPath,'',RootFile,'.png',MaskData.NomType,num_i1_mask,[],num_j1);
1385UvData=get(handles.uvmat,'UserData');
1386%update mask image if the mask is new
1387if ~ (isfield(UvData,'MaskName') && isequal(UvData.MaskName,MaskName))
1388    UvData.MaskName=MaskName; %update the recorded name on UvData
1389    set(handles.uvmat,'UserData',UvData);
1390    if ~exist(MaskName,'file')
1391        if isfield(MaskData,'maskhandle')&& ishandle(MaskData.maskhandle)
1392            delete(MaskData.maskhandle)   
1393        end
1394    else
1395        %read mask image
1396        [Mask,tild,errormsg] = read_field(MaskName,'image');
1397%         Mask.AName='image';
1398%         Mask.A=imread(MaskName);
1399        if ~isempty(errormsg)
1400            return
1401        end
1402        npxy=size(Mask.A);
1403        if length(npxy)>2
1404            errormsg=[MaskName ' is not a grey scale image'];
1405            return
1406        elseif ~isa(Mask.A,'uint8')
1407            errormsg=[MaskName ' is not a 8 bit grey level image'];
1408            return
1409        end
1410%         Mask.AX=[0.5 npxy(2)-0.5];
1411%         Mask.AY=[npxy(1)-0.5 0.5 ];
1412%         Mask.CoordUnit='pixel';
1413        if isequal(get(handles.slices,'Value'),1)
1414           NbSlice=str2num(get(handles.num_NbSlice,'String'));
1415           num_i1=str2num(get(handles.i1,'String'));
1416           Mask.ZIndex=mod(num_i1-1,NbSlice)+1;
1417        end
1418        %px to phys or other transform on field
1419         menu_transform=get(handles.TransformName,'String');
1420        choice_value=get(handles.TransformName,'Value');
1421        transform_name=menu_transform{choice_value};%name of the transform fct  given by the menu 'transform_fct'
1422        transform=get(handles.TransformPath,'UserData');
1423        if  ~isequal(transform_name,'') && ~isequal(transform_name,'px')
1424            if isfield(UvData,'XmlData') && isfield(UvData.XmlData{1},'GeometryCalib')%use geometry calib recorded from the ImaDoc xml file as first priority
1425                Calib=UvData.XmlData{1}.GeometryCalib;
1426                Mask=transform(Mask,UvData.XmlData{1});
1427            end
1428        end
1429        flagmask=Mask.A < 200;
1430       
1431        %make brown color image
1432        imflag(:,:,1)=0.9*flagmask;
1433        imflag(:,:,2)=0.7*flagmask;
1434        imflag(:,:,3)=zeros(size(flagmask));
1435       
1436        %update mask image
1437        hmask=[]; %default
1438        if isfield(MaskData,'maskhandle')&& ishandle(MaskData.maskhandle)
1439            hmask=MaskData.maskhandle;
1440        end
1441        if ~isempty(hmask)
1442            set(hmask,'CData',imflag)   
1443            set(hmask,'AlphaData',flagmask*0.6)
1444            set(hmask,'XData',Mask.AX);
1445            set(hmask,'YData',Mask.AY);
1446%             uistack(hmask,'top')
1447        else
1448            axes(handles.PlotAxes)
1449            hold on   
1450            MaskData.maskhandle=image(Mask.AX,Mask.AY,imflag,'Tag','mask','HitTest','off','AlphaData',0.6*ones(size(flagmask)));
1451            set(handles.CheckMask,'UserData',MaskData)
1452        end
1453    end
1454end
1455
1456%------------------------------------------------------------------------
1457%------------------------------------------------------------------------
1458% III - MAIN REFRESH FUNCTIONS : 'FRAME PLOT'
1459%------------------------------------------------------------------------
1460
1461%------------------------------------------------------------------------
1462% --- Executes on button press in runplus: make one step forward and call
1463% --- run0. The step forward is along the fieldname series 1 or 2 depending on
1464% --- the scan_i and scan_j check box (exclusive each other)
1465function runplus_Callback(hObject, eventdata, handles)
1466%------------------------------------------------------------------------
1467set(handles.runplus,'BackgroundColor',[1 1 0])%paint the command button in yellow
1468drawnow
1469%TODO: introduce the option: increment ='*' to move to the next available view
1470increment=str2num(get(handles.num_IndexIncrement,'String')); %get the field increment d
1471% if isnan(increment)
1472%     set(handles.num_IndexIncrement,'String','1')%default value
1473%     increment=1;
1474% end
1475errormsg=runpm(hObject,eventdata,handles,increment);
1476if ~isempty(errormsg)
1477    msgbox_uvmat('ERROR',errormsg);
1478end
1479set(handles.runplus,'BackgroundColor',[1 0 0])%paint the command button back to red
1480
1481%------------------------------------------------------------------------
1482% --- Executes on button press in runmin: make one step backward and call
1483% --- run0. The step backward is along the fieldname series 1 or 2 depending on
1484% --- the scan_i and scan_j check box (exclusive each other)
1485function runmin_Callback(hObject, eventdata, handles)
1486%------------------------------------------------------------------------
1487set(handles.runmin,'BackgroundColor',[1 1 0])%paint the command button in yellow
1488drawnow
1489increment=-str2num(get(handles.num_IndexIncrement,'String')); %get the field increment d
1490% if isnan(increment)
1491%     set(handles.num_IndexIncrement,'String','1')%default value
1492%     increment=1;
1493% end
1494errormsg=runpm(hObject,eventdata,handles,increment);
1495if ~isempty(errormsg)
1496    msgbox_uvmat('ERROR',errormsg);
1497end
1498set(handles.runmin,'BackgroundColor',[1 0 0])%paint the command button back to red
1499
1500%------------------------------------------------------------------------
1501% -- Executes on button press in Movie: make a series of +> steps
1502function Movie_Callback(hObject, eventdata, handles)
1503%------------------------------------------------------------------------
1504set(handles.Movie,'BackgroundColor',[1 1 0])%paint the command button in yellow
1505drawnow
1506increment=str2num(get(handles.num_IndexIncrement,'String')); %get the field increment d
1507% if isnan(increment)
1508%     set(handles.num_IndexIncrement,'String','1')%default value
1509%     increment=1;
1510% end
1511set(handles.STOP,'Visible','on')
1512set(handles.speed,'Visible','on')
1513set(handles.speed_txt,'Visible','on')
1514set(handles.Movie,'BusyAction','queue')
1515UvData=get(handles.uvmat,'UserData');
1516
1517while get(handles.Movie,'Value')==1 && get(handles.speed,'Value')~=0 && isequal(get(handles.Movie,'BusyAction'),'queue') % enable STOP command
1518        errormsg=runpm(hObject,eventdata,handles,increment);
1519        if ~isempty(errormsg)
1520            set(handles.Movie,'BackgroundColor',[1 0 0])%paint the command buttonback to red
1521            return
1522        end
1523        pause(1.02-get(handles.speed,'Value'))% wait for next image
1524end
1525if isfield(UvData,'aviobj') && ~isempty( UvData.aviobj),
1526    UvData.aviobj=close(UvData.aviobj);
1527   set(handles.uvmat,'UserData',UvData);
1528end
1529set(handles.Movie,'BackgroundColor',[1 0 0])%paint the command buttonback to red
1530
1531%------------------------------------------------------------------------
1532% -- Executes on button press in Movie: make a series of <- steps
1533function MovieBackward_Callback(hObject, eventdata, handles)
1534%------------------------------------------------------------------------
1535set(handles.MovieBackward,'BackgroundColor',[1 1 0])%paint the command button in yellow
1536drawnow
1537increment=-str2num(get(handles.num_IndexIncrement,'String')); %get the field increment d
1538set(handles.STOP,'Visible','on')
1539set(handles.speed,'Visible','on')
1540set(handles.speed_txt,'Visible','on')
1541set(handles.MovieBackward,'BusyAction','queue')
1542UvData=get(handles.uvmat,'UserData');
1543
1544while get(handles.MovieBackward,'Value')==1 && get(handles.speed,'Value')~=0 && isequal(get(handles.MovieBackward,'BusyAction'),'queue') % enable STOP command
1545        errormsg=runpm(hObject,eventdata,handles,increment);
1546        if ~isempty(errormsg)
1547            set(handles.MovieBackward,'BackgroundColor',[1 0 0])%paint the command buttonback to red
1548            return
1549        end
1550        pause(1.02-get(handles.speed,'Value'))% wait for next image
1551end
1552if isfield(UvData,'aviobj') && ~isempty( UvData.aviobj),
1553    UvData.aviobj=close(UvData.aviobj);
1554   set(handles.uvmat,'UserData',UvData);
1555end
1556set(handles.MovieBackward,'BackgroundColor',[1 0 0])%paint the command buttonback to red
1557
1558%------------------------------------------------------------------------
1559function STOP_Callback(hObject, eventdata, handles)
1560%------------------------------------------------------------------------
1561set(handles.movie_pair,'BusyAction','Cancel')
1562set(handles.movie_pair,'value',0)
1563set(handles.Movie,'BusyAction','Cancel')
1564set(handles.MovieBackward,'BusyAction','Cancel')
1565set(handles.MenuExportMovie,'BusyAction','Cancel')
1566set(handles.movie_pair,'BackgroundColor',[1 0 0])%paint the command buttonback to red
1567set(handles.Movie,'BackgroundColor',[1 0 0])%paint the command buttonback to red
1568set(handles.MovieBackward,'BackgroundColor',[1 0 0])%paint the command buttonback to red
1569
1570%------------------------------------------------------------------------
1571% --- function activated by runplus and run minus
1572function errormsg=runpm(hObject,eventdata,handles,increment)
1573%------------------------------------------------------------------------
1574errormsg='';%default
1575%% check for movie pair status
1576movie_status=get(handles.movie_pair,'Value');
1577if isequal(movie_status,1)
1578    STOP_Callback(hObject, eventdata, handles)%interrupt movie pair if active
1579end
1580
1581%% read the current input file name(s) and field indices
1582InputFile=read_GUI(handles.InputFile);
1583InputFile.RootFile=regexprep(InputFile.RootFile,'^[\\/]|[\\/]$','');%suppress possible / or \ separator at the beginning or the end of the string
1584InputFile.SubDir=regexprep(InputFile.SubDir,'^[\\/]|[\\/]$','');%suppress possible / or \ separator at the beginning or the end of the string
1585FileExt=InputFile.FileExt;
1586NomType=get(handles.NomType,'String');
1587i1=str2num(get(handles.i1,'String'));%read the field indices (for movie, it is not given by the file name)
1588i2=[];%default
1589if strcmp(get(handles.i2,'Visible'),'on')
1590    i2=str2num(get(handles.i2,'String'));
1591end
1592j1=[];
1593if strcmp(get(handles.j1,'Visible'),'on')
1594    j1=stra2num(get(handles.j1,'String'));
1595end
1596j2=j1;
1597if strcmp(get(handles.j2,'Visible'),'on')
1598    j2=stra2num(get(handles.j2,'String'));
1599end
1600sub_value= get(handles.SubField,'Value');
1601if sub_value % a second input file has been entered
1602     [InputFile.RootPath_1,InputFile.SubDir_1,InputFile.RootFile_1,InputFile.FileIndex_1,InputFile.FileExt_1,InputFile.NomType_1]=read_file_boxes_1(handles);   
1603    [tild,tild,tild,i1_1,i2_1,j1_1,j2_1]=fileparts_uvmat(InputFile.FileIndex_1);% the indices for the second series taken from FileIndex_1
1604else
1605    filename_1=[];
1606end   
1607
1608%% increment (or decrement) the field indices and update the input filename(s)
1609if isempty(increment)
1610    set(handles.CheckFixPair,'Value',0)
1611end
1612CheckFixPair=get(handles.CheckFixPair,'Value')||(isempty(i2)&&isempty(j2));
1613
1614% the pair i1-i2 or j1-j2 is imposed (check box CheckFixPair selected)
1615        i1_1=i1;
1616        i2_1=i2;
1617        j1_1=j1;
1618        j2_1=j2;
1619if CheckFixPair
1620    if get(handles.scan_i,'Value')==1% case of scanning along index i
1621        i1=i1+increment;
1622        i2=i2+increment;
1623        if sub_value
1624            i1_1=i1_1+increment;
1625            i2_1=i2_1+increment;
1626        end
1627       
1628    else % case of scanning along index j (burst numbers)
1629        j1=j1+increment;
1630        j2=j2+increment;
1631        if sub_value
1632            j1_1=j1_1+increment;
1633            j2_1=j2_1+increment;
1634        end
1635    end
1636   
1637% the pair i1-i2 or j1-j2 is free (check box CheckFixPair not selected): the list of existing indices recorded in UvData is used
1638else
1639    UvData=get(handles.uvmat,'UserData');
1640    ref_i=i1;
1641    if ~isempty(i2)
1642        ref_i=floor((i1+i2)/2);% current reference index i
1643    end
1644    ref_j=1;
1645    if ~isempty(j1)
1646        ref_j=j1;
1647        if ~isempty(j2)
1648            ref_j=floor((j1+j2)/2);% current reference index j
1649        end
1650    end
1651    if ~isempty(increment)
1652        if get(handles.scan_i,'Value')==1% case of scanning along index i
1653            ref_i=ref_i+increment;% increment the current reference index i
1654        else % case of scanning along index j (burst numbers)
1655            ref_j=ref_j+increment;% increment the current reference index j if scan_j option is used
1656        end
1657    else % free increment
1658        runaction=get(gcbo,'tag');
1659        if strcmp(runaction,'runplus')||strcmp(runaction,'Movie')% if runplus or movie is activated
1660            step=1;
1661        else
1662            step=-1;
1663        end
1664        if get(handles.scan_i,'Value')==1% case of scanning along index i
1665            ref_i=ref_i+step;
1666            while ref_i>=0  && size(UvData.i1_series{1},3)>=ref_i+1 && UvData.i1_series{1}(1,ref_j+1,ref_i+1)==0
1667                ref_i=ref_i+step;
1668            end
1669        else % case of scanning along index j (burst numbers)
1670            ref_j=ref_j+step;
1671            while ref_j>=0  && size(UvData.i1_series{1},2)>=ref_j+1 && UvData.i1_series{1}(1,ref_j+1,ref_i+1)==0
1672                ref_j=ref_j+step;
1673            end
1674        end
1675    end
1676    if ref_i<0
1677        errormsg='minimum i index reached';
1678    elseif ref_j<0
1679        errormsg='minimum j index reached';
1680    elseif ref_i+1>size(UvData.i1_series{1},3)
1681        errormsg='maximum i index reached (reload the input file to update the index bound)';
1682    elseif ref_j+1>size(UvData.i1_series{1},2)
1683        errormsg='maximum j index reached (reload the input file to update the index bound)';
1684    end
1685    if ~isempty(errormsg),return,end
1686    siz=size(UvData.i1_series{1});
1687    ref_indices=ref_i*siz(1)*siz(2)+ref_j*siz(1)+1:ref_i*siz(1)*siz(2)+(ref_j+1)*siz(1);
1688    i1_subseries=UvData.i1_series{1}(ref_indices);
1689    ref_indices=ref_indices(i1_subseries>0);
1690    if isempty(ref_indices)% case of pairs (free index i)
1691        ref_indices=ref_i*siz(1)*siz(2)+1:(ref_i+1)*siz(1)*siz(2);
1692        i1_subseries=UvData.i1_series{1}(ref_indices);
1693        ref_indices=ref_indices(i1_subseries>0);
1694    end
1695    if isempty(ref_indices),errormsg='no next frame: set num_IndexIncrement =''*'' to reach the next existing file';return
1696    end
1697    i1=UvData.i1_series{1}(ref_indices(end));
1698    if ~isempty(UvData.i2_series{1})
1699        i2=UvData.i2_series{1}(ref_indices(end));
1700    end
1701    if ~isempty(UvData.j1_series{1})
1702        j1=UvData.j1_series{1}(ref_indices(end));
1703    end
1704    if ~isempty(UvData.j2_series{1})
1705        j2=UvData.j2_series{1}(ref_indices(end));
1706    end
1707   
1708    % case of a second file series
1709    if sub_value
1710        ref_i_1=i1_1;
1711        if ~isempty(i2_1)
1712            ref_i_1=floor((i1_1+i2_1)/2);% current reference index i
1713        end
1714        ref_j_1=1;
1715        if ~isempty(j1_1)
1716            ref_j_1=j1_1;
1717            if ~isempty(j2_1)
1718                ref_j_1=floor((j1_1+j2_1)/2);% current reference index j
1719            end
1720        end
1721        if ~isempty(increment)
1722            if get(handles.scan_i,'Value')==1% case of scanning along index i
1723                ref_i_1=ref_i_1+increment;% increment the current reference index i
1724            else % case of scanning along index j (burst numbers)
1725                ref_j_1=ref_j_1+increment;% increment the current reference index j if scan_j option is used
1726            end
1727        else % free increment, synchronise the ref indices with the first series
1728            ref_i_1=ref_i;
1729            ref_j_1=ref_j;
1730        end
1731        if numel(UvData.i1_series)==1
1732            UvData.i1_series{2}=UvData.i1_series{1};
1733            UvData.j1_series{2}=UvData.j1_series{1};
1734            UvData.i2_series{2}=UvData.i2_series{1};
1735            UvData.j2_series{2}=UvData.j2_series{1};
1736        end
1737        if ref_i_1<0
1738            errormsg='minimum i index reached';
1739        elseif ref_j_1<0
1740            errormsg='minimum j index reached';
1741        elseif ref_i_1+1>size(UvData.i1_series{2},3)
1742            errormsg='maximum i index reached for the second series (reload the input file to update the index bound)';
1743        elseif ref_j_1+1>size(UvData.i1_series{2},2)
1744            errormsg='maximum j index reached for the second series(reload the input file to update the index bound)';
1745        end
1746        if ~isempty(errormsg),return,end
1747        siz=size(UvData.i1_series{2});
1748        ref_indices=ref_i_1*siz(1)*siz(2)+ref_j_1*siz(1)+1:ref_i_1*siz(1)*siz(2)+(ref_j_1+1)*siz(1);
1749        i1_subseries=UvData.i1_series{2}(ref_indices);
1750        ref_indices=ref_indices(i1_subseries>0);
1751        if isempty(ref_indices)% case of pairs (free index i)
1752            ref_indices=ref_i_1*siz(1)*siz(2)+1:(ref_i_1+1)*siz(1)*siz(2);
1753            i1_subseries=UvData.i1_series{2}(ref_indices);
1754            ref_indices=ref_indices(i1_subseries>0);
1755        end
1756        i1_1=UvData.i1_series{2}(ref_indices(end));
1757        if ~isempty(UvData.i2_series{2})
1758            i2_1=UvData.i2_series{2}(ref_indices(end));
1759        end
1760        if ~isempty(UvData.j1_series{2})
1761            j1_1=UvData.j1_series{2}(ref_indices(end));
1762        end
1763        if ~isempty(UvData.j2_series{2})
1764            j2_1=UvData.j2_series{1}(ref_indices(end));
1765        end   
1766    else% the second series (if needed) is the same file as the first
1767        i1_1=i1;
1768        i2_1=i2;
1769        j1_1=j1;
1770        j2_1=j2;
1771    end
1772end
1773filename=fullfile_uvmat(InputFile.RootPath,InputFile.SubDir,InputFile.RootFile,FileExt,NomType,i1,i2,j1,j2);
1774if sub_value
1775    filename_1=fullfile_uvmat(InputFile.RootPath_1,InputFile.SubDir_1,InputFile.RootFile_1,InputFile.FileExt_1,InputFile.NomType_1,i1_1,i2_1,j1_1,j2_1);
1776end
1777
1778%% refresh plots
1779errormsg=refresh_field(handles,filename,filename_1,i1,i2,j1,j2,i1_1,i2_1,j1_1,j2_1);
1780
1781%% update the index counters if the index move is successfull
1782if isempty(errormsg)
1783    set(handles.i1,'String',num2stra(i1,NomType,1));
1784    if isequal(i2,i1)
1785        set(handles.i2,'String','');
1786    else
1787        set(handles.i2,'String',num2stra(i2,NomType,1));
1788    end
1789    set(handles.j1,'String',num2stra(j1,NomType,2));
1790    if isequal(j2,j1)
1791        set(handles.j2,'String','');
1792    else
1793        set(handles.j2,'String',num2stra(j2,NomType,2));
1794    end
1795    indices=fullfile_uvmat('','','','',NomType,i1,i2,j1,j2);
1796    set(handles.FileIndex,'String',indices);
1797    if ~isempty(filename_1)
1798        indices_1=fullfile_uvmat('','','','',InputFile.NomType_1,i1_1,i2_1,j1_1,j2_1);
1799        set(handles.FileIndex_1,'String',indices_1);
1800    end
1801    if isequal(movie_status,1)
1802        set(handles.movie_pair,'Value',1)
1803        movie_pair_Callback(hObject, eventdata, handles); %reactivate moviepair if it was activated
1804    end
1805end
1806
1807%------------------------------------------------------------------------
1808% --- Executes on button press in movie_pair: create an alternating movie with two view
1809function movie_pair_Callback(hObject, eventdata, handles)
1810%------------------------------------------------------------------------
1811
1812%% stop movie action if the movie_pair button is off
1813if ~get(handles.movie_pair,'value')
1814    set(handles.movie_pair,'BusyAction','Cancel')%stop movie pair if button is 'off'
1815    set(handles.i2,'String','')
1816    set(handles.j2,'String','')
1817    return
1818else
1819    set(handles.movie_pair,'BusyAction','queue')
1820end
1821
1822%% initialisation
1823set(handles.movie_pair,'BackgroundColor',[1 1 0])%paint the command button in yellow
1824drawnow
1825list_fields=get(handles.FieldName,'String');% list menu fields
1826index_fields=get(handles.FieldName,'Value');% selected string index
1827FieldName=list_fields{index_fields}; % selected field
1828UvData=get(handles.uvmat,'UserData');
1829if isequal(FieldName,'image')
1830    index=1;
1831    [RootPath,SubDir,RootFile,FileIndices,Ext]=read_file_boxes(handles);
1832    NomType=get(handles.NomType,'String');
1833else
1834    list_fields=get(handles.FieldName_1,'String');% list menu fields
1835    index_fields=get(handles.FieldName_1,'Value');% selected string index
1836    FieldName=list_fields{index_fields}; % selected field
1837    if isequal(FieldName,'image')
1838        index=2;
1839        [RootPath,tild,RootFile,FileIndex_1,Ext,NomType]=read_file_boxes_1(handles);
1840    else
1841        msgbox_uvmat('ERROR','an image or movie must be first introduced as input')
1842        set(handles.movie_pair,'BackgroundColor',[1 0 0])%paint the command button in red
1843        set(handles.movie_pair,'Value',0)
1844        return
1845    end
1846end
1847num_i1=str2num(get(handles.i1,'String'));
1848num_j1=stra2num(get(handles.j1,'String'));
1849num_i2=str2num(get(handles.i2,'String'));
1850num_j2=stra2num(get(handles.j2,'String'));
1851imaname_1='';
1852if isempty(num_j2)
1853    if isempty(num_i2)
1854        if strcmp(get(handles.j2,'Visible'),'on') %if the j box is visible
1855            imaname_1=fullfile_uvmat(RootPath,SubDir,RootFile,Ext,NomType,num_i1,[],num_j1+1);
1856        end
1857        if exist(imaname_1,'file')
1858            num_j2=num_j1+1;% look by default for the next j index as the second file
1859            set(handles.j2,'String',num2stra(num_j2,NomType));
1860        else
1861            imaname_1=fullfile_uvmat(RootPath,SubDir,RootFile,Ext,NomType,num_i1+1,[],num_j1);
1862            if exist(imaname_1,'file')
1863                num_i2=num_i1+1;
1864                set(handles.i2,'String',num2str(num_i2));
1865            else
1866                msgbox_uvmat('ERROR', 'a second image index i2 or j2 is needed to show the pair as a movie')
1867                set(handles.movie_pair,'BackgroundColor',[1 0 0])%paint the command button in red
1868                set(handles.movie_pair,'Value',0)
1869                return
1870            end
1871        end
1872    else
1873        num_j2=num_j1;%repeat the index i1 by default
1874    end
1875end
1876if isempty(num_i2)
1877    num_i2=num_i1;%repeat the index i1 by default
1878end
1879imaname_1=fullfile_uvmat(RootPath,SubDir,RootFile,Ext,NomType,num_i2,[],num_j2);
1880if strcmp(NomType,'*')
1881    num_frame=num_i2;
1882else
1883    num_frame=num_j2;
1884end
1885if ~exist(imaname_1,'file')
1886      msgbox_uvmat('ERROR',['second input open (-)  ' imaname_1 ' not found']);
1887      set(handles.movie_pair,'BackgroundColor',[1 0 0])%paint the command button in red
1888       set(handles.movie_pair,'Value',0)
1889      return
1890end
1891
1892%% get the first image
1893%Field.AName='image';
1894if index==1
1895    Field_a=UvData.Field;% movie on the second field
1896else
1897    Field_a=UvData.Field_1;% movie on the first field
1898end
1899
1900%% read the second image
1901MovieObject=[];
1902if numel(UvData.MovieObject)>=index
1903    MovieObject=UvData.MovieObject{index};
1904end
1905[Field_b,ParamOut,errormsg] = read_field(imaname_1,UvData.FileType{index},MovieObject,num_frame);
1906% Field_b.AX=Field_a.AX;
1907% Field_b.AY=Field_a.AY;
1908% % z index
1909% nbslice=str2double(get(handles.num_NbSlice,'String'));
1910% if ~isempty(nbslice)
1911%     Field_b.ZIndex=mod(num_i2-1,nbslice)+1;
1912% end
1913% Field_b.CoordUnit='pixel';
1914%
1915% %% determine the input file type
1916% if (test_1 && isfield(UvData,'MovieObject')&& numel(UvData.MovieObject>=2))||(~test_1 && ~isempty(UvData.MovieObject{1}))
1917%     FileType='movie';
1918% elseif isequal(lower(Ext),'.avi')
1919%     FileType='avi';
1920% elseif isequal(lower(Ext),'.vol')
1921%     FileType='vol';
1922% else
1923%    form=imformats(Ext(2:end));
1924%    if ~isempty(form)% if the extension corresponds to an image format recognized by Matlab
1925%        if isequal(NomType,'*');
1926%            FileType='multimage';
1927%        else
1928%            FileType='image';
1929%        end
1930%    end
1931% end
1932% switch FileType
1933%         case 'movie'
1934%             if test_1
1935%                 Field_b.A=read(UvData.MovieObject{2},num_i2);
1936%             else
1937%                 Field_b.A=read(UvData.MovieObject{1},num_i2);
1938%             end
1939%         case 'avi'
1940%             mov=aviread(imaname_1,num_i2);
1941%             Field_b.A=frame2im(mov(1));
1942%         case 'vol'
1943%             Field_b.A=imread(imaname_1);
1944%         case 'multimage'
1945%             Field_b.A=imread(imaname_1,num_i2);
1946%         case 'image'
1947%             Field_b.A=imread(imaname_1);
1948% end
1949% if get(handles.slices,'Value')
1950%     Field.ZIndex=str2double(get(handles.z_index,'String'));
1951% end
1952
1953%px to phys or other transform on field
1954transform=get(handles.TransformPath,'UserData');
1955if  ~isempty(transform)
1956    if isfield(UvData,'XmlData') && numel(UvData.XmlData)>=index %use geometry calib recorded from the ImaDoc xml file as first priority
1957        if index==2
1958        Field_a=transform(Field_a,UvData.XmlData{index});%the first field has been stored without transform
1959        end
1960        Field_b=transform(Field_b,UvData.XmlData{index});
1961    end
1962end
1963
1964 % make movie until movie speed is set to 0 or STOP is activated
1965hima=findobj(handles.PlotAxes,'Tag','ima');% %handles.PlotAxes =main plotting window (A GENERALISER)
1966set(handles.STOP,'Visible','on')
1967set(handles.speed,'Visible','on')
1968set(handles.speed_txt,'Visible','on')
1969while get(handles.speed,'Value')~=0 && isequal(get(handles.movie_pair,'BusyAction'),'queue')%isequal(get(handles.run0,'BusyAction'),'queue'); % enable STOP command
1970    % read and plot the series of images in non erase mode
1971    set(hima,'CData',Field_b.A);
1972    pause(1.02-get(handles.speed,'Value'));% wait for next image
1973    set(hima,'CData',Field_a.A);
1974    pause(1.02-get(handles.speed,'Value'));% wait for next image
1975end
1976set(handles.movie_pair,'BackgroundColor',[1 0 0])%paint the command button in red
1977 set(handles.movie_pair,'Value',0)
1978
1979%------------------------------------------------------------------------
1980% --- Executes on button press in run0.
1981function run0_Callback(hObject, eventdata, handles)
1982%------------------------------------------------------------------------
1983set(handles.run0,'BackgroundColor',[1 1 0])%paint the command button in yellow
1984drawnow
1985[RootPath,SubDir,RootFile,FileIndex,FileExt]=read_file_boxes(handles);
1986filename=[fullfile(RootPath,SubDir,RootFile) FileIndex FileExt];
1987filename_1='';%default
1988FileIndex_1='';
1989if get(handles.SubField,'Value')
1990    [RootPath_1,SubDir_1,RootFile_1,FileIndex_1,FileExt_1]=read_file_boxes_1(handles);
1991    filename_1=[fullfile(RootPath_1,SubDir_1,RootFile_1) FileIndex_1 FileExt_1];
1992end
1993num_i1=stra2num(get(handles.i1,'String'));
1994num_i2=stra2num(get(handles.i2,'String'));
1995num_j1=stra2num(get(handles.j1,'String'));
1996num_j2=stra2num(get(handles.j2,'String'));
1997[tild,tild,tild,i1_1,i2_1,j1_1,j2_1]=fileparts_uvmat(FileIndex_1);% get the indices of the second series from the string FileIndex_1
1998if isempty(j1_1)% case of movies, the index is not given by file index
1999    j1_1=num_j1;
2000end
2001
2002errormsg=refresh_field(handles,filename,filename_1,num_i1,num_i2,num_j1,num_j2,i1_1,i2_1,j1_1,j2_1);
2003
2004if ~isempty(errormsg)
2005      msgbox_uvmat('ERROR',errormsg);
2006else
2007    set(handles.i1,'BackgroundColor',[1 1 1])
2008    set(handles.i2,'BackgroundColor',[1 1 1])
2009    set(handles.j1,'BackgroundColor',[1 1 1])
2010    set(handles.j2,'BackgroundColor',[1 1 1])
2011    set(handles.FileIndex,'BackgroundColor',[1 1 1])
2012    set(handles.FileIndex_1,'BackgroundColor',[1 1 1])
2013end   
2014set(handles.run0,'BackgroundColor',[1 0 0])
2015
2016
2017%------------------------------------------------------------------------
2018% --- read the input files and refresh all the plots, including projection.
2019% OUTPUT:
2020%  errormsg: error message char string  =[] by default
2021% INPUT:
2022% filename: first input file (=[] in the absence of input file)
2023% filename_1: second input file (=[] in the asbsenc of secodn input file)
2024% num_i1,num_i2,num_j1,num_j2; frame indices
2025% Field: structure describing an optional input field (then replace the input file)
2026
2027function errormsg=refresh_field(handles,FileName,FileName_1,num_i1,num_i2,num_j1,num_j2,i1_1,i2_1,j1_1,j2_1)
2028%------------------------------------------------------------------------
2029
2030%% initialisation
2031if ~exist('Field','var')
2032    Field={};
2033end
2034UvData=get(handles.uvmat,'UserData');
2035if ishandle(handles.UVMAT_title) %remove title panel on uvmat
2036    delete(handles.UVMAT_title)
2037end
2038
2039%% determine the main input file information for action
2040if ~exist(FileName,'file')
2041    errormsg=['input file ' FileName ' does not exist'];
2042    return
2043end
2044NomType=get(handles.NomType,'String');
2045NomType_1='';
2046if strcmp(get(handles.NomType_1,'Visible'),'on')
2047    NomType_1=get(handles.NomType_1,'String');
2048end
2049%update the z position index
2050mode_slice=get(handles.slices,'String');
2051if strcmp(mode_slice,'volume')
2052    z_index=num_j1;
2053    set(handles.z_index,'String',num2str(z_index))
2054else
2055    nbslice=str2num(get(handles.num_NbSlice,'String'));
2056    z_index=mod(num_i1-1,nbslice)+1;
2057    set(handles.z_index,'String',num2str(z_index))
2058end
2059% refresh menu for save_mask if relevant
2060masknumber=get(handles.masklevel,'String');
2061if length(masknumber)>=z_index
2062    set(handles.masklevel,'Value',z_index)
2063end
2064
2065%% test for need of tps
2066check_proj_tps=0;
2067if  (strcmp(UvData.FileType{1},'civdata')||strcmp(UvData.FileType{1},'civx'))
2068    for iobj=1:numel(UvData.ProjObject)
2069        if isfield(UvData.ProjObject{iobj},'ProjMode')&& strcmp(UvData.ProjObject{iobj}.ProjMode,'interp_tps')
2070            check_proj_tps=1;
2071            break
2072        end
2073    end
2074end
2075
2076%% read the first input field
2077ParamIn.ColorVar='';%default variable name for vector color
2078frame_index=1;%default
2079FieldName='';%default
2080VelType='';%default
2081switch UvData.FileType{1}
2082    case {'civx','civdata','netcdf'};
2083        list_fields=get(handles.FieldName,'String');% list menu fields
2084        FieldName= list_fields{get(handles.FieldName,'Value')}; % selected field
2085        % if get_field... is selected, the GUI get_field will be used to enter fields
2086        if ~strcmp(FieldName,'get_field...')
2087            if get(handles.FixVelType,'Value')
2088                VelTypeList=get(handles.VelType,'String');
2089                VelType=VelTypeList{get(handles.VelType,'Value')};
2090            end
2091        end
2092        % case of input vector field, get the scalar used for vector color
2093        if ~isempty(regexp(FieldName,'^vec('))
2094            list_code=get(handles.ColorCode,'String');% list menu fields
2095            index_code=get(handles.ColorCode,'Value');% selected string index
2096            if  ~strcmp(list_code{index_code},'black') &&  ~strcmp(list_code{index_code},'white')
2097                list_code=get(handles.ColorScalar,'String');% list menu fields
2098                index_code=get(handles.ColorScalar,'Value');% selected string index
2099                ParamIn.ColorVar= list_code{index_code}; % selected field
2100            end
2101        end
2102    case {'video','mmreader'}
2103        ParamIn=UvData.MovieObject{1};     
2104        if ~strcmp(NomType,'*')
2105            frame_index=num_j1;%frame index for movies or multimage
2106        else
2107            frame_index=num_i1;
2108        end
2109    case 'multimage'
2110        if ~strcmp(NomType,'*')
2111            frame_index=num_j1;%frame index for movies or multimage
2112        else
2113            frame_index=num_i1;
2114        end
2115    case 'vol' %TODO: update
2116        if isfield(UvData.XmlData,'Npy') && isfield(UvData.XmlData,'Npx')
2117            ParamIn.Npy=UvData.XmlData.Npy;
2118            ParamIn.Npx=UvData.XmlData.Npx;
2119        else           
2120            errormsg='Npx and Npy need to be defined in the xml file for volume images .vol';
2121            return
2122        end
2123end
2124if isstruct (ParamIn)
2125    ParamIn.FieldName=FieldName;
2126    ParamIn.VelType=VelType;
2127    XNameMenu=get(handles.Coord_x,'String');
2128    if ~isempty(XNameMenu)
2129        ParamIn.Coord_x=XNameMenu(get(handles.Coord_x,'Value'));
2130    end
2131    YNameMenu=get(handles.Coord_y,'String');
2132    if ~isempty(YNameMenu)
2133        ParamIn.Coord_y=YNameMenu(get(handles.Coord_y,'Value'));
2134    end
2135end
2136check_tps = 0;         
2137if strcmp(UvData.FileType{1},'civdata')&&~strcmp(ParamIn.FieldName,'velocity')&&~strcmp(ParamIn.FieldName,'get_field...')
2138       check_tps=1;%tps needed to get the requested field
2139end
2140[Field{1},ParamOut,errormsg] = read_field(FileName,UvData.FileType{1},ParamIn,frame_index);
2141if ~isempty(errormsg)
2142    errormsg=['uvmat / refresh_field / read_field( ' FileName ') / ' errormsg];
2143    return
2144end 
2145if isfield(ParamOut,'Npx')&& isfield(ParamOut,'Npy')
2146    set(handles.num_Npx,'String',num2str(ParamOut.Npx));% display image size on the interface
2147    set(handles.num_Npy,'String',num2str(ParamOut.Npy));
2148end
2149if isfield(ParamOut,'TimeIndex')% case of time obtained from get_field
2150    set(handles.i1,'String',num2str(ParamOut.TimeIndex))
2151end
2152if isfield(ParamOut,'TimeValue')
2153    Field{1}.Time=ParamOut.TimeValue;% case of time obtained from get_field
2154end
2155Field{1}.ZIndex=z_index; %used for multiplane 3D calibration
2156
2157
2158%% choose and read a second field FileName_1 if defined
2159VelType_1=[];%default
2160FieldName_1=[];
2161ParamIn_1=[];
2162ParamOut_1=[];
2163frame_index_1=1;
2164if ~isempty(FileName_1)
2165    if ~exist(FileName_1,'file')
2166        errormsg=['second file ' FileName_1 ' does not exist'];
2167        return
2168    end
2169   % Name=FileName_1;
2170    switch UvData.FileType{2}
2171        case {'civx','civdata','netcdf'};
2172            list_fields=get(handles.FieldName_1,'String');% list menu fields
2173            if ischar(list_fields),list_fields={list_fields};end
2174            FieldName_1= list_fields{get(handles.FieldName_1,'Value')}; % selected field
2175            if ~strcmp(FieldName,'get_field...')
2176                if get(handles.FixVelType,'Value')
2177                    VelTypeList=get(handles.VelType_1,'String');
2178                    VelType_1=VelTypeList{get(handles.VelType_1,'Value')};% read the velocity type.
2179                end
2180            end
2181            if strcmp(FieldName_1,'velocity')&& strcmp(get(handles.ColorCode,'Visible'),'on')
2182                list_code=get(handles.ColorCode,'String');% list menu fields
2183                index_code=get(handles.ColorCode,'Value');% selected string index
2184                if  ~strcmp(list_code{index_code},'black') &&  ~strcmp(list_code{index_code},'white')
2185                    list_code=get(handles.ColorScalar,'String');% list menu fields
2186                    index_code=get(handles.ColorScalar,'Value');% selected string index
2187                    ParamIn_1.ColorVar= list_code{index_code}; % selected field for vector color display                 
2188                end
2189            end
2190        case {'video','mmreader'}
2191            ParamIn_1=UvData.MovieObject{2};
2192                        if ~strcmp(NomType_1,'*')
2193                frame_index_1=j1_1;%frame index for movies or multimage
2194            else
2195                frame_index_1=i1_1;
2196            end 
2197         case 'multimage'
2198            if strcmp(NomType_1,'*')%frame index for movies or multimage
2199                frame_index_1=i1_1;
2200            else
2201                frame_index_1=j1_1;
2202            end   
2203        case 'vol' %TODO: update
2204            if isfield(UvData.XmlData,'Npy') && isfield(UvData.XmlData,'Npx')
2205                ParamIn_1.Npy=UvData.XmlData.Npy;
2206                ParamIn_1.Npx=UvData.XmlData.Npx;
2207            else
2208                errormsg='Npx and Npy need to be defined in the xml file for volume images .vol';
2209                return
2210            end
2211    end
2212    if isequal(get(handles.NomType_1,'Visible'),'on')
2213    NomType_1=get(handles.NomType_1,'String');
2214    else
2215        NomType_1=get(handles.NomType,'String');
2216    end
2217    test_keepdata_1=0;% test for keeping the previous stored data if the input files are unchanged
2218    if ~isequal(NomType_1,'*')&& isfield(UvData,'FileName_1')
2219           test_keepdata_1= strcmp(FileName_1,UvData.FileName_1) ;
2220    end
2221    if test_keepdata_1
2222        Field{2}=UvData.Field_1;% keep the stored field
2223        ParamOut_1=UvData.ParamOut_1;
2224    else
2225        if isempty(ParamIn_1) || isstruct(ParamIn_1)
2226        ParamIn_1.FieldName=FieldName_1;
2227        ParamIn_1.VelType=VelType_1;
2228        ParamIn_1.GUIName='get_field_1';
2229        end 
2230        [Field{2},ParamOut_1,errormsg] = read_field(FileName_1,UvData.FileType{2},ParamIn_1,frame_index_1);
2231        if ~isempty(errormsg)
2232            errormsg=['error in reading ' FieldName_1 ' in ' FileName_1 ': ' errormsg];
2233            return
2234        end
2235        if isstruct(ParamOut_1)&&~strcmp(ParamOut_1.FieldName,'get_field...')&& (strcmp(UvData.FileType{2},'civdata')||strcmp(UvData.FileType{2},'civx'))...
2236                &&~strcmp(ParamOut_1.FieldName,'velocity') && ~strcmp(ParamOut_1.FieldName,'get_field...')
2237            if ~check_proj_tps
2238             %   Field{2}=calc_field([{ParamOut_1.FieldName} {ParamOut_1.ColorVar}],Field{2});
2239            end
2240        end
2241    end
2242    Field{2}.ZIndex=z_index;%used for multi-plane 3D calibration
2243end
2244
2245%% update uvmat interface
2246if isfield(ParamOut,'Npx')
2247    set(handles.num_Npx,'String',num2str(ParamOut.Npx));% display image size on the interface
2248    set(handles.num_Npy,'String',num2str(ParamOut.Npy));
2249elseif isfield(ParamOut_1,'Npx')
2250    set(handles.num_Npx,'String',num2str(ParamOut_1.Npx));% display image size on the interface
2251    set(handles.num_Npy,'String',num2str(ParamOut_1.Npy));
2252end
2253
2254%% update the display menu for the first velocity type (first menuline)
2255test_veltype=0;
2256% if ~isequal(FileType,'netcdf')|| isequal(FieldName,'get_field...')
2257if (strcmp(UvData.FileType{1},'civx')||strcmp(UvData.FileType{1},'civdata'))&& ~strcmp(FieldName,'get_field...')
2258    test_veltype=1;
2259    set(handles.VelType,'Visible','on')
2260    set(handles.VelType_1,'Visible','on')
2261    set(handles.FixVelType,'Visible','on')
2262    menu=set_veltype_display(ParamOut.CivStage,UvData.FileType{1});
2263    index_menu=strcmp(ParamOut.VelType,menu);%look for VelType in  the menu
2264    index_val=find(index_menu,1);
2265    if isempty(index_val)
2266        index_val=1;
2267    end
2268    set(handles.VelType,'Value',index_val)
2269    if ~get(handles.SubField,'value')
2270        set(handles.VelType,'String',menu)
2271        set(handles.VelType_1,'Value',1)
2272        set(handles.VelType_1,'String',[{''};menu])
2273    end
2274else
2275    set(handles.VelType,'Visible','off')
2276end
2277% display the FieldName menu from the input file and pick the selected one:
2278% if isstruct(ParamOut)
2279%     field_index=strcmp(ParamOut.FieldName,ParamOut.FieldList);
2280%     set(handles.FieldName,'String',ParamOut.FieldList); %update the field menu
2281%     set(handles.FieldName,'Value',find(field_index,1))
2282% end
2283
2284%% update the display menu for the second velocity type (second menuline)
2285test_veltype_1=0;
2286if isempty(FileName_1)
2287    %     set(handles.FieldName_1,'Value',1); %update the field menu
2288    %     if isstruct(ParamOut)
2289    %     set(handles.FieldName_1,'String',[{''};ParamOut.FieldList]); %update the field menu
2290    %     end
2291elseif ~test_keepdata_1
2292    if (~strcmp(UvData.FileType{2},'netcdf')&&~strcmp(UvData.FileType{2},'civdata')&&~strcmp(UvData.FileType{2},'civx'))|| isequal(FieldName_1,'get_field...')
2293        set(handles.VelType_1,'Visible','off')
2294    else
2295        test_veltype_1=1;
2296        set(handles.VelType_1,'Visible','on')
2297        menu=set_veltype_display(ParamOut_1.CivStage,UvData.FileType{2});
2298        index_menu=strcmp(ParamOut_1.VelType,menu);
2299        set(handles.VelType_1,'Value',1+find(index_menu,1))
2300        set(handles.VelType_1,'String',[{''};menu])
2301    end
2302    % update the second field menu: the same quantity
2303    if isstruct(ParamOut_1)
2304%        set(handles.FieldName_1,'String',[{''};ParamOut_1.FieldList]); %update the field menu
2305        % display the FieldName menu from the input file and pick the selected one:
2306        FieldList=get(handles.FieldName_1,'String');
2307        field_index=strcmp(ParamOut_1.FieldName,FieldList);
2308        if ~isempty(field_index)
2309            set(handles.FieldName_1,'Value',find(field_index,1))
2310        end
2311    end
2312end
2313if test_veltype||test_veltype_1
2314    set(handles.FixVelType,'Visible','on')
2315else
2316    set(handles.FixVelType,'Visible','off')
2317end
2318
2319% field_index=strcmp(ParamOut_1.FieldName,ParamOut_1.FieldList);
2320% set(handles.FieldName,'String',ParamOut.FieldList); %update the field menu
2321% set(handles.FieldName,'Value',find(field_index,1))
2322   
2323%% introduce w as background image by default for a new series (only for nbdim=2)
2324if ~isfield(UvData,'NewSeries')
2325    UvData.NewSeries=1;
2326end
2327%put W as background image by default if NbDim=2:
2328if  UvData.NewSeries && isequal(get(handles.SubField,'Value'),0) && isfield(Field{1},'W') && ~isempty(Field{1}.W) && ~isequal(Field{1}.NbDim,3);
2329        set(handles.SubField,'Value',1);
2330        set(handles.RootPath_1,'String','"')
2331        set(handles.RootFile_1,'String','"')
2332        set(handles.SubDir_1,'String','"');
2333         indices=fullfile_uvmat('','','','',NomType,num_i1,num_i2,num_j1,num_j2);
2334        set(handles.FileIndex_1,'String',indices)
2335        set(handles.FileExt_1,'String','"');
2336        set(handles.FieldName_1,'Visible','on');
2337        set(handles.FieldName_1,'Visible','on');
2338        set(handles.RootPath_1,'Visible','on')
2339        set(handles.RootFile_1,'Visible','on')
2340        set(handles.SubDir_1,'Visible','on');
2341        set(handles.FileIndex_1,'Visible','on');
2342        set(handles.FileExt_1,'Visible','on');
2343        set(handles.FieldName_1,'Visible','on');
2344        Field{1}.AName='w';
2345end           
2346
2347%% display time
2348abstime=[];%default inputs
2349abstime_1=[];
2350dt=[];
2351TimeUnit='';
2352% time from xml file or video movie
2353if isfield(UvData,'XmlData') && isfield(UvData.XmlData{1},'Time')
2354    if isempty(num_i2)||isnan(num_i2)
2355        num_i2=num_i1;
2356    end
2357    if isempty(num_j1)||isnan(num_j1)
2358        num_j1=1;
2359    end
2360    if isempty(num_j2)||isnan(num_j2)
2361        num_j2=num_j1;
2362    end
2363    siz=size(UvData.XmlData{1}.Time);
2364    if ~isempty(num_i1)&& ~isempty(num_i2) && num_i1>=0 &&siz(1)>=max(num_i1+1,num_i2+1) && siz(2)>=max(num_j1+1,num_j2+1)
2365        abstime=(UvData.XmlData{1}.Time(num_i1+1,num_j1+1)+UvData.XmlData{1}.Time(num_i2+1,num_j2+1))/2;%overset the time read from files
2366        dt=(UvData.XmlData{1}.Time(num_i2+1,num_j2+1)-UvData.XmlData{1}.Time(num_i1+1,num_j1+1));
2367        Field{1}.Dt=dt;
2368        if isfield(UvData.XmlData{1},'TimeUnit')
2369            TimeUnit=UvData.XmlData{1}.TimeUnit;
2370        end
2371    end
2372    if numel(UvData.XmlData)==2
2373        if isempty(i2_1)
2374            i2_1=num_i1;
2375        end
2376        if isempty(j1_1)
2377            j1_1=1;
2378        end
2379        if isempty(j2_1)
2380            j2_1=j1_1;
2381        end
2382        siz=size(UvData.XmlData{2}.Time);
2383        if ~isempty(i1_1) && siz(1)>=max(i1_1+1,i2_1+1) && siz(2)>=max(j1_1+1,j2_1+1)
2384            abstime_1=(UvData.XmlData{2}.Time(i1_1+1,j1_1+1)+UvData.XmlData{2}.Time(i2_1+1,j2_1+1))/2;%overset the time read from files
2385            Field{2}.Dt=(UvData.XmlData{2}.Time(i2_1+1,j2_1+1)-UvData.XmlData{2}.Time(i1_1+1,j1_1+1));
2386        end
2387    end
2388end
2389% if isfield(Field{1},'Time')
2390%     abstime=Field{1}.Time;%time read from the netcdf input file
2391% end
2392% if numel(Field)==2 && isfield(Field{2},'Time')
2393%     abstime_1=Field{2}.Time;%time read from the netcdf input file
2394% end
2395
2396% look for timing in the input file if not defined in a xml file or movie
2397if isempty(abstime)
2398if isfield(Field{1},'Dt')
2399    dt=Field{1}.Dt;%dt read from the netcdf input file
2400    if isfield(Field{1},'TimeUnit')
2401       TimeUnit=Field{1}.TimeUnit;
2402    end
2403elseif numel(Field)==2 && isfield(Field{2},'Dt')%dt obtained from the second field if not defined in the first
2404    dt=Field{2}.Dt;%dt read from the netcdf input file
2405    if isfield(Field{2},'TimeUnit')
2406       TimeUnit=Field{2}.TimeUnit;
2407    end
2408end
2409end
2410% if ~isequal(numel(abstime),1)
2411%     abstime=[];
2412% end
2413% if ~isequal(numel(abstime_1),1)
2414%       abstime_1=[];
2415% end 
2416set(handles.abs_time,'String',num2str(abstime,5))
2417set(handles.abs_time_1,'String',num2str(abstime_1,5))
2418if isempty(dt)||isequal(dt,0)
2419    set(handles.Dt_txt,'String','')
2420else
2421    if  isempty(TimeUnit)
2422        set(handles.Dt_txt,'String',['Dt=' num2str(1000*dt,3) '  10^(-3)'] )
2423    else
2424        set(handles.Dt_txt,'String',['Dt=' num2str(1000*dt,3) '  m' TimeUnit] )
2425    end
2426end
2427
2428
2429%% store the current open names, fieldname and vel types in uvmat interface
2430UvData.FileName_1=FileName_1;
2431UvData.ParamOut_1=ParamOut_1;
2432if numel(Field)==2
2433UvData.Field_1=Field{2}; %store the second field for possible use at next RUN
2434end
2435
2436%% apply coordinate transform or other user fct
2437transform=get(handles.TransformPath,'UserData');
2438if isempty(transform)
2439    UvData.Field=Field{1};
2440else
2441    XmlData=[];%default
2442    XmlData_1=[];%default
2443    if isfield(UvData,'XmlData')%use geometry calib recorded from the ImaDoc xml file as first priority
2444        XmlData=UvData.XmlData{1};
2445        if numel(UvData.XmlData)==2
2446            XmlData_1=UvData.XmlData{2};
2447        end
2448    end
2449    transform=get(handles.TransformPath,'UserData');
2450    switch nargin(transform)
2451        case 4
2452            if length(Field)==2
2453                UvData.Field=transform(Field{1},XmlData,Field{2},XmlData_1);
2454            else
2455                UvData.Field=transform(Field{1},XmlData);
2456            end
2457        case 3
2458            if length(Field)==2
2459                UvData.Field=transform(Field{1},XmlData,Field{2});
2460            else
2461                UvData.Field=transform(Field{1},XmlData);
2462            end
2463        case 2
2464            UvData.Field=transform(Field{1},XmlData);
2465        case 1
2466            UvData.Field=transform(Field{1});
2467    end
2468end
2469
2470%% calculate tps coefficients if needed
2471UvData.Field=tps_coeff_field(UvData.Field,check_proj_tps);
2472
2473%% analyse input field
2474%test_x=0;
2475%test_z=0;% test for unstructured z coordinate
2476%[errormsg,ListDimName,DimValue,VarDimIndex]=check_field_structure(UvData.Field);% check the input field structure
2477% if ~isempty(errormsg)
2478%     errormsg=['error in uvmat/refresh_field/check_field_structure: ' errormsg];% display error
2479%     return
2480% end
2481[CellInfo,NbDimArray,errormsg]=find_field_cells(UvData.Field);% analyse  the input field structure
2482if ~isempty(errormsg)
2483    errormsg=['uvmat /refresh_field / find_field_cells / ' errormsg];% display error
2484    return
2485end
2486
2487NbDim=max(NbDimArray);% spatial dimension of the input field
2488imax=find(NbDimArray==NbDim);% indices of field cells to consider
2489if isfield(UvData.Field,'NbDim')
2490    NbDim=double(UvData.Field.NbDim);% deal with plane fields containing z coordinates
2491end
2492
2493%UvData.Field=get_bounds(UvData.Field);
2494
2495%% get bounds and mesh (needed  to propose default options for projection objects)
2496if NbDim>1
2497    CoordMax=zeros(numel(imax),NbDim);
2498    CoordMin=zeros(numel(imax),NbDim);
2499    Mesh=zeros(1,numel(imax));
2500    for ind=1:numel(imax)
2501        if strcmp(CellInfo{imax(ind)}.CoordType,'tps')
2502            CoordName=UvData.Field.ListVarName{CellInfo{imax(ind)}.CoordIndex};% X,Y coordinates in a single variable
2503            CoordMax(ind,NbDim)=max(max(UvData.Field.(CoordName)(1:end-3,1,:),[],1),[],3);% max of x component (2D case)
2504            CoordMax(ind,NbDim-1)=max(max(UvData.Field.(CoordName)(1:end-3,2,:),[],1),[],3);% max of y component (2D case)
2505            CoordMin(ind,NbDim)=min(min(UvData.Field.(CoordName)(1:end-3,1,:),[],1),[],3);
2506            CoordMin(ind,NbDim-1)=min(min(UvData.Field.(CoordName)(1:end-3,2,:),[],1),[],3);% min of y component (2D case)
2507        else
2508            XName=UvData.Field.ListVarName{CellInfo{imax(ind)}.CoordIndex(end)};
2509            YName=UvData.Field.ListVarName{CellInfo{imax(ind)}.CoordIndex(end-1)};
2510            CoordMax(ind,NbDim)=max(max(UvData.Field.(XName)));
2511            CoordMin(ind,NbDim)=min(min(UvData.Field.(XName)));
2512            CoordMax(ind,NbDim-1)=max(max(UvData.Field.(YName)));
2513            CoordMin(ind,NbDim-1)=min(min(UvData.Field.(YName)));
2514            %         test_x=1;%test for unstructured coordinates
2515            if NbDim==3
2516                ZName=UvData.Field.ListVarName{CellInfo{imax(ind)}.CoordIndex(1)};
2517                CoordMax(imax(ind),1)=max(max(UvData.Field.(ZName)));
2518                CoordMin(ind,1)=min(min(UvData.Field.(ZName)));
2519            end
2520        end
2521        switch CellInfo{imax(ind)}.CoordType
2522           
2523            case {'scattered','tps'} %unstructured coordinates
2524                NbPoints=CellInfo{imax(ind)}.CoordSize;% total nbre of points
2525                Mesh(ind)=(prod(CoordMax(ind,:)-CoordMin(ind,:))/NbPoints)^(1/NbDim); %(volume or area per point)^(1/NbDim)
2526            case 'grid'%structured coordinate
2527                NbPoints=CellInfo{imax(ind)}.CoordSize;% nbre of points in each direction
2528                Mesh(ind)=min((CoordMax(ind,:)-CoordMin(ind,:))./(NbPoints-1));               
2529        end
2530    end
2531    UvData.Field.CoordMesh=min(Mesh);
2532    UvData.Field.XMax=max(CoordMax(ind,end));
2533    UvData.Field.XMin=min(CoordMin(ind,end));
2534    UvData.Field.YMax=max(CoordMax(ind,end-1));
2535    UvData.Field.YMin=max(CoordMin(ind,end-1));
2536    if NbDim==3
2537        UvData.Field.ZMax=max(CoordMax(ind,1));
2538        UvData.Field.ZMin=max(CoordMin(ind,1));
2539    end
2540    % adjust the mesh to a value 1, 2 , 5 *10^n
2541    ord=10^(floor(log10(UvData.Field.CoordMesh)));%order of magnitude
2542    if UvData.Field.CoordMesh/ord>=5
2543        UvData.Field.CoordMesh=5*ord;
2544    elseif UvData.Field.CoordMesh/ord>=2
2545        UvData.Field.CoordMesh=2*ord;
2546    else
2547        UvData.Field.CoordMesh=ord;
2548    end
2549    % default projection plane
2550    if isempty(UvData.ProjObject{1})
2551        UvData.ProjObject{1}.Type='plane';%main plotting plane
2552        UvData.ProjObject{1}.ProjMode='projection';%main plotting plane
2553        UvData.ProjObject{1}.DisplayHandle.uvmat=[]; %plane not visible in uvmat
2554        UvData.ProjObject{1}.DisplayHandle.view_field=[]; %plane not visible in uvmat
2555    end
2556    %% 3D case (menuvolume)
2557    if NbDim==3% && UvData.NewSeries
2558        test_set_object=1;
2559        hset_object=findobj(allchild(0),'tag','set_object');% look for the set_object GUI
2560        ZBounds(1)=UvData.Field.ZMin; %minimum for the Z slider
2561        ZBounds(2)=UvData.Field.ZMax;%maximum for the Z slider
2562        if ~isempty(hset_object) %if set_object is detected
2563            delete(hset_object);% delete the GUI set_object if it does not fit
2564        end
2565        if test_set_object% reinitiate the GUI set_object
2566            delete_object(1);% delete the current projection object in the list UvData.ProjObject, delete its graphic representations and update the list displayed in handles.ListObject and 2
2567            UvData.ProjObject{1}.NbDim=NbDim;%test for 3D objects
2568            UvData.ProjObject{1}.RangeZ=UvData.Field.CoordMesh;%main plotting plane
2569            UvData.ProjObject{1}.Coord(1,3)=(UvData.Field.ZMin+UvData.Field.ZMax)/2;%section at a middle plane chosen
2570            UvData.ProjObject{1}.Angle=[0 0 0];
2571            UvData.ProjObject{1}.HandlesDisplay=plot(0,0,'Tag','proj_object');% A REVOIR
2572            UvData.ProjObject{1}.Name='1-PLANE';
2573            UvData.ProjObject{1}.enable_plot=1;
2574            set_object(UvData.ProjObject{1},handles,ZBounds);
2575            set(handles.ListObject,'Value',1);
2576            set(handles.ListObject,'String',{'1-PLANE'});
2577            set(handles.edit_object,'Value',1)% put the plane in edit mode to enable the z cursor
2578            edit_object_Callback([],[], handles)
2579        end
2580        %multilevel case (single menuplane in a 3D space)
2581    elseif isfield(UvData,'Z')
2582        if isfield(UvData,'CoordType')&& isequal(UvData.CoordType,'phys') && isfield(UvData,'XmlData')
2583            XmlData=UvData.XmlData{1};
2584            if isfield(XmlData,'PlanePos')
2585                UvData.ProjObject{1}.Coord=XmlData.PlanePos(UvData.ZIndex,:);
2586            end
2587            if isfield(XmlData,'PlaneAngle')
2588                siz=size(XmlData.PlaneAngle);
2589                indangle=min(siz(1),UvData.ZIndex);%take first angle if a single angle is defined (translating scanning)
2590                UvData.ProjObject{1}.PlaneAngle=XmlData.PlaneAngle(indangle,:);
2591            end
2592        elseif isfield(UvData,'ZIndex')
2593            UvData.ProjObject{1}.ZObject=UvData.ZIndex;
2594        end
2595    end
2596end
2597
2598testnewseries=UvData.NewSeries;
2599UvData.NewSeries=0;% put to 0 the test for a new field series (set by RootPath_callback)
2600set(handles.uvmat,'UserData',UvData)
2601
2602%% reset the min and max of scalar if only the mask is displayed(TODO: check the need)
2603% if isfield(UvData,'Mask')&& ~isfield(UvData,'A')
2604%     set(handles.num_MinA,'String','0')
2605%     set(handles.num_MaxA,'String','255')
2606% end
2607
2608%% usual 1D (x,y) plots
2609if NbDim<=1
2610    set(handles.Objects,'Visible','off')
2611    set(handles.ListObject_1_title,'Visible','off')
2612    set(handles.ListObject_1,'Visible','off')
2613    [PlotType,PlotParamOut]=plot_field(UvData.Field,handles.PlotAxes,read_GUI(handles.uvmat));
2614    errormsg=fill_GUI(PlotParamOut,handles.uvmat);
2615    for list={'Scalar','Vectors'}
2616        if ~isfield(PlotParamOut,list{1})
2617            set(handles.(list{1}),'Visible','off')
2618        end
2619    end
2620    %write_plot_param(handles,PlotParamOut) %update the auto plot parameters
2621   
2622%% 2D or 3D fieldname are generally projected
2623else
2624    set(handles.Objects,'Visible','on')
2625    set(handles.ListObject_1_title,'Visible','on')
2626    set(handles.ListObject_1,'Visible','on')
2627   
2628    %% Plot the projections on the selected  projection objects
2629    % main projection object (uvmat display)
2630    list_object=get(handles.ListObject_1,'String');
2631    if isequal(list_object,{''})||isequal(list_object,' ')%refresh list of objects if the menu is empty
2632        set(handles.ListObject,'Value',1)
2633        set(handles.ListObject,'String',{'plane'})
2634        UvData.ProjObject{1}.Type='plane';%main plotting plane
2635        UvData.ProjObject{1}.ProjMode='projection';%main plotting plane
2636        UvData.ProjObject{1}.DisplayHandle.uvmat=[]; %plane not visible in uvmat
2637        UvData.ProjObject{1}.DisplayHandle.view_field=[]; %plane not visible in uvmat
2638        set(handles.ListObject_1,'Value',1)
2639        set(handles.ListObject_1,'String',{'plane'})
2640    end
2641    IndexObj(1)=get(handles.ListObject_1,'Value');%selected projection object for main view
2642    if IndexObj(1)> numel(UvData.ProjObject)
2643        IndexObj(1)=1;%select the first object if the selected one does not exist
2644        set(handles.ListObject_1,'Value',1)
2645    end
2646    IndexObj(2)=get(handles.ListObject,'Value');%selected projection object for main view
2647    if isequal(IndexObj(2),IndexObj(1))
2648        IndexObj(2)=[];
2649    end
2650    plot_handles{1}=handles;
2651    if isfield(UvData,'plotaxes')%case of movies
2652        haxes(1)=UvData.plotaxes;
2653    else
2654        haxes(1)=handles.PlotAxes;
2655    end
2656    PlotParam{1}=read_GUI(handles.uvmat);
2657    %default settings if vectors not visible
2658    if ~isfield(PlotParam{1},'Vectors')
2659        PlotParam{1}.Vectors.MaxVec=1;
2660        PlotParam{1}.Vectors.MinVec=0;
2661        PlotParam{1}.Vectors.CheckFixVecColor=1;
2662        PlotParam{1}.Vectors.ColCode1=0.33;
2663        PlotParam{1}.Vectors.ColCode2=0.66;
2664        PlotParam{1}.Vectors.ColorScalar={''};
2665        PlotParam{1}.Vectors.ColorCode= {'rgb'};
2666    end
2667    PosColorbar{1}=UvData.OpenParam.PosColorbar;%prescribe the colorbar position on the uvmat interface
2668   
2669    %% second projection object (view_field display)
2670    if length( IndexObj)>=2
2671        view_field_handle=findobj(allchild(0),'tag','view_field');%handles of the view_field GUI
2672        if ~isempty(view_field_handle)
2673            plot_handles{2}=guidata(view_field_handle);
2674            haxes(2)=plot_handles{2}.PlotAxes;
2675            PlotParam{2}=read_GUI(view_field_handle);
2676           % PlotParam{2}=read_GUI(handles.uvmat);%read plotting parameters on the uvmat interface
2677            PosColorbar{2}='*'; %TODO: deal with colorbar position on view_field
2678        end
2679    end
2680   
2681    %% loop on the projection objects: one or two
2682   
2683    for imap=1:numel(IndexObj)
2684        iobj=IndexObj(imap);
2685        if numel(UvData.ProjObject)<iobj
2686            break
2687        end
2688        [ObjectData,errormsg]=proj_field(UvData.Field,UvData.ProjObject{iobj});% project field on the object
2689        if ~isempty(errormsg)
2690            return
2691        end
2692        if testnewseries
2693            PlotParam{imap}.Scalar.CheckBW=[]; %B/W option depends on the input field (image or scalar)
2694            if isfield(ObjectData,'CoordUnit')
2695                PlotParam{imap}.Coordinates.CheckFixAspectRatio=1;% set x and y scaling equal if CoordUnit is defined (common unit for x and y)
2696                PlotParam{imap}.Coordinates.AspectRatio=1; %set aspect ratio to 1
2697            end
2698        end
2699        %use of mask (TODO: check)
2700        if isfield(ObjectData,'NbDim') && isequal(ObjectData.NbDim,2) && isfield(ObjectData,'Mask') && isfield(ObjectData,'A')
2701            flag_mask=double(ObjectData.Mask>200);%=0 for masked regions
2702            AX=ObjectData.AX;%x coordiantes for the scalar field
2703            AY=ObjectData.AY;%y coordinates for the scalar field
2704            MaskX=ObjectData.MaskX;%x coordiantes for the mask
2705            MaskY=ObjectData.MaskY;%y coordiantes for the mask
2706            if ~isequal(MaskX,AX)||~isequal(MaskY,AY)
2707                nxy=size(flag_mask);
2708                sizpx=(ObjectData.MaskX(end)-ObjectData.MaskX(1))/(nxy(2)-1);%size of a mask pixel
2709                sizpy=(ObjectData.MaskY(1)-ObjectData.MaskY(end))/(nxy(1)-1);
2710                x_mask=ObjectData.MaskX(1):sizpx:ObjectData.MaskX(end); % pixel x coordinates for image display
2711                y_mask=ObjectData.MaskY(1):-sizpy:ObjectData.MaskY(end);% pixel x coordinates for image display
2712                %project on the positions of the scalar
2713                npxy=size(ObjectData.A);
2714                dxy(1)=(ObjectData.AY(end)-ObjectData.AY(1))/(npxy(1)-1);%grid mesh in y
2715                dxy(2)=(ObjectData.AX(end)-ObjectData.AX(1))/(npxy(2)-1);%grid mesh in x
2716                xi=ObjectData.AX(1):dxy(2):ObjectData.AX(end);
2717                yi=ObjectData.AY(1):dxy(1):ObjectData.AY(end);
2718                [XI,YI]=meshgrid(xi,yi);% creates the matrix of regular coordinates
2719                flag_mask = interp2(x_mask,y_mask,flag_mask,XI,YI);
2720            end
2721            AClass=class(ObjectData.A);
2722            ObjectData.A=flag_mask.*double(ObjectData.A);
2723            ObjectData.A=feval(AClass,ObjectData.A);
2724        end
2725        if ~isempty(ObjectData)
2726            %PlotType='none'; %default
2727            if imap==2 && isempty(view_field_handle)
2728                view_field(ObjectData)
2729            else
2730                [PlotType,PlotParamOut]=plot_field(ObjectData,haxes(imap),PlotParam{imap},PosColorbar{imap});
2731                if imap==1
2732                    errormsg=fill_GUI(PlotParamOut,handles.uvmat);
2733                else
2734                    errormsg=fill_GUI(PlotParamOut,view_field_handle);
2735                end
2736                for list={'Scalar','Vectors'}
2737                    if ~isfield(PlotParamOut,list{1})
2738                        set(plot_handles{imap}.(list{1}),'Visible','off')
2739                    end
2740                end
2741                if isfield(Field,'CoordMesh')&&~isempty(Field.CoordMesh)
2742                    ObjectData.CoordMesh=Field.CoordMesh; % gives an estimated mesh size (useful for mouse action on the plot)
2743                end
2744            end
2745        end
2746    end
2747   
2748    %% update the mask
2749    if isequal(get(handles.CheckMask,'Value'),1)%if the mask option is on
2750        update_mask(handles,num_i1,num_i2);
2751    end
2752   
2753    %% prepare the menus of histograms and plot them (histogram of the whole volume in 3D case)
2754    menu_histo=(UvData.Field.ListVarName)';%list of field variables to be displayed for the menu of histogram display
2755    ind_skip=[];
2756    % nb_histo=1;
2757    Ustring='';
2758    Vstring='';
2759    % suppress coordinates from the histogram menu
2760    for ivar=1:numel(menu_histo)%l loop on field variables:
2761        if isfield(UvData.Field,'VarAttribute') && numel(UvData.Field.VarAttribute)>=ivar && isfield(UvData.Field.VarAttribute{ivar},'Role')
2762            Role=UvData.Field.VarAttribute{ivar}.Role;
2763            switch Role
2764                case {'coord_x','coord_y','coord_z','dimvar'}
2765                    ind_skip=[ind_skip ivar];
2766                case {'vector_x'}
2767                    Ustring=UvData.Field.ListVarName{ivar};
2768                    ind_skip=[ind_skip ivar];
2769                case {'vector_y'}
2770                    Vstring=UvData.Field.ListVarName{ivar};
2771                    ind_skip=[ind_skip ivar];
2772            end
2773        end
2774        DimCell=UvData.Field.VarDimName{ivar};
2775        DimName='';
2776        if ischar(DimCell)
2777            DimName=DimCell;
2778        elseif iscell(DimCell)&& numel(DimCell)==1
2779            DimName=DimCell{1};
2780        end
2781        if strcmp(DimName,menu_histo{ivar})
2782            ind_skip=[ind_skip ivar];
2783        end
2784    end
2785    menu_histo(ind_skip)=[];% remove skipped items
2786    if ~isempty(Ustring)
2787        menu_histo=[{[Ustring ',' Vstring]};menu_histo];% add U, V at the beginning if they exist
2788    end
2789   
2790    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2791    % display menus and plot histograms
2792    test_v=0;
2793    if ~isempty(menu_histo)
2794        set(handles.histo1_menu,'Value',1)
2795        set(handles.histo1_menu,'String',menu_histo)
2796        histo1_menu_Callback(handles.histo1_menu, [], handles)% plot first histogram
2797    end
2798end
2799
2800%------------------------------------------------------------------------
2801function histo1_menu_Callback(hObject, eventdata, handles)
2802%--------------------------------------------
2803histo_menu=get(handles.histo1_menu,'String');
2804histo_value=get(handles.histo1_menu,'Value');
2805FieldName=histo_menu{histo_value};
2806
2807UvData=get(handles.uvmat,'UserData');
2808Field=UvData.Field;
2809r=regexp(FieldName,'(?<var1>.*)(?<sep>,)(?<var2>.*)','names');
2810FieldName_2='';
2811if ~isempty(r)
2812    FieldName=r.var1;
2813    FieldName_2=r.var2;
2814end
2815if ~isfield(UvData.Field,FieldName)
2816    msgbox_uvmat('ERROR',['no field  ' FieldName ' for histogram'])
2817    return
2818end
2819FieldHisto=Field.(FieldName);
2820if isfield(Field,'FF') && ~isempty(Field.FF) && isequal(size(Field.FF),size(FieldHisto))
2821    indsel=find(Field.FF==0);%find values marked as false
2822    if ~isempty(indsel)
2823        FieldHisto=FieldHisto(indsel);
2824        if ~isempty(FieldName_2)
2825            FieldHisto(:,:,2)=Field.(FieldName_2)(indsel);
2826        end
2827    end
2828end
2829if isempty(Field)
2830    msgbox_uvmat('ERROR',['empty field ' FieldName])
2831else
2832    nxy=size(FieldHisto);
2833    Amin=double(min(min(min(FieldHisto))));%min of field value
2834    Amax=double(max(max(max(FieldHisto))));%max of field value
2835    if isequal(Amin,Amax)
2836        cla(handles.HistoAxes)
2837    else
2838        Histo.ListVarName={FieldName,'histo'};
2839        if isfield(Field,'NbDim') && isequal(Field.NbDim,3)
2840            Histo.VarDimName={FieldName,FieldName}; %dimensions for the histogram
2841        else
2842            if numel(nxy)==2
2843                Histo.VarDimName={FieldName,FieldName}; %dimensions for the histogram
2844            else
2845                Histo.VarDimName={FieldName,{FieldName,'component'}}; %dimensions for the histogram
2846            end
2847        end
2848        %unit
2849        units=[]; %default
2850        for ivar=1:numel(Field.ListVarName)
2851            if strcmp(Field.ListVarName{ivar},FieldName)
2852                if isfield(Field,'VarAttribute') && numel(Field.VarAttribute)>=ivar && isfield(Field.VarAttribute{ivar},'units')
2853                    units=Field.VarAttribute{ivar}.units;
2854                    break
2855                end
2856            end
2857        end
2858        if ~isempty(units)
2859            Histo.VarAttribute{1}.units=units;
2860        end
2861        eval(['Histo.' FieldName '=linspace(Amin,Amax,50);'])%absissa values for histo
2862        if isfield(Field,'NbDim') && isequal(Field.NbDim,3)
2863            C=reshape(double(FieldHisto),1,[]);% reshape in a vector
2864            Histo.histo(:,1)=hist(C, Histo.(FieldName));  %calculate histogram
2865        else
2866            for col=1:size(FieldHisto,3)
2867                B=FieldHisto(:,:,col);
2868                C=reshape(double(B),1,nxy(1)*nxy(2));% reshape in a vector
2869                Histo.histo(:,col)=hist(C, Histo.(FieldName));  %calculate histogram
2870            end
2871        end
2872        plot_field(Histo,handles.HistoAxes);
2873        hlegend=legend;
2874        if isempty(FieldName_2)
2875        set(hlegend,'String',FieldName)
2876        else
2877            set(hlegend,'String',{FieldName;FieldName_2})
2878        end
2879    end
2880end
2881
2882%------------------------------------------------------------------------
2883% --- translate coordinate to matrix index
2884%------------------------------------------------------------------------
2885function [indx,indy]=pos2ind(x0,rangx0,nxy)
2886indx=1+round((nxy(2)-1)*(x0-rangx0(1))/(rangx0(2)-rangx0(1)));% index x of pixel 
2887indy=1+round((nxy(1)-1)*(y12-rangy0(1))/(rangy0(2)-rangy0(1)));% index y of pixel
2888
2889%------------------------------------------------------------------------
2890% --- Executes on button press in 'CheckZoom'.
2891%------------------------------------------------------------------------
2892function CheckZoom_Callback(hObject, eventdata, handles)
2893
2894if get(handles.CheckZoom,'Value')
2895    set(handles.CheckFixLimits,'Value',1)% propose by default fixed limits for the plotting axes
2896    set(handles.CheckZoomFig,'Value',0)%desactivate zoom fig
2897end
2898
2899%------------------------------------------------------------------------
2900% --- Executes on button press in CheckZoomFig.
2901%------------------------------------------------------------------------
2902function CheckZoomFig_Callback(hObject, eventdata, handles)
2903
2904if get(handles.CheckZoomFig,'Value')
2905    set(handles.CheckZoom,'value',0)
2906end
2907
2908%------------------------------------------------------------------------
2909% --- Executes on button press in 'CheckFixLimits'.
2910%------------------------------------------------------------------------
2911function CheckFixLimits_Callback(hObject, eventdata, handles)
2912
2913if ~get(handles.CheckFixLimits,'Value')
2914    update_plot(handles);
2915end
2916
2917%------------------------------------------------------------------------
2918% --- Executes on button press in CheckFixAspectRatio.
2919function CheckFixAspectRatio_Callback(hObject, eventdata, handles)
2920%------------------------------------------------------------------------
2921
2922if get(handles.CheckFixAspectRatio,'Value')
2923    update_plot(handles);
2924else
2925    update_plot(handles);
2926end
2927
2928%------------------------------------------------------------------------
2929function num_AspectRatio_Callback(hObject, eventdata, handles)
2930%------------------------------------------------------------------------
2931set(handles.CheckFixAspectRatio,'Value',1)% select the fixed aspect ratio button
2932update_plot(handles);
2933
2934%------------------------------------------------------------------------
2935%----Executes on button press in 'record': records the current flags of manual correction.
2936%------------------------------------------------------------------------
2937function record_Callback(hObject, eventdata, handles)
2938
2939[RootPath,SubDir,RootFile,FileIndices,FileExt]=read_file_boxes(handles);
2940FileName=[fullfile(RootPath,SubDir,RootFile) FileIndices FileExt];
2941[erread,message]=fileattrib(FileName);
2942if ~isempty(message) && ~isequal(message.UserWrite,1)
2943     msgbox_uvmat('ERROR',['no writting access to ' FileName])
2944     return
2945end
2946test_civ2=isequal(get(handles.civ2,'BackgroundColor'),[1 1 0]);
2947test_civ1=isequal(get(handles.VelType,'BackgroundColor'),[1 1 0]);
2948if ~test_civ2 && ~test_civ1
2949    msgbox_uvmat('ERROR','manual correction only possible for CIV1 or CIV2 velocity fields')
2950end
2951if test_civ2
2952    nbname='nb_vectors2';
2953   flagname='vec2_FixFlag';
2954   attrname='fix2';
2955end
2956if test_civ1
2957    nbname='nb_vectors';
2958   flagname='vec_FixFlag';
2959   attrname='fix';
2960end
2961%write fix flags in the netcdf file
2962UvData=get(handles.uvmat,'UserData');
2963hhh=which('netcdf.open');% look for built-in matlab netcdf library
2964if ~isequal(hhh,'')% case of new builtin Matlab netcdf library
2965    nc=netcdf.open(FileName,'NC_WRITE');
2966    netcdf.reDef(nc);
2967    netcdf.putAtt(nc,netcdf.getConstant('NC_GLOBAL'),attrname,1);
2968    dimid = netcdf.inqDimID(nc,nbname);
2969    try
2970        varid = netcdf.inqVarID(nc,flagname);% look for already existing fixflag variable
2971    catch
2972        varid=netcdf.defVar(nc,flagname,'double',dimid);%create fixflag variable if it does not exist
2973    end
2974    netcdf.endDef(nc);
2975    netcdf.putVar(nc,varid,UvData.PlotAxes.FF);
2976    netcdf.close(nc); 
2977else %old netcdf library
2978    netcdf_toolbox(FileName,AxeData,attrname,nbname,flagname)
2979end
2980
2981%-------------------------------------------------------------------
2982%----Correct the netcdf file, using toolbox (old versions of Matlab).
2983%-------------------------------------------------------------------
2984function netcdf_toolbox(FileName,AxeData,attrname,nbname,flagname)
2985nc=netcdf(FileName,'write'); %open netcdf file
2986result=redef(nc);
2987eval(['nc.' attrname '=1;']);
2988theDim=nc(nbname) ;% get the number of velocity vectors
2989nb_vectors=size(theDim);
2990var_FixFlag=ncvar(flagname,nc);% var_FixFlag will be written as the netcdf variable vec_FixFlag
2991var_FixFlag(1:nb_vectors)=AxeData.FF;%
2992fin=close(nc);
2993
2994%-------------------------------------------------------------------
2995% --- Executes on button press in SubField
2996function SubField_Callback(hObject, eventdata, handles)
2997%-------------------------------------------------------------------
2998UvData=get(handles.uvmat,'UserData');
2999if get(handles.SubField,'Value')==0% if the subfield button is desactivated   
3000    set(handles.RootPath_1,'String','')
3001    set(handles.RootFile_1,'String','')
3002    set(handles.SubDir_1,'String','');
3003    set(handles.FileIndex_1,'String','');
3004    set(handles.FileExt_1,'String','');
3005    set(handles.RootPath_1,'Visible','off')
3006    set(handles.RootFile_1,'Visible','off')
3007    set(handles.SubDir_1,'Visible','off');
3008    set(handles.NomType_1,'Visible','off');
3009    set(handles.abs_time_1,'Visible','off')
3010    set(handles.FileIndex_1,'Visible','off');
3011    set(handles.FileExt_1,'Visible','off');
3012    set(handles.FieldName_1,'Value',1);%set to blank state
3013    set(handles.VelType_1,'Value',1);%set to blank state
3014    set(handles.num_Opacity,'String','')% desactivate opacity setting
3015    FieldList=get(handles.FieldName,'String');
3016    if numel(FieldList)>1   % if a choice of fields exists
3017        set(handles.FieldName_1,'Value',1)% set second field choice to blank
3018        set(handles.FieldName_1,'String',[{''};FieldList])% reproduce the menu FieldName plus a blank option
3019    else
3020        set(handles.FieldName_1,'String',{''})% set second field choice to blank
3021    end
3022    if ~strcmp(get(handles.VelType,'Visible'),'on')
3023        set(handles.VelType_1,'Visible','off')
3024    end
3025    if isfield(UvData,'XmlData_1')
3026        UvData=rmfield(UvData,'XmlData_1');
3027    end
3028    set(handles.uvmat,'UserData',UvData);
3029    transform_fct_list=get(handles.TransformName,'String');
3030    transform_fct=transform_fct_list(get(handles.TransformName,'Value'));
3031    if strcmp(transform_fct,'sub_field')
3032        set(handles.TransformName,'Value',1)%suppress the sub_field transform
3033        transform_fct_Callback(hObject, eventdata, handles);
3034    else
3035        run0_Callback(hObject, eventdata, handles)
3036    end 
3037else
3038    MenuBrowse_1_Callback(hObject, eventdata, handles)
3039end
3040
3041%------------------------------------------------------------------------
3042% --- read the data displayed for the input rootfile windows (new): TODO use read_GUI
3043
3044function [RootPath,SubDir,RootFile,FileIndices,FileExt]=read_file_boxes(handles)
3045%------------------------------------------------------------------------
3046InputFile=read_GUI(handles.InputFile);
3047RootPath=InputFile.RootPath;
3048SubDir=regexprep(InputFile.SubDir,'/|\','');
3049RootFile=regexprep(InputFile.RootFile,'/|\','');
3050FileIndices=InputFile.FileIndex;
3051FileExt=InputFile.FileExt;
3052
3053
3054%------------------------------------------------------------------------
3055% ---- read the data displayed for the second input rootfile windows
3056function [RootPath_1,SubDir_1,RootFile_1,FileIndex_1,FileExt_1,NomType_1]=read_file_boxes_1(handles)
3057%------------------------------------------------------------------------
3058RootPath_1=get(handles.RootPath_1,'String'); % read the data from the file1_input window
3059if isequal(get(handles.RootPath_1,'Visible'),'off') || isequal(RootPath_1,'"')
3060    RootPath_1=get(handles.RootPath,'String');
3061end;
3062SubDir_1=get(handles.SubDir_1,'String');
3063if isequal(get(handles.SubDir_1,'Visible'),'off')|| isequal(SubDir_1,'"')
3064    SubDir_1=get(handles.SubDir,'String');
3065end
3066SubDir_1=regexprep(SubDir_1,'\<[\\/]|[\\/]\>','');%suppress possible / or \ separator at the beginning or the end of the string
3067RootFile_1=get(handles.RootFile_1,'String');
3068if isequal(get(handles.RootFile_1,'Visible'),'off') || isequal(RootFile_1,'"')
3069    RootFile_1=get(handles.RootFile,'String');
3070end
3071RootFile_1=regexprep(RootFile_1,'\<[\\/]|[\\/]\>','');%suppress possible / or \ separator at the beginning or the end of the string
3072FileIndex_1=get(handles.FileIndex_1,'String');
3073if isequal(get(handles.FileIndex_1,'Visible'),'off')|| isequal(FileIndex_1,'"')
3074    FileIndex_1=get(handles.FileIndex,'String');
3075end
3076FileExt_1=get(handles.FileExt_1,'String');
3077if isequal(get(handles.FileExt_1,'Visible'),'off') || isequal(FileExt_1,'"')
3078    FileExt_1=get(handles.FileExt,'String');%read FileExt by default
3079end
3080NomType_1=get(handles.NomType_1,'String');
3081if isequal(get(handles.NomType_1,'Visible'),'off') || isequal(NomType_1,'"')
3082    NomType_1=get(handles.NomType,'String');%read FileExt by default
3083end
3084%------------------------------------------------------------------------
3085% --- Executes on menu selection FieldName
3086function FieldName_Callback(hObject, eventdata, handles)
3087%------------------------------------------------------------------------
3088UvData=get(handles.uvmat,'UserData');
3089list_fields=get(handles.FieldName,'String');% list menu fields
3090index_fields=get(handles.FieldName,'Value');% selected string index
3091field= list_fields{index_fields(1)}; % selected string
3092
3093%% fill the coordinates and variables from selections in get_field
3094if isequal(field,'get_field...')
3095    ParamIn=[];
3096    if strcmp(get(handles.VelType,'Visible'),'on')
3097        % we use the civ choice as default input
3098        ParamIn.SwitchVarIndexTime='attribute';
3099        ListVelType=get(handles.VelType,'String');
3100        VelType=ListVelType{get(handles.VelType,'Value')};
3101        switch VelType
3102            case 'civ1'
3103                 ParamIn.TimeVarName='Civ1_Time';
3104                 ParamIn.vector_x='Civ1_U';
3105                 ParamIn.vector_y='Civ1_V';
3106                 ParamIn.vec_color='Civ1_C';               
3107            case 'filter1'
3108                 ParamIn.TimeVarName='Civ1_Time';
3109                 ParamIn.vector_x='Civ1_U_smooth';
3110                 ParamIn.vector_y='Civ1_V_smooth';
3111            case 'civ2'
3112                 ParamIn.TimeVarName='Civ2_Time';
3113                 ParamIn.vector_x='Civ2_U';
3114                 ParamIn.vector_y='Civ2_V';
3115            case 'filter2'
3116                 ParamIn.TimeVarName='Civ2_Time';
3117                 ParamIn.vector_x='Civ2_U_smooth';
3118                 ParamIn.vector_y='Civ2_V_smooth';
3119                 ParamIn.vec_color='Civ2_C';
3120        end
3121    end
3122    set(handles.FixVelType,'visible','off')
3123    set(handles.VelType,'Visible','off')
3124    set(handles.VelType_1,'Visible','off')
3125    [RootPath,SubDir,RootFile,FileIndices,FileExt]=read_file_boxes(handles);
3126    FileName=[fullfile(RootPath,SubDir,RootFile) FileIndices FileExt];
3127%     hget_field=findobj(allchild(0),'name','get_field');
3128%     if ~isempty(hget_field)
3129%         delete(hget_field)
3130%     end
3131    GetFieldData=get_field(FileName,ParamIn);
3132    FieldList={};
3133    VecColorList={};
3134    XName=GetFieldData.XVarName;
3135    if GetFieldData.CheckVector
3136        UName=GetFieldData.PanelVectors.vector_x;
3137        VName=GetFieldData.PanelVectors.vector_y;
3138        XName=GetFieldData.XVarName;
3139        YName=GetFieldData.YVarName;
3140        CName=GetFieldData.PanelVectors.vec_color;
3141        [FieldList,VecColorList]=set_field_list(UName,VName,CName);
3142    elseif GetFieldData.CheckScalar
3143        AName=GetFieldData.PanelScalar.scalar;
3144        XName=GetFieldData.XVarName;
3145        YName=GetFieldData.YVarName;
3146        FieldList={AName};
3147    elseif GetFieldData.CheckPlot1D;
3148        YName=GetFieldData.CheckPlot1D.ordinate;
3149    end
3150    set(handles.Coord_x,'String',{XName})
3151    set(handles.Coord_y,'String',{YName})
3152    set(handles.FieldName,'Value',1)
3153    set(handles.FieldName,'String',[FieldList; {'get_field...'}]);
3154    set(handles.ColorScalar,'Value',1)
3155    set(handles.ColorScalar,'String',VecColorList);
3156    UvData.FileType{1}='netcdf';
3157    set(handles.uvmat,'UserData',UvData)
3158    run0_Callback(hObject, eventdata, handles)
3159    return %no further action
3160end
3161
3162
3163
3164%read the rootfile input display
3165[RootPath,SubDir,RootFile,FileIndices,FileExt]=read_file_boxes(handles);
3166FileName=[fullfile(RootPath,SubDir,RootFile) FileIndices FileExt];
3167[tild,tild,tild,i1,i2,j1,j2,tild,NomType]=fileparts_uvmat(['xxx' get(handles.FileIndex,'String') FileExt]);
3168if isequal(field,'image')
3169    if  isfield(UvData.Field,'Civ2_ImageA')%get the corresponding input image in the netcdf file
3170        imagename=UvData.Field.Civ2_ImageA;
3171    elseif isfield(UvData.Field,'Civ1_ImageA')%
3172        imagename=UvData.Field.Civ1_ImageA;
3173    else
3174        SubDirBase=regexprep(SubDir,'\..*','');%take the root part of SubDir, before the first dot '.'
3175        imagename=fullfile_uvmat(RootPath,SubDirBase,RootFile,'.png',NomType,i1,[],j1,[]);
3176    end
3177    if ~exist(imagename,'file')
3178        [FileName,PathName] = uigetfile( ...
3179            {'*.png;*.jpg;*.tif;*.avi;*.AVI;*.vol', ' (*.png, .tif, *.avi,*.vol)';
3180            '*.jpg',' jpeg image files'; ...
3181            '*.png','.png image files'; ...
3182            '*.tif','.tif image files'; ...
3183            '*.avi;*.AVI','.avi movie files'; ...
3184            '*.vol','.volume images (png)'; ...
3185            '*.*',  'All Files (*.*)'}, ...
3186            'Pick an image',imagename);
3187        if ~ischar(FileName),return,end %abandon if the browser is cancelled
3188        imagename=[PathName FileName];
3189    end
3190     % display the selected field and related information
3191    display_file_name(handles,imagename)%display the image
3192    return
3193else
3194    ext=get(handles.FileExt,'String');
3195    if ~isequal(ext,'.nc') %find the new NomType if the previous display was not already a netcdf file
3196        [FileName,PathName] = uigetfile( ...
3197            {'*.nc', ' (*.nc)';
3198            '*.nc',' netcdf files'; ...
3199            '*.*',  'All Files (*.*)'}, ...
3200            'Pick a netcdf file',FileBase);
3201        if ~ischar(FileName),return,end %abandon if the browser is cancelled
3202        FullFileName=[PathName FileName];
3203        % display the selected field and related information
3204        display_file_name( handles,FullFileName)
3205        return
3206    end
3207end
3208indices=fullfile_uvmat('','','','',NomType,i1,i2,j1,j2);
3209set(handles.FileIndex,'String',indices)
3210
3211%common to Fields_1_Callback
3212list_fields_1=get(handles.FieldName_1,'String');% list menu fields
3213field_1='';
3214if ~isempty(list_fields_1)
3215field_1= list_fields_1{get(handles.FieldName_1,'Value')}; % selected string
3216end
3217if isequal(field,'image')||isequal(field_1,'image')
3218    set(handles.TitleNpxy,'Visible','on')% visible npx,pxcm... buttons
3219    set(handles.num_Npx,'Visible','on')
3220    set(handles.num_Npy,'Visible','on')
3221else
3222    set(handles.TitleNpxy,'Visible','off')% visible npx,pxcm... buttons
3223    set(handles.num_Npx,'Visible','off')
3224    set(handles.num_Npy,'Visible','off')
3225end
3226if ~(isfield(UvData,'NewSeries')&&isequal(UvData.NewSeries,1))
3227    run0_Callback(hObject, eventdata, handles)
3228end
3229
3230%----------------------------------------------------------------
3231% --- Executes on menu selection FieldName
3232function FieldName_1_Callback(hObject, eventdata, handles)
3233%-------------------------------------------------
3234%% read input data
3235check_new=~get(handles.SubField,'Value'); %check_new=1 if a second field was not previously entered
3236UvData=get(handles.uvmat,'UserData');
3237if check_new && isfield(UvData,'XmlData')
3238    UvData.XmlData{2}=UvData.XmlData{1};
3239end
3240if isfield(UvData,'Field_1')
3241    UvData=rmfield(UvData,'Field_1');% remove the stored second field (a new one needs to be read)
3242end
3243UvData.FileName_1='';% desactivate the use of a constant second file
3244list_fields=get(handles.FieldName,'String');% list menu fields
3245field= list_fields{get(handles.FieldName,'Value')}; % selected string
3246list_fields=get(handles.FieldName_1,'String');% list menu fields
3247field_1= list_fields{get(handles.FieldName_1,'Value')}; % selected string for the second field
3248if isempty(field_1)%||(numel(UvData.FileType)>=2 && strcmp(UvData.FileType{2},'image'))
3249    set(handles.SubField,'Value',0)
3250    SubField_Callback(hObject, eventdata, handles)
3251    return
3252else
3253    set(handles.SubField,'Value',1)%state that a second field is now entered
3254end
3255
3256%% read the rootfile input display
3257[RootPath_1,SubDir_1,RootFile_1,FileIndex_1,FileExt_1]=read_file_boxes_1(handles);
3258FileName_1=[fullfile(RootPath_1,SubDir_1,RootFile_1) FileIndex_1 FileExt_1];
3259[tild,tild,tild,i1,i2,j1,j2]=fileparts_uvmat(get(handles.FileIndex,'String'));
3260switch field_1
3261    case 'get_field...'
3262        set_veltype_display(0) % no veltype display
3263        hget_field=findobj(allchild(0),'name','get_field_1');
3264        if ~isempty(hget_field)
3265            delete(hget_field)
3266        end
3267        hget_field=get_field(FileName_1);
3268        set(hget_field,'name','get_field_1')
3269        hhget_field=guidata(hget_field);
3270        set(hhget_field.list_fig,'Value',1)
3271        set(hhget_field.list_fig,'String',{'uvmat'})
3272        if check_new
3273            UvData.FileType{2}=UvData.FileType{1};
3274            set(handles.FileIndex_1,'String',get(handles.FileIndex,'String'))
3275              set(handles.uvmat,'UserData',UvData)
3276        end
3277    case 'image'
3278        % get the image name corresponding to the current netcdf name (no unique correspondance)
3279        if  isfield(UvData.Field,'Civ2_ImageA')%get the corresponding input image in the netcdf file
3280            imagename=UvData.Field.Civ2_ImageA;
3281        elseif isfield(UvData.Field,'Civ1_ImageA')%
3282            imagename=UvData.Field.Civ1_ImageA;
3283        else
3284            SubDirBase=regexprep(SubDir_1,'\..*','');%take the root part of SubDir, before the first dot '.'
3285            imagename=fullfile_uvmat(RootPath_1,SubDirBase,RootFile_1,'.png',get(handles.NomType,'String'),i1,[],j1);
3286        end
3287        if ~exist(imagename,'file') % browse for images if it is not found
3288            [FileName,PathName] = uigetfile( ...
3289                {'*.png;*.jpg;*.tif;*.avi;*.AVI;*.vol', ' (*.png, .tif, *.avi,*.vol)';
3290                '*.jpg',' jpeg image files'; ...
3291                '*.png','.png image files'; ...
3292                '*.tif','.tif image files'; ...
3293                '*.avi;*.AVI','.avi movie files'; ...
3294                '*.vol','.volume images (png)'; ...
3295                '*.*',  'All Files (*.*)'}, ...
3296                'Pick an image',imagename);
3297            if ~ischar(FileName),return,end %abandon if the browser is cancelled
3298            imagename=[PathName FileName];
3299        end
3300        if ~ischar(imagename)% quit if the browser has  been closed
3301            set(handles.SubField,'Value',0)
3302        else %valid browser input:  display the selected image
3303            set(handles.TitleNpxy,'Visible','on')% visible npx,pxcm... buttons
3304            set(handles.num_Npx,'Visible','on')
3305            set(handles.num_Npy,'Visible','on')
3306            display_file_name(handles,imagename,2)%display the imag
3307        end
3308    otherwise
3309        check_refresh=1;
3310        if check_new% if a second field was not previously entered, we just read another field in the first input file
3311            set(handles.FileIndex_1,'String',get(handles.FileIndex,'String'))
3312            set(handles.FileExt_1,'String',get(handles.FileExt,'String'))
3313           
3314            UvData.FileType{2}=UvData.FileType{1};
3315            UvData.XmlData{2}= UvData.XmlData{1};
3316            transform=get(handles.TransformPath,'UserData');
3317             if (~isa(transform,'function_handle')||nargin(transform)<3)
3318                set(handles.uvmat,'UserData',UvData)
3319                set(handles.TransformName,'value',2); % set transform fct to 'sub_field' if the current fct does not accept two input fields
3320                transform_fct_Callback(hObject, eventdata, handles)% activate transform_fct_Callback and refresh current plot
3321                 check_refresh=0;
3322             end             
3323        end
3324        if ~isequal(field,'image')
3325            set(handles.TitleNpxy,'Visible','off')% visible npx,pxcm... buttons
3326            set(handles.num_Npx,'Visible','off')
3327            set(handles.num_Npy,'Visible','off')
3328        end
3329        set(handles.uvmat,'UserData',UvData)
3330 
3331        if check_refresh && ~(isfield(UvData,'NewSeries')&&isequal(UvData.NewSeries,1))
3332            run0_Callback(hObject, eventdata, handles)
3333        end
3334end
3335
3336%------------------------------------------------------------------------
3337% --- set the visibility of relevant velocity type menus:
3338function menu=set_veltype_display(Civ,FileType)
3339%------------------------------------------------------------------------
3340if ~exist('FileType','var')
3341    FileType='civx';
3342end
3343switch FileType
3344    case 'civx'
3345        menu={'civ1';'interp1';'filter1';'civ2';'interp2';'filter2'};
3346        if isequal(Civ,0)
3347            imax=0;
3348        elseif isequal(Civ,1) || isequal(Civ,2)
3349            imax=1;
3350        elseif isequal(Civ,3)
3351            imax=3;
3352        elseif isequal(Civ,4) || isequal(Civ,5)
3353            imax=4;
3354        elseif isequal(Civ,6) %patch2
3355            imax=6;
3356        end
3357    case 'civdata'
3358        menu={'civ1';'filter1';'civ2';'filter2'};
3359        if isequal(Civ,0)
3360            imax=0;
3361        elseif isequal(Civ,1) || isequal(Civ,2)
3362            imax=1;
3363        elseif isequal(Civ,3)
3364            imax=2;
3365        elseif isequal(Civ,4) || isequal(Civ,5)
3366            imax=3;
3367        elseif isequal(Civ,6) %patch2
3368            imax=4;
3369        end
3370end
3371menu=menu(1:imax);
3372
3373%------------------------------------------------------------------------
3374% --- Executes on button press in FixVelType.
3375function FixVelType_Callback(hObject, eventdata, handles)
3376%------------------------------------------------------------------------
3377% refresh the current plot if the fixed  veltype is unselected
3378if ~get(handles.FixVelType,'Value')
3379    run0_Callback(hObject, eventdata, handles)
3380end
3381
3382%------------------------------------------------------------------------
3383% --- Executes on button press in VelType.
3384function VelType_Callback(hObject, eventdata, handles)
3385%------------------------------------------------------------------------
3386set(handles.FixVelType,'Value',1)
3387run0_Callback(hObject, eventdata, handles)
3388
3389%------------------------------------------------------------------------
3390% --- Executes on choice selection in VelType_1.
3391function VelType_1_Callback(hObject, eventdata, handles)
3392%------------------------------------------------------------------------
3393set(handles.FixVelType,'Value',1)% the velocity type is now imposed by the GUI (not automatic)
3394UvData=get(handles.uvmat,'UserData');
3395set(handles.run0,'BackgroundColor',[1 1 0])%paint run0 button in yellow to indicate its activation
3396drawnow   
3397InputFile=read_GUI(handles.InputFile);% read the input file parameters
3398[RootPath,SubDir,RootFile,FileIndex,FileExt]=read_file_boxes(handles);
3399[RootPath_1,SubDir_1,RootFile_1,FileIndex_1,FileExt_1]=read_file_boxes_1(handles);
3400FileName=[fullfile(RootPath,SubDir,RootFile) FileIndex FileExt];% name of the first input file
3401
3402check_refresh=0;
3403if isempty(InputFile.VelType_1)
3404        FileName_1='';% we plot the first input field without the second field
3405        set(handles.SubField,'Value',0)
3406        SubField_Callback(hObject, eventdata, handles)% activate SubField_Callback and refresh current plot, removing the second field
3407elseif get(handles.SubField,'Value')% if subfield is already 'on'
3408     FileName_1=[fullfile(RootPath_1,SubDir_1,RootFile_1) FileIndex_1 FileExt_1];% name of the second input file
3409     check_refresh=1;%will refresh the current plot
3410else% we introduce the same file (with a different field) for the second series
3411     FileName_1=FileName;% we compare two fields in the same file
3412     UvData.FileType{2}=UvData.FileType{1};
3413     UvData.XmlData{2}= UvData.XmlData{1};
3414     set(handles.SubField,'Value',1)
3415     transform=get(handles.TransformPath,'UserData');
3416     if (~isa(transform,'function_handle')||nargin(transform)<3)
3417        set(handles.uvmat,'UserData',UvData)
3418        set(handles.TransformName,'value',2); % set transform fct to 'sub_field' if the current fct does not accept two input fields
3419        transform_fct_Callback(hObject, eventdata, handles)% activate transform_fct_Callback and refresh current plot
3420     else
3421         check_refresh=1;
3422     end 
3423end
3424
3425% refresh the current plot if it has not been done previously
3426if check_refresh
3427    UvData.FileName_1='';% desactivate the use of a constant second file
3428    set(handles.uvmat,'UserData',UvData)
3429    num_i1=stra2num(get(handles.i1,'String'));
3430    num_i2=stra2num(get(handles.i2,'String'));
3431    num_j1=stra2num(get(handles.j1,'String'));
3432    num_j2=stra2num(get(handles.j2,'String'));
3433    [tild,tild,tild,i1_1,i2_1,j1_1,j2_1]=fileparts_uvmat(['xx' FileIndex_1]);
3434    errormsg=refresh_field(handles,FileName,FileName_1,num_i1,num_i2,num_j1,num_j2,i1_1,i2_1,j1_1,j2_1);
3435    if ~isempty(errormsg)
3436        msgbox_uvmat('ERROR',errormsg);
3437    else
3438        set(handles.i1,'BackgroundColor',[1 1 1])
3439        set(handles.i2,'BackgroundColor',[1 1 1])
3440        set(handles.j1,'BackgroundColor',[1 1 1])
3441        set(handles.j2,'BackgroundColor',[1 1 1])
3442        set(handles.FileIndex,'BackgroundColor',[1 1 1])
3443        set(handles.FileIndex_1,'BackgroundColor',[1 1 1])
3444    end
3445    set(handles.run0,'BackgroundColor',[1 0 0])
3446end
3447
3448
3449%------------------------------------------------------------------------
3450% --- reset civ buttons
3451function reset_vel_type(handles_civ0,handle1)
3452%------------------------------------------------------------------------
3453for ibutton=1:length(handles_civ0)
3454    set(handles_civ0(ibutton),'BackgroundColor',[0.831 0.816 0.784])
3455    set(handles_civ0(ibutton),'Value',0)
3456end
3457if exist('handle1','var')%handles of selected button
3458        set(handle1,'BackgroundColor',[1 1 0]) 
3459end
3460
3461%-----------------------------------------------------------------------
3462% --- Executes on button press in MENUVOLUME.
3463function VOLUME_Callback(hObject, eventdata, handles)
3464%-----------------------------------------------------------------------
3465%errordlg('command VOL not implemented yet')
3466if ishandle(handles.UVMAT_title)
3467    delete(handles.UVMAT_title)
3468end
3469UvData=get(handles.uvmat,'UserData');%read UvData properties stored on the uvmat interface
3470if isequal(get(handles.VOLUME,'Value'),1)
3471    set(handles.CheckZoom,'Value',0)
3472%     set(handles.CheckZoom,'BackgroundColor',[0.7 0.7 0.7])
3473    set(handles.edit_vect,'Value',0)
3474    edit_vect_Callback(hObject, eventdata, handles)
3475    set(handles.edit_object,'Value',0)
3476%     set(handles.edit_object,'BackgroundColor',[0.7 0.7 0.7])
3477%     set(handles.cal,'Value',0)
3478%     set(handles.cal,'BackgroundColor',[0 1 0])
3479    set(handles.edit_vect,'Value',0)
3480    edit_vect_Callback(hObject, eventdata, handles)
3481    %initiate set_object GUI
3482    data.Name='VOLUME';
3483    if isfield(UvData,'CoordType')
3484        data.CoordType=UvData.CoordType;
3485    end
3486    if isfield(UvData.Field,'CoordMesh')&~isempty(UvData.Field.CoordMesh)
3487        data.RangeX=[UvData.Field.XMin UvData.Field.XMax];
3488        data.RangeY=[UvData.Field.YMin UvData.Field.YMax];
3489        data.DX=UvData.Field.CoordMesh;
3490        data.DY=UvData.Field.CoordMesh;
3491    elseif isfield(UvData.Field,'AX')&isfield(UvData.Field,'AY')& isfield(UvData.Field,'A')%only image
3492        np=size(UvData.Field.A);
3493        meshx=(UvData.Field.AX(end)-UvData.Field.AX(1))/np(2);
3494        meshy=abs(UvData.Field.AY(end)-UvData.Field.AY(1))/np(1);
3495        data.RangeY=max(meshx,meshy);
3496        data.RangeX=max(meshx,meshy);
3497        data.DX=max(meshx,meshy);
3498    end
3499    data.ParentButton=handles.VOLUME;
3500    PlotHandles=get_plot_handles(handles);%get the handles of the interface elements setting the plotting parameters
3501    [hset_object,UvData.sethandles]=set_object(data,PlotHandles);% call the set_object interface with action on haxes,
3502                                                      % associate the set_object interface handle to the plotting axes
3503    %set(hset_object,'Position',get(handles.uvmat,'Position')+UvData.OpenParam.PosSetObject)
3504    UvData.MouseAction='create_object';
3505else
3506    set(handles.VOLUME,'BackgroundColor',[0 1 0])
3507end
3508set(handles.uvmat,'UserData',UvData)
3509
3510%-------------------------------------------------------
3511function edit_vect_Callback(hObject, eventdata, handles)
3512%-------------------------------------------------------
3513%
3514if isequal(get(handles.edit_vect,'Value'),1)
3515    VelTypeMenu=get(handles.VelType,'String');
3516    VelType=VelTypeMenu{get(handles.VelType,'Value')};
3517    if ~strcmp(VelType,'civ2') && ~strcmp(VelType,'civ1')
3518        msgbox_uvmat('ERROR','manual correction only possible for CIV1 or CIV2 velocity fields')
3519    end
3520    set(handles.record,'Visible','on')
3521    set(handles.edit_vect,'BackgroundColor',[1 1 0])
3522    set(handles.edit_object,'Value',0)
3523    set(handles.CheckZoom,'Value',0)
3524%     set(handles.CheckZoom,'BackgroundColor',[0.7 0.7 0.7])
3525%     set(handles.edit_object,'BackgroundColor',[0.7 0.7 0.7])
3526    set(gcf,'Pointer','arrow')
3527else
3528    set(handles.record,'Visible','off')
3529    set(handles.edit_vect,'BackgroundColor',[0.7 0.7 0.7])
3530end
3531
3532%----------------------------------------------
3533function save_mask_Callback(hObject, eventdata, handles)
3534%-----------------------------------------------------------------------
3535UvData=get(handles.uvmat,'UserData');
3536
3537flag=1;
3538npx=size(UvData.Field.A,2);
3539npy=size(UvData.Field.A,1);
3540xi=0.5:npx-0.5;
3541yi=0.5:npy-0.5;
3542[Xi,Yi]=meshgrid(xi,yi);
3543if isfield(UvData,'ProjObject')
3544    for iobj=1:length(UvData.ProjObject)
3545        ObjectData=UvData.ProjObject{iobj};
3546        if isfield(ObjectData,'ProjMode') &&(isequal(ObjectData.ProjMode,'mask_inside')||isequal(ObjectData.ProjMode,'mask_outside'));
3547            flagobj=1;
3548            testphys=0; %coordinates in pixels by default
3549            if isfield(ObjectData,'CoordType') && isequal(ObjectData.CoordType,'phys')
3550                if isfield(UvData,'XmlData')&& isfield(UvData.XmlData{1},'GeometryCalib')
3551                    Calib=UvData.XmlData{1}.GeometryCalib;
3552                    testphys=1;
3553                end
3554            end
3555            if isfield(ObjectData,'Coord')& isfield(ObjectData,'Style')
3556                if isequal(ObjectData.Type,'polygon')
3557                    X=ObjectData.Coord(:,1);
3558                    Y=ObjectData.Coord(:,2);
3559                    if testphys
3560                        [X,Y]=px_XYZ(Calib,X,Y,0);% to generalise with 3D cases
3561                    end
3562                    flagobj=~inpolygon(Xi,Yi,X',Y');%=0 inside the polygon, 1 outside                 
3563                elseif isequal(ObjectData.Type,'ellipse')
3564                    if testphys
3565                        %[X,Y]=px_XYZ(Calib,X,Y,0);% TODO:create a polygon boundary and transform to phys
3566                    end
3567                    RangeX=max(ObjectData.RangeX);
3568                    RangeY=max(ObjectData.RangeY);
3569                    X2Max=RangeX*RangeX;
3570                    Y2Max=RangeY*RangeY;
3571                    distX=(Xi-ObjectData.Coord(1,1));
3572                    distY=(Yi-ObjectData.Coord(1,2));
3573                    flagobj=(distX.*distX/X2Max+distY.*distY/Y2Max)>1;
3574                elseif isequal(ObjectData.Type,'rectangle')
3575                    if testphys
3576                        %[X,Y]=px_XYZ(Calib,X,Y,0);% TODO:create a polygon boundary and transform to phys
3577                    end
3578                    distX=abs(Xi-ObjectData.Coord(1,1));
3579                    distY=abs(Yi-ObjectData.Coord(1,2));
3580                    flagobj=distX>max(ObjectData.RangeX) | distY>max(ObjectData.RangeY);
3581                end
3582                if isequal(ObjectData.ProjMode,'mask_outside')
3583                    flagobj=~flagobj;
3584                end
3585                flag=flag & flagobj;
3586            end
3587        end
3588    end
3589end
3590% flag=~flag;
3591%mask name
3592RootPath=get(handles.RootPath,'String');
3593RootFile=get(handles.RootFile,'String');
3594RootFile=regexprep(RootFile,'\<[\\/]|[\\/]\>','');%suppress possible / or \ separator at the beginning or the end of the string
3595filebase=fullfile(RootPath,RootFile);
3596list=get(handles.masklevel,'String');
3597masknumber=num2str(length(list));
3598maskindex=get(handles.masklevel,'Value');
3599mask_name=fullfile_uvmat(RootPath,SubDir,[RootFile '_' masknumber 'mask'],'.png','_1',maskindex);
3600%mask_name=name_generator([filebase '_' masknumber 'mask'],maskindex,1,'.png','_i');
3601imflag=uint8(255*(0.392+0.608*flag));% =100 for flag=0 (vectors not computed when 20<imflag<200)
3602imflag=flipdim(imflag,1);
3603% imflag=uint8(255*flag);% =0 for flag=0 (vectors=0 when 20<imflag<200)
3604msgbox_uvmat('CONFIRMATION',[mask_name ' saved'])
3605imwrite(imflag,mask_name,'BitDepth',8);
3606
3607%display the mask
3608figure;
3609vec=linspace(0,1,256);%define a linear greyscale colormap
3610map=[vec' vec' vec'];
3611colormap(map)
3612
3613image(imflag);
3614
3615%------------------------------------------------------------------------
3616%------------------------------------------------------------------------
3617%  - FUNCTIONS FOR SETTING PLOTTING PARAMETERS
3618
3619%------------------------------------------------------------------------
3620%------------------------------------------------------------------------
3621% --- Executes on selection change in TransformName.
3622
3623function TransformName_Callback(hObject, eventdata, handles)
3624%------------------------------------------------------------------------
3625UvData=get(handles.uvmat,'UserData');
3626menu=get(handles.TransformName,'String');refresh
3627ichoice=get(handles.TransformName,'Value');%item number in the menu
3628transform_name=menu{ichoice};% choice of the transform fct
3629list_path=get(handles.TransformName,'UserData');
3630
3631%% add a new item to the menu if the option 'more...' has been selected
3632prev_path=fullfile(get(handles.TransformPath,'String'));
3633if ~exist(prev_path,'dir')
3634    prev_path=fullfile(fileparts(which('uvmat')),'transform_field');
3635end
3636if strcmp(transform_name,'more...');
3637    [FileName, PathName] = uigetfile( ...
3638        {'*.m', ' (*.m)';
3639        '*.m',  '.m files '; ...
3640        '*.*', 'All Files (*.*)'}, ...
3641        'Pick the transform function', prev_path);
3642    if ~ischar(FileName),return,end %abandon if the browser is cancelled
3643    path_transform_fct =fullfile(PathName,FileName);
3644    if isempty(regexp(FileName,'\.m$'))% detect file extension .m
3645        msgbox_uvmat('ERROR','a Matlab function .m must be introduced');
3646        return
3647    else
3648        transform_name=regexprep(FileName,'\.m','');
3649    end
3650    ichoice=find(strcmp(transform_name,menu),1);%look for the selected fct in the existing menu
3651    if isempty(ichoice)% if the item is not found, add it to the menu (before 'more...' and select it)
3652        menu=[menu(1:end-1);{transform_name};{'more...'}];
3653        ichoice=numel(menu)-1;   
3654    end
3655    list_path{ichoice}=PathName;%update the list fo fct paths
3656    set(handles.TransformName,'String',menu)
3657    set(handles.TransformName,'Value',ichoice)
3658   
3659    % save the new menu in the personal file 'uvmat_perso.mat'
3660    dir_perso=prefdir;%personal Matalb directory
3661    profil_perso=fullfile(dir_perso,'uvmat_perso.mat');
3662    if exist(profil_perso,'file')
3663        nb_builtin=UvData.OpenParam.NbBuiltin;% number of 'builtin' (basic) transform fcts in uvmat
3664        if nb_builtin<numel(list_path)
3665        for ilist=nb_builtin+1:numel(list_path)
3666            transform_fct{ilist-nb_builtin}=[fullfile(list_path{ilist},menu{ilist}) '.m'];
3667        end
3668        save (profil_perso,'transform_fct','-append'); %store the root name for future opening of uvmat
3669        end
3670    end
3671end
3672
3673%% create the function handle of the selected fct
3674
3675if isempty(list_path{ichoice})% case of no selected fct
3676    transform_handle=[];
3677else
3678    if ~exist(list_path{ichoice},'dir')
3679        msgbox_uvmat('ERROR','invalid fct path: select the transform fct again with the option more...')
3680        return
3681    end
3682    current_dir=pwd;%current working dir
3683    cd(list_path{ichoice})
3684    transform_handle=str2func(transform_name);
3685    cd(current_dir)
3686end
3687set(handles.TransformPath,'String',list_path{ichoice})
3688set(handles.TransformPath,'UserData',transform_handle)
3689set(handles.TransformName,'UserData',list_path)
3690
3691%% update the ToolTip string of the menu TransformName with the first line of the selected fct file
3692if isempty(list_path{ichoice})% case of no selected fct
3693    set(handles.TransformName,'ToolTipString','transform_fct:choose a transform function')
3694else
3695    try
3696        [fid,errormsg] =fopen([fullfile(list_path{ichoice},transform_name) '.m']);
3697        InputText=textscan(fid,'%s',1,'delimiter','\n');
3698        fclose(fid)
3699        set(handles.TransformName,'ToolTipString',['transform_fct: ' InputText{1}{1}])% put the first line of the selected function as tooltip help
3700    end
3701end
3702
3703%% adapt the GUI to the input/output conditions of the selected transform fct
3704DataOut=[];
3705CoordUnit='';
3706CoordUnitPrev='';
3707if isfield(UvData,'Field')&&isfield(UvData.Field,'CoordUnit')
3708    CoordUnitPrev=UvData.Field.CoordUnit;
3709end
3710if ~isempty(list_path{ichoice})
3711    if nargin(transform_handle)>1 && isfield(UvData,'XmlData')&&~isempty(UvData.XmlData)
3712        XmlData=UvData.XmlData{1};
3713        DataOut=feval(transform_handle,'*',XmlData);
3714        if isfield(DataOut,'CoordUnit')
3715            CoordUnit=DataOut.CoordUnit;
3716        end
3717        if isfield(DataOut,'InputFieldType')
3718            UvData.InputFieldType=DataOut.InputFieldType;
3719        end
3720    else
3721        DataOut=feval(transform_handle,'*');
3722    end
3723end
3724
3725
3726%% delete drawn objects if the output CooordUnit is different from the previous one
3727if ~strcmp(CoordUnit,CoordUnitPrev)
3728    set(handles.CheckFixLimits,'Value',0)
3729set(handles.CheckFixLimits,'BackgroundColor',[0.7 0.7 0.7])
3730    hother=findobj('Tag','proj_object');%find all the proj objects
3731    for iobj=1:length(hother)
3732        delete_object(hother(iobj))
3733    end
3734    hother=findobj('Tag','DeformPoint');%find all the proj objects
3735    for iobj=1:length(hother)
3736        delete_object(hother(iobj))
3737    end
3738    hh=findobj('Tag','calib_points');
3739    if ~isempty(hh)
3740        delete(hh)
3741    end
3742    hhh=findobj('Tag','calib_marker');
3743    if ~isempty(hhh)
3744        delete(hhh)
3745    end
3746    set(handles.ListObject,'Value',1)
3747    set(handles.ListObject,'String',{''})
3748    set(handles.ListObject_1,'Value',1)
3749    set(handles.ListObject_1,'String',{''})
3750    set(handles.ViewObject,'value',0)
3751    ViewObject_Callback(hObject, eventdata, handles)
3752    set(handles.ViewField,'value',0)
3753    ViewField_Callback(hObject, eventdata, handles)
3754    set(handles.edit_object,'Value',0)
3755    edit_object_Callback(hObject, eventdata, handles)
3756    UvData.ProjObject={[]};
3757end
3758set(handles.uvmat,'UserData',UvData)
3759
3760%% refresh the current plot
3761if isempty(list_path{ichoice}) || nargin(transform_handle)<3
3762    set(handles.SubField,'Value',0)
3763    SubField_Callback(hObject, eventdata, handles)
3764else
3765    run0_Callback(hObject, eventdata, handles)
3766end
3767
3768%------------------------------------------------
3769%CALLBACKS FOR PLOTTING PARAMETERS
3770%-------------------------------------------------
3771%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3772% Plot coordinates
3773%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3774%------------------------------------------------------------------------
3775function num_MinX_Callback(hObject, eventdata, handles)
3776%------------------------------------------------------------------------
3777set(handles.CheckFixLimits,'Value',1) %suppress auto mode
3778set(handles.CheckFixLimits,'BackgroundColor',[1 1 0])
3779update_plot(handles);
3780
3781%------------------------------------------------------------------------
3782function num_MaxX_Callback(hObject, eventdata, handles)
3783%------------------------------------------------------------------------
3784set(handles.CheckFixLimits,'Value',1) %suppress auto mode
3785set(handles.CheckFixLimits,'BackgroundColor',[1 1 0])
3786update_plot(handles);
3787
3788%------------------------------------------------------------------------
3789function num_MinY_Callback(hObject, eventdata, handles)
3790%------------------------------------------
3791set(handles.CheckFixLimits,'Value',1) %suppress auto mode
3792set(handles.CheckFixLimits,'BackgroundColor',[1 1 0])
3793update_plot(handles);
3794
3795%------------------------------------------------------------------------
3796function num_MaxY_Callback(hObject, eventdata, handles)
3797%------------------------------------------------------------------------
3798set(handles.CheckFixLimits,'Value',1) %suppress auto mode
3799set(handles.CheckFixLimits,'BackgroundColor',[1 1 0])
3800update_plot(handles);
3801
3802%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3803% Scalar or image representation
3804%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3805%------------------------------------------------------------------------
3806function num_MinA_Callback(hObject, eventdata, handles)
3807%------------------------------------------
3808set(handles.CheckFixScalar,'Value',1) %suppress auto mode
3809set(handles.CheckFixScalar,'BackgroundColor',[1 1 0])
3810MinA=str2double(get(handles.num_MinA,'String'));
3811MaxA=str2double(get(handles.num_MaxA,'String'));
3812if MinA>MaxA% switch minA and maxA in case of error
3813    MinA_old=MinA;
3814    MinA=MaxA;
3815    MaxA=MinA_old;
3816    set(handles.num_MinA,'String',num2str(MinA,5));
3817    set(handles.num_MaxA,'String',num2str(MaxA,5));
3818end
3819update_plot(handles);
3820
3821%------------------------------------------------------------------------
3822function num_MaxA_Callback(hObject, eventdata, handles)
3823%------------------------------------------------------------------------
3824set(handles.CheckFixScalar,'Value',1) %suppress auto mode
3825set(handles.CheckFixScalar,'BackgroundColor',[1 1 0])
3826MinA=str2double(get(handles.num_MinA,'String'));
3827MaxA=str2double(get(handles.num_MaxA,'String'));
3828if MinA>MaxA% switch minA and maxA in case of error
3829        MinA_old=MinA;
3830    MinA=MaxA;
3831    MaxA=MinA_old;
3832    set(handles.num_MinA,'String',num2str(MinA,5));
3833    set(handles.num_MaxA,'String',num2str(MaxA,5));
3834end
3835update_plot(handles);
3836
3837%------------------------------------------------------------------------
3838function CheckFixScalar_Callback(hObject, eventdata, handles)
3839%------------------------------------------------------------------------
3840test=get(handles.CheckFixScalar,'Value');
3841if test
3842    set(handles.CheckFixScalar,'BackgroundColor',[1 1 0])
3843else
3844    set(handles.CheckFixScalar,'BackgroundColor',[0.7 0.7 0.7])
3845    update_plot(handles);
3846end
3847
3848%-------------------------------------------------------------------
3849function CheckBW_Callback(hObject, eventdata, handles)
3850%-------------------------------------------------------------------
3851update_plot(handles);
3852
3853%-------------------------------------------------------------------
3854function num_Opacity_Callback(hObject, eventdata, handles)
3855update_plot(handles);
3856%-------------------------------------------------------------------
3857
3858%-------------------------------------------------------------------
3859function ListContour_Callback(hObject, eventdata, handles)
3860%-------------------------------------------------------------------
3861val=get(handles.ListContour,'Value');
3862if val==2
3863    set(handles.interval_txt,'Visible','on')
3864    set(handles.num_IncrA,'Visible','on')
3865else
3866    set(handles.interval_txt,'Visible','off')
3867    set(handles.num_IncrA,'Visible','off')
3868end
3869update_plot(handles);
3870
3871%-------------------------------------------------------------------
3872function num_IncrA_Callback(hObject, eventdata, handles)
3873%-------------------------------------------------------------------
3874update_plot(handles);
3875
3876
3877%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3878% Vector representation
3879%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3880%-------------------------------------------------------------------
3881function CheckHideWarning_Callback(hObject, eventdata, handles)
3882%-------------------------------------------------------------------
3883update_plot(handles);
3884
3885%-------------------------------------------------------------------
3886function CheckHideFalse_Callback(hObject, eventdata, handles)
3887%-------------------------------------------------------------------
3888update_plot(handles);
3889
3890%-------------------------------------------------------------------
3891function num_VecScale_Callback(hObject, eventdata, handles)
3892%-------------------------------------------------------------------
3893set(handles.CheckFixVectors,'Value',1);
3894set(handles.CheckFixVectors,'BackgroundColor',[1 1 0])
3895update_plot(handles);
3896
3897%-------------------------------------------------------------------
3898function CheckFixVectors_Callback(hObject, eventdata, handles)
3899%-------------------------------------------------------------------
3900test=get(handles.CheckFixVectors,'Value');
3901if test
3902    set(handles.CheckFixVectors,'BackgroundColor',[1 1 0])
3903else
3904    update_plot(handles);
3905    %set(handles.num_VecScale,'String',num2str(ScalOut.num_VecScale,3))
3906    set(handles.CheckFixVectors,'BackgroundColor',[0.7 0.7 0.7])
3907end
3908
3909%------------------------------------------------------------------------
3910% --- Executes on selection change in CheckDecimate4 (nb_vec/4).
3911%------------------------------------------------------------------------
3912function CheckDecimate4_Callback(hObject, eventdata, handles)
3913
3914if isequal(get(handles.CheckDecimate4,'Value'),1)
3915    set(handles.CheckDecimate16,'Value',0)
3916end
3917update_plot(handles);
3918
3919%------------------------------------------------------------------------
3920% --- Executes on selection change in CheckDecimate16 (nb_vec/16).
3921%------------------------------------------------------------------------
3922function CheckDecimate16_Callback(hObject, eventdata, handles)
3923
3924if isequal(get(handles.CheckDecimate16,'Value'),1)
3925    set(handles.CheckDecimate4,'Value',0)
3926end
3927update_plot(handles);
3928
3929%------------------------------------------------------------------------
3930% --- Executes on selection change in ColorCode menu
3931function ColorCode_Callback(hObject, eventdata, handles)
3932%------------------------------------------------------------------------
3933% edit the choice for color code
3934update_color_code_boxes(handles);
3935update_plot(handles);
3936
3937%------------------------------------------------------------------------
3938function update_color_code_boxes(handles)
3939%------------------------------------------------------------------------
3940list_code=get(handles.ColorCode,'String');% list menu fields
3941colcode= list_code{get(handles.ColorCode,'Value')}; % selected field
3942enable_slider='off';%default
3943enable_bounds='off';%default
3944enable_scalar='off';%default
3945switch colcode
3946    case {'rgb','bgr'}
3947        enable_slider='on';
3948        enable_bounds='on';
3949        enable_scalar='on';
3950    case '64 colors'
3951        enable_bounds='on';
3952        enable_scalar='on';
3953end
3954set(handles.Slider1,'Visible',enable_slider)
3955set(handles.Slider2,'Visible', enable_slider)
3956set(handles.num_ColCode1,'Visible',enable_slider)
3957set(handles.num_ColCode2,'Visible',enable_slider)
3958set(handles.TitleColCode1,'Visible',enable_slider)
3959set(handles.TitleColCode2,'Visible',enable_slider)
3960set(handles.CheckFixVecColor,'Visible',enable_bounds)
3961set(handles.num_MinVec,'Visible',enable_bounds)
3962set(handles.num_MaxVec,'Visible',enable_bounds)
3963set(handles.ColorScalar,'Visible',enable_scalar)
3964set_vec_col_bar(handles)
3965
3966%------------------------------------------------------------------
3967% --- Executes on selection change in ColorScalar: choice of the color code.
3968function ColorScalar_Callback(hObject, eventdata, handles)
3969%------------------------------------------------------------------
3970% edit the choice for color code
3971list_scalar=get(handles.ColorScalar,'String');% list menu fields
3972col_scalar= list_scalar{get(handles.ColorScalar,'Value')}; % selected field
3973if isequal(col_scalar,'ima_cor')
3974    set(handles.CheckFixVecColor,'Value',1)%fixed scale by default
3975    ColorCode='rgb';
3976    set(handles.num_MinVec,'String','0')
3977    set(handles.num_MaxVec,'String','1')
3978    set(handles.num_ColCode1,'String','0.333')
3979    set(handles.num_ColCode2,'String','0.666')
3980else
3981    set(handles.CheckFixVecColor,'Value',0)%auto scale between min,max by default
3982    ColorCode='64 colors';
3983end
3984ColorCodeList=get(handles.ColorCode,'String');
3985ichoice=find(strcmp(ColorCode,ColorCodeList),1);
3986set(handles.ColorCode,'Value',ichoice)% set color code in the menu
3987
3988update_color_code_boxes(handles);
3989%replot the current graph
3990run0_Callback(hObject, eventdata, handles)
3991
3992%----------------------------------------------------------------
3993% -- Executes on slider movement to set the color code
3994%
3995function Slider1_Callback(hObject, eventdata, handles)
3996%------------------------------------------------------------------
3997slider1=get(handles.Slider1,'Value');
3998min_val=str2num(get(handles.num_MinVec,'String'));
3999max_val=str2num(get(handles.num_MaxVec,'String'));
4000col=min_val+(max_val-min_val)*slider1;
4001set(handles.num_ColCode1,'String',num2str(col))
4002if(get(handles.Slider2,'Value') < col)%move also the second slider at the same value if needed
4003    set(handles.Slider2,'Value',col)
4004    set(handles.num_ColCode2,'String',num2str(col))
4005end
4006set_vec_col_bar(handles)
4007update_plot(handles);
4008
4009%----------------------------------------------------------------
4010% Executes on slider movement to set the color code
4011%----------------------------------------------------------------
4012function Slider2_Callback(hObject, eventdata, handles)
4013slider2=get(handles.Slider2,'Value');
4014min_val=str2num(get(handles.num_MinVec,'String'));
4015max_val=str2num(get(handles.num_MaxVec,'String'));
4016col=min_val+(max_val-min_val)*slider2;
4017set(handles.num_ColCode2,'String',num2str(col))
4018if(get(handles.Slider1,'Value') > col)%move also the first slider at the same value if needed
4019    set(handles.Slider1,'Value',col)
4020    set(handles.num_ColCode1,'String',num2str(col))
4021end
4022set_vec_col_bar(handles)
4023update_plot(handles);
4024
4025%----------------------------------------------------------------
4026% --- Execute on return carriage on the edit box corresponding to slider 1
4027%----------------------------------------------------------------
4028function num_ColCode1_Callback(hObject, eventdata, handles)
4029set_vec_col_bar(handles)
4030update_plot(handles);
4031
4032%----------------------------------------------------------------
4033% --- Execute on return carriage on the edit box corresponding to slider 2
4034%----------------------------------------------------------------
4035function num_ColCode2_Callback(hObject, eventdata, handles)
4036set_vec_col_bar(handles)
4037update_plot(handles);
4038%------------------------------------------------------------------------
4039%-------------------------------------------------------
4040% --- Executes on button press in CheckFixVecColor.
4041%-------------------------------------------------------
4042function VecColBar_Callback(hObject, eventdata, handles)
4043set_vec_col_bar(handles)
4044
4045%------------------------------------------------------------------------
4046% --- Executes on button press in CheckFixVecColor.
4047function CheckFixVecColor_Callback(hObject, eventdata, handles)
4048%------------------------------------------------------------------------
4049if ~get(handles.CheckFixVecColor,'Value')
4050    update_plot(handles);
4051end
4052
4053%------------------------------------------------------------------------
4054% --- Executes on selection change in num_MaxVec.
4055function num_MinVec_Callback(hObject, eventdata, handles)
4056%------------------------------------------------------------------------
4057max_vec_Callback(hObject, eventdata, handles)
4058
4059%------------------------------------------------------------------------
4060% --- Executes on selection change in num_MaxVec.
4061function num_MaxVec_Callback(hObject, eventdata, handles)
4062%------------------------------------------------------------------------
4063set(handles.CheckFixVecColor,'Value',1)
4064CheckFixVecColor_Callback(hObject, eventdata, handles)
4065min_val=str2num(get(handles.num_MinVec,'String'));
4066max_val=str2num(get(handles.num_MaxVec,'String'));
4067slider1=get(handles.Slider1,'Value');
4068slider2=get(handles.Slider2,'Value');
4069colcode1=min_val+(max_val-min_val)*slider1;
4070colcode2=min_val+(max_val-min_val)*slider2;
4071set(handles.num_ColCode1,'String',num2str(colcode1))
4072set(handles.num_ColCode2,'String',num2str(colcode2))
4073update_plot(handles);
4074
4075%------------------------------------------------------------------------
4076% --- update the display of color code for vectors (on vecColBar)
4077function set_vec_col_bar(handles)
4078%------------------------------------------------------------------------
4079%get the image of the color display button 'VecColBar' in pixels
4080set(handles.VecColBar,'Unit','pixel');
4081pos_vert=get(handles.VecColBar,'Position');
4082set(handles.VecColBar,'Unit','Normalized');
4083width=ceil(pos_vert(3));
4084height=ceil(pos_vert(4));
4085
4086%get slider indications
4087list=get(handles.ColorCode,'String');
4088ichoice=get(handles.ColorCode,'Value');
4089colcode.ColorCode=list{ichoice};
4090colcode.MinVec=str2num(get(handles.num_MinVec,'String'));
4091colcode.MaxVec=str2num(get(handles.num_MaxVec,'String'));
4092test3color=strcmp(colcode.ColorCode,'rgb') || strcmp(colcode.ColorCode,'bgr');
4093if test3color
4094    colcode.ColCode1=str2num(get(handles.num_ColCode1,'String'));
4095    colcode.ColCode2=str2num(get(handles.num_ColCode2,'String'));
4096end
4097vec_C=colcode.MinVec+(colcode.MaxVec-colcode.MinVec)*(0.5:width-0.5)/width;%sample of vec_C values from min to max
4098[colorlist,col_vec]=set_col_vec(colcode,vec_C);
4099oneheight=ones(1,height);
4100A1=colorlist(col_vec,1)*oneheight;
4101A2=colorlist(col_vec,2)*oneheight;
4102A3=colorlist(col_vec,3)*oneheight;
4103A(:,:,1)=A1';
4104A(:,:,2)=A2';
4105A(:,:,3)=A3';
4106set(handles.VecColBar,'Cdata',A)
4107
4108%-------------------------------------------------------------------
4109function update_plot(handles)
4110%-------------------------------------------------------------------
4111UvData=get(handles.uvmat,'UserData');
4112AxeData=UvData.PlotAxes;% retrieve the current plotted data
4113PlotParam=read_GUI(handles.uvmat);
4114[tild,PlotParamOut]= plot_field(AxeData,handles.PlotAxes,PlotParam);
4115errormsg=fill_GUI(PlotParamOut,handles.uvmat);
4116%write_plot_param(handles,PlotParamOut); %update the auto plot parameters
4117
4118%------------------------------------------------------------------------
4119%------------------------------------------------------------------------
4120%   SELECTION AND EDITION OF PROJECTION OBJECTS
4121%------------------------------------------------------------------------
4122%------------------------------------------------------------------------
4123
4124% --- Executes on selection change in ListObject_1.
4125function ListObject_1_Callback(hObject, eventdata, handles)
4126list_str=get(handles.ListObject,'String');
4127UvData=get(handles.uvmat,'UserData');
4128ObjectData=UvData.ProjObject{get(handles.ListObject_1,'Value')};
4129
4130%% update the projection plot on uvmat
4131ProjData= proj_field(UvData.Field,ObjectData);%project the current input field on object ObjectData
4132plot_field(ProjData,handles.PlotAxes,read_GUI(handles.uvmat));% plot the projected field;
4133%replot all the objects within the new projected field
4134for IndexObj=1:numel(list_str)
4135        hobject=UvData.ProjObject{IndexObj}.DisplayHandle.uvmat;
4136        if isempty(hobject) || ~ishandle(hobject)
4137            hobject=handles.PlotAxes;
4138        end
4139        if isequal(IndexObj,get(handles.ListObject,'Value'))
4140            objectcolor='m'; %paint in magenta the currently selected object in ListObject
4141        else
4142            objectcolor='b';
4143        end
4144        UvData.ProjObject{IndexObj}.DisplayHandle.uvmat=plot_object(UvData.ProjObject{IndexObj},ObjectData,hobject,objectcolor);%draw the object in uvmat     
4145end
4146set(handles.uvmat,'UserData',UvData)
4147
4148%% display the object parameters if the GUI set_object is already opened
4149if ~get(handles.ViewObject,'Value')
4150    ZBounds=0; % default
4151    if isfield(UvData.Field,'ZMin') && isfield(UvData.Field,'ZMax')
4152        ZBounds(1)=UvData.Field.ZMin; %minimum for the Z slider
4153        ZBounds(2)=UvData.Field.ZMax;%maximum for the Z slider
4154    end
4155    ObjectData.Name=list_str{get(handles.ListObject_1,'Value')};
4156    set_object(ObjectData,[],ZBounds);
4157    set(handles.ViewObject,'Value',1)% show that the selected object in ListObject_1 is currently visualised
4158end
4159
4160%  desactivate the edit object mode
4161set(handles.edit_object,'Value',0)
4162% set(handles.edit_object,'BackgroundColor',[0.7,0.7,0.7])
4163
4164%------------------------------------------------------------------------
4165% --- Executes on selection change in ListObject.
4166function ListObject_Callback(hObject, eventdata, handles)
4167%------------------------------------------------------------------------
4168list_str=get(handles.ListObject,'String');
4169IndexObj=get(handles.ListObject,'Value');%present object selection
4170
4171%% The object  is displayed in set_object if this GUI is already opened
4172UvData=get(handles.uvmat,'UserData');
4173ObjectData=UvData.ProjObject{IndexObj};
4174hset_object=findobj(allchild(0),'tag','set_object');
4175if ~isempty(hset_object)
4176    ZBounds=0; % default
4177    if isfield(UvData.Field,'ZMin') && isfield(UvData.Field,'ZMax')
4178        ZBounds(1)=UvData.Field.ZMin; %minimum for the Z slider
4179        ZBounds(2)=UvData.Field.ZMax;%maximum for the Z slider
4180    end
4181    ObjectData.Name=list_str{IndexObj};
4182    set_object(ObjectData,[],ZBounds);
4183    set(handles.ViewField,'Value',1)% show that the selected object in ListObject is currently visualised
4184end
4185
4186%%  desactivate the edit object mode
4187set(handles.edit_object,'Value',0)
4188% set(handles.edit_object,'BackgroundColor',[0.7,0.7,0.7])
4189
4190%% update the  plot on view_field if view_field is already openened
4191hview_field=findobj(allchild(0),'tag','view_field');
4192if isempty(hview_field)
4193    hhview_field.PlotAxes=[];
4194else
4195    Data=get(hview_field,'UserData');
4196    hhview_field=guidata(hview_field);
4197    ProjData= proj_field(UvData.Field,ObjectData);%project the current interface field on ObjectData
4198    [PlotType,PlotParam]=plot_field(ProjData,hhview_field.PlotAxes,read_GUI(hview_field));%read plotting parameters on the uvmat interface
4199   
4200    %write_plot_param(hhview_field,PlotParam); %update the display of plotting parameters for the current object
4201    haxes=findobj(hview_field,'tag','axes3');
4202    pos=get(hview_field,'Position'); 
4203    if strcmp(get(haxes,'Visible'),'off')%sempty(PlotParam.Coordinates)% case of no plot display (pure text table)
4204        h_TableDisplay=findobj(hview_field,'tag','TableDisplay');
4205        pos_table=get(h_TableDisplay,'Position');
4206        set(hview_field,'Position',[pos(1)+pos(3)-pos_table(3) pos(2)+pos(4)-pos_table(4) pos_table(3) pos_table(4)])
4207        drawnow% needed to change position before the next command
4208        set(hview_field,'UserData',Data);% restore the previously stored GUI position after GUI resizing
4209    else
4210        set(hview_field,'Position',Data.GUISize)% return to the previously stored GUI position and size
4211    end
4212end
4213
4214%% update the color of the graphic object representation: the selected object in magenta, others in blue
4215update_object_color(handles.PlotAxes,hhview_field.PlotAxes,UvData.ProjObject{IndexObj}.DisplayHandle.uvmat)
4216
4217%------------------------------------------------------------------------
4218%--- update the color representation of objects (indicating the selected ones)
4219function update_object_color(axes_uvmat,axes_view_field,DisplayHandle)
4220%------------------------------------------------------------------------
4221if isempty(axes_view_field)% case with no view_field plot
4222hother=[findobj(axes_uvmat,'Tag','proj_object');findobj(axes_uvmat,'Tag','DeformPoint')];%find all the proj object and deform point representations
4223else
4224hother=[findobj(axes_uvmat,'Tag','proj_object') ;findobj(axes_view_field,'Tag','proj_object');... %find all the proj object representations
4225findobj(axes_uvmat,'Tag','DeformPoint'); findobj(axes_view_field,'Tag','DeformPoint')];%find all the deform point representations
4226end
4227for iobj=1:length(hother)
4228    if isequal(get(hother(iobj),'Type'),'rectangle')||isequal(get(hother(iobj),'Type'),'patch')
4229        set(hother(iobj),'EdgeColor','b')
4230        if isequal(get(hother(iobj),'FaceColor'),'m')
4231            set(hother(iobj),'FaceColor','b')
4232        end
4233    elseif isequal(get(hother(iobj),'Type'),'image')
4234        Acolor=get(hother(iobj),'CData');
4235        Acolor(:,:,1)=zeros(size(Acolor,1),size(Acolor,2));
4236        set(hother(iobj),'CData',Acolor);
4237    else
4238        set(hother(iobj),'Color','b')
4239    end
4240    set(hother(iobj),'Selected','off')
4241end
4242if ishandle(DisplayHandle)
4243    linetype=get(DisplayHandle,'Type');
4244    if isequal(linetype,'line')
4245        set(DisplayHandle,'Color','m'); %set the selected object to magenta color
4246    elseif isequal(linetype,'rectangle')
4247        set(DisplayHandle,'EdgeColor','m'); %set the selected object to magenta color
4248    elseif isequal(linetype,'patch')
4249        set(DisplayHandle,'FaceColor','m'); %set the selected object to magenta color
4250    end
4251    SubObjectData=get(DisplayHandle,'UserData');
4252    if isfield(SubObjectData,'SubObject') & ishandle(SubObjectData.SubObject)
4253        for iobj=1:length(SubObjectData.SubObject)
4254            hsub=SubObjectData.SubObject(iobj);
4255            if isequal(get(hsub,'Type'),'rectangle')
4256                set(hsub,'EdgeColor','m'); %set the selected object to magenta color
4257            elseif isequal(get(hsub,'Type'),'image')
4258                Acolor=get(hsub,'CData');
4259                Acolor(:,:,1)=Acolor(:,:,3);
4260                set(hsub,'CData',Acolor);
4261            else
4262                set(hsub,'Color','m')
4263            end
4264        end
4265    end
4266    if isfield(SubObjectData,'DeformPoint') & ishandle(SubObjectData.DeformPoint)
4267        set(SubObjectData.DeformPoint,'Color','m')
4268    end
4269end
4270
4271%-------------------------------------------------------------------
4272% --- Executes on selection change in edit_object.
4273function edit_object_Callback(hObject, eventdata, handles)
4274%-------------------------------------------------------------------
4275hset_object=findobj(allchild(0),'Tag','set_object');
4276if get(handles.edit_object,'Value')
4277%     set(handles.edit_object,'BackgroundColor',[1,1,0]) 
4278    %suppress the other options
4279    set(handles.CheckZoom,'Value',0)
4280    CheckZoom_Callback(hObject, eventdata, handles)
4281    hgeometry_calib=findobj(allchild(0),'tag','geometry_calib');
4282    if ishandle(hgeometry_calib)
4283        hhgeometry_calib=guidata(hgeometry_calib);
4284        set(hhgeometry_calib.edit_append,'Value',0)% desactivate mouse action in geometry_calib
4285        set(hhgeometry_calib.edit_append,'BackgroundColor',[0.7 0.7 0.7])
4286    end
4287    set(handles.ViewObject,'value',1)
4288    ViewObject_Callback(hObject, eventdata, handles)
4289else % desctivate object edit mode
4290%     set(handles.edit_object,'BackgroundColor',[0.7,0.7,0.7]) 
4291    if ~isempty(hset_object)% open the
4292        hhset_object=guidata(hset_object);
4293        set(hhset_object.PLOT,'enable','off');
4294        set(get(hset_object,'children'),'enable','inactive')
4295    end
4296end
4297
4298
4299%------------------------------------------------------------------------
4300% --- Executes on button press in ViewObject.
4301function ViewObject_Callback(hObject, eventdata, handles)
4302%------------------------------------------------------------------------
4303check_view=get(handles.ViewObject,'Value');
4304
4305if check_view %activate set_object   
4306    IndexObj=get(handles.ListObject,'Value');
4307    list_object=get(handles.ListObject,'String');
4308    UvData=get(handles.uvmat,'UserData');%read UvData properties stored on the uvmat interface
4309    UvData.ProjObject{IndexObj}.Name=list_object{IndexObj};
4310    if numel(UvData.ProjObject)<IndexObj;% error in UvData
4311        msgbox_uvmat('ERROR','invalid object list')
4312        return
4313    end
4314    ZBounds=0; % default
4315    if isfield(UvData.Field,'ZMin') && isfield(UvData.Field,'ZMax')
4316        ZBounds(1)=UvData.Field.ZMin; %minimum for the Z slider
4317        ZBounds(2)=UvData.Field.ZMax;%maximum for the Z slider
4318    end
4319%     set(handles.ListObject_1,'Value',IndexObj);%restore ListObject selection after set_object deletion
4320    data=UvData.ProjObject{IndexObj};
4321    if ~isfield(data,'Type')% default plane
4322        data.Type='plane';
4323    end
4324%     if isfield(UvData,'Field')
4325%         Field=UvData.Field;
4326%         if isfield(UvData.Field,'Mesh')&&~isempty(UvData.Field.Mesh)
4327%             data.RangeX=[UvData.Field.XMin UvData.Field.XMax];
4328%             if strcmp(data.Type,'line')||strcmp(data.Type,'polyline')
4329%                 data.RangeY=UvData.Field.Mesh;
4330%             else
4331%                 data.RangeY=[UvData.Field.YMin UvData.Field.YMax];
4332%             end
4333%             data.DX=UvData.Field.Mesh;
4334%             data.DY=UvData.Field.Mesh;
4335%         end
4336%         if isfield(Field,'NbDim')&& isequal(Field.NbDim,3)
4337%             data.Coord=[0 0 0]; %default
4338%         end
4339%         if isfield(Field,'CoordUnit')
4340%             data.CoordUnit=Field.CoordUnit;
4341%         end
4342%     end
4343    hset_object=set_object(data,[],ZBounds);
4344    hhset_object=guidata(hset_object);
4345    if get(handles.edit_object,'Value')% edit mode
4346        set(hhset_object.PLOT,'Enable','on')
4347        set(get(hset_object,'children'),'enable','on')
4348    else
4349        set(hhset_object.PLOT,'Enable','off')
4350        set(get(hset_object,'children'),'enable','inactive')% deactivate the GUI except SAVE
4351        set(hhset_object.SAVE,'Enable','on')
4352    end
4353else
4354    hset_object=findobj(allchild(0),'tag','set_object');
4355    if ~isempty(hset_object)
4356        delete(hset_object)% delete existing version of set_object
4357    end
4358end
4359 
4360
4361%------------------------------------------------------------------------
4362% --- Executes on button press in ViewField.
4363function ViewField_Callback(hObject, eventdata, handles)
4364%------------------------------------------------------------------------
4365check_view=get(handles.ViewField,'Value');
4366
4367if check_view
4368    IndexObj=get(handles.ListObject,'Value');
4369    UvData=get(handles.uvmat,'UserData');%read UvData properties stored on the uvmat interface
4370    if numel(UvData.ProjObject)<IndexObj(end);% error in UvData
4371        msgbox_uvmat('ERROR','invalid object list')
4372        return
4373    end
4374    ZBounds=0; % default
4375    if isfield(UvData.Field,'ZMin') && isfield(UvData.Field,'ZMax')
4376        ZBounds(1)=UvData.Field.ZMin; %minimum for the Z slider
4377        ZBounds(2)=UvData.Field.ZMax;%maximum for the Z slider
4378    end
4379    set(handles.ListObject,'Value',IndexObj);%restore ListObject selection after set_object deletion
4380    if ~isfield(UvData.ProjObject{IndexObj(1)},'Type')% default plane
4381        UvData.ProjObject{IndexObj(1)}.Type='plane';
4382    end
4383    list_object=get(handles.ListObject,'String');
4384    UvData.ProjObject{IndexObj(end)}.Name=list_object{IndexObj(end)};
4385   
4386    %% show the projection of the selected object on view_field
4387    ProjData= proj_field(UvData.Field,UvData.ProjObject{IndexObj});%project the current field on ObjectData
4388    hview_field=findobj(allchild(0),'tag','view_field');
4389    if isempty(hview_field)
4390        hview_field=view_field;
4391    end
4392    hhview_field=guidata(hview_field);
4393    [PlotType,PlotParam]=plot_field(ProjData,hhview_field.PlotAxes,read_GUI(hview_field));%read plotting parameters on the GUI view_field);
4394    errormsg=fill_GUI(PlotParam,hview_field);
4395    for list={'Scalar','Vectors'}
4396        if ~isfield(PlotParam,list{1})
4397            set(hhview_field.(list{1}),'Visible','off')
4398        end
4399    end
4400    %write_plot_param(hhview_field,PlotParam); %update the display of plotting parameters for the current object
4401    haxes=findobj(hview_field,'tag','axes3');
4402    pos=get(hview_field,'Position');
4403    if strcmp(get(haxes,'Visible'),'off')%sempty(PlotParam.Coordinates)% case of no plot display (pure text table)
4404        h_TableDisplay=findobj(hview_field,'tag','TableDisplay');
4405        pos_table=get(h_TableDisplay,'Position');
4406        set(hview_field,'Position',[pos(1)+pos(3)-pos_table(3) pos(2)+pos(4)-pos_table(4) pos_table(3) pos_table(4)])
4407    else
4408        Data=get(hview_field,'UserData');
4409        set(hview_field,'Position',Data.GUISize)% restore the size of view_field for plots
4410    end
4411else
4412    hview_field=findobj(allchild(0),'tag','view_field');
4413    if ~isempty(hview_field)
4414        delete(hview_field)% delete existing version of set_object
4415    end
4416end
4417
4418
4419%------------------------------------------------------------------------
4420% --- Executes on button press in delete_object.
4421%------------------------------------------------------------------------
4422function delete_object_Callback(hObject, eventdata, handles)
4423
4424IndexObj=get(handles.ListObject,'Value');%projection object selected for view_field
4425IndexObj_1=get(handles.ListObject_1,'Value');%projection object selected for uvmat plot
4426if IndexObj>1 && ~isequal(IndexObj,IndexObj_1) % do not delete the object used for the uvmat plot
4427    delete_object(IndexObj)
4428end
4429
4430%'delete_object': delete a projection object, defined by its index in the Uvmat list or by its graphic handle
4431%------------------------------------------------------------------------
4432% function delete_object(hObject)
4433%
4434% INPUT:
4435% hObject: object index (if integer) or handle of the graphic object. If
4436%          hObject is a subobject, the parent object is detected and deleted.
4437
4438function delete_object(IndexObj)
4439
4440huvmat=findobj('tag','uvmat');%handles of the uvmat interface
4441UvData=get(huvmat,'UserData');
4442hlist_object=findobj(huvmat,'Tag','ListObject');%handles of the object list in the uvmat interface
4443list_str=get(hlist_object,'String');%objet list
4444% if isequal(floor(hObject),hObject) %case of an index
4445    if  ~isempty(UvData) && isfield(UvData, 'ProjObject') && length(UvData.ProjObject)>=IndexObj
4446        if isfield(UvData.ProjObject{IndexObj},'DisplayHandle') && isfield(UvData.ProjObject{IndexObj}.DisplayHandle,'uvmat')
4447            hdisplay=UvData.ProjObject{IndexObj}.DisplayHandle.uvmat;
4448            for iview=1:length(hdisplay)
4449                if ishandle(hdisplay(iview)) && ~isequal(hdisplay(iview),0)
4450                    ObjectData=get(hdisplay(iview),'UserData');
4451                    if isfield(ObjectData,'SubObject') & ishandle(ObjectData.SubObject)
4452                        delete(ObjectData.SubObject);
4453                    end
4454                    if isfield(ObjectData,'DeformPoint') & ishandle(ObjectData.DeformPoint)
4455                        delete(ObjectData.DeformPoint);
4456                    end
4457                    delete(hdisplay(iview))
4458                end
4459                ishandle(hdisplay(iview))
4460            end
4461            for iobj=IndexObj+1:length(UvData.ProjObject)
4462                hdisplay=UvData.ProjObject{iobj}.DisplayHandle.uvmat;
4463                for iview=1:length(hdisplay)
4464                    if ishandle(hdisplay(iview)) && ~isequal(hdisplay(iview),0)
4465                        PlotData=get(hdisplay(iview),'UserData');
4466                        PlotData.IndexObj=iobj-1;
4467                        set(hdisplay(iview),'UserData',PlotData);
4468                    end
4469                end
4470            end
4471        end
4472        UvData.ProjObject(IndexObj)=[]; 
4473        if ~isempty(list_str)
4474            list_str(IndexObj)=[];
4475        end
4476    end
4477% elseif ishandle(hObject)%object handle
4478%     userdata=get(hObject,'UserData');
4479%     if ishandle(userdata)%the selected line depends on a parent line
4480%         hdisplay=userdata;% the parent object becomes the current one
4481%     else
4482%         hdisplay=hObject;% the selected object becomes the current one
4483%     end
4484%     PlotData=get(hdisplay,'UserData');
4485%     if isfield(PlotData,'SubObject') & ishandle(PlotData.SubObject)
4486%             delete(PlotData.SubObject);
4487%     end
4488%     if isfield(PlotData,'DeformPoint') & ishandle(PlotData.DeformPoint)
4489%            delete(PlotData.DeformPoint);
4490%     end
4491%     delete(hdisplay);
4492%     if isfield(PlotData,'IndexObj')
4493%         IndexObj=PlotData.IndexObj;
4494%         if  isequal(round(IndexObj),IndexObj) & IndexObj>=1 & length(list_str) > IndexObj
4495%             if isfield(UvData,'ProjObject')& length(UvData.ProjObject) > IndexObj
4496%                UvData.ProjObject(IndexObj)=[];
4497%             end
4498%             list_str(IndexObj)=[];
4499%         end
4500%     end
4501% end
4502set(huvmat,'UserData',UvData);
4503set(hlist_object,'String',list_str)
4504set(hlist_object,'Value',length(list_str))
4505hlist_object_1=findobj(huvmat,'Tag','ListObject_1');%handles of the first object list in the uvmat interface
4506old_index=get(hlist_object_1,'Value');
4507set(hlist_object_1,'String',list_str)
4508if IndexObj<=old_index
4509    set(hlist_object_1,'Value',old_index-1)
4510end
4511
4512%------------------------------------------------------------------------
4513%------------------------------------------------------------------------
4514%  II - TOOLS FROM THE UPPER MENU BAR
4515%------------------------------------------------------------------------
4516%------------------------------------------------------------------------
4517
4518%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4519% Export  Menu Callbacks
4520%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4521%------------------------------------------------------------------------
4522% --- Executes on button press in Menu/Export/field in workspace.
4523function MenuExportField_Callback(hObject, eventdata, handles)
4524%------------------------------------------------------------------------
4525global Data_uvmat
4526Data_uvmat=get(handles.uvmat,'UserData');
4527evalin('base','global Data_uvmat')%make CurData global in the workspace
4528display('current field :')
4529evalin('base','Data_uvmat') %display CurData in the workspace
4530commandwindow; %brings the Matlab command window to the front
4531
4532%------------------------------------------------------------------------
4533% --- Executes on button press in Menu/Export/extract figure.
4534function MenuExportFigure_Callback(hObject, eventdata, handles)
4535%------------------------------------------------------------------------
4536% huvmat=get(handles.MenuExport,'parent');
4537hfig=figure;
4538copyobj(handles.PlotAxes,hfig);
4539map=colormap(handles.PlotAxes);
4540colormap(map);%transmit the current colormap to the zoom fig
4541colorbar
4542
4543% --------------------------------------------------------------------
4544function MenuExportAxis_Callback(hObject, eventdata, handles)
4545ListFig=findobj(allchild(0),'Type','figure');
4546nb_option=0;
4547menu={};
4548for ilist=1:numel(ListFig)
4549    FigName=get(ListFig(ilist),'name');
4550    if isempty(FigName)
4551        FigName=['figure ' num2str(ListFig(ilist))];
4552    end
4553    if ~strcmp(FigName,'uvmat')
4554        ListAxes=findobj(ListFig(ilist),'Type','axes');
4555        ListTags=get(ListAxes,'Tag');
4556        if ~isempty(ListTags) && ~isempty(find(~strcmp('Colorbar',ListTags), 1))
4557            ListAxes=ListAxes(~strcmp('Colorbar',ListTags));
4558            if numel(ListAxes)==1
4559                nb_option=nb_option+1;
4560                menu{nb_option}=FigName ;
4561                AxesHandle(nb_option)=ListAxes;
4562            else
4563                nb_axis=0;
4564                for iaxes=1:numel(ListAxes)
4565                    nb_axis=nb_axis+1;
4566                    nb_option=nb_option+1;
4567                    menu{nb_option}=[FigName '_' num2str(nb_axis)];
4568                    AxesHandle(nb_option)=ListAxes(nb_axis);
4569                end
4570            end
4571        end
4572    end
4573end
4574if isempty(menu)
4575    answer=msgbox_uvmat('INPUT_Y-N','no existing plotting axes available, create new figure?');
4576    if strcmp(answer,'Yes')
4577        hfig=figure;
4578        copyobj(handles.PlotAxes,hfig);
4579    else
4580        return
4581    end
4582    map=colormap(handles.PlotAxes);
4583    colormap(map);%transmit the current colormap to the zoom fig
4584    colorbar
4585else
4586    answer=msgbox_uvmat('INPUT_MENU','select a figure/axis on which the current uvmat plot will be exported',menu);
4587    if isempty(answer)
4588        return
4589    else
4590        axes(AxesHandle(answer))
4591        hold on
4592        hchild=get(handles.PlotAxes,'children');
4593        copyobj(hchild,gca);
4594    end
4595end
4596
4597
4598%------------------------------------------------------------------------
4599% --------------------------------------------------------------------
4600function MenuExportMovie_Callback(hObject, eventdata, handles)
4601% --------------------------------------------------------------------
4602set(handles.MenuExportMovie,'BusyAction','queue')% activate the button
4603huvmat=get(handles.run0,'parent');
4604UvData=get(huvmat,'UserData');
4605%[xx,xx,FileBase]=read_file_boxes(handles);
4606[RootPath,SubDir,RootFile,FileIndex,FileExt]=read_file_boxes(handles);
4607FileBase=fullfile(RootPath,RootFile);
4608 %read the current input file name
4609prompt = {'movie file name';'frames per second';'frame resolution (*[512x384] pixels)';'axis position relative to the frame';'total frame number (starting from the current uvmat display)'};
4610dlg_title = 'select properties of the output avi movie';
4611num_lines= 1;
4612def     = {[FileBase '_out.avi'];'10';'1';'[0.03 0.05 0.95 0.92]';'10'};
4613answer = inputdlg(prompt,dlg_title,num_lines,def,'on');
4614aviname=answer{1};
4615fps=str2double(answer{2});
4616% check for existing file with output name aviname
4617if exist(aviname,'file')
4618    backup=aviname;
4619    testexist=2;
4620    while testexist==2
4621        backup=[backup '~'];
4622        testexist=exist(backup,'file');     
4623    end
4624    [success,message]=copyfile(aviname,backup);%make backup of the existing file
4625    if isequal(success,1)
4626        delete(aviname)%delete existing file
4627    else
4628        msgbox_uvmat('ERROR',message)
4629        return
4630    end
4631end
4632%create avi open
4633aviobj=avifile(aviname,'Compression','None','fps',fps);
4634
4635%display first view for tests
4636newfig=figure;
4637newaxes=copyobj(handles.PlotAxes,newfig);%new plotting axes in the new figure
4638set(newaxes,'Tag','movieaxes')
4639nbpix=[512 384]*str2double(answer{3});
4640set(gcf,'Position',[1 1 nbpix])% resolution XVGA
4641set(newaxes,'Position',eval(answer{4}));
4642map=colormap(handles.PlotAxes);
4643colormap(map);%transmit the current colormap to the zoom fig
4644msgbox_uvmat('INPUT_Y-N',{['adjust figure ' num2str(newfig) ' with its matlab edit menu '] ;...
4645        ['then press OK to get the avi movie as a copy of figure ' num2str(newfig) ' display']});
4646UvData.plotaxes=newaxes;% the axis in the new figure becomes the current main plotting axes
4647set(huvmat,'UserData',UvData);
4648increment=str2num(get(handles.num_IndexIncrement,'String')); %get the field increment d
4649set(handles.STOP,'Visible','on')
4650set(handles.speed,'Visible','on')
4651set(handles.speed_txt,'Visible','on')
4652set(handles.Movie,'BusyAction','queue')
4653
4654%imin=str2double(get(handles.i1,'String'));
4655imax=str2double(answer{5});
4656% if isfield(UvData,'Time')
4657htitle=get(newaxes,'Title');
4658xlim=get(newaxes,'XLim');
4659ylim=get(newaxes,'YLim');
4660set(htitle,'Position',[xlim(2)+0.07*(xlim(2)-xlim(1)) ylim(2)-0.05*(ylim(2)-ylim(1)) 0])
4661time_str=get(handles.abs_time,'String');
4662set(htitle,'String',['t=' time_str])
4663set(handles.speed,'Value',1)
4664for i=1:imax
4665    if get(handles.speed,'Value')~=0 && isequal(get(handles.MenuExportMovie,'BusyAction'),'queue') % enable STOP command
4666            runpm(hObject,eventdata,handles,increment)% run plus
4667            drawnow
4668            time_str=get(handles.abs_time,'String');
4669            if ishandle(htitle)
4670             set(htitle,'String',['t=' time_str])
4671            end
4672            mov=getframe(newfig);
4673            aviobj=addframe(aviobj,mov);
4674    end
4675end
4676aviobj=close(aviobj);
4677UvData=rmfield(UvData,'plotaxes');
4678set(huvmat,'UserData',UvData);
4679msgbox_uvmat('CONFIRMATION',{['movie ' aviname ' created '];['with ' num2str(imax) ' frames']})
4680
4681
4682%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4683% Projection Objects Menu Callbacks
4684%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4685
4686% -----------------------------------------------------------------------
4687function Menupoints_Callback(hObject, eventdata, handles)
4688%------------------------------------------------------------------------
4689data.Type='points';
4690data.ProjMode='projection';%default
4691data.ProjModeMenu={};% do not restrict ProjMode menus
4692create_object(data,handles)
4693
4694% -----------------------------------------------------------------------
4695function Menuline_Callback(hObject, eventdata, handles)
4696%------------------------------------------------------------------------
4697data.Type='line';
4698data.ProjMode='projection';%default
4699data.ProjModeMenu={};% do not restrict ProjMode menus
4700create_object(data,handles)
4701
4702%------------------------------------------------------------------------
4703function Menupolyline_Callback(hObject, eventdata, handles)
4704%------------------------------------------------------------------------
4705data.Type='polyline';
4706data.ProjMode='projection';%default
4707data.ProjModeMenu={};% do not restrict ProjMode menus
4708create_object(data,handles)
4709
4710%------------------------------------------------------------------------
4711function Menupolygon_Callback(hObject, eventdata, handles)
4712%------------------------------------------------------------------------
4713data.Type='polygon';
4714data.ProjMode='inside';%default
4715data.ProjModeMenu={};% do not restrict ProjMode menus
4716create_object(data,handles)
4717
4718%------------------------------------------------------------------------
4719function Menurectangle_Callback(hObject, eventdata, handles)
4720%------------------------------------------------------------------------
4721data.Type='rectangle';
4722data.ProjMode='inside';%default
4723data.ProjModeMenu={};% do not restrict ProjMode menus
4724create_object(data,handles)
4725
4726%------------------------------------------------------------------------
4727function Menuellipse_Callback(hObject, eventdata, handles)
4728%------------------------------------------------------------------------
4729data.Type='ellipse';
4730data.ProjMode='inside';%default
4731data.ProjModeMenu={};% do not restrict ProjMode menus
4732create_object(data,handles)
4733
4734%------------------------------------------------------------------------
4735function MenuMaskObject_Callback(hObject, eventdata, handles)
4736%------------------------------------------------------------------------
4737data.Type='polygon';
4738data.TypeMenu={'polygon'};
4739data.ProjMode='mask_inside';%default
4740data.ProjModeMenu={'mask_inside';'mask_outside'};
4741create_object(data,handles)
4742
4743%------------------------------------------------------------------------
4744function Menuplane_Callback(hObject, eventdata, handles)
4745%------------------------------------------------------------------------
4746data.Type='plane';
4747data.ProjMode='projection';%default
4748data.ProjModeMenu={};% do not restrict ProjMode menus
4749create_object(data,handles)
4750
4751%------------------------------------------------------------------------
4752function Menuvolume_Callback(hObject, eventdata, handles)
4753%------------------------------------------------------------------------
4754data.Type='volume';
4755data.ProjMode='interp_lin';%default
4756data.ProjModeMenu={};
4757% set(handles.create,'Visible','on')
4758% set(handles.create,'Value',1)
4759% VOLUME_Callback(hObject,eventdata,handles)data.ProjModeMenu={};
4760create_object(data,handles)
4761
4762%------------------------------------------------------------------------
4763% --- generic function used for the creation of a projection object
4764function create_object(data,handles)
4765%------------------------------------------------------------------------
4766%% desactivate concurrent tools
4767hgeometry_calib=findobj(allchild(0),'tag','geometry_calib');% search the GUI geometric calibration
4768if ishandle(hgeometry_calib)
4769    hhgeometry_calib=guidata(hgeometry_calib);
4770    set(hhgeometry_calib.edit_append,'Value',0)% desactivate mouse action in geometry_calib
4771end
4772set(handles.edit_object,'Value',0)  %desactivate the object edit mode
4773set(handles.CheckZoomFig,'Value',0) %desactivate zoom sub fig
4774set(handles.CheckZoom,'Value',0)    %desactivate the zoom action
4775if ishandle(handles.UVMAT_title)
4776    delete(handles.UVMAT_title)     %delete the initial display of uvmat if no field has been entered yet
4777end
4778
4779%% append a new line to the list of projection objects
4780ListObject=get(handles.ListObject,'String');
4781if isempty(ListObject)
4782    ListObject={''};
4783end
4784if ~strcmp(ListObject{end},'')
4785    ListObject=[ListObject;{''}]; %append a blank to the list (if nort already done) to indicate the creation of a new object
4786    set(handles.ListObject,'String',ListObject)
4787end
4788IndexObj=length(ListObject);
4789set(handles.ListObject,'Value',IndexObj)
4790UvData=get(handles.uvmat,'UserData');
4791UvData.ProjObject{IndexObj}=[]; %create a new empty object
4792UvData.ProjObject{IndexObj}.DisplayHandle.uvmat=handles.PlotAxes; % axes for plot_object
4793UvData.ProjObject{IndexObj}.DisplayHandle.view_field=[]; %no plot handle before plot_field operation
4794set(handles.uvmat,'UserData',UvData)
4795
4796%% initiate the new projection object
4797data.Name=data.Type;% default name=type
4798data.Coord=[0 0]; %default
4799if isfield(UvData,'Field')
4800    Field=UvData.Field;
4801    if isfield(UvData.Field,'CoordMesh')&&~isempty(UvData.Field.CoordMesh)
4802        data.RangeX=[UvData.Field.XMin UvData.Field.XMax];
4803        if strcmp(data.Type,'line')||strcmp(data.Type,'polyline')||strcmp(data.Type,'points')
4804            data.RangeY=UvData.Field.CoordMesh;
4805        else
4806            data.RangeY=[UvData.Field.YMin UvData.Field.YMax];
4807        end
4808        data.DX=UvData.Field.CoordMesh;
4809        data.DY=UvData.Field.CoordMesh;
4810        if strcmp(data.Type,'rectangle')||strcmp(data.Type,'ellipse')
4811            data.RangeX=UvData.Field.CoordMesh;
4812            data.RangeY=UvData.Field.CoordMesh;
4813        end
4814    end
4815    if isfield(Field,'NbDim')&& isequal(Field.NbDim,3)
4816         data.Coord=[0 0 0]; %default
4817    end
4818    if isfield(Field,'CoordUnit')
4819        data.CoordUnit=Field.CoordUnit;
4820    end
4821end
4822hset_object=set_object(data,handles);% call the GUI set_object
4823hchild=get(hset_object,'children');
4824set(hchild,'enable','on')
4825
4826
4827set(handles.delete_object,'Visible','on')
4828
4829%------------------------------------------------------------------------
4830function MenuBrowseObject_Callback(hObject, eventdata, handles)
4831%------------------------------------------------------------------------
4832%get the object file
4833[FileName, PathName, filterindex] = uigetfile( ...
4834       {'*.xml;*.mat', ' (*.xml,*.mat)';
4835       '*.xml',  '.xml files '; ...
4836        '*.mat',  '.mat matlab files '}, ...
4837        'Pick an xml Object file',get(handles.RootPath,'String'));
4838fileinput=[PathName FileName];%complete file name
4839sizf=size(fileinput);
4840if (~ischar(fileinput)||~isequal(sizf(1),1)),return;end
4841
4842%read the file
4843[data,heading]=xml2struct(fileinput);
4844if ~strcmp(heading,'ProjObject')
4845    msgbox_uvmat('WARNING','The xml file does not have the heading ProjObject for projection objects')
4846end
4847[tild,data.Name]=fileparts(FileName);% object name set as file name
4848ListObject=get(handles.ListObject,'String');
4849if ~strcmp(ListObject{end},'')
4850    ListObject=[ListObject;{''}]; %append a blank to the list (if not already done) to indicate the creation of a new object
4851    set(handles.ListObject,'String',ListObject)
4852end
4853IndexObj=length(ListObject);
4854
4855UvData=get(handles.uvmat,'UserData');
4856UvData.ProjObject{IndexObj}=[]; %create a new empty object
4857UvData.ProjObject{IndexObj}.DisplayHandle.uvmat=[]; %no plot handle before plot_field operation
4858UvData.ProjObject{IndexObj}.DisplayHandle.view_field=[]; %no plot handle before plot_field operation
4859set(handles.uvmat,'UserData',UvData)
4860set(handles.ListObject,'Value',IndexObj)
4861hset_object=set_object(data);% call the set_object interface
4862set(get(hset_object,'children'),'enable','on')% enable edit action on elements on GUI set_object
4863set(handles.edit_object,'Value',0); %suppress the object edit mode
4864% set(handles.edit_object,'BackgroundColor',[0.7,0.7,0.7]) 
4865set(handles.delete_object,'Visible','on')
4866
4867
4868%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4869% MenuEdit Callbacks
4870%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4871%------------------------------------------------------------------------
4872function MenuEditObject_Callback(hObject, eventdata, handles)
4873%------------------------------------------------------------------------
4874set(handles.edit_object,'Value',1)
4875edit_Callback(hObject, eventdata, handles)
4876
4877%------------------------------------------------------------------------
4878function MenuEditVectors_Callback(hObject, eventdata, handles)
4879%------------------------------------------------------------------------
4880set(handles.edit_vect,'Visible','on')
4881set(handles.edit_vect,'Value',1)
4882edit_vect_Callback(hObject, eventdata, handles)
4883
4884%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4885% MenuTools Callbacks
4886%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4887%------------------------------------------------------------------------
4888function MenuCalib_Callback(hObject, eventdata, handles)
4889%------------------------------------------------------------------------
4890
4891UvData=get(handles.uvmat,'UserData');%read UvData properties stored on the uvmat interface
4892
4893%suppress competing options
4894set(handles.CheckZoom,'Value',0)
4895set(handles.CheckZoom,'BackgroundColor',[0.7 0.7 0.7])
4896set(handles.ListObject,'Value',1)     
4897% initiate display of GUI geometry_calib
4898data=[]; %default
4899if isfield(UvData,'CoordType')
4900    data.CoordType=UvData.CoordType;
4901end
4902[RootPath,SubDir,RootFile,FileIndex,FileExt]=read_file_boxes(handles);
4903FileName=[fullfile(RootPath,SubDir,RootFile) FileIndex FileExt];
4904set(handles.view_xml,'Backgroundcolor',[1 1 0])%indicate the reading of the current xml file by geometry_calib
4905pos_uvmat=get(handles.uvmat,'Position');
4906pos_cal(1)=pos_uvmat(1)+UvData.OpenParam.PosGeometryCalib(1)*pos_uvmat(3);
4907pos_cal(2)=pos_uvmat(2)+UvData.OpenParam.PosGeometryCalib(2)*pos_uvmat(4);
4908pos_cal(3:4)=UvData.OpenParam.PosGeometryCalib(3:4).* pos_uvmat(3:4);
4909geometry_calib(FileName,pos_cal);% call the geometry_calib interface   
4910set(handles.view_xml,'Backgroundcolor',[1 1 1])%indicate the end of reading of the current xml file by geometry_calib
4911set(handles.MenuCalib,'checked','on')% indicate that MenuCalib is activated, test used by mouse action
4912
4913
4914%-----------------------------------------------------------------------
4915function MenuLIFCalib_Callback(hObject, eventdata, handles)
4916%------------------------------------------------------------------------
4917%% read UvData properties stored on the uvmat interface
4918UvData=get(handles.uvmat,'UserData');
4919if isfield(UvData,'XmlData')&& isfield(UvData.XmlData{1},'GeometryCalib')
4920    XmlData=UvData.XmlData{1};
4921else
4922    msgbox_uvmat('ERROR','geometric calibration needed: use Tools/geometric calibration in the menu bar');
4923    return
4924end
4925
4926%% read lines currently drawn
4927ListObj=UvData.ProjObject;
4928select=zeros(1,numel(ListObj));
4929for iobj=1:numel(ListObj);
4930    if isfield(ListObj{iobj},'Type') && strcmp(ListObj{iobj}.Type,'line')
4931        select(iobj)=1;
4932    end
4933end
4934val=find(select);
4935if numel(val)<2
4936    msgbox_uvmat('ERROR','light rays must be defined by at least two lines created by Projection object/line in the menu bar');
4937    return
4938else
4939    set(handles.ListObject,'Value',val);% show the selected lines on the list
4940    ObjectData=UvData.ProjObject(val);
4941    for iobj=1:length(ObjectData)
4942%         if isfield(ObjectData{iobj},'Coord')
4943            xA(iobj)=ObjectData{iobj}.Coord(1,1);
4944            yA(iobj)=ObjectData{iobj}.Coord(1,2);
4945            xB(iobj)=ObjectData{iobj}.Coord(2,1);
4946            yB(iobj)=ObjectData{iobj}.Coord(2,2);
4947%         end
4948    end
4949end
4950
4951%% find the origin as intersection of the two first lines (see http://www.ahristov.com/tutorial/geometry-games/intersection-lines.html )
4952x1=xA(1);x2=xB(1);
4953x3=xA(2);x4=xB(2);
4954y1=yA(1);y2=yB(1);
4955y3=yA(2);y4=yB(2);
4956D = (x1-x2)*(y3-y4) -(y1-y2)*(x3-x4);
4957if D==0
4958    msgbox_uvmat('ERROR','the two lines are parallel');
4959    return
4960end
4961x0=((x3-x4)*(x1*y2-y1*x2)-(x1-x2)*(x3*y4-y3*x4))/D;
4962y0=((y3-y4)*(x1*y2-y1*x2)-(y1-y2)*(x3*y4-y3*x4))/D;
4963XmlData.Illumination.Origin=[x0 y0];
4964XmlData.PolarCentre=[x0 y0];
4965
4966%% display the current image in polar coordinates with origin at the  illumination source
4967currentdir=pwd; 
4968uvmatpath=fileparts(which('uvmat'));
4969cd(fullfile(uvmatpath,'transform_field'));
4970phys_polar=str2func('phys_polar');
4971cd(currentdir)
4972DataOut=phys_polar(UvData.Field,XmlData);
4973view_field(DataOut);
4974
4975%% use the third line for reference luminosity
4976if numel(val)==3
4977    x_ref=linspace(ObjectData{3}.Coord(1,1),ObjectData{3}.Coord(2,1),10);
4978    y_ref=linspace(ObjectData{3}.Coord(1,2),ObjectData{3}.Coord(2,2),10);
4979    x_ref=x_ref-x0;
4980    y_ref=y_ref-y0;
4981    [theta_ref,r_ref] = cart2pol(x_ref,y_ref);%theta_ref  and r_ref are the polar coordinates of the points on the line
4982    theta_ref=theta_ref*180/pi;
4983    figure
4984    plot(theta_ref,r_ref)
4985    azimuth_ima=linspace(DataOut.AY(1),DataOut.AY(2),size(DataOut.A,1));%profile of x index on the transformed image
4986    dist_source = interp1(theta_ref,r_ref,azimuth_ima);
4987    dist_source_pixel=round(size(DataOut.A,2)*(dist_source-DataOut.AX(1))/(DataOut.AX(2)-DataOut.AX(1)));
4988    line_nan= isnan(dist_source_pixel);
4989    dist_source_pixel(line_nan)=1;
4990    width=20; %number of pixels used for reference
4991    DataOut.A=double(DataOut.A);
4992    Anorm=zeros(size(DataOut.A));
4993    Aval=mean(mean(DataOut.A));
4994    for iline=1:size(DataOut.A,1)
4995        lum(iline)=mean(DataOut.A(iline,dist_source_pixel(iline):dist_source_pixel(iline)+width));
4996        Anorm(iline,:)=uint16(Aval*DataOut.A(iline,:)/lum(iline));
4997    end
4998    lum(line_nan)=NaN;
4999    figure
5000    plot(1:size(DataOut.A,1),lum)
5001end
5002ImaName=regexprep([get(handles.RootFile,'String') get(handles.FileIndex,'String')],'//','');
5003NewImageName=fullfile(get(handles.RootPath,'String'),'polar',[ImaName get(handles.FileExt,'String')]);
5004imwrite(Anorm,NewImageName,'BitDepth',16)
5005
5006%% record the origin in the xml file
5007XmlFileName=find_imadoc(get(handles.RootPath,'String'),get(handles.SubDir,'String'),get(handles.RootFile,'String'),get(handles.FileExt,'String'));
5008answer=msgbox_uvmat('INPUT_Y-N','save the illumination origin in the current xml file?');
5009if strcmp(answer,'Yes')
5010    t=xmltree(XmlFileName); %read the file
5011    title=get(t,1,'name');
5012    if ~strcmp(title,'ImaDoc')
5013        msgbox_uvmat('ERROR','wrong xml file');
5014        return
5015    end
5016    % backup the output file if it already exist, and read it
5017    backupfile=XmlFileName;
5018    testexist=2;
5019    while testexist==2
5020        backupfile=[backupfile '~'];
5021        testexist=exist(backupfile,'file');
5022    end
5023    [success,message]=copyfile(XmlFileName,backupfile);%make backup
5024    if success~=1
5025        errormsg=['errror in xml file backup: ' message];
5026        return
5027    end
5028    uid_illumination=find(t,'ImaDoc/Illumination');
5029    if isempty(uid_illumination)  %if GeometryCalib does not already exists, create it
5030        [t,uid_illumination]=add(t,1,'element','Illumination');
5031    end
5032    uid_origin=find(t,'ImaDoc/Illumination/Origin');
5033    if ~isempty(uid_origin)  %if GeometryCalib does not already exists, create it
5034         t=delete(t,uid_origin);
5035    end
5036    % save the illumination origin
5037    t=struct2xml(XmlData.Illumination,t,uid_illumination);
5038    save(t,XmlFileName);
5039end
5040   
5041
5042
5043%------------------------------------------------------------------------
5044function MenuMask_Callback(hObject, eventdata, handles)
5045%------------------------------------------------------------------------
5046UvData=get(handles.uvmat,'UserData');%read UvData properties stored on the uvmat interface
5047ListObj=UvData.ProjObject;
5048select=zeros(1,numel(ListObj));
5049for iobj=1:numel(ListObj);
5050    if strcmp(ListObj{iobj}.ProjMode,'mask_inside')||strcmp(ListObj{iobj}.ProjMode,'mask_outside')
5051        select(iobj)=1;
5052    end
5053end
5054val=find(select);
5055if isempty(val)
5056    msgbox_uvmat('ERROR','polygons must be first created by Projection object/mask polygon in the menu bar');
5057    return
5058else
5059    set(handles.ListObject,'Value',val);
5060    flag=1;
5061    npx=size(UvData.Field.A,2);
5062    npy=size(UvData.Field.A,1);
5063    xi=0.5:npx-0.5;
5064    yi=0.5:npy-0.5;
5065    [Xi,Yi]=meshgrid(xi,yi);
5066        for iobj=1:length(UvData.ProjObject)
5067            ObjectData=UvData.ProjObject{iobj};
5068            if isfield(ObjectData,'ProjMode') &&(isequal(ObjectData.ProjMode,'mask_inside')||isequal(ObjectData.ProjMode,'mask_outside'));
5069                flagobj=1;
5070                testphys=0; %coordinates in pixels by default
5071                if isfield(ObjectData,'CoordUnit') && ~isequal(ObjectData.CoordUnit,'pixel')
5072                    if isfield(UvData,'XmlData')&& isfield(UvData.XmlData{1},'GeometryCalib')
5073                        Calib=UvData.XmlData{1}.GeometryCalib;
5074                        testphys=1;
5075                    end
5076                end
5077                if isfield(ObjectData,'Coord')&& isfield(ObjectData,'Type')
5078                    if isequal(ObjectData.Type,'polygon')
5079                        X=ObjectData.Coord(:,1);
5080                        Y=ObjectData.Coord(:,2);
5081                        if testphys
5082                            pos=[X Y zeros(size(X))];
5083                            if isfield(Calib,'SliceCoord') && length(Calib.SliceCoord)>=3
5084                                if isfield(Calib,'SliceAngle')&&~isequal(Calib.SliceAngle,[0 0 0])
5085                                    om=norm(Calib.SliceAngle);%norm of rotation angle in radians
5086                                    OmAxis=Calib.SliceAngle/om; %unit vector marking the rotation axis
5087                                    cos_om=cos(pi*om/180);
5088                                    sin_om=sin(pi*om/180);
5089                                    pos=cos_om*pos+sin_om*cross(OmAxis,pos)+(1-cos_om)*(OmAxis*pos')*OmAxis;
5090                                end
5091                                pos(:,1)=pos(:,1)+Calib.SliceCoord(1);
5092                                pos(:,2)=pos(:,2)+Calib.SliceCoord(2);
5093                                pos(:,3)=pos(:,3)+Calib.SliceCoord(3);
5094                            end                           
5095                            [X,Y]=px_XYZ(Calib,pos(:,1),pos(:,2),pos(:,3));
5096                        end
5097                        flagobj=~inpolygon(Xi,Yi,X',Y');%=0 inside the polygon, 1 outside
5098                    elseif isequal(ObjectData.Type,'ellipse')
5099                        if testphys
5100                            %[X,Y]=px_XYZ(Calib,X,Y,0);% TODO:create a polygon boundary and transform to phys
5101                        end
5102                        RangeX=max(ObjectData.RangeX);
5103                        RangeY=max(ObjectData.RangeY);
5104                        X2Max=RangeX*RangeX;
5105                        Y2Max=RangeY*RangeY;
5106                        distX=(Xi-ObjectData.Coord(1,1));
5107                        distY=(Yi-ObjectData.Coord(1,2));
5108                        flagobj=(distX.*distX/X2Max+distY.*distY/Y2Max)>1;
5109                    elseif isequal(ObjectData.Type,'rectangle')
5110                        if testphys
5111                            %[X,Y]=px_XYZ(Calib,X,Y,0);% TODO:create a polygon boundary and transform to phys
5112                        end
5113                        distX=abs(Xi-ObjectData.Coord(1,1));
5114                        distY=abs(Yi-ObjectData.Coord(1,2));
5115                        flagobj=distX>max(ObjectData.RangeX) | distY>max(ObjectData.RangeY);
5116                    end
5117                    if isequal(ObjectData.ProjMode,'mask_outside')
5118                        flagobj=~flagobj;
5119                    end
5120                    flag=flag & flagobj;
5121                end
5122            end
5123        end
5124%     end
5125    %mask name
5126    RootPath=get(handles.RootPath,'String');
5127    SubDir=get(handles.SubDir,'String');
5128    RootFile=get(handles.RootFile,'String');
5129    if ~isempty(RootFile)&&(isequal(RootFile(1),'/')|| isequal(RootFile(1),'\'))
5130        RootFile(1)=[];
5131    end
5132    list=get(handles.masklevel,'String');
5133    masknumber=num2str(length(list));
5134    maskindex=get(handles.masklevel,'Value');
5135   % mask_name=fullfile_uvmat(RootPath,'',[RootFile '_' masknumber 'mask'],'.png','_1',maskindex);
5136    mask_name=fullfile_uvmat(RootPath,[SubDir '.mask'],'mask','.png','_1',maskindex);
5137    imflag=uint8(255*(0.392+0.608*flag));% =100 for flag=0 (vectors not computed when 20<imflag<200)
5138    imflag=flipdim(imflag,1);
5139
5140    %display the mask
5141    hfigmask=figure;
5142    set(hfigmask,'Name','mask image')
5143    vec=linspace(0,1,256);%define a linear greyscale colormap
5144    map=[vec' vec' vec'];
5145    colormap(map)
5146    image(imflag);
5147    answer=msgbox_uvmat('INPUT_TXT','mask file name:', mask_name);
5148    if ~strcmp(answer,'Cancel')
5149        mask_dir=fileparts(answer);
5150        if ~exist(mask_dir,'dir')
5151            [xx,msg1]=mkdir(mask_dir);
5152            if ~strcmp(msg1,'')
5153                errormsg=['cannot create ' mask_dir ': ' msg1];%error message for directory creation
5154                return
5155            end
5156        end
5157        imwrite(imflag,answer,'BitDepth',8);
5158    end
5159    set(handles.ListObject,'Value',1)
5160end
5161
5162%------------------------------------------------------------------------
5163%-- open the GUI set_grid.fig to create grid
5164function MenuGrid_Callback(hObject, eventdata, handles)
5165%------------------------------------------------------------------------
5166%suppress the other options if grid is chosen
5167set(handles.edit_vect,'Value',0)
5168edit_vect_Callback(hObject, eventdata, handles)
5169% set(handles.edit_object,'BackgroundColor',[0.7 0.7 0.7])
5170set(handles.ListObject,'Value',1)     
5171
5172%prepare display of the set_grid GUI
5173[RootPath,SubDir,RootFile,FileIndex,FileExt]=read_file_boxes(handles);
5174FileName=[fullfile(RootPath,SubDir,RootFile) FileIndex FileExt];
5175UvData=get(handles.uvmat,'UserData');
5176% CoordList=get(handles.TransformName,'String');
5177% val=get(handles.TransformName,'Value');
5178set_grid(FileName,UvData.Field);% call the set_object interface
5179
5180
5181%------------------------------------------------------------------------
5182function MenuRuler_Callback(hObject, eventdata, handles)
5183%------------------------------------------------------------------------
5184set(handles.CheckZoom,'Value',0)
5185CheckZoom_Callback(handles.uvmat, [], handles)
5186set(handles.MenuRuler,'checked','on')
5187UvData=get(handles.uvmat,'UserData');
5188UvData.MouseAction='ruler';
5189set(handles.uvmat,'UserData',UvData);
5190
5191%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5192% MenuRun Callbacks
5193%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5194
5195%------------------------------------------------------------------------
5196% open the GUI 'series'
5197function MenuSeries_Callback(hObject, eventdata, handles)
5198%------------------------------------------------------------------------
5199[RootPath,SubDir,RootFile,FileIndex,FileExt]=read_file_boxes(handles);
5200Param.FileName=[fullfile(RootPath,SubDir,RootFile) FileIndex FileExt];%first input file name
5201if isequal(get(handles.SubField,'Value'),1)
5202    [RootPath_1,SubDir_1,RootFile_1,FileIndex_1,FileExt_1]=read_file_boxes_1(handles);
5203    FileName_1=[fullfile(RootPath_1,SubDir_1,RootFile_1) FileIndex_1 FileExt_1];
5204    if ~isequal(FileName_1,Param.FileName)
5205        Param.FileName_1=FileName_1;%second input file name if relevant
5206    end
5207end
5208Param.NomType=get(handles.NomType,'String');
5209Param.NomType_1=get(handles.NomType_1,'String');
5210Param.CheckFixPair=get(handles.CheckFixPair,'Value');
5211UvData=get(handles.uvmat,'UserData');
5212if isfield(UvData,'XmlData')&& isfield(UvData.XmlData{1},'Time')
5213    Param.Time=UvData.XmlData{1}.Time;
5214end
5215if isequal(get(handles.scan_i,'Value'),1)
5216    Param.incr_i=str2num(get(handles.num_IndexIncrement,'String'));
5217elseif isequal(get(handles.scan_j,'Value'),1)
5218    Param.incr_j=str2num(get(handles.num_IndexIncrement,'String'));
5219end
5220
5221%% transfer fields and coordinate names
5222Param.list_fields=get(handles.FieldName,'String');% list menu fields
5223FieldName=Param.list_fields{get(handles.FieldName,'Value')};
5224ind_image=find(strcmp('image',Param.list_fields));
5225if ~isempty(ind_image) && numel(Param.list_fields)>1
5226    Param.list_fields(ind_image)=[]; %suppress  'image' option
5227end
5228Param.index_fields=find(strcmp(FieldName,Param.list_fields));% selected string index
5229Param.list_fields_1=get(handles.FieldName_1,'String');% list menu fields
5230if ischar(Param.list_fields_1),Param.list_fields_1={Param.list_fields_1};end
5231FieldName_1=Param.list_fields_1{get(handles.FieldName_1,'Value')};
5232ind_image=find(strcmp('image',Param.list_fields_1));
5233if ~isempty(ind_image) && numel(Param.list_fields_1)>1
5234    Param.list_fields_1(ind_image)=[]; %suppress  'image' option
5235end
5236Param.index_fields_1=find(strcmp(FieldName_1,Param.list_fields_1));% selected string index
5237TransformList=get(handles.TransformName,'String');
5238Param.TransformName=TransformList{get(handles.TransformName,'Value')};
5239Param.Coord_x_str=get(handles.Coord_x,'String');
5240Param.Coord_x_val=get(handles.Coord_x,'Value');
5241Param.Coord_y_str=get(handles.Coord_y,'String');
5242Param.Coord_y_val=get(handles.Coord_y,'Value');
5243series(Param); %run the series interface
5244
5245%------------------------------------------------------------------------
5246% -- open the GUI civ.fig for PIV
5247function MenuPIV_Callback(hObject, eventdata, handles)
5248%------------------------------------------------------------------------
5249 [RootPath,SubDir,RootFile,FileIndex,FileExt]=read_file_boxes(handles);
5250 FileName=[fullfile(RootPath,SubDir,RootFile) FileIndex FileExt];
5251civ(FileName);% interface de civ(not in the uvmat file)
5252
5253% --------------------------------------------------------------------
5254function MenuHelp_Callback(hObject, eventdata, handles)
5255% --------------------------------------------------------------------
5256path_to_uvmat=which ('uvmat');% check the path of uvmat
5257pathelp=fileparts(path_to_uvmat);
5258helpfile=fullfile(pathelp,'uvmat_doc','uvmat_doc.html');
5259if isempty(dir(helpfile)), msgbox_uvmat('ERROR','Please put the help file uvmat_doc.html in the sub-directory /uvmat_doc of the UVMAT package')
5260else
5261    addpath (fullfile(pathelp,'uvmat_doc'))
5262    web(helpfile);
5263end
5264
5265% --- Executes on selection change in Coord_y.
5266function Coord_y_Callback(hObject, eventdata, handles)
5267
5268% --- Executes on selection change in Coord_x.
5269function Coord_x_Callback(hObject, eventdata, handles)
5270
5271
5272% --- Executes on button press in CheckColorBar.
5273function CheckColorBar_Callback(hObject, eventdata, handles)
5274
5275
5276
5277function TransformPath_Callback(hObject, eventdata, handles)
5278% hObject    handle to TransformPath (see GCBO)
5279% eventdata  reserved - to be defined in a future version of MATLAB
5280% handles    structure with handles and user data (see GUIDATA)
5281
5282% Hints: get(hObject,'String') returns contents of TransformPath as text
5283%        str2double(get(hObject,'String')) returns contents of TransformPath as a double
5284
5285
5286%TODO: use to modify fill_GUI
5287%'write_plot_param': update the plotting parameters on the uvmat or view_field interface after a plotting operation
5288function write_plot_param(handles,PlotParam)
5289%% coordinates
5290if isempty(PlotParam.Coordinates)
5291    set(handles.Coordinates,'Visible','off')
5292    set(handles.PlotAxes,'Visible','off')
5293    set(handles.text_display,'Visible','off')
5294    set(handles.TableDisplay,'Visible','on')
5295else
5296    set(handles.Coordinates,'Visible','on')
5297    set(handles.PlotAxes,'Visible','on')
5298    set(handles.text_display,'Visible','on')
5299    if isfield(handles,'TableDisplay')
5300    set(handles.TableDisplay,'Visible','off')
5301    end
5302    Coordinates=PlotParam.Coordinates;
5303    if isfield(Coordinates,'CheckFixAspectRatio')
5304        if Coordinates.CheckFixAspectRatio
5305            set(handles.CheckFixAspectRatio,'Value',1)
5306        else
5307            set(handles.CheckFixAspectRatio,'Value',0)
5308 
5309        end
5310    end
5311    if isfield(Coordinates,'AspectRatio')
5312        set(handles.num_AspectRatio,'String',num2str(Coordinates.AspectRatio))
5313    end
5314    if isfield(Coordinates,'MinX')
5315        set(handles.num_MinX,'String',num2str(Coordinates.MinX,4));
5316        set(handles.num_MaxX,'String',num2str(Coordinates.MaxX,4));
5317        set(handles.num_MinY,'String',num2str(Coordinates.MinY,4));
5318        set(handles.num_MaxY,'String',num2str(Coordinates.MaxY,4));
5319    else
5320        set(handles.num_MinX,'String','');
5321        set(handles.num_MaxX,'String','');
5322        set(handles.num_MinY,'String','');
5323        set(handles.num_MaxY,'String','');
5324    end
5325end
5326
5327%% scalar or image parameters
5328if isfield(PlotParam,'Scalar')
5329    set(handles.Scalar,'Visible','on')
5330    if isfield(PlotParam.Scalar,'MaxA')
5331        set(handles.num_MaxA,'String',num2str(PlotParam.Scalar.MaxA,3));
5332    end
5333    if isfield(PlotParam.Scalar,'MinA')
5334        set(handles.num_MinA,'String',num2str(PlotParam.Scalar.MinA,3));
5335    end   
5336    if isfield(PlotParam.Scalar,'IncrA')
5337        set(handles.num_IncrA,'String',num2str(PlotParam.Scalar.IncrA,3))
5338    end
5339    set(handles.CheckBW,'Value',PlotParam.Scalar.CheckBW)
5340    if isfield(PlotParam.Scalar,'Opacity')&&isfield(handles,'num_Opacity')
5341        set(handles.num_Opacity,'String',num2str(PlotParam.Scalar.Opacity))
5342    end
5343else
5344    set(handles.Scalar,'Visible','off')
5345end
5346
5347%% parameter for vector field
5348if isfield(PlotParam,'Vectors')
5349    set(handles.Vectors,'Visible','on')
5350    if isfield(PlotParam.Vectors,'VecScale')
5351        set(handles.num_VecScale,'String',num2str(PlotParam.Vectors.VecScale,3))
5352    end
5353    if isfield(PlotParam.Vectors,'MinC')&& isfield(PlotParam.Vectors,'MaxC')
5354        MinC=PlotParam.Vectors.MinC;
5355        MaxC=PlotParam.Vectors.MaxC;
5356        set(handles.num_MinVec,'String', num2str(MinC,3));
5357        set(handles.num_MaxVec,'String',num2str(MaxC,3));
5358        list=get(handles.ColorCode,'String');
5359        ichoice=get(handles.ColorCode,'Value');
5360        color_option=list{ichoice};
5361        test3color=strcmp(color_option,'rgb')||strcmp(color_option,'bgr');
5362        if test3color% need to update color thresholds
5363            set(handles.num_ColCode1,'Visible','on')
5364            set(handles.num_ColCode2,'Visible','on')
5365            set(handles.Slider1,'Visible','on')
5366            set(handles.Slider2,'Visible','on')
5367            %ColCode1=MinC+(MaxC-MinC)*PlotParam.Vectors.ColCode1;
5368            %ColCode2=MinC+(MaxC-MinC)*PlotParam.Vectors.ColCode2;
5369%             ColCode1=MinC+(MaxC-MinC)*PlotParam.Vectors.ColCode1;
5370            %ColCode2=MinC+(MaxC-MinC)*PlotParam.Vectors.ColCode2;
5371            set(handles.num_ColCode1,'String',num2str(PlotParam.Vectors.ColCode1,3))
5372            set(handles.num_ColCode2,'String',num2str(PlotParam.Vectors.ColCode2,3))
5373            set(handles.Slider1,'Value',(PlotParam.Vectors.ColCode1-MinC)/(MaxC-MinC))
5374            set(handles.Slider2,'Value',(PlotParam.Vectors.ColCode2-MinC)/(MaxC-MinC))
5375        else
5376            set(handles.num_ColCode1,'Visible','off')
5377            set(handles.num_ColCode2,'Visible','off')
5378            set(handles.Slider1,'Visible','off')
5379            set(handles.Slider2,'Visible','off')
5380        end
5381    end
5382else
5383    set(handles.Vectors,'Visible','off')
5384    if isfield(handles,'edit_vect')
5385        set(handles.edit_vect,'Visible','off')
5386        set(handles.record,'Visible','off')
5387    end
5388end
5389
5390
Note: See TracBrowser for help on using the repository browser.