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

http://dive4elements.wald.intevation.org