# HG changeset patch # User Felix Wolfsteller # Date 1323859440 0 # Node ID bf62cc7052d45c4ec704e1a0162ab99714e8e9d9 # Parent d377b89d28271af10f68a838c9fc243c2ac52d0e Implement and use WaterLineArtifact interface. flys-artifacts/trunk@3411 c6561f87-3c4e-4783-a992-168aeb5c3f6f diff -r d377b89d2827 -r bf62cc7052d4 flys-artifacts/ChangeLog --- a/flys-artifacts/ChangeLog Wed Dec 14 10:40:30 2011 +0000 +++ b/flys-artifacts/ChangeLog Wed Dec 14 10:44:00 2011 +0000 @@ -1,3 +1,18 @@ +2011-12-14 Felix Wolfsteller + + Implement new WaterLineArtifact where needed so far. + + * src/main/java/de/intevation/flys/artifacts/WINFOArtifact.java: + Declare that we implement WaterLineArtifact. + + * src/main/java/de/intevation/flys/artifacts/StaticWKmsArtifact.java: + (getWaterLines): Implement to fulfil new WaterLineArtifact- + interface-impl. Also generate new Facet. + + + * src/main/java/de/intevation/flys/artifacts/model/CrossSectionWaterLineFacet.java: + Do not depend on WINFOArtifacts, but on WaterLineArtifacts instead. + 2011-12-14 Felix Wolfsteller Added interface WaterLineArtifact to be implemented by artifacts diff -r d377b89d2827 -r bf62cc7052d4 flys-artifacts/src/main/java/de/intevation/flys/artifacts/StaticWKmsArtifact.java --- a/flys-artifacts/src/main/java/de/intevation/flys/artifacts/StaticWKmsArtifact.java Wed Dec 14 10:40:30 2011 +0000 +++ b/flys-artifacts/src/main/java/de/intevation/flys/artifacts/StaticWKmsArtifact.java Wed Dec 14 10:44:00 2011 +0000 @@ -7,6 +7,8 @@ import org.w3c.dom.Document; +import java.awt.geom.Point2D; + import de.intevation.artifactdatabase.state.Facet; import de.intevation.artifactdatabase.state.DefaultOutput; import de.intevation.artifactdatabase.state.State; @@ -16,6 +18,7 @@ import de.intevation.artifacts.ArtifactNamespaceContext; import de.intevation.artifacts.CallMeta; +import de.intevation.flys.artifacts.model.CrossSectionWaterLineFacet; import de.intevation.flys.artifacts.model.FacetTypes; import de.intevation.flys.artifacts.model.WKms; import de.intevation.flys.artifacts.model.WKmsFacet; @@ -26,6 +29,9 @@ import de.intevation.artifacts.common.utils.XMLUtils; +import de.intevation.flys.geom.Lines; +import de.intevation.flys.model.CrossSectionLine; + /** * Artifact to access additional "waterlevel"-type of data, like the height * of protective measures (dikes). @@ -35,7 +41,7 @@ */ public class StaticWKmsArtifact extends StaticFLYSArtifact -implements FacetTypes +implements FacetTypes, WaterLineArtifact { /** The logger for this class. */ private static Logger logger = @@ -86,13 +92,23 @@ String [] parts = code.split("-"); if (parts.length >= 4) { - int col = Integer.valueOf(parts[2]); + int col = -1; int wst = Integer.valueOf(parts[3]); + if (!parts[2].equals("A")) { + col = Integer.valueOf(parts[2]); + } + addStringData("col_pos", parts[2]); addStringData("wst_id", parts[3]); - String wkmsName = WKmsFactory.getWKmsName(col, wst); + String wkmsName; + if (col > 0) { + wkmsName = WKmsFactory.getWKmsName(col, wst); + } + else { + wkmsName = WKmsFactory.getWKmsName(wst); + } String name; if (parts[0].equals(HEIGHTMARKS_POINTS)) { @@ -102,13 +118,15 @@ name = STATIC_WKMS; } - Facet facet = new WKmsFacet( + String facetDescription = Resources.getMsg( + callMeta, wkmsName, wkmsName); + Facet wKmsFacet = new WKmsFacet( name, - Resources.getMsg( - callMeta, - wkmsName, - wkmsName)); - fs.add(facet); + facetDescription); + Facet csFacet = new CrossSectionWaterLineFacet(0, + facetDescription); + fs.add(wKmsFacet); + fs.add(csFacet); facets.put(state.getID(), fs); } } @@ -216,6 +234,49 @@ /** + * Returns W at Km of WKms, searching linearly. + * Returns -1 if not found. + */ + public double getWAtKm(WKms wkms, double km) { + // Uninformed search. + int size = wkms.size(); + for (int i = 0; i < size; i++) { + if (wkms.getKm(i) == km) { + return wkms.getW(i); + } + } + + return -1; + } + + + /** + * Get points of line describing the surface of water at cross section. + * + * @return an array holding coordinates of points of surface of water ( + * in the form {{x1, x2} {y1, y2}} ). + */ + public double [][] getWaterLines(int idx, CrossSectionLine csl) { + logger.debug("getWaterLines(" + idx + ")"); + + List points = csl.fetchCrossSectionLinesPoints(); + + WKms wkms = getWKms(0); + + double km = csl.getKm().doubleValue(); + + // Find W at km. + double wAtKm = getWAtKm(wkms, km); + if (wAtKm == -1) { + logger.warn("Waterlevel at km " + km + " unknown."); + return new double[][] {{}}; + } + + return Lines.createWaterLines(points, wAtKm); + } + + + /** * Determines Facets initial disposition regarding activity (think of * selection in Client ThemeList GUI). This will be checked one time * when the facet enters a collections describe document. diff -r d377b89d2827 -r bf62cc7052d4 flys-artifacts/src/main/java/de/intevation/flys/artifacts/WINFOArtifact.java --- a/flys-artifacts/src/main/java/de/intevation/flys/artifacts/WINFOArtifact.java Wed Dec 14 10:40:30 2011 +0000 +++ b/flys-artifacts/src/main/java/de/intevation/flys/artifacts/WINFOArtifact.java Wed Dec 14 10:44:00 2011 +0000 @@ -75,7 +75,7 @@ */ public class WINFOArtifact extends FLYSArtifact -implements FacetTypes { +implements FacetTypes, WaterLineArtifact { /** The logger for this class. */ private static Logger logger = Logger.getLogger(WINFOArtifact.class); diff -r d377b89d2827 -r bf62cc7052d4 flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/CrossSectionWaterLineFacet.java --- a/flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/CrossSectionWaterLineFacet.java Wed Dec 14 10:40:30 2011 +0000 +++ b/flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/CrossSectionWaterLineFacet.java Wed Dec 14 10:44:00 2011 +0000 @@ -13,7 +13,7 @@ import de.intevation.artifactdatabase.state.Facet; import de.intevation.artifacts.DataProvider; -import de.intevation.flys.artifacts.WINFOArtifact; +import de.intevation.flys.artifacts.WaterLineArtifact; /** @@ -48,7 +48,7 @@ Object crossSection = providers.get(0) .provideData(CrossSectionFacet.BLACKBOARD_CS_MASTER_DATA, null, context); - WINFOArtifact winfo = (WINFOArtifact)artifact; + WaterLineArtifact winfo = (WaterLineArtifact)artifact; return winfo.getWaterLines(this.getIndex(), (CrossSectionLine) crossSection); }