Commit a1602768 authored by Matthias Betz's avatar Matthias Betz
Browse files

general cleanup of code

2 merge requests!28Version 3.17.0 Release,!24cleanup code
Pipeline #10955 passed with stage
in 1 minute and 9 seconds
Showing with 1317 additions and 1296 deletions
+1317 -1296
...@@ -125,6 +125,9 @@ public abstract class AbstractFurniture extends CityObject { ...@@ -125,6 +125,9 @@ public abstract class AbstractFurniture extends CityObject {
parent = co; parent = co;
} }
public CityObject getParent() {
return parent;
}
@Override @Override
public void unsetGmlGeometries() { public void unsetGmlGeometries() {
......
package de.hft.stuttgart.citydoctor2.datastructure; package de.hft.stuttgart.citydoctor2.datastructure;
import java.io.Serial;
import java.util.List;
import org.citygml4j.core.model.core.ImplicitGeometry;
import de.hft.stuttgart.citydoctor2.check.Check; import de.hft.stuttgart.citydoctor2.check.Check;
import de.hft.stuttgart.citydoctor2.check.CheckError; 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.math.TransformationMatrix; import de.hft.stuttgart.citydoctor2.math.TransformationMatrix;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.citygml4j.core.model.core.ImplicitGeometry;
import java.io.Serial;
import java.util.List;
/** /**
* Datastructure for representation and resolving of implicit geometries * Datastructure for representation and resolving of implicit geometries
...@@ -18,7 +17,6 @@ import java.util.List; ...@@ -18,7 +17,6 @@ import java.util.List;
*/ */
public class ImplicitGeometryHolder extends Geometry { public class ImplicitGeometryHolder extends Geometry {
private static final Logger logger = LogManager.getLogger(ImplicitGeometryHolder.class);
@Serial @Serial
private static final long serialVersionUID = -8938931081577196349L; private static final long serialVersionUID = -8938931081577196349L;
......
...@@ -14,7 +14,8 @@ import java.util.Map; ...@@ -14,7 +14,8 @@ import java.util.Map;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
/** /**
* Reference object for handling of implicit geometries with a library object contained in an external file * Reference object for handling of implicit geometries with a library object
* contained in an external file
* *
* @author Riegel * @author Riegel
*/ */
...@@ -23,8 +24,7 @@ public class LibraryObject extends Geometry { ...@@ -23,8 +24,7 @@ public class LibraryObject extends Geometry {
private static final Logger logger = LogManager.getLogger(LibraryObject.class); private static final Logger logger = LogManager.getLogger(LibraryObject.class);
@Serial @Serial
private static final long serialVersionUID = -50293435187454911L; private static final long serialVersionUID = -50293435187454911L;
private final String filepath;
private final ParserConfiguration config;
private static Map<String, LibraryObject> libraryObjects = new ConcurrentHashMap<>(); private static Map<String, LibraryObject> libraryObjects = new ConcurrentHashMap<>();
public static LibraryObject of(Path path, ParserConfiguration config) { public static LibraryObject of(Path path, ParserConfiguration config) {
...@@ -35,20 +35,17 @@ public class LibraryObject extends Geometry { ...@@ -35,20 +35,17 @@ public class LibraryObject extends Geometry {
if (protoGeom == null) { if (protoGeom == null) {
return null; return null;
} }
LibraryObject libOb = new LibraryObject(protoGeom.getType(), protoGeom.getLod(), path, config); LibraryObject libOb = new LibraryObject(protoGeom.getType(), protoGeom.getLod());
protoGeom.getPolygons().forEach(libOb::addPolygon); protoGeom.getPolygons().forEach(libOb::addPolygon);
libOb.updateEdgesAndVertices(); libOb.updateEdgesAndVertices();
libraryObjects.put(path.toString(), libOb); libraryObjects.put(path.toString(), libOb);
return libOb; return libOb;
} }
private LibraryObject(GeometryType type, Lod lod, Path path, ParserConfiguration config) { private LibraryObject(GeometryType type, Lod lod) {
super(type, lod); super(type, lod);
this.filepath = path.toString();
this.config = config;
} }
private static Geometry parseFile(Path path, ParserConfiguration config) { private static Geometry parseFile(Path path, ParserConfiguration config) {
Geometry geo = null; Geometry geo = null;
if (path.toFile().exists()) { if (path.toFile().exists()) {
...@@ -57,14 +54,15 @@ public class LibraryObject extends Geometry { ...@@ -57,14 +54,15 @@ public class LibraryObject extends Geometry {
CityDoctorModel model = CityGmlParser.parseCityGmlFile(path.toString(), config); CityDoctorModel model = CityGmlParser.parseCityGmlFile(path.toString(), config);
List<CityObject> objects = model.createFeatureStream().toList(); List<CityObject> objects = model.createFeatureStream().toList();
if (objects.isEmpty()) { if (objects.isEmpty()) {
throw new InvalidGmlFileException("Referenced library-object's gml file does not contain a CityGML object!"); throw new InvalidGmlFileException(
"Referenced library-object's gml file does not contain a CityGML object!");
} else if (objects.size() > 1) { } else if (objects.size() > 1) {
throw new InvalidGmlFileException("Referenced library-object's gml file contains more than one CityGML object!"); throw new InvalidGmlFileException(
"Referenced library-object's gml file contains more than one CityGML object!");
} }
geo = objects.get(0).getHighestLodGeometry(); geo = objects.get(0).getHighestLodGeometry();
} catch (CityGmlParseException e) { } catch (CityGmlParseException e) {
logger.error(String.format( logger.error("Encountered an error while parsing library object {}", path);
"Encountered an error while parsing library object %s", path));
logger.error(e.getStackTrace()); logger.error(e.getStackTrace());
} catch (InvalidGmlFileException e) { } catch (InvalidGmlFileException e) {
logger.error(e.getStackTrace()); logger.error(e.getStackTrace());
...@@ -73,7 +71,7 @@ public class LibraryObject extends Geometry { ...@@ -73,7 +71,7 @@ public class LibraryObject extends Geometry {
CityGmlParser.gagLogger(false); CityGmlParser.gagLogger(false);
} }
} else { } else {
logger.error(String.format("Implicit geometry references non-existing library object file %s.", path)); logger.error("Implicit geometry references non-existing library object file {}.", path);
} }
return geo; return geo;
} }
......
package de.hft.stuttgart.citydoctor2.datastructure; package de.hft.stuttgart.citydoctor2.datastructure;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import java.io.Serial; import java.io.Serial;
import java.util.Map; import java.util.Map;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
...@@ -15,7 +11,6 @@ import java.util.concurrent.ConcurrentHashMap; ...@@ -15,7 +11,6 @@ import java.util.concurrent.ConcurrentHashMap;
*/ */
public class RelativeGeometry extends Geometry { public class RelativeGeometry extends Geometry {
private static final Logger logger = LogManager.getLogger(RelativeGeometry.class);
@Serial @Serial
private static final long serialVersionUID = -686112245455298977L; private static final long serialVersionUID = -686112245455298977L;
...@@ -32,10 +27,7 @@ public class RelativeGeometry extends Geometry { ...@@ -32,10 +27,7 @@ public class RelativeGeometry extends Geometry {
return relGeo; return relGeo;
} }
private RelativeGeometry(GeometryType type, Lod lod) { private RelativeGeometry(GeometryType type, Lod lod) {
super(type, lod); super(type, lod);
} }
} }
...@@ -60,6 +60,8 @@ public class TunnelConstructiveElement extends CityObject { ...@@ -60,6 +60,8 @@ public class TunnelConstructiveElement extends CityObject {
MultiSurface ms = CityGmlUtils.createMultiSurface(geom, factory, config); MultiSurface ms = CityGmlUtils.createMultiSurface(geom, factory, config);
setMultiSurfaceAccordingToLod(geom, ms); setMultiSurfaceAccordingToLod(geom, ms);
break; break;
case COMPOSITE_SURFACE:
throw new IllegalStateException("Tunnel constructive element cannot have a composite surface geometry");
} }
} }
for (BoundarySurface bs : boundarySurfaceList) { for (BoundarySurface bs : boundarySurfaceList) {
......
...@@ -121,8 +121,7 @@ public class Citygml3FeatureMapper extends ObjectWalker { ...@@ -121,8 +121,7 @@ public class Citygml3FeatureMapper extends ObjectWalker {
gco.setGmlObject(gos); gco.setGmlObject(gos);
GeometryProperty<?> agLod1 = gos.getDeprecatedProperties().getLod1Geometry(); GeometryProperty<?> agLod1 = gos.getDeprecatedProperties().getLod1Geometry();
GeometryProperty<?> agLod4 = gos.getDeprecatedProperties().getLod4Geometry(); GeometryProperty<?> agLod4 = gos.getDeprecatedProperties().getLod4Geometry();
if (agLod1 != null && agLod1.getObject() != null && if (agLod1 != null && agLod1.getObject() != null && agLod1.getObject() instanceof MultiSurface ms) {
agLod1.getObject() instanceof MultiSurface ms) {
gco.addGeometry(parseMultiSurface(ms, Lod.LOD1)); gco.addGeometry(parseMultiSurface(ms, Lod.LOD1));
} }
if (agLod4 != null && agLod4.getObject() != null) { if (agLod4 != null && agLod4.getObject() != null) {
...@@ -211,10 +210,14 @@ public class Citygml3FeatureMapper extends ObjectWalker { ...@@ -211,10 +210,14 @@ public class Citygml3FeatureMapper extends ObjectWalker {
veg.setGmlObject(solitaryVegetationObject); veg.setGmlObject(solitaryVegetationObject);
mapAbstractVegetationObject(solitaryVegetationObject, veg); mapAbstractVegetationObject(solitaryVegetationObject, veg);
parseAndAddAbstractGeometry(solitaryVegetationObject.getDeprecatedProperties().getLod1Geometry(), Lod.LOD1, veg); parseAndAddAbstractGeometry(solitaryVegetationObject.getDeprecatedProperties().getLod1Geometry(), Lod.LOD1,
parseAndAddAbstractGeometry(solitaryVegetationObject.getDeprecatedProperties().getLod2Geometry(), Lod.LOD2, veg); veg);
parseAndAddAbstractGeometry(solitaryVegetationObject.getDeprecatedProperties().getLod3Geometry(), Lod.LOD3, veg); parseAndAddAbstractGeometry(solitaryVegetationObject.getDeprecatedProperties().getLod2Geometry(), Lod.LOD2,
parseAndAddAbstractGeometry(solitaryVegetationObject.getDeprecatedProperties().getLod4Geometry(), Lod.LOD4, veg); veg);
parseAndAddAbstractGeometry(solitaryVegetationObject.getDeprecatedProperties().getLod3Geometry(), Lod.LOD3,
veg);
parseAndAddAbstractGeometry(solitaryVegetationObject.getDeprecatedProperties().getLod4Geometry(), Lod.LOD4,
veg);
finishCityObjectConstruction(veg); finishCityObjectConstruction(veg);
model.addVegetation(veg); model.addVegetation(veg);
...@@ -254,7 +257,6 @@ public class Citygml3FeatureMapper extends ObjectWalker { ...@@ -254,7 +257,6 @@ public class Citygml3FeatureMapper extends ObjectWalker {
public void visit(Bridge bridge) { public void visit(Bridge bridge) {
BridgeObject bo = new BridgeObject(BridgeType.BRIDGE, bridge); BridgeObject bo = new BridgeObject(BridgeType.BRIDGE, bridge);
// 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);
...@@ -399,24 +401,11 @@ public class Citygml3FeatureMapper extends ObjectWalker { ...@@ -399,24 +401,11 @@ public class Citygml3FeatureMapper extends ObjectWalker {
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);
for (TunnelInstallationProperty tiProp : gmlTunnel.getTunnelInstallations()) { parseTunnelInstallations(gmlTunnel, cdTunnel);
var gmlTi = tiProp.getObject(); parseHollowSpaces(gmlTunnel, cdTunnel);
if (gmlTi == null) { parseTunnelFurniture(gmlTunnel, cdTunnel);
// ignore empty properties parseTunnelConstructiveElements(gmlTunnel, cdTunnel);
continue; parseTunnelBoundarySurfaces(gmlTunnel);
}
Installation ti = mapTunnelInstallation(gmlTi);
cdTunnel.addTunnelInstallation(ti);
}
for (HollowSpaceProperty thProp : gmlTunnel.getHollowSpaces()) {
var gmlTh = thProp.getObject();
if (gmlTh == null) {
continue;
}
TunnelHollow br = mapTunnelHollow(gmlTh);
cdTunnel.addTunnelHollow(br);
}
for (Installation ti : cdTunnel.getTunnelInstallations()) { for (Installation ti : cdTunnel.getTunnelInstallations()) {
updateEdgesAndVertices(ti); updateEdgesAndVertices(ti);
for (BoundarySurface bs : ti.getBoundarySurfaces()) { for (BoundarySurface bs : ti.getBoundarySurfaces()) {
...@@ -426,24 +415,14 @@ public class Citygml3FeatureMapper extends ObjectWalker { ...@@ -426,24 +415,14 @@ public class Citygml3FeatureMapper extends ObjectWalker {
} }
} }
} }
for (TunnelFurnitureProperty tfProp : gmlTunnel.getTunnelFurniture()) {
var gmlTf = tfProp.getObject();
if (gmlTf == null) {
continue;
}
TunnelFurniture tf = mapTunnelFurniture(gmlTf);
cdTunnel.addTunnelFurniture(tf);
}
for (TunnelConstructiveElementProperty teProp : gmlTunnel.getTunnelConstructiveElements()) {
var gmlTc = teProp.getObject(); cdTunnel.unsetGmlGeometries();
if (gmlTc == null) { resolveAndClearReferences();
continue; updateEdgesAndVertices(cdTunnel);
}
TunnelConstructiveElement tc = mapTunnelConstructiveElement(gmlTc);
cdTunnel.addTunnelConstructiveElement(tc);
} }
private void parseTunnelBoundarySurfaces(org.citygml4j.core.model.tunnel.AbstractTunnel gmlTunnel) {
SurfaceMapper surfaceMapper = new SurfaceMapper(polygonMap, references, compositeMap, vertexMap, config); SurfaceMapper surfaceMapper = new SurfaceMapper(polygonMap, references, compositeMap, vertexMap, config);
for (AbstractSpaceBoundaryProperty surfaceProp : gmlTunnel.getBoundaries()) { for (AbstractSpaceBoundaryProperty surfaceProp : gmlTunnel.getBoundaries()) {
if (!surfaceProp.isSetObject()) { if (!surfaceProp.isSetObject()) {
...@@ -458,11 +437,51 @@ public class Citygml3FeatureMapper extends ObjectWalker { ...@@ -458,11 +437,51 @@ public class Citygml3FeatureMapper extends ObjectWalker {
updateEdgesAndVertices(o); updateEdgesAndVertices(o);
} }
} }
}
private void parseTunnelConstructiveElements(org.citygml4j.core.model.tunnel.AbstractTunnel gmlTunnel, AbstractTunnel cdTunnel) {
for (TunnelConstructiveElementProperty teProp : gmlTunnel.getTunnelConstructiveElements()) {
var gmlTc = teProp.getObject();
if (gmlTc == null) {
continue;
}
TunnelConstructiveElement tc = mapTunnelConstructiveElement(gmlTc);
cdTunnel.addTunnelConstructiveElement(tc);
}
}
cdTunnel.unsetGmlGeometries(); private void parseTunnelFurniture(org.citygml4j.core.model.tunnel.AbstractTunnel gmlTunnel, AbstractTunnel cdTunnel) {
resolveAndClearReferences(); for (TunnelFurnitureProperty tfProp : gmlTunnel.getTunnelFurniture()) {
updateEdgesAndVertices(cdTunnel); var gmlTf = tfProp.getObject();
if (gmlTf == null) {
continue;
}
TunnelFurniture tf = mapTunnelFurniture(gmlTf);
cdTunnel.addTunnelFurniture(tf);
}
}
private void parseHollowSpaces(org.citygml4j.core.model.tunnel.AbstractTunnel gmlTunnel, AbstractTunnel cdTunnel) {
for (HollowSpaceProperty thProp : gmlTunnel.getHollowSpaces()) {
var gmlTh = thProp.getObject();
if (gmlTh == null) {
continue;
}
TunnelHollow br = mapTunnelHollow(gmlTh);
cdTunnel.addTunnelHollow(br);
}
}
private void parseTunnelInstallations(org.citygml4j.core.model.tunnel.AbstractTunnel gmlTunnel, AbstractTunnel cdTunnel) {
for (TunnelInstallationProperty tiProp : gmlTunnel.getTunnelInstallations()) {
var gmlTi = tiProp.getObject();
if (gmlTi == null) {
// ignore empty properties
continue;
}
Installation ti = mapTunnelInstallation(gmlTi);
cdTunnel.addTunnelInstallation(ti);
}
} }
private Installation mapTunnelInstallation(TunnelInstallation gmlTi) { private Installation mapTunnelInstallation(TunnelInstallation gmlTi) {
...@@ -567,7 +586,8 @@ public class Citygml3FeatureMapper extends ObjectWalker { ...@@ -567,7 +586,8 @@ public class Citygml3FeatureMapper extends ObjectWalker {
return tf; return tf;
} }
private TunnelConstructiveElement mapTunnelConstructiveElement(org.citygml4j.core.model.tunnel.TunnelConstructiveElement gmlTe) { private TunnelConstructiveElement mapTunnelConstructiveElement(
org.citygml4j.core.model.tunnel.TunnelConstructiveElement gmlTe) {
TunnelConstructiveElement te = new TunnelConstructiveElement(gmlTe); TunnelConstructiveElement te = new TunnelConstructiveElement(gmlTe);
mapAbstractOccupiedSpace(gmlTe, te); mapAbstractOccupiedSpace(gmlTe, te);
te.unsetGmlGeometries(); te.unsetGmlGeometries();
...@@ -601,7 +621,8 @@ public class Citygml3FeatureMapper extends ObjectWalker { ...@@ -601,7 +621,8 @@ public class Citygml3FeatureMapper extends ObjectWalker {
} }
} }
private void mapConstructiveElement(org.citygml4j.core.model.bridge.BridgeConstructiveElement ele, BridgeConstructiveElement bce) { private void mapConstructiveElement(org.citygml4j.core.model.bridge.BridgeConstructiveElement ele,
BridgeConstructiveElement bce) {
mapAbstractConstructiveElement(ele, bce); mapAbstractConstructiveElement(ele, bce);
SurfaceMapper surfaceMapper = new SurfaceMapper(polygonMap, references, compositeMap, vertexMap, config); SurfaceMapper surfaceMapper = new SurfaceMapper(polygonMap, references, compositeMap, vertexMap, config);
...@@ -617,7 +638,8 @@ public class Citygml3FeatureMapper extends ObjectWalker { ...@@ -617,7 +638,8 @@ public class Citygml3FeatureMapper extends ObjectWalker {
} }
} }
private void mapAbstractConstructiveElement(org.citygml4j.core.model.bridge.BridgeConstructiveElement ele, BridgeConstructiveElement bce) { private void mapAbstractConstructiveElement(org.citygml4j.core.model.bridge.BridgeConstructiveElement ele,
BridgeConstructiveElement bce) {
mapAbstractOccupiedSpace(ele, bce); mapAbstractOccupiedSpace(ele, bce);
} }
...@@ -782,21 +804,18 @@ public class Citygml3FeatureMapper extends ObjectWalker { ...@@ -782,21 +804,18 @@ public class Citygml3FeatureMapper extends ObjectWalker {
} }
} }
private void parseAndAddCompositeSurface(MultiSurfaceProperty ms, Lod lod, CityObject co) { // private void parseAndAddCompositeSurface(MultiSurfaceProperty ms, Lod lod, CityObject co) {
if (ms == null || ms.getObject() == null) { // if (ms == null || ms.getObject() == null) {
return; // return;
} // }
List<SurfaceProperty> surfaces = ms.getObject().getSurfaceMember(); // List<SurfaceProperty> surfaces = ms.getObject().getSurfaceMember();
for (SurfaceProperty surface : surfaces) { // for (SurfaceProperty surface : surfaces) {
if (surface.getObject() instanceof CompositeSurface cs) { // if (surface.getObject() instanceof CompositeSurface cs) {
Geometry geom = parseCompositeSurface(cs, lod); // Geometry geom = parseCompositeSurface(cs, lod);
if (geom != null) { // co.addGeometry(geom);
co.addGeometry(geom); // }
} // }
} // }
}
}
private void parseImplicitGeometry(AbstractOccupiedSpace aos, CityObject co) { private void parseImplicitGeometry(AbstractOccupiedSpace aos, CityObject co) {
for (int i = 1; i <= 3; i++) { for (int i = 1; i <= 3; i++) {
...@@ -811,10 +830,10 @@ public class Citygml3FeatureMapper extends ObjectWalker { ...@@ -811,10 +830,10 @@ public class Citygml3FeatureMapper extends ObjectWalker {
} }
} else if (aos.getImplicitRepresentation(i).getHref() != null) { } else if (aos.getImplicitRepresentation(i).getHref() != null) {
// Hrefs of ImplicitGeometries point to its RelativeGeometry. // Hrefs of ImplicitGeometries point to its RelativeGeometry.
// Can be ignored for CD since the Href is only used for repeating the RelativeGeometry at different LODs // Can be ignored for CD since the Href is only used for repeating the
// RelativeGeometry at different LODs
} }
} }
} }
...@@ -845,7 +864,7 @@ public class Citygml3FeatureMapper extends ObjectWalker { ...@@ -845,7 +864,7 @@ public class Citygml3FeatureMapper extends ObjectWalker {
} }
} else { } else {
logger.error(String.format("Implicit geometry of GML-ID %s has no referenced geometry.", ig.getId())); logger.error("Implicit geometry of GML-ID {} has no referenced geometry.", ig.getId());
} }
return igh; return igh;
} }
...@@ -859,8 +878,20 @@ public class Citygml3FeatureMapper extends ObjectWalker { ...@@ -859,8 +878,20 @@ public class Citygml3FeatureMapper extends ObjectWalker {
Geometry geom = ref.geometry(); Geometry geom = ref.geometry();
CompositeCollection comp = compositeMap.get(href); CompositeCollection comp = compositeMap.get(href);
if (comp != null) { if (comp != null) {
// composite collection, add each containing polygon to the geometry
comp.getCompositeMembers().forEach(geom::addPolygon); comp.getCompositeMembers().forEach(geom::addPolygon);
} else { } else {
handlePolygonReference(href, geom);
}
}
// clear storage for polygons and vertices
references = new ArrayList<>();
vertexMap = new HashMap<>();
polygonMap = new HashMap<>();
}
private void handlePolygonReference(String href, Geometry geom) {
ConcretePolygon concPoly = polygonMap.get(href); ConcretePolygon concPoly = polygonMap.get(href);
if (concPoly == null) { if (concPoly == null) {
if (logger.isWarnEnabled()) { if (logger.isWarnEnabled()) {
...@@ -877,14 +908,6 @@ public class Citygml3FeatureMapper extends ObjectWalker { ...@@ -877,14 +908,6 @@ public class Citygml3FeatureMapper extends ObjectWalker {
geom.addPolygon(lPoly); geom.addPolygon(lPoly);
} }
} }
}
// clear storage for polygons and vertices
// probably faster than .clear() ?
references = new ArrayList<>();
vertexMap = new HashMap<>();
polygonMap = new HashMap<>();
}
private void readAbstractBuilding(org.citygml4j.core.model.building.AbstractBuilding gmlAb, private void readAbstractBuilding(org.citygml4j.core.model.building.AbstractBuilding gmlAb,
AbstractBuilding cdBuilding) { AbstractBuilding cdBuilding) {
...@@ -896,25 +919,47 @@ public class Citygml3FeatureMapper extends ObjectWalker { ...@@ -896,25 +919,47 @@ public class Citygml3FeatureMapper extends ObjectWalker {
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);
for (BuildingInstallationProperty biProp : gmlAb.getBuildingInstallations()) { parseBuildingInstallations(gmlAb, cdBuilding);
var gmlBi = biProp.getObject(); parseBuildingRooms(gmlAb, cdBuilding);
if (gmlBi == null) { parseBuildingSubdivisions(gmlAb, cdBuilding);
// ignore empty properties parseBoundarySurfaces(gmlAb, cdBuilding);
parseBuildingFurniture(gmlAb, cdBuilding);
}
private void parseBuildingFurniture(org.citygml4j.core.model.building.AbstractBuilding gmlAb, AbstractBuilding cdBuilding) {
for (BuildingFurnitureProperty bfProp : gmlAb.getBuildingFurniture()) {
var gmlBf = bfProp.getObject();
if (gmlBf == null) {
continue; continue;
} }
Installation bi = mapBuildingInstallation(gmlBi); BuildingRoomFurniture bf = mapBuildingFurniture(gmlBf);
cdBuilding.addBuildingInstallation(bi); cdBuilding.addBuildingRoomFurniture(bf);
}
} }
for (BuildingRoomProperty brProp : gmlAb.getBuildingRooms()) { private void parseBoundarySurfaces(org.citygml4j.core.model.building.AbstractBuilding gmlAb, AbstractBuilding cdBuilding) {
var gmlBr = brProp.getObject(); SurfaceMapper surfaceMapper = new SurfaceMapper(polygonMap, references, compositeMap, vertexMap, config);
if (gmlBr == null) { for (AbstractSpaceBoundaryProperty surfaceProp : gmlAb.getBoundaries()) {
if (!surfaceProp.isSetObject()) {
continue; continue;
} }
BuildingRoom br = mapBuildingRoom(gmlBr); AbstractSpaceBoundary surface = surfaceProp.getObject();
cdBuilding.addBuildingRoom(br); surface.accept(surfaceMapper);
} }
updatePartOfSurface(cdBuilding, surfaceMapper);
cdBuilding.unsetGmlGeometries();
resolveAndClearReferences();
updateEdgesAndVertices(cdBuilding);
for (BoundarySurface bs : surfaceMapper.getSurfaces()) {
updateEdgesAndVertices(bs);
for (Opening o : bs.getOpenings()) {
updateEdgesAndVertices(o);
}
}
}
private void parseBuildingSubdivisions(org.citygml4j.core.model.building.AbstractBuilding gmlAb, AbstractBuilding cdBuilding) {
for (AbstractBuildingSubdivisionProperty abs : gmlAb.getBuildingSubdivisions()) { for (AbstractBuildingSubdivisionProperty abs : gmlAb.getBuildingSubdivisions()) {
var gmlABS = abs.getObject(); var gmlABS = abs.getObject();
if (gmlABS == null) { if (gmlABS == null) {
...@@ -928,25 +973,28 @@ public class Citygml3FeatureMapper extends ObjectWalker { ...@@ -928,25 +973,28 @@ public class Citygml3FeatureMapper extends ObjectWalker {
cdBuilding.addBuildingUnit(bu); cdBuilding.addBuildingUnit(bu);
} }
} }
}
SurfaceMapper surfaceMapper = new SurfaceMapper(polygonMap, references, compositeMap, vertexMap, config); private void parseBuildingRooms(org.citygml4j.core.model.building.AbstractBuilding gmlAb, AbstractBuilding cdBuilding) {
for (AbstractSpaceBoundaryProperty surfaceProp : gmlAb.getBoundaries()) { for (BuildingRoomProperty brProp : gmlAb.getBuildingRooms()) {
if (!surfaceProp.isSetObject()) { var gmlBr = brProp.getObject();
if (gmlBr == null) {
continue; continue;
} }
AbstractSpaceBoundary surface = surfaceProp.getObject(); BuildingRoom br = mapBuildingRoom(gmlBr);
surface.accept(surfaceMapper); cdBuilding.addBuildingRoom(br);
}
} }
updatePartOfSurface(cdBuilding, surfaceMapper);
cdBuilding.unsetGmlGeometries(); private void parseBuildingInstallations(org.citygml4j.core.model.building.AbstractBuilding gmlAb, AbstractBuilding cdBuilding) {
resolveAndClearReferences(); for (BuildingInstallationProperty biProp : gmlAb.getBuildingInstallations()) {
updateEdgesAndVertices(cdBuilding); var gmlBi = biProp.getObject();
for (BoundarySurface bs : surfaceMapper.getSurfaces()) { if (gmlBi == null) {
updateEdgesAndVertices(bs); // ignore empty properties
for (Opening o : bs.getOpenings()) { continue;
updateEdgesAndVertices(o);
} }
Installation bi = mapBuildingInstallation(gmlBi);
cdBuilding.addBuildingInstallation(bi);
} }
for (Installation bi : cdBuilding.getBuildingInstallations()) { for (Installation bi : cdBuilding.getBuildingInstallations()) {
updateEdgesAndVertices(bi); updateEdgesAndVertices(bi);
...@@ -957,14 +1005,6 @@ public class Citygml3FeatureMapper extends ObjectWalker { ...@@ -957,14 +1005,6 @@ public class Citygml3FeatureMapper extends ObjectWalker {
} }
} }
} }
for (BuildingFurnitureProperty bfProp : gmlAb.getBuildingFurniture()) {
var gmlBf = bfProp.getObject();
if (gmlBf == null) {
continue;
}
BuildingRoomFurniture bf = mapBuildingFurniture(gmlBf);
cdBuilding.addBuildingRoomFurniture(bf);
}
} }
private BuildingRoom mapBuildingRoom(org.citygml4j.core.model.building.BuildingRoom gmlBr) { private BuildingRoom mapBuildingRoom(org.citygml4j.core.model.building.BuildingRoom gmlBr) {
...@@ -1006,7 +1046,6 @@ public class Citygml3FeatureMapper extends ObjectWalker { ...@@ -1006,7 +1046,6 @@ public class Citygml3FeatureMapper extends ObjectWalker {
br.addFurnitureRef(bfProp); br.addFurnitureRef(bfProp);
} }
return br; return br;
} }
......
...@@ -31,7 +31,6 @@ import java.util.concurrent.atomic.AtomicInteger; ...@@ -31,7 +31,6 @@ import java.util.concurrent.atomic.AtomicInteger;
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.core.AbstractCityObjectProperty; import org.citygml4j.core.model.core.AbstractCityObjectProperty;
import org.citygml4j.core.model.core.AbstractFeatureProperty; import org.citygml4j.core.model.core.AbstractFeatureProperty;
import org.citygml4j.core.model.core.CityModel; import org.citygml4j.core.model.core.CityModel;
......
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"> <project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0">
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<parent> <parent>
<groupId>de.hft.stuttgart</groupId> <groupId>de.hft.stuttgart</groupId>
......
...@@ -65,23 +65,19 @@ public class SvrlContentHandler implements ContentHandler { ...@@ -65,23 +65,19 @@ public class SvrlContentHandler implements ContentHandler {
public void setDocumentLocator(Locator locator) { public void setDocumentLocator(Locator locator) {
// not needed // not needed
} }
@SuppressWarnings("RedundantThrows")
@Override @Override
public void startDocument() throws SAXException { public void startDocument() throws SAXException {
// not needed // not needed
} }
@SuppressWarnings("RedundantThrows")
@Override @Override
public void endDocument() throws SAXException { public void endDocument() throws SAXException {
// not needed // not needed
} }
@SuppressWarnings("RedundantThrows")
@Override @Override
public void startPrefixMapping(String prefix, String uri) throws SAXException { public void startPrefixMapping(String prefix, String uri) throws SAXException {
// not needed // not needed
} }
@SuppressWarnings("RedundantThrows")
@Override @Override
public void endPrefixMapping(String prefix) throws SAXException { public void endPrefixMapping(String prefix) throws SAXException {
// not needed // not needed
...@@ -133,17 +129,14 @@ public class SvrlContentHandler implements ContentHandler { ...@@ -133,17 +129,14 @@ public class SvrlContentHandler implements ContentHandler {
buffer.append(ch, start, length); buffer.append(ch, start, length);
} }
} }
@SuppressWarnings("RedundantThrows")
@Override @Override
public void ignorableWhitespace(char[] ch, int start, int length) throws SAXException { public void ignorableWhitespace(char[] ch, int start, int length) throws SAXException {
// not needed // not needed
} }
@SuppressWarnings("RedundantThrows")
@Override @Override
public void processingInstruction(String target, String data) throws SAXException { public void processingInstruction(String target, String data) throws SAXException {
// not needed // not needed
} }
@SuppressWarnings("RedundantThrows")
@Override @Override
public void skippedEntity(String name) throws SAXException { public void skippedEntity(String name) throws SAXException {
// not needed // not needed
......
...@@ -27,19 +27,16 @@ import de.hft.stuttgart.citydoctor2.check.Check; ...@@ -27,19 +27,16 @@ import de.hft.stuttgart.citydoctor2.check.Check;
import de.hft.stuttgart.citydoctor2.check.CheckError; 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.RequirementType;
import de.hft.stuttgart.citydoctor2.check.GeometrySelfIntersection; import de.hft.stuttgart.citydoctor2.check.GeometrySelfIntersection;
import de.hft.stuttgart.citydoctor2.check.Requirement; import de.hft.stuttgart.citydoctor2.check.Requirement;
import de.hft.stuttgart.citydoctor2.check.RequirementType;
import de.hft.stuttgart.citydoctor2.check.ResultStatus; import de.hft.stuttgart.citydoctor2.check.ResultStatus;
import de.hft.stuttgart.citydoctor2.check.error.SolidSelfIntError; import de.hft.stuttgart.citydoctor2.check.error.SolidSelfIntError;
import de.hft.stuttgart.citydoctor2.checks.util.CollectionUtils; import de.hft.stuttgart.citydoctor2.checks.util.CollectionUtils;
import de.hft.stuttgart.citydoctor2.checks.util.SelfIntersectionUtil; import de.hft.stuttgart.citydoctor2.checks.util.SelfIntersectionUtil;
import de.hft.stuttgart.citydoctor2.datastructure.ConcretePolygon;
import de.hft.stuttgart.citydoctor2.datastructure.Geometry; 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.math.Segment3d;
import de.hft.stuttgart.citydoctor2.utils.PolygonIntersection; import de.hft.stuttgart.citydoctor2.utils.PolygonIntersection;
import de.hft.stuttgart.citydoctor2.utils.PolygonIntersection.IntersectionType;
/** /**
* Check for self intersecting solids * Check for self intersecting solids
......
...@@ -160,6 +160,7 @@ public class CityDoctorController { ...@@ -160,6 +160,7 @@ public class CityDoctorController {
buildLand(model); buildLand(model);
buildCityFurniture(model); buildCityFurniture(model);
buildOtherCityObjects(model); buildOtherCityObjects(model);
buildTunnel(model.getTunnels());
} }
private void resetFeatureChunks() { private void resetFeatureChunks() {
......
package de.hft.stuttgart.citydoctor2.gui.tree; package de.hft.stuttgart.citydoctor2.gui.tree;
import de.hft.stuttgart.citydoctor2.datastructure.AbstractRoom;
import de.hft.stuttgart.citydoctor2.datastructure.CityFurniture; import de.hft.stuttgart.citydoctor2.datastructure.CityFurniture;
import de.hft.stuttgart.citydoctor2.gui.CheckStatus; import de.hft.stuttgart.citydoctor2.gui.CheckStatus;
import de.hft.stuttgart.citydoctor2.gui.Renderer; import de.hft.stuttgart.citydoctor2.gui.Renderer;
......
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
<?import javafx.scene.control.*?> <?import javafx.scene.control.*?>
<?import javafx.scene.image.*?> <?import javafx.scene.image.*?>
<?import javafx.scene.layout.*?> <?import javafx.scene.layout.*?>
<HBox maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" spacing="5.0" xmlns="http://javafx.com/javafx/22" xmlns:fx="http://javafx.com/fxml/1"> <HBox maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" spacing="5.0" xmlns="http://javafx.com/javafx/17" xmlns:fx="http://javafx.com/fxml/1">
<children> <children>
<HBox spacing="5.0" HBox.hgrow="NEVER"> <HBox spacing="5.0" HBox.hgrow="NEVER">
<children> <children>
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
<?import javafx.geometry.*?> <?import javafx.geometry.*?>
<?import javafx.scene.control.*?> <?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?> <?import javafx.scene.layout.*?>
<BorderPane fx:id="mainPane" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" minHeight="400.0" minWidth="400.0" xmlns="http://javafx.com/javafx/22" xmlns:fx="http://javafx.com/fxml/1"> <BorderPane fx:id="mainPane" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" minHeight="400.0" minWidth="400.0" xmlns="http://javafx.com/javafx/17" xmlns:fx="http://javafx.com/fxml/1">
<center> <center>
<SplitPane fx:id="mainContainer" dividerPositions="0.47069431920649235" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" minWidth="300.0" prefHeight="600.0" prefWidth="1100.0"> <SplitPane fx:id="mainContainer" dividerPositions="0.47069431920649235" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" minWidth="300.0" prefHeight="600.0" prefWidth="1100.0">
<items> <items>
......
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"> <project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0">
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<parent> <parent>
<groupId>de.hft.stuttgart</groupId> <groupId>de.hft.stuttgart</groupId>
......
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" <project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0">
>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<groupId>de.hft.stuttgart</groupId> <groupId>de.hft.stuttgart</groupId>
<artifactId>CityDoctorParent</artifactId> <artifactId>CityDoctorParent</artifactId>
......
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