Commit 87dba3fa authored by Riegel's avatar Riegel
Browse files

Merge branch 'dev' into 'master'

CityDoctor Version 3.17.3

See merge request !34
parents 0d2e9fd5 aa9c2a95
Pipeline #11660 passed with stage
in 1 minute and 26 seconds
...@@ -5,6 +5,15 @@ All notable changes to this project will be documented in this file. ...@@ -5,6 +5,15 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
## [3.17.3] (2025-07-09)
- Fixed global errors not being cleared upon validation rerun
- Fixed ConstructiveElements of Buildings not being parsed
- Fixed PolygonPatches being added twice to Geometry
- Fixed missing uom and value for valid QualityADE output
- Reduced FOP-logging verbosity
- Added a facing property to Geometry, denoting whether it is facing inwards or outwards
## [3.17.2] (2025-06-05) ## [3.17.2] (2025-06-05)
- Rework of AbstractCheck, allowing the implementation of Visitors that use the CheckEngine to traverse the internal - Rework of AbstractCheck, allowing the implementation of Visitors that use the CheckEngine to traverse the internal
......
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
<parent> <parent>
<groupId>de.hft.stuttgart</groupId> <groupId>de.hft.stuttgart</groupId>
<artifactId>CityDoctorParent</artifactId> <artifactId>CityDoctorParent</artifactId>
<version>3.17.2</version> <version>3.17.3</version>
</parent> </parent>
<artifactId>CityDoctorCheckResult</artifactId> <artifactId>CityDoctorCheckResult</artifactId>
<dependencies> <dependencies>
......
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
<parent> <parent>
<groupId>de.hft.stuttgart</groupId> <groupId>de.hft.stuttgart</groupId>
<artifactId>CityDoctorParent</artifactId> <artifactId>CityDoctorParent</artifactId>
<version>3.17.2</version> <version>3.17.3</version>
</parent> </parent>
<artifactId>CityDoctorEdge</artifactId> <artifactId>CityDoctorEdge</artifactId>
<dependencies> <dependencies>
......
...@@ -32,12 +32,13 @@ import de.hft.stuttgart.citydoctor2.datastructure.LinearRing; ...@@ -32,12 +32,13 @@ import de.hft.stuttgart.citydoctor2.datastructure.LinearRing;
import de.hft.stuttgart.citydoctor2.datastructure.LinearRing.LinearRingType; import de.hft.stuttgart.citydoctor2.datastructure.LinearRing.LinearRingType;
import de.hft.stuttgart.citydoctor2.datastructure.Lod; import de.hft.stuttgart.citydoctor2.datastructure.Lod;
import de.hft.stuttgart.citydoctor2.datastructure.Vertex; import de.hft.stuttgart.citydoctor2.datastructure.Vertex;
import de.hft.stuttgart.citydoctor2.datastructure.Geometry.Orientation;
public class IntersectionErrorsTest { public class IntersectionErrorsTest {
@Test @Test
public void testWrongIntersection() { public void testWrongIntersection() {
Geometry geom = new Geometry(GeometryType.SOLID, Lod.LOD1); Geometry geom = new Geometry(GeometryType.SOLID, Lod.LOD1, Orientation.OUTWARD);
ConcretePolygon p1 = new ConcretePolygon(); ConcretePolygon p1 = new ConcretePolygon();
......
...@@ -43,12 +43,13 @@ import de.hft.stuttgart.citydoctor2.parser.ParserConfiguration; ...@@ -43,12 +43,13 @@ import de.hft.stuttgart.citydoctor2.parser.ParserConfiguration;
import de.hft.stuttgart.citydoctor2.datastructure.Lod; import de.hft.stuttgart.citydoctor2.datastructure.Lod;
import de.hft.stuttgart.citydoctor2.datastructure.Polygon; import de.hft.stuttgart.citydoctor2.datastructure.Polygon;
import de.hft.stuttgart.citydoctor2.datastructure.Vertex; import de.hft.stuttgart.citydoctor2.datastructure.Vertex;
import de.hft.stuttgart.citydoctor2.datastructure.Geometry.Orientation;
public class MeshSurfaceUtilsTest { public class MeshSurfaceUtilsTest {
@Test @Test
public void testIntersectionTwoTrianglesOneSharedEdgeInPlane() { public void testIntersectionTwoTrianglesOneSharedEdgeInPlane() {
Geometry geom = new Geometry(GeometryType.SOLID, Lod.LOD1); Geometry geom = new Geometry(GeometryType.SOLID, Lod.LOD1, Orientation.OUTWARD);
Polygon p1 = new ConcretePolygon(); Polygon p1 = new ConcretePolygon();
geom.addPolygon(p1); geom.addPolygon(p1);
...@@ -161,7 +162,7 @@ public class MeshSurfaceUtilsTest { ...@@ -161,7 +162,7 @@ public class MeshSurfaceUtilsTest {
@Test @Test
public void testIntersectionTwoPolygonsTwoSharedEdges() { public void testIntersectionTwoPolygonsTwoSharedEdges() {
Geometry geom = new Geometry(GeometryType.SOLID, Lod.LOD1); Geometry geom = new Geometry(GeometryType.SOLID, Lod.LOD1, Orientation.OUTWARD);
Polygon p1 = new ConcretePolygon(); Polygon p1 = new ConcretePolygon();
geom.addPolygon(p1); geom.addPolygon(p1);
...@@ -212,7 +213,7 @@ public class MeshSurfaceUtilsTest { ...@@ -212,7 +213,7 @@ public class MeshSurfaceUtilsTest {
@Test @Test
public void testIntersectionTwoPolygonsOneSharedEdgeIntersectionPolygonPlanar() { public void testIntersectionTwoPolygonsOneSharedEdgeIntersectionPolygonPlanar() {
Geometry geom = new Geometry(GeometryType.SOLID, Lod.LOD1); Geometry geom = new Geometry(GeometryType.SOLID, Lod.LOD1, Orientation.OUTWARD);
Polygon p1 = new ConcretePolygon(); Polygon p1 = new ConcretePolygon();
geom.addPolygon(p1); geom.addPolygon(p1);
...@@ -276,7 +277,7 @@ public class MeshSurfaceUtilsTest { ...@@ -276,7 +277,7 @@ public class MeshSurfaceUtilsTest {
@Test @Test
public void testIntersectionTwoPolygonsOneSharedEdgeIntersectionPolygonPlanar2() { public void testIntersectionTwoPolygonsOneSharedEdgeIntersectionPolygonPlanar2() {
Geometry geom = new Geometry(GeometryType.SOLID, Lod.LOD1); Geometry geom = new Geometry(GeometryType.SOLID, Lod.LOD1, Orientation.OUTWARD);
Polygon p1 = new ConcretePolygon(); Polygon p1 = new ConcretePolygon();
geom.addPolygon(p1); geom.addPolygon(p1);
...@@ -339,7 +340,7 @@ public class MeshSurfaceUtilsTest { ...@@ -339,7 +340,7 @@ public class MeshSurfaceUtilsTest {
@Test @Test
public void testIntersectionTwoPolygonsOneSharedEdgeCloseEdgePlanar() { public void testIntersectionTwoPolygonsOneSharedEdgeCloseEdgePlanar() {
Geometry geom = new Geometry(GeometryType.SOLID, Lod.LOD1); Geometry geom = new Geometry(GeometryType.SOLID, Lod.LOD1, Orientation.OUTWARD);
Polygon p1 = new ConcretePolygon(); Polygon p1 = new ConcretePolygon();
geom.addPolygon(p1); geom.addPolygon(p1);
...@@ -393,7 +394,7 @@ public class MeshSurfaceUtilsTest { ...@@ -393,7 +394,7 @@ public class MeshSurfaceUtilsTest {
@Test @Test
public void testIntersectionTwoPolygonsOneSharedEdgeNotPlanar() { public void testIntersectionTwoPolygonsOneSharedEdgeNotPlanar() {
Geometry geom = new Geometry(GeometryType.SOLID, Lod.LOD1); Geometry geom = new Geometry(GeometryType.SOLID, Lod.LOD1, Orientation.OUTWARD);
Polygon p1 = new ConcretePolygon(); Polygon p1 = new ConcretePolygon();
geom.addPolygon(p1); geom.addPolygon(p1);
...@@ -447,7 +448,7 @@ public class MeshSurfaceUtilsTest { ...@@ -447,7 +448,7 @@ public class MeshSurfaceUtilsTest {
@Test @Test
public void testIntersectionTwoPolygonsOneSharedPointNotPlanar() { public void testIntersectionTwoPolygonsOneSharedPointNotPlanar() {
Geometry geom = new Geometry(GeometryType.SOLID, Lod.LOD1); Geometry geom = new Geometry(GeometryType.SOLID, Lod.LOD1, Orientation.OUTWARD);
Polygon p1 = new ConcretePolygon(); Polygon p1 = new ConcretePolygon();
geom.addPolygon(p1); geom.addPolygon(p1);
...@@ -508,7 +509,7 @@ public class MeshSurfaceUtilsTest { ...@@ -508,7 +509,7 @@ public class MeshSurfaceUtilsTest {
@Test @Test
public void testIntersectionTwoPolygonsTouchingInOnePointNoIntersectionNotPlanar() { public void testIntersectionTwoPolygonsTouchingInOnePointNoIntersectionNotPlanar() {
Geometry geom = new Geometry(GeometryType.SOLID, Lod.LOD1); Geometry geom = new Geometry(GeometryType.SOLID, Lod.LOD1, Orientation.OUTWARD);
Polygon p1 = new ConcretePolygon(); Polygon p1 = new ConcretePolygon();
geom.addPolygon(p1); geom.addPolygon(p1);
...@@ -561,7 +562,7 @@ public class MeshSurfaceUtilsTest { ...@@ -561,7 +562,7 @@ public class MeshSurfaceUtilsTest {
@Test @Test
public void testIntersectionTwoPolygonsTouchingInOnePointNoIntersectionNotPlanar2() { public void testIntersectionTwoPolygonsTouchingInOnePointNoIntersectionNotPlanar2() {
Geometry geom = new Geometry(GeometryType.SOLID, Lod.LOD1); Geometry geom = new Geometry(GeometryType.SOLID, Lod.LOD1, Orientation.OUTWARD);
Polygon p1 = new ConcretePolygon(); Polygon p1 = new ConcretePolygon();
geom.addPolygon(p1); geom.addPolygon(p1);
...@@ -616,7 +617,7 @@ public class MeshSurfaceUtilsTest { ...@@ -616,7 +617,7 @@ public class MeshSurfaceUtilsTest {
@Test @Test
public void testIntersectionTwoPolygonsNotInSamePlaneBelow() { public void testIntersectionTwoPolygonsNotInSamePlaneBelow() {
Geometry geom = new Geometry(GeometryType.SOLID, Lod.LOD1); Geometry geom = new Geometry(GeometryType.SOLID, Lod.LOD1, Orientation.OUTWARD);
Polygon p1 = new ConcretePolygon(); Polygon p1 = new ConcretePolygon();
geom.addPolygon(p1); geom.addPolygon(p1);
...@@ -670,7 +671,7 @@ public class MeshSurfaceUtilsTest { ...@@ -670,7 +671,7 @@ public class MeshSurfaceUtilsTest {
@Test @Test
public void testIntersectionTwoPolygonsNotInSamePlaneAbove() { public void testIntersectionTwoPolygonsNotInSamePlaneAbove() {
Geometry geom = new Geometry(GeometryType.SOLID, Lod.LOD1); Geometry geom = new Geometry(GeometryType.SOLID, Lod.LOD1, Orientation.OUTWARD);
Polygon p1 = new ConcretePolygon(); Polygon p1 = new ConcretePolygon();
geom.addPolygon(p1); geom.addPolygon(p1);
...@@ -724,7 +725,7 @@ public class MeshSurfaceUtilsTest { ...@@ -724,7 +725,7 @@ public class MeshSurfaceUtilsTest {
@Test @Test
public void testIntersectionTwoPolygonsNotInSamePlaneAboveInverted() { public void testIntersectionTwoPolygonsNotInSamePlaneAboveInverted() {
Geometry geom = new Geometry(GeometryType.SOLID, Lod.LOD1); Geometry geom = new Geometry(GeometryType.SOLID, Lod.LOD1, Orientation.OUTWARD);
Polygon p1 = new ConcretePolygon(); Polygon p1 = new ConcretePolygon();
geom.addPolygon(p1); geom.addPolygon(p1);
...@@ -778,7 +779,7 @@ public class MeshSurfaceUtilsTest { ...@@ -778,7 +779,7 @@ public class MeshSurfaceUtilsTest {
@Test @Test
public void testIntersectionTwoPolygonsTouchingNoPointsSameNotPlanar() { public void testIntersectionTwoPolygonsTouchingNoPointsSameNotPlanar() {
Geometry geom = new Geometry(GeometryType.SOLID, Lod.LOD1); Geometry geom = new Geometry(GeometryType.SOLID, Lod.LOD1, Orientation.OUTWARD);
Polygon p1 = new ConcretePolygon(); Polygon p1 = new ConcretePolygon();
geom.addPolygon(p1); geom.addPolygon(p1);
...@@ -834,7 +835,7 @@ public class MeshSurfaceUtilsTest { ...@@ -834,7 +835,7 @@ public class MeshSurfaceUtilsTest {
@Test @Test
public void testIntersectionTwoPolygonsTouchingEdgeNoPointsSameNotPlanar() { public void testIntersectionTwoPolygonsTouchingEdgeNoPointsSameNotPlanar() {
Geometry geom = new Geometry(GeometryType.SOLID, Lod.LOD1); Geometry geom = new Geometry(GeometryType.SOLID, Lod.LOD1, Orientation.OUTWARD);
Polygon p1 = new ConcretePolygon(); Polygon p1 = new ConcretePolygon();
geom.addPolygon(p1); geom.addPolygon(p1);
...@@ -890,7 +891,7 @@ public class MeshSurfaceUtilsTest { ...@@ -890,7 +891,7 @@ public class MeshSurfaceUtilsTest {
@Test @Test
public void testIntersectionTwoPolygonsTouchingEdgeInPointNoPointsSameNotPlanar() { public void testIntersectionTwoPolygonsTouchingEdgeInPointNoPointsSameNotPlanar() {
Geometry geom = new Geometry(GeometryType.SOLID, Lod.LOD1); Geometry geom = new Geometry(GeometryType.SOLID, Lod.LOD1, Orientation.OUTWARD);
Polygon p1 = new ConcretePolygon(); Polygon p1 = new ConcretePolygon();
geom.addPolygon(p1); geom.addPolygon(p1);
...@@ -946,7 +947,7 @@ public class MeshSurfaceUtilsTest { ...@@ -946,7 +947,7 @@ public class MeshSurfaceUtilsTest {
@Test @Test
public void testIntersectionTwoPolygonsTwoTouchingEdgesNotPlanar() { public void testIntersectionTwoPolygonsTwoTouchingEdgesNotPlanar() {
Geometry geom = new Geometry(GeometryType.SOLID, Lod.LOD1); Geometry geom = new Geometry(GeometryType.SOLID, Lod.LOD1, Orientation.OUTWARD);
Polygon p1 = new ConcretePolygon(); Polygon p1 = new ConcretePolygon();
geom.addPolygon(p1); geom.addPolygon(p1);
...@@ -1002,7 +1003,7 @@ public class MeshSurfaceUtilsTest { ...@@ -1002,7 +1003,7 @@ public class MeshSurfaceUtilsTest {
@Test @Test
public void testIntersectionTwoPolygonsPlanarInnerRingsContained() { public void testIntersectionTwoPolygonsPlanarInnerRingsContained() {
Geometry geom = new Geometry(GeometryType.SOLID, Lod.LOD1); Geometry geom = new Geometry(GeometryType.SOLID, Lod.LOD1, Orientation.OUTWARD);
Polygon p1 = new ConcretePolygon(); Polygon p1 = new ConcretePolygon();
geom.addPolygon(p1); geom.addPolygon(p1);
...@@ -1067,7 +1068,7 @@ public class MeshSurfaceUtilsTest { ...@@ -1067,7 +1068,7 @@ public class MeshSurfaceUtilsTest {
@Test @Test
public void testIntersectionTwoPolygonsPlanarInnerRingsContainedConnected() { public void testIntersectionTwoPolygonsPlanarInnerRingsContainedConnected() {
Geometry geom = new Geometry(GeometryType.SOLID, Lod.LOD1); Geometry geom = new Geometry(GeometryType.SOLID, Lod.LOD1, Orientation.OUTWARD);
Polygon p1 = new ConcretePolygon(); Polygon p1 = new ConcretePolygon();
geom.addPolygon(p1); geom.addPolygon(p1);
...@@ -1128,7 +1129,7 @@ public class MeshSurfaceUtilsTest { ...@@ -1128,7 +1129,7 @@ public class MeshSurfaceUtilsTest {
@Test @Test
public void testIntersectionTwoPolygonsInnerRingsConnected() { public void testIntersectionTwoPolygonsInnerRingsConnected() {
Geometry geom = new Geometry(GeometryType.SOLID, Lod.LOD1); Geometry geom = new Geometry(GeometryType.SOLID, Lod.LOD1, Orientation.OUTWARD);
Polygon p1 = new ConcretePolygon(); Polygon p1 = new ConcretePolygon();
geom.addPolygon(p1); geom.addPolygon(p1);
...@@ -1191,7 +1192,7 @@ public class MeshSurfaceUtilsTest { ...@@ -1191,7 +1192,7 @@ public class MeshSurfaceUtilsTest {
@Test @Test
public void testIntersectionTwoPolygonsInnerRingsThroughHole() { public void testIntersectionTwoPolygonsInnerRingsThroughHole() {
Geometry geom = new Geometry(GeometryType.SOLID, Lod.LOD1); Geometry geom = new Geometry(GeometryType.SOLID, Lod.LOD1, Orientation.OUTWARD);
Polygon p1 = new ConcretePolygon(); Polygon p1 = new ConcretePolygon();
geom.addPolygon(p1); geom.addPolygon(p1);
......
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
<parent> <parent>
<groupId>de.hft.stuttgart</groupId> <groupId>de.hft.stuttgart</groupId>
<artifactId>CityDoctorParent</artifactId> <artifactId>CityDoctorParent</artifactId>
<version>3.17.2</version> <version>3.17.3</version>
</parent> </parent>
<properties> <properties>
<versionString>${project.version}-${git.commit.id.abbrev}</versionString> <versionString>${project.version}-${git.commit.id.abbrev}</versionString>
......
/*-
* 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.util.Collections;
import java.util.Set;
/**
*
* This class serves as a Parent for non-validating checks that want to use the CheckEngine's Visitor-pattern for the
* implementation of utility functions like e.g. collecting the sub-CityObjects in a Feature.
*
*
* @author Matthias Betz
*
*/
public abstract class AbstractCheck extends Check {
@Override
public Set<Requirement> appliesToRequirements() {
return Collections.emptySet();
}
@Override
public CheckId getCheckId() {
return null;
}
@Override
public RequirementType getType() {
return null;
}
@Override
public Check createNewInstance() {
return null;
}
@Override
public final boolean isValidator() {
return false;
}
}
package de.hft.stuttgart.citydoctor2.check;
import de.hft.stuttgart.citydoctor2.check.error.AllPolygonsWrongOrientationError;
import de.hft.stuttgart.citydoctor2.check.error.AttributeInvalidError;
import de.hft.stuttgart.citydoctor2.check.error.AttributeMissingError;
import de.hft.stuttgart.citydoctor2.check.error.AttributeValueWrongError;
import de.hft.stuttgart.citydoctor2.check.error.ConsecutivePointSameError;
import de.hft.stuttgart.citydoctor2.check.error.DegeneratedRingError;
import de.hft.stuttgart.citydoctor2.check.error.DependenciesNotMetError;
import de.hft.stuttgart.citydoctor2.check.error.MultipleConnectedComponentsError;
import de.hft.stuttgart.citydoctor2.check.error.NestedRingError;
import de.hft.stuttgart.citydoctor2.check.error.NonManifoldEdgeError;
import de.hft.stuttgart.citydoctor2.check.error.NonManifoldVertexError;
import de.hft.stuttgart.citydoctor2.check.error.NonPlanarPolygonDistancePlaneError;
import de.hft.stuttgart.citydoctor2.check.error.NonPlanarPolygonNormalsDeviation;
import de.hft.stuttgart.citydoctor2.check.error.NotCeilingError;
import de.hft.stuttgart.citydoctor2.check.error.NotFloorError;
import de.hft.stuttgart.citydoctor2.check.error.NotGroundError;
import de.hft.stuttgart.citydoctor2.check.error.NotWallError;
import de.hft.stuttgart.citydoctor2.check.error.NullAreaError;
import de.hft.stuttgart.citydoctor2.check.error.PlanarityError;
import de.hft.stuttgart.citydoctor2.check.error.PointTouchesEdgeError;
import de.hft.stuttgart.citydoctor2.check.error.PolygonError;
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;
import de.hft.stuttgart.citydoctor2.check.error.RingError;
import de.hft.stuttgart.citydoctor2.check.error.RingNotClosedError;
import de.hft.stuttgart.citydoctor2.check.error.RingSelfIntersectionError;
import de.hft.stuttgart.citydoctor2.check.error.RingTooFewPointsError;
import de.hft.stuttgart.citydoctor2.check.error.SchematronError;
import de.hft.stuttgart.citydoctor2.check.error.SolidError;
import de.hft.stuttgart.citydoctor2.check.error.SolidNotClosedError;
import de.hft.stuttgart.citydoctor2.check.error.SolidSelfIntError;
import de.hft.stuttgart.citydoctor2.check.error.SurfaceUnfragmentedError;
import de.hft.stuttgart.citydoctor2.check.error.TooFewPolygonsError;
import de.hft.stuttgart.citydoctor2.check.error.UnknownCheckError;
public abstract class AbstractErrorVisitor implements ErrorVisitor {
@Override
public void visit(RingError err) {
}
@Override
public void visit(PolygonError err) {
}
@Override
public void visit(RingSelfIntersectionError err) {
}
@Override
public void visit(PlanarityError err) {
}
@Override
public void visit(PolygonHoleOutsideError err) {
}
@Override
public void visit(NonManifoldEdgeError err) {
}
@Override
public void visit(MultipleConnectedComponentsError err) {
}
@Override
public void visit(NestedRingError err) {
}
@Override
public void visit(NonManifoldVertexError err) {
}
@Override
public void visit(PolygonWrongOrientationError err) {
}
@Override
public void visit(PolygonSameOrientationError err) {
}
@Override
public void visit(SolidNotClosedError err) {
}
@Override
public void visit(DependenciesNotMetError err) {
}
@Override
public void visit(UnknownCheckError err) {
}
@Override
public void visit(RingNotClosedError err) {
}
@Override
public void visit(ConsecutivePointSameError err) {
}
@Override
public void visit(AllPolygonsWrongOrientationError err) {
}
@Override
public void visit(PolygonInteriorDisconnectedError err) {
}
@Override
public void visit(NullAreaError err) {
}
@Override
public void visit(RingTooFewPointsError err) {
}
@Override
public void visit(NonPlanarPolygonNormalsDeviation err) {
}
@Override
public void visit(NonPlanarPolygonDistancePlaneError err) {
}
@Override
public void visit(PolygonIntersectingRingsError err) {
}
@Override
public void visit(SolidSelfIntError err) {
}
@Override
public void visit(TooFewPolygonsError err) {
}
@Override
public void visit(RingDuplicatePointError err) {
}
@Override
public void visit(RingEdgeIntersectionError err) {
}
@Override
public void visit(PointTouchesEdgeError err) {
}
@Override
public void visit(NotCeilingError err) {
}
@Override
public void visit(NotFloorError err) {
}
@Override
public void visit(NotWallError err) {
}
@Override
public void visit(NotGroundError err) {
}
@Override
public void visit(CheckError err) {
}
@Override
public void visit(SchematronError err) {
}
@Override
public void visit(SurfaceUnfragmentedError err) {
}
@Override
public void visit(DegeneratedRingError err) {
}
@Override
public void visit(AttributeMissingError err) {
}
@Override
public void visit(AttributeValueWrongError err) {
}
@Override
public void visit(AttributeInvalidError err) {
}
@Override
public void visit(PolygonWithoutSurfaceError err) {
}
@Override
public void visit(SolidError err) {
}
}
...@@ -49,7 +49,7 @@ import de.hft.stuttgart.citydoctor2.parser.ParserConfiguration; ...@@ -49,7 +49,7 @@ import de.hft.stuttgart.citydoctor2.parser.ParserConfiguration;
* @author Matthias Betz * @author Matthias Betz
* *
*/ */
public abstract class Check { public abstract non-sealed class Check implements CheckableVisitor {
private final List<Class<Checkable>> applicableToClasses = new ArrayList<>(2); private final List<Class<Checkable>> applicableToClasses = new ArrayList<>(2);
...@@ -67,11 +67,6 @@ public abstract class Check { ...@@ -67,11 +67,6 @@ public abstract class Check {
} }
} }
/**
* Returns all classes for which the check needs to be executed
*
* @return a list of classes which the check applies to
*/
public List<Class<Checkable>> getApplicableToClasses() { public List<Class<Checkable>> getApplicableToClasses() {
return applicableToClasses; return applicableToClasses;
} }
...@@ -108,22 +103,21 @@ public abstract class Check { ...@@ -108,22 +103,21 @@ public abstract class Check {
* *
* @return true if it validates, false otherwise * @return true if it validates, false otherwise
*/ */
@Override
public boolean isValidator() { public boolean isValidator() {
return true; return true;
} }
/** /**
* Checks whether the check can be executed on this checkable, meaning the * Checks whether this Check can execute on the Checkable, meaning the Checkable contains no error from
* checkable or its content can not have any error of any check dependent on * this Check's dependencies and is applicable to this Check. <br/>
* this check. <br> * If the check cannot be executed due to not fulfilling the dependencies a CheckResult will be created with the
* If the check cannot be executed a CheckResult will be created with the
* ResultStatus = DEPENDENCIES_NOT_MET. * ResultStatus = DEPENDENCIES_NOT_MET.
* *
* @param c the checkable * @param c the checkable
* @param crc container for all check results * @return true if the check can be executed, false otherwise
* @return true if the check can be executed, false if the checkable itself or
* one of its containing checkables have an error.
*/ */
@Override
public boolean canExecute(Checkable c) { public boolean canExecute(Checkable c) {
// ignore objects where this check doesn't apply to // ignore objects where this check doesn't apply to
if (!canBeApplied(c)) { if (!canBeApplied(c)) {
......
...@@ -26,7 +26,7 @@ import java.util.Map; ...@@ -26,7 +26,7 @@ import java.util.Map;
import de.hft.stuttgart.citydoctor2.utils.CheckErrorFound; import de.hft.stuttgart.citydoctor2.utils.CheckErrorFound;
import de.hft.stuttgart.citydoctor2.utils.visitors.CheckableErrorCollector; import de.hft.stuttgart.citydoctor2.utils.visitors.CheckableErrorCollector;
import de.hft.stuttgart.citydoctor2.utils.visitors.ClearCheckResultsVisitor; import de.hft.stuttgart.citydoctor2.utils.visitors.ClearVisitorResultsVisitor;
import de.hft.stuttgart.citydoctor2.utils.visitors.ClearMetaInformationVisitor; import de.hft.stuttgart.citydoctor2.utils.visitors.ClearMetaInformationVisitor;
import de.hft.stuttgart.citydoctor2.utils.visitors.ContainsAnyErrorVisitor; import de.hft.stuttgart.citydoctor2.utils.visitors.ContainsAnyErrorVisitor;
import de.hft.stuttgart.citydoctor2.utils.visitors.ContainsErrorVisitor; import de.hft.stuttgart.citydoctor2.utils.visitors.ContainsErrorVisitor;
...@@ -74,7 +74,7 @@ public abstract class Checkable implements Serializable { ...@@ -74,7 +74,7 @@ public abstract class Checkable implements Serializable {
* @param c the check from which the check method is called with the Checkable * @param c the check from which the check method is called with the Checkable
* instance as parameter. * instance as parameter.
*/ */
public void accept(Check c) { public void accept(CheckableVisitor c) {
if (c.canExecute(this)) { if (c.canExecute(this)) {
c.check(this); c.check(this);
} }
...@@ -232,7 +232,7 @@ public abstract class Checkable implements Serializable { ...@@ -232,7 +232,7 @@ public abstract class Checkable implements Serializable {
* Clears the checkResults list of this checkable and all child objects in its datastructure. * Clears the checkResults list of this checkable and all child objects in its datastructure.
*/ */
public final void clearAllContainedCheckResults() { public final void clearAllContainedCheckResults() {
this.accept(new ClearCheckResultsVisitor()); this.accept(new ClearVisitorResultsVisitor());
} }
/** /**
......
/*-
* 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 de.hft.stuttgart.citydoctor2.datastructure.AbstractBuilding;
import de.hft.stuttgart.citydoctor2.datastructure.BoundarySurface;
import de.hft.stuttgart.citydoctor2.datastructure.BridgeObject;
import de.hft.stuttgart.citydoctor2.datastructure.Building;
import de.hft.stuttgart.citydoctor2.datastructure.BuildingPart;
import de.hft.stuttgart.citydoctor2.datastructure.CityFurniture;
import de.hft.stuttgart.citydoctor2.datastructure.CityObject;
import de.hft.stuttgart.citydoctor2.datastructure.GenericCityObject;
import de.hft.stuttgart.citydoctor2.datastructure.Geometry;
import de.hft.stuttgart.citydoctor2.datastructure.Installation;
import de.hft.stuttgart.citydoctor2.datastructure.LandObject;
import de.hft.stuttgart.citydoctor2.datastructure.LinearRing;
import de.hft.stuttgart.citydoctor2.datastructure.Opening;
import de.hft.stuttgart.citydoctor2.datastructure.Polygon;
import de.hft.stuttgart.citydoctor2.datastructure.ReliefObject;
import de.hft.stuttgart.citydoctor2.datastructure.TinObject;
import de.hft.stuttgart.citydoctor2.datastructure.TransportationObject;
import de.hft.stuttgart.citydoctor2.datastructure.Vegetation;
import de.hft.stuttgart.citydoctor2.datastructure.WaterObject;
/**
*
* This class serves as the base for CheckableVisitors which fulfill utility functions, like e.g. collecting all
* sub-CityObjects in the datastructure of a CityObject.
* </p>
* Visitors extending from this class will not change the validated-flag of the visited Checkables.
*
*/
public abstract non-sealed class CheckableUtilsVisitor implements CheckableVisitor {
/**
* This function is used for checking of dependencies in {@link Check}. Since UtilsVisitors do not have
* dependencies this function will always return true.
*
* @param c a Checkable
* @return true
*/
@Override
public boolean canExecute(Checkable c) {
return true;
}
@Override
public final boolean isValidator() {
return false;
}
@Override
public void check(Checkable checkable) {
}
@Override
public void check(AbstractBuilding ab) {
}
@Override
public void check(BoundarySurface bs) {
}
@Override
public void check(BridgeObject bo) {
}
@Override
public void check(Building b) {
}
@Override
public void check(Installation bi) {
}
@Override
public void check(BuildingPart bp) {
}
@Override
public void check(CityObject co) {
}
@Override
public void check(LandObject lo) {
}
@Override
public void check(Opening o) {
}
@Override
public void check(TransportationObject to) {
}
@Override
public void check(Vegetation veg) {
}
@Override
public void check(WaterObject wo) {
}
@Override
public void check(Geometry geom) {
}
@Override
public void check(Polygon poly) {
}
@Override
public void check(LinearRing ring) {
}
@Override
public void check(TinObject tin) {
}
@Override
public void check(ReliefObject relief) {
}
@Override
public void check(CityFurniture cf) {
}
@Override
public void check(GenericCityObject gco) {
}
}
package de.hft.stuttgart.citydoctor2.check;
import de.hft.stuttgart.citydoctor2.datastructure.AbstractBuilding;
import de.hft.stuttgart.citydoctor2.datastructure.BoundarySurface;
import de.hft.stuttgart.citydoctor2.datastructure.BridgeObject;
import de.hft.stuttgart.citydoctor2.datastructure.Building;
import de.hft.stuttgart.citydoctor2.datastructure.BuildingPart;
import de.hft.stuttgart.citydoctor2.datastructure.CityFurniture;
import de.hft.stuttgart.citydoctor2.datastructure.CityObject;
import de.hft.stuttgart.citydoctor2.datastructure.GenericCityObject;
import de.hft.stuttgart.citydoctor2.datastructure.Geometry;
import de.hft.stuttgart.citydoctor2.datastructure.Installation;
import de.hft.stuttgart.citydoctor2.datastructure.LandObject;
import de.hft.stuttgart.citydoctor2.datastructure.LinearRing;
import de.hft.stuttgart.citydoctor2.datastructure.Opening;
import de.hft.stuttgart.citydoctor2.datastructure.Polygon;
import de.hft.stuttgart.citydoctor2.datastructure.ReliefObject;
import de.hft.stuttgart.citydoctor2.datastructure.TinObject;
import de.hft.stuttgart.citydoctor2.datastructure.TransportationObject;
import de.hft.stuttgart.citydoctor2.datastructure.Vegetation;
import de.hft.stuttgart.citydoctor2.datastructure.WaterObject;
public sealed interface CheckableVisitor permits Check, CheckableUtilsVisitor {
/**
* Returns whether a Checkable should be flagged as validated after accepting this Visitor.
*/
boolean isValidator();
boolean canExecute(Checkable c);
void check(Checkable checkable);
void check(AbstractBuilding ab);
void check(BoundarySurface bs);
void check(BridgeObject bo);
void check(Building b);
void check(Installation bi);
void check(BuildingPart bp);
void check(CityObject co);
void check(LandObject lo);
void check(Opening o);
void check(TransportationObject to);
void check(Vegetation veg);
void check(WaterObject wo);
void check(Geometry geom);
void check(Polygon poly);
void check(LinearRing ring);
void check(TinObject tin);
void check(ReliefObject relief);
void check(CityFurniture cf);
void check(GenericCityObject gco);
}
...@@ -23,6 +23,7 @@ import de.hft.stuttgart.citydoctor2.check.error.AttributeInvalidError; ...@@ -23,6 +23,7 @@ import de.hft.stuttgart.citydoctor2.check.error.AttributeInvalidError;
import de.hft.stuttgart.citydoctor2.check.error.AttributeMissingError; import de.hft.stuttgart.citydoctor2.check.error.AttributeMissingError;
import de.hft.stuttgart.citydoctor2.check.error.AttributeValueWrongError; import de.hft.stuttgart.citydoctor2.check.error.AttributeValueWrongError;
import de.hft.stuttgart.citydoctor2.check.error.ConsecutivePointSameError; import de.hft.stuttgart.citydoctor2.check.error.ConsecutivePointSameError;
import de.hft.stuttgart.citydoctor2.check.error.DegeneratedRingError;
import de.hft.stuttgart.citydoctor2.check.error.DependenciesNotMetError; import de.hft.stuttgart.citydoctor2.check.error.DependenciesNotMetError;
import de.hft.stuttgart.citydoctor2.check.error.MultipleConnectedComponentsError; import de.hft.stuttgart.citydoctor2.check.error.MultipleConnectedComponentsError;
import de.hft.stuttgart.citydoctor2.check.error.NestedRingError; import de.hft.stuttgart.citydoctor2.check.error.NestedRingError;
...@@ -35,7 +36,9 @@ import de.hft.stuttgart.citydoctor2.check.error.NotFloorError; ...@@ -35,7 +36,9 @@ import de.hft.stuttgart.citydoctor2.check.error.NotFloorError;
import de.hft.stuttgart.citydoctor2.check.error.NotGroundError; import de.hft.stuttgart.citydoctor2.check.error.NotGroundError;
import de.hft.stuttgart.citydoctor2.check.error.NotWallError; import de.hft.stuttgart.citydoctor2.check.error.NotWallError;
import de.hft.stuttgart.citydoctor2.check.error.NullAreaError; import de.hft.stuttgart.citydoctor2.check.error.NullAreaError;
import de.hft.stuttgart.citydoctor2.check.error.PlanarityError;
import de.hft.stuttgart.citydoctor2.check.error.PointTouchesEdgeError; import de.hft.stuttgart.citydoctor2.check.error.PointTouchesEdgeError;
import de.hft.stuttgart.citydoctor2.check.error.PolygonError;
import de.hft.stuttgart.citydoctor2.check.error.PolygonHoleOutsideError; import de.hft.stuttgart.citydoctor2.check.error.PolygonHoleOutsideError;
import de.hft.stuttgart.citydoctor2.check.error.PolygonInteriorDisconnectedError; import de.hft.stuttgart.citydoctor2.check.error.PolygonInteriorDisconnectedError;
import de.hft.stuttgart.citydoctor2.check.error.PolygonIntersectingRingsError; import de.hft.stuttgart.citydoctor2.check.error.PolygonIntersectingRingsError;
...@@ -44,13 +47,15 @@ import de.hft.stuttgart.citydoctor2.check.error.PolygonWithoutSurfaceError; ...@@ -44,13 +47,15 @@ import de.hft.stuttgart.citydoctor2.check.error.PolygonWithoutSurfaceError;
import de.hft.stuttgart.citydoctor2.check.error.PolygonWrongOrientationError; import de.hft.stuttgart.citydoctor2.check.error.PolygonWrongOrientationError;
import de.hft.stuttgart.citydoctor2.check.error.RingDuplicatePointError; import de.hft.stuttgart.citydoctor2.check.error.RingDuplicatePointError;
import de.hft.stuttgart.citydoctor2.check.error.RingEdgeIntersectionError; import de.hft.stuttgart.citydoctor2.check.error.RingEdgeIntersectionError;
import de.hft.stuttgart.citydoctor2.check.error.RingError;
import de.hft.stuttgart.citydoctor2.check.error.RingNotClosedError; import de.hft.stuttgart.citydoctor2.check.error.RingNotClosedError;
import de.hft.stuttgart.citydoctor2.check.error.RingSelfIntersectionError;
import de.hft.stuttgart.citydoctor2.check.error.RingTooFewPointsError; import de.hft.stuttgart.citydoctor2.check.error.RingTooFewPointsError;
import de.hft.stuttgart.citydoctor2.check.error.SchematronError; import de.hft.stuttgart.citydoctor2.check.error.SchematronError;
import de.hft.stuttgart.citydoctor2.check.error.SolidError;
import de.hft.stuttgart.citydoctor2.check.error.SolidNotClosedError; import de.hft.stuttgart.citydoctor2.check.error.SolidNotClosedError;
import de.hft.stuttgart.citydoctor2.check.error.SolidSelfIntError; import de.hft.stuttgart.citydoctor2.check.error.SolidSelfIntError;
import de.hft.stuttgart.citydoctor2.check.error.SurfaceUnfragmentedError; import de.hft.stuttgart.citydoctor2.check.error.SurfaceUnfragmentedError;
import de.hft.stuttgart.citydoctor2.check.error.DegeneratedRingError;
import de.hft.stuttgart.citydoctor2.check.error.TooFewPolygonsError; import de.hft.stuttgart.citydoctor2.check.error.TooFewPolygonsError;
import de.hft.stuttgart.citydoctor2.check.error.UnknownCheckError; import de.hft.stuttgart.citydoctor2.check.error.UnknownCheckError;
...@@ -63,6 +68,14 @@ import de.hft.stuttgart.citydoctor2.check.error.UnknownCheckError; ...@@ -63,6 +68,14 @@ import de.hft.stuttgart.citydoctor2.check.error.UnknownCheckError;
*/ */
public interface ErrorVisitor { public interface ErrorVisitor {
public void visit(RingError err);
public void visit(PolygonError err);
public void visit(RingSelfIntersectionError err);
public void visit(PlanarityError err);
public void visit(PolygonHoleOutsideError err); public void visit(PolygonHoleOutsideError err);
public void visit(NonManifoldEdgeError err); public void visit(NonManifoldEdgeError err);
...@@ -119,8 +132,6 @@ public interface ErrorVisitor { ...@@ -119,8 +132,6 @@ public interface ErrorVisitor {
public void visit(NotGroundError err); public void visit(NotGroundError err);
public void visit(CheckError err);
public void visit(SchematronError err); public void visit(SchematronError err);
public void visit(SurfaceUnfragmentedError err); public void visit(SurfaceUnfragmentedError err);
...@@ -135,4 +146,8 @@ public interface ErrorVisitor { ...@@ -135,4 +146,8 @@ public interface ErrorVisitor {
public void visit(PolygonWithoutSurfaceError err); public void visit(PolygonWithoutSurfaceError err);
public void visit(CheckError err);
public void visit(SolidError err);
} }
...@@ -89,7 +89,7 @@ import de.hft.stuttgart.quality.model.types.SolidSelfIntersectionError; ...@@ -89,7 +89,7 @@ import de.hft.stuttgart.quality.model.types.SolidSelfIntersectionError;
import de.hft.stuttgart.quality.model.types.SolidTooFewPolygonsError; import de.hft.stuttgart.quality.model.types.SolidTooFewPolygonsError;
import de.hft.stuttgart.quality.model.types.ValidationResult; import de.hft.stuttgart.quality.model.types.ValidationResult;
public class QualityAdeErrorVisitor implements ErrorVisitor { public class QualityAdeErrorVisitor extends AbstractErrorVisitor {
private final ValidationResult res; private final ValidationResult res;
......
...@@ -29,7 +29,7 @@ import de.hft.stuttgart.citydoctor2.utils.Localization; ...@@ -29,7 +29,7 @@ import de.hft.stuttgart.citydoctor2.utils.Localization;
*/ */
public enum Unit { public enum Unit {
KWH("kWh", "kWh"), METER("m", "m"), SQUARE_METER("m²", "m2"), CUBIC_METER("m³", "m3"), RADIAN(Localization.getText("Unit.Radian"), "rad"), NONE("", null), DEGREE(Localization.getText("Unit.Degree"), "deg"); KWH("kWh", "kWh"), METER("m", "m"), SQUARE_METER("m²", "m2"), CUBIC_METER("m³", "m3"), RADIAN(Localization.getText("Unit.Radian"), "rad"), NONE("", ""), DEGREE(Localization.getText("Unit.Degree"), "deg");
private final String representation; private final String representation;
private final String gmlRep; private final String gmlRep;
......
...@@ -18,9 +18,9 @@ ...@@ -18,9 +18,9 @@
*/ */
package de.hft.stuttgart.citydoctor2.check.error; package de.hft.stuttgart.citydoctor2.check.error;
import de.hft.stuttgart.citydoctor2.check.CheckError; import java.io.Serial;
import de.hft.stuttgart.citydoctor2.check.ErrorId; 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.ErrorType;
import de.hft.stuttgart.citydoctor2.check.ErrorVisitor; import de.hft.stuttgart.citydoctor2.check.ErrorVisitor;
import de.hft.stuttgart.citydoctor2.check.HealingMethod; import de.hft.stuttgart.citydoctor2.check.HealingMethod;
...@@ -28,47 +28,35 @@ import de.hft.stuttgart.citydoctor2.check.ModificationListener; ...@@ -28,47 +28,35 @@ import de.hft.stuttgart.citydoctor2.check.ModificationListener;
import de.hft.stuttgart.citydoctor2.datastructure.Geometry; import de.hft.stuttgart.citydoctor2.datastructure.Geometry;
import de.hft.stuttgart.citydoctor2.datastructure.GmlElement; import de.hft.stuttgart.citydoctor2.datastructure.GmlElement;
import java.io.Serial;
/** /**
* Error when all polygons are oriented wrong. * Error when all polygons are oriented wrong.
* *
* @author Matthias Betz * @author Matthias Betz
* *
*/ */
public class AllPolygonsWrongOrientationError implements CheckError { public class AllPolygonsWrongOrientationError extends SolidError {
@Serial @Serial
private static final long serialVersionUID = 2263993313732858840L; private static final long serialVersionUID = 2263993313732858840L;
private final Geometry geom;
public AllPolygonsWrongOrientationError(Geometry geom) { public AllPolygonsWrongOrientationError(Geometry geom) {
this.geom = geom; super(geom);
}
public Geometry getGeometry() {
return geom;
} }
@Override @Override
public void accept(ErrorVisitor errorVisitor) { public void accept(ErrorVisitor errorVisitor) {
super.accept(errorVisitor);
errorVisitor.visit(this); errorVisitor.visit(this);
} }
@Override @Override
public boolean accept(HealingMethod method, ModificationListener l) { public boolean accept(HealingMethod method, ModificationListener l) {
return method.visit(this, l); return super.accept(method, l) || method.visit(this, l);
} }
@Override @Override
public String toString() { public String toString() {
return "AllPolygonsWrongOrientationError [geom=" + geom + "]"; return "AllPolygonsWrongOrientationError [geom=" + getGeometry() + "]";
}
@Override
public void report(ErrorReport report) {
report.add(geom);
} }
@Override @Override
......
...@@ -18,7 +18,8 @@ ...@@ -18,7 +18,8 @@
*/ */
package de.hft.stuttgart.citydoctor2.check.error; package de.hft.stuttgart.citydoctor2.check.error;
import de.hft.stuttgart.citydoctor2.check.CheckError; import java.io.Serial;
import de.hft.stuttgart.citydoctor2.check.ErrorId; import de.hft.stuttgart.citydoctor2.check.ErrorId;
import de.hft.stuttgart.citydoctor2.check.ErrorReport; import de.hft.stuttgart.citydoctor2.check.ErrorReport;
import de.hft.stuttgart.citydoctor2.check.ErrorType; import de.hft.stuttgart.citydoctor2.check.ErrorType;
...@@ -29,8 +30,6 @@ import de.hft.stuttgart.citydoctor2.datastructure.GmlElement; ...@@ -29,8 +30,6 @@ import de.hft.stuttgart.citydoctor2.datastructure.GmlElement;
import de.hft.stuttgart.citydoctor2.datastructure.LinearRing; import de.hft.stuttgart.citydoctor2.datastructure.LinearRing;
import de.hft.stuttgart.citydoctor2.datastructure.Vertex; import de.hft.stuttgart.citydoctor2.datastructure.Vertex;
import java.io.Serial;
/** /**
* When two points are too close to each other and are consecutive in a linear * When two points are too close to each other and are consecutive in a linear
* ring, this error is created. * ring, this error is created.
...@@ -38,25 +37,20 @@ import java.io.Serial; ...@@ -38,25 +37,20 @@ import java.io.Serial;
* @author Matthias Betz * @author Matthias Betz
* *
*/ */
public class ConsecutivePointSameError implements CheckError { public class ConsecutivePointSameError extends RingError {
@Serial @Serial
private static final long serialVersionUID = -6355935751554777494L; private static final long serialVersionUID = -6355935751554777494L;
private final LinearRing lr;
private final Vertex p1; private final Vertex p1;
private final Vertex p2; private final Vertex p2;
public ConsecutivePointSameError(LinearRing lr, Vertex p1, Vertex p2) { public ConsecutivePointSameError(LinearRing lr, Vertex p1, Vertex p2) {
this.lr = lr; super(lr);
this.p1 = p1; this.p1 = p1;
this.p2 = p2; this.p2 = p2;
} }
public LinearRing getRing() {
return lr;
}
public Vertex getVertex1() { public Vertex getVertex1() {
return p1; return p1;
} }
...@@ -67,22 +61,23 @@ public class ConsecutivePointSameError implements CheckError { ...@@ -67,22 +61,23 @@ public class ConsecutivePointSameError implements CheckError {
@Override @Override
public void accept(ErrorVisitor errorVisitor) { public void accept(ErrorVisitor errorVisitor) {
super.accept(errorVisitor);
errorVisitor.visit(this); errorVisitor.visit(this);
} }
@Override @Override
public boolean accept(HealingMethod method, ModificationListener l) { public boolean accept(HealingMethod method, ModificationListener l) {
return method.visit(this, l); return super.accept(method, l) || method.visit(this, l);
} }
@Override @Override
public String toString() { public String toString() {
return "ConsecutivePointSameError [lr=" + lr + ", p1=" + p1 + ", p2=" + p2 + "]"; return "ConsecutivePointSameError [lr=" + getRing() + ", p1=" + p1 + ", p2=" + p2 + "]";
} }
@Override @Override
public void report(ErrorReport report) { public void report(ErrorReport report) {
report.add(lr); super.report(report);
report.add("duplicate point 1", p1); report.add("duplicate point 1", p1);
report.add("duplicate point 2", p2); report.add("duplicate point 2", p2);
} }
......
...@@ -18,7 +18,8 @@ ...@@ -18,7 +18,8 @@
*/ */
package de.hft.stuttgart.citydoctor2.check.error; package de.hft.stuttgart.citydoctor2.check.error;
import de.hft.stuttgart.citydoctor2.check.CheckError; import java.io.Serial;
import de.hft.stuttgart.citydoctor2.check.ErrorId; import de.hft.stuttgart.citydoctor2.check.ErrorId;
import de.hft.stuttgart.citydoctor2.check.ErrorReport; import de.hft.stuttgart.citydoctor2.check.ErrorReport;
import de.hft.stuttgart.citydoctor2.check.ErrorType; import de.hft.stuttgart.citydoctor2.check.ErrorType;
...@@ -28,37 +29,30 @@ import de.hft.stuttgart.citydoctor2.check.ModificationListener; ...@@ -28,37 +29,30 @@ import de.hft.stuttgart.citydoctor2.check.ModificationListener;
import de.hft.stuttgart.citydoctor2.datastructure.GmlElement; import de.hft.stuttgart.citydoctor2.datastructure.GmlElement;
import de.hft.stuttgart.citydoctor2.datastructure.LinearRing; import de.hft.stuttgart.citydoctor2.datastructure.LinearRing;
import java.io.Serial; public class DegeneratedRingError extends RingSelfIntersectionError {
public class DegeneratedRingError implements CheckError {
@Serial @Serial
private static final long serialVersionUID = 865493182529055651L; private static final long serialVersionUID = 865493182529055651L;
private final LinearRing lr;
public DegeneratedRingError(LinearRing lr) { public DegeneratedRingError(LinearRing lr) {
this.lr = lr; super(lr);
}
public LinearRing getRing() {
return lr;
} }
@Override @Override
public void accept(ErrorVisitor errorVisitor) { public void accept(ErrorVisitor errorVisitor) {
super.accept(errorVisitor);
errorVisitor.visit(this); errorVisitor.visit(this);
} }
@Override @Override
public boolean accept(HealingMethod method, ModificationListener l) { public boolean accept(HealingMethod method, ModificationListener l) {
return method.visit(this, l); return super.accept(method, l) || method.visit(this, l);
} }
@Override @Override
public void report(ErrorReport report) { public void report(ErrorReport report) {
report.add("type", "degenerated ring"); report.add("type", "degenerated ring");
report.add(getRing()); super.report(report);
} }
@Override @Override
......
...@@ -21,7 +21,6 @@ package de.hft.stuttgart.citydoctor2.check.error; ...@@ -21,7 +21,6 @@ package de.hft.stuttgart.citydoctor2.check.error;
import java.io.Serial; import java.io.Serial;
import java.util.List; import java.util.List;
import de.hft.stuttgart.citydoctor2.check.CheckError;
import de.hft.stuttgart.citydoctor2.check.ErrorId; import de.hft.stuttgart.citydoctor2.check.ErrorId;
import de.hft.stuttgart.citydoctor2.check.ErrorReport; import de.hft.stuttgart.citydoctor2.check.ErrorReport;
import de.hft.stuttgart.citydoctor2.check.ErrorType; import de.hft.stuttgart.citydoctor2.check.ErrorType;
...@@ -39,30 +38,25 @@ import de.hft.stuttgart.citydoctor2.datastructure.Polygon; ...@@ -39,30 +38,25 @@ import de.hft.stuttgart.citydoctor2.datastructure.Polygon;
* @author Matthias Betz * @author Matthias Betz
* *
*/ */
public class MultipleConnectedComponentsError implements CheckError { public class MultipleConnectedComponentsError extends SolidError {
@Serial @Serial
private static final long serialVersionUID = 2152069835068857036L; private static final long serialVersionUID = 2152069835068857036L;
private final Geometry geom;
private final List<List<Polygon>> components; private final List<List<Polygon>> components;
public MultipleConnectedComponentsError(Geometry geom, List<List<Polygon>> components) { public MultipleConnectedComponentsError(Geometry geom, List<List<Polygon>> components) {
this.geom = geom; super(geom);
this.components = components; this.components = components;
} }
public Geometry getGeometry() {
return geom;
}
public List<List<Polygon>> getComponents() { public List<List<Polygon>> getComponents() {
return components; return components;
} }
@Override @Override
public void report(ErrorReport report) { public void report(ErrorReport report) {
report.add(geom); super.report(report);
for (int i = 0; i < components.size(); i++) { for (int i = 0; i < components.size(); i++) {
List<Polygon> polygons = components.get(i); List<Polygon> polygons = components.get(i);
report.addPolygons("component nr: " + (i + 1), polygons); report.addPolygons("component nr: " + (i + 1), polygons);
...@@ -71,17 +65,18 @@ public class MultipleConnectedComponentsError implements CheckError { ...@@ -71,17 +65,18 @@ public class MultipleConnectedComponentsError implements CheckError {
@Override @Override
public void accept(ErrorVisitor errorVisitor) { public void accept(ErrorVisitor errorVisitor) {
super.accept(errorVisitor);
errorVisitor.visit(this); errorVisitor.visit(this);
} }
@Override @Override
public boolean accept(HealingMethod method, ModificationListener l) { public boolean accept(HealingMethod method, ModificationListener l) {
return method.visit(this, l); return super.accept(method, l) || method.visit(this, l);
} }
@Override @Override
public String toString() { public String toString() {
return "MultipleConnectedComponentsError [geom=" + geom + ", components=" + components + "]"; return "MultipleConnectedComponentsError [geom=" + getGeometry() + ", components=" + components + "]";
} }
@Override @Override
......
...@@ -18,7 +18,8 @@ ...@@ -18,7 +18,8 @@
*/ */
package de.hft.stuttgart.citydoctor2.check.error; package de.hft.stuttgart.citydoctor2.check.error;
import de.hft.stuttgart.citydoctor2.check.CheckError; import java.io.Serial;
import de.hft.stuttgart.citydoctor2.check.ErrorId; import de.hft.stuttgart.citydoctor2.check.ErrorId;
import de.hft.stuttgart.citydoctor2.check.ErrorReport; import de.hft.stuttgart.citydoctor2.check.ErrorReport;
import de.hft.stuttgart.citydoctor2.check.ErrorType; import de.hft.stuttgart.citydoctor2.check.ErrorType;
...@@ -29,32 +30,26 @@ import de.hft.stuttgart.citydoctor2.datastructure.GmlElement; ...@@ -29,32 +30,26 @@ import de.hft.stuttgart.citydoctor2.datastructure.GmlElement;
import de.hft.stuttgart.citydoctor2.datastructure.LinearRing; import de.hft.stuttgart.citydoctor2.datastructure.LinearRing;
import de.hft.stuttgart.citydoctor2.datastructure.Polygon; import de.hft.stuttgart.citydoctor2.datastructure.Polygon;
import java.io.Serial;
/** /**
* If an inner ring is with in the boundaries of another, this error is created. * If an inner ring is with in the boundaries of another, this error is created.
* *
* @author Matthias Betz * @author Matthias Betz
* *
*/ */
public class NestedRingError implements CheckError { public class NestedRingError extends PolygonError {
@Serial @Serial
private static final long serialVersionUID = -3396113374745830193L; private static final long serialVersionUID = -3396113374745830193L;
private final Polygon p;
private final LinearRing innerRing; private final LinearRing innerRing;
private final LinearRing withinRing; private final LinearRing withinRing;
public NestedRingError(Polygon p, LinearRing innerRing, LinearRing withinRing) { public NestedRingError(Polygon p, LinearRing innerRing, LinearRing withinRing) {
this.p = p; super(p);
this.innerRing = innerRing; this.innerRing = innerRing;
this.withinRing = withinRing; this.withinRing = withinRing;
} }
public Polygon getPolygon() {
return p;
}
public LinearRing getInnerRing() { public LinearRing getInnerRing() {
return innerRing; return innerRing;
...@@ -66,23 +61,24 @@ public class NestedRingError implements CheckError { ...@@ -66,23 +61,24 @@ public class NestedRingError implements CheckError {
@Override @Override
public void report(ErrorReport report) { public void report(ErrorReport report) {
report.add(p); super.report(report);
report.add(innerRing); report.add(innerRing);
} }
@Override @Override
public void accept(ErrorVisitor errorVisitor) { public void accept(ErrorVisitor errorVisitor) {
super.accept(errorVisitor);
errorVisitor.visit(this); errorVisitor.visit(this);
} }
@Override @Override
public boolean accept(HealingMethod method, ModificationListener l) { public boolean accept(HealingMethod method, ModificationListener l) {
return method.visit(this, l); return super.accept(method, l) || method.visit(this, l);
} }
@Override @Override
public String toString() { public String toString() {
return "NestedRingError [p=" + p + ", innerRing=" + innerRing + "]"; return "NestedRingError [p=" + getPolygon() + ", innerRing=" + innerRing + "]";
} }
@Override @Override
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment