Skip to content
Snippets Groups Projects
Commit 87ae3ea2 authored by leprob001's avatar leprob001
Browse files

Added controller functions for the trajectory output window.

parent ccb6a420
No related branches found
No related tags found
No related merge requests found
Showing
with 377 additions and 0 deletions
function [] = buttonDeleteSelectedTrajectory(~, ~)
%DELETESELECTEDTRAJECTORY Summary of this function goes here
% Detailed explanation goes here
global artoaWorkspace;
%% Get data
error = false;
try
selectedRow = artoaWorkspace.trajectoryOutput.tableGeneratedTracksSelectedRow;
catch
error = true;
end
if isnan(selectedRow) || error
errordlg('No trajectory selected!', 'Selection error');
return;
end
%% Delete trajectory
artoaWorkspace.trajectoryOutput.trajectories{selectedRow} = [];
artoaWorkspace.trajectoryOutput.trajectories = ...
artoaWorkspace.trajectoryOutput.trajectories(~cellfun('isempty',artoaWorkspace.trajectoryOutput.trajectories));
%% Update table
artoa.controller.track.trajectoryOutput.updateTableGeneratedTracks();
%% Plot again
artoa.controller.track.trajectoryOutput.plot();
end
function [] = checkboxUpdateTrackParameterWindow(~, event)
%CHECKBOXUPDATETRACKPARAMETERWINDOW Summary of this function goes here
% Detailed explanation goes here
global artoaWorkspace;
artoaWorkspace.trajectoryOutput.updateTrackParameterWindow = logical(event.Source.Value);
end
function [] = clearTrajectoryPlot()
%CLEARTRAJECTORYPLOT Summary of this function goes here
% Detailed explanation goes here
global artoaGui;
%% Scatter sound sources
if artoa.data.hasMember(artoaGui, {'trajectoryOutput', 'scatterSoundsources'}) ...
& isvalid(artoaGui.trajectoryOutput.scatterSoundsources)
delete(artoaGui.trajectoryOutput.scatterSoundsources);
end
if artoa.data.hasMember(artoaGui, {'trajectoryOutput', 'textScatterSoundsources'}) ...
& isvalid(artoaGui.trajectoryOutput.textScatterSoundsources)
delete(artoaGui.trajectoryOutput.textScatterSoundsources);
end
%% Scatter sat data
if artoa.data.hasMember(artoaGui, {'trajectoryOutput', 'scatterFloatSatData'}) ...
& isvalid(artoaGui.trajectoryOutput.scatterFloatSatData)
delete(artoaGui.trajectoryOutput.scatterFloatSatData);
end
if artoa.data.hasMember(artoaGui, {'trajectoryOutput', 'textScatterFloatSatData'}) ...
& isvalid(artoaGui.trajectoryOutput.textScatterFloatSatData)
delete(artoaGui.trajectoryOutput.textScatterFloatSatData);
end
%% Trajectories
if artoa.data.hasMember(artoaGui, {'trajectoryOutput', 'trajectoryHandles'})
trajectories = artoaGui.trajectoryOutput.trajectoryHandles;
else
return;
end
for i = 1:length(trajectories)
fnames = fieldnames(trajectories{i});
for k = 1:length(fnames)
if isvalid(trajectories{i}.(fnames{k}))
delete(trajectories{i}.(fnames{k}));
end
end
end
end
function [ ] = close(~, ~)
%CLOSEREQ Cleans up all variables that are used by the trajectoryOutput GUI.
% Changes to the data are dropped.
global artoaGui;
%% Close the figure
try
delete(artoaGui.figures.trajectoryOutput);
catch
delete(gcf);
end
%% Clean up variables
try
artoaGui = rmfield(artoaGui, 'trajectoryOutput');
catch
end
try
artoaGui.figures = rmfield(artoaGui.figures, 'trajectoryOutput');
catch
end
% Workspace is not cleaned, because we need the values after closing the
% window
end
function [] = open()
%OPEN Initializes the trajectory output gui.
%
global artoaGui artoaWorkspace;
%% Check if the gui is already opened
if isfield(artoaGui.figures, 'trajectoryOutput')
figure(artoaGui.figures.trajectoryOutput);
artoa.controller.track.trajectoryOutput.updateTableGeneratedTracks();
return
end
%% Setup callbacks
callbacks = struct();
callbacks.CloseRequestFcn = @artoa.controller.track.trajectoryOutput.close;
callbacks.buttonDeleteSingle = @artoa.controller.track.trajectoryOutput.buttonDeleteSelectedTrajectory;
callbacks.buttonDeleteAll = '';
callbacks.checkboxMercator = '';
callbacks.checkboxTrackVisible = '';
callbacks.buttonTrackInfos = '';
callbacks.buttonVelocities = '';
callbacks.tableGeneratedTracksSelect = @artoa.controller.track.trajectoryOutput.tableGeneratedTracksSelect;
callbacks.checkboxUpdateTrackParameterWindow = @artoa.controller.track.trajectoryOutput.checkboxUpdateTrackParameterWindow;
%% Open the gui
artoa.gui.track.trajectoryOutput( ...
callbacks ...
);
%% Create workspace variables
if ~isfield(artoaWorkspace, 'trajectoryOutput')
artoaWorkspace.trajectoryOutput = struct();
artoaWorkspace.trajectoryOutput.updateTrackParameterWindow = false;
end
%% Update table of generated tracks
artoa.controller.track.trajectoryOutput.updateTableGeneratedTracks();
%% Update gui
artoaGui.trajectoryOutput.checkboxUpdateTrackParameterWindow.Value = ...
artoaWorkspace.trajectoryOutput.updateTrackParameterWindow;
%% Plot everything available
artoa.controller.track.trajectoryOutput.plot();
end
function [] = plot()
%PLOT Summary of this function goes here
% Detailed explanation goes here
global artoaGui artoaWorkspace;
%% Clear everything
artoa.controller.track.trajectoryOutput.clearTrajectoryPlot();
%% Plot sound sources
[ ...
artoaGui.trajectoryOutput.scatterSoundsources, ...
artoaGui.trajectoryOutput.textScatterSoundsources ...
] = artoa.soundsources.scatterPositions( ...
artoaGui.trajectoryOutput.axesTrajectoryOutput, ...
artoaWorkspace.filteredSoundsources ...
);
%% Plot float sat data
[ ...
artoaGui.trajectoryOutput.scatterFloatSatData, ...
artoaGui.trajectoryOutput.textScatterFloatSatData ...
] = artoa.float.scatterSatDataPositions( ...
artoaGui.trajectoryOutput.axesTrajectoryOutput, ...
artoaWorkspace.satData ...
);
%% Plot available trajectories
artoaGui.trajectoryOutput.trajectoryHandles = {};
if artoa.data.hasMember(artoaWorkspace, {'trajectoryOutput', 'trajectories'})
trajectories = artoaWorkspace.trajectoryOutput.trajectories;
else
trajectories = {};
end
for i = 1:length(trajectories)
% initialize handle container
artoaGui.trajectoryOutput.trajectoryHandles{i} = struct();
if trajectories{i}.hidden
continue;
end
% plot the trajectory itself
[artoaGui.trajectoryOutput.trajectoryHandles{i}.scatterPositions] = ...
artoa.controller.track.trajectoryOutput.plotTrajectory( ...
artoaGui.trajectoryOutput.axesTrajectoryOutput, ...
trajectories{i} ...
);
% plot trajectory reference point
[ ...
artoaGui.trajectoryOutput.trajectoryHandles{i}.scatterReferencePoints, ...
artoaGui.trajectoryOutput.trajectoryHandles{i}.textReferencePoints ...
] = artoa.trajectory.plotTrajectoryReferencePositions( ...
artoaGui.trajectoryOutput.axesTrajectoryOutput, ...
trajectories{i} ...
);
end
end
function [scatterHandle] = plotTrajectory(pAxesHandle, pTrajectory)
%PLOTTRAJECTORY Summary of this function goes here
% Detailed explanation goes here
%% Update track gui content
hold(pAxesHandle, 'on');
% plot trajectory positions
scatterHandle = ...
scatter( ...
pAxesHandle, ...
pTrajectory.longitude, ...
pTrajectory.latitude ...
);
hold(pAxesHandle, 'off');
end
function [] = tableGeneratedTracksSelect(~, event)
%TABLEGENERATEDTRACKSSELECT Summary of this function goes here
% Detailed explanation goes here
global artoaWorkspace;
%% Get data
try
selectedColumn = event.Indices(2);
selectedRow = event.Indices(1);
catch
artoaWorkspace.trajectoryOutput.tableGeneratedTracksSelectedRow = NaN;
artoaWorkspace.trajectoryOutput.tableGeneratedTracksSelectedColumn = NaN;
return;
end
%% Save to workspace
artoaWorkspace.trajectoryOutput.tableGeneratedTracksSelectedRow = selectedRow;
artoaWorkspace.trajectoryOutput.tableGeneratedTracksSelectedColumn = selectedColumn;
%% Check for hiding
if selectedColumn == 1
artoaWorkspace.trajectoryOutput.trajectories{selectedRow}.hidden = ...
~artoaWorkspace.trajectoryOutput.trajectories{selectedRow}.hidden;
% Update table
artoa.controller.track.trajectoryOutput.updateTableGeneratedTracks();
% Plot again
artoa.controller.track.trajectoryOutput.plot();
end
%% Replace track parameter
if artoaWorkspace.trajectoryOutput.updateTrackParameterWindow
artoaWorkspace.trackParameter = ...
artoaWorkspace.trajectoryOutput.trajectories{selectedRow}.trackParameter;
artoa.controller.track.parameter.updateGui();
end
end
function [] = updateTableGeneratedTracks()
%UPDATETABLEGENERATEDTRACKS Summary of this function goes here
% Detailed explanation goes here
global artoaGui artoaWorkspace;
%% Get required data and handles
if artoa.data.hasMember(artoaWorkspace, {'trajectoryOutput', 'trajectories'})
trajectories = artoaWorkspace.trajectoryOutput.trajectories;
else
return;
end
tableHandle = artoaGui.trajectoryOutput.tableTrackList;
%% Prepare cell for table
generatedTracks = {};
for i = 1:length(trajectories)
if trajectories{i}.hidden
generatedTracks{i, 1} = 'h';
else
generatedTracks{i, 1} = '';
end
generatedTracks{i, 2} = trajectories{i}.id;
generatedTracks{i, 3} = trajectories{i}.trackParameter.trackingMethodString;
end
tableHandle.Data = generatedTracks;
end
function [] = run(~, ~)
%RUN Summary of this function goes here
% Detailed explanation goes here
global artoaWorkspace artoaDataInput;
%% Validate soundsource table input
[success, message] = artoa.controller.track.parameter.validateCombinationsInput( ...
artoaWorkspace.trackParameter.soundsourceCombinations ...
);
if ~success
errordlg(message, 'Input error');
return;
end
%% Prepare variable if required
if ~artoa.data.hasMember(artoaWorkspace, {'trajectoryOutput', 'trajectories'})
artoaWorkspace.trajectoryOutput.trajectories = {};
end
%% Calculate and append track
trajectory = artoa.float.calculateTrajectory( ...
artoaWorkspace.float, ...
artoaWorkspace.toaData, ...
artoaWorkspace.filteredSoundsources, ...
artoaWorkspace.trackParameter, ...
artoaDataInput.ini.leapseconds ...
);
if trajectory == false
errordlg( [ ...
'The trajectory could not be calculated. ' ...
'Please check the inputs of the tracking parameter window and make sure ' ...
' the combinations you chose have applied TOAs!' ...
], ...
'Trajectory error' ...
);
return;
end
trajectoryObject = struct();
trajectoryObject.trackParameter = artoaWorkspace.trackParameter;
% trajectory contains [lat lon]
trajectoryObject.latitude = trajectory(:, 1);
trajectoryObject.longitude = trajectory(:, 2);
trajectoryObject.id = length(artoaWorkspace.trajectoryOutput.trajectories) + 1;
trajectoryObject.hidden = false;
% store to workspace
artoaWorkspace.trajectoryOutput.trajectories{end + 1} = trajectoryObject;
%% Open track gui
artoa.controller.track.trajectoryOutput.open();
%% Plot
artoa.controller.track.trajectoryOutput.plot();
%% Plot trajectory
%artoa.controller.track.trajectoryOutput.plotTrajectory(trajectory);
end
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment