blob: 2767d9e04314736424e02eece273f6f8158e70b6 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2018 Agence spatiale canadienne / Canadian Space Agency
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Pierre Allard,
* Regent L'Archeveque - initial API and implementation
*
* SPDX-License-Identifier: EPL-1.0
*
*******************************************************************************/
package org.eclipse.apogy.core.environment.orbit.earth.ui.composites;
import java.awt.BasicStroke;
import java.awt.Color;
import org.eclipse.apogy.core.environment.orbit.earth.VisibilityPassSpacecraftPosition;
import org.eclipse.apogy.core.environment.orbit.earth.VisibilityPassSpacecraftPositionHistory;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Composite;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.xy.StandardXYItemRenderer;
import org.jfree.chart.renderer.xy.XYItemRenderer;
import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer;
import org.jfree.data.time.Millisecond;
import org.jfree.data.time.TimeSeries;
import org.jfree.data.time.TimeSeriesCollection;
import org.jfree.experimental.chart.swt.ChartComposite;
import org.jfree.ui.RectangleInsets;
public class VisibilityPassSpacecraftPositionHistoryRangeComposite extends Composite {
private VisibilityPassSpacecraftPositionHistory positionHistory = null;
private TimeSeriesCollection rangeDataSet = null;
private TimeSeriesCollection rangeRateDataSet = null;
private TimeSeries rangeTimeSeries = null;
private TimeSeries rangeRateTimeSeries = null;
private JFreeChart chart;
public VisibilityPassSpacecraftPositionHistoryRangeComposite(Composite parent, int style) {
super(parent, style);
setLayout(new FillLayout());
// Adds the chart parentComposite.
new ChartComposite(this, SWT.NONE, getChart(), true);
}
public VisibilityPassSpacecraftPositionHistory getPositionHistory() {
return this.positionHistory;
}
public void setPositionHistory(VisibilityPassSpacecraftPositionHistory positionHistory) {
// Clears current series.
getRangeTimeSeries().clear();
getRangeRateTimeSeries().clear();
this.positionHistory = positionHistory;
// Populates the series with the new data if applicable.
if (positionHistory != null) {
populateRangeTimeSeries(getRangeTimeSeries(), positionHistory);
populateRangeRateTimeSeries(getRangeRateTimeSeries(), positionHistory);
}
}
protected JFreeChart getChart() {
if (this.chart == null) {
String chartTitle = "Range and Range Rate vs Time";
String chartXAxisLabel = "Time (s)";
String chartYAxisLabel = "Range (km)";
this.chart = ChartFactory.createTimeSeriesChart(chartTitle, // title
chartXAxisLabel, // x-axis label
chartYAxisLabel, // y-axis label
getRangeDataSet(), // data set
true, // Generate legend
true, // generate tooltips
false // do not generate URLs.
);
this.chart.setBackgroundPaint(Color.white);
// Creates the Plot.
XYPlot plot = (XYPlot) this.chart.getPlot();
final NumberAxis axis2 = new NumberAxis("Range Rate (km/s)");
axis2.setAutoRangeIncludesZero(false);
plot.setRangeAxis(1, axis2);
plot.setDataset(1, getRangeRateDataSet());
plot.mapDatasetToRangeAxis(1, 1);
plot.setBackgroundPaint(Color.white);
plot.setDomainGridlinePaint(Color.black);
plot.setRangeGridlinePaint(Color.black);
plot.setAxisOffset(new RectangleInsets(5.0, 5.0, 5.0, 5.0));
plot.setDomainCrosshairVisible(true);
plot.setRangeCrosshairVisible(true);
plot.setDomainMinorGridlinesVisible(false);
plot.setRangeMinorGridlinesVisible(false);
plot.setDomainGridlinesVisible(true);
plot.setRangeGridlinesVisible(true);
XYItemRenderer xyItemRenderer = plot.getRenderer();
if (xyItemRenderer instanceof XYLineAndShapeRenderer) {
// Just draw lines, no shapes.
XYLineAndShapeRenderer renderer = (XYLineAndShapeRenderer) xyItemRenderer;
renderer.setBaseShapesVisible(false);
renderer.setBaseShapesFilled(false);
renderer.setSeriesStroke(0, new BasicStroke(2.0f));
renderer.setSeriesPaint(0, Color.BLUE);
}
final StandardXYItemRenderer renderer2 = new StandardXYItemRenderer();
renderer2.setSeriesPaint(0, Color.RED);
renderer2.setSeriesStroke(0, new BasicStroke(2.0f));
plot.setRenderer(1, renderer2);
plot.getRangeAxis().setAutoRange(true);
plot.getDomainAxis().setAutoRange(true);
}
return this.chart;
}
protected TimeSeriesCollection getRangeDataSet() {
if (this.rangeDataSet == null) {
this.rangeDataSet = new TimeSeriesCollection();
this.rangeDataSet.addSeries(getRangeTimeSeries());
}
return this.rangeDataSet;
}
protected TimeSeriesCollection getRangeRateDataSet() {
if (this.rangeRateDataSet == null) {
this.rangeRateDataSet = new TimeSeriesCollection();
this.rangeRateDataSet.addSeries(getRangeRateTimeSeries());
}
return this.rangeRateDataSet;
}
public TimeSeries getRangeTimeSeries() {
if (this.rangeTimeSeries == null) {
this.rangeTimeSeries = new TimeSeries("Range (km)");
if (getPositionHistory() != null) {
populateRangeTimeSeries(this.rangeTimeSeries, getPositionHistory());
}
}
return this.rangeTimeSeries;
}
public TimeSeries getRangeRateTimeSeries() {
if (this.rangeRateTimeSeries == null) {
this.rangeRateTimeSeries = new TimeSeries("Range Rate (km/s)");
if (getPositionHistory() != null) {
populateRangeRateTimeSeries(this.rangeRateTimeSeries, getPositionHistory());
}
}
return this.rangeRateTimeSeries;
}
protected void populateRangeTimeSeries(TimeSeries rangeTimeSeries,
VisibilityPassSpacecraftPositionHistory positionHistory) {
for (VisibilityPassSpacecraftPosition position : positionHistory.getPositions()) {
double rangeKM = position.getRange() * 0.001;
rangeTimeSeries.addOrUpdate(new Millisecond(position.getTime()), rangeKM);
}
}
protected void populateRangeRateTimeSeries(TimeSeries rangeRateTimeSeries,
VisibilityPassSpacecraftPositionHistory positionHistory) {
for (VisibilityPassSpacecraftPosition position : positionHistory.getPositions()) {
double rangeRateKMS = position.getRangeRate() * 0.001;
rangeRateTimeSeries.addOrUpdate(new Millisecond(position.getTime()), rangeRateKMS);
}
}
}