ingo@359: package de.intevation.flys.exports; ingo@359: ingo@420: import java.awt.Color; ingo@420: ingo@359: import org.apache.log4j.Logger; ingo@359: ingo@375: import org.jfree.chart.JFreeChart; ingo@375: import org.jfree.chart.axis.NumberAxis; ingo@375: import org.jfree.chart.plot.XYPlot; ingo@420: import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer; ingo@414: import org.jfree.chart.title.TextTitle; ingo@369: import org.jfree.data.xy.XYSeries; ingo@369: import org.jfree.data.xy.XYSeriesCollection; ingo@364: ingo@359: import org.w3c.dom.Document; ingo@359: ingo@359: import de.intevation.artifacts.Artifact; ingo@359: ingo@364: import de.intevation.flys.artifacts.WINFOArtifact; ingo@364: import de.intevation.flys.artifacts.model.WQKms; ingo@364: ingo@359: ingo@359: /** ingo@359: * An OutGenerator that generates discharge curves. ingo@359: * ingo@359: * @author Ingo Weinzierl ingo@359: */ ingo@369: public class LongitudinalSectionGenerator extends XYChartGenerator { ingo@359: ingo@359: /** The logger that is used in this generator.*/ ingo@359: private static Logger logger = ingo@359: Logger.getLogger(LongitudinalSectionGenerator.class); ingo@359: ingo@359: ingo@369: public static final String LONGITUDINAL_SECTION_W = ingo@369: "longitudinal_section.w"; ingo@369: ingo@369: public static final String LONGITUDINAL_SECTION_Q = ingo@369: "longitudinal_section.q"; ingo@369: ingo@408: public static final String I18N_CHART_TITLE = ingo@408: "chart.longitudinal.section.title"; ingo@408: ingo@414: public static final String I18N_CHART_SUBTITLE = ingo@414: "chart.longitudinal.section.subtitle"; ingo@414: ingo@408: public static final String I18N_XAXIS_LABEL = ingo@408: "chart.longitudinal.section.xaxis.label"; ingo@408: ingo@408: public static final String I18N_YAXIS_LABEL = ingo@408: "chart.longitudinal.section.yaxis.label"; ingo@408: ingo@408: public static final String I18N_2YAXIS_LABEL = ingo@408: "chart.longitudinal.section.yaxis.second.label"; ingo@408: ingo@408: public static final String I18N_CHART_TITLE_DEFAULT = "W-Längsschnitt"; ingo@408: public static final String I18N_XAXIS_LABEL_DEFAULT = "km"; ingo@408: public static final String I18N_YAXIS_LABEL_DEFAULT = "W [NN + m]"; ingo@408: public static final String I18N_2YAXIS_LABEL_DEFAULT = "Q [m³/s]"; ingo@369: ingo@375: /** The storage for the W series to be drawn in this chart.*/ ingo@375: protected XYSeriesCollection w; ingo@375: ingo@375: /** The storage for the Q series to be drawn in this chart.*/ ingo@375: protected XYSeriesCollection q; ingo@364: ingo@364: ingo@359: public LongitudinalSectionGenerator() { ingo@359: super(); ingo@364: ingo@375: this.w = new XYSeriesCollection(); ingo@375: this.q = new XYSeriesCollection(); ingo@369: } ingo@369: ingo@369: ingo@369: protected String getChartTitle() { ingo@408: return msg(I18N_CHART_TITLE, I18N_CHART_TITLE_DEFAULT); ingo@369: } ingo@369: ingo@369: ingo@414: @Override ingo@414: protected void addSubtitles(JFreeChart chart) { ingo@414: double[] dist = getRange(); ingo@414: ingo@414: Object[] args = new Object[] { ingo@414: getRiverName(), ingo@414: dist[0], ingo@414: dist[1] 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@369: protected String getXAxisLabel() { ingo@408: return msg(I18N_XAXIS_LABEL, I18N_XAXIS_LABEL_DEFAULT); ingo@369: } ingo@369: ingo@369: ingo@369: protected String getYAxisLabel() { ingo@408: return msg(I18N_YAXIS_LABEL, I18N_YAXIS_LABEL_DEFAULT); ingo@369: } ingo@369: ingo@369: ingo@375: protected void addDatasets(JFreeChart chart) { ingo@375: XYPlot plot = (XYPlot) chart.getPlot(); ingo@375: ingo@375: plot.setDataset(0, w); ingo@375: plot.setDataset(1, q); ingo@375: } ingo@375: ingo@375: ingo@420: protected void adjustPlot(XYPlot plot) { ingo@420: super.adjustPlot(plot); ingo@420: ingo@420: // TODO REMOVE THIS CODE, IF WE HAVE INTRODUCED THEMES! ingo@420: XYLineAndShapeRenderer rw = (XYLineAndShapeRenderer) ingo@420: plot.getRendererForDataset(w); ingo@420: ingo@420: XYLineAndShapeRenderer rq = null; ingo@420: try { ingo@420: rq = (XYLineAndShapeRenderer) rw.clone(); ingo@420: } ingo@420: catch (Exception e) { ingo@420: logger.error(e, e); ingo@420: } ingo@420: ingo@420: int wNum = w.getSeriesCount(); ingo@420: int qNum = q.getSeriesCount(); ingo@420: ingo@420: for (int i = 0; i < wNum; i++) { ingo@420: rw.setSeriesPaint(i, Color.BLUE); ingo@420: } ingo@420: ingo@420: for (int i = 0; i < qNum; i++) { ingo@420: rq.setSeriesPaint(i, Color.GREEN); ingo@420: } ingo@420: ingo@420: plot.setRenderer(0, rw); ingo@420: plot.setRenderer(1, rq); ingo@420: } ingo@420: ingo@420: ingo@375: protected void adjustAxes(XYPlot plot) { ingo@375: super.adjustAxes(plot); ingo@375: ingo@408: NumberAxis qAxis = new NumberAxis( ingo@408: msg(I18N_2YAXIS_LABEL, I18N_2YAXIS_LABEL_DEFAULT)); ingo@375: ingo@375: plot.setRangeAxis(2, qAxis); ingo@375: plot.mapDatasetToRangeAxis(1, 2); ingo@359: } ingo@359: ingo@359: ingo@364: public void doOut(Artifact artifact, String facet, Document attr) { ingo@364: logger.debug("LongitudinalSectionGenerator.doOut: " + facet); ingo@359: ingo@369: if (facet == null) { ingo@369: logger.error("No facet name for doOut(). No output generated!"); ingo@369: return; ingo@369: } ingo@369: ingo@369: if (facet.equals(LONGITUDINAL_SECTION_W)) { ingo@369: doWOut(getWaterlevelData(artifact)); ingo@369: } ingo@369: else if (facet.equals(LONGITUDINAL_SECTION_Q)) { ingo@369: doQOut(getWaterlevelData(artifact)); ingo@369: } ingo@369: else { ingo@369: logger.warn("Unknown facet name: " + facet); ingo@369: return; ingo@369: } ingo@369: } ingo@369: ingo@369: ingo@369: /** ingo@369: * Returns the waterlevel data computed by the WINFOArtifact. ingo@369: * ingo@369: * @param artifact The WINFOArtifact. ingo@369: * ingo@369: * @return the computed waterlevel data. ingo@369: */ ingo@369: protected WQKms[] getWaterlevelData(Artifact artifact) { ingo@364: WINFOArtifact winfoArtifact = (WINFOArtifact) artifact; ingo@364: WQKms[] wqkms = winfoArtifact.getWaterlevelData(); ingo@364: ingo@364: logger.debug("Got " + wqkms.length + " WQKms objects."); ingo@369: ingo@369: return wqkms; ingo@359: } ingo@359: ingo@359: ingo@369: /** ingo@369: * Process the output for W facets in a longitudinal section curve. ingo@369: * ingo@369: * @param wqkms An array of WQKms values. ingo@369: */ ingo@369: protected void doWOut(WQKms[] wqkms) { ingo@369: logger.debug("LongitudinalSectionGenerator.doWOut"); ingo@359: ingo@369: int idx = 0; ingo@369: for (WQKms tmp: wqkms) { ingo@369: XYSeries series = new XYSeries(getSeriesName(tmp, "w", idx++)); ingo@369: ingo@369: double[] target = new double[3]; ingo@369: int size = tmp.size(); ingo@369: ingo@369: if (logger.isDebugEnabled()) { ingo@397: if (tmp.size() > 0) { ingo@397: logger.debug("Generate series: " + series.getKey()); ingo@397: logger.debug("Start km: " + tmp.getKms(0)); ingo@397: logger.debug("End km: " + tmp.getKms(size-1)); ingo@397: logger.debug("Values : " + size); ingo@397: } ingo@369: } ingo@369: ingo@369: for (int i = 0; i < size; i++) { ingo@369: target = tmp.get(i, target); ingo@369: ingo@369: series.add(target[2], target[0]); ingo@369: } ingo@369: ingo@375: w.addSeries(series); ingo@369: } ingo@369: } ingo@369: ingo@369: ingo@369: /** ingo@369: * Process the output for Q facets in a longitudinal section curve. ingo@369: * ingo@369: * @param wqkms An array of WQKms values. ingo@369: */ ingo@369: protected void doQOut(WQKms[] wqkms) { ingo@369: logger.debug("LongitudinalSectionGenerator.doQOut"); ingo@369: ingo@369: int idx = 0; ingo@369: for (WQKms tmp: wqkms) { ingo@369: XYSeries series = new XYSeries(getSeriesName(tmp, "Q", idx++)); ingo@369: ingo@369: double[] target = new double[3]; ingo@369: int size = tmp.size(); ingo@369: ingo@369: if (logger.isDebugEnabled()) { ingo@397: if (tmp.size() > 0) { ingo@397: logger.debug("Generate series: " + series.getKey()); ingo@397: logger.debug("Start km: " + tmp.getKms(0)); ingo@397: logger.debug("End km: " + tmp.getKms(size-1)); ingo@397: logger.debug("Values : " + size); ingo@397: } ingo@369: } ingo@369: ingo@369: for (int i = 0; i < size; i++) { ingo@369: target = tmp.get(i, target); ingo@369: sascha@382: //logger.debug("++ Q Tuple: " + target[2] + " -> " + target[1]); ingo@369: series.add(target[2], target[1]); ingo@369: } ingo@369: ingo@375: q.addSeries(series); ingo@369: } ingo@369: } ingo@369: ingo@369: ingo@369: protected String getSeriesName(WQKms wqkms, String prefix, int idx) { ingo@369: return prefix + "-" + idx; ingo@359: } ingo@359: } ingo@359: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :