From 3fe565d861bdc6c8e71218ffbab3bbae9fdecdde Mon Sep 17 00:00:00 2001 From: Riegel <alexander.riegel@hft-stuttgart.de> Date: Tue, 29 Oct 2024 10:34:07 +0100 Subject: [PATCH] Fix Bugs in parsing and rendering of CompositeSurfaces --- .../datastructure/CompositePolygon.java | 94 ++----------------- .../citygml3/Citygml3FeatureMapper.java | 10 +- .../CityDoctorLocalization.properties | 2 +- .../CityDoctorLocalization_de.properties | 2 +- .../stuttgart/citydoctor2/gui/Renderer.java | 4 + .../citydoctor2/gui/TriangulatedGeometry.java | 15 +-- 6 files changed, 22 insertions(+), 105 deletions(-) diff --git a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/CompositePolygon.java b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/CompositePolygon.java index f1d1463..20614c4 100644 --- a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/CompositePolygon.java +++ b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/CompositePolygon.java @@ -14,9 +14,9 @@ import java.io.Serial; import java.util.*; /** - * + * Dataholding class for parsing and resolving of CompositeSurfaces. */ -public class CompositePolygon extends ConcretePolygon{ +public final class CompositePolygon extends ConcretePolygon{ @Serial private static final long serialVersionUID = -1867197873443341287L; @@ -25,20 +25,14 @@ public class CompositePolygon extends ConcretePolygon{ private BoundarySurface partOfSurface; private Installation partOfInstallation; private List<ConcretePolygon> compositeMembers = new ArrayList<>(); - private LinearRing exterior = null; @Override public Vector3d calculateNormalNormalized() { - return this.calculateNormal().normalize(); + return null; } @Override - public void accept(Check c){ - for (Polygon p : compositeMembers){ - p.accept(c); - } - setValidated(true); - } + public void accept(Check c){} @Override public Class<? extends Checkable> getCheckClass() { @@ -47,33 +41,17 @@ public class CompositePolygon extends ConcretePolygon{ @Override public boolean containsAnyError(){ - if (super.containsAnyError()){ - return true; - } - for (Polygon p : compositeMembers){ - if (p.containsAnyError()){ - return true; - } - } return false; } @Override - public void collectContainedErrors(List<CheckError> errors) { - super.collectContainedErrors(errors); - for (Polygon p : compositeMembers){ - p.collectContainedErrors(errors); - } - } + public void collectContainedErrors(List<CheckError> errors) {} @Override public void clearAllContainedCheckResults() { - super.clearCheckResults(); - for (Polygon p : compositeMembers){ - p.clearAllContainedCheckResults(); - } } + public void addCompositeMember(ConcretePolygon p){ compositeMembers.add(p); } @@ -84,15 +62,6 @@ public class CompositePolygon extends ConcretePolygon{ @Override public boolean containsError(CheckId checkIdentifier) { - boolean hasError = super.containsError(checkIdentifier); - if (hasError) { - return true; - } - for (Polygon p : compositeMembers){ - if (p.containsError(checkIdentifier)) { - return true; - } - } return false; } @@ -100,59 +69,27 @@ public class CompositePolygon extends ConcretePolygon{ @Override public Vector3d calculateNormal() { - return this.getExteriorRing().calculateNormal(); + return compositeMembers.get(0).calculateNormal(); } @Override public TesselatedPolygon tesselate() { List<Triangle3d> tessPolys = new ArrayList<>(); - for (Polygon p : compositeMembers){ - TesselatedPolygon t = p.tesselate(); - tessPolys.addAll(t.getTriangles()); - } return new TesselatedPolygon(tessPolys,this ); } @Override public LinearRing getExteriorRing() { - if( exterior != null ){ - return exterior; - } - Map<Vertex, Integer> outerVertices = new HashMap<>(); - for (Polygon p : compositeMembers){ - for (Vertex v: p.getExteriorRing().getVertices()){ - outerVertices.merge(v, 1, Integer::sum); - } - } - List<Vertex> vertices = new ArrayList<>(); - for (Vertex v : outerVertices.keySet()){ - if (outerVertices.get(v) <= 3){ - vertices.add(v); - } - } - LinearRing ext = new LinearRing(LinearRing.LinearRingType.EXTERIOR); - ext.setParent(this); - ext.addAllVertices(vertices); - exterior = ext; - return ext; + return new LinearRing(LinearRing.LinearRingType.EXTERIOR); } @Override public List<LinearRing> getInnerRings() { - List<LinearRing> innerRings = new ArrayList<>(); - for (Polygon p : compositeMembers){ - innerRings.addAll(p.getInnerRings()); - } - return innerRings; + return Collections.emptyList(); } @Override public boolean isPointInsideExteriorRing(Vector3d v) { - for (Polygon p : compositeMembers) { - if (p.isPointInsideExteriorRing(v)) { - return true; - } - } return false; } @@ -173,11 +110,6 @@ public class CompositePolygon extends ConcretePolygon{ @Override public boolean isPolygonConnectedViaPoint(Polygon other) { - for (Polygon p : compositeMembers) { - if (p.isPolygonConnectedViaPoint(other)) { - return true; - } - } return false; } @@ -198,9 +130,6 @@ public class CompositePolygon extends ConcretePolygon{ @Override public void removeInnerRing(LinearRing ring) { - for (Polygon p : compositeMembers) { - p.removeInnerRing(ring); - } } @Override @@ -215,11 +144,6 @@ public class CompositePolygon extends ConcretePolygon{ @Override public boolean hasPointAsCorner(Vertex v) { - for (Polygon p : compositeMembers){ - if (p.hasPointAsCorner(v)) { - return true; - } - } return false; } diff --git a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/mapper/citygml3/Citygml3FeatureMapper.java b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/mapper/citygml3/Citygml3FeatureMapper.java index 7d76985..c4121b0 100644 --- a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/mapper/citygml3/Citygml3FeatureMapper.java +++ b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/mapper/citygml3/Citygml3FeatureMapper.java @@ -239,9 +239,6 @@ public class Citygml3FeatureMapper extends ObjectWalker { parseAndAddMultiSurface(as.getLod0MultiSurface(), Lod.LOD0, co); parseAndAddMultiSurface(as.getLod2MultiSurface(), Lod.LOD2, co); parseAndAddMultiSurface(as.getLod3MultiSurface(), Lod.LOD3, co); - parseAndAddCompositeSurface(as.getLod0MultiSurface(), Lod.LOD0, co); - parseAndAddCompositeSurface(as.getLod2MultiSurface(), Lod.LOD2, co); - parseAndAddCompositeSurface(as.getLod3MultiSurface(), Lod.LOD3, co); parseAndAddSolid(as.getLod1Solid(), Lod.LOD1, co); parseAndAddSolid(as.getLod2Solid(), Lod.LOD2, co); parseAndAddSolid(as.getLod3Solid(), Lod.LOD3, co); @@ -718,9 +715,6 @@ public class Citygml3FeatureMapper extends ObjectWalker { parseAndAddMultiSurface(as.getLod0MultiSurface(), Lod.LOD0, co); parseAndAddMultiSurface(as.getLod2MultiSurface(), Lod.LOD2, co); parseAndAddMultiSurface(as.getLod3MultiSurface(), Lod.LOD3, co); - parseAndAddCompositeSurface(as.getLod0MultiSurface(), Lod.LOD0, co); - parseAndAddCompositeSurface(as.getLod2MultiSurface(), Lod.LOD2, co); - parseAndAddCompositeSurface(as.getLod3MultiSurface(), Lod.LOD3, co); parseAndAddSolid(as.getLod1Solid(), Lod.LOD1, co); parseAndAddSolid(as.getLod2Solid(), Lod.LOD2, co); parseAndAddSolid(as.getLod3Solid(), Lod.LOD3, co); @@ -826,7 +820,6 @@ public class Citygml3FeatureMapper extends ObjectWalker { } continue; } - // TODO: Insert handling of compPoly dummy objects if (concPoly instanceof CompositePolygon comp) { resolveCompositePolygon(comp).forEach(geom::addPolygon); } else { @@ -1201,6 +1194,9 @@ public class Citygml3FeatureMapper extends ObjectWalker { for (Geometry geom : co.getGeometries()) { KDTree tree = new KDTree(); for (Polygon poly : geom.getPolygons()) { + if (poly instanceof CompositePolygon){ + continue; + } LinearRing lr = poly.getExteriorRing(); updateRing(tree, lr); for (LinearRing innerRing : poly.getInnerRings()) { diff --git a/CityDoctorParent/CityDoctorModel/src/main/resources/CityDoctorLocalization.properties b/CityDoctorParent/CityDoctorModel/src/main/resources/CityDoctorLocalization.properties index 410abe0..4b663e4 100644 --- a/CityDoctorParent/CityDoctorModel/src/main/resources/CityDoctorLocalization.properties +++ b/CityDoctorParent/CityDoctorModel/src/main/resources/CityDoctorLocalization.properties @@ -31,7 +31,7 @@ MainToolBar.writeReports=Write Reports MainToolBar.executeChecks=Execute Checks MainToolBar.showWorld=Show entire city model MainToolBar.resetCamera=Reset view -MainToolBar.hideRoof=Show/Hide roofs in object view +MainToolBar.hideRoof=Show/Hide roof BoundarySurfaces MainWindow.missingConfig=Could not find configuration file. MainWindow.loadGivenFile=Loading given file, please wait MainWindow.finishedLoading=Finished loading diff --git a/CityDoctorParent/CityDoctorModel/src/main/resources/CityDoctorLocalization_de.properties b/CityDoctorParent/CityDoctorModel/src/main/resources/CityDoctorLocalization_de.properties index 7e1ce1b..f804aec 100644 --- a/CityDoctorParent/CityDoctorModel/src/main/resources/CityDoctorLocalization_de.properties +++ b/CityDoctorParent/CityDoctorModel/src/main/resources/CityDoctorLocalization_de.properties @@ -29,7 +29,7 @@ MainToolBar.writeReports=Schreibe Reports MainToolBar.executeChecks=F\u00fchre Pr\u00fcfungen aus MainToolBar.showWorld=Gesamtes Stadtmodell anzeigen MainToolBar.resetCamera=Ansicht zur\u00fccksetzen -MainToolBar.hideRoof=Zeige/Verstecke D\u00e4cher in Objektansicht +MainToolBar.hideRoof=Zeige/Verstecke Dach BoundarySurfaces MainWindow.missingConfig=Konnte Konfigurationsdatei nicht finden. MainWindow.loadGivenFile=Lade vorhandene Datei, bitte warten MainWindow.finishedLoading=Fertig geladen diff --git a/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/Renderer.java b/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/Renderer.java index 752d7bd..7181255 100644 --- a/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/Renderer.java +++ b/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/Renderer.java @@ -669,6 +669,9 @@ public class Renderer { private void addGeometryDataToView(Geometry geom) { for (Polygon p : geom.getPolygons()) { + if (p instanceof CompositePolygon){ + continue; + } addPolygonToView(p); } for (Edge e : geom.getEdges()) { @@ -979,6 +982,7 @@ public class Renderer { for (Polygon p : geom.getPolygons()) { if (p.getOriginal().getPartOfSurface() != null && !roofFilter.allowedToUse(p.getOriginal().getPartOfSurface(), p.getParent())) continue; + if (p instanceof CompositePolygon) continue; polygons.add(p.getOriginal()); } } diff --git a/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/TriangulatedGeometry.java b/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/TriangulatedGeometry.java index ec6788f..e519d98 100644 --- a/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/TriangulatedGeometry.java +++ b/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/TriangulatedGeometry.java @@ -6,17 +6,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; -import de.hft.stuttgart.citydoctor2.datastructure.BoundarySurface; -import de.hft.stuttgart.citydoctor2.datastructure.BoundarySurfaceType; -import de.hft.stuttgart.citydoctor2.datastructure.Building; -import de.hft.stuttgart.citydoctor2.datastructure.Installation; -import de.hft.stuttgart.citydoctor2.datastructure.BuildingPart; -import de.hft.stuttgart.citydoctor2.datastructure.CityDoctorModel; -import de.hft.stuttgart.citydoctor2.datastructure.CityObject; -import de.hft.stuttgart.citydoctor2.datastructure.Geometry; -import de.hft.stuttgart.citydoctor2.datastructure.Opening; -import de.hft.stuttgart.citydoctor2.datastructure.OpeningType; -import de.hft.stuttgart.citydoctor2.datastructure.Polygon; +import de.hft.stuttgart.citydoctor2.datastructure.*; import de.hft.stuttgart.citydoctor2.gui.filter.ViewFilter; import de.hft.stuttgart.citydoctor2.math.Triangle3d; import de.hft.stuttgart.citydoctor2.math.UnitVector3d; @@ -62,6 +52,9 @@ public class TriangulatedGeometry { private static void addPolygonDataToTriGeom(Collection<? extends Polygon> polygons, Color basePolygonColor, TriangulatedGeometry triGeom) { for (Polygon p : polygons) { + if (p instanceof CompositePolygon){ + continue; + } TesselatedPolygon tp = p.tesselate(); TriangleMesh triMesh = new TriangleMesh(VertexFormat.POINT_TEXCOORD); Map<Vector3d, Integer> indexMap = new HashMap<>(); -- GitLab