teichmann@5863: /* Copyright (C) 2011, 2012, 2013 by Bundesanstalt für Gewässerkunde teichmann@5863: * Software engineering by Intevation GmbH teichmann@5863: * teichmann@5994: * This file is Free Software under the GNU AGPL (>=v3) teichmann@5863: * and comes with ABSOLUTELY NO WARRANTY! Check out the teichmann@5994: * documentation coming with Dive4Elements River for details. teichmann@5863: */ teichmann@5863: teichmann@5831: package org.dive4elements.river.exports.process; bjoern@4447: bjoern@4447: import org.apache.log4j.Logger; bjoern@4447: import org.jfree.data.xy.XYSeries; bjoern@4447: import org.w3c.dom.Document; bjoern@4447: teichmann@5831: import org.dive4elements.artifactdatabase.state.ArtifactAndFacet; teichmann@5831: import org.dive4elements.artifacts.CallContext; teichmann@5831: import org.dive4elements.river.artifacts.model.FacetTypes; teichmann@5831: import org.dive4elements.river.artifacts.model.WKms; teichmann@5831: import org.dive4elements.river.exports.StyledSeriesBuilder; teichmann@5831: import org.dive4elements.river.exports.XYChartGenerator; teichmann@5831: import org.dive4elements.river.jfree.StyledAreaSeriesCollection; teichmann@5831: import org.dive4elements.river.jfree.StyledXYSeries; teichmann@5831: import org.dive4elements.river.utils.DataUtil; teichmann@5831: import org.dive4elements.river.utils.ThemeUtil; bjoern@4447: bjoern@4447: /** felix@5800: * Add data to chart/generator. felix@5800: * bjoern@4447: * @author Björn Ricks bjoern@4447: */ bjoern@4447: public class WOutProcessor implements Processor { bjoern@4447: felix@5800: /** Private logger. */ bjoern@4447: private static final Logger logger = bjoern@4447: Logger.getLogger(WOutProcessor.class); bjoern@4447: bjoern@4447: @Override bjoern@4447: public void doOut( bjoern@4447: XYChartGenerator generator, felix@5341: ArtifactAndFacet aaf, felix@5341: Document theme, felix@5341: boolean visible, felix@5341: int index) bjoern@4447: { bjoern@4447: CallContext context = generator.getCallContext(); bjoern@4447: WKms wkms = (WKms) aaf.getData(context); bjoern@4447: bjoern@4447: logger.debug("doOut"); bjoern@4447: bjoern@4447: XYSeries series = new StyledXYSeries(aaf.getFacetDescription(), theme); bjoern@4447: bjoern@4447: StyledSeriesBuilder.addPoints(series, wkms); bjoern@4447: generator.addAxisSeries(series, index, visible); bjoern@4447: bjoern@4447: // If a "band around the curve shall be drawn, add according area. bjoern@4447: double bandWidth = ThemeUtil.parseBandWidth(theme); bjoern@4447: if (bandWidth > 0 ) { bjoern@4447: XYSeries seriesDown = new StyledXYSeries( bjoern@4447: "band " + aaf.getFacetDescription(), false, theme); bjoern@4447: XYSeries seriesUp = new StyledXYSeries( bjoern@4447: aaf.getFacetDescription()+"+/-"+bandWidth, false, theme); bjoern@4447: StyledSeriesBuilder.addUpperBand(seriesUp, wkms, bandWidth); bjoern@4447: StyledSeriesBuilder.addLowerBand(seriesDown, wkms, bandWidth); bjoern@4447: bjoern@4447: StyledAreaSeriesCollection area = new StyledAreaSeriesCollection(theme); bjoern@4447: area.addSeries(seriesUp); bjoern@4447: area.addSeries(seriesDown); bjoern@4447: area.setMode(StyledAreaSeriesCollection.FILL_MODE.BETWEEN); bjoern@4447: generator.addAreaSeries(area, index, visible); bjoern@4447: } bjoern@4447: aheinecke@6643: if (aaf.getFacetName().equals(FacetTypes.LONGITUDINAL_W) || aheinecke@6643: aaf.getFacetName().equals(FacetTypes.DISCHARGE_LONGITUDINAL_W) || aheinecke@6643: aaf.getFacetName().equals(FacetTypes.STATIC_WQKMS_W)) { aheinecke@6643: /* Only use W values to check if the diagram should be inverted aheinecke@6643: * see flys/issue1290 for details */ aheinecke@6643: invertAxis(generator, wkms); aheinecke@6643: } bjoern@4447: } bjoern@4447: bjoern@4447: /** felix@5341: * Returns true if facettype is longitutinal_section.w . bjoern@4447: */ bjoern@4447: @Override felix@5800: public boolean canHandle(String facetType) { felix@5800: if (facetType == null) { bjoern@4447: return false; bjoern@4447: } bjoern@4447: felix@5800: if (facetType.equals(FacetTypes.LONGITUDINAL_W) felix@5800: || facetType.equals(FacetTypes.STATIC_WKMS) felix@5800: || facetType.equals(FacetTypes.HEIGHTMARKS_POINTS) felix@5800: || facetType.equals(FacetTypes.STATIC_WQKMS) felix@5800: || facetType.equals(FacetTypes.STATIC_WQKMS_W) felix@5800: || facetType.equals(FacetTypes.DISCHARGE_LONGITUDINAL_W)) bjoern@4447: { bjoern@4447: return true; bjoern@4447: } bjoern@4447: return false; bjoern@4447: } bjoern@4447: bjoern@4447: /** bjoern@4447: * This method determines - taking JFreeCharts auto x value ordering into bjoern@4447: * account - if the x axis need to be inverted. Waterlines in these charts bjoern@4447: * should decrease. bjoern@4447: * bjoern@4447: * @param wkms The data object that stores the x and y values used for this bjoern@4447: * chart. bjoern@4447: */ bjoern@4447: public void invertAxis(XYChartGenerator generator, WKms wkms) { bjoern@4447: boolean wsUp = wkms.guessWaterIncreasing(); bjoern@4447: boolean kmUp = DataUtil.guessWaterIncreasing(wkms.allKms()); bjoern@4447: int size = wkms.size(); aheinecke@6635: boolean inv = ((wsUp && kmUp) || (!wsUp && !kmUp)) && size > 1; bjoern@4447: bjoern@4447: if (logger.isDebugEnabled()) { bjoern@4447: logger.debug("(Wkms)Values : " + size); bjoern@4447: if (size > 0) { bjoern@4447: logger.debug("Start km: " + wkms.getKm(0)); bjoern@4447: logger.debug("End km: " + wkms.getKm(size-1)); bjoern@4447: } bjoern@4447: logger.debug("wsUp: " + wsUp); bjoern@4447: logger.debug("kmUp: " + kmUp); aheinecke@6635: if (size == 1) { aheinecke@6635: logger.debug("InvertAxis not inverting because we have just one km"); aheinecke@6635: } bjoern@4447: logger.debug("inv: " + inv); bjoern@4447: } bjoern@4447: generator.setInverted(inv); bjoern@4447: } bjoern@4447: } felix@5341: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :