From 52a6ccbd7de5840fd49eacc45e5648817f8133e4 Mon Sep 17 00:00:00 2001 From: Jacques Grelet <jacques.grelet@ird.fr> Date: Tue, 8 Jan 2008 22:08:31 +0000 Subject: [PATCH] =?UTF-8?q?affichage=20de=20la=20date,=20position=20et=20t?= =?UTF-8?q?emperature=20salinit=C3=A9=20dans=20des=20uicontrol=20s=C3=A9pa?= =?UTF-8?q?r=C3=A9s=20affiche=20le=20nom=20de=20fichier=20=C3=A9galement?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tsgqc_GUI.m | 1941 +++++++++++++++++++++++++++------------------------ 1 file changed, 1042 insertions(+), 899 deletions(-) diff --git a/tsgqc_GUI.m b/tsgqc_GUI.m index eab3437..604b6dc 100644 --- a/tsgqc_GUI.m +++ b/tsgqc_GUI.m @@ -1,5 +1,5 @@ function tsgqc_GUI -% tsgqc_GUI +% tsgqc_GUI % % TSG (Thermosalinograph) Quality Control software % @@ -28,981 +28,1124 @@ function tsgqc_GUI %% Initialization tasks % ******************** - clc - - % Find program directory. - % functions (icons) should be store at a lower level - % add directories to Matlab search path, works on UNIX - % and Windows host - % --------------------------------------------------- - tsgqcname = mfilename; - fulltsgqcname = mfilename('fullpath'); - DEFAULT_PATH_FILE = strrep(fulltsgqcname, tsgqcname, '') ; - p = [pathsep,... - DEFAULT_PATH_FILE,[filesep 'tsg_util' pathsep],... - DEFAULT_PATH_FILE,[filesep 'tsg_data' pathsep],... - DEFAULT_PATH_FILE,[filesep 'tsg_io' pathsep] - ]; - addpath( p, '-END' ); - rehash; +clc + +% Find program directory. +% functions (icons) should be store at a lower level +% add directories to Matlab search path, works on UNIX +% and Windows host +% --------------------------------------------------- +tsgqcname = mfilename; +fulltsgqcname = mfilename('fullpath'); +DEFAULT_PATH_FILE = strrep(fulltsgqcname, tsgqcname, '') ; +p = [pathsep,... + DEFAULT_PATH_FILE,[filesep 'tsg_util' pathsep],... + DEFAULT_PATH_FILE,[filesep 'tsg_data' pathsep],... + DEFAULT_PATH_FILE,[filesep 'tsg_io' pathsep] + ]; +addpath( p, '-END' ); +rehash; + +% Screen limits for the GUI +% ------------------------- +set(0,'Units','normalized'); +guiLimits = get(0,'ScreenSize'); +guiLimits(1) = guiLimits(1) + 0.05; +guiLimits(2) = guiLimits(2) + 0.1; +guiLimits(3) = guiLimits(3) - 0.1; +guiLimits(4) = guiLimits(4) - 0.2; + +%% Create and then hide the GUI as it is being constructed. +% -------------------------------------------------------- +hMainFig = figure(... + 'Name', 'TSG Validation', ... + 'NumberTitle', 'off', ... + 'Resize', 'on', ... + 'Menubar','none', ... + 'Toolbar', 'none', ... + 'UserData', 'ButtonMotionOff', ... + 'WindowButtonMotionFcn', @MouseMotion, ... + 'CloseRequestFcn', @QuitProgram,... + 'HandleVisibility','callback',... + 'Visible','on',... + 'Units', 'normalized',... + 'Position',guiLimits, ... + 'Color', get( 0, 'DefaultUIControlBackgroundColor' )); + +%% Construct the Menu +% ----------------- +hFileMenu = uimenu(... + 'Parent', hMainFig,... + 'HandleVisibility','callback',... + 'Label', 'File'); +hOpenMenu = uimenu(... + 'Parent', hFileMenu,... + 'UserData', 'off', ... + 'Label','Open',... + 'Accelerator','O',... + 'HandleVisibility','callback',... + 'Callback', @OpenMenuCallback); +hSaveMenu = uimenu(... + 'Parent', hFileMenu,... + 'Label','Save',... + 'Accelerator','S',... + 'UserData', 'off', ... + 'HandleVisibility','callback',... + 'Callback',@SaveMenuCallback); +hQuitMenu = uimenu(... + 'Parent',hFileMenu,... + 'Label','Quit',... + 'Separator','on',... + 'Accelerator','Q',... + 'HandleVisibility','callback',... + 'Callback',@QuitMenuCallback); + +%% Construct the Toolbar +% ----------------- +hToolbar = uitoolbar(... % Toolbar for Open and Print buttons + 'Parent',hMainFig, ... + 'HandleVisibility','callback'); +hOpenPushtool = uipushtool(... % Opendoc toolbar button + 'Parent',hToolbar,... + 'TooltipString','Open file',... + 'CData', iconRead(fullfile(matlabroot, ... + '/toolbox/matlab/icons/opendoc.mat')),... + 'HandleVisibility','callback', ... + 'Tag','PUSHTOOL_OPEN',... + 'UserData', 'off',... + 'Enable', 'on',... + 'ClickedCallback', @OpenMenuCallback); +hSavePushtool = uipushtool(... % Open Save toolbar button + 'Parent',hToolbar,... + 'TooltipString','Save NetCDF file',... + 'CData',iconRead( ... + [DEFAULT_PATH_FILE 'tsg_icon' filesep 'savedoc.mat']),... + 'HandleVisibility','callback', ... + 'Tag','PUSHTOOL_SAVE',... + 'Enable', 'off',... + 'ClickedCallback', @SaveMenuCallback); +hZoomPushtool = uipushtool(... % Open Zoom toolbar button + 'Parent',hToolbar,... + 'Separator', 'on', ... + 'TooltipString','Zoom',... + 'CData', iconRead(fullfile(matlabroot, ... + '/toolbox/matlab/icons/zoom.mat')),... + 'HandleVisibility','callback', ... + 'Tag','PUSHTOOL_ZOOM',... + 'Enable', 'off',... + 'ClickedCallback', @ZoomMenuCallback); +hPanPushtool = uipushtool(... % Open Pan toolbar button + 'Parent',hToolbar,... + 'TooltipString','Pan',... + 'CData',iconRead(fullfile(matlabroot, ... + '/toolbox/matlab/icons/pan.mat')),... + 'HandleVisibility','callback', ... + 'Tag','PUSHTOOL_PAN',... + 'Enable', 'off',... + 'ClickedCallback', @PanMenuCallback); +hQCPushtool = uipushtool(... % Open QC toolbar button + 'Parent',hToolbar,... + 'TooltipString','Validation codes',... + 'Separator', 'on', ... + 'CData',iconRead(... + [DEFAULT_PATH_FILE 'tsg_icon' filesep 'qcicon.mat']),... + 'HandleVisibility','callback', ... + 'Tag','QC',... + 'UserData', 'off',... + 'Enable', 'off',... + 'ClickedCallback', @QCMenuCallback); +hMapPushtool = uipushtool(... % Open Map toolbar button + 'Parent',hToolbar,... + 'TooltipString','Map and ship track',... + 'Separator', 'on', ... + 'CData',iconRead(... + [DEFAULT_PATH_FILE 'tsg_icon' filesep 'mapicon.mat']),... + 'HandleVisibility','callback', ... + 'Tag','PUSHTOOL_MAP',... + 'UserData', 'off', ... + 'Enable', 'off',... + 'ClickedCallback', @MapMenuCallback); +hClimPushtool = uipushtool(... % Open Climatology toolbar button + 'Parent',hToolbar,... + 'TooltipString','Climatology',... + 'Separator', 'on', ... + 'CData',iconRead(... + [DEFAULT_PATH_FILE 'tsg_icon' filesep 'climicon.mat']),... + 'HandleVisibility','callback', ... + 'Tag','PUSHTOOL_CLIM',... + 'UserData', 'off',... + 'Enable', 'off',... + 'ClickedCallback', @ClimMenuCallback); +hBottlePushtool = uipushtool(... % Open toolbar button + 'Parent',hToolbar,... + 'TooltipString','Plot the Samples',... + 'Separator', 'on', ... + 'CData',iconRead(... + [DEFAULT_PATH_FILE 'tsg_icon' filesep 'bottleicon.mat']),... + 'HandleVisibility','callback', ... + 'Tag','BOTTLE',... + 'Enable', 'off',... + 'ClickedCallback', @BottleMenuCallback); +hHeaderPushtool = uipushtool(... % Open headerForm button + 'Parent',hToolbar,... + 'TooltipString','Fill the header form',... + 'Separator', 'on', ... + 'CData',iconRead(... + [DEFAULT_PATH_FILE 'tsg_icon' filesep 'hdricon.mat']),... + 'HandleVisibility','callback', ... + 'Tag','PUSHTOOL_HEADER',... + 'Enable', 'off',... + 'ClickedCallback', @HeaderMenuCallback); + +%% Dynamic text area that displays the loaded filename, date, position and +% salinity, temperature +% --------------------------------------------------- + +% Dynamic text area that displays the date +% ---------------------------------------- +uicontrol(... + 'Parent', hMainFig, ... + 'Units', 'normalized', ... + 'Style', 'Text', ... + 'Fontsize', 12, ... + 'Fontweight', 'bold', ... + 'HorizontalAlignment', 'left', ... + 'Position',[.02, .95, .03, .03], ... + 'String', 'File:'); + +hInfoFileText = uicontrol(... + 'Parent', hMainFig, ... + 'Style', 'text', ... + 'Fontsize', 12, ... + 'Visible','on',... + 'Units', 'normalized',... + 'HorizontalAlignment', 'left', ... + 'String', 'No file loaded', ... + 'Position', [.05, .95, .10, .03]); + +% Text area that displays the date +% -------------------------------- +uicontrol(... + 'Parent', hMainFig, ... + 'Units', 'normalized', ... + 'Style', 'Text', ... + 'Fontsize', 12, ... + 'Fontweight', 'bold', ... + 'HorizontalAlignment', 'left', ... + 'Position',[.17, .95, .05, .03], ... + 'String', 'Date:'); + +hInfoDateText = uicontrol(... + 'Parent', hMainFig, ... + 'Style', 'text', ... + 'Fontsize', 12, ... + 'Visible','on',... + 'Units', 'normalized',... + 'HorizontalAlignment', 'left', ... + 'String', 'N/A', ... + 'Position', [.20, .95, .09, .03]); + +% Text area that displays the latitude +% ------------------------------------ +uicontrol(... + 'Parent', hMainFig, ... + 'Units', 'normalized', ... + 'Style', 'Text', ... + 'Fontsize', 12, ... + 'Fontweight', 'bold', ... + 'HorizontalAlignment', 'left', ... + 'Position',[.30, .95, .04, .03], ... + 'String', 'Latitude:'); + +hInfoLatText = uicontrol(... + 'Parent', hMainFig, ... + 'Style', 'text', ... + 'Fontsize', 12, ... + 'Visible','on',... + 'Units', 'normalized',... + 'HorizontalAlignment', 'left', ... + 'String', 'N/A', ... + 'Position', [.35, .95, .09, .03]); + +% Text area that displays the longitude +% ------------------------------------- +uicontrol(... + 'Parent', hMainFig, ... + 'Units', 'normalized', ... + 'Style', 'Text', ... + 'Fontsize', 12, ... + 'Fontweight', 'bold', ... + 'HorizontalAlignment', 'left', ... + 'Position',[.45, .95, .05, .03], ... + 'String', 'Longitude:'); + +hInfoLongText = uicontrol(... + 'Parent', hMainFig, ... + 'Style', 'text', ... + 'Fontsize', 12, ... + 'Visible','on',... + 'Units', 'normalized',... + 'HorizontalAlignment', 'left', ... + 'String', 'N/A', ... + 'Position', [.51, .95, .09, .03]); + +% Text area that display salinity and temperature +% ----------------------------------------------- +uicontrol(... + 'Parent', hMainFig, ... + 'Units', 'normalized', ... + 'Style', 'Text', ... + 'Fontsize', 12, ... + 'Fontweight', 'bold', ... + 'HorizontalAlignment', 'left', ... + 'Position',[.6, .95, .03, .03], ... + 'String', 'SSPS:'); + +hInfoSSPSText = uicontrol(... + 'Parent', hMainFig, ... + 'Style', 'text', ... + 'Fontsize', 12, ... + 'Visible','on',... + 'Units', 'normalized',... + 'HorizontalAlignment', 'left', ... + 'String', 'N/A', ... + 'Position', [.64, .95, .05, .03]); + +uicontrol(... + 'Parent', hMainFig, ... + 'Units', 'normalized', ... + 'Style', 'Text', ... + 'Fontsize', 12, ... + 'Fontweight', 'bold', ... + 'HorizontalAlignment', 'left', ... + 'Position',[.7, .95, .03, .03], ... + 'String', 'SSJT:'); + +hInfoSSJTText = uicontrol(... + 'Parent', hMainFig, ... + 'Style', 'text', ... + 'Fontsize', 12, ... + 'Visible','on',... + 'Units', 'normalized',... + 'HorizontalAlignment', 'left', ... + 'String', 'N/A', ... + 'Position', [.74, .95, .05, .03]); + +uicontrol(... + 'Parent', hMainFig, ... + 'Units', 'normalized', ... + 'Style', 'Text', ... + 'Fontsize', 12, ... + 'Fontweight', 'bold', ... + 'HorizontalAlignment', 'left', ... + 'Position',[.8, .95, .03, .03], ... + 'String', 'SSTP:'); + +hInfoSSTPText = uicontrol(... + 'Parent', hMainFig, ... + 'Style', 'text', ... + 'Fontsize', 12, ... + 'Visible','on',... + 'Units', 'normalized',... + 'HorizontalAlignment', 'left', ... + 'String', 'N/A', ... + 'Position', [.84, .95, .05, .03]); + +%% Construct the plot axes +% ----------------------- +hPlotAxes(1) = axes(... % the axes for plotting Salinity + 'Parent', hMainFig, ... + 'Units', 'normalized', ... + 'Visible', 'off', ... + 'HandleVisibility','callback', ... + 'Position',[.05, .6, .9, .32]); +hPlotAxes(2) = axes(... % the axes for plotting temperature + 'Parent', hMainFig, ... + 'Units', 'normalized', ... + 'Visible', 'off', ... + 'HandleVisibility','callback', ... + 'Position',[.05, .3, .9, .25]); +hPlotAxes(3) = axes(... % the axes for plotting ship velocity + 'Parent', hMainFig, ... + 'Units', 'normalized', ... + 'Visible', 'off', ... + 'HandleVisibility','callback', ... + 'Position',[.05, .05, .9, .2]); + +% The map will be plot in a uipanel +hMapPanel = uipanel( ... + 'Parent', hMainFig, ... + 'Units', 'normalized', ... + 'Visible', 'off', ... + 'Position',[0, 0, 1, .57]); + +hPlotAxes(4) = axes(... % the axes for plotting ship track map + 'Parent', hMapPanel, ... + 'Units', 'normalized', ... + 'Visible', 'off', ... + 'Color', 'none', ... + 'UserData', 'off', ... + 'UserData', [], ... + 'HandleVisibility','callback', ... + 'Position',[.05, .05, .9, .9]); + + +%% Construct the context menu for the Quality control codes +% ------------------------------------------------------- +hQcCmenu = uicontextmenu(... + 'Parent', hMainFig, ... + 'HandleVisibility','callback' ); +hQcCmenuNocontrol = uimenu(... + 'Parent', hQcCmenu,... + 'HandleVisibility','off', ... + 'Label', 'No control',... + 'ForegroundColor', 'k',... + 'Callback', @QcNoControl); +hQcCmenuGood = uimenu(... + 'Parent', hQcCmenu,... + 'HandleVisibility','off', ... + 'Label', 'Good',... + 'ForegroundColor', 'b',... + 'Callback', @QcGood); +hQcCmenuProbGood = uimenu(... + 'Parent', hQcCmenu,... + 'HandleVisibility','off', ... + 'Label', 'Probably Good',... + 'Callback', @QcProbGood,... + 'ForegroundColor', 'g'); +hQcCmenuProbBad = uimenu(... + 'Parent', hQcCmenu,... + 'HandleVisibility','off', ... + 'Label', 'Probably bad',... + 'ForegroundColor', 'm',... + 'Callback', @QcProbBad); +hQcCmenuBad = uimenu(... + 'Parent', hQcCmenu,... + 'HandleVisibility','off', ... + 'Label', 'Bad',... + 'ForegroundColor', 'r',... + 'Callback', @QcBad); + + +% Initialisation +% -------------- +tsg_initialisation(hMainFig, hQcCmenu) + - % Screen limits for the GUI - % ------------------------- - set(0,'Units','normalized'); - guiLimits = get(0,'ScreenSize'); - guiLimits(1) = guiLimits(1) + 0.05; - guiLimits(2) = guiLimits(2) + 0.1; - guiLimits(3) = guiLimits(3) - 0.1; - guiLimits(4) = guiLimits(4) - 0.2; - - % Create and then hide the GUI as it is being constructed. - % -------------------------------------------------------- - hMainFig = figure(... - 'Name', 'TSG Validation', ... - 'NumberTitle', 'off', ... - 'Resize', 'on', ... - 'Menubar','none', ... - 'Toolbar', 'none', ... - 'UserData', 'ButtonMotionOff', ... - 'WindowButtonMotionFcn', @MouseMotion, ... - 'CloseRequestFcn', @QuitProgram,... - 'HandleVisibility','callback',... - 'Visible','on',... - 'Units', 'normalized',... - 'Position',guiLimits, ... - 'Color', get( 0, 'DefaultUIControlBackgroundColor' )); - - % Construct the Menu - % ----------------- - hFileMenu = uimenu(... - 'Parent', hMainFig,... - 'HandleVisibility','callback',... - 'Label', 'File'); - hOpenMenu = uimenu(... - 'Parent', hFileMenu,... - 'UserData', 'off', ... - 'Label','Open',... - 'Accelerator','O',... - 'HandleVisibility','callback',... - 'Callback', @OpenMenuCallback); - hSaveMenu = uimenu(... - 'Parent', hFileMenu,... - 'Label','Save',... - 'Accelerator','S',... - 'UserData', 'off', ... - 'HandleVisibility','callback',... - 'Callback',@SaveMenuCallback); - hQuitMenu = uimenu(... - 'Parent',hFileMenu,... - 'Label','Quit',... - 'Separator','on',... - 'Accelerator','Q',... - 'HandleVisibility','callback',... - 'Callback',@QuitMenuCallback); - - % Construct the Toolbar - % ----------------- - hToolbar = uitoolbar(... % Toolbar for Open and Print buttons - 'Parent',hMainFig, ... - 'HandleVisibility','callback'); - hOpenPushtool = uipushtool(... % Opendoc toolbar button - 'Parent',hToolbar,... - 'TooltipString','Open file',... - 'CData', iconRead(fullfile(matlabroot, ... - '/toolbox/matlab/icons/opendoc.mat')),... - 'HandleVisibility','callback', ... - 'Tag','PUSHTOOL_OPEN',... - 'UserData', 'off',... - 'Enable', 'on',... - 'ClickedCallback', @OpenMenuCallback); - hSavePushtool = uipushtool(... % Open Save toolbar button - 'Parent',hToolbar,... - 'TooltipString','Save NetCDF file',... - 'CData',iconRead( ... - [DEFAULT_PATH_FILE 'tsg_icon' filesep 'savedoc.mat']),... - 'HandleVisibility','callback', ... - 'Tag','PUSHTOOL_SAVE',... - 'Enable', 'off',... - 'ClickedCallback', @SaveMenuCallback); - hZoomPushtool = uipushtool(... % Open Zoom toolbar button - 'Parent',hToolbar,... - 'Separator', 'on', ... - 'TooltipString','Zoom',... - 'CData', iconRead(fullfile(matlabroot, ... - '/toolbox/matlab/icons/zoom.mat')),... - 'HandleVisibility','callback', ... - 'Tag','PUSHTOOL_ZOOM',... - 'Enable', 'off',... - 'ClickedCallback', @ZoomMenuCallback); - hPanPushtool = uipushtool(... % Open Pan toolbar button - 'Parent',hToolbar,... - 'TooltipString','Pan',... - 'CData',iconRead(fullfile(matlabroot, ... - '/toolbox/matlab/icons/pan.mat')),... - 'HandleVisibility','callback', ... - 'Tag','PUSHTOOL_PAN',... - 'Enable', 'off',... - 'ClickedCallback', @PanMenuCallback); - hQCPushtool = uipushtool(... % Open QC toolbar button - 'Parent',hToolbar,... - 'TooltipString','Validation codes',... - 'Separator', 'on', ... - 'CData',iconRead(... - [DEFAULT_PATH_FILE 'tsg_icon' filesep 'qcicon.mat']),... - 'HandleVisibility','callback', ... - 'Tag','QC',... - 'UserData', 'off',... - 'Enable', 'off',... - 'ClickedCallback', @QCMenuCallback); - hMapPushtool = uipushtool(... % Open Map toolbar button - 'Parent',hToolbar,... - 'TooltipString','Map and ship track',... - 'Separator', 'on', ... - 'CData',iconRead(... - [DEFAULT_PATH_FILE 'tsg_icon' filesep 'mapicon.mat']),... - 'HandleVisibility','callback', ... - 'Tag','PUSHTOOL_MAP',... - 'UserData', 'off', ... - 'Enable', 'off',... - 'ClickedCallback', @MapMenuCallback); - hClimPushtool = uipushtool(... % Open Climatology toolbar button - 'Parent',hToolbar,... - 'TooltipString','Climatology',... - 'Separator', 'on', ... - 'CData',iconRead(... - [DEFAULT_PATH_FILE 'tsg_icon' filesep 'climicon.mat']),... - 'HandleVisibility','callback', ... - 'Tag','PUSHTOOL_CLIM',... - 'UserData', 'off',... - 'Enable', 'off',... - 'ClickedCallback', @ClimMenuCallback); - hBottlePushtool = uipushtool(... % Open toolbar button - 'Parent',hToolbar,... - 'TooltipString','Plot the Samples',... - 'Separator', 'on', ... - 'CData',iconRead(... - [DEFAULT_PATH_FILE 'tsg_icon' filesep 'bottleicon.mat']),... - 'HandleVisibility','callback', ... - 'Tag','BOTTLE',... - 'Enable', 'off',... - 'ClickedCallback', @BottleMenuCallback); - hHeaderPushtool = uipushtool(... % Open headerForm button - 'Parent',hToolbar,... - 'TooltipString','Fill the header form',... - 'Separator', 'on', ... - 'CData',iconRead(... - [DEFAULT_PATH_FILE 'tsg_icon' filesep 'hdricon.mat']),... - 'HandleVisibility','callback', ... - 'Tag','PUSHTOOL_HEADER',... - 'Enable', 'off',... - 'ClickedCallback', @HeaderMenuCallback); - - % Static text that displays the position, salinity and temperature - % ---------------------------------------------------------------- - hInfoText = uicontrol(... - 'Parent', hMainFig, ... - 'Style', 'text', ... - 'Fontsize', 12, ... - 'Fontweight', 'bold', ... - 'Visible','on',... - 'Units', 'normalized',... - 'String', 'Information sur la position du curseur', ... - 'Position', [.05, .95, .9, .03]); - - - % Construct the plot axes - % ----------------------- - hPlotAxes(1) = axes(... % the axes for plotting Salinity - 'Parent', hMainFig, ... - 'Units', 'normalized', ... - 'Visible', 'off', ... - 'HandleVisibility','callback', ... - 'Position',[.05, .6, .9, .32]); - hPlotAxes(2) = axes(... % the axes for plotting temperature - 'Parent', hMainFig, ... - 'Units', 'normalized', ... - 'Visible', 'off', ... - 'HandleVisibility','callback', ... - 'Position',[.05, .3, .9, .25]); - hPlotAxes(3) = axes(... % the axes for plotting ship velocity - 'Parent', hMainFig, ... - 'Units', 'normalized', ... - 'Visible', 'off', ... - 'HandleVisibility','callback', ... - 'Position',[.05, .05, .9, .2]); - - % The map will be plot in a uipanel - hMapPanel = uipanel( ... - 'Parent', hMainFig, ... - 'Units', 'normalized', ... - 'Visible', 'off', ... - 'Position',[0, 0, 1, .57]); - - hPlotAxes(4) = axes(... % the axes for plotting ship track map - 'Parent', hMapPanel, ... - 'Units', 'normalized', ... - 'Visible', 'off', ... - 'Color', 'none', ... - 'UserData', 'off', ... - 'UserData', [], ... - 'HandleVisibility','callback', ... - 'Position',[.05, .05, .9, .9]); - - - % Construct the context menu for the Quality control codes - % ------------------------------------------------------- - hQcCmenu = uicontextmenu(... - 'Parent', hMainFig, ... - 'HandleVisibility','callback' ); - hQcCmenuNocontrol = uimenu(... - 'Parent', hQcCmenu,... - 'HandleVisibility','off', ... - 'Label', 'No control',... - 'ForegroundColor', 'k',... - 'Callback', @QcNoControl); - hQcCmenuGood = uimenu(... - 'Parent', hQcCmenu,... - 'HandleVisibility','off', ... - 'Label', 'Good',... - 'ForegroundColor', 'b',... - 'Callback', @QcGood); - hQcCmenuProbGood = uimenu(... - 'Parent', hQcCmenu,... - 'HandleVisibility','off', ... - 'Label', 'Probably Good',... - 'Callback', @QcProbGood,... - 'ForegroundColor', 'g'); - hQcCmenuProbBad = uimenu(... - 'Parent', hQcCmenu,... - 'HandleVisibility','off', ... - 'Label', 'Probably bad',... - 'ForegroundColor', 'm',... - 'Callback', @QcProbBad); - hQcCmenuBad = uimenu(... - 'Parent', hQcCmenu,... - 'HandleVisibility','off', ... - 'Label', 'Bad',... - 'ForegroundColor', 'r',... - 'Callback', @QcBad); - - - % Initialisation - % -------------- - tsg_initialisation(hMainFig, hQcCmenu) - - % Callbacks for tsgcqc_GUI % ************************ - %---------------------------------------------------------------------- - function OpenMenuCallback(hObject, eventdata) - % Callback function run when the Open menu item is selected - - % Pointer set to watch during reading and plotting - % ------------------------------------------------ - set( hMainFig, 'Pointer', 'watch' ); - - % Make the filename - % ATTENTION : function OpenMenuCallback(hObject, eventdata) - % This has to be made general for UNIX and WINDOWS system - % --------------------------------------------------------- - [filename, pathname, filterIndex] = uigetfile( ... - {'*.txt';'*.xml';'*.nc';'*.btl'}, 'Pick a file'); - - error1 = -1; - error2 = -1; - - if ~isequal(filename, 0) - - % Read the data - % ------------- - switch filterIndex - - case 1 - error1 = readTsgDataTxt( hMainFig, filename ); - case 2 - error1 = readTsgDataXML( hMainFig, filename ); - case 3 - error1 = readTsgDataNetCDF( hMainFig, filename ); - %# a modifier - if error1 == 1 - error2 = error1; - end - case 4 - error2 = readBucketData(hMainFig, filename ); - otherwise - return; - - end +%---------------------------------------------------------------------- + function OpenMenuCallback(hObject, eventdata) + % Callback function run when the Open menu item is selected - % A TSG file has been read. Plot the data. - % ---------------------------------------- - if error1 ~= -1 - - % A TSG file has been open and read - % --------------------------------- - set( hOpenMenu, 'UserData', 'on' ); - hdl_pushtool = findobj('-regexp','Tag', 'PUSHTOOL_'); - set(hdl_pushtool, 'Enable', 'on'); - - - % The callback to detect the mouse motion can be set to on - % -------------------------------------------------------- - set( hMainFig, 'UserData', 'ButtonMotionOn'); - - % Make the Salinity, temperature and velocity plot - % ------------------------------------------------ - plot_SalTempVel( hMainFig, hPlotAxes ); - - % Plot the Map with the ship trackline - % ------------------------------------ - plotmap( hMainFig, hPlotAxes) - - end - end + % Pointer set to watch during reading and plotting + % ------------------------------------------------ + set( hMainFig, 'Pointer', 'watch' ); - % Merge the different water sample (NetCdf or ASCII files) in - % a unique structure : 'sample' - % ----------------------------------------------------------- - %@ desactive le merge pour l'instant en attente d'une structure de - %données validee - %@[sample] = tsg_mergesample( hMainFig ); - - %@ Save the 'sample' struct. as an application data - % ------------------------------------------------ - %if ~isempty( sample ) - % setappdata( hMainFig, 'sample', sample ); - %end + % Make the filename + % ATTENTION : function OpenMenuCallback(hObject, eventdata) + % This has to be made general for UNIX and WINDOWS system + % --------------------------------------------------------- + [filename, pathname, filterIndex] = uigetfile( ... + {'*.txt';'*.xml';'*.nc';'*.btl'}, 'Pick a file'); + + error1 = -1; + error2 = -1; + + if ~isequal(filename, 0) + + % Read the data + % ------------- + switch filterIndex + + case 1 + error1 = readTsgDataTxt( hMainFig, filename ); + case 2 + error1 = readTsgDataXML( hMainFig, filename ); + case 3 + error1 = readTsgDataNetCDF( hMainFig, filename ); + %# a modifier + if error1 == 1 + error2 = error1; + end + case 4 + error2 = readBucketData(hMainFig, filename ); + otherwise + return; - % Plot Salinity bucket + end + + % A TSG file has been read. Plot the data. + % ---------------------------------------- + if error1 ~= -1 + + % A TSG file has been open and read + % --------------------------------- + set( hOpenMenu, 'UserData', 'on' ); + hdl_pushtool = findobj('-regexp','Tag', 'PUSHTOOL_'); + set(hdl_pushtool, 'Enable', 'on'); + + % update the display + % ------------------ + set( hInfoFileText, 'String', filename); + + % The callback to detect the mouse motion can be set to on + % -------------------------------------------------------- + set( hMainFig, 'UserData', 'ButtonMotionOn'); + + % Make the Salinity, temperature and velocity plot % ------------------------------------------------ - if error2 ~= -1 - plot_SalTsgSample( hMainFig, hPlotAxes ); - end - - % Pointer reset to arrow - % ---------------------- - set( hMainFig, 'Pointer', 'arrow' ); + plot_SalTempVel( hMainFig, hPlotAxes ); + + % Plot the Map with the ship trackline + % ------------------------------------ + plotmap( hMainFig, hPlotAxes) + end end - %---------------------------------------------------------------------- - function ZoomMenuCallback(hObject, eventdata) - % Callback function run when the Open menu item is selected - - % Returns a zoom mode object for the figure handle - hZoom = zoom(hMainFig); - % Specifies whether this mode is currently enabled on the figure - zoomOnOff = get(hZoom, 'Enable' ); - switch zoomOnOff - case 'on' - zoom off - zoomAdaptiveDateTicks('off'); - case 'off' - pan off - set(hQCPushtool, 'UserData', 'off' ); - - zoom on - zoomAdaptiveDateTicks('on'); - end - % zoomColor = get(hZoomPushtool,'CData'); - % set(hZoomplusPushtool,'CData', zoomColor); + % Merge the different water sample (NetCdf or ASCII files) in + % a unique structure : 'sample' + % ----------------------------------------------------------- + %@ desactive le merge pour l'instant en attente d'une structure de + %données validee + %@[sample] = tsg_mergesample( hMainFig ); + + %@ Save the 'sample' struct. as an application data + % ------------------------------------------------ + %if ~isempty( sample ) + % setappdata( hMainFig, 'sample', sample ); + %end + + % Plot Salinity bucket + % ------------------------------------------------ + if error2 ~= -1 + plot_SalTsgSample( hMainFig, hPlotAxes ); end - %---------------------------------------------------------------------- - function PanMenuCallback(hObject, eventdata) - % Callback function run when the Open menu item is selected - - % Returns a pan mode object for the figure handle - hPan = pan(hMainFig); - % Specifies whether this mode is currently enabled on the figure - panOnOff = get(hPan, 'Enable' ); - switch panOnOff - case 'on' - pan off - panAdaptiveDateTicks('off'); - case 'off' - zoom off - set(hQCPushtool, 'UserData', 'off' ); - - pan on - panAdaptiveDateTicks('on'); - - end + % Pointer reset to arrow + % ---------------------- + set( hMainFig, 'Pointer', 'arrow' ); + + end + +%---------------------------------------------------------------------- + function ZoomMenuCallback(hObject, eventdata) + % Callback function run when the Open menu item is selected + + % Returns a zoom mode object for the figure handle + hZoom = zoom(hMainFig); + % Specifies whether this mode is currently enabled on the figure + zoomOnOff = get(hZoom, 'Enable' ); + switch zoomOnOff + case 'on' + zoom off + zoomAdaptiveDateTicks('off'); + case 'off' + pan off + set(hQCPushtool, 'UserData', 'off' ); + + zoom on + zoomAdaptiveDateTicks('on'); end + % zoomColor = get(hZoomPushtool,'CData'); + % set(hZoomplusPushtool,'CData', zoomColor); + end + +%---------------------------------------------------------------------- + function PanMenuCallback(hObject, eventdata) + % Callback function run when the Open menu item is selected + + % Returns a pan mode object for the figure handle + hPan = pan(hMainFig); + % Specifies whether this mode is currently enabled on the figure + panOnOff = get(hPan, 'Enable' ); + switch panOnOff + case 'on' + pan off + panAdaptiveDateTicks('off'); + case 'off' + zoom off + set(hQCPushtool, 'UserData', 'off' ); + + pan on + panAdaptiveDateTicks('on'); + + end + end - %---------------------------------------------------------------------- - function QCMenuCallback(gcbo, eventdata,handles) +%---------------------------------------------------------------------- + function QCMenuCallback(gcbo, eventdata,handles) % Callback function run when the QC pushbutton is selected - - % Desactivate the Zoom and Pan functions. + + % Desactivate the Zoom and Pan functions. + % --------------------------------------- + zoom off; pan off + panAdaptiveDateTicks('off');zoomAdaptiveDateTicks('off'); + + % Retrieve named application data + % ------------------------------- + tsg = getappdata( hMainFig, 'tsg_data'); + + % Toggle the tag of the Qc pushbutton to 'on' or 'off' + % ---------------------------------------------------- + switch get(hQCPushtool, 'UserData'); + case 'off' + set(hQCPushtool, 'UserData', 'on' ); + set(hPlotAxes(1),'UIContextMenu', hQcCmenu); + set( hMainFig, 'Pointer', 'crosshair'); + case 'on' + set(hQCPushtool, 'UserData', 'off' ); + set(hPlotAxes(1),'UIContextMenu', []); + set(hMainFig,'Pointer','arrow'); + end + + qualityCode = -1; + ind = []; + while strcmp( get(hQCPushtool, 'UserData'),'on') + + k = waitforbuttonpress; + + % If the QC pushbutton is pressed we quit the callback + % ---------------------------------------------------- + if strcmp( get(hQCPushtool, 'UserData'),'off') + + % Desactivate the context menu use to choose the + % Quality Codes + % ---------------------------------------------- + set(hQcCmenu, 'Visible', 'off'); + break + end + + % Test if the right mouse button is clicked + % ----------------------------------------- + if strcmp(get(hMainFig, 'SelectionType'), 'alt') && ~isempty(ind) + % Wait for a QC Context Menu choice : The user choose the + % quality code + % ------------------------------------------------------- + uiwait + qualityCode = 1; + + else + + % Mouse motion callback desactivated when a selection is + % made. Otherwise there is a conflict with the map if it + % is activated + % ------------------------------------------------------- + set( hMainFig, 'UserData', 'ButtonMotionOff'); + + % Selection of the data within the figure % --------------------------------------- - zoom off; pan off - panAdaptiveDateTicks('off');zoomAdaptiveDateTicks('off'); + point1 = get(gca,'CurrentPoint'); % button down detected + finalRect = rbbox; % return figure units + point2 = get(gca,'CurrentPoint'); % button up detected - % Retrieve named application data - % ------------------------------- - tsg = getappdata( hMainFig, 'tsg_data'); - - % Toggle the tag of the Qc pushbutton to 'on' or 'off' - % ---------------------------------------------------- - switch get(hQCPushtool, 'UserData'); - case 'off' - set(hQCPushtool, 'UserData', 'on' ); - set(hPlotAxes(1),'UIContextMenu', hQcCmenu); - set( hMainFig, 'Pointer', 'crosshair'); - case 'on' - set(hQCPushtool, 'UserData', 'off' ); - set(hPlotAxes(1),'UIContextMenu', []); - set(hMainFig,'Pointer','arrow'); - end - - qualityCode = -1; - ind = []; - while strcmp( get(hQCPushtool, 'UserData'),'on') - - k = waitforbuttonpress; - - % If the QC pushbutton is pressed we quit the callback - % ---------------------------------------------------- - if strcmp( get(hQCPushtool, 'UserData'),'off') - - % Desactivate the context menu use to choose the - % Quality Codes - % ---------------------------------------------- - set(hQcCmenu, 'Visible', 'off'); - break - end + point1 = point1(1,1:2); % extract x and y + point2 = point2(1,1:2); - % Test if the right mouse button is clicked - % ----------------------------------------- - if strcmp(get(hMainFig, 'SelectionType'), 'alt') && ~isempty(ind) - % Wait for a QC Context Menu choice : The user choose the - % quality code - % ------------------------------------------------------- - uiwait - qualityCode = 1; + p1 = min(point1,point2); + p2 = max(point1,point2); % calculate locations - else + ind = find(tsg.DAYD > p1(1,1) & tsg.DAYD < p2(1,1) & ... + tsg.SSPS > p1(1,2) & tsg.SSPS < p2(1,2)); - % Mouse motion callback desactivated when a selection is - % made. Otherwise there is a conflict with the map if it - % is activated - % ------------------------------------------------------- - set( hMainFig, 'UserData', 'ButtonMotionOff'); - - % Selection of the data within the figure - % --------------------------------------- - point1 = get(gca,'CurrentPoint'); % button down detected - finalRect = rbbox; % return figure units - point2 = get(gca,'CurrentPoint'); % button up detected - - point1 = point1(1,1:2); % extract x and y - point2 = point2(1,1:2); - - p1 = min(point1,point2); - p2 = max(point1,point2); % calculate locations - - ind = find(tsg.DAYD > p1(1,1) & tsg.DAYD < p2(1,1) & ... - tsg.SSPS > p1(1,2) & tsg.SSPS < p2(1,2)); - - % As soon as a modification took place the data should be - % saved - % ------------------------------------------------------- - set( hSaveMenu, 'UserData', 'on' ); - - % Selection made : Mouse motion callback re-activated - % -------------------------------------------------- - set( hMainFig, 'UserData', 'ButtonMotionOn'); + % As soon as a modification took place the data should be + % saved + % ------------------------------------------------------- + set( hSaveMenu, 'UserData', 'on' ); - end + % Selection made : Mouse motion callback re-activated + % -------------------------------------------------- + set( hMainFig, 'UserData', 'ButtonMotionOn'); - % Plot the data with the color of the chosen quality Code. - % Is it the right place for this source code ???? - % -------------------------------------------------------- - if qualityCode ~= -1 - - quality = get( hQcCmenu, 'UserData'); - - tsg.SSPS_QC(ind) = quality.Code; - - % Save the modifications - % ---------------------- - setappdata( hMainFig, 'tsg_data', tsg); - - axes(hPlotAxes(1)); - hold on - color = ['.' quality.Color]; - plot(tsg.DAYD(ind), tsg.SSPS(ind), color ); - hold off - - end - end + end + + % Plot the data with the color of the chosen quality Code. + % Is it the right place for this source code ???? + % -------------------------------------------------------- + if qualityCode ~= -1 + + quality = get( hQcCmenu, 'UserData'); + + tsg.SSPS_QC(ind) = quality.Code; + + % Save the modifications + % ---------------------- + setappdata( hMainFig, 'tsg_data', tsg); + + axes(hPlotAxes(1)); + hold on + color = ['.' quality.Color]; + plot(tsg.DAYD(ind), tsg.SSPS(ind), color ); + hold off + + end end + end - %--------------------------------------------------------------------- - function QcNoControl(hObject, eventdata) +%--------------------------------------------------------------------- + function QcNoControl(hObject, eventdata) % Callback function run when the QC context menu is selected - - % Retrieve Default Quality Code and Color - % --------------------------------------- - qc = getappdata( hMainFig, 'qcColor'); - - quality.Code = qc.Code.NO_CONTROL; - quality.Color = qc.Color.NO_CONTROL; - set( hQcCmenu, 'UserData', quality ); - - % uiwait in the QCMenuCallback function - % ------------------------------------- - uiresume - end - - %--------------------------------------------------------------------- - function QcGood(hObject, eventdata) + + % Retrieve Default Quality Code and Color + % --------------------------------------- + qc = getappdata( hMainFig, 'qcColor'); + + quality.Code = qc.Code.NO_CONTROL; + quality.Color = qc.Color.NO_CONTROL; + set( hQcCmenu, 'UserData', quality ); + + % uiwait in the QCMenuCallback function + % ------------------------------------- + uiresume + end + +%--------------------------------------------------------------------- + function QcGood(hObject, eventdata) % Callback function run when the QC context menu is selected - - % Retrieve named application data - % ------------------------------- - qc = getappdata( hMainFig, 'qcColor'); - - quality.Code = qc.Code.GOOD; - quality.Color = qc.Color.GOOD; - set( hQcCmenu, 'UserData', quality ); - - % uiwait in the QCMenuCallback function - % ------------------------------------- - uiresume - end - - %--------------------------------------------------------------------- - function QcProbGood(hObject, eventdata) + + % Retrieve named application data + % ------------------------------- + qc = getappdata( hMainFig, 'qcColor'); + + quality.Code = qc.Code.GOOD; + quality.Color = qc.Color.GOOD; + set( hQcCmenu, 'UserData', quality ); + + % uiwait in the QCMenuCallback function + % ------------------------------------- + uiresume + end + +%--------------------------------------------------------------------- + function QcProbGood(hObject, eventdata) % Callback function run when the QC context menu is selected - - % Retrieve named application data - % ------------------------------- - qc = getappdata( hMainFig, 'qcColor'); - - quality.Code = qc.Code.PROBABLY_GOOD; - quality.Color = qc.Color.PROBABLY_GOOD; - set( hQcCmenu, 'UserData', quality ); - - % uiwait in the QCMenuCallback function - % ------------------------------------- - uiresume - end - - %--------------------------------------------------------------------- - function QcProbBad(hObject, eventdata) + + % Retrieve named application data + % ------------------------------- + qc = getappdata( hMainFig, 'qcColor'); + + quality.Code = qc.Code.PROBABLY_GOOD; + quality.Color = qc.Color.PROBABLY_GOOD; + set( hQcCmenu, 'UserData', quality ); + + % uiwait in the QCMenuCallback function + % ------------------------------------- + uiresume + end + +%--------------------------------------------------------------------- + function QcProbBad(hObject, eventdata) % Callback function run when the QC context menu is selected - - % Retrieve named application data - % ------------------------------- - qc = getappdata( hMainFig, 'qcColor'); - - quality.Code = qc.Code.PROBABLY_BAD; - quality.Color = qc.Color.PROBABLY_BAD; - set( hQcCmenu, 'UserData', quality ); - - % uiwait in the QCMenuCallback function - % ------------------------------------- - uiresume - end - - %--------------------------------------------------------------------- - function QcBad(hObject, eventdata) + + % Retrieve named application data + % ------------------------------- + qc = getappdata( hMainFig, 'qcColor'); + + quality.Code = qc.Code.PROBABLY_BAD; + quality.Color = qc.Color.PROBABLY_BAD; + set( hQcCmenu, 'UserData', quality ); + + % uiwait in the QCMenuCallback function + % ------------------------------------- + uiresume + end + +%--------------------------------------------------------------------- + function QcBad(hObject, eventdata) % Callback function run when the QC context menu is selected - % Retrieve named application data - % ------------------------------- - qc = getappdata( hMainFig, 'qcColor'); - - quality.Code = qc.Code.BAD; - quality.Color = qc.Color.BAD; - set( hQcCmenu, 'UserData', quality ); - - % uiwait in the QCMenuCallback function - % ------------------------------------- - uiresume - end - - %--------------------------------------------------------------------- - function MouseMotion(hObject, eventdata) - - % Test if the callback can be activated - % ------------------------------------- - if strcmp( get( hMainFig, 'UserData'), 'ButtonMotionOn') + % Retrieve named application data + % ------------------------------- + qc = getappdata( hMainFig, 'qcColor'); + + quality.Code = qc.Code.BAD; + quality.Color = qc.Color.BAD; + set( hQcCmenu, 'UserData', quality ); + + % uiwait in the QCMenuCallback function + % ------------------------------------- + uiresume + end + +%--------------------------------------------------------------------- + function MouseMotion(hObject, eventdata) + + % Test if the callback can be activated + % ------------------------------------- + if strcmp( get( hMainFig, 'UserData'), 'ButtonMotionOn') + + % Retrieve named application data + % ------------------------------- + tsg = getappdata( hMainFig, 'tsg_data'); + + % Get the mouse position + % ---------------------- + point = get(gcf,'CurrentPoint'); + + if point(1) > .05 && point(2) > .6 && point(1) < .95 && point(2) < .92 + + % Get current position of cusor and return its coordinates in + % axes with handle h_axes + % ----------------------------------------------------------- + [x, y] = gpos(hPlotAxes(1)); + + % Dynamically diplay data in uicontrol + % ------------------------------------ + if x > tsg.DAYD(1) && x < tsg.DAYD(end) + indCursor = find( tsg.DAYD > x); + set( hInfoDateText, 'String',... + datestr(tsg.DAYD(indCursor(1)),'dd/mm/yyyy HH:MM')); + set( hInfoLatText, 'String', dd2dm(tsg.LATX(indCursor(1)),0)); + set( hInfoLongText, 'String', dd2dm(tsg.LONX(indCursor(1)),1)); + set( hInfoSSPSText, 'String', tsg.SSPS(indCursor(1))); + set( hInfoSSJTText, 'String', tsg.SSJT(indCursor(1))); + if ~isempty(tsg.SSTP) + set( hInfoSSTPText, 'String', tsg.SSTP(indCursor(1))); + end - % Retrieve named application data - % ------------------------------- - tsg = getappdata( hMainFig, 'tsg_data'); - - % Get the mouse position - % ---------------------- - point = get(gcf,'CurrentPoint'); - - if point(1) > .05 && point(2) > .6 && point(1) < .95 && point(2) < .92 - - % Get current position of cusor and return its coordinates in - % axes with handle h_axes - % ----------------------------------------------------------- - [x, y] = gpos(hPlotAxes(1)); - - if x > tsg.DAYD(1) && x < tsg.DAYD(end) - - indCursor = find( tsg.DAYD > x); - % use sprintf with format instead strcat & num2str but flag - % - don't work with 0, eg %+07.4f - set( hInfoText, 'String',... - sprintf(['%s - Latitude = %s - Longitude = %s '... - ' - Salinity = %07.4f - Temperature = %07.4f'],... - datestr(tsg.DAYD(indCursor(1)),'dd/mm/yyyy HH:MM'),... - dd2dm(tsg.LATX(indCursor(1)),0), ... - dd2dm(tsg.LONX(indCursor(1)),1), ... - tsg.SSPS(indCursor(1)), ... - tsg.SSJT(indCursor(1))... - )); - - % Plot the position on the map if this one is active - % -------------------------------------------------- - if strcmp( get(hMapPanel, 'Visible'), 'on') - - % Select the map axes - % ------------------- - axes( hPlotAxes(4)); - - if isempty( get(hMapPanel, 'UserData')) - hMarker = m_line( ... - tsg.LONX(indCursor(1)), tsg.LATX(indCursor(1)),... - 'Marker','o','MarkerSize',5, ... - 'Color','r', 'MarkerFaceColor','r'); - set(hMapPanel, 'UserData', hMarker) - else - delete(get(hMapPanel, 'UserData')); - hMarker = m_line( ... - tsg.LONX(indCursor(1)), tsg.LATX(indCursor(1)),... - 'Marker','o','MarkerSize',5, ... - 'Color','r', 'MarkerFaceColor','r'); - set(hMapPanel, 'UserData', hMarker); - end - end + % Plot the position on the map if this one is active + % -------------------------------------------------- + if strcmp( get(hMapPanel, 'Visible'), 'on') + + % Select the map axes + % ------------------- + axes( hPlotAxes(4)); + + if isempty( get(hMapPanel, 'UserData')) + hMarker = m_line( ... + tsg.LONX(indCursor(1)), tsg.LATX(indCursor(1)),... + 'Marker','o','MarkerSize',5, ... + 'Color','r', 'MarkerFaceColor','r'); + set(hMapPanel, 'UserData', hMarker) + else + delete(get(hMapPanel, 'UserData')); + hMarker = m_line( ... + tsg.LONX(indCursor(1)), tsg.LATX(indCursor(1)),... + 'Marker','o','MarkerSize',5, ... + 'Color','r', 'MarkerFaceColor','r'); + set(hMapPanel, 'UserData', hMarker); end + end end end end + end - %--------------------------------------------------------------------- - function MapMenuCallback(hObject, eventdata) +%--------------------------------------------------------------------- + function MapMenuCallback(hObject, eventdata) % Callback function run when the Map tool bar item is selected % Make the earth map visible or not - - if strcmp( get(hMapPanel, 'Visible'), 'off' ) - set(hMapPanel, 'Visible', 'on' ); - else - set(hMapPanel, 'Visible', 'off' ); - end + + if strcmp( get(hMapPanel, 'Visible'), 'off' ) + set(hMapPanel, 'Visible', 'on' ); + else + set(hMapPanel, 'Visible', 'off' ); end + end - %--------------------------------------------------------------------- - function BottleMenuCallback(hObject, eventdata) +%--------------------------------------------------------------------- + function BottleMenuCallback(hObject, eventdata) % Callback function run when the Bottle tool bar item is selected % % Plot or Delete the buckets measurements on the Salinity graph % % Need to read them right now - but they will be soon in the NetCdf % file - + % Test if the sample Push button has been pressed % ----------------------------------------------- - if strcmp( get(hBottlePushtool, 'UserData'), 'off') - - % Sample Push button - UserData set to 'on' - % ------------------------------------ - set( hBottlePushtool, 'UserData', 'on' ); - - % Test if tsg and sample data have been loaded - % -------------------------------------------- - if ~isempty( getappdata( hMainFig, 'tsg_data') ) && ... - ~isempty( getappdata( hMainFig, 'sample') ) - - % Call the GUI for tsg correction - % ------------------------------- - %msgbox('The correction module has not been implemented', 'modal'); - tsgcor_GUI( hMainFig ); - - else - - msgbox('TSG or Sample data not loaded in the program', 'modal'); - - end - - % hLine = get( hPlotAxes(1), 'UserData'); - - - % Plot the samples if the TSG file has been read - % ---------------------------------------------- -% if strcmp( get(hOpenMenu, 'UserData'), 'on' ) && ~isempty( sample ) -% axes( hPlotAxes(1) ); -% hLine.Sample = line( ... -% sample.TIME, sample.PSAL,... -% 'Linestyle', 'none', 'Marker','o','MarkerSize',5, ... -% 'Color','r', 'MarkerFaceColor','r'); - - % Store the handle of the bucketline - % ---------------------------------- -% set( hPlotAxes(1), 'UserData', hLine ); -% end - -% else - - set( hBottlePushtool, 'UserData', 'off' ); - - % The bucket pushbutton has been pressed again : - % Delete the bucket on figure - % ---------------------------------------------- -% hLine = get( hPlotAxes(1), 'UserData'); -% if ~isempty( hLine ) && ishandle( hLine.Sample ) -% delete(hLine.Sample); - % end - end + if strcmp( get(hBottlePushtool, 'UserData'), 'off') + + % Sample Push button - UserData set to 'on' + % ------------------------------------ + set( hBottlePushtool, 'UserData', 'on' ); + + % Test if tsg and sample data have been loaded + % -------------------------------------------- + if ~isempty( getappdata( hMainFig, 'tsg_data') ) && ... + ~isempty( getappdata( hMainFig, 'sample') ) + + % Call the GUI for tsg correction + % ------------------------------- + %msgbox('The correction module has not been implemented', 'modal'); + tsgcor_GUI( hMainFig ); + + else + + msgbox('TSG or Sample data not loaded in the program', 'modal'); + + end + + % hLine = get( hPlotAxes(1), 'UserData'); + + + % Plot the samples if the TSG file has been read + % ---------------------------------------------- + % if strcmp( get(hOpenMenu, 'UserData'), 'on' ) && ~isempty( sample ) + % axes( hPlotAxes(1) ); + % hLine.Sample = line( ... + % sample.TIME, sample.PSAL,... + % 'Linestyle', 'none', 'Marker','o','MarkerSize',5, ... + % 'Color','r', 'MarkerFaceColor','r'); + + % Store the handle of the bucketline + % ---------------------------------- + % set( hPlotAxes(1), 'UserData', hLine ); + % end + + % else + + set( hBottlePushtool, 'UserData', 'off' ); + + % The bucket pushbutton has been pressed again : + % Delete the bucket on figure + % ---------------------------------------------- + % hLine = get( hPlotAxes(1), 'UserData'); + % if ~isempty( hLine ) && ishandle( hLine.Sample ) + % delete(hLine.Sample); + % end end + end - %--------------------------------------------------------------------- - function ClimMenuCallback(hObject, eventdata) +%--------------------------------------------------------------------- + function ClimMenuCallback(hObject, eventdata) % Callback function run when the ClimMenu menu item is selected % % Plot or delete salinity climatology over Salinity plot % % Function to be written - + % Test if the climatology Push button has been pressed % ---------------------------------------------------- - if strcmp( get(hClimPushtool, 'UserData'), 'off') - - % Climatology push button - UserData set to 'on' - % ----------------------------------------- - set( hClimPushtool, 'UserData', 'on' ); - - - % Test if the TSG and bucket files have been read - % ----------------------------------------------- - if strcmp( get(hOpenMenu, 'UserData'), 'on' ) - - % Get data - % ----------------------- - tsg = getappdata( hMainFig, 'tsg_data' ); - hLine1 = get( hPlotAxes(1), 'UserData'); - hLine2 = get( hPlotAxes(2), 'UserData'); - - % Read Climatology - % ---------------- - if isempty( tsg.levitus.data) - levitus = read_file_woa01( 'woa01an.nc' ); - if ~isstruct(levitus) - errordlg({'NetCDF climatology file not present in you path',... - 'Check your matlab path or download it from',... - 'ftp://ftp.ifremer.fr/ifremer/ird/us191/oceano/lib/matlab/woa01an.nc'},... - 'NetCDF climatology file access error'); - return; - else - tsg.levitus.data = levitus; - tsg.levitus.type = 'woa01an'; - end - setappdata( hMainFig, 'tsg_data', tsg ); - end - - % round positive latitude and Longitude toward zero - % ------------------------------------------------- - ind = find(tsg.LATX > 0); - lat(ind) = fix(tsg.LATX(ind)) + 0.5; - - ind = find(tsg.LONX > 0); - lon(ind) = fix(tsg.LONX(ind)) + 0.5; - - % rounds negative latitude and Longitudeto the nearest lowest integers - % --------------------------------------------------------------------- - ind = find(tsg.LATX <= 0); - lat(ind) = floor(tsg.LATX(ind)) + 0.5; - - ind = find(tsg.LONX <= 0); - lon(ind) = floor(tsg.LONX(ind)) + 0.5; - - % Calculates differences between adjacent elements of X. - % 0 if adajacent latitude or longitude are equal - % - 1 or -1 otherwise - % ------------------------------------------------------------ - lat_diff = [diff( lat )'; 0]; - lon_diff = [diff( lon )'; 0]; - - % Select latitude and longitude - % ----------------------------- - ind = find(abs(lat_diff) == 1 | abs(lon_diff == 1)); - lat2 = lat( ind ); - lon2 = lon( ind ); - time = tsg.DAYD( ind ); - temp = tsg.SSJT( ind ); - psal = tsg.SSPS( ind ); - - % Get Climatology - % LATX(80) = -0.5 et LATX(81) = 0.5 - % LONX(180) = -0.5 et LONX(181) = 0.5 - % ---------------- - axes( hPlotAxes(1) ); - mean_temp = zeros(size(ind)); - mean_psal = zeros(size(ind)); - std_temp = zeros(size(ind)); - std_psal = zeros(size(ind)); - for i=1:length(ind) - ilat = find(tsg.levitus.data.WOA01_LATX == lat2(i)); - ilon = find(tsg.levitus.data.WOA01_LONX == lon2(i)); - mean_temp(i) = tsg.levitus.data.WOA01_MEAN_TEMP(ilat,ilon,1); - mean_psal(i) = tsg.levitus.data.WOA01_MEAN_PSAL(ilat,ilon,1); - std_temp(i) = tsg.levitus.data.WOA01_STD_TEMP(ilat,ilon,1); - std_psal(i) = tsg.levitus.data.WOA01_STD_PSAL(ilat,ilon,1); - end - - % Plot mean salinity climatology - hLine1.meanClim = line( ... - time, mean_psal,'Linestyle', '-', 'Color','k'); - % Plot 2 standard deviation - hLine1.stdClimPlus = line( ... - time, mean_psal + 3 * std_psal ,'Linestyle', '-', 'Color','r'); - hLine1.stdClimMinus = line( ... - time, mean_psal - 3 * std_psal ,'Linestyle', '-', 'Color','r'); - % Plot mean temperature climatology - axes( hPlotAxes(2)); - hLine2.meanClim = line( ... - time, mean_temp,'Linestyle', '-', 'Color','k'); - hLine2.stdClimPlus = line( ... - time, mean_temp + 3 * std_temp ,'Linestyle', '-', 'Color','r'); - hLine2.stdClimMinus = line( ... - time, mean_temp - 3 * std_temp ,'Linestyle', '-', 'Color','r'); - - % Store the handle of the bucketline - % ---------------------------------- - set( hPlotAxes(1), 'UserData', hLine1 ); - set( hPlotAxes(2), 'UserData', hLine2 ); - end - - else - - set( hClimPushtool, 'UserData', 'off' ); - - % The bucket pushbutton has been pressed again : - % Delete the bucket on figure - % ---------------------------------------------- - hLine1 = get( hPlotAxes(1), 'UserData'); - hLine2 = get( hPlotAxes(2), 'UserData'); - % bug...... - try - delete(hLine1.stdClimMinus); - delete(hLine1.stdClimPlus); - delete(hLine1.meanClim); - delete(hLine2.stdClimMinus); - delete(hLine2.stdClimPlus); - delete(hLine2.meanClim); - catch - end + if strcmp( get(hClimPushtool, 'UserData'), 'off') + + % Climatology push button - UserData set to 'on' + % ----------------------------------------- + set( hClimPushtool, 'UserData', 'on' ); + + + % Test if the TSG and bucket files have been read + % ----------------------------------------------- + if strcmp( get(hOpenMenu, 'UserData'), 'on' ) + + % Get data + % ----------------------- + tsg = getappdata( hMainFig, 'tsg_data' ); + hLine1 = get( hPlotAxes(1), 'UserData'); + hLine2 = get( hPlotAxes(2), 'UserData'); + + % Read Climatology + % ---------------- + if isempty( tsg.levitus.data) + levitus = read_file_woa01( 'woa01an.nc' ); + if ~isstruct(levitus) + errordlg({'NetCDF climatology file not present in you path',... + 'Check your matlab path or download it from',... + 'ftp://ftp.ifremer.fr/ifremer/ird/us191/oceano/lib/matlab/woa01an.nc'},... + 'NetCDF climatology file access error'); + return; + else + tsg.levitus.data = levitus; + tsg.levitus.type = 'woa01an'; + end + setappdata( hMainFig, 'tsg_data', tsg ); + end + + % round positive latitude and Longitude toward zero + % ------------------------------------------------- + ind = find(tsg.LATX > 0); + lat(ind) = fix(tsg.LATX(ind)) + 0.5; + + ind = find(tsg.LONX > 0); + lon(ind) = fix(tsg.LONX(ind)) + 0.5; + + % rounds negative latitude and Longitudeto the nearest lowest integers + % --------------------------------------------------------------------- + ind = find(tsg.LATX <= 0); + lat(ind) = floor(tsg.LATX(ind)) + 0.5; + + ind = find(tsg.LONX <= 0); + lon(ind) = floor(tsg.LONX(ind)) + 0.5; + + % Calculates differences between adjacent elements of X. + % 0 if adajacent latitude or longitude are equal + % - 1 or -1 otherwise + % ------------------------------------------------------------ + lat_diff = [diff( lat )'; 0]; + lon_diff = [diff( lon )'; 0]; + + % Select latitude and longitude + % ----------------------------- + ind = find(abs(lat_diff) == 1 | abs(lon_diff == 1)); + lat2 = lat( ind ); + lon2 = lon( ind ); + time = tsg.DAYD( ind ); + temp = tsg.SSJT( ind ); + psal = tsg.SSPS( ind ); + + % Get Climatology + % LATX(80) = -0.5 et LATX(81) = 0.5 + % LONX(180) = -0.5 et LONX(181) = 0.5 + % ---------------- + axes( hPlotAxes(1) ); + mean_temp = zeros(size(ind)); + mean_psal = zeros(size(ind)); + std_temp = zeros(size(ind)); + std_psal = zeros(size(ind)); + for i=1:length(ind) + ilat = find(tsg.levitus.data.WOA01_LATX == lat2(i)); + ilon = find(tsg.levitus.data.WOA01_LONX == lon2(i)); + mean_temp(i) = tsg.levitus.data.WOA01_MEAN_TEMP(ilat,ilon,1); + mean_psal(i) = tsg.levitus.data.WOA01_MEAN_PSAL(ilat,ilon,1); + std_temp(i) = tsg.levitus.data.WOA01_STD_TEMP(ilat,ilon,1); + std_psal(i) = tsg.levitus.data.WOA01_STD_PSAL(ilat,ilon,1); end + + % Plot mean salinity climatology + hLine1.meanClim = line( ... + time, mean_psal,'Linestyle', '-', 'Color','k'); + % Plot 2 standard deviation + hLine1.stdClimPlus = line( ... + time, mean_psal + 3 * std_psal ,'Linestyle', '-', 'Color','r'); + hLine1.stdClimMinus = line( ... + time, mean_psal - 3 * std_psal ,'Linestyle', '-', 'Color','r'); + % Plot mean temperature climatology + axes( hPlotAxes(2)); + hLine2.meanClim = line( ... + time, mean_temp,'Linestyle', '-', 'Color','k'); + hLine2.stdClimPlus = line( ... + time, mean_temp + 3 * std_temp ,'Linestyle', '-', 'Color','r'); + hLine2.stdClimMinus = line( ... + time, mean_temp - 3 * std_temp ,'Linestyle', '-', 'Color','r'); + + % Store the handle of the bucketline + % ---------------------------------- + set( hPlotAxes(1), 'UserData', hLine1 ); + set( hPlotAxes(2), 'UserData', hLine2 ); + end + + else + + set( hClimPushtool, 'UserData', 'off' ); + + % The bucket pushbutton has been pressed again : + % Delete the bucket on figure + % ---------------------------------------------- + hLine1 = get( hPlotAxes(1), 'UserData'); + hLine2 = get( hPlotAxes(2), 'UserData'); + % bug...... + try + delete(hLine1.stdClimMinus); + delete(hLine1.stdClimPlus); + delete(hLine1.meanClim); + delete(hLine2.stdClimMinus); + delete(hLine2.stdClimPlus); + delete(hLine2.meanClim); + catch + end end + end - % ------------------------------------------------------------------- - function HeaderMenuCallback(hObject, eventdata) +% ------------------------------------------------------------------- + function HeaderMenuCallback(hObject, eventdata) % Callback function run when the headerForm tool bar item is selected - - % call header form function - % ------------------------- - headerForm(hMainFig); - end - - % ------------------------------------------------------------------- - function SaveMenuCallback(hObject, eventdata) + + % call header form function + % ------------------------- + headerForm(hMainFig); + end + +% ------------------------------------------------------------------- + function SaveMenuCallback(hObject, eventdata) % Callback function run when the Save menu item is selected - - % fill or append header form - % ------------------------- - error = headerForm(hMainFig); - - % if user press continue button, ask for netcdf file - % ------------------------------------------------ - if error ~= -1 - [fileName, pathName, filterIndex] = uiputfile('*.nc', ... - 'Save file name'); - - % if user press cancel button, all var set to zero - % ------------------------------------------------ - if fileName == 0 - return; - end - - % Pointer set to watch during reading and plotting - % ------------------------------------------------ - set( hMainFig, 'Pointer', 'watch' ); - - % flushes the event queue and updates the closed uiputfile window - % --------------------------------------------------------------- - drawnow; - - % write netcdf file - % ----------------- - fileName = [pathName fileName]; - error = writeTSGDataNetCDF( hMainFig, fileName ); - - % Pointer reset to arrow - % ---------------------- - set( hMainFig, 'Pointer', 'arrow' ); - - % Check for a writing pb to NetCDF - % must to be rewriting - % -------------------------------- - if error == -1 - warning(['NetCDF writing error:' fileName]); - end + + % fill or append header form + % ------------------------- + error = headerForm(hMainFig); + + % if user press continue button, ask for netcdf file + % ------------------------------------------------ + if error ~= -1 + [fileName, pathName, filterIndex] = uiputfile('*.nc', ... + 'Save file name'); + + % if user press cancel button, all var set to zero + % ------------------------------------------------ + if fileName == 0 + return; + end + + % Pointer set to watch during reading and plotting + % ------------------------------------------------ + set( hMainFig, 'Pointer', 'watch' ); + + % flushes the event queue and updates the closed uiputfile window + % --------------------------------------------------------------- + drawnow; + + % write netcdf file + % ----------------- + fileName = [pathName fileName]; + error = writeTSGDataNetCDF( hMainFig, fileName ); + + % Pointer reset to arrow + % ---------------------- + set( hMainFig, 'Pointer', 'arrow' ); + + % Check for a writing pb to NetCDF + % must to be rewriting + % -------------------------------- + if error == -1 + warning(['NetCDF writing error:' fileName]); end end + end + - - % ----------------------------------------------------------------- - function QuitMenuCallback(hObject, eventdata) +% ----------------------------------------------------------------- + function QuitMenuCallback(hObject, eventdata) % Callback function run when the Quit menu item is selected - - % If the data have been modified and not save, the program - % propose to save the data - % -------------------------------------------------------- - if strcmp( get( hSaveMenu, 'UserData' ), 'on') - selection = ... - questdlg('The file has been modified. Do you want to save it ?',... - 'Save before Quit?',... - 'Yes', 'No', 'Yes'); - if strcmp(selection, 'Yes') - return; - else - QuitProgram; - end - else - selection = ... - questdlg(['Quit ' get(hMainFig, 'Name') '?'],... - ['Quit ' get(hMainFig, 'Name') '?'],... - 'Yes', 'No', 'Yes'); - if strcmp(selection, 'No') - return; - else - QuitProgram; - end - end + % If the data have been modified and not save, the program + % propose to save the data + % -------------------------------------------------------- + if strcmp( get( hSaveMenu, 'UserData' ), 'on') + selection = ... + questdlg('The file has been modified. Do you want to save it ?',... + 'Save before Quit?',... + 'Yes', 'No', 'Yes'); + if strcmp(selection, 'Yes') + return; + else + QuitProgram; + end + else + selection = ... + questdlg(['Quit ' get(hMainFig, 'Name') '?'],... + ['Quit ' get(hMainFig, 'Name') '?'],... + 'Yes', 'No', 'Yes'); + if strcmp(selection, 'No') + return; + else + QuitProgram; + end end - - % ---------------------------------------------------------------- + + end + +% ---------------------------------------------------------------- function QuitProgram(hObject, eventdata) delete(hMainFig); - + % reset Matlab search path to default rmpath( [DEFAULT_PATH_FILE filesep 'tsg_util'] ); rmpath( [DEFAULT_PATH_FILE filesep 'tsg_data'] ); rmpath( [DEFAULT_PATH_FILE filesep 'tsg_io'] ); rehash; end - + end -- GitLab