"...git@transfer.hft-stuttgart.de:energy-ade/ade-xjc.git" did not exist on "e1ddc5c4b65fd8ed096f783afe2a0611fd275866"
Commit 52e6ef7c authored by Matthias Betz's avatar Matthias Betz
Browse files

add INWARD/OUTWARD property to geometries for inward facing geometries

extend all polygon wrong orientation test to handle inward facing geometries
fix validation plan not written when validating in stream mode
parent 1e80192c
Pipeline #11546 failed with stage
in 1 minute and 27 seconds
...@@ -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);
......
...@@ -40,6 +40,10 @@ public class Geometry extends GmlElement { ...@@ -40,6 +40,10 @@ public class Geometry extends GmlElement {
@Serial @Serial
private static final long serialVersionUID = 2539031030917731575L; private static final long serialVersionUID = 2539031030917731575L;
public enum Orientation {
INWARD, OUTWARD
}
private static final Random r = new Random(); private static final Random r = new Random();
...@@ -52,11 +56,20 @@ public class Geometry extends GmlElement { ...@@ -52,11 +56,20 @@ public class Geometry extends GmlElement {
private List<Edge> edges; private List<Edge> edges;
private Map<SerializablePair<Vertex, Vertex>, Edge> edgeMap; private Map<SerializablePair<Vertex, Vertex>, Edge> edgeMap;
private List<Vertex> vertices; private List<Vertex> vertices;
private Orientation orientation;
public Geometry(GeometryType type, Lod lod) { public Geometry(GeometryType type, Lod lod, Orientation orientation) {
this.lod = lod; this.lod = lod;
this.type = type; this.type = type;
if (type == GeometryType.SOLID) {
Objects.requireNonNull(orientation);
}
this.orientation = orientation;
} }
public Orientation getOrientation() {
return orientation;
}
void setParent(CityObject parent) { void setParent(CityObject parent) {
this.parent = parent; this.parent = parent;
......
...@@ -23,7 +23,7 @@ public class ImplicitGeometryHolder extends Geometry { ...@@ -23,7 +23,7 @@ public class ImplicitGeometryHolder extends Geometry {
private final Geometry prototypeGeometry; private final Geometry prototypeGeometry;
public ImplicitGeometryHolder(ImplicitGeometry cgmlImplicitGeometry, LibraryObject libObject) { public ImplicitGeometryHolder(ImplicitGeometry cgmlImplicitGeometry, LibraryObject libObject) {
super(libObject.getType(), libObject.getLod()); super(libObject.getType(), libObject.getLod(), libObject.getOrientation());
prototypeGeometry = libObject; prototypeGeometry = libObject;
type = PrototypeGeometryType.LIBRARY_OBJECT; type = PrototypeGeometryType.LIBRARY_OBJECT;
this.cgmlImplicitGeometry = cgmlImplicitGeometry; this.cgmlImplicitGeometry = cgmlImplicitGeometry;
...@@ -31,7 +31,7 @@ public class ImplicitGeometryHolder extends Geometry { ...@@ -31,7 +31,7 @@ public class ImplicitGeometryHolder extends Geometry {
} }
public ImplicitGeometryHolder(ImplicitGeometry cgmlImplicitGeometry, RelativeGeometry relativeGeometry) { public ImplicitGeometryHolder(ImplicitGeometry cgmlImplicitGeometry, RelativeGeometry relativeGeometry) {
super(relativeGeometry.getType(), relativeGeometry.getLod()); super(relativeGeometry.getType(), relativeGeometry.getLod(), relativeGeometry.getOrientation());
prototypeGeometry = relativeGeometry; prototypeGeometry = relativeGeometry;
type = PrototypeGeometryType.RELATIVE_GEOMETRY; type = PrototypeGeometryType.RELATIVE_GEOMETRY;
this.cgmlImplicitGeometry = cgmlImplicitGeometry; this.cgmlImplicitGeometry = cgmlImplicitGeometry;
......
...@@ -37,7 +37,7 @@ public class LibraryObject extends Geometry { ...@@ -37,7 +37,7 @@ public class LibraryObject extends Geometry {
if (protoGeom == null) { if (protoGeom == null) {
return null; return null;
} }
LibraryObject libOb = new LibraryObject(protoGeom.getType(), protoGeom.getLod()); LibraryObject libOb = new LibraryObject(protoGeom.getType(), protoGeom.getLod(), protoGeom.getOrientation());
protoGeom.getPolygons().forEach(libOb::addPolygon); protoGeom.getPolygons().forEach(libOb::addPolygon);
libOb.updateEdgesAndVertices(); libOb.updateEdgesAndVertices();
libraryObjects.put(path.toString(), libOb); libraryObjects.put(path.toString(), libOb);
...@@ -53,15 +53,15 @@ public class LibraryObject extends Geometry { ...@@ -53,15 +53,15 @@ public class LibraryObject extends Geometry {
if (protoGeom == null) { if (protoGeom == null) {
return null; return null;
} }
LibraryObject libOb = new LibraryObject(protoGeom.getType(), protoGeom.getLod()); LibraryObject libOb = new LibraryObject(protoGeom.getType(), protoGeom.getLod(), protoGeom.getOrientation());
protoGeom.getPolygons().forEach(libOb::addPolygon); protoGeom.getPolygons().forEach(libOb::addPolygon);
libOb.updateEdgesAndVertices(); libOb.updateEdgesAndVertices();
libraryObjects.put(fileName, libOb); libraryObjects.put(fileName, libOb);
return libOb; return libOb;
} }
private LibraryObject(GeometryType type, Lod lod) { private LibraryObject(GeometryType type, Lod lod, Orientation orientation) {
super(type, lod); super(type, lod, orientation);
} }
......
...@@ -20,14 +20,14 @@ public class RelativeGeometry extends Geometry { ...@@ -20,14 +20,14 @@ public class RelativeGeometry extends Geometry {
if (relativeGeometries.containsKey(geom)) { if (relativeGeometries.containsKey(geom)) {
return relativeGeometries.get(geom); return relativeGeometries.get(geom);
} }
RelativeGeometry relGeo = new RelativeGeometry(geom.getType(), geom.getLod()); RelativeGeometry relGeo = new RelativeGeometry(geom.getType(), geom.getLod(), geom.getOrientation());
geom.getPolygons().forEach(relGeo::addPolygon); geom.getPolygons().forEach(relGeo::addPolygon);
relGeo.updateEdgesAndVertices(); relGeo.updateEdgesAndVertices();
relativeGeometries.put(geom, relGeo); relativeGeometries.put(geom, relGeo);
return relGeo; return relGeo;
} }
private RelativeGeometry(GeometryType type, Lod lod) { private RelativeGeometry(GeometryType type, Lod lod, Orientation orientation) {
super(type, lod); super(type, lod, orientation);
} }
} }
...@@ -18,33 +18,45 @@ ...@@ -18,33 +18,45 @@
*/ */
package de.hft.stuttgart.citydoctor2.mapper.citygml3; package de.hft.stuttgart.citydoctor2.mapper.citygml3;
import de.hft.stuttgart.citydoctor2.datastructure.AbstractBuilding; import java.nio.file.Path;
import de.hft.stuttgart.citydoctor2.datastructure.AbstractTunnel; import java.util.ArrayList;
import de.hft.stuttgart.citydoctor2.datastructure.BridgeConstructiveElement; import java.util.HashMap;
import de.hft.stuttgart.citydoctor2.datastructure.*; import java.util.List;
import de.hft.stuttgart.citydoctor2.datastructure.Building; import java.util.Map;
import de.hft.stuttgart.citydoctor2.datastructure.BuildingPart;
import de.hft.stuttgart.citydoctor2.datastructure.BuildingRoom;
import de.hft.stuttgart.citydoctor2.datastructure.LinearRing;
import de.hft.stuttgart.citydoctor2.datastructure.Polygon;
import de.hft.stuttgart.citydoctor2.datastructure.TunnelConstructiveElement;
import de.hft.stuttgart.citydoctor2.datastructure.TunnelFurniture;
import de.hft.stuttgart.citydoctor2.datastructure.TunnelPart;
import de.hft.stuttgart.citydoctor2.datastructure.Vegetation.VegetationType;
import de.hft.stuttgart.citydoctor2.math.graph.KDTree;
import de.hft.stuttgart.citydoctor2.parser.ParserConfiguration;
import de.hft.stuttgart.citydoctor2.utils.Localization;
import de.hft.stuttgart.citydoctor2.zip.CityGmlZipEntry;
import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Logger;
import org.citygml4j.core.model.CityGMLVersion; import org.citygml4j.core.model.CityGMLVersion;
import org.citygml4j.core.model.bridge.*; import org.citygml4j.core.model.bridge.AbstractBridge;
import org.citygml4j.core.model.bridge.Bridge;
import org.citygml4j.core.model.bridge.BridgeConstructiveElementProperty;
import org.citygml4j.core.model.bridge.BridgeInstallation;
import org.citygml4j.core.model.bridge.BridgeInstallationProperty;
import org.citygml4j.core.model.bridge.BridgePart;
import org.citygml4j.core.model.bridge.BridgePartProperty;
import org.citygml4j.core.model.building.AbstractBuildingSubdivisionProperty;
import org.citygml4j.core.model.building.BuildingConstructiveElement; import org.citygml4j.core.model.building.BuildingConstructiveElement;
import org.citygml4j.core.model.building.BuildingConstructiveElementProperty;
import org.citygml4j.core.model.building.BuildingFurniture;
import org.citygml4j.core.model.building.BuildingFurnitureProperty;
import org.citygml4j.core.model.building.BuildingInstallationProperty;
import org.citygml4j.core.model.building.BuildingPartProperty;
import org.citygml4j.core.model.building.BuildingRoomProperty;
import org.citygml4j.core.model.building.BuildingUnit; import org.citygml4j.core.model.building.BuildingUnit;
import org.citygml4j.core.model.building.Storey; import org.citygml4j.core.model.building.Storey;
import org.citygml4j.core.model.building.*;
import org.citygml4j.core.model.construction.AbstractConstruction; import org.citygml4j.core.model.construction.AbstractConstruction;
import org.citygml4j.core.model.core.*; import org.citygml4j.core.model.core.AbstractCityObject;
import org.citygml4j.core.model.core.AbstractFeatureWithLifespan;
import org.citygml4j.core.model.core.AbstractGenericAttributeProperty;
import org.citygml4j.core.model.core.AbstractOccupiedSpace;
import org.citygml4j.core.model.core.AbstractPhysicalSpace;
import org.citygml4j.core.model.core.AbstractSpace;
import org.citygml4j.core.model.core.AbstractSpaceBoundary;
import org.citygml4j.core.model.core.AbstractSpaceBoundaryProperty;
import org.citygml4j.core.model.core.AbstractThematicSurface;
import org.citygml4j.core.model.core.AbstractUnoccupiedSpace;
import org.citygml4j.core.model.core.CityModel;
import org.citygml4j.core.model.core.ImplicitGeometry;
import org.citygml4j.core.model.deprecated.transportation.TransportationComplex; import org.citygml4j.core.model.deprecated.transportation.TransportationComplex;
import org.citygml4j.core.model.landuse.LandUse; import org.citygml4j.core.model.landuse.LandUse;
import org.citygml4j.core.model.relief.AbstractReliefComponentProperty; import org.citygml4j.core.model.relief.AbstractReliefComponentProperty;
...@@ -53,9 +65,28 @@ import org.citygml4j.core.model.relief.MassPointRelief; ...@@ -53,9 +65,28 @@ import org.citygml4j.core.model.relief.MassPointRelief;
import org.citygml4j.core.model.relief.RasterRelief; import org.citygml4j.core.model.relief.RasterRelief;
import org.citygml4j.core.model.relief.ReliefFeature; import org.citygml4j.core.model.relief.ReliefFeature;
import org.citygml4j.core.model.relief.TINRelief; import org.citygml4j.core.model.relief.TINRelief;
import org.citygml4j.core.model.transportation.*; import org.citygml4j.core.model.transportation.AbstractTransportationSpace;
import org.citygml4j.core.model.transportation.AuxiliaryTrafficArea;
import org.citygml4j.core.model.transportation.AuxiliaryTrafficSpace;
import org.citygml4j.core.model.transportation.AuxiliaryTrafficSpaceProperty;
import org.citygml4j.core.model.transportation.IntersectionProperty;
import org.citygml4j.core.model.transportation.Railway;
import org.citygml4j.core.model.transportation.Road;
import org.citygml4j.core.model.transportation.SectionProperty;
import org.citygml4j.core.model.transportation.Square;
import org.citygml4j.core.model.transportation.Track;
import org.citygml4j.core.model.transportation.TrafficArea;
import org.citygml4j.core.model.transportation.TrafficSpace;
import org.citygml4j.core.model.transportation.TrafficSpaceProperty;
import org.citygml4j.core.model.transportation.Waterway;
import org.citygml4j.core.model.tunnel.HollowSpace;
import org.citygml4j.core.model.tunnel.HollowSpaceProperty;
import org.citygml4j.core.model.tunnel.Tunnel; import org.citygml4j.core.model.tunnel.Tunnel;
import org.citygml4j.core.model.tunnel.*; import org.citygml4j.core.model.tunnel.TunnelConstructiveElementProperty;
import org.citygml4j.core.model.tunnel.TunnelFurnitureProperty;
import org.citygml4j.core.model.tunnel.TunnelInstallation;
import org.citygml4j.core.model.tunnel.TunnelInstallationProperty;
import org.citygml4j.core.model.tunnel.TunnelPartProperty;
import org.citygml4j.core.model.vegetation.AbstractVegetationObject; import org.citygml4j.core.model.vegetation.AbstractVegetationObject;
import org.citygml4j.core.model.vegetation.PlantCover; import org.citygml4j.core.model.vegetation.PlantCover;
import org.citygml4j.core.model.vegetation.SolitaryVegetationObject; import org.citygml4j.core.model.vegetation.SolitaryVegetationObject;
...@@ -68,13 +99,65 @@ import org.xmlobjects.gml.model.geometry.GeometryProperty; ...@@ -68,13 +99,65 @@ import org.xmlobjects.gml.model.geometry.GeometryProperty;
import org.xmlobjects.gml.model.geometry.aggregates.MultiSurface; import org.xmlobjects.gml.model.geometry.aggregates.MultiSurface;
import org.xmlobjects.gml.model.geometry.aggregates.MultiSurfaceProperty; import org.xmlobjects.gml.model.geometry.aggregates.MultiSurfaceProperty;
import org.xmlobjects.gml.model.geometry.complexes.CompositeSurface; import org.xmlobjects.gml.model.geometry.complexes.CompositeSurface;
import org.xmlobjects.gml.model.geometry.primitives.*; import org.xmlobjects.gml.model.geometry.primitives.AbstractSolid;
import org.xmlobjects.gml.model.geometry.primitives.AbstractSurface;
import org.xmlobjects.gml.model.geometry.primitives.Shell;
import org.xmlobjects.gml.model.geometry.primitives.ShellProperty;
import org.xmlobjects.gml.model.geometry.primitives.Solid;
import org.xmlobjects.gml.model.geometry.primitives.SolidProperty;
import org.xmlobjects.gml.model.geometry.primitives.SurfaceProperty;
import java.nio.file.Path; import de.hft.stuttgart.citydoctor2.datastructure.AbstractBuilding;
import java.util.ArrayList; import de.hft.stuttgart.citydoctor2.datastructure.AbstractTunnel;
import java.util.HashMap; import de.hft.stuttgart.citydoctor2.datastructure.BoundarySurface;
import java.util.List; import de.hft.stuttgart.citydoctor2.datastructure.BridgeConstructiveElement;
import java.util.Map; 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.BuildingRoom;
import de.hft.stuttgart.citydoctor2.datastructure.BuildingRoomFurniture;
import de.hft.stuttgart.citydoctor2.datastructure.CityDoctorModel;
import de.hft.stuttgart.citydoctor2.datastructure.CityFurniture;
import de.hft.stuttgart.citydoctor2.datastructure.CityObject;
import de.hft.stuttgart.citydoctor2.datastructure.CompositeCollection;
import de.hft.stuttgart.citydoctor2.datastructure.ConcretePolygon;
import de.hft.stuttgart.citydoctor2.datastructure.GenericAttribute;
import de.hft.stuttgart.citydoctor2.datastructure.GenericCityObject;
import de.hft.stuttgart.citydoctor2.datastructure.Geometry;
import de.hft.stuttgart.citydoctor2.datastructure.Geometry.Orientation;
import de.hft.stuttgart.citydoctor2.datastructure.GeometryType;
import de.hft.stuttgart.citydoctor2.datastructure.GmlElement;
import de.hft.stuttgart.citydoctor2.datastructure.GmlId;
import de.hft.stuttgart.citydoctor2.datastructure.ImplicitGeometryHolder;
import de.hft.stuttgart.citydoctor2.datastructure.Installation;
import de.hft.stuttgart.citydoctor2.datastructure.LandObject;
import de.hft.stuttgart.citydoctor2.datastructure.LibraryObject;
import de.hft.stuttgart.citydoctor2.datastructure.LinearRing;
import de.hft.stuttgart.citydoctor2.datastructure.LinkedPolygon;
import de.hft.stuttgart.citydoctor2.datastructure.Lod;
import de.hft.stuttgart.citydoctor2.datastructure.Opening;
import de.hft.stuttgart.citydoctor2.datastructure.Polygon;
import de.hft.stuttgart.citydoctor2.datastructure.RelativeGeometry;
import de.hft.stuttgart.citydoctor2.datastructure.ReliefObject;
import de.hft.stuttgart.citydoctor2.datastructure.TinObject;
import de.hft.stuttgart.citydoctor2.datastructure.TopLevelTransportFeature;
import de.hft.stuttgart.citydoctor2.datastructure.TrafficAreaObject;
import de.hft.stuttgart.citydoctor2.datastructure.TrafficSpaceObject;
import de.hft.stuttgart.citydoctor2.datastructure.TransportSection;
import de.hft.stuttgart.citydoctor2.datastructure.TransportationObject;
import de.hft.stuttgart.citydoctor2.datastructure.TransportationSpace;
import de.hft.stuttgart.citydoctor2.datastructure.TunnelConstructiveElement;
import de.hft.stuttgart.citydoctor2.datastructure.TunnelFurniture;
import de.hft.stuttgart.citydoctor2.datastructure.TunnelHollow;
import de.hft.stuttgart.citydoctor2.datastructure.TunnelPart;
import de.hft.stuttgart.citydoctor2.datastructure.Vegetation;
import de.hft.stuttgart.citydoctor2.datastructure.Vegetation.VegetationType;
import de.hft.stuttgart.citydoctor2.datastructure.Vertex;
import de.hft.stuttgart.citydoctor2.datastructure.WaterObject;
import de.hft.stuttgart.citydoctor2.math.graph.KDTree;
import de.hft.stuttgart.citydoctor2.parser.ParserConfiguration;
import de.hft.stuttgart.citydoctor2.utils.Localization;
import de.hft.stuttgart.citydoctor2.zip.CityGmlZipEntry;
public class Citygml3FeatureMapper extends ObjectWalker { public class Citygml3FeatureMapper extends ObjectWalker {
...@@ -124,7 +207,7 @@ public class Citygml3FeatureMapper extends ObjectWalker { ...@@ -124,7 +207,7 @@ public class Citygml3FeatureMapper extends ObjectWalker {
public void visit(org.citygml4j.core.model.cityfurniture.CityFurniture gmlCityFurniture) { public void visit(org.citygml4j.core.model.cityfurniture.CityFurniture gmlCityFurniture) {
CityFurniture cf = new CityFurniture(); CityFurniture cf = new CityFurniture();
cf.setGmlObject(gmlCityFurniture); cf.setGmlObject(gmlCityFurniture);
mapAbstractOccupiedSpace(gmlCityFurniture, cf); mapAbstractOccupiedSpace(gmlCityFurniture, cf, Orientation.OUTWARD);
finishCityObjectConstruction(cf); finishCityObjectConstruction(cf);
model.addCityFurniture(cf); model.addCityFurniture(cf);
} }
...@@ -142,10 +225,10 @@ public class Citygml3FeatureMapper extends ObjectWalker { ...@@ -142,10 +225,10 @@ public class Citygml3FeatureMapper extends ObjectWalker {
if (agLod4.getObject() instanceof MultiSurface ms) { if (agLod4.getObject() instanceof MultiSurface ms) {
gco.addGeometry(parseMultiSurface(ms, Lod.LOD4)); gco.addGeometry(parseMultiSurface(ms, Lod.LOD4));
} else if (agLod4.getObject() instanceof AbstractSolid solid) { } else if (agLod4.getObject() instanceof AbstractSolid solid) {
gco.addGeometry(parseSolid(solid, Lod.LOD4)); gco.addGeometry(parseSolid(solid, Lod.LOD4, Orientation.OUTWARD));
} }
} }
mapAbstractOccupiedSpace(gos, gco); mapAbstractOccupiedSpace(gos, gco, Orientation.OUTWARD);
finishCityObjectConstruction(gco); finishCityObjectConstruction(gco);
model.addGenericCityObject(gco); model.addGenericCityObject(gco);
} }
...@@ -169,9 +252,9 @@ public class Citygml3FeatureMapper extends ObjectWalker { ...@@ -169,9 +252,9 @@ public class Citygml3FeatureMapper extends ObjectWalker {
public void visit(WaterBody waterBody) { public void visit(WaterBody waterBody) {
WaterObject wo = new WaterObject(); WaterObject wo = new WaterObject();
wo.setGmlObject(waterBody); wo.setGmlObject(waterBody);
mapAbstractOccupiedSpace(waterBody, wo); mapAbstractOccupiedSpace(waterBody, wo, Orientation.OUTWARD);
parseAndAddMultiSurface(waterBody.getDeprecatedProperties().getLod1MultiSurface(), Lod.LOD1, wo); parseAndAddMultiSurface(waterBody.getDeprecatedProperties().getLod1MultiSurface(), Lod.LOD1, wo);
parseAndAddSolid(waterBody.getDeprecatedProperties().getLod4Solid(), Lod.LOD4, wo); parseAndAddSolid(waterBody.getDeprecatedProperties().getLod4Solid(), Lod.LOD4, wo, Orientation.OUTWARD);
SurfaceMapper surfaceMapper = new SurfaceMapper(polygonMap, references, compositeMap, vertexMap, config); SurfaceMapper surfaceMapper = new SurfaceMapper(polygonMap, references, compositeMap, vertexMap, config);
for (AbstractSpaceBoundaryProperty surfaceProp : waterBody.getBoundaries()) { for (AbstractSpaceBoundaryProperty surfaceProp : waterBody.getBoundaries()) {
...@@ -258,7 +341,7 @@ public class Citygml3FeatureMapper extends ObjectWalker { ...@@ -258,7 +341,7 @@ public class Citygml3FeatureMapper extends ObjectWalker {
reliefObject.addComponent(to); reliefObject.addComponent(to);
Citygml3GeometryMapper tinMapper = new Citygml3GeometryMapper(config, vertexMap); Citygml3GeometryMapper tinMapper = new Citygml3GeometryMapper(config, vertexMap);
relief.getTin().getObject().accept(tinMapper); relief.getTin().getObject().accept(tinMapper);
Geometry geom = new Geometry(GeometryType.MULTI_SURFACE, reliefLod); Geometry geom = new Geometry(GeometryType.MULTI_SURFACE, reliefLod, Orientation.OUTWARD);
tinMapper.getPolygons().forEach(geom::addPolygon); tinMapper.getPolygons().forEach(geom::addPolygon);
to.addGeometry(geom); to.addGeometry(geom);
} }
...@@ -283,39 +366,39 @@ public class Citygml3FeatureMapper extends ObjectWalker { ...@@ -283,39 +366,39 @@ public class Citygml3FeatureMapper extends ObjectWalker {
mapAbstractVegetationObject(solitaryVegetationObject, veg); mapAbstractVegetationObject(solitaryVegetationObject, veg);
parseAndAddAbstractGeometry(solitaryVegetationObject.getDeprecatedProperties().getLod1Geometry(), Lod.LOD1, parseAndAddAbstractGeometry(solitaryVegetationObject.getDeprecatedProperties().getLod1Geometry(), Lod.LOD1,
veg); veg, Orientation.OUTWARD);
parseAndAddAbstractGeometry(solitaryVegetationObject.getDeprecatedProperties().getLod2Geometry(), Lod.LOD2, parseAndAddAbstractGeometry(solitaryVegetationObject.getDeprecatedProperties().getLod2Geometry(), Lod.LOD2,
veg); veg, Orientation.OUTWARD);
parseAndAddAbstractGeometry(solitaryVegetationObject.getDeprecatedProperties().getLod3Geometry(), Lod.LOD3, parseAndAddAbstractGeometry(solitaryVegetationObject.getDeprecatedProperties().getLod3Geometry(), Lod.LOD3,
veg); veg, Orientation.OUTWARD);
parseAndAddAbstractGeometry(solitaryVegetationObject.getDeprecatedProperties().getLod4Geometry(), Lod.LOD4, parseAndAddAbstractGeometry(solitaryVegetationObject.getDeprecatedProperties().getLod4Geometry(), Lod.LOD4,
veg); veg, Orientation.OUTWARD);
finishCityObjectConstruction(veg); finishCityObjectConstruction(veg);
model.addVegetation(veg); model.addVegetation(veg);
} }
private void mapAbstractVegetationObject(AbstractVegetationObject avo, Vegetation veg) { private void mapAbstractVegetationObject(AbstractVegetationObject avo, Vegetation veg) {
mapAbstractOccupiedSpace(avo, veg); mapAbstractOccupiedSpace(avo, veg, Orientation.OUTWARD);
} }
private void mapAbstractOccupiedSpace(AbstractOccupiedSpace aos, CityObject co) { private void mapAbstractOccupiedSpace(AbstractOccupiedSpace aos, CityObject co, Orientation orientation) {
mapAbstractPhysicalSpace(aos, co); mapAbstractPhysicalSpace(aos, co, orientation);
parseImplicitGeometry(aos, co); parseImplicitGeometry(aos, co, orientation);
} }
private void mapAbstractPhysicalSpace(AbstractPhysicalSpace aps, CityObject co) { private void mapAbstractPhysicalSpace(AbstractPhysicalSpace aps, CityObject co, Orientation orientation) {
mapAbstractSpace(aps, co); mapAbstractSpace(aps, co, orientation);
} }
private void mapAbstractSpace(AbstractSpace as, CityObject co) { private void mapAbstractSpace(AbstractSpace as, CityObject co, Orientation orientation) {
mapAbstractFeature(as, co); mapAbstractFeature(as, co);
parseAndAddMultiSurface(as.getLod0MultiSurface(), Lod.LOD0, co); parseAndAddMultiSurface(as.getLod0MultiSurface(), Lod.LOD0, co);
parseAndAddMultiSurface(as.getLod2MultiSurface(), Lod.LOD2, co); parseAndAddMultiSurface(as.getLod2MultiSurface(), Lod.LOD2, co);
parseAndAddMultiSurface(as.getLod3MultiSurface(), Lod.LOD3, co); parseAndAddMultiSurface(as.getLod3MultiSurface(), Lod.LOD3, co);
parseAndAddSolid(as.getLod1Solid(), Lod.LOD1, co); parseAndAddSolid(as.getLod1Solid(), Lod.LOD1, co, orientation);
parseAndAddSolid(as.getLod2Solid(), Lod.LOD2, co); parseAndAddSolid(as.getLod2Solid(), Lod.LOD2, co, orientation);
parseAndAddSolid(as.getLod3Solid(), Lod.LOD3, co); parseAndAddSolid(as.getLod3Solid(), Lod.LOD3, co, orientation);
parseAndAddGenericAttributes(as, co); parseAndAddGenericAttributes(as, co);
} }
...@@ -332,7 +415,7 @@ public class Citygml3FeatureMapper extends ObjectWalker { ...@@ -332,7 +415,7 @@ public class Citygml3FeatureMapper extends ObjectWalker {
// parse deprecated geometries // parse deprecated geometries
parseAndAddMultiSurface(bridge.getDeprecatedProperties().getLod1MultiSurface(), Lod.LOD1, bo); parseAndAddMultiSurface(bridge.getDeprecatedProperties().getLod1MultiSurface(), Lod.LOD1, bo);
parseAndAddMultiSurface(bridge.getDeprecatedProperties().getLod4MultiSurface(), Lod.LOD4, bo); parseAndAddMultiSurface(bridge.getDeprecatedProperties().getLod4MultiSurface(), Lod.LOD4, bo);
parseAndAddSolid(bridge.getDeprecatedProperties().getLod4Solid(), Lod.LOD4, bo); parseAndAddSolid(bridge.getDeprecatedProperties().getLod4Solid(), Lod.LOD4, bo, Orientation.OUTWARD);
mapAbstractBridge(bridge, bo); mapAbstractBridge(bridge, bo);
for (BridgePartProperty bPartProperty : bridge.getBridgeParts()) { for (BridgePartProperty bPartProperty : bridge.getBridgeParts()) {
...@@ -404,13 +487,13 @@ public class Citygml3FeatureMapper extends ObjectWalker { ...@@ -404,13 +487,13 @@ public class Citygml3FeatureMapper extends ObjectWalker {
private Installation mapBridgeInstallation(BridgeInstallation gmlBi) { private Installation mapBridgeInstallation(BridgeInstallation gmlBi) {
Installation bi = new Installation(); Installation bi = new Installation();
bi.setGmlObject(gmlBi); bi.setGmlObject(gmlBi);
mapAbstractOccupiedSpace(gmlBi, bi); mapAbstractOccupiedSpace(gmlBi, bi, Orientation.OUTWARD);
GeometryProperty<?> lod2Prop = gmlBi.getDeprecatedProperties().getLod2Geometry(); GeometryProperty<?> lod2Prop = gmlBi.getDeprecatedProperties().getLod2Geometry();
parseAndAddAbstractGeometry(lod2Prop, Lod.LOD2, bi); parseAndAddAbstractGeometry(lod2Prop, Lod.LOD2, bi, Orientation.OUTWARD);
GeometryProperty<?> lod3Prop = gmlBi.getDeprecatedProperties().getLod3Geometry(); GeometryProperty<?> lod3Prop = gmlBi.getDeprecatedProperties().getLod3Geometry();
parseAndAddAbstractGeometry(lod3Prop, Lod.LOD3, bi); parseAndAddAbstractGeometry(lod3Prop, Lod.LOD3, bi, Orientation.OUTWARD);
GeometryProperty<?> lod4Prop = gmlBi.getDeprecatedProperties().getLod4Geometry(); GeometryProperty<?> lod4Prop = gmlBi.getDeprecatedProperties().getLod4Geometry();
parseAndAddAbstractGeometry(lod4Prop, Lod.LOD4, bi); parseAndAddAbstractGeometry(lod4Prop, Lod.LOD4, bi, Orientation.OUTWARD);
SurfaceMapper surfaceMapper = new SurfaceMapper(polygonMap, references, compositeMap, vertexMap, config); SurfaceMapper surfaceMapper = new SurfaceMapper(polygonMap, references, compositeMap, vertexMap, config);
for (AbstractSpaceBoundaryProperty surfaceProp : gmlBi.getBoundaries()) { for (AbstractSpaceBoundaryProperty surfaceProp : gmlBi.getBoundaries()) {
...@@ -460,13 +543,13 @@ public class Citygml3FeatureMapper extends ObjectWalker { ...@@ -460,13 +543,13 @@ public class Citygml3FeatureMapper extends ObjectWalker {
} }
private void readAbstractTunnel(org.citygml4j.core.model.tunnel.AbstractTunnel gmlTunnel, AbstractTunnel cdTunnel) { private void readAbstractTunnel(org.citygml4j.core.model.tunnel.AbstractTunnel gmlTunnel, AbstractTunnel cdTunnel) {
mapAbstractOccupiedSpace(gmlTunnel, cdTunnel); mapAbstractOccupiedSpace(gmlTunnel, cdTunnel, Orientation.OUTWARD);
cdTunnel.setGmlObject(gmlTunnel); cdTunnel.setGmlObject(gmlTunnel);
// parse deprecated geometries // parse deprecated geometries
parseAndAddMultiSurface(gmlTunnel.getDeprecatedProperties().getLod1MultiSurface(), Lod.LOD1, cdTunnel); parseAndAddMultiSurface(gmlTunnel.getDeprecatedProperties().getLod1MultiSurface(), Lod.LOD1, cdTunnel);
parseAndAddMultiSurface(gmlTunnel.getDeprecatedProperties().getLod4MultiSurface(), Lod.LOD4, cdTunnel); parseAndAddMultiSurface(gmlTunnel.getDeprecatedProperties().getLod4MultiSurface(), Lod.LOD4, cdTunnel);
parseAndAddSolid(gmlTunnel.getDeprecatedProperties().getLod4Solid(), Lod.LOD4, cdTunnel); parseAndAddSolid(gmlTunnel.getDeprecatedProperties().getLod4Solid(), Lod.LOD4, cdTunnel, Orientation.OUTWARD);
parseTunnelInstallations(gmlTunnel, cdTunnel); parseTunnelInstallations(gmlTunnel, cdTunnel);
parseHollowSpaces(gmlTunnel, cdTunnel); parseHollowSpaces(gmlTunnel, cdTunnel);
...@@ -541,21 +624,21 @@ public class Citygml3FeatureMapper extends ObjectWalker { ...@@ -541,21 +624,21 @@ public class Citygml3FeatureMapper extends ObjectWalker {
// ignore empty properties // ignore empty properties
continue; continue;
} }
Installation ti = mapTunnelInstallation(gmlTi); Installation ti = mapTunnelInstallation(gmlTi, Orientation.OUTWARD);
cdTunnel.addTunnelInstallation(ti); cdTunnel.addTunnelInstallation(ti);
} }
} }
private Installation mapTunnelInstallation(TunnelInstallation gmlTi) { private Installation mapTunnelInstallation(TunnelInstallation gmlTi, Orientation orientation) {
Installation ti = new Installation(); Installation ti = new Installation();
ti.setGmlObject(gmlTi); ti.setGmlObject(gmlTi);
mapAbstractOccupiedSpace(gmlTi, ti); mapAbstractOccupiedSpace(gmlTi, ti, Orientation.OUTWARD);
GeometryProperty<?> lod2Prop = gmlTi.getDeprecatedProperties().getLod2Geometry(); GeometryProperty<?> lod2Prop = gmlTi.getDeprecatedProperties().getLod2Geometry();
parseAndAddAbstractGeometry(lod2Prop, Lod.LOD2, ti); parseAndAddAbstractGeometry(lod2Prop, Lod.LOD2, ti, orientation);
GeometryProperty<?> lod3Prop = gmlTi.getDeprecatedProperties().getLod3Geometry(); GeometryProperty<?> lod3Prop = gmlTi.getDeprecatedProperties().getLod3Geometry();
parseAndAddAbstractGeometry(lod3Prop, Lod.LOD3, ti); parseAndAddAbstractGeometry(lod3Prop, Lod.LOD3, ti, orientation);
GeometryProperty<?> lod4Prop = gmlTi.getDeprecatedProperties().getLod4Geometry(); GeometryProperty<?> lod4Prop = gmlTi.getDeprecatedProperties().getLod4Geometry();
parseAndAddAbstractGeometry(lod4Prop, Lod.LOD4, ti); parseAndAddAbstractGeometry(lod4Prop, Lod.LOD4, ti, orientation);
SurfaceMapper surfaceMapper = new SurfaceMapper(polygonMap, references, compositeMap, vertexMap, config); SurfaceMapper surfaceMapper = new SurfaceMapper(polygonMap, references, compositeMap, vertexMap, config);
...@@ -587,7 +670,7 @@ public class Citygml3FeatureMapper extends ObjectWalker { ...@@ -587,7 +670,7 @@ public class Citygml3FeatureMapper extends ObjectWalker {
private TunnelHollow mapTunnelHollow(HollowSpace gmlHo) { private TunnelHollow mapTunnelHollow(HollowSpace gmlHo) {
TunnelHollow tHollow = new TunnelHollow(); TunnelHollow tHollow = new TunnelHollow();
tHollow.setGmlObject(gmlHo); tHollow.setGmlObject(gmlHo);
mapAbstractUnoccupiedSpace(gmlHo, tHollow); mapAbstractUnoccupiedSpace(gmlHo, tHollow, Orientation.INWARD);
SurfaceMapper surfaceMapper = new SurfaceMapper(polygonMap, references, compositeMap, vertexMap, config); SurfaceMapper surfaceMapper = new SurfaceMapper(polygonMap, references, compositeMap, vertexMap, config);
for (AbstractSpaceBoundaryProperty surfaceProp : gmlHo.getBoundaries()) { for (AbstractSpaceBoundaryProperty surfaceProp : gmlHo.getBoundaries()) {
...@@ -611,7 +694,7 @@ public class Citygml3FeatureMapper extends ObjectWalker { ...@@ -611,7 +694,7 @@ public class Citygml3FeatureMapper extends ObjectWalker {
// ignore empty properties // ignore empty properties
continue; continue;
} }
Installation bi = mapTunnelInstallation(gmlTi); Installation bi = mapTunnelInstallation(gmlTi, Orientation.INWARD);
tHollow.addRoomInstallation(bi); tHollow.addRoomInstallation(bi);
} }
for (TunnelFurnitureProperty tfProp : gmlHo.getTunnelFurniture()) { for (TunnelFurnitureProperty tfProp : gmlHo.getTunnelFurniture()) {
...@@ -627,7 +710,7 @@ public class Citygml3FeatureMapper extends ObjectWalker { ...@@ -627,7 +710,7 @@ public class Citygml3FeatureMapper extends ObjectWalker {
private TunnelFurniture mapTunnelFurniture(org.citygml4j.core.model.tunnel.TunnelFurniture gmlTf) { private TunnelFurniture mapTunnelFurniture(org.citygml4j.core.model.tunnel.TunnelFurniture gmlTf) {
TunnelFurniture tf = new TunnelFurniture(); TunnelFurniture tf = new TunnelFurniture();
tf.setGmlObject(gmlTf); tf.setGmlObject(gmlTf);
mapAbstractOccupiedSpace(gmlTf, tf); mapAbstractOccupiedSpace(gmlTf, tf, Orientation.OUTWARD);
SurfaceMapper surfaceMapper = new SurfaceMapper(polygonMap, references, compositeMap, vertexMap, config); SurfaceMapper surfaceMapper = new SurfaceMapper(polygonMap, references, compositeMap, vertexMap, config);
for (AbstractSpaceBoundaryProperty surfaceProp : gmlTf.getBoundaries()) { for (AbstractSpaceBoundaryProperty surfaceProp : gmlTf.getBoundaries()) {
...@@ -651,7 +734,7 @@ public class Citygml3FeatureMapper extends ObjectWalker { ...@@ -651,7 +734,7 @@ public class Citygml3FeatureMapper extends ObjectWalker {
private TunnelConstructiveElement mapTunnelConstructiveElement( private TunnelConstructiveElement mapTunnelConstructiveElement(
org.citygml4j.core.model.tunnel.TunnelConstructiveElement gmlTe) { org.citygml4j.core.model.tunnel.TunnelConstructiveElement gmlTe) {
TunnelConstructiveElement te = new TunnelConstructiveElement(gmlTe); TunnelConstructiveElement te = new TunnelConstructiveElement(gmlTe);
mapAbstractOccupiedSpace(gmlTe, te); mapAbstractOccupiedSpace(gmlTe, te, Orientation.OUTWARD);
SurfaceMapper surfaceMapper = new SurfaceMapper(polygonMap, references, compositeMap, vertexMap, config); SurfaceMapper surfaceMapper = new SurfaceMapper(polygonMap, references, compositeMap, vertexMap, config);
for (AbstractSpaceBoundaryProperty surfaceProp : gmlTe.getBoundaries()) { for (AbstractSpaceBoundaryProperty surfaceProp : gmlTe.getBoundaries()) {
if (!surfaceProp.isSetObject()) { if (!surfaceProp.isSetObject()) {
...@@ -701,11 +784,11 @@ public class Citygml3FeatureMapper extends ObjectWalker { ...@@ -701,11 +784,11 @@ public class Citygml3FeatureMapper extends ObjectWalker {
private void mapAbstractConstructiveElement(org.citygml4j.core.model.bridge.BridgeConstructiveElement ele, private void mapAbstractConstructiveElement(org.citygml4j.core.model.bridge.BridgeConstructiveElement ele,
BridgeConstructiveElement bce) { BridgeConstructiveElement bce) {
mapAbstractOccupiedSpace(ele, bce); mapAbstractOccupiedSpace(ele, bce, Orientation.OUTWARD);
} }
private void mapAbstractConstruction(AbstractConstruction ac, BridgeObject bo) { private void mapAbstractConstruction(AbstractConstruction ac, BridgeObject bo) {
mapAbstractOccupiedSpace(ac, bo); mapAbstractOccupiedSpace(ac, bo, Orientation.OUTWARD);
} }
@Override @Override
...@@ -840,7 +923,7 @@ public class Citygml3FeatureMapper extends ObjectWalker { ...@@ -840,7 +923,7 @@ public class Citygml3FeatureMapper extends ObjectWalker {
private void mapTrafficSpace(TrafficSpace ts, TrafficSpaceObject tso) { private void mapTrafficSpace(TrafficSpace ts, TrafficSpaceObject tso) {
tso.setGmlObject(ts); tso.setGmlObject(ts);
mapAbstractUnoccupiedSpace(ts, tso); mapAbstractUnoccupiedSpace(ts, tso, Orientation.OUTWARD);
for (AbstractSpaceBoundaryProperty boundary : ts.getBoundaries()) { for (AbstractSpaceBoundaryProperty boundary : ts.getBoundaries()) {
if (boundary.isSetObject()) { if (boundary.isSetObject()) {
TrafficArea area = (TrafficArea) boundary.getObject(); TrafficArea area = (TrafficArea) boundary.getObject();
...@@ -854,7 +937,7 @@ public class Citygml3FeatureMapper extends ObjectWalker { ...@@ -854,7 +937,7 @@ public class Citygml3FeatureMapper extends ObjectWalker {
private void mapAuxiliaryTrafficSpace(AuxiliaryTrafficSpace ats, TrafficSpaceObject tso) { private void mapAuxiliaryTrafficSpace(AuxiliaryTrafficSpace ats, TrafficSpaceObject tso) {
tso.setGmlObject(ats); tso.setGmlObject(ats);
mapAbstractUnoccupiedSpace(ats, tso); mapAbstractUnoccupiedSpace(ats, tso, Orientation.OUTWARD);
for (AbstractSpaceBoundaryProperty boundary : ats.getBoundaries()) { for (AbstractSpaceBoundaryProperty boundary : ats.getBoundaries()) {
if (boundary.isSetObject()) { if (boundary.isSetObject()) {
AuxiliaryTrafficArea area = (AuxiliaryTrafficArea) boundary.getObject(); AuxiliaryTrafficArea area = (AuxiliaryTrafficArea) boundary.getObject();
...@@ -886,8 +969,8 @@ public class Citygml3FeatureMapper extends ObjectWalker { ...@@ -886,8 +969,8 @@ public class Citygml3FeatureMapper extends ObjectWalker {
finishCityObjectConstruction(tao); finishCityObjectConstruction(tao);
} }
private void mapAbstractUnoccupiedSpace(AbstractUnoccupiedSpace aus, CityObject co) { private void mapAbstractUnoccupiedSpace(AbstractUnoccupiedSpace aus, CityObject co, Orientation orientation) {
mapAbstractPhysicalSpace(aus, co); mapAbstractPhysicalSpace(aus, co, orientation);
} }
private void parseAbstractTransportationSpaceGeometries(AbstractTransportationSpace space, CityObject co) { private void parseAbstractTransportationSpaceGeometries(AbstractTransportationSpace space, CityObject co) {
...@@ -895,16 +978,6 @@ public class Citygml3FeatureMapper extends ObjectWalker { ...@@ -895,16 +978,6 @@ public class Citygml3FeatureMapper extends ObjectWalker {
parseAndAddMultiSurface(space.getDeprecatedProperties().getLod4MultiSurface(), Lod.LOD4, co); parseAndAddMultiSurface(space.getDeprecatedProperties().getLod4MultiSurface(), Lod.LOD4, co);
} }
private void parseAbstractSpaceGeometries(AbstractSpace as, CityObject co) {
parseAndAddMultiSurface(as.getLod0MultiSurface(), Lod.LOD0, co);
parseAndAddMultiSurface(as.getLod2MultiSurface(), Lod.LOD2, co);
parseAndAddMultiSurface(as.getLod3MultiSurface(), Lod.LOD3, co);
parseAndAddSolid(as.getLod1Solid(), Lod.LOD1, co);
parseAndAddSolid(as.getLod2Solid(), Lod.LOD2, co);
parseAndAddSolid(as.getLod3Solid(), Lod.LOD3, co);
}
private void parseAndAddMultiSurface(MultiSurfaceProperty msp, Lod lod, CityObject co) { private void parseAndAddMultiSurface(MultiSurfaceProperty msp, Lod lod, CityObject co) {
if (msp == null || msp.getObject() == null) { if (msp == null || msp.getObject() == null) {
return; return;
...@@ -913,24 +986,24 @@ public class Citygml3FeatureMapper extends ObjectWalker { ...@@ -913,24 +986,24 @@ public class Citygml3FeatureMapper extends ObjectWalker {
co.addGeometry(geom); co.addGeometry(geom);
} }
private void parseAndAddSolid(SolidProperty sp, Lod lod, CityObject co) { private void parseAndAddSolid(SolidProperty sp, Lod lod, CityObject co, Orientation orientation) {
if (sp == null || sp.getObject() == null) { if (sp == null || sp.getObject() == null) {
return; return;
} }
Geometry geom = parseSolid(sp.getObject(), lod); Geometry geom = parseSolid(sp.getObject(), lod, orientation);
if (geom != null) { if (geom != null) {
co.addGeometry(geom); co.addGeometry(geom);
} }
} }
private void parseImplicitGeometry(AbstractOccupiedSpace aos, CityObject co) { private void parseImplicitGeometry(AbstractOccupiedSpace aos, CityObject co, Orientation orientation) {
for (int i = 1; i <= 3; i++) { for (int i = 1; i <= 3; i++) {
if (aos.getImplicitRepresentation(i) == null) { if (aos.getImplicitRepresentation(i) == null) {
continue; continue;
} }
if (aos.getImplicitRepresentation(i).getObject() != null) { if (aos.getImplicitRepresentation(i).getObject() != null) {
ImplicitGeometry impGeom = aos.getImplicitRepresentation(i).getObject(); ImplicitGeometry impGeom = aos.getImplicitRepresentation(i).getObject();
ImplicitGeometryHolder igh = resolveImplicitGeometry(impGeom, i); ImplicitGeometryHolder igh = resolveImplicitGeometry(impGeom, i, orientation);
if (igh != null) { if (igh != null) {
co.addGeometry(igh); co.addGeometry(igh);
} }
...@@ -944,7 +1017,7 @@ public class Citygml3FeatureMapper extends ObjectWalker { ...@@ -944,7 +1017,7 @@ public class Citygml3FeatureMapper extends ObjectWalker {
} }
private ImplicitGeometryHolder resolveImplicitGeometry(ImplicitGeometry ig, int lodInt) { private ImplicitGeometryHolder resolveImplicitGeometry(ImplicitGeometry ig, int lodInt, Orientation orientation) {
ImplicitGeometryHolder igh = null; ImplicitGeometryHolder igh = null;
if (ig.getLibraryObject() != null) { if (ig.getLibraryObject() != null) {
LibraryObject libObj = null; LibraryObject libObj = null;
...@@ -968,7 +1041,7 @@ public class Citygml3FeatureMapper extends ObjectWalker { ...@@ -968,7 +1041,7 @@ public class Citygml3FeatureMapper extends ObjectWalker {
if (aGeom instanceof MultiSurface ms) { if (aGeom instanceof MultiSurface ms) {
geom = parseMultiSurface(ms, lod); geom = parseMultiSurface(ms, lod);
} else if (aGeom instanceof Solid s) { } else if (aGeom instanceof Solid s) {
geom = parseSolid(s, lod); geom = parseSolid(s, lod, orientation);
} else if (aGeom instanceof CompositeSurface cs) { } else if (aGeom instanceof CompositeSurface cs) {
geom = parseCompositeSurface(cs, lod); geom = parseCompositeSurface(cs, lod);
} }
...@@ -1025,12 +1098,12 @@ public class Citygml3FeatureMapper extends ObjectWalker { ...@@ -1025,12 +1098,12 @@ public class Citygml3FeatureMapper extends ObjectWalker {
private void readAbstractBuilding(org.citygml4j.core.model.building.AbstractBuilding gmlAb, private void readAbstractBuilding(org.citygml4j.core.model.building.AbstractBuilding gmlAb,
AbstractBuilding cdBuilding) { AbstractBuilding cdBuilding) {
mapAbstractOccupiedSpace(gmlAb, cdBuilding); mapAbstractOccupiedSpace(gmlAb, cdBuilding, Orientation.OUTWARD);
cdBuilding.setGmlObject(gmlAb); cdBuilding.setGmlObject(gmlAb);
// parse deprecated geometries // parse deprecated geometries
parseAndAddMultiSurface(gmlAb.getDeprecatedProperties().getLod1MultiSurface(), Lod.LOD1, cdBuilding); parseAndAddMultiSurface(gmlAb.getDeprecatedProperties().getLod1MultiSurface(), Lod.LOD1, cdBuilding);
parseAndAddMultiSurface(gmlAb.getDeprecatedProperties().getLod4MultiSurface(), Lod.LOD4, cdBuilding); parseAndAddMultiSurface(gmlAb.getDeprecatedProperties().getLod4MultiSurface(), Lod.LOD4, cdBuilding);
parseAndAddSolid(gmlAb.getDeprecatedProperties().getLod4Solid(), Lod.LOD4, cdBuilding); parseAndAddSolid(gmlAb.getDeprecatedProperties().getLod4Solid(), Lod.LOD4, cdBuilding, Orientation.OUTWARD);
parseBuildingConstructiveElements(gmlAb, cdBuilding); parseBuildingConstructiveElements(gmlAb, cdBuilding);
parseBuildingInstallations(gmlAb, cdBuilding); parseBuildingInstallations(gmlAb, cdBuilding);
...@@ -1135,7 +1208,7 @@ public class Citygml3FeatureMapper extends ObjectWalker { ...@@ -1135,7 +1208,7 @@ public class Citygml3FeatureMapper extends ObjectWalker {
BuildingRoom br = new BuildingRoom(); BuildingRoom br = new BuildingRoom();
br.setGmlObject(gmlBr); br.setGmlObject(gmlBr);
mapAbstractUnoccupiedSpace(gmlBr, br); mapAbstractUnoccupiedSpace(gmlBr, br, Orientation.INWARD);
SurfaceMapper surfaceMapper = new SurfaceMapper(polygonMap, references, compositeMap, vertexMap, config); SurfaceMapper surfaceMapper = new SurfaceMapper(polygonMap, references, compositeMap, vertexMap, config);
for (AbstractSpaceBoundaryProperty surfaceProp : gmlBr.getBoundaries()) { for (AbstractSpaceBoundaryProperty surfaceProp : gmlBr.getBoundaries()) {
...@@ -1176,7 +1249,7 @@ public class Citygml3FeatureMapper extends ObjectWalker { ...@@ -1176,7 +1249,7 @@ public class Citygml3FeatureMapper extends ObjectWalker {
private BuildingRoomFurniture mapBuildingFurniture(BuildingFurniture gmlAF) { private BuildingRoomFurniture mapBuildingFurniture(BuildingFurniture gmlAF) {
BuildingRoomFurniture bf = new BuildingRoomFurniture(); BuildingRoomFurniture bf = new BuildingRoomFurniture();
bf.setGmlObject(gmlAF); bf.setGmlObject(gmlAF);
mapAbstractOccupiedSpace(gmlAF, bf); mapAbstractOccupiedSpace(gmlAF, bf, Orientation.OUTWARD);
SurfaceMapper surfaceMapper = new SurfaceMapper(polygonMap, references, compositeMap, vertexMap, config); SurfaceMapper surfaceMapper = new SurfaceMapper(polygonMap, references, compositeMap, vertexMap, config);
for (AbstractSpaceBoundaryProperty surfaceProp : gmlAF.getBoundaries()) { for (AbstractSpaceBoundaryProperty surfaceProp : gmlAF.getBoundaries()) {
if (!surfaceProp.isSetObject()) { if (!surfaceProp.isSetObject()) {
...@@ -1198,7 +1271,7 @@ public class Citygml3FeatureMapper extends ObjectWalker { ...@@ -1198,7 +1271,7 @@ public class Citygml3FeatureMapper extends ObjectWalker {
} }
private void mapBuildingConstructiveElement(de.hft.stuttgart.citydoctor2.datastructure.BuildingConstructiveElement bce, BuildingConstructiveElement ele) { private void mapBuildingConstructiveElement(de.hft.stuttgart.citydoctor2.datastructure.BuildingConstructiveElement bce, BuildingConstructiveElement ele) {
mapAbstractOccupiedSpace(ele, bce); mapAbstractOccupiedSpace(ele, bce, Orientation.OUTWARD);
SurfaceMapper surfaceMapper = new SurfaceMapper(polygonMap, references, compositeMap, vertexMap, config); SurfaceMapper surfaceMapper = new SurfaceMapper(polygonMap, references, compositeMap, vertexMap, config);
for (AbstractSpaceBoundaryProperty surfaceProp : ele.getBoundaries()) { for (AbstractSpaceBoundaryProperty surfaceProp : ele.getBoundaries()) {
if (!surfaceProp.isSetObject()) { if (!surfaceProp.isSetObject()) {
...@@ -1215,7 +1288,7 @@ public class Citygml3FeatureMapper extends ObjectWalker { ...@@ -1215,7 +1288,7 @@ public class Citygml3FeatureMapper extends ObjectWalker {
private de.hft.stuttgart.citydoctor2.datastructure.Storey mapBuildingStorey(Storey gmlStorey) { private de.hft.stuttgart.citydoctor2.datastructure.Storey mapBuildingStorey(Storey gmlStorey) {
de.hft.stuttgart.citydoctor2.datastructure.Storey storey = new de.hft.stuttgart.citydoctor2.datastructure.Storey(); de.hft.stuttgart.citydoctor2.datastructure.Storey storey = new de.hft.stuttgart.citydoctor2.datastructure.Storey();
storey.setGmlObject(gmlStorey); storey.setGmlObject(gmlStorey);
mapAbstractSpace(gmlStorey, storey); mapAbstractSpace(gmlStorey, storey, Orientation.INWARD);
SurfaceMapper surfaceMapper = new SurfaceMapper(polygonMap, references, compositeMap, vertexMap, config); SurfaceMapper surfaceMapper = new SurfaceMapper(polygonMap, references, compositeMap, vertexMap, config);
for (AbstractSpaceBoundaryProperty surfaceProp : gmlStorey.getBoundaries()) { for (AbstractSpaceBoundaryProperty surfaceProp : gmlStorey.getBoundaries()) {
if (!surfaceProp.isSetObject()) { if (!surfaceProp.isSetObject()) {
...@@ -1238,7 +1311,7 @@ public class Citygml3FeatureMapper extends ObjectWalker { ...@@ -1238,7 +1311,7 @@ public class Citygml3FeatureMapper extends ObjectWalker {
private de.hft.stuttgart.citydoctor2.datastructure.BuildingUnit mapBuildingUnit(BuildingUnit gmlBU) { private de.hft.stuttgart.citydoctor2.datastructure.BuildingUnit mapBuildingUnit(BuildingUnit gmlBU) {
de.hft.stuttgart.citydoctor2.datastructure.BuildingUnit bu = new de.hft.stuttgart.citydoctor2.datastructure.BuildingUnit(); de.hft.stuttgart.citydoctor2.datastructure.BuildingUnit bu = new de.hft.stuttgart.citydoctor2.datastructure.BuildingUnit();
bu.setGmlObject(gmlBU); bu.setGmlObject(gmlBU);
mapAbstractSpace(gmlBU, bu); mapAbstractSpace(gmlBU, bu, Orientation.OUTWARD);
SurfaceMapper surfaceMapper = new SurfaceMapper(polygonMap, references, compositeMap, vertexMap, config); SurfaceMapper surfaceMapper = new SurfaceMapper(polygonMap, references, compositeMap, vertexMap, config);
for (AbstractSpaceBoundaryProperty surfaceProp : gmlBU.getBoundaries()) { for (AbstractSpaceBoundaryProperty surfaceProp : gmlBU.getBoundaries()) {
if (!surfaceProp.isSetObject()) { if (!surfaceProp.isSetObject()) {
...@@ -1272,13 +1345,13 @@ public class Citygml3FeatureMapper extends ObjectWalker { ...@@ -1272,13 +1345,13 @@ public class Citygml3FeatureMapper extends ObjectWalker {
private Installation mapBuildingInstallation(org.citygml4j.core.model.building.BuildingInstallation gmlBi) { private Installation mapBuildingInstallation(org.citygml4j.core.model.building.BuildingInstallation gmlBi) {
Installation bi = new Installation(); Installation bi = new Installation();
bi.setGmlObject(gmlBi); bi.setGmlObject(gmlBi);
mapAbstractOccupiedSpace(gmlBi, bi); mapAbstractOccupiedSpace(gmlBi, bi, Orientation.OUTWARD);
GeometryProperty<?> lod2Prop = gmlBi.getDeprecatedProperties().getLod2Geometry(); GeometryProperty<?> lod2Prop = gmlBi.getDeprecatedProperties().getLod2Geometry();
parseAndAddAbstractGeometry(lod2Prop, Lod.LOD2, bi); parseAndAddAbstractGeometry(lod2Prop, Lod.LOD2, bi, Orientation.OUTWARD);
GeometryProperty<?> lod3Prop = gmlBi.getDeprecatedProperties().getLod3Geometry(); GeometryProperty<?> lod3Prop = gmlBi.getDeprecatedProperties().getLod3Geometry();
parseAndAddAbstractGeometry(lod3Prop, Lod.LOD3, bi); parseAndAddAbstractGeometry(lod3Prop, Lod.LOD3, bi, Orientation.OUTWARD);
GeometryProperty<?> lod4Prop = gmlBi.getDeprecatedProperties().getLod4Geometry(); GeometryProperty<?> lod4Prop = gmlBi.getDeprecatedProperties().getLod4Geometry();
parseAndAddAbstractGeometry(lod4Prop, Lod.LOD4, bi); parseAndAddAbstractGeometry(lod4Prop, Lod.LOD4, bi, Orientation.OUTWARD);
SurfaceMapper surfaceMapper = new SurfaceMapper(polygonMap, references, compositeMap, vertexMap, config); SurfaceMapper surfaceMapper = new SurfaceMapper(polygonMap, references, compositeMap, vertexMap, config);
for (AbstractSpaceBoundaryProperty surfaceProp : gmlBi.getBoundaries()) { for (AbstractSpaceBoundaryProperty surfaceProp : gmlBi.getBoundaries()) {
...@@ -1306,7 +1379,7 @@ public class Citygml3FeatureMapper extends ObjectWalker { ...@@ -1306,7 +1379,7 @@ public class Citygml3FeatureMapper extends ObjectWalker {
return bi; return bi;
} }
private void parseAndAddAbstractGeometry(GeometryProperty<?> geomProp, Lod lod, CityObject co) { private void parseAndAddAbstractGeometry(GeometryProperty<?> geomProp, Lod lod, CityObject co, Orientation orientation) {
if (geomProp == null || geomProp.getObject() == null) { if (geomProp == null || geomProp.getObject() == null) {
return; return;
} }
...@@ -1315,7 +1388,7 @@ public class Citygml3FeatureMapper extends ObjectWalker { ...@@ -1315,7 +1388,7 @@ public class Citygml3FeatureMapper extends ObjectWalker {
Geometry geom = parseMultiSurface(ms, lod); Geometry geom = parseMultiSurface(ms, lod);
co.addGeometry(geom); co.addGeometry(geom);
} else if (abstractGeometry instanceof Solid solid) { } else if (abstractGeometry instanceof Solid solid) {
Geometry geom = parseSolid(solid, lod); Geometry geom = parseSolid(solid, lod, orientation);
if (geom != null) { if (geom != null) {
co.addGeometry(geom); co.addGeometry(geom);
} }
...@@ -1324,9 +1397,9 @@ public class Citygml3FeatureMapper extends ObjectWalker { ...@@ -1324,9 +1397,9 @@ public class Citygml3FeatureMapper extends ObjectWalker {
} }
} }
private Geometry parseSolid(AbstractSolid abstractSolid, Lod lod) { private Geometry parseSolid(AbstractSolid abstractSolid, Lod lod, Orientation orientation) {
if (abstractSolid instanceof Solid s) { if (abstractSolid instanceof Solid s) {
return handleSolidGeometry(s, lod); return handleSolidGeometry(s, lod, orientation);
} else { } else {
logger.warn("Cannot handle solid class {}, can only process pure solids", logger.warn("Cannot handle solid class {}, can only process pure solids",
abstractSolid.getClass().getSimpleName()); abstractSolid.getClass().getSimpleName());
...@@ -1334,13 +1407,13 @@ public class Citygml3FeatureMapper extends ObjectWalker { ...@@ -1334,13 +1407,13 @@ public class Citygml3FeatureMapper extends ObjectWalker {
} }
} }
private Geometry handleSolidGeometry(Solid solid, Lod lod) { private Geometry handleSolidGeometry(Solid solid, Lod lod, Orientation orientation) {
ShellProperty exteriorProperty = solid.getExterior(); ShellProperty exteriorProperty = solid.getExterior();
if (exteriorProperty == null || exteriorProperty.getObject() == null) { if (exteriorProperty == null || exteriorProperty.getObject() == null) {
logger.warn("Found solid {} without exterior hull, ignoring", solid.getId()); logger.warn("Found solid {} without exterior hull, ignoring", solid.getId());
return null; return null;
} }
Geometry geom = new Geometry(GeometryType.SOLID, lod); Geometry geom = new Geometry(GeometryType.SOLID, lod, orientation);
Shell exterior = solid.getExterior().getObject(); Shell exterior = solid.getExterior().getObject();
Citygml3GeometryMapper geometryMapper = new Citygml3GeometryMapper(config, vertexMap); Citygml3GeometryMapper geometryMapper = new Citygml3GeometryMapper(config, vertexMap);
readSurfaceMember(geom, geometryMapper, exterior.getSurfaceMembers()); readSurfaceMember(geom, geometryMapper, exterior.getSurfaceMembers());
...@@ -1348,7 +1421,7 @@ public class Citygml3FeatureMapper extends ObjectWalker { ...@@ -1348,7 +1421,7 @@ public class Citygml3FeatureMapper extends ObjectWalker {
} }
private Geometry parseMultiSurface(MultiSurface ms, Lod lod) { private Geometry parseMultiSurface(MultiSurface ms, Lod lod) {
Geometry geom = new Geometry(GeometryType.MULTI_SURFACE, lod); Geometry geom = new Geometry(GeometryType.MULTI_SURFACE, lod, null);
Citygml3GeometryMapper geometryMapper = new Citygml3GeometryMapper(config, vertexMap); Citygml3GeometryMapper geometryMapper = new Citygml3GeometryMapper(config, vertexMap);
readSurfaceMember(geom, geometryMapper, ms.getSurfaceMember()); readSurfaceMember(geom, geometryMapper, ms.getSurfaceMember());
return geom; return geom;
...@@ -1378,7 +1451,7 @@ public class Citygml3FeatureMapper extends ObjectWalker { ...@@ -1378,7 +1451,7 @@ public class Citygml3FeatureMapper extends ObjectWalker {
} }
private Geometry parseCompositeSurface(CompositeSurface cs, Lod lod) { private Geometry parseCompositeSurface(CompositeSurface cs, Lod lod) {
Geometry geom = new Geometry(GeometryType.COMPOSITE_SURFACE, lod); Geometry geom = new Geometry(GeometryType.COMPOSITE_SURFACE, lod, null);
Citygml3GeometryMapper geometryMapper = new Citygml3GeometryMapper(config, vertexMap); Citygml3GeometryMapper geometryMapper = new Citygml3GeometryMapper(config, vertexMap);
readSurfaceMember(geom, geometryMapper, cs.getSurfaceMembers()); readSurfaceMember(geom, geometryMapper, cs.getSurfaceMembers());
return geom; return geom;
......
...@@ -107,7 +107,7 @@ public class SurfaceMapper extends ObjectWalker { ...@@ -107,7 +107,7 @@ public class SurfaceMapper extends ObjectWalker {
} }
private Geometry parseMultiSurface(MultiSurface ms, Lod lod) { private Geometry parseMultiSurface(MultiSurface ms, Lod lod) {
Geometry geom = new Geometry(GeometryType.MULTI_SURFACE, lod); Geometry geom = new Geometry(GeometryType.MULTI_SURFACE, lod, null);
Citygml3GeometryMapper geometryMapper = new Citygml3GeometryMapper(config, vertexMap); Citygml3GeometryMapper geometryMapper = new Citygml3GeometryMapper(config, vertexMap);
readSurfaceMember(geom, geometryMapper, ms.getSurfaceMember()); readSurfaceMember(geom, geometryMapper, ms.getSurfaceMember());
return geom; return geom;
......
...@@ -32,4 +32,6 @@ public interface CityGmlConsumer { ...@@ -32,4 +32,6 @@ public interface CityGmlConsumer {
} }
// public void endOfFile();
} }
...@@ -18,26 +18,42 @@ ...@@ -18,26 +18,42 @@
*/ */
package de.hft.stuttgart.citydoctor2.parser; package de.hft.stuttgart.citydoctor2.parser;
import de.hft.stuttgart.citydoctor2.datastructure.CityDoctorModel; import java.io.BufferedInputStream;
import de.hft.stuttgart.citydoctor2.datastructure.CityObject; import java.io.ByteArrayInputStream;
import de.hft.stuttgart.citydoctor2.mapper.citygml3.Citygml3FeatureMapper; import java.io.File;
import de.hft.stuttgart.citydoctor2.mapper.citygml3.GMLValidationHandler; import java.io.FileInputStream;
import de.hft.stuttgart.citydoctor2.math.Vector3d; import java.io.IOException;
import de.hft.stuttgart.citydoctor2.utils.Localization; import java.io.InputStream;
import de.hft.stuttgart.citydoctor2.zip.CityGmlZipEntry; import java.nio.charset.StandardCharsets;
import de.hft.stuttgart.citydoctor2.zip.CityGmlZipEntryFile; import java.nio.file.Path;
import de.hft.stuttgart.quality.QualityADEContext; import java.nio.file.Paths;
import de.hft.stuttgart.quality.QualityADEModule; import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.xml.XMLConstants;
import javax.xml.namespace.QName;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import javax.xml.transform.Source;
import javax.xml.transform.stream.StreamSource;
import javax.xml.validation.Schema;
import javax.xml.validation.SchemaFactory;
import javax.xml.validation.Validator;
import org.apache.logging.log4j.Level; import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Logger;
import org.citygml4j.core.ade.ADEException; import org.citygml4j.core.ade.ADEException;
import org.citygml4j.core.ade.ADERegistry; import org.citygml4j.core.ade.ADERegistry;
import org.citygml4j.core.model.CityGMLVersion; import org.citygml4j.core.model.CityGMLVersion;
import org.citygml4j.core.model.ade.ADEProperty;
import org.citygml4j.core.model.core.AbstractCityObject; import org.citygml4j.core.model.core.AbstractCityObject;
import org.citygml4j.core.model.core.AbstractCityObjectProperty; import org.citygml4j.core.model.core.AbstractCityObjectProperty;
import org.citygml4j.core.model.core.AbstractFeature; import org.citygml4j.core.model.core.AbstractFeature;
import org.citygml4j.core.model.core.AbstractFeatureProperty;
import org.citygml4j.core.model.core.CityModel; import org.citygml4j.core.model.core.CityModel;
import org.citygml4j.core.util.CityGMLConstants; import org.citygml4j.core.util.CityGMLConstants;
import org.citygml4j.xml.CityGMLContext; import org.citygml4j.xml.CityGMLContext;
...@@ -68,30 +84,16 @@ import org.xmlobjects.schema.SchemaHandlerException; ...@@ -68,30 +84,16 @@ import org.xmlobjects.schema.SchemaHandlerException;
import org.xmlobjects.stream.XMLReader; import org.xmlobjects.stream.XMLReader;
import org.xmlobjects.stream.XMLReaderFactory; import org.xmlobjects.stream.XMLReaderFactory;
import javax.xml.XMLConstants; import de.hft.stuttgart.citydoctor2.datastructure.CityDoctorModel;
import javax.xml.namespace.QName; import de.hft.stuttgart.citydoctor2.datastructure.CityObject;
import javax.xml.parsers.ParserConfigurationException; import de.hft.stuttgart.citydoctor2.mapper.citygml3.Citygml3FeatureMapper;
import javax.xml.parsers.SAXParser; import de.hft.stuttgart.citydoctor2.mapper.citygml3.GMLValidationHandler;
import javax.xml.parsers.SAXParserFactory; import de.hft.stuttgart.citydoctor2.math.Vector3d;
import javax.xml.transform.Source; import de.hft.stuttgart.citydoctor2.utils.Localization;
import javax.xml.transform.stream.StreamSource; import de.hft.stuttgart.citydoctor2.zip.CityGmlZipEntry;
import javax.xml.validation.Schema; import de.hft.stuttgart.citydoctor2.zip.CityGmlZipEntryFile;
import javax.xml.validation.SchemaFactory; import de.hft.stuttgart.quality.QualityADEContext;
import javax.xml.validation.Validator; import de.hft.stuttgart.quality.QualityADEModule;
import java.io.BufferedInputStream;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.StandardCharsets;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/** /**
* Utility class to parse CityGML files. * Utility class to parse CityGML files.
...@@ -430,6 +432,7 @@ public class CityGmlParser { ...@@ -430,6 +432,7 @@ public class CityGmlParser {
writer.writeMember(chunk); writer.writeMember(chunk);
} }
} }
// end of stream // end of stream
logger.debug("End of gml file stream"); logger.debug("End of gml file stream");
} catch (CityGMLReadException e) { } catch (CityGMLReadException e) {
...@@ -447,11 +450,11 @@ public class CityGmlParser { ...@@ -447,11 +450,11 @@ public class CityGmlParser {
} }
} }
private static void writeCityModel(CityGMLChunkWriter writer, CityModel cModel) { private static void writeCityModel(CityGMLChunkWriter writer, CityModel cModel) throws CityGMLWriteException {
if (writer != null) { if (writer != null) {
for (ADEProperty genEle : cModel.getADEProperties()) { for (AbstractFeatureProperty featureProp : cModel.getFeatureMembers()) {
writer.getCityModelInfo().addADEProperty(genEle); writer.writeMember(featureProp.getObject());
} }
} }
} }
......
...@@ -31,6 +31,7 @@ import org.junit.Test; ...@@ -31,6 +31,7 @@ import org.junit.Test;
import de.hft.stuttgart.citydoctor2.check.error.SchematronError; import de.hft.stuttgart.citydoctor2.check.error.SchematronError;
import de.hft.stuttgart.citydoctor2.datastructure.Building; import de.hft.stuttgart.citydoctor2.datastructure.Building;
import de.hft.stuttgart.citydoctor2.datastructure.Geometry; import de.hft.stuttgart.citydoctor2.datastructure.Geometry;
import de.hft.stuttgart.citydoctor2.datastructure.Geometry.Orientation;
import de.hft.stuttgart.citydoctor2.datastructure.GeometryType; import de.hft.stuttgart.citydoctor2.datastructure.GeometryType;
import de.hft.stuttgart.citydoctor2.datastructure.GmlId; import de.hft.stuttgart.citydoctor2.datastructure.GmlId;
import de.hft.stuttgart.citydoctor2.datastructure.Lod; import de.hft.stuttgart.citydoctor2.datastructure.Lod;
...@@ -90,7 +91,7 @@ public class CheckableTest { ...@@ -90,7 +91,7 @@ public class CheckableTest {
@Test @Test
public void testContainsError() { public void testContainsError() {
Building b = new Building(); Building b = new Building();
Geometry geom = new Geometry(GeometryType.SOLID, Lod.LOD0); Geometry geom = new Geometry(GeometryType.SOLID, Lod.LOD0, Orientation.OUTWARD);
b.addGeometry(geom); b.addGeometry(geom);
assertFalse(b.containsError(CheckId.C_GE_P_HOLE_OUTSIDE)); assertFalse(b.containsError(CheckId.C_GE_P_HOLE_OUTSIDE));
assertFalse(b.containsAnyError()); assertFalse(b.containsAnyError());
...@@ -148,7 +149,7 @@ public class CheckableTest { ...@@ -148,7 +149,7 @@ public class CheckableTest {
@Test @Test
public void testCollectAllContainedErrors() { public void testCollectAllContainedErrors() {
Building b = new Building(); Building b = new Building();
Geometry geom = new Geometry(GeometryType.SOLID, Lod.LOD0); Geometry geom = new Geometry(GeometryType.SOLID, Lod.LOD0, Orientation.OUTWARD);
b.addGeometry(geom); b.addGeometry(geom);
b.addCheckResult(new CheckResult(CheckId.C_GE_P_HOLE_OUTSIDE, ResultStatus.ERROR, b.addCheckResult(new CheckResult(CheckId.C_GE_P_HOLE_OUTSIDE, ResultStatus.ERROR,
new SchematronError(null, null, null, null))); new SchematronError(null, null, null, null)));
......
...@@ -30,6 +30,7 @@ import de.hft.stuttgart.citydoctor2.datastructure.Geometry; ...@@ -30,6 +30,7 @@ import de.hft.stuttgart.citydoctor2.datastructure.Geometry;
import de.hft.stuttgart.citydoctor2.datastructure.GeometryType; import de.hft.stuttgart.citydoctor2.datastructure.GeometryType;
import de.hft.stuttgart.citydoctor2.datastructure.GmlId; import de.hft.stuttgart.citydoctor2.datastructure.GmlId;
import de.hft.stuttgart.citydoctor2.datastructure.Lod; import de.hft.stuttgart.citydoctor2.datastructure.Lod;
import de.hft.stuttgart.citydoctor2.datastructure.Geometry.Orientation;
import de.hft.stuttgart.quality.model.properties.AbstractErrorProperty; import de.hft.stuttgart.quality.model.properties.AbstractErrorProperty;
import de.hft.stuttgart.quality.model.types.AbstractError; import de.hft.stuttgart.quality.model.types.AbstractError;
import de.hft.stuttgart.quality.model.types.AllPolygonsOrientedWrongError; import de.hft.stuttgart.quality.model.types.AllPolygonsOrientedWrongError;
...@@ -39,7 +40,7 @@ public class AllPolygonsWrongOrientationErrorTest { ...@@ -39,7 +40,7 @@ public class AllPolygonsWrongOrientationErrorTest {
@Test @Test
public void testAddToValidationResult() { public void testAddToValidationResult() {
Geometry geom = new Geometry(GeometryType.SOLID, Lod.LOD2); Geometry geom = new Geometry(GeometryType.SOLID, Lod.LOD2, Orientation.OUTWARD);
GmlId gmlId = new GmlId("testId"); GmlId gmlId = new GmlId("testId");
geom.setGmlId(gmlId); geom.setGmlId(gmlId);
AllPolygonsWrongOrientationError err = new AllPolygonsWrongOrientationError(geom); AllPolygonsWrongOrientationError err = new AllPolygonsWrongOrientationError(geom);
......
...@@ -33,6 +33,7 @@ import de.hft.stuttgart.citydoctor2.datastructure.GeometryType; ...@@ -33,6 +33,7 @@ import de.hft.stuttgart.citydoctor2.datastructure.GeometryType;
import de.hft.stuttgart.citydoctor2.datastructure.GmlId; import de.hft.stuttgart.citydoctor2.datastructure.GmlId;
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.Geometry.Orientation;
import de.hft.stuttgart.quality.model.properties.AbstractErrorProperty; import de.hft.stuttgart.quality.model.properties.AbstractErrorProperty;
import de.hft.stuttgart.quality.model.properties.PolygonIdListProperty; import de.hft.stuttgart.quality.model.properties.PolygonIdListProperty;
import de.hft.stuttgart.quality.model.types.AbstractError; import de.hft.stuttgart.quality.model.types.AbstractError;
...@@ -44,7 +45,7 @@ public class MultipleConnectedComponentsErrorTest { ...@@ -44,7 +45,7 @@ public class MultipleConnectedComponentsErrorTest {
@Test @Test
public void testConvertToQualityAdeDatastructure() { public void testConvertToQualityAdeDatastructure() {
Geometry geom = new Geometry(GeometryType.SOLID, Lod.LOD2); Geometry geom = new Geometry(GeometryType.SOLID, Lod.LOD2, Orientation.OUTWARD);
GmlId geomId = new GmlId("geomId"); GmlId geomId = new GmlId("geomId");
geom.setGmlId(geomId); geom.setGmlId(geomId);
Polygon p1 = new ConcretePolygon(); Polygon p1 = new ConcretePolygon();
......
...@@ -33,6 +33,7 @@ import de.hft.stuttgart.citydoctor2.datastructure.GeometryType; ...@@ -33,6 +33,7 @@ import de.hft.stuttgart.citydoctor2.datastructure.GeometryType;
import de.hft.stuttgart.citydoctor2.datastructure.GmlId; import de.hft.stuttgart.citydoctor2.datastructure.GmlId;
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;
import de.hft.stuttgart.quality.model.properties.AbstractErrorProperty; import de.hft.stuttgart.quality.model.properties.AbstractErrorProperty;
import de.hft.stuttgart.quality.model.properties.EdgeProperty; import de.hft.stuttgart.quality.model.properties.EdgeProperty;
import de.hft.stuttgart.quality.model.types.AbstractError; import de.hft.stuttgart.quality.model.types.AbstractError;
...@@ -42,7 +43,7 @@ public class NonManifoldEdgeErrorTest { ...@@ -42,7 +43,7 @@ public class NonManifoldEdgeErrorTest {
@Test @Test
public void testConvertToQualityAdeDatastructure() { public void testConvertToQualityAdeDatastructure() {
Geometry geom = new Geometry(GeometryType.SOLID, Lod.LOD2); Geometry geom = new Geometry(GeometryType.SOLID, Lod.LOD2, Orientation.OUTWARD);
GmlId geomId = new GmlId("geomId"); GmlId geomId = new GmlId("geomId");
geom.setGmlId(geomId); geom.setGmlId(geomId);
......
...@@ -34,6 +34,7 @@ import de.hft.stuttgart.citydoctor2.datastructure.GmlId; ...@@ -34,6 +34,7 @@ import de.hft.stuttgart.citydoctor2.datastructure.GmlId;
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;
import de.hft.stuttgart.quality.model.properties.AbstractErrorProperty; import de.hft.stuttgart.quality.model.properties.AbstractErrorProperty;
import de.hft.stuttgart.quality.model.types.AbstractError; import de.hft.stuttgart.quality.model.types.AbstractError;
import de.hft.stuttgart.quality.model.types.ValidationResult; import de.hft.stuttgart.quality.model.types.ValidationResult;
...@@ -42,7 +43,7 @@ public class NonManifoldVertexErrorTest { ...@@ -42,7 +43,7 @@ public class NonManifoldVertexErrorTest {
@Test @Test
public void testConvertToQualityAdeDatastructure() { public void testConvertToQualityAdeDatastructure() {
Geometry geom = new Geometry(GeometryType.SOLID, Lod.LOD2); Geometry geom = new Geometry(GeometryType.SOLID, Lod.LOD2, Orientation.OUTWARD);
GmlId geomId = new GmlId("geomId"); GmlId geomId = new GmlId("geomId");
geom.setGmlId(geomId); geom.setGmlId(geomId);
Polygon p1 = new ConcretePolygon(); Polygon p1 = new ConcretePolygon();
......
...@@ -33,6 +33,7 @@ import de.hft.stuttgart.citydoctor2.datastructure.GeometryType; ...@@ -33,6 +33,7 @@ import de.hft.stuttgart.citydoctor2.datastructure.GeometryType;
import de.hft.stuttgart.citydoctor2.datastructure.GmlId; import de.hft.stuttgart.citydoctor2.datastructure.GmlId;
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;
import de.hft.stuttgart.quality.model.properties.AbstractErrorProperty; import de.hft.stuttgart.quality.model.properties.AbstractErrorProperty;
import de.hft.stuttgart.quality.model.properties.EdgeProperty; import de.hft.stuttgart.quality.model.properties.EdgeProperty;
import de.hft.stuttgart.quality.model.types.AbstractError; import de.hft.stuttgart.quality.model.types.AbstractError;
...@@ -42,7 +43,7 @@ public class PolygonWrongOrientationErrorTest { ...@@ -42,7 +43,7 @@ public class PolygonWrongOrientationErrorTest {
@Test @Test
public void testConvertToQualityAdeDatastructure() { public void testConvertToQualityAdeDatastructure() {
Geometry geom = new Geometry(GeometryType.SOLID, Lod.LOD2); Geometry geom = new Geometry(GeometryType.SOLID, Lod.LOD2, Orientation.OUTWARD);
GmlId geomId = new GmlId("geomId"); GmlId geomId = new GmlId("geomId");
geom.setGmlId(geomId); geom.setGmlId(geomId);
......
...@@ -33,6 +33,7 @@ import de.hft.stuttgart.citydoctor2.datastructure.GeometryType; ...@@ -33,6 +33,7 @@ import de.hft.stuttgart.citydoctor2.datastructure.GeometryType;
import de.hft.stuttgart.citydoctor2.datastructure.GmlId; import de.hft.stuttgart.citydoctor2.datastructure.GmlId;
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;
import de.hft.stuttgart.quality.model.properties.AbstractErrorProperty; import de.hft.stuttgart.quality.model.properties.AbstractErrorProperty;
import de.hft.stuttgart.quality.model.properties.EdgeProperty; import de.hft.stuttgart.quality.model.properties.EdgeProperty;
import de.hft.stuttgart.quality.model.types.AbstractError; import de.hft.stuttgart.quality.model.types.AbstractError;
...@@ -42,7 +43,7 @@ public class SolidNotClosedErrorTest { ...@@ -42,7 +43,7 @@ public class SolidNotClosedErrorTest {
@Test @Test
public void testConvertToQualityAdeDatastructure() { public void testConvertToQualityAdeDatastructure() {
Geometry geom = new Geometry(GeometryType.SOLID, Lod.LOD2); Geometry geom = new Geometry(GeometryType.SOLID, Lod.LOD2, Orientation.OUTWARD);
GmlId geomId = new GmlId("geomId"); GmlId geomId = new GmlId("geomId");
geom.setGmlId(geomId); geom.setGmlId(geomId);
......
...@@ -33,6 +33,7 @@ import de.hft.stuttgart.citydoctor2.datastructure.GeometryType; ...@@ -33,6 +33,7 @@ import de.hft.stuttgart.citydoctor2.datastructure.GeometryType;
import de.hft.stuttgart.citydoctor2.datastructure.GmlId; import de.hft.stuttgart.citydoctor2.datastructure.GmlId;
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.Geometry.Orientation;
import de.hft.stuttgart.citydoctor2.utils.PolygonIntersection; import de.hft.stuttgart.citydoctor2.utils.PolygonIntersection;
import de.hft.stuttgart.quality.model.properties.AbstractErrorProperty; import de.hft.stuttgart.quality.model.properties.AbstractErrorProperty;
import de.hft.stuttgart.quality.model.types.AbstractError; import de.hft.stuttgart.quality.model.types.AbstractError;
...@@ -43,7 +44,7 @@ public class SolidSelfIntErrorTest { ...@@ -43,7 +44,7 @@ public class SolidSelfIntErrorTest {
@Test @Test
public void testConvertToQualityAdeDatastructure() { public void testConvertToQualityAdeDatastructure() {
Geometry geom = new Geometry(GeometryType.SOLID, Lod.LOD2); Geometry geom = new Geometry(GeometryType.SOLID, Lod.LOD2, Orientation.OUTWARD);
GmlId geomId = new GmlId("geomId"); GmlId geomId = new GmlId("geomId");
geom.setGmlId(geomId); geom.setGmlId(geomId);
Polygon p1 = new ConcretePolygon(); Polygon p1 = new ConcretePolygon();
......
...@@ -30,6 +30,7 @@ import de.hft.stuttgart.citydoctor2.datastructure.Geometry; ...@@ -30,6 +30,7 @@ import de.hft.stuttgart.citydoctor2.datastructure.Geometry;
import de.hft.stuttgart.citydoctor2.datastructure.GeometryType; import de.hft.stuttgart.citydoctor2.datastructure.GeometryType;
import de.hft.stuttgart.citydoctor2.datastructure.GmlId; import de.hft.stuttgart.citydoctor2.datastructure.GmlId;
import de.hft.stuttgart.citydoctor2.datastructure.Lod; import de.hft.stuttgart.citydoctor2.datastructure.Lod;
import de.hft.stuttgart.citydoctor2.datastructure.Geometry.Orientation;
import de.hft.stuttgart.quality.model.properties.AbstractErrorProperty; import de.hft.stuttgart.quality.model.properties.AbstractErrorProperty;
import de.hft.stuttgart.quality.model.types.AbstractError; import de.hft.stuttgart.quality.model.types.AbstractError;
import de.hft.stuttgart.quality.model.types.SolidTooFewPolygonsError; import de.hft.stuttgart.quality.model.types.SolidTooFewPolygonsError;
...@@ -39,7 +40,7 @@ public class TooFewPolygonsErrorTest { ...@@ -39,7 +40,7 @@ public class TooFewPolygonsErrorTest {
@Test @Test
public void testConvertToQualityAdeDatastructure() { public void testConvertToQualityAdeDatastructure() {
Geometry geom = new Geometry(GeometryType.SOLID, Lod.LOD2); Geometry geom = new Geometry(GeometryType.SOLID, Lod.LOD2, Orientation.OUTWARD);
GmlId geomId = new GmlId("geomId"); GmlId geomId = new GmlId("geomId");
geom.setGmlId(geomId); geom.setGmlId(geomId);
......
...@@ -46,6 +46,7 @@ import de.hft.stuttgart.citydoctor2.check.CheckError; ...@@ -46,6 +46,7 @@ import de.hft.stuttgart.citydoctor2.check.CheckError;
import de.hft.stuttgart.citydoctor2.check.CheckId; import de.hft.stuttgart.citydoctor2.check.CheckId;
import de.hft.stuttgart.citydoctor2.check.CheckResult; import de.hft.stuttgart.citydoctor2.check.CheckResult;
import de.hft.stuttgart.citydoctor2.check.ResultStatus; import de.hft.stuttgart.citydoctor2.check.ResultStatus;
import de.hft.stuttgart.citydoctor2.datastructure.Geometry.Orientation;
import de.hft.stuttgart.citydoctor2.parser.ParserConfiguration; import de.hft.stuttgart.citydoctor2.parser.ParserConfiguration;
public class BoundarySurfaceTest { public class BoundarySurfaceTest {
...@@ -104,7 +105,7 @@ public class BoundarySurfaceTest { ...@@ -104,7 +105,7 @@ public class BoundarySurfaceTest {
@Test @Test
public void testPrepareForChecking() { public void testPrepareForChecking() {
BoundarySurface bs = new BoundarySurface(SurfaceFeatureType.BUILDING, BoundarySurfaceType.WALL, null); BoundarySurface bs = new BoundarySurface(SurfaceFeatureType.BUILDING, BoundarySurfaceType.WALL, null);
Geometry geom = new Geometry(GeometryType.MULTI_SURFACE, Lod.LOD2); Geometry geom = new Geometry(GeometryType.MULTI_SURFACE, Lod.LOD2, Orientation.OUTWARD);
Geometry spyGeom = Mockito.spy(geom); Geometry spyGeom = Mockito.spy(geom);
bs.addGeometry(spyGeom); bs.addGeometry(spyGeom);
bs.prepareForChecking(); bs.prepareForChecking();
......
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