mschaefer@9432: /** Copyright (C) 2017 by Bundesanstalt für Gewässerkunde mschaefer@9432: * Software engineering by mschaefer@9432: * Björnsen Beratende Ingenieure GmbH mschaefer@9432: * Dr. Schumacher Ingenieurbüro für Wasser und Umwelt mschaefer@9432: * mschaefer@9432: * This file is Free Software under the GNU AGPL (>=v3) mschaefer@9432: * and comes with ABSOLUTELY NO WARRANTY! Check out the mschaefer@9432: * documentation coming with Dive4Elements River for details. mschaefer@9432: */ mschaefer@9432: mschaefer@9432: package org.dive4elements.river.artifacts.bundu.bezugswst; mschaefer@9432: mschaefer@9432: import java.util.HashSet; mschaefer@9432: import java.util.Set; mschaefer@9432: mschaefer@9432: import org.dive4elements.artifactdatabase.state.ArtifactAndFacet; mschaefer@9432: import org.dive4elements.artifactdatabase.state.Facet; mschaefer@9432: import org.dive4elements.artifacts.CallContext; mschaefer@9432: import org.dive4elements.river.artifacts.bundu.BunduResultType; mschaefer@9432: import org.dive4elements.river.artifacts.common.AbstractProcessor; mschaefer@9432: import org.dive4elements.river.artifacts.common.AbstractResultType; mschaefer@9432: import org.dive4elements.river.artifacts.resources.Resources; mschaefer@9432: import org.dive4elements.river.exports.DiagramGenerator; mschaefer@9444: import org.dive4elements.river.model.BedHeightValueType; mschaefer@9432: import org.dive4elements.river.themes.ThemeDocument; mschaefer@9432: mschaefer@9432: /** mschaefer@9432: * Processor to generate the facets and data series of a bundu bezugswst depth longitudinal section mschaefer@9432: * mschaefer@9432: * @author Matthias Schäfer mschaefer@9432: * mschaefer@9432: */ mschaefer@9432: public final class BezugswstDepthProcessor extends AbstractProcessor { mschaefer@9432: mschaefer@9432: private static final String FACET_FLOWDEPTH_FILTERED = "bundu_facet_flowdepth.filtered"; mschaefer@9432: mschaefer@9432: private static final String FACET_FLOWDEPTH_FILTERED_DESCRIPTION = "bundu_facet_flowdepth.filtered.description"; mschaefer@9432: mschaefer@9432: public static final String FACET_CHANNELDEPTH = "bundu_facet_channeldepth"; mschaefer@9432: mschaefer@9432: private static final String FACET_CHANNELDEPTH_DESCRIPTION = "bundu_facet_channeldepth.description"; mschaefer@9432: mschaefer@9444: public static final String FACET_FIELD_DEPTH_PREFIX = "bundu_facet_depth_"; mschaefer@9444: mschaefer@9444: private static final String FACET_FIELD_DEPTH_FORMAT = FACET_FIELD_DEPTH_PREFIX + "%02d.filtered"; mschaefer@9444: mschaefer@9444: private static final String FACET_FIELD_DEPTH_DESCRIPTION = "bundu_facet_field_depth.description"; mschaefer@9444: gernotbelger@9592: private static final String AXIS_LABEL = "bundu.chart.flow_depth.section.yaxis.label"; mschaefer@9432: mschaefer@9432: private static final Set HANDLED_FACET_TYPES = new HashSet<>(); mschaefer@9432: mschaefer@9432: static { mschaefer@9432: HANDLED_FACET_TYPES.add(FACET_FLOWDEPTH_FILTERED); mschaefer@9432: HANDLED_FACET_TYPES.add(FACET_CHANNELDEPTH); mschaefer@9444: for (int i = BedHeightValueType.FIELD_FIRST_INDEX; i <= BedHeightValueType.FIELD_LAST_INDEX; i++) mschaefer@9444: HANDLED_FACET_TYPES.add(String.format(FACET_FIELD_DEPTH_FORMAT, i)); mschaefer@9432: } mschaefer@9432: mschaefer@9432: public BezugswstDepthProcessor() { mschaefer@9432: super(AXIS_LABEL, HANDLED_FACET_TYPES); mschaefer@9432: } mschaefer@9432: gernotbelger@9592: public static Facet createFlowdepthFilteredFacet(final CallContext context, final String hash, final String id, final int facetIndex, final int resultIndex, gernotbelger@9592: final String seriesName) { mschaefer@9432: mschaefer@9432: final String description = Resources.getMsg(context.getMeta(), FACET_FLOWDEPTH_FILTERED_DESCRIPTION, FACET_FLOWDEPTH_FILTERED_DESCRIPTION, seriesName); mschaefer@9432: return new BezugswstResultFacet(facetIndex, resultIndex, FACET_FLOWDEPTH_FILTERED, description, AXIS_LABEL, id, hash); mschaefer@9432: } mschaefer@9432: gernotbelger@9592: public static Facet createChanneldepthFacet(final CallContext context, final String hash, final String id, final int facetIndex, final int resultIndex) { mschaefer@9432: mschaefer@9432: final String description = Resources.getMsg(context.getMeta(), FACET_CHANNELDEPTH_DESCRIPTION, FACET_CHANNELDEPTH_DESCRIPTION); mschaefer@9432: return new BezugswstResultFacet(facetIndex, resultIndex, FACET_CHANNELDEPTH, description, AXIS_LABEL, id, hash); mschaefer@9432: } mschaefer@9432: gernotbelger@9592: public static Facet createFieldDepthFacet(final CallContext context, final String hash, final String id, final int facetIndex, final int resultIndex, gernotbelger@9592: final int fieldIndex) { mschaefer@9444: mschaefer@9444: final String description = Resources.getMsg(context.getMeta(), FACET_FIELD_DEPTH_DESCRIPTION, FACET_FIELD_DEPTH_DESCRIPTION, fieldIndex); mschaefer@9444: final String facetName = String.format(FACET_FIELD_DEPTH_FORMAT, fieldIndex); mschaefer@9444: return new BezugswstResultFacet(facetIndex, resultIndex, facetName, description, AXIS_LABEL, id, hash); mschaefer@9444: } mschaefer@9444: mschaefer@9432: @Override mschaefer@9432: protected String generateSeries(final DiagramGenerator generator, final ArtifactAndFacet bundle, final ThemeDocument theme, final boolean visible) { mschaefer@9432: mschaefer@9444: if (bundle.getFacetName().startsWith(FACET_FIELD_DEPTH_PREFIX)) { mschaefer@9444: final int fieldIndex = Integer.parseInt(bundle.getFacetName().substring(FACET_FIELD_DEPTH_PREFIX.length(), FACET_FIELD_DEPTH_PREFIX.length() + 2)); mschaefer@9444: return generateFieldDepthSeries(generator, bundle, theme, visible, fieldIndex); mschaefer@9444: } mschaefer@9444: mschaefer@9444: return buildSeriesForType(generator, bundle, theme, visible, doGetType(bundle.getFacetName()), null); mschaefer@9432: } mschaefer@9432: mschaefer@9432: protected AbstractResultType doGetType(final String facetName) { mschaefer@9432: mschaefer@9432: if (FACET_FLOWDEPTH_FILTERED.contentEquals(facetName)) mschaefer@9535: return BunduResultType.flowdepthMeanBed; mschaefer@9432: if (FACET_CHANNELDEPTH.contentEquals(facetName)) mschaefer@9432: return BunduResultType.channelDepth; mschaefer@9432: mschaefer@9432: final String error = String.format("Unknown facet name: %s", facetName); mschaefer@9432: throw new UnsupportedOperationException(error); mschaefer@9432: } mschaefer@9444: mschaefer@9444: private final String generateFieldDepthSeries(final DiagramGenerator generator, final ArtifactAndFacet bundle, final ThemeDocument theme, mschaefer@9444: final boolean visible, final int fieldIndex) { mschaefer@9444: mschaefer@9444: final BezugswstMainCalculationResult data = (BezugswstMainCalculationResult) getResult(generator, bundle); mschaefer@9444: final double[][] points = data.getFieldValuePoints(fieldIndex, BunduResultType.depthFields); mschaefer@9444: mschaefer@9444: return buildSeriesForPoints(points, generator, bundle, theme, visible, null); mschaefer@9444: } mschaefer@9432: }