# HG changeset patch # User Christian Lins # Date 1340973306 0 # Node ID abc2db63081523a67563644c8239c243a6f6d8ce # Parent a1a434c163a424ef3e5c5e32a674d3ae5a02387f Work in generalized annotations for chart generators flys-artifacts/trunk@4835 c6561f87-3c4e-4783-a992-168aeb5c3f6f diff -r a1a434c163a4 -r abc2db630815 flys-artifacts/ChangeLog --- a/flys-artifacts/ChangeLog Thu Jun 28 16:20:33 2012 +0000 +++ b/flys-artifacts/ChangeLog Fri Jun 29 12:35:06 2012 +0000 @@ -1,3 +1,13 @@ +2012-06-29 Christian Lins + + * src/main/java/de/intevation/flys/exports/CrossSectionGenerator.java, + src/main/java/de/intevation/flys/exports/TimeseriesChartGenerator.java, + src/main/java/de/intevation/flys/exports/ChartGenerator.java, + src/main/java/de/intevation/flys/exports/fixings/FixDeltaWtGenerator.java, + src/main/java/de/intevation/flys/exports/fixings/FixWQCurveGenerator.java, + src/main/java/de/intevation/flys/exports/XYChartGenerator.java: + Unfinished work on generalizing annotations in ChartGenerators. + 2012-06-28 Sascha L. Teichmann * src/main/java/de/intevation/flys/artifacts/access/FixationArtifactAccess.java: diff -r a1a434c163a4 -r abc2db630815 flys-artifacts/src/main/java/de/intevation/flys/exports/ChartGenerator.java --- a/flys-artifacts/src/main/java/de/intevation/flys/exports/ChartGenerator.java Thu Jun 28 16:20:33 2012 +0000 +++ b/flys-artifacts/src/main/java/de/intevation/flys/exports/ChartGenerator.java Fri Jun 29 12:35:06 2012 +0000 @@ -55,6 +55,7 @@ import de.intevation.flys.jfree.Bounds; import de.intevation.flys.jfree.DoubleBounds; import de.intevation.flys.jfree.EnhancedLineAndShapeRenderer; +import de.intevation.flys.jfree.FLYSAnnotation; import de.intevation.flys.jfree.StableXYDifferenceRenderer; import de.intevation.flys.jfree.StyledAreaSeriesCollection; import de.intevation.flys.jfree.Style; @@ -113,7 +114,8 @@ /** Map of datasets ("index"). */ protected SortedMap datasets; - + /** List of annotations to insert in plot. */ + protected List annotations; /** * A mini interface that allows to walk over the YAXIS enums defined in @@ -158,6 +160,17 @@ } + /** + * Adds annotations to list. The given annotation will be visible. + */ + public void addAnnotations(FLYSAnnotation annotation) { + if (annotations == null) { + annotations = new ArrayList(); + } + + annotations.add(annotation); + } + /** * This method needs to be implemented by concrete subclasses to create new diff -r a1a434c163a4 -r abc2db630815 flys-artifacts/src/main/java/de/intevation/flys/exports/CrossSectionGenerator.java --- a/flys-artifacts/src/main/java/de/intevation/flys/exports/CrossSectionGenerator.java Thu Jun 28 16:20:33 2012 +0000 +++ b/flys-artifacts/src/main/java/de/intevation/flys/exports/CrossSectionGenerator.java Fri Jun 29 12:35:06 2012 +0000 @@ -275,7 +275,7 @@ // Actual Styling is done in XYChartGenerator. if (visible) { - addVisibleAnnotations(new FLYSAnnotation(seriesName, null, zones, theme)); + addAnnotations(new FLYSAnnotation(seriesName, null, zones, theme)); } } diff -r a1a434c163a4 -r abc2db630815 flys-artifacts/src/main/java/de/intevation/flys/exports/TimeseriesChartGenerator.java --- a/flys-artifacts/src/main/java/de/intevation/flys/exports/TimeseriesChartGenerator.java Thu Jun 28 16:20:33 2012 +0000 +++ b/flys-artifacts/src/main/java/de/intevation/flys/exports/TimeseriesChartGenerator.java Fri Jun 29 12:35:06 2012 +0000 @@ -6,12 +6,15 @@ import de.intevation.flys.jfree.Bounds; import de.intevation.flys.jfree.CollisionFreeXYTextAnnotation; import de.intevation.flys.jfree.DoubleBounds; +import de.intevation.flys.jfree.StickyAxisAnnotation; import de.intevation.flys.jfree.FLYSAnnotation; import de.intevation.flys.jfree.StyledTimeSeries; import de.intevation.flys.jfree.TimeBounds; import de.intevation.flys.utils.ThemeAccess; +import de.intevation.flys.artifacts.model.HYKFactory; + import java.awt.BasicStroke; import java.awt.Color; import java.awt.Font; @@ -30,6 +33,8 @@ import org.jfree.chart.JFreeChart; import org.jfree.chart.LegendItemCollection; +import org.jfree.chart.annotations.XYBoxAnnotation; +import org.jfree.chart.annotations.XYLineAnnotation; import org.jfree.chart.annotations.XYTextAnnotation; import org.jfree.chart.axis.ValueAxis; @@ -614,11 +619,11 @@ /** Add annotations (Sticky, Text and hyk zones). */ - public void addAnnotationsToRenderer(XYPlot plot) { - logger.debug("XYChartGenerator.addAnnotationsToRenderer"); + /* public void addAnnotationsToRenderer(XYPlot plot) { + logger.debug("addAnnotationsToRenderer"); if (annotations == null) { - logger.debug("XYChartGenerator.addBoxAnnotations: no annotations."); + logger.debug("addAnnotationsToRenderer: no annotations."); return; } @@ -672,6 +677,124 @@ plot.getRenderer().addAnnotation(ta, org.jfree.ui.Layer.FOREGROUND); } } + }*/ + + /** + * Add the annotations (Sticky, Text and hyk zones) stored + * in the annotations field. + */ + public void addAnnotationsToRenderer(XYPlot plot) { + logger.debug("addAnnotationsToRenderer"); + + if (annotations == null) { + logger.debug("addAnnotationsToRenderer: no annotations."); + return; + } + + // Paints for the boxes/lines. + Stroke basicStroke = new BasicStroke(1.0f); + + Paint linePaint = new Color(255, 0,0,60); + Paint fillPaint = new Color(0, 255,0,60); + Paint tranPaint = new Color(0, 0,0, 0); + + // OPTMIMIZE: Pre-calculate positions + Area area = new Area( + plot.getDomainAxis(0).getRange(), + plot.getRangeAxis().getRange()); + + // Walk over all Annotation sets. + for (FLYSAnnotation fa: annotations) { + + // Access text styling, if any. + Document theme = fa.getTheme(); + ThemeAccess.TextStyle textStyle = null; + ThemeAccess.LineStyle lineStyle = null; + + // Get Themeing information and add legend item. + if (theme != null) { + ThemeAccess themeAccess = new ThemeAccess(theme); + textStyle = themeAccess.parseTextStyle(); + lineStyle = themeAccess.parseLineStyle(); + if (fa.getLabel() != null) { + LegendItemCollection lic = new LegendItemCollection(); + LegendItemCollection old = plot.getFixedLegendItems(); + lic.add(createLegendItem(theme, fa.getLabel())); + // (Re-)Add prior legend entries. + if (old != null) { + old.addAll(lic); + } + else { + old = lic; + } + plot.setFixedLegendItems(old); + } + } + + // The 'Sticky' Annotations (at axis, with line and text). + /* for (StickyAxisAnnotation sta: fa.getAxisTextAnnotations()) { + addStickyAnnotation( + sta, plot, area, lineStyle, textStyle, theme); + }*/ + + // Other Text Annotations (e.g. labels of manual points). + for (XYTextAnnotation ta: fa.getTextAnnotations()) { + // Style the text. + if (textStyle != null) { + textStyle.apply(ta); + } + ta.setY(area.above(0.05d, ta.getY())); + plot.getRenderer().addAnnotation(ta, org.jfree.ui.Layer.FOREGROUND); + } + + // Hyks. + for (HYKFactory.Zone zone: fa.getBoxes()) { + // For each zone, create a box to fill with color, a box to draw + // the lines and a text to display the type. + fillPaint = colorForHYKZone(zone.getName()); + + XYBoxAnnotation boxA = new XYBoxAnnotation(zone.getFrom(), area.atGround(), + zone.getTo(), area.ofGround(0.03f), basicStroke, tranPaint, fillPaint); + XYBoxAnnotation boxB = new XYBoxAnnotation(zone.getFrom(), area.atGround(), + zone.getTo(), area.atTop(), basicStroke, fillPaint, tranPaint); + + XYTextAnnotation tex = new XYTextAnnotation(zone.getName(), + zone.getFrom() + (zone.getTo() - zone.getFrom()) / 1.0d, + area.ofGround(0.015f)); + if (textStyle != null) { + textStyle.apply(tex); + } + + plot.getRenderer().addAnnotation(boxA, org.jfree.ui.Layer.BACKGROUND); + plot.getRenderer().addAnnotation(boxB, org.jfree.ui.Layer.BACKGROUND); + plot.getRenderer().addAnnotation(tex, org.jfree.ui.Layer.BACKGROUND); + } + } + } + + /** Get color for hyk zones by their type (which is the name). */ + public Paint colorForHYKZone(String zoneName) { + if (zoneName.startsWith("R")) { + // Brownish. + return new Color(153, 60, 0); + } + else if (zoneName.startsWith("V")) { + // Greenish. + return new Color(0, 255, 0); + } + else if (zoneName.startsWith("B")) { + // Grayish. + return new Color(128, 128, 128); + } + else if (zoneName.startsWith("H")) { + // Blueish. + return new Color(0, 0, 255); + } + else { + // Default. + logger.debug("Unknown zone type found."); + return new Color(255, 0, 0); + } } public void addDomainAxisMarker(XYPlot plot) { diff -r a1a434c163a4 -r abc2db630815 flys-artifacts/src/main/java/de/intevation/flys/exports/XYChartGenerator.java --- a/flys-artifacts/src/main/java/de/intevation/flys/exports/XYChartGenerator.java Thu Jun 28 16:20:33 2012 +0000 +++ b/flys-artifacts/src/main/java/de/intevation/flys/exports/XYChartGenerator.java Fri Jun 29 12:35:06 2012 +0000 @@ -188,9 +188,6 @@ /** The logger that is used in this generator. */ private static Logger logger = Logger.getLogger(XYChartGenerator.class); - /** List of annotations to insert in plot. */ - protected List annotations; - protected List domainMarkers = new ArrayList(); protected List valueMarkers = new ArrayList(); @@ -459,18 +456,6 @@ /** - * Adds annotations to list (if visible is true). - */ - public void addVisibleAnnotations(FLYSAnnotation annotation) { - if (annotations == null) { - annotations = new ArrayList(); - } - - annotations.add(annotation); - } - - - /** * If no data is visible, draw at least empty axis. */ private void recoverEmptyPlot(XYPlot plot) { @@ -1008,10 +993,10 @@ * in the annotations field. */ public void addAnnotationsToRenderer(XYPlot plot) { - logger.debug("XYChartGenerator.addAnnotationsToRenderer"); + logger.debug("addAnnotationsToRenderer"); if (annotations == null) { - logger.debug("XYChartGenerator.addAnnotationsToRenderer: no annotations."); + logger.debug("addAnnotationsToRenderer: no annotations."); return; } @@ -1083,7 +1068,7 @@ zone.getTo(), area.atTop(), basicStroke, fillPaint, tranPaint); XYTextAnnotation tex = new XYTextAnnotation(zone.getName(), - zone.getFrom() + (zone.getTo() - zone.getFrom()) / 2.0d, + zone.getFrom() + (zone.getTo() - zone.getFrom()) / 1.0d, area.ofGround(0.015f)); if (textStyle != null) { textStyle.apply(tex); @@ -1207,7 +1192,7 @@ } if (visible) { - addVisibleAnnotations(annotations); + addAnnotations(annotations); } } diff -r a1a434c163a4 -r abc2db630815 flys-artifacts/src/main/java/de/intevation/flys/exports/fixings/FixDeltaWtGenerator.java --- a/flys-artifacts/src/main/java/de/intevation/flys/exports/fixings/FixDeltaWtGenerator.java Thu Jun 28 16:20:33 2012 +0000 +++ b/flys-artifacts/src/main/java/de/intevation/flys/exports/fixings/FixDeltaWtGenerator.java Fri Jun 29 12:35:06 2012 +0000 @@ -16,6 +16,8 @@ import de.intevation.flys.exports.TimeseriesChartGenerator; +import de.intevation.flys.jfree.CollisionFreeXYTextAnnotation; +import de.intevation.flys.jfree.FLYSAnnotation; import de.intevation.flys.jfree.StyledTimeSeries; import de.intevation.flys.utils.FLYSUtils; @@ -25,12 +27,20 @@ import java.io.OutputStream; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; + import javax.xml.xpath.XPathConstants; import org.apache.log4j.Logger; import org.jfree.chart.JFreeChart; +import org.jfree.chart.annotations.XYTextAnnotation; + import org.jfree.chart.plot.IntervalMarker; import org.jfree.chart.plot.ValueMarker; @@ -246,10 +256,20 @@ TimeSeries interpol = new StyledTimeSeries(desc + "interpol", theme); if (qwds == null) { + logger.debug("doAnalysisEventsOut: qwds == null"); return; } + + if (qwds.length == 0) { + logger.debug("doAnalysisEventsOut: qwds.length == 0"); + return; + } + + Map annoIdxMap = new HashMap(); + for (int i = 0; i < qwds.length; i++) { if (qwds[i] == null) { + logger.debug("doAnalysisEventsOut: qwds[" + i + "] == null"); continue; } RegularTimePeriod rtp = new Day(qwds[i].getDate()); @@ -259,6 +279,9 @@ interpol.add(rtp, value); } else { + annoIdxMap.put( + i, + new int[]{series.getItemCount(), tsc.getSeriesCount()}); series.add(rtp, value); } } @@ -267,6 +290,30 @@ addAxisDataset(tsc, 0, visible); addAttribute(desc + "interpol", "interpolate"); addAttribute(desc, "outline"); + + doQWDTextAnnotations(annoIdxMap, tsc, qwds, theme, visible); + } + + + protected void doQWDTextAnnotations(Map annoIdxMap, + TimeSeriesCollection tsc, QWD[] qwds, Document theme, boolean visible) { + List textAnnos = new ArrayList(); + Set> entries = annoIdxMap.entrySet(); + for(Map.Entry entry : entries) { + QWD qwd = qwds[entry.getKey()]; + int[] idxs = entry.getValue(); + double x = tsc.getXValue(idxs[0], idxs[1]); + XYTextAnnotation anno = new CollisionFreeXYTextAnnotation( + qwd.getQ() + " m\u00B3/s", + x, + qwd.getDeltaW()); + textAnnos.add(anno); + logger.debug("annotation: " + x + "/" + qwd.getDeltaW()); + } + + FLYSAnnotation flysAnno = new FLYSAnnotation(null, null, null, theme); + flysAnno.setTextAnnotations(textAnnos); + addAnnotations(flysAnno, visible); } @@ -288,6 +335,9 @@ if (qwds == null) { return; } + + Map annoIdxMap = new HashMap(); + for (int i = 0; i < qwds.length; i++) { if (qwds[i] == null) { continue; @@ -299,8 +349,12 @@ interpol.addOrUpdate(rtp, value); } else { + annoIdxMap.put( + i, + new int[]{series.getItemCount(), tsc.getSeriesCount()}); series.addOrUpdate(rtp, value); } + } tsc.addSeries(series); tsc.addSeries(interpol); @@ -308,6 +362,8 @@ addAxisDataset(tsc, 0, visible); addAttribute(desc + "interpol", "interpolate"); addAttribute(desc, "outline"); + + //doQWDTextAnnotations(annoIdxMap, tsc, qwds, theme, visible); } diff -r a1a434c163a4 -r abc2db630815 flys-artifacts/src/main/java/de/intevation/flys/exports/fixings/FixWQCurveGenerator.java --- a/flys-artifacts/src/main/java/de/intevation/flys/exports/fixings/FixWQCurveGenerator.java Thu Jun 28 16:20:33 2012 +0000 +++ b/flys-artifacts/src/main/java/de/intevation/flys/exports/fixings/FixWQCurveGenerator.java Fri Jun 29 12:35:06 2012 +0000 @@ -179,15 +179,14 @@ dateFormat.format(qw.getDate()), qw.getQ(), qw.getW()); - //anno.setRotationAngle(0); textAnnos.add(anno); } - FLYSAnnotation flysAnno = new FLYSAnnotation(null, null, null, doc); - flysAnno.setTextAnnotations(textAnnos); addAxisSeries(series, 0, visible); if(visible) { - addVisibleAnnotations(flysAnno); + FLYSAnnotation flysAnno = new FLYSAnnotation(null, null, null, doc); + flysAnno.setTextAnnotations(textAnnos); + addAnnotations(flysAnno); } } }