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 4dec1f148cd9506ebc0270ddcf3a7e9d1108739a..16b967ae36a7bcdc9ac74ae7641a357faab27f46 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 @@ -53,6 +53,7 @@ public class CheckId implements Serializable { 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"); + public static final CheckId C_SE_POLYGON_WITHOUT_SURFACE = new CheckId("C_SE_POLYGON_WITHOUT_SURFACE"); private String name; 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 dad78701833168ed15e664982d3e0baa6aafba5e..4b9045e2d81e957fc1f332bc5e563c4abec06c51 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 @@ -63,6 +63,7 @@ public class ErrorId implements Serializable { 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_RING = new ErrorId("GE_P_DEGENERATED_POLYGON"); + public static final ErrorId SE_POLYGON_WITHOUT_SURFACE = new ErrorId("SE_POLYGON_WITHOUT_SURFACE"); private String name; diff --git a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/check/ErrorVisitor.java b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/check/ErrorVisitor.java index d0a1012a3ba661956332e10d1463548ca7984a7e..231213631be162d965b26c00f666ccfc5ddef7d0 100644 --- a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/check/ErrorVisitor.java +++ b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/check/ErrorVisitor.java @@ -40,6 +40,7 @@ import de.hft.stuttgart.citydoctor2.check.error.PolygonHoleOutsideError; import de.hft.stuttgart.citydoctor2.check.error.PolygonInteriorDisconnectedError; import de.hft.stuttgart.citydoctor2.check.error.PolygonIntersectingRingsError; import de.hft.stuttgart.citydoctor2.check.error.PolygonSameOrientationError; +import de.hft.stuttgart.citydoctor2.check.error.PolygonWithoutSurfaceError; import de.hft.stuttgart.citydoctor2.check.error.PolygonWrongOrientationError; import de.hft.stuttgart.citydoctor2.check.error.RingDuplicatePointError; import de.hft.stuttgart.citydoctor2.check.error.RingEdgeIntersectionError; @@ -130,6 +131,8 @@ public interface ErrorVisitor { public void visit(AttributeValueWrongError err); - public void visit(AttributeInvalidError cdErr); + public void visit(AttributeInvalidError err); + + public void visit(PolygonWithoutSurfaceError err); } diff --git a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/check/HealingID.java b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/check/HealingID.java index 5fb33a88283a6abcc35109288c229758a5dcd355..12e8d19fcc77f879444144819b0f72010015b5f9 100644 --- a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/check/HealingID.java +++ b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/check/HealingID.java @@ -36,6 +36,7 @@ public class HealingID { public static final HealingID S_NOT_CLOSED = new HealingID("S_NOT_CLOSED"); public static final HealingID P_NON_PLANAR_POLYGON_CPP = new HealingID("P_NON_PLANAR_POLYGON_CPP"); public static final HealingID S_NOT_CLOSED_CPP = new HealingID("S_NOT_CLOSED_CPP"); + public static final HealingID SE_POLYGON_WITHOUT_SURFACE = new HealingID("SE_POLYGON_WITHOUT_SURFACE"); private String idString; diff --git a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/check/HealingMethod.java b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/check/HealingMethod.java index 38dc12e794d6caf95778e8e6f55ae5198e69686b..df909b774fda748f8085b99b0f72cfc041d824c5 100644 --- a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/check/HealingMethod.java +++ b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/check/HealingMethod.java @@ -39,6 +39,7 @@ import de.hft.stuttgart.citydoctor2.check.error.PolygonHoleOutsideError; import de.hft.stuttgart.citydoctor2.check.error.PolygonInteriorDisconnectedError; import de.hft.stuttgart.citydoctor2.check.error.PolygonIntersectingRingsError; import de.hft.stuttgart.citydoctor2.check.error.PolygonSameOrientationError; +import de.hft.stuttgart.citydoctor2.check.error.PolygonWithoutSurfaceError; import de.hft.stuttgart.citydoctor2.check.error.PolygonWrongOrientationError; import de.hft.stuttgart.citydoctor2.check.error.RingDuplicatePointError; import de.hft.stuttgart.citydoctor2.check.error.RingEdgeIntersectionError; @@ -195,6 +196,10 @@ public interface HealingMethod { default boolean visit(AttributeMissingError err, ModificationListener l) { return false; } + + default boolean visit(PolygonWithoutSurfaceError err, ModificationListener l) { + return false; + } public HealingMethod createNew(); diff --git a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/check/QualityAdeErrorVisitor.java b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/check/QualityAdeErrorVisitor.java index d576dc1dca50c709422620d28be188a6afc6ecb7..b9f67d61b8303ee5d282ffe3e4d67942a7eb16de 100644 --- a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/check/QualityAdeErrorVisitor.java +++ b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/check/QualityAdeErrorVisitor.java @@ -46,6 +46,7 @@ import de.hft.stuttgart.citydoctor2.check.error.PolygonHoleOutsideError; import de.hft.stuttgart.citydoctor2.check.error.PolygonInteriorDisconnectedError; import de.hft.stuttgart.citydoctor2.check.error.PolygonIntersectingRingsError; import de.hft.stuttgart.citydoctor2.check.error.PolygonSameOrientationError; +import de.hft.stuttgart.citydoctor2.check.error.PolygonWithoutSurfaceError; import de.hft.stuttgart.citydoctor2.check.error.PolygonWrongOrientationError; import de.hft.stuttgart.citydoctor2.check.error.RingDuplicatePointError; import de.hft.stuttgart.citydoctor2.check.error.RingEdgeIntersectionError; @@ -398,4 +399,9 @@ public class QualityAdeErrorVisitor implements ErrorVisitor { res.getErrors().add(new AbstractErrorProperty(err)); } + @Override + public void visit(PolygonWithoutSurfaceError err) { + // not translated + } + } 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 index b37888e8ad314d7f69aec4fce7bbcf0ebac94bb6..82c76162a00c1559fd52d1873c9a023e021513e1 100644 --- 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 @@ -66,7 +66,8 @@ public class Requirement implements Serializable { 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); - + public static final Requirement R_SE_POLYGON_WITHOUT_SURFACE = new Requirement("R_SE_POLYGON_WITHOUT_SURFACE", RequirementType.SEMANTIC); + static { // fill requirements with default parameters ArrayList<DefaultParameter> defaultParameters = new ArrayList<>(); diff --git a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/check/error/PolygonWithoutSurfaceError.java b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/check/error/PolygonWithoutSurfaceError.java new file mode 100644 index 0000000000000000000000000000000000000000..c5c1ea1c371761818e72467b0bf3bf4d60f8eb88 --- /dev/null +++ b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/check/error/PolygonWithoutSurfaceError.java @@ -0,0 +1,58 @@ +package de.hft.stuttgart.citydoctor2.check.error; + +import de.hft.stuttgart.citydoctor2.check.CheckError; +import de.hft.stuttgart.citydoctor2.check.ErrorId; +import de.hft.stuttgart.citydoctor2.check.ErrorReport; +import de.hft.stuttgart.citydoctor2.check.ErrorType; +import de.hft.stuttgart.citydoctor2.check.ErrorVisitor; +import de.hft.stuttgart.citydoctor2.check.HealingMethod; +import de.hft.stuttgart.citydoctor2.check.ModificationListener; +import de.hft.stuttgart.citydoctor2.datastructure.GmlElement; +import de.hft.stuttgart.citydoctor2.datastructure.Polygon; + +public class PolygonWithoutSurfaceError implements CheckError { + + private static final long serialVersionUID = 2676579487514583105L; + + private Polygon p; + + + public PolygonWithoutSurfaceError(Polygon polygon) { + p = polygon; + } + + @Override + public ErrorType getType() { + return ErrorType.ERROR; + } + + @Override + public ErrorId getErrorId() { + return ErrorId.SE_POLYGON_WITHOUT_SURFACE; + } + + public Polygon getPolygon() { + return p; + } + + @Override + public GmlElement getFeature() { + return p; + } + + @Override + public void accept(ErrorVisitor errorVisitor) { + errorVisitor.visit(this); + } + + @Override + public boolean accept(HealingMethod method, ModificationListener l) { + return method.visit(this, l); + } + + @Override + public void report(ErrorReport report) { + report.add(p); + } + +} diff --git a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/CityObject.java b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/CityObject.java index d76d5b52ef67c7808170607fc385eeeaf07af48e..58a3c0047954e4c421529571ed82d01214f93e24 100644 --- a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/CityObject.java +++ b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/CityObject.java @@ -91,6 +91,16 @@ public abstract class CityObject extends GmlElement { } } } + + public void removeGeometry(Lod lod, GeometryType type) { + Iterator<Geometry> it = geometryList.iterator(); + while (it.hasNext()) { + Geometry next = it.next(); + if (next.getLod() == lod && next.getType() == type) { + it.remove(); + } + } + } public Geometry getHighestLodGeometry() { Geometry highestLodGeometry = null; diff --git a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/mapper/citygml3/Citygml3GeometryMapper.java b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/mapper/citygml3/Citygml3GeometryMapper.java index 16b42382326ba35a2d13dc1164c43e7e6a55a7a8..edafa292ecf2a68e49f65efe451143a32ba6d093 100644 --- a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/mapper/citygml3/Citygml3GeometryMapper.java +++ b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/mapper/citygml3/Citygml3GeometryMapper.java @@ -147,7 +147,7 @@ public class Citygml3GeometryMapper extends GeometryWalker { trans.transform(p1, p2); x = p2.x; y = p2.y; - z = z / config.getFromMetres(); + z = z / config.getFromMeters(); } x = round(x, config.getNumberOfRoundingPlaces()); y = round(y, config.getNumberOfRoundingPlaces()); diff --git a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/parser/CityGmlParser.java b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/parser/CityGmlParser.java index c3b9d486f964f01269234c056927e7b3b982a501..9ad346c5e491945990af29927d525eeeaae1ee27 100644 --- a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/parser/CityGmlParser.java +++ b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/parser/CityGmlParser.java @@ -451,9 +451,9 @@ public class CityGmlParser { double fromMetres = projection.getFromMetres(); if (fromMetres > 0) { // also transform height information - config.setFromMetres(fromMetres); + config.setFromMeters(fromMetres); } else { - config.setFromMetres(1.0); + config.setFromMeters(1.0); } } diff --git a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/parser/ParserConfiguration.java b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/parser/ParserConfiguration.java index 5ace8d68ea90780aa5a832a787de119b52cb90c9..9adff4c2529f6da90c492c2e1e34e303cfe157b2 100644 --- a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/parser/ParserConfiguration.java +++ b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/parser/ParserConfiguration.java @@ -48,7 +48,7 @@ public class ParserConfiguration implements Serializable { private boolean hasTransformation = false; private boolean useLowMemoryConsumption = false; - private transient double fromMetres = 1.0; + private transient double fromMeters = 1.0; public ParserConfiguration(int numberOfRoundingPlaces, boolean validate) { this(numberOfRoundingPlaces, validate, false); @@ -106,12 +106,12 @@ public class ParserConfiguration implements Serializable { return originalTransform; } - public void setFromMetres(double d) { - fromMetres = d; + public void setFromMeters(double d) { + fromMeters = d; } - public double getFromMetres() { - return fromMetres; + public double getFromMeters() { + return fromMeters; } public boolean useLowMemoryConsumption() { diff --git a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/utils/CityGmlUtils.java b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/utils/CityGmlUtils.java index 4337ac3366d35b7766b0d14ea78258852700be61..aed503f7600c42097b91266eeaafa3b55f7ef539 100644 --- a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/utils/CityGmlUtils.java +++ b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/utils/CityGmlUtils.java @@ -59,12 +59,22 @@ public final class CityGmlUtils { org.xmlobjects.gml.model.geometry.primitives.Polygon gmlPoly = new org.xmlobjects.gml.model.geometry.primitives.Polygon(); // exterior ring LinearRing extLr = cdPoly.getExteriorRing(); + if (extLr.getVertices().size() < 3) { + // this ring does not have enough points in it + // this leads to errors when exporting therefore ignore it + return null; + } org.xmlobjects.gml.model.geometry.primitives.LinearRing gmlLr = createGmlRing(factory, config, extLr); gmlPoly.setExterior(new AbstractRingProperty(gmlLr)); // interior rings for (LinearRing lr : cdPoly.getInnerRings()) { gmlLr = createGmlRing(factory, config, lr); + if (lr.getVertices().size() < 3) { + // this ring does not have enough points in it + // this leads to errors when exporting therefore ignore it + return null; + } gmlPoly.getInterior().add(new AbstractRingProperty(gmlLr)); } gmlPoly.setId(cdPoly.getGmlId().getGmlString()); @@ -73,6 +83,7 @@ public final class CityGmlUtils { public static org.xmlobjects.gml.model.geometry.primitives.LinearRing createGmlRing(GeometryFactory factory, ParserConfiguration config, LinearRing lr) { + ProjCoordinate p1 = new ProjCoordinate(); ProjCoordinate p2 = new ProjCoordinate(); List<Double> ringValues = new ArrayList<>(); @@ -87,12 +98,13 @@ public final class CityGmlUtils { trans.transform(p1, p2); x = p2.x; y = p2.y; - z = z * config.getFromMetres(); + z = z * config.getFromMeters(); } ringValues.add(x); ringValues.add(y); ringValues.add(z); } + org.xmlobjects.gml.model.geometry.primitives.LinearRing gmlLr = factory.createLinearRing(ringValues, 3); gmlLr.setId(lr.getGmlId().getGmlString()); return gmlLr; 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 813170a93ed7ed69af5de5597c94fb4309225927..aa9ce41d27dedf7c13283001b25a0fceb639592c 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 @@ -52,6 +52,7 @@ import de.hft.stuttgart.citydoctor2.checks.semantics.IsCeilingCheck; import de.hft.stuttgart.citydoctor2.checks.semantics.IsFloorCheck; import de.hft.stuttgart.citydoctor2.checks.semantics.IsGroundCheck; import de.hft.stuttgart.citydoctor2.checks.semantics.IsWallCheck; +import de.hft.stuttgart.citydoctor2.checks.semantics.PolygonWithoutSurfaceCheck; import de.hft.stuttgart.citydoctor2.checks.semantics.RoofSurfaceUnfragmentedCheck; import de.hft.stuttgart.citydoctor2.utils.Localization; @@ -110,6 +111,7 @@ public class Checks { publish(new IsCeilingCheck()); publish(new IsGroundCheck()); publish(new RoofSurfaceUnfragmentedCheck()); + publish(new PolygonWithoutSurfaceCheck()); // load checks from service loader ServiceLoader<Check> checkLoader = ServiceLoader.load(Check.class); diff --git a/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/semantics/PolygonWithoutSurfaceCheck.java b/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/semantics/PolygonWithoutSurfaceCheck.java new file mode 100644 index 0000000000000000000000000000000000000000..23c6c00a84f60ac999e9e6b249364ad6c0ca5f30 --- /dev/null +++ b/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/semantics/PolygonWithoutSurfaceCheck.java @@ -0,0 +1,54 @@ +package de.hft.stuttgart.citydoctor2.checks.semantics; + +import java.util.Collections; +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.Requirement; +import de.hft.stuttgart.citydoctor2.check.RequirementType; +import de.hft.stuttgart.citydoctor2.check.ResultStatus; +import de.hft.stuttgart.citydoctor2.check.error.PolygonWithoutSurfaceError; +import de.hft.stuttgart.citydoctor2.datastructure.Lod; +import de.hft.stuttgart.citydoctor2.datastructure.Polygon; + +public class PolygonWithoutSurfaceCheck extends Check { + + @Override + public void check(Polygon poly) { + Lod lod = poly.getParent().getLod(); + if (lod == Lod.LOD2 || lod == Lod.LOD3 || lod == Lod.LOD4) { + // only check LOD2-4 + CheckResult cr; + if (poly.getPartOfSurface() == null) { + PolygonWithoutSurfaceError err = new PolygonWithoutSurfaceError(poly); + cr = new CheckResult(this, ResultStatus.ERROR, err); + } else { + cr = new CheckResult(this, ResultStatus.OK, null); + } + poly.addCheckResult(cr); + } + } + + @Override + public Set<Requirement> appliesToRequirements() { + return Collections.singleton(Requirement.R_SE_POLYGON_WITHOUT_SURFACE); + } + + @Override + public CheckId getCheckId() { + return CheckId.C_SE_POLYGON_WITHOUT_SURFACE; + } + + @Override + public RequirementType getType() { + return RequirementType.SEMANTIC; + } + + @Override + public Check createNewInstance() { + return new PolygonWithoutSurfaceCheck(); + } + +} diff --git a/CityDoctorParent/CityDoctorValidation/src/test/java/de/hft/stuttgart/citydoctor2/checks/semantics/PolygonWithoutSurfaceCheckTest.java b/CityDoctorParent/CityDoctorValidation/src/test/java/de/hft/stuttgart/citydoctor2/checks/semantics/PolygonWithoutSurfaceCheckTest.java new file mode 100644 index 0000000000000000000000000000000000000000..0bbb3fdf4b879f00ce94d5faded4996c4aa443e1 --- /dev/null +++ b/CityDoctorParent/CityDoctorValidation/src/test/java/de/hft/stuttgart/citydoctor2/checks/semantics/PolygonWithoutSurfaceCheckTest.java @@ -0,0 +1,75 @@ +package de.hft.stuttgart.citydoctor2.checks.semantics; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertSame; +import static org.junit.Assert.assertTrue; + +import org.junit.Test; + +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.ErrorId; +import de.hft.stuttgart.citydoctor2.check.ResultStatus; +import de.hft.stuttgart.citydoctor2.check.error.PolygonWithoutSurfaceError; +import de.hft.stuttgart.citydoctor2.datastructure.BoundarySurface; +import de.hft.stuttgart.citydoctor2.datastructure.ConcretePolygon; +import de.hft.stuttgart.citydoctor2.datastructure.Geometry; +import de.hft.stuttgart.citydoctor2.datastructure.GeometryType; +import de.hft.stuttgart.citydoctor2.datastructure.Lod; +import de.hft.stuttgart.citydoctor2.datastructure.Polygon; + +public class PolygonWithoutSurfaceCheckTest { + + @Test + public void testPolygonWithoutSurface() { + Geometry geom = new Geometry(GeometryType.SOLID, Lod.LOD2); + Polygon poly = new ConcretePolygon(); + geom.addPolygon(poly); + PolygonWithoutSurfaceCheck check = new PolygonWithoutSurfaceCheck(); + poly.accept(check); + CheckResult checkResult = poly.getCheckResult(check); + assertNotNull(checkResult); + assertEquals(ResultStatus.ERROR, checkResult.getResultStatus()); + assertEquals(CheckId.C_SE_POLYGON_WITHOUT_SURFACE, checkResult.getCheckIdentifier()); + CheckError error = checkResult.getError(); + assertNotNull(error); + assertEquals(ErrorId.SE_POLYGON_WITHOUT_SURFACE, error.getErrorId()); + assertTrue(error instanceof PolygonWithoutSurfaceError); + PolygonWithoutSurfaceError errorCast = (PolygonWithoutSurfaceError) error; + assertSame(poly, errorCast.getPolygon()); + } + + @Test + public void testPolygonWithSurface() { + Geometry geom = new Geometry(GeometryType.SOLID, Lod.LOD2); + Polygon poly = new ConcretePolygon(); + BoundarySurface bs = new BoundarySurface(null); + bs.addGeometry(geom); + geom.addPolygon(poly); + PolygonWithoutSurfaceCheck check = new PolygonWithoutSurfaceCheck(); + poly.accept(check); + CheckResult checkResult = poly.getCheckResult(check); + assertNotNull(checkResult); + assertEquals(ResultStatus.OK, checkResult.getResultStatus()); + assertEquals(CheckId.C_SE_POLYGON_WITHOUT_SURFACE, checkResult.getCheckIdentifier()); + CheckError error = checkResult.getError(); + assertNull(error); + } + + @Test + public void testPolygonWithWrongLod() { + Geometry geom = new Geometry(GeometryType.SOLID, Lod.LOD1); + Polygon poly = new ConcretePolygon(); + BoundarySurface bs = new BoundarySurface(null); + bs.addGeometry(geom); + geom.addPolygon(poly); + PolygonWithoutSurfaceCheck check = new PolygonWithoutSurfaceCheck(); + poly.accept(check); + CheckResult checkResult = poly.getCheckResult(check); + assertNull(checkResult); + } + +} diff --git a/CityDoctorParent/pom.xml b/CityDoctorParent/pom.xml index 50da97940ad1c095cf4670432b8efd5e56553da1..f392f00f42c30d75965293809eddea6e078773b3 100644 --- a/CityDoctorParent/pom.xml +++ b/CityDoctorParent/pom.xml @@ -103,12 +103,12 @@ <dependency> <groupId>org.citygml4j</groupId> <artifactId>citygml4j-core</artifactId> - <version>3.0.0</version> + <version>3.1.0</version> </dependency> <dependency> <groupId>org.citygml4j</groupId> <artifactId>citygml4j-xml</artifactId> - <version>3.0.0</version> + <version>3.1.0</version> </dependency> <dependency> <groupId>de.hft.stuttgart</groupId> @@ -156,6 +156,11 @@ <artifactId>log4j-core</artifactId> <version>${log4j.version}</version> </dependency> + <dependency> + <groupId>org.apache.logging.log4j</groupId> + <artifactId>log4j-jul</artifactId> + <version>${log4j.version}</version> + </dependency> <dependency> <groupId>org.yaml</groupId> <artifactId>snakeyaml</artifactId>