Mercurial > dive4elements > river
comparison artifacts/src/main/java/org/dive4elements/river/exports/process/FixWQProcessor.java @ 8372:cac60032aa7d
merged.
author | Raimund Renkert <rrenkert@intevation.de> |
---|---|
date | Thu, 02 Oct 2014 14:02:57 +0200 |
parents | e1ff1263d79a 061e85212d25 |
children | 0faa82973f60 |
comparison
equal
deleted
inserted
replaced
8371:676687c3d8f0 | 8372:cac60032aa7d |
---|---|
20 import org.dive4elements.river.artifacts.model.fixings.QWD; | 20 import org.dive4elements.river.artifacts.model.fixings.QWD; |
21 import org.dive4elements.river.artifacts.model.fixings.QWI; | 21 import org.dive4elements.river.artifacts.model.fixings.QWI; |
22 import org.dive4elements.river.artifacts.resources.Resources; | 22 import org.dive4elements.river.artifacts.resources.Resources; |
23 import org.dive4elements.river.exports.DiagramGenerator; | 23 import org.dive4elements.river.exports.DiagramGenerator; |
24 import org.dive4elements.river.exports.StyledSeriesBuilder; | 24 import org.dive4elements.river.exports.StyledSeriesBuilder; |
25 import org.dive4elements.river.exports.fixings.FixChartGenerator; | |
26 import org.dive4elements.river.exports.fixings.FixWQCurveGenerator; | 25 import org.dive4elements.river.exports.fixings.FixWQCurveGenerator; |
27 import org.dive4elements.river.java2d.ShapeUtils; | 26 import org.dive4elements.river.java2d.ShapeUtils; |
28 import org.dive4elements.river.jfree.CollisionFreeXYTextAnnotation; | 27 import org.dive4elements.river.jfree.CollisionFreeXYTextAnnotation; |
29 import org.dive4elements.river.jfree.JFreeUtil; | 28 import org.dive4elements.river.jfree.JFreeUtil; |
30 import org.dive4elements.river.jfree.RiverAnnotation; | 29 import org.dive4elements.river.jfree.RiverAnnotation; |
37 import org.jfree.data.xy.XYSeries; | 36 import org.jfree.data.xy.XYSeries; |
38 import org.jfree.ui.RectangleAnchor; | 37 import org.jfree.ui.RectangleAnchor; |
39 import org.jfree.ui.RectangleInsets; | 38 import org.jfree.ui.RectangleInsets; |
40 import org.jfree.ui.TextAnchor; | 39 import org.jfree.ui.TextAnchor; |
41 | 40 |
41 import static org.dive4elements.river.exports.injector.InjectorConstants.CURRENT_KM; | |
42 | 42 |
43 public class FixWQProcessor | 43 public class FixWQProcessor |
44 extends DefaultProcessor | 44 extends DefaultProcessor |
45 implements FacetTypes | 45 implements FacetTypes |
46 { | 46 { |
47 | 47 |
48 private static Logger logger = Logger.getLogger(FixWQProcessor.class); | 48 private static Logger log = Logger.getLogger(FixWQProcessor.class); |
49 | 49 |
50 private String I18N_AXIS_LABEL = "chart.discharge.curve.yaxis.label"; | 50 private String I18N_AXIS_LABEL = "chart.discharge.curve.yaxis.label"; |
51 | 51 |
52 public static final String I18N_SUBTITLE_KM = | 52 public static final String I18N_SUBTITLE_KM = |
53 "chart.subtitle.km"; | 53 "chart.subtitle.km"; |
60 DiagramGenerator generator, | 60 DiagramGenerator generator, |
61 ArtifactAndFacet bundle, | 61 ArtifactAndFacet bundle, |
62 ThemeDocument theme, | 62 ThemeDocument theme, |
63 boolean visible | 63 boolean visible |
64 ) { | 64 ) { |
65 // TODO: Simplyfy this processor and move general facets/data to | 65 // TODO: Simplify this processor and move general facets/data to |
66 // MiscDischargeProcessor or something... | 66 // MiscDischargeProcessor or something... |
67 String facetType = bundle.getFacetName(); | 67 String facetType = bundle.getFacetName(); |
68 logger.debug("facet: " + facetType + " name: " + bundle.getFacetDescription()); | 68 log.debug("facet: " + facetType + " name: " + bundle.getFacetDescription()); |
69 if(facetType.startsWith(FIX_SECTOR_AVERAGE_WQ)) { | 69 if(facetType.startsWith(FIX_SECTOR_AVERAGE_WQ)) { |
70 doSectorAverageOut(generator, bundle, theme, visible); | 70 doSectorAverageOut(generator, bundle, theme, visible); |
71 } | 71 } |
72 else if(FIX_ANALYSIS_EVENTS_WQ.equals(facetType) | 72 else if(FIX_ANALYSIS_EVENTS_WQ.equals(facetType) |
73 || FIX_REFERENCE_EVENTS_WQ.equals(facetType) | 73 || FIX_REFERENCE_EVENTS_WQ.equals(facetType) |
104 DiagramGenerator generator, | 104 DiagramGenerator generator, |
105 ArtifactAndFacet bundle, | 105 ArtifactAndFacet bundle, |
106 ThemeDocument theme, | 106 ThemeDocument theme, |
107 boolean visible | 107 boolean visible |
108 ) { | 108 ) { |
109 logger.debug("doSectorAverageOut"); | 109 log.debug("doSectorAverageOut"); |
110 QWDDateRange qwdd = (QWDDateRange)bundle.getData(generator.getCallContext()); | 110 QWDDateRange qwdd = (QWDDateRange)bundle.getData(generator.getCallContext()); |
111 QWD qwd = qwdd != null ? qwdd.getQWD() : null; | 111 QWD qwd = qwdd != null ? qwdd.getQWD() : null; |
112 | 112 |
113 if(qwd != null) { | 113 if(qwd != null) { |
114 XYSeries series = new StyledXYSeries( | 114 XYSeries series = new StyledXYSeries( |
116 false, true, | 116 false, true, |
117 theme); | 117 theme); |
118 DateFormat dateFormat = DateFormat.getDateInstance( | 118 DateFormat dateFormat = DateFormat.getDateInstance( |
119 DateFormat.SHORT); | 119 DateFormat.SHORT); |
120 | 120 |
121 //TODO: W in cm at Gauge!!! | |
122 series.add(qwd.getQ(), qwd.getW(), false); | 121 series.add(qwd.getQ(), qwd.getW(), false); |
123 | 122 |
124 XYTextAnnotation anno = new CollisionFreeXYTextAnnotation( | 123 XYTextAnnotation anno = new CollisionFreeXYTextAnnotation( |
125 dateFormat.format(qwd.getDate()), | 124 dateFormat.format(qwd.getDate()), |
126 qwd.getQ(), | 125 qwd.getQ(), |
135 flysAnno.setTextAnnotations(annos); | 134 flysAnno.setTextAnnotations(annos); |
136 generator.addAnnotations(flysAnno); | 135 generator.addAnnotations(flysAnno); |
137 } | 136 } |
138 } | 137 } |
139 else { | 138 else { |
140 logger.debug("doSectorAverageOut: qwd == null"); | 139 log.debug("doSectorAverageOut: qwd == null"); |
141 } | 140 } |
142 } | 141 } |
143 | 142 |
144 | 143 |
145 /** Add analysis event points to chart. */ | 144 /** Add analysis event points to chart. */ |
147 DiagramGenerator generator, | 146 DiagramGenerator generator, |
148 ArtifactAndFacet bundle, | 147 ArtifactAndFacet bundle, |
149 ThemeDocument theme, | 148 ThemeDocument theme, |
150 boolean visible | 149 boolean visible |
151 ) { | 150 ) { |
152 logger.debug("doAnalysisEventsOut"); | 151 log.debug("doAnalysisEventsOut"); |
153 | 152 |
154 QWD qwd = (QWD)bundle.getData(generator.getCallContext()); | 153 QWD qwd = (QWD)bundle.getData(generator.getCallContext()); |
155 | 154 |
156 if (qwd == null) { | 155 if (qwd == null) { |
157 logger.debug("doAnalysisEventsOut: qwd == null"); | 156 log.debug("doAnalysisEventsOut: qwd == null"); |
158 return; | 157 return; |
159 } | 158 } |
160 // TODO: W in cm at Gauge!!! | |
161 //double gaugeDatum = getCurrentGaugeDatum(); | |
162 //boolean atGauge = gaugeDatum != 0d; | |
163 | |
164 //double factor = atGauge ? 100d : 1d; | |
165 | |
166 //double w = factor*(qwd.getW()-gaugeDatum); | |
167 | 159 |
168 // Force empty symbol. | 160 // Force empty symbol. |
169 if (qwd.getInterpolated()) { | 161 if (qwd.getInterpolated()) { |
170 theme = new ThemeDocument(theme); // prevent potential side effects. | 162 theme = new ThemeDocument(theme); // prevent potential side effects. |
171 theme.setValue(ThemeDocument.USE_FILL_PAINT, "true"); | 163 theme.setValue(ThemeDocument.USE_FILL_PAINT, "true"); |
204 protected void doReferenceEventsOut( | 196 protected void doReferenceEventsOut( |
205 DiagramGenerator generator, | 197 DiagramGenerator generator, |
206 ArtifactAndFacet bundle, | 198 ArtifactAndFacet bundle, |
207 ThemeDocument theme, | 199 ThemeDocument theme, |
208 boolean visible) { | 200 boolean visible) { |
209 logger.debug("doReferenceEventsOut"); | 201 log.debug("doReferenceEventsOut"); |
210 | 202 |
211 QWI qwd = (QWI)bundle.getData(generator.getCallContext()); | 203 QWI qwd = (QWI)bundle.getData(generator.getCallContext()); |
212 if (qwd == null) { | 204 if (qwd == null) { |
213 logger.debug("doReferenceEventsOut: qwds == null in " + bundle.getFacetDescription()); | 205 log.debug("doReferenceEventsOut: qwds == null in " + bundle.getFacetDescription()); |
214 return; | 206 return; |
215 } | 207 } |
216 | 208 |
217 // Force empty symbol. | 209 // Force empty symbol. |
218 if (qwd.getInterpolated()) { | 210 if (qwd.getInterpolated()) { |
225 false, true, theme, | 217 false, true, theme, |
226 qwd.getInterpolated() | 218 qwd.getInterpolated() |
227 ? ShapeUtils.INTERPOLATED_SHAPE | 219 ? ShapeUtils.INTERPOLATED_SHAPE |
228 : ShapeUtils.MEASURED_SHAPE); | 220 : ShapeUtils.MEASURED_SHAPE); |
229 | 221 |
230 // TODO: W in cm at gauge!!! | |
231 //double gaugeDatum = getCurrentGaugeDatum(); | |
232 //boolean atGauge = gaugeDatum != 0d; | |
233 | |
234 //double factor = atGauge ? 100d : 1d; | |
235 //double w = factor*(qwd.getW()-gaugeDatum); | |
236 | |
237 series.add(qwd.getQ(), qwd.getW(), false); | 222 series.add(qwd.getQ(), qwd.getW(), false); |
238 | 223 |
239 if (visible && theme.parseShowPointLabel()) { | 224 if (visible && theme.parseShowPointLabel()) { |
240 DateFormat dateFormat = DateFormat.getDateInstance( | 225 DateFormat dateFormat = DateFormat.getDateInstance( |
241 DateFormat.SHORT); | 226 DateFormat.SHORT); |
259 DiagramGenerator generator, | 244 DiagramGenerator generator, |
260 ArtifactAndFacet bundle, | 245 ArtifactAndFacet bundle, |
261 ThemeDocument theme, | 246 ThemeDocument theme, |
262 boolean visible | 247 boolean visible |
263 ) { | 248 ) { |
264 logger.debug("doWQCurveOut"); | 249 log.debug("doWQCurveOut"); |
265 | 250 |
266 FixWQCurveFacet facet = (FixWQCurveFacet)bundle.getFacet(); | 251 FixWQCurveFacet facet = (FixWQCurveFacet)bundle.getFacet(); |
267 FixFunction func = (FixFunction)facet.getData( | 252 FixFunction func = (FixFunction)facet.getData( |
268 bundle.getArtifact(), generator.getCallContext()); | 253 bundle.getArtifact(), generator.getCallContext()); |
269 | 254 |
270 if (func == null) { | 255 if (func == null) { |
271 logger.warn("doWQCurveOut: Facet does not contain FixFunction"); | 256 log.warn("doWQCurveOut: Facet does not contain FixFunction"); |
272 return; | 257 return; |
273 } | 258 } |
274 | 259 |
275 double maxQ = func.getMaxQ(); | 260 double maxQ = func.getMaxQ(); |
276 | 261 |
280 theme, | 265 theme, |
281 bundle.getFacetDescription(), | 266 bundle.getFacetDescription(), |
282 500, // number of samples | 267 500, // number of samples |
283 0.0 , // start | 268 0.0 , // start |
284 maxQ); // end | 269 maxQ); // end |
285 | |
286 //TODO: W in cm at gauge!!! | |
287 // double gaugeDatum = getCurrentGaugeDatum(); | |
288 | |
289 // if (gaugeDatum == 0d) { | |
290 generator.addAxisSeries(series, axisName, visible); | |
291 // } | |
292 /* else { | |
293 StyledXYSeries series2 = JFreeUtil.sampleFunction2D( | |
294 func.getFunction(), | |
295 doc, | |
296 aaf.getFacetDescription(), | |
297 500, // number of samples | |
298 0.0 , // start | |
299 maxQ); // end | |
300 addAxisSeries(series2, YAXIS.W.idx, false); | |
301 // Use second axis at cm if at gauge. | |
302 for (int i = 0, N = series.getItemCount(); i < N; i++) { | |
303 series.updateByIndex( | |
304 i, new Double(100d*(series.getY(i).doubleValue()-gaugeDatum))); | |
305 } | |
306 addAxisSeries(series, YAXIS.WCm.idx, visible); | |
307 }*/ | |
308 } | 270 } |
309 else { | 271 else { |
310 logger.warn("doWQCurveOut: maxQ <= 0"); | 272 log.warn("doWQCurveOut: maxQ <= 0"); |
311 } | 273 } |
312 } | 274 } |
313 | 275 |
314 protected void doOutlierOut( | 276 protected void doOutlierOut( |
315 DiagramGenerator generator, | 277 DiagramGenerator generator, |
316 ArtifactAndFacet bundle, | 278 ArtifactAndFacet bundle, |
317 ThemeDocument theme, | 279 ThemeDocument theme, |
318 boolean visible | 280 boolean visible |
319 ) { | 281 ) { |
320 logger.debug("doOutlierOut"); | 282 log.debug("doOutlierOut"); |
321 | 283 |
322 QWI[] qws = (QWI[])bundle.getData(generator.getCallContext()); | 284 QWI[] qws = (QWI[])bundle.getData(generator.getCallContext()); |
323 if(qws != null) { | 285 if(qws != null) { |
324 XYSeries series = new StyledXYSeries( | 286 XYSeries series = new StyledXYSeries( |
325 bundle.getFacetDescription(), | 287 bundle.getFacetDescription(), |
327 theme); | 289 theme); |
328 DateFormat dateFormat = DateFormat.getDateInstance( | 290 DateFormat dateFormat = DateFormat.getDateInstance( |
329 DateFormat.SHORT); | 291 DateFormat.SHORT); |
330 | 292 |
331 List<XYTextAnnotation> annos = new ArrayList<XYTextAnnotation>(); | 293 List<XYTextAnnotation> annos = new ArrayList<XYTextAnnotation>(); |
332 //TODO: W in cm at Gauge!!! | 294 |
333 for (QWI qw: qws) { | 295 for (QWI qw: qws) { |
334 series.add(qw.getQ(), qw.getW(), false); | 296 series.add(qw.getQ(), qw.getW(), false); |
335 | 297 |
336 XYTextAnnotation anno = new CollisionFreeXYTextAnnotation( | 298 XYTextAnnotation anno = new CollisionFreeXYTextAnnotation( |
337 dateFormat.format(qw.getDate()), | 299 dateFormat.format(qw.getDate()), |
347 flysAnno.setTextAnnotations(annos); | 309 flysAnno.setTextAnnotations(annos); |
348 generator.addAnnotations(flysAnno); | 310 generator.addAnnotations(flysAnno); |
349 } | 311 } |
350 } | 312 } |
351 else { | 313 else { |
352 logger.debug("doOutlierOut: qwd == null"); | 314 log.debug("doOutlierOut: qwd == null"); |
353 } | 315 } |
354 } | 316 } |
355 | 317 |
356 /** Add markers for q sectors. */ | 318 /** Add markers for q sectors. */ |
357 protected void doQSectorOut( | 319 protected void doQSectorOut( |
358 DiagramGenerator generator, | 320 DiagramGenerator generator, |
359 ArtifactAndFacet bundle, | 321 ArtifactAndFacet bundle, |
360 ThemeDocument theme, | 322 ThemeDocument theme, |
361 boolean visible | 323 boolean visible |
362 ) { | 324 ) { |
363 logger.debug("doQSectorOut"); | 325 log.debug("doQSectorOut"); |
364 if (!visible) { | 326 if (!visible) { |
365 return; | 327 return; |
366 } | 328 } |
367 | 329 |
368 Object qsectorsObj = bundle.getData(generator.getCallContext()); | 330 Object qsectorsObj = bundle.getData(generator.getCallContext()); |
369 if (qsectorsObj == null || !(qsectorsObj instanceof List)) { | 331 if (qsectorsObj == null || !(qsectorsObj instanceof List)) { |
370 logger.warn("No QSectors coming from data."); | 332 log.warn("No QSectors coming from data."); |
371 return; | 333 return; |
372 } | 334 } |
373 | 335 |
374 List<?> qsectorsList = (List<?>) qsectorsObj; | 336 List<?> qsectorsList = (List<?>) qsectorsObj; |
375 if (qsectorsList.size() == 0 || !(qsectorsList.get(0) instanceof NamedDouble)) { | 337 if (qsectorsList.size() == 0 || !(qsectorsList.get(0) instanceof NamedDouble)) { |
376 logger.warn("No QSectors coming from data."); | 338 log.warn("No QSectors coming from data."); |
377 return; | 339 return; |
378 } | 340 } |
379 | 341 |
380 @SuppressWarnings("unchecked") | 342 @SuppressWarnings("unchecked") |
381 List<NamedDouble> qsectors = (List<NamedDouble>) qsectorsList; | 343 List<NamedDouble> qsectors = (List<NamedDouble>) qsectorsList; |
431 boolean visible | 393 boolean visible |
432 ) { | 394 ) { |
433 Object data = bundle.getData(generator.getCallContext()); | 395 Object data = bundle.getData(generator.getCallContext()); |
434 List<StickyAxisAnnotation> xy = new ArrayList<StickyAxisAnnotation>(); | 396 List<StickyAxisAnnotation> xy = new ArrayList<StickyAxisAnnotation>(); |
435 if (data instanceof double[][]) { | 397 if (data instanceof double[][]) { |
436 logger.debug("Got double[][]"); | 398 log.debug("Got double[][]"); |
437 double [][] values = (double [][]) data; | 399 double [][] values = (double [][]) data; |
438 for (int i = 0; i< values[0].length; i++) { | 400 for (int i = 0; i< values[0].length; i++) { |
439 xy.add(new StickyAxisAnnotation(bundle.getFacetDescription(), | 401 xy.add(new StickyAxisAnnotation(bundle.getFacetDescription(), |
440 (float) values[1][i], StickyAxisAnnotation.SimpleAxis.Y_AXIS)); | 402 (float) values[1][i], StickyAxisAnnotation.SimpleAxis.Y_AXIS)); |
441 } | 403 } |
446 bundle.getFacetDescription(), xy, null, theme)); | 408 bundle.getFacetDescription(), xy, null, theme)); |
447 } | 409 } |
448 } | 410 } |
449 else { | 411 else { |
450 // Assume its WKms. | 412 // Assume its WKms. |
451 logger.debug("Got WKms"); | 413 log.debug("Got WKms"); |
452 /* TODO | 414 /* TODO |
453 WKms wkms = (WKms) data; | 415 WKms wkms = (WKms) data; |
454 | 416 |
455 Double ckm = | 417 Double ckm = |
456 (Double) generator.getCallContext().getContextValue(FixChartGenerator.CURRENT_KM); | 418 (Double) generator.getCallContext().getContextValue(FixChartGenerator.CURRENT_KM); |
474 DiagramGenerator generator, | 436 DiagramGenerator generator, |
475 ArtifactAndFacet bundle, | 437 ArtifactAndFacet bundle, |
476 ThemeDocument theme, | 438 ThemeDocument theme, |
477 boolean visible | 439 boolean visible |
478 ) { | 440 ) { |
479 logger.debug("FixWQCurveGenerator: doWQOut"); | |
480 Object data = bundle.getData(generator.getCallContext()); | 441 Object data = bundle.getData(generator.getCallContext()); |
481 if (data instanceof WQKms) { | 442 if (data instanceof WQKms) { |
482 WQKms wqkms = (WQKms)data; | 443 WQKms wqkms = (WQKms)data; |
483 // TODO As in doEventsOut, the value-searching should | 444 // TODO As in doEventsOut, the value-searching should |
484 // be delivered by the facet already (instead of in the Generator). | 445 // be delivered by the facet already |
485 logger.debug("FixWQCurveGenerator: doWQOut: WQKms"); | |
486 XYSeries series = new StyledXYSeries(bundle.getFacetDescription(), theme); | 446 XYSeries series = new StyledXYSeries(bundle.getFacetDescription(), theme); |
487 // TODO: Remove dependency to FixChartGenerator. | 447 Double ckm = (Double) generator.getCallContext() |
488 Double ckm = (Double) generator.getCallContext().getContextValue(FixChartGenerator.CURRENT_KM); | 448 .getContextValue(CURRENT_KM); |
449 | |
489 if (wqkms == null || wqkms.getKms().length == 0 || ckm == null) { | 450 if (wqkms == null || wqkms.getKms().length == 0 || ckm == null) { |
490 logger.info("addPointFromWQKms: No event data to show."); | 451 log.info("addPointFromWQKms: No event data to show."); |
491 return; | 452 return; |
492 } | 453 } |
454 | |
493 double[] kms = wqkms.getKms(); | 455 double[] kms = wqkms.getKms(); |
494 // TODO W in cm at gauge!!! | |
495 //double gaugeDatum = getCurrentGaugeDatum(); | |
496 //double factor = (gaugeDatum == 0d) ? 1d : 100d; | |
497 for (int i = 0 ; i< kms.length; i++) { | 456 for (int i = 0 ; i< kms.length; i++) { |
498 // TODO: Remove dependency to FixWQCurveGenerator. | 457 // TODO: Remove dependency to FixWQCurveGenerator. |
499 if (Math.abs(kms[i] - ckm) <= FixWQCurveGenerator.EPSILON) { | 458 if (Math.abs(kms[i] - ckm) <= FixWQCurveGenerator.EPSILON) { |
500 series.add(wqkms.getQ(i), wqkms.getW(i), false); | 459 series.add(wqkms.getQ(i), wqkms.getW(i), false); |
501 generator.addAxisSeries(series, axisName, visible); | 460 generator.addAxisSeries(series, axisName, visible); |
513 return; | 472 return; |
514 } | 473 } |
515 } | 474 } |
516 } | 475 } |
517 else { | 476 else { |
518 logger.debug("FixWQCurveGenerator: doWQOut: double[][]"); | 477 log.debug("FixWQCurveGenerator: doWQOut: double[][]"); |
519 double [][] values = (double [][]) data; | 478 double [][] values = (double [][]) data; |
520 | 479 |
521 XYSeries series = new StyledXYSeries(bundle.getFacetDescription(), false, true, theme); | 480 XYSeries series = new StyledXYSeries(bundle.getFacetDescription(), false, true, theme); |
522 StyledSeriesBuilder.addPoints(series, values, true); | 481 StyledSeriesBuilder.addPoints(series, values, true); |
523 | 482 |