Mercurial > dive4elements > river
view flys-artifacts/src/main/java/de/intevation/flys/exports/CrossSectionGenerator.java @ 3095:6ea299c208cd
Themes for fixing curves and debug output
flys-artifacts/trunk@4694 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author | Christian Lins <christian.lins@intevation.de> |
---|---|
date | Mon, 18 Jun 2012 14:37:10 +0000 |
parents | 5642a83420f2 |
children | d35f28655fa6 |
line wrap: on
line source
package de.intevation.flys.exports; import java.util.List; import java.text.NumberFormat; import org.apache.log4j.Logger; import org.jfree.chart.JFreeChart; import org.jfree.chart.title.TextTitle; import org.jfree.data.xy.XYSeries; import de.intevation.flys.jfree.FLYSAnnotation; import org.w3c.dom.Document; import de.intevation.artifacts.DataProvider; import de.intevation.artifactdatabase.state.ArtifactAndFacet; import de.intevation.flys.artifacts.model.FacetTypes; import de.intevation.flys.artifacts.model.CrossSectionFacet; import de.intevation.flys.jfree.StyledXYSeries; import de.intevation.flys.model.FastCrossSectionLine; import de.intevation.flys.artifacts.model.HYKFactory; import de.intevation.flys.geom.Lines; import de.intevation.flys.utils.ThemeUtil; import de.intevation.flys.utils.Formatter; /** * An OutGenerator that generates cross section graphs. */ public class CrossSectionGenerator extends LongitudinalSectionGenerator implements FacetTypes { /** The logger that is used in this generator. */ private static Logger logger = Logger.getLogger(CrossSectionGenerator.class); public static final String I18N_CHART_TITLE = "chart.cross_section.title"; public static final String I18N_CHART_SUBTITLE = "chart.cross_section.subtitle"; public static final String I18N_XAXIS_LABEL = "chart.cross_section.xaxis.label"; public static final String I18N_YAXIS_LABEL = "chart.cross_section.yaxis.label"; public static final String I18N_CHART_TITLE_DEFAULT = "Querprofildiagramm"; public static final String I18N_XAXIS_LABEL_DEFAULT = "Abstand [m]"; public static final String I18N_YAXIS_LABEL_DEFAULT = "W [NN + m]"; /** Trivial Constructor. */ public CrossSectionGenerator() { super(); } @Override protected YAxisWalker getYAxisWalker() { return new YAxisWalker() { @Override public int length() { return 1; } /** Get identifier for this index. */ @Override public String getId(int idx) { return "W"; } }; } /** * Get localized chart title. */ @Override public String getDefaultChartTitle() { Object[] i18n_msg_args = new Object[] { getRiverName() }; return msg(I18N_CHART_TITLE, I18N_CHART_TITLE_DEFAULT, i18n_msg_args); } /** Always return default subtitle. */ @Override protected String getChartSubtitle() { // XXX NOTE: overriding this method disables ChartSettings subtitle! // The default implementation of this method in ChartGenerator returns // the subtitle changed via the chart settings dialog. This method // always returns the subtitle containing river and km, NEVER the // ChartSettings subtitle! return getDefaultChartSubtitle(); } /** Get Charts default subtitle. */ @Override protected String getDefaultChartSubtitle() { List<DataProvider> providers = context.getDataProvider(CrossSectionFacet.BLACKBOARD_CS_MASTER_DATA); double km = 0d; if (providers.size() > 0) { FastCrossSectionLine csl = (FastCrossSectionLine) providers.get(0). provideData(CrossSectionFacet.BLACKBOARD_CS_MASTER_DATA, null, context); km = csl.getKm(); } Object[] args = new Object[] { getRiverName(), km }; return msg(I18N_CHART_SUBTITLE, "", args); } @Override protected void addSubtitles(JFreeChart chart) { String subtitle = getChartSubtitle(); chart.addSubtitle(new TextTitle(subtitle)); } @Override protected String getDefaultXAxisLabel() { return msg(I18N_XAXIS_LABEL, I18N_XAXIS_LABEL_DEFAULT); } @Override protected String getDefaultYAxisLabel(int pos) { return msg(I18N_YAXIS_LABEL, I18N_YAXIS_LABEL_DEFAULT); } /** * Let one facet do its job. */ public void doOut( ArtifactAndFacet artifactFacet, Document attr, boolean visible ) { String name = artifactFacet.getFacetName(); logger.debug("CrossSectionGenerator.doOut: " + name); if (name == null) { logger.error("No facet name for doOut(). No output generated!"); return; } if (name.equals(CROSS_SECTION)) { doCrossSectionOut( artifactFacet.getData(context), artifactFacet.getFacetDescription(), attr, visible); } else if (name.equals(CROSS_SECTION_WATER_LINE)) { doCrossSectionWaterLineOut( artifactFacet.getData(context), artifactFacet.getFacetDescription(), attr, visible); } else if (FacetTypes.IS.AREA(name)) { doArea(artifactFacet.getData(context), artifactFacet, attr, visible); } else if (name.equals(HYK)) { doHyk(artifactFacet.getData(context), artifactFacet.getFacetDescription(), attr, visible); } else if (FacetTypes.IS.MANUALPOINTS(name)) { doPoints(artifactFacet.getData(context), artifactFacet, attr, visible, YAXIS.W.idx); } else { logger.warn("CrossSection.doOut: Unknown facet name: " + name); return; } } /** Look up the axis identifier for a given facet type. */ public int axisIdxForFacet(String facetName) { // TODO Where to add thid axis too. return 0; } /** * Do cross sections waterline out. * * @param seriesName name of the data (line) to display in legend. * @param theme Theme for the data series. */ protected void doCrossSectionWaterLineOut( Object o, String seriesName, Document theme, boolean visible ) { logger.debug("CrossSectionGenerator.doCrossSectionWaterLineOut"); Lines.LineData lines = (Lines.LineData) o; // DO NOT SORT DATA! This destroys the gaps indicated by NaNs. StyledXYSeries series = new StyledXYSeries(seriesName, false, theme); if (ThemeUtil.parseShowWidth(theme)) { NumberFormat nf = nf = Formatter.getMeterFormat(this.context); series.setLabel(series.getLabel() + ", b=" + nf.format(lines.width) + "m"); } if (ThemeUtil.parseShowLevel(theme) && lines.points.length >0 && lines.points[1].length > 0) { NumberFormat nf = nf = Formatter.getMeterFormat(this.context); series.setLabel(series.getLabel() + ", W=" + nf.format(lines.points[1][0]) + "NN+m"); } if (ThemeUtil.parseShowMiddleHeight(theme) && lines.width != 0) { NumberFormat nf = nf = Formatter.getMeterFormat(this.context); series.setLabel(series.getLabel() + ",H=" + nf.format(lines.area / lines.width) + "m"); // : " + lines.area + "/" + lines.width); } StyledSeriesBuilder.addPoints(series, lines.points, false); addAxisSeries(series, 0, visible); } /** Add HYK-Annotations (colorize and label some areas, draw lines. */ protected void doHyk( Object o, String seriesName, Document theme, boolean visible ) { logger.debug("CrossSectionGenerator.doHyk"); List<HYKFactory.Zone> zones = (List<HYKFactory.Zone>) o; if (zones == null || zones.size() == 0) { logger.warn("CrossSectionGenerator.doHYK: empty zone list received."); return; } // Actual Styling is done in XYChartGenerator. if (visible) { addVisibleAnnotations(new FLYSAnnotation(seriesName, null, zones, theme)); } } /** * Do cross sections out. * * @param seriesName name of the data (line) to display in legend. * @param theme Theme for the data series. */ protected void doCrossSectionOut( Object o, String seriesName, Document theme, boolean visible ) { logger.debug("CrossSectionGenerator.doCrossSectionOut"); XYSeries series = new StyledXYSeries(seriesName, theme); StyledSeriesBuilder.addPoints(series, (double [][]) o, false); addAxisSeries(series, 0, visible); } /** * Creates a new <i>ChartSection</i>. * * @return a new <i>ChartSection</i>. */ @Override protected ChartSection buildChartSection() { ChartSection chartSection = new ChartSection(); chartSection.setTitle(getChartTitle()); chartSection.setDisplayGird(isGridVisible()); return chartSection; } } // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :