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