rrenkert@8206: package org.dive4elements.river.exports.process; rrenkert@8206: rrenkert@8206: import java.awt.BasicStroke; rrenkert@8206: import java.awt.Color; rrenkert@8206: import java.text.DateFormat; rrenkert@8206: import java.util.ArrayList; rrenkert@8206: import java.util.List; rrenkert@8206: rrenkert@8206: import org.apache.log4j.Logger; rrenkert@8206: import org.dive4elements.artifactdatabase.state.ArtifactAndFacet; rrenkert@8206: import org.dive4elements.river.artifacts.model.FacetTypes; rrenkert@8206: import org.dive4elements.river.artifacts.model.NamedDouble; rrenkert@8206: import org.dive4elements.river.artifacts.model.QWDDateRange; rrenkert@8206: import org.dive4elements.river.artifacts.model.WQKms; rrenkert@8206: import org.dive4elements.river.artifacts.model.fixings.FixFunction; rrenkert@8206: import org.dive4elements.river.artifacts.model.fixings.FixWQCurveFacet; rrenkert@8206: import org.dive4elements.river.artifacts.model.fixings.QWD; rrenkert@8206: import org.dive4elements.river.artifacts.model.fixings.QWI; rrenkert@8206: import org.dive4elements.river.exports.DiagramGenerator; rrenkert@8206: import org.dive4elements.river.exports.StyledSeriesBuilder; rrenkert@8206: import org.dive4elements.river.exports.fixings.FixChartGenerator; rrenkert@8206: import org.dive4elements.river.exports.fixings.FixWQCurveGenerator; rrenkert@8206: import org.dive4elements.river.java2d.ShapeUtils; rrenkert@8206: import org.dive4elements.river.jfree.CollisionFreeXYTextAnnotation; rrenkert@8206: import org.dive4elements.river.jfree.JFreeUtil; rrenkert@8206: import org.dive4elements.river.jfree.RiverAnnotation; rrenkert@8206: import org.dive4elements.river.jfree.StickyAxisAnnotation; rrenkert@8206: import org.dive4elements.river.jfree.StyledXYSeries; rrenkert@8206: import org.dive4elements.river.themes.ThemeDocument; rrenkert@8206: import org.jfree.chart.annotations.XYTextAnnotation; rrenkert@8206: import org.jfree.chart.plot.Marker; rrenkert@8206: import org.jfree.chart.plot.ValueMarker; rrenkert@8206: import org.jfree.data.xy.XYSeries; rrenkert@8206: import org.jfree.ui.RectangleAnchor; rrenkert@8206: import org.jfree.ui.RectangleInsets; rrenkert@8206: import org.jfree.ui.TextAnchor; rrenkert@8206: rrenkert@8206: rrenkert@8206: public class FixWQProcessor rrenkert@8206: extends DefaultProcessor rrenkert@8206: implements FacetTypes rrenkert@8206: { rrenkert@8206: rrenkert@8206: private static Logger logger = Logger.getLogger(FixWQProcessor.class); rrenkert@8206: rrenkert@8206: public FixWQProcessor() { rrenkert@8206: } rrenkert@8206: rrenkert@8206: @Override rrenkert@8206: public void doOut( rrenkert@8206: DiagramGenerator generator, rrenkert@8206: ArtifactAndFacet bundle, rrenkert@8206: ThemeDocument theme, rrenkert@8206: boolean visible rrenkert@8206: ) { rrenkert@8206: // TODO: Simplyfy this processor and move general facets/data to rrenkert@8206: // MiscDischargeProcessor or something... rrenkert@8206: String facetType = bundle.getFacetName(); rrenkert@8206: logger.debug("facet: " + facetType + " name: " + bundle.getFacetDescription()); rrenkert@8206: if(facetType.startsWith(FIX_SECTOR_AVERAGE_WQ)) { rrenkert@8206: doSectorAverageOut(generator, bundle, theme, visible); rrenkert@8206: } rrenkert@8206: else if(FIX_ANALYSIS_EVENTS_WQ.equals(facetType) rrenkert@8206: || FIX_REFERENCE_EVENTS_WQ.equals(facetType) rrenkert@8206: || FIX_EVENTS.equals(facetType)) { rrenkert@8206: doEventsOut(generator, bundle, theme, visible); rrenkert@8206: } rrenkert@8206: else if(FIX_WQ_CURVE.equals(facetType)) { rrenkert@8206: doWQCurveOut(generator, bundle, theme, visible); rrenkert@8206: } rrenkert@8206: else if(FIX_OUTLIER.equals(facetType)) { rrenkert@8206: doOutlierOut(generator, bundle, theme, visible); rrenkert@8206: } rrenkert@8206: else if(QSECTOR.equals(facetType)) { rrenkert@8206: doQSectorOut(generator, bundle, theme, visible); rrenkert@8206: } rrenkert@8206: else if(STATIC_WKMS_MARKS.equals(facetType) || rrenkert@8206: STATIC_WKMS.equals(facetType) || rrenkert@8206: HEIGHTMARKS_POINTS.equals(facetType) ) { rrenkert@8206: doWAnnotations(generator, bundle, theme, visible); rrenkert@8206: } rrenkert@8206: else if (LONGITUDINAL_W.equals(facetType) rrenkert@8206: || STATIC_WKMS_INTERPOL.equals(facetType) rrenkert@8206: || FIX_WQ_LS.equals(facetType)) { rrenkert@8206: doWQOut(generator, bundle, theme, visible); rrenkert@8206: } rrenkert@8206: } rrenkert@8206: rrenkert@8206: /** Add sector average points to chart. */ rrenkert@8206: protected void doSectorAverageOut( rrenkert@8206: DiagramGenerator generator, rrenkert@8206: ArtifactAndFacet bundle, rrenkert@8206: ThemeDocument theme, rrenkert@8206: boolean visible rrenkert@8206: ) { rrenkert@8206: logger.debug("doSectorAverageOut"); rrenkert@8206: QWDDateRange qwdd = (QWDDateRange)bundle.getData(generator.getCallContext()); rrenkert@8206: QWD qwd = qwdd != null ? qwdd.getQWD() : null; rrenkert@8206: rrenkert@8206: if(qwd != null) { rrenkert@8206: XYSeries series = new StyledXYSeries( rrenkert@8206: bundle.getFacetDescription(), rrenkert@8206: false, true, rrenkert@8206: theme); rrenkert@8206: DateFormat dateFormat = DateFormat.getDateInstance( rrenkert@8206: DateFormat.SHORT); rrenkert@8206: rrenkert@8206: //TODO: W in cm at Gauge!!! rrenkert@8206: series.add(qwd.getQ(), qwd.getW(), false); rrenkert@8206: rrenkert@8206: XYTextAnnotation anno = new CollisionFreeXYTextAnnotation( rrenkert@8206: dateFormat.format(qwd.getDate()), rrenkert@8206: qwd.getQ(), rrenkert@8206: qwd.getW()); rrenkert@8206: List annos = new ArrayList(); rrenkert@8206: annos.add(anno); rrenkert@8206: generator.addAxisSeries(series, axisName, visible); rrenkert@8206: rrenkert@8206: if (visible && theme != null && theme.parseShowPointLabel()) { rrenkert@8206: RiverAnnotation flysAnno = rrenkert@8206: new RiverAnnotation(null, null, null, theme); rrenkert@8206: flysAnno.setTextAnnotations(annos); rrenkert@8206: generator.addAnnotations(flysAnno); rrenkert@8206: } rrenkert@8206: } rrenkert@8206: else { rrenkert@8206: logger.debug("doSectorAverageOut: qwd == null"); rrenkert@8206: } rrenkert@8206: } rrenkert@8206: rrenkert@8206: rrenkert@8206: /** Add analysis event points to chart. */ rrenkert@8206: protected void doEventsOut( rrenkert@8206: DiagramGenerator generator, rrenkert@8206: ArtifactAndFacet bundle, rrenkert@8206: ThemeDocument theme, rrenkert@8206: boolean visible rrenkert@8206: ) { rrenkert@8206: logger.debug("doAnalysisEventsOut"); rrenkert@8206: rrenkert@8206: QWD qwd = (QWD)bundle.getData(generator.getCallContext()); rrenkert@8206: rrenkert@8206: if (qwd == null) { rrenkert@8206: logger.debug("doAnalysisEventsOut: qwd == null"); rrenkert@8206: return; rrenkert@8206: } rrenkert@8206: // TODO: W in cm at Gauge!!! rrenkert@8206: //double gaugeDatum = getCurrentGaugeDatum(); rrenkert@8206: //boolean atGauge = gaugeDatum != 0d; rrenkert@8206: rrenkert@8206: //double factor = atGauge ? 100d : 1d; rrenkert@8206: rrenkert@8206: //double w = factor*(qwd.getW()-gaugeDatum); rrenkert@8206: rrenkert@8206: // Force empty symbol. rrenkert@8206: if (qwd.getInterpolated()) { rrenkert@8206: theme = new ThemeDocument(theme); // prevent potential side effects. rrenkert@8206: theme.setValue(ThemeDocument.USE_FILL_PAINT, "true"); rrenkert@8206: } rrenkert@8206: rrenkert@8206: XYSeries series = new StyledXYSeries( rrenkert@8206: bundle.getFacetDescription(), rrenkert@8206: theme, rrenkert@8206: qwd.getInterpolated() rrenkert@8206: ? ShapeUtils.INTERPOLATED_SHAPE rrenkert@8206: : ShapeUtils.MEASURED_SHAPE); rrenkert@8206: rrenkert@8206: series.add(qwd.getQ(), qwd.getW()); rrenkert@8206: rrenkert@8206: generator.addAxisSeries(series, axisName, visible); rrenkert@8206: rrenkert@8206: if (visible && theme.parseShowPointLabel()) { rrenkert@8206: rrenkert@8206: List textAnnos = new ArrayList(); rrenkert@8206: rrenkert@8206: DateFormat dateFormat = DateFormat.getDateInstance( rrenkert@8206: DateFormat.SHORT); rrenkert@8206: XYTextAnnotation anno = new CollisionFreeXYTextAnnotation( rrenkert@8206: dateFormat.format(qwd.getDate()), rrenkert@8206: qwd.getQ(), rrenkert@8206: qwd.getW()); rrenkert@8206: textAnnos.add(anno); rrenkert@8206: rrenkert@8206: RiverAnnotation flysAnno = new RiverAnnotation(null, null, null, theme); rrenkert@8206: flysAnno.setTextAnnotations(textAnnos); rrenkert@8206: generator.addAnnotations(flysAnno); rrenkert@8206: } rrenkert@8206: } rrenkert@8206: rrenkert@8206: /** Add reference event points to chart. */ rrenkert@8206: protected void doReferenceEventsOut( rrenkert@8206: DiagramGenerator generator, rrenkert@8206: ArtifactAndFacet bundle, rrenkert@8206: ThemeDocument theme, rrenkert@8206: boolean visible) { rrenkert@8206: logger.debug("doReferenceEventsOut"); rrenkert@8206: rrenkert@8206: QWI qwd = (QWI)bundle.getData(generator.getCallContext()); rrenkert@8206: if (qwd == null) { rrenkert@8206: logger.debug("doReferenceEventsOut: qwds == null in " + bundle.getFacetDescription()); rrenkert@8206: return; rrenkert@8206: } rrenkert@8206: rrenkert@8206: // Force empty symbol. rrenkert@8206: if (qwd.getInterpolated()) { rrenkert@8206: theme = new ThemeDocument(theme); // prevent potential side effects. rrenkert@8206: theme.setValue(ThemeDocument.USE_FILL_PAINT, "true"); rrenkert@8206: } rrenkert@8206: rrenkert@8206: XYSeries series = new StyledXYSeries( rrenkert@8206: bundle.getFacetDescription(), rrenkert@8206: false, true, theme, rrenkert@8206: qwd.getInterpolated() rrenkert@8206: ? ShapeUtils.INTERPOLATED_SHAPE rrenkert@8206: : ShapeUtils.MEASURED_SHAPE); rrenkert@8206: rrenkert@8206: // TODO: W in cm at gauge!!! rrenkert@8206: //double gaugeDatum = getCurrentGaugeDatum(); rrenkert@8206: //boolean atGauge = gaugeDatum != 0d; rrenkert@8206: rrenkert@8206: //double factor = atGauge ? 100d : 1d; rrenkert@8206: //double w = factor*(qwd.getW()-gaugeDatum); rrenkert@8206: rrenkert@8206: series.add(qwd.getQ(), qwd.getW(), false); rrenkert@8206: rrenkert@8206: if (visible && theme.parseShowPointLabel()) { rrenkert@8206: DateFormat dateFormat = DateFormat.getDateInstance( rrenkert@8206: DateFormat.SHORT); rrenkert@8206: rrenkert@8206: XYTextAnnotation anno = new CollisionFreeXYTextAnnotation( rrenkert@8206: dateFormat.format(qwd.getDate()), rrenkert@8206: qwd.getQ(), rrenkert@8206: qwd.getW()); rrenkert@8206: rrenkert@8206: List textAnnos = new ArrayList(); rrenkert@8206: textAnnos.add(anno); rrenkert@8206: RiverAnnotation flysAnno = new RiverAnnotation(null, null, null, theme); rrenkert@8206: flysAnno.setTextAnnotations(textAnnos); rrenkert@8206: generator.addAnnotations(flysAnno); rrenkert@8206: } rrenkert@8206: rrenkert@8206: generator.addAxisSeries(series, axisName, visible); rrenkert@8206: } rrenkert@8206: rrenkert@8206: protected void doWQCurveOut( rrenkert@8206: DiagramGenerator generator, rrenkert@8206: ArtifactAndFacet bundle, rrenkert@8206: ThemeDocument theme, rrenkert@8206: boolean visible rrenkert@8206: ) { rrenkert@8206: logger.debug("doWQCurveOut"); rrenkert@8206: rrenkert@8206: FixWQCurveFacet facet = (FixWQCurveFacet)bundle.getFacet(); rrenkert@8206: FixFunction func = (FixFunction)facet.getData( rrenkert@8206: bundle.getArtifact(), generator.getCallContext()); rrenkert@8206: rrenkert@8206: if (func == null) { rrenkert@8206: logger.warn("doWQCurveOut: Facet does not contain FixFunction"); rrenkert@8206: return; rrenkert@8206: } rrenkert@8206: rrenkert@8206: double maxQ = func.getMaxQ(); rrenkert@8206: rrenkert@8206: if (maxQ > 0) { rrenkert@8206: StyledXYSeries series = JFreeUtil.sampleFunction2D( rrenkert@8206: func.getFunction(), rrenkert@8206: theme, rrenkert@8206: bundle.getFacetDescription(), rrenkert@8206: 500, // number of samples rrenkert@8206: 0.0 , // start rrenkert@8206: maxQ); // end rrenkert@8206: rrenkert@8206: //TODO: W in cm at gauge!!! rrenkert@8206: // double gaugeDatum = getCurrentGaugeDatum(); rrenkert@8206: rrenkert@8206: // if (gaugeDatum == 0d) { rrenkert@8206: generator.addAxisSeries(series, axisName, visible); rrenkert@8206: // } rrenkert@8206: /* else { rrenkert@8206: StyledXYSeries series2 = JFreeUtil.sampleFunction2D( rrenkert@8206: func.getFunction(), rrenkert@8206: doc, rrenkert@8206: aaf.getFacetDescription(), rrenkert@8206: 500, // number of samples rrenkert@8206: 0.0 , // start rrenkert@8206: maxQ); // end rrenkert@8206: addAxisSeries(series2, YAXIS.W.idx, false); rrenkert@8206: // Use second axis at cm if at gauge. rrenkert@8206: for (int i = 0, N = series.getItemCount(); i < N; i++) { rrenkert@8206: series.updateByIndex( rrenkert@8206: i, new Double(100d*(series.getY(i).doubleValue()-gaugeDatum))); rrenkert@8206: } rrenkert@8206: addAxisSeries(series, YAXIS.WCm.idx, visible); rrenkert@8206: }*/ rrenkert@8206: } rrenkert@8206: else { rrenkert@8206: logger.warn("doWQCurveOut: maxQ <= 0"); rrenkert@8206: } rrenkert@8206: } rrenkert@8206: rrenkert@8206: protected void doOutlierOut( rrenkert@8206: DiagramGenerator generator, rrenkert@8206: ArtifactAndFacet bundle, rrenkert@8206: ThemeDocument theme, rrenkert@8206: boolean visible rrenkert@8206: ) { rrenkert@8206: logger.debug("doOutlierOut"); rrenkert@8206: rrenkert@8206: QWI[] qws = (QWI[])bundle.getData(generator.getCallContext()); rrenkert@8206: if(qws != null) { rrenkert@8206: XYSeries series = new StyledXYSeries( rrenkert@8206: bundle.getFacetDescription(), rrenkert@8206: false, true, rrenkert@8206: theme); rrenkert@8206: DateFormat dateFormat = DateFormat.getDateInstance( rrenkert@8206: DateFormat.SHORT); rrenkert@8206: rrenkert@8206: List annos = new ArrayList(); rrenkert@8206: //TODO: W in cm at Gauge!!! rrenkert@8206: for (QWI qw: qws) { rrenkert@8206: series.add(qw.getQ(), qw.getW(), false); rrenkert@8206: rrenkert@8206: XYTextAnnotation anno = new CollisionFreeXYTextAnnotation( rrenkert@8206: dateFormat.format(qw.getDate()), rrenkert@8206: qw.getQ(), rrenkert@8206: qw.getW()); rrenkert@8206: annos.add(anno); rrenkert@8206: } rrenkert@8206: generator.addAxisSeries(series, axisName, visible); rrenkert@8206: rrenkert@8206: if (visible && theme != null && theme.parseShowPointLabel()) { rrenkert@8206: RiverAnnotation flysAnno = rrenkert@8206: new RiverAnnotation(null, null, null, theme); rrenkert@8206: flysAnno.setTextAnnotations(annos); rrenkert@8206: generator.addAnnotations(flysAnno); rrenkert@8206: } rrenkert@8206: } rrenkert@8206: else { rrenkert@8206: logger.debug("doOutlierOut: qwd == null"); rrenkert@8206: } rrenkert@8206: } rrenkert@8206: rrenkert@8206: /** Add markers for q sectors. */ rrenkert@8206: protected void doQSectorOut( rrenkert@8206: DiagramGenerator generator, rrenkert@8206: ArtifactAndFacet bundle, rrenkert@8206: ThemeDocument theme, rrenkert@8206: boolean visible rrenkert@8206: ) { rrenkert@8206: logger.debug("doQSectorOut"); rrenkert@8206: if (!visible) { rrenkert@8206: return; rrenkert@8206: } rrenkert@8206: rrenkert@8206: Object qsectorsObj = bundle.getData(generator.getCallContext()); rrenkert@8206: if (qsectorsObj == null || !(qsectorsObj instanceof List)) { rrenkert@8206: logger.warn("No QSectors coming from data."); rrenkert@8206: return; rrenkert@8206: } rrenkert@8206: rrenkert@8206: List qsectorsList = (List) qsectorsObj; rrenkert@8206: if (qsectorsList.size() == 0 || !(qsectorsList.get(0) instanceof NamedDouble)) { rrenkert@8206: logger.warn("No QSectors coming from data."); rrenkert@8206: return; rrenkert@8206: } rrenkert@8206: rrenkert@8206: @SuppressWarnings("unchecked") rrenkert@8206: List qsectors = (List) qsectorsList; rrenkert@8206: rrenkert@8206: for (NamedDouble qsector : qsectors) { rrenkert@8206: if (Double.isNaN(qsector.getValue())) { rrenkert@8206: continue; rrenkert@8206: } rrenkert@8206: Marker m = new ValueMarker(qsector.getValue()); rrenkert@8206: m.setPaint(Color.black); rrenkert@8206: rrenkert@8206: float[] dashes = theme.parseLineStyle(); rrenkert@8206: int size = theme.parseLineWidth(); rrenkert@8206: BasicStroke stroke; rrenkert@8206: if (dashes.length <= 1) { rrenkert@8206: stroke = new BasicStroke(size); rrenkert@8206: } rrenkert@8206: else { rrenkert@8206: stroke = new BasicStroke(size, rrenkert@8206: BasicStroke.CAP_BUTT, rrenkert@8206: BasicStroke.JOIN_ROUND, rrenkert@8206: 1.0f, rrenkert@8206: dashes, rrenkert@8206: 0.0f); rrenkert@8206: } rrenkert@8206: m.setStroke(stroke); rrenkert@8206: rrenkert@8206: if (theme.parseShowLineLabel()) { rrenkert@8206: m.setLabel(qsector.getName()); rrenkert@8206: m.setPaint(theme.parseTextColor()); rrenkert@8206: m.setLabelFont(theme.parseTextFont()); rrenkert@8206: } rrenkert@8206: Color paint = theme.parseLineColorField(); rrenkert@8206: if (paint != null) { rrenkert@8206: m.setPaint(paint); rrenkert@8206: } rrenkert@8206: m.setLabelAnchor(RectangleAnchor.TOP_LEFT); rrenkert@8206: m.setLabelTextAnchor(TextAnchor.TOP_LEFT); rrenkert@8206: m.setLabelOffset(new RectangleInsets(5, 5, 10, 10)); rrenkert@8206: generator.addDomainMarker(m); rrenkert@8206: } rrenkert@8206: } rrenkert@8206: rrenkert@8206: /** rrenkert@8206: * Add W-Annotations to plot. rrenkert@8206: * @param wqkms actual data (double[][]). rrenkert@8206: * @param theme theme to use. rrenkert@8206: */ rrenkert@8206: protected void doWAnnotations( rrenkert@8206: DiagramGenerator generator, rrenkert@8206: ArtifactAndFacet bundle, rrenkert@8206: ThemeDocument theme, rrenkert@8206: boolean visible rrenkert@8206: ) { rrenkert@8206: Object data = bundle.getData(generator.getCallContext()); rrenkert@8206: List xy = new ArrayList(); rrenkert@8206: if (data instanceof double[][]) { rrenkert@8206: logger.debug("Got double[][]"); rrenkert@8206: double [][] values = (double [][]) data; rrenkert@8206: for (int i = 0; i< values[0].length; i++) { rrenkert@8206: xy.add(new StickyAxisAnnotation(bundle.getFacetDescription(), rrenkert@8206: (float) values[1][i], StickyAxisAnnotation.SimpleAxis.Y_AXIS)); rrenkert@8206: } rrenkert@8206: rrenkert@8206: if (visible) { rrenkert@8206: generator.addAnnotations( rrenkert@8206: new RiverAnnotation( rrenkert@8206: bundle.getFacetDescription(), xy, null, theme)); rrenkert@8206: } rrenkert@8206: } rrenkert@8206: else { rrenkert@8206: // Assume its WKms. rrenkert@8206: logger.debug("Got WKms"); rrenkert@8206: /* TODO rrenkert@8206: WKms wkms = (WKms) data; rrenkert@8206: rrenkert@8206: Double ckm = rrenkert@8206: (Double) generator.getCallContext().getContextValue(FixChartGenerator.CURRENT_KM); rrenkert@8206: double location = (ckm != null) rrenkert@8206: ? ckm.doubleValue() rrenkert@8206: : getRange()[0]; rrenkert@8206: double w = StaticWKmsArtifact.getWAtKmLin(data, location); rrenkert@8206: xy.add(new StickyAxisAnnotation(aandf.getFacetDescription(), rrenkert@8206: (float) w, StickyAxisAnnotation.SimpleAxis.Y_AXIS)); rrenkert@8206: rrenkert@8206: doAnnotations(new RiverAnnotation(facet.getDescription(), xy), rrenkert@8206: aandf, theme, visible);*/ rrenkert@8206: } rrenkert@8206: } rrenkert@8206: rrenkert@8206: /** rrenkert@8206: * Add WQ Data to plot. rrenkert@8206: * @param wqkms data as double[][] rrenkert@8206: */ rrenkert@8206: protected void doWQOut( rrenkert@8206: DiagramGenerator generator, rrenkert@8206: ArtifactAndFacet bundle, rrenkert@8206: ThemeDocument theme, rrenkert@8206: boolean visible rrenkert@8206: ) { rrenkert@8206: logger.debug("FixWQCurveGenerator: doWQOut"); rrenkert@8206: Object data = bundle.getData(generator.getCallContext()); rrenkert@8206: if (data instanceof WQKms) { rrenkert@8206: WQKms wqkms = (WQKms)data; rrenkert@8206: // TODO As in doEventsOut, the value-searching should rrenkert@8206: // be delivered by the facet already (instead of in the Generator). rrenkert@8206: logger.debug("FixWQCurveGenerator: doWQOut: WQKms"); rrenkert@8206: XYSeries series = new StyledXYSeries(bundle.getFacetDescription(), theme); rrenkert@8206: // TODO: Remove dependency to FixChartGenerator. rrenkert@8206: Double ckm = (Double) generator.getCallContext().getContextValue(FixChartGenerator.CURRENT_KM); rrenkert@8206: if (wqkms == null || wqkms.getKms().length == 0 || ckm == null) { rrenkert@8206: logger.info("addPointFromWQKms: No event data to show."); rrenkert@8206: return; rrenkert@8206: } rrenkert@8206: double[] kms = wqkms.getKms(); rrenkert@8206: // TODO W in cm at gauge!!! rrenkert@8206: //double gaugeDatum = getCurrentGaugeDatum(); rrenkert@8206: //double factor = (gaugeDatum == 0d) ? 1d : 100d; rrenkert@8206: for (int i = 0 ; i< kms.length; i++) { rrenkert@8206: // TODO: Remove dependency to FixWQCurveGenerator. rrenkert@8206: if (Math.abs(kms[i] - ckm) <= FixWQCurveGenerator.EPSILON) { rrenkert@8206: series.add(wqkms.getQ(i), wqkms.getW(i), false); rrenkert@8206: generator.addAxisSeries(series, axisName, visible); rrenkert@8206: if(visible && theme.parseShowPointLabel()) { rrenkert@8206: List textAnnos = new ArrayList(); rrenkert@8206: XYTextAnnotation anno = new CollisionFreeXYTextAnnotation( rrenkert@8206: bundle.getFacetDescription(), rrenkert@8206: wqkms.getQ(i), rrenkert@8206: wqkms.getW(i)); rrenkert@8206: textAnnos.add(anno); rrenkert@8206: RiverAnnotation flysAnno = new RiverAnnotation(null, null, null, theme); rrenkert@8206: flysAnno.setTextAnnotations(textAnnos); rrenkert@8206: generator.addAnnotations(flysAnno); rrenkert@8206: } rrenkert@8206: return; rrenkert@8206: } rrenkert@8206: } rrenkert@8206: } rrenkert@8206: else { rrenkert@8206: logger.debug("FixWQCurveGenerator: doWQOut: double[][]"); rrenkert@8206: double [][] values = (double [][]) data; rrenkert@8206: rrenkert@8206: XYSeries series = new StyledXYSeries(bundle.getFacetDescription(), false, true, theme); rrenkert@8206: StyledSeriesBuilder.addPoints(series, values, true); rrenkert@8206: rrenkert@8206: generator.addAxisSeries(series, axisName, visible); rrenkert@8206: } rrenkert@8206: } rrenkert@8206: rrenkert@8206: @Override rrenkert@8206: public boolean canHandle(String facettype) { rrenkert@8206: return facettype.startsWith(FIX_SECTOR_AVERAGE_WQ) rrenkert@8206: || FIX_ANALYSIS_EVENTS_WQ.equals(facettype) rrenkert@8206: || FIX_REFERENCE_EVENTS_WQ.equals(facettype) rrenkert@8206: || FIX_EVENTS.equals(facettype) rrenkert@8206: || FIX_WQ_CURVE.equals(facettype) rrenkert@8206: || FIX_OUTLIER.equals(facettype) rrenkert@8206: || QSECTOR.equals(facettype) rrenkert@8206: || STATIC_WKMS_MARKS.equals(facettype) rrenkert@8206: || STATIC_WKMS.equals(facettype) rrenkert@8206: || HEIGHTMARKS_POINTS.equals(facettype) rrenkert@8206: || LONGITUDINAL_W.equals(facettype) rrenkert@8206: || STATIC_WKMS_INTERPOL.equals(facettype) rrenkert@8206: || FIX_WQ_LS.equals(facettype); rrenkert@8206: } rrenkert@8206: }