From a6da32828e2cf545e011d82dfee60f5ba59d6751 Mon Sep 17 00:00:00 2001
From: Riegel <alexander.riegel@hft-stuttgart.de>
Date: Tue, 29 Oct 2024 13:04:14 +0100
Subject: [PATCH] Fix ImplicitGeometry double saving Geometry on export

---
 .../stuttgart/citydoctor2/datastructure/AbstractBuilding.java  | 3 +++
 .../citydoctor2/datastructure/AbstractBuildingSubdivision.java | 3 +++
 .../stuttgart/citydoctor2/datastructure/AbstractFurniture.java | 3 +++
 .../hft/stuttgart/citydoctor2/datastructure/AbstractRoom.java  | 3 +++
 .../stuttgart/citydoctor2/datastructure/AbstractTunnel.java    | 3 +++
 .../stuttgart/citydoctor2/datastructure/BoundarySurface.java   | 3 +++
 .../citydoctor2/datastructure/BridgeConstructiveElement.java   | 3 +++
 .../hft/stuttgart/citydoctor2/datastructure/BridgeObject.java  | 3 +++
 .../hft/stuttgart/citydoctor2/datastructure/CityFurniture.java | 3 +++
 .../stuttgart/citydoctor2/datastructure/GenericCityObject.java | 3 +++
 .../citydoctor2/datastructure/TransportationObject.java        | 3 +++
 .../de/hft/stuttgart/citydoctor2/datastructure/Vegetation.java | 3 +++
 .../hft/stuttgart/citydoctor2/writer/CityGMLWriterUtils.java   | 1 +
 .../de/hft/stuttgart/citydoctor2/gui/CityDoctorController.java | 1 +
 14 files changed, 38 insertions(+)

diff --git a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/AbstractBuilding.java b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/AbstractBuilding.java
index 66a14b0..8bf25bb 100644
--- a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/AbstractBuilding.java
+++ b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/AbstractBuilding.java
@@ -114,6 +114,9 @@ public abstract class AbstractBuilding extends CityObject {
 	@Override
 	public void reCreateGeometries(GeometryFactory factory, ParserConfiguration config) {
 		for (Geometry geom : getGeometries()) {
+			if (geom instanceof ImplicitGeometryHolder){
+				continue;
+			}
 			if (geom.getType() == GeometryType.MULTI_SURFACE) {
 				MultiSurface ms = CityGmlUtils.createMultiSurface(geom, factory, config);
 				setMultiSurfaceAccordingToLod(geom, ms);
diff --git a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/AbstractBuildingSubdivision.java b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/AbstractBuildingSubdivision.java
index 5b5240b..64f743c 100644
--- a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/AbstractBuildingSubdivision.java
+++ b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/AbstractBuildingSubdivision.java
@@ -77,6 +77,9 @@ public abstract class AbstractBuildingSubdivision extends CityObject{
     @Override
     public void reCreateGeometries(GeometryFactory factory, ParserConfiguration config) {
         for (Geometry geom : getGeometries()) {
+            if (geom instanceof ImplicitGeometryHolder){
+                continue;
+            }
             if (geom.getType() == GeometryType.MULTI_SURFACE) {
                 MultiSurface ms = CityGmlUtils.createMultiSurface(geom, factory, config);
                 setMultiSurfaceAccordingToLod(geom, ms);
diff --git a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/AbstractFurniture.java b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/AbstractFurniture.java
index 139cd63..ff02ceb 100644
--- a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/AbstractFurniture.java
+++ b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/AbstractFurniture.java
@@ -105,6 +105,9 @@ public abstract class AbstractFurniture extends CityObject{
     @Override
     public void reCreateGeometries(GeometryFactory factory, ParserConfiguration config) {
         for (Geometry geom : getGeometries()) {
+            if (geom instanceof ImplicitGeometryHolder){
+                continue;
+            }
             if (geom.getType() == GeometryType.MULTI_SURFACE) {
                 MultiSurface ms = CityGmlUtils.createMultiSurface(geom, factory, config);
                 setMultiSurfaceAccordingToLod(geom, ms);
diff --git a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/AbstractRoom.java b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/AbstractRoom.java
index 48cc116..bd917a0 100644
--- a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/AbstractRoom.java
+++ b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/AbstractRoom.java
@@ -113,6 +113,9 @@ public abstract class AbstractRoom extends CityObject{
     @Override
     public void reCreateGeometries(GeometryFactory factory, ParserConfiguration config) {
         for (Geometry geom : getGeometries()) {
+            if (geom instanceof ImplicitGeometryHolder){
+                continue;
+            }
             if (geom.getType() == GeometryType.MULTI_SURFACE) {
                 MultiSurface ms = CityGmlUtils.createMultiSurface(geom, factory, config);
                 setMultiSurfaceAccordingToLod(geom, ms);
diff --git a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/AbstractTunnel.java b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/AbstractTunnel.java
index 02dc38f..e9aef29 100644
--- a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/AbstractTunnel.java
+++ b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/AbstractTunnel.java
@@ -84,6 +84,9 @@ public abstract class AbstractTunnel extends CityObject{
     @Override
     public void reCreateGeometries(GeometryFactory factory, ParserConfiguration config) {
         for (Geometry geom : getGeometries()) {
+            if (geom instanceof ImplicitGeometryHolder){
+                continue;
+            }
             if (geom.getType() == GeometryType.MULTI_SURFACE) {
                 MultiSurface ms = CityGmlUtils.createMultiSurface(geom, factory, config);
                 setMultiSurfaceAccordingToLod(geom, ms);
diff --git a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/BoundarySurface.java b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/BoundarySurface.java
index 13632eb..18c16ef 100644
--- a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/BoundarySurface.java
+++ b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/BoundarySurface.java
@@ -94,6 +94,9 @@ public class BoundarySurface extends CityObject {
 			gmlObject.setId(getGmlId().getGmlString());
 		}
 		for (Geometry geom : getGeometries()) {
+			if (geom instanceof ImplicitGeometryHolder){
+				continue;
+			}
 			if (geom.getType() == GeometryType.MULTI_SURFACE) {
 				MultiSurface ms = CityGmlUtils.createMultiSurface(geom, factory, config);
 				if (ms != null) {
diff --git a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/BridgeConstructiveElement.java b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/BridgeConstructiveElement.java
index 6a4bb82..ff5b075 100644
--- a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/BridgeConstructiveElement.java
+++ b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/BridgeConstructiveElement.java
@@ -70,6 +70,9 @@ public class BridgeConstructiveElement extends CityObject {
 		// unknown which CityGML is handled here
 		// need context information to decide
 		for (Geometry geom : getGeometries()) {
+			if (geom instanceof ImplicitGeometryHolder){
+				continue;
+			}
 			switch (geom.getType()) {
 			case SOLID:
 				Solid solid = CityGmlUtils.createSolid(geom, factory, config);
diff --git a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/BridgeObject.java b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/BridgeObject.java
index bf6acf6..18bf2e6 100644
--- a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/BridgeObject.java
+++ b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/BridgeObject.java
@@ -80,6 +80,9 @@ public class BridgeObject extends CityObject {
     @Override
     public void reCreateGeometries(GeometryFactory factory, ParserConfiguration config) {
         for (Geometry geom : getGeometries()) {
+            if (geom instanceof ImplicitGeometryHolder){
+                continue;
+            }
             if (geom.getType() == GeometryType.MULTI_SURFACE) {
                 MultiSurface ms = CityGmlUtils.createMultiSurface(geom, factory, config);
                 setMultiSurfaceAccordingToLod(geom, ms);
diff --git a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/CityFurniture.java b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/CityFurniture.java
index 27ea27e..144e2d1 100644
--- a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/CityFurniture.java
+++ b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/CityFurniture.java
@@ -53,6 +53,9 @@ public class CityFurniture extends CityObject{
     @Override
     public void reCreateGeometries(GeometryFactory factory, ParserConfiguration config) {
         for (Geometry geom : getGeometries()) {
+            if (geom instanceof ImplicitGeometryHolder){
+                continue;
+            }
             if (geom.getType() == GeometryType.MULTI_SURFACE) {
                 MultiSurface ms = CityGmlUtils.createMultiSurface(geom, factory, config);
                 setMultiSurfaceAccordingToLod(geom, ms);
diff --git a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/GenericCityObject.java b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/GenericCityObject.java
index 5bfe8d8..d60f774 100644
--- a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/GenericCityObject.java
+++ b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/GenericCityObject.java
@@ -49,6 +49,9 @@ public class GenericCityObject extends CityObject{
     @Override
     public void reCreateGeometries(GeometryFactory factory, ParserConfiguration config) {
         for (Geometry geom : getGeometries()) {
+            if (geom instanceof ImplicitGeometryHolder){
+                continue;
+            }
             if (geom.getType() == GeometryType.MULTI_SURFACE) {
                 MultiSurface ms = CityGmlUtils.createMultiSurface(geom, factory, config);
                 setMultiSurfaceAccordingToLod(geom, ms);
diff --git a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/TransportationObject.java b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/TransportationObject.java
index d3020ea..5b97c57 100644
--- a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/TransportationObject.java
+++ b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/TransportationObject.java
@@ -70,6 +70,9 @@ public class TransportationObject extends CityObject {
 	@Override
 	public void reCreateGeometries(GeometryFactory factory, ParserConfiguration config) {
 		for (Geometry geom : getGeometries()) {
+			if (geom instanceof ImplicitGeometryHolder){
+				continue;
+			}
 			if (geom.getType() == GeometryType.MULTI_SURFACE) {
 				MultiSurface ms = CityGmlUtils.createMultiSurface(geom, factory, config);
 				switch (type) {
diff --git a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/Vegetation.java b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/Vegetation.java
index 7e2d092..112ee12 100644
--- a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/Vegetation.java
+++ b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/Vegetation.java
@@ -68,6 +68,9 @@ public class Vegetation extends CityObject {
 	@Override
 	public void reCreateGeometries(GeometryFactory factory, ParserConfiguration config) {
 		for (Geometry geom : getGeometries()) {
+			if (geom instanceof ImplicitGeometryHolder){
+				continue;
+			}
 			if (geom.getType() == GeometryType.MULTI_SURFACE) {
 				MultiSurface ms = CityGmlUtils.createMultiSurface(geom, factory, config);
 				if (type == VegetationType.SOLITARY_VEGETATION_OBJECT) {
diff --git a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/writer/CityGMLWriterUtils.java b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/writer/CityGMLWriterUtils.java
index 05f543f..00c75d5 100644
--- a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/writer/CityGMLWriterUtils.java
+++ b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/writer/CityGMLWriterUtils.java
@@ -172,6 +172,7 @@ public class CityGMLWriterUtils {
 			if (model.isValidated() && val != null) {
 				QualityADEUtils.writeQualityAde(co, val);
 			}
+
 			co.reCreateGeometries(gmlFactory, model.getParserConfig());
 			cModel.getCityObjectMembers().add(new AbstractCityObjectProperty(co.getGmlObject()));
 		}
diff --git a/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/CityDoctorController.java b/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/CityDoctorController.java
index db25ebb..191ab93 100644
--- a/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/CityDoctorController.java
+++ b/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/CityDoctorController.java
@@ -1202,6 +1202,7 @@ public class CityDoctorController {
             Settings.set(Settings.LAST_OPEN_FOLDER, f.getParent());
             try {
                 storeModel(f, saveWithQualityAde);
+                logger.info("Saving successful");
             } catch (CityDoctorWriteException e) {
                 mainWindow.showExceptionDialog(e);
             }
-- 
GitLab