ingo@392: package de.intevation.flys.exports;
ingo@1679:
felix@1915: import java.util.List;
felix@1915: import java.util.ArrayList;
felix@1915:
ingo@392: import org.apache.log4j.Logger;
ingo@392:
ingo@392: import org.w3c.dom.Document;
ingo@392:
felix@1915: import org.jfree.chart.annotations.XYTextAnnotation;
felix@1915:
ingo@414: import org.jfree.chart.JFreeChart;
ingo@414: import org.jfree.chart.title.TextTitle;
ingo@923: import org.jfree.data.xy.XYSeries;
ingo@414:
felix@1944: import de.intevation.artifactdatabase.state.ArtifactAndFacet;
ingo@695: import de.intevation.artifactdatabase.state.Facet;
ingo@695:
ingo@696: import de.intevation.flys.artifacts.model.FacetTypes;
ingo@393: import de.intevation.flys.artifacts.model.WQKms;
felix@1085:
felix@1850: import de.intevation.flys.jfree.FLYSAnnotation;
felix@1915: import de.intevation.flys.jfree.StickyAxisAnnotation;
felix@1850:
ingo@392:
ingo@392: /**
ingo@392: * An OutGenerator that generates discharge curves.
ingo@392: *
ingo@392: * @author Ingo Weinzierl
ingo@392: */
ingo@696: public class ComputedDischargeCurveGenerator
ingo@696: extends DischargeCurveGenerator
ingo@696: implements FacetTypes
ingo@696: {
felix@1081: /** The logger used in this generator. */
ingo@392: private static Logger logger =
ingo@392: Logger.getLogger(ComputedDischargeCurveGenerator.class);
ingo@392:
ingo@408: public static final String I18N_CHART_TITLE =
ingo@408: "chart.computed.discharge.curve.title";
ingo@408:
ingo@414: public static final String I18N_CHART_SUBTITLE =
ingo@414: "chart.computed.discharge.curve.subtitle";
ingo@414:
ingo@408: public static final String I18N_YAXIS_LABEL =
ingo@408: "chart.computed.discharge.curve.yaxis.label";
ingo@408:
ingo@408: public static final String I18N_CHART_TITLE_DEFAULT = "Abflusskurve";
ingo@408: public static final String I18N_YAXIS_LABEL_DEFAULT = "W [NN + m]";
felix@1092: public static final String I18N_MAINVALUES_Q_LABEL = "Q (Haupt- und Extremwerte)";
felix@1092: public static final String I18N_MAINVALUES_W_LABEL = "W (Haupt- und Extremwerte)";
ingo@408:
felix@1083:
felix@1083: /** Trivial Constructor. */
felix@1083: public ComputedDischargeCurveGenerator () {
felix@1083: super();
felix@1083: }
felix@1083:
ingo@408:
ingo@392: @Override
ingo@400: protected String getChartTitle() {
ingo@408: return msg(I18N_CHART_TITLE, I18N_CHART_TITLE_DEFAULT);
ingo@400: }
ingo@400:
ingo@400:
ingo@400: @Override
ingo@414: protected void addSubtitles(JFreeChart chart) {
felix@1113: double[] dist = getRange();
ingo@414:
ingo@414: Object[] args = new Object[] {
ingo@414: getRiverName(),
ingo@414: dist[0]
ingo@414: };
ingo@414:
ingo@414: String subtitle = msg(I18N_CHART_SUBTITLE, "", args);
ingo@414: chart.addSubtitle(new TextTitle(subtitle));
ingo@414: }
ingo@414:
ingo@414:
ingo@414: @Override
ingo@400: protected String getYAxisLabel() {
ingo@408: return msg(I18N_YAXIS_LABEL, I18N_YAXIS_LABEL_DEFAULT);
ingo@400: }
ingo@400:
ingo@400:
ingo@400: @Override
ingo@1684: public void doOut(
felix@1944: ArtifactAndFacet artifactFacet,
felix@1944: Document attr,
felix@1944: boolean visible
ingo@1684: ) {
felix@1944: String name = artifactFacet.getFacetName();
ingo@393:
ingo@696: logger.debug("ComputedDischargeCurveGenerator.doOut: " + name);
ingo@393:
felix@1085: if (name == null) {
felix@1085: logger.warn("Broken facet in computed discharge out generation.");
felix@1085: return;
felix@1085: }
felix@1085:
felix@1944: Facet facet = artifactFacet.getFacet();
ingo@696:
felix@1083: if (name.equals(COMPUTED_DISCHARGE_Q)) {
felix@1944: doQOut((WQKms) artifactFacet.getData(context), facet, attr, visible);
ingo@696: }
felix@1901: else if (name.equals(STATIC_WQ)) {
felix@1944: doWQOut(artifactFacet.getData(context), facet, attr, visible);
felix@1901: }
felix@1915: else if (name.equals(STATIC_WQ_ANNOTATIONS)) {
felix@1944: doWQAnnotations(artifactFacet.getData(context), facet, attr, visible);
felix@1915: }
felix@1812: else if (name.equals(COMPUTED_DISCHARGE_MAINVALUES_Q)
felix@1850: || name.equals(MAINVALUES_Q)
felix@1850: || name.equals(COMPUTED_DISCHARGE_MAINVALUES_W)
felix@1850: || name.equals(MAINVALUES_W)
felix@1850: ) {
felix@1850: doAnnotations((FLYSAnnotation)
felix@1944: artifactFacet.getData(context), facet, attr, visible);
felix@1083: }
felix@1921: else if (name.equals(STATIC_WKMS_INTERPOL)) {
felix@1944: doWAnnotations(artifactFacet.getData(context), facet, attr, visible);
felix@1921: }
ingo@696: else {
ingo@696: logger.warn("Unknown facet type for computed discharge: " + name);
ingo@696: return;
ingo@696: }
ingo@696: }
ingo@696:
felix@1901: /**
felix@1901: * Add WQ Data to plot.
felix@1901: */
felix@1901: protected void doWQOut(
felix@1944: Object wqkms,
felix@1901: Facet facet,
felix@1901: Document theme,
felix@1901: boolean visible
felix@1901: ) {
felix@1901: double [][] data = (double [][]) wqkms;
felix@1901:
felix@1901: XYSeries series = new StyledXYSeries(facet.getDescription(), theme);
felix@1901: StyledSeriesBuilder.addPoints(series, data);
felix@1902:
felix@1933: addAxisSeries(series, YAXIS.W.idx, visible);
felix@1901: }
ingo@696:
felix@1944:
felix@1083: /**
felix@1083: * Add Q-Series to plot.
felix@1083: * @param wqkms actual data
felix@1083: * @param theme theme to use.
felix@1083: */
ingo@1712: protected void doQOut(
ingo@1712: WQKms wqkms,
ingo@1712: Facet facet,
ingo@1712: Document theme,
ingo@1712: boolean visible
ingo@1712: ) {
ingo@1712: XYSeries series = new StyledXYSeries(facet.getDescription(), theme);
felix@1902: StyledSeriesBuilder.addPointsQW(series, wqkms);
ingo@393:
felix@1933: addAxisSeries(series, YAXIS.W.idx, visible);
ingo@393: }
felix@1915:
felix@1915:
felix@1915: /**
felix@1915: * Add WQ-Annotations to plot.
felix@1915: * @param wqkms actual data
felix@1915: * @param theme theme to use.
felix@1915: */
felix@1915: protected void doWQAnnotations(
felix@1915: Object wqkms,
felix@1915: Facet facet,
felix@1915: Document theme,
felix@1915: boolean visible
felix@1915: ) {
felix@1915: List xy = new ArrayList();
felix@1915: double [][] data = (double [][]) wqkms;
felix@1915: for (int i = 0; i< data[0].length; i++) {
felix@1915: xy.add(new StickyAxisAnnotation(facet.getDescription(),
felix@1915: (float) data[0][i], StickyAxisAnnotation.SimpleAxis.X_AXIS));
felix@1915: xy.add(new StickyAxisAnnotation(facet.getDescription(),
felix@1915: (float) data[1][i], StickyAxisAnnotation.SimpleAxis.Y_AXIS));
felix@1915: }
felix@1915:
felix@1915: doAnnotations(new FLYSAnnotation(facet.getDescription(), xy),
felix@1915: facet, theme, visible);
felix@1915: }
felix@1921:
felix@1944:
felix@1921: /**
felix@1921: * Add W-Annotations to plot.
felix@1921: * @param wqkms actual data
felix@1921: * @param theme theme to use.
felix@1921: */
felix@1921: protected void doWAnnotations(
felix@1921: Object wqkms,
felix@1921: Facet facet,
felix@1921: Document theme,
felix@1921: boolean visible
felix@1921: ) {
felix@1921: List xy = new ArrayList();
felix@1921: double [][] data = (double [][]) wqkms;
felix@1921: for (int i = 0; i< data[0].length; i++) {
felix@1921: xy.add(new StickyAxisAnnotation(facet.getDescription(),
felix@1921: (float) data[1][i], StickyAxisAnnotation.SimpleAxis.Y_AXIS));
felix@1921: }
felix@1921:
felix@1921: doAnnotations(new FLYSAnnotation(facet.getDescription(), xy),
felix@1921: facet, theme, visible);
felix@1921: }
ingo@392: }
ingo@392: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :