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: ingo@392: import de.intevation.artifacts.Artifact; ingo@392: ingo@695: import de.intevation.artifactdatabase.state.Facet; ingo@695: ingo@696: import de.intevation.flys.artifacts.FLYSArtifact; 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( ingo@1684: Artifact artifact, ingo@1684: Facet facet, ingo@1684: Document attr, ingo@1684: boolean visible ingo@1684: ) { felix@1081: String name = (facet != null) ? facet.getName() : null; 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: ingo@696: FLYSArtifact flys = (FLYSArtifact) artifact; ingo@696: Facet f = flys.getNativeFacet(facet); ingo@696: felix@1083: if (name.equals(COMPUTED_DISCHARGE_Q)) { ingo@1712: doQOut((WQKms) f.getData(artifact, context), facet, attr, visible); ingo@696: } felix@1901: else if (name.equals(STATIC_WQ)) { felix@1901: doWQOut(f.getData(artifact, context), facet, attr, visible); felix@1901: } felix@1915: else if (name.equals(STATIC_WQ_ANNOTATIONS)) { felix@1915: doWQAnnotations(f.getData(artifact, 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@1721: f.getData(artifact, context), facet, attr, visible); felix@1083: } felix@1921: else if (name.equals(STATIC_WKMS_INTERPOL)) { felix@1921: doWAnnotations(f.getData(artifact, 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@1901: 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@1931: addAxisSeries(series, 0, visible); felix@1901: } ingo@696: 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@1931: addAxisSeries(series, 0, 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@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 :