felix@4345: package de.intevation.flys.exports.extreme; felix@4345: felix@4345: import java.awt.Color; felix@4345: felix@4345: import org.apache.log4j.Logger; felix@4345: import org.jfree.chart.JFreeChart; felix@4345: import org.jfree.chart.plot.Marker; felix@4345: import org.jfree.chart.plot.ValueMarker; felix@4345: import org.jfree.chart.title.TextTitle; felix@4362: import org.jfree.data.xy.XYSeries; felix@4345: import org.w3c.dom.Document; felix@4345: felix@4345: import de.intevation.artifactdatabase.state.ArtifactAndFacet; felix@4345: import de.intevation.artifactdatabase.state.Facet; felix@4345: import de.intevation.flys.artifacts.access.FixAnalysisAccess; felix@4345: import de.intevation.flys.artifacts.model.DateRange; felix@4345: import de.intevation.flys.artifacts.model.FacetTypes; felix@4345: import de.intevation.flys.artifacts.model.extreme.Curve; felix@4345: import de.intevation.flys.artifacts.model.extreme.ExtremeCurveFacet; felix@4362: import de.intevation.flys.artifacts.resources.Resources; felix@4345: import de.intevation.flys.exports.fixings.FixWQCurveGenerator; felix@4362: import de.intevation.flys.exports.StyledSeriesBuilder; felix@4345: import de.intevation.flys.jfree.JFreeUtil; felix@4345: import de.intevation.flys.jfree.StyledXYSeries; felix@4345: felix@4390: import de.intevation.flys.utils.ThemeUtil; felix@4390: felix@4390: felix@4345: /** felix@4345: * Generator for WQ fixing charts. felix@4345: * @author Christian Lins felix@4345: */ felix@4345: public class ExtremeWQCurveGenerator felix@4345: extends FixWQCurveGenerator felix@4345: implements FacetTypes felix@4345: { felix@4345: /** Private logger. */ felix@4345: private static Logger logger = felix@4345: Logger.getLogger(ExtremeWQCurveGenerator.class); felix@4345: felix@4345: public static final String I18N_CHART_TITLE = felix@4345: "chart.extreme.wq.title"; felix@4345: felix@4345: public static final String I18N_CHART_SUBTITLE = felix@4345: "chart.extreme.wq.subtitle"; felix@4345: felix@4345: public static final String I18N_CHART_SUBTITLE1 = felix@4345: "chart.extreme.wq.subtitle1"; felix@4345: felix@4345: public static final String I18N_XAXIS_LABEL = felix@4345: "chart.extreme.wq.xaxis.label"; felix@4345: felix@4345: public static final String I18N_YAXIS_LABEL = felix@4345: "chart.extreme.wq.yaxis.label"; felix@4345: felix@4345: public static final String I18N_CHART_TITLE_DEFAULT = felix@4345: "Extremkurvenanalyse"; felix@4345: felix@4345: public static final String I18N_XAXIS_LABEL_DEFAULT = felix@4345: "Q [m\u00B3/s]"; felix@4345: felix@4345: public static final String I18N_YAXIS_LABEL_DEFAULT = felix@4345: "W [NN + m]"; felix@4345: felix@4345: felix@4362: @Override felix@4362: public boolean prepareChartData(ArtifactAndFacet aaf, Document theme, boolean visible) { felix@4362: if (!super.prepareChartData(aaf, theme, visible)) { felix@4362: String name = aaf.getFacetName(); felix@4362: if (name.equals(EXTREME_WQ_CURVE)) { felix@4362: doExtremeCurveOut(aaf, theme, visible); felix@4362: return true; felix@4362: } felix@4362: else if (name.equals(EXTREME_WQ_CURVE_BASE)) { felix@4362: doExtremeCurveBaseOut(aaf, theme, visible); felix@4362: return true; felix@4362: } felix@4362: return false; felix@4362: } felix@4362: return true; felix@4362: } felix@4345: felix@4362: /** Do Extreme Curve nonextrapolated points out. */ felix@4362: protected void doExtremeCurveBaseOut(ArtifactAndFacet aaf, Document theme, boolean visible) { felix@4362: logger.debug("doExtremeCurveBaseOut"); felix@4362: ExtremeCurveFacet facet = (ExtremeCurveFacet) aaf.getFacet(); felix@4362: Curve curve = (Curve) facet.getData(aaf.getArtifact(), context); felix@4362: if (curve == null) { felix@4410: logger.warn("doExtremeCurveBaseOut: Facet does not contain Curve"); felix@4345: return; felix@4345: } felix@4362: felix@4387: XYSeries qwseries = new StyledXYSeries(aaf.getFacetDescription(), theme); felix@4362: StyledSeriesBuilder.addPointsQW(qwseries, curve.getQs(), curve.getWs()); felix@4362: felix@4362: addAxisSeries(qwseries, YAXIS.W.idx, visible); felix@4345: } felix@4345: felix@4345: felix@4345: /** Do Extreme Curve out */ felix@4362: protected void doExtremeCurveOut(ArtifactAndFacet aaf, Document theme, boolean visible) { felix@4345: logger.debug("doExtremeCurveOut"); felix@4345: ExtremeCurveFacet facet = (ExtremeCurveFacet) aaf.getFacet(); felix@4345: Curve curve = (Curve) facet.getData(aaf.getArtifact(), context); felix@4345: if (curve == null) { felix@4345: logger.warn("doExtremeCurveOut: Facet does not contain Curve"); felix@4345: return; felix@4345: } felix@4345: felix@4345: double maxQ = curve.getSuggestedMaxQ(); felix@4345: if (maxQ == Double.MAX_VALUE) { felix@4345: maxQ = 8000; felix@4345: } felix@4345: felix@4345: StyledXYSeries series = JFreeUtil.sampleFunction2D( felix@4345: curve, felix@4362: theme, felix@4345: aaf.getFacetDescription(), felix@4345: 500, // number of samples felix@4345: 0.0 , // start felix@4345: maxQ); // end felix@4345: felix@4345: // Add marker from where on its extrapolated. felix@4390: if (ThemeUtil.parseShowExtraMark(theme)) { felix@4390: double[] qs = curve.getQs(); felix@4390: double extrapolateFrom = qs[qs.length-1]; felix@4345: felix@4390: Marker m = new ValueMarker(extrapolateFrom); felix@4390: m.setPaint(Color.black); felix@4390: addDomainMarker(m); felix@4390: } felix@4345: felix@4345: addAxisSeries(series, 0, visible); felix@4345: } felix@4345: felix@4362: felix@4345: @Override felix@4345: protected String getChartTitle() { felix@4345: return Resources.format( felix@4345: context.getMeta(), felix@4345: I18N_CHART_TITLE, felix@4345: I18N_CHART_TITLE_DEFAULT, felix@4345: context.getContextValue(CURRENT_KM)); felix@4345: } felix@4345: felix@4388: felix@4345: @Override felix@4345: protected String getDefaultChartTitle() { felix@4345: return msg(I18N_CHART_TITLE, I18N_CHART_TITLE_DEFAULT); felix@4345: } felix@4345: felix@4345: @Override felix@4345: protected String getDefaultChartSubtitle() { felix@4345: FixAnalysisAccess access = new FixAnalysisAccess(artifact); felix@4345: DateRange dateRange = access.getDateRange(); felix@4345: DateRange refRange = access.getReferencePeriod(); felix@4345: felix@4345: if (dateRange != null && refRange != null) { felix@4345: return Resources.format( felix@4345: context.getMeta(), felix@4345: I18N_CHART_SUBTITLE, felix@4345: "", felix@4345: access.getRiver(), felix@4345: dateRange.getFrom(), felix@4345: dateRange.getTo(), felix@4345: refRange.getFrom(), felix@4345: refRange.getTo()); felix@4345: } felix@4345: felix@4345: return null; felix@4345: } felix@4345: felix@4345: @Override felix@4345: protected void addSubtitles(JFreeChart chart) { felix@4345: String defaultSubtitle = getDefaultChartSubtitle(); felix@4345: felix@4345: if (defaultSubtitle == null || defaultSubtitle.length() == 0) { felix@4345: return; felix@4345: } felix@4345: felix@4345: chart.addSubtitle(new TextTitle(defaultSubtitle)); felix@4345: } felix@4345: felix@4345: @Override felix@4345: protected String getDefaultXAxisLabel() { felix@4345: return msg(I18N_XAXIS_LABEL, I18N_XAXIS_LABEL_DEFAULT); felix@4345: } felix@4345: felix@4345: @Override felix@4345: protected String getDefaultYAxisLabel(int pos) { felix@4345: return msg(I18N_YAXIS_LABEL, I18N_YAXIS_LABEL_DEFAULT); felix@4345: } felix@4345: } felix@4345: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :