diff --git a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/check/Check.java b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/check/Check.java index e421951eb4f7dbc6ff8c94d12ef4a5791f8389c7..20db528d800d2ec41a403592921730671d472616 100644 --- a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/check/Check.java +++ b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/check/Check.java @@ -23,6 +23,7 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Map; +import java.util.Set; import de.hft.stuttgart.citydoctor2.check.error.DependenciesNotMetError; import de.hft.stuttgart.citydoctor2.datastructure.AbstractBuilding; @@ -98,6 +99,8 @@ public abstract class Check { public List<CheckId> getDependencies() { return Collections.emptyList(); } + + public abstract Set<Requirement> appliesToRequirements(); /** * Getter for the check id. @@ -111,7 +114,7 @@ public abstract class Check { * * @return the check type */ - public abstract CheckType getType(); + public abstract RequirementType getType(); /** * Checks whether the check can be executed on this checkable, meaning the diff --git a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/check/CheckId.java b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/check/CheckId.java index 1fac3387e9b3beab32bc0e5dcf17f2b223e8b0d9..4dec1f148cd9506ebc0270ddcf3a7e9d1108739a 100644 --- a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/check/CheckId.java +++ b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/check/CheckId.java @@ -44,14 +44,13 @@ public class CheckId implements Serializable { public static final CheckId C_GE_P_HOLE_OUTSIDE = new CheckId("C_GE_P_HOLE_OUTSIDE"); public static final CheckId IS_CEILING = new CheckId("IS_CEILING"); public static final CheckId C_GE_P_INNER_RINGS_NESTED = new CheckId("C_GE_P_INNER_RINGS_NESTED"); - public static final CheckId C_SEM_BS_NOT_CEILING = new CheckId("C_SEM_BS_NOT_CEILING"); - public static final CheckId C_SEM_BS_NOT_FLOOR = new CheckId("C_SEM_BS_NOT_FLOOR"); - public static final CheckId C_SEM_BS_NOT_GROUND = new CheckId("C_SEM_BS_NOT_GROUND"); - public static final CheckId C_SEM_F_MISSING_ID = new CheckId("C_SEM_F_MISSING_ID"); - public static final CheckId C_SEM_BS_GROUND_NOT_FRAGMENTED = new CheckId("C_SEM_BS_GROUND_NOT_FRAGMENTED"); - public static final CheckId C_SEM_BS_IS_WALL = new CheckId("C_SEM_BS_IS_WALL"); - public static final CheckId C_SEM_SCHEMATRON = new CheckId("C_SEM_SCHEMATRON"); - public static final CheckId C_SEM_BS_ROOF_NOT_FRAGMENTED = new CheckId("C_SEM_BS_ROOF_NOT_FRAGMENTED"); + public static final CheckId C_SE_BS_IS_CEILING = new CheckId("C_SE_BS_IS_CEILING"); + public static final CheckId C_SE_BS_IS_FLOOR = new CheckId("C_SE_BS_IS_FLOOR"); + public static final CheckId C_SE_BS_IS_GROUND = new CheckId("C_SE_BS_IS_GROUND"); + public static final CheckId C_SE_BS_GROUND_NOT_FRAGMENTED = new CheckId("C_SE_BS_GROUND_NOT_FRAGMENTED"); + public static final CheckId C_SE_BS_IS_WALL = new CheckId("C_SE_BS_IS_WALL"); + public static final CheckId C_SE_SCHEMATRON = new CheckId("C_SE_SCHEMATRON"); + public static final CheckId C_SE_BS_ROOF_UNFRAGMENTED = new CheckId("C_SE_BS_ROOF_UNFRAGMENTED"); public static final CheckId C_GE_S_NOT_CLOSED = new CheckId("C_GE_S_NOT_CLOSED"); public static final CheckId C_GE_P_ORIENTATION_RINGS_SAME = new CheckId("C_GE_P_ORIENTATION_RINGS_SAME"); diff --git a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/check/Checkable.java b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/check/Checkable.java index e281a64db05f146777c57c606705a5f84a4b918f..005c4b31f08123d6fe21731f2358d5befe954cae 100644 --- a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/check/Checkable.java +++ b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/check/Checkable.java @@ -31,7 +31,7 @@ import de.hft.stuttgart.citydoctor2.datastructure.GmlId; /** * Interface to indicate that this object can be checked by Checks. * - * @author Matthias Betz - 12bema1bif@hft-stuttgart.de + * @author Matthias Betz * */ public abstract class Checkable implements Serializable { diff --git a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/check/DefaultParameter.java b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/check/DefaultParameter.java index 0c48ec13c4c132113288701dc9805d6033a6540b..2bb9aee3f9134f960d2e784fa82fa8081ce80817 100644 --- a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/check/DefaultParameter.java +++ b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/check/DefaultParameter.java @@ -18,6 +18,8 @@ */ package de.hft.stuttgart.citydoctor2.check; +import java.io.Serializable; + /** * Describes a parameter for a check including the default value as a String. * All values are a String as they are passed to the check as a Map<String, @@ -26,15 +28,17 @@ package de.hft.stuttgart.citydoctor2.check; * @author Matthias Betz * */ -public class DefaultParameter { +public class DefaultParameter implements Serializable { + private static final long serialVersionUID = -4587211298078974066L; + private String name; - private String defaultValue; + private String value; private Unit unitType; public DefaultParameter(String name, String defaultValue, Unit unitType) { this.name = name; - this.defaultValue = defaultValue; + this.value = defaultValue; this.unitType = unitType; } @@ -56,8 +60,8 @@ public class DefaultParameter { * * @return the defaultValue */ - public String getDefaultValue() { - return defaultValue; + public String getValue() { + return value; } /* @@ -68,10 +72,10 @@ public class DefaultParameter { @Override public String toString() { StringBuilder builder = new StringBuilder(); - builder.append("CheckParameter [name="); + builder.append("DefaultParameter [name="); builder.append(name); - builder.append(", defaultValue="); - builder.append(defaultValue); + builder.append(", value="); + builder.append(value); builder.append("]"); return builder.toString(); } diff --git a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/check/ErrorId.java b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/check/ErrorId.java index 44049e0d366ff714a8f25d3d964ad0e628bd8b47..0176a3d4b005c257a38ca3ab49f921f0d1e0d442 100644 --- a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/check/ErrorId.java +++ b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/check/ErrorId.java @@ -56,13 +56,12 @@ public class ErrorId implements Serializable { public static final ErrorId GE_P_ORIENTATION_RINGS_SAME = new ErrorId("GE_P_ORIENTATION_RINGS_SAME"); public static final ErrorId GE_S_NOT_CLOSED = new ErrorId("GE_S_NOT_CLOSED"); public static final ErrorId GE_S_TOO_FEW_POLYGONS = new ErrorId("GE_S_TOO_FEW_POLYGONS"); - public static final ErrorId SEM_F_MISSING_ID = new ErrorId("SEM_F_MISSING_ID"); - public static final ErrorId SEM_BS_NOT_CEILING = new ErrorId("SEM_BS_NOT_CEILING"); - public static final ErrorId SEM_BS_NOT_WALL = new ErrorId("SEM_BS_NOT_WALL"); - public static final ErrorId SEM_BS_NOT_FLOOR = new ErrorId("SEM_BS_NOT_FLOOR"); - public static final ErrorId SEM_BS_NOT_GROUND = new ErrorId("SEM_BS_NOT_GROUND"); - public static final ErrorId SEM_SCHEMATRON_ERROR = new ErrorId("SEM_SCHEMATRON_ERROR"); - public static final ErrorId SEM_BS_UNFRAGMENTED = new ErrorId("SEM_BS_UNFRAGMENTED"); + public static final ErrorId SE_BS_NOT_CEILING = new ErrorId("SE_BS_NOT_CEILING"); + public static final ErrorId SE_BS_NOT_WALL = new ErrorId("SE_BS_NOT_WALL"); + public static final ErrorId SE_BS_NOT_FLOOR = new ErrorId("SE_BS_NOT_FLOOR"); + public static final ErrorId SE_BS_NOT_GROUND = new ErrorId("SE_BS_NOT_GROUND"); + public static final ErrorId SE_SCHEMATRON_ERROR = new ErrorId("SE_SCHEMATRON_ERROR"); + public static final ErrorId SE_BS_UNFRAGMENTED = new ErrorId("SE_BS_UNFRAGMENTED"); public static final ErrorId GE_P_DEGENERATED_POLYGON = new ErrorId("GE_P_DEGENERATED_POLYGON"); private String name; diff --git a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/check/Requirement.java b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/check/Requirement.java new file mode 100644 index 0000000000000000000000000000000000000000..2368be5cc24fc6565c34c83d1166f61cfb73a08d --- /dev/null +++ b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/check/Requirement.java @@ -0,0 +1,136 @@ +/*- + * Copyright 2020 Beuth Hochschule für Technik Berlin, Hochschule für Technik Stuttgart + * + * This file is part of CityDoctor2. + * + * CityDoctor2 is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * CityDoctor2 is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with CityDoctor2. If not, see <https://www.gnu.org/licenses/>. + */ +package de.hft.stuttgart.citydoctor2.check; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +public class Requirement implements Serializable { + + private static final long serialVersionUID = -590639811553512803L; + + private static final String DISTANCE_TOLERANCE = "distanceTolerance"; + private static final String ANGLE_TOLERANCE = "angleTolerance"; + private static final String TYPE_STRING = "type"; + private static final String DEGENERATED_POLYGON_TOLERANCE = "degeneratedPolygonTolerance"; + private static final String LOWER_ANGLE_NAME = "lowerAngle"; + private static final String UPPER_ANGLE_NAME = "upperAngle"; + + public static final Requirement R_GE_R_TOO_FEW_POINTS = new Requirement("R_GE_R_TOO_FEW_POINTS", RequirementType.GEOMETRY); + public static final Requirement R_GE_R_NOT_CLOSED = new Requirement("R_GE_R_NOT_CLOSED", RequirementType.GEOMETRY); + public static final Requirement R_GE_R_CONSECUTIVE_POINTS_SAME = new Requirement("R_GE_R_CONSECUTIVE_POINTS_SAME", RequirementType.GEOMETRY); + public static final Requirement R_GE_R_SELF_INTERSECTION = new Requirement("R_GE_R_SELF_INTERSECTION", RequirementType.GEOMETRY); + public static final Requirement R_GE_P_NON_PLANAR = new Requirement("R_GE_P_NON_PLANAR", RequirementType.GEOMETRY); + public static final Requirement R_GE_P_INTERIOR_DISCONNECTED = new Requirement("R_GE_P_INTERIOR_DISCONNECTED", RequirementType.GEOMETRY); + public static final Requirement R_GE_P_INTERSECTING_RINGS = new Requirement("R_GE_P_INTERSECTING_RINGS", RequirementType.GEOMETRY); + public static final Requirement R_GE_P_HOLE_OUTSIDE = new Requirement("R_GE_P_HOLE_OUTSIDE", RequirementType.GEOMETRY); + public static final Requirement R_GE_P_ORIENTATION_RINGS_SAME = new Requirement("R_GE_P_ORIENTATION_RINGS_SAME", RequirementType.GEOMETRY); + public static final Requirement R_GE_P_INNER_RINGS_NESTED = new Requirement("R_GE_P_INNER_RINGS_NESTED", RequirementType.GEOMETRY); + public static final Requirement R_GE_S_TOO_FEW_POLYGONS = new Requirement("R_GE_S_TOO_FEW_POLYGONS", RequirementType.GEOMETRY); + public static final Requirement R_GE_S_NOT_CLOSED = new Requirement("R_GE_S_NOT_CLOSED", RequirementType.GEOMETRY); + public static final Requirement R_GE_S_NON_MANIFOLD_EDGE = new Requirement("R_GE_S_NON_MANIFOLD_EDGE", RequirementType.GEOMETRY); + public static final Requirement R_GE_S_POLYGON_WRONG_ORIENTATION = new Requirement( + "R_GE_S_POLYGON_WRONG_ORIENTATION", RequirementType.GEOMETRY); + public static final Requirement R_GE_S_ALL_POLYGONS_WRONG_ORIENTATION = new Requirement( + "R_GE_S_ALL_POLYGONS_WRONG_ORIENTATION", RequirementType.GEOMETRY); + public static final Requirement R_GE_S_NON_MANIFOLD_VERTEX = new Requirement("R_GE_S_NON_MANIFOLD_VERTEX", RequirementType.GEOMETRY); + public static final Requirement R_GE_S_SELF_INTERSECTION = new Requirement("R_GE_S_SELF_INTERSECTION", RequirementType.GEOMETRY); + public static final Requirement R_GE_S_MULTIPLE_CONNECTED_COMPONENTS = new Requirement( + "R_GE_S_MULTIPLE_CONNECTED_COMPONENTS", RequirementType.GEOMETRY); + public static final Requirement R_SE_ATTRIBUTES_EXISTING = new Requirement("R_SE_ATTRIBUTES_EXISTING", RequirementType.SEMANTIC); + public static final Requirement R_SE_ATTRIBUTES_CORRECT = new Requirement("R_SE_ATTRIBUTES_CORRECT", RequirementType.SEMANTIC); + public static final Requirement R_GE_R_NULL_AREA = new Requirement("R_GE_R_NULL_AREA", RequirementType.GEOMETRY); + + public static final Requirement R_SE_BS_GROUND_UNFRAGMENTED = new Requirement("R_SE_BS_GROUND_UNFRAGMENTED", RequirementType.SEMANTIC); + public static final Requirement R_SE_BS_ROOF_UNFRAGMENTED = new Requirement("R_SE_BS_GROUND_UNFRAGMENTED", RequirementType.SEMANTIC); + public static final Requirement R_SE_BS_IS_CEILING = new Requirement("R_SE_BS_IS_CEILING", RequirementType.SEMANTIC); + public static final Requirement R_SE_BS_IS_FLOOR = new Requirement("R_SE_BS_IS_FLOOR", RequirementType.SEMANTIC); + public static final Requirement R_SE_BS_IS_WALL = new Requirement("R_SE_BS_IS_WALL", RequirementType.SEMANTIC); + public static final Requirement R_SE_BS_IS_GROUND = new Requirement("R_SE_BS_IS_GROUND", RequirementType.SEMANTIC); + + static { + // fill requirements with default parameters + ArrayList<DefaultParameter> defaultParameters = new ArrayList<>(); + defaultParameters.add(new DefaultParameter(TYPE_STRING, "distance", Unit.NONE)); + defaultParameters.add(new DefaultParameter(DISTANCE_TOLERANCE, "0.01", Unit.METER)); + defaultParameters.add(new DefaultParameter(ANGLE_TOLERANCE, "1", Unit.DEGREE)); + defaultParameters.add(new DefaultParameter(DEGENERATED_POLYGON_TOLERANCE, "0.00000", Unit.METER)); + R_GE_P_NON_PLANAR.parameters = Collections.unmodifiableList(defaultParameters); + + defaultParameters = new ArrayList<>(); + defaultParameters.add(new DefaultParameter(LOWER_ANGLE_NAME, "45", Unit.DEGREE)); + defaultParameters.add(new DefaultParameter(UPPER_ANGLE_NAME, "135", Unit.DEGREE)); + R_SE_BS_IS_WALL.parameters = Collections.unmodifiableList(defaultParameters); + } + + private String id; + private RequirementType type; + private List<DefaultParameter> parameters; + + public Requirement(String id, RequirementType type) { + this.id = id; + this.type = type; + parameters = Collections.emptyList(); + } + + public String getId() { + return id; + } + + public List<DefaultParameter> getDefaultParameter() { + return parameters; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((id == null) ? 0 : id.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + Requirement other = (Requirement) obj; + if (id == null) { + if (other.id != null) + return false; + } else if (!id.equals(other.id)) + return false; + return true; + } + + @Override + public String toString() { + return id; + } + + public RequirementType getType() { + return type; + } + +} diff --git a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/check/CheckType.java b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/check/RequirementType.java similarity index 97% rename from CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/check/CheckType.java rename to CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/check/RequirementType.java index b8f2afdeb1570f70e157eab3b78182e8d2ddd24c..46d63f3f8fd3ff5cb5e3f12ec2a282fb8a125843 100644 --- a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/check/CheckType.java +++ b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/check/RequirementType.java @@ -26,7 +26,7 @@ package de.hft.stuttgart.citydoctor2.check; * @author Matthias Betz * */ -public enum CheckType { +public enum RequirementType { GEOMETRY, SEMANTIC diff --git a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/check/error/NotCeilingError.java b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/check/error/NotCeilingError.java index 4ed6bea9be3872e7e88b8f87b6d50a8d91692b62..699ad8b8549224b53bd5c6490ec6559eb24ffbe2 100644 --- a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/check/error/NotCeilingError.java +++ b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/check/error/NotCeilingError.java @@ -79,7 +79,7 @@ public class NotCeilingError implements CheckError { @Override public ErrorId getErrorId() { - return ErrorId.SEM_BS_NOT_CEILING; + return ErrorId.SE_BS_NOT_CEILING; } @Override diff --git a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/check/error/NotFloorError.java b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/check/error/NotFloorError.java index 1b8198f1a8148f34037dcad01d074995fbf40fdb..7f4aea9fef8998552dbe93807ce03a7032533607 100644 --- a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/check/error/NotFloorError.java +++ b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/check/error/NotFloorError.java @@ -77,7 +77,7 @@ public class NotFloorError implements CheckError { @Override public ErrorId getErrorId() { - return ErrorId.SEM_BS_NOT_FLOOR; + return ErrorId.SE_BS_NOT_FLOOR; } @Override diff --git a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/check/error/NotGroundError.java b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/check/error/NotGroundError.java index b810a6f7a04f21b90b3d76c910e3a77561214f54..90395bcf61bf8e749472bcf9d3f65fe166e710db 100644 --- a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/check/error/NotGroundError.java +++ b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/check/error/NotGroundError.java @@ -79,7 +79,7 @@ public class NotGroundError implements CheckError { @Override public ErrorId getErrorId() { - return ErrorId.SEM_BS_NOT_GROUND; + return ErrorId.SE_BS_NOT_GROUND; } @Override diff --git a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/check/error/NotWallError.java b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/check/error/NotWallError.java index 44a3efa741fe553639fd034f3b2ecc6d218220aa..6eb0835f3a1d43f71e4943cde5dc6b8581d5e03b 100644 --- a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/check/error/NotWallError.java +++ b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/check/error/NotWallError.java @@ -82,7 +82,7 @@ public class NotWallError implements CheckError { @Override public ErrorId getErrorId() { - return ErrorId.SEM_BS_NOT_WALL; + return ErrorId.SE_BS_NOT_WALL; } @Override diff --git a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/check/error/SchematronError.java b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/check/error/SchematronError.java index f12702766b4948137212b619dacabeef3ae885a6..cdc72e8fc79b5aa601fe848ad81bb72e88ccb945 100644 --- a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/check/error/SchematronError.java +++ b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/check/error/SchematronError.java @@ -94,7 +94,7 @@ public class SchematronError implements CheckError { @Override public ErrorId getErrorId() { - return ErrorId.SEM_SCHEMATRON_ERROR; + return ErrorId.SE_SCHEMATRON_ERROR; } @Override diff --git a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/check/error/SurfaceUnfragmentedError.java b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/check/error/SurfaceUnfragmentedError.java index 55d02c6d25f16724fb77c5f954dc6470b3f1670e..16ceb6b34d7798c5f2917f0384991fe2c983325b 100644 --- a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/check/error/SurfaceUnfragmentedError.java +++ b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/check/error/SurfaceUnfragmentedError.java @@ -77,7 +77,7 @@ public class SurfaceUnfragmentedError implements CheckError { @Override public ErrorId getErrorId() { - return ErrorId.SEM_BS_UNFRAGMENTED; + return ErrorId.SE_BS_UNFRAGMENTED; } @Override diff --git a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/BoundingBox.java b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/BoundingBox.java index 13889c26704856b4dd1e38ebd4bfa056a2c1e145..357f39d4db29541220cc76b63a4c15ea89961cca 100644 --- a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/BoundingBox.java +++ b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/BoundingBox.java @@ -42,6 +42,10 @@ public class BoundingBox { public static BoundingBox of(List<Polygon> polygons) { return BoundingBoxCalculator.calculateBoundingBox(polygons); } + + public static BoundingBox ofPoints(List<? extends Vector3d> points) { + return BoundingBoxCalculator.calculateBoundingBoxFromPoints(points); + } /** * Creates an axis aligned bounding box of the whole model. diff --git a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/math/CovarianceMatrix.java b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/math/CovarianceMatrix.java index f6df612f296f7809db0d6e8ef6729d2038ab67e3..0c58931eadedc13920765de1a5b5b793e49e9b2c 100644 --- a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/math/CovarianceMatrix.java +++ b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/math/CovarianceMatrix.java @@ -56,6 +56,12 @@ public class CovarianceMatrix { covValues[1][2] += ydiff * zdiff; covValues[2][2] += zdiff * zdiff; } + covValues[0][0] /= vertices.size(); + covValues[0][1] /= vertices.size(); + covValues[0][2] /= vertices.size(); + covValues[1][1] /= vertices.size(); + covValues[1][2] /= vertices.size(); + covValues[2][2] /= vertices.size(); // the covariance matrix is symmetric, so we can fill in the remaining values covValues[1][0] = covValues[0][1]; covValues[2][0] = covValues[0][2]; diff --git a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/math/Matrix3x3d.java b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/math/Matrix3x3d.java index c112ee3a59e979d7f5e3f1e198755e683c4ab1a4..5d751930d3fa8c7e04f56f907130beb5f7a16782 100644 --- a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/math/Matrix3x3d.java +++ b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/math/Matrix3x3d.java @@ -135,7 +135,7 @@ public class Matrix3x3d { /** * Multiplies this matrix with a 3-dim vector. * - * @param other the vector + * @param the multiplied vector * @return the result stored in a new vector */ public Vector3d mult(Vector3d other) { diff --git a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/utils/BoundingBoxCalculator.java b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/utils/BoundingBoxCalculator.java index 5ff2bf86d2ce9000aef0974a1557daae6b20b349..2d50bf660c9d767dbe27e61096eb32891360793e 100644 --- a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/utils/BoundingBoxCalculator.java +++ b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/utils/BoundingBoxCalculator.java @@ -63,17 +63,20 @@ public class BoundingBoxCalculator { for (Vertex v : p.getExteriorRing().getVertices()) { if (v.getX() < lowX) { lowX = v.getX(); - } else if (v.getX() > highX) { + } + if (v.getX() > highX) { highX = v.getX(); } if (v.getY() < lowY) { lowY = v.getY(); - } else if (v.getY() > highY) { + } + if (v.getY() > highY) { highY = v.getY(); } if (v.getZ() < lowZ) { lowZ = v.getZ(); - } else if (v.getZ() > highZ) { + } + if (v.getZ() > highZ) { highZ = v.getZ(); } } @@ -92,7 +95,7 @@ public class BoundingBoxCalculator { */ public static BoundingBox calculateBoundingBox(CityDoctorModel model) { Vector3d low = new Vector3d(Double.MAX_VALUE, Double.MAX_VALUE, Double.MAX_VALUE); - Vector3d high = new Vector3d(Double.MIN_VALUE, Double.MIN_VALUE, Double.MIN_VALUE); + Vector3d high = new Vector3d(Double.NEGATIVE_INFINITY, Double.NEGATIVE_INFINITY, Double.NEGATIVE_INFINITY); findMinMax(low, high, model.getBuildings()); findMinMax(low, high, model.getBridges()); @@ -107,6 +110,40 @@ public class BoundingBoxCalculator { return BoundingBox.of(result); } + public static BoundingBox calculateBoundingBoxFromPoints(List<? extends Vector3d> points) { + double lowX = Double.MAX_VALUE; + double highX = Double.NEGATIVE_INFINITY; + double lowY = Double.MAX_VALUE; + double highY = Double.NEGATIVE_INFINITY; + double lowZ = Double.MAX_VALUE; + double highZ = Double.NEGATIVE_INFINITY; + // only need to check exterior rings + for (Vector3d v : points) { + if (v.getX() < lowX) { + lowX = v.getX(); + } + if (v.getX() > highX) { + highX = v.getX(); + } + if (v.getY() < lowY) { + lowY = v.getY(); + } + if (v.getY() > highY) { + highY = v.getY(); + } + if (v.getZ() < lowZ) { + lowZ = v.getZ(); + } + if (v.getZ() > highZ) { + highZ = v.getZ(); + } + } + Vector3d[] result = new Vector3d[2]; + result[0] = new Vector3d(lowX, lowY, lowZ); + result[1] = new Vector3d(highX, highY, highZ); + return BoundingBox.of(result); + } + private static void findMinMax(Vector3d low, Vector3d high, List<? extends CityObject> features) { for (CityObject co : features) { findMinMax(low, high, co); @@ -121,17 +158,20 @@ public class BoundingBoxCalculator { for (Vertex v : geom.getVertices()) { if (v.getX() < low.getX()) { low.setX(v.getX()); - } else if (v.getX() > high.getX()) { + } + if (v.getX() > high.getX()) { high.setX(v.getX()); } if (v.getY() < low.getY()) { low.setY(v.getY()); - } else if (v.getY() > high.getY()) { + } + if (v.getY() > high.getY()) { high.setY(v.getY()); } if (v.getZ() < low.getZ()) { low.setZ(v.getZ()); - } else if (v.getZ() > high.getZ()) { + } + if (v.getZ() > high.getZ()) { high.setZ(v.getZ()); } } diff --git a/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/check/Checker.java b/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/check/Checker.java index b439cdb377f94f849371dd8d33e1c0e446ea6879..c24700dfdf9778d280bc5100698a6b99defbc132 100644 --- a/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/check/Checker.java +++ b/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/check/Checker.java @@ -241,7 +241,7 @@ public class Checker { ValidationPlan plan = new ValidationPlan(); List<Checking> filter = createFilter(); - for (Entry<CheckId, CheckConfiguration> e : config.getChecks().entrySet()) { + for (Entry<String, RequirementConfiguration> e : config.getRequirements().entrySet()) { RequirementId reqId = mapToRequirement(e.getKey()); if (reqId == null) { continue; @@ -250,12 +250,12 @@ public class Checker { req.setName(reqId); req.setEnabled(e.getValue().isEnabled()); plan.getRequirements().add(req); - CheckPrototype proto = Checks.getCheckPrototypeForId(e.getKey()); Map<String, String> parameters = e.getValue().getParameters(); + Map<String, de.hft.stuttgart.citydoctor2.check.Requirement> reqs = Checks.getAvailableRequirements(); if (parameters != null) { for (Entry<String, String> param : parameters.entrySet()) { Parameter p = new Parameter(); - DefaultParameter defaultP = getDefaultParameter(param.getKey(), proto); + DefaultParameter defaultP = getDefaultParameter(param.getKey(), reqs); if (defaultP != null) { p.setUom(defaultP.getUnitType().getGmlRepresentation()); } @@ -292,10 +292,14 @@ public class Checker { return plan; } - private DefaultParameter getDefaultParameter(String key, CheckPrototype proto) { - for (DefaultParameter param : proto.getDefaultParameter()) { - if (param.getName().equals(key)) { - return param; + private DefaultParameter getDefaultParameter(String key, + Map<String, de.hft.stuttgart.citydoctor2.check.Requirement> reqs) { + de.hft.stuttgart.citydoctor2.check.Requirement requirement = reqs.get(key); + if (requirement != null) { + for (DefaultParameter param : requirement.getDefaultParameter()) { + if (param.getName().equals(key)) { + return param; + } } } return null; @@ -382,43 +386,10 @@ public class Checker { } } - private RequirementId mapToRequirement(CheckId key) { - switch (key.getName()) { - case "C_GE_R_TOO_FEW_POINTS": - return RequirementId.R_GE_R_TOO_FEW_POINTS; - case "C_GE_R_NOT_CLOSED": - return RequirementId.R_GE_R_NOT_CLOSED; - case "C_GE_R_DUPLICATE_POINT": - return RequirementId.R_GE_R_CONSECUTIVE_POINTS_SAME; - case "C_GE_R_SELF_INTERSECTION": - return RequirementId.R_GE_R_SELF_INTERSECTION; - case "C_GE_P_INTERIOR_DISCONNECTED": - return RequirementId.R_GE_P_INTERIOR_DISCONNECTED; - case "C_GE_P_INTERSECTING_RINGS": - return RequirementId.R_GE_P_INTERSECTING_RINGS; - case "C_GE_P_NON_PLANAR": - return RequirementId.R_GE_P_NON_PLANAR; - case "C_GE_S_TOO_FEW_POLYGONS": - return RequirementId.R_GE_S_TOO_FEW_POLYGONS; - case "C_GE_S_NON_MANIFOLD_EDGE": - return RequirementId.R_GE_S_NON_MANIFOLD_EDGE; - case "C_GE_S_POLYGON_WRONG_ORIENTATION": - return RequirementId.R_GE_S_POLYGON_WRONG_ORIENTATION; - case "C_GE_S_ALL_POLYGONS_WRONG_ORIENTATION": - return RequirementId.R_GE_S_ALL_POLYGONS_WRONG_ORIENTATION; - case "C_GE_S_NON_MANIFOLD_VERTEX": - return RequirementId.R_GE_S_NON_MANIFOLD_VERTEX; - case "C_GE_S_SELF_INTERSECTION": - return RequirementId.R_GE_S_SELF_INTERSECTION; - case "C_GE_P_HOLE_OUTSIDE": - return RequirementId.R_GE_P_HOLE_OUTSIDE; - case "C_GE_P_INNER_RINGS_NESTED": - return RequirementId.R_GE_P_INNER_RINGS_NESTED; - case "C_GE_S_NOT_CLOSED": - return RequirementId.R_GE_S_NOT_CLOSED; - case "C_GE_S_MULTIPLE_CONNECTED_COMPONENTS": - return RequirementId.R_GE_S_MULTIPLE_CONNECTED_COMPONENTS; - default: + private RequirementId mapToRequirement(String requirementName) { + try { + return RequirementId.valueOf(requirementName); + } catch (IllegalArgumentException e) { return null; } } @@ -557,20 +528,71 @@ public class Checker { } private List<Check> collectEnabledChecksAndInit(ParserConfiguration parserConfig, ValidationConfiguration config) { - List<Check> checks = new ArrayList<>(); - for (Entry<CheckId, CheckConfiguration> e : config.getChecks().entrySet()) { - if (e.getValue().isEnabled()) { - Check c = checkConfig.getCheckForId(e.getKey()); - Map<String, String> parameters = new HashMap<>(); - parameters.putAll(e.getValue().getParameters()); - parameters.put("numberOfRoundingPlaces", "" + config.getNumberOfRoundingPlaces()); - parameters.put("minVertexDistance", "" + config.getMinVertexDistance()); - // initialize checks with parameters - c.init(parameters, parserConfig); - checks.add(c); + Set<CheckId> enabledCheck = new HashSet<>(); + Map<CheckId, Map<String, String>> parameterMap = new HashMap<>(); + for (Entry<String, RequirementConfiguration> e : config.getRequirements().entrySet()) { + de.hft.stuttgart.citydoctor2.check.Requirement req = Checks.getAvailableRequirements().get(e.getKey()); + if (req == null) { + logger.warn("Could not find any check that satisfies requirement {}, it will not be checked", + e.getKey()); + } else { + if (e.getValue().isEnabled()) { + // this requirement is enabled + for (CheckPrototype proto : Checks.getCheckPrototypes()) { + if (proto.checksRequirements().contains(req)) { + // this requirement is checked by this check + // put all requirement parameter in the map + parameterMap.compute(proto.getCheckId(), (k, v) -> { + if (v == null) { + v = new HashMap<>(); + v.put(GlobalParameters.NUMBER_OF_ROUNDING_PLACES, + config.getNumberOfRoundingPlacesAsString()); + v.put(GlobalParameters.MIN_VERTEX_DISTANCE, config.getMinVertexDistanceAsString()); + } + v.putAll(e.getValue().getParameters()); + return v; + }); + enabledCheck.add(proto.getCheckId()); + collectDependencyChecks(proto, enabledCheck); + } + } + } + } + } + fillParameterMapsWithDefaultParameter(enabledCheck, parameterMap); + ArrayList<Check> checkList = new ArrayList<>(); + for (CheckId id : enabledCheck) { + Check c = checkConfig.getCheckForId(id); + c.init(parameterMap.get(id), parserConfig); + checkList.add(c); + } + return checkList; + } + + private void fillParameterMapsWithDefaultParameter(Set<CheckId> enabledCheck, + Map<CheckId, Map<String, String>> parameterMap) { + for (CheckId id : enabledCheck) { + CheckPrototype proto = Checks.getCheckPrototypeForId(id); + Map<String, String> map = parameterMap.computeIfAbsent(id, k -> new HashMap<>()); + for (de.hft.stuttgart.citydoctor2.check.Requirement req : proto.checksRequirements()) { + if (proto.checksRequirements().contains(req)) { + for (DefaultParameter param : req.getDefaultParameter()) { + map.computeIfAbsent(param.getName(), k -> param.getValue()); + } + } + } + } + } + + private void collectDependencyChecks(CheckPrototype proto, Set<CheckId> enabledChecks) { + enabledChecks.addAll(proto.getDependencies()); + for (CheckId id : proto.getDependencies()) { + if (enabledChecks.contains(id)) { + continue; } + CheckPrototype depProto = Checks.getCheckPrototypeForId(id); + collectDependencyChecks(depProto, enabledChecks); } - return checks; } private void checkCityModel(CityDoctorModel model, ProgressListener l) { diff --git a/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/check/GlobalParameters.java b/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/check/GlobalParameters.java new file mode 100644 index 0000000000000000000000000000000000000000..74e197d67ce3696c08ce2a9ed21528b5a330c25a --- /dev/null +++ b/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/check/GlobalParameters.java @@ -0,0 +1,31 @@ +/*- + * Copyright 2020 Beuth Hochschule für Technik Berlin, Hochschule für Technik Stuttgart + * + * This file is part of CityDoctor2. + * + * CityDoctor2 is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * CityDoctor2 is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with CityDoctor2. If not, see <https://www.gnu.org/licenses/>. + */ +package de.hft.stuttgart.citydoctor2.check; + +public class GlobalParameters { + + private GlobalParameters() { + + } + + public static final String SCHEMATRON_PATH = "schematronPath"; + public static final String MIN_VERTEX_DISTANCE = "minVertexDistance"; + public static final String NUMBER_OF_ROUNDING_PLACES = "numberOfRoundingPlaces"; + +} diff --git a/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/check/CheckConfiguration.java b/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/check/RequirementConfiguration.java similarity index 93% rename from CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/check/CheckConfiguration.java rename to CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/check/RequirementConfiguration.java index 142a9b1e121e93cf9ab347d3f20a35356e271304..4ae0c72831a975ff4b654df1be978f17acc92f72 100644 --- a/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/check/CheckConfiguration.java +++ b/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/check/RequirementConfiguration.java @@ -29,7 +29,7 @@ import java.util.Map; * @author Matthias Betz * */ -public class CheckConfiguration implements Serializable { +public class RequirementConfiguration implements Serializable { private static final long serialVersionUID = -1258195428669813888L; @@ -59,10 +59,7 @@ public class CheckConfiguration implements Serializable { } return parameters; } - - /** - * @param parameters Sets the parameters of this check. - */ + public void setParameters(Map<String, String> parameters) { this.parameters = parameters; } diff --git a/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/check/ValidationConfiguration.java b/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/check/ValidationConfiguration.java index 35fbe42c794824fa680a2123e4eb673efe617f68..75b0da902bcb5bdf7956be64480c5b6fee09ec61 100644 --- a/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/check/ValidationConfiguration.java +++ b/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/check/ValidationConfiguration.java @@ -28,6 +28,7 @@ import java.io.InputStream; import java.io.Serializable; import java.util.HashMap; import java.util.Map; +import java.util.Map.Entry; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -40,7 +41,6 @@ import org.yaml.snakeyaml.representer.Representer; import de.hft.stuttgart.citydoctor2.checks.CheckPrototype; import de.hft.stuttgart.citydoctor2.checks.Checks; import de.hft.stuttgart.citydoctor2.parser.ParserConfiguration; -import de.hft.stuttgart.citydoctor2.utils.Localization; /** * The validation configuration class represented in the yaml configuration @@ -52,19 +52,17 @@ import de.hft.stuttgart.citydoctor2.utils.Localization; */ public class ValidationConfiguration implements Serializable { + private static final String NUMBER_OF_ROUNDING_PLACES_DEFAULT = "8"; + private static final String MIN_VERTEX_DISTANCE_DEFAULT = "0.0001"; private static final long serialVersionUID = -8020055032177740646L; - private static final Logger logger = LogManager.getLogger(ValidationConfiguration.class); - private int numberOfRoundingPlaces = 8; - private double minVertexDistance = 0.0001; - - private String schematronFilePath = null; - + + private Map<String, String> globalParameters; private boolean xmlValidation = false; private boolean useStreaming = false; private FilterConfiguration filter; - private Map<CheckId, CheckConfiguration> checks; + private Map<String, RequirementConfiguration> requirements; private ParserConfiguration parserConfig; @@ -81,19 +79,20 @@ public class ValidationConfiguration implements Serializable { public static ValidationConfiguration loadStandardValidationConfig() { ValidationConfiguration config = new ValidationConfiguration(); - config.checks = new HashMap<>(); + config.requirements = new HashMap<>(); for (CheckPrototype c : Checks.getCheckPrototypes()) { - CheckConfiguration cConfig = new CheckConfiguration(); - cConfig.setEnabled(true); - if (!c.getDefaultParameter().isEmpty()) { - Map<String, String> paramMap = new HashMap<>(); - for (DefaultParameter param : c.getDefaultParameter()) { - paramMap.put(param.getName(), param.getDefaultValue()); + for (Requirement req : c.checksRequirements()) { + RequirementConfiguration reqConfig = new RequirementConfiguration(); + reqConfig.setEnabled(true); + for (DefaultParameter param : req.getDefaultParameter()) { + reqConfig.getParameters().put(param.getName(), param.getValue()); } - cConfig.setParameters(paramMap); + config.requirements.put(req.getId(), reqConfig); } - config.checks.put(c.getCheckId(), cConfig); } + config.globalParameters = new HashMap<>(); + config.globalParameters.put(GlobalParameters.NUMBER_OF_ROUNDING_PLACES, NUMBER_OF_ROUNDING_PLACES_DEFAULT); + config.globalParameters.put(GlobalParameters.MIN_VERTEX_DISTANCE, MIN_VERTEX_DISTANCE_DEFAULT); return config; } @@ -117,14 +116,6 @@ public class ValidationConfiguration implements Serializable { this.xmlValidation = xmlValidation; } - public String getSchematronFilePath() { - return schematronFilePath; - } - - public void setSchematronFilePath(String schematronFilePath) { - this.schematronFilePath = schematronFilePath; - } - public boolean isUseStreaming() { return useStreaming; } @@ -141,88 +132,67 @@ public class ValidationConfiguration implements Serializable { this.filter = filter; } - public Map<CheckId, CheckConfiguration> getChecks() { - if (checks == null) { - checks = new HashMap<>(); + public Map<String, RequirementConfiguration> getRequirements() { + if (requirements == null) { + requirements = new HashMap<>(); } - return checks; + return requirements; } - public void setChecks(Map<CheckId, CheckConfiguration> checks) { - this.checks = checks; + public Map<String, String> getGlobalParameters() { + if (globalParameters == null) { + globalParameters = new HashMap<>(); + } + return globalParameters; + } + + public void setGlobalParameters(Map<String, String> globalParameters) { + this.globalParameters = globalParameters; } /** - * Validates the configuration, adds all missing checks as enabled, reenables - * checks that are necessary to perform other checks + * Validates the configuration, adds all missing requirements as enabled. * - * @return true if it reenabled disabled checks, false otherwise */ - public boolean validateConfiguration() { - for (CheckPrototype c : Checks.getCheckPrototypes()) { - // enable all checks that are missing in the validation config - checks.computeIfAbsent(c.getCheckId(), id -> { - CheckConfiguration cConfig = new CheckConfiguration(); - cConfig.setEnabled(true); - return cConfig; - }); - } - boolean reenabledChecks = reenableNecessaryChecks(); - if (schematronFilePath != null && !schematronFilePath.isEmpty()) { - File f = new File(schematronFilePath); - if (!f.exists() || !f.isFile()) { - schematronFilePath = null; - if (logger.isWarnEnabled()) { - logger.warn(Localization.getText("ValidationConfiguration.missingSchematron"), f.getAbsolutePath()); + public void validateConfiguration() { + logger.trace("Validating configuration"); + Map<String, Requirement> availableRequirements = Checks.getAvailableRequirements(); + + for (Entry<String, RequirementConfiguration> entry : requirements.entrySet()) { + Requirement req = availableRequirements.get(entry.getKey()); + if (req != null) { + for (DefaultParameter param : req.getDefaultParameter()) { + RequirementConfiguration config = entry.getValue(); + config.getParameters().computeIfAbsent(param.getName(), k -> param.getValue()); } } } - return reenabledChecks; - } - - private boolean reenableNecessaryChecks() { - boolean reenabledChecks = false; - for (java.util.Map.Entry<CheckId, CheckConfiguration> e : checks.entrySet()) { - if (!e.getValue().isEnabled()) { - continue; - } - CheckPrototype c = Checks.getCheckPrototypeForId(e.getKey()); - for (CheckId dep : c.getDependencies()) { - CheckConfiguration checkConfig = checks.get(dep); - if (!checkConfig.isEnabled()) { - checkConfig.setEnabled(true); - reenabledChecks = true; - if (logger.isWarnEnabled()) { - logger.warn(Localization.getText("ValidationConfiguration.reenable"), dep, c.getCheckId()); - } + for (Requirement req : availableRequirements.values()) { + requirements.computeIfAbsent(req.getId(), id -> { + RequirementConfiguration cConfig = new RequirementConfiguration(); + cConfig.setEnabled(true); + for (DefaultParameter param : req.getDefaultParameter()) { + cConfig.getParameters().put(param.getName(), param.getValue()); } - } - insertMissingParametersWithDefaultParameters(e, c); - } - return reenabledChecks; - } - - private void insertMissingParametersWithDefaultParameters(java.util.Map.Entry<CheckId, CheckConfiguration> e, - CheckPrototype c) { - for (DefaultParameter param : c.getDefaultParameter()) { - String configuredValue = e.getValue().getParameters().get(param.getName()); - if (configuredValue == null) { - e.getValue().getParameters().put(param.getName(), param.getDefaultValue()); - } + return cConfig; + }); } + globalParameters.computeIfAbsent(GlobalParameters.MIN_VERTEX_DISTANCE, k -> MIN_VERTEX_DISTANCE_DEFAULT); + globalParameters.computeIfAbsent(GlobalParameters.NUMBER_OF_ROUNDING_PLACES, + k -> NUMBER_OF_ROUNDING_PLACES_DEFAULT); } public int getNumberOfRoundingPlaces() { - return numberOfRoundingPlaces; + return Integer.parseInt(globalParameters.get(GlobalParameters.NUMBER_OF_ROUNDING_PLACES)); } - public void setNumberOfRoundingPlaces(int numberOfRoundingPlaces) { - this.numberOfRoundingPlaces = numberOfRoundingPlaces; + public void setNumberOfRoundingPlacesInGlobalParameters(int numberOfRoundingPlaces) { + globalParameters.put(GlobalParameters.NUMBER_OF_ROUNDING_PLACES, Integer.toString(numberOfRoundingPlaces)); } public ParserConfiguration getParserConfiguration() { if (parserConfig == null) { - parserConfig = new ParserConfiguration(numberOfRoundingPlaces, xmlValidation); + parserConfig = new ParserConfiguration(getNumberOfRoundingPlaces(), xmlValidation); } return parserConfig; } @@ -231,11 +201,31 @@ public class ValidationConfiguration implements Serializable { this.parserConfig = parserConfig; } - public void setMinVertexDistance(double minVertexDistance) { - this.minVertexDistance = minVertexDistance; + public void setMinVertexDistanceInGlobalParameters(double minVertexDistance) { + globalParameters.put(GlobalParameters.MIN_VERTEX_DISTANCE, Double.toString(minVertexDistance)); } public double getMinVertexDistance() { - return minVertexDistance; + return Double.parseDouble(globalParameters.get(GlobalParameters.MIN_VERTEX_DISTANCE)); + } + + public String getSchematronFilePath() { + return globalParameters.get(GlobalParameters.SCHEMATRON_PATH); + } + + public String getNumberOfRoundingPlacesAsString() { + return globalParameters.get(GlobalParameters.NUMBER_OF_ROUNDING_PLACES); + } + + public String getMinVertexDistanceAsString() { + return globalParameters.get(GlobalParameters.MIN_VERTEX_DISTANCE); + } + + public void setSchematronFilePathInGlobalParameters(String string) { + globalParameters.put(GlobalParameters.SCHEMATRON_PATH, string); + } + + public void setRequirements(Map<String, RequirementConfiguration> requirements) { + this.requirements = requirements; } } diff --git a/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/CheckContainer.java b/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/CheckContainer.java index e60d8ec13dea80c9cfc96d8bbeaf62098086d736..eb9ee057586379d73beffce6314ba100503f3f52 100644 --- a/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/CheckContainer.java +++ b/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/CheckContainer.java @@ -20,6 +20,7 @@ package de.hft.stuttgart.citydoctor2.checks; import java.util.List; import java.util.Map; +import java.util.Set; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -28,9 +29,10 @@ import de.hft.stuttgart.citydoctor2.check.Check; import de.hft.stuttgart.citydoctor2.check.CheckError; import de.hft.stuttgart.citydoctor2.check.CheckId; import de.hft.stuttgart.citydoctor2.check.CheckResult; -import de.hft.stuttgart.citydoctor2.check.CheckType; +import de.hft.stuttgart.citydoctor2.check.RequirementType; import de.hft.stuttgart.citydoctor2.check.Checkable; import de.hft.stuttgart.citydoctor2.check.DefaultParameter; +import de.hft.stuttgart.citydoctor2.check.Requirement; import de.hft.stuttgart.citydoctor2.check.ResultStatus; import de.hft.stuttgart.citydoctor2.check.error.UnknownCheckError; import de.hft.stuttgart.citydoctor2.datastructure.AbstractBuilding; @@ -68,6 +70,11 @@ public class CheckContainer extends Check { public CheckContainer(Check check) { this.check = check; } + + @Override + public Set<Requirement> appliesToRequirements() { + return check.appliesToRequirements(); + } @Override public void init(Map<String, String> parameters, ParserConfiguration config) { @@ -244,7 +251,7 @@ public class CheckContainer extends Check { } @Override - public CheckType getType() { + public RequirementType getType() { return check.getType(); } diff --git a/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/CheckPrototype.java b/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/CheckPrototype.java index 9676b59baaa5559ac22a2bbc3f3a8bd56a09a35c..975e9599f3b680ae14d817e9667c89d9ee9a6ad7 100644 --- a/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/CheckPrototype.java +++ b/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/CheckPrototype.java @@ -19,11 +19,13 @@ package de.hft.stuttgart.citydoctor2.checks; import java.util.List; +import java.util.Set; import de.hft.stuttgart.citydoctor2.check.Check; import de.hft.stuttgart.citydoctor2.check.CheckId; -import de.hft.stuttgart.citydoctor2.check.CheckType; +import de.hft.stuttgart.citydoctor2.check.RequirementType; import de.hft.stuttgart.citydoctor2.check.DefaultParameter; +import de.hft.stuttgart.citydoctor2.check.Requirement; /** * This class is for having a read only access to a check for accessing meta @@ -62,8 +64,12 @@ public class CheckPrototype { return c.getDefaultParameter(); } - public CheckType getType() { + public RequirementType getType() { return c.getType(); } + public Set<Requirement> checksRequirements() { + return c.appliesToRequirements(); + } + } diff --git a/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/Checks.java b/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/Checks.java index 61af95865b8f245cf3a697b75011c38e5b4db286..813170a93ed7ed69af5de5597c94fb4309225927 100644 --- a/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/Checks.java +++ b/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/Checks.java @@ -29,15 +29,15 @@ import org.apache.logging.log4j.Logger; import de.hft.stuttgart.citydoctor2.check.Check; import de.hft.stuttgart.citydoctor2.check.CheckId; +import de.hft.stuttgart.citydoctor2.check.Requirement; +import de.hft.stuttgart.citydoctor2.checks.geometry.AllPolygonsWrongOrientationCheck; import de.hft.stuttgart.citydoctor2.checks.geometry.DuplicatePointsCheck; -import de.hft.stuttgart.citydoctor2.checks.geometry.FaceOutCheck; import de.hft.stuttgart.citydoctor2.checks.geometry.HoleOutsideCheck; import de.hft.stuttgart.citydoctor2.checks.geometry.InteriorDisconnectedCheck; import de.hft.stuttgart.citydoctor2.checks.geometry.ManifoldVertexCheck; import de.hft.stuttgart.citydoctor2.checks.geometry.MultipleConnectedComponentCheck; import de.hft.stuttgart.citydoctor2.checks.geometry.NestedRingsCheck; import de.hft.stuttgart.citydoctor2.checks.geometry.NonManifoldEdgeCheck; -import de.hft.stuttgart.citydoctor2.checks.geometry.NumPointsCheck; import de.hft.stuttgart.citydoctor2.checks.geometry.PlanarCheck; import de.hft.stuttgart.citydoctor2.checks.geometry.PolygonIntersectingRingsCheck; import de.hft.stuttgart.citydoctor2.checks.geometry.PolygonSameOrientationCheck; @@ -46,6 +46,7 @@ import de.hft.stuttgart.citydoctor2.checks.geometry.RingNotClosedCheck; import de.hft.stuttgart.citydoctor2.checks.geometry.RingSelfIntCheck; import de.hft.stuttgart.citydoctor2.checks.geometry.SolidNotClosedCheck; import de.hft.stuttgart.citydoctor2.checks.geometry.SolidSelfIntCheck; +import de.hft.stuttgart.citydoctor2.checks.geometry.TooFewPointsCheck; import de.hft.stuttgart.citydoctor2.checks.geometry.TooFewPolygonsCheck; import de.hft.stuttgart.citydoctor2.checks.semantics.IsCeilingCheck; import de.hft.stuttgart.citydoctor2.checks.semantics.IsFloorCheck; @@ -69,6 +70,8 @@ public class Checks { private static List<CheckPrototype> checkPrototypes; private static Map<CheckId, CheckPrototype> prototypeMap; + private static Map<String, Requirement> availableRequirements; + private Map<CheckId, Check> checkMap; @@ -78,7 +81,7 @@ public class Checks { // add new checks here // ring checks - publish(new NumPointsCheck()); + publish(new TooFewPointsCheck()); publish(new RingNotClosedCheck()); publish(new DuplicatePointsCheck()); publish(new RingSelfIntCheck()); @@ -96,7 +99,7 @@ public class Checks { publish(new SolidNotClosedCheck()); publish(new NonManifoldEdgeCheck()); publish(new PolygonWrongOrientationCheck()); - publish(new FaceOutCheck()); + publish(new AllPolygonsWrongOrientationCheck()); publish(new TooFewPolygonsCheck()); publish(new ManifoldVertexCheck()); publish(new SolidSelfIntCheck()); @@ -128,6 +131,30 @@ public class Checks { } } + private static Map<String, Requirement> collectRequirements() { + Map<String, Requirement> requirements = new HashMap<>(); + for (CheckPrototype proto : checkPrototypes) { + for (Requirement req : proto.checksRequirements()) { + requirements.put(req.getId(), req); + } + } + return requirements; + } + + /** + * Gets all requirements for which there are checks that can verify the + * requirements. This is dependent on the available checks as only the checks + * know which requirements they check. + * + * @return a set of available requirements + */ + public static Map<String, Requirement> getAvailableRequirements() { + if (availableRequirements == null) { + availableRequirements = collectRequirements(); + } + return availableRequirements; + } + private static void publish(Check check) { CheckPrototype prototype = new CheckPrototype(check); checkPrototypes.add(prototype); diff --git a/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/geometry/FaceOutCheck.java b/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/geometry/AllPolygonsWrongOrientationCheck.java similarity index 91% rename from CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/geometry/FaceOutCheck.java rename to CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/geometry/AllPolygonsWrongOrientationCheck.java index 00799cd3200d6f2d96c3355678954fc388aaf43c..17d3b1a28d0313ee8cd7a9edf55726928bfdd43c 100644 --- a/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/geometry/FaceOutCheck.java +++ b/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/geometry/AllPolygonsWrongOrientationCheck.java @@ -21,14 +21,17 @@ package de.hft.stuttgart.citydoctor2.checks.geometry; import java.util.ArrayList; import java.util.Collections; import java.util.List; +import java.util.Set; import de.hft.stuttgart.citydoctor2.check.Check; import de.hft.stuttgart.citydoctor2.check.CheckError; import de.hft.stuttgart.citydoctor2.check.CheckId; import de.hft.stuttgart.citydoctor2.check.CheckResult; -import de.hft.stuttgart.citydoctor2.check.CheckType; +import de.hft.stuttgart.citydoctor2.check.RequirementType; +import de.hft.stuttgart.citydoctor2.check.Requirement; import de.hft.stuttgart.citydoctor2.check.ResultStatus; import de.hft.stuttgart.citydoctor2.check.error.AllPolygonsWrongOrientationError; +import de.hft.stuttgart.citydoctor2.checks.util.CollectionUtils; import de.hft.stuttgart.citydoctor2.datastructure.Geometry; import de.hft.stuttgart.citydoctor2.datastructure.GeometryType; import de.hft.stuttgart.citydoctor2.datastructure.Polygon; @@ -38,11 +41,12 @@ import de.hft.stuttgart.citydoctor2.math.Vector3d; import de.hft.stuttgart.citydoctor2.tesselation.TesselatedPolygon; /** + * Checks whether all polygons have the wrong orientation. * - * @author Matthias Betz - 71bema1mst@hft-stuttgart.de + * @author Matthias Betz * */ -public class FaceOutCheck extends Check { +public class AllPolygonsWrongOrientationCheck extends Check { private static final List<CheckId> dependencies; @@ -171,15 +175,20 @@ public class FaceOutCheck extends Check { public List<CheckId> getDependencies() { return dependencies; } + + @Override + public Set<Requirement> appliesToRequirements() { + return CollectionUtils.singletonSet(Requirement.R_GE_S_ALL_POLYGONS_WRONG_ORIENTATION); + } @Override - public CheckType getType() { - return CheckType.GEOMETRY; + public RequirementType getType() { + return RequirementType.GEOMETRY; } @Override public Check createNewInstance() { - return new FaceOutCheck(); + return new AllPolygonsWrongOrientationCheck(); } @Override diff --git a/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/geometry/DuplicatePointsCheck.java b/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/geometry/DuplicatePointsCheck.java index 3e8e6167a19298ec24b7a320784670ed2f716eb1..991e7f259e5661ab98f27d08f4410edbfd687572 100644 --- a/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/geometry/DuplicatePointsCheck.java +++ b/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/geometry/DuplicatePointsCheck.java @@ -22,16 +22,19 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Map; +import java.util.Set; import de.hft.stuttgart.citydoctor2.check.Check; import de.hft.stuttgart.citydoctor2.check.CheckError; import de.hft.stuttgart.citydoctor2.check.CheckId; import de.hft.stuttgart.citydoctor2.check.CheckResult; -import de.hft.stuttgart.citydoctor2.check.CheckType; +import de.hft.stuttgart.citydoctor2.check.RequirementType; import de.hft.stuttgart.citydoctor2.check.Checkable; +import de.hft.stuttgart.citydoctor2.check.Requirement; import de.hft.stuttgart.citydoctor2.check.ResultStatus; import de.hft.stuttgart.citydoctor2.check.error.ConsecutivePointSameError; import de.hft.stuttgart.citydoctor2.check.error.RingDuplicatePointError; +import de.hft.stuttgart.citydoctor2.checks.util.CollectionUtils; import de.hft.stuttgart.citydoctor2.datastructure.LinearRing; import de.hft.stuttgart.citydoctor2.datastructure.Vertex; import de.hft.stuttgart.citydoctor2.parser.ParserConfiguration; @@ -44,7 +47,7 @@ import de.hft.stuttgart.citydoctor2.parser.ParserConfiguration; * <dd> * <dd>CP_CLOSE</dd></dd> * - * @author Matthias Betz - 12bema1bif@hft-stuttgart.de + * @author Matthias Betz * */ public class DuplicatePointsCheck extends Check { @@ -77,6 +80,11 @@ public class DuplicatePointsCheck extends Check { public List<CheckId> getDependencies() { return dependencies; } + + @Override + public Set<Requirement> appliesToRequirements() { + return CollectionUtils.asSet(Requirement.R_GE_R_CONSECUTIVE_POINTS_SAME, Requirement.R_GE_R_SELF_INTERSECTION); + } @Override public void check(LinearRing lr) { @@ -114,8 +122,8 @@ public class DuplicatePointsCheck extends Check { } @Override - public CheckType getType() { - return CheckType.GEOMETRY; + public RequirementType getType() { + return RequirementType.GEOMETRY; } @Override diff --git a/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/geometry/HoleOutsideCheck.java b/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/geometry/HoleOutsideCheck.java index 68f60a14186571f533a6cdb89a503e8eb108bb24..8bb90e5a2df5ad5fec0ed29c7bed85e906c9a627 100644 --- a/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/geometry/HoleOutsideCheck.java +++ b/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/geometry/HoleOutsideCheck.java @@ -21,14 +21,17 @@ package de.hft.stuttgart.citydoctor2.checks.geometry; import java.util.ArrayList; import java.util.Collections; import java.util.List; +import java.util.Set; import de.hft.stuttgart.citydoctor2.check.Check; import de.hft.stuttgart.citydoctor2.check.CheckError; import de.hft.stuttgart.citydoctor2.check.CheckId; import de.hft.stuttgart.citydoctor2.check.CheckResult; -import de.hft.stuttgart.citydoctor2.check.CheckType; +import de.hft.stuttgart.citydoctor2.check.RequirementType; +import de.hft.stuttgart.citydoctor2.check.Requirement; import de.hft.stuttgart.citydoctor2.check.ResultStatus; import de.hft.stuttgart.citydoctor2.check.error.PolygonHoleOutsideError; +import de.hft.stuttgart.citydoctor2.checks.util.CollectionUtils; import de.hft.stuttgart.citydoctor2.datastructure.LinearRing; import de.hft.stuttgart.citydoctor2.datastructure.Polygon; import de.hft.stuttgart.citydoctor2.datastructure.Vertex; @@ -79,10 +82,15 @@ public class HoleOutsideCheck extends Check { public List<CheckId> getDependencies() { return dependencies; } + + @Override + public Set<Requirement> appliesToRequirements() { + return CollectionUtils.singletonSet(Requirement.R_GE_P_HOLE_OUTSIDE); + } @Override - public CheckType getType() { - return CheckType.GEOMETRY; + public RequirementType getType() { + return RequirementType.GEOMETRY; } @Override diff --git a/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/geometry/InteriorDisconnectedCheck.java b/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/geometry/InteriorDisconnectedCheck.java index 95c3e4d24ecd300df18bde011a5f80a9208d8068..99fa9f41016c0ebf955c3d084705addcb01e73a4 100644 --- a/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/geometry/InteriorDisconnectedCheck.java +++ b/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/geometry/InteriorDisconnectedCheck.java @@ -23,14 +23,17 @@ import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Set; import de.hft.stuttgart.citydoctor2.check.Check; import de.hft.stuttgart.citydoctor2.check.CheckError; import de.hft.stuttgart.citydoctor2.check.CheckId; import de.hft.stuttgart.citydoctor2.check.CheckResult; -import de.hft.stuttgart.citydoctor2.check.CheckType; +import de.hft.stuttgart.citydoctor2.check.RequirementType; +import de.hft.stuttgart.citydoctor2.check.Requirement; import de.hft.stuttgart.citydoctor2.check.ResultStatus; import de.hft.stuttgart.citydoctor2.check.error.PolygonInteriorDisconnectedError; +import de.hft.stuttgart.citydoctor2.checks.util.CollectionUtils; import de.hft.stuttgart.citydoctor2.datastructure.LinearRing; import de.hft.stuttgart.citydoctor2.datastructure.Polygon; import de.hft.stuttgart.citydoctor2.datastructure.Vertex; @@ -38,12 +41,18 @@ import de.hft.stuttgart.citydoctor2.math.Segment3d; import de.hft.stuttgart.citydoctor2.math.graph.CycleNode; import de.hft.stuttgart.citydoctor2.parser.ParserConfiguration; +/** + * Checks if a polygon is split up into multiple polygons by interior rings + * + * @author Matthias Betz + * + */ public class InteriorDisconnectedCheck extends Check { - + private static final String EPSILON_NAME = "minVertexDistance"; - + private static final List<CheckId> dependencies; - + static { ArrayList<CheckId> deps = new ArrayList<>(); deps.add(CheckId.C_GE_R_TOO_FEW_POINTS); @@ -53,19 +62,17 @@ public class InteriorDisconnectedCheck extends Check { deps.add(CheckId.C_GE_P_NON_PLANAR); dependencies = Collections.unmodifiableList(deps); } - + private double epsilon = 0.0001; - + @Override public void init(Map<String, String> params, ParserConfiguration config) { String epsilonString = params.get(EPSILON_NAME); - if (epsilonString == null) { - epsilon = 0.0001; - } else { + if (epsilonString != null) { epsilon = Double.parseDouble(epsilonString); } } - + @Override public void check(Polygon p) { if (p.getInnerRings().isEmpty()) { @@ -88,7 +95,7 @@ public class InteriorDisconnectedCheck extends Check { } } } - + for (CycleNode node : nodeMap.values()) { if (node.hasMoreThan2CycleDepth(null)) { // found ring in graph with more than 1 node @@ -127,7 +134,7 @@ public class InteriorDisconnectedCheck extends Check { p.addCheckResult(cr); return true; } - + } } } @@ -152,15 +159,20 @@ public class InteriorDisconnectedCheck extends Check { nodeMap.put(lr, node); } } - + @Override public List<CheckId> getDependencies() { return dependencies; } @Override - public CheckType getType() { - return CheckType.GEOMETRY; + public Set<Requirement> appliesToRequirements() { + return CollectionUtils.singletonSet(Requirement.R_GE_P_INTERIOR_DISCONNECTED); + } + + @Override + public RequirementType getType() { + return RequirementType.GEOMETRY; } @Override diff --git a/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/geometry/ManifoldVertexCheck.java b/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/geometry/ManifoldVertexCheck.java index 5a2c1c928e266b5b6c1d420ed6686ff069a78ed4..5e97cd55d6efd180910d6ec02a5d4092d034b1f7 100644 --- a/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/geometry/ManifoldVertexCheck.java +++ b/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/geometry/ManifoldVertexCheck.java @@ -21,14 +21,17 @@ package de.hft.stuttgart.citydoctor2.checks.geometry; import java.util.ArrayList; import java.util.Collections; import java.util.List; +import java.util.Set; import de.hft.stuttgart.citydoctor2.check.Check; import de.hft.stuttgart.citydoctor2.check.CheckError; import de.hft.stuttgart.citydoctor2.check.CheckId; import de.hft.stuttgart.citydoctor2.check.CheckResult; -import de.hft.stuttgart.citydoctor2.check.CheckType; +import de.hft.stuttgart.citydoctor2.check.RequirementType; +import de.hft.stuttgart.citydoctor2.check.Requirement; import de.hft.stuttgart.citydoctor2.check.ResultStatus; import de.hft.stuttgart.citydoctor2.check.error.NonManifoldVertexError; +import de.hft.stuttgart.citydoctor2.checks.util.CollectionUtils; import de.hft.stuttgart.citydoctor2.datastructure.Edge; import de.hft.stuttgart.citydoctor2.datastructure.Geometry; import de.hft.stuttgart.citydoctor2.datastructure.GeometryType; @@ -40,7 +43,7 @@ import de.hft.stuttgart.citydoctor2.math.graph.PolygonGraph; * Checks if the polygons adjacent to a vertex are attached via edges or are * they discontinuous. * - * @author Matthias Betz - 12bema1bif@hft-stuttgart.de + * @author Matthias Betz * */ public class ManifoldVertexCheck extends Check { @@ -92,10 +95,15 @@ public class ManifoldVertexCheck extends Check { public List<CheckId> getDependencies() { return dependencies; } + + @Override + public Set<Requirement> appliesToRequirements() { + return CollectionUtils.singletonSet(Requirement.R_GE_S_NON_MANIFOLD_VERTEX); + } @Override - public CheckType getType() { - return CheckType.GEOMETRY; + public RequirementType getType() { + return RequirementType.GEOMETRY; } @Override diff --git a/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/geometry/MultipleConnectedComponentCheck.java b/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/geometry/MultipleConnectedComponentCheck.java index 0caf422718a704e99ffbd5eaa1c16eca38b8406f..3d879923cf386fb32ce17ae1ae77b06091fd9ca5 100644 --- a/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/geometry/MultipleConnectedComponentCheck.java +++ b/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/geometry/MultipleConnectedComponentCheck.java @@ -21,14 +21,17 @@ package de.hft.stuttgart.citydoctor2.checks.geometry; import java.util.ArrayList; import java.util.Collections; import java.util.List; +import java.util.Set; import de.hft.stuttgart.citydoctor2.check.Check; import de.hft.stuttgart.citydoctor2.check.CheckError; import de.hft.stuttgart.citydoctor2.check.CheckId; import de.hft.stuttgart.citydoctor2.check.CheckResult; -import de.hft.stuttgart.citydoctor2.check.CheckType; +import de.hft.stuttgart.citydoctor2.check.RequirementType; +import de.hft.stuttgart.citydoctor2.check.Requirement; import de.hft.stuttgart.citydoctor2.check.ResultStatus; import de.hft.stuttgart.citydoctor2.check.error.MultipleConnectedComponentsError; +import de.hft.stuttgart.citydoctor2.checks.util.CollectionUtils; import de.hft.stuttgart.citydoctor2.datastructure.Geometry; import de.hft.stuttgart.citydoctor2.datastructure.GeometryType; import de.hft.stuttgart.citydoctor2.datastructure.Polygon; @@ -38,7 +41,7 @@ import de.hft.stuttgart.citydoctor2.math.graph.PolygonGraph; /** * Checks if all parts of a solid are connected or not. * - * @author Matthias Betz - 12bema1bif@hft-stuttgart.de + * @author Matthias Betz * */ public class MultipleConnectedComponentCheck extends Check { @@ -86,10 +89,15 @@ public class MultipleConnectedComponentCheck extends Check { public List<CheckId> getDependencies() { return dependencies; } + + @Override + public Set<Requirement> appliesToRequirements() { + return CollectionUtils.singletonSet(Requirement.R_GE_S_MULTIPLE_CONNECTED_COMPONENTS); + } @Override - public CheckType getType() { - return CheckType.GEOMETRY; + public RequirementType getType() { + return RequirementType.GEOMETRY; } @Override diff --git a/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/geometry/NestedRingsCheck.java b/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/geometry/NestedRingsCheck.java index 7d5f9cc388ae96c6eb091513776b21a733c413a2..fed3f15e04d7c3aaf9d9cfe6b2e57fcac145749c 100644 --- a/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/geometry/NestedRingsCheck.java +++ b/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/geometry/NestedRingsCheck.java @@ -21,20 +21,30 @@ package de.hft.stuttgart.citydoctor2.checks.geometry; import java.util.ArrayList; import java.util.Collections; import java.util.List; +import java.util.Set; import de.hft.stuttgart.citydoctor2.check.Check; import de.hft.stuttgart.citydoctor2.check.CheckError; import de.hft.stuttgart.citydoctor2.check.CheckId; import de.hft.stuttgart.citydoctor2.check.CheckResult; -import de.hft.stuttgart.citydoctor2.check.CheckType; +import de.hft.stuttgart.citydoctor2.check.RequirementType; +import de.hft.stuttgart.citydoctor2.check.Requirement; import de.hft.stuttgart.citydoctor2.check.ResultStatus; import de.hft.stuttgart.citydoctor2.check.error.NestedRingError; +import de.hft.stuttgart.citydoctor2.checks.util.CollectionUtils; import de.hft.stuttgart.citydoctor2.datastructure.LinearRing; import de.hft.stuttgart.citydoctor2.datastructure.Polygon; import de.hft.stuttgart.citydoctor2.datastructure.Vertex; +/** + * Checks whether a inner ring is completely contained in another inner ring + * within the same polygon + * + * @author Matthias Betz + * + */ public class NestedRingsCheck extends Check { - + private static final List<CheckId> dependencies; static { @@ -47,7 +57,7 @@ public class NestedRingsCheck extends Check { deps.add(CheckId.C_GE_P_ORIENTATION_RINGS_SAME); dependencies = Collections.unmodifiableList(deps); } - + @Override public void check(Polygon p) { for (LinearRing interiorRing : p.getInnerRings()) { @@ -85,10 +95,15 @@ public class NestedRingsCheck extends Check { public List<CheckId> getDependencies() { return dependencies; } + + @Override + public Set<Requirement> appliesToRequirements() { + return CollectionUtils.singletonSet(Requirement.R_GE_P_INNER_RINGS_NESTED); + } @Override - public CheckType getType() { - return CheckType.GEOMETRY; + public RequirementType getType() { + return RequirementType.GEOMETRY; } @Override diff --git a/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/geometry/NonManifoldEdgeCheck.java b/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/geometry/NonManifoldEdgeCheck.java index 2f634d42d8d93ab0bd94b30f16997fb184136e36..9d4261cd61888fdcbc3b74e18ab4be89aaa25f74 100644 --- a/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/geometry/NonManifoldEdgeCheck.java +++ b/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/geometry/NonManifoldEdgeCheck.java @@ -21,14 +21,17 @@ package de.hft.stuttgart.citydoctor2.checks.geometry; import java.util.ArrayList; import java.util.Collections; import java.util.List; +import java.util.Set; import de.hft.stuttgart.citydoctor2.check.Check; import de.hft.stuttgart.citydoctor2.check.CheckError; import de.hft.stuttgart.citydoctor2.check.CheckId; import de.hft.stuttgart.citydoctor2.check.CheckResult; -import de.hft.stuttgart.citydoctor2.check.CheckType; +import de.hft.stuttgart.citydoctor2.check.RequirementType; +import de.hft.stuttgart.citydoctor2.check.Requirement; import de.hft.stuttgart.citydoctor2.check.ResultStatus; import de.hft.stuttgart.citydoctor2.check.error.NonManifoldEdgeError; +import de.hft.stuttgart.citydoctor2.checks.util.CollectionUtils; import de.hft.stuttgart.citydoctor2.datastructure.Edge; import de.hft.stuttgart.citydoctor2.datastructure.Geometry; import de.hft.stuttgart.citydoctor2.datastructure.GeometryType; @@ -37,7 +40,9 @@ import de.hft.stuttgart.citydoctor2.datastructure.GeometryType; * This class detects half edges with more than two neighbors, i.e. * non-2-manifold geometries * - * @author dwagner, alam + * @author dwagner + * @author alam + * @author Matthias Betz */ public class NonManifoldEdgeCheck extends Check { @@ -80,6 +85,11 @@ public class NonManifoldEdgeCheck extends Check { } g.addCheckResult(cr); } + + @Override + public Set<Requirement> appliesToRequirements() { + return CollectionUtils.singletonSet(Requirement.R_GE_S_NON_MANIFOLD_EDGE); + } @Override public List<CheckId> getDependencies() { @@ -87,8 +97,8 @@ public class NonManifoldEdgeCheck extends Check { } @Override - public CheckType getType() { - return CheckType.GEOMETRY; + public RequirementType getType() { + return RequirementType.GEOMETRY; } @Override diff --git a/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/geometry/NullAreaCheck.java b/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/geometry/NullAreaCheck.java index 8f3a2c40c8878b18315adceaa8d021d758e86957..3b5a6fbe28a8726f67e13c7b295111ec9227c990 100644 --- a/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/geometry/NullAreaCheck.java +++ b/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/geometry/NullAreaCheck.java @@ -22,15 +22,18 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Map; +import java.util.Set; import de.hft.stuttgart.citydoctor2.check.Check; import de.hft.stuttgart.citydoctor2.check.CheckId; import de.hft.stuttgart.citydoctor2.check.CheckResult; -import de.hft.stuttgart.citydoctor2.check.CheckType; +import de.hft.stuttgart.citydoctor2.check.RequirementType; import de.hft.stuttgart.citydoctor2.check.DefaultParameter; +import de.hft.stuttgart.citydoctor2.check.Requirement; import de.hft.stuttgart.citydoctor2.check.ResultStatus; import de.hft.stuttgart.citydoctor2.check.Unit; import de.hft.stuttgart.citydoctor2.check.error.NullAreaError; +import de.hft.stuttgart.citydoctor2.checks.util.CollectionUtils; import de.hft.stuttgart.citydoctor2.datastructure.LinearRing; import de.hft.stuttgart.citydoctor2.datastructure.Vertex; import de.hft.stuttgart.citydoctor2.math.Line3d; @@ -106,6 +109,11 @@ public class NullAreaCheck extends Check { } return area < 0.0001; } + + @Override + public Set<Requirement> appliesToRequirements() { + return CollectionUtils.singletonSet(Requirement.R_GE_R_NULL_AREA); + } @Override public List<CheckId> getDependencies() { @@ -113,8 +121,8 @@ public class NullAreaCheck extends Check { } @Override - public CheckType getType() { - return CheckType.GEOMETRY; + public RequirementType getType() { + return RequirementType.GEOMETRY; } diff --git a/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/geometry/PlanarCheck.java b/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/geometry/PlanarCheck.java index 9f63a86fd58173d7655607329c3ca9b0aaa8b938..46b42ff92f75dbeff8408c3ae740eed73add6d7d 100644 --- a/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/geometry/PlanarCheck.java +++ b/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/geometry/PlanarCheck.java @@ -22,23 +22,28 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Map; +import java.util.Set; import Jama.EigenvalueDecomposition; import de.hft.stuttgart.citydoctor2.check.Check; import de.hft.stuttgart.citydoctor2.check.CheckError; import de.hft.stuttgart.citydoctor2.check.CheckId; import de.hft.stuttgart.citydoctor2.check.CheckResult; -import de.hft.stuttgart.citydoctor2.check.CheckType; +import de.hft.stuttgart.citydoctor2.check.RequirementType; import de.hft.stuttgart.citydoctor2.check.DefaultParameter; +import de.hft.stuttgart.citydoctor2.check.Requirement; import de.hft.stuttgart.citydoctor2.check.ResultStatus; import de.hft.stuttgart.citydoctor2.check.Unit; +import de.hft.stuttgart.citydoctor2.check.error.DegeneratedPolygonError; import de.hft.stuttgart.citydoctor2.check.error.NonPlanarPolygonDistancePlaneError; import de.hft.stuttgart.citydoctor2.check.error.NonPlanarPolygonNormalsDeviation; -import de.hft.stuttgart.citydoctor2.check.error.DegeneratedPolygonError; +import de.hft.stuttgart.citydoctor2.checks.util.CollectionUtils; +import de.hft.stuttgart.citydoctor2.datastructure.BoundingBox; import de.hft.stuttgart.citydoctor2.datastructure.LinearRing; import de.hft.stuttgart.citydoctor2.datastructure.Polygon; import de.hft.stuttgart.citydoctor2.datastructure.Vertex; import de.hft.stuttgart.citydoctor2.math.CovarianceMatrix; +import de.hft.stuttgart.citydoctor2.math.Matrix3x3d; import de.hft.stuttgart.citydoctor2.math.OrthogonalRegressionPlane; import de.hft.stuttgart.citydoctor2.math.Plane; import de.hft.stuttgart.citydoctor2.math.Triangle3d; @@ -48,18 +53,19 @@ import de.hft.stuttgart.citydoctor2.tesselation.JoglTesselator; import de.hft.stuttgart.citydoctor2.tesselation.TesselatedPolygon; /** - * Check class to check for planarity issues + * Check class to check for planarity issues as well as degenerated polygons. + * Checks for regression plane and normal issues. * * @author Matthias Betz * */ public class PlanarCheck extends Check { - private static final String DISTANCE = "distance"; - private static final String DISTANCE_TOLERANCE = "distanceTolerance"; - private static final String ANGLE_TOLERANCE = "angleTolerance"; - private static final String TYPE = "type"; - private static final String DEGENERATED_POLYGON_TOLERANCE = "degeneratedPolygonTolerance"; + public static final String DISTANCE = "distance"; + public static final String DISTANCE_TOLERANCE = "distanceTolerance"; + public static final String ANGLE_TOLERANCE = "angleTolerance"; + public static final String TYPE = "type"; + public static final String DEGENERATED_POLYGON_TOLERANCE = "degeneratedPolygonTolerance"; private static final List<CheckId> dependencies; private static final List<DefaultParameter> defaultParameters; @@ -91,6 +97,8 @@ public class PlanarCheck extends Check { public void init(Map<String, String> parameters, ParserConfiguration config) { if (parameters.containsKey(TYPE)) { planarCheckType = parameters.get(TYPE).toLowerCase(); + } else { + throw new IllegalStateException("Parameter " + TYPE + " is missing from parameters"); } if (parameters.containsKey(ANGLE_TOLERANCE)) { rad = Math.toRadians(Double.parseDouble(parameters.get(ANGLE_TOLERANCE))); @@ -115,8 +123,10 @@ public class PlanarCheck extends Check { } else if ("angle".equals(planarCheckType)) { // check for tiny edge as well // store all used points in temporary list - Vector3d eigenvalues = calculatedEigenvalues(p); - if (checkEigenvalues(p, eigenvalues)) { + ArrayList<Vertex> vertices = collectVertices(p); + Vector3d centroid = CovarianceMatrix.getCentroid(vertices); + EigenvalueDecomposition ed = OrthogonalRegressionPlane.decompose(vertices, centroid); + if (checkEigenvalues(p, vertices, ed)) { // found tiny edge error, abort further checking return; } @@ -130,13 +140,6 @@ public class PlanarCheck extends Check { } } - private Vector3d calculatedEigenvalues(Polygon p) { - ArrayList<Vertex> vertices = collectVertices(p); - Vector3d centroid = CovarianceMatrix.getCentroid(vertices); - EigenvalueDecomposition ed = OrthogonalRegressionPlane.decompose(vertices, centroid); - return OrthogonalRegressionPlane.getEigenvalues(ed); - } - private void planarNormalDeviation(Polygon p) { TesselatedPolygon tp = JoglTesselator.tesselatePolygon(p); ArrayList<Vector3d> normals = new ArrayList<>(); @@ -185,13 +188,13 @@ public class PlanarCheck extends Check { ArrayList<Vertex> vertices = collectVertices(p); Vector3d centroid = CovarianceMatrix.getCentroid(vertices); EigenvalueDecomposition ed = OrthogonalRegressionPlane.decompose(vertices, centroid); - Vector3d eigenvalues = OrthogonalRegressionPlane.getEigenvalues(ed); - if (checkEigenvalues(p, eigenvalues)) { + if (checkEigenvalues(p, vertices, ed)) { // found tiny edge error, abort further checking return; } + Vector3d eigenvalues = OrthogonalRegressionPlane.getEigenvalues(ed); Plane plane = OrthogonalRegressionPlane.calculatePlane(centroid, ed, eigenvalues); for (Vertex v : vertices) { double distance = plane.getDistance(v); @@ -224,13 +227,25 @@ public class PlanarCheck extends Check { return vertices; } - private boolean checkEigenvalues(Polygon p, Vector3d eigenvalues) { + private boolean checkEigenvalues(Polygon p, List<Vertex> points, EigenvalueDecomposition ed) { + Matrix3x3d mat = new Matrix3x3d(ed.getV().getArray()); + List<Vector3d> rotatedVertices = new ArrayList<>(); + for (Vertex v : points) { + rotatedVertices.add(mat.mult(v)); + } + BoundingBox bbox = BoundingBox.ofPoints(rotatedVertices); + int nrOfEigenvaluesBelowTolerance = 0; - for (double d : eigenvalues.getCoordinates()) { - if (d <= degeneratedPolygonTolerance) { - nrOfEigenvaluesBelowTolerance++; - } + if (bbox.getWidth() < degeneratedPolygonTolerance) { + nrOfEigenvaluesBelowTolerance++; + } + if (bbox.getHeight() < degeneratedPolygonTolerance) { + nrOfEigenvaluesBelowTolerance++; + } + if (bbox.getDepth() < degeneratedPolygonTolerance) { + nrOfEigenvaluesBelowTolerance++; } + if (nrOfEigenvaluesBelowTolerance >= 2) { CheckError err = new DegeneratedPolygonError(p); p.addCheckResult(new CheckResult(this, ResultStatus.ERROR, err)); @@ -245,8 +260,13 @@ public class PlanarCheck extends Check { } @Override - public CheckType getType() { - return CheckType.GEOMETRY; + public Set<Requirement> appliesToRequirements() { + return CollectionUtils.singletonSet(Requirement.R_GE_P_NON_PLANAR); + } + + @Override + public RequirementType getType() { + return RequirementType.GEOMETRY; } @Override diff --git a/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/geometry/PolygonIntersectingRingsCheck.java b/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/geometry/PolygonIntersectingRingsCheck.java index 9eb7c24ff7e746ef9a546ee1e834fbc6a2f36b81..0e2e834f710a3273e97410bce98c41029729af1a 100644 --- a/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/geometry/PolygonIntersectingRingsCheck.java +++ b/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/geometry/PolygonIntersectingRingsCheck.java @@ -21,14 +21,17 @@ package de.hft.stuttgart.citydoctor2.checks.geometry; import java.util.ArrayList; import java.util.Collections; import java.util.List; +import java.util.Set; import de.hft.stuttgart.citydoctor2.check.Check; import de.hft.stuttgart.citydoctor2.check.CheckError; import de.hft.stuttgart.citydoctor2.check.CheckId; import de.hft.stuttgart.citydoctor2.check.CheckResult; -import de.hft.stuttgart.citydoctor2.check.CheckType; +import de.hft.stuttgart.citydoctor2.check.RequirementType; +import de.hft.stuttgart.citydoctor2.check.Requirement; import de.hft.stuttgart.citydoctor2.check.ResultStatus; import de.hft.stuttgart.citydoctor2.check.error.PolygonIntersectingRingsError; +import de.hft.stuttgart.citydoctor2.checks.util.CollectionUtils; import de.hft.stuttgart.citydoctor2.datastructure.LinearRing; import de.hft.stuttgart.citydoctor2.datastructure.Polygon; import de.hft.stuttgart.citydoctor2.math.Polygon2d; @@ -38,11 +41,16 @@ import de.hft.stuttgart.citydoctor2.math.Vector2d; import de.hft.stuttgart.citydoctor2.utils.Pair; import de.hft.stuttgart.citydoctor2.utils.SerializablePair; +/** + * Checks whether linear rings within a polygon are intersecting with each other + * + * @author Matthias Betz + * + */ public class PolygonIntersectingRingsCheck extends Check { - private static final List<CheckId> dependencies; - + static { ArrayList<CheckId> deps = new ArrayList<>(); deps.add(CheckId.C_GE_R_TOO_FEW_POINTS); @@ -54,7 +62,7 @@ public class PolygonIntersectingRingsCheck extends Check { deps.add(CheckId.C_GE_P_INNER_RINGS_NESTED); dependencies = Collections.unmodifiableList(deps); } - + @Override public void check(Polygon p) { if (p.getInnerRings().isEmpty()) { @@ -73,7 +81,7 @@ public class PolygonIntersectingRingsCheck extends Check { } p.addCheckResult(cr); } - + public SerializablePair<LinearRing, LinearRing> interiorRingsIntersectWithExterior(Polygon p) { List<Pair<LinearRing, List<Segment2d>>> ringSegments = projectTo2D(p); for (int i = 0; i < ringSegments.size() - 1; i++) { @@ -124,8 +132,13 @@ public class PolygonIntersectingRingsCheck extends Check { } @Override - public CheckType getType() { - return CheckType.GEOMETRY; + public Set<Requirement> appliesToRequirements() { + return CollectionUtils.singletonSet(Requirement.R_GE_P_INTERSECTING_RINGS); + } + + @Override + public RequirementType getType() { + return RequirementType.GEOMETRY; } @Override diff --git a/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/geometry/PolygonSameOrientationCheck.java b/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/geometry/PolygonSameOrientationCheck.java index 7257585efbe6f275644c7945af9f49b11495952d..778ec210ff6a9a65c1201f815e0de19a89897d2b 100644 --- a/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/geometry/PolygonSameOrientationCheck.java +++ b/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/geometry/PolygonSameOrientationCheck.java @@ -21,22 +21,33 @@ package de.hft.stuttgart.citydoctor2.checks.geometry; import java.util.ArrayList; import java.util.Collections; import java.util.List; +import java.util.Set; import de.hft.stuttgart.citydoctor2.check.Check; import de.hft.stuttgart.citydoctor2.check.CheckError; import de.hft.stuttgart.citydoctor2.check.CheckId; import de.hft.stuttgart.citydoctor2.check.CheckResult; -import de.hft.stuttgart.citydoctor2.check.CheckType; +import de.hft.stuttgart.citydoctor2.check.RequirementType; +import de.hft.stuttgart.citydoctor2.check.Requirement; import de.hft.stuttgart.citydoctor2.check.ResultStatus; import de.hft.stuttgart.citydoctor2.check.error.PolygonSameOrientationError; +import de.hft.stuttgart.citydoctor2.checks.util.CollectionUtils; import de.hft.stuttgart.citydoctor2.checks.util.Orientation; import de.hft.stuttgart.citydoctor2.checks.util.RingOrientationUtil; import de.hft.stuttgart.citydoctor2.datastructure.Polygon; import de.hft.stuttgart.citydoctor2.math.Polygon2d; import de.hft.stuttgart.citydoctor2.math.Ring2d; +/** + * This class checks whether a linear ring and the exterior ring of a polygon + * have the same orientation. A inner ring must be oriented in the opposite + * direction than the exterior ring. + * + * @author Matthias Betz + * + */ public class PolygonSameOrientationCheck extends Check { - + private static final List<CheckId> dependencies; static { @@ -48,7 +59,7 @@ public class PolygonSameOrientationCheck extends Check { deps.add(CheckId.C_GE_P_NON_PLANAR); dependencies = Collections.unmodifiableList(deps); } - + @Override public void check(Polygon p) { if (p.getInnerRings().isEmpty()) { @@ -67,7 +78,7 @@ public class PolygonSameOrientationCheck extends Check { return; } } - + // no error found, or the method would have terminated previously CheckResult cr = new CheckResult(this, ResultStatus.OK, null); p.addCheckResult(cr); @@ -80,8 +91,13 @@ public class PolygonSameOrientationCheck extends Check { } @Override - public CheckType getType() { - return CheckType.GEOMETRY; + public Set<Requirement> appliesToRequirements() { + return CollectionUtils.singletonSet(Requirement.R_GE_P_ORIENTATION_RINGS_SAME); + } + + @Override + public RequirementType getType() { + return RequirementType.GEOMETRY; } @Override diff --git a/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/geometry/PolygonWrongOrientationCheck.java b/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/geometry/PolygonWrongOrientationCheck.java index c0e8fd9a2f4a1aa3808513ae84bf575f2fdfc158..38c9629c14efb3ebdd04d890194d4d9dbdcc5fb1 100644 --- a/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/geometry/PolygonWrongOrientationCheck.java +++ b/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/geometry/PolygonWrongOrientationCheck.java @@ -21,28 +21,32 @@ package de.hft.stuttgart.citydoctor2.checks.geometry; import java.util.ArrayList; import java.util.Collections; import java.util.List; +import java.util.Set; import de.hft.stuttgart.citydoctor2.check.Check; import de.hft.stuttgart.citydoctor2.check.CheckError; import de.hft.stuttgart.citydoctor2.check.CheckId; import de.hft.stuttgart.citydoctor2.check.CheckResult; -import de.hft.stuttgart.citydoctor2.check.CheckType; +import de.hft.stuttgart.citydoctor2.check.RequirementType; +import de.hft.stuttgart.citydoctor2.check.Requirement; import de.hft.stuttgart.citydoctor2.check.ResultStatus; import de.hft.stuttgart.citydoctor2.check.error.PolygonWrongOrientationError; +import de.hft.stuttgart.citydoctor2.checks.util.CollectionUtils; import de.hft.stuttgart.citydoctor2.datastructure.Edge; import de.hft.stuttgart.citydoctor2.datastructure.Geometry; import de.hft.stuttgart.citydoctor2.datastructure.GeometryType; /** - * This class checks the orientation of each face of a solid - * @author Matthias Betz - 12bema1bif@hft-stuttgart.de + * Checks whether polygons share a edge that is walked more than one time in the + * same direction by two or more polygons indicating that a polygon is oriented wrong. + * + * @author Matthias Betz * */ public class PolygonWrongOrientationCheck extends Check { - private static final List<CheckId> dependencies; - + static { ArrayList<CheckId> deps = new ArrayList<>(); deps.add(CheckId.C_GE_R_TOO_FEW_POINTS); @@ -57,19 +61,19 @@ public class PolygonWrongOrientationCheck extends Check { deps.add(CheckId.C_GE_S_NON_MANIFOLD_EDGE); dependencies = Collections.unmodifiableList(deps); } - + @Override public void check(Geometry g) { // only for solids if (g.getType() != GeometryType.SOLID) { return; } - + List<Edge> faultyEdges = new ArrayList<>(); for (Edge edge : g.getEdges()) { if (edge.getNumberOfHalfEdges() != edge.getNumberOppositeHalfEdges()) { faultyEdges.add(edge); - } + } } CheckResult cr; if (faultyEdges.isEmpty()) { @@ -80,15 +84,20 @@ public class PolygonWrongOrientationCheck extends Check { } g.addCheckResult(cr); } - + @Override public List<CheckId> getDependencies() { return dependencies; } - + + @Override + public Set<Requirement> appliesToRequirements() { + return CollectionUtils.singletonSet(Requirement.R_GE_S_POLYGON_WRONG_ORIENTATION); + } + @Override - public CheckType getType() { - return CheckType.GEOMETRY; + public RequirementType getType() { + return RequirementType.GEOMETRY; } @Override diff --git a/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/geometry/RingNotClosedCheck.java b/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/geometry/RingNotClosedCheck.java index 156af281fc8e7f67002339754fff52d4e42bef5c..b1948f7e5064dd9e734a956ed22e8c923090a3aa 100644 --- a/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/geometry/RingNotClosedCheck.java +++ b/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/geometry/RingNotClosedCheck.java @@ -21,22 +21,25 @@ package de.hft.stuttgart.citydoctor2.checks.geometry; import java.util.ArrayList; import java.util.Collections; import java.util.List; +import java.util.Set; import de.hft.stuttgart.citydoctor2.check.Check; import de.hft.stuttgart.citydoctor2.check.CheckError; import de.hft.stuttgart.citydoctor2.check.CheckId; import de.hft.stuttgart.citydoctor2.check.CheckResult; -import de.hft.stuttgart.citydoctor2.check.CheckType; +import de.hft.stuttgart.citydoctor2.check.RequirementType; +import de.hft.stuttgart.citydoctor2.check.Requirement; import de.hft.stuttgart.citydoctor2.check.ResultStatus; import de.hft.stuttgart.citydoctor2.check.error.RingNotClosedError; +import de.hft.stuttgart.citydoctor2.checks.util.CollectionUtils; import de.hft.stuttgart.citydoctor2.datastructure.LinearRing; import de.hft.stuttgart.citydoctor2.datastructure.Vertex; /** - * CP_CLOSE checks the closeness a linear ring. A linear ring must end where it + * C_GE_R_NOT_CLOSED checks the closeness a linear ring. A linear ring must end where it * started. * - * @author Matthias Betz - 12bema1bif@hft-stuttgart.de + * @author Matthias Betz * */ public class RingNotClosedCheck extends Check { @@ -69,8 +72,13 @@ public class RingNotClosedCheck extends Check { } @Override - public CheckType getType() { - return CheckType.GEOMETRY; + public RequirementType getType() { + return RequirementType.GEOMETRY; + } + + @Override + public Set<Requirement> appliesToRequirements() { + return CollectionUtils.singletonSet(Requirement.R_GE_R_NOT_CLOSED); } @Override diff --git a/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/geometry/RingSelfIntCheck.java b/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/geometry/RingSelfIntCheck.java index f65b0f87170a1ce766aabf89dd7a275749806b64..05981213b99353e3d638f70044a38703848fea68 100644 --- a/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/geometry/RingSelfIntCheck.java +++ b/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/geometry/RingSelfIntCheck.java @@ -22,16 +22,19 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Map; +import java.util.Set; import de.hft.stuttgart.citydoctor2.check.Check; import de.hft.stuttgart.citydoctor2.check.CheckError; import de.hft.stuttgart.citydoctor2.check.CheckId; import de.hft.stuttgart.citydoctor2.check.CheckResult; -import de.hft.stuttgart.citydoctor2.check.CheckType; +import de.hft.stuttgart.citydoctor2.check.RequirementType; +import de.hft.stuttgart.citydoctor2.check.Requirement; import de.hft.stuttgart.citydoctor2.check.ResultStatus; import de.hft.stuttgart.citydoctor2.check.error.PointTouchesEdgeError; import de.hft.stuttgart.citydoctor2.check.error.RingEdgeIntersectionError; import de.hft.stuttgart.citydoctor2.checks.Checks; +import de.hft.stuttgart.citydoctor2.checks.util.CollectionUtils; import de.hft.stuttgart.citydoctor2.datastructure.Edge; import de.hft.stuttgart.citydoctor2.datastructure.Geometry; import de.hft.stuttgart.citydoctor2.datastructure.LinearRing; @@ -40,6 +43,13 @@ import de.hft.stuttgart.citydoctor2.math.DistanceResult; import de.hft.stuttgart.citydoctor2.math.Segment3d; import de.hft.stuttgart.citydoctor2.parser.ParserConfiguration; +/** + * Checks whether a ring self intersects. Also checks if a point is too close to + * an edge of the ring. + * + * @author Matthias Betz + * + */ public class RingSelfIntCheck extends Check { private static final String EPSILON_NAME = "minVertexDistance"; @@ -138,8 +148,13 @@ public class RingSelfIntCheck extends Check { } @Override - public CheckType getType() { - return CheckType.GEOMETRY; + public Set<Requirement> appliesToRequirements() { + return CollectionUtils.singletonSet(Requirement.R_GE_R_SELF_INTERSECTION); + } + + @Override + public RequirementType getType() { + return RequirementType.GEOMETRY; } @Override diff --git a/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/geometry/SolidNotClosedCheck.java b/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/geometry/SolidNotClosedCheck.java index 2239d9459280456ffc13f02cd5a21eae320315d2..fb282bbe5e3ff2cd12c8ada297e645b39ccee7f7 100644 --- a/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/geometry/SolidNotClosedCheck.java +++ b/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/geometry/SolidNotClosedCheck.java @@ -21,14 +21,17 @@ package de.hft.stuttgart.citydoctor2.checks.geometry; import java.util.ArrayList; import java.util.Collections; import java.util.List; +import java.util.Set; import de.hft.stuttgart.citydoctor2.check.Check; import de.hft.stuttgart.citydoctor2.check.CheckError; import de.hft.stuttgart.citydoctor2.check.CheckId; import de.hft.stuttgart.citydoctor2.check.CheckResult; -import de.hft.stuttgart.citydoctor2.check.CheckType; +import de.hft.stuttgart.citydoctor2.check.RequirementType; +import de.hft.stuttgart.citydoctor2.check.Requirement; import de.hft.stuttgart.citydoctor2.check.ResultStatus; import de.hft.stuttgart.citydoctor2.check.error.SolidNotClosedError; +import de.hft.stuttgart.citydoctor2.checks.util.CollectionUtils; import de.hft.stuttgart.citydoctor2.datastructure.Edge; import de.hft.stuttgart.citydoctor2.datastructure.Geometry; import de.hft.stuttgart.citydoctor2.datastructure.GeometryType; @@ -37,8 +40,9 @@ import de.hft.stuttgart.citydoctor2.datastructure.GeometryType; * This class detects half edges without neighbor, i.e. holes in solid * geometries * - * @author dwagner, alam - * @author Matthias Betz - 12bema1bif@hft-stuttgart.de + * @author dwagner + * @author alam + * @author Matthias Betz */ public class SolidNotClosedCheck extends Check { @@ -87,10 +91,15 @@ public class SolidNotClosedCheck extends Check { public List<CheckId> getDependencies() { return dependencies; } + + @Override + public Set<Requirement> appliesToRequirements() { + return CollectionUtils.singletonSet(Requirement.R_GE_S_NOT_CLOSED); + } @Override - public CheckType getType() { - return CheckType.GEOMETRY; + public RequirementType getType() { + return RequirementType.GEOMETRY; } @Override diff --git a/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/geometry/SolidSelfIntCheck.java b/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/geometry/SolidSelfIntCheck.java index ed5f7d065fef919c7dd54a91455f896e47be60d6..67f16dd4c120e05c325fb65644a9faae3057eb65 100644 --- a/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/geometry/SolidSelfIntCheck.java +++ b/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/geometry/SolidSelfIntCheck.java @@ -21,15 +21,18 @@ package de.hft.stuttgart.citydoctor2.checks.geometry; import java.util.ArrayList; import java.util.Collections; import java.util.List; +import java.util.Set; import de.hft.stuttgart.citydoctor2.check.Check; import de.hft.stuttgart.citydoctor2.check.CheckError; import de.hft.stuttgart.citydoctor2.check.CheckId; import de.hft.stuttgart.citydoctor2.check.CheckResult; -import de.hft.stuttgart.citydoctor2.check.CheckType; +import de.hft.stuttgart.citydoctor2.check.RequirementType; import de.hft.stuttgart.citydoctor2.check.GeometrySelfIntersection; +import de.hft.stuttgart.citydoctor2.check.Requirement; import de.hft.stuttgart.citydoctor2.check.ResultStatus; import de.hft.stuttgart.citydoctor2.check.error.SolidSelfIntError; +import de.hft.stuttgart.citydoctor2.checks.util.CollectionUtils; import de.hft.stuttgart.citydoctor2.checks.util.SelfIntersectionUtil; import de.hft.stuttgart.citydoctor2.datastructure.Geometry; import de.hft.stuttgart.citydoctor2.datastructure.GeometryType; @@ -98,10 +101,15 @@ public class SolidSelfIntCheck extends Check { public List<CheckId> getDependencies() { return dependencies; } + + @Override + public Set<Requirement> appliesToRequirements() { + return CollectionUtils.singletonSet(Requirement.R_GE_S_SELF_INTERSECTION); + } @Override - public CheckType getType() { - return CheckType.GEOMETRY; + public RequirementType getType() { + return RequirementType.GEOMETRY; } @Override diff --git a/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/geometry/NumPointsCheck.java b/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/geometry/TooFewPointsCheck.java similarity index 83% rename from CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/geometry/NumPointsCheck.java rename to CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/geometry/TooFewPointsCheck.java index f2e7cbe8b0754eefcef7e4c53231b6cbfac1a96d..1eb348c325c58f8557335a0db3c9f0c2c325ff95 100644 --- a/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/geometry/NumPointsCheck.java +++ b/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/geometry/TooFewPointsCheck.java @@ -28,23 +28,25 @@ import de.hft.stuttgart.citydoctor2.check.Check; import de.hft.stuttgart.citydoctor2.check.CheckError; import de.hft.stuttgart.citydoctor2.check.CheckId; import de.hft.stuttgart.citydoctor2.check.CheckResult; -import de.hft.stuttgart.citydoctor2.check.CheckType; +import de.hft.stuttgart.citydoctor2.check.RequirementType; +import de.hft.stuttgart.citydoctor2.check.Requirement; import de.hft.stuttgart.citydoctor2.check.ResultStatus; import de.hft.stuttgart.citydoctor2.check.error.RingTooFewPointsError; +import de.hft.stuttgart.citydoctor2.checks.util.CollectionUtils; import de.hft.stuttgart.citydoctor2.datastructure.LinearRing; import de.hft.stuttgart.citydoctor2.datastructure.Vertex; /** - * CP_NUMPOINTS checks the minimum number of point in a linear ring. At least + * C_GE_R_TOO_FEW_POINTS checks the minimum number of point in a linear ring. At least * three vertices are minimum for a linear ring. <br/> * <br/> * <b>Dependency:</b> <br/> * <dd> - * <dd>none</dd></dd> + * <dd>C_GE_R_NOT_CLOSED</dd></dd> * - * @author Matthias Betz - 12bema1bif@hft-stuttgart.de + * @author Matthias Betz */ -public class NumPointsCheck extends Check { +public class TooFewPointsCheck extends Check { private static final List<CheckId> dependencies; @@ -95,15 +97,20 @@ public class NumPointsCheck extends Check { public List<CheckId> getDependencies() { return dependencies; } + + @Override + public Set<Requirement> appliesToRequirements() { + return CollectionUtils.singletonSet(Requirement.R_GE_R_TOO_FEW_POINTS); + } @Override - public CheckType getType() { - return CheckType.GEOMETRY; + public RequirementType getType() { + return RequirementType.GEOMETRY; } @Override public Check createNewInstance() { - return new NumPointsCheck(); + return new TooFewPointsCheck(); } @Override diff --git a/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/geometry/TooFewPolygonsCheck.java b/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/geometry/TooFewPolygonsCheck.java index 9365e87ebbffc9f09b806e92c9fb6ad3ac7e7893..670e00942330074304ad63f97e968e9bce314d1a 100644 --- a/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/geometry/TooFewPolygonsCheck.java +++ b/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/geometry/TooFewPolygonsCheck.java @@ -21,21 +21,24 @@ package de.hft.stuttgart.citydoctor2.checks.geometry; import java.util.ArrayList; import java.util.Collections; import java.util.List; +import java.util.Set; import de.hft.stuttgart.citydoctor2.check.Check; import de.hft.stuttgart.citydoctor2.check.CheckError; import de.hft.stuttgart.citydoctor2.check.CheckId; import de.hft.stuttgart.citydoctor2.check.CheckResult; -import de.hft.stuttgart.citydoctor2.check.CheckType; +import de.hft.stuttgart.citydoctor2.check.RequirementType; +import de.hft.stuttgart.citydoctor2.check.Requirement; import de.hft.stuttgart.citydoctor2.check.ResultStatus; import de.hft.stuttgart.citydoctor2.check.error.TooFewPolygonsError; +import de.hft.stuttgart.citydoctor2.checks.util.CollectionUtils; import de.hft.stuttgart.citydoctor2.datastructure.Geometry; import de.hft.stuttgart.citydoctor2.datastructure.GeometryType; /** - * This class checks minimum number of planes for a solid + * This class checks minimum number of polygons for a solid * - * @author Matthias Betz 12bema1bif@hft-stuttgart.de + * @author Matthias Betz */ public class TooFewPolygonsCheck extends Check { @@ -59,7 +62,6 @@ public class TooFewPolygonsCheck extends Check { * not. * * @param toBeCheckedGeometry The ViewableGeometry that has to be checked. - * @return Vector of CDErrors */ @Override public void check(Geometry g) { @@ -81,10 +83,15 @@ public class TooFewPolygonsCheck extends Check { public List<CheckId> getDependencies() { return dependencies; } + + @Override + public Set<Requirement> appliesToRequirements() { + return CollectionUtils.singletonSet(Requirement.R_GE_S_TOO_FEW_POLYGONS); + } @Override - public CheckType getType() { - return CheckType.GEOMETRY; + public RequirementType getType() { + return RequirementType.GEOMETRY; } @Override diff --git a/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/semantics/GroundSurfaceUnfragmented.java b/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/semantics/GroundSurfaceUnfragmented.java index 55bcad728d5ebd9cf4f7a2b8b649b60812af1f5a..6ff7b13b5fbdce70a22118a2a6a0eaf8347e1791 100644 --- a/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/semantics/GroundSurfaceUnfragmented.java +++ b/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/semantics/GroundSurfaceUnfragmented.java @@ -21,12 +21,15 @@ package de.hft.stuttgart.citydoctor2.checks.semantics; import java.util.ArrayList; import java.util.Collections; import java.util.List; +import java.util.Set; import de.hft.stuttgart.citydoctor2.check.Check; import de.hft.stuttgart.citydoctor2.check.CheckId; import de.hft.stuttgart.citydoctor2.check.CheckResult; -import de.hft.stuttgart.citydoctor2.check.CheckType; +import de.hft.stuttgart.citydoctor2.check.RequirementType; +import de.hft.stuttgart.citydoctor2.check.Requirement; import de.hft.stuttgart.citydoctor2.check.ResultStatus; +import de.hft.stuttgart.citydoctor2.checks.util.CollectionUtils; import de.hft.stuttgart.citydoctor2.checks.util.UnfragmentedCheck; import de.hft.stuttgart.citydoctor2.datastructure.BoundarySurface; import de.hft.stuttgart.citydoctor2.datastructure.BoundarySurfaceType; @@ -66,10 +69,15 @@ public class GroundSurfaceUnfragmented extends Check { public List<CheckId> getDependencies() { return dependencies; } + + @Override + public Set<Requirement> appliesToRequirements() { + return CollectionUtils.singletonSet(Requirement.R_SE_BS_GROUND_UNFRAGMENTED); + } @Override - public CheckType getType() { - return CheckType.SEMANTIC; + public RequirementType getType() { + return RequirementType.SEMANTIC; } @Override @@ -79,7 +87,7 @@ public class GroundSurfaceUnfragmented extends Check { @Override public CheckId getCheckId() { - return CheckId.C_SEM_BS_GROUND_NOT_FRAGMENTED; + return CheckId.C_SE_BS_GROUND_NOT_FRAGMENTED; } } diff --git a/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/semantics/IsCeilingCheck.java b/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/semantics/IsCeilingCheck.java index c825c04b401dfaa6e73f340fdaf594c0fe7eaa83..67df459f4f584ffce836f2a56ebd1d5a076f7255 100644 --- a/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/semantics/IsCeilingCheck.java +++ b/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/semantics/IsCeilingCheck.java @@ -21,13 +21,16 @@ package de.hft.stuttgart.citydoctor2.checks.semantics; import java.util.ArrayList; import java.util.Collections; import java.util.List; +import java.util.Set; import de.hft.stuttgart.citydoctor2.check.Check; import de.hft.stuttgart.citydoctor2.check.CheckId; import de.hft.stuttgart.citydoctor2.check.CheckResult; -import de.hft.stuttgart.citydoctor2.check.CheckType; +import de.hft.stuttgart.citydoctor2.check.RequirementType; +import de.hft.stuttgart.citydoctor2.check.Requirement; import de.hft.stuttgart.citydoctor2.check.ResultStatus; import de.hft.stuttgart.citydoctor2.check.error.NotCeilingError; +import de.hft.stuttgart.citydoctor2.checks.util.CollectionUtils; import de.hft.stuttgart.citydoctor2.datastructure.BoundarySurface; import de.hft.stuttgart.citydoctor2.datastructure.BoundarySurfaceType; import de.hft.stuttgart.citydoctor2.datastructure.Geometry; @@ -80,10 +83,15 @@ public class IsCeilingCheck extends Check { public List<CheckId> getDependencies() { return dependencies; } + + @Override + public Set<Requirement> appliesToRequirements() { + return CollectionUtils.singletonSet(Requirement.R_SE_BS_IS_CEILING); + } @Override - public CheckType getType() { - return CheckType.SEMANTIC; + public RequirementType getType() { + return RequirementType.SEMANTIC; } @Override @@ -93,7 +101,7 @@ public class IsCeilingCheck extends Check { @Override public CheckId getCheckId() { - return CheckId.C_SEM_BS_NOT_CEILING; + return CheckId.C_SE_BS_IS_CEILING; } } diff --git a/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/semantics/IsFloorCheck.java b/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/semantics/IsFloorCheck.java index e2e0017fd6e235adeb5f257c8ce911e0d41ed1c7..5e550825f79e0d3f84f32f495750491f3446b50a 100644 --- a/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/semantics/IsFloorCheck.java +++ b/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/semantics/IsFloorCheck.java @@ -21,13 +21,16 @@ package de.hft.stuttgart.citydoctor2.checks.semantics; import java.util.ArrayList; import java.util.Collections; import java.util.List; +import java.util.Set; import de.hft.stuttgart.citydoctor2.check.Check; import de.hft.stuttgart.citydoctor2.check.CheckId; import de.hft.stuttgart.citydoctor2.check.CheckResult; -import de.hft.stuttgart.citydoctor2.check.CheckType; +import de.hft.stuttgart.citydoctor2.check.RequirementType; +import de.hft.stuttgart.citydoctor2.check.Requirement; import de.hft.stuttgart.citydoctor2.check.ResultStatus; import de.hft.stuttgart.citydoctor2.check.error.NotFloorError; +import de.hft.stuttgart.citydoctor2.checks.util.CollectionUtils; import de.hft.stuttgart.citydoctor2.datastructure.BoundarySurface; import de.hft.stuttgart.citydoctor2.datastructure.BoundarySurfaceType; import de.hft.stuttgart.citydoctor2.datastructure.Geometry; @@ -83,8 +86,13 @@ public class IsFloorCheck extends Check { } @Override - public CheckType getType() { - return CheckType.SEMANTIC; + public Set<Requirement> appliesToRequirements() { + return CollectionUtils.singletonSet(Requirement.R_SE_BS_IS_FLOOR); + } + + @Override + public RequirementType getType() { + return RequirementType.SEMANTIC; } @Override @@ -94,7 +102,7 @@ public class IsFloorCheck extends Check { @Override public CheckId getCheckId() { - return CheckId.C_SEM_BS_NOT_FLOOR; + return CheckId.C_SE_BS_IS_FLOOR; } } diff --git a/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/semantics/IsGroundCheck.java b/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/semantics/IsGroundCheck.java index 0d4e46fe261551e203a13ff356c58427cd1939e3..89a1b193a3adb66d932560ab02177c58ba14d882 100644 --- a/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/semantics/IsGroundCheck.java +++ b/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/semantics/IsGroundCheck.java @@ -21,13 +21,16 @@ package de.hft.stuttgart.citydoctor2.checks.semantics; import java.util.ArrayList; import java.util.Collections; import java.util.List; +import java.util.Set; import de.hft.stuttgart.citydoctor2.check.Check; import de.hft.stuttgart.citydoctor2.check.CheckId; import de.hft.stuttgart.citydoctor2.check.CheckResult; -import de.hft.stuttgart.citydoctor2.check.CheckType; +import de.hft.stuttgart.citydoctor2.check.RequirementType; +import de.hft.stuttgart.citydoctor2.check.Requirement; import de.hft.stuttgart.citydoctor2.check.ResultStatus; import de.hft.stuttgart.citydoctor2.check.error.NotGroundError; +import de.hft.stuttgart.citydoctor2.checks.util.CollectionUtils; import de.hft.stuttgart.citydoctor2.datastructure.BoundarySurface; import de.hft.stuttgart.citydoctor2.datastructure.BoundarySurfaceType; import de.hft.stuttgart.citydoctor2.datastructure.Geometry; @@ -80,10 +83,15 @@ public class IsGroundCheck extends Check { public List<CheckId> getDependencies() { return dependencies; } + + @Override + public Set<Requirement> appliesToRequirements() { + return CollectionUtils.singletonSet(Requirement.R_SE_BS_IS_GROUND); + } @Override - public CheckType getType() { - return CheckType.SEMANTIC; + public RequirementType getType() { + return RequirementType.SEMANTIC; } @Override @@ -93,6 +101,6 @@ public class IsGroundCheck extends Check { @Override public CheckId getCheckId() { - return CheckId.C_SEM_BS_NOT_GROUND; + return CheckId.C_SE_BS_IS_GROUND; } } diff --git a/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/semantics/IsWallCheck.java b/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/semantics/IsWallCheck.java index 85437c59efb7778b1306475203d870440c05c690..4cfb380b92e3153242f44ea6b550cb4c2e921f5d 100644 --- a/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/semantics/IsWallCheck.java +++ b/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/semantics/IsWallCheck.java @@ -22,15 +22,18 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Map; +import java.util.Set; import de.hft.stuttgart.citydoctor2.check.Check; import de.hft.stuttgart.citydoctor2.check.CheckId; import de.hft.stuttgart.citydoctor2.check.CheckResult; -import de.hft.stuttgart.citydoctor2.check.CheckType; +import de.hft.stuttgart.citydoctor2.check.RequirementType; import de.hft.stuttgart.citydoctor2.check.DefaultParameter; +import de.hft.stuttgart.citydoctor2.check.Requirement; import de.hft.stuttgart.citydoctor2.check.ResultStatus; import de.hft.stuttgart.citydoctor2.check.Unit; import de.hft.stuttgart.citydoctor2.check.error.NotWallError; +import de.hft.stuttgart.citydoctor2.checks.util.CollectionUtils; import de.hft.stuttgart.citydoctor2.datastructure.BoundarySurface; import de.hft.stuttgart.citydoctor2.datastructure.BoundarySurfaceType; import de.hft.stuttgart.citydoctor2.datastructure.Geometry; @@ -132,14 +135,19 @@ public class IsWallCheck extends Check { return dependencies; } + @Override + public Set<Requirement> appliesToRequirements() { + return CollectionUtils.singletonSet(Requirement.R_SE_BS_IS_WALL); + } + @Override public List<DefaultParameter> getDefaultParameter() { return defaultParameters; } @Override - public CheckType getType() { - return CheckType.SEMANTIC; + public RequirementType getType() { + return RequirementType.SEMANTIC; } @Override @@ -149,7 +157,7 @@ public class IsWallCheck extends Check { @Override public CheckId getCheckId() { - return CheckId.C_SEM_BS_IS_WALL; + return CheckId.C_SE_BS_IS_WALL; } } diff --git a/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/semantics/RoofSurfaceUnfragmentedCheck.java b/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/semantics/RoofSurfaceUnfragmentedCheck.java index 692ed2ee4f0839641c9b67d5b157d5452327c57c..e2e535fc591b0b4cb62a77342333e25923b12756 100644 --- a/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/semantics/RoofSurfaceUnfragmentedCheck.java +++ b/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/semantics/RoofSurfaceUnfragmentedCheck.java @@ -22,13 +22,16 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Map; +import java.util.Set; import de.hft.stuttgart.citydoctor2.check.Check; import de.hft.stuttgart.citydoctor2.check.CheckId; import de.hft.stuttgart.citydoctor2.check.CheckResult; -import de.hft.stuttgart.citydoctor2.check.CheckType; +import de.hft.stuttgart.citydoctor2.check.RequirementType; import de.hft.stuttgart.citydoctor2.check.DefaultParameter; +import de.hft.stuttgart.citydoctor2.check.Requirement; import de.hft.stuttgart.citydoctor2.check.Unit; +import de.hft.stuttgart.citydoctor2.checks.util.CollectionUtils; import de.hft.stuttgart.citydoctor2.checks.util.UnfragmentedCheck; import de.hft.stuttgart.citydoctor2.datastructure.BoundarySurface; import de.hft.stuttgart.citydoctor2.datastructure.BoundarySurfaceType; @@ -91,10 +94,15 @@ public class RoofSurfaceUnfragmentedCheck extends Check { public List<DefaultParameter> getDefaultParameter() { return defaultParameters; } + + @Override + public Set<Requirement> appliesToRequirements() { + return CollectionUtils.singletonSet(Requirement.R_SE_BS_ROOF_UNFRAGMENTED); + } @Override - public CheckType getType() { - return CheckType.SEMANTIC; + public RequirementType getType() { + return RequirementType.SEMANTIC; } @Override @@ -104,7 +112,7 @@ public class RoofSurfaceUnfragmentedCheck extends Check { @Override public CheckId getCheckId() { - return CheckId.C_SEM_BS_ROOF_NOT_FRAGMENTED; + return CheckId.C_SE_BS_ROOF_UNFRAGMENTED; } } diff --git a/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/util/CollectionUtils.java b/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/util/CollectionUtils.java new file mode 100644 index 0000000000000000000000000000000000000000..cdbe4667f80817a29e9b36460c8bbbfd94ba4c67 --- /dev/null +++ b/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/util/CollectionUtils.java @@ -0,0 +1,43 @@ +/*- + * Copyright 2020 Beuth Hochschule für Technik Berlin, Hochschule für Technik Stuttgart + * + * This file is part of CityDoctor2. + * + * CityDoctor2 is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * CityDoctor2 is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with CityDoctor2. If not, see <https://www.gnu.org/licenses/>. + */ +package de.hft.stuttgart.citydoctor2.checks.util; + +import java.util.Arrays; +import java.util.HashSet; +import java.util.Set; + +public class CollectionUtils { + + private CollectionUtils() { + } + + public static <T> Set<T> singletonSet(T v) { + HashSet<T> set = new HashSet<>(2); + set.add(v); + return set; + } + + @SafeVarargs + public static <T> Set<T> asSet(T... values) { + HashSet<T> set = new HashSet<>((int) (values.length * 1.25)); + set.addAll(Arrays.asList(values)); + return set; + } + +} diff --git a/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/reporting/XmlStreamReporter.java b/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/reporting/XmlStreamReporter.java index 1deaad7100546182d398adfe0ac6fedea60eeea3..82fd142d918a562eaff3411d8515fcae3b1be014 100644 --- a/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/reporting/XmlStreamReporter.java +++ b/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/reporting/XmlStreamReporter.java @@ -32,10 +32,9 @@ import java.util.concurrent.atomic.AtomicInteger; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; -import de.hft.stuttgart.citydoctor2.check.CheckConfiguration; import de.hft.stuttgart.citydoctor2.check.CheckError; -import de.hft.stuttgart.citydoctor2.check.CheckId; import de.hft.stuttgart.citydoctor2.check.ErrorType; +import de.hft.stuttgart.citydoctor2.check.RequirementConfiguration; import de.hft.stuttgart.citydoctor2.check.ValidationConfiguration; import de.hft.stuttgart.citydoctor2.checkresult.CheckReport; import de.hft.stuttgart.citydoctor2.checkresult.Environment; @@ -115,10 +114,10 @@ public class XmlStreamReporter implements StreamReporter { plan.setNumberOfRoundingPlaces(config.getNumberOfRoundingPlaces()); List<PlanCheck> checkConfigs = new ArrayList<>(); plan.setChecks(checkConfigs); - for (Entry<CheckId, CheckConfiguration> e : config.getChecks().entrySet()) { + for (Entry<String, RequirementConfiguration> e : config.getRequirements().entrySet()) { PlanCheck checkConfig = new PlanCheck(); checkConfigs.add(checkConfig); - checkConfig.setName(e.getKey().toString()); + checkConfig.setName(e.getKey()); if (e.getValue().isEnabled()) { checkConfig.setActivated(true); Map<String, String> checkParams = e.getValue().getParameters(); diff --git a/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/reporting/pdf/PdfStreamReporter.java b/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/reporting/pdf/PdfStreamReporter.java index bfd739e009101bfb21c380e8055b33750a8dcd25..ebde6ffc0763231b72b4cabeacb70ca66ab7bde4 100644 --- a/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/reporting/pdf/PdfStreamReporter.java +++ b/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/reporting/pdf/PdfStreamReporter.java @@ -32,7 +32,7 @@ import java.util.concurrent.atomic.AtomicInteger; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; -import de.hft.stuttgart.citydoctor2.check.CheckConfiguration; +import de.hft.stuttgart.citydoctor2.check.RequirementConfiguration; import de.hft.stuttgart.citydoctor2.check.CheckError; import de.hft.stuttgart.citydoctor2.check.CheckId; import de.hft.stuttgart.citydoctor2.check.CheckResult; @@ -133,8 +133,8 @@ public class PdfStreamReporter implements StreamReporter { if (config.getSchematronFilePath() != null && !config.getSchematronFilePath().isEmpty()) { vp.addTextElement("Schematron file: " + config.getSchematronFilePath()); } - for (Entry<CheckId, CheckConfiguration> e : config.getChecks().entrySet()) { - String text = e.getKey().toString(); + for (Entry<String, RequirementConfiguration> e : config.getRequirements().entrySet()) { + String text = e.getKey(); String color; if (e.getValue().isEnabled()) { text = text + " = enabled"; diff --git a/CityDoctorParent/CityDoctorValidation/src/test/java/de/hft/stuttgart/citydoctor2/check/CheckerTest.java b/CityDoctorParent/CityDoctorValidation/src/test/java/de/hft/stuttgart/citydoctor2/check/CheckerTest.java index 3d2b9d68927984f3c1275a2522c18047e6919699..9191678f777fd4fc3d1d79dd127a924bc185dd5d 100644 --- a/CityDoctorParent/CityDoctorValidation/src/test/java/de/hft/stuttgart/citydoctor2/check/CheckerTest.java +++ b/CityDoctorParent/CityDoctorValidation/src/test/java/de/hft/stuttgart/citydoctor2/check/CheckerTest.java @@ -51,8 +51,8 @@ public class CheckerTest { @Test public void testSchematron() throws CityGmlParseException, InvalidGmlFileException { ValidationConfiguration config = ValidationConfiguration.loadStandardValidationConfig(); - config.getChecks().get(CheckId.C_SEM_BS_ROOF_NOT_FRAGMENTED).setEnabled(false); - config.setSchematronFilePath("src/test/resources/schematronTest.xml"); + config.getRequirements().get(Requirement.R_SE_BS_ROOF_UNFRAGMENTED.toString()).setEnabled(false); + config.setSchematronFilePathInGlobalParameters("src/test/resources/schematronTest.xml"); CityDoctorModel model = CityGmlParser.parseCityGmlFile( "src/test/resources/SimpleSolid_SrefBS_SchematronTest.gml", config.getParserConfiguration()); Checker checker = new Checker(config, model); diff --git a/CityDoctorParent/CityDoctorValidation/src/test/java/de/hft/stuttgart/citydoctor2/check/ValidationConfigurationTest.java b/CityDoctorParent/CityDoctorValidation/src/test/java/de/hft/stuttgart/citydoctor2/check/ValidationConfigurationTest.java index 45bfce21b2670c79b719a2ac0c5d46d63ed27394..c3f420e9d1f2e48b54258f3e050a1347556531d9 100644 --- a/CityDoctorParent/CityDoctorValidation/src/test/java/de/hft/stuttgart/citydoctor2/check/ValidationConfigurationTest.java +++ b/CityDoctorParent/CityDoctorValidation/src/test/java/de/hft/stuttgart/citydoctor2/check/ValidationConfigurationTest.java @@ -25,6 +25,7 @@ import java.io.FileNotFoundException; import org.junit.Test; import de.hft.stuttgart.citydoctor2.datastructure.FeatureType; +import de.hft.stuttgart.quality.model.jaxb.RequirementId; public class ValidationConfigurationTest { @@ -33,33 +34,33 @@ public class ValidationConfigurationTest { String file = "src/test/resources/testConfig.yml"; ValidationConfiguration config = ValidationConfiguration.loadValidationConfig(file); assertEquals(8, config.getNumberOfRoundingPlaces()); - assertTrue(config.getChecks().containsKey(CheckId.C_GE_R_TOO_FEW_POINTS)); - assertTrue(config.getChecks().get(CheckId.C_GE_P_NON_PLANAR).isEnabled()); + assertTrue(config.getRequirements().containsKey(RequirementId.R_GE_R_TOO_FEW_POINTS.toString())); + assertFalse(config.getRequirements().get(RequirementId.R_GE_P_NON_PLANAR.toString()).isEnabled()); assertNull(config.getFilter()); } - + @Test public void testLoadingConfigWithFilter() throws FileNotFoundException { String file = "src/test/resources/testConfigWithFilter.yml"; ValidationConfiguration config = ValidationConfiguration.loadValidationConfig(file); assertEquals(8, config.getNumberOfRoundingPlaces()); - assertTrue(config.getChecks().containsKey(CheckId.C_GE_R_TOO_FEW_POINTS)); - assertTrue(config.getChecks().get(CheckId.C_GE_P_NON_PLANAR).isEnabled()); - + assertTrue(config.getRequirements().containsKey(RequirementId.R_GE_R_TOO_FEW_POINTS.toString())); + assertFalse(config.getRequirements().get(RequirementId.R_GE_P_NON_PLANAR.toString()).isEnabled()); + FilterConfiguration filterConfig = config.getFilter(); assertNotNull(filterConfig); - + ExcludeFilterConfiguration excludeFilter = filterConfig.getExclude(); assertNotNull(excludeFilter); - + assertTrue(excludeFilter.getIds().contains("UUID-8972-kghf-asgv")); assertTrue(excludeFilter.getIds().contains("UUID.*")); assertTrue(excludeFilter.getTypes().contains(FeatureType.BUILDING)); assertTrue(excludeFilter.getTypes().contains(FeatureType.VEGETATION)); - + IncludeFilterConfiguration includeFilter = filterConfig.getInclude(); assertNotNull(includeFilter); - + assertTrue(includeFilter.getIds().contains(".*")); assertTrue(includeFilter.getTypes().contains(FeatureType.BUILDING)); assertTrue(includeFilter.getTypes().contains(FeatureType.VEGETATION)); diff --git a/CityDoctorParent/CityDoctorValidation/src/test/java/de/hft/stuttgart/citydoctor2/checks/CheckContainerTest.java b/CityDoctorParent/CityDoctorValidation/src/test/java/de/hft/stuttgart/citydoctor2/checks/CheckContainerTest.java index be6ff0a7c5ff3e541d4883f349b9cee68adbf124..6a0899789f393d1122788f759e884540f3cfb846 100644 --- a/CityDoctorParent/CityDoctorValidation/src/test/java/de/hft/stuttgart/citydoctor2/checks/CheckContainerTest.java +++ b/CityDoctorParent/CityDoctorValidation/src/test/java/de/hft/stuttgart/citydoctor2/checks/CheckContainerTest.java @@ -20,13 +20,16 @@ package de.hft.stuttgart.citydoctor2.checks; import static org.junit.Assert.assertEquals; +import java.util.Set; + import org.junit.Test; import de.hft.stuttgart.citydoctor2.check.Check; import de.hft.stuttgart.citydoctor2.check.CheckId; import de.hft.stuttgart.citydoctor2.check.CheckResult; -import de.hft.stuttgart.citydoctor2.check.CheckType; +import de.hft.stuttgart.citydoctor2.check.RequirementType; import de.hft.stuttgart.citydoctor2.check.ErrorId; +import de.hft.stuttgart.citydoctor2.check.Requirement; import de.hft.stuttgart.citydoctor2.check.ResultStatus; import de.hft.stuttgart.citydoctor2.datastructure.AbstractBuilding; import de.hft.stuttgart.citydoctor2.datastructure.Building; @@ -43,7 +46,7 @@ public class CheckContainerTest { } @Override - public CheckType getType() { + public RequirementType getType() { return null; } @@ -56,6 +59,11 @@ public class CheckContainerTest { public CheckId getCheckId() { return CheckId.C_GE_P_HOLE_OUTSIDE; } + + @Override + public Set<Requirement> appliesToRequirements() { + return null; + } }; CheckContainer cc = new CheckContainer(c); diff --git a/CityDoctorParent/CityDoctorValidation/src/test/java/de/hft/stuttgart/citydoctor2/checks/geometry/DegeneratedPolygonCheckTest.java b/CityDoctorParent/CityDoctorValidation/src/test/java/de/hft/stuttgart/citydoctor2/checks/geometry/DegeneratedPolygonCheckTest.java index d15aed03f645172c65af5b74ba3fbf6a4d8d09f0..a2fcbe402ca24619cba650fa157661d9f9e7db1b 100644 --- a/CityDoctorParent/CityDoctorValidation/src/test/java/de/hft/stuttgart/citydoctor2/checks/geometry/DegeneratedPolygonCheckTest.java +++ b/CityDoctorParent/CityDoctorValidation/src/test/java/de/hft/stuttgart/citydoctor2/checks/geometry/DegeneratedPolygonCheckTest.java @@ -18,7 +18,7 @@ */ package de.hft.stuttgart.citydoctor2.checks.geometry; -import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; import java.io.File; import java.util.ArrayList; @@ -29,9 +29,7 @@ import java.util.Map; import org.junit.Test; import de.hft.stuttgart.citydoctor2.check.CheckError; -import de.hft.stuttgart.citydoctor2.check.CheckId; import de.hft.stuttgart.citydoctor2.check.Checker; -import de.hft.stuttgart.citydoctor2.check.ErrorId; import de.hft.stuttgart.citydoctor2.check.ValidationConfiguration; import de.hft.stuttgart.citydoctor2.datastructure.Building; import de.hft.stuttgart.citydoctor2.datastructure.CityDoctorModel; @@ -43,10 +41,10 @@ import de.hft.stuttgart.citydoctor2.datastructure.LinearRing.LinearRingType; import de.hft.stuttgart.citydoctor2.datastructure.Lod; import de.hft.stuttgart.citydoctor2.datastructure.Vertex; import de.hft.stuttgart.citydoctor2.parser.ParserConfiguration; +import de.hft.stuttgart.quality.model.jaxb.RequirementId; public class DegeneratedPolygonCheckTest { - - + @Test public void testDegeneratedPolygon() { Geometry geom = new Geometry(GeometryType.MULTI_SURFACE, Lod.LOD1); @@ -65,38 +63,25 @@ public class DegeneratedPolygonCheckTest { lr.getVertices().add(v4); lr.getVertices().add(v1); geom.updateEdgesAndVertices(); - + Building b = new Building(); b.addGeometry(geom); - + ParserConfiguration config = new ParserConfiguration(8, false); CityDoctorModel model = new CityDoctorModel(config, new File("")); model.addBuilding(b); - // model -// Edge [from=Vertex [x=427583.301, y=6003502.571, z=9.711], to=Vertex [x=427583.304, y=6003502.574, z=9.713]], -// Edge [from=Vertex [x=427583.304, y=6003502.574, z=9.713], to=Vertex [x=427583.304, y=6003502.574, z=4.097]], -// Edge [from=Vertex [x=427583.304, y=6003502.574, z=4.097], to=Vertex [x=427583.301, y=6003502.571, z=4.097]], -// Edge [from=Vertex [x=427583.301, y=6003502.571, z=4.097], to=Vertex [x=427583.301, y=6003502.571, z=9.711]]] - // test -// Edge [from=Vertex [x=427583.301, y=6003502.571, z=9.711], to=Vertex [x=427583.304, y=6003502.574, z=9.713]], -// Edge [from=Vertex [x=427583.304, y=6003502.574, z=9.713], to=Vertex [x=427583.304, y=6003502.574, z=4.097]], -// Edge [from=Vertex [x=427583.304, y=6003502.574, z=4.097], to=Vertex [x=427583.301, y=6003502.571, z=4.097]], -// Edge [from=Vertex [x=427583.301, y=6003502.571, z=4.097], to=Vertex [x=427583.301, y=6003502.571, z=9.711]]] - -// Segment3d [pointA=Vertex [x=427583.301, y=6003502.571, z=9.711], pointB=Vertex [x=427583.304, y=6003502.574, z=9.713]] -// Vertex [x=427583.301, y=6003502.571, z=9.711] - ValidationConfiguration valConfig = ValidationConfiguration.loadStandardValidationConfig(); + valConfig.setMinVertexDistanceInGlobalParameters(0.004); Map<String, String> parameters = new HashMap<>(); - parameters.put("degeneratedPolygonTolerance", "0.0001"); - valConfig.getChecks().get(CheckId.C_GE_P_NON_PLANAR).setParameters(parameters); + parameters.put("degeneratedPolygonTolerance", "0.004"); + valConfig.getRequirements().get(RequirementId.R_GE_P_NON_PLANAR.toString()).getParameters().putAll(parameters); Checker c = new Checker(valConfig, model); c.runChecks(); - + List<CheckError> errors = new ArrayList<>(); b.collectContainedErrors(errors); - CheckError checkError = errors.get(0); - assertEquals(ErrorId.GE_P_DEGENERATED_POLYGON, checkError.getErrorId()); + assertTrue(errors.isEmpty()); } + } diff --git a/CityDoctorParent/CityDoctorValidation/src/test/java/de/hft/stuttgart/citydoctor2/checks/geometry/FaceOutCheckTest.java b/CityDoctorParent/CityDoctorValidation/src/test/java/de/hft/stuttgart/citydoctor2/checks/geometry/FaceOutCheckTest.java index 96ea54215991053c76867b23695fd0d5b08bad86..68ecbbceecbec40232ff694c2b7e9e8f69f01637 100644 --- a/CityDoctorParent/CityDoctorValidation/src/test/java/de/hft/stuttgart/citydoctor2/checks/geometry/FaceOutCheckTest.java +++ b/CityDoctorParent/CityDoctorValidation/src/test/java/de/hft/stuttgart/citydoctor2/checks/geometry/FaceOutCheckTest.java @@ -107,7 +107,7 @@ public class FaceOutCheckTest { public void testGoodGeometry() { Geometry geom = createGoodGeometry(); - FaceOutCheck foc = new FaceOutCheck(); + AllPolygonsWrongOrientationCheck foc = new AllPolygonsWrongOrientationCheck(); foc.check(geom); Assert.assertEquals(ResultStatus.OK, geom.getCheckResult(foc).getResultStatus()); @@ -117,7 +117,7 @@ public class FaceOutCheckTest { public void testBadGeometry() { Geometry geom = createBadGeometry(); - FaceOutCheck foc = new FaceOutCheck(); + AllPolygonsWrongOrientationCheck foc = new AllPolygonsWrongOrientationCheck(); foc.check(geom); Assert.assertEquals(ResultStatus.ERROR, geom.getCheckResult(foc).getResultStatus()); diff --git a/CityDoctorParent/CityDoctorValidation/src/test/java/de/hft/stuttgart/citydoctor2/checks/geometry/NumPointsCheckTest.java b/CityDoctorParent/CityDoctorValidation/src/test/java/de/hft/stuttgart/citydoctor2/checks/geometry/NumPointsCheckTest.java index b7a0b9b4ed935553cef91a3c425b2206746f7f6e..a9ab3bbce0db40040ffe2a9fea84c8b0851e8ef4 100644 --- a/CityDoctorParent/CityDoctorValidation/src/test/java/de/hft/stuttgart/citydoctor2/checks/geometry/NumPointsCheckTest.java +++ b/CityDoctorParent/CityDoctorValidation/src/test/java/de/hft/stuttgart/citydoctor2/checks/geometry/NumPointsCheckTest.java @@ -53,7 +53,7 @@ public class NumPointsCheckTest { lr.addVertex(v2); lr.addVertex(v0); - NumPointsCheck check = new NumPointsCheck(); + TooFewPointsCheck check = new TooFewPointsCheck(); ParserConfiguration config = new ParserConfiguration(8, false); check.init(Collections.emptyMap(), config); check.check(lr); @@ -79,7 +79,7 @@ public class NumPointsCheckTest { lr.addVertex(v3); lr.addVertex(v0); - NumPointsCheck check = new NumPointsCheck(); + TooFewPointsCheck check = new TooFewPointsCheck(); ParserConfiguration config = new ParserConfiguration(8, false); check.init(Collections.emptyMap(), config); check.check(lr); diff --git a/CityDoctorParent/CityDoctorValidation/src/test/java/de/hft/stuttgart/citydoctor2/systemtest/NonManifoldEdgeSystemTest.java b/CityDoctorParent/CityDoctorValidation/src/test/java/de/hft/stuttgart/citydoctor2/systemtest/NonManifoldEdgeSystemTest.java index f5a5885afba3ab1e7395a8b13f981fb76671afa4..a7044537fb7edcb2d9b5fefafd861d983eb1536c 100644 --- a/CityDoctorParent/CityDoctorValidation/src/test/java/de/hft/stuttgart/citydoctor2/systemtest/NonManifoldEdgeSystemTest.java +++ b/CityDoctorParent/CityDoctorValidation/src/test/java/de/hft/stuttgart/citydoctor2/systemtest/NonManifoldEdgeSystemTest.java @@ -34,6 +34,7 @@ import de.hft.stuttgart.citydoctor2.datastructure.CityDoctorModel; import de.hft.stuttgart.citydoctor2.datastructure.Geometry; import de.hft.stuttgart.citydoctor2.parser.CityGmlParseException; import de.hft.stuttgart.citydoctor2.parser.InvalidGmlFileException; +import de.hft.stuttgart.quality.model.jaxb.RequirementId; /** * @@ -52,10 +53,10 @@ public class NonManifoldEdgeSystemTest { @Test public void testNonManifoldEdge2() throws CityGmlParseException, IOException, InvalidGmlFileException { - Map<CheckId, Map<String, String>> paramMap = new HashMap<>(); + Map<String, Map<String, String>> paramMap = new HashMap<>(); Map<String, String> parameter = new HashMap<>(); parameter.put("distanceTolerance", "0.1"); - paramMap.put(CheckId.C_GE_P_NON_PLANAR, parameter); + paramMap.put(RequirementId.R_GE_P_NON_PLANAR.toString(), parameter); CityDoctorModel c = TestUtil.loadAndCheckCityModel("src/test/resources/SimpleSolid_SrefBS-GE-gml-SO-0004-T0001.gml", paramMap); Geometry g = c.getBuildings().get(0).getGeometries().get(0); diff --git a/CityDoctorParent/CityDoctorValidation/src/test/java/de/hft/stuttgart/citydoctor2/systemtest/PlanarTest.java b/CityDoctorParent/CityDoctorValidation/src/test/java/de/hft/stuttgart/citydoctor2/systemtest/PlanarTest.java index 24199737d5efc5bd79e0b71b1f15ceeff2defa87..0378718bbc58a4d79cebbfe747ecbd1f7e84fd2d 100644 --- a/CityDoctorParent/CityDoctorValidation/src/test/java/de/hft/stuttgart/citydoctor2/systemtest/PlanarTest.java +++ b/CityDoctorParent/CityDoctorValidation/src/test/java/de/hft/stuttgart/citydoctor2/systemtest/PlanarTest.java @@ -37,6 +37,7 @@ import de.hft.stuttgart.citydoctor2.parser.CityGmlParseException; import de.hft.stuttgart.citydoctor2.parser.CityGmlParser; import de.hft.stuttgart.citydoctor2.parser.InvalidGmlFileException; import de.hft.stuttgart.citydoctor2.parser.ParserConfiguration; +import de.hft.stuttgart.quality.model.jaxb.RequirementId; /** * @@ -113,10 +114,10 @@ public class PlanarTest { @Test public void testPlanarPolygon4() throws CityGmlParseException, IOException, InvalidGmlFileException { - Map<CheckId, Map<String, String>> paramMap = new HashMap<>(); + Map<String, Map<String, String>> paramMap = new HashMap<>(); Map<String, String> parameter = new HashMap<>(); parameter.put("distanceTolerance", "0.01"); - paramMap.put(CheckId.C_GE_P_NON_PLANAR, parameter); + paramMap.put(RequirementId.R_GE_P_NON_PLANAR.toString(), parameter); CityDoctorModel c = TestUtil.loadAndCheckCityModel("src/test/resources/SimpleSolid_SrefBS-GE-gml-PO-0002-T0001.gml", paramMap); Polygon p = TestUtil.getPolygonById("_Simple_BD.1_PG.2", c); CheckResult cr = p.getCheckResult(CheckId.C_GE_P_NON_PLANAR); @@ -126,11 +127,11 @@ public class PlanarTest { @Test public void testPlanarPolygon5() throws CityGmlParseException, IOException, InvalidGmlFileException { - Map<CheckId, Map<String, String>> paramMap = new HashMap<>(); + Map<String, Map<String, String>> paramMap = new HashMap<>(); Map<String, String> parameter = new HashMap<>(); parameter.put("type", "distance"); parameter.put("distanceTolerance", "0.5"); - paramMap.put(CheckId.C_GE_P_NON_PLANAR, parameter); + paramMap.put(RequirementId.R_GE_P_NON_PLANAR.toString(), parameter); CityDoctorModel c = TestUtil.loadAndCheckCityModel("src/test/resources/SimpleSolid_SrefBS-GE-gml-PO-0002-T0001.gml", paramMap); Polygon p = TestUtil.getPolygonById("_Simple_BD.1_PG.2", c); CheckResult cr = p.getCheckResult(CheckId.C_GE_P_NON_PLANAR); @@ -139,10 +140,10 @@ public class PlanarTest { @Test public void testPlanarPolygon6() throws CityGmlParseException, IOException, InvalidGmlFileException { - Map<CheckId, Map<String, String>> paramMap = new HashMap<>(); + Map<String, Map<String, String>> paramMap = new HashMap<>(); Map<String, String> parameter = new HashMap<>(); parameter.put("type", "both"); - paramMap.put(CheckId.C_GE_P_NON_PLANAR, parameter); + paramMap.put(RequirementId.R_GE_P_NON_PLANAR.toString(), parameter); CityDoctorModel c = TestUtil.loadAndCheckCityModel("src/test/resources/SimpleSolid_SrefBS-GE-gml-PO-0002-T0002.gml", paramMap); Polygon p = TestUtil.getPolygonById("_Simple_BD.1_PG.1", c); CheckResult cr = p.getCheckResult(CheckId.C_GE_P_NON_PLANAR); diff --git a/CityDoctorParent/CityDoctorValidation/src/test/java/de/hft/stuttgart/citydoctor2/systemtest/TestUtil.java b/CityDoctorParent/CityDoctorValidation/src/test/java/de/hft/stuttgart/citydoctor2/systemtest/TestUtil.java index 30d0cc629768651743ef155bd24d0cc30eed5a9a..da96f4f1638425e7eac849ba7019508c6b2d06b8 100644 --- a/CityDoctorParent/CityDoctorValidation/src/test/java/de/hft/stuttgart/citydoctor2/systemtest/TestUtil.java +++ b/CityDoctorParent/CityDoctorValidation/src/test/java/de/hft/stuttgart/citydoctor2/systemtest/TestUtil.java @@ -23,7 +23,6 @@ import java.util.List; import java.util.Map; import java.util.Map.Entry; -import de.hft.stuttgart.citydoctor2.check.CheckId; import de.hft.stuttgart.citydoctor2.check.Checker; import de.hft.stuttgart.citydoctor2.check.ValidationConfiguration; import de.hft.stuttgart.citydoctor2.datastructure.CityDoctorModel; @@ -52,7 +51,7 @@ public class TestUtil { public static CityDoctorModel loadAndCheckCityModel(String path, int numberOfRoundingPlaces) throws CityGmlParseException, IOException, InvalidGmlFileException { ValidationConfiguration config = ValidationConfiguration.loadStandardValidationConfig(); - config.setNumberOfRoundingPlaces(numberOfRoundingPlaces); + config.setNumberOfRoundingPlacesInGlobalParameters(numberOfRoundingPlaces); CityDoctorModel m = CityGmlParser.parseCityGmlFile(path, config.getParserConfiguration()); Checker c = new Checker(config, m); c.runChecks(); @@ -63,8 +62,8 @@ public class TestUtil { public static CityDoctorModel loadAndCheckCityModel(String path, int numberOfRoundingPlaces, double minVertexDistance) throws CityGmlParseException, IOException, InvalidGmlFileException { ValidationConfiguration config = ValidationConfiguration.loadStandardValidationConfig(); - config.setNumberOfRoundingPlaces(numberOfRoundingPlaces); - config.setMinVertexDistance(minVertexDistance); + config.setNumberOfRoundingPlacesInGlobalParameters(numberOfRoundingPlaces); + config.setMinVertexDistanceInGlobalParameters(minVertexDistance); CityDoctorModel m = CityGmlParser.parseCityGmlFile(path, config.getParserConfiguration()); Checker c = new Checker(config, m); c.runChecks(); @@ -72,11 +71,11 @@ public class TestUtil { } - public static CityDoctorModel loadAndCheckCityModel(String path, Map<CheckId, Map<String, String>> paramMap) + public static CityDoctorModel loadAndCheckCityModel(String path, Map<String, Map<String, String>> paramMap) throws CityGmlParseException, IOException, InvalidGmlFileException { ValidationConfiguration valConfig = ValidationConfiguration.loadStandardValidationConfig(); - for (Entry<CheckId, Map<String, String>> e : paramMap.entrySet()) { - valConfig.getChecks().get(e.getKey()).setParameters(e.getValue()); + for (Entry<String, Map<String, String>> e : paramMap.entrySet()) { + valConfig.getRequirements().get(e.getKey()).getParameters().putAll(e.getValue()); } CityDoctorModel m = CityGmlParser.parseCityGmlFile(path, valConfig.getParserConfiguration()); Checker c = new Checker(valConfig, m); diff --git a/CityDoctorParent/CityDoctorValidation/src/test/resources/testConfig.yml b/CityDoctorParent/CityDoctorValidation/src/test/resources/testConfig.yml index 0c64010ac895e188c0dce2eb8ddb6ed8db868804..a7611706261c13d6d498703f8ca752bd252e384f 100644 --- a/CityDoctorParent/CityDoctorValidation/src/test/resources/testConfig.yml +++ b/CityDoctorParent/CityDoctorValidation/src/test/resources/testConfig.yml @@ -1,45 +1,53 @@ -numberOfRoundingPlaces: 8 +globalParameters: + numberOfRoundingPlaces: 8 + # in m + minVertexDistance: 0.0001 + schematronFilePath: '' useStreaming: false xmlValidation: false -checks: - C_GE_R_TOO_FEW_POINTS: +requirements: + R_GE_R_TOO_FEW_POINTS: enabled: true - C_GE_R_NOT_CLOSED: + R_GE_R_NOT_CLOSED: enabled: true - C_GE_R_DUPLICATE_POINT: + R_GE_R_CONSECUTIVE_POINTS_SAME: enabled: true - C_GE_R_SELF_INTERSECTION: + R_GE_R_SELF_INTERSECTION: enabled: true - C_GE_S_MULTIPLE_CONNECTED_COMPONENTS: + R_GE_S_MULTIPLE_CONNECTED_COMPONENTS: enabled: true - C_GE_P_INTERIOR_DISCONNECTED: + R_GE_P_INTERIOR_DISCONNECTED: enabled: true - C_GE_P_INTERSECTING_RINGS: + R_GE_P_INTERSECTING_RINGS: enabled: true - C_GE_P_NON_PLANAR: + R_GE_P_NON_PLANAR: enabled: false parameters: # one of ("distance", "angle", "both") type: distance + # in m distanceTolerance: 0.01 - angleTolerance: 0.1 - C_GE_P_HOLE_OUTSIDE: + # in degree + angleTolerance: 1 + # in m + degeneratedPolygonTolerance: 0 + R_GE_P_HOLE_OUTSIDE: enabled: true - C_GE_P_ORIENTATION_RINGS_SAME: + R_GE_P_ORIENTATION_RINGS_SAME: enabled: true - C_GE_P_INNER_RINGS_NESTED: + R_GE_P_INNER_RINGS_NESTED: enabled: true - C_GE_S_TOO_FEW_POLYGONS: + R_GE_S_TOO_FEW_POLYGONS: enabled: true - C_GE_S_NOT_CLOSED: + R_GE_S_NOT_CLOSED: enabled: true - C_GE_S_NON_MANIFOLD_EDGE: + R_GE_S_NON_MANIFOLD_EDGE: enabled: true - C_GE_S_POLYGON_WRONG_ORIENTATION: + R_GE_S_POLYGON_WRONG_ORIENTATION: enabled: true - C_GE_S_ALL_POLYGONS_WRONG_ORIENTATION: + R_GE_S_ALL_POLYGONS_WRONG_ORIENTATION: enabled: true - C_GE_S_NON_MANIFOLD_VERTEX: + R_GE_S_NON_MANIFOLD_VERTEX: enabled: true - C_GE_S_SELF_INTERSECTION: + R_GE_S_SELF_INTERSECTION: enabled: true \ No newline at end of file diff --git a/CityDoctorParent/CityDoctorValidation/src/test/resources/testConfigWithExclude.yml b/CityDoctorParent/CityDoctorValidation/src/test/resources/testConfigWithExclude.yml index c279b3e54aa14b8548350914c2296ed04adca08d..3e052a7c86ff8dccc4f1eaf388efe8314e158848 100644 --- a/CityDoctorParent/CityDoctorValidation/src/test/resources/testConfigWithExclude.yml +++ b/CityDoctorParent/CityDoctorValidation/src/test/resources/testConfigWithExclude.yml @@ -1,4 +1,6 @@ -numberOfRoundingPlaces: 8 +globalParameters: + numberOfRoundingPlaces: 8 + minVertexDistance: 0.0001 filter: exclude: # available types: BUILDING, VEGETATION, TRANSPORTATION, BRIDGE, LAND, WATER @@ -6,45 +8,47 @@ filter: - BUILDING # exlude matching ids (Regex) ids: -checks: - C_GE_R_TOO_FEW_POINTS: +requirements: + R_GE_R_TOO_FEW_POINTS: enabled: true - C_GE_R_NOT_CLOSED: + R_GE_R_NOT_CLOSED: enabled: true - C_GE_R_DUPLICATE_POINT: + R_GE_R_CONSECUTIVE_POINTS_SAME: enabled: true - C_GE_R_SELF_INTERSECTION: + R_GE_R_SELF_INTERSECTION: enabled: true - C_GE_S_MULTIPLE_CONNECTED_COMPONENTS: + R_GE_S_MULTIPLE_CONNECTED_COMPONENTS: enabled: true - C_GE_P_INTERIOR_DISCONNECTED: + R_GE_P_INTERIOR_DISCONNECTED: enabled: true - C_GE_P_INTERSECTING_RINGS: + R_GE_P_INTERSECTING_RINGS: enabled: true - C_GE_P_NON_PLANAR: + R_GE_P_NON_PLANAR: enabled: false parameters: # one of ("distance", "angle", "both") type: distance + # in m distanceTolerance: 0.01 - angleTolerance: 0.1 - C_GE_P_HOLE_OUTSIDE: + # in degree + angleTolerance: 1 + R_GE_P_HOLE_OUTSIDE: enabled: true - C_GE_P_ORIENTATION_RINGS_SAME: + R_GE_P_ORIENTATION_RINGS_SAME: enabled: true - C_GE_P_INNER_RINGS_NESTED: + R_GE_P_INNER_RINGS_NESTED: enabled: true - C_GE_S_TOO_FEW_POLYGONS: + R_GE_S_TOO_FEW_POLYGONS: enabled: true - C_GE_S_NOT_CLOSED: + R_GE_S_NOT_CLOSED: enabled: true - C_GE_S_NON_MANIFOLD_EDGE: + R_GE_S_NON_MANIFOLD_EDGE: enabled: true - C_GE_S_POLYGON_WRONG_ORIENTATION: + R_GE_S_POLYGON_WRONG_ORIENTATION: enabled: true - C_GE_S_ALL_POLYGONS_WRONG_ORIENTATION: + R_GE_S_ALL_POLYGONS_WRONG_ORIENTATION: enabled: true - C_GE_S_NON_MANIFOLD_VERTEX: + R_GE_S_NON_MANIFOLD_VERTEX: enabled: true - C_GE_S_SELF_INTERSECTION: + R_GE_S_SELF_INTERSECTION: enabled: true \ No newline at end of file diff --git a/CityDoctorParent/CityDoctorValidation/src/test/resources/testConfigWithFilter.yml b/CityDoctorParent/CityDoctorValidation/src/test/resources/testConfigWithFilter.yml index afd1032a7f70abac97364a6b6c073954f40f12e3..0b082f40f271838ed3ef0f2180dad50ce41d22b3 100644 --- a/CityDoctorParent/CityDoctorValidation/src/test/resources/testConfigWithFilter.yml +++ b/CityDoctorParent/CityDoctorValidation/src/test/resources/testConfigWithFilter.yml @@ -1,4 +1,7 @@ -numberOfRoundingPlaces: 8 +globalParameters: + numberOfRoundingPlaces: 8 + # in m + minVertexDistance: 0.0001 filter: include: # available types: BUILDING, VEGETATION, TRANSPORTATION, BRIDGE, LAND, WATER @@ -27,45 +30,47 @@ filter: - UUID-8972-kghf-asgv - UUID-567-asdf-GEGH - UUID.* -checks: - C_GE_R_TOO_FEW_POINTS: +requirements: + R_GE_R_TOO_FEW_POINTS: enabled: true - C_GE_R_NOT_CLOSED: + R_GE_R_NOT_CLOSED: enabled: true - C_GE_R_DUPLICATE_POINT: + R_GE_R_CONSECUTIVE_POINTS_SAME: enabled: true - C_GE_R_SELF_INTERSECTION: + R_GE_R_SELF_INTERSECTION: enabled: true - C_GE_S_MULTIPLE_CONNECTED_COMPONENTS: + R_GE_S_MULTIPLE_CONNECTED_COMPONENTS: enabled: true - C_GE_P_INTERIOR_DISCONNECTED: + R_GE_P_INTERIOR_DISCONNECTED: enabled: true - C_GE_P_INTERSECTING_RINGS: + R_GE_P_INTERSECTING_RINGS: enabled: true - C_GE_P_NON_PLANAR: + R_GE_P_NON_PLANAR: enabled: false parameters: # one of ("distance", "angle", "both") type: distance + # in m distanceTolerance: 0.01 - angleTolerance: 0.1 - C_GE_P_HOLE_OUTSIDE: + # in degree + angleTolerance: 1 + R_GE_P_HOLE_OUTSIDE: enabled: true - C_GE_P_ORIENTATION_RINGS_SAME: + R_GE_P_ORIENTATION_RINGS_SAME: enabled: true - C_GE_P_INNER_RINGS_NESTED: + R_GE_P_INNER_RINGS_NESTED: enabled: true - C_GE_S_TOO_FEW_POLYGONS: + R_GE_S_TOO_FEW_POLYGONS: enabled: true - C_GE_S_NOT_CLOSED: + R_GE_S_NOT_CLOSED: enabled: true - C_GE_S_NON_MANIFOLD_EDGE: + R_GE_S_NON_MANIFOLD_EDGE: enabled: true - C_GE_S_POLYGON_WRONG_ORIENTATION: + R_GE_S_POLYGON_WRONG_ORIENTATION: enabled: true - C_GE_S_ALL_POLYGONS_WRONG_ORIENTATION: + R_GE_S_ALL_POLYGONS_WRONG_ORIENTATION: enabled: true - C_GE_S_NON_MANIFOLD_VERTEX: + R_GE_S_NON_MANIFOLD_VERTEX: enabled: true - C_GE_S_SELF_INTERSECTION: + R_GE_S_SELF_INTERSECTION: enabled: true \ No newline at end of file diff --git a/CityDoctorParent/CityDoctorValidation/src/test/resources/testConfigWithInclude.yml b/CityDoctorParent/CityDoctorValidation/src/test/resources/testConfigWithInclude.yml index 2f8c5af6832e584e3df5d20e3fa14763e9876891..6f49da49aee6021f81bf01d635abad0eee6e5fbb 100644 --- a/CityDoctorParent/CityDoctorValidation/src/test/resources/testConfigWithInclude.yml +++ b/CityDoctorParent/CityDoctorValidation/src/test/resources/testConfigWithInclude.yml @@ -1,48 +1,49 @@ -numberOfRoundingPlaces: 8 +globalParameters: + numberOfRoundingPlaces: 8 filter: include: # available types: BUILDING, VEGETATION, TRANSPORTATION, BRIDGE, LAND, WATER types: - TRANSPORTATION -checks: - C_GE_R_TOO_FEW_POINTS: +requirements: + R_GE_R_TOO_FEW_POINTS: enabled: true - C_GE_R_NOT_CLOSED: + R_GE_R_NOT_CLOSED: enabled: true - C_GE_R_DUPLICATE_POINT: + R_GE_R_CONSECUTIVE_POINTS_SAME: enabled: true - C_GE_R_SELF_INTERSECTION: + R_GE_R_SELF_INTERSECTION: enabled: true - C_GE_S_MULTIPLE_CONNECTED_COMPONENTS: + R_GE_S_MULTIPLE_CONNECTED_COMPONENTS: enabled: true - C_GE_P_INTERIOR_DISCONNECTED: + R_GE_P_INTERIOR_DISCONNECTED: enabled: true - C_GE_P_INTERSECTING_RINGS: + R_GE_P_INTERSECTING_RINGS: enabled: true - C_GE_P_NON_PLANAR: + R_GE_P_NON_PLANAR: enabled: false parameters: # one of ("distance", "angle", "both") type: distance distanceTolerance: 0.01 angleTolerance: 0.1 - C_GE_P_HOLE_OUTSIDE: + R_GE_P_HOLE_OUTSIDE: enabled: true - C_GE_P_ORIENTATION_RINGS_SAME: + R_GE_P_ORIENTATION_RINGS_SAME: enabled: true - C_GE_P_INNER_RINGS_NESTED: + R_GE_P_INNER_RINGS_NESTED: enabled: true - C_GE_S_TOO_FEW_POLYGONS: + R_GE_S_TOO_FEW_POLYGONS: enabled: true - C_GE_S_NOT_CLOSED: + R_GE_S_NOT_CLOSED: enabled: true - C_GE_S_NON_MANIFOLD_EDGE: + R_GE_S_NON_MANIFOLD_EDGE: enabled: true - C_GE_S_POLYGON_WRONG_ORIENTATION: + R_GE_S_POLYGON_WRONG_ORIENTATION: enabled: true - C_GE_S_ALL_POLYGONS_WRONG_ORIENTATION: + R_GE_S_ALL_POLYGONS_WRONG_ORIENTATION: enabled: true - C_GE_S_NON_MANIFOLD_VERTEX: + R_GE_S_NON_MANIFOLD_VERTEX: enabled: true - C_GE_S_SELF_INTERSECTION: + R_GE_S_SELF_INTERSECTION: enabled: true \ No newline at end of file diff --git a/CityDoctorParent/CityDoctorValidation/src/test/resources/testConfigWithStreaming.yml b/CityDoctorParent/CityDoctorValidation/src/test/resources/testConfigWithStreaming.yml index ea1009418f18e1c759bb077b9b9309086aaf3733..311740e36283048724408342783c113ad816e35b 100644 --- a/CityDoctorParent/CityDoctorValidation/src/test/resources/testConfigWithStreaming.yml +++ b/CityDoctorParent/CityDoctorValidation/src/test/resources/testConfigWithStreaming.yml @@ -1,45 +1,46 @@ -numberOfRoundingPlaces: 8 +globalParameters: + numberOfRoundingPlaces: 8 + schematronFilePath: src/test/resources/schematronTest.xml useStreaming: true -schematronFilePath: src/test/resources/schematronTest.xml -checks: - C_GE_R_TOO_FEW_POINTS: +requirements: + R_GE_R_TOO_FEW_POINTS: enabled: true - C_GE_R_NOT_CLOSED: + R_GE_R_NOT_CLOSED: enabled: true - C_GE_R_DUPLICATE_POINT: + R_GE_R_CONSECUTIVE_POINTS_SAME: enabled: true - C_GE_R_SELF_INTERSECTION: + R_GE_R_SELF_INTERSECTION: enabled: true - C_GE_S_MULTIPLE_CONNECTED_COMPONENTS: + R_GE_S_MULTIPLE_CONNECTED_COMPONENTS: enabled: true - C_GE_P_INTERIOR_DISCONNECTED: + R_GE_P_INTERIOR_DISCONNECTED: enabled: true - C_GE_P_INTERSECTING_RINGS: + R_GE_P_INTERSECTING_RINGS: enabled: true - C_GE_P_NON_PLANAR: + R_GE_P_NON_PLANAR: enabled: false parameters: # one of ("distance", "angle", "both") type: distance distanceTolerance: 0.01 angleTolerance: 0.1 - C_GE_P_HOLE_OUTSIDE: + R_GE_P_HOLE_OUTSIDE: enabled: true - C_GE_P_ORIENTATION_RINGS_SAME: + R_GE_P_ORIENTATION_RINGS_SAME: enabled: true - C_GE_P_INNER_RINGS_NESTED: + R_GE_P_INNER_RINGS_NESTED: enabled: true - C_GE_S_TOO_FEW_POLYGONS: + R_GE_S_TOO_FEW_POLYGONS: enabled: true - C_GE_S_NOT_CLOSED: + R_GE_S_NOT_CLOSED: enabled: true - C_GE_S_NON_MANIFOLD_EDGE: + R_GE_S_NON_MANIFOLD_EDGE: enabled: true - C_GE_S_POLYGON_WRONG_ORIENTATION: + R_GE_S_POLYGON_WRONG_ORIENTATION: enabled: true - C_GE_S_ALL_POLYGONS_WRONG_ORIENTATION: + R_GE_S_ALL_POLYGONS_WRONG_ORIENTATION: enabled: true - C_GE_S_NON_MANIFOLD_VERTEX: + R_GE_S_NON_MANIFOLD_VERTEX: enabled: true - C_GE_S_SELF_INTERSECTION: + R_GE_S_SELF_INTERSECTION: enabled: true \ No newline at end of file