DEPENDENCIES_NOT_MET.
- *
- * @param checkIdentifier the name of the check for which an error is searched
- * @return true if an error has been found with the given check
+ * Checks if the object, or any object in its datastructure, has a specific error or is not fulfilling the dependencies
+ * of it.
+ *
+ * @param checkIdentifier the associated CheckID of this error
+ * @return true if the error was found, false otherwise
*/
public boolean containsError(CheckId checkIdentifier) {
+ try {
+ ContainsErrorVisitor.checkObject(this, checkIdentifier);
+ } catch (CheckErrorFound c) {
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * Checks if this checkable has an error or is not meeting the dependencies for it.
+ *
+ * @param checkIdentifier the associated CheckID of this error
+ * @return true if the error was found, false otherwise
+ */
+ public boolean hasError(CheckId checkIdentifier) {
CheckResult cs = getCheckResult(checkIdentifier);
if (cs == null) {
return false;
@@ -133,8 +160,8 @@ public abstract class Checkable implements Serializable {
}
/**
- *
- * @return all check results for this checkable.
+ *
+ * @return all check results of this checkable.
*/
public Map getAllCheckResults() {
return checkResults;
@@ -157,13 +184,11 @@ public abstract class Checkable implements Serializable {
}
/**
- * Checks whether this checkable has an error. Dependency errors are not
- * considered for this function. This will only check this checkable and not
- * traverse any checkables contained in this instance.
+ * Checks whether this checkable has any error, barring dependency errors.
*
* @return true if it has an error, otherwise false
*/
- public boolean hasAnyError() {
+ public boolean hasAnyErrorWithoutDependencies() {
for (CheckResult cr : checkResults.values()) {
if (cr.getResultStatus() == ResultStatus.ERROR) {
return true;
@@ -196,7 +221,7 @@ public abstract class Checkable implements Serializable {
}
/**
- * Clears all errors from this checkable
+ * Clears the checkResults list of this checkable.
*/
public void clearCheckResults() {
setValidated(false);
@@ -204,16 +229,31 @@ public abstract class Checkable implements Serializable {
}
/**
- * Removes all errors from this instance and all contained checkables.
+ * Clears the checkResults list of this checkable and all child objects in its datastructure.
+ */
+ public final void clearAllContainedCheckResults() {
+ this.accept(new ClearCheckResultsVisitor());
+ }
+
+ /**
+ * Checks if this checkable contains any error within its datastructure.
+ *
+ * @return true if any checkable of this datastructure contains an error, false otherwise
*/
- public abstract void clearAllContainedCheckResults();
+ public final boolean containsAnyError() {
+ try {
+ ContainsAnyErrorVisitor.checkObject(this);
+ } catch (CheckErrorFound c) {
+ return true;
+ }
+ return false;
+ }
/**
- *
- * @return false if the checkable or all checkables contained in this one don't
- * have any error.
+ * Checks if this checkable has any error
+ * @return true if this checkable has any error, false otherwise
*/
- public boolean containsAnyError() {
+ public boolean hasAnyError() {
for (CheckResult cr : checkResults.values()) {
if (cr.getResultStatus() == ResultStatus.ERROR
|| cr.getResultStatus() == ResultStatus.DEPENDENCIES_NOT_MET) {
@@ -230,6 +270,16 @@ public abstract class Checkable implements Serializable {
* @param errors the collection in which the errors are added.
*/
public void collectContainedErrors(List errors) {
+ this.accept(new CheckableErrorCollector(errors));
+ }
+
+ /**
+ * Collects all errors from this checkable and adds
+ * them to the given list. DEPENDENCY_NOT_MET errors are excluded from this.
+ *
+ * @param errors the collection in which the errors are added.
+ */
+ public void collectErrors(List errors) {
for (CheckResult cr : checkResults.values()) {
if (cr.getResultStatus() == ResultStatus.ERROR) {
errors.add(cr.getError());
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 b92ed72bdfc31d97ce2ce50dcad7f2d1b94b96ea..e1923eceb6234e8cadfe9767e15b799f4a910170 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
@@ -19,12 +19,8 @@
package de.hft.stuttgart.citydoctor2.datastructure;
import de.hft.stuttgart.citydoctor2.check.Check;
-import de.hft.stuttgart.citydoctor2.check.CheckError;
-import de.hft.stuttgart.citydoctor2.check.CheckId;
import de.hft.stuttgart.citydoctor2.parser.ParserConfiguration;
import de.hft.stuttgart.citydoctor2.utils.CityGmlUtils;
-import de.hft.stuttgart.citydoctor2.utils.CopyHandler;
-import de.hft.stuttgart.citydoctor2.utils.Copyable;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.citygml4j.core.model.core.AbstractSpaceBoundaryProperty;
@@ -83,34 +79,16 @@ public abstract class AbstractBuilding extends CityObject {
ab.setLod1Solid(null);
ab.setLod2Solid(null);
ab.setLod3Solid(null);
+ ab.getDeprecatedProperties().setLod4Solid(null);
+ ab.setLod0MultiSurface(null);
+ ab.getDeprecatedProperties().setLod1MultiSurface(null);
ab.setLod2MultiSurface(null);
ab.setLod3MultiSurface(null);
- ab.getDeprecatedProperties().setLod1MultiSurface(null);
ab.getDeprecatedProperties().setLod4MultiSurface(null);
- ab.getDeprecatedProperties().setLod4Solid(null);
-
- for (BoundarySurface bs : boundarySurfaceList) {
- bs.unsetGmlGeometries();
- }
- for (Installation bi : buildingInstallations) {
- bi.unsetGmlGeometries();
- }
- for (BuildingRoom br : buildingRooms) {
- br.unsetGmlGeometries();
- }
- for (BuildingRoomFurniture bfr : buildingRoomFurnitureList) {
- bfr.unsetGmlGeometries();
- }
- for (Storey storey : buildingStoreys) {
- storey.unsetGmlGeometries();
- }
- for (BuildingUnit bu : buildingUnits) {
- bu.unsetGmlGeometries();
- }
}
@Override
- public void reCreateGeometries(GeometryFactory factory, ParserConfiguration config) {
+ public void rebuildGeometries(GeometryFactory factory, ParserConfiguration config) {
for (Geometry geom : getGeometries()) {
if (geom instanceof ImplicitGeometryHolder) {
continue;
@@ -123,38 +101,21 @@ public abstract class AbstractBuilding extends CityObject {
setSolidAccordingToLod(geom, solid);
}
}
- for (BoundarySurface bs : boundarySurfaceList) {
- reCreateBoundarySurface(factory, config, bs);
- }
- for (Installation bi : buildingInstallations) {
- bi.reCreateGeometries(factory, config);
- }
- for (BuildingRoom br : buildingRooms) {
- br.reCreateGeometries(factory, config);
- }
- for (BuildingRoomFurniture bfr : buildingRoomFurnitureList) {
- bfr.reCreateGeometries(factory, config);
- }
- for (Storey storey : buildingStoreys) {
- storey.reCreateGeometries(factory, config);
- }
- for (BuildingUnit bu : buildingUnits) {
- bu.reCreateGeometries(factory, config);
- }
+ removeEmptyBoundarySurfaces();
}
- private void reCreateBoundarySurface(GeometryFactory factory, ParserConfiguration config, BoundarySurface bs) {
- if (bs.getGeometries().isEmpty()) {
- for (AbstractSpaceBoundaryProperty bsp : ab.getBoundaries()) {
- if (bsp.getObject() != null && bsp.getObject() == bs.getGmlObject()) {
- logger.warn("Found empty boundary surface: {}, removing from building", bs.getGmlId());
- ab.getBoundaries().remove(bsp);
- break;
+ private void removeEmptyBoundarySurfaces() {
+ for (BoundarySurface bs : boundarySurfaceList) {
+ if (bs.getGeometries().isEmpty()) {
+ for (AbstractSpaceBoundaryProperty bsp : ab.getBoundaries()) {
+ if (bsp.getObject() != null && bsp.getObject() == bs.getGmlObject()) {
+ logger.warn("Found empty boundary surface: {}, removing from building", bs.getGmlId());
+ ab.getBoundaries().remove(bsp);
+ break;
+ }
}
}
- return;
}
- bs.reCreateGeometries(factory, config);
}
private void setMultiSurfaceAccordingToLod(Geometry geom, MultiSurface ms) {
@@ -224,130 +185,6 @@ public abstract class AbstractBuilding extends CityObject {
}
}
- @Override
- public void collectContainedErrors(List errors) {
- super.collectContainedErrors(errors);
- for (Installation bi : buildingInstallations) {
- bi.collectContainedErrors(errors);
- }
- for (BoundarySurface bs : boundarySurfaceList) {
- bs.collectContainedErrors(errors);
- }
- for (BuildingRoom br : buildingRooms) {
- br.collectContainedErrors(errors);
- }
- for (BuildingRoomFurniture bfr : buildingRoomFurnitureList) {
- bfr.collectContainedErrors(errors);
- }
- for (Storey storey : buildingStoreys) {
- storey.collectContainedErrors(errors);
- }
- for (BuildingUnit bu : buildingUnits) {
- bu.collectContainedErrors(errors);
- }
- }
-
- @Override
- public void clearAllContainedCheckResults() {
- super.clearAllContainedCheckResults();
- for (Installation bi : buildingInstallations) {
- bi.clearAllContainedCheckResults();
- }
- for (BoundarySurface bs : boundarySurfaceList) {
- bs.clearAllContainedCheckResults();
- }
- for (BuildingRoom br : buildingRooms) {
- br.clearAllContainedCheckResults();
- }
- for (BuildingRoomFurniture bfr : buildingRoomFurnitureList) {
- bfr.clearAllContainedCheckResults();
- }
- for (Storey storey : buildingStoreys) {
- storey.clearAllContainedCheckResults();
- }
- for (BuildingUnit bu : buildingUnits) {
- bu.clearAllContainedCheckResults();
- }
- }
-
- @Override
- public boolean containsError(CheckId checkIdentifier) {
- boolean hasError = super.containsError(checkIdentifier);
- if (hasError) {
- return true;
- }
- for (Installation bi : buildingInstallations) {
- if (bi.containsError(checkIdentifier)) {
- return true;
- }
- }
- for (BoundarySurface bs : boundarySurfaceList) {
- if (bs.containsError(checkIdentifier)) {
- return true;
- }
- }
- for (BuildingRoom br : buildingRooms) {
- if (br.containsError(checkIdentifier)) {
- return true;
- }
- }
- for (BuildingRoomFurniture bfr : buildingRoomFurnitureList) {
- if (bfr.containsError(checkIdentifier)) {
- return true;
- }
- }
- for (Storey storey : buildingStoreys) {
- if (storey.containsError(checkIdentifier)) {
- return true;
- }
- }
- for (BuildingUnit bu : buildingUnits) {
- if (bu.containsError(checkIdentifier)) {
- return true;
- }
- }
- return false;
- }
-
- @Override
- public boolean containsAnyError() {
- boolean hasError = super.containsAnyError();
- if (hasError) {
- return true;
- }
- for (Installation bi : buildingInstallations) {
- if (bi.containsAnyError()) {
- return true;
- }
- }
- for (BoundarySurface bs : boundarySurfaceList) {
- if (bs.containsAnyError()) {
- return true;
- }
- }
- for (BuildingRoom br : buildingRooms) {
- if (br.containsAnyError()) {
- return true;
- }
- }
- for (BuildingRoomFurniture bfr : buildingRoomFurnitureList) {
- if (bfr.containsAnyError()) {
- return true;
- }
- }
- for (Storey storey : buildingStoreys) {
- if (storey.containsAnyError()) {
- return true;
- }
- }
- for (BuildingUnit bu : buildingUnits) {
- if (bu.containsAnyError()) {
- return true;
- }
- }
- return false;
- }
-
void setCityGmlBuilding(org.citygml4j.core.model.building.AbstractBuilding ab) {
this.ab = ab;
}
@@ -406,86 +243,4 @@ public abstract class AbstractBuilding extends CityObject {
return buildingUnits;
}
- @Override
- public void prepareForChecking() {
- super.prepareForChecking();
- for (Installation bi : buildingInstallations) {
- bi.prepareForChecking();
- }
- for (BoundarySurface bs : boundarySurfaceList) {
- bs.prepareForChecking();
- }
- for (BuildingRoom br : buildingRooms) {
- br.prepareForChecking();
- }
- for (BuildingRoomFurniture bfr : buildingRoomFurnitureList) {
- bfr.prepareForChecking();
- }
- for (Storey storey : buildingStoreys) {
- storey.prepareForChecking();
- }
- for (BuildingUnit bu : buildingUnits) {
- bu.prepareForChecking();
- }
- }
-
- @Override
- public void clearMetaInformation() {
- super.clearMetaInformation();
- for (Installation bi : buildingInstallations) {
- bi.clearMetaInformation();
- }
- for (BoundarySurface bs : boundarySurfaceList) {
- bs.clearMetaInformation();
- }
- for (BuildingRoom br : buildingRooms) {
- br.clearMetaInformation();
- }
- for (BuildingRoomFurniture bfr : buildingRoomFurnitureList) {
- bfr.clearMetaInformation();
- }
- for (Storey storey : buildingStoreys) {
- storey.clearMetaInformation();
- }
- for (BuildingUnit bu : buildingUnits) {
- bu.clearMetaInformation();
- }
- }
-
- @Override
- public void collectInstances(CopyHandler handler) {
- super.collectInstances(handler);
- handler.addInstance(boundarySurfaceList);
- handler.addInstance(buildingInstallations);
- handler.addInstance(buildingRooms);
- handler.addInstance(buildingRoomFurnitureList);
- handler.addInstance(buildingStoreys);
- handler.addInstance(buildingUnits);
- }
-
- @Override
- public void fillValues(Copyable original, CopyHandler handler) {
- super.fillValues(original, handler);
- AbstractBuilding originalAb = (AbstractBuilding) original;
- for (BoundarySurface originalBs : originalAb.boundarySurfaceList) {
- boundarySurfaceList.add(handler.getCopyInstance(originalBs));
- }
- for (Installation originalBi : originalAb.buildingInstallations) {
- buildingInstallations.add(handler.getCopyInstance(originalBi));
- }
- for (BuildingRoom originalBr : originalAb.buildingRooms) {
- buildingRooms.add(handler.getCopyInstance(originalBr));
- }
- for (BuildingRoomFurniture originalBFR : originalAb.buildingRoomFurnitureList) {
- buildingRoomFurnitureList.add(handler.getCopyInstance(originalBFR));
- }
- for (Storey originalBStoreys : originalAb.buildingStoreys) {
- buildingStoreys.add(handler.getCopyInstance(originalBStoreys));
- }
- for (BuildingUnit originalBun : originalAb.buildingUnits) {
- buildingUnits.add(handler.getCopyInstance(originalBun));
- }
- ab = originalAb.ab;
- }
-
}
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 95fecf2427afd6e523042ccfbfd5636b26d76f4c..6142cb32c2cd6a26d91fcca6b34096c6c5ea0c6d 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
@@ -1,12 +1,8 @@
package de.hft.stuttgart.citydoctor2.datastructure;
import de.hft.stuttgart.citydoctor2.check.Check;
-import de.hft.stuttgart.citydoctor2.check.CheckError;
-import de.hft.stuttgart.citydoctor2.check.CheckId;
import de.hft.stuttgart.citydoctor2.parser.ParserConfiguration;
import de.hft.stuttgart.citydoctor2.utils.CityGmlUtils;
-import de.hft.stuttgart.citydoctor2.utils.CopyHandler;
-import de.hft.stuttgart.citydoctor2.utils.Copyable;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.citygml4j.core.model.core.AbstractSpaceBoundaryProperty;
@@ -71,25 +67,13 @@ public abstract class AbstractBuildingSubdivision extends CityObject {
abs.setLod1Solid(null);
abs.setLod2Solid(null);
abs.setLod3Solid(null);
+ abs.setLod0MultiSurface(null);
abs.setLod2MultiSurface(null);
abs.setLod3MultiSurface(null);
-
- for (BoundarySurface bs : boundarySurfaceList) {
- bs.unsetGmlGeometries();
- }
- for (Installation bi : buildingInstallations) {
- bi.unsetGmlGeometries();
- }
- for (BuildingRoom br : buildingRooms) {
- br.unsetGmlGeometries();
- }
- for (BuildingRoomFurniture bfr : buildingRoomFurnitureList) {
- bfr.unsetGmlGeometries();
- }
}
@Override
- public void reCreateGeometries(GeometryFactory factory, ParserConfiguration config) {
+ public void rebuildGeometries(GeometryFactory factory, ParserConfiguration config) {
for (Geometry geom : getGeometries()) {
if (geom instanceof ImplicitGeometryHolder) {
continue;
@@ -102,32 +86,21 @@ public abstract class AbstractBuildingSubdivision extends CityObject {
setSolidAccordingToLod(geom, solid);
}
}
- for (BoundarySurface bs : boundarySurfaceList) {
- reCreateBoundarySurface(factory, config, bs);
- }
- for (Installation bi : buildingInstallations) {
- bi.reCreateGeometries(factory, config);
- }
- for (BuildingRoom br : buildingRooms) {
- br.reCreateGeometries(factory, config);
- }
- for (BuildingRoomFurniture bfr : buildingRoomFurnitureList) {
- bfr.reCreateGeometries(factory, config);
- }
+ removeEmptyBoundarySurfaces();
}
- private void reCreateBoundarySurface(GeometryFactory factory, ParserConfiguration config, BoundarySurface bs) {
- if (bs.getGeometries().isEmpty()) {
- for (AbstractSpaceBoundaryProperty bsp : abs.getBoundaries()) {
- if (bsp.getObject() != null && bsp.getObject() == bs.getGmlObject()) {
- logger.warn("Found empty boundary surface: {}, removing from building", bs.getGmlId());
- abs.getBoundaries().remove(bsp);
- break;
+ private void removeEmptyBoundarySurfaces() {
+ for (BoundarySurface bs : boundarySurfaceList) {
+ if (bs.getGeometries().isEmpty()) {
+ for (AbstractSpaceBoundaryProperty bsp : abs.getBoundaries()) {
+ if (bsp.getObject() != null && bsp.getObject() == bs.getGmlObject()) {
+ logger.warn("Found empty boundary surface: {}, removing from building-subdivision", bs.getGmlId());
+ abs.getBoundaries().remove(bsp);
+ break;
+ }
}
}
- return;
}
- bs.reCreateGeometries(factory, config);
}
private void setMultiSurfaceAccordingToLod(Geometry geom, MultiSurface ms) {
@@ -182,98 +155,6 @@ public abstract class AbstractBuildingSubdivision extends CityObject {
}
}
- @Override
- public void collectContainedErrors(List errors) {
- super.collectContainedErrors(errors);
- for (Installation bi : buildingInstallations) {
- bi.collectContainedErrors(errors);
- }
- for (BoundarySurface bs : boundarySurfaceList) {
- bs.collectContainedErrors(errors);
- }
- for (BuildingRoom br : buildingRooms) {
- br.collectContainedErrors(errors);
- }
- for (BuildingRoomFurniture bfr : buildingRoomFurnitureList) {
- bfr.collectContainedErrors(errors);
- }
- }
-
- @Override
- public void clearAllContainedCheckResults() {
- super.clearAllContainedCheckResults();
- for (Installation bi : buildingInstallations) {
- bi.clearAllContainedCheckResults();
- }
- for (BoundarySurface bs : boundarySurfaceList) {
- bs.clearAllContainedCheckResults();
- }
- for (BuildingRoom br : buildingRooms) {
- br.clearAllContainedCheckResults();
- }
- for (BuildingRoomFurniture bfr : buildingRoomFurnitureList) {
- bfr.clearAllContainedCheckResults();
- }
- }
-
- @Override
- public boolean containsError(CheckId checkIdentifier) {
- boolean hasError = super.containsError(checkIdentifier);
- if (hasError) {
- return true;
- }
- for (Installation bi : buildingInstallations) {
- if (bi.containsError(checkIdentifier)) {
- return true;
- }
- }
- for (BoundarySurface bs : boundarySurfaceList) {
- if (bs.containsError(checkIdentifier)) {
- return true;
- }
- }
- for (BuildingRoom br : buildingRooms) {
- if (br.containsError(checkIdentifier)) {
- return true;
- }
- }
- for (BuildingRoomFurniture bfr : buildingRoomFurnitureList) {
- if (bfr.containsError(checkIdentifier)) {
- return true;
- }
- }
- return false;
- }
-
- @Override
- public boolean containsAnyError() {
- boolean hasError = super.containsAnyError();
- if (hasError) {
- return true;
- }
- for (Installation bi : buildingInstallations) {
- if (bi.containsAnyError()) {
- return true;
- }
- }
- for (BoundarySurface bs : boundarySurfaceList) {
- if (bs.containsAnyError()) {
- return true;
- }
- }
- for (BuildingRoom br : buildingRooms) {
- if (br.containsAnyError()) {
- return true;
- }
- }
- for (BuildingRoomFurniture bfr : buildingRoomFurnitureList) {
- if (bfr.containsAnyError()) {
- return true;
- }
- }
- return false;
- }
-
void setCityGmlBuilding(org.citygml4j.core.model.building.AbstractBuildingSubdivision abs) {
this.abs = abs;
}
@@ -315,68 +196,6 @@ public abstract class AbstractBuildingSubdivision extends CityObject {
return buildingRoomFurnitureList;
}
- @Override
- public void prepareForChecking() {
- super.prepareForChecking();
- for (Installation bi : buildingInstallations) {
- bi.prepareForChecking();
- }
- for (BoundarySurface bs : boundarySurfaceList) {
- bs.prepareForChecking();
- }
- for (BuildingRoom br : buildingRooms) {
- br.prepareForChecking();
- }
- for (BuildingRoomFurniture bfr : buildingRoomFurnitureList) {
- bfr.prepareForChecking();
- }
- }
-
- @Override
- public void clearMetaInformation() {
- super.clearMetaInformation();
- for (Installation bi : buildingInstallations) {
- bi.clearMetaInformation();
- }
- for (BoundarySurface bs : boundarySurfaceList) {
- bs.clearMetaInformation();
- }
- for (BuildingRoom br : buildingRooms) {
- br.clearMetaInformation();
- }
- for (BuildingRoomFurniture bfr : buildingRoomFurnitureList) {
- bfr.clearMetaInformation();
- }
- }
-
- @Override
- public void collectInstances(CopyHandler handler) {
- super.collectInstances(handler);
- handler.addInstance(boundarySurfaceList);
- handler.addInstance(buildingInstallations);
- handler.addInstance(buildingRooms);
- handler.addInstance(buildingRoomFurnitureList);
- }
-
- @Override
- public void fillValues(Copyable original, CopyHandler handler) {
- super.fillValues(original, handler);
- AbstractBuildingSubdivision originalAbs = (AbstractBuildingSubdivision) original;
- for (BoundarySurface originalBs : originalAbs.boundarySurfaceList) {
- boundarySurfaceList.add(handler.getCopyInstance(originalBs));
- }
- for (Installation originalBi : originalAbs.buildingInstallations) {
- buildingInstallations.add(handler.getCopyInstance(originalBi));
- }
- for (BuildingRoom originalBr : originalAbs.buildingRooms) {
- buildingRooms.add(handler.getCopyInstance(originalBr));
- }
- for (BuildingRoomFurniture originalBFR : originalAbs.buildingRoomFurnitureList) {
- buildingRoomFurnitureList.add(handler.getCopyInstance(originalBFR));
- }
- abs = originalAbs.abs;
- }
-
}
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 be675fc6d2c0f7cb8cef8c4b2cb2fa17c056fef1..774ca2bb05336fb43a9eedea3104f53c4db87313 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
@@ -1,12 +1,10 @@
package de.hft.stuttgart.citydoctor2.datastructure;
import de.hft.stuttgart.citydoctor2.check.Check;
-import de.hft.stuttgart.citydoctor2.check.CheckError;
-import de.hft.stuttgart.citydoctor2.check.CheckId;
+
import de.hft.stuttgart.citydoctor2.parser.ParserConfiguration;
import de.hft.stuttgart.citydoctor2.utils.CityGmlUtils;
-import de.hft.stuttgart.citydoctor2.utils.CopyHandler;
-import de.hft.stuttgart.citydoctor2.utils.Copyable;
+import javafx.scene.paint.Color;
import org.citygml4j.core.util.geometry.GeometryFactory;
import org.xmlobjects.gml.model.geometry.aggregates.MultiSurface;
import org.xmlobjects.gml.model.geometry.aggregates.MultiSurfaceProperty;
@@ -42,51 +40,6 @@ public abstract class AbstractFurniture extends CityObject {
}
}
- @Override
- public void collectContainedErrors(List errors) {
- super.collectContainedErrors(errors);
- for (BoundarySurface boundarySurface : boundarySurfaceList) {
- boundarySurface.collectContainedErrors(errors);
- }
- }
-
- @Override
- public void clearAllContainedCheckResults() {
- super.clearAllContainedCheckResults();
- for (BoundarySurface boundarySurface : boundarySurfaceList) {
- boundarySurface.clearAllContainedCheckResults();
- }
- }
-
- @Override
- public boolean containsError(CheckId checkIdentifier) {
- boolean hasError = super.containsError(checkIdentifier);
- if (hasError) {
- return true;
- }
- for (BoundarySurface boundarySurface : boundarySurfaceList) {
- if (boundarySurface.containsError(checkIdentifier)) {
- return true;
- }
- }
- return false;
- }
-
- @Override
- public boolean containsAnyError() {
- boolean hasError = super.containsAnyError();
- if (hasError) {
- return true;
- }
- for (BoundarySurface boundarySurface : boundarySurfaceList) {
- if (boundarySurface.containsAnyError()) {
- return true;
- }
- }
- return false;
- }
-
-
@Override
public org.citygml4j.core.model.construction.AbstractFurniture getGmlObject() {
return af;
@@ -94,7 +47,7 @@ public abstract class AbstractFurniture extends CityObject {
@Override
public CityObject getTopLevelCityObject(){
- return parent;
+ return parent.getTopLevelCityObject();
}
public void addBoundarySurface(BoundarySurface boundarySurface) {
@@ -102,12 +55,12 @@ public abstract class AbstractFurniture extends CityObject {
boundarySurface.setParent(this);
}
- public List getBoundarySurfaceList() {
+ public List getBoundarySurfaces() {
return boundarySurfaceList;
}
@Override
- public void reCreateGeometries(GeometryFactory factory, ParserConfiguration config) {
+ public void rebuildGeometries(GeometryFactory factory, ParserConfiguration config) {
for (Geometry geom : getGeometries()) {
if (geom instanceof ImplicitGeometryHolder) {
continue;
@@ -134,6 +87,11 @@ public abstract class AbstractFurniture extends CityObject {
return parent;
}
+ @Override
+ public Color getRenderColor() {
+ return parent.getRenderColor();
+ }
+
@Override
public void unsetGmlGeometries() {
af.setLod0MultiSurface(null);
@@ -177,32 +135,9 @@ public abstract class AbstractFurniture extends CityObject {
}
- @Override
- public void prepareForChecking() {
- super.prepareForChecking();
- for (BoundarySurface boundarySurface : boundarySurfaceList) {
- boundarySurface.prepareForChecking();
- }
- }
-
- @Override
- public void clearMetaInformation() {
- super.clearMetaInformation();
- for (BoundarySurface boundarySurface : boundarySurfaceList) {
- boundarySurface.clearMetaInformation();
- }
- }
-
-
@Override
public FeatureType getFeatureType() {
return FeatureType.FURNITURE;
}
- @Override
- public void fillValues(Copyable original, CopyHandler handler) {
- super.fillValues(original, handler);
- AbstractFurniture originalAf = (AbstractFurniture) original;
- af = originalAf.af;
- }
}
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 da4b71fcfeaf8babd82bdf64370e9eb17ad4d1ac..79c08f545924ce7a67ef9c2a40fc94d23d8522da 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
@@ -1,12 +1,8 @@
package de.hft.stuttgart.citydoctor2.datastructure;
import de.hft.stuttgart.citydoctor2.check.Check;
-import de.hft.stuttgart.citydoctor2.check.CheckError;
-import de.hft.stuttgart.citydoctor2.check.CheckId;
import de.hft.stuttgart.citydoctor2.parser.ParserConfiguration;
import de.hft.stuttgart.citydoctor2.utils.CityGmlUtils;
-import de.hft.stuttgart.citydoctor2.utils.CopyHandler;
-import de.hft.stuttgart.citydoctor2.utils.Copyable;
import org.citygml4j.core.model.core.AbstractCityObject;
import org.citygml4j.core.util.geometry.GeometryFactory;
import org.xmlobjects.gml.model.geometry.aggregates.MultiSurface;
@@ -27,7 +23,7 @@ public abstract class AbstractRoom extends CityObject {
private static final long serialVersionUID = -1730625513988944329L;
private final List roomInstallations = new ArrayList<>(2);
- // Rooms have a Href list of furniture, the actual object is saved in the Building
+ // Rooms have a Href list of furniture, the furniture-objects are saved in the TopLevelFeature
private final List boundarySurfaceList = new ArrayList<>();
@@ -50,67 +46,7 @@ public abstract class AbstractRoom extends CityObject {
}
@Override
- public void collectContainedErrors(List errors) {
- super.collectContainedErrors(errors);
- for (Installation roomInstallation : roomInstallations) {
- roomInstallation.collectContainedErrors(errors);
- }
- for (BoundarySurface boundarySurface : boundarySurfaceList) {
- boundarySurface.collectContainedErrors(errors);
- }
- }
-
- @Override
- public void clearAllContainedCheckResults() {
- super.clearAllContainedCheckResults();
- for (Installation roomInstallation : roomInstallations) {
- roomInstallation.clearAllContainedCheckResults();
- }
- for (BoundarySurface boundarySurface : boundarySurfaceList) {
- boundarySurface.clearAllContainedCheckResults();
- }
- }
-
- @Override
- public boolean containsError(CheckId checkIdentifier) {
- boolean hasError = super.containsError(checkIdentifier);
- if (hasError) {
- return true;
- }
- for (Installation roomInstallation : roomInstallations) {
- if (roomInstallation.containsError(checkIdentifier)) {
- return true;
- }
- }
- for (BoundarySurface boundarySurface : boundarySurfaceList) {
- if (boundarySurface.containsError(checkIdentifier)) {
- return true;
- }
- }
- return false;
- }
-
- @Override
- public boolean containsAnyError() {
- boolean hasError = super.containsAnyError();
- if (hasError) {
- return true;
- }
- for (Installation roomInstallation : roomInstallations) {
- if (roomInstallation.containsAnyError()) {
- return true;
- }
- }
- for (BoundarySurface boundarySurface : boundarySurfaceList) {
- if (boundarySurface.containsAnyError()) {
- return true;
- }
- }
- return false;
- }
-
- @Override
- public void reCreateGeometries(GeometryFactory factory, ParserConfiguration config) {
+ public void rebuildGeometries(GeometryFactory factory, ParserConfiguration config) {
for (Geometry geom : getGeometries()) {
if (geom instanceof ImplicitGeometryHolder) {
continue;
@@ -123,12 +59,6 @@ public abstract class AbstractRoom extends CityObject {
setSolidAccordingToLod(geom, solid);
}
}
- for (BoundarySurface boundarySurface : boundarySurfaceList) {
- boundarySurface.reCreateGeometries(factory, config);
- }
- for (Installation roomInstallation : roomInstallations) {
- roomInstallation.reCreateGeometries(factory, config);
- }
}
@@ -173,37 +103,8 @@ public abstract class AbstractRoom extends CityObject {
cgmlRoom.setLod1Solid(null);
cgmlRoom.setLod2Solid(null);
cgmlRoom.setLod3Solid(null);
- for (Installation roomInstallation : roomInstallations) {
- roomInstallation.unsetGmlGeometries();
- }
- for (BoundarySurface boundarySurface : boundarySurfaceList) {
- boundarySurface.unsetGmlGeometries();
- }
- }
-
- @Override
- public void prepareForChecking() {
- super.prepareForChecking();
- for (Installation roomInstallation : roomInstallations) {
- roomInstallation.prepareForChecking();
- }
- for (BoundarySurface boundarySurface : boundarySurfaceList) {
- boundarySurface.prepareForChecking();
- }
}
- @Override
- public void clearMetaInformation() {
- super.clearMetaInformation();
- for (Installation roomInstallation : roomInstallations) {
- roomInstallation.clearMetaInformation();
- }
- for (BoundarySurface boundarySurface : boundarySurfaceList) {
- boundarySurface.clearMetaInformation();
- }
- }
-
-
@Override
public AbstractCityObject getGmlObject() {
return cgmlRoom;
@@ -235,24 +136,4 @@ public abstract class AbstractRoom extends CityObject {
return FeatureType.ROOM;
}
- @Override
- public void collectInstances(CopyHandler handler) {
- super.collectInstances(handler);
- handler.addInstance(roomInstallations);
- handler.addInstance(boundarySurfaceList);
- }
-
- @Override
- public void fillValues(Copyable original, CopyHandler handler) {
- super.fillValues(original, handler);
- AbstractRoom originalAr = (AbstractRoom) original;
- for (BoundarySurface originalBs : originalAr.boundarySurfaceList) {
- boundarySurfaceList.add(handler.getCopyInstance(originalBs));
- }
- for (Installation originalRi : originalAr.roomInstallations) {
- roomInstallations.add(handler.getCopyInstance(originalRi));
- }
- cgmlRoom = originalAr.cgmlRoom;
- }
-
}
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 a84d5255d62e30d0eeef8843b028fea11acc7306..7da0c979e13612276805cf9992745e11a77ab5bd 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
@@ -1,12 +1,9 @@
package de.hft.stuttgart.citydoctor2.datastructure;
import de.hft.stuttgart.citydoctor2.check.Check;
-import de.hft.stuttgart.citydoctor2.check.CheckError;
-import de.hft.stuttgart.citydoctor2.check.CheckId;
import de.hft.stuttgart.citydoctor2.parser.ParserConfiguration;
import de.hft.stuttgart.citydoctor2.utils.CityGmlUtils;
-import de.hft.stuttgart.citydoctor2.utils.CopyHandler;
-import de.hft.stuttgart.citydoctor2.utils.Copyable;
+import javafx.scene.paint.Color;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.citygml4j.core.model.core.AbstractSpaceBoundaryProperty;
@@ -54,39 +51,27 @@ public abstract class AbstractTunnel extends CityObject {
return FeatureType.TUNNEL;
}
+ @Override
+ public Color getRenderColor() {
+ return Color.SLATEGRAY;
+ }
+
@Override
public void unsetGmlGeometries() {
at.setLod1Solid(null);
at.setLod2Solid(null);
at.setLod3Solid(null);
+ at.getDeprecatedProperties().setLod4Solid(null);
+ at.setLod0MultiSurface(null);
+ at.getDeprecatedProperties().setLod1MultiSurface(null);
at.setLod2MultiSurface(null);
at.setLod3MultiSurface(null);
- at.getDeprecatedProperties().setLod1MultiSurface(null);
at.getDeprecatedProperties().setLod4MultiSurface(null);
- at.getDeprecatedProperties().setLod4Solid(null);
- for (BoundarySurface bs : boundarySurfaceList) {
- bs.unsetGmlGeometries();
- }
- for (Installation bi : tunnelInstallations) {
- bi.unsetGmlGeometries();
- }
- for (TunnelHollow th : tunnelHollows) {
- th.unsetGmlGeometries();
- }
- for (TunnelFurniture tfr : tunnelFurnitureList) {
- tfr.unsetGmlGeometries();
- }
- for (TunnelConstructiveElement te : tunnelConstructiveElements) {
- te.unsetGmlGeometries();
- }
- for (TunnelPart tp : tunnelParts) {
- tp.unsetGmlGeometries();
- }
}
@Override
- public void reCreateGeometries(GeometryFactory factory, ParserConfiguration config) {
+ public void rebuildGeometries(GeometryFactory factory, ParserConfiguration config) {
for (Geometry geom : getGeometries()) {
if (geom instanceof ImplicitGeometryHolder) {
continue;
@@ -99,38 +84,21 @@ public abstract class AbstractTunnel extends CityObject {
setSolidAccordingToLod(geom, solid);
}
}
- for (BoundarySurface bs : boundarySurfaceList) {
- reCreateBoundarySurface(factory, config, bs);
- }
- for (Installation bi : tunnelInstallations) {
- bi.reCreateGeometries(factory, config);
- }
- for (TunnelHollow th : tunnelHollows) {
- th.reCreateGeometries(factory, config);
- }
- for (TunnelFurniture tfr : tunnelFurnitureList) {
- tfr.reCreateGeometries(factory, config);
- }
- for (TunnelConstructiveElement te : tunnelConstructiveElements) {
- te.reCreateGeometries(factory, config);
- }
- for (TunnelPart tp : tunnelParts) {
- tp.reCreateGeometries(factory, config);
- }
+ removeEmptyBoundarySurfaces();
}
- private void reCreateBoundarySurface(GeometryFactory factory, ParserConfiguration config, BoundarySurface bs) {
- if (bs.getGeometries().isEmpty()) {
- for (AbstractSpaceBoundaryProperty bsp : at.getBoundaries()) {
- if (bsp.getObject() != null && bsp.getObject() == bs.getGmlObject()) {
- logger.warn("Found empty boundary surface: {}, removing from building", bs.getGmlId());
- at.getBoundaries().remove(bsp);
- break;
+ private void removeEmptyBoundarySurfaces() {
+ for (BoundarySurface bs : boundarySurfaceList) {
+ if (bs.getGeometries().isEmpty()) {
+ for (AbstractSpaceBoundaryProperty bsp : at.getBoundaries()) {
+ if (bsp.getObject() != null && bsp.getObject() == bs.getGmlObject()) {
+ logger.warn("Found empty boundary surface: {}, removing from tunnel", bs.getGmlId());
+ at.getBoundaries().remove(bsp);
+ break;
+ }
}
}
- return;
}
- bs.reCreateGeometries(factory, config);
}
private void setMultiSurfaceAccordingToLod(Geometry geom, MultiSurface ms) {
@@ -200,129 +168,6 @@ public abstract class AbstractTunnel extends CityObject {
}
}
- @Override
- public void collectContainedErrors(List errors) {
- super.collectContainedErrors(errors);
- for (Installation bi : tunnelInstallations) {
- bi.collectContainedErrors(errors);
- }
- for (BoundarySurface bs : boundarySurfaceList) {
- bs.collectContainedErrors(errors);
- }
- for (TunnelHollow th : tunnelHollows) {
- th.collectContainedErrors(errors);
- }
- for (TunnelFurniture tfr : tunnelFurnitureList) {
- tfr.collectContainedErrors(errors);
- }
- for (TunnelConstructiveElement te : tunnelConstructiveElements) {
- te.collectContainedErrors(errors);
- }
- for (TunnelPart tp : tunnelParts) {
- tp.collectContainedErrors(errors);
- }
- }
-
- @Override
- public void clearAllContainedCheckResults() {
- super.clearAllContainedCheckResults();
- for (Installation bi : tunnelInstallations) {
- bi.clearAllContainedCheckResults();
- }
- for (BoundarySurface bs : boundarySurfaceList) {
- bs.clearAllContainedCheckResults();
- }
- for (TunnelHollow th : tunnelHollows) {
- th.clearAllContainedCheckResults();
- }
- for (TunnelFurniture tfr : tunnelFurnitureList) {
- tfr.clearAllContainedCheckResults();
- }
- for (TunnelConstructiveElement te : tunnelConstructiveElements) {
- te.clearAllContainedCheckResults();
- }
- for (TunnelPart tp : tunnelParts) {
- tp.clearAllContainedCheckResults();
- }
- }
-
- @Override
- public boolean containsError(CheckId checkIdentifier) {
- boolean hasError = super.containsError(checkIdentifier);
- if (hasError) {
- return true;
- }
- for (Installation bi : tunnelInstallations) {
- if (bi.containsError(checkIdentifier)) {
- return true;
- }
- }
- for (BoundarySurface bs : boundarySurfaceList) {
- if (bs.containsError(checkIdentifier)) {
- return true;
- }
- }
- for (TunnelHollow th : tunnelHollows) {
- if (th.containsError(checkIdentifier)) {
- return true;
- }
- }
- for (TunnelFurniture tfr : tunnelFurnitureList) {
- if (tfr.containsError(checkIdentifier)) {
- return true;
- }
- }
- for (TunnelConstructiveElement te : tunnelConstructiveElements) {
- if (te.containsError(checkIdentifier)) {
- return true;
- }
- }
- for (TunnelPart tp : tunnelParts) {
- if (tp.containsError(checkIdentifier)) {
- return true;
- }
- }
- return false;
- }
-
- @Override
- public boolean containsAnyError() {
- boolean hasError = super.containsAnyError();
- if (hasError) {
- return true;
- }
- for (Installation bi : tunnelInstallations) {
- if (bi.containsAnyError()) {
- return true;
- }
- }
- for (BoundarySurface bs : boundarySurfaceList) {
- if (bs.containsAnyError()) {
- return true;
- }
- }
- for (TunnelHollow th : tunnelHollows) {
- if (th.containsAnyError()) {
- return true;
- }
- }
- for (TunnelFurniture tfr : tunnelFurnitureList) {
- if (tfr.containsAnyError()) {
- return true;
- }
- }
- for (TunnelConstructiveElement te : tunnelConstructiveElements) {
- if (te.containsAnyError()) {
- return true;
- }
- }
- for (TunnelPart tp : tunnelParts) {
- if (tp.containsAnyError()) {
- return true;
- }
- }
- return false;
- }
void setCityGmlBuilding(org.citygml4j.core.model.tunnel.AbstractTunnel at) {
this.at = at;
@@ -381,85 +226,4 @@ public abstract class AbstractTunnel extends CityObject {
return tunnelConstructiveElements;
}
- @Override
- public void prepareForChecking() {
- super.prepareForChecking();
- for (Installation bi : tunnelInstallations) {
- bi.prepareForChecking();
- }
- for (BoundarySurface bs : boundarySurfaceList) {
- bs.prepareForChecking();
- }
- for (TunnelHollow th : tunnelHollows) {
- th.prepareForChecking();
- }
- for (TunnelFurniture tfr : tunnelFurnitureList) {
- tfr.prepareForChecking();
- }
- for (TunnelConstructiveElement te : tunnelConstructiveElements) {
- te.prepareForChecking();
- }
- for (TunnelPart tp : tunnelParts) {
- tp.prepareForChecking();
- }
- }
-
- @Override
- public void clearMetaInformation() {
- super.clearMetaInformation();
- for (Installation bi : tunnelInstallations) {
- bi.clearMetaInformation();
- }
- for (BoundarySurface bs : boundarySurfaceList) {
- bs.clearMetaInformation();
- }
- for (TunnelHollow th : tunnelHollows) {
- th.clearMetaInformation();
- }
- for (TunnelFurniture tfr : tunnelFurnitureList) {
- tfr.clearMetaInformation();
- }
- for (TunnelConstructiveElement te : tunnelConstructiveElements) {
- te.clearMetaInformation();
- }
- for (TunnelPart tp : tunnelParts) {
- tp.clearMetaInformation();
- }
- }
-
- @Override
- public void collectInstances(CopyHandler handler) {
- super.collectInstances(handler);
- handler.addInstance(boundarySurfaceList);
- handler.addInstance(tunnelInstallations);
- handler.addInstance(tunnelHollows);
- handler.addInstance(tunnelFurnitureList);
- handler.addInstance(tunnelConstructiveElements);
- handler.addInstance(tunnelParts);
- }
-
- @Override
- public void fillValues(Copyable original, CopyHandler handler) {
- super.fillValues(original, handler);
- AbstractTunnel originalAt = (AbstractTunnel) original;
- for (BoundarySurface originalBs : originalAt.boundarySurfaceList) {
- boundarySurfaceList.add(handler.getCopyInstance(originalBs));
- }
- for (Installation originalTi : originalAt.tunnelInstallations) {
- tunnelInstallations.add(handler.getCopyInstance(originalTi));
- }
- for (TunnelHollow originalTh : originalAt.tunnelHollows) {
- tunnelHollows.add(handler.getCopyInstance(originalTh));
- }
- for (TunnelFurniture originalTFR : originalAt.tunnelFurnitureList) {
- tunnelFurnitureList.add(handler.getCopyInstance(originalTFR));
- }
- for (TunnelConstructiveElement originalTE : originalAt.tunnelConstructiveElements) {
- tunnelConstructiveElements.add(handler.getCopyInstance(originalTE));
- }
- for (TunnelPart originalTp : originalAt.tunnelParts) {
- tunnelParts.add(handler.getCopyInstance(originalTp));
- }
- at = originalAt.at;
- }
}
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 890fe59315b85a698c526ceabade9058f8125096..977202495bc739068a722a7f52f225b8d0263be4 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
@@ -19,17 +19,13 @@
package de.hft.stuttgart.citydoctor2.datastructure;
import de.hft.stuttgart.citydoctor2.check.Check;
-import de.hft.stuttgart.citydoctor2.check.CheckError;
-import de.hft.stuttgart.citydoctor2.check.CheckId;
import de.hft.stuttgart.citydoctor2.parser.ParserConfiguration;
import de.hft.stuttgart.citydoctor2.utils.CityGmlUtils;
-import de.hft.stuttgart.citydoctor2.utils.CopyHandler;
-import de.hft.stuttgart.citydoctor2.utils.Copyable;
+import javafx.scene.paint.Color;
import org.citygml4j.core.model.core.AbstractThematicSurface;
import org.citygml4j.core.util.geometry.GeometryFactory;
import org.xmlobjects.gml.model.geometry.aggregates.MultiSurface;
import org.xmlobjects.gml.model.geometry.aggregates.MultiSurfaceProperty;
-
import java.io.Serial;
import java.util.ArrayList;
import java.util.List;
@@ -87,7 +83,27 @@ public class BoundarySurface extends CityObject {
}
@Override
- public void reCreateGeometries(GeometryFactory factory, ParserConfiguration config) {
+ public String getDisplayText() {
+ return String.format("[%s] %s", this.type.name(), this.getGmlId().toString());
+ }
+
+ @Override
+ public Color getRenderColor() {
+ return switch (type) {
+ case ROOF -> Color.RED;
+ case GROUND -> Color.KHAKI;
+ default -> {
+ if (parent != null) {
+ yield parent.getRenderColor();
+ } else {
+ yield Color.WHITE;
+ }
+ }
+ };
+ }
+
+ @Override
+ public void rebuildGeometries(GeometryFactory factory, ParserConfiguration config) {
if (gmlObject.getId() == null) {
gmlObject.setId(getGmlId().getGmlString());
}
@@ -104,9 +120,6 @@ public class BoundarySurface extends CityObject {
throw new IllegalStateException("BoundarySurfaces can only have MultiSurface geometries");
}
}
- for (Opening o : openings) {
- o.reCreateGeometries(factory, config);
- }
}
private void setGeometryAccordingToLod(Lod lod, MultiSurfaceProperty ms) {
@@ -131,50 +144,6 @@ public class BoundarySurface extends CityObject {
}
}
- @Override
- public void clearAllContainedCheckResults() {
- super.clearAllContainedCheckResults();
- for (Opening o : openings) {
- o.clearAllContainedCheckResults();
- }
- }
-
- @Override
- public void collectContainedErrors(List errors) {
- super.collectContainedErrors(errors);
- for (Opening o : openings) {
- o.collectContainedErrors(errors);
- }
- }
-
- @Override
- public boolean containsAnyError() {
- boolean hasError = super.containsAnyError();
- if (hasError) {
- return true;
- }
- for (Opening o : openings) {
- if (o.containsAnyError()) {
- return true;
- }
- }
- return false;
- }
-
- @Override
- public boolean containsError(CheckId checkIdentifier) {
- boolean hasError = super.containsError(checkIdentifier);
- if (hasError) {
- return true;
- }
- for (Opening o : openings) {
- if (o.containsError(checkIdentifier)) {
- return true;
- }
- }
- return false;
- }
-
@Override
public void accept(Check c) {
super.accept(c);
@@ -201,10 +170,6 @@ public class BoundarySurface extends CityObject {
gmlObject.setLod2MultiSurface(null);
gmlObject.setLod3MultiSurface(null);
gmlObject.getDeprecatedProperties().setLod4MultiSurface(null);
-
- for (Opening o : openings) {
- o.unsetGmlGeometries();
- }
}
@Override
@@ -244,48 +209,4 @@ public class BoundarySurface extends CityObject {
openings.add(opening);
opening.setPartOfSurface(this);
}
-
- @Override
- public void prepareForChecking() {
- super.prepareForChecking();
- for (Opening o : openings) {
- o.prepareForChecking();
- }
- }
-
- @Override
- public void clearMetaInformation() {
- super.clearMetaInformation();
- for (Opening o : openings) {
- o.clearMetaInformation();
- }
- }
-
- @Override
- public Copyable createCopyInstance() {
- return new BoundarySurface(gmlObject);
- }
-
- @Override
- public void collectInstances(CopyHandler handler) {
- super.collectInstances(handler);
- for (Opening o : openings) {
- handler.addInstance(o);
- }
- handler.addInstance(parent);
- }
-
- @Override
- public void fillValues(Copyable original, CopyHandler handler) {
- super.fillValues(original, handler);
- BoundarySurface originalBs = (BoundarySurface) original;
- featureType = originalBs.featureType;
- type = originalBs.type;
- for (Opening originalOpening : originalBs.openings) {
- openings.add(handler.getCopyInstance(originalOpening));
- }
- parent = handler.getCopyInstance(originalBs.parent);
- gmlObject = originalBs.gmlObject;
- }
-
}
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 cd3624abf4d712f8fba65006874c535454d56fcd..6eeea1c765e72613d05934ece006d7c7cda32a22 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
@@ -19,12 +19,9 @@
package de.hft.stuttgart.citydoctor2.datastructure;
import de.hft.stuttgart.citydoctor2.check.Check;
-import de.hft.stuttgart.citydoctor2.check.CheckError;
-import de.hft.stuttgart.citydoctor2.check.CheckId;
import de.hft.stuttgart.citydoctor2.parser.ParserConfiguration;
import de.hft.stuttgart.citydoctor2.utils.CityGmlUtils;
-import de.hft.stuttgart.citydoctor2.utils.CopyHandler;
-import de.hft.stuttgart.citydoctor2.utils.Copyable;
+import javafx.scene.paint.Color;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.citygml4j.core.model.core.AbstractSpaceBoundaryProperty;
@@ -66,14 +63,13 @@ public class BridgeConstructiveElement extends CityObject {
return parent;
}
-
@Override
- public Copyable createCopyInstance() {
- return new BridgeConstructiveElement(gmlBridgeElement);
+ public Color getRenderColor() {
+ return parent.getRenderColor().brighter();
}
@Override
- public void reCreateGeometries(GeometryFactory factory, ParserConfiguration config) {
+ public void rebuildGeometries(GeometryFactory factory, ParserConfiguration config) {
// only handles CityGML2 for now
// unknown which CityGML is handled here
// need context information to decide
@@ -96,9 +92,6 @@ public class BridgeConstructiveElement extends CityObject {
break;
}
}
- for (BoundarySurface bs : boundarySurfaceList) {
- reCreateBoundarySurface(factory, config, bs);
- }
}
@Override
@@ -112,50 +105,6 @@ public class BridgeConstructiveElement extends CityObject {
}
}
- @Override
- public void collectContainedErrors(List errors) {
- super.collectContainedErrors(errors);
- for (BoundarySurface bs : boundarySurfaceList) {
- bs.collectContainedErrors(errors);
- }
- }
-
- @Override
- public void clearAllContainedCheckResults() {
- super.clearAllContainedCheckResults();
- for (BoundarySurface bs : boundarySurfaceList) {
- bs.clearAllContainedCheckResults();
- }
- }
-
- @Override
- public boolean containsError(CheckId checkIdentifier) {
- boolean hasError = super.containsError(checkIdentifier);
- if (hasError) {
- return true;
- }
- for (BoundarySurface bs : boundarySurfaceList) {
- if (bs.containsError(checkIdentifier)) {
- return true;
- }
- }
- return false;
- }
-
- @Override
- public boolean containsAnyError() {
- boolean hasError = super.containsAnyError();
- if (hasError) {
- return true;
- }
- for (BoundarySurface bs : boundarySurfaceList) {
- if (bs.containsAnyError()) {
- return true;
- }
- }
- return false;
- }
-
private void reCreateBoundarySurface(GeometryFactory factory, ParserConfiguration config, BoundarySurface bs) {
if (bs.getGeometries().isEmpty()) {
for (AbstractSpaceBoundaryProperty bsp : gmlBridgeElement.getBoundaries()) {
@@ -248,9 +197,6 @@ public class BridgeConstructiveElement extends CityObject {
gmlBridgeElement.setLod1Solid(null);
gmlBridgeElement.setLod2Solid(null);
gmlBridgeElement.setLod3Solid(null);
- for (BoundarySurface bs : boundarySurfaceList) {
- bs.unsetGmlGeometries();
- }
}
@Override
@@ -272,35 +218,4 @@ public class BridgeConstructiveElement extends CityObject {
return boundarySurfaceList;
}
- @Override
- public void prepareForChecking() {
- super.prepareForChecking();
- for (BoundarySurface bs : boundarySurfaceList) {
- bs.prepareForChecking();
- }
- }
-
- @Override
- public void clearMetaInformation() {
- super.clearMetaInformation();
- for (BoundarySurface bs : boundarySurfaceList) {
- bs.clearMetaInformation();
- }
- }
-
- @Override
- public void collectInstances(CopyHandler handler) {
- super.collectInstances(handler);
- handler.addInstance(boundarySurfaceList);
- }
-
- @Override
- public void fillValues(Copyable original, CopyHandler handler) {
- super.fillValues(original, handler);
- BridgeConstructiveElement originalBce = (BridgeConstructiveElement) original;
- for (BoundarySurface originalBs : originalBce.boundarySurfaceList) {
- boundarySurfaceList.add(handler.getCopyInstance(originalBs));
- }
- }
-
}
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 2378f5a2bcc1a9cefd2c8bdf7e42807209f2d59d..0fcad336f33239b1e06b2ffe4c3e58f6c63fe2a0 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
@@ -19,12 +19,11 @@
package de.hft.stuttgart.citydoctor2.datastructure;
import de.hft.stuttgart.citydoctor2.check.Check;
-import de.hft.stuttgart.citydoctor2.check.CheckError;
-import de.hft.stuttgart.citydoctor2.check.CheckId;
import de.hft.stuttgart.citydoctor2.parser.ParserConfiguration;
import de.hft.stuttgart.citydoctor2.utils.CityGmlUtils;
-import de.hft.stuttgart.citydoctor2.utils.CopyHandler;
-import de.hft.stuttgart.citydoctor2.utils.Copyable;
+import javafx.scene.paint.Color;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
import org.citygml4j.core.model.bridge.AbstractBridge;
import org.citygml4j.core.model.bridge.BridgeInstallation;
import org.citygml4j.core.model.bridge.BridgeInstallationProperty;
@@ -48,6 +47,9 @@ public class BridgeObject extends CityObject {
@Serial
private static final long serialVersionUID = 6301112640328373842L;
+
+ private static final Logger logger = LogManager.getLogger(BridgeObject.class);
+
private final List parts = new ArrayList<>(2);
private final List elements = new ArrayList<>(2);
private final List boundarySurfaces = new ArrayList<>(2);
@@ -98,7 +100,12 @@ public class BridgeObject extends CityObject {
}
@Override
- public void reCreateGeometries(GeometryFactory factory, ParserConfiguration config) {
+ public Color getRenderColor() {
+ return Color.LIGHTSTEELBLUE;
+ }
+
+ @Override
+ public void rebuildGeometries(GeometryFactory factory, ParserConfiguration config) {
for (Geometry geom : getGeometries()) {
if (geom instanceof ImplicitGeometryHolder) {
continue;
@@ -111,29 +118,28 @@ public class BridgeObject extends CityObject {
setSolidAccordingToLod(geom, solid);
}
}
+ removeEmptyBoundarySurfaces();
+ }
+
+ private void removeEmptyBoundarySurfaces() {
for (BoundarySurface bs : boundarySurfaces) {
- bs.reCreateGeometries(factory, config);
- }
- for (Installation bi : bridgeInstallations) {
- bi.reCreateGeometries(factory, config);
- }
- for (BridgeObject part : parts) {
- part.reCreateGeometries(factory, config);
- }
- for (BridgeConstructiveElement ele : elements) {
- ele.reCreateGeometries(factory, config);
- }
- for (BridgeRoom br : bridgeRooms) {
- br.reCreateGeometries(factory, config);
- }
- for (BridgeRoomFurniture bri : bridgeFurniture) {
- bri.reCreateGeometries(factory, config);
+ if (bs.getGeometries().isEmpty()) {
+ for (AbstractSpaceBoundaryProperty bsp : ab.getBoundaries()) {
+ if (bsp.getObject() != null && bsp.getObject() == bs.getGmlObject()) {
+ logger.warn("Found empty boundary surface: {}, removing from bridge", bs.getGmlId());
+ ab.getBoundaries().remove(bsp);
+ break;
+ }
+ }
+ }
}
-
}
private void setMultiSurfaceAccordingToLod(Geometry geom, MultiSurface ms) {
switch (geom.getLod()) {
+ case LOD0:
+ ab.setLod0MultiSurface(new MultiSurfaceProperty(ms));
+ break;
case LOD1:
ab.getDeprecatedProperties().setLod1MultiSurface(new MultiSurfaceProperty(ms));
break;
@@ -184,147 +190,6 @@ public class BridgeObject extends CityObject {
furniture.setParent(this);
}
- @Override
- public void clearAllContainedCheckResults() {
- super.clearAllContainedCheckResults();
- for (BoundarySurface bs : boundarySurfaces) {
- bs.clearAllContainedCheckResults();
- }
- for (Installation bi : bridgeInstallations) {
- bi.clearAllContainedCheckResults();
- }
- for (BridgeObject part : parts) {
- part.clearAllContainedCheckResults();
- }
- for (BridgeConstructiveElement ele : elements) {
- ele.clearAllContainedCheckResults();
- }
- for (BridgeRoom br : bridgeRooms) {
- br.clearAllContainedCheckResults();
- }
- for (BridgeRoomFurniture bri : bridgeFurniture) {
- bri.clearAllContainedCheckResults();
- }
- }
-
- @Override
- public void collectContainedErrors(List errors) {
- super.collectContainedErrors(errors);
- for (BoundarySurface bs : boundarySurfaces) {
- bs.collectContainedErrors(errors);
- }
- for (Installation bi : bridgeInstallations) {
- bi.collectContainedErrors(errors);
- }
- for (BridgeObject part : parts) {
- part.collectContainedErrors(errors);
- }
- for (BridgeConstructiveElement ele : elements) {
- ele.collectContainedErrors(errors);
- }
- for (BridgeRoom br : bridgeRooms) {
- br.collectContainedErrors(errors);
- }
- for (BridgeRoomFurniture bri : bridgeFurniture) {
- bri.collectContainedErrors(errors);
- }
-
- }
-
- @Override
- public boolean containsAnyError() {
- boolean hasError = super.containsAnyError();
- if (hasError) {
- return true;
- }
- for (Installation bi : bridgeInstallations) {
- if (bi.containsAnyError()) {
- return true;
- }
- }
- for (BoundarySurface bs : boundarySurfaces) {
- if (bs.containsAnyError()) {
- return true;
- }
- }
- if (doPartsContainAnyError()) {
- return true;
- }
- for (BridgeConstructiveElement ele : elements) {
- if (ele.containsAnyError()) {
- return true;
- }
- }
- for (BridgeRoom br : bridgeRooms) {
- if (br.containsAnyError()) {
- return true;
- }
- }
- for (BridgeRoomFurniture bri : bridgeFurniture) {
- if (bri.containsAnyError()) {
- return true;
- }
- }
- return false;
- }
-
- private boolean doPartsContainAnyError() {
-
- for (BridgeObject part : parts) {
- if (part.containsAnyError()) {
- return true;
- }
- }
- return false;
- }
-
- @Override
- public boolean containsError(CheckId checkIdentifier) {
- boolean hasError = super.containsError(checkIdentifier);
- if (hasError) {
- return true;
- }
- for (Installation bi : bridgeInstallations) {
- if (bi.containsError(checkIdentifier)) {
- return true;
- }
- }
- for (BoundarySurface bs : boundarySurfaces) {
- if (bs.containsError(checkIdentifier)) {
- return true;
- }
- }
- if (doPartsContainError(checkIdentifier)) {
- return true;
- }
- for (BridgeConstructiveElement ele : elements) {
- if (ele.containsError(checkIdentifier)) {
- return true;
- }
- }
- for (BridgeRoom br : bridgeRooms) {
- if (br.containsError(checkIdentifier)) {
- return true;
- }
- }
- for (BridgeRoomFurniture bri : bridgeFurniture) {
- if (bri.containsError(checkIdentifier)) {
- return true;
- }
- }
- return false;
- }
-
- private boolean doPartsContainError(CheckId checkIdentifier) {
-
- for (BridgeObject part : parts) {
- if (part.containsError(checkIdentifier)) {
- return true;
- }
- }
- return false;
- }
-
@Override
public void accept(Check c) {
super.accept(c);
@@ -389,29 +254,12 @@ public class BridgeObject extends CityObject {
ab.setLod1Solid(null);
ab.setLod2Solid(null);
ab.setLod3Solid(null);
+ ab.getDeprecatedProperties().setLod4Solid(null);
+ ab.setLod0MultiSurface(null);
+ ab.getDeprecatedProperties().setLod1MultiSurface(null);
ab.setLod2MultiSurface(null);
ab.setLod3MultiSurface(null);
- ab.getDeprecatedProperties().setLod1MultiSurface(null);
ab.getDeprecatedProperties().setLod4MultiSurface(null);
- ab.getDeprecatedProperties().setLod4Solid(null);
- for (BoundarySurface bs : boundarySurfaces) {
- bs.unsetGmlGeometries();
- }
- for (Installation bi : bridgeInstallations) {
- bi.unsetGmlGeometries();
- }
- for (BridgeObject part : parts) {
- part.unsetGmlGeometries();
- }
- for (BridgeConstructiveElement ele : elements) {
- ele.unsetGmlGeometries();
- }
- for (BridgeRoom br : bridgeRooms) {
- br.unsetGmlGeometries();
- }
- for (BridgeRoomFurniture bri : bridgeFurniture) {
- bri.unsetGmlGeometries();
- }
}
@@ -428,89 +276,6 @@ public class BridgeObject extends CityObject {
return "BridgeObject [type=" + type + ", id=" + getGmlId() + "]";
}
- @Override
- public void prepareForChecking() {
- super.prepareForChecking();
-
- for (BridgeConstructiveElement e : elements) {
- e.prepareForChecking();
- }
- for (BridgeObject part : parts) {
- part.prepareForChecking();
- }
- for (BoundarySurface bs : boundarySurfaces) {
- bs.prepareForChecking();
- }
- for (Installation bi : bridgeInstallations) {
- bi.prepareForChecking();
- }
- for (BridgeObject part : parts) {
- part.prepareForChecking();
- }
- for (BridgeRoom br : bridgeRooms) {
- br.prepareForChecking();
- }
- for (BridgeRoomFurniture bri : bridgeFurniture) {
- bri.prepareForChecking();
- }
- }
-
- @Override
- public void clearMetaInformation() {
- super.clearMetaInformation();
- for (BoundarySurface bs : boundarySurfaces) {
- bs.clearMetaInformation();
- }
- for (Installation bi : bridgeInstallations) {
- bi.clearMetaInformation();
- }
-
- for (BridgeObject part : parts) {
- part.clearMetaInformation();
- }
-
-
- for (BridgeConstructiveElement ele : elements) {
- ele.clearMetaInformation();
- }
-
- for (BridgeRoom br : bridgeRooms) {
- br.clearMetaInformation();
- }
- for (BridgeRoomFurniture bri : bridgeFurniture) {
- bri.clearMetaInformation();
- }
-
- }
-
- @Override
- public void collectInstances(CopyHandler handler) {
- super.collectInstances(handler);
- for (BoundarySurface bs : boundarySurfaces) {
- handler.addInstance(bs);
- }
- for (Installation bi : bridgeInstallations) {
- handler.addInstance(bi);
- }
-
- for (BridgeObject part : parts) {
- handler.addInstance(part);
- }
-
-
- for (BridgeConstructiveElement ele : elements) {
- handler.addInstance(ele);
- }
-
- for (BridgeRoom br : bridgeRooms) {
- handler.addInstance(br);
- }
-
- for (BridgeRoomFurniture bri : bridgeFurniture) {
- handler.addInstance(bri);
- }
-
- }
public void anonymize() {
for (Geometry geom : getGeometries()) {
@@ -529,36 +294,6 @@ public class BridgeObject extends CityObject {
this.ab = gmlB;
}
- @Override
- public void fillValues(Copyable original, CopyHandler handler) {
- super.fillValues(original, handler);
- BridgeObject originalBo = (BridgeObject) original;
- for (BoundarySurface originalBs : originalBo.boundarySurfaces) {
- boundarySurfaces.add(handler.getCopyInstance(originalBs));
- }
- for (Installation originalBi : originalBo.bridgeInstallations) {
- bridgeInstallations.add(handler.getCopyInstance(originalBi));
- }
-
- for (BridgeObject part : originalBo.parts) {
- getParts().add(handler.getCopyInstance(part));
- }
-
-
- for (BridgeConstructiveElement ele : originalBo.elements) {
- getConstructiveElements().add(handler.getCopyInstance(ele));
- }
-
- for (BridgeRoom br : originalBo.bridgeRooms) {
- getBridgeRooms().add(handler.getCopyInstance(br));
- }
-
- for (BridgeRoomFurniture bri : originalBo.bridgeFurniture) {
- getBridgeFurniture().add(handler.getCopyInstance(bri));
- }
-
- }
-
public List getBoundarySurfaces() {
return boundarySurfaces;
}
@@ -568,11 +303,6 @@ public class BridgeObject extends CityObject {
element.setParent(this);
}
- @Override
- public Copyable createCopyInstance() {
- return new BridgeObject(type, ab, parent);
- }
-
public List getParts() {
return parts;
}
diff --git a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/BridgeRoom.java b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/BridgeRoom.java
index 616aafce3daf79db7a42727e5eef84b5289017d2..036f84c11a35b62767b480a8fd26bb555ae2001a 100644
--- a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/BridgeRoom.java
+++ b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/BridgeRoom.java
@@ -1,7 +1,6 @@
package de.hft.stuttgart.citydoctor2.datastructure;
-import de.hft.stuttgart.citydoctor2.utils.CopyHandler;
-import de.hft.stuttgart.citydoctor2.utils.Copyable;
+import javafx.scene.paint.Color;
import java.io.Serial;
@@ -30,26 +29,14 @@ public class BridgeRoom extends AbstractRoom {
return parent;
}
- @Override
- public void fillValues(Copyable original, CopyHandler handler) {
- super.fillValues(original, handler);
- BridgeRoom oRoom = (BridgeRoom) original;
- parent = handler.getCopyInstance(oRoom.getParent());
- }
-
@Override
public CityObject getTopLevelCityObject() {
- return getParent();
+ return parent.getTopLevelCityObject();
}
@Override
- public void collectInstances(CopyHandler handler) {
- super.collectInstances(handler);
- handler.addInstance(parent);
+ public Color getRenderColor() {
+ return parent.getRenderColor();
}
- @Override
- public Copyable createCopyInstance() {
- return new BridgeRoom();
- }
}
diff --git a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/BridgeRoomFurniture.java b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/BridgeRoomFurniture.java
index 6bcc1041753c3fb88f04fd54c6dc6c25ac9b2da3..02dbc071bcae1da3198dc9885610de74c35a3be0 100644
--- a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/BridgeRoomFurniture.java
+++ b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/BridgeRoomFurniture.java
@@ -1,6 +1,5 @@
package de.hft.stuttgart.citydoctor2.datastructure;
-import de.hft.stuttgart.citydoctor2.utils.Copyable;
import org.citygml4j.core.model.bridge.BridgeFurniture;
import java.io.Serial;
@@ -13,9 +12,4 @@ public class BridgeRoomFurniture extends AbstractFurniture {
public void setGmlObject(BridgeFurniture gmlObject) {
super.setGmlObject(gmlObject);
}
-
- @Override
- public Copyable createCopyInstance() {
- return new BridgeRoomFurniture();
- }
}
diff --git a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/Building.java b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/Building.java
index 0834f8f4407cc73657251725cfd043c18d608370..dcd6073e1fe457c49b8c1048f769514bc4e00282 100644
--- a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/Building.java
+++ b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/Building.java
@@ -19,15 +19,9 @@
package de.hft.stuttgart.citydoctor2.datastructure;
import de.hft.stuttgart.citydoctor2.check.Check;
-import de.hft.stuttgart.citydoctor2.check.CheckError;
-import de.hft.stuttgart.citydoctor2.check.CheckId;
-import de.hft.stuttgart.citydoctor2.parser.ParserConfiguration;
-import de.hft.stuttgart.citydoctor2.utils.CopyHandler;
-import de.hft.stuttgart.citydoctor2.utils.Copyable;
import org.citygml4j.core.model.building.BuildingInstallation;
import org.citygml4j.core.model.building.BuildingInstallationProperty;
import org.citygml4j.core.model.core.AbstractSpaceBoundaryProperty;
-import org.citygml4j.core.util.geometry.GeometryFactory;
import java.io.Serial;
import java.util.ArrayList;
@@ -44,13 +38,6 @@ public class Building extends AbstractBuilding {
return buildingParts;
}
- @Override
- public void reCreateGeometries(GeometryFactory factory, ParserConfiguration config) {
- super.reCreateGeometries(factory, config);
- for (BuildingPart bp : buildingParts) {
- bp.reCreateGeometries(factory, config);
- }
- }
@Override
public CityObject getTopLevelCityObject() {
@@ -68,50 +55,6 @@ public class Building extends AbstractBuilding {
}
}
- @Override
- public void clearAllContainedCheckResults() {
- super.clearAllContainedCheckResults();
- for (BuildingPart bp : buildingParts) {
- bp.clearAllContainedCheckResults();
- }
- }
-
- @Override
- public void collectContainedErrors(List errors) {
- super.collectContainedErrors(errors);
- for (BuildingPart bp : buildingParts) {
- bp.collectContainedErrors(errors);
- }
- }
-
- @Override
- public boolean containsAnyError() {
- boolean hasError = super.containsAnyError();
- if (hasError) {
- return true;
- }
- for (BuildingPart bp : buildingParts) {
- if (bp.containsAnyError()) {
- return true;
- }
- }
- return false;
- }
-
- @Override
- public boolean containsError(CheckId checkIdentifier) {
- boolean hasError = super.containsError(checkIdentifier);
- if (hasError) {
- return true;
- }
- for (BuildingPart bp : buildingParts) {
- if (bp.containsError(checkIdentifier)) {
- return true;
- }
- }
- return false;
- }
-
public void addBuildingPart(BuildingPart buildingPart) {
buildingParts.add(buildingPart);
}
@@ -138,42 +81,4 @@ public class Building extends AbstractBuilding {
setCityGmlBuilding(gmlB);
}
- @Override
- public void clearMetaInformation() {
- super.clearMetaInformation();
- for (BuildingPart part : buildingParts) {
- part.clearMetaInformation();
- }
- }
-
- @Override
- public void prepareForChecking() {
- super.prepareForChecking();
- for (BuildingPart part : buildingParts) {
- part.prepareForChecking();
- }
- }
-
- @Override
- public void fillValues(Copyable original, CopyHandler handler) {
- super.fillValues(original, handler);
- Building originalBuilding = (Building) original;
- for (BuildingPart originalBp : originalBuilding.buildingParts) {
- buildingParts.add(handler.getCopyInstance(originalBp));
- }
- }
-
- @Override
- public void collectInstances(CopyHandler handler) {
- super.collectInstances(handler);
- for (BuildingPart bp : buildingParts) {
- handler.addInstance(bp);
- }
- }
-
- @Override
- public Copyable createCopyInstance() {
- return new Building();
- }
-
}
diff --git a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/BuildingPart.java b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/BuildingPart.java
index 45fe7d18cb59afb1cbaf93e49166765f20aed4c8..f92c2401dc255a29032f2697aa28e457fd9d37ed 100644
--- a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/BuildingPart.java
+++ b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/BuildingPart.java
@@ -18,9 +18,6 @@
*/
package de.hft.stuttgart.citydoctor2.datastructure;
-import de.hft.stuttgart.citydoctor2.utils.CopyHandler;
-import de.hft.stuttgart.citydoctor2.utils.Copyable;
-
import java.io.Serial;
public class BuildingPart extends AbstractBuilding {
@@ -57,22 +54,4 @@ public class BuildingPart extends AbstractBuilding {
return "BuildingPart [id=" + getGmlId() + "]";
}
- @Override
- public void fillValues(Copyable original, CopyHandler handler) {
- super.fillValues(original, handler);
- BuildingPart originalPart = (BuildingPart) original;
- parent = handler.getCopyInstance(originalPart.parent);
- }
-
- @Override
- public void collectInstances(CopyHandler handler) {
- super.collectInstances(handler);
- handler.addInstance(parent);
- }
-
- @Override
- public Copyable createCopyInstance() {
- return new BuildingPart();
- }
-
}
diff --git a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/BuildingRoom.java b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/BuildingRoom.java
index 040cc76813953723286e702cf5138b7081f0e3cc..c19978fd6ea4fc3c334ada4046b9344def807e6b 100644
--- a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/BuildingRoom.java
+++ b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/BuildingRoom.java
@@ -1,7 +1,6 @@
package de.hft.stuttgart.citydoctor2.datastructure;
-import de.hft.stuttgart.citydoctor2.utils.CopyHandler;
-import de.hft.stuttgart.citydoctor2.utils.Copyable;
+import javafx.scene.paint.Color;
import org.citygml4j.core.model.building.BuildingFurnitureProperty;
import java.io.Serial;
@@ -42,27 +41,13 @@ public class BuildingRoom extends AbstractRoom {
return parent;
}
- @Override
- public void fillValues(Copyable original, CopyHandler handler) {
- super.fillValues(original, handler);
-
- BuildingRoom oRoom = (BuildingRoom) original;
- parent = handler.getCopyInstance(oRoom.getParent());
- }
-
@Override
public CityObject getTopLevelCityObject() {
return getParent().getTopLevelCityObject();
}
@Override
- public void collectInstances(CopyHandler handler) {
- super.collectInstances(handler);
- handler.addInstance(parent);
- }
-
- @Override
- public Copyable createCopyInstance() {
- return new BuildingRoom();
+ public Color getRenderColor() {
+ return parent.getRenderColor();
}
}
diff --git a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/BuildingRoomFurniture.java b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/BuildingRoomFurniture.java
index 19897cdfd0bbca7d3e6664c0262dc3301295394b..a5b2d5dd7d7606a844bbf6a296affde206b76d2f 100644
--- a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/BuildingRoomFurniture.java
+++ b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/BuildingRoomFurniture.java
@@ -1,7 +1,6 @@
package de.hft.stuttgart.citydoctor2.datastructure;
-import de.hft.stuttgart.citydoctor2.utils.Copyable;
import org.citygml4j.core.model.building.BuildingFurniture;
import java.io.Serial;
@@ -15,10 +14,5 @@ public class BuildingRoomFurniture extends AbstractFurniture {
super.setGmlObject(gmlObject);
}
- @Override
- public Copyable createCopyInstance() {
- return new BuildingRoomFurniture();
- }
-
}
diff --git a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/BuildingUnit.java b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/BuildingUnit.java
index c7bfb53c83c7f29d27e364c9ba665ce9ac049305..9a9bd5c800b5710e87dea68ea9b13044ab589ccd 100644
--- a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/BuildingUnit.java
+++ b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/BuildingUnit.java
@@ -1,11 +1,7 @@
package de.hft.stuttgart.citydoctor2.datastructure;
import de.hft.stuttgart.citydoctor2.check.Check;
-import de.hft.stuttgart.citydoctor2.check.CheckError;
-import de.hft.stuttgart.citydoctor2.check.CheckId;
import de.hft.stuttgart.citydoctor2.parser.ParserConfiguration;
-import de.hft.stuttgart.citydoctor2.utils.CopyHandler;
-import de.hft.stuttgart.citydoctor2.utils.Copyable;
import org.citygml4j.core.util.geometry.GeometryFactory;
import java.io.Serial;
@@ -19,28 +15,6 @@ public class BuildingUnit extends AbstractBuildingSubdivision {
private final List storeys = new ArrayList<>();
- @Override
- public Copyable createCopyInstance() {
- return new BuildingUnit();
- }
-
-
- @Override
- public void unsetGmlGeometries() {
- super.unsetGmlGeometries();
- for (Storey storey : storeys) {
- storey.unsetGmlGeometries();
- }
- }
-
- @Override
- public void reCreateGeometries(GeometryFactory factory, ParserConfiguration config) {
- super.reCreateGeometries(factory, config);
- for (Storey storey : storeys) {
- storey.reCreateGeometries(factory, config);
- }
- }
-
@Override
public void accept(Check c) {
super.accept(c);
@@ -49,83 +23,7 @@ public class BuildingUnit extends AbstractBuildingSubdivision {
}
}
- @Override
- public void collectContainedErrors(List errors) {
- super.collectContainedErrors(errors);
- for (Storey storey : storeys) {
- storey.collectContainedErrors(errors);
- }
- }
- @Override
- public void clearAllContainedCheckResults() {
- super.clearAllContainedCheckResults();
- for (Storey storey : storeys) {
- storey.clearAllContainedCheckResults();
- }
- }
-
- @Override
- public boolean containsError(CheckId checkIdentifier) {
- boolean hasError = super.containsError(checkIdentifier);
- if (hasError) {
- return true;
- }
- for (Storey storey : storeys) {
- if (storey.containsError(checkIdentifier)) {
- return true;
- }
- }
- return false;
- }
-
- @Override
- public boolean containsAnyError() {
- boolean hasError = super.containsAnyError();
- if (hasError) {
- return true;
- }
- for (Storey storey : storeys) {
- if (storey.containsAnyError()) {
- return true;
- }
- }
- return false;
- }
-
- @Override
- public void prepareForChecking() {
- super.prepareForChecking();
- for (Storey storey : storeys) {
- storey.prepareForChecking();
- }
- }
-
- @Override
- public void clearMetaInformation() {
- super.clearMetaInformation();
- for (Storey storey : storeys) {
- storey.clearMetaInformation();
- }
- }
-
- @Override
- public void collectInstances(CopyHandler handler) {
- super.collectInstances(handler);
- for (Storey storey : storeys) {
- storey.collectInstances(handler);
- }
- }
-
- @Override
- public void fillValues(Copyable original, CopyHandler handler) {
- super.fillValues(original, handler);
- BuildingUnit originalBu = (BuildingUnit) original;
- for (Storey storey : originalBu.storeys) {
- storeys.add(handler.getCopyInstance(storey));
- }
- this.abs = originalBu.abs;
- }
public List getStoreys() {
return storeys;
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 e8e83d59962f7a305aee67ecabe283af61271733..b92ace7b2ec77e6c31239f664cf73319637bd542 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
@@ -3,8 +3,7 @@ package de.hft.stuttgart.citydoctor2.datastructure;
import de.hft.stuttgart.citydoctor2.check.Check;
import de.hft.stuttgart.citydoctor2.parser.ParserConfiguration;
import de.hft.stuttgart.citydoctor2.utils.CityGmlUtils;
-import de.hft.stuttgart.citydoctor2.utils.CopyHandler;
-import de.hft.stuttgart.citydoctor2.utils.Copyable;
+import javafx.scene.paint.Color;
import org.citygml4j.core.model.core.AbstractCityObject;
import org.citygml4j.core.util.geometry.GeometryFactory;
import org.xmlobjects.gml.model.geometry.aggregates.MultiSurface;
@@ -35,6 +34,11 @@ public class CityFurniture extends CityObject {
return cgmlCityFurniture;
}
+ @Override
+ public Color getRenderColor() {
+ return Color.THISTLE;
+ }
+
public void setGmlObject(org.citygml4j.core.model.cityfurniture.CityFurniture gmlCityFurniture) {
cgmlCityFurniture = gmlCityFurniture;
}
@@ -47,6 +51,9 @@ public class CityFurniture extends CityObject {
cgmlCityFurniture.setLod1Solid(null);
cgmlCityFurniture.setLod2Solid(null);
cgmlCityFurniture.setLod3Solid(null);
+ cgmlCityFurniture.getDeprecatedProperties().setLod1Geometry(null);
+ cgmlCityFurniture.getDeprecatedProperties().setLod2Geometry(null);
+ cgmlCityFurniture.getDeprecatedProperties().setLod3Geometry(null);
cgmlCityFurniture.getDeprecatedProperties().setLod4Geometry(null);
}
@@ -56,7 +63,7 @@ public class CityFurniture extends CityObject {
}
@Override
- public void reCreateGeometries(GeometryFactory factory, ParserConfiguration config) {
+ public void rebuildGeometries(GeometryFactory factory, ParserConfiguration config) {
for (Geometry geom : getGeometries()) {
if (geom instanceof ImplicitGeometryHolder) {
continue;
@@ -116,15 +123,4 @@ public class CityFurniture extends CityObject {
return FeatureType.CITY_FURNITURE;
}
- @Override
- public Copyable createCopyInstance() {
- return new CityFurniture();
- }
-
- @Override
- public void fillValues(Copyable original, CopyHandler handler) {
- super.fillValues(original, handler);
- CityFurniture originalCF = (CityFurniture) original;
- cgmlCityFurniture = originalCF.cgmlCityFurniture;
- }
}
diff --git a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/CityObject.java b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/CityObject.java
index 86c6116d2a329f43928b3da9704a5a27142175b5..1291a8de7031c57beb110e577766374084b20628 100644
--- a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/CityObject.java
+++ b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/CityObject.java
@@ -19,11 +19,10 @@
package de.hft.stuttgart.citydoctor2.datastructure;
import de.hft.stuttgart.citydoctor2.check.Check;
-import de.hft.stuttgart.citydoctor2.check.CheckError;
-import de.hft.stuttgart.citydoctor2.check.CheckId;
import de.hft.stuttgart.citydoctor2.parser.ParserConfiguration;
-import de.hft.stuttgart.citydoctor2.utils.CopyHandler;
-import de.hft.stuttgart.citydoctor2.utils.Copyable;
+import de.hft.stuttgart.citydoctor2.utils.visitors.GmlGeometryRebuilder;
+import de.hft.stuttgart.citydoctor2.utils.visitors.UnsetGeometriesVisitor;
+import javafx.scene.paint.Color;
import org.citygml4j.core.model.core.AbstractCityObject;
import org.citygml4j.core.util.geometry.GeometryFactory;
@@ -44,20 +43,30 @@ public abstract class CityObject extends GmlElement {
@Serial
private static final long serialVersionUID = 651712070755024188L;
+
private final List geometryList = new ArrayList<>();
private final List genericAttributeList = new ArrayList<>();
+
+ /**
+ * Recreates the CityGML4j geometry in this object's datastructure using the CityDoctor geometries.
+ * The original CityGML4j geometry is deleted after parsing to reduce the memory overhead of {@link CityObject CityObjects}.
+ *
+ * Recreation of the geometries is needed for writing validation results to the QualityADE, as well as for the export
+ * of repaired geometries from CityDoctor's internal datastructure.
+ * @param factory the GeometryFactory used for creation of CityGml4j geometry objects
+ * @param config the configuration settings of the parser
+ */
+ public final void reCreateGeometries(GeometryFactory factory, ParserConfiguration config) {
+ this.accept(new GmlGeometryRebuilder(factory, config));
+ }
+
/**
- * Recreates the CityGML4j geometry in this object. The CityGML4j geometry is
- * deleted from the data structure as was mapped to the city doctor data
- * structure. For writing CityGML files the geometry has to be restored. Also
- * maps changes to geometry back to CityGML4j
+ * Rebuilds the CityGML4j geometries of this object.
*
- * @param factory needed to create CityGML4j data structures
- * @param config contains information whether a city doctor point was
- * transformed to a different coordinate system. It would need to
- * be transformed to the original coordinate system
+ * @param factory the GeometryFactory used for creation of CityGml4j geometry objects
+ * @param config the configuration settings of the parser
*/
- public abstract void reCreateGeometries(GeometryFactory factory, ParserConfiguration config);
+ public abstract void rebuildGeometries(GeometryFactory factory, ParserConfiguration config);
/**
* Getter for the CityGML4j data object
@@ -67,29 +76,58 @@ public abstract class CityObject extends GmlElement {
public abstract AbstractCityObject getGmlObject();
/**
- * Remove the CityGML4j geometries from the data structure to save memory.
+ * Remove the CityGML4j geometries from this CityObject to reduce memory overhead.
*/
public abstract void unsetGmlGeometries();
+ /**
+ * Removes all CityGML4J geometries from this CityObject and child objects of its datastructure to reduce
+ * the memory overhead.
+ */
+ public final void clearGmlGeometries() {
+ this.accept(new UnsetGeometriesVisitor());
+ }
+
+ /**
+ * Adds a Geometry to this object.
+ * @param geom the Geometry to add.
+ */
public void addGeometry(Geometry geom) {
Objects.requireNonNull(geom);
geometryList.add(geom);
geom.setParent(this);
}
-
+ /**
+ * Returns all Geometries of this object.
+ * @return a list of the Geometries.
+ */
public List getGeometries() {
return geometryList;
}
+ /**
+ * Removes a Geometry from this object.
+ * @param lod the {@link Lod} of the Geometry.
+ */
public void removeGeometry(Lod lod) {
geometryList.removeIf(geom -> geom.getLod() == lod);
}
+ /**
+ * Removes a Geometry from this object.
+ * @param lod the {@link Lod} of the Geometry.
+ * @param type the {@link GeometryType} of the Geometry.
+ */
public void removeGeometry(Lod lod, GeometryType type) {
geometryList.removeIf(geom -> geom.getLod() == lod && geom.getType() == type);
}
+ /**
+ * Returns the Geometry with the highest LOD of this object. If multiple Geometries share the highest LOD, the one
+ * that was added first will be returned.
+ * @return the Geometry with the highest LOD
+ */
public Geometry getHighestLodGeometry() {
Geometry highestLodGeometry = null;
Lod highestLod = null;
@@ -103,18 +141,47 @@ public abstract class CityObject extends GmlElement {
}
/**
- * Returns the top-level CityObject (like Building or Tunnel) belonging to this object.
+ * Returns the top-level CityObject (e.g. Building, Tunnel, Vegetation etc.) belonging to this object.
*/
public abstract CityObject getTopLevelCityObject();
+ /**
+ * Returns a String representation of this object for display in the featuretab TreeViews in the format of
+ * "[FeatureType] Gml-ID"
+ * @return the String representation.
+ */
+ public String getDisplayText() {
+ return String.format("[%s] %s", this.getClass().getSimpleName(), this.getGmlId().toString());
+ }
+
+ /**
+ * Returns the color for rendering of this object's polygons.
+ * @return color for this object
+ */
+ public Color getRenderColor() {
+ return Color.WHITE;
+ }
+
+ /**
+ * Adds a GenericAttribute to this object.
+ * @param genericAttribute the attribute to add.
+ */
public void addGenericAttribute(GenericAttribute genericAttribute) {
genericAttributeList.add(genericAttribute);
}
+ /**
+ * Returns all GenericAttributes of this object.
+ * @return a list of the GenericAttributes.
+ */
public List getGenericAttributes() {
return genericAttributeList;
}
+ /**
+ * Returns the CityGML FeatureType of this object.
+ * @return this object's FeatureType.
+ */
public abstract FeatureType getFeatureType();
@Override
@@ -128,50 +195,6 @@ public abstract class CityObject extends GmlElement {
}
}
- @Override
- public boolean containsError(CheckId checkIdentifier) {
- boolean hasError = super.containsError(checkIdentifier);
- if (hasError) {
- return true;
- }
- for (Geometry geom : geometryList) {
- if (geom.containsError(checkIdentifier)) {
- return true;
- }
- }
- return false;
- }
-
- @Override
- public void clearAllContainedCheckResults() {
- super.clearCheckResults();
- for (Geometry geom : geometryList) {
- geom.clearAllContainedCheckResults();
- }
- }
-
- @Override
- public void collectContainedErrors(List errors) {
- super.collectContainedErrors(errors);
- for (Geometry geom : geometryList) {
- geom.collectContainedErrors(errors);
- }
- }
-
- @Override
- public boolean containsAnyError() {
- boolean hasError = super.containsAnyError();
- if (hasError) {
- return true;
- }
- for (Geometry geom : geometryList) {
- if (geom.containsAnyError()) {
- return true;
- }
- }
- return false;
- }
-
public Geometry getGeometry(GeometryType type, Lod lod) {
for (Geometry geom : geometryList) {
if (geom.getType() == type && geom.getLod() == lod) {
@@ -181,33 +204,5 @@ public abstract class CityObject extends GmlElement {
return null;
}
- @Override
- public void prepareForChecking() {
- for (Geometry geom : geometryList) {
- geom.prepareForChecking();
- }
- }
- @Override
- public void clearMetaInformation() {
- for (Geometry geom : geometryList) {
- geom.clearMetaInformation();
- }
- }
-
- @Override
- public void collectInstances(CopyHandler handler) {
- for (Geometry geom : geometryList) {
- handler.addInstance(geom);
- }
- }
-
- @Override
- public void fillValues(Copyable original, CopyHandler handler) {
- super.fillValues(original, handler);
- CityObject originalCo = (CityObject) original;
- for (Geometry geom : originalCo.geometryList) {
- geometryList.add(handler.getCopyInstance(geom));
- }
- }
}
diff --git a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/ConcretePolygon.java b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/ConcretePolygon.java
index d0c3ea97b117ca4bf6ed240278ceb6576534bba5..c5c99a5ee696c96f7c991dda086c80c6460880aa 100644
--- a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/ConcretePolygon.java
+++ b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/ConcretePolygon.java
@@ -19,14 +19,11 @@
package de.hft.stuttgart.citydoctor2.datastructure;
import de.hft.stuttgart.citydoctor2.check.Check;
-import de.hft.stuttgart.citydoctor2.check.CheckError;
-import de.hft.stuttgart.citydoctor2.check.CheckId;
import de.hft.stuttgart.citydoctor2.check.Checkable;
import de.hft.stuttgart.citydoctor2.math.Vector3d;
import de.hft.stuttgart.citydoctor2.tesselation.JoglTesselator;
import de.hft.stuttgart.citydoctor2.tesselation.TesselatedPolygon;
-import de.hft.stuttgart.citydoctor2.utils.CopyHandler;
-import de.hft.stuttgart.citydoctor2.utils.Copyable;
+import javafx.scene.paint.Color;
import java.io.Serial;
import java.util.ArrayList;
@@ -184,6 +181,7 @@ public class ConcretePolygon extends Polygon {
*/
@Override
public void accept(Check c) {
+ super.accept(c);
if (c.canExecute(this)) {
c.check(this);
}
@@ -195,7 +193,6 @@ public class ConcretePolygon extends Polygon {
lr.accept(c);
}
}
- setValidated(true);
}
@Override
@@ -215,93 +212,6 @@ public class ConcretePolygon extends Polygon {
return exterior.isRingConnectedViaPoint(other.getExteriorRing());
}
- /*
- * (non-Javadoc)
- *
- * @see de.hft.stuttgart.citydoctor2.datastructure.Polygon#containsAnyError()
- */
- @Override
- public boolean containsAnyError() {
- if (super.containsAnyError()) {
- return true;
- }
- if (exterior != null && exterior.containsAnyError()) {
- return true;
- }
- if (innerRings != null) {
- for (LinearRing lr : innerRings) {
- if (lr.containsAnyError()) {
- return true;
- }
- }
- }
- return false;
- }
-
- /*
- * (non-Javadoc)
- *
- * @see
- * de.hft.stuttgart.citydoctor2.datastructure.Polygon#collectContainedErrors(
- * java.util.List)
- */
- @Override
- public void collectContainedErrors(List errors) {
- super.collectContainedErrors(errors);
- if (exterior != null) {
- exterior.collectContainedErrors(errors);
- }
- if (innerRings != null) {
- for (LinearRing lr : innerRings) {
- lr.collectContainedErrors(errors);
- }
- }
- }
-
- /*
- * (non-Javadoc)
- *
- * @see de.hft.stuttgart.citydoctor2.datastructure.Polygon#
- * clearAllContainedCheckResults()
- */
- @Override
- public void clearAllContainedCheckResults() {
- super.clearCheckResults();
- if (exterior != null) {
- exterior.clearAllContainedCheckResults();
- }
- if (innerRings != null) {
- for (LinearRing lr : innerRings) {
- lr.clearAllContainedCheckResults();
- }
- }
- }
-
- /*
- * (non-Javadoc)
- *
- * @see de.hft.stuttgart.citydoctor2.datastructure.Polygon#containsError(de.hft.
- * stuttgart.citydoctor2.check.CheckId)
- */
- @Override
- public boolean containsError(CheckId checkIdentifier) {
- boolean hasError = super.containsError(checkIdentifier);
- if (hasError) {
- return true;
- }
- if (exterior != null && exterior.containsError(checkIdentifier)) {
- return true;
- }
- if (innerRings != null) {
- for (LinearRing lr : innerRings) {
- if (lr.containsError(checkIdentifier)) {
- return true;
- }
- }
- }
- return false;
- }
-
/*
* (non-Javadoc)
*
@@ -479,51 +389,10 @@ public class ConcretePolygon extends Polygon {
}
@Override
- public void prepareForChecking() {
- parent.prepareForChecking();
- }
-
- @Override
- public void clearMetaInformation() {
- parent.clearMetaInformation();
+ public void prepareLowMemoryUsageMode() {
+ parent.updateEdgesAndVertices();
}
- @Override
- public void collectInstances(CopyHandler handler) {
- handler.addInstance(exterior);
- if (innerRings != null) {
- for (LinearRing lr : innerRings) {
- handler.addInstance(lr);
- }
- }
- handler.addInstance(partOfSurface);
- handler.addInstance(partfOfInstallation);
- handler.addInstance(parent);
- handler.addInstance(linkedFromPolygon);
- }
-
-
- @Override
- public Copyable createCopyInstance() {
- return new ConcretePolygon();
- }
-
- @Override
- public void fillValues(Copyable original, CopyHandler handler) {
- super.fillValues(original, handler);
- ConcretePolygon originalPoly = (ConcretePolygon) original;
- exterior = handler.getCopyInstance(originalPoly.exterior);
- if (originalPoly.innerRings != null) {
- innerRings = new ArrayList<>(originalPoly.innerRings.size());
- for (LinearRing originalRing : originalPoly.innerRings) {
- innerRings.add(handler.getCopyInstance(originalRing));
- }
- }
- parent = handler.getCopyInstance(originalPoly.parent);
- partfOfInstallation = handler.getCopyInstance(originalPoly.partfOfInstallation);
- partOfSurface = handler.getCopyInstance(originalPoly.partOfSurface);
- linkedFromPolygon = handler.getCopyInstance(originalPoly.linkedFromPolygon);
- }
@Override
public void remove() {
@@ -544,6 +413,11 @@ public class ConcretePolygon extends Polygon {
}
return area;
}
+
+ @Override
+ public Color getRenderColor() {
+ return parent.getRenderColor();
+ }
diff --git a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/Edge.java b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/Edge.java
index 4df5da10beeaeabbf4ee2213ee02ba6e59b929a1..0af9643fa21b4f9e8996088b5ff826c76752b127 100644
--- a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/Edge.java
+++ b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/Edge.java
@@ -18,9 +18,6 @@
*/
package de.hft.stuttgart.citydoctor2.datastructure;
-import de.hft.stuttgart.citydoctor2.utils.CopyHandler;
-import de.hft.stuttgart.citydoctor2.utils.Copyable;
-
import java.io.Serial;
import java.io.Serializable;
import java.util.ArrayList;
@@ -31,7 +28,7 @@ import java.util.List;
*
* @author Matthias Betz
*/
-public class Edge implements Serializable, Copyable {
+public class Edge implements Serializable {
@Serial
private static final long serialVersionUID = -504694863498128296L;
@@ -186,33 +183,7 @@ public class Edge implements Serializable, Copyable {
}
return null;
}
+}
- @Override
- public void collectInstances(CopyHandler handler) {
- handler.addInstance(from);
- handler.addInstance(to);
- handler.addInstance(adjacentPolygons);
- handler.addInstance(adjacentRings);
- }
-
- @Override
- public Copyable createCopyInstance() {
- return new Edge();
- }
- @Override
- public void fillValues(Copyable original, CopyHandler handler) {
- Edge originalEdge = (Edge) original;
- from = handler.getCopyInstance(originalEdge.from);
- to = handler.getCopyInstance(originalEdge.to);
- numberOfHalfEdges = originalEdge.numberOfHalfEdges;
- numberOfOppositeHalfEdges = originalEdge.numberOfOppositeHalfEdges;
- for (Polygon originalPoly : originalEdge.adjacentPolygons) {
- adjacentPolygons.add(handler.getCopyInstance(originalPoly));
- }
- for (LinearRing originalRing : originalEdge.adjacentRings) {
- adjacentRings.add(handler.getCopyInstance(originalRing));
- }
- }
-}
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 40a8c41668562af06c6b8497cf2b9a8dfc221e42..e55e63632570a659c01d3e36d31777d61fe24fe0 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
@@ -1,12 +1,9 @@
package de.hft.stuttgart.citydoctor2.datastructure;
import de.hft.stuttgart.citydoctor2.check.Check;
-import de.hft.stuttgart.citydoctor2.check.CheckError;
-import de.hft.stuttgart.citydoctor2.check.CheckId;
import de.hft.stuttgart.citydoctor2.parser.ParserConfiguration;
import de.hft.stuttgart.citydoctor2.utils.CityGmlUtils;
-import de.hft.stuttgart.citydoctor2.utils.CopyHandler;
-import de.hft.stuttgart.citydoctor2.utils.Copyable;
+import javafx.scene.paint.Color;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.citygml4j.core.model.core.AbstractCityObject;
@@ -47,7 +44,7 @@ public class GenericCityObject extends CityObject {
}
@Override
- public void reCreateGeometries(GeometryFactory factory, ParserConfiguration config) {
+ public void rebuildGeometries(GeometryFactory factory, ParserConfiguration config) {
for (Geometry geom : getGeometries()) {
if (geom instanceof ImplicitGeometryHolder) {
continue;
@@ -60,23 +57,21 @@ public class GenericCityObject extends CityObject {
setSolidAccordingToLod(geom, solid);
}
}
- for (BoundarySurface bs : boundarySurfaceList) {
- reCreateBoundarySurface(factory, config, bs);
- }
+ removeEmptyBoundarySurfaces();
}
- private void reCreateBoundarySurface(GeometryFactory factory, ParserConfiguration config, BoundarySurface bs) {
- if (bs.getGeometries().isEmpty()) {
- for (AbstractSpaceBoundaryProperty bsp : cgmlGos.getBoundaries()) {
- if (bsp.getObject() != null && bsp.getObject() == bs.getGmlObject()) {
- logger.warn("Found empty boundary surface: {}, removing from generic object", bs.getGmlId());
- cgmlGos.getBoundaries().remove(bsp);
- break;
+ private void removeEmptyBoundarySurfaces() {
+ for (BoundarySurface bs : boundarySurfaceList) {
+ if (bs.getGeometries().isEmpty()) {
+ for (AbstractSpaceBoundaryProperty bsp : cgmlGos.getBoundaries()) {
+ if (bsp.getObject() != null && bsp.getObject() == bs.getGmlObject()) {
+ logger.warn("Found empty boundary surface: {}, removing from feature", bs.getGmlId());
+ cgmlGos.getBoundaries().remove(bsp);
+ break;
+ }
}
}
- return;
}
- bs.reCreateGeometries(factory, config);
}
private void setMultiSurfaceAccordingToLod(Geometry geom, MultiSurface ms) {
@@ -119,86 +114,9 @@ public class GenericCityObject extends CityObject {
throw new IllegalStateException("Cannot add " + geom.getLod() + " solid to buildings");
}
}
-
- @Override
- public void collectContainedErrors(List errors) {
- super.collectContainedErrors(errors);
- for (BoundarySurface bs : boundarySurfaceList) {
- bs.collectContainedErrors(errors);
- }
- }
-
- @Override
- public void clearAllContainedCheckResults() {
- super.clearAllContainedCheckResults();
- for (BoundarySurface bs : boundarySurfaceList) {
- bs.clearAllContainedCheckResults();
- }
- }
-
- @Override
- public boolean containsError(CheckId checkIdentifier) {
- boolean hasError = super.containsError(checkIdentifier);
- if (hasError) {
- return true;
- }
- for (BoundarySurface bs : boundarySurfaceList) {
- if (bs.containsError(checkIdentifier)) {
- return true;
- }
- }
- return false;
- }
-
- @Override
- public boolean containsAnyError() {
- boolean hasError = super.containsAnyError();
- if (hasError) {
- return true;
- }
- for (BoundarySurface bs : boundarySurfaceList) {
- if (bs.containsAnyError()) {
- return true;
- }
- }
- return false;
- }
-
- @Override
- public void prepareForChecking() {
- super.prepareForChecking();
- for (BoundarySurface bs : boundarySurfaceList) {
- bs.prepareForChecking();
- }
- }
-
- @Override
- public void clearMetaInformation() {
- super.clearMetaInformation();
- for (BoundarySurface bs : boundarySurfaceList) {
- bs.clearMetaInformation();
- }
- }
-
- @Override
- public void collectInstances(CopyHandler handler) {
- super.collectInstances(handler);
- handler.addInstance(boundarySurfaceList);
- }
-
- @Override
- public void fillValues(Copyable original, CopyHandler handler) {
- super.fillValues(original, handler);
- GenericCityObject originalGos = (GenericCityObject) original;
- for (BoundarySurface originalBs : originalGos.boundarySurfaceList) {
- boundarySurfaceList.add(handler.getCopyInstance(originalBs));
- }
- cgmlGos = originalGos.cgmlGos;
- }
-
@Override
public AbstractCityObject getGmlObject() {
- return null;
+ return cgmlGos;
}
@Override
@@ -210,16 +128,23 @@ public class GenericCityObject extends CityObject {
return boundarySurfaceList;
}
+ @Override
+ public Color getRenderColor() {
+ return Color.DARKGOLDENROD;
+ }
+
@Override
public void unsetGmlGeometries() {
cgmlGos.setLod1Solid(null);
cgmlGos.setLod2Solid(null);
cgmlGos.setLod3Solid(null);
+ cgmlGos.setLod0MultiSurface(null);
cgmlGos.setLod2MultiSurface(null);
cgmlGos.setLod3MultiSurface(null);
- for (BoundarySurface bs : boundarySurfaceList) {
- bs.unsetGmlGeometries();
- }
+ cgmlGos.getDeprecatedProperties().setLod1Geometry(null);
+ cgmlGos.getDeprecatedProperties().setLod2Geometry(null);
+ cgmlGos.getDeprecatedProperties().setLod3Geometry(null);
+ cgmlGos.getDeprecatedProperties().setLod4Geometry(null);
}
@Override
@@ -236,9 +161,4 @@ public class GenericCityObject extends CityObject {
bs.setParent(this);
}
-
- @Override
- public Copyable createCopyInstance() {
- return new GenericCityObject();
- }
}
diff --git a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/Geometry.java b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/Geometry.java
index 85357649a514ebbf61d59f256fd364c548de386a..5525115c75dd5eea78e8bd82c69c7f37ca624956 100644
--- a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/Geometry.java
+++ b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/Geometry.java
@@ -19,19 +19,16 @@
package de.hft.stuttgart.citydoctor2.datastructure;
import de.hft.stuttgart.citydoctor2.check.Check;
-import de.hft.stuttgart.citydoctor2.check.CheckError;
-import de.hft.stuttgart.citydoctor2.check.CheckId;
+
import de.hft.stuttgart.citydoctor2.math.Triangle3d;
import de.hft.stuttgart.citydoctor2.math.Vector3d;
import de.hft.stuttgart.citydoctor2.tesselation.TesselatedPolygon;
import de.hft.stuttgart.citydoctor2.utils.BoundingBoxCalculator;
-import de.hft.stuttgart.citydoctor2.utils.CopyHandler;
-import de.hft.stuttgart.citydoctor2.utils.Copyable;
import de.hft.stuttgart.citydoctor2.utils.SerializablePair;
+import javafx.scene.paint.Color;
import java.io.Serial;
import java.util.*;
-import java.util.Map.Entry;
/**
* Representation of a geometry containing the polygons and edges
@@ -207,49 +204,6 @@ public class Geometry extends GmlElement {
+ a[0] * b[1] * c[2];
}
- @Override
- public boolean containsError(CheckId checkIdentifier) {
- boolean hasError = super.containsError(checkIdentifier);
- if (hasError) {
- return true;
- }
- for (Polygon p : polygons) {
- if (p.containsError(checkIdentifier)) {
- return true;
- }
- }
- return false;
- }
-
- @Override
- public void clearAllContainedCheckResults() {
- super.clearCheckResults();
- for (Polygon p : polygons) {
- p.clearAllContainedCheckResults();
- }
- }
-
- @Override
- public void collectContainedErrors(List errors) {
- super.collectContainedErrors(errors);
- for (Polygon p : polygons) {
- p.collectContainedErrors(errors);
- }
- }
-
- @Override
- public boolean containsAnyError() {
- boolean hasError = super.containsAnyError();
- if (hasError) {
- return true;
- }
- for (Polygon p : polygons) {
- if (p.containsAnyError()) {
- return true;
- }
- }
- return false;
- }
@Override
public void accept(Check c) {
@@ -378,13 +332,8 @@ public class Geometry extends GmlElement {
return false;
}
- @Override
- public void prepareForChecking() {
- updateEdgesAndVertices();
- }
- @Override
- public void clearMetaInformation() {
+ public void clearMetaData() {
if (vertices != null) {
for (Vertex v : vertices) {
v.clearAdjacentRings();
@@ -395,57 +344,7 @@ public class Geometry extends GmlElement {
edgeMap = null;
}
- @Override
- public void collectInstances(CopyHandler handler) {
- handler.addInstance(parent);
- handler.addInstance(polygons);
- handler.addInstance(edges);
- handler.addInstance(vertices);
- if (edgeMap != null) {
- for (Entry, Edge> e : edgeMap.entrySet()) {
- handler.addInstance(e.getKey().getValue0());
- handler.addInstance(e.getKey().getValue1());
- handler.addInstance(e.getValue());
- }
- }
- }
-
- @Override
- public Copyable createCopyInstance() {
- return new Geometry(type, lod);
- }
-
- @Override
- public void fillValues(Copyable original, CopyHandler handler) {
- super.fillValues(original, handler);
- Geometry originalGeometry = (Geometry) original;
- for (Polygon originalPoly : originalGeometry.polygons) {
- polygons.add(handler.getCopyInstance(originalPoly));
- }
- if (originalGeometry.edges != null) {
- edges = new ArrayList<>(originalGeometry.edges.size());
- for (Edge originalEdge : originalGeometry.edges) {
- edges.add(handler.getCopyInstance(originalEdge));
- }
- }
- if (originalGeometry.edgeMap != null) {
- edgeMap = new HashMap<>(originalGeometry.edgeMap.size());
- for (Entry, Edge> originalEntry : originalGeometry.edgeMap.entrySet()) {
- Vertex copyV0 = handler.getCopyInstance(originalEntry.getKey().getValue0());
- Vertex copyV1 = handler.getCopyInstance(originalEntry.getKey().getValue1());
- SerializablePair pair = new SerializablePair<>(copyV0, copyV1);
- Edge copyEdge = handler.getCopyInstance(originalEntry.getValue());
- edgeMap.put(pair, copyEdge);
- }
- }
- if (originalGeometry.vertices != null) {
- vertices = new ArrayList<>(originalGeometry.vertices.size());
- for (Vertex originalVertex : originalGeometry.vertices) {
- vertices.add(handler.getCopyInstance(originalVertex));
- }
- }
- parent = handler.getCopyInstance(originalGeometry.parent);
-
+ public Color getRenderColor() {
+ return parent.getRenderColor();
}
-
}
diff --git a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/GmlElement.java b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/GmlElement.java
index 4b719599b0d81e4a0b0f878001e6e6857709b8a9..46e5d8578aa8ff4ce16605de04cd680827b88bbd 100644
--- a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/GmlElement.java
+++ b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/GmlElement.java
@@ -19,8 +19,6 @@
package de.hft.stuttgart.citydoctor2.datastructure;
import de.hft.stuttgart.citydoctor2.check.Checkable;
-import de.hft.stuttgart.citydoctor2.utils.CopyHandler;
-import de.hft.stuttgart.citydoctor2.utils.Copyable;
import java.io.Serial;
@@ -29,7 +27,7 @@ import java.io.Serial;
*
* @author Matthias Betz
*/
-public abstract class GmlElement extends Checkable implements Copyable {
+public abstract class GmlElement extends Checkable {
@Serial
private static final long serialVersionUID = -3242505393303017359L;
@@ -52,11 +50,5 @@ public abstract class GmlElement extends Checkable implements Copyable {
return gmlId != null && !gmlId.isGenerated();
}
- @Override
- public void fillValues(Copyable original, CopyHandler handler) {
- GmlElement originalElement = (GmlElement) original;
- // generate gml id before copying
- gmlId = originalElement.getGmlId();
- }
}
diff --git a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/ImplicitGeometryHolder.java b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/ImplicitGeometryHolder.java
index cf7380109110816c7a43f639c547dc271b1861fb..49e07c810c006cfac294d3b9faf941390773d761 100644
--- a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/ImplicitGeometryHolder.java
+++ b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/ImplicitGeometryHolder.java
@@ -62,32 +62,6 @@ public class ImplicitGeometryHolder extends Geometry {
prototypeGeometry.accept(c);
}
- @Override
- public boolean containsError(CheckId checkIdentifier) {
- return prototypeGeometry.containsError(checkIdentifier);
- }
-
- @Override
- public void clearAllContainedCheckResults() {
- prototypeGeometry.clearAllContainedCheckResults();
- }
-
- @Override
- public void collectContainedErrors(List errors) {
- prototypeGeometry.clearAllContainedCheckResults();
- }
-
- @Override
- public boolean containsAnyError() {
- return prototypeGeometry.containsAnyError();
- }
-
- @Override
- public void prepareForChecking() {
- this.updateEdgesAndVertices();
- prototypeGeometry.prepareForChecking();
- }
-
@Override
public boolean isValidated() {
return prototypeGeometry.isValidated();
diff --git a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/Installation.java b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/Installation.java
index 21a80666690cd159a4cdb9321d6126ef034b4577..7258df5ad410960fbc9663002f0a2d47e30c9148 100644
--- a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/Installation.java
+++ b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/Installation.java
@@ -19,15 +19,16 @@
package de.hft.stuttgart.citydoctor2.datastructure;
import de.hft.stuttgart.citydoctor2.check.Check;
-import de.hft.stuttgart.citydoctor2.check.CheckError;
-import de.hft.stuttgart.citydoctor2.check.CheckId;
+
import de.hft.stuttgart.citydoctor2.parser.ParserConfiguration;
import de.hft.stuttgart.citydoctor2.utils.CityGmlUtils;
-import de.hft.stuttgart.citydoctor2.utils.CopyHandler;
-import de.hft.stuttgart.citydoctor2.utils.Copyable;
+import javafx.scene.paint.Color;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
import org.citygml4j.core.model.bridge.BridgeInstallation;
import org.citygml4j.core.model.construction.AbstractInstallation;
import org.citygml4j.core.model.core.AbstractSpaceBoundaryProperty;
+import org.citygml4j.core.model.tunnel.TunnelInstallation;
import org.citygml4j.core.util.geometry.GeometryFactory;
import org.xmlobjects.gml.model.geometry.GeometryProperty;
import org.xmlobjects.gml.model.geometry.aggregates.MultiSurface;
@@ -44,13 +45,15 @@ public class Installation extends CityObject {
@Serial
private static final long serialVersionUID = 1576237433322680191L;
+ private static final Logger logger = LogManager.getLogger(Installation.class);
+
private List boundarySurfaces = new ArrayList<>(4);
private AbstractInstallation gmlBi;
private CityObject parent;
- public void reCreateGeometries(GeometryFactory factory, ParserConfiguration config) {
+ public void rebuildGeometries(GeometryFactory factory, ParserConfiguration config) {
for (Geometry geom : getGeometries()) {
if (geom.getType() == GeometryType.MULTI_SURFACE) {
MultiSurface ms = CityGmlUtils.createMultiSurface(geom, factory, config);
@@ -66,8 +69,20 @@ public class Installation extends CityObject {
throw new IllegalStateException("BuildingInstallation not have Solid geometries");
}
}
+ removeEmptyBoundarySurfaces();
+ }
+
+ private void removeEmptyBoundarySurfaces() {
for (BoundarySurface bs : boundarySurfaces) {
- bs.reCreateGeometries(factory, config);
+ if (bs.getGeometries().isEmpty()) {
+ for (AbstractSpaceBoundaryProperty bsp : gmlBi.getBoundaries()) {
+ if (bsp.getObject() != null && bsp.getObject() == bs.getGmlObject()) {
+ logger.warn("Found empty boundary surface: {}, removing from feature", bs.getGmlId());
+ gmlBi.getBoundaries().remove(bsp);
+ break;
+ }
+ }
+ }
}
}
@@ -125,50 +140,6 @@ public class Installation extends CityObject {
}
}
- @Override
- public void clearAllContainedCheckResults() {
- super.clearAllContainedCheckResults();
- for (BoundarySurface bs : boundarySurfaces) {
- bs.clearAllContainedCheckResults();
- }
- }
-
- @Override
- public void collectContainedErrors(List errors) {
- super.collectContainedErrors(errors);
- for (BoundarySurface bs : boundarySurfaces) {
- bs.collectContainedErrors(errors);
- }
- }
-
- @Override
- public boolean containsAnyError() {
- boolean hasError = super.containsAnyError();
- if (hasError) {
- return true;
- }
- for (BoundarySurface bs : boundarySurfaces) {
- if (bs.containsAnyError()) {
- return true;
- }
- }
- return false;
- }
-
- @Override
- public boolean containsError(CheckId checkIdentifier) {
- boolean hasError = super.containsError(checkIdentifier);
- if (hasError) {
- return true;
- }
- for (BoundarySurface bs : boundarySurfaces) {
- if (bs.containsError(checkIdentifier)) {
- return true;
- }
- }
- return false;
- }
-
public void setParent(CityObject parent) {
this.parent = parent;
}
@@ -177,21 +148,36 @@ public class Installation extends CityObject {
return parent;
}
+ @Override
+ public Color getRenderColor() {
+ return parent.getRenderColor().darker();
+ }
+
public void addBoundarySurface(BoundarySurface bs) {
boundarySurfaces.add(bs);
bs.setParent(this);
}
+ @Override
public void unsetGmlGeometries() {
- if (gmlBi instanceof org.citygml4j.core.model.building.BuildingInstallation localBi) {
- localBi.getDeprecatedProperties().setLod2Geometry(null);
- localBi.getDeprecatedProperties().setLod3Geometry(null);
- localBi.getDeprecatedProperties().setLod4Geometry(null);
- } else if (gmlBi instanceof BridgeInstallation localBi) {
- removeGeometriesFromBridgeInstallation(localBi);
- }
- for (BoundarySurface bs : boundarySurfaces) {
- bs.unsetGmlGeometries();
+ gmlBi.setLod0MultiSurface(null);
+ gmlBi.setLod2MultiSurface(null);
+ gmlBi.setLod3MultiSurface(null);
+ gmlBi.setLod1Solid(null);
+ gmlBi.setLod2Solid(null);
+ gmlBi.setLod3Solid(null);
+ if (gmlBi instanceof org.citygml4j.core.model.building.BuildingInstallation buildingInstallation) {
+ buildingInstallation.getDeprecatedProperties().setLod2Geometry(null);
+ buildingInstallation.getDeprecatedProperties().setLod3Geometry(null);
+ buildingInstallation.getDeprecatedProperties().setLod4Geometry(null);
+ } else if (gmlBi instanceof BridgeInstallation bridgeInstallation) {
+ bridgeInstallation.getDeprecatedProperties().setLod2Geometry(null);
+ bridgeInstallation.getDeprecatedProperties().setLod3Geometry(null);
+ bridgeInstallation.getDeprecatedProperties().setLod4Geometry(null);
+ } else if (gmlBi instanceof TunnelInstallation tunnelInstallation) {
+ tunnelInstallation.getDeprecatedProperties().setLod2Geometry(null);
+ tunnelInstallation.getDeprecatedProperties().setLod3Geometry(null);
+ tunnelInstallation.getDeprecatedProperties().setLod4Geometry(null);
}
}
@@ -200,11 +186,6 @@ public class Installation extends CityObject {
return getParent().getTopLevelCityObject();
}
- private void removeGeometriesFromBridgeInstallation(BridgeInstallation localBi) {
- localBi.getDeprecatedProperties().setLod2Geometry(null);
- localBi.getDeprecatedProperties().setLod3Geometry(null);
- localBi.getDeprecatedProperties().setLod4Geometry(null);
- }
public void setGmlObject(AbstractInstallation gmlBi) {
this.gmlBi = gmlBi;
@@ -242,46 +223,4 @@ public class Installation extends CityObject {
}
return boundarySurfaces;
}
-
- @Override
- public void clearMetaInformation() {
- super.clearMetaInformation();
- for (BoundarySurface bs : boundarySurfaces) {
- bs.clearMetaInformation();
- }
- }
-
- @Override
- public void prepareForChecking() {
- super.prepareForChecking();
- for (BoundarySurface bs : boundarySurfaces) {
- bs.prepareForChecking();
- }
- }
-
- @Override
- public void fillValues(Copyable original, CopyHandler handler) {
- super.fillValues(original, handler);
- Installation originalBi = (Installation) original;
- for (BoundarySurface originalBs : originalBi.boundarySurfaces) {
- boundarySurfaces.add(handler.getCopyInstance(originalBs));
- }
- gmlBi = originalBi.gmlBi;
- parent = handler.getCopyInstance(parent);
- }
-
- @Override
- public void collectInstances(CopyHandler handler) {
- super.collectInstances(handler);
- for (BoundarySurface bs : boundarySurfaces) {
- handler.addInstance(bs);
- }
- handler.addInstance(parent);
- }
-
- @Override
- public Copyable createCopyInstance() {
- return new Installation();
- }
-
}
diff --git a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/LandObject.java b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/LandObject.java
index bee5b6d0b06ac61c59ad909e6dbeae4d83adbaee..d4ab4acae72b4089e8638e17af97cff9776ba16b 100644
--- a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/LandObject.java
+++ b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/LandObject.java
@@ -21,7 +21,7 @@ package de.hft.stuttgart.citydoctor2.datastructure;
import de.hft.stuttgart.citydoctor2.check.Check;
import de.hft.stuttgart.citydoctor2.parser.ParserConfiguration;
import de.hft.stuttgart.citydoctor2.utils.CityGmlUtils;
-import de.hft.stuttgart.citydoctor2.utils.Copyable;
+import javafx.scene.paint.Color;
import org.citygml4j.core.model.core.AbstractCityObject;
import org.citygml4j.core.model.landuse.LandUse;
import org.citygml4j.core.util.geometry.GeometryFactory;
@@ -47,7 +47,7 @@ public class LandObject extends CityObject {
}
@Override
- public void reCreateGeometries(GeometryFactory factory, ParserConfiguration config) {
+ public void rebuildGeometries(GeometryFactory factory, ParserConfiguration config) {
for (Geometry geom : getGeometries()) {
if (geom.getType() == GeometryType.MULTI_SURFACE) {
MultiSurface ms = CityGmlUtils.createMultiSurface(geom, factory, config);
@@ -63,6 +63,11 @@ public class LandObject extends CityObject {
return FeatureType.LAND;
}
+ @Override
+ public Color getRenderColor() {
+ return Color.TAN;
+ }
+
private void setMultiSurfaceAccordingToLod(Geometry geom, MultiSurface ms) {
switch (geom.getLod()) {
case LOD0:
@@ -119,9 +124,4 @@ public class LandObject extends CityObject {
return "LandObject [id=" + getGmlId() + "]";
}
- @Override
- public Copyable createCopyInstance() {
- return new LandObject(lu);
- }
-
}
diff --git a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/LinearRing.java b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/LinearRing.java
index ff16150b33a55075e2099d5511d75b68067fc460..2f48bcdce4039bd1e1d2bd97da1b8056c82da480 100644
--- a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/LinearRing.java
+++ b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/LinearRing.java
@@ -20,8 +20,6 @@ package de.hft.stuttgart.citydoctor2.datastructure;
import de.hft.stuttgart.citydoctor2.check.Check;
import de.hft.stuttgart.citydoctor2.math.*;
-import de.hft.stuttgart.citydoctor2.utils.CopyHandler;
-import de.hft.stuttgart.citydoctor2.utils.Copyable;
import java.io.Serial;
import java.util.ArrayList;
@@ -235,11 +233,6 @@ public class LinearRing extends GmlElement {
}
}
- @Override
- public void clearAllContainedCheckResults() {
- super.clearCheckResults();
- }
-
public void setParent(Polygon polygon) {
parent = polygon;
}
@@ -313,37 +306,8 @@ public class LinearRing extends GmlElement {
vertices.addAll(extRing);
}
- @Override
- public void prepareForChecking() {
- parent.getParent().prepareForChecking();
- }
-
- @Override
- public void clearMetaInformation() {
- parent.getParent().clearMetaInformation();
- }
-
- @Override
- public void fillValues(Copyable original, CopyHandler handler) {
- super.fillValues(original, handler);
- LinearRing originalRing = (LinearRing) original;
- type = originalRing.type;
- parent = handler.getCopyInstance(originalRing.parent);
- for (Vertex v : originalRing.vertices) {
- vertices.add(handler.getCopyInstance(v));
- }
+ public void prepareLowMemoryUsageMode() {
+ parent.prepareLowMemoryUsageMode();
}
- @Override
- public void collectInstances(CopyHandler handler) {
- for (Vertex v : vertices) {
- handler.addInstance(v);
- }
- handler.addInstance(parent);
- }
-
- @Override
- public Copyable createCopyInstance() {
- return new LinearRing(type);
- }
}
diff --git a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/LinkedPolygon.java b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/LinkedPolygon.java
index 5f6a167518430ff0121ecd463d2469b66436032c..1c940c1a0def4f5f1a4f898117485e1ce96f6114 100644
--- a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/LinkedPolygon.java
+++ b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/LinkedPolygon.java
@@ -19,13 +19,11 @@
package de.hft.stuttgart.citydoctor2.datastructure;
import de.hft.stuttgart.citydoctor2.check.Check;
-import de.hft.stuttgart.citydoctor2.check.CheckError;
import de.hft.stuttgart.citydoctor2.check.CheckId;
import de.hft.stuttgart.citydoctor2.check.CheckResult;
import de.hft.stuttgart.citydoctor2.math.Vector3d;
import de.hft.stuttgart.citydoctor2.tesselation.TesselatedPolygon;
-import de.hft.stuttgart.citydoctor2.utils.CopyHandler;
-import de.hft.stuttgart.citydoctor2.utils.Copyable;
+import javafx.scene.paint.Color;
import java.io.Serial;
import java.util.List;
@@ -77,8 +75,8 @@ public class LinkedPolygon extends Polygon {
}
@Override
- public boolean hasAnyError() {
- return poly.hasAnyError();
+ public boolean hasAnyErrorWithoutDependencies() {
+ return poly.hasAnyErrorWithoutDependencies();
}
@Override
@@ -117,16 +115,6 @@ public class LinkedPolygon extends Polygon {
poly.addCheckResult(cr);
}
- @Override
- public void collectContainedErrors(List errors) {
- poly.collectContainedErrors(errors);
- }
-
- @Override
- public boolean containsAnyError() {
- return poly.containsAnyError();
- }
-
@Override
public boolean containsError(CheckId checkIdentifier) {
return poly.containsError(checkIdentifier);
@@ -247,24 +235,14 @@ public class LinkedPolygon extends Polygon {
poly.anonymize();
}
- @Override
- public void clearAllContainedCheckResults() {
- poly.clearAllContainedCheckResults();
- }
-
@Override
public ConcretePolygon getOriginal() {
return poly;
}
@Override
- public void prepareForChecking() {
- poly.prepareForChecking();
- }
-
- @Override
- public void clearMetaInformation() {
- poly.clearMetaInformation();
+ public void prepareLowMemoryUsageMode() {
+ poly.prepareLowMemoryUsageMode();
}
@Override
@@ -272,24 +250,6 @@ public class LinkedPolygon extends Polygon {
return false;
}
- @Override
- public void collectInstances(CopyHandler handler) {
- handler.addInstance(parent);
- handler.addInstance(poly);
- }
-
- @Override
- public Copyable createCopyInstance() {
- return new LinkedPolygon();
- }
-
- @Override
- public void fillValues(Copyable original, CopyHandler handler) {
- LinkedPolygon linkedOriginal = (LinkedPolygon) original;
- parent = handler.getCopyInstance(linkedOriginal.parent);
- poly = handler.getCopyInstance(linkedOriginal.poly);
- }
-
@Override
public void remove() {
poly.remove();
@@ -300,4 +260,9 @@ public class LinkedPolygon extends Polygon {
return poly.getArea();
}
+ @Override
+ public Color getRenderColor() {
+ return poly.getRenderColor();
+ }
+
}
diff --git a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/Opening.java b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/Opening.java
index c33a1858adb4d9c22e1f3f986cb0ad2beef8d886..19990e966ff1710e74c22ffff6315bf9fc830791 100644
--- a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/Opening.java
+++ b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/Opening.java
@@ -21,8 +21,7 @@ package de.hft.stuttgart.citydoctor2.datastructure;
import de.hft.stuttgart.citydoctor2.check.Check;
import de.hft.stuttgart.citydoctor2.parser.ParserConfiguration;
import de.hft.stuttgart.citydoctor2.utils.CityGmlUtils;
-import de.hft.stuttgart.citydoctor2.utils.CopyHandler;
-import de.hft.stuttgart.citydoctor2.utils.Copyable;
+import javafx.scene.paint.Color;
import org.citygml4j.core.model.construction.AbstractFillingSurface;
import org.citygml4j.core.model.core.AbstractCityObject;
import org.citygml4j.core.util.geometry.GeometryFactory;
@@ -61,7 +60,7 @@ public class Opening extends CityObject {
this.ao = ao;
}
- public void reCreateGeometries(GeometryFactory factory, ParserConfiguration config) {
+ public void rebuildGeometries(GeometryFactory factory, ParserConfiguration config) {
if (ao.getId() != null) {
ao.setId(getGmlId().getGmlString());
}
@@ -122,11 +121,6 @@ public class Opening extends CityObject {
}
}
- @Override
- public void clearAllContainedCheckResults() {
- super.clearCheckResults();
- }
-
public void unsetGmlGeometries() {
ao.setLod0MultiSurface(null);
ao.setLod1MultiSurface(null);
@@ -160,24 +154,12 @@ public class Opening extends CityObject {
}
@Override
- public Copyable createCopyInstance() {
- return new Opening(type);
- }
-
- @Override
- public void collectInstances(CopyHandler handler) {
- super.collectInstances(handler);
- handler.addInstance(partOf);
- }
-
- @Override
- public void fillValues(Copyable original, CopyHandler handler) {
- super.fillValues(original, handler);
- Opening originalOpening = (Opening) original;
- partOf = handler.getCopyInstance(originalOpening.partOf);
- type = originalOpening.type;
- featureType = originalOpening.featureType;
- ao = originalOpening.ao;
+ public Color getRenderColor() {
+ return switch (type) {
+ case DOOR -> Color.ORANGE;
+ case WINDOW -> Color.TEAL;
+ default -> Color.BLACK;
+ };
}
}
diff --git a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/Polygon.java b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/Polygon.java
index 27e62aea052f8e1e8882a9e5969a94e94c590735..7adb8bc778d23501bb2401c21f90af1ff4a607a0 100644
--- a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/Polygon.java
+++ b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/Polygon.java
@@ -20,6 +20,7 @@ package de.hft.stuttgart.citydoctor2.datastructure;
import de.hft.stuttgart.citydoctor2.math.Vector3d;
import de.hft.stuttgart.citydoctor2.tesselation.TesselatedPolygon;
+import javafx.scene.paint.Color;
import java.io.Serial;
import java.util.List;
@@ -80,8 +81,12 @@ public abstract class Polygon extends GmlElement {
public abstract ConcretePolygon getOriginal();
+ public abstract void prepareLowMemoryUsageMode();
+
public abstract void remove();
public abstract double getArea();
+ public abstract Color getRenderColor();
+
}
\ No newline at end of file
diff --git a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/ReliefObject.java b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/ReliefObject.java
index e96eacd340b15a5ad163d1a3fb33cf818d2cf7f9..b27b485e4788126cfe17fa0c57dc5a400bc5446d 100644
--- a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/ReliefObject.java
+++ b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/ReliefObject.java
@@ -19,11 +19,8 @@
package de.hft.stuttgart.citydoctor2.datastructure;
import de.hft.stuttgart.citydoctor2.check.Check;
-import de.hft.stuttgart.citydoctor2.check.CheckError;
-import de.hft.stuttgart.citydoctor2.check.CheckId;
import de.hft.stuttgart.citydoctor2.parser.ParserConfiguration;
-import de.hft.stuttgart.citydoctor2.utils.CopyHandler;
-import de.hft.stuttgart.citydoctor2.utils.Copyable;
+import javafx.scene.paint.Color;
import org.citygml4j.core.model.relief.ReliefFeature;
import org.citygml4j.core.util.geometry.GeometryFactory;
@@ -56,83 +53,7 @@ public class ReliefObject extends CityObject {
}
@Override
- public void collectInstances(CopyHandler handler) {
- handler.addInstance(components);
- }
-
- @Override
- public void fillValues(Copyable original, CopyHandler handler) {
- super.fillValues(original, handler);
- ReliefObject originalRelief = (ReliefObject) original;
- for (TinObject tin : originalRelief.components) {
- components.add(handler.getCopyInstance(tin));
- }
- }
-
- @Override
- public Copyable createCopyInstance() {
- return new ReliefObject(feature);
- }
-
- @Override
- public void prepareForChecking() {
- for (TinObject component : components) {
- component.prepareForChecking();
- }
- }
-
- @Override
- public void clearMetaInformation() {
- for (TinObject component : components) {
- component.clearMetaInformation();
- }
- }
-
- @Override
- public void clearAllContainedCheckResults() {
- for (TinObject component : components) {
- component.clearAllContainedCheckResults();
- }
- }
-
- @Override
- public void collectContainedErrors(List errors) {
- super.collectContainedErrors(errors);
- for (TinObject tin : components) {
- tin.collectContainedErrors(errors);
- }
- }
-
- @Override
- public boolean containsAnyError() {
- boolean containsError = super.containsAnyError();
- if (containsError) {
- return true;
- }
- for (TinObject tin : components) {
- if (tin.containsAnyError()) {
- return true;
- }
- }
- return false;
- }
-
- @Override
- public boolean containsError(CheckId checkIdentifier) {
- boolean hasError = super.containsError(checkIdentifier);
- if (hasError) {
- return true;
- }
- for (TinObject tin : components) {
- if (tin.containsError(checkIdentifier)) {
- return true;
- }
- }
- return false;
- }
-
- @Override
- public void reCreateGeometries(GeometryFactory factory, ParserConfiguration config) {
+ public void rebuildGeometries(GeometryFactory factory, ParserConfiguration config) {
// no geometries
}
@@ -156,6 +77,15 @@ public class ReliefObject extends CityObject {
return FeatureType.LAND;
}
+ @Override
+ public Color getRenderColor() {
+ return Color.TAN;
+ }
+
+ public void addComponent(TinObject component) {
+ components.add(component);
+ }
+
public List getComponents() {
return components;
}
diff --git a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/Storey.java b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/Storey.java
index 55daa576a92b9f359d2b404d85faaccc02347405..c5cea9b5b65dd1725fe12e1e730e71711ef6d0a1 100644
--- a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/Storey.java
+++ b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/Storey.java
@@ -1,11 +1,7 @@
package de.hft.stuttgart.citydoctor2.datastructure;
import de.hft.stuttgart.citydoctor2.check.Check;
-import de.hft.stuttgart.citydoctor2.check.CheckError;
-import de.hft.stuttgart.citydoctor2.check.CheckId;
import de.hft.stuttgart.citydoctor2.parser.ParserConfiguration;
-import de.hft.stuttgart.citydoctor2.utils.CopyHandler;
-import de.hft.stuttgart.citydoctor2.utils.Copyable;
import org.citygml4j.core.util.geometry.GeometryFactory;
import java.io.Serial;
@@ -19,25 +15,10 @@ public class Storey extends AbstractBuildingSubdivision {
private final List buildingUnits = new ArrayList<>();
- @Override
- public Copyable createCopyInstance() {
- return new Storey();
- }
-
- @Override
- public void unsetGmlGeometries() {
- super.unsetGmlGeometries();
- for (BuildingUnit buildingUnit : buildingUnits) {
- buildingUnit.unsetGmlGeometries();
- }
- }
@Override
- public void reCreateGeometries(GeometryFactory factory, ParserConfiguration config) {
+ public void rebuildGeometries(GeometryFactory factory, ParserConfiguration config) {
super.reCreateGeometries(factory, config);
- for (BuildingUnit buildingUnit : buildingUnits) {
- buildingUnit.reCreateGeometries(factory, config);
- }
}
@Override
@@ -48,84 +29,6 @@ public class Storey extends AbstractBuildingSubdivision {
}
}
- @Override
- public void collectContainedErrors(List errors) {
- super.collectContainedErrors(errors);
- for (BuildingUnit buildingUnit : buildingUnits) {
- buildingUnit.collectContainedErrors(errors);
- }
- }
-
- @Override
- public void clearAllContainedCheckResults() {
- super.clearAllContainedCheckResults();
- for (BuildingUnit buildingUnit : buildingUnits) {
- buildingUnit.clearAllContainedCheckResults();
- }
- }
-
- @Override
- public boolean containsError(CheckId checkIdentifier) {
- boolean hasError = super.containsError(checkIdentifier);
- if (hasError) {
- return true;
- }
- for (BuildingUnit buildingUnit : buildingUnits) {
- if (buildingUnit.containsError(checkIdentifier)) {
- return true;
- }
- }
- return false;
- }
-
- @Override
- public boolean containsAnyError() {
- boolean hasError = super.containsAnyError();
- if (hasError) {
- return true;
- }
- for (BuildingUnit buildingUnit : buildingUnits) {
- if (buildingUnit.containsAnyError()) {
- return true;
- }
- }
- return false;
- }
-
- @Override
- public void prepareForChecking() {
- super.prepareForChecking();
- for (BuildingUnit buildingUnit : buildingUnits) {
- buildingUnit.prepareForChecking();
- }
- }
-
- @Override
- public void clearMetaInformation() {
- super.clearMetaInformation();
- for (BuildingUnit buildingUnit : buildingUnits) {
- buildingUnit.clearMetaInformation();
- }
- }
-
- @Override
- public void collectInstances(CopyHandler handler) {
- super.collectInstances(handler);
- for (BuildingUnit buildingUnit : buildingUnits) {
- buildingUnit.collectInstances(handler);
- }
- }
-
- @Override
- public void fillValues(Copyable original, CopyHandler handler) {
- super.fillValues(original, handler);
- Storey originalSt = (Storey) original;
- for (BuildingUnit buildingUnit : originalSt.buildingUnits) {
- buildingUnits.add(handler.getCopyInstance(buildingUnit));
- }
- this.abs = originalSt.abs;
- }
-
public List getBuildingUnits() {
return buildingUnits;
}
diff --git a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/TinObject.java b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/TinObject.java
index 8d073aa06910a1ad73d0dd509b3ac8644f15029e..4fde9c9ea3263d2aa84ce13f35b84b5818296311 100644
--- a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/TinObject.java
+++ b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/TinObject.java
@@ -21,9 +21,11 @@ package de.hft.stuttgart.citydoctor2.datastructure;
import de.hft.stuttgart.citydoctor2.check.Check;
import de.hft.stuttgart.citydoctor2.parser.ParserConfiguration;
import de.hft.stuttgart.citydoctor2.utils.CityGmlUtils;
+import javafx.scene.paint.Color;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.citygml4j.core.model.relief.TINRelief;
+import org.citygml4j.core.model.relief.TinProperty;
import org.citygml4j.core.util.geometry.GeometryFactory;
import org.xmlobjects.gml.model.geometry.primitives.AbstractRingProperty;
import org.xmlobjects.gml.model.geometry.primitives.Triangle;
@@ -55,13 +57,9 @@ public class TinObject extends CityObject {
}
}
- @Override
- public TinObject createCopyInstance() {
- return new TinObject(gmlRelief);
- }
@Override
- public void reCreateGeometries(GeometryFactory factory, ParserConfiguration config) {
+ public void rebuildGeometries(GeometryFactory factory, ParserConfiguration config) {
if (getGeometries().isEmpty()) {
return;
}
@@ -79,6 +77,8 @@ public class TinObject extends CityObject {
t.setExterior(new AbstractRingProperty(CityGmlUtils.createGmlRing(factory, config, ring)));
triangles.add(t);
}
+ this.gmlRelief.setTin(new TinProperty(surface));
+ gmlRelief.setLod(geom.getLod().ordinal());
}
@Override
@@ -101,4 +101,9 @@ public class TinObject extends CityObject {
return FeatureType.LAND;
}
+ @Override
+ public Color getRenderColor() {
+ return Color.TAN;
+ }
+
}
diff --git a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/TopLevelTransportFeature.java b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/TopLevelTransportFeature.java
index 7097ffd6cc019358faf57c3a05cd8d194cf6491d..8b41c6993481bede6295851d78dc58f7034a6d97 100644
--- a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/TopLevelTransportFeature.java
+++ b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/TopLevelTransportFeature.java
@@ -1,18 +1,12 @@
package de.hft.stuttgart.citydoctor2.datastructure;
import de.hft.stuttgart.citydoctor2.check.Check;
-import de.hft.stuttgart.citydoctor2.check.CheckError;
-import de.hft.stuttgart.citydoctor2.check.CheckId;
-import de.hft.stuttgart.citydoctor2.parser.ParserConfiguration;
-import de.hft.stuttgart.citydoctor2.utils.CopyHandler;
-import de.hft.stuttgart.citydoctor2.utils.Copyable;
import org.citygml4j.core.model.deprecated.transportation.TransportationComplex;
import org.citygml4j.core.model.transportation.Railway;
import org.citygml4j.core.model.transportation.Road;
import org.citygml4j.core.model.transportation.Square;
import org.citygml4j.core.model.transportation.Track;
import org.citygml4j.core.model.transportation.Waterway;
-import org.citygml4j.core.util.geometry.GeometryFactory;
import java.util.ArrayList;
import java.util.List;
@@ -65,10 +59,12 @@ public class TopLevelTransportFeature extends TransportationSpace {
public void addSection(TransportSection section) {
sections.add(section);
+ section.setParent(this);
}
public void addIntersection(TransportSection section) {
intersections.add(section);
+ section.setParent(this);
}
public List getSections() {
@@ -79,78 +75,6 @@ public class TopLevelTransportFeature extends TransportationSpace {
return intersections;
}
- @Override
- public void reCreateGeometries(GeometryFactory factory, ParserConfiguration config) {
- super.reCreateGeometries(factory, config);
- for (TransportSection section : sections) {
- section.reCreateGeometries(factory, config);
- }
- for (TransportSection section : intersections) {
- section.reCreateGeometries(factory, config);
- }
- }
-
-
- @Override
- public boolean containsError(CheckId checkIdentifier) {
- boolean hasError = super.containsError(checkIdentifier);
- if (hasError) {
- return true;
- }
- for (TransportSection section : sections) {
- if (section.containsError(checkIdentifier)) {
- return true;
- }
- }
- for (TransportSection section : intersections) {
- if (section.containsError(checkIdentifier)) {
- return true;
- }
- }
- return false;
- }
-
- @Override
- public void clearAllContainedCheckResults() {
- super.clearAllContainedCheckResults();
- for (TransportSection section : sections) {
- section.clearAllContainedCheckResults();
- }
- for (TransportSection section : intersections) {
- section.clearAllContainedCheckResults();
- }
- }
-
- @Override
- public void collectContainedErrors(List errors) {
- super.collectContainedErrors(errors);
- for (TransportSection section : sections) {
- section.collectContainedErrors(errors);
- }
- for (TransportSection section : intersections) {
- section.collectContainedErrors(errors);
- }
- }
-
- @Override
- public boolean containsAnyError() {
- boolean hasError = super.containsAnyError();
- if (hasError) {
- return true;
- }
- for (TransportSection section : sections) {
- if (section.containsAnyError()) {
- return true;
- }
- }
- for (TransportSection section : intersections) {
- if (section.containsAnyError()) {
- return true;
- }
- }
- return false;
- }
-
@Override
public void accept(Check c) {
super.accept(c);
@@ -165,78 +89,9 @@ public class TopLevelTransportFeature extends TransportationSpace {
}
}
-
- @Override
- public void unsetGmlGeometries() {
- super.unsetGmlGeometries();
- for (TransportSection section : sections) {
- section.unsetGmlGeometries();
- }
- for (TransportSection section : intersections) {
- section.unsetGmlGeometries();
- }
- }
-
- @Override
- public CityObject getTopLevelCityObject() {
- return this;
- }
-
-
@Override
public String toString() {
return "TopLevelTransportFeature [id=" + getGmlId() + "]";
}
- @Override
- public void prepareForChecking() {
- super.prepareForChecking();
- for (TransportSection section : sections) {
- section.prepareForChecking();
- }
- for (TransportSection section : intersections) {
- section.prepareForChecking();
- }
- }
-
- @Override
- public void clearMetaInformation() {
- super.clearMetaInformation();
- for (TransportSection section : sections) {
- section.clearMetaInformation();
- }
- for (TransportSection section : intersections) {
- section.clearMetaInformation();
- }
- }
-
- @Override
- public void collectInstances(CopyHandler handler) {
- super.collectInstances(handler);
- for (TransportSection section : sections) {
- section.collectInstances(handler);
- }
- for (TransportSection section : intersections) {
- section.collectInstances(handler);
- }
- }
-
- @Override
- public void fillValues(Copyable original, CopyHandler handler) {
- super.fillValues(original, handler);
- TransportationObject originalTo = (TransportationObject) original;
- for (TransportSection section : sections) {
- section.fillValues(originalTo, handler);
- }
- for (TransportSection section : intersections) {
- section.fillValues(originalTo, handler);
- }
- }
-
- @Override
- public Copyable createCopyInstance() {
- return new TopLevelTransportFeature(type);
- }
-
-
}
diff --git a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/TrafficAreaObject.java b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/TrafficAreaObject.java
index 28341a4c7a6a45baad8b54c38dc34d1b211371ff..5d9a44ccb35b18859642e528a080f6a94508732f 100644
--- a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/TrafficAreaObject.java
+++ b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/TrafficAreaObject.java
@@ -11,6 +11,9 @@ import org.xmlobjects.gml.model.geometry.aggregates.MultiSurfaceProperty;
public class TrafficAreaObject extends TransportationObject {
+ private TrafficSpaceObject parent;
+
+
public enum TrafficAreaType {
TRAFFIC_AREA, AUXILIARY_TRAFFIC_AREA
}
@@ -24,7 +27,7 @@ public class TrafficAreaObject extends TransportationObject {
}
@Override
- public void reCreateGeometries(GeometryFactory factory, ParserConfiguration config) {
+ public void rebuildGeometries(GeometryFactory factory, ParserConfiguration config) {
for (Geometry geom : getGeometries()) {
if (geom instanceof ImplicitGeometryHolder) {
continue;
@@ -40,6 +43,7 @@ public class TrafficAreaObject extends TransportationObject {
AuxiliaryTrafficArea ata = (AuxiliaryTrafficArea) super.getGmlObject();
setMultiSurfaceAccordingToLod(ata, ms, geom.getLod());
break;
+
}
} else {
throw new IllegalStateException("Geometry in TransportationObject cannot be of type " + geom.getType()
@@ -99,6 +103,8 @@ public class TrafficAreaObject extends TransportationObject {
switch (type) {
case TRAFFIC_AREA:
TrafficArea ta = (TrafficArea) super.getGmlObject();
+ ta.setLod0MultiSurface(null);
+ ta.setLod1MultiSurface(null);
ta.setLod2MultiSurface(null);
ta.setLod3MultiSurface(null);
ta.getDeprecatedProperties().setLod4MultiSurface(null);
@@ -116,7 +122,15 @@ public class TrafficAreaObject extends TransportationObject {
@Override
public CityObject getTopLevelCityObject() {
- return this;
+ return parent.getTopLevelCityObject();
+ }
+
+ public void setParent(TrafficSpaceObject parent) {
+ this.parent = parent;
+ }
+
+ public TrafficSpaceObject getParent() {
+ return parent;
}
@Override
diff --git a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/TrafficSpaceObject.java b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/TrafficSpaceObject.java
index fb07843361a55d741b2ecf8c004d6198697ce1d6..fb60aa918287b7ba8eebe1698486b983c8521f70 100644
--- a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/TrafficSpaceObject.java
+++ b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/TrafficSpaceObject.java
@@ -1,16 +1,14 @@
package de.hft.stuttgart.citydoctor2.datastructure;
import de.hft.stuttgart.citydoctor2.check.Check;
-import de.hft.stuttgart.citydoctor2.check.CheckError;
-import de.hft.stuttgart.citydoctor2.check.CheckId;
import de.hft.stuttgart.citydoctor2.parser.ParserConfiguration;
import de.hft.stuttgart.citydoctor2.utils.CityGmlUtils;
-import de.hft.stuttgart.citydoctor2.utils.CopyHandler;
-import de.hft.stuttgart.citydoctor2.utils.Copyable;
import org.citygml4j.core.model.core.AbstractSpace;
import org.citygml4j.core.util.geometry.GeometryFactory;
import org.xmlobjects.gml.model.geometry.aggregates.MultiSurface;
import org.xmlobjects.gml.model.geometry.aggregates.MultiSurfaceProperty;
+import org.xmlobjects.gml.model.geometry.primitives.Solid;
+import org.xmlobjects.gml.model.geometry.primitives.SolidProperty;
import java.util.ArrayList;
import java.util.List;
@@ -19,6 +17,8 @@ public class TrafficSpaceObject extends TransportationObject {
private final List trafficAreas = new ArrayList<>();
+ private TransportationSpace parent;
+
public enum TrafficSpaceType {
TRAFFIC_SPACE, AUXILIARY_TRAFFIC_SPACE
}
@@ -37,20 +37,26 @@ public class TrafficSpaceObject extends TransportationObject {
public void addTrafficArea(TrafficAreaObject trafficAreaObject) {
trafficAreas.add(trafficAreaObject);
+ trafficAreaObject.setParent(this);
}
@Override
- public void reCreateGeometries(GeometryFactory factory, ParserConfiguration config) {
+ public void rebuildGeometries(GeometryFactory factory, ParserConfiguration config) {
for (Geometry geom : getGeometries()) {
if (geom instanceof ImplicitGeometryHolder) {
continue;
}
- MultiSurface ms = CityGmlUtils.createMultiSurface(geom, factory, config);
AbstractSpace ats = (AbstractSpace) super.getGmlObject();
- setMultiSurfaceAccordingToLod(ats, ms, geom.getLod());
- }
- for (TrafficAreaObject tao : trafficAreas) {
- tao.reCreateGeometries(factory, config);
+ if (geom.getType() == GeometryType.MULTI_SURFACE || geom.getType() == GeometryType.COMPOSITE_SURFACE) {
+ MultiSurface ms = CityGmlUtils.createMultiSurface(geom, factory, config);
+ setMultiSurfaceAccordingToLod(ats, ms, geom.getLod());
+ } else if (geom.getType() == GeometryType.SOLID) {
+ Solid solid = CityGmlUtils.createSolid(geom, factory, config);
+ setSolidAccordingtoLod(ats, solid, geom.getLod());
+ } else {
+ throw new IllegalArgumentException("Unsupported geometry type: " + geom.getType());
+ }
+
}
}
@@ -66,52 +72,26 @@ public class TrafficSpaceObject extends TransportationObject {
ats.setLod3MultiSurface(new MultiSurfaceProperty(ms));
break;
default:
- throw new IllegalStateException("cannot set geometry with LOD for AuxiliaryTrafficSpace: " + lod);
+ throw new IllegalStateException(String.format("Cannot set MultiSurface with LOD %s for " +
+ "[GML]AbstractSpace in TrafficSpaceObject ", lod));
}
}
- @Override
- public boolean containsError(CheckId checkIdentifier) {
- boolean hasError = super.containsError(checkIdentifier);
- if (hasError) {
- return true;
- }
- for (TrafficAreaObject tao : trafficAreas) {
- if (tao.containsError(checkIdentifier)) {
- return true;
- }
- }
- return false;
- }
-
- @Override
- public void clearAllContainedCheckResults() {
- super.clearAllContainedCheckResults();
- for (TrafficAreaObject tao : trafficAreas) {
- tao.clearAllContainedCheckResults();
- }
- }
-
- @Override
- public void collectContainedErrors(List errors) {
- super.collectContainedErrors(errors);
- for (TrafficAreaObject tao : trafficAreas) {
- tao.collectContainedErrors(errors);
- }
- }
-
- @Override
- public boolean containsAnyError() {
- boolean hasError = super.containsAnyError();
- if (hasError) {
- return true;
- }
- for (TrafficAreaObject tao : trafficAreas) {
- if (tao.containsAnyError()) {
- return true;
- }
+ private void setSolidAccordingtoLod(AbstractSpace ats, Solid solid, Lod lod) {
+ switch (lod) {
+ case LOD1:
+ ats.setLod1Solid(new SolidProperty(solid));
+ break;
+ case LOD2:
+ ats.setLod2Solid(new SolidProperty(solid));
+ break;
+ case LOD3:
+ ats.setLod3Solid(new SolidProperty(solid));
+ break;
+ default:
+ throw new IllegalStateException(String.format("Cannot set MultiSurface with LOD %s for " +
+ "[GML]AbstractSpace in TrafficSpaceObject ", lod));
}
- return false;
}
@Override
@@ -131,60 +111,28 @@ public class TrafficSpaceObject extends TransportationObject {
ats.setLod0MultiSurface(null);
ats.setLod2MultiSurface(null);
ats.setLod3MultiSurface(null);
- for (TrafficAreaObject tao : trafficAreas) {
- tao.unsetGmlGeometries();
- }
+ ats.setLod1Solid(null);
+ ats.setLod2Solid(null);
+ ats.setLod3Solid(null);
}
@Override
public CityObject getTopLevelCityObject() {
- return this;
+ return parent.getTopLevelCityObject();
}
- @Override
- public String toString() {
- return "TransportationSpaceObject [id=" + getGmlId() + "]";
+ public void setParent(TransportationSpace parent) {
+ this.parent = parent;
}
- @Override
- public void prepareForChecking() {
- super.prepareForChecking();
- for (TrafficAreaObject tao : trafficAreas) {
- tao.prepareForChecking();
- }
+ public TransportationSpace getParent() {
+ return parent;
}
@Override
- public void clearMetaInformation() {
- super.clearMetaInformation();
- for (TrafficAreaObject tao : trafficAreas) {
- tao.clearMetaInformation();
- }
- }
-
- @Override
- public void collectInstances(CopyHandler handler) {
- super.collectInstances(handler);
- for (TrafficAreaObject tao : trafficAreas) {
- handler.addInstance(tao);
- }
- }
-
- @Override
- public void fillValues(Copyable original, CopyHandler handler) {
- super.fillValues(original, handler);
- TrafficSpaceObject originalTao = (TrafficSpaceObject) original;
- for (TrafficAreaObject tao : originalTao.trafficAreas) {
- trafficAreas.add(handler.getCopyInstance(tao));
- }
- super.setGmlObject(originalTao.getGmlObject());
- }
-
- @Override
- public Copyable createCopyInstance() {
- return new TrafficSpaceObject(null);
+ public String toString() {
+ return "TransportationSpaceObject [id=" + getGmlId() + "]";
}
-
}
diff --git a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/TransportSection.java b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/TransportSection.java
index 86631f6630c4602f3520cf5d7b1ca28f4b5ae149..45592014a8152f611732790c0faf7b38ae0cae62 100644
--- a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/TransportSection.java
+++ b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/TransportSection.java
@@ -2,6 +2,8 @@ package de.hft.stuttgart.citydoctor2.datastructure;
public class TransportSection extends TransportationSpace {
+ private TopLevelTransportFeature parent;
+
public enum SectionType {
SECTION, INTERSECTION
}
@@ -13,5 +15,17 @@ public class TransportSection extends TransportationSpace {
}
}
+ public void setParent(TopLevelTransportFeature parent) {
+ this.parent = parent;
+ }
+
+ public TopLevelTransportFeature getParent() {
+ return parent;
+ }
+
+ @Override
+ public CityObject getTopLevelCityObject() {
+ return parent.getTopLevelCityObject();
+ }
}
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 9ca662ddbeb90d4022cb17b3532a571d248d4abd..910c77b4c94f447e24c627ea65cae6d436f2acda 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
@@ -18,21 +18,9 @@
*/
package de.hft.stuttgart.citydoctor2.datastructure;
-import de.hft.stuttgart.citydoctor2.check.Check;
-import de.hft.stuttgart.citydoctor2.check.CheckError;
-import de.hft.stuttgart.citydoctor2.check.CheckId;
-import de.hft.stuttgart.citydoctor2.parser.ParserConfiguration;
-import de.hft.stuttgart.citydoctor2.utils.CityGmlUtils;
-import de.hft.stuttgart.citydoctor2.utils.CopyHandler;
-import de.hft.stuttgart.citydoctor2.utils.Copyable;
+import javafx.scene.paint.Color;
import org.citygml4j.core.model.core.AbstractCityObject;
-import org.citygml4j.core.model.core.AbstractSpace;
-import org.citygml4j.core.model.transportation.AbstractTransportationSpace;
-import org.citygml4j.core.model.transportation.AuxiliaryTrafficArea;
-import org.citygml4j.core.model.transportation.TrafficArea;
-import org.citygml4j.core.util.geometry.GeometryFactory;
-import org.xmlobjects.gml.model.geometry.aggregates.MultiSurface;
-import org.xmlobjects.gml.model.geometry.aggregates.MultiSurfaceProperty;
+
import java.io.Serial;
import java.util.ArrayList;
@@ -77,6 +65,17 @@ public abstract class TransportationObject extends CityObject {
return ato;
}
+ @Override
+ public Color getRenderColor() {
+ return switch (type) {
+ case TRACK -> Color.BROWN;
+ case WATERWAY -> Color.NAVY;
+ case SQUARE -> Color.DARKSLATEGRAY;
+ case AUXILLIARY_TRAFFIC_AREA, AUXILLIARY_TRAFFIC_SPACE -> Color.LIGHTSLATEGREY;
+ default -> Color.DIMGRAY;
+ };
+ }
+
public void setGmlObject(AbstractCityObject tc) {
ato = tc;
@@ -92,17 +91,9 @@ public abstract class TransportationObject extends CityObject {
return "TransportationObject [id=" + getGmlId() + "]";
}
-
- @Override
- public void fillValues(Copyable original, CopyHandler handler) {
- super.fillValues(original, handler);
- TransportationObject originalTo = (TransportationObject) original;
- ato = originalTo.ato;
- }
-
@Override
- public Copyable createCopyInstance() {
- return null;
+ public String getDisplayText() {
+ return String.format("[%s] %s", this.type.name(), this.getGmlId().toString());
}
}
diff --git a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/TransportationSpace.java b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/TransportationSpace.java
index c2c73715c8eea13f3a1c274e5016cd33c9c03e21..16e7ef946d745908380dd6db82b3288ecc38854a 100644
--- a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/TransportationSpace.java
+++ b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/TransportationSpace.java
@@ -1,17 +1,15 @@
package de.hft.stuttgart.citydoctor2.datastructure;
import de.hft.stuttgart.citydoctor2.check.Check;
-import de.hft.stuttgart.citydoctor2.check.CheckError;
-import de.hft.stuttgart.citydoctor2.check.CheckId;
import de.hft.stuttgart.citydoctor2.parser.ParserConfiguration;
import de.hft.stuttgart.citydoctor2.utils.CityGmlUtils;
-import de.hft.stuttgart.citydoctor2.utils.CopyHandler;
-import de.hft.stuttgart.citydoctor2.utils.Copyable;
import org.citygml4j.core.model.core.AbstractSpace;
import org.citygml4j.core.model.transportation.AbstractTransportationSpace;
import org.citygml4j.core.util.geometry.GeometryFactory;
import org.xmlobjects.gml.model.geometry.aggregates.MultiSurface;
import org.xmlobjects.gml.model.geometry.aggregates.MultiSurfaceProperty;
+import org.xmlobjects.gml.model.geometry.primitives.Solid;
+import org.xmlobjects.gml.model.geometry.primitives.SolidProperty;
import java.util.ArrayList;
import java.util.List;
@@ -35,37 +33,42 @@ public abstract class TransportationSpace extends TransportationObject {
public void addTrafficSpace(TrafficSpaceObject t) {
trafficSpaces.add(t);
+ t.setParent(this);
}
public void addAuxTrafficSpace(TrafficSpaceObject t) {
auxTrafficSpaces.add(t);
+ t.setParent(this);
}
@Override
- public void reCreateGeometries(GeometryFactory factory, ParserConfiguration config) {
+ public void rebuildGeometries(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 (super.getGmlObject() instanceof AbstractTransportationSpace ats) {
+ if (super.getGmlObject() instanceof AbstractTransportationSpace ats) {
+ if (geom.getType() == GeometryType.MULTI_SURFACE || geom.getType() == GeometryType.COMPOSITE_SURFACE) {
+ MultiSurface ms = CityGmlUtils.createMultiSurface(geom, factory, config);
setMultiSurfaceAccordingToLod(ats, ms, geom.getLod());
+ } else if (geom.getType() == GeometryType.SOLID) {
+ Solid solid = CityGmlUtils.createSolid(geom, factory, config);
+ setSolidAccordingToLod(ats, solid, geom.getLod());
} else {
- AbstractSpace as = (AbstractSpace) super.getGmlObject();
+ throw new IllegalArgumentException("Unsupported geometry type: " + geom.getType());
+ }
+ } else if (super.getGmlObject() instanceof AbstractSpace as) {
+ if (geom.getType() == GeometryType.MULTI_SURFACE || geom.getType() == GeometryType.COMPOSITE_SURFACE) {
+ MultiSurface ms = CityGmlUtils.createMultiSurface(geom, factory, config);
setMultiSurfaceAccordingToLod(as, ms, geom.getLod());
+ } else if (geom.getType() == GeometryType.SOLID) {
+ Solid solid = CityGmlUtils.createSolid(geom, factory, config);
+ setSolidAccordingToLod(as, solid, geom.getLod());
+ } else {
+ throw new IllegalArgumentException("Unsupported geometry type: " + geom.getType());
}
- } else {
- throw new IllegalStateException("Geometry in TransportationObject cannot be of type " + geom.getType()
- + ". Only MultiSurface allowed");
}
}
- for (TrafficSpaceObject spaces : trafficSpaces) {
- spaces.reCreateGeometries(factory, config);
- }
- for (TrafficSpaceObject spaces : auxTrafficSpaces) {
- spaces.reCreateGeometries(factory, config);
- }
}
private void setMultiSurfaceAccordingToLod(AbstractTransportationSpace ats, MultiSurface ms, Lod lod) {
@@ -75,8 +78,8 @@ public abstract class TransportationSpace extends TransportationObject {
case LOD2 -> ats.setLod2MultiSurface(new MultiSurfaceProperty(ms));
case LOD3 -> ats.setLod3MultiSurface(new MultiSurfaceProperty(ms));
case LOD4 -> ats.getDeprecatedProperties().setLod4MultiSurface(new MultiSurfaceProperty(ms));
- default ->
- throw new IllegalStateException("cannot set geometry with LOD for AuxiliaryTrafficSpace: " + lod);
+ default -> throw new IllegalStateException(String.format("Cannot set MultiSurface with LOD %s for " +
+ "[GML]AbstractTransportationSpace in TransportationSpace ", lod));
}
}
@@ -92,69 +95,29 @@ public abstract class TransportationSpace extends TransportationObject {
as.setLod3MultiSurface(new MultiSurfaceProperty(ms));
break;
default:
- throw new IllegalStateException("cannot set geometry with LOD for AuxiliaryTrafficSpace: " + lod);
- }
- }
-
-
- @Override
- public boolean containsError(CheckId checkIdentifier) {
- boolean hasError = super.containsError(checkIdentifier);
- if (hasError) {
- return true;
+ throw new IllegalStateException(String.format("Cannot set MultiSurface with LOD %s for [GML]AbstractSpace in TransportationSpace ", lod));
}
- for (TrafficSpaceObject to : trafficSpaces) {
- if (to.containsError(checkIdentifier)) {
- return true;
- }
- }
- for (TrafficSpaceObject to : auxTrafficSpaces) {
- if (to.containsError(checkIdentifier)) {
- return true;
- }
- }
- return false;
}
- @Override
- public void clearAllContainedCheckResults() {
- super.clearAllContainedCheckResults();
- for (TrafficSpaceObject to : trafficSpaces) {
- to.clearAllContainedCheckResults();
- }
- for (TrafficSpaceObject to : auxTrafficSpaces) {
- to.clearAllContainedCheckResults();
- }
- }
-
- @Override
- public void collectContainedErrors(List errors) {
- super.collectContainedErrors(errors);
- for (TrafficSpaceObject to : trafficSpaces) {
- to.collectContainedErrors(errors);
- }
- for (TrafficSpaceObject to : auxTrafficSpaces) {
- to.collectContainedErrors(errors);
+ private void setSolidAccordingToLod(AbstractTransportationSpace ats, Solid solid, Lod lod) {
+ switch (lod) {
+ case LOD1 -> ats.setLod1Solid(new SolidProperty(solid));
+ case LOD2 -> ats.setLod2Solid(new SolidProperty(solid));
+ case LOD3 -> ats.setLod3Solid(new SolidProperty(solid));
+ default -> throw new IllegalStateException(String.format("Cannot set Solid with LOD %s for " +
+ "[GML]AbstractTransportationSpace in TransportationSpace ", lod));
}
}
- @Override
- public boolean containsAnyError() {
- boolean hasError = super.containsAnyError();
- if (hasError) {
- return true;
- }
- for (TrafficSpaceObject to : trafficSpaces) {
- if (to.containsAnyError()) {
- return true;
- }
- }
- for (TrafficSpaceObject to : auxTrafficSpaces) {
- if (to.containsAnyError()) {
- return true;
- }
+ private void setSolidAccordingToLod(AbstractSpace ats, Solid solid, Lod lod) {
+ switch (lod) {
+ case LOD1 -> ats.setLod1Solid(new SolidProperty(solid));
+ case LOD2 -> ats.setLod2Solid(new SolidProperty(solid));
+ case LOD3 -> ats.setLod3Solid(new SolidProperty(solid));
+ default ->
+ throw new IllegalStateException(String.format("Cannot set Solid with LOD %s for [GML]AbstractSpace" +
+ " in TransportationSpace ", lod));
}
- return false;
}
@Override
@@ -178,12 +141,9 @@ public abstract class TransportationSpace extends TransportationObject {
ats.setLod0MultiSurface(null);
ats.setLod2MultiSurface(null);
ats.setLod3MultiSurface(null);
- for (TrafficSpaceObject to : trafficSpaces) {
- to.unsetGmlGeometries();
- }
- for (TrafficSpaceObject to : auxTrafficSpaces) {
- to.unsetGmlGeometries();
- }
+ ats.setLod1Solid(null);
+ ats.setLod2Solid(null);
+ ats.setLod3Solid(null);
}
@Override
@@ -197,50 +157,4 @@ public abstract class TransportationSpace extends TransportationObject {
return "TransportationSpace [id=" + getGmlId() + "]";
}
- @Override
- public void prepareForChecking() {
- super.prepareForChecking();
- for (TrafficSpaceObject to : trafficSpaces) {
- to.prepareForChecking();
- }
- for (TrafficSpaceObject to : auxTrafficSpaces) {
- to.prepareForChecking();
- }
- }
-
- @Override
- public void clearMetaInformation() {
- super.clearMetaInformation();
- for (TrafficSpaceObject to : trafficSpaces) {
- to.clearMetaInformation();
- }
- for (TrafficSpaceObject to : auxTrafficSpaces) {
- to.clearMetaInformation();
- }
- }
-
- @Override
- public void collectInstances(CopyHandler handler) {
- super.collectInstances(handler);
- for (TrafficSpaceObject to : trafficSpaces) {
- to.collectInstances(handler);
- }
- for (TrafficSpaceObject to : auxTrafficSpaces) {
- to.collectInstances(handler);
- }
- }
-
- @Override
- public void fillValues(Copyable original, CopyHandler handler) {
- super.fillValues(original, handler);
- TransportationObject originalTo = (TransportationObject) original;
- for (TrafficSpaceObject to : trafficSpaces) {
- to.fillValues(originalTo, handler);
- }
- for (TrafficSpaceObject to : auxTrafficSpaces) {
- to.fillValues(originalTo, handler);
- }
- }
-
-
}
diff --git a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/Tunnel.java b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/Tunnel.java
index 7f26db7652c95c620f79551d0a82d7a3d77f289a..54013c4a9da76c9d818bd798d6cbd39ad13a96e2 100644
--- a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/Tunnel.java
+++ b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/Tunnel.java
@@ -1,15 +1,9 @@
package de.hft.stuttgart.citydoctor2.datastructure;
import de.hft.stuttgart.citydoctor2.check.Check;
-import de.hft.stuttgart.citydoctor2.check.CheckError;
-import de.hft.stuttgart.citydoctor2.check.CheckId;
-import de.hft.stuttgart.citydoctor2.parser.ParserConfiguration;
-import de.hft.stuttgart.citydoctor2.utils.CopyHandler;
-import de.hft.stuttgart.citydoctor2.utils.Copyable;
import org.citygml4j.core.model.core.AbstractSpaceBoundaryProperty;
import org.citygml4j.core.model.tunnel.TunnelInstallation;
import org.citygml4j.core.model.tunnel.TunnelInstallationProperty;
-import org.citygml4j.core.util.geometry.GeometryFactory;
import java.io.Serial;
import java.util.ArrayList;
@@ -26,13 +20,6 @@ public class Tunnel extends AbstractTunnel {
return tunnelParts;
}
- @Override
- public void reCreateGeometries(GeometryFactory factory, ParserConfiguration config) {
- super.reCreateGeometries(factory, config);
- for (TunnelPart tp : tunnelParts) {
- tp.reCreateGeometries(factory, config);
- }
- }
@Override
public CityObject getTopLevelCityObject() {
@@ -50,50 +37,6 @@ public class Tunnel extends AbstractTunnel {
}
}
- @Override
- public void clearAllContainedCheckResults() {
- super.clearAllContainedCheckResults();
- for (TunnelPart tp : tunnelParts) {
- tp.clearAllContainedCheckResults();
- }
- }
-
- @Override
- public void collectContainedErrors(List errors) {
- super.collectContainedErrors(errors);
- for (TunnelPart tp : tunnelParts) {
- tp.collectContainedErrors(errors);
- }
- }
-
- @Override
- public boolean containsAnyError() {
- boolean hasError = super.containsAnyError();
- if (hasError) {
- return true;
- }
- for (TunnelPart tp : tunnelParts) {
- if (tp.containsAnyError()) {
- return true;
- }
- }
- return false;
- }
-
- @Override
- public boolean containsError(CheckId checkIdentifier) {
- boolean hasError = super.containsError(checkIdentifier);
- if (hasError) {
- return true;
- }
- for (TunnelPart tp : tunnelParts) {
- if (tp.containsError(checkIdentifier)) {
- return true;
- }
- }
- return false;
- }
-
public void addTunnelPart(TunnelPart tunnelPart) {
tunnelParts.add(tunnelPart);
}
@@ -120,43 +63,6 @@ public class Tunnel extends AbstractTunnel {
setCityGmlBuilding(gmlT);
}
- @Override
- public void clearMetaInformation() {
- super.clearMetaInformation();
- for (TunnelPart tp : tunnelParts) {
- tp.clearMetaInformation();
- }
- }
-
- @Override
- public void prepareForChecking() {
- super.prepareForChecking();
- for (TunnelPart tp : tunnelParts) {
- tp.prepareForChecking();
- }
- }
-
- @Override
- public void fillValues(Copyable original, CopyHandler handler) {
- super.fillValues(original, handler);
- Tunnel originalTunnel = (Tunnel) original;
- for (TunnelPart originalTp : originalTunnel.tunnelParts) {
- tunnelParts.add(handler.getCopyInstance(originalTp));
- }
- }
-
- @Override
- public void collectInstances(CopyHandler handler) {
- super.collectInstances(handler);
- for (TunnelPart tp : tunnelParts) {
- handler.addInstance(tp);
- }
- }
-
- @Override
- public Copyable createCopyInstance() {
- return new Tunnel();
- }
}
diff --git a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/TunnelConstructiveElement.java b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/TunnelConstructiveElement.java
index 92554462f7f5cf59d8af35a5cf080bcd8c594705..d1f896b962974aab94e45701d29cd746ddd83c13 100644
--- a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/TunnelConstructiveElement.java
+++ b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/TunnelConstructiveElement.java
@@ -1,12 +1,9 @@
package de.hft.stuttgart.citydoctor2.datastructure;
import de.hft.stuttgart.citydoctor2.check.Check;
-import de.hft.stuttgart.citydoctor2.check.CheckError;
-import de.hft.stuttgart.citydoctor2.check.CheckId;
import de.hft.stuttgart.citydoctor2.parser.ParserConfiguration;
import de.hft.stuttgart.citydoctor2.utils.CityGmlUtils;
-import de.hft.stuttgart.citydoctor2.utils.CopyHandler;
-import de.hft.stuttgart.citydoctor2.utils.Copyable;
+import javafx.scene.paint.Color;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.citygml4j.core.model.core.AbstractSpaceBoundaryProperty;
@@ -46,12 +43,12 @@ public class TunnelConstructiveElement extends CityObject {
}
@Override
- public Copyable createCopyInstance() {
- return new TunnelConstructiveElement(gmlTunnelElement);
+ public Color getRenderColor() {
+ return parent.getRenderColor();
}
@Override
- public void reCreateGeometries(GeometryFactory factory, ParserConfiguration config) {
+ public void rebuildGeometries(GeometryFactory factory, ParserConfiguration config) {
// only handles CityGML2 for now
// unknown which CityGML is handled here
// need context information to decide
@@ -72,8 +69,20 @@ public class TunnelConstructiveElement extends CityObject {
throw new IllegalStateException("Tunnel constructive element cannot have a composite surface geometry");
}
}
+ removeEmptyBoundarySurfaces();
+ }
+
+ private void removeEmptyBoundarySurfaces() {
for (BoundarySurface bs : boundarySurfaceList) {
- reCreateBoundarySurface(factory, config, bs);
+ if (bs.getGeometries().isEmpty()) {
+ for (AbstractSpaceBoundaryProperty bsp : gmlTunnelElement.getBoundaries()) {
+ if (bsp.getObject() != null && bsp.getObject() == bs.getGmlObject()) {
+ logger.warn("Found empty boundary surface: {}, removing from feature", bs.getGmlId());
+ gmlTunnelElement.getBoundaries().remove(bsp);
+ break;
+ }
+ }
+ }
}
}
@@ -88,50 +97,6 @@ public class TunnelConstructiveElement extends CityObject {
}
}
- @Override
- public void collectContainedErrors(List errors) {
- super.collectContainedErrors(errors);
- for (BoundarySurface bs : boundarySurfaceList) {
- bs.collectContainedErrors(errors);
- }
- }
-
- @Override
- public void clearAllContainedCheckResults() {
- super.clearAllContainedCheckResults();
- for (BoundarySurface bs : boundarySurfaceList) {
- bs.clearAllContainedCheckResults();
- }
- }
-
- @Override
- public boolean containsError(CheckId checkIdentifier) {
- boolean hasError = super.containsError(checkIdentifier);
- if (hasError) {
- return true;
- }
- for (BoundarySurface bs : boundarySurfaceList) {
- if (bs.containsError(checkIdentifier)) {
- return true;
- }
- }
- return false;
- }
-
- @Override
- public boolean containsAnyError() {
- boolean hasError = super.containsAnyError();
- if (hasError) {
- return true;
- }
- for (BoundarySurface bs : boundarySurfaceList) {
- if (bs.containsAnyError()) {
- return true;
- }
- }
- return false;
- }
-
private void reCreateBoundarySurface(GeometryFactory factory, ParserConfiguration config, BoundarySurface bs) {
if (bs.getGeometries().isEmpty()) {
for (AbstractSpaceBoundaryProperty bsp : gmlTunnelElement.getBoundaries()) {
@@ -191,9 +156,7 @@ public class TunnelConstructiveElement extends CityObject {
gmlTunnelElement.setLod1Solid(null);
gmlTunnelElement.setLod2Solid(null);
gmlTunnelElement.setLod3Solid(null);
- for (BoundarySurface bs : boundarySurfaceList) {
- bs.unsetGmlGeometries();
- }
+
}
@Override
@@ -215,34 +178,4 @@ public class TunnelConstructiveElement extends CityObject {
return boundarySurfaceList;
}
- @Override
- public void prepareForChecking() {
- super.prepareForChecking();
- for (BoundarySurface bs : boundarySurfaceList) {
- bs.prepareForChecking();
- }
- }
-
- @Override
- public void clearMetaInformation() {
- super.clearMetaInformation();
- for (BoundarySurface bs : boundarySurfaceList) {
- bs.clearMetaInformation();
- }
- }
-
- @Override
- public void collectInstances(CopyHandler handler) {
- super.collectInstances(handler);
- handler.addInstance(boundarySurfaceList);
- }
-
- @Override
- public void fillValues(Copyable original, CopyHandler handler) {
- super.fillValues(original, handler);
- TunnelConstructiveElement originalTce = (TunnelConstructiveElement) original;
- for (BoundarySurface originalTs : originalTce.boundarySurfaceList) {
- boundarySurfaceList.add(handler.getCopyInstance(originalTs));
- }
- }
}
diff --git a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/TunnelFurniture.java b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/TunnelFurniture.java
index 747f5ee8d783f922997c2f8309920aa1a982bb40..28b1c2862b6688f108950e3f9998b13f2bc080de 100644
--- a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/TunnelFurniture.java
+++ b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/TunnelFurniture.java
@@ -1,6 +1,5 @@
package de.hft.stuttgart.citydoctor2.datastructure;
-import de.hft.stuttgart.citydoctor2.utils.Copyable;
import java.io.Serial;
@@ -13,9 +12,4 @@ public class TunnelFurniture extends AbstractFurniture {
super.setGmlObject(gmlObject);
}
- @Override
- public Copyable createCopyInstance() {
- return new BuildingRoomFurniture();
- }
-
}
diff --git a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/TunnelHollow.java b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/TunnelHollow.java
index 12b12623e6a3f2ca997faac787133516a0ef6eb7..f1064f820dd63506b39dae31c9e8927c24729620 100644
--- a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/TunnelHollow.java
+++ b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/TunnelHollow.java
@@ -1,7 +1,6 @@
package de.hft.stuttgart.citydoctor2.datastructure;
-import de.hft.stuttgart.citydoctor2.utils.CopyHandler;
-import de.hft.stuttgart.citydoctor2.utils.Copyable;
+import javafx.scene.paint.Color;
import org.citygml4j.core.model.tunnel.TunnelFurnitureProperty;
import java.io.Serial;
@@ -36,26 +35,13 @@ public class TunnelHollow extends AbstractRoom {
}
@Override
- public void fillValues(Copyable original, CopyHandler handler) {
- super.fillValues(original, handler);
-
- TunnelHollow oHollow = (TunnelHollow) original;
- parent = handler.getCopyInstance(oHollow.getParent());
+ public Color getRenderColor() {
+ return parent.getRenderColor();
}
@Override
public CityObject getTopLevelCityObject() {
- return getParent().getTopLevelCityObject();
- }
-
- @Override
- public void collectInstances(CopyHandler handler) {
- super.collectInstances(handler);
- handler.addInstance(parent);
+ return parent.getTopLevelCityObject();
}
- @Override
- public Copyable createCopyInstance() {
- return new TunnelHollow();
- }
}
diff --git a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/TunnelPart.java b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/TunnelPart.java
index 6493cd5c3e1cf06355e8c8f50c9efed9d67fcedc..e6c02a9974ac22f2822472d55ce2779c3458e29c 100644
--- a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/TunnelPart.java
+++ b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/TunnelPart.java
@@ -1,8 +1,5 @@
package de.hft.stuttgart.citydoctor2.datastructure;
-import de.hft.stuttgart.citydoctor2.utils.CopyHandler;
-import de.hft.stuttgart.citydoctor2.utils.Copyable;
-
import java.io.Serial;
public class TunnelPart extends AbstractTunnel {
@@ -37,24 +34,6 @@ public class TunnelPart extends AbstractTunnel {
return "TunnelPart [id=" + getGmlId() + "]";
}
- @Override
- public void fillValues(Copyable original, CopyHandler handler) {
- super.fillValues(original, handler);
- TunnelPart originalPart = (TunnelPart) original;
- parent = handler.getCopyInstance(originalPart.parent);
- }
-
- @Override
- public void collectInstances(CopyHandler handler) {
- super.collectInstances(handler);
- handler.addInstance(parent);
- }
-
- @Override
- public Copyable createCopyInstance() {
- return new TunnelPart();
- }
-
private TunnelPart() {
}
}
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 29d38d2ebb551dd86015dc947eb2bf72cdfb16f6..79aec2a5dde1e3697fa80011e65be85c8c356c30 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
@@ -21,7 +21,7 @@ package de.hft.stuttgart.citydoctor2.datastructure;
import de.hft.stuttgart.citydoctor2.check.Check;
import de.hft.stuttgart.citydoctor2.parser.ParserConfiguration;
import de.hft.stuttgart.citydoctor2.utils.CityGmlUtils;
-import de.hft.stuttgart.citydoctor2.utils.Copyable;
+import javafx.scene.paint.Color;
import org.citygml4j.core.model.core.AbstractCityObject;
import org.citygml4j.core.model.vegetation.AbstractVegetationObject;
import org.citygml4j.core.model.vegetation.PlantCover;
@@ -64,7 +64,7 @@ public class Vegetation extends CityObject {
}
@Override
- public void reCreateGeometries(GeometryFactory factory, ParserConfiguration config) {
+ public void rebuildGeometries(GeometryFactory factory, ParserConfiguration config) {
for (Geometry geom : getGeometries()) {
if (geom instanceof ImplicitGeometryHolder) {
continue;
@@ -94,16 +94,13 @@ public class Vegetation extends CityObject {
private void setSolidAccordingToLod(PlantCover pc, Solid solid, Lod lod) {
switch (lod) {
case LOD1:
- pc.getDeprecatedProperties().setLod1MultiSolid(new MultiSolidProperty(new MultiSolid(Collections.singletonList(new SolidProperty(solid)))));
+ pc.setLod1Solid(new SolidProperty(solid));
break;
case LOD2:
- pc.getDeprecatedProperties().setLod2MultiSolid(new MultiSolidProperty(new MultiSolid(Collections.singletonList(new SolidProperty(solid)))));
+ pc.setLod2Solid(new SolidProperty(solid));
break;
case LOD3:
- pc.getDeprecatedProperties().setLod3MultiSolid(new MultiSolidProperty(new MultiSolid(Collections.singletonList(new SolidProperty(solid)))));
- break;
- case LOD4:
- pc.getDeprecatedProperties().setLod4MultiSolid(new MultiSolidProperty(new MultiSolid(Collections.singletonList(new SolidProperty(solid)))));
+ pc.setLod3Solid(new SolidProperty(solid));
break;
default:
throw new IllegalStateException("Cannot set Solid with lod to PlantCover:" + lod);
@@ -113,13 +110,13 @@ public class Vegetation extends CityObject {
private void setSolidAccordingToLod(SolitaryVegetationObject svo, Solid solid, Lod lod) {
switch (lod) {
case LOD1:
- svo.getDeprecatedProperties().setLod1Geometry(new SolidProperty(solid));
+ svo.setLod1Solid(new SolidProperty(solid));
break;
case LOD2:
- svo.getDeprecatedProperties().setLod2Geometry(new SolidProperty(solid));
+ svo.setLod2Solid(new SolidProperty(solid));
break;
case LOD3:
- svo.getDeprecatedProperties().setLod3Geometry(new SolidProperty(solid));
+ svo.setLod3Solid(new SolidProperty(solid));
break;
case LOD4:
svo.getDeprecatedProperties().setLod4Geometry(new SolidProperty(solid));
@@ -131,6 +128,9 @@ public class Vegetation extends CityObject {
private void setMultiSurfaceAccordingToLod(PlantCover pc, MultiSurface ms, Lod lod) {
switch (lod) {
+ case LOD0:
+ pc.setLod0MultiSurface(new MultiSurfaceProperty(ms));
+ break;
case LOD1:
pc.getDeprecatedProperties().setLod1MultiSurface(new MultiSurfaceProperty(ms));
break;
@@ -151,14 +151,17 @@ public class Vegetation extends CityObject {
private void setMultiSurfaceAccordingToLod(SolitaryVegetationObject svo, MultiSurface ms, Lod lod) {
switch (lod) {
+ case LOD0:
+ svo.setLod0MultiSurface(new MultiSurfaceProperty(ms));
+ break;
case LOD1:
svo.getDeprecatedProperties().setLod1Geometry(new MultiSurfaceProperty(ms));
break;
case LOD2:
- svo.getDeprecatedProperties().setLod2Geometry(new MultiSurfaceProperty(ms));
+ svo.setLod2MultiSurface(new MultiSurfaceProperty(ms));
break;
case LOD3:
- svo.getDeprecatedProperties().setLod3Geometry(new MultiSurfaceProperty(ms));
+ svo.setLod3MultiSurface(new MultiSurfaceProperty(ms));
break;
case LOD4:
svo.getDeprecatedProperties().setLod4Geometry(new MultiSurfaceProperty(ms));
@@ -181,8 +184,19 @@ public class Vegetation extends CityObject {
return citygmlVegetation;
}
+ @Override
+ public Color getRenderColor() {
+ return Color.LIGHTGREEN;
+ }
+
@Override
public void unsetGmlGeometries() {
+ citygmlVegetation.setLod0MultiSurface(null);
+ citygmlVegetation.setLod2MultiSurface(null);
+ citygmlVegetation.setLod3MultiSurface(null);
+ citygmlVegetation.setLod1Solid(null);
+ citygmlVegetation.setLod2Solid(null);
+ citygmlVegetation.setLod3Solid(null);
if (type == VegetationType.SOLITARY_VEGETATION_OBJECT) {
SolitaryVegetationObject svo = (SolitaryVegetationObject) citygmlVegetation;
svo.getDeprecatedProperties().setLod1Geometry(null);
@@ -192,9 +206,11 @@ public class Vegetation extends CityObject {
} else {
PlantCover pc = (PlantCover) citygmlVegetation;
pc.getDeprecatedProperties().setLod1MultiSurface(null);
- pc.setLod2MultiSurface(null);
- pc.setLod3MultiSurface(null);
pc.getDeprecatedProperties().setLod4MultiSurface(null);
+ pc.getDeprecatedProperties().setLod1MultiSolid(null);
+ pc.getDeprecatedProperties().setLod2MultiSolid(null);
+ pc.getDeprecatedProperties().setLod3MultiSolid(null);
+ pc.getDeprecatedProperties().setLod4MultiSolid(null);
}
}
@@ -216,8 +232,4 @@ public class Vegetation extends CityObject {
return "Vegetation [id=" + getGmlId() + "]";
}
- @Override
- public Copyable createCopyInstance() {
- return new Vegetation(type);
- }
}
diff --git a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/Vertex.java b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/Vertex.java
index cc7e9a5d826da314f6ca8a04cb17873ea8254af7..a49aec952b89baf41a61b8e29f7a340ce38ffe28 100644
--- a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/Vertex.java
+++ b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/Vertex.java
@@ -19,8 +19,6 @@
package de.hft.stuttgart.citydoctor2.datastructure;
import de.hft.stuttgart.citydoctor2.math.Vector3d;
-import de.hft.stuttgart.citydoctor2.utils.CopyHandler;
-import de.hft.stuttgart.citydoctor2.utils.Copyable;
import de.hft.stuttgart.citydoctor2.utils.SerializablePair;
import java.io.Serial;
@@ -34,7 +32,7 @@ import java.util.Set;
*
* @author Matthias Betz
*/
-public class Vertex extends Vector3d implements Copyable {
+public class Vertex extends Vector3d {
@Serial
private static final long serialVersionUID = -5525361920397934892L;
@@ -138,34 +136,4 @@ public class Vertex extends Vector3d implements Copyable {
adjacentRings = new ArrayList<>(2);
}
- @Override
- public void collectInstances(CopyHandler handler) {
- for (SerializablePair> pair : adjacentRings) {
- handler.addInstance(pair.getValue0());
- for (LinearRing lr : pair.getValue1()) {
- handler.addInstance(lr);
- }
- }
- }
-
- @Override
- public Copyable createCopyInstance() {
- return new Vertex(this);
- }
-
- @Override
- public void fillValues(Copyable original, CopyHandler handler) {
- Vertex originalVertex = (Vertex) original;
- // vertex point data already filled
- for (SerializablePair> pair : originalVertex.adjacentRings) {
- Geometry geomCopy = handler.getCopyInstance(pair.getValue0());
- HashSet set = new HashSet<>();
- for (LinearRing originalRing : pair.getValue1()) {
- set.add(handler.getCopyInstance(originalRing));
- }
- SerializablePair> copyPair = new SerializablePair<>(geomCopy, set);
- adjacentRings.add(copyPair);
- }
- }
-
}
diff --git a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/WaterObject.java b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/WaterObject.java
index f4c6af4baacbd44e1e3ef275cd54b179c9ad0af3..278a8fad0dab6718b1b1276e6390f12353684cc5 100644
--- a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/WaterObject.java
+++ b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/WaterObject.java
@@ -21,13 +21,17 @@ package de.hft.stuttgart.citydoctor2.datastructure;
import de.hft.stuttgart.citydoctor2.check.Check;
import de.hft.stuttgart.citydoctor2.parser.ParserConfiguration;
import de.hft.stuttgart.citydoctor2.utils.CityGmlUtils;
-import de.hft.stuttgart.citydoctor2.utils.CopyHandler;
-import de.hft.stuttgart.citydoctor2.utils.Copyable;
+import javafx.scene.paint.Color;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
import org.citygml4j.core.model.core.AbstractCityObject;
+import org.citygml4j.core.model.core.AbstractSpaceBoundaryProperty;
import org.citygml4j.core.model.waterbody.WaterBody;
import org.citygml4j.core.util.geometry.GeometryFactory;
import org.xmlobjects.gml.model.geometry.aggregates.MultiSurface;
import org.xmlobjects.gml.model.geometry.aggregates.MultiSurfaceProperty;
+import org.xmlobjects.gml.model.geometry.primitives.Solid;
+import org.xmlobjects.gml.model.geometry.primitives.SolidProperty;
import java.io.Serial;
import java.util.ArrayList;
@@ -43,26 +47,78 @@ public class WaterObject extends CityObject {
@Serial
private static final long serialVersionUID = -3821060595086337424L;
+ @Serial
+ private static final Logger logger = LogManager.getLogger(WaterObject.class);
+
private WaterBody gmlWater;
private final List boundarySurfaceList = new ArrayList<>();
@Override
- public void reCreateGeometries(GeometryFactory factory, ParserConfiguration config) {
+ public void rebuildGeometries(GeometryFactory factory, ParserConfiguration config) {
for (Geometry geom : getGeometries()) {
- if (geom.getType() == GeometryType.MULTI_SURFACE) {
+ if (geom.getType() == GeometryType.MULTI_SURFACE || geom.getType() == GeometryType.COMPOSITE_SURFACE) {
MultiSurface ms = CityGmlUtils.createMultiSurface(geom, factory, config);
- if (geom.getLod() == Lod.LOD0) {
- gmlWater.setLod0MultiSurface(new MultiSurfaceProperty(ms));
- } else if (geom.getLod() == Lod.LOD1) {
- gmlWater.getDeprecatedProperties().setLod1MultiSurface(new MultiSurfaceProperty(ms));
- } else {
- throw new IllegalStateException(
- "Cannot add MultiSurface geometry with lod to WaterBody:" + geom.getLod());
- }
+ setMultiSurfaceAccordingToLod(gmlWater, ms, geom.getLod());
+ } else if (geom.getType() == GeometryType.SOLID) {
+ Solid solid = CityGmlUtils.createSolid(geom, factory, config);
+ setSolidAccordingToLod(gmlWater, solid, geom.getLod());
} else {
throw new IllegalStateException("Cannot add Solid geometry to WaterBody");
}
}
+ removeEmptyBoundarySurfaces();
+ }
+
+ private void setMultiSurfaceAccordingToLod(WaterBody wb, MultiSurface ms, Lod lod) {
+ switch (lod) {
+ case LOD0:
+ wb.setLod0MultiSurface(new MultiSurfaceProperty(ms));
+ break;
+ case LOD1:
+ wb.getDeprecatedProperties().setLod1MultiSurface(new MultiSurfaceProperty(ms));
+ break;
+ case LOD2:
+ wb.setLod2MultiSurface(new MultiSurfaceProperty(ms));
+ break;
+ case LOD3:
+ wb.setLod3MultiSurface(new MultiSurfaceProperty(ms));
+ break;
+ default:
+ throw new IllegalStateException("Cannot set MultiSurface with lod to WaterBody:" + lod);
+ }
+ }
+
+ private void setSolidAccordingToLod(WaterBody wb, Solid solid, Lod lod) {
+ switch (lod) {
+ case LOD1:
+ wb.setLod1Solid(new SolidProperty(solid));
+ break;
+ case LOD2:
+ wb.setLod2Solid(new SolidProperty(solid));
+ break;
+ case LOD3:
+ wb.setLod3Solid(new SolidProperty(solid));
+ break;
+ case LOD4:
+ wb.getDeprecatedProperties().setLod4Solid(new SolidProperty(solid));
+ break;
+ default:
+ throw new IllegalStateException("Cannot set MultiSurface with lod to SolitaryVegetationObject:" + lod);
+ }
+ }
+
+ private void removeEmptyBoundarySurfaces() {
+ for (BoundarySurface bs : boundarySurfaceList) {
+ if (bs.getGeometries().isEmpty()) {
+ for (AbstractSpaceBoundaryProperty bsp : gmlWater.getBoundaries()) {
+ if (bsp.getObject() != null && bsp.getObject() == bs.getGmlObject()) {
+ logger.warn("Found empty boundary surface: {}, removing from feature", bs.getGmlId());
+ gmlWater.getBoundaries().remove(bsp);
+ break;
+ }
+ }
+ }
+ }
}
/**
@@ -100,10 +156,21 @@ public class WaterObject extends CityObject {
return gmlWater;
}
+ @Override
+ public Color getRenderColor() {
+ return Color.LIGHTSKYBLUE;
+ }
+
@Override
public void unsetGmlGeometries() {
gmlWater.setLod0MultiSurface(null);
gmlWater.getDeprecatedProperties().setLod1MultiSurface(null);
+ gmlWater.setLod2MultiSurface(null);
+ gmlWater.setLod3MultiSurface(null);
+ gmlWater.setLod1Solid(null);
+ gmlWater.setLod2Solid(null);
+ gmlWater.setLod3Solid(null);
+ gmlWater.getDeprecatedProperties().setLod4Solid(null);
}
@Override
@@ -120,56 +187,4 @@ public class WaterObject extends CityObject {
return "WaterObject [id=" + getGmlId() + "]";
}
- @Override
- public WaterObject createCopyInstance() {
- return new WaterObject();
- }
-
- @Override
- public void fillValues(Copyable original, CopyHandler handler) {
- WaterObject wo = (WaterObject) original;
- WaterObject originalWaterObject = (WaterObject) original;
- for (BoundarySurface originalBs : originalWaterObject.boundarySurfaceList) {
- boundarySurfaceList.add(handler.getCopyInstance(originalBs));
- }
- gmlWater = wo.gmlWater;
-
- }
-
- @Override
- public boolean containsAnyError() {
- boolean hasError = super.containsAnyError();
- if (hasError) {
- return true;
- }
- for (BoundarySurface bs : boundarySurfaceList) {
- if (bs.containsAnyError()) {
- return true;
- }
- }
- return false;
- }
-
- @Override
- public void collectInstances(CopyHandler handler) {
- super.collectInstances(handler);
- handler.addInstance(boundarySurfaceList);
- }
-
- @Override
- public void clearMetaInformation() {
- super.clearMetaInformation();
- for (BoundarySurface bs : boundarySurfaceList) {
- bs.clearMetaInformation();
- }
- }
-
- @Override
- public void prepareForChecking() {
- super.prepareForChecking();
- for (BoundarySurface bs : boundarySurfaceList) {
- bs.prepareForChecking();
- }
- }
-
}
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 f3744e4dd46359aa6b95f75c4fcf059375442160..0754938df0dd50ae21ebe32552ec3adb6cc9c2d5 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
@@ -46,6 +46,12 @@ import org.citygml4j.core.model.construction.AbstractConstruction;
import org.citygml4j.core.model.core.*;
import org.citygml4j.core.model.deprecated.transportation.TransportationComplex;
import org.citygml4j.core.model.landuse.LandUse;
+import org.citygml4j.core.model.relief.AbstractReliefComponentProperty;
+import org.citygml4j.core.model.relief.BreaklineRelief;
+import org.citygml4j.core.model.relief.MassPointRelief;
+import org.citygml4j.core.model.relief.RasterRelief;
+import org.citygml4j.core.model.relief.ReliefFeature;
+import org.citygml4j.core.model.relief.TINRelief;
import org.citygml4j.core.model.transportation.*;
import org.citygml4j.core.model.tunnel.Tunnel;
import org.citygml4j.core.model.tunnel.*;
@@ -118,9 +124,7 @@ public class Citygml3FeatureMapper extends ObjectWalker {
CityFurniture cf = new CityFurniture();
cf.setGmlObject(gmlCityFurniture);
mapAbstractOccupiedSpace(gmlCityFurniture, cf);
- resolveAndClearReferences();
- cf.unsetGmlGeometries();
- updateEdgesAndVertices(cf);
+ finishCityObjectConstruction(cf);
model.addCityFurniture(cf);
}
@@ -141,9 +145,7 @@ public class Citygml3FeatureMapper extends ObjectWalker {
}
}
mapAbstractOccupiedSpace(gos, gco);
- resolveAndClearReferences();
- gco.unsetGmlGeometries();
- updateEdgesAndVertices(gco);
+ finishCityObjectConstruction(gco);
model.addGenericCityObject(gco);
}
@@ -158,6 +160,7 @@ public class Citygml3FeatureMapper extends ObjectWalker {
BuildingPart part = new BuildingPart(cdBuilding);
readAbstractBuilding(bpProp.getObject(), part);
}
+ finishCityObjectConstruction(cdBuilding);
model.addBuilding(cdBuilding);
}
@@ -181,9 +184,7 @@ public class Citygml3FeatureMapper extends ObjectWalker {
wo.addBoundarySurface(bs);
}
- resolveAndClearReferences();
- wo.unsetGmlGeometries();
- updateEdgesAndVertices(wo);
+ finishCityObjectConstruction(wo);
for (BoundarySurface bs : surfaceMapper.getSurfaces()) {
updateEdgesAndVertices(bs);
}
@@ -200,6 +201,67 @@ public class Citygml3FeatureMapper extends ObjectWalker {
model.addLand(lo);
}
+ public void visit(ReliefFeature relief) {
+ ReliefObject ro = new ReliefObject(relief);
+ mapAbstractSpaceBoundary(relief, ro);
+ mapReliefFeature(relief, ro);
+ finishCityObjectConstruction(ro);
+ model.addRelief(ro);
+ }
+
+ public void mapReliefFeature(ReliefFeature relief, ReliefObject reliefObject) {
+ if (relief.isSetReliefComponents()) {
+ for (AbstractReliefComponentProperty arcProp : relief.getReliefComponents()) {
+ if (arcProp.isSetObject()) {
+ ObjectWalker ow = new ObjectWalker() {
+ @Override
+ public void visit(TINRelief rel) {
+ mapTINRelief(rel, reliefObject);
+ }
+
+ @Override
+ public void visit(MassPointRelief rel) {
+ //Method stub for implementation if requested
+ }
+
+ @Override
+ public void visit(BreaklineRelief rel) {
+ //Method stub for implementation if requested
+ }
+
+ @Override
+ public void visit(RasterRelief rel) {
+ //Method stub for implementation if requested
+ }
+
+ };
+ arcProp.getObject().accept(ow);
+ }
+ }
+ }
+ }
+
+ public void mapTINRelief(TINRelief relief, ReliefObject reliefObject) {
+ TinObject to = new TinObject(relief);
+ Lod reliefLod = switch (relief.getLod()) {
+ case 1 -> Lod.LOD1;
+ case 2 -> Lod.LOD2;
+ case 3 -> Lod.LOD3;
+ case 4 -> null;
+ default -> throw new IllegalStateException("TINRelief has unexpected LOD value: " + relief.getLod());
+ };
+ if (reliefLod == null) {
+ logger.warn("IllegalState: TINRelief {} has LOD value 4!", relief.getId());
+ return;
+ }
+ reliefObject.addComponent(to);
+ Citygml3GeometryMapper tinMapper = new Citygml3GeometryMapper(config, vertexMap);
+ relief.getTin().getObject().accept(tinMapper);
+ Geometry geom = new Geometry(GeometryType.MULTI_SURFACE, reliefLod);
+ tinMapper.getPolygons().forEach(geom::addPolygon);
+ to.addGeometry(geom);
+ }
+
@Override
public void visit(PlantCover plantCover) {
Vegetation veg = new Vegetation(VegetationType.PLANT_COVER);
@@ -281,8 +343,7 @@ public class Citygml3FeatureMapper extends ObjectWalker {
mapAbstractBridge(gmlBridgePart, bPart);
bo.addBridgePart(bPart);
}
- resolveAndClearReferences();
- updateEdgesAndVertices(bo);
+ finishCityObjectConstruction(bo);
for (BridgeObject part : bo.getParts()) {
updateEdgesAndVertices(part);
}
@@ -337,8 +398,6 @@ public class Citygml3FeatureMapper extends ObjectWalker {
for (BoundarySurface bs : bo.getBoundarySurfaces()) {
updateEdgesAndVertices(bs);
}
-
- bo.unsetGmlGeometries();
}
private Installation mapBridgeInstallation(BridgeInstallation gmlBi) {
@@ -351,7 +410,6 @@ public class Citygml3FeatureMapper extends ObjectWalker {
parseAndAddAbstractGeometry(lod3Prop, Lod.LOD3, bi);
GeometryProperty> lod4Prop = gmlBi.getDeprecatedProperties().getLod4Geometry();
parseAndAddAbstractGeometry(lod4Prop, Lod.LOD4, bi);
- bi.unsetGmlGeometries();
SurfaceMapper surfaceMapper = new SurfaceMapper(polygonMap, references, compositeMap, vertexMap, config);
for (AbstractSpaceBoundaryProperty surfaceProp : gmlBi.getBoundaries()) {
@@ -392,8 +450,7 @@ public class Citygml3FeatureMapper extends ObjectWalker {
tu.addTunnelPart(tPart);
}
readAbstractTunnel(tunnel, tu);
- resolveAndClearReferences();
- updateEdgesAndVertices(tu);
+ finishCityObjectConstruction(tu);
for (TunnelPart part : tu.getTunnelParts()) {
updateEdgesAndVertices(part);
}
@@ -424,11 +481,6 @@ public class Citygml3FeatureMapper extends ObjectWalker {
}
}
}
-
-
- cdTunnel.unsetGmlGeometries();
- resolveAndClearReferences();
- updateEdgesAndVertices(cdTunnel);
}
private void parseTunnelBoundarySurfaces(org.citygml4j.core.model.tunnel.AbstractTunnel gmlTunnel) {
@@ -503,7 +555,7 @@ public class Citygml3FeatureMapper extends ObjectWalker {
parseAndAddAbstractGeometry(lod3Prop, Lod.LOD3, ti);
GeometryProperty> lod4Prop = gmlTi.getDeprecatedProperties().getLod4Geometry();
parseAndAddAbstractGeometry(lod4Prop, Lod.LOD4, ti);
- ti.unsetGmlGeometries();
+
SurfaceMapper surfaceMapper = new SurfaceMapper(polygonMap, references, compositeMap, vertexMap, config);
for (AbstractSpaceBoundaryProperty surfaceProp : gmlTi.getBoundaries()) {
@@ -575,7 +627,7 @@ public class Citygml3FeatureMapper extends ObjectWalker {
TunnelFurniture tf = new TunnelFurniture();
tf.setGmlObject(gmlTf);
mapAbstractOccupiedSpace(gmlTf, tf);
- tf.unsetGmlGeometries();
+
SurfaceMapper surfaceMapper = new SurfaceMapper(polygonMap, references, compositeMap, vertexMap, config);
for (AbstractSpaceBoundaryProperty surfaceProp : gmlTf.getBoundaries()) {
if (!surfaceProp.isSetObject()) {
@@ -599,7 +651,6 @@ public class Citygml3FeatureMapper extends ObjectWalker {
org.citygml4j.core.model.tunnel.TunnelConstructiveElement gmlTe) {
TunnelConstructiveElement te = new TunnelConstructiveElement(gmlTe);
mapAbstractOccupiedSpace(gmlTe, te);
- te.unsetGmlGeometries();
SurfaceMapper surfaceMapper = new SurfaceMapper(polygonMap, references, compositeMap, vertexMap, config);
for (AbstractSpaceBoundaryProperty surfaceProp : gmlTe.getBoundaries()) {
if (!surfaceProp.isSetObject()) {
@@ -739,7 +790,8 @@ public class Citygml3FeatureMapper extends ObjectWalker {
}
private void finishCityObjectConstruction(CityObject co) {
- co.unsetGmlGeometries();
+ parseId(co.getGmlObject(), co);
+ co.clearGmlGeometries();
resolveAndClearReferences();
updateEdgesAndVertices(co);
}
@@ -757,7 +809,7 @@ public class Citygml3FeatureMapper extends ObjectWalker {
if (atsp.isSetObject()) {
TrafficSpaceObject atso = new TrafficSpaceObject(TrafficSpaceObject.TrafficSpaceType.AUXILIARY_TRAFFIC_SPACE);
mapAuxiliaryTrafficSpace(atsp.getObject(), atso);
- trsp.addTrafficSpace(atso);
+ trsp.addAuxTrafficSpace(atso);
}
}
}
@@ -974,7 +1026,6 @@ public class Citygml3FeatureMapper extends ObjectWalker {
AbstractBuilding cdBuilding) {
mapAbstractOccupiedSpace(gmlAb, cdBuilding);
cdBuilding.setGmlObject(gmlAb);
-
// parse deprecated geometries
parseAndAddMultiSurface(gmlAb.getDeprecatedProperties().getLod1MultiSurface(), Lod.LOD1, cdBuilding);
parseAndAddMultiSurface(gmlAb.getDeprecatedProperties().getLod4MultiSurface(), Lod.LOD4, cdBuilding);
@@ -1009,9 +1060,6 @@ public class Citygml3FeatureMapper extends ObjectWalker {
}
updatePartOfSurface(cdBuilding, surfaceMapper);
- cdBuilding.unsetGmlGeometries();
- resolveAndClearReferences();
- updateEdgesAndVertices(cdBuilding);
for (BoundarySurface bs : surfaceMapper.getSurfaces()) {
updateEdgesAndVertices(bs);
for (Opening o : bs.getOpenings()) {
@@ -1114,7 +1162,6 @@ public class Citygml3FeatureMapper extends ObjectWalker {
BuildingRoomFurniture bf = new BuildingRoomFurniture();
bf.setGmlObject(gmlAF);
mapAbstractOccupiedSpace(gmlAF, bf);
- bf.unsetGmlGeometries();
SurfaceMapper surfaceMapper = new SurfaceMapper(polygonMap, references, compositeMap, vertexMap, config);
for (AbstractSpaceBoundaryProperty surfaceProp : gmlAF.getBoundaries()) {
if (!surfaceProp.isSetObject()) {
@@ -1139,7 +1186,6 @@ public class Citygml3FeatureMapper extends ObjectWalker {
de.hft.stuttgart.citydoctor2.datastructure.Storey storey = new de.hft.stuttgart.citydoctor2.datastructure.Storey();
storey.setGmlObject(gmlStorey);
mapAbstractSpace(gmlStorey, storey);
- storey.unsetGmlGeometries();
SurfaceMapper surfaceMapper = new SurfaceMapper(polygonMap, references, compositeMap, vertexMap, config);
for (AbstractSpaceBoundaryProperty surfaceProp : gmlStorey.getBoundaries()) {
if (!surfaceProp.isSetObject()) {
@@ -1163,7 +1209,6 @@ public class Citygml3FeatureMapper extends ObjectWalker {
de.hft.stuttgart.citydoctor2.datastructure.BuildingUnit bu = new de.hft.stuttgart.citydoctor2.datastructure.BuildingUnit();
bu.setGmlObject(gmlBU);
mapAbstractSpace(gmlBU, bu);
- bu.unsetGmlGeometries();
SurfaceMapper surfaceMapper = new SurfaceMapper(polygonMap, references, compositeMap, vertexMap, config);
for (AbstractSpaceBoundaryProperty surfaceProp : gmlBU.getBoundaries()) {
if (!surfaceProp.isSetObject()) {
@@ -1204,7 +1249,6 @@ public class Citygml3FeatureMapper extends ObjectWalker {
parseAndAddAbstractGeometry(lod3Prop, Lod.LOD3, bi);
GeometryProperty> lod4Prop = gmlBi.getDeprecatedProperties().getLod4Geometry();
parseAndAddAbstractGeometry(lod4Prop, Lod.LOD4, bi);
- bi.unsetGmlGeometries();
SurfaceMapper surfaceMapper = new SurfaceMapper(polygonMap, references, compositeMap, vertexMap, config);
for (AbstractSpaceBoundaryProperty surfaceProp : gmlBi.getBoundaries()) {
diff --git a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/mapper/citygml3/Citygml3GeometryMapper.java b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/mapper/citygml3/Citygml3GeometryMapper.java
index 1c9bf3403ef8f72d3e33e8691d96af0e3c9beae8..7b08ba8c40e566388c920054ea0f21e83dd31bec 100644
--- a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/mapper/citygml3/Citygml3GeometryMapper.java
+++ b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/mapper/citygml3/Citygml3GeometryMapper.java
@@ -35,6 +35,7 @@ import org.xmlobjects.gml.visitor.GeometryWalker;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.ArrayList;
+import java.util.Collections;
import java.util.List;
import java.util.Map;
@@ -76,6 +77,11 @@ public class Citygml3GeometryMapper extends GeometryWalker {
public void visit(PolygonPatch patch) {
parsePolygonPatch(patch, patchCollection);
}
+
+ @Override
+ public void visit(Triangle tri) {
+ parsePolygon(null, tri.getExterior(), Collections.emptyList());
+ }
};
surface.getPatches().getObjects().forEach(abstractSurfacePatch -> abstractSurfacePatch.accept(patchCollector));
}
diff --git a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/utils/CheckErrorFound.java b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/utils/CheckErrorFound.java
new file mode 100644
index 0000000000000000000000000000000000000000..cd7d13cd2dec0f357eb8b2f5946c532ef8a34279
--- /dev/null
+++ b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/utils/CheckErrorFound.java
@@ -0,0 +1,12 @@
+package de.hft.stuttgart.citydoctor2.utils;
+
+/**
+ * This Throwable signals that a requested CheckError was found.
+ */
+public class CheckErrorFound extends Throwable {
+
+
+ public CheckErrorFound() {
+ super("CheckError was found", null, true, false);
+ }
+}
diff --git a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/utils/Copy.java b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/utils/Copy.java
index 390c3807b5119b8b174e3e31533a4622ae8941b2..fe1fdc3793fb91f250c627d3be8e6e7358f2e811 100644
--- a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/utils/Copy.java
+++ b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/utils/Copy.java
@@ -27,6 +27,7 @@ import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
+import java.io.Serializable;
public class Copy {
@@ -36,7 +37,7 @@ public class Copy {
}
@SuppressWarnings("unchecked")
- public static T copy(T original) {
+ public static T copy(T original) {
ByteArrayOutputStream out = new ByteArrayOutputStream();
try {
ObjectOutputStream oos = new ObjectOutputStream(out);
diff --git a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/utils/CopyHandler.java b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/utils/CopyHandler.java
deleted file mode 100644
index ae9943975ff1c06233805f7a90b8c87a390fb736..0000000000000000000000000000000000000000
--- a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/utils/CopyHandler.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/*-
- * Copyright 2020 Beuth Hochschule für Technik Berlin, Hochschule für Technik Stuttgart
- *
- * This file is part of CityDoctor2.
- *
- * CityDoctor2 is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * CityDoctor2 is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with CityDoctor2. If not, see .
- */
-package de.hft.stuttgart.citydoctor2.utils;
-
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.IdentityHashMap;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.Set;
-
-public class CopyHandler {
-
-
- private final Set toBeDoneInstances = new HashSet<>();
- private final Map finishedInstances = new IdentityHashMap<>();
-
- @SuppressWarnings("unchecked")
- public T copy(T original) {
- toBeDoneInstances.add(original);
- while (!toBeDoneInstances.isEmpty()) {
- handleNextInstance();
- }
- for (Entry e : finishedInstances.entrySet()) {
- e.getValue().fillValues(e.getKey(), this);
- }
- return (T) finishedInstances.get(original);
- }
-
- @SuppressWarnings("unchecked")
- public T getCopyInstance(T original) {
- if (original == null) {
- // null gets copied to null
- return null;
- }
- return (T) finishedInstances.get(original);
- }
-
- public void addInstance(Copyable copyable) {
- if (copyable == null) {
- // don't care for null instances
- return;
- }
- if (finishedInstances.containsKey(copyable)) {
- // already processed
- return;
- }
- toBeDoneInstances.add(copyable);
- }
-
- private void handleNextInstance() {
- Iterator iterator = toBeDoneInstances.iterator();
- Copyable next = iterator.next();
- iterator.remove();
- finishedInstances.put(next, next.createCopyInstance());
- next.collectInstances(this);
- }
-
- public void addInstance(Collection extends Copyable> collection) {
- if (collection == null) {
- return;
- }
- for (Copyable c : collection) {
- addInstance(c);
- }
- }
-
-
-}
diff --git a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/utils/Copyable.java b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/utils/Copyable.java
deleted file mode 100644
index 8352db41dbec42fda37fa7d2b68e9a65841b4d52..0000000000000000000000000000000000000000
--- a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/utils/Copyable.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*-
- * Copyright 2020 Beuth Hochschule für Technik Berlin, Hochschule für Technik Stuttgart
- *
- * This file is part of CityDoctor2.
- *
- * CityDoctor2 is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * CityDoctor2 is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with CityDoctor2. If not, see .
- */
-package de.hft.stuttgart.citydoctor2.utils;
-
-public interface Copyable {
-
- public void collectInstances(CopyHandler handler);
- public Copyable createCopyInstance();
- public void fillValues(Copyable original, CopyHandler handler);
-
-}
diff --git a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/utils/ThrowUtils.java b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/utils/ThrowUtils.java
new file mode 100644
index 0000000000000000000000000000000000000000..b4e6c54c531e045662eedfb872d4ad11088c4938
--- /dev/null
+++ b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/utils/ThrowUtils.java
@@ -0,0 +1,21 @@
+package de.hft.stuttgart.citydoctor2.utils;
+
+public class ThrowUtils {
+
+ private ThrowUtils() {
+ }
+
+ @SuppressWarnings("unchecked")
+ private static void uncheckThrowable(Throwable t) throws T {
+ throw (T) t;
+ }
+
+ /**
+ * Throws a Throwable as an unchecked generic Throwable
+ */
+ public static void sneakyThrow(Throwable t) {
+ uncheckThrowable(t);
+ }
+
+
+}
diff --git a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/utils/visitors/CheckableErrorCollector.java b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/utils/visitors/CheckableErrorCollector.java
new file mode 100644
index 0000000000000000000000000000000000000000..d6af6749a758392eef1b2b288dc930aeb391488e
--- /dev/null
+++ b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/utils/visitors/CheckableErrorCollector.java
@@ -0,0 +1,29 @@
+package de.hft.stuttgart.citydoctor2.utils.visitors;
+
+import de.hft.stuttgart.citydoctor2.check.AbstractCheck;
+import de.hft.stuttgart.citydoctor2.check.CheckError;
+import de.hft.stuttgart.citydoctor2.check.Checkable;
+
+import java.util.List;
+
+/**
+ * This Visitor collects all CheckErrors in the datastructure of a checkable.
+ */
+public class CheckableErrorCollector extends AbstractCheck {
+
+ List errors;
+
+ /**
+ * Collects all CheckErrors into a list
+ *
+ * @param errors the list
+ */
+ public CheckableErrorCollector(List errors) {
+ this.errors = errors;
+ }
+
+ @Override
+ public void check(Checkable checkable) {
+ checkable.collectErrors(errors);
+ }
+}
diff --git a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/utils/visitors/CityObjectCollector.java b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/utils/visitors/CityObjectCollector.java
new file mode 100644
index 0000000000000000000000000000000000000000..31948813b2bc3eaed43c26d43af59814a7fca384
--- /dev/null
+++ b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/utils/visitors/CityObjectCollector.java
@@ -0,0 +1,29 @@
+package de.hft.stuttgart.citydoctor2.utils.visitors;
+
+import de.hft.stuttgart.citydoctor2.check.AbstractCheck;
+import de.hft.stuttgart.citydoctor2.datastructure.CityObject;
+
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ * This Visitor collects all sub-CityObjects that are in the datastructure of a CityObject (including itself) in a Set.
+ */
+public class CityObjectCollector extends AbstractCheck {
+
+ private final Set objects = new HashSet<>();
+
+ /**
+ * Returns the collected CityObjects.
+ *
+ * @return A set of CityObjects
+ */
+ public Set getCityObjects() {
+ return objects;
+ }
+
+ @Override
+ public void check(CityObject co) {
+ objects.add(co);
+ }
+}
diff --git a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/utils/visitors/ClearCheckResultsVisitor.java b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/utils/visitors/ClearCheckResultsVisitor.java
new file mode 100644
index 0000000000000000000000000000000000000000..18019a708e3404d22b1ca5377fb2831e1801891f
--- /dev/null
+++ b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/utils/visitors/ClearCheckResultsVisitor.java
@@ -0,0 +1,16 @@
+package de.hft.stuttgart.citydoctor2.utils.visitors;
+
+import de.hft.stuttgart.citydoctor2.check.AbstractCheck;
+import de.hft.stuttgart.citydoctor2.check.Checkable;
+
+/**
+ * This Visitor removes the check results from a CityObject and the objects in its datastructure.
+ */
+public class ClearCheckResultsVisitor extends AbstractCheck {
+
+ @Override
+ public void check(Checkable checkable) {
+ checkable.clearCheckResults();
+ }
+
+}
diff --git a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/utils/visitors/ClearMetaInformationVisitor.java b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/utils/visitors/ClearMetaInformationVisitor.java
new file mode 100644
index 0000000000000000000000000000000000000000..b08ed1368c041f91fcd5030cdca79e919b9a9cd0
--- /dev/null
+++ b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/utils/visitors/ClearMetaInformationVisitor.java
@@ -0,0 +1,16 @@
+package de.hft.stuttgart.citydoctor2.utils.visitors;
+
+import de.hft.stuttgart.citydoctor2.check.AbstractCheck;
+import de.hft.stuttgart.citydoctor2.datastructure.Geometry;
+
+/**
+ * This Visitor removes the metadata created by the {@link PrepareForCheckingVisitor} for the low-memory consumption mode.
+ */
+public class ClearMetaInformationVisitor extends AbstractCheck {
+
+ @Override
+ public void check(Geometry geometry) {
+ geometry.clearMetaData();
+ }
+
+}
diff --git a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/utils/visitors/ContainsAnyErrorVisitor.java b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/utils/visitors/ContainsAnyErrorVisitor.java
new file mode 100644
index 0000000000000000000000000000000000000000..02a9a5b28fdd1a4659438190f273b574d3814cdb
--- /dev/null
+++ b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/utils/visitors/ContainsAnyErrorVisitor.java
@@ -0,0 +1,36 @@
+package de.hft.stuttgart.citydoctor2.utils.visitors;
+
+import de.hft.stuttgart.citydoctor2.check.AbstractCheck;
+import de.hft.stuttgart.citydoctor2.check.Checkable;
+import de.hft.stuttgart.citydoctor2.utils.CheckErrorFound;
+import de.hft.stuttgart.citydoctor2.utils.ThrowUtils;
+
+/**
+ * This visitor checks if a checkable contains any error in its datastructure.
+ *
+ * This visitor's check method terminates early by throwing an unchecked {@link CheckErrorFound},
+ * use {@link #checkObject(Checkable) ContainsAnyErrorVisitor.checkObject(Checkable)} to handle the Throwable.
+ */
+public class ContainsAnyErrorVisitor extends AbstractCheck {
+
+ /**
+ * Checks if a Checkable, or any Object in its datastructure, contains any error.
+ *
+ * Terminates early upon finding an error by throwing {@link CheckErrorFound}
+ *
+ * @param checkable The object to check
+ * @throws CheckErrorFound when any Error is found
+ */
+ public static void checkObject(Checkable checkable) throws CheckErrorFound {
+ checkable.accept(new ContainsAnyErrorVisitor());
+ }
+
+ @Override
+ public void check(Checkable checkable) {
+ if (checkable.hasAnyError()) {
+ ThrowUtils.sneakyThrow(new CheckErrorFound());
+ }
+ }
+
+
+}
diff --git a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/utils/visitors/ContainsErrorVisitor.java b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/utils/visitors/ContainsErrorVisitor.java
new file mode 100644
index 0000000000000000000000000000000000000000..9ddc69c5a4783d3eb27f0b8cfcf7feb2cba228aa
--- /dev/null
+++ b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/utils/visitors/ContainsErrorVisitor.java
@@ -0,0 +1,43 @@
+package de.hft.stuttgart.citydoctor2.utils.visitors;
+
+import de.hft.stuttgart.citydoctor2.check.AbstractCheck;
+import de.hft.stuttgart.citydoctor2.check.CheckId;
+import de.hft.stuttgart.citydoctor2.check.Checkable;
+import de.hft.stuttgart.citydoctor2.utils.CheckErrorFound;
+import de.hft.stuttgart.citydoctor2.utils.ThrowUtils;
+
+/**
+ * This visitor checks if a checkable contains a specific error in its datastructure.
+ *
+ * This visitor's check method terminates early by throwing an unchecked {@link CheckErrorFound},
+ * use {@link #checkObject(Checkable, CheckId) ContainsAnyErrorVisitor.checkObject(Checkable, CheckId)} to handle the Throwable.
+ */
+public class ContainsErrorVisitor extends AbstractCheck {
+
+ private CheckId checkId;
+
+ /**
+ * Checks if a Checkable, or any Object in its datastructure, contains a specific error.
+ *
+ * Terminates early upon finding the error by throwing {@link CheckErrorFound}
+ *
+ * @param checkable The object to check
+ * @param checkIdentifier The specific error's associated ID
+ * @throws CheckErrorFound when the error is found
+ */
+ public static void checkObject(Checkable checkable, CheckId checkIdentifier) throws CheckErrorFound {
+ checkable.accept(new ContainsErrorVisitor(checkIdentifier));
+ }
+
+ @Override
+ public void check(Checkable checkable) {
+ if (checkable.hasError(checkId)) {
+ ThrowUtils.sneakyThrow(new CheckErrorFound());
+ }
+ }
+
+ public ContainsErrorVisitor(CheckId checkIdentifier) {
+ super();
+ checkId = checkIdentifier;
+ }
+}
diff --git a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/utils/visitors/GmlGeometryRebuilder.java b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/utils/visitors/GmlGeometryRebuilder.java
new file mode 100644
index 0000000000000000000000000000000000000000..cd74226b236c7224c547dd94dab356d286d86c3a
--- /dev/null
+++ b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/utils/visitors/GmlGeometryRebuilder.java
@@ -0,0 +1,36 @@
+package de.hft.stuttgart.citydoctor2.utils.visitors;
+
+import de.hft.stuttgart.citydoctor2.check.AbstractCheck;
+import de.hft.stuttgart.citydoctor2.datastructure.CityObject;
+import de.hft.stuttgart.citydoctor2.parser.ParserConfiguration;
+import org.citygml4j.core.util.geometry.GeometryFactory;
+
+import java.util.Objects;
+
+/**
+ * This Visitor recreates the Geometries of the original CityGml object from the associated Geometries in CityDoctor's
+ * internal model.
+ */
+public class GmlGeometryRebuilder extends AbstractCheck {
+
+ private final GeometryFactory factory;
+ private final ParserConfiguration config;
+
+ /**
+ * Creates a new Rebuilder for reconstruction of CityGml geometries.
+ *
+ * @param factory the GeometryFactory used for creation of CityGml geometry objects.
+ * @param configuration the configuration settings of the parser
+ */
+ public GmlGeometryRebuilder(GeometryFactory factory, ParserConfiguration configuration) {
+ Objects.requireNonNull(factory);
+ Objects.requireNonNull(configuration);
+ this.factory = factory;
+ this.config = configuration;
+ }
+
+ @Override
+ public void check(CityObject cityObject) {
+ cityObject.rebuildGeometries(factory, config);
+ }
+}
diff --git a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/utils/visitors/PrepareForCheckingVisitor.java b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/utils/visitors/PrepareForCheckingVisitor.java
new file mode 100644
index 0000000000000000000000000000000000000000..3388da78df300fb146387d2f6155c99ea89247f4
--- /dev/null
+++ b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/utils/visitors/PrepareForCheckingVisitor.java
@@ -0,0 +1,16 @@
+package de.hft.stuttgart.citydoctor2.utils.visitors;
+
+import de.hft.stuttgart.citydoctor2.check.AbstractCheck;
+import de.hft.stuttgart.citydoctor2.datastructure.Geometry;
+
+/**
+ * This Visitor prepares the {@link Geometry Geometries} in a Checkable for low-memory consumption mode.
+ */
+public class PrepareForCheckingVisitor extends AbstractCheck {
+
+ @Override
+ public void check(Geometry geom) {
+ geom.updateEdgesAndVertices();
+ }
+
+}
diff --git a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/utils/visitors/UnsetGeometriesVisitor.java b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/utils/visitors/UnsetGeometriesVisitor.java
new file mode 100644
index 0000000000000000000000000000000000000000..d24948d605f0d4c5bec6b24802309d4cbf3fa119
--- /dev/null
+++ b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/utils/visitors/UnsetGeometriesVisitor.java
@@ -0,0 +1,19 @@
+package de.hft.stuttgart.citydoctor2.utils.visitors;
+
+import de.hft.stuttgart.citydoctor2.check.AbstractCheck;
+import de.hft.stuttgart.citydoctor2.datastructure.CityObject;
+
+/**
+ * This Visitor removes the GmlGeometries from the linked original GmlObjects in a CityObject's datastructure to reduce
+ * memory bloat.
+ */
+public class UnsetGeometriesVisitor extends AbstractCheck {
+
+
+ @Override
+ public void check(CityObject cityObject) {
+ cityObject.unsetGmlGeometries();
+ }
+
+
+}
diff --git a/CityDoctorParent/CityDoctorModel/src/test/java/de/hft/stuttgart/citydoctor2/check/CheckableTest.java b/CityDoctorParent/CityDoctorModel/src/test/java/de/hft/stuttgart/citydoctor2/check/CheckableTest.java
index 0cd168a4d4a1b1cb14dc0a3b1af4c512c76d95ea..715bec55df6140a934ef46ccd3c645217f0eb243 100644
--- a/CityDoctorParent/CityDoctorModel/src/test/java/de/hft/stuttgart/citydoctor2/check/CheckableTest.java
+++ b/CityDoctorParent/CityDoctorModel/src/test/java/de/hft/stuttgart/citydoctor2/check/CheckableTest.java
@@ -48,20 +48,6 @@ public class CheckableTest {
return null;
}
- @Override
- public void prepareForChecking() {
-
- }
-
- @Override
- public void clearMetaInformation() {
-
- }
-
- @Override
- public void clearAllContainedCheckResults() {
- }
-
@Override
public Class extends Checkable> getCheckClass() {
return Building.class;
diff --git a/CityDoctorParent/CityDoctorModel/src/test/java/de/hft/stuttgart/citydoctor2/datastructure/AbstractBuildingTest.java b/CityDoctorParent/CityDoctorModel/src/test/java/de/hft/stuttgart/citydoctor2/datastructure/AbstractBuildingTest.java
index 7fac9afc612d61e6f5a6f5215e143df12c86258e..0c8e436c0ec16c760bc761a54f02b0fb57d36fde 100644
--- a/CityDoctorParent/CityDoctorModel/src/test/java/de/hft/stuttgart/citydoctor2/datastructure/AbstractBuildingTest.java
+++ b/CityDoctorParent/CityDoctorModel/src/test/java/de/hft/stuttgart/citydoctor2/datastructure/AbstractBuildingTest.java
@@ -23,25 +23,25 @@ import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;
+import de.hft.stuttgart.citydoctor2.utils.visitors.ClearCheckResultsVisitor;
+import de.hft.stuttgart.citydoctor2.utils.visitors.GmlGeometryRebuilder;
+import de.hft.stuttgart.citydoctor2.utils.visitors.UnsetGeometriesVisitor;
import org.citygml4j.core.model.construction.WallSurface;
import org.citygml4j.core.model.core.AbstractSpaceBoundaryProperty;
import org.citygml4j.core.util.geometry.GeometryFactory;
import org.junit.Test;
import org.mockito.Mockito;
import org.xmlobjects.gml.model.geometry.aggregates.MultiSurfaceProperty;
-import org.xmlobjects.gml.model.geometry.primitives.AbstractRing;
-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.Solid;
import org.xmlobjects.gml.model.geometry.primitives.SolidProperty;
-import org.xmlobjects.gml.model.geometry.primitives.SurfaceProperty;
import de.hft.stuttgart.citydoctor2.check.AbstractCheck;
import de.hft.stuttgart.citydoctor2.check.CheckError;
@@ -49,10 +49,10 @@ import de.hft.stuttgart.citydoctor2.check.CheckId;
import de.hft.stuttgart.citydoctor2.check.CheckResult;
import de.hft.stuttgart.citydoctor2.check.ResultStatus;
import de.hft.stuttgart.citydoctor2.parser.ParserConfiguration;
-import de.hft.stuttgart.citydoctor2.utils.Copyable;
public class AbstractBuildingTest {
+
@Test
public void testAccept() {
AbstractBuilding ab = createAbstractBuilding();
@@ -91,73 +91,59 @@ public class AbstractBuildingTest {
}
@Test
- public void testPrepareForChecking() {
- Installation biMock = mock(Installation.class);
- BoundarySurface bsMock = mock(BoundarySurface.class);
-
+ public void testVisitorPropagation() {
AbstractBuilding ab = createAbstractBuilding();
- ab.addBoundarySurface(bsMock);
- ab.addBuildingInstallation(biMock);
- ab.prepareForChecking();
- Mockito.verify(biMock, Mockito.times(1)).prepareForChecking();
- Mockito.verify(bsMock, Mockito.times(1)).prepareForChecking();
- }
+ BuildingRoom mockRoom = mock(BuildingRoom.class);
+ Installation mockInstallation = mock(Installation.class);
+ BuildingRoomFurniture mockBuildingRoomFurniture = mock(BuildingRoomFurniture.class);
+ BuildingUnit mockBuildingUnit = mock(BuildingUnit.class);
+ Storey mockStorey = mock(Storey.class);
+ BoundarySurface mockBSurface = mock(BoundarySurface.class);
+ Geometry mockGeometry = mock(Geometry.class);
+
+ ab.addBuildingRoom(mockRoom);
+ ab.addBuildingInstallation(mockInstallation);
+ ab.addBuildingRoomFurniture(mockBuildingRoomFurniture);
+ ab.addBuildingUnit(mockBuildingUnit);
+ ab.addStorey(mockStorey);
+ ab.addBoundarySurface(mockBSurface);
+ ab.addGeometry(mockGeometry);
- @Test
- public void testClearMetaInformation() {
- Installation biMock = mock(Installation.class);
- BoundarySurface bsMock = mock(BoundarySurface.class);
+ AbstractCheck c = new AbstractCheck() {
+ };
+ ab.accept(c);
- AbstractBuilding ab = createAbstractBuilding();
- ab.addBoundarySurface(bsMock);
- ab.addBuildingInstallation(biMock);
- ab.clearMetaInformation();
- Mockito.verify(biMock, Mockito.times(1)).clearMetaInformation();
- Mockito.verify(bsMock, Mockito.times(1)).clearMetaInformation();
+ verify(mockRoom).accept(c);
+ verify(mockInstallation).accept(c);
+ verify(mockBuildingRoomFurniture).accept(c);
+ verify(mockBuildingUnit).accept(c);
+ verify(mockStorey).accept(c);
+ verify(mockBSurface).accept(c);
+ verify(mockGeometry).accept(c);
}
@Test
public void testContainsError() {
AbstractBuilding ab = createAbstractBuilding();
assertFalse(ab.containsError(CheckId.C_GE_P_HOLE_OUTSIDE));
+ assertFalse(ab.containsError(CheckId.C_GE_P_NON_PLANAR));
ab.addCheckResult(new CheckResult(CheckId.C_GE_P_HOLE_OUTSIDE, ResultStatus.ERROR, mock(CheckError.class)));
assertTrue(ab.containsError(CheckId.C_GE_P_HOLE_OUTSIDE));
- }
-
- @Test
- public void testContainsErrorInBs() {
- AbstractBuilding ab = createAbstractBuilding();
- BoundarySurface bsMock = mock(BoundarySurface.class);
- ab.addBoundarySurface(bsMock);
- assertFalse(ab.containsError(CheckId.C_GE_P_HOLE_OUTSIDE));
- Mockito.when(bsMock.containsError(CheckId.C_GE_P_HOLE_OUTSIDE)).thenReturn(true);
+ assertFalse(ab.containsError(CheckId.C_GE_P_NON_PLANAR));
+ ab.addCheckResult(new CheckResult(CheckId.C_GE_P_NON_PLANAR, ResultStatus.OK, mock(CheckError.class)));
assertTrue(ab.containsError(CheckId.C_GE_P_HOLE_OUTSIDE));
+ assertFalse(ab.containsError(CheckId.C_GE_P_NON_PLANAR));
}
- @Test
- public void testContainsErrorInBi() {
- AbstractBuilding ab = createAbstractBuilding();
- Installation biMock = mock(Installation.class);
- ab.addBuildingInstallation(biMock);
- assertFalse(ab.containsError(CheckId.C_GE_P_HOLE_OUTSIDE));
- Mockito.when(biMock.containsError(CheckId.C_GE_P_HOLE_OUTSIDE)).thenReturn(true);
- assertTrue(ab.containsError(CheckId.C_GE_P_HOLE_OUTSIDE));
- }
@Test
public void testClearAllContainedCheckResults() {
- Installation biMock = mock(Installation.class);
- BoundarySurface bsMock = mock(BoundarySurface.class);
-
AbstractBuilding ab = createAbstractBuilding();
+ assertTrue(ab.getAllCheckResults().isEmpty());
ab.addCheckResult(new CheckResult(CheckId.C_GE_P_HOLE_OUTSIDE, ResultStatus.OK, null));
- ab.addBoundarySurface(bsMock);
- ab.addBuildingInstallation(biMock);
assertEquals(1, ab.getAllCheckResults().size());
ab.clearAllContainedCheckResults();
- Mockito.verify(biMock, Mockito.times(1)).clearAllContainedCheckResults();
- Mockito.verify(bsMock, Mockito.times(1)).clearAllContainedCheckResults();
assertTrue(ab.getAllCheckResults().isEmpty());
}
@@ -172,85 +158,59 @@ public class AbstractBuildingTest {
assertTrue(ab.containsAnyError());
}
- @Test
- public void testContainsAnyErrorInBs() {
- AbstractBuilding ab = createAbstractBuilding();
- BoundarySurface bsMock = mock(BoundarySurface.class);
- ab.addBoundarySurface(bsMock);
- assertFalse(ab.containsAnyError());
- Mockito.when(bsMock.containsAnyError()).thenReturn(true);
- assertTrue(ab.containsAnyError());
- }
-
- @Test
- public void testContainsAnyErrorInBi() {
- AbstractBuilding ab = createAbstractBuilding();
- Installation biMock = mock(Installation.class);
- ab.addBuildingInstallation(biMock);
- assertFalse(ab.containsAnyError());
- Mockito.when(biMock.containsAnyError()).thenReturn(true);
- assertTrue(ab.containsAnyError());
- }
-
@Test
public void testCollectContainedErrors() {
- Installation biMock = mock(Installation.class);
- BoundarySurface bsMock = mock(BoundarySurface.class);
-
AbstractBuilding ab = createAbstractBuilding();
- ab.addBoundarySurface(bsMock);
- ab.addBuildingInstallation(biMock);
ab.addCheckResult(new CheckResult(CheckId.C_GE_P_HOLE_OUTSIDE, ResultStatus.ERROR, mock(CheckError.class)));
List errors = new ArrayList<>();
ab.collectContainedErrors(errors);
- Mockito.verify(biMock, Mockito.times(1)).collectContainedErrors(errors);
- Mockito.verify(bsMock, Mockito.times(1)).collectContainedErrors(errors);
assertEquals(1, errors.size());
}
@Test
public void testReCreateGeometriesSolid() {
- Geometry geom = GeometryTestUtils.createDummyGeometry(GeometryType.SOLID);
-
AbstractBuilding ab = createAbstractBuilding();
org.citygml4j.core.model.building.AbstractBuilding gmlAb = new org.citygml4j.core.model.building.Building();
ab.setCityGmlBuilding(gmlAb);
- ab.addGeometry(geom);
+ ab.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.SOLID, Lod.LOD1));
+ ab.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.SOLID, Lod.LOD2));
+ ab.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.SOLID, Lod.LOD3));
+ ab.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.SOLID, Lod.LOD4));
+
GeometryFactory factory = GeometryFactory.newInstance();
ParserConfiguration config = new ParserConfiguration(8, false);
ab.reCreateGeometries(factory, config);
- AbstractSolid aSolid = gmlAb.getLod2Solid().getObject();
- assertTrue(aSolid instanceof Solid);
- Solid solid = (Solid) aSolid;
- Shell geometry = solid.getExterior().getObject();
- List surfaceMember = geometry.getSurfaceMembers();
- assertEquals(1, surfaceMember.size());
- AbstractSurface polySurface = surfaceMember.get(0).getObject();
- assertTrue(polySurface instanceof org.xmlobjects.gml.model.geometry.primitives.Polygon);
- var gmlPoly = (org.xmlobjects.gml.model.geometry.primitives.Polygon) polySurface;
- AbstractRing ring = gmlPoly.getExterior().getObject();
- var gmlRing = (org.xmlobjects.gml.model.geometry.primitives.LinearRing) ring;
- List posList = gmlRing.toCoordinateList3D();
- double[] expectedValues = new double[] { 427583.301, 6003502.571, 9.711, 427583.304, 6003502.574, 9.713,
- 427583.304, 6003502.574, 4.097, 427583.301, 6003502.571, 4.097, 427583.301, 6003502.571, 9.711 };
- for (int i = 0; i < posList.size(); i++) {
- assertEquals(expectedValues[i], posList.get(i), 0.00000001);
- }
+ GeometryTestUtils.assertSolidMatchesExpectedValues(gmlAb.getLod1Solid().getObject());
+ GeometryTestUtils.assertSolidMatchesExpectedValues(gmlAb.getLod2Solid().getObject());
+ GeometryTestUtils.assertSolidMatchesExpectedValues(gmlAb.getLod3Solid().getObject());
+ GeometryTestUtils.assertSolidMatchesExpectedValues(gmlAb.getDeprecatedProperties().getLod4Solid().getObject());
}
@Test
public void testReCreateGeometriesMultiSurface() {
- Geometry geom = GeometryTestUtils.createDummyGeometry(GeometryType.MULTI_SURFACE);
-
AbstractBuilding ab = createAbstractBuilding();
org.citygml4j.core.model.building.AbstractBuilding gmlAb = new org.citygml4j.core.model.building.Building();
ab.setCityGmlBuilding(gmlAb);
- ab.addGeometry(geom);
+ ab.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.MULTI_SURFACE, Lod.LOD0));
+ ab.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.MULTI_SURFACE, Lod.LOD1));
+ ab.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.MULTI_SURFACE, Lod.LOD2));
+ ab.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.MULTI_SURFACE, Lod.LOD3));
+ ab.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.MULTI_SURFACE, Lod.LOD4));
+
GeometryFactory factory = GeometryFactory.newInstance();
ParserConfiguration config = new ParserConfiguration(8, false);
ab.reCreateGeometries(factory, config);
+
+ assertNotNull(gmlAb.getLod0MultiSurface());
+ assertNotNull(gmlAb.getLod0MultiSurface().getObject());
+ assertNotNull(gmlAb.getDeprecatedProperties().getLod1MultiSurface());
+ assertNotNull(gmlAb.getDeprecatedProperties().getLod1MultiSurface().getObject());
assertNotNull(gmlAb.getLod2MultiSurface());
assertNotNull(gmlAb.getLod2MultiSurface().getObject());
+ assertNotNull(gmlAb.getLod3MultiSurface());
+ assertNotNull(gmlAb.getLod3MultiSurface().getObject());
+ assertNotNull(gmlAb.getDeprecatedProperties().getLod4MultiSurface());
+ assertNotNull(gmlAb.getDeprecatedProperties().getLod4MultiSurface().getObject());
}
@Test
@@ -266,7 +226,7 @@ public class AbstractBuildingTest {
GeometryFactory factory = GeometryFactory.newInstance();
ParserConfiguration config = new ParserConfiguration(8, false);
ab.reCreateGeometries(factory, config);
- Mockito.verify(bsMock).reCreateGeometries(factory, config);
+ Mockito.verify(bsMock).accept(any(GmlGeometryRebuilder.class));
}
@Test
@@ -299,18 +259,15 @@ public class AbstractBuildingTest {
org.citygml4j.core.model.building.AbstractBuilding gmlAb = new org.citygml4j.core.model.building.Building();
ab.setCityGmlBuilding(gmlAb);
ab.reCreateGeometries(factory, config);
- Mockito.verify(biMock).reCreateGeometries(factory, config);
+ Mockito.verify(biMock).accept(any(GmlGeometryRebuilder.class));
}
@Test
public void testUnsetGmlGeometries() {
- Installation biMock = mock(Installation.class);
- BoundarySurface bsMock = mock(BoundarySurface.class);
-
AbstractBuilding ab = createAbstractBuilding();
- ab.addBoundarySurface(bsMock);
- ab.addBuildingInstallation(biMock);
org.citygml4j.core.model.building.AbstractBuilding gmlAb = new org.citygml4j.core.model.building.Building();
+ ab.setCityGmlBuilding(gmlAb);
+
gmlAb.setLod1Solid(new SolidProperty());
gmlAb.setLod2Solid(new SolidProperty());
gmlAb.setLod3Solid(new SolidProperty());
@@ -319,10 +276,9 @@ public class AbstractBuildingTest {
gmlAb.setLod2MultiSurface(new MultiSurfaceProperty());
gmlAb.setLod3MultiSurface(new MultiSurfaceProperty());
gmlAb.getDeprecatedProperties().setLod4MultiSurface(new MultiSurfaceProperty());
- ab.setCityGmlBuilding(gmlAb);
- ab.unsetGmlGeometries();
- Mockito.verify(biMock).unsetGmlGeometries();
- Mockito.verify(bsMock).unsetGmlGeometries();
+
+ ab.clearGmlGeometries();
+
assertNull(gmlAb.getLod1Solid());
assertNull(gmlAb.getLod2Solid());
assertNull(gmlAb.getLod3Solid());
@@ -340,21 +296,15 @@ public class AbstractBuildingTest {
}
private AbstractBuilding createAbstractBuilding() {
- AbstractBuilding ab = new AbstractBuilding() {
+ return new AbstractBuilding() {
private static final long serialVersionUID = -448362592456318541L;
- @Override
- public Copyable createCopyInstance() {
- return null;
- }
-
@Override
public CityObject getTopLevelCityObject(){
return null;
}
};
- return ab;
}
}
diff --git a/CityDoctorParent/CityDoctorModel/src/test/java/de/hft/stuttgart/citydoctor2/datastructure/AbstractRoomTest.java b/CityDoctorParent/CityDoctorModel/src/test/java/de/hft/stuttgart/citydoctor2/datastructure/AbstractRoomTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..5f57517990b8e7c32b7058537e26f7e0d0a9436c
--- /dev/null
+++ b/CityDoctorParent/CityDoctorModel/src/test/java/de/hft/stuttgart/citydoctor2/datastructure/AbstractRoomTest.java
@@ -0,0 +1,190 @@
+package de.hft.stuttgart.citydoctor2.datastructure;
+
+import de.hft.stuttgart.citydoctor2.check.AbstractCheck;
+import de.hft.stuttgart.citydoctor2.check.CheckError;
+import de.hft.stuttgart.citydoctor2.check.CheckId;
+import de.hft.stuttgart.citydoctor2.check.CheckResult;
+import de.hft.stuttgart.citydoctor2.check.ResultStatus;
+import de.hft.stuttgart.citydoctor2.parser.ParserConfiguration;
+import org.citygml4j.core.model.core.AbstractSpaceBoundary;
+import org.citygml4j.core.util.geometry.GeometryFactory;
+import org.citygml4j.core.visitor.ObjectVisitor;
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.Mockito;
+import org.xmlobjects.gml.model.geometry.aggregates.MultiSurfaceProperty;
+import org.xmlobjects.gml.model.geometry.primitives.SolidProperty;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.Mockito.mock;
+
+public class AbstractRoomTest {
+
+ AbstractRoom abRoom;
+
+ @Before
+ public void setUp() {
+ abRoom = new AbstractRoom() {
+ @Override
+ public CityObject getTopLevelCityObject() {
+ return null;
+ }
+ };
+ }
+
+ @Test
+ public void testAbstractRoomVisitorPropagation() {
+
+ Installation mockInstallation = Mockito.mock(Installation.class);
+ BoundarySurface mockBoundarySurface = Mockito.mock(BoundarySurface.class);
+ Geometry geometry = Mockito.mock(Geometry.class);
+
+ abRoom.addRoomInstallation(mockInstallation);
+ abRoom.addBoundarySurface(mockBoundarySurface);
+ abRoom.addGeometry(geometry);
+
+ AbstractCheck c = new AbstractCheck() {
+ };
+ abRoom.accept(c);
+
+ Mockito.verify(mockInstallation).accept(c);
+ Mockito.verify(mockBoundarySurface).accept(c);
+ Mockito.verify(geometry).accept(c);
+ }
+
+ @Test
+ public void testContainsError() {
+ assertFalse(abRoom.containsError(CheckId.C_GE_P_HOLE_OUTSIDE));
+ assertFalse(abRoom.containsError(CheckId.C_GE_P_NON_PLANAR));
+ abRoom.addCheckResult(new CheckResult(CheckId.C_GE_P_HOLE_OUTSIDE, ResultStatus.ERROR, mock(CheckError.class)));
+ assertTrue(abRoom.containsError(CheckId.C_GE_P_HOLE_OUTSIDE));
+ assertFalse(abRoom.containsError(CheckId.C_GE_P_NON_PLANAR));
+ abRoom.addCheckResult(new CheckResult(CheckId.C_GE_P_NON_PLANAR, ResultStatus.OK, mock(CheckError.class)));
+ assertTrue(abRoom.containsError(CheckId.C_GE_P_HOLE_OUTSIDE));
+ assertFalse(abRoom.containsError(CheckId.C_GE_P_NON_PLANAR));
+ }
+
+
+ @Test
+ public void testClearAllContainedCheckResults() {
+ abRoom.addCheckResult(new CheckResult(CheckId.C_GE_P_HOLE_OUTSIDE, ResultStatus.OK, null));
+ assertEquals(1, abRoom.getAllCheckResults().size());
+ abRoom.clearAllContainedCheckResults();
+ assertTrue(abRoom.getAllCheckResults().isEmpty());
+ }
+
+ @Test
+ public void testContainsAnyError() {
+ assertFalse(abRoom.containsAnyError());
+ abRoom.addCheckResult(new CheckResult(CheckId.C_GE_P_HOLE_OUTSIDE, ResultStatus.OK, null));
+ assertFalse(abRoom.containsAnyError());
+ abRoom.addCheckResult(
+ new CheckResult(CheckId.C_GE_P_INNER_RINGS_NESTED, ResultStatus.ERROR, mock(CheckError.class)));
+ assertTrue(abRoom.containsAnyError());
+ }
+
+ @Test
+ public void testCollectContainedErrors() {
+ abRoom.addCheckResult(new CheckResult(CheckId.C_GE_P_HOLE_OUTSIDE, ResultStatus.ERROR, mock(CheckError.class)));
+ List errors = new ArrayList<>();
+ abRoom.collectContainedErrors(errors);
+ assertEquals(1, errors.size());
+ }
+
+ @Test
+ public void testUnsetGmlGeometries() {
+ org.citygml4j.core.model.core.AbstractUnoccupiedSpace gmlAUS = new org.citygml4j.core.model.core.AbstractUnoccupiedSpace() {
+ @Override
+ public void accept(ObjectVisitor visitor) {
+ return;
+ }
+
+ @Override
+ public boolean isValidBoundary(Class extends AbstractSpaceBoundary> type) {
+ return false;
+ }
+ };
+
+ gmlAUS.setLod1Solid(new SolidProperty());
+ gmlAUS.setLod2Solid(new SolidProperty());
+ gmlAUS.setLod3Solid(new SolidProperty());
+ gmlAUS.setLod0MultiSurface(new MultiSurfaceProperty());
+ gmlAUS.setLod2MultiSurface(new MultiSurfaceProperty());
+ gmlAUS.setLod3MultiSurface(new MultiSurfaceProperty());
+
+ abRoom.cgmlRoom = gmlAUS;
+ abRoom.clearGmlGeometries();
+
+ assertNull(gmlAUS.getLod1Solid());
+ assertNull(gmlAUS.getLod2Solid());
+ assertNull(gmlAUS.getLod3Solid());
+ assertNull(gmlAUS.getLod0MultiSurface());
+ assertNull(gmlAUS.getLod2MultiSurface());
+ assertNull(gmlAUS.getLod3MultiSurface());
+ }
+
+ @Test
+ public void testReCreateGeometriesSolid() {
+ org.citygml4j.core.model.core.AbstractUnoccupiedSpace gmlAUS = new org.citygml4j.core.model.core.AbstractUnoccupiedSpace() {
+ @Override
+ public void accept(ObjectVisitor visitor) {
+ return;
+ }
+
+ @Override
+ public boolean isValidBoundary(Class extends AbstractSpaceBoundary> type) {
+ return false;
+ }
+ };
+
+ abRoom.cgmlRoom = gmlAUS;
+ abRoom.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.SOLID, Lod.LOD1));
+ abRoom.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.SOLID, Lod.LOD2));
+ abRoom.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.SOLID, Lod.LOD3));
+
+ GeometryFactory factory = GeometryFactory.newInstance();
+ ParserConfiguration config = new ParserConfiguration(8, false);
+ abRoom.reCreateGeometries(factory, config);
+ GeometryTestUtils.assertSolidMatchesExpectedValues(gmlAUS.getLod1Solid().getObject());
+ GeometryTestUtils.assertSolidMatchesExpectedValues(gmlAUS.getLod2Solid().getObject());
+ GeometryTestUtils.assertSolidMatchesExpectedValues(gmlAUS.getLod3Solid().getObject());
+ }
+
+ @Test
+ public void testReCreateGeometriesMultiSurface() {
+ org.citygml4j.core.model.core.AbstractUnoccupiedSpace gmlAUS = new org.citygml4j.core.model.core.AbstractUnoccupiedSpace() {
+ @Override
+ public void accept(ObjectVisitor visitor) {
+ return;
+ }
+
+ @Override
+ public boolean isValidBoundary(Class extends AbstractSpaceBoundary> type) {
+ return false;
+ }
+ };
+ abRoom.cgmlRoom = gmlAUS;
+ abRoom.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.MULTI_SURFACE, Lod.LOD0));
+ abRoom.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.MULTI_SURFACE, Lod.LOD2));
+ abRoom.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.MULTI_SURFACE, Lod.LOD3));
+
+ GeometryFactory factory = GeometryFactory.newInstance();
+ ParserConfiguration config = new ParserConfiguration(8, false);
+ abRoom.reCreateGeometries(factory, config);
+
+ assertNotNull(gmlAUS.getLod0MultiSurface());
+ assertNotNull(gmlAUS.getLod0MultiSurface().getObject());
+ assertNotNull(gmlAUS.getLod2MultiSurface());
+ assertNotNull(gmlAUS.getLod2MultiSurface().getObject());
+ assertNotNull(gmlAUS.getLod3MultiSurface());
+ assertNotNull(gmlAUS.getLod3MultiSurface().getObject());
+ }
+
+}
diff --git a/CityDoctorParent/CityDoctorModel/src/test/java/de/hft/stuttgart/citydoctor2/datastructure/AbstractTunnelTest.java b/CityDoctorParent/CityDoctorModel/src/test/java/de/hft/stuttgart/citydoctor2/datastructure/AbstractTunnelTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..ee3f289a6d0146777404dbbf2c883f73de947933
--- /dev/null
+++ b/CityDoctorParent/CityDoctorModel/src/test/java/de/hft/stuttgart/citydoctor2/datastructure/AbstractTunnelTest.java
@@ -0,0 +1,194 @@
+package de.hft.stuttgart.citydoctor2.datastructure;
+
+import de.hft.stuttgart.citydoctor2.check.AbstractCheck;
+import de.hft.stuttgart.citydoctor2.check.CheckError;
+import de.hft.stuttgart.citydoctor2.check.CheckId;
+import de.hft.stuttgart.citydoctor2.check.CheckResult;
+import de.hft.stuttgart.citydoctor2.check.ResultStatus;
+import de.hft.stuttgart.citydoctor2.parser.ParserConfiguration;
+import org.citygml4j.core.util.geometry.GeometryFactory;
+import org.citygml4j.core.visitor.ObjectVisitor;
+import org.junit.Before;
+import org.junit.Test;
+import org.xmlobjects.gml.model.geometry.aggregates.MultiSurfaceProperty;
+import org.xmlobjects.gml.model.geometry.primitives.SolidProperty;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import static org.junit.Assert.*;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+
+public class AbstractTunnelTest {
+
+ AbstractTunnel at;
+
+ @Before
+ public void setUp() {
+ at = new AbstractTunnel() {
+ @Override
+ public CityObject getTopLevelCityObject() {
+ return null;
+ }
+ };
+ }
+
+ @Test
+ public void testVisitorPropagation() {
+ Installation mockInstallation = mock(Installation.class);
+ TunnelHollow mockTunnelHollow = mock(TunnelHollow.class);
+ TunnelFurniture mockTunnelFurniture = mock(TunnelFurniture.class);
+ TunnelPart mockTunnelPart = mock(TunnelPart.class);
+ TunnelConstructiveElement mockTunnelConstructiveElement = mock(TunnelConstructiveElement.class);
+ BoundarySurface mockBoundarySurface = mock(BoundarySurface.class);
+ Geometry mockGeometry = mock(Geometry.class);
+
+ at.addTunnelInstallation(mockInstallation);
+ at.addTunnelHollow(mockTunnelHollow);
+ at.addTunnelFurniture(mockTunnelFurniture);
+ at.addTunnelPart(mockTunnelPart);
+ at.addTunnelConstructiveElement(mockTunnelConstructiveElement);
+ at.addBoundarySurface(mockBoundarySurface);
+ at.addGeometry(mockGeometry);
+
+ AbstractCheck c = new AbstractCheck() {
+ };
+ at.accept(c);
+
+ verify(mockInstallation).accept(c);
+ verify(mockTunnelHollow).accept(c);
+ verify(mockTunnelFurniture).accept(c);
+ verify(mockTunnelPart).accept(c);
+ verify(mockTunnelConstructiveElement).accept(c);
+ verify(mockBoundarySurface).accept(c);
+ verify(mockGeometry).accept(c);
+ }
+
+ @Test
+ public void testContainsError() {
+ assertFalse(at.containsError(CheckId.C_GE_P_HOLE_OUTSIDE));
+ assertFalse(at.containsError(CheckId.C_GE_P_NON_PLANAR));
+ at.addCheckResult(new CheckResult(CheckId.C_GE_P_HOLE_OUTSIDE, ResultStatus.ERROR, mock(CheckError.class)));
+ assertTrue(at.containsError(CheckId.C_GE_P_HOLE_OUTSIDE));
+ assertFalse(at.containsError(CheckId.C_GE_P_NON_PLANAR));
+ at.addCheckResult(new CheckResult(CheckId.C_GE_P_NON_PLANAR, ResultStatus.OK, mock(CheckError.class)));
+ assertTrue(at.containsError(CheckId.C_GE_P_HOLE_OUTSIDE));
+ assertFalse(at.containsError(CheckId.C_GE_P_NON_PLANAR));
+ }
+
+
+ @Test
+ public void testClearAllContainedCheckResults() {
+ at.addCheckResult(new CheckResult(CheckId.C_GE_P_HOLE_OUTSIDE, ResultStatus.OK, null));
+ assertEquals(1, at.getAllCheckResults().size());
+ at.clearAllContainedCheckResults();
+ assertTrue(at.getAllCheckResults().isEmpty());
+ }
+
+ @Test
+ public void testContainsAnyError() {
+ assertFalse(at.containsAnyError());
+ at.addCheckResult(new CheckResult(CheckId.C_GE_P_HOLE_OUTSIDE, ResultStatus.OK, null));
+ assertFalse(at.containsAnyError());
+ at.addCheckResult(
+ new CheckResult(CheckId.C_GE_P_INNER_RINGS_NESTED, ResultStatus.ERROR, mock(CheckError.class)));
+ assertTrue(at.containsAnyError());
+ }
+
+ @Test
+ public void testCollectContainedErrors() {
+ at.addCheckResult(new CheckResult(CheckId.C_GE_P_HOLE_OUTSIDE, ResultStatus.ERROR, mock(CheckError.class)));
+ List errors = new ArrayList<>();
+ at.collectContainedErrors(errors);
+ assertEquals(1, errors.size());
+ }
+
+ @Test
+ public void testUnsetGeometries() {
+ org.citygml4j.core.model.tunnel.AbstractTunnel gmlAt = new org.citygml4j.core.model.tunnel.AbstractTunnel() {
+ @Override
+ public void accept(ObjectVisitor visitor) {
+
+ }
+ };
+ at.setGmlObject(gmlAt);
+
+ gmlAt.setLod0MultiSurface(new MultiSurfaceProperty());
+ gmlAt.getDeprecatedProperties().setLod1MultiSurface(new MultiSurfaceProperty());
+ gmlAt.setLod2MultiSurface(new MultiSurfaceProperty());
+ gmlAt.setLod3MultiSurface(new MultiSurfaceProperty());
+ gmlAt.getDeprecatedProperties().setLod4MultiSurface(new MultiSurfaceProperty());
+ gmlAt.setLod1Solid(new SolidProperty());
+ gmlAt.setLod2Solid(new SolidProperty());
+ gmlAt.setLod3Solid(new SolidProperty());
+ gmlAt.getDeprecatedProperties().setLod4Solid(new SolidProperty());
+
+ at.clearGmlGeometries();
+
+ assertNull(gmlAt.getLod0MultiSurface());
+ assertNull(gmlAt.getDeprecatedProperties().getLod1MultiSurface());
+ assertNull(gmlAt.getLod2MultiSurface());
+ assertNull(gmlAt.getLod3MultiSurface());
+ assertNull(gmlAt.getDeprecatedProperties().getLod4MultiSurface());
+ assertNull(gmlAt.getLod1Solid());
+ assertNull(gmlAt.getLod2Solid());
+ assertNull(gmlAt.getLod3Solid());
+ assertNull(gmlAt.getDeprecatedProperties().getLod4Solid());
+ }
+
+ @Test
+ public void testReCreateGeometriesSolid() {
+ org.citygml4j.core.model.tunnel.AbstractTunnel gmlAt = new org.citygml4j.core.model.tunnel.AbstractTunnel() {
+ @Override
+ public void accept(ObjectVisitor visitor) {
+
+ }
+ };
+ at.setGmlObject(gmlAt);
+ at.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.SOLID, Lod.LOD1));
+ at.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.SOLID, Lod.LOD2));
+ at.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.SOLID, Lod.LOD3));
+ at.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.SOLID, Lod.LOD4));
+
+ GeometryFactory factory = GeometryFactory.newInstance();
+ ParserConfiguration config = new ParserConfiguration(8, false);
+ at.reCreateGeometries(factory, config);
+ GeometryTestUtils.assertSolidMatchesExpectedValues(gmlAt.getLod1Solid().getObject());
+ GeometryTestUtils.assertSolidMatchesExpectedValues(gmlAt.getLod2Solid().getObject());
+ GeometryTestUtils.assertSolidMatchesExpectedValues(gmlAt.getLod3Solid().getObject());
+ GeometryTestUtils.assertSolidMatchesExpectedValues(gmlAt.getDeprecatedProperties().getLod4Solid().getObject());
+ }
+
+ @Test
+ public void testReCreateGeometriesMultiSurface() {
+ org.citygml4j.core.model.tunnel.AbstractTunnel gmlAt = new org.citygml4j.core.model.tunnel.AbstractTunnel() {
+ @Override
+ public void accept(ObjectVisitor visitor) {
+
+ }
+ };
+ at.setGmlObject(gmlAt);
+ at.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.MULTI_SURFACE, Lod.LOD0));
+ at.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.MULTI_SURFACE, Lod.LOD1));
+ at.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.MULTI_SURFACE, Lod.LOD2));
+ at.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.MULTI_SURFACE, Lod.LOD3));
+ at.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.MULTI_SURFACE, Lod.LOD4));
+
+ GeometryFactory factory = GeometryFactory.newInstance();
+ ParserConfiguration config = new ParserConfiguration(8, false);
+ at.reCreateGeometries(factory, config);
+
+ assertNotNull(gmlAt.getLod0MultiSurface());
+ assertNotNull(gmlAt.getLod0MultiSurface().getObject());
+ assertNotNull(gmlAt.getDeprecatedProperties().getLod1MultiSurface());
+ assertNotNull(gmlAt.getDeprecatedProperties().getLod1MultiSurface().getObject());
+ assertNotNull(gmlAt.getLod2MultiSurface());
+ assertNotNull(gmlAt.getLod2MultiSurface().getObject());
+ assertNotNull(gmlAt.getLod3MultiSurface());
+ assertNotNull(gmlAt.getLod3MultiSurface().getObject());
+ assertNotNull(gmlAt.getDeprecatedProperties().getLod4MultiSurface());
+ assertNotNull(gmlAt.getDeprecatedProperties().getLod4MultiSurface().getObject());
+ }
+
+}
\ No newline at end of file
diff --git a/CityDoctorParent/CityDoctorModel/src/test/java/de/hft/stuttgart/citydoctor2/datastructure/BoundarySurfaceTest.java b/CityDoctorParent/CityDoctorModel/src/test/java/de/hft/stuttgart/citydoctor2/datastructure/BoundarySurfaceTest.java
index 9ea3e42ac6c5d0c3b2544c690b5aa31e0d3273cc..458739aceb847430e8251d4f68d508d1bde9e0a7 100644
--- a/CityDoctorParent/CityDoctorModel/src/test/java/de/hft/stuttgart/citydoctor2/datastructure/BoundarySurfaceTest.java
+++ b/CityDoctorParent/CityDoctorModel/src/test/java/de/hft/stuttgart/citydoctor2/datastructure/BoundarySurfaceTest.java
@@ -23,11 +23,16 @@ import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.verify;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;
+import de.hft.stuttgart.citydoctor2.utils.visitors.ClearCheckResultsVisitor;
+import de.hft.stuttgart.citydoctor2.utils.visitors.GmlGeometryRebuilder;
+import de.hft.stuttgart.citydoctor2.utils.visitors.UnsetGeometriesVisitor;
import org.citygml4j.core.model.construction.AbstractConstructionSurface;
import org.citygml4j.core.model.construction.WallSurface;
import org.citygml4j.core.model.core.AbstractThematicSurface;
@@ -45,6 +50,21 @@ import de.hft.stuttgart.citydoctor2.parser.ParserConfiguration;
public class BoundarySurfaceTest {
+ //Todo: Check this class for rework potential with the new Visitors
+
+ @Test
+ public void testVisitorPropagation() {
+ BoundarySurface bs = new BoundarySurface(SurfaceFeatureType.BUILDING, BoundarySurfaceType.WALL, null);
+ Opening oMock = Mockito.mock(Opening.class);
+ bs.addOpening(oMock);
+
+ AbstractCheck c = new AbstractCheck() {
+ };
+ bs.accept(c);
+
+ verify(oMock).accept(c);
+ }
+
@Test
public void testAccept() {
BoundarySurface bs = new BoundarySurface(SurfaceFeatureType.BUILDING, BoundarySurfaceType.WALL, null);
@@ -59,7 +79,7 @@ public class BoundarySurfaceTest {
}
};
bs.accept(c);
- Mockito.verify(oMock).accept(c);
+ verify(oMock).accept(c);
assertEquals(1, bsCounter.intValue());
}
@@ -77,26 +97,18 @@ public class BoundarySurfaceTest {
}
};
bs.accept(c);
- Mockito.verify(oMock).accept(c);
+ verify(oMock).accept(c);
assertEquals(0, bsCounter.intValue());
}
@Test
public void testPrepareForChecking() {
BoundarySurface bs = new BoundarySurface(SurfaceFeatureType.BUILDING, BoundarySurfaceType.WALL, null);
- Opening oMock = Mockito.mock(Opening.class);
- bs.addOpening(oMock);
+ Geometry geom = new Geometry(GeometryType.MULTI_SURFACE, Lod.LOD2);
+ Geometry spyGeom = Mockito.spy(geom);
+ bs.addGeometry(spyGeom);
bs.prepareForChecking();
- Mockito.verify(oMock).prepareForChecking();
- }
-
- @Test
- public void testClearMetaInformation() {
- BoundarySurface bs = new BoundarySurface(SurfaceFeatureType.BUILDING, BoundarySurfaceType.WALL, null);
- Opening oMock = Mockito.mock(Opening.class);
- bs.addOpening(oMock);
- bs.clearMetaInformation();
- Mockito.verify(oMock).clearMetaInformation();
+ verify(spyGeom).updateEdgesAndVertices();
}
@Test
@@ -130,43 +142,29 @@ public class BoundarySurfaceTest {
assertFalse(bs.getAllCheckResults().isEmpty());
bs.addOpening(oMock);
bs.clearAllContainedCheckResults();
- Mockito.verify(oMock).clearAllContainedCheckResults();
+ verify(oMock).accept(any(ClearCheckResultsVisitor.class));
assertTrue(bs.getAllCheckResults().isEmpty());
}
@Test
public void testContainsAnyError() {
BoundarySurface bs = new BoundarySurface(SurfaceFeatureType.BUILDING, BoundarySurfaceType.WALL, null);
- Opening oMock = Mockito.mock(Opening.class);
- bs.addOpening(oMock);
assertFalse(bs.containsAnyError());
- Mockito.verify(oMock).containsAnyError();
bs.addCheckResult(
new CheckResult(CheckId.C_GE_P_HOLE_OUTSIDE, ResultStatus.ERROR, Mockito.mock(CheckError.class)));
assertTrue(bs.containsAnyError());
}
- @Test
- public void testContainsAnyErrorInOpeing() {
- BoundarySurface bs = new BoundarySurface(SurfaceFeatureType.BUILDING, BoundarySurfaceType.WALL, null);
- Opening oMock = Mockito.mock(Opening.class);
- bs.addOpening(oMock);
- Mockito.when(oMock.containsAnyError()).thenReturn(true);
- assertTrue(bs.containsAnyError());
- }
@Test
public void testCollectContainedErrors() {
BoundarySurface bs = new BoundarySurface(SurfaceFeatureType.BUILDING, BoundarySurfaceType.WALL, null);
- Opening oMock = Mockito.mock(Opening.class);
bs.addCheckResult(
new CheckResult(CheckId.C_GE_P_HOLE_OUTSIDE, ResultStatus.ERROR, Mockito.mock(CheckError.class)));
- bs.addOpening(oMock);
-
List errors = new ArrayList<>();
bs.collectContainedErrors(errors);
assertEquals(1, errors.size());
- Mockito.verify(oMock).collectContainedErrors(errors);
+ ;
}
@Test
@@ -320,7 +318,7 @@ public class BoundarySurfaceTest {
GeometryFactory factory = GeometryFactory.newInstance();
ParserConfiguration config = new ParserConfiguration(8, false);
bs.reCreateGeometries(factory, config);
- Mockito.verify(oMock).reCreateGeometries(factory, config);
+ verify(oMock).accept(any(GmlGeometryRebuilder.class));
}
@Test
@@ -342,8 +340,8 @@ public class BoundarySurfaceTest {
BoundarySurface bs = new BoundarySurface(SurfaceFeatureType.BUILDING, BoundarySurfaceType.WALL, ws);
Opening oMock = Mockito.mock(Opening.class);
bs.addOpening(oMock);
- bs.unsetGmlGeometries();
- Mockito.verify(oMock).unsetGmlGeometries();
+ bs.accept(new UnsetGeometriesVisitor());
+ verify(oMock).accept(any(UnsetGeometriesVisitor.class));
assertNull(ws.getLod2MultiSurface());
assertNull(ws.getLod3MultiSurface());
assertNull(ws.getDeprecatedProperties().getLod4MultiSurface());
diff --git a/CityDoctorParent/CityDoctorModel/src/test/java/de/hft/stuttgart/citydoctor2/datastructure/BridgeObjectTest.java b/CityDoctorParent/CityDoctorModel/src/test/java/de/hft/stuttgart/citydoctor2/datastructure/BridgeObjectTest.java
index 7f9450b13824b31bc9251ad6fce2794857a776aa..d8e23400532ed5969f96628e190560d0523129c2 100644
--- a/CityDoctorParent/CityDoctorModel/src/test/java/de/hft/stuttgart/citydoctor2/datastructure/BridgeObjectTest.java
+++ b/CityDoctorParent/CityDoctorModel/src/test/java/de/hft/stuttgart/citydoctor2/datastructure/BridgeObjectTest.java
@@ -22,17 +22,21 @@ import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import java.util.ArrayList;
+import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;
+import de.hft.stuttgart.citydoctor2.utils.visitors.UnsetGeometriesVisitor;
import org.citygml4j.core.model.bridge.AbstractBridge;
-import org.citygml4j.core.model.bridge.Bridge;
import org.citygml4j.core.model.deprecated.bridge.DeprecatedPropertiesOfAbstractBridge;
import org.citygml4j.core.util.geometry.GeometryFactory;
+import org.citygml4j.core.visitor.ObjectVisitor;
import org.junit.Test;
import de.hft.stuttgart.citydoctor2.check.AbstractCheck;
@@ -42,9 +46,12 @@ import de.hft.stuttgart.citydoctor2.check.CheckResult;
import de.hft.stuttgart.citydoctor2.check.ResultStatus;
import de.hft.stuttgart.citydoctor2.datastructure.BridgeObject.BridgeType;
import de.hft.stuttgart.citydoctor2.parser.ParserConfiguration;
+import org.mockito.Mockito;
public class BridgeObjectTest {
+ //TODO: Rework this class with the new Visitors
+
@Test
public void testAccept() {
BridgeObject bo = new BridgeObject(mock(AbstractBridge.class));
@@ -68,206 +75,156 @@ public class BridgeObjectTest {
assertEquals(1, bsCounter.intValue());
AtomicInteger boCounter2 = new AtomicInteger(0);
- c = new AbstractCheck();
+ c = new AbstractCheck() {
+ };
bo.accept(c);
assertEquals(0, boCounter2.intValue());
}
@Test
- public void testPrepareForChecking() {
+ public void testVisitorPropagation() {
BridgeObject bo = new BridgeObject(mock(AbstractBridge.class));
+
+ BridgeObject partMock = mock(BridgeObject.class);
+ BridgeRoom mockRoom = mock(BridgeRoom.class);
+ BridgeRoomFurniture mockFurn = mock(BridgeRoomFurniture.class);
+ BridgeConstructiveElement ceMock = mock(BridgeConstructiveElement.class);
+ Installation instMock = mock(Installation.class);
BoundarySurface bsMock = mock(BoundarySurface.class);
+ Geometry geomMock = mock(Geometry.class);
+
+ bo.addBridgePart(partMock);
+ bo.addBridgeRoom(mockRoom);
+ bo.addBridgeFurniture(mockFurn);
+ bo.addConstructiveElement(ceMock);
+ bo.addBridgeInstallation(instMock);
bo.addBoundarySurface(bsMock);
- bo.prepareForChecking();
- verify(bsMock).prepareForChecking();
+ bo.addGeometry(geomMock);
+
+ AbstractCheck c = new AbstractCheck() {
+ };
+ bo.accept(c);
+
+ verify(partMock).accept(c);
+ verify(mockRoom).accept(c);
+ verify(mockFurn).accept(c);
+ verify(ceMock).accept(c);
+ verify(instMock).accept(c);
+ verify(bsMock).accept(c);
+ verify(geomMock).accept(c);
}
@Test
- public void testClearMetaInformation() {
+ public void testPrepareForChecking() {
BridgeObject bo = new BridgeObject(mock(AbstractBridge.class));
- BoundarySurface bsMock = mock(BoundarySurface.class);
- bo.addBoundarySurface(bsMock);
- bo.clearMetaInformation();
- verify(bsMock).clearMetaInformation();
+ Geometry geom = new Geometry(GeometryType.MULTI_SURFACE, Lod.LOD2);
+ Geometry spyGeom = Mockito.spy(geom);
+
+ bo.addGeometry(spyGeom);
+ bo.prepareForChecking();
+
+ verify(spyGeom).updateEdgesAndVertices();
}
@Test
public void testContainsError() {
BridgeObject bo = new BridgeObject(mock(AbstractBridge.class));
assertFalse(bo.containsError(CheckId.C_GE_P_HOLE_OUTSIDE));
+ assertFalse(bo.containsError(CheckId.C_GE_P_NON_PLANAR));
bo.addCheckResult(new CheckResult(CheckId.C_GE_P_HOLE_OUTSIDE, ResultStatus.ERROR, mock(CheckError.class)));
assertTrue(bo.containsError(CheckId.C_GE_P_HOLE_OUTSIDE));
- }
-
- @Test
- public void testContainsError2() {
- BridgeObject bo = new BridgeObject(mock(AbstractBridge.class));
- BoundarySurface bsMock = mock(BoundarySurface.class);
- bo.addBoundarySurface(bsMock);
- assertFalse(bo.containsError(CheckId.C_GE_P_HOLE_OUTSIDE));
- when(bsMock.containsError(CheckId.C_GE_P_HOLE_OUTSIDE)).thenReturn(true);
+ assertFalse(bo.containsError(CheckId.C_GE_P_NON_PLANAR));
+ bo.addCheckResult(new CheckResult(CheckId.C_GE_P_NON_PLANAR, ResultStatus.OK, mock(CheckError.class)));
assertTrue(bo.containsError(CheckId.C_GE_P_HOLE_OUTSIDE));
+ assertFalse(bo.containsError(CheckId.C_GE_P_NON_PLANAR));
}
+
@Test
public void testClearAllContainedCheckResults() {
BridgeObject bo = new BridgeObject(mock(AbstractBridge.class));
- BoundarySurface bsMock = mock(BoundarySurface.class);
- bo.addBoundarySurface(bsMock);
+ bo.addCheckResult(new CheckResult(CheckId.C_GE_P_HOLE_OUTSIDE, ResultStatus.OK, null));
+
+ assertEquals(1, bo.getAllCheckResults().size());
bo.clearAllContainedCheckResults();
- verify(bsMock).clearAllContainedCheckResults();
+ assertTrue(bo.getAllCheckResults().isEmpty());
}
@Test
public void testContainsAnyError() {
BridgeObject bo = new BridgeObject(mock(AbstractBridge.class));
- BoundarySurface bsMock = mock(BoundarySurface.class);
- bo.addBoundarySurface(bsMock);
- bo.containsAnyError();
- verify(bsMock).containsAnyError();
-
- when(bsMock.containsAnyError()).thenReturn(true);
+ assertFalse(bo.containsAnyError());
+ bo.addCheckResult(new CheckResult(CheckId.C_GE_P_HOLE_OUTSIDE, ResultStatus.OK, null));
+ assertFalse(bo.containsAnyError());
+ bo.addCheckResult(
+ new CheckResult(CheckId.C_GE_P_INNER_RINGS_NESTED, ResultStatus.ERROR, mock(CheckError.class)));
assertTrue(bo.containsAnyError());
-
- BridgeObject bo2 = new BridgeObject(mock(AbstractBridge.class));
- bo2.addCheckResult(new CheckResult(CheckId.C_GE_P_HOLE_OUTSIDE, ResultStatus.ERROR, mock(CheckError.class)));
- assertTrue(bo2.containsAnyError());
}
@Test
public void testCollectContainedErrors() {
BridgeObject bo = new BridgeObject(mock(AbstractBridge.class));
- BoundarySurface bsMock = mock(BoundarySurface.class);
- bo.addBoundarySurface(bsMock);
- ArrayList errors = new ArrayList<>();
+ bo.addCheckResult(new CheckResult(CheckId.C_GE_P_HOLE_OUTSIDE, ResultStatus.ERROR, mock(CheckError.class)));
+ List errors = new ArrayList<>();
bo.collectContainedErrors(errors);
- verify(bsMock).collectContainedErrors(errors);
+ assertEquals(1, errors.size());
}
@Test
- public void testReCreateGeometries() {
- BridgeObject bo = new BridgeObject(mock(AbstractBridge.class));
- BoundarySurface bsMock = mock(BoundarySurface.class);
- bo.addBoundarySurface(bsMock);
- GeometryFactory factoryMock = mock(GeometryFactory.class);
- ParserConfiguration configMock = mock(ParserConfiguration.class);
- bo.reCreateGeometries(factoryMock, configMock);
- verify(bsMock).reCreateGeometries(factoryMock, configMock);
- }
-
- @Test
- public void testReCreateGeometriesMultiSurfaceLod1() {
- BridgeObject bo = new BridgeObject(mock(AbstractBridge.class));
- Geometry geom = GeometryTestUtils.createDummyGeometry(GeometryType.MULTI_SURFACE, Lod.LOD1);
- AbstractBridge ab = new Bridge();
- bo.setGmlObject(ab);
- bo.addGeometry(geom);
- GeometryFactory factory = GeometryFactory.newInstance();
- ParserConfiguration config = new ParserConfiguration(8, false);
- bo.reCreateGeometries(factory, config);
- assertNotNull(ab.getDeprecatedProperties().getLod1MultiSurface());
- assertNotNull(ab.getDeprecatedProperties().getLod1MultiSurface().getObject());
+ public void testReCreateGeometriesSolid() {
+ org.citygml4j.core.model.bridge.AbstractBridge gmlBr = new AbstractBridge() {
+ @Override
+ public void accept(ObjectVisitor visitor) {
+
+ }
+ };
+ BridgeObject bo = new BridgeObject(gmlBr);
+ bo.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.SOLID, Lod.LOD1));
+ bo.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.SOLID, Lod.LOD2));
+ bo.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.SOLID, Lod.LOD3));
+ bo.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.SOLID, Lod.LOD4));
- }
-
- @Test
- public void testReCreateGeometriesMultiSurfaceLod2() {
- BridgeObject bo = new BridgeObject(mock(AbstractBridge.class));
- Geometry geom = GeometryTestUtils.createDummyGeometry(GeometryType.MULTI_SURFACE, Lod.LOD2);
- AbstractBridge ab = new Bridge();
- bo.setGmlObject(ab);
- bo.addGeometry(geom);
- GeometryFactory factory = GeometryFactory.newInstance();
- ParserConfiguration config = new ParserConfiguration(8, false);
- bo.reCreateGeometries(factory, config);
- assertNotNull(ab.getLod2MultiSurface());
- assertNotNull(ab.getLod2MultiSurface().getObject());
- }
-
- @Test
- public void testReCreateGeometriesMultiSurfaceLod3() {
- BridgeObject bo = new BridgeObject(mock(AbstractBridge.class));
- Geometry geom = GeometryTestUtils.createDummyGeometry(GeometryType.MULTI_SURFACE, Lod.LOD3);
- AbstractBridge ab = new Bridge();
- bo.setGmlObject(ab);
- bo.addGeometry(geom);
- GeometryFactory factory = GeometryFactory.newInstance();
- ParserConfiguration config = new ParserConfiguration(8, false);
- bo.reCreateGeometries(factory, config);
- assertNotNull(ab.getLod3MultiSurface());
- assertNotNull(ab.getLod3MultiSurface().getObject());
- }
-
- @Test
- public void testReCreateGeometriesMultiSurfaceLod4() {
- BridgeObject bo = new BridgeObject(mock(AbstractBridge.class));
- Geometry geom = GeometryTestUtils.createDummyGeometry(GeometryType.MULTI_SURFACE, Lod.LOD4);
- AbstractBridge ab = new Bridge();
- bo.setGmlObject(ab);
- bo.addGeometry(geom);
- GeometryFactory factory = GeometryFactory.newInstance();
- ParserConfiguration config = new ParserConfiguration(8, false);
- bo.reCreateGeometries(factory, config);
- assertNotNull(ab.getDeprecatedProperties().getLod4MultiSurface());
- assertNotNull(ab.getDeprecatedProperties().getLod4MultiSurface().getObject());
- }
-
- @Test
- public void testReCreateGeometriesSolidLod1() {
- BridgeObject bo = new BridgeObject(mock(AbstractBridge.class));
- Geometry geom = GeometryTestUtils.createDummyGeometry(GeometryType.SOLID, Lod.LOD1);
- AbstractBridge ab = new Bridge();
- bo.setGmlObject(ab);
- bo.addGeometry(geom);
- GeometryFactory factory = GeometryFactory.newInstance();
- ParserConfiguration config = new ParserConfiguration(8, false);
- bo.reCreateGeometries(factory, config);
- assertNotNull(ab.getLod1Solid());
- assertNotNull(ab.getLod1Solid().getObject());
- }
-
- @Test
- public void testReCreateGeometriesSolidLod2() {
- BridgeObject bo = new BridgeObject(mock(AbstractBridge.class));
- Geometry geom = GeometryTestUtils.createDummyGeometry(GeometryType.SOLID, Lod.LOD2);
- AbstractBridge ab = new Bridge();
- bo.setGmlObject(ab);
- bo.addGeometry(geom);
- GeometryFactory factory = GeometryFactory.newInstance();
- ParserConfiguration config = new ParserConfiguration(8, false);
- bo.reCreateGeometries(factory, config);
- assertNotNull(ab.getLod2Solid());
- assertNotNull(ab.getLod2Solid().getObject());
- }
-
- @Test
- public void testReCreateGeometriesSolidLod3() {
- BridgeObject bo = new BridgeObject(mock(AbstractBridge.class));
- Geometry geom = GeometryTestUtils.createDummyGeometry(GeometryType.SOLID, Lod.LOD3);
- AbstractBridge ab = new Bridge();
- bo.setGmlObject(ab);
- bo.addGeometry(geom);
GeometryFactory factory = GeometryFactory.newInstance();
ParserConfiguration config = new ParserConfiguration(8, false);
bo.reCreateGeometries(factory, config);
- assertNotNull(ab.getLod3Solid());
- assertNotNull(ab.getLod3Solid().getObject());
+ GeometryTestUtils.assertSolidMatchesExpectedValues(gmlBr.getLod1Solid().getObject());
+ GeometryTestUtils.assertSolidMatchesExpectedValues(gmlBr.getLod2Solid().getObject());
+ GeometryTestUtils.assertSolidMatchesExpectedValues(gmlBr.getLod3Solid().getObject());
+ GeometryTestUtils.assertSolidMatchesExpectedValues(gmlBr.getDeprecatedProperties().getLod4Solid().getObject());
}
-
+
@Test
- public void testReCreateGeometriesSolidLod4() {
- BridgeObject bo = new BridgeObject(mock(AbstractBridge.class));
- Geometry geom = GeometryTestUtils.createDummyGeometry(GeometryType.SOLID, Lod.LOD4);
- AbstractBridge ab = new Bridge();
- bo.setGmlObject(ab);
- bo.addGeometry(geom);
+ public void testReCreateGeometriesMultiSurface() {
+ org.citygml4j.core.model.bridge.AbstractBridge gmlBr = new AbstractBridge() {
+ @Override
+ public void accept(ObjectVisitor visitor) {
+
+ }
+ };
+ BridgeObject bo = new BridgeObject(gmlBr);
+ bo.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.MULTI_SURFACE, Lod.LOD0));
+ bo.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.MULTI_SURFACE, Lod.LOD1));
+ bo.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.MULTI_SURFACE, Lod.LOD2));
+ bo.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.MULTI_SURFACE, Lod.LOD3));
+ bo.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.MULTI_SURFACE, Lod.LOD4));
+
GeometryFactory factory = GeometryFactory.newInstance();
ParserConfiguration config = new ParserConfiguration(8, false);
bo.reCreateGeometries(factory, config);
- assertNotNull(ab.getDeprecatedProperties().getLod4Solid());
- assertNotNull(ab.getDeprecatedProperties().getLod4Solid().getObject());
+
+ assertNotNull(gmlBr.getLod0MultiSurface());
+ assertNotNull(gmlBr.getLod0MultiSurface().getObject());
+ assertNotNull(gmlBr.getDeprecatedProperties().getLod1MultiSurface());
+ assertNotNull(gmlBr.getDeprecatedProperties().getLod1MultiSurface().getObject());
+ assertNotNull(gmlBr.getLod2MultiSurface());
+ assertNotNull(gmlBr.getLod2MultiSurface().getObject());
+ assertNotNull(gmlBr.getLod3MultiSurface());
+ assertNotNull(gmlBr.getLod3MultiSurface().getObject());
+ assertNotNull(gmlBr.getDeprecatedProperties().getLod4MultiSurface());
+ assertNotNull(gmlBr.getDeprecatedProperties().getLod4MultiSurface().getObject());
}
+
@Test
public void testUnsetGmlGeometries() {
AbstractBridge abMock = mock(AbstractBridge.class);
@@ -276,8 +233,13 @@ public class BridgeObjectTest {
BridgeObject bo = new BridgeObject(abMock);
BoundarySurface bsMock = mock(BoundarySurface.class);
bo.addBoundarySurface(bsMock);
-
- bo.unsetGmlGeometries();
+ doAnswer(invocation -> {
+ bsMock.unsetGmlGeometries();
+ return null;
+ }).when(bsMock).accept(any(UnsetGeometriesVisitor.class));
+
+ bo.accept(new UnsetGeometriesVisitor());
+ verify(bsMock).accept(any(UnsetGeometriesVisitor.class));
verify(bsMock).unsetGmlGeometries();
verify(propsMock).setLod1MultiSurface(null);
verify(abMock).setLod2MultiSurface(null);
diff --git a/CityDoctorParent/CityDoctorModel/src/test/java/de/hft/stuttgart/citydoctor2/datastructure/BuildingTest.java b/CityDoctorParent/CityDoctorModel/src/test/java/de/hft/stuttgart/citydoctor2/datastructure/BuildingTest.java
index df1c0a73a514da2773448b4d2a169e85fe0cdc14..458556544609cc00fdb4686df6baddd47b69a0d7 100644
--- a/CityDoctorParent/CityDoctorModel/src/test/java/de/hft/stuttgart/citydoctor2/datastructure/BuildingTest.java
+++ b/CityDoctorParent/CityDoctorModel/src/test/java/de/hft/stuttgart/citydoctor2/datastructure/BuildingTest.java
@@ -22,9 +22,14 @@ import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNotSame;
import static org.junit.Assert.assertSame;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import de.hft.stuttgart.citydoctor2.check.AbstractCheck;
import org.citygml4j.core.model.construction.RoofSurface;
import org.junit.Test;
+import org.mockito.Mockito;
import org.xmlobjects.gml.model.basictypes.Code;
import de.hft.stuttgart.citydoctor2.datastructure.LinearRing.LinearRingType;
@@ -120,4 +125,42 @@ public class BuildingTest {
return b;
}
+ @Test
+ public void testVisitorPropagation() {
+ Building b = new Building();
+ BuildingPart bp = new BuildingPart(b);
+ BuildingPart spyBp = Mockito.spy(bp);
+ b.getBuildingParts().remove(bp);
+ b.addBuildingPart(spyBp);
+
+ BuildingRoom mockRoom = mock(BuildingRoom.class);
+ Installation mockInstallation = mock(Installation.class);
+ BuildingRoomFurniture mockBuildingRoomFurniture = mock(BuildingRoomFurniture.class);
+ BuildingUnit mockBuildingUnit = mock(BuildingUnit.class);
+ Storey mockStorey = mock(Storey.class);
+
+ b.addBuildingRoom(mockRoom);
+ b.addBuildingInstallation(mockInstallation);
+ b.addBuildingRoomFurniture(mockBuildingRoomFurniture);
+ b.addBuildingUnit(mockBuildingUnit);
+ b.addStorey(mockStorey);
+ bp.addBuildingRoom(mockRoom);
+ bp.addBuildingInstallation(mockInstallation);
+ bp.addBuildingRoomFurniture(mockBuildingRoomFurniture);
+ bp.addBuildingUnit(mockBuildingUnit);
+ bp.addStorey(mockStorey);
+
+
+ AbstractCheck c = new AbstractCheck() {
+ };
+ b.accept(c);
+
+ verify(spyBp).accept(c);
+ verify(mockRoom, times(2)).accept(c);
+ verify(mockInstallation, times(2)).accept(c);
+ verify(mockBuildingRoomFurniture, times(2)).accept(c);
+ verify(mockBuildingUnit, times(2)).accept(c);
+ verify(mockStorey, times(2)).accept(c);
+ }
+
}
diff --git a/CityDoctorParent/CityDoctorModel/src/test/java/de/hft/stuttgart/citydoctor2/datastructure/CityDoctorModelTest.java b/CityDoctorParent/CityDoctorModel/src/test/java/de/hft/stuttgart/citydoctor2/datastructure/CityDoctorModelTest.java
index 0894044efe4855172bf91e7c31f0b4cec8d41a53..7eeee2897303efc7f89d28f3d3431b98273c69a9 100644
--- a/CityDoctorParent/CityDoctorModel/src/test/java/de/hft/stuttgart/citydoctor2/datastructure/CityDoctorModelTest.java
+++ b/CityDoctorParent/CityDoctorModel/src/test/java/de/hft/stuttgart/citydoctor2/datastructure/CityDoctorModelTest.java
@@ -255,13 +255,13 @@ public class CityDoctorModelTest {
}
@Test
- public void testAddBridge() {
+ public void testSetCityModel() {
File f = Mockito.mock(File.class);
ParserConfiguration config = new ParserConfiguration(8, false);
CityDoctorModel model = new CityDoctorModel(config, f);
- BridgeObject b = Mockito.mock(BridgeObject.class);
- model.addBridge(b);
- assertEquals(b, model.getBridges().get(0));
+ CityModel cModel = Mockito.mock(CityModel.class);
+ model.setCityModel(cModel);
+ assertEquals(cModel, model.getCityModel());
}
@Test
@@ -275,25 +275,47 @@ public class CityDoctorModelTest {
}
@Test
- public void testSetCityModel() {
+ public void testAddBridge() {
File f = Mockito.mock(File.class);
ParserConfiguration config = new ParserConfiguration(8, false);
CityDoctorModel model = new CityDoctorModel(config, f);
- CityModel cModel = Mockito.mock(CityModel.class);
- model.setCityModel(cModel);
- assertEquals(cModel, model.getCityModel());
+ BridgeObject b = Mockito.mock(BridgeObject.class);
+ model.addBridge(b);
+ assertEquals(b, model.getBridges().get(0));
}
@Test
- public void testAddWater() {
+ public void testAddVegetation() {
File f = Mockito.mock(File.class);
ParserConfiguration config = new ParserConfiguration(8, false);
CityDoctorModel model = new CityDoctorModel(config, f);
- WaterObject water = Mockito.mock(WaterObject.class);
- model.addWater(water);
- assertEquals(water, model.getWater().get(0));
+ Vegetation veg = Mockito.mock(Vegetation.class);
+ model.addVegetation(veg);
+ assertEquals(veg, model.getVegetation().get(0));
}
+ @Test
+ public void testAddTunnel() {
+ File f = Mockito.mock(File.class);
+ ParserConfiguration config = new ParserConfiguration(8, false);
+ CityDoctorModel model = new CityDoctorModel(config, f);
+ Tunnel tunnel = Mockito.mock(Tunnel.class);
+ model.addTunnel(tunnel);
+ assertEquals(tunnel, model.getTunnels().get(0));
+ }
+
+
+ @Test
+ public void testAddTransportation() {
+ File f = Mockito.mock(File.class);
+ ParserConfiguration config = new ParserConfiguration(8, false);
+ CityDoctorModel model = new CityDoctorModel(config, f);
+ TransportationObject trans = Mockito.mock(TransportationObject.class);
+ model.addTransportation(trans);
+ assertEquals(trans, model.getTransportation().get(0));
+ }
+
+
@Test
public void testAddLand() {
File f = Mockito.mock(File.class);
@@ -305,23 +327,33 @@ public class CityDoctorModelTest {
}
@Test
- public void testAddVegetation() {
+ public void testAddWater() {
File f = Mockito.mock(File.class);
ParserConfiguration config = new ParserConfiguration(8, false);
CityDoctorModel model = new CityDoctorModel(config, f);
- Vegetation veg = Mockito.mock(Vegetation.class);
- model.addVegetation(veg);
- assertEquals(veg, model.getVegetation().get(0));
+ WaterObject water = Mockito.mock(WaterObject.class);
+ model.addWater(water);
+ assertEquals(water, model.getWater().get(0));
}
@Test
- public void testAddTransportation() {
+ public void testAddCityFurniture() {
File f = Mockito.mock(File.class);
ParserConfiguration config = new ParserConfiguration(8, false);
CityDoctorModel model = new CityDoctorModel(config, f);
- TransportationObject trans = Mockito.mock(TransportationObject.class);
- model.addTransportation(trans);
- assertEquals(trans, model.getTransportation().get(0));
+ CityFurniture cf = Mockito.mock(CityFurniture.class);
+ model.addCityFurniture(cf);
+ assertEquals(cf, model.getCityFurniture().get(0));
+ }
+
+ @Test
+ public void testAddGenericCityObject() {
+ File f = Mockito.mock(File.class);
+ ParserConfiguration config = new ParserConfiguration(8, false);
+ CityDoctorModel model = new CityDoctorModel(config, f);
+ GenericCityObject gen = Mockito.mock(GenericCityObject.class);
+ model.addGenericCityObject(gen);
+ assertEquals(gen, model.getGenericCityObjects().get(0));
}
@Test
@@ -329,11 +361,29 @@ public class CityDoctorModelTest {
File f = Mockito.mock(File.class);
ParserConfiguration config = new ParserConfiguration(8, false);
CityDoctorModel model = new CityDoctorModel(config, f);
+
Building b = Mockito.mock(Building.class);
+ BridgeObject bo = Mockito.mock(BridgeObject.class);
+ Vegetation veg = Mockito.mock(Vegetation.class);
+ Tunnel tunnel = Mockito.mock(Tunnel.class);
TransportationObject trans = Mockito.mock(TransportationObject.class);
+ LandObject land = Mockito.mock(LandObject.class);
+ WaterObject water = Mockito.mock(WaterObject.class);
+ CityFurniture cf = Mockito.mock(CityFurniture.class);
+ GenericCityObject generic = Mockito.mock(GenericCityObject.class);
+
model.addBuilding(b);
+ model.addBridge(bo);
+ model.addVegetation(veg);
model.addTransportation(trans);
- assertEquals(2, model.getNumberOfFeatures());
+ model.addTunnel(tunnel);
+ model.addLand(land);
+ model.addWater(water);
+ model.addCityFurniture(cf);
+ model.addGenericCityObject(generic);
+
+ assertEquals(9, model.getNumberOfFeatures());
+
}
@Test
@@ -355,6 +405,7 @@ public class CityDoctorModelTest {
assertEquals(b1, model.getBuildings().get(0));
model.replaceFeature(b1, b2);
assertEquals(b2, model.getBuildings().get(0));
+ assertEquals(1, model.getBuildings().size());
}
@Test(expected = IllegalStateException.class)
@@ -366,6 +417,30 @@ public class CityDoctorModelTest {
Building b2 = Mockito.mock(Building.class);
model.replaceFeature(b1, b2);
}
+
+ @Test
+ public void testReplaceBridge() {
+ File f = Mockito.mock(File.class);
+ ParserConfiguration config = new ParserConfiguration(8, false);
+ CityDoctorModel model = new CityDoctorModel(config, f);
+ BridgeObject b1 = Mockito.mock(BridgeObject.class);
+ BridgeObject b2 = Mockito.mock(BridgeObject.class);
+ model.addBridge(b1);
+ assertEquals(b1, model.getBridges().get(0));
+ model.replaceFeature(b1, b2);
+ assertEquals(b2, model.getBridges().get(0));
+ assertEquals(1, model.getBridges().size());
+ }
+
+ @Test(expected = IllegalStateException.class)
+ public void testReplaceBridgeMissing() {
+ File f = Mockito.mock(File.class);
+ ParserConfiguration config = new ParserConfiguration(8, false);
+ CityDoctorModel model = new CityDoctorModel(config, f);
+ BridgeObject b1 = Mockito.mock(BridgeObject.class);
+ BridgeObject b2 = Mockito.mock(BridgeObject.class);
+ model.replaceFeature(b1, b2);
+ }
@Test
public void testReplaceVegetation() {
@@ -378,6 +453,7 @@ public class CityDoctorModelTest {
assertEquals(v1, model.getVegetation().get(0));
model.replaceFeature(v1, v2);
assertEquals(v2, model.getVegetation().get(0));
+ assertEquals(1, model.getVegetation().size());
}
@Test(expected = IllegalStateException.class)
@@ -389,6 +465,30 @@ public class CityDoctorModelTest {
Vegetation v2 = Mockito.mock(Vegetation.class);
model.replaceFeature(v1, v2);
}
+
+ @Test
+ public void testReplaceTunnel() {
+ File f = Mockito.mock(File.class);
+ ParserConfiguration config = new ParserConfiguration(8, false);
+ CityDoctorModel model = new CityDoctorModel(config, f);
+ Tunnel t1 = Mockito.mock(Tunnel.class);
+ Tunnel t2 = Mockito.mock(Tunnel.class);
+ model.addTunnel(t1);
+ assertEquals(t1, model.getTunnels().get(0));
+ model.replaceFeature(t1, t2);
+ assertEquals(t2, model.getTunnels().get(0));
+ assertEquals(1, model.getTunnels().size());
+ }
+
+ @Test(expected = IllegalStateException.class)
+ public void testReplaceTunnelMissing() {
+ File f = Mockito.mock(File.class);
+ ParserConfiguration config = new ParserConfiguration(8, false);
+ CityDoctorModel model = new CityDoctorModel(config, f);
+ Tunnel t1 = Mockito.mock(Tunnel.class);
+ Tunnel t2 = Mockito.mock(Tunnel.class);
+ model.replaceFeature(t1, t2);
+ }
@Test
public void testReplaceTransportation() {
@@ -401,6 +501,7 @@ public class CityDoctorModelTest {
assertEquals(t1, model.getTransportation().get(0));
model.replaceFeature(t1, t2);
assertEquals(t2, model.getTransportation().get(0));
+ assertEquals(1, model.getTransportation().size());
}
@Test(expected = IllegalStateException.class)
@@ -412,6 +513,30 @@ public class CityDoctorModelTest {
TransportationObject t2 = Mockito.mock(TransportationObject.class);
model.replaceFeature(t1, t2);
}
+
+ @Test
+ public void testReplaceLand() {
+ File f = Mockito.mock(File.class);
+ ParserConfiguration config = new ParserConfiguration(8, false);
+ CityDoctorModel model = new CityDoctorModel(config, f);
+ LandObject lo1 = Mockito.mock(LandObject.class);
+ LandObject lo2 = Mockito.mock(LandObject.class);
+ model.addLand(lo1);
+ assertEquals(lo1, model.getLand().get(0));
+ model.replaceFeature(lo1, lo2);
+ assertEquals(lo2, model.getLand().get(0));
+ assertEquals(1, model.getLand().size());
+ }
+
+ @Test(expected = IllegalStateException.class)
+ public void testReplaceLandMissing() {
+ File f = Mockito.mock(File.class);
+ ParserConfiguration config = new ParserConfiguration(8, false);
+ CityDoctorModel model = new CityDoctorModel(config, f);
+ LandObject lo1 = Mockito.mock(LandObject.class);
+ LandObject lo2 = Mockito.mock(LandObject.class);
+ model.replaceFeature(lo1, lo2);
+ }
@Test
public void testReplaceWater() {
@@ -424,6 +549,7 @@ public class CityDoctorModelTest {
assertEquals(t1, model.getWater().get(0));
model.replaceFeature(t1, t2);
assertEquals(t2, model.getWater().get(0));
+ assertEquals(1, model.getWater().size());
}
@Test(expected = IllegalStateException.class)
@@ -436,4 +562,52 @@ public class CityDoctorModelTest {
model.replaceFeature(t1, t2);
}
+ @Test
+ public void testReplaceCityFurniture() {
+ File f = Mockito.mock(File.class);
+ ParserConfiguration config = new ParserConfiguration(8, false);
+ CityDoctorModel model = new CityDoctorModel(config, f);
+ CityFurniture cf1 = Mockito.mock(CityFurniture.class);
+ CityFurniture cf2 = Mockito.mock(CityFurniture.class);
+ model.addCityFurniture(cf1);
+ assertEquals(cf1, model.getCityFurniture().get(0));
+ model.replaceFeature(cf1, cf2);
+ assertEquals(cf2, model.getCityFurniture().get(0));
+ assertEquals(1, model.getCityFurniture().size());
+ }
+
+ @Test(expected = IllegalStateException.class)
+ public void testReplaceCityFurnitureMissing() {
+ File f = Mockito.mock(File.class);
+ ParserConfiguration config = new ParserConfiguration(8, false);
+ CityDoctorModel model = new CityDoctorModel(config, f);
+ CityFurniture cf1 = Mockito.mock(CityFurniture.class);
+ CityFurniture cf2 = Mockito.mock(CityFurniture.class);
+ model.replaceFeature(cf1, cf2);
+ }
+
+ @Test
+ public void testReplaceGenericCityObject() {
+ File f = Mockito.mock(File.class);
+ ParserConfiguration config = new ParserConfiguration(8, false);
+ CityDoctorModel model = new CityDoctorModel(config, f);
+ GenericCityObject gco1 = Mockito.mock(GenericCityObject.class);
+ GenericCityObject gco2 = Mockito.mock(GenericCityObject.class);
+ model.addGenericCityObject(gco1);
+ assertEquals(gco1, model.getGenericCityObjects().get(0));
+ model.replaceFeature(gco1, gco2);
+ assertEquals(gco2, model.getGenericCityObjects().get(0));
+ assertEquals(1, model.getGenericCityObjects().size());
+ }
+
+ @Test(expected = IllegalStateException.class)
+ public void testReplaceGenericCityObjectMissing() {
+ File f = Mockito.mock(File.class);
+ ParserConfiguration config = new ParserConfiguration(8, false);
+ CityDoctorModel model = new CityDoctorModel(config, f);
+ GenericCityObject gco1 = Mockito.mock(GenericCityObject.class);
+ GenericCityObject gco2 = Mockito.mock(GenericCityObject.class);
+ model.replaceFeature(gco1, gco2);
+ }
+
}
diff --git a/CityDoctorParent/CityDoctorModel/src/test/java/de/hft/stuttgart/citydoctor2/datastructure/CityFurnitureTest.java b/CityDoctorParent/CityDoctorModel/src/test/java/de/hft/stuttgart/citydoctor2/datastructure/CityFurnitureTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..3955f8015abc925665f78d58f9110793e4d1e470
--- /dev/null
+++ b/CityDoctorParent/CityDoctorModel/src/test/java/de/hft/stuttgart/citydoctor2/datastructure/CityFurnitureTest.java
@@ -0,0 +1,136 @@
+package de.hft.stuttgart.citydoctor2.datastructure;
+
+import de.hft.stuttgart.citydoctor2.check.CheckError;
+import de.hft.stuttgart.citydoctor2.check.CheckId;
+import de.hft.stuttgart.citydoctor2.check.CheckResult;
+import de.hft.stuttgart.citydoctor2.check.ResultStatus;
+import de.hft.stuttgart.citydoctor2.parser.ParserConfiguration;
+import org.citygml4j.core.util.geometry.GeometryFactory;
+import org.junit.Test;
+import org.xmlobjects.gml.model.geometry.aggregates.MultiSurfaceProperty;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import static org.junit.Assert.*;
+import static org.mockito.Mockito.mock;
+
+public class CityFurnitureTest {
+
+ @Test
+ public void testContainsError() {
+ CityFurniture cf = new CityFurniture();
+ assertFalse(cf.containsError(CheckId.C_GE_P_HOLE_OUTSIDE));
+ assertFalse(cf.containsError(CheckId.C_GE_P_NON_PLANAR));
+ cf.addCheckResult(new CheckResult(CheckId.C_GE_P_HOLE_OUTSIDE, ResultStatus.ERROR, mock(CheckError.class)));
+ assertTrue(cf.containsError(CheckId.C_GE_P_HOLE_OUTSIDE));
+ assertFalse(cf.containsError(CheckId.C_GE_P_NON_PLANAR));
+ cf.addCheckResult(new CheckResult(CheckId.C_GE_P_NON_PLANAR, ResultStatus.OK, mock(CheckError.class)));
+ assertTrue(cf.containsError(CheckId.C_GE_P_HOLE_OUTSIDE));
+ assertFalse(cf.containsError(CheckId.C_GE_P_NON_PLANAR));
+ }
+
+
+ @Test
+ public void testClearAllContainedCheckResults() {
+ CityFurniture cf = new CityFurniture();
+ cf.addCheckResult(new CheckResult(CheckId.C_GE_P_HOLE_OUTSIDE, ResultStatus.OK, null));
+
+ assertEquals(1, cf.getAllCheckResults().size());
+ cf.clearAllContainedCheckResults();
+ assertTrue(cf.getAllCheckResults().isEmpty());
+ }
+
+ @Test
+ public void testContainsAnyError() {
+ CityFurniture cf = new CityFurniture();
+ assertFalse(cf.containsAnyError());
+ cf.addCheckResult(new CheckResult(CheckId.C_GE_P_HOLE_OUTSIDE, ResultStatus.OK, null));
+ assertFalse(cf.containsAnyError());
+ cf.addCheckResult(
+ new CheckResult(CheckId.C_GE_P_INNER_RINGS_NESTED, ResultStatus.ERROR, mock(CheckError.class)));
+ assertTrue(cf.containsAnyError());
+ }
+
+ @Test
+ public void testCollectContainedErrors() {
+ CityFurniture cf = new CityFurniture();
+ cf.addCheckResult(new CheckResult(CheckId.C_GE_P_HOLE_OUTSIDE, ResultStatus.ERROR, mock(CheckError.class)));
+ List errors = new ArrayList<>();
+ cf.collectContainedErrors(errors);
+ assertEquals(1, errors.size());
+ }
+
+ @Test
+ public void unsetGmlGeometries() {
+ CityFurniture cf = new CityFurniture();
+ org.citygml4j.core.model.cityfurniture.CityFurniture cgmlCF = new org.citygml4j.core.model.cityfurniture.CityFurniture();
+ cf.setGmlObject(cgmlCF);
+
+ cgmlCF.setLod0MultiSurface(new MultiSurfaceProperty());
+ cgmlCF.setLod2MultiSurface(new MultiSurfaceProperty());
+ cgmlCF.setLod3MultiSurface(new MultiSurfaceProperty());
+ cgmlCF.setLod1Solid(null);
+ cgmlCF.setLod2Solid(null);
+ cgmlCF.setLod3Solid(null);
+ cgmlCF.getDeprecatedProperties().setLod1Geometry(null);
+ cgmlCF.getDeprecatedProperties().setLod2Geometry(null);
+ cgmlCF.getDeprecatedProperties().setLod3Geometry(null);
+ cgmlCF.getDeprecatedProperties().setLod4Geometry(null);
+
+ cf.clearGmlGeometries();
+
+ assertNull(cgmlCF.getLod0MultiSurface());
+ assertNull(cgmlCF.getLod2MultiSurface());
+ assertNull(cgmlCF.getLod3MultiSurface());
+ assertNull(cgmlCF.getLod1Solid());
+ assertNull(cgmlCF.getLod2Solid());
+ assertNull(cgmlCF.getLod3Solid());
+ assertNull(cgmlCF.getDeprecatedProperties().getLod1Geometry());
+ assertNull(cgmlCF.getDeprecatedProperties().getLod2Geometry());
+ assertNull(cgmlCF.getDeprecatedProperties().getLod3Geometry());
+ assertNull(cgmlCF.getDeprecatedProperties().getLod4Geometry());
+
+ }
+
+ @Test
+ public void testReCreateGeometriesSolid() {
+ CityFurniture cf = new CityFurniture();
+ org.citygml4j.core.model.cityfurniture.CityFurniture cgmlCF = new org.citygml4j.core.model.cityfurniture.CityFurniture();
+ cf.setGmlObject(cgmlCF);
+ cf.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.SOLID, Lod.LOD1));
+ cf.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.SOLID, Lod.LOD2));
+ cf.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.SOLID, Lod.LOD3));
+
+ GeometryFactory factory = GeometryFactory.newInstance();
+ ParserConfiguration config = new ParserConfiguration(8, false);
+ cf.reCreateGeometries(factory, config);
+ GeometryTestUtils.assertSolidMatchesExpectedValues(cgmlCF.getLod1Solid().getObject());
+ GeometryTestUtils.assertSolidMatchesExpectedValues(cgmlCF.getLod2Solid().getObject());
+ GeometryTestUtils.assertSolidMatchesExpectedValues(cgmlCF.getLod3Solid().getObject());
+ }
+
+
+ @Test
+ public void testReCreateGeometriesMultiSurface() {
+ CityFurniture cf = new CityFurniture();
+ org.citygml4j.core.model.cityfurniture.CityFurniture cgmlCF = new org.citygml4j.core.model.cityfurniture.CityFurniture();
+ cf.setGmlObject(cgmlCF);
+ cf.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.MULTI_SURFACE, Lod.LOD0));
+ cf.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.MULTI_SURFACE, Lod.LOD1));
+ cf.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.MULTI_SURFACE, Lod.LOD2));
+ cf.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.MULTI_SURFACE, Lod.LOD3));
+ cf.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.MULTI_SURFACE, Lod.LOD4));
+
+ GeometryFactory factory = GeometryFactory.newInstance();
+ ParserConfiguration config = new ParserConfiguration(8, false);
+ cf.reCreateGeometries(factory, config);
+
+ assertNotNull(cgmlCF.getLod0MultiSurface());
+ assertNotNull(cgmlCF.getLod0MultiSurface().getObject());
+ assertNotNull(cgmlCF.getLod2MultiSurface());
+ assertNotNull(cgmlCF.getLod2MultiSurface().getObject());
+ assertNotNull(cgmlCF.getLod3MultiSurface());
+ assertNotNull(cgmlCF.getLod3MultiSurface().getObject());
+ }
+}
\ No newline at end of file
diff --git a/CityDoctorParent/CityDoctorModel/src/test/java/de/hft/stuttgart/citydoctor2/datastructure/CityObjectTest.java b/CityDoctorParent/CityDoctorModel/src/test/java/de/hft/stuttgart/citydoctor2/datastructure/CityObjectTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..e0d7dae4b27ef39ea6a8ff9dc327e6aa3df9e1b8
--- /dev/null
+++ b/CityDoctorParent/CityDoctorModel/src/test/java/de/hft/stuttgart/citydoctor2/datastructure/CityObjectTest.java
@@ -0,0 +1,174 @@
+package de.hft.stuttgart.citydoctor2.datastructure;
+
+import de.hft.stuttgart.citydoctor2.check.AbstractCheck;
+import de.hft.stuttgart.citydoctor2.check.CheckError;
+import de.hft.stuttgart.citydoctor2.check.CheckId;
+import de.hft.stuttgart.citydoctor2.check.CheckResult;
+import de.hft.stuttgart.citydoctor2.check.ResultStatus;
+import de.hft.stuttgart.citydoctor2.parser.ParserConfiguration;
+import de.hft.stuttgart.citydoctor2.utils.visitors.GmlGeometryRebuilder;
+import de.hft.stuttgart.citydoctor2.utils.visitors.UnsetGeometriesVisitor;
+import org.citygml4j.core.model.core.AbstractCityObject;
+import org.citygml4j.core.util.geometry.GeometryFactory;
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.Mockito;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import static org.junit.Assert.*;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+
+public class CityObjectTest {
+
+ CityObject co;
+
+ @Test
+ public void testVisitorPropagation() {
+ Geometry mockGeometry = mock(Geometry.class);
+ co.addGeometry(mockGeometry);
+
+ AbstractCheck check = new AbstractCheck() {
+ };
+
+ co.accept(check);
+
+ verify(mockGeometry).accept(check);
+ }
+
+ @Test
+ public void testContainsError() {
+ assertFalse(co.containsError(CheckId.C_GE_P_HOLE_OUTSIDE));
+ assertFalse(co.containsError(CheckId.C_GE_P_NON_PLANAR));
+ co.addCheckResult(new CheckResult(CheckId.C_GE_P_HOLE_OUTSIDE, ResultStatus.ERROR, mock(CheckError.class)));
+ assertTrue(co.containsError(CheckId.C_GE_P_HOLE_OUTSIDE));
+ assertFalse(co.containsError(CheckId.C_GE_P_NON_PLANAR));
+ co.addCheckResult(new CheckResult(CheckId.C_GE_P_NON_PLANAR, ResultStatus.OK, mock(CheckError.class)));
+ assertTrue(co.containsError(CheckId.C_GE_P_HOLE_OUTSIDE));
+ assertFalse(co.containsError(CheckId.C_GE_P_NON_PLANAR));
+ }
+
+
+ @Test
+ public void testClearAllContainedCheckResults() {
+ co.addCheckResult(new CheckResult(CheckId.C_GE_P_HOLE_OUTSIDE, ResultStatus.OK, null));
+
+ assertEquals(1, co.getAllCheckResults().size());
+ co.clearAllContainedCheckResults();
+ assertTrue(co.getAllCheckResults().isEmpty());
+ }
+
+ @Test
+ public void testContainsAnyError() {
+ assertFalse(co.containsAnyError());
+ co.addCheckResult(new CheckResult(CheckId.C_GE_P_HOLE_OUTSIDE, ResultStatus.OK, null));
+ assertFalse(co.containsAnyError());
+ co.addCheckResult(
+ new CheckResult(CheckId.C_GE_P_INNER_RINGS_NESTED, ResultStatus.ERROR, mock(CheckError.class)));
+ assertTrue(co.containsAnyError());
+ }
+
+ @Test
+ public void testCollectContainedErrors() {
+ co.addCheckResult(new CheckResult(CheckId.C_GE_P_HOLE_OUTSIDE, ResultStatus.ERROR, mock(CheckError.class)));
+ List errors = new ArrayList<>();
+ co.collectContainedErrors(errors);
+ assertEquals(1, errors.size());
+ }
+
+
+ @Test
+ public void testClearGmlGeometries() {
+ CityObject spyCo = Mockito.spy(co);
+ spyCo.clearGmlGeometries();
+
+ verify(spyCo).accept(any(UnsetGeometriesVisitor.class));
+ verify(spyCo).unsetGmlGeometries();
+ }
+
+
+ @Test
+ public void testReCreateGmlGeometries() {
+ CityObject spyCo = Mockito.spy(co);
+ spyCo.reCreateGeometries(mock(GeometryFactory.class), mock(ParserConfiguration.class));
+
+ verify(spyCo).accept(any(GmlGeometryRebuilder.class));
+ verify(spyCo).rebuildGeometries(any(GeometryFactory.class), any(ParserConfiguration.class));
+ }
+
+ @Test
+ public void testGetHighestLodGeometry() {
+ Geometry geometryLod1 = new Geometry(GeometryType.SOLID, Lod.LOD1);
+ Geometry geometryLod2 = new Geometry(GeometryType.SOLID, Lod.LOD2);
+ Geometry geometryLod3 = new Geometry(GeometryType.SOLID, Lod.LOD3);
+ Geometry geometryLod4 = new Geometry(GeometryType.SOLID, Lod.LOD4);
+
+ assertNull(co.getHighestLodGeometry());
+ co.addGeometry(geometryLod1);
+ assertEquals(geometryLod1, co.getHighestLodGeometry());
+ co.addGeometry(geometryLod2);
+ assertEquals(geometryLod2, co.getHighestLodGeometry());
+ co.addGeometry(geometryLod3);
+ assertEquals(geometryLod3, co.getHighestLodGeometry());
+ co.addGeometry(geometryLod4);
+ assertEquals(geometryLod4, co.getHighestLodGeometry());
+
+ setUp();
+
+ assertNull(co.getHighestLodGeometry());
+ co.addGeometry(geometryLod2);
+ assertEquals(geometryLod2, co.getHighestLodGeometry());
+ co.addGeometry(geometryLod1);
+ assertEquals(geometryLod2, co.getHighestLodGeometry());
+ co.addGeometry(geometryLod3);
+ assertEquals(geometryLod3, co.getHighestLodGeometry());
+ co.addGeometry(geometryLod4);
+ assertEquals(geometryLod4, co.getHighestLodGeometry());
+
+ setUp();
+
+ assertNull(co.getHighestLodGeometry());
+ co.addGeometry(geometryLod4);
+ assertEquals(geometryLod4, co.getHighestLodGeometry());
+ co.addGeometry(geometryLod1);
+ assertEquals(geometryLod4, co.getHighestLodGeometry());
+ co.addGeometry(geometryLod2);
+ assertEquals(geometryLod4, co.getHighestLodGeometry());
+ co.addGeometry(geometryLod3);
+ assertEquals(geometryLod4, co.getHighestLodGeometry());
+ }
+
+ @Before
+ public void setUp() {
+ co = new CityObject() {
+ @Override
+ public void rebuildGeometries(GeometryFactory factory, ParserConfiguration config) {
+ // Stub for testing
+ }
+
+ @Override
+ public AbstractCityObject getGmlObject() {
+ return null;
+ }
+
+ @Override
+ public void unsetGmlGeometries() {
+ // Stub for testing
+ }
+
+ @Override
+ public CityObject getTopLevelCityObject() {
+ return null;
+ }
+
+ @Override
+ public FeatureType getFeatureType() {
+ return null;
+ }
+
+ };
+ }
+}
\ No newline at end of file
diff --git a/CityDoctorParent/CityDoctorModel/src/test/java/de/hft/stuttgart/citydoctor2/datastructure/GenericCityObjectTest.java b/CityDoctorParent/CityDoctorModel/src/test/java/de/hft/stuttgart/citydoctor2/datastructure/GenericCityObjectTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..00aab2b1d32e8c11ddc9d531a26d153c5865b373
--- /dev/null
+++ b/CityDoctorParent/CityDoctorModel/src/test/java/de/hft/stuttgart/citydoctor2/datastructure/GenericCityObjectTest.java
@@ -0,0 +1,158 @@
+package de.hft.stuttgart.citydoctor2.datastructure;
+
+import de.hft.stuttgart.citydoctor2.check.AbstractCheck;
+import de.hft.stuttgart.citydoctor2.check.CheckError;
+import de.hft.stuttgart.citydoctor2.check.CheckId;
+import de.hft.stuttgart.citydoctor2.check.CheckResult;
+import de.hft.stuttgart.citydoctor2.check.ResultStatus;
+import de.hft.stuttgart.citydoctor2.parser.ParserConfiguration;
+import org.citygml4j.core.model.generics.GenericOccupiedSpace;
+import org.citygml4j.core.util.geometry.GeometryFactory;
+import org.junit.Test;
+import org.xmlobjects.gml.model.geometry.aggregates.MultiSurfaceProperty;
+import org.xmlobjects.gml.model.geometry.primitives.SolidProperty;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import static org.junit.Assert.*;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+
+public class GenericCityObjectTest {
+
+ @Test
+ public void testVisitorPropagation() {
+ GenericCityObject gco = new GenericCityObject();
+ BoundarySurface mockSurface = mock(BoundarySurface.class);
+ Geometry mockGeometry = mock(Geometry.class);
+
+ gco.addBoundarySurface(mockSurface);
+ gco.addGeometry(mockGeometry);
+
+ AbstractCheck c = new AbstractCheck() {
+ };
+ gco.accept(c);
+
+ verify(mockSurface).accept(c);
+ verify(mockGeometry).accept(c);
+
+ }
+
+ @Test
+ public void testContainsError() {
+ GenericCityObject gco = new GenericCityObject();
+ assertFalse(gco.containsError(CheckId.C_GE_P_HOLE_OUTSIDE));
+ assertFalse(gco.containsError(CheckId.C_GE_P_NON_PLANAR));
+ gco.addCheckResult(new CheckResult(CheckId.C_GE_P_HOLE_OUTSIDE, ResultStatus.ERROR, mock(CheckError.class)));
+ assertTrue(gco.containsError(CheckId.C_GE_P_HOLE_OUTSIDE));
+ assertFalse(gco.containsError(CheckId.C_GE_P_NON_PLANAR));
+ gco.addCheckResult(new CheckResult(CheckId.C_GE_P_NON_PLANAR, ResultStatus.OK, mock(CheckError.class)));
+ assertTrue(gco.containsError(CheckId.C_GE_P_HOLE_OUTSIDE));
+ assertFalse(gco.containsError(CheckId.C_GE_P_NON_PLANAR));
+ }
+
+
+ @Test
+ public void testClearAllContainedCheckResults() {
+ GenericCityObject gco = new GenericCityObject();
+ gco.addCheckResult(new CheckResult(CheckId.C_GE_P_HOLE_OUTSIDE, ResultStatus.OK, null));
+
+ assertEquals(1, gco.getAllCheckResults().size());
+ gco.clearAllContainedCheckResults();
+ assertTrue(gco.getAllCheckResults().isEmpty());
+ }
+
+ @Test
+ public void testContainsAnyError() {
+ GenericCityObject gco = new GenericCityObject();
+ assertFalse(gco.containsAnyError());
+ gco.addCheckResult(new CheckResult(CheckId.C_GE_P_HOLE_OUTSIDE, ResultStatus.OK, null));
+ assertFalse(gco.containsAnyError());
+ gco.addCheckResult(
+ new CheckResult(CheckId.C_GE_P_INNER_RINGS_NESTED, ResultStatus.ERROR, mock(CheckError.class)));
+ assertTrue(gco.containsAnyError());
+ }
+
+ @Test
+ public void testCollectContainedErrors() {
+ GenericCityObject gco = new GenericCityObject();
+ gco.addCheckResult(new CheckResult(CheckId.C_GE_P_HOLE_OUTSIDE, ResultStatus.ERROR, mock(CheckError.class)));
+ List errors = new ArrayList<>();
+ gco.collectContainedErrors(errors);
+ assertEquals(1, errors.size());
+ }
+
+ @Test
+ public void testUnsetGmlGeometries() {
+ GenericCityObject gco = new GenericCityObject();
+ GenericOccupiedSpace gmlGos = new GenericOccupiedSpace();
+ gco.setGmlObject(gmlGos);
+
+ gmlGos.setLod0MultiSurface(new MultiSurfaceProperty());
+ gmlGos.setLod2MultiSurface(new MultiSurfaceProperty());
+ gmlGos.setLod3MultiSurface(new MultiSurfaceProperty());
+ gmlGos.setLod1Solid(new SolidProperty());
+ gmlGos.setLod2Solid(new SolidProperty());
+ gmlGos.setLod3Solid(new SolidProperty());
+ gmlGos.getDeprecatedProperties().setLod1Geometry(new MultiSurfaceProperty());
+ gmlGos.getDeprecatedProperties().setLod2Geometry(new MultiSurfaceProperty());
+ gmlGos.getDeprecatedProperties().setLod3Geometry(new MultiSurfaceProperty());
+ gmlGos.getDeprecatedProperties().setLod4Geometry(new MultiSurfaceProperty());
+
+ gco.unsetGmlGeometries();
+
+ assertNull(gmlGos.getLod0MultiSurface());
+ assertNull(gmlGos.getLod2MultiSurface());
+ assertNull(gmlGos.getLod3MultiSurface());
+ assertNull(gmlGos.getLod1Solid());
+ assertNull(gmlGos.getLod2Solid());
+ assertNull(gmlGos.getLod3Solid());
+ assertNull(gmlGos.getDeprecatedProperties().getLod1Geometry());
+ assertNull(gmlGos.getDeprecatedProperties().getLod2Geometry());
+ assertNull(gmlGos.getDeprecatedProperties().getLod3Geometry());
+ assertNull(gmlGos.getDeprecatedProperties().getLod4Geometry());
+ }
+
+ @Test
+ public void testReCreateGeometriesSolid() {
+ GenericCityObject gco = new GenericCityObject();
+ GenericOccupiedSpace gmlGos = new GenericOccupiedSpace();
+ gco.setGmlObject(gmlGos);
+ gco.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.SOLID, Lod.LOD1));
+ gco.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.SOLID, Lod.LOD2));
+ gco.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.SOLID, Lod.LOD3));
+ gco.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.SOLID, Lod.LOD4));
+
+ GeometryFactory factory = GeometryFactory.newInstance();
+ ParserConfiguration config = new ParserConfiguration(8, false);
+ gco.reCreateGeometries(factory, config);
+ GeometryTestUtils.assertSolidMatchesExpectedValues(gmlGos.getLod1Solid().getObject());
+ GeometryTestUtils.assertSolidMatchesExpectedValues(gmlGos.getLod2Solid().getObject());
+ GeometryTestUtils.assertSolidMatchesExpectedValues(gmlGos.getLod3Solid().getObject());
+ }
+
+ @Test
+ public void testReCreateGeometriesMultiSurface() {
+ GenericCityObject gco = new GenericCityObject();
+ GenericOccupiedSpace gmlGos = new GenericOccupiedSpace();
+ gco.setGmlObject(gmlGos);
+ gco.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.MULTI_SURFACE, Lod.LOD0));
+ gco.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.MULTI_SURFACE, Lod.LOD1));
+ gco.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.MULTI_SURFACE, Lod.LOD2));
+ gco.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.MULTI_SURFACE, Lod.LOD3));
+ gco.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.MULTI_SURFACE, Lod.LOD4));
+
+ GeometryFactory factory = GeometryFactory.newInstance();
+ ParserConfiguration config = new ParserConfiguration(8, false);
+ gco.reCreateGeometries(factory, config);
+
+ assertNotNull(gmlGos.getLod0MultiSurface());
+ assertNotNull(gmlGos.getLod0MultiSurface().getObject());
+ assertNotNull(gmlGos.getLod2MultiSurface());
+ assertNotNull(gmlGos.getLod2MultiSurface().getObject());
+ assertNotNull(gmlGos.getLod3MultiSurface());
+ assertNotNull(gmlGos.getLod3MultiSurface().getObject());
+ }
+
+}
\ No newline at end of file
diff --git a/CityDoctorParent/CityDoctorModel/src/test/java/de/hft/stuttgart/citydoctor2/datastructure/GeometryTest.java b/CityDoctorParent/CityDoctorModel/src/test/java/de/hft/stuttgart/citydoctor2/datastructure/GeometryTest.java
index 6dc06fde1dc7d603ddc635bf8dae0929e322e1bb..dde2b7df269065fe4b061a234367965cca175434 100644
--- a/CityDoctorParent/CityDoctorModel/src/test/java/de/hft/stuttgart/citydoctor2/datastructure/GeometryTest.java
+++ b/CityDoctorParent/CityDoctorModel/src/test/java/de/hft/stuttgart/citydoctor2/datastructure/GeometryTest.java
@@ -24,6 +24,7 @@ import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertSame;
import static org.junit.Assert.assertTrue;
+import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@@ -31,6 +32,8 @@ import static org.mockito.Mockito.when;
import java.util.ArrayList;
import java.util.List;
+import de.hft.stuttgart.citydoctor2.check.AbstractCheck;
+import de.hft.stuttgart.citydoctor2.utils.visitors.ClearCheckResultsVisitor;
import org.citygml4j.core.model.construction.AbstractConstructionSurface;
import org.citygml4j.core.model.construction.WallSurface;
import org.citygml4j.core.util.geometry.GeometryFactory;
@@ -44,6 +47,7 @@ import de.hft.stuttgart.citydoctor2.check.ResultStatus;
import de.hft.stuttgart.citydoctor2.datastructure.LinearRing.LinearRingType;
import de.hft.stuttgart.citydoctor2.math.Vector3d;
import de.hft.stuttgart.citydoctor2.parser.ParserConfiguration;
+import org.mockito.Mockito;
/**
*
@@ -52,6 +56,20 @@ import de.hft.stuttgart.citydoctor2.parser.ParserConfiguration;
*/
public class GeometryTest {
+ @Test
+ public void testVisitorPropagation() {
+ Geometry geom = new Geometry(GeometryType.SOLID, Lod.LOD0);
+ ConcretePolygon mockPolygon = mock(ConcretePolygon.class);
+
+ geom.addPolygon(mockPolygon);
+
+ AbstractCheck c = new AbstractCheck() {
+ };
+ geom.accept(c);
+
+ verify(mockPolygon).accept(c);
+ }
+
@Test
public void testCreate() {
Geometry geom = new Geometry(GeometryType.SOLID, Lod.LOD0);
@@ -282,7 +300,7 @@ public class GeometryTest {
Polygon p = mock(Polygon.class);
geom.addPolygon(p);
geom.clearAllContainedCheckResults();
- verify(p).clearAllContainedCheckResults();
+ verify(p).accept(any(ClearCheckResultsVisitor.class));
assertFalse(geom.containsError(CheckId.C_GE_P_HOLE_OUTSIDE));
}
@@ -292,11 +310,15 @@ public class GeometryTest {
assertFalse(geom.containsError(CheckId.C_GE_P_HOLE_OUTSIDE));
geom.addCheckResult(new CheckResult(CheckId.C_GE_P_HOLE_OUTSIDE, ResultStatus.ERROR, mock(CheckError.class)));
assertTrue(geom.containsError(CheckId.C_GE_P_HOLE_OUTSIDE));
- Polygon p = mock(Polygon.class);
- geom.addPolygon(p);
+
+ Polygon p = new ConcretePolygon();
+ p.setExteriorRing(mock(LinearRing.class));
+ Polygon spyPoly = Mockito.spy(p);
+ geom.addPolygon(spyPoly);
+
List errors = new ArrayList<>();
geom.collectContainedErrors(errors);
- verify(p).collectContainedErrors(errors);
+ verify(spyPoly).collectErrors(errors);
assertEquals(1, errors.size());
}
@@ -306,12 +328,16 @@ public class GeometryTest {
assertFalse(geom.containsAnyError());
geom.addCheckResult(new CheckResult(CheckId.C_GE_P_HOLE_OUTSIDE, ResultStatus.ERROR, mock(CheckError.class)));
assertTrue(geom.containsAnyError());
- Polygon p = mock(Polygon.class);
- geom.addPolygon(p);
+
+ Polygon p = new ConcretePolygon();
+ p.setExteriorRing(mock(LinearRing.class));
+ Polygon spyPoly = Mockito.spy(p);
+ geom.addPolygon(spyPoly);
+
geom.clearAllContainedCheckResults();
assertFalse(geom.containsAnyError());
- verify(p).containsAnyError();
- when(p.containsAnyError()).thenReturn(true);
+ verify(spyPoly).hasAnyError();
+ spyPoly.addCheckResult((new CheckResult(CheckId.C_GE_R_NOT_CLOSED, ResultStatus.ERROR, mock(CheckError.class))));
assertTrue(geom.containsAnyError());
}
diff --git a/CityDoctorParent/CityDoctorModel/src/test/java/de/hft/stuttgart/citydoctor2/datastructure/GeometryTestUtils.java b/CityDoctorParent/CityDoctorModel/src/test/java/de/hft/stuttgart/citydoctor2/datastructure/GeometryTestUtils.java
index 15640163079f3711a4b5a60b56bdc1154dfe5d1e..95a0fe0f7b6ab5ed000b8abb0a24414e7be0d742 100644
--- a/CityDoctorParent/CityDoctorModel/src/test/java/de/hft/stuttgart/citydoctor2/datastructure/GeometryTestUtils.java
+++ b/CityDoctorParent/CityDoctorModel/src/test/java/de/hft/stuttgart/citydoctor2/datastructure/GeometryTestUtils.java
@@ -19,11 +19,29 @@
package de.hft.stuttgart.citydoctor2.datastructure;
import de.hft.stuttgart.citydoctor2.datastructure.LinearRing.LinearRingType;
+import org.xmlobjects.gml.model.geometry.primitives.AbstractRing;
+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.Solid;
+import org.xmlobjects.gml.model.geometry.primitives.SurfaceProperty;
+
+import java.util.List;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
public class GeometryTestUtils {
-
+
+ private static final double[] expectedValues = new double[]{427583.301, 6003502.571, 9.711, 427583.304, 6003502.574, 9.713,
+ 427583.304, 6003502.574, 4.097, 427583.301, 6003502.571, 4.097, 427583.301, 6003502.571, 9.711};
+
private GeometryTestUtils() {
}
+
+ public static double[] getExpectedValues() {
+ return expectedValues;
+ }
public static Geometry createDummyGeometry(GeometryType type) {
return createDummyGeometry(type, Lod.LOD2);
@@ -90,4 +108,22 @@ public class GeometryTestUtils {
return geom;
}
+ public static void assertSolidMatchesExpectedValues(AbstractSolid aSolid) {
+ assertTrue(aSolid instanceof Solid);
+ Solid solid = (Solid) aSolid;
+ Shell geometry = solid.getExterior().getObject();
+ List surfaceMember = geometry.getSurfaceMembers();
+ assertEquals(1, surfaceMember.size());
+ AbstractSurface polySurface = surfaceMember.get(0).getObject();
+ assertTrue(polySurface instanceof org.xmlobjects.gml.model.geometry.primitives.Polygon);
+ var gmlPoly = (org.xmlobjects.gml.model.geometry.primitives.Polygon) polySurface;
+ AbstractRing ring = gmlPoly.getExterior().getObject();
+ var gmlRing = (org.xmlobjects.gml.model.geometry.primitives.LinearRing) ring;
+ List posList = gmlRing.toCoordinateList3D();
+ double[] expectedValues = getExpectedValues();
+ for (int i = 0; i < posList.size(); i++) {
+ assertEquals(expectedValues[i], posList.get(i), 0.00000001);
+ }
+ }
+
}
diff --git a/CityDoctorParent/CityDoctorModel/src/test/java/de/hft/stuttgart/citydoctor2/datastructure/ImplicitGeometryTest.java b/CityDoctorParent/CityDoctorModel/src/test/java/de/hft/stuttgart/citydoctor2/datastructure/ImplicitGeometryTest.java
index 20af439bcbabc72cc99a204906ad244124a46304..6050b20f2eeefa625c188222c8e8e05c003e7b97 100644
--- a/CityDoctorParent/CityDoctorModel/src/test/java/de/hft/stuttgart/citydoctor2/datastructure/ImplicitGeometryTest.java
+++ b/CityDoctorParent/CityDoctorModel/src/test/java/de/hft/stuttgart/citydoctor2/datastructure/ImplicitGeometryTest.java
@@ -1,7 +1,12 @@
package de.hft.stuttgart.citydoctor2.datastructure;
import de.hft.stuttgart.citydoctor2.check.AbstractCheck;
+import de.hft.stuttgart.citydoctor2.check.CheckError;
+import de.hft.stuttgart.citydoctor2.check.CheckId;
+import de.hft.stuttgart.citydoctor2.check.CheckResult;
+import de.hft.stuttgart.citydoctor2.check.ResultStatus;
import de.hft.stuttgart.citydoctor2.parser.ParserConfiguration;
+import de.hft.stuttgart.citydoctor2.utils.Copy;
import org.citygml4j.core.model.core.ImplicitGeometry;
import org.citygml4j.core.model.core.TransformationMatrix4x4;
import org.junit.Before;
@@ -13,20 +18,25 @@ import org.xmlobjects.gml.util.jama.Matrix;
import java.nio.file.Path;
import java.nio.file.Paths;
+import java.util.ArrayList;
+import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;
import static org.junit.Assert.*;
+import static org.mockito.Mockito.mock;
public class ImplicitGeometryTest {
- private Path path;
+
private ParserConfiguration config;
private String pathString = "src/test/resources/ImplicitTestGeom.gml";
+ private Path path = Paths.get(pathString);
private TransformationMatrix4x4 origin;
+ private LibraryObject lib;
+ private ImplicitGeometryHolder igh;
@Before
public void setUp() {
- path = Paths.get(pathString);
config = new ParserConfiguration(8, false);
Matrix og = new Matrix(4, 4);
og.set(0, 0, 1);
@@ -34,6 +44,17 @@ public class ImplicitGeometryTest {
og.set(2, 2, 1);
origin = new TransformationMatrix4x4(og);
+ lib = LibraryObject.of(path, config);
+ assertNotNull(lib);
+
+ // Create copy for cleanup
+ lib = Copy.copy(lib);
+
+ ImplicitGeometry geom = new ImplicitGeometry();
+ geom.setTransformationMatrix(origin);
+ geom.setReferencePoint(new PointProperty(new Point(new DirectPosition(0, 0))));
+ igh = new ImplicitGeometryHolder(geom, lib);
+ assertNotNull(igh);
}
@Test
@@ -41,43 +62,91 @@ public class ImplicitGeometryTest {
LibraryObject lo = LibraryObject.of(path, config);
assertNotNull(lo);
LibraryObject lo2 = LibraryObject.of(path, config);
+ assertNotNull(lo2);
assertSame(lo, lo2);
}
@Test
public void testObjectTransform() {
- LibraryObject lo = LibraryObject.of(path, config);
- assertNotNull(lo);
ImplicitGeometry geom = new ImplicitGeometry();
-
geom.setTransformationMatrix(origin);
geom.setReferencePoint(new PointProperty(new Point(new DirectPosition(0, 0))));
- ImplicitGeometryHolder igh = new ImplicitGeometryHolder(geom, lo);
- assertNotNull(igh);
+ ImplicitGeometryHolder transform1 = new ImplicitGeometryHolder(geom, lib);
+ assertNotNull(transform1);
geom.setReferencePoint(new PointProperty(new Point(new DirectPosition(5, 8))));
- ImplicitGeometryHolder igh2 = new ImplicitGeometryHolder(geom, lo);
- assertNotNull(igh2);
- assertNotEquals(igh, igh2);
- BoundingBox bb1 = BoundingBox.of(igh.getPolygons());
- BoundingBox bb2 = BoundingBox.of(igh2.getPolygons());
+ ImplicitGeometryHolder transform2 = new ImplicitGeometryHolder(geom, lib);
+ assertNotNull(transform2);
+ assertNotEquals(transform1, transform2);
+ BoundingBox bb1 = BoundingBox.of(transform1.getPolygons());
+ BoundingBox bb2 = BoundingBox.of(transform2.getPolygons());
assertNotEquals(bb1, bb2);
+ }
+
+ @Test
+ public void testContainsError() {
+ assertFalse(lib.containsError(CheckId.C_GE_P_HOLE_OUTSIDE));
+ assertFalse(lib.containsError(CheckId.C_GE_P_NON_PLANAR));
+
+ igh.addCheckResult(new CheckResult(CheckId.C_GE_P_HOLE_OUTSIDE, ResultStatus.ERROR, mock(CheckError.class)));
+ assertFalse("ImplicitGeometryHolder's errors should be ignored and delegate the call to the prototype geometry",
+ lib.containsError(CheckId.C_GE_P_HOLE_OUTSIDE));
+
+ lib.addCheckResult(new CheckResult(CheckId.C_GE_P_HOLE_OUTSIDE, ResultStatus.ERROR, mock(CheckError.class)));
+ assertTrue(lib.containsError(CheckId.C_GE_P_HOLE_OUTSIDE));
+ assertFalse(lib.containsError(CheckId.C_GE_P_NON_PLANAR));
+ lib.addCheckResult(new CheckResult(CheckId.C_GE_P_NON_PLANAR, ResultStatus.OK, null));
+ assertTrue(lib.containsError(CheckId.C_GE_P_HOLE_OUTSIDE));
+ assertFalse(lib.containsError(CheckId.C_GE_P_NON_PLANAR));
}
+
@Test
- public void testAccept() {
- LibraryObject lib = LibraryObject.of(path, config);
- assertNotNull(lib);
+ public void testClearAllContainedCheckResults() {
+ lib.addCheckResult(new CheckResult(CheckId.C_GE_P_HOLE_OUTSIDE, ResultStatus.OK, null));
- ImplicitGeometry geom = new ImplicitGeometry();
- geom.setTransformationMatrix(origin);
- geom.setReferencePoint(new PointProperty(new Point(new DirectPosition(0, 0))));
+ assertEquals(1, lib.getAllCheckResults().size());
+ lib.clearAllContainedCheckResults();
+ assertTrue(lib.getAllCheckResults().isEmpty());
+ }
- int polyCount = lib.getPolygons().size();
+ @Test
+ public void testContainsAnyError() {
+ assertFalse(lib.containsAnyError());
+ igh.addCheckResult(new CheckResult(CheckId.C_GE_P_HOLE_OUTSIDE, ResultStatus.OK, null));
+ assertFalse(lib.containsAnyError());
+ lib.addCheckResult(new CheckResult(CheckId.C_GE_P_HOLE_OUTSIDE, ResultStatus.OK, null));
+ assertFalse(lib.containsAnyError());
+
+ igh.addCheckResult(
+ new CheckResult(CheckId.C_GE_P_INNER_RINGS_NESTED, ResultStatus.ERROR, mock(CheckError.class)));
+ assertFalse(lib.containsAnyError());
+ lib.addCheckResult(
+ new CheckResult(CheckId.C_GE_P_INNER_RINGS_NESTED, ResultStatus.ERROR, mock(CheckError.class)));
+ assertTrue(lib.containsAnyError());
+ }
+
+ @Test
+ public void testCollectContainedErrors() {
+ List errors = new ArrayList<>();
+
+ igh.addCheckResult(new CheckResult(CheckId.C_GE_P_NON_PLANAR, ResultStatus.ERROR, mock(CheckError.class)));
+ igh.collectContainedErrors(errors);
+ assertEquals("ImplicitGeometryHolder's errors should be ignored and delegate the call to the prototype geometry",
+ 0, errors.size());
+
+ lib.addCheckResult(new CheckResult(CheckId.C_GE_P_HOLE_OUTSIDE, ResultStatus.ERROR, mock(CheckError.class)));
+ igh.collectContainedErrors(errors);
+ assertEquals("ImplicitGeometryHolder's errors should be ignored and delegate the call to the prototype geometry",
+ 1, errors.size());
+ }
- ImplicitGeometryHolder igh = new ImplicitGeometryHolder(geom, lib);
+
+ @Test
+ public void testAccept() {
+ int polyCount = lib.getPolygons().size();
AtomicInteger loCounter = new AtomicInteger(0);
diff --git a/CityDoctorParent/CityDoctorModel/src/test/java/de/hft/stuttgart/citydoctor2/datastructure/LandUseTest.java b/CityDoctorParent/CityDoctorModel/src/test/java/de/hft/stuttgart/citydoctor2/datastructure/LandUseTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..b108b0a5b93b4e2985440f3826d99eccfaa9347c
--- /dev/null
+++ b/CityDoctorParent/CityDoctorModel/src/test/java/de/hft/stuttgart/citydoctor2/datastructure/LandUseTest.java
@@ -0,0 +1,113 @@
+package de.hft.stuttgart.citydoctor2.datastructure;
+
+import de.hft.stuttgart.citydoctor2.check.CheckError;
+import de.hft.stuttgart.citydoctor2.check.CheckId;
+import de.hft.stuttgart.citydoctor2.check.CheckResult;
+import de.hft.stuttgart.citydoctor2.check.ResultStatus;
+import de.hft.stuttgart.citydoctor2.parser.ParserConfiguration;
+import org.citygml4j.core.model.landuse.LandUse;
+import org.citygml4j.core.util.geometry.GeometryFactory;
+import org.junit.Before;
+import org.junit.Test;
+import org.xmlobjects.gml.model.geometry.aggregates.MultiSurfaceProperty;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import static org.junit.Assert.*;
+import static org.mockito.Mockito.mock;
+
+public class LandUseTest {
+
+ private LandUse lu;
+ private LandObject land;
+
+ @Before
+ public void setUp() {
+ lu = new LandUse();
+ land = new LandObject(lu);
+ }
+
+ @Test
+ public void testContainsError() {
+ assertFalse(land.containsError(CheckId.C_GE_P_HOLE_OUTSIDE));
+ assertFalse(land.containsError(CheckId.C_GE_P_NON_PLANAR));
+ land.addCheckResult(new CheckResult(CheckId.C_GE_P_HOLE_OUTSIDE, ResultStatus.ERROR, mock(CheckError.class)));
+ assertTrue(land.containsError(CheckId.C_GE_P_HOLE_OUTSIDE));
+ assertFalse(land.containsError(CheckId.C_GE_P_NON_PLANAR));
+ land.addCheckResult(new CheckResult(CheckId.C_GE_P_NON_PLANAR, ResultStatus.OK, mock(CheckError.class)));
+ assertTrue(land.containsError(CheckId.C_GE_P_HOLE_OUTSIDE));
+ assertFalse(land.containsError(CheckId.C_GE_P_NON_PLANAR));
+ }
+
+
+ @Test
+ public void testClearAllContainedCheckResults() {
+ land.addCheckResult(new CheckResult(CheckId.C_GE_P_HOLE_OUTSIDE, ResultStatus.OK, null));
+
+ assertEquals(1, land.getAllCheckResults().size());
+ land.clearAllContainedCheckResults();
+ assertTrue(land.getAllCheckResults().isEmpty());
+ }
+
+ @Test
+ public void testContainsAnyError() {
+ assertFalse(land.containsAnyError());
+ land.addCheckResult(new CheckResult(CheckId.C_GE_P_HOLE_OUTSIDE, ResultStatus.OK, null));
+ assertFalse(land.containsAnyError());
+ land.addCheckResult(
+ new CheckResult(CheckId.C_GE_P_INNER_RINGS_NESTED, ResultStatus.ERROR, mock(CheckError.class)));
+ assertTrue(land.containsAnyError());
+ }
+
+ @Test
+ public void testCollectContainedErrors() {
+ land.addCheckResult(new CheckResult(CheckId.C_GE_P_HOLE_OUTSIDE, ResultStatus.ERROR, mock(CheckError.class)));
+ List errors = new ArrayList<>();
+ land.collectContainedErrors(errors);
+ assertEquals(1, errors.size());
+ }
+
+ @Test
+ public void testUnsetGeometries() {
+ lu.setLod0MultiSurface(new MultiSurfaceProperty());
+ lu.setLod1MultiSurface(new MultiSurfaceProperty());
+ lu.setLod2MultiSurface(new MultiSurfaceProperty());
+ lu.setLod3MultiSurface(new MultiSurfaceProperty());
+ lu.getDeprecatedProperties().setLod4MultiSurface(new MultiSurfaceProperty());
+
+ land.clearGmlGeometries();
+
+ assertNull(lu.getLod0MultiSurface());
+ assertNull(lu.getLod1MultiSurface());
+ assertNull(lu.getLod2MultiSurface());
+ assertNull(lu.getLod3MultiSurface());
+ assertNull(lu.getDeprecatedProperties().getLod4MultiSurface());
+ }
+
+ @Test
+ public void testReCreateGeometries() {
+ land.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.MULTI_SURFACE, Lod.LOD0));
+ land.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.MULTI_SURFACE, Lod.LOD1));
+ land.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.MULTI_SURFACE, Lod.LOD2));
+ land.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.MULTI_SURFACE, Lod.LOD3));
+ land.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.MULTI_SURFACE, Lod.LOD4));
+
+ GeometryFactory factory = GeometryFactory.newInstance();
+ ParserConfiguration config = new ParserConfiguration(8, false);
+ land.reCreateGeometries(factory, config);
+
+ assertNotNull(lu.getLod0MultiSurface());
+ assertNotNull(lu.getLod0MultiSurface().getObject());
+ assertNotNull(lu.getLod1MultiSurface());
+ assertNotNull(lu.getLod1MultiSurface().getObject());
+ assertNotNull(lu.getLod2MultiSurface());
+ assertNotNull(lu.getLod2MultiSurface().getObject());
+ assertNotNull(lu.getLod3MultiSurface());
+ assertNotNull(lu.getLod3MultiSurface().getObject());
+ assertNotNull(lu.getDeprecatedProperties().getLod4MultiSurface());
+ assertNotNull(lu.getDeprecatedProperties().getLod4MultiSurface().getObject());
+ }
+
+
+}
\ No newline at end of file
diff --git a/CityDoctorParent/CityDoctorModel/src/test/java/de/hft/stuttgart/citydoctor2/datastructure/ReliefObjectTest.java b/CityDoctorParent/CityDoctorModel/src/test/java/de/hft/stuttgart/citydoctor2/datastructure/ReliefObjectTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..d97059d14bf13cdb82b34e0cc4246d59856b0d48
--- /dev/null
+++ b/CityDoctorParent/CityDoctorModel/src/test/java/de/hft/stuttgart/citydoctor2/datastructure/ReliefObjectTest.java
@@ -0,0 +1,27 @@
+package de.hft.stuttgart.citydoctor2.datastructure;
+
+import de.hft.stuttgart.citydoctor2.check.AbstractCheck;
+import org.citygml4j.core.model.relief.ReliefFeature;
+import org.junit.Test;
+
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+
+public class ReliefObjectTest {
+
+ @Test
+ public void testVisitorPropagationReliefObject() {
+ ReliefFeature mockRelief = new ReliefFeature();
+ ReliefObject relief = new ReliefObject(mockRelief);
+ TinObject mockTin = mock(TinObject.class);
+ relief.addComponent(mockTin);
+
+ AbstractCheck c = new AbstractCheck() {
+ };
+ relief.accept(c);
+
+ verify(mockTin).accept(c);
+ }
+
+
+}
diff --git a/CityDoctorParent/CityDoctorModel/src/test/java/de/hft/stuttgart/citydoctor2/datastructure/TinObjectTest.java b/CityDoctorParent/CityDoctorModel/src/test/java/de/hft/stuttgart/citydoctor2/datastructure/TinObjectTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..b635e2a660a11bf0cf9d526e4f05e533b0a9116b
--- /dev/null
+++ b/CityDoctorParent/CityDoctorModel/src/test/java/de/hft/stuttgart/citydoctor2/datastructure/TinObjectTest.java
@@ -0,0 +1,117 @@
+package de.hft.stuttgart.citydoctor2.datastructure;
+
+import de.hft.stuttgart.citydoctor2.check.AbstractCheck;
+import de.hft.stuttgart.citydoctor2.check.CheckError;
+import de.hft.stuttgart.citydoctor2.check.CheckId;
+import de.hft.stuttgart.citydoctor2.check.CheckResult;
+import de.hft.stuttgart.citydoctor2.check.ResultStatus;
+import de.hft.stuttgart.citydoctor2.parser.ParserConfiguration;
+import org.citygml4j.core.model.relief.TINRelief;
+import org.citygml4j.core.model.relief.TinProperty;
+import org.citygml4j.core.util.geometry.GeometryFactory;
+import org.junit.Test;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+
+public class TinObjectTest {
+
+ @Test
+ public void testVisitorPropagation() {
+ TINRelief tir = new TINRelief();
+ TinObject tin = new TinObject(tir);
+ Geometry mockGeometry = mock(Geometry.class);
+
+ tin.addGeometry(mockGeometry);
+
+ AbstractCheck c = new AbstractCheck() {
+ };
+ tin.accept(c);
+
+ verify(mockGeometry).accept(c);
+ }
+
+ @Test
+ public void testContainsError() {
+ TINRelief tir = new TINRelief();
+ TinObject tin = new TinObject(tir);
+ assertFalse(tin.containsError(CheckId.C_GE_P_HOLE_OUTSIDE));
+ assertFalse(tin.containsError(CheckId.C_GE_P_NON_PLANAR));
+ tin.addCheckResult(new CheckResult(CheckId.C_GE_P_HOLE_OUTSIDE, ResultStatus.ERROR, mock(CheckError.class)));
+ assertTrue(tin.containsError(CheckId.C_GE_P_HOLE_OUTSIDE));
+ assertFalse(tin.containsError(CheckId.C_GE_P_NON_PLANAR));
+ tin.addCheckResult(new CheckResult(CheckId.C_GE_P_NON_PLANAR, ResultStatus.OK, mock(CheckError.class)));
+ assertTrue(tin.containsError(CheckId.C_GE_P_HOLE_OUTSIDE));
+ assertFalse(tin.containsError(CheckId.C_GE_P_NON_PLANAR));
+ }
+
+
+ @Test
+ public void testClearAllContainedCheckResults() {
+ TINRelief tir = new TINRelief();
+ TinObject tin = new TinObject(tir);
+ tin.addCheckResult(new CheckResult(CheckId.C_GE_P_HOLE_OUTSIDE, ResultStatus.OK, null));
+
+ assertEquals(1, tin.getAllCheckResults().size());
+ tin.clearAllContainedCheckResults();
+ assertTrue(tin.getAllCheckResults().isEmpty());
+ }
+
+ @Test
+ public void testContainsAnyError() {
+ TINRelief tir = new TINRelief();
+ TinObject tin = new TinObject(tir);
+ assertFalse(tin.containsAnyError());
+ tin.addCheckResult(new CheckResult(CheckId.C_GE_P_HOLE_OUTSIDE, ResultStatus.OK, null));
+ assertFalse(tin.containsAnyError());
+ tin.addCheckResult(
+ new CheckResult(CheckId.C_GE_P_INNER_RINGS_NESTED, ResultStatus.ERROR, mock(CheckError.class)));
+ assertTrue(tin.containsAnyError());
+ }
+
+ @Test
+ public void testCollectContainedErrors() {
+ TINRelief tir = new TINRelief();
+ TinObject tin = new TinObject(tir);
+ tin.addCheckResult(new CheckResult(CheckId.C_GE_P_HOLE_OUTSIDE, ResultStatus.ERROR, mock(CheckError.class)));
+ List errors = new ArrayList<>();
+ tin.collectContainedErrors(errors);
+ assertEquals(1, errors.size());
+ }
+
+ @Test
+ public void testUnsetGeometries() {
+ TINRelief tir = new TINRelief();
+ TinObject tin = new TinObject(tir);
+
+ tir.setTin(new TinProperty());
+
+ tin.clearGmlGeometries();
+
+ assertNull(tir.getTin());
+ }
+
+ @Test
+ public void testReCreateGeometries() {
+ TINRelief tir = new TINRelief();
+ TinObject tin = new TinObject(tir);
+
+ tin.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.MULTI_SURFACE));
+
+ GeometryFactory factory = GeometryFactory.newInstance();
+ ParserConfiguration config = new ParserConfiguration(8, false);
+ tin.reCreateGeometries(factory, config);
+
+ assertNotNull(tir.getTin());
+ assertNotNull(tir.getTin().getObject());
+ assertEquals(2, tir.getLod());
+ }
+}
diff --git a/CityDoctorParent/CityDoctorModel/src/test/java/de/hft/stuttgart/citydoctor2/datastructure/TopLevelTransportFeatureTest.java b/CityDoctorParent/CityDoctorModel/src/test/java/de/hft/stuttgart/citydoctor2/datastructure/TopLevelTransportFeatureTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..0f3a157249f8f2e3285716e70f0f97ebe4633e48
--- /dev/null
+++ b/CityDoctorParent/CityDoctorModel/src/test/java/de/hft/stuttgart/citydoctor2/datastructure/TopLevelTransportFeatureTest.java
@@ -0,0 +1,182 @@
+package de.hft.stuttgart.citydoctor2.datastructure;
+
+import de.hft.stuttgart.citydoctor2.check.AbstractCheck;
+import de.hft.stuttgart.citydoctor2.check.CheckError;
+import de.hft.stuttgart.citydoctor2.check.CheckId;
+import de.hft.stuttgart.citydoctor2.check.CheckResult;
+import de.hft.stuttgart.citydoctor2.check.ResultStatus;
+import de.hft.stuttgart.citydoctor2.parser.ParserConfiguration;
+import org.citygml4j.core.model.deprecated.transportation.DeprecatedPropertiesOfAbstractTransportationSpace;
+import org.citygml4j.core.model.transportation.Railway;
+import org.citygml4j.core.model.transportation.Road;
+import org.citygml4j.core.model.transportation.Square;
+import org.citygml4j.core.model.transportation.Track;
+import org.citygml4j.core.model.transportation.Waterway;
+import org.citygml4j.core.util.geometry.GeometryFactory;
+import org.junit.Test;
+import org.mockito.Mockito;
+import org.xmlobjects.gml.model.geometry.aggregates.MultiSurfaceProperty;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+public class TopLevelTransportFeatureTest {
+
+ @Test
+ public void testObjectConstruction() {
+ TopLevelTransportFeature road = TopLevelTransportFeature.from(Mockito.mock(Road.class));
+ assertEquals(TransportationObject.TransportationType.ROAD, road.getTransportationType());
+ TopLevelTransportFeature track = TopLevelTransportFeature.from(Mockito.mock(Track.class));
+ assertEquals(TransportationObject.TransportationType.TRACK, track.getTransportationType());
+ TopLevelTransportFeature waterway = TopLevelTransportFeature.from(Mockito.mock(Waterway.class));
+ assertEquals(TransportationObject.TransportationType.WATERWAY, waterway.getTransportationType());
+ TopLevelTransportFeature railway = TopLevelTransportFeature.from(Mockito.mock(Railway.class));
+ assertEquals(TransportationObject.TransportationType.RAILWAY, railway.getTransportationType());
+ TopLevelTransportFeature square = TopLevelTransportFeature.from(Mockito.mock(Square.class));
+ assertEquals(TransportationObject.TransportationType.SQUARE, square.getTransportationType());
+ }
+
+ @Test
+ public void testVisitorPropagation() {
+ Road road = new Road();
+ TopLevelTransportFeature top = TopLevelTransportFeature.from(road);
+ TransportSection mockSection = mock(TransportSection.class);
+ TransportSection mockIntersection = mock(TransportSection.class);
+ top.addSection(mockSection);
+ top.addIntersection(mockIntersection);
+
+ AbstractCheck c = new AbstractCheck() {
+ };
+ top.accept(c);
+
+ verify(mockSection).accept(c);
+ verify(mockIntersection).accept(c);
+ }
+
+ @Test
+ public void testContainsError() {
+ Road road = new Road();
+ TopLevelTransportFeature top = TopLevelTransportFeature.from(road);
+ assertFalse(top.containsError(CheckId.C_GE_P_HOLE_OUTSIDE));
+ assertFalse(top.containsError(CheckId.C_GE_P_NON_PLANAR));
+ top.addCheckResult(new CheckResult(CheckId.C_GE_P_HOLE_OUTSIDE, ResultStatus.ERROR, mock(CheckError.class)));
+ assertTrue(top.containsError(CheckId.C_GE_P_HOLE_OUTSIDE));
+ assertFalse(top.containsError(CheckId.C_GE_P_NON_PLANAR));
+ top.addCheckResult(new CheckResult(CheckId.C_GE_P_NON_PLANAR, ResultStatus.OK, mock(CheckError.class)));
+ assertTrue(top.containsError(CheckId.C_GE_P_HOLE_OUTSIDE));
+ assertFalse(top.containsError(CheckId.C_GE_P_NON_PLANAR));
+ }
+
+ @Test
+ public void testContainsAnyError() {
+ Road road = new Road();
+ TopLevelTransportFeature top = TopLevelTransportFeature.from(road);
+ assertFalse(top.containsAnyError());
+ top.addCheckResult(new CheckResult(CheckId.C_GE_P_HOLE_OUTSIDE, ResultStatus.OK, null));
+ assertFalse(top.containsAnyError());
+ top.addCheckResult(
+ new CheckResult(CheckId.C_GE_P_INNER_RINGS_NESTED, ResultStatus.ERROR, mock(CheckError.class)));
+ assertTrue(top.containsAnyError());
+ }
+
+ @Test
+ public void testClearAllContainedCheckResults() {
+ Road roadMock = mock(Road.class);
+ TopLevelTransportFeature top = TopLevelTransportFeature.from(roadMock);
+
+ assertFalse(top.containsError(CheckId.C_GE_P_HOLE_OUTSIDE));
+ top.addCheckResult(new CheckResult(CheckId.C_GE_P_HOLE_OUTSIDE, ResultStatus.ERROR, mock(CheckError.class)));
+ assertTrue(top.containsError(CheckId.C_GE_P_HOLE_OUTSIDE));
+ top.clearAllContainedCheckResults();
+ assertFalse(top.containsError(CheckId.C_GE_P_HOLE_OUTSIDE));
+
+ }
+
+ @Test
+ public void testCollectContainedErrors() {
+ Road roadMock = mock(Road.class);
+ TopLevelTransportFeature top = TopLevelTransportFeature.from(roadMock);
+ top.setGmlObject(roadMock);
+
+ top.addCheckResult(new CheckResult(CheckId.C_GE_P_HOLE_OUTSIDE, ResultStatus.ERROR, mock(CheckError.class)));
+ List errors = new ArrayList<>();
+ top.collectContainedErrors(errors);
+ assertEquals(1, errors.size());
+
+ }
+
+ @Test
+ public void testUnsetGmlGeometries() {
+ Road r = mock(Road.class);
+ TopLevelTransportFeature top = TopLevelTransportFeature.from(r);
+ top.setGmlObject(r);
+
+ DeprecatedPropertiesOfAbstractTransportationSpace dSpace = mock(DeprecatedPropertiesOfAbstractTransportationSpace.class);
+ when(r.getDeprecatedProperties()).thenReturn(dSpace);
+
+ dSpace.setLod1MultiSurface(mock(MultiSurfaceProperty.class));
+ r.setLod2MultiSurface(mock(MultiSurfaceProperty.class));
+ r.setLod3MultiSurface(mock(MultiSurfaceProperty.class));
+ dSpace.setLod4MultiSurface(mock(MultiSurfaceProperty.class));
+
+ top.unsetGmlGeometries();
+ assertNull(dSpace.getLod1MultiSurface());
+ assertNull(r.getLod2MultiSurface());
+ assertNull(r.getLod3MultiSurface());
+ assertNull(dSpace.getLod4MultiSurface());
+
+ }
+
+ @Test
+ public void testReCreateGeometriesSolid() {
+ Road gmlRoad = new Road();
+ TopLevelTransportFeature top = TopLevelTransportFeature.from(gmlRoad);
+ top.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.SOLID, Lod.LOD1));
+ top.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.SOLID, Lod.LOD2));
+ top.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.SOLID, Lod.LOD3));
+
+ GeometryFactory factory = GeometryFactory.newInstance();
+ ParserConfiguration config = new ParserConfiguration(8, false);
+ top.reCreateGeometries(factory, config);
+
+ GeometryTestUtils.assertSolidMatchesExpectedValues(gmlRoad.getLod1Solid().getObject());
+ GeometryTestUtils.assertSolidMatchesExpectedValues(gmlRoad.getLod2Solid().getObject());
+ GeometryTestUtils.assertSolidMatchesExpectedValues(gmlRoad.getLod3Solid().getObject());
+
+ }
+
+ @Test
+ public void testReCreateGeometriesMultiSurface() {
+ Road gmlRoad = new Road();
+ TopLevelTransportFeature top = TopLevelTransportFeature.from(gmlRoad);
+ top.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.MULTI_SURFACE, Lod.LOD0));
+ top.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.MULTI_SURFACE, Lod.LOD1));
+ top.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.MULTI_SURFACE, Lod.LOD2));
+ top.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.MULTI_SURFACE, Lod.LOD3));
+ top.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.MULTI_SURFACE, Lod.LOD4));
+
+ GeometryFactory factory = GeometryFactory.newInstance();
+ ParserConfiguration config = new ParserConfiguration(8, false);
+ top.reCreateGeometries(factory, config);
+
+ assertNotNull(gmlRoad.getLod0MultiSurface());
+ assertNotNull(gmlRoad.getLod0MultiSurface().getObject());
+ assertNotNull(gmlRoad.getDeprecatedProperties().getLod1MultiSurface());
+ assertNotNull(gmlRoad.getDeprecatedProperties().getLod1MultiSurface().getObject());
+ assertNotNull(gmlRoad.getLod2MultiSurface());
+ assertNotNull(gmlRoad.getLod2MultiSurface().getObject());
+ assertNotNull(gmlRoad.getLod3MultiSurface());
+ assertNotNull(gmlRoad.getLod3MultiSurface().getObject());
+ assertNotNull(gmlRoad.getDeprecatedProperties().getLod4MultiSurface());
+ assertNotNull(gmlRoad.getDeprecatedProperties().getLod4MultiSurface().getObject());
+ }
+}
diff --git a/CityDoctorParent/CityDoctorModel/src/test/java/de/hft/stuttgart/citydoctor2/datastructure/TrafficAreaTest.java b/CityDoctorParent/CityDoctorModel/src/test/java/de/hft/stuttgart/citydoctor2/datastructure/TrafficAreaTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..63173900c37ca595684ebe72809dcce401d854fe
--- /dev/null
+++ b/CityDoctorParent/CityDoctorModel/src/test/java/de/hft/stuttgart/citydoctor2/datastructure/TrafficAreaTest.java
@@ -0,0 +1,119 @@
+package de.hft.stuttgart.citydoctor2.datastructure;
+
+import de.hft.stuttgart.citydoctor2.check.CheckError;
+import de.hft.stuttgart.citydoctor2.check.CheckId;
+import de.hft.stuttgart.citydoctor2.check.CheckResult;
+import de.hft.stuttgart.citydoctor2.check.ResultStatus;
+import de.hft.stuttgart.citydoctor2.parser.ParserConfiguration;
+import org.citygml4j.core.model.deprecated.core.DeprecatedPropertiesOfAbstractThematicSurface;
+import org.citygml4j.core.model.transportation.TrafficArea;
+import org.citygml4j.core.util.geometry.GeometryFactory;
+import org.junit.Test;
+import org.xmlobjects.gml.model.geometry.aggregates.MultiSurfaceProperty;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+public class TrafficAreaTest {
+
+ @Test
+ public void testContainsError() {
+ TrafficAreaObject tao = new TrafficAreaObject(TrafficAreaObject.TrafficAreaType.TRAFFIC_AREA);
+
+ tao.addCheckResult(new CheckResult(CheckId.C_GE_P_HOLE_OUTSIDE, ResultStatus.ERROR, mock(CheckError.class)));
+ assertTrue(tao.containsError(CheckId.C_GE_P_HOLE_OUTSIDE));
+ assertFalse(tao.containsError(CheckId.C_GE_P_INNER_RINGS_NESTED));
+ }
+
+ @Test
+ public void testContainsAnyError() {
+ TrafficAreaObject tao = new TrafficAreaObject(TrafficAreaObject.TrafficAreaType.TRAFFIC_AREA);
+ assertFalse(tao.containsAnyError());
+ tao.addCheckResult(new CheckResult(CheckId.C_GE_P_HOLE_OUTSIDE, ResultStatus.OK, null));
+ assertFalse(tao.containsAnyError());
+ tao.addCheckResult(
+ new CheckResult(CheckId.C_GE_P_INNER_RINGS_NESTED, ResultStatus.ERROR, mock(CheckError.class)));
+ assertTrue(tao.containsAnyError());
+ }
+
+ @Test
+ public void testClearAllContainedCheckResults() {
+ TrafficAreaObject tao = new TrafficAreaObject(TrafficAreaObject.TrafficAreaType.TRAFFIC_AREA);
+ TrafficArea taMock = mock(TrafficArea.class);
+ tao.setGmlObject(taMock);
+
+ assertFalse(tao.containsError(CheckId.C_GE_P_HOLE_OUTSIDE));
+ tao.addCheckResult(new CheckResult(CheckId.C_GE_P_HOLE_OUTSIDE, ResultStatus.ERROR, mock(CheckError.class)));
+ assertTrue(tao.containsError(CheckId.C_GE_P_HOLE_OUTSIDE));
+ tao.clearAllContainedCheckResults();
+ assertFalse(tao.containsError(CheckId.C_GE_P_HOLE_OUTSIDE));
+
+ }
+
+ @Test
+ public void testCollectContainedErrors() {
+ TrafficAreaObject tao = new TrafficAreaObject(TrafficAreaObject.TrafficAreaType.TRAFFIC_AREA);
+ TrafficArea taMock = mock(TrafficArea.class);
+ tao.setGmlObject(taMock);
+
+ tao.addCheckResult(new CheckResult(CheckId.C_GE_P_HOLE_OUTSIDE, ResultStatus.ERROR, mock(CheckError.class)));
+ List errors = new ArrayList<>();
+ tao.collectContainedErrors(errors);
+ assertEquals(1, errors.size());
+ }
+
+ @Test
+ public void testUnsetGmlGeometries() {
+ TrafficAreaObject ta = new TrafficAreaObject(TrafficAreaObject.TrafficAreaType.TRAFFIC_AREA);
+ TrafficArea r = mock(TrafficArea.class);
+ ta.setGmlObject(r);
+ DeprecatedPropertiesOfAbstractThematicSurface dSpace = mock(DeprecatedPropertiesOfAbstractThematicSurface.class);
+ when(r.getDeprecatedProperties()).thenReturn(dSpace);
+
+ r.setLod0MultiSurface(mock(MultiSurfaceProperty.class));
+ r.setLod1MultiSurface(mock(MultiSurfaceProperty.class));
+ r.setLod2MultiSurface(mock(MultiSurfaceProperty.class));
+ r.setLod3MultiSurface(mock(MultiSurfaceProperty.class));
+ dSpace.setLod4MultiSurface(mock(MultiSurfaceProperty.class));
+
+ ta.unsetGmlGeometries();
+ assertNull(r.getLod0MultiSurface());
+ assertNull(r.getLod1MultiSurface());
+ assertNull(r.getLod2MultiSurface());
+ assertNull(r.getLod3MultiSurface());
+ assertNull(dSpace.getLod4MultiSurface());
+ }
+
+ @Test
+ public void testReCreateGeometriesMultiSurface() {
+ TrafficArea gmlAus = new TrafficArea() {
+ };
+ TrafficAreaObject tao = new TrafficAreaObject(TrafficAreaObject.TrafficAreaType.TRAFFIC_AREA);
+ tao.setGmlObject(gmlAus);
+
+ tao.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.MULTI_SURFACE, Lod.LOD0));
+ tao.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.MULTI_SURFACE, Lod.LOD1));
+ tao.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.MULTI_SURFACE, Lod.LOD2));
+ tao.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.MULTI_SURFACE, Lod.LOD3));
+ tao.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.MULTI_SURFACE, Lod.LOD4));
+
+ GeometryFactory factory = GeometryFactory.newInstance();
+ ParserConfiguration config = new ParserConfiguration(8, false);
+ tao.reCreateGeometries(factory, config);
+
+ assertNotNull(gmlAus.getLod0MultiSurface());
+ assertNotNull(gmlAus.getLod0MultiSurface().getObject());
+ assertNotNull(gmlAus.getLod2MultiSurface());
+ assertNotNull(gmlAus.getLod2MultiSurface().getObject());
+ assertNotNull(gmlAus.getLod3MultiSurface());
+ assertNotNull(gmlAus.getLod3MultiSurface().getObject());
+ }
+}
diff --git a/CityDoctorParent/CityDoctorModel/src/test/java/de/hft/stuttgart/citydoctor2/datastructure/TrafficSpaceTest.java b/CityDoctorParent/CityDoctorModel/src/test/java/de/hft/stuttgart/citydoctor2/datastructure/TrafficSpaceTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..bb6c592e7319ad73529432513cf48fd0937a1c47
--- /dev/null
+++ b/CityDoctorParent/CityDoctorModel/src/test/java/de/hft/stuttgart/citydoctor2/datastructure/TrafficSpaceTest.java
@@ -0,0 +1,179 @@
+package de.hft.stuttgart.citydoctor2.datastructure;
+
+import de.hft.stuttgart.citydoctor2.check.AbstractCheck;
+import de.hft.stuttgart.citydoctor2.check.CheckError;
+import de.hft.stuttgart.citydoctor2.check.CheckId;
+import de.hft.stuttgart.citydoctor2.check.CheckResult;
+import de.hft.stuttgart.citydoctor2.check.ResultStatus;
+import de.hft.stuttgart.citydoctor2.parser.ParserConfiguration;
+import de.hft.stuttgart.citydoctor2.utils.visitors.ClearCheckResultsVisitor;
+import org.citygml4j.core.model.core.AbstractSpaceBoundary;
+import org.citygml4j.core.model.core.AbstractUnoccupiedSpace;
+import org.citygml4j.core.model.deprecated.core.DeprecatedPropertiesOfAbstractCityObject;
+import org.citygml4j.core.model.transportation.TrafficSpace;
+import org.citygml4j.core.util.geometry.GeometryFactory;
+import org.citygml4j.core.visitor.ObjectVisitor;
+import org.junit.Test;
+import org.xmlobjects.gml.model.geometry.aggregates.MultiSurfaceProperty;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+public class TrafficSpaceTest {
+
+ @Test
+ public void testVisitorPropagation() {
+ TrafficSpaceObject tso = new TrafficSpaceObject(TrafficSpaceObject.TrafficSpaceType.TRAFFIC_SPACE);
+ TrafficAreaObject areaMock = mock(TrafficAreaObject.class);
+ tso.addTrafficArea(areaMock);
+
+ AbstractCheck c = new AbstractCheck() {
+ };
+ tso.accept(c);
+
+ verify(areaMock).accept(c);
+ }
+
+ @Test
+ public void testContainsError() {
+ TrafficSpaceObject tso = new TrafficSpaceObject(TrafficSpaceObject.TrafficSpaceType.TRAFFIC_SPACE);
+
+ tso.addCheckResult(new CheckResult(CheckId.C_GE_P_HOLE_OUTSIDE, ResultStatus.ERROR, mock(CheckError.class)));
+ assertTrue(tso.containsError(CheckId.C_GE_P_HOLE_OUTSIDE));
+ assertFalse(tso.containsError(CheckId.C_GE_P_INNER_RINGS_NESTED));
+
+ }
+
+ @Test
+ public void testContainsAnyError() {
+ TrafficSpaceObject tso = new TrafficSpaceObject(TrafficSpaceObject.TrafficSpaceType.TRAFFIC_SPACE);
+ assertFalse(tso.containsAnyError());
+ tso.addCheckResult(new CheckResult(CheckId.C_GE_P_HOLE_OUTSIDE, ResultStatus.OK, null));
+ assertFalse(tso.containsAnyError());
+ tso.addCheckResult(
+ new CheckResult(CheckId.C_GE_P_INNER_RINGS_NESTED, ResultStatus.ERROR, mock(CheckError.class)));
+ assertTrue(tso.containsAnyError());
+ }
+
+ @Test
+ public void testCollectContainedErrors() {
+ TrafficSpaceObject tso = new TrafficSpaceObject(TrafficSpaceObject.TrafficSpaceType.TRAFFIC_SPACE);
+
+ tso.addCheckResult(new CheckResult(CheckId.C_GE_P_HOLE_OUTSIDE, ResultStatus.ERROR, mock(CheckError.class)));
+ List errors = new ArrayList<>();
+ tso.collectContainedErrors(errors);
+ assertEquals(1, errors.size());
+
+ }
+
+ @Test
+ public void testClearAllContainedCheckResults() {
+ TrafficSpaceObject tso = new TrafficSpaceObject(TrafficSpaceObject.TrafficSpaceType.TRAFFIC_SPACE);
+ TrafficSpace tsMock = mock(TrafficSpace.class);
+ tso.setGmlObject(tsMock);
+ TrafficAreaObject taMock = mock(TrafficAreaObject.class);
+
+ tso.addTrafficArea(taMock);
+
+ assertFalse(tso.containsError(CheckId.C_GE_P_HOLE_OUTSIDE));
+ tso.addCheckResult(new CheckResult(CheckId.C_GE_P_HOLE_OUTSIDE, ResultStatus.ERROR, mock(CheckError.class)));
+ assertTrue(tso.containsError(CheckId.C_GE_P_HOLE_OUTSIDE));
+ tso.clearAllContainedCheckResults();
+ assertFalse(tso.containsError(CheckId.C_GE_P_HOLE_OUTSIDE));
+
+ verify(taMock).accept(any(ClearCheckResultsVisitor.class));
+ }
+
+ @Test
+ public void testUnsetGmlGeometries() {
+ TrafficSpaceObject tso = new TrafficSpaceObject(TrafficSpaceObject.TrafficSpaceType.TRAFFIC_SPACE);
+ TrafficSpace t = mock(TrafficSpace.class);
+ tso.setGmlObject(t);
+
+ DeprecatedPropertiesOfAbstractCityObject dSpace = mock(DeprecatedPropertiesOfAbstractCityObject.class);
+ when(t.getDeprecatedProperties()).thenReturn(dSpace);
+
+ t.setLod0MultiSurface(mock(MultiSurfaceProperty.class));
+ t.setLod2MultiSurface(mock(MultiSurfaceProperty.class));
+ t.setLod3MultiSurface(mock(MultiSurfaceProperty.class));
+
+ tso.unsetGmlGeometries();
+ assertNull(t.getLod0MultiSurface());
+ assertNull(t.getLod2MultiSurface());
+ assertNull(t.getLod3MultiSurface());
+
+ }
+
+ @Test
+ public void testReCreateGeometriesSolid() {
+ AbstractUnoccupiedSpace gmlAus = new AbstractUnoccupiedSpace() {
+ @Override
+ public boolean isValidBoundary(Class extends AbstractSpaceBoundary> type) {
+ return false;
+ }
+
+ @Override
+ public void accept(ObjectVisitor visitor) {
+
+ }
+ };
+ TrafficSpaceObject tso = new TrafficSpaceObject(TrafficSpaceObject.TrafficSpaceType.TRAFFIC_SPACE) {
+ };
+ tso.setGmlObject(gmlAus);
+
+ tso.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.SOLID, Lod.LOD1));
+ tso.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.SOLID, Lod.LOD2));
+ tso.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.SOLID, Lod.LOD3));
+
+ GeometryFactory factory = GeometryFactory.newInstance();
+ ParserConfiguration config = new ParserConfiguration(8, false);
+ tso.reCreateGeometries(factory, config);
+
+ GeometryTestUtils.assertSolidMatchesExpectedValues(gmlAus.getLod1Solid().getObject());
+ GeometryTestUtils.assertSolidMatchesExpectedValues(gmlAus.getLod2Solid().getObject());
+ GeometryTestUtils.assertSolidMatchesExpectedValues(gmlAus.getLod3Solid().getObject());
+
+ }
+
+ @Test
+ public void testReCreateGeometriesMultiSurface() {
+ AbstractUnoccupiedSpace gmlAus = new AbstractUnoccupiedSpace() {
+ @Override
+ public boolean isValidBoundary(Class extends AbstractSpaceBoundary> type) {
+ return false;
+ }
+
+ @Override
+ public void accept(ObjectVisitor visitor) {
+
+ }
+ };
+ TrafficSpaceObject tso = new TrafficSpaceObject(TrafficSpaceObject.TrafficSpaceType.TRAFFIC_SPACE);
+ tso.setGmlObject(gmlAus);
+
+ tso.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.MULTI_SURFACE, Lod.LOD0));
+ tso.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.MULTI_SURFACE, Lod.LOD2));
+ tso.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.MULTI_SURFACE, Lod.LOD3));
+
+ GeometryFactory factory = GeometryFactory.newInstance();
+ ParserConfiguration config = new ParserConfiguration(8, false);
+ tso.reCreateGeometries(factory, config);
+
+ assertNotNull(gmlAus.getLod0MultiSurface());
+ assertNotNull(gmlAus.getLod0MultiSurface().getObject());
+ assertNotNull(gmlAus.getLod2MultiSurface());
+ assertNotNull(gmlAus.getLod2MultiSurface().getObject());
+ assertNotNull(gmlAus.getLod3MultiSurface());
+ assertNotNull(gmlAus.getLod3MultiSurface().getObject());
+ }
+}
diff --git a/CityDoctorParent/CityDoctorModel/src/test/java/de/hft/stuttgart/citydoctor2/datastructure/TransportationObjectTest.java b/CityDoctorParent/CityDoctorModel/src/test/java/de/hft/stuttgart/citydoctor2/datastructure/TransportationObjectTest.java
index b558cfe88f38c4be4e1f8cb510afe07c7c14637c..56656858baf60d429e89a3024bc9955812063162 100644
--- a/CityDoctorParent/CityDoctorModel/src/test/java/de/hft/stuttgart/citydoctor2/datastructure/TransportationObjectTest.java
+++ b/CityDoctorParent/CityDoctorModel/src/test/java/de/hft/stuttgart/citydoctor2/datastructure/TransportationObjectTest.java
@@ -19,41 +19,10 @@
package de.hft.stuttgart.citydoctor2.datastructure;
import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-import java.util.ArrayList;
-import java.util.List;
-
-import org.citygml4j.core.model.deprecated.core.DeprecatedPropertiesOfAbstractCityObject;
-import org.citygml4j.core.model.deprecated.core.DeprecatedPropertiesOfAbstractThematicSurface;
-import org.citygml4j.core.model.deprecated.transportation.DeprecatedPropertiesOfAbstractTransportationSpace;
-import org.citygml4j.core.model.transportation.Intersection;
-import org.citygml4j.core.model.transportation.Railway;
import org.citygml4j.core.model.transportation.Road;
-import org.citygml4j.core.model.transportation.Section;
-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.Waterway;
-import org.citygml4j.core.util.geometry.GeometryFactory;
import org.junit.Test;
import org.mockito.Mockito;
-import org.xmlobjects.gml.model.geometry.aggregates.MultiSurfaceProperty;
-
-import de.hft.stuttgart.citydoctor2.check.CheckError;
-import de.hft.stuttgart.citydoctor2.check.CheckId;
-import de.hft.stuttgart.citydoctor2.check.CheckResult;
-import de.hft.stuttgart.citydoctor2.check.ResultStatus;
-import de.hft.stuttgart.citydoctor2.datastructure.TransportationObject.TransportationType;
-import de.hft.stuttgart.citydoctor2.parser.ParserConfiguration;
public class TransportationObjectTest {
@@ -63,476 +32,5 @@ public class TransportationObjectTest {
assertEquals(FeatureType.TRANSPORTATION, to.getFeatureType());
}
- @Test
- public void testObjectConstruction() {
- TopLevelTransportFeature road = TopLevelTransportFeature.from(Mockito.mock(Road.class));
- assertEquals(TransportationType.ROAD, road.getTransportationType());
- TopLevelTransportFeature track = TopLevelTransportFeature.from(Mockito.mock(Track.class));
- assertEquals(TransportationType.TRACK, track.getTransportationType());
- TopLevelTransportFeature waterway = TopLevelTransportFeature.from(Mockito.mock(Waterway.class));
- assertEquals(TransportationType.WATERWAY, waterway.getTransportationType());
- TopLevelTransportFeature railway = TopLevelTransportFeature.from(Mockito.mock(Railway.class));
- assertEquals(TransportationType.RAILWAY, railway.getTransportationType());
- TopLevelTransportFeature square = TopLevelTransportFeature.from(Mockito.mock(Square.class));
- assertEquals(TransportationType.SQUARE, square.getTransportationType());
- }
-
- @Test(expected = IllegalStateException.class)
- public void testReCreateGeometriesSolid() {
- TopLevelTransportFeature to = TopLevelTransportFeature.from(Mockito.mock(Road.class));
- to.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.SOLID, Lod.LOD1));
- GeometryFactory factory = GeometryFactory.newInstance();
- to.reCreateGeometries(factory, mock(ParserConfiguration.class));
- }
-
-
- @Test
- public void testReCreateGeometriesTransportationSpace() {
- Road roadMock = mock(Road.class);
- TopLevelTransportFeature top = TopLevelTransportFeature.from(roadMock);
- top.setGmlObject(roadMock);
- TransportSection sectionMock = Mockito.mock(TransportSection.class);
- TransportSection intersectionMock = Mockito.mock(TransportSection.class);
- TrafficSpaceObject tsMock = Mockito.mock(TrafficSpaceObject.class);
- TrafficSpaceObject auxTsMock = Mockito.mock(TrafficSpaceObject.class);
-
- top.addSection(sectionMock);
- top.addIntersection(intersectionMock);
- top.addTrafficSpace(tsMock);
- top.addAuxTrafficSpace(auxTsMock);
-
- top.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.MULTI_SURFACE, Lod.LOD2));
- GeometryFactory factory = GeometryFactory.newInstance();
- top.reCreateGeometries(factory, mock(ParserConfiguration.class));
-
- verify(roadMock).setLod2MultiSurface(any());
- verify(sectionMock).reCreateGeometries(any(), any());
- verify(intersectionMock).reCreateGeometries(any(), any());
- verify(tsMock).reCreateGeometries(any(), any());
- verify(auxTsMock).reCreateGeometries(any(), any());
- }
-
- @Test
- public void testReCreateGeometriesTrafficSpace() {
- TrafficSpaceObject tso = new TrafficSpaceObject(TrafficSpaceObject.TrafficSpaceType.TRAFFIC_SPACE);
- TrafficSpace tsMock = mock(TrafficSpace.class);
- tso.setGmlObject(tsMock);
- TrafficAreaObject taoMock = Mockito.mock(TrafficAreaObject.class);
-
- tso.addTrafficArea(taoMock);
-
- tso.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.MULTI_SURFACE, Lod.LOD2));
- GeometryFactory factory = GeometryFactory.newInstance();
- tso.reCreateGeometries(factory, mock(ParserConfiguration.class));
-
- verify(tsMock).setLod2MultiSurface(any());
- verify(taoMock).reCreateGeometries(any(), any());
- }
-
- @Test
- public void testReCreateGeometriesTrafficArea() {
- TrafficAreaObject tao = new TrafficAreaObject(TrafficAreaObject.TrafficAreaType.TRAFFIC_AREA);
- TrafficArea taMock = mock(TrafficArea.class);
- tao.setGmlObject(taMock);
-
- tao.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.MULTI_SURFACE, Lod.LOD2));
- GeometryFactory factory = GeometryFactory.newInstance();
- tao.reCreateGeometries(factory, mock(ParserConfiguration.class));
-
- verify(taMock).setLod2MultiSurface(any());
- }
-
- @Test
- public void testReCreateGeometriesMultiSurfaceLod0() {
- Road roadMock = mock(Road.class);
- TopLevelTransportFeature top = TopLevelTransportFeature.from(roadMock);
- top.setGmlObject(roadMock);
-
- TrafficSpaceObject ts = new TrafficSpaceObject(TrafficSpaceObject.TrafficSpaceType.TRAFFIC_SPACE);
- TrafficSpace trafficSpaceMock = mock(TrafficSpace.class);
- ts.setGmlObject(trafficSpaceMock);
-
- TrafficAreaObject ta = new TrafficAreaObject(TrafficAreaObject.TrafficAreaType.TRAFFIC_AREA);
- TrafficArea trafficAreaMock = mock(TrafficArea.class);
- ta.setGmlObject(trafficAreaMock);
-
- top.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.MULTI_SURFACE, Lod.LOD0));
- ts.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.MULTI_SURFACE, Lod.LOD0));
- ta.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.MULTI_SURFACE, Lod.LOD0));
-
- GeometryFactory factory = GeometryFactory.newInstance();
- top.reCreateGeometries(factory, mock(ParserConfiguration.class));
- ts.reCreateGeometries(factory, mock(ParserConfiguration.class));
- ta.reCreateGeometries(factory, mock(ParserConfiguration.class));
-
- verify(roadMock).setLod0MultiSurface(any());
- verify(trafficSpaceMock).setLod0MultiSurface(any());
- verify(trafficAreaMock).setLod0MultiSurface(any());
- }
-
- @Test
- public void testReCreateGeometriesMultiSurfaceLod1() {
- Road roadMock = mock(Road.class);
- TopLevelTransportFeature top = TopLevelTransportFeature.from(roadMock);
- top.setGmlObject(roadMock);
-
- TrafficAreaObject ta = new TrafficAreaObject(TrafficAreaObject.TrafficAreaType.TRAFFIC_AREA);
- TrafficArea trafficAreaMock = mock(TrafficArea.class);
- ta.setGmlObject(trafficAreaMock);
-
- DeprecatedPropertiesOfAbstractTransportationSpace dSpace = mock(DeprecatedPropertiesOfAbstractTransportationSpace.class);
- when(roadMock.getDeprecatedProperties()).thenReturn(dSpace);
-
- try {
- top.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.MULTI_SURFACE, Lod.LOD1));
- } catch (IllegalArgumentException e) {
- fail("Casting of original GML object to AbstractTransportationSpace should work");
- }
-
- ta.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.MULTI_SURFACE, Lod.LOD1));
- GeometryFactory factory = GeometryFactory.newInstance();
- top.reCreateGeometries(factory, mock(ParserConfiguration.class));
- ta.reCreateGeometries(factory, mock(ParserConfiguration.class));
-
- verify(dSpace).setLod1MultiSurface(any());
- verify(trafficAreaMock).setLod1MultiSurface(any());
- }
-
-
- @Test
- public void testReCreateGeometriesMultiSurfaceLod2() {
- Road roadMock = mock(Road.class);
- TopLevelTransportFeature top = TopLevelTransportFeature.from(roadMock);
- top.setGmlObject(roadMock);
-
- TrafficSpaceObject ts = new TrafficSpaceObject(TrafficSpaceObject.TrafficSpaceType.TRAFFIC_SPACE);
- TrafficSpace trafficSpaceMock = mock(TrafficSpace.class);
- ts.setGmlObject(trafficSpaceMock);
-
- TrafficAreaObject ta = new TrafficAreaObject(TrafficAreaObject.TrafficAreaType.TRAFFIC_AREA);
- TrafficArea trafficAreaMock = mock(TrafficArea.class);
- ta.setGmlObject(trafficAreaMock);
-
- top.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.MULTI_SURFACE, Lod.LOD2));
- ts.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.MULTI_SURFACE, Lod.LOD2));
- ta.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.MULTI_SURFACE, Lod.LOD2));
-
- GeometryFactory factory = GeometryFactory.newInstance();
- top.reCreateGeometries(factory, mock(ParserConfiguration.class));
- ts.reCreateGeometries(factory, mock(ParserConfiguration.class));
- ta.reCreateGeometries(factory, mock(ParserConfiguration.class));
-
- verify(roadMock).setLod2MultiSurface(any());
- verify(trafficSpaceMock).setLod2MultiSurface(any());
- verify(trafficAreaMock).setLod2MultiSurface(any());
- }
-
- @Test
- public void testReCreateGeometriesMultiSurfaceLod3() {
- Road roadMock = mock(Road.class);
- TopLevelTransportFeature top = TopLevelTransportFeature.from(roadMock);
- top.setGmlObject(roadMock);
-
- TrafficSpaceObject ts = new TrafficSpaceObject(TrafficSpaceObject.TrafficSpaceType.TRAFFIC_SPACE);
- TrafficSpace trafficSpaceMock = mock(TrafficSpace.class);
- ts.setGmlObject(trafficSpaceMock);
-
- TrafficAreaObject ta = new TrafficAreaObject(TrafficAreaObject.TrafficAreaType.TRAFFIC_AREA);
- TrafficArea trafficAreaMock = mock(TrafficArea.class);
- ta.setGmlObject(trafficAreaMock);
-
- top.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.MULTI_SURFACE, Lod.LOD3));
- ts.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.MULTI_SURFACE, Lod.LOD3));
- ta.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.MULTI_SURFACE, Lod.LOD3));
-
- GeometryFactory factory = GeometryFactory.newInstance();
- top.reCreateGeometries(factory, mock(ParserConfiguration.class));
- ts.reCreateGeometries(factory, mock(ParserConfiguration.class));
- ta.reCreateGeometries(factory, mock(ParserConfiguration.class));
-
- verify(roadMock).setLod3MultiSurface(any());
- verify(trafficSpaceMock).setLod3MultiSurface(any());
- verify(trafficAreaMock).setLod3MultiSurface(any());
- }
-
- @Test
- public void testReCreateGeometriesMultiSurfaceLod4() {
- Road roadMock = mock(Road.class);
- TopLevelTransportFeature top = TopLevelTransportFeature.from(roadMock);
- top.setGmlObject(roadMock);
-
- TrafficAreaObject ta = new TrafficAreaObject(TrafficAreaObject.TrafficAreaType.TRAFFIC_AREA);
- TrafficArea trafficAreaMock = mock(TrafficArea.class);
- ta.setGmlObject(trafficAreaMock);
-
- DeprecatedPropertiesOfAbstractTransportationSpace dSpace = mock(DeprecatedPropertiesOfAbstractTransportationSpace.class);
- when(roadMock.getDeprecatedProperties()).thenReturn(dSpace);
- DeprecatedPropertiesOfAbstractThematicSurface dArea = mock(DeprecatedPropertiesOfAbstractThematicSurface.class);
- when(trafficAreaMock.getDeprecatedProperties()).thenReturn(dArea);
-
- ta.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.MULTI_SURFACE, Lod.LOD4));
- try {
- top.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.MULTI_SURFACE, Lod.LOD4));
- } catch (IllegalArgumentException e) {
- fail("Casting of original GML object to AbstractTransportationSpace should work");
- }
-
- GeometryFactory factory = GeometryFactory.newInstance();
- top.reCreateGeometries(factory, mock(ParserConfiguration.class));
- ta.reCreateGeometries(factory, mock(ParserConfiguration.class));
-
- verify(dSpace).setLod4MultiSurface(any());
- verify(dArea).setLod4MultiSurface(any());
- }
-
-
- @Test
- public void testContainsErrorTransportationSpace() {
- Road roadMock = mock(Road.class);
- TopLevelTransportFeature top = TopLevelTransportFeature.from(roadMock);
- top.setGmlObject(roadMock);
- TransportSection sectionMock = Mockito.mock(TransportSection.class);
- TransportSection intersectionMock = Mockito.mock(TransportSection.class);
- TrafficSpaceObject tsMock = Mockito.mock(TrafficSpaceObject.class);
- TrafficSpaceObject auxTsMock = Mockito.mock(TrafficSpaceObject.class);
-
- top.addSection(sectionMock);
- top.addIntersection(intersectionMock);
- top.addTrafficSpace(tsMock);
- top.addAuxTrafficSpace(auxTsMock);
-
- top.addCheckResult(new CheckResult(CheckId.C_GE_P_HOLE_OUTSIDE, ResultStatus.ERROR, mock(CheckError.class)));
- assertTrue(top.containsError(CheckId.C_GE_P_HOLE_OUTSIDE));
- assertFalse(top.containsError(CheckId.C_GE_P_INNER_RINGS_NESTED));
-
- verify(sectionMock).containsError(any());
- verify(intersectionMock).containsError(any());
- verify(tsMock).containsError(any());
- verify(auxTsMock).containsError(any());
- }
-
- @Test
- public void testContainsErrorTrafficSpace() {
- TrafficSpaceObject tso = new TrafficSpaceObject(TrafficSpaceObject.TrafficSpaceType.TRAFFIC_SPACE);
- TrafficSpace tsMock = mock(TrafficSpace.class);
- tso.setGmlObject(tsMock);
- TrafficAreaObject taMock = mock(TrafficAreaObject.class);
-
- tso.addTrafficArea(taMock);
-
- tso.addCheckResult(new CheckResult(CheckId.C_GE_P_HOLE_OUTSIDE, ResultStatus.ERROR, mock(CheckError.class)));
- assertTrue(tso.containsError(CheckId.C_GE_P_HOLE_OUTSIDE));
- assertFalse(tso.containsError(CheckId.C_GE_P_INNER_RINGS_NESTED));
-
- verify(taMock).containsError(any());
- }
-
- @Test
- public void testContainsErrorTrafficArea() {
- TrafficAreaObject tao = new TrafficAreaObject(TrafficAreaObject.TrafficAreaType.TRAFFIC_AREA);
- TrafficArea taMock = mock(TrafficArea.class);
- tao.setGmlObject(taMock);
-
- tao.addCheckResult(new CheckResult(CheckId.C_GE_P_HOLE_OUTSIDE, ResultStatus.ERROR, mock(CheckError.class)));
- assertTrue(tao.containsError(CheckId.C_GE_P_HOLE_OUTSIDE));
- assertFalse(tao.containsError(CheckId.C_GE_P_INNER_RINGS_NESTED));
- }
-
- @Test
- public void testClearAllContainedCheckResultsTransportationSpace() {
- Road roadMock = mock(Road.class);
- TopLevelTransportFeature top = TopLevelTransportFeature.from(roadMock);
- top.setGmlObject(roadMock);
- TransportSection sectionMock = Mockito.mock(TransportSection.class);
- TransportSection intersectionMock = Mockito.mock(TransportSection.class);
- TrafficSpaceObject tsMock = Mockito.mock(TrafficSpaceObject.class);
- TrafficSpaceObject auxTsMock = Mockito.mock(TrafficSpaceObject.class);
-
- top.addSection(sectionMock);
- top.addIntersection(intersectionMock);
- top.addTrafficSpace(tsMock);
- top.addAuxTrafficSpace(auxTsMock);
-
- assertFalse(top.containsError(CheckId.C_GE_P_HOLE_OUTSIDE));
- top.addCheckResult(new CheckResult(CheckId.C_GE_P_HOLE_OUTSIDE, ResultStatus.ERROR, mock(CheckError.class)));
- assertTrue(top.containsError(CheckId.C_GE_P_HOLE_OUTSIDE));
- top.clearAllContainedCheckResults();
- assertFalse(top.containsError(CheckId.C_GE_P_HOLE_OUTSIDE));
-
- verify(sectionMock).clearAllContainedCheckResults();
- verify(intersectionMock).clearAllContainedCheckResults();
- verify(tsMock).clearAllContainedCheckResults();
- verify(auxTsMock).clearAllContainedCheckResults();
- }
-
- @Test
- public void testClearAllContainedCheckResultsTrafficSpace() {
- TrafficSpaceObject tso = new TrafficSpaceObject(TrafficSpaceObject.TrafficSpaceType.TRAFFIC_SPACE);
- TrafficSpace tsMock = mock(TrafficSpace.class);
- tso.setGmlObject(tsMock);
- TrafficAreaObject taMock = mock(TrafficAreaObject.class);
-
- tso.addTrafficArea(taMock);
-
- assertFalse(tso.containsError(CheckId.C_GE_P_HOLE_OUTSIDE));
- tso.addCheckResult(new CheckResult(CheckId.C_GE_P_HOLE_OUTSIDE, ResultStatus.ERROR, mock(CheckError.class)));
- assertTrue(tso.containsError(CheckId.C_GE_P_HOLE_OUTSIDE));
- tso.clearAllContainedCheckResults();
- assertFalse(tso.containsError(CheckId.C_GE_P_HOLE_OUTSIDE));
-
- verify(taMock).clearAllContainedCheckResults();
- }
-
- @Test
- public void testClearAllContainedCheckResultsTrafficArea() {
- TrafficAreaObject tao = new TrafficAreaObject(TrafficAreaObject.TrafficAreaType.TRAFFIC_AREA);
- TrafficArea taMock = mock(TrafficArea.class);
- tao.setGmlObject(taMock);
-
- assertFalse(tao.containsError(CheckId.C_GE_P_HOLE_OUTSIDE));
- tao.addCheckResult(new CheckResult(CheckId.C_GE_P_HOLE_OUTSIDE, ResultStatus.ERROR, mock(CheckError.class)));
- assertTrue(tao.containsError(CheckId.C_GE_P_HOLE_OUTSIDE));
- tao.clearAllContainedCheckResults();
- assertFalse(tao.containsError(CheckId.C_GE_P_HOLE_OUTSIDE));
-
- }
-
- @Test
- public void testCollectContainedErrorsTransportationSpace() {
- Road roadMock = mock(Road.class);
- TopLevelTransportFeature top = TopLevelTransportFeature.from(roadMock);
- top.setGmlObject(roadMock);
- TransportSection sectionMock = Mockito.mock(TransportSection.class);
- TransportSection intersectionMock = Mockito.mock(TransportSection.class);
- TrafficSpaceObject tsMock = Mockito.mock(TrafficSpaceObject.class);
- TrafficSpaceObject auxTsMock = Mockito.mock(TrafficSpaceObject.class);
-
- top.addSection(sectionMock);
- top.addIntersection(intersectionMock);
- top.addTrafficSpace(tsMock);
- top.addAuxTrafficSpace(auxTsMock);
-
- top.addCheckResult(new CheckResult(CheckId.C_GE_P_HOLE_OUTSIDE, ResultStatus.ERROR, mock(CheckError.class)));
- List errors = new ArrayList<>();
- top.collectContainedErrors(errors);
- assertEquals(1, errors.size());
-
- verify(sectionMock).collectContainedErrors(errors);
- verify(intersectionMock).collectContainedErrors(errors);
- verify(tsMock).collectContainedErrors(errors);
- verify(auxTsMock).collectContainedErrors(errors);
- }
-
- @Test
- public void testCollectContainedErrorsTrafficSpace() {
- TrafficSpaceObject tso = new TrafficSpaceObject(TrafficSpaceObject.TrafficSpaceType.TRAFFIC_SPACE);
- TrafficSpace tsMock = mock(TrafficSpace.class);
- tso.setGmlObject(tsMock);
- TrafficAreaObject taMock = mock(TrafficAreaObject.class);
-
- tso.addTrafficArea(taMock);
-
- tso.addCheckResult(new CheckResult(CheckId.C_GE_P_HOLE_OUTSIDE, ResultStatus.ERROR, mock(CheckError.class)));
- List errors = new ArrayList<>();
- tso.collectContainedErrors(errors);
- assertEquals(1, errors.size());
-
- verify(taMock).collectContainedErrors(errors);
- }
-
- @Test
- public void testCollectContainedErrorsTrafficArea() {
- TrafficAreaObject tao = new TrafficAreaObject(TrafficAreaObject.TrafficAreaType.TRAFFIC_AREA);
- TrafficArea taMock = mock(TrafficArea.class);
- tao.setGmlObject(taMock);
-
- tao.addCheckResult(new CheckResult(CheckId.C_GE_P_HOLE_OUTSIDE, ResultStatus.ERROR, mock(CheckError.class)));
- List errors = new ArrayList<>();
- tao.collectContainedErrors(errors);
- assertEquals(1, errors.size());
- }
-
- @Test
- public void testUnsetGmlGeometriesTransportationSpace() {
- Road r = mock(Road.class);
- TopLevelTransportFeature top = TopLevelTransportFeature.from(r);
- top.setGmlObject(r);
- TransportSection mockSection = mock(TransportSection.class);
- TransportSection mockInterestSection = mock(TransportSection.class);
- TrafficSpaceObject mockSpace = mock(TrafficSpaceObject.class);
- TrafficSpaceObject auxMockSpace = mock(TrafficSpaceObject.class);
-
- top.addSection(mockSection);
- top.addIntersection(mockInterestSection);
- top.addTrafficSpace(mockSpace);
- top.addAuxTrafficSpace(auxMockSpace);
-
- DeprecatedPropertiesOfAbstractTransportationSpace dSpace = mock(DeprecatedPropertiesOfAbstractTransportationSpace.class);
- when(r.getDeprecatedProperties()).thenReturn(dSpace);
-
- dSpace.setLod1MultiSurface(mock(MultiSurfaceProperty.class));
- r.setLod2MultiSurface(mock(MultiSurfaceProperty.class));
- r.setLod3MultiSurface(mock(MultiSurfaceProperty.class));
- dSpace.setLod4MultiSurface(mock(MultiSurfaceProperty.class));
-
- top.unsetGmlGeometries();
- assertNull(dSpace.getLod1MultiSurface());
- assertNull(r.getLod2MultiSurface());
- assertNull(r.getLod3MultiSurface());
- assertNull(dSpace.getLod4MultiSurface());
-
- verify(mockSection).unsetGmlGeometries();
- verify(mockInterestSection).unsetGmlGeometries();
- verify(mockSpace).unsetGmlGeometries();
- verify(auxMockSpace).unsetGmlGeometries();
-
- }
-
- @Test
- public void testUnsetGmlGeometriesTrafficSpace() {
- TrafficSpaceObject tso = new TrafficSpaceObject(TrafficSpaceObject.TrafficSpaceType.TRAFFIC_SPACE);
- TrafficSpace t = mock(TrafficSpace.class);
- tso.setGmlObject(t);
- TrafficAreaObject mockArea = mock(TrafficAreaObject.class);
-
- tso.addTrafficArea(mockArea);
-
- DeprecatedPropertiesOfAbstractCityObject dSpace = mock(DeprecatedPropertiesOfAbstractCityObject.class);
- when(t.getDeprecatedProperties()).thenReturn(dSpace);
-
- t.setLod0MultiSurface(mock(MultiSurfaceProperty.class));
- t.setLod2MultiSurface(mock(MultiSurfaceProperty.class));
- t.setLod3MultiSurface(mock(MultiSurfaceProperty.class));
-
- tso.unsetGmlGeometries();
- assertNull(t.getLod0MultiSurface());
- assertNull(t.getLod2MultiSurface());
- assertNull(t.getLod3MultiSurface());
-
- verify(mockArea).unsetGmlGeometries();
-
- }
-
- @Test
- public void testUnsetGmlGeometriesTrafficArea() {
- TrafficAreaObject ta = new TrafficAreaObject(TrafficAreaObject.TrafficAreaType.TRAFFIC_AREA);
- TrafficArea r = mock(TrafficArea.class);
- ta.setGmlObject(r);
- DeprecatedPropertiesOfAbstractThematicSurface dSpace = mock(DeprecatedPropertiesOfAbstractThematicSurface.class);
- when(r.getDeprecatedProperties()).thenReturn(dSpace);
-
- r.setLod0MultiSurface(mock(MultiSurfaceProperty.class));
- r.setLod1MultiSurface(mock(MultiSurfaceProperty.class));
- r.setLod2MultiSurface(mock(MultiSurfaceProperty.class));
- r.setLod3MultiSurface(mock(MultiSurfaceProperty.class));
- dSpace.setLod4MultiSurface(mock(MultiSurfaceProperty.class));
-
- ta.unsetGmlGeometries();
- assertNull(r.getLod0MultiSurface());
- assertNull(r.getLod1MultiSurface());
- assertNull(r.getLod2MultiSurface());
- assertNull(r.getLod3MultiSurface());
- assertNull(dSpace.getLod4MultiSurface());
- }
}
diff --git a/CityDoctorParent/CityDoctorModel/src/test/java/de/hft/stuttgart/citydoctor2/datastructure/TransportationSpaceTest.java b/CityDoctorParent/CityDoctorModel/src/test/java/de/hft/stuttgart/citydoctor2/datastructure/TransportationSpaceTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..e30557c26b54d64880dc3a7ba2dcf0b0d600fbdc
--- /dev/null
+++ b/CityDoctorParent/CityDoctorModel/src/test/java/de/hft/stuttgart/citydoctor2/datastructure/TransportationSpaceTest.java
@@ -0,0 +1,151 @@
+package de.hft.stuttgart.citydoctor2.datastructure;
+
+import de.hft.stuttgart.citydoctor2.check.AbstractCheck;
+import de.hft.stuttgart.citydoctor2.check.CheckError;
+import de.hft.stuttgart.citydoctor2.check.CheckId;
+import de.hft.stuttgart.citydoctor2.check.CheckResult;
+import de.hft.stuttgart.citydoctor2.check.ResultStatus;
+import de.hft.stuttgart.citydoctor2.parser.ParserConfiguration;
+import org.citygml4j.core.model.transportation.AbstractTransportationSpace;
+import org.citygml4j.core.util.geometry.GeometryFactory;
+import org.citygml4j.core.visitor.ObjectVisitor;
+import org.junit.Test;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+
+public class TransportationSpaceTest {
+
+ @Test
+ public void testVisitorPropagation() {
+ TransportationSpace space = new TransportationSpace(TransportationObject.TransportationType.TRANSPORTATION_COMPLEX) {
+ };
+ TrafficSpaceObject mockSpace = mock(TrafficSpaceObject.class);
+ TrafficSpaceObject auxMockSpace = mock(TrafficSpaceObject.class);
+ space.addTrafficSpace(mockSpace);
+ space.addAuxTrafficSpace(auxMockSpace);
+
+ AbstractCheck c = new AbstractCheck() {
+ };
+ space.accept(c);
+
+ verify(mockSpace).accept(c);
+ verify(auxMockSpace).accept(c);
+ }
+
+ @Test
+ public void testContainsError() {
+ TransportationSpace space = new TransportationSpace(TransportationObject.TransportationType.TRANSPORTATION_COMPLEX) {
+ };
+
+ space.addCheckResult(new CheckResult(CheckId.C_GE_P_HOLE_OUTSIDE, ResultStatus.ERROR, mock(CheckError.class)));
+ assertTrue(space.containsError(CheckId.C_GE_P_HOLE_OUTSIDE));
+ assertFalse(space.containsError(CheckId.C_GE_P_INNER_RINGS_NESTED));
+
+ }
+
+ @Test
+ public void testContainsAnyError() {
+ TransportationSpace space = new TransportationSpace(TransportationObject.TransportationType.TRANSPORTATION_COMPLEX) {
+ };
+ assertFalse(space.containsAnyError());
+ space.addCheckResult(new CheckResult(CheckId.C_GE_P_HOLE_OUTSIDE, ResultStatus.OK, null));
+ assertFalse(space.containsAnyError());
+ space.addCheckResult(
+ new CheckResult(CheckId.C_GE_P_INNER_RINGS_NESTED, ResultStatus.ERROR, mock(CheckError.class)));
+ assertTrue(space.containsAnyError());
+ }
+
+ @Test
+ public void testCollectContainedErrors() {
+ TransportationSpace space = new TransportationSpace(TransportationObject.TransportationType.TRANSPORTATION_COMPLEX) {
+ };
+
+ space.addCheckResult(new CheckResult(CheckId.C_GE_P_HOLE_OUTSIDE, ResultStatus.ERROR, mock(CheckError.class)));
+ List errors = new ArrayList<>();
+ space.collectContainedErrors(errors);
+ assertEquals(1, errors.size());
+
+ }
+
+ @Test
+ public void testClearAllContainedCheckResults() {
+ TransportationSpace space = new TransportationSpace(TransportationObject.TransportationType.TRANSPORTATION_COMPLEX) {
+ };
+
+ assertFalse(space.containsError(CheckId.C_GE_P_HOLE_OUTSIDE));
+ space.addCheckResult(new CheckResult(CheckId.C_GE_P_HOLE_OUTSIDE, ResultStatus.ERROR, mock(CheckError.class)));
+ assertTrue(space.containsError(CheckId.C_GE_P_HOLE_OUTSIDE));
+ space.clearAllContainedCheckResults();
+ assertFalse(space.containsError(CheckId.C_GE_P_HOLE_OUTSIDE));
+
+ }
+
+
+ @Test
+ public void testReCreateGeometriesSolid() {
+ AbstractTransportationSpace gmlAts = new AbstractTransportationSpace() {
+ @Override
+ public void accept(ObjectVisitor visitor) {
+
+ }
+ };
+ TransportationSpace space = new TransportationSpace(TransportationObject.TransportationType.TRANSPORTATION_COMPLEX) {
+ };
+ space.setGmlObject(gmlAts);
+
+ space.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.SOLID, Lod.LOD1));
+ space.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.SOLID, Lod.LOD2));
+ space.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.SOLID, Lod.LOD3));
+
+ GeometryFactory factory = GeometryFactory.newInstance();
+ ParserConfiguration config = new ParserConfiguration(8, false);
+ space.reCreateGeometries(factory, config);
+
+ GeometryTestUtils.assertSolidMatchesExpectedValues(gmlAts.getLod1Solid().getObject());
+ GeometryTestUtils.assertSolidMatchesExpectedValues(gmlAts.getLod2Solid().getObject());
+ GeometryTestUtils.assertSolidMatchesExpectedValues(gmlAts.getLod3Solid().getObject());
+
+ }
+
+ @Test
+ public void testReCreateGeometriesMultiSurface() {
+ AbstractTransportationSpace gmlAts = new AbstractTransportationSpace() {
+ @Override
+ public void accept(ObjectVisitor visitor) {
+
+ }
+ };
+ TransportationSpace space = new TransportationSpace(TransportationObject.TransportationType.TRANSPORTATION_COMPLEX) {
+ };
+ space.setGmlObject(gmlAts);
+
+ space.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.MULTI_SURFACE, Lod.LOD0));
+ space.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.MULTI_SURFACE, Lod.LOD1));
+ space.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.MULTI_SURFACE, Lod.LOD2));
+ space.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.MULTI_SURFACE, Lod.LOD3));
+ space.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.MULTI_SURFACE, Lod.LOD4));
+
+ GeometryFactory factory = GeometryFactory.newInstance();
+ ParserConfiguration config = new ParserConfiguration(8, false);
+ space.reCreateGeometries(factory, config);
+
+ assertNotNull(gmlAts.getLod0MultiSurface());
+ assertNotNull(gmlAts.getLod0MultiSurface().getObject());
+ assertNotNull(gmlAts.getDeprecatedProperties().getLod1MultiSurface());
+ assertNotNull(gmlAts.getDeprecatedProperties().getLod1MultiSurface().getObject());
+ assertNotNull(gmlAts.getLod2MultiSurface());
+ assertNotNull(gmlAts.getLod2MultiSurface().getObject());
+ assertNotNull(gmlAts.getLod3MultiSurface());
+ assertNotNull(gmlAts.getLod3MultiSurface().getObject());
+ assertNotNull(gmlAts.getDeprecatedProperties().getLod4MultiSurface());
+ assertNotNull(gmlAts.getDeprecatedProperties().getLod4MultiSurface().getObject());
+ }
+}
diff --git a/CityDoctorParent/CityDoctorModel/src/test/java/de/hft/stuttgart/citydoctor2/datastructure/VegetationTest.java b/CityDoctorParent/CityDoctorModel/src/test/java/de/hft/stuttgart/citydoctor2/datastructure/VegetationTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..5f9c97a3f29f5bb6dd70e7ed4cdb3df3c51dd964
--- /dev/null
+++ b/CityDoctorParent/CityDoctorModel/src/test/java/de/hft/stuttgart/citydoctor2/datastructure/VegetationTest.java
@@ -0,0 +1,233 @@
+package de.hft.stuttgart.citydoctor2.datastructure;
+
+import de.hft.stuttgart.citydoctor2.check.CheckError;
+import de.hft.stuttgart.citydoctor2.check.CheckId;
+import de.hft.stuttgart.citydoctor2.check.CheckResult;
+import de.hft.stuttgart.citydoctor2.check.ResultStatus;
+import de.hft.stuttgart.citydoctor2.parser.ParserConfiguration;
+import org.citygml4j.core.model.vegetation.PlantCover;
+import org.citygml4j.core.model.vegetation.SolitaryVegetationObject;
+import org.citygml4j.core.util.geometry.GeometryFactory;
+import org.junit.Test;
+import org.xmlobjects.gml.model.geometry.GeometryProperty;
+import org.xmlobjects.gml.model.geometry.aggregates.MultiSolidProperty;
+import org.xmlobjects.gml.model.geometry.aggregates.MultiSurfaceProperty;
+import org.xmlobjects.gml.model.geometry.primitives.SolidProperty;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.Mockito.mock;
+
+public class VegetationTest {
+
+ //TODO: Recreate geometries tests
+
+ @Test
+ public void testContainsError() {
+ Vegetation veg = new Vegetation(Vegetation.VegetationType.PLANT_COVER);
+
+ veg.addCheckResult(new CheckResult(CheckId.C_GE_P_HOLE_OUTSIDE, ResultStatus.ERROR, mock(CheckError.class)));
+ assertTrue(veg.containsError(CheckId.C_GE_P_HOLE_OUTSIDE));
+ assertFalse(veg.containsError(CheckId.C_GE_P_INNER_RINGS_NESTED));
+ }
+
+ @Test
+ public void testContainsAnyError() {
+ Vegetation veg = new Vegetation(Vegetation.VegetationType.PLANT_COVER);
+
+ assertFalse(veg.containsAnyError());
+ veg.addCheckResult(new CheckResult(CheckId.C_GE_P_HOLE_OUTSIDE, ResultStatus.OK, null));
+ assertFalse(veg.containsAnyError());
+ veg.addCheckResult(
+ new CheckResult(CheckId.C_GE_P_INNER_RINGS_NESTED, ResultStatus.ERROR, mock(CheckError.class)));
+ assertTrue(veg.containsAnyError());
+ }
+
+ @Test
+ public void testClearAllContainedCheckResults() {
+ Vegetation veg = new Vegetation(Vegetation.VegetationType.PLANT_COVER);
+
+ assertFalse(veg.containsError(CheckId.C_GE_P_HOLE_OUTSIDE));
+ veg.addCheckResult(new CheckResult(CheckId.C_GE_P_HOLE_OUTSIDE, ResultStatus.ERROR, mock(CheckError.class)));
+ assertTrue(veg.containsError(CheckId.C_GE_P_HOLE_OUTSIDE));
+ veg.clearAllContainedCheckResults();
+ assertFalse(veg.containsError(CheckId.C_GE_P_HOLE_OUTSIDE));
+
+ }
+
+ @Test
+ public void testCollectContainedErrors() {
+ Vegetation veg = new Vegetation(Vegetation.VegetationType.PLANT_COVER);
+
+ veg.addCheckResult(new CheckResult(CheckId.C_GE_P_HOLE_OUTSIDE, ResultStatus.ERROR, mock(CheckError.class)));
+ List errors = new ArrayList<>();
+ veg.collectContainedErrors(errors);
+ assertEquals(1, errors.size());
+ }
+
+
+ @Test
+ public void testUnsetGmlGeometriesPlantCover() {
+ Vegetation plantCover = new Vegetation(Vegetation.VegetationType.PLANT_COVER);
+ PlantCover gmlCover = new PlantCover();
+ plantCover.setGmlObject(gmlCover);
+
+ gmlCover.setLod0MultiSurface(new MultiSurfaceProperty());
+ gmlCover.getDeprecatedProperties().setLod1MultiSurface(new MultiSurfaceProperty());
+ gmlCover.setLod2MultiSurface(new MultiSurfaceProperty());
+ gmlCover.setLod3MultiSurface(new MultiSurfaceProperty());
+ gmlCover.getDeprecatedProperties().setLod4MultiSurface(new MultiSurfaceProperty());
+ gmlCover.setLod1Solid(new SolidProperty());
+ gmlCover.setLod2Solid(new SolidProperty());
+ gmlCover.setLod3Solid(new SolidProperty());
+ gmlCover.getDeprecatedProperties().setLod1MultiSolid(new MultiSolidProperty());
+ gmlCover.getDeprecatedProperties().setLod2MultiSolid(new MultiSolidProperty());
+ gmlCover.getDeprecatedProperties().setLod3MultiSolid(new MultiSolidProperty());
+ gmlCover.getDeprecatedProperties().setLod4MultiSolid(new MultiSolidProperty());
+
+ plantCover.clearGmlGeometries();
+
+ assertNull(gmlCover.getLod0MultiSurface());
+ assertNull(gmlCover.getDeprecatedProperties().getLod1MultiSurface());
+ assertNull(gmlCover.getLod2MultiSurface());
+ assertNull(gmlCover.getLod3MultiSurface());
+ assertNull(gmlCover.getDeprecatedProperties().getLod4MultiSurface());
+ assertNull(gmlCover.getLod1Solid());
+ assertNull(gmlCover.getLod2Solid());
+ assertNull(gmlCover.getLod3Solid());
+ assertNull(gmlCover.getDeprecatedProperties().getLod1MultiSolid());
+ assertNull(gmlCover.getDeprecatedProperties().getLod2MultiSolid());
+ assertNull(gmlCover.getDeprecatedProperties().getLod3MultiSolid());
+ assertNull(gmlCover.getDeprecatedProperties().getLod4MultiSolid());
+ }
+
+ @Test
+ public void testUnsetGmlGeometriesSolitaryVegetationObject() {
+ Vegetation solitary = new Vegetation(Vegetation.VegetationType.SOLITARY_VEGETATION_OBJECT);
+ SolitaryVegetationObject gmlSolitary = new SolitaryVegetationObject();
+ solitary.setGmlObject(gmlSolitary);
+
+ gmlSolitary.setLod0MultiSurface(new MultiSurfaceProperty());
+ gmlSolitary.setLod2MultiSurface(new MultiSurfaceProperty());
+ gmlSolitary.setLod3MultiSurface(new MultiSurfaceProperty());
+ gmlSolitary.setLod1Solid(new SolidProperty());
+ gmlSolitary.setLod2Solid(new SolidProperty());
+ gmlSolitary.setLod3Solid(new SolidProperty());
+ gmlSolitary.getDeprecatedProperties().setLod1Geometry(new GeometryProperty<>());
+ gmlSolitary.getDeprecatedProperties().setLod2Geometry(new GeometryProperty<>());
+ gmlSolitary.getDeprecatedProperties().setLod3Geometry(new GeometryProperty<>());
+ gmlSolitary.getDeprecatedProperties().setLod4Geometry(new GeometryProperty<>());
+
+ solitary.clearGmlGeometries();
+
+ assertNull(gmlSolitary.getLod0MultiSurface());
+ assertNull(gmlSolitary.getLod2MultiSurface());
+ assertNull(gmlSolitary.getLod3MultiSurface());
+ assertNull(gmlSolitary.getLod1Solid());
+ assertNull(gmlSolitary.getLod2Solid());
+ assertNull(gmlSolitary.getLod3Solid());
+ assertNull(gmlSolitary.getDeprecatedProperties().getLod1Geometry());
+ assertNull(gmlSolitary.getDeprecatedProperties().getLod2Geometry());
+ assertNull(gmlSolitary.getDeprecatedProperties().getLod3Geometry());
+ assertNull(gmlSolitary.getDeprecatedProperties().getLod4Geometry());
+ }
+
+ @Test
+ public void testReCreateGeometriesSolidPlantCover() {
+ PlantCover gmlPC = new PlantCover();
+ Vegetation veg = new Vegetation(Vegetation.VegetationType.PLANT_COVER);
+ veg.setGmlObject(gmlPC);
+
+ veg.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.SOLID, Lod.LOD1));
+ veg.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.SOLID, Lod.LOD2));
+ veg.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.SOLID, Lod.LOD3));
+
+ GeometryFactory factory = GeometryFactory.newInstance();
+ ParserConfiguration config = new ParserConfiguration(8, false);
+ veg.reCreateGeometries(factory, config);
+ GeometryTestUtils.assertSolidMatchesExpectedValues(gmlPC.getLod1Solid().getObject());
+ GeometryTestUtils.assertSolidMatchesExpectedValues(gmlPC.getLod2Solid().getObject());
+ GeometryTestUtils.assertSolidMatchesExpectedValues(gmlPC.getLod3Solid().getObject());
+ }
+
+ @Test
+ public void testReCreateGeometriesMultiSurfacePlantCover() {
+ PlantCover gmlPC = new PlantCover();
+ Vegetation veg = new Vegetation(Vegetation.VegetationType.PLANT_COVER);
+ veg.setGmlObject(gmlPC);
+
+ veg.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.MULTI_SURFACE, Lod.LOD0));
+ veg.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.MULTI_SURFACE, Lod.LOD1));
+ veg.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.MULTI_SURFACE, Lod.LOD2));
+ veg.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.MULTI_SURFACE, Lod.LOD3));
+ veg.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.MULTI_SURFACE, Lod.LOD4));
+
+ GeometryFactory factory = GeometryFactory.newInstance();
+ ParserConfiguration config = new ParserConfiguration(8, false);
+ veg.reCreateGeometries(factory, config);
+
+ assertNotNull(gmlPC.getLod0MultiSurface());
+ assertNotNull(gmlPC.getLod0MultiSurface().getObject());
+ assertNotNull(gmlPC.getDeprecatedProperties().getLod1MultiSurface());
+ assertNotNull(gmlPC.getDeprecatedProperties().getLod1MultiSurface().getObject());
+ assertNotNull(gmlPC.getLod2MultiSurface());
+ assertNotNull(gmlPC.getLod2MultiSurface().getObject());
+ assertNotNull(gmlPC.getLod3MultiSurface());
+ assertNotNull(gmlPC.getLod3MultiSurface().getObject());
+ assertNotNull(gmlPC.getDeprecatedProperties().getLod4MultiSurface());
+ assertNotNull(gmlPC.getDeprecatedProperties().getLod4MultiSurface().getObject());
+ }
+
+ @Test
+ public void testReCreateGeometriesSolidSolitaryVegetationObject() {
+ SolitaryVegetationObject gmlPC = new SolitaryVegetationObject();
+ Vegetation veg = new Vegetation(Vegetation.VegetationType.SOLITARY_VEGETATION_OBJECT);
+ veg.setGmlObject(gmlPC);
+
+ veg.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.SOLID, Lod.LOD1));
+ veg.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.SOLID, Lod.LOD2));
+ veg.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.SOLID, Lod.LOD3));
+
+ GeometryFactory factory = GeometryFactory.newInstance();
+ ParserConfiguration config = new ParserConfiguration(8, false);
+ veg.reCreateGeometries(factory, config);
+ GeometryTestUtils.assertSolidMatchesExpectedValues(gmlPC.getLod1Solid().getObject());
+ GeometryTestUtils.assertSolidMatchesExpectedValues(gmlPC.getLod2Solid().getObject());
+ GeometryTestUtils.assertSolidMatchesExpectedValues(gmlPC.getLod3Solid().getObject());
+ }
+
+ @Test
+ public void testReCreateGeometriesMultiSurfaceSolitaryVegetationObject() {
+ SolitaryVegetationObject gmlPC = new SolitaryVegetationObject();
+ Vegetation veg = new Vegetation(Vegetation.VegetationType.SOLITARY_VEGETATION_OBJECT);
+ veg.setGmlObject(gmlPC);
+
+ veg.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.MULTI_SURFACE, Lod.LOD0));
+ veg.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.MULTI_SURFACE, Lod.LOD1));
+ veg.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.MULTI_SURFACE, Lod.LOD2));
+ veg.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.MULTI_SURFACE, Lod.LOD3));
+ veg.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.MULTI_SURFACE, Lod.LOD4));
+
+ GeometryFactory factory = GeometryFactory.newInstance();
+ ParserConfiguration config = new ParserConfiguration(8, false);
+ veg.reCreateGeometries(factory, config);
+
+ assertNotNull(gmlPC.getLod0MultiSurface());
+ assertNotNull(gmlPC.getLod0MultiSurface().getObject());
+ assertNotNull(gmlPC.getDeprecatedProperties().getLod1Geometry());
+ assertNotNull(gmlPC.getDeprecatedProperties().getLod1Geometry().getObject());
+ assertNotNull(gmlPC.getLod2MultiSurface());
+ assertNotNull(gmlPC.getLod2MultiSurface().getObject());
+ assertNotNull(gmlPC.getLod3MultiSurface());
+ assertNotNull(gmlPC.getLod3MultiSurface().getObject());
+ assertNotNull(gmlPC.getDeprecatedProperties().getLod4Geometry());
+ assertNotNull(gmlPC.getDeprecatedProperties().getLod4Geometry().getObject());
+ }
+
+}
diff --git a/CityDoctorParent/CityDoctorModel/src/test/java/de/hft/stuttgart/citydoctor2/datastructure/WaterTest.java b/CityDoctorParent/CityDoctorModel/src/test/java/de/hft/stuttgart/citydoctor2/datastructure/WaterTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..b028922870fc2224361d6752f89bbdd3ea0a2904
--- /dev/null
+++ b/CityDoctorParent/CityDoctorModel/src/test/java/de/hft/stuttgart/citydoctor2/datastructure/WaterTest.java
@@ -0,0 +1,161 @@
+package de.hft.stuttgart.citydoctor2.datastructure;
+
+import de.hft.stuttgart.citydoctor2.check.AbstractCheck;
+import de.hft.stuttgart.citydoctor2.check.CheckError;
+import de.hft.stuttgart.citydoctor2.check.CheckId;
+import de.hft.stuttgart.citydoctor2.check.CheckResult;
+import de.hft.stuttgart.citydoctor2.check.ResultStatus;
+import de.hft.stuttgart.citydoctor2.parser.ParserConfiguration;
+import org.citygml4j.core.model.waterbody.WaterBody;
+import org.citygml4j.core.util.geometry.GeometryFactory;
+import org.junit.Test;
+import org.xmlobjects.gml.model.geometry.aggregates.MultiSurfaceProperty;
+import org.xmlobjects.gml.model.geometry.primitives.SolidProperty;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+
+public class WaterTest {
+
+ @Test
+ public void testVisitorPropagation() {
+ WaterObject water = new WaterObject();
+ BoundarySurface bsMock = mock(BoundarySurface.class);
+ BoundarySurface bsMock2 = mock(BoundarySurface.class);
+ water.addBoundarySurface(bsMock);
+ water.addBoundarySurface(bsMock2);
+
+ AbstractCheck c = new AbstractCheck() {
+ };
+ water.accept(c);
+
+ verify(bsMock).accept(c);
+ verify(bsMock2).accept(c);
+ }
+
+ @Test
+ public void testContainsError() {
+ WaterObject water = new WaterObject();
+
+ water.addCheckResult(new CheckResult(CheckId.C_GE_P_HOLE_OUTSIDE, ResultStatus.ERROR, mock(CheckError.class)));
+ assertTrue(water.containsError(CheckId.C_GE_P_HOLE_OUTSIDE));
+ assertFalse(water.containsError(CheckId.C_GE_P_INNER_RINGS_NESTED));
+ }
+
+ @Test
+ public void testContainsAnyError() {
+ WaterObject water = new WaterObject();
+
+ assertFalse(water.containsAnyError());
+ water.addCheckResult(new CheckResult(CheckId.C_GE_P_HOLE_OUTSIDE, ResultStatus.OK, null));
+ assertFalse(water.containsAnyError());
+ water.addCheckResult(
+ new CheckResult(CheckId.C_GE_P_INNER_RINGS_NESTED, ResultStatus.ERROR, mock(CheckError.class)));
+ assertTrue(water.containsAnyError());
+ }
+
+ @Test
+ public void testClearAllContainedCheckResults() {
+ WaterObject water = new WaterObject();
+
+ assertFalse(water.containsError(CheckId.C_GE_P_HOLE_OUTSIDE));
+ water.addCheckResult(new CheckResult(CheckId.C_GE_P_HOLE_OUTSIDE, ResultStatus.ERROR, mock(CheckError.class)));
+ assertTrue(water.containsError(CheckId.C_GE_P_HOLE_OUTSIDE));
+ water.clearAllContainedCheckResults();
+ assertFalse(water.containsError(CheckId.C_GE_P_HOLE_OUTSIDE));
+
+ }
+
+ @Test
+ public void testCollectContainedErrors() {
+ WaterObject water = new WaterObject();
+
+ water.addCheckResult(new CheckResult(CheckId.C_GE_P_HOLE_OUTSIDE, ResultStatus.ERROR, mock(CheckError.class)));
+ List errors = new ArrayList<>();
+ water.collectContainedErrors(errors);
+ assertEquals(1, errors.size());
+ }
+
+
+ @Test
+ public void testUnsetGmlGeometries() {
+ WaterObject water = new WaterObject();
+ WaterBody gmlWater = new WaterBody();
+ water.setGmlObject(gmlWater);
+
+ gmlWater.setLod0MultiSurface(new MultiSurfaceProperty());
+ gmlWater.getDeprecatedProperties().setLod1MultiSurface(new MultiSurfaceProperty());
+ gmlWater.setLod2MultiSurface(new MultiSurfaceProperty());
+ gmlWater.setLod3MultiSurface(new MultiSurfaceProperty());
+ gmlWater.setLod1Solid(new SolidProperty());
+ gmlWater.setLod2Solid(new SolidProperty());
+ gmlWater.setLod3Solid(new SolidProperty());
+ gmlWater.getDeprecatedProperties().setLod4Solid(new SolidProperty());
+
+ water.clearGmlGeometries();
+
+ assertNull(gmlWater.getLod0MultiSurface());
+ assertNull(gmlWater.getDeprecatedProperties().getLod1MultiSurface());
+ assertNull(gmlWater.getLod2MultiSurface());
+ assertNull(gmlWater.getLod3MultiSurface());
+ assertNull(gmlWater.getLod1Solid());
+ assertNull(gmlWater.getLod2Solid());
+ assertNull(gmlWater.getLod3Solid());
+ assertNull(gmlWater.getDeprecatedProperties().getLod4Solid());
+ }
+
+
+ @Test
+ public void testReCreateGeometriesSolid() {
+ WaterBody gmlWater = new WaterBody();
+ WaterObject water = new WaterObject();
+
+ water.setGmlObject(gmlWater);
+ water.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.SOLID, Lod.LOD1));
+ water.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.SOLID, Lod.LOD2));
+ water.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.SOLID, Lod.LOD3));
+ water.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.SOLID, Lod.LOD4));
+
+ GeometryFactory factory = GeometryFactory.newInstance();
+ ParserConfiguration config = new ParserConfiguration(8, false);
+ water.reCreateGeometries(factory, config);
+ GeometryTestUtils.assertSolidMatchesExpectedValues(gmlWater.getLod1Solid().getObject());
+ GeometryTestUtils.assertSolidMatchesExpectedValues(gmlWater.getLod2Solid().getObject());
+ GeometryTestUtils.assertSolidMatchesExpectedValues(gmlWater.getLod3Solid().getObject());
+ GeometryTestUtils.assertSolidMatchesExpectedValues(gmlWater.getDeprecatedProperties().getLod4Solid().getObject());
+ }
+
+ @Test
+ public void testReCreateGeometriesMultiSurface() {
+ WaterBody gmlWater = new WaterBody();
+ WaterObject water = new WaterObject();
+
+ water.setGmlObject(gmlWater);
+ water.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.MULTI_SURFACE, Lod.LOD0));
+ water.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.MULTI_SURFACE, Lod.LOD1));
+ water.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.MULTI_SURFACE, Lod.LOD2));
+ water.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.MULTI_SURFACE, Lod.LOD3));
+
+ GeometryFactory factory = GeometryFactory.newInstance();
+ ParserConfiguration config = new ParserConfiguration(8, false);
+ water.reCreateGeometries(factory, config);
+
+ assertNotNull(gmlWater.getLod0MultiSurface());
+ assertNotNull(gmlWater.getLod0MultiSurface().getObject());
+ assertNotNull(gmlWater.getDeprecatedProperties().getLod1MultiSurface());
+ assertNotNull(gmlWater.getDeprecatedProperties().getLod1MultiSurface().getObject());
+ assertNotNull(gmlWater.getLod2MultiSurface());
+ assertNotNull(gmlWater.getLod2MultiSurface().getObject());
+ assertNotNull(gmlWater.getLod3MultiSurface());
+ assertNotNull(gmlWater.getLod3MultiSurface().getObject());
+ }
+
+}
diff --git a/CityDoctorParent/CityDoctorValidation/pom.xml b/CityDoctorParent/CityDoctorValidation/pom.xml
index 73e05eb74c7b8058008b8fa567816ca676fef313..619937fffb44a1d5c946bfc7e9ac069f016266a2 100644
--- a/CityDoctorParent/CityDoctorValidation/pom.xml
+++ b/CityDoctorParent/CityDoctorValidation/pom.xml
@@ -4,7 +4,7 @@
de.hft.stuttgart
CityDoctorParent
- 3.17.1
+ 3.17.2
CityDoctorValidation
CityDoctorValidation
diff --git a/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/reporting/pdf/PdfStreamReporter.java b/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/reporting/pdf/PdfStreamReporter.java
index 45a5fc722f8c97ea4dd16bb40a118bb60a84cead..4214bc3295ed3f414f7808d5d6d8a075765e5f92 100644
--- a/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/reporting/pdf/PdfStreamReporter.java
+++ b/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/reporting/pdf/PdfStreamReporter.java
@@ -590,7 +590,7 @@ public class PdfStreamReporter implements StreamReporter {
for (Geometry geom : af.getGeometries()) {
writeCheckResultForGeometry(geom, root);
}
- for (BoundarySurface bs : af.getBoundarySurfaceList()) {
+ for (BoundarySurface bs : af.getBoundarySurfaces()) {
writeCheckResultForBoundarySurface(bs, root);
}
}
diff --git a/CityDoctorParent/CityDoctorValidation/src/test/java/de/hft/stuttgart/citydoctor2/checks/geometry/NullAreaCheckTest.java b/CityDoctorParent/CityDoctorValidation/src/test/java/de/hft/stuttgart/citydoctor2/checks/geometry/NullAreaCheckTest.java
index 2cc05198fd6ce27c9194f27c2448c1b4fe7f2276..ea5d367a3d9a707abd8999cf24f58fc2e1a965ca 100644
--- a/CityDoctorParent/CityDoctorValidation/src/test/java/de/hft/stuttgart/citydoctor2/checks/geometry/NullAreaCheckTest.java
+++ b/CityDoctorParent/CityDoctorValidation/src/test/java/de/hft/stuttgart/citydoctor2/checks/geometry/NullAreaCheckTest.java
@@ -90,7 +90,7 @@ public class NullAreaCheckTest {
LinearRing r = setupErrorGeometry();
NullAreaCheck nac = new NullAreaCheck();
nac.check(r);
- Assert.assertTrue(r.hasAnyError());
+ Assert.assertTrue(r.hasAnyErrorWithoutDependencies());
}
@@ -100,7 +100,7 @@ public class NullAreaCheckTest {
LinearRing r = setupValidGeometry();
NullAreaCheck nac = new NullAreaCheck();
nac.check(r);
- Assert.assertFalse(r.hasAnyError());
+ Assert.assertFalse(r.hasAnyErrorWithoutDependencies());
}
}
diff --git a/CityDoctorParent/Extensions/CityDoctorAutoPro/pom.xml b/CityDoctorParent/Extensions/CityDoctorAutoPro/pom.xml
index 17b943d12e27448071c4d139d1177b3f6c3f16f9..5a8882854f59dd20ebd5355fa68f30b8426f908d 100644
--- a/CityDoctorParent/Extensions/CityDoctorAutoPro/pom.xml
+++ b/CityDoctorParent/Extensions/CityDoctorAutoPro/pom.xml
@@ -6,7 +6,7 @@
de.hft.stuttgart
CityDoctorParent
- 3.17.1
+ 3.17.2
../../pom.xml
CityDoctorAutoPro
diff --git a/CityDoctorParent/Extensions/CityDoctorGUI/pom.xml b/CityDoctorParent/Extensions/CityDoctorGUI/pom.xml
index d1c839b5fa90557d16daf0f1a0ba1ba57564cd3f..8093a13373ecb71c3bc78e8b32870c2e96d62903 100644
--- a/CityDoctorParent/Extensions/CityDoctorGUI/pom.xml
+++ b/CityDoctorParent/Extensions/CityDoctorGUI/pom.xml
@@ -6,7 +6,7 @@
de.hft.stuttgart
CityDoctorParent
- 3.17.1
+ 3.17.2
../../pom.xml
CityDoctorGUI
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 d47aea6dd7444220c0ad85628ea91818433e799e..7c80b871b0e271c250cf89ca933f92f981e6c3b2 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
@@ -9,6 +9,11 @@ import de.hft.stuttgart.citydoctor2.datastructure.*;
import de.hft.stuttgart.citydoctor2.exceptions.CityDoctorWriteException;
import de.hft.stuttgart.citydoctor2.gui.table.ErrorStat;
import de.hft.stuttgart.citydoctor2.gui.tree.*;
+import de.hft.stuttgart.citydoctor2.gui.tree.node.CityObjectGroupNode;
+import de.hft.stuttgart.citydoctor2.gui.tree.node.CityObjectNode;
+import de.hft.stuttgart.citydoctor2.gui.tree.node.GeometryNode;
+import de.hft.stuttgart.citydoctor2.gui.tree.node.OpeningNode;
+import de.hft.stuttgart.citydoctor2.gui.tree.node.TopLevelCityObjectNode;
import de.hft.stuttgart.citydoctor2.mapper.citygml3.GMLValidationHandler;
import de.hft.stuttgart.citydoctor2.parser.*;
import de.hft.stuttgart.citydoctor2.utils.ArchivePacker;
@@ -24,6 +29,7 @@ import javafx.scene.control.ButtonType;
import javafx.scene.control.Dialog;
import javafx.scene.control.TreeItem;
import javafx.scene.control.TreeView;
+import javafx.scene.paint.Color;
import javafx.stage.FileChooser;
import javafx.stage.FileChooser.ExtensionFilter;
import org.apache.commons.io.FileUtils;
@@ -268,15 +274,15 @@ public class CityDoctorController {
public void buildTrees() {
resetFeatureChunks();
buildBuildings(model);
- buildVegetation(model.getVegetation());
- buildTransportation(model.getTransportation());
- buildTunnel(model.getTunnels());
+ buildVegetation(model);
+ buildTransportation(model);
+ buildTunnel(model);
buildBridges(model);
buildWater(model);
buildLand(model);
buildCityFurniture(model);
buildOtherCityObjects(model);
- buildTunnel(model.getTunnels());
+ buildTunnel(model);
}
private void resetFeatureChunks() {
@@ -296,7 +302,8 @@ public class CityDoctorController {
return;
}
TreeView landView = mainWindow.getTerrainView();
- TreeItem landRoot = new TreeItem<>(new AllTerrainNode(model.getLand()));
+ TreeItem landRoot = new TreeItem<>(new CityObjectGroupNode(model.getLand(), "Land",
+ Color.BROWN));
landRoot.setExpanded(true);
landView.setRoot(landRoot);
buildLandFromList(model.getLand(), landView.getRoot());
@@ -308,50 +315,26 @@ public class CityDoctorController {
for (int i = landChunk * MAX_FEATURES_PER_CHUNK; i < (landChunk + 1) * MAX_FEATURES_PER_CHUNK
&& i < list.size(); i++) {
CityObject land = list.get(i);
- Renderable node;
- if (land instanceof ReliefObject relief) {
- node = new ReliefNode(relief);
- } else if (land instanceof TinObject tin) {
- node = new TinNode(tin);
- } else {
- node = new LandUseNode((LandObject) land);
- }
+ CityObjectNode node = new CityObjectNode(land);
TreeItem item = new TreeItem<>(node);
item.setExpanded(true);
root.getChildren().add(item);
createGeometryNodes(land, item);
- if (land instanceof ReliefObject relief) {
- createTinNodes(relief, item);
- }
- }
- }
- private void createTinNodes(ReliefObject relief, TreeItem item) {
- if (relief.getComponents().isEmpty()) {
- return;
- }
- AllTinNode allTinText = new AllTinNode(relief.getComponents());
- TreeItem allBpsTextItem = new TreeItem<>(allTinText);
- item.getChildren().add(allBpsTextItem);
-
- for (TinObject tin : relief.getComponents()) {
- TinNode tinNode = new TinNode(tin);
- TreeItem tinNodeItem = new TreeItem<>(tinNode);
- tinNodeItem.setExpanded(true);
- allBpsTextItem.getChildren().add(tinNodeItem);
- createGeometryNodes(tin, tinNodeItem);
}
}
+
private void buildCityFurniture(CityDoctorModel model) {
if (model.getCityFurniture().isEmpty()) {
return;
}
TreeView cityFurnitureView = mainWindow.getCityFurnitureView();
- TreeItem cityFurnitureRoot = new TreeItem<>(new AllCityFurnitureNode(model.getCityFurniture()));
+ TreeItem cityFurnitureRoot = new TreeItem<>(new CityObjectGroupNode(model.getCityFurniture(),
+ "City Furniture", Color.BLUEVIOLET));
cityFurnitureRoot.setExpanded(true);
cityFurnitureView.setRoot(cityFurnitureRoot);
- buildTreeFromList(model.getCityFurniture(), cityFurnitureView.getRoot(), cityFurnitureChunkNr);
+ buildCityFurnitureTreeFromList(model.getCityFurniture(), cityFurnitureView.getRoot());
addMoreButtonIfNecessary(model.getCityFurniture(), cityFurnitureView, cityFurnitureRoot, cityFurnitureChunkNr);
}
@@ -360,10 +343,11 @@ public class CityDoctorController {
return;
}
TreeView otherObjectsView = mainWindow.getGenericCityObjectView();
- TreeItem otherObjectsRoot = new TreeItem<>(new AllOtherObjectsNode(model.getGenericCityObjects()));
+ TreeItem otherObjectsRoot = new TreeItem<>(new CityObjectGroupNode(model.getGenericCityObjects(),
+ "Generic CityObjects", Color.DARKGRAY));
otherObjectsRoot.setExpanded(true);
otherObjectsView.setRoot(otherObjectsRoot);
- buildTreeFromList(model.getGenericCityObjects(), otherObjectsView.getRoot(), genericCityObjectsChunkNr);
+ buildGenericCityObjectTreeFromList(model.getGenericCityObjects(), otherObjectsView.getRoot());
addMoreButtonIfNecessary(model.getGenericCityObjects(), otherObjectsView, otherObjectsRoot, genericCityObjectsChunkNr);
}
@@ -372,10 +356,11 @@ public class CityDoctorController {
return;
}
TreeView waterView = mainWindow.getWaterView();
- TreeItem waterRoot = new TreeItem<>(new AllWaterNode(model.getWater()));
+ TreeItem waterRoot = new TreeItem<>(new CityObjectGroupNode(model.getWater(), "Water",
+ Color.LIGHTSKYBLUE));
waterRoot.setExpanded(true);
waterView.setRoot(waterRoot);
- buildTreeFromList(model.getWater(), waterView.getRoot(), waterChunkNr);
+ buildWaterTreeFromList(model.getWater(), waterRoot);
addMoreButtonIfNecessary(model.getWater(), waterView, waterRoot, waterChunkNr);
}
@@ -384,47 +369,51 @@ public class CityDoctorController {
return;
}
TreeView bridgeView = mainWindow.getBridgeView();
- TreeItem bridgeRoot = new TreeItem<>(new AllBridgesNode(model.getBridges()));
+ TreeItem bridgeRoot = new TreeItem<>(new CityObjectGroupNode(model.getBridges(), "Bridges",
+ Color.CORAL));
bridgeRoot.setExpanded(true);
bridgeView.setRoot(bridgeRoot);
buildBridgeTreeFromList(model.getBridges(), bridgeView.getRoot());
addMoreButtonIfNecessary(model.getBridges(), bridgeView, bridgeRoot, bridgeChunkNr);
}
- private void buildTransportation(List trans) {
- if (trans.isEmpty()) {
+ private void buildTransportation(CityDoctorModel model) {
+ if (model.getTransportation().isEmpty()) {
return;
}
TreeView transView = mainWindow.getTransportationView();
- TreeItem transRoot = new TreeItem<>(new AllTransportationNode(model.getTransportation()));
+ TreeItem transRoot = new TreeItem<>(new CityObjectGroupNode(model.getTransportation(),
+ "Transportation", Color.YELLOW));
transRoot.setExpanded(true);
transView.setRoot(transRoot);
- buildTransportationTreeFromList(trans, transView.getRoot());
- addMoreButtonIfNecessary(trans, transView, transRoot, transportationChunkNr);
+ buildTransportationTreeFromList(model.getTransportation(), transView.getRoot());
+ addMoreButtonIfNecessary(model.getTransportation(), transView, transRoot, transportationChunkNr);
}
- private void buildTunnel(List tunnels) {
- if (tunnels.isEmpty()) {
+ private void buildTunnel(CityDoctorModel model) {
+ if (model.getTunnels().isEmpty()) {
return;
}
- TreeView transView = mainWindow.getTunnelView();
- TreeItem transRoot = new TreeItem<>(new AllTunnelsNode(model.getTunnels()));
- transRoot.setExpanded(true);
- transView.setRoot(transRoot);
- buildTreeFromList(tunnels, transView.getRoot(), tunnelChunkNr);
- addMoreButtonIfNecessary(tunnels, transView, transRoot, tunnelChunkNr);
+ TreeView tunnelView = mainWindow.getTunnelView();
+ TreeItem tunnelRoot = new TreeItem<>(new CityObjectGroupNode(model.getTunnels(), "Tunnel",
+ Color.SLATEGRAY));
+ tunnelRoot.setExpanded(true);
+ tunnelView.setRoot(tunnelRoot);
+ buildTunnelTreeFromList(model.getTunnels(), tunnelRoot);
+ addMoreButtonIfNecessary(model.getTunnels(), tunnelView, tunnelRoot, tunnelChunkNr);
}
- private void buildVegetation(List veg) {
- if (veg.isEmpty()) {
+ private void buildVegetation(CityDoctorModel model) {
+ if (model.getVegetation().isEmpty()) {
return;
}
TreeView vegetationsView = mainWindow.getVegetationView();
- TreeItem vegRoot = new TreeItem<>(new AllVegetationNode(model.getVegetation()));
+ TreeItem vegRoot = new TreeItem<>(new CityObjectGroupNode(model.getVegetation(),
+ "Vegetation", Color.LIGHTGREEN));
vegRoot.setExpanded(true);
vegetationsView.setRoot(vegRoot);
- buildTreeFromListWithProducer(veg, vegetationsView.getRoot(), vegetationChunkNr, VegetationNode::new);
- addMoreButtonIfNecessary(veg, vegetationsView, vegRoot, vegetationChunkNr);
+ buildVegetationTreeFromList(model.getVegetation(), vegRoot);
+ addMoreButtonIfNecessary(model.getVegetation(), vegetationsView, vegRoot, vegetationChunkNr);
}
private void addMoreButtonIfNecessary(List extends CityObject> list, TreeView view,
@@ -439,6 +428,7 @@ public class CityDoctorController {
root.getChildren().remove(root.getChildren().size() - 1);
chunkCounter.incrementAndGet();
int visibleFeatures = countVisibleNodes(view);
+
buildTreeFromList(list, root, chunkCounter);
updateTree(root);
if (selectedIndex >= 0) {
@@ -460,11 +450,13 @@ public class CityDoctorController {
return;
}
TreeView buildingsView = mainWindow.getBuildingsView();
- TreeItem root = new TreeItem<>(new AllBuildingsNode(model.getBuildings()));
+ TreeItem root = new TreeItem<>(new CityObjectGroupNode(model.getBuildings(), "Buildings",
+ Color.WHITE));
root.setExpanded(true);
+ buildingsView.setRoot(root);
buildBuildingTreeFromList(model.getBuildings(), root);
addMoreButtonToBuildingsIfNecessary(model.getBuildings(), buildingsView, root, buildingChunkNr);
- buildingsView.setRoot(root);
+
}
private void addMoreButtonToBuildingsIfNecessary(List list, TreeView view,
@@ -557,17 +549,46 @@ public class CityDoctorController {
mainWindow.getVertexView().getRoot().getChildren().clear();
}
+ private TreeItem buildTopLevelCityObjectNode(CityObject co, TreeItem root) {
+ return buildTopLevelCityObjectNode(co, root, Collections.emptyList());
+ }
+
+ private TreeItem buildTopLevelCityObjectNode(CityObject co, TreeItem root,
+ List surfaces) {
+ TopLevelCityObjectNode node = new TopLevelCityObjectNode(co);
+ TreeItem nodeItem = new TreeItem<>(node);
+ nodeItem.setExpanded(true);
+ root.getChildren().add(nodeItem);
+ createGeometryNodes(co, nodeItem);
+ if (!surfaces.isEmpty()) {
+ createBoundarySurfaceNodes(surfaces, nodeItem);
+ }
+ return nodeItem;
+ }
+
+ private TreeItem buildCityObjectNode(CityObject co, TreeItem root) {
+ return buildCityObjectNode(co, root, Collections.emptyList());
+ }
+
+ private TreeItem buildCityObjectNode(CityObject co, TreeItem root, List surfaces) {
+ CityObjectNode node = new CityObjectNode(co);
+ TreeItem nodeItem = new TreeItem<>(node);
+ nodeItem.setExpanded(false);
+ root.getChildren().add(nodeItem);
+ createGeometryNodes(co, nodeItem);
+ if (!surfaces.isEmpty()) {
+ createBoundarySurfaceNodes(surfaces, nodeItem);
+ }
+ return nodeItem;
+ }
+
private void buildBuildingTreeFromList(List list, TreeItem root) {
int buildingChunk = buildingChunkNr.get();
for (int i = buildingChunk * MAX_FEATURES_PER_CHUNK; i < (buildingChunk + 1) * MAX_FEATURES_PER_CHUNK
&& i < list.size(); i++) {
Building b = list.get(i);
- BuildingNode node = new BuildingNode(b);
- TreeItem item = new TreeItem<>(node);
- item.setExpanded(true);
- root.getChildren().add(item);
- createGeometryNodes(b, item);
- createBoundarySurfaceNodes(b.getBoundarySurfaces(), item);
+ TreeItem item = buildTopLevelCityObjectNode(b, root, b.getBoundarySurfaces());
+
createBuildingInstallationNodes(b, item);
createBuildingRoomNodes(b, item);
createBuildingFurnitureNodes(b, item);
@@ -582,12 +603,8 @@ public class CityDoctorController {
for (int i = bridgeChunk * MAX_FEATURES_PER_CHUNK; i < (bridgeChunk + 1) * MAX_FEATURES_PER_CHUNK
&& i < list.size(); i++) {
BridgeObject bridge = list.get(i);
- BridgeNode node = new BridgeNode(bridge);
- TreeItem item = new TreeItem<>(node);
- item.setExpanded(true);
- root.getChildren().add(item);
- createGeometryNodes(bridge, item);
- createBoundarySurfaceNodes(bridge.getBoundarySurfaces(), item);
+ TreeItem item = buildTopLevelCityObjectNode(bridge, root, bridge.getBoundarySurfaces());
+
createBridgeRoomNodes(bridge, item);
createBridgeInstallationNodes(bridge, item);
createBridgeFurnitureNodes(bridge, item);
@@ -602,11 +619,7 @@ public class CityDoctorController {
for (int i = transportChunk * MAX_FEATURES_PER_CHUNK; i < (transportChunk + 1) * MAX_FEATURES_PER_CHUNK
&& i < list.size(); i++) {
TransportationObject t = list.get(i);
- TransportationObjectNode node = new TransportationObjectNode(t);
- TreeItem item = new TreeItem<>(node);
- item.setExpanded(true);
- root.getChildren().add(item);
- createGeometryNodes(t, item);
+ TreeItem item = buildTopLevelCityObjectNode(t, root);
createTransportSectionNodes(t, item);
createTrafficSpacesNodes(t, item);
}
@@ -617,11 +630,7 @@ public class CityDoctorController {
for (int i = vegetationChunk * MAX_FEATURES_PER_CHUNK; i < (vegetationChunk + 1) * MAX_FEATURES_PER_CHUNK
&& i < list.size(); i++) {
Vegetation v = list.get(i);
- VegetationNode node = new VegetationNode(v);
- TreeItem item = new TreeItem<>(node);
- item.setExpanded(true);
- root.getChildren().add(item);
- createGeometryNodes(v, item);
+ buildTopLevelCityObjectNode(v, root);
}
}
@@ -630,11 +639,7 @@ public class CityDoctorController {
for (int i = waterChunk * MAX_FEATURES_PER_CHUNK; i < (waterChunk + 1) * MAX_FEATURES_PER_CHUNK
&& i < list.size(); i++) {
WaterObject w = list.get(i);
- CityObjectNode node = new CityObjectNode(w);
- TreeItem item = new TreeItem<>(node);
- item.setExpanded(true);
- root.getChildren().add(item);
- createGeometryNodes(w, item);
+ buildTopLevelCityObjectNode(w, root);
}
}
@@ -643,11 +648,7 @@ public class CityDoctorController {
for (int i = cityFurnChunk * MAX_FEATURES_PER_CHUNK; i < (cityFurnChunk + 1) * MAX_FEATURES_PER_CHUNK
&& i < list.size(); i++) {
CityFurniture cf = list.get(i);
- CityObjectNode node = new CityObjectNode(cf);
- TreeItem item = new TreeItem<>(node);
- item.setExpanded(true);
- root.getChildren().add(item);
- createGeometryNodes(cf, item);
+ buildTopLevelCityObjectNode(cf, root);
}
}
@@ -656,44 +657,32 @@ public class CityDoctorController {
for (int i = genericObjectChunk * MAX_FEATURES_PER_CHUNK; i < (genericObjectChunk + 1) * MAX_FEATURES_PER_CHUNK
&& i < list.size(); i++) {
GenericCityObject goc = list.get(i);
- CityObjectNode node = new CityObjectNode(goc);
- TreeItem item = new TreeItem<>(node);
- item.setExpanded(true);
- root.getChildren().add(item);
- createGeometryNodes(goc, item);
+ buildTopLevelCityObjectNode(goc, root);
}
}
private void createTransportSectionNodes(TransportationObject t, TreeItem root) {
if (t instanceof TopLevelTransportFeature top) {
if (!top.getSections().isEmpty()) {
- AllTransportSectionNode allSectionsNode = new AllTransportSectionNode(top.getSections(),
- TransportSection.SectionType.SECTION);
- TreeItem allSectionsNodeTextItem = new TreeItem<>(allSectionsNode);
- root.getChildren().add(allSectionsNodeTextItem);
+ CityObjectGroupNode sectionsGroupNode = new CityObjectGroupNode(top.getSections(),
+ "Sections", Color.YELLOW);
+ TreeItem sectionsGroupItem = new TreeItem<>(sectionsGroupNode);
+ root.getChildren().add(sectionsGroupItem);
for (TransportSection ts : top.getSections()) {
- TransportationObjectNode tsNode = new TransportationObjectNode(ts);
- TreeItem tsNodeItem = new TreeItem<>(tsNode);
- tsNodeItem.setExpanded(false);
- allSectionsNodeTextItem.getChildren().add(tsNodeItem);
- createGeometryNodes(ts, tsNodeItem);
+ TreeItem tsNodeItem = buildCityObjectNode(ts, sectionsGroupItem);
createTrafficSpacesNodes(ts, tsNodeItem);
}
}
if (!top.getIntersections().isEmpty()) {
- AllTransportSectionNode allIntersectionsNode = new AllTransportSectionNode(top.getIntersections(),
- TransportSection.SectionType.INTERSECTION);
- TreeItem allIntersectionsNodeTextItem = new TreeItem<>(allIntersectionsNode);
- root.getChildren().add(allIntersectionsNodeTextItem);
+ CityObjectGroupNode intersectionsGroupNode = new CityObjectGroupNode(top.getIntersections(),
+ "Intersections", Color.YELLOW);
+ TreeItem intersectionsGroupItem = new TreeItem<>(intersectionsGroupNode);
+ root.getChildren().add(intersectionsGroupItem);
for (TransportSection ts : top.getIntersections()) {
- TransportationObjectNode tsNode = new TransportationObjectNode(ts);
- TreeItem tsNodeItem = new TreeItem<>(tsNode);
- tsNodeItem.setExpanded(false);
- allIntersectionsNodeTextItem.getChildren().add(tsNodeItem);
- createGeometryNodes(ts, tsNodeItem);
+ TreeItem tsNodeItem = buildCityObjectNode(ts, intersectionsGroupItem);
createTrafficSpacesNodes(ts, tsNodeItem);
}
}
@@ -703,34 +692,26 @@ public class CityDoctorController {
private void createTrafficSpacesNodes(TransportationObject t, TreeItem root) {
if (t instanceof TransportationSpace space) {
if (!space.getTrafficSpaces().isEmpty()) {
- AllTrafficSpacesNode allTSNode = new AllTrafficSpacesNode(space.getTrafficSpaces(),
- TrafficSpaceObject.TrafficSpaceType.TRAFFIC_SPACE);
- TreeItem allTSNodeTextItem = new TreeItem<>(allTSNode);
- root.getChildren().add(allTSNodeTextItem);
- allTSNodeTextItem.setExpanded(true);
+ CityObjectGroupNode trafficSpacesGroupNode = new CityObjectGroupNode(space.getTrafficSpaces(),
+ "TRAFFIC_SPACE", Color.YELLOW);
+ TreeItem trafficSpacesGroupItem = new TreeItem<>(trafficSpacesGroupNode);
+ root.getChildren().add(trafficSpacesGroupItem);
+ trafficSpacesGroupItem.setExpanded(true);
for (TrafficSpaceObject tso : space.getTrafficSpaces()) {
- TransportationObjectNode tsoNode = new TransportationObjectNode(tso);
- TreeItem tsoNodeItem = new TreeItem<>(tsoNode);
- tsoNodeItem.setExpanded(false);
- allTSNodeTextItem.getChildren().add(tsoNodeItem);
- createGeometryNodes(tso, tsoNodeItem);
+ TreeItem tsoNodeItem = buildCityObjectNode(tso, trafficSpacesGroupItem);
createTrafficAreaNodes(tso, tsoNodeItem, TrafficAreaObject.TrafficAreaType.TRAFFIC_AREA);
}
}
if (!space.getAuxTrafficSpaces().isEmpty()) {
- AllTrafficSpacesNode allTSNode = new AllTrafficSpacesNode(space.getAuxTrafficSpaces(),
- TrafficSpaceObject.TrafficSpaceType.AUXILIARY_TRAFFIC_SPACE);
- TreeItem allTSNodeTextItem = new TreeItem<>(allTSNode);
- root.getChildren().add(allTSNodeTextItem);
- allTSNodeTextItem.setExpanded(true);
+ CityObjectGroupNode auxTrafficSpacesGroupNode = new CityObjectGroupNode(space.getAuxTrafficSpaces(),
+ "AUXILIARY_TRAFFIC_SPACE", Color.YELLOW);
+ TreeItem auxTrafficSpacesGroupItem = new TreeItem<>(auxTrafficSpacesGroupNode);
+ root.getChildren().add(auxTrafficSpacesGroupItem);
+ auxTrafficSpacesGroupItem.setExpanded(true);
for (TrafficSpaceObject atso : space.getAuxTrafficSpaces()) {
- TransportationObjectNode atsoNode = new TransportationObjectNode(atso);
- TreeItem atsoNodeItem = new TreeItem<>(atsoNode);
- atsoNodeItem.setExpanded(false);
- allTSNodeTextItem.getChildren().add(atsoNodeItem);
- createGeometryNodes(atso, atsoNodeItem);
+ TreeItem atsoNodeItem = buildCityObjectNode(atso, auxTrafficSpacesGroupItem);
createTrafficAreaNodes(atso, atsoNodeItem, TrafficAreaObject.TrafficAreaType.AUXILIARY_TRAFFIC_AREA);
}
}
@@ -739,16 +720,13 @@ public class CityDoctorController {
public void createTrafficAreaNodes(TransportationObject t, TreeItem root, TrafficAreaObject.TrafficAreaType type) {
if (t instanceof TrafficSpaceObject space && !space.getTrafficAreas().isEmpty()) {
- AllTrafficAreaNode allTANode = new AllTrafficAreaNode(space.getTrafficAreas(), type);
- TreeItem allTANodeTextItem = new TreeItem<>(allTANode);
- root.getChildren().add(allTANodeTextItem);
- allTANodeTextItem.setExpanded(true);
+ CityObjectGroupNode trafficAreaGroupNode = new CityObjectGroupNode(space.getTrafficAreas(), type.toString(), Color.YELLOW);
+ TreeItem trafficAreaGroupItem = new TreeItem<>(trafficAreaGroupNode);
+ root.getChildren().add(trafficAreaGroupItem);
+ trafficAreaGroupItem.setExpanded(true);
+
for (TrafficAreaObject tao : space.getTrafficAreas()) {
- TransportationObjectNode taoNode = new TransportationObjectNode(tao);
- TreeItem taoNodeTextItem = new TreeItem<>(taoNode);
- taoNodeTextItem.setExpanded(true);
- allTANodeTextItem.getChildren().add(taoNodeTextItem);
- createGeometryNodes(tao, taoNodeTextItem);
+ buildCityObjectNode(tao, trafficAreaGroupItem);
}
}
@@ -758,12 +736,8 @@ public class CityDoctorController {
int tunnelChunk = tunnelChunkNr.get();
for (int i = tunnelChunk * MAX_FEATURES_PER_CHUNK; i < (tunnelChunk + 1) * MAX_FEATURES_PER_CHUNK && i < list.size(); i++) {
Tunnel tunnel = list.get(i);
- TunnelNode node = new TunnelNode(tunnel);
- TreeItem item = new TreeItem<>(node);
- item.setExpanded(true);
- root.getChildren().add(item);
- createGeometryNodes(tunnel, item);
- createBoundarySurfaceNodes(tunnel.getBoundarySurfaces(), item);
+ TreeItem item = buildTopLevelCityObjectNode(tunnel, root);
+
createTunnelHollowNodes(tunnel, item);
createTunnelInstallationNodes(tunnel, item);
createTunnelFurnitureNodes(tunnel, item);
@@ -788,17 +762,14 @@ public class CityDoctorController {
if (tunnel.getTunnelConstructiveElements().isEmpty()){
return;
}
- AllTunnelConstructiveElementsNode allTceNode = new AllTunnelConstructiveElementsNode(tunnel.getTunnelConstructiveElements());
- TreeItem allTceNodeTextItem = new TreeItem<>(allTceNode);
- root.getChildren().add(allTceNodeTextItem);
+
+ CityObjectGroupNode constructiveElementsGroupNode = new CityObjectGroupNode(tunnel.getTunnelConstructiveElements(),
+ "Constructive Elements", Color.DARKGRAY);
+ TreeItem constructiveElementsGroupItem = new TreeItem<>(constructiveElementsGroupNode);
+ root.getChildren().add(constructiveElementsGroupItem);
for (TunnelConstructiveElement tce : tunnel.getTunnelConstructiveElements()) {
- TunnelConstructiveElementNode tceNode = new TunnelConstructiveElementNode(tce);
- TreeItem tceNodeItem = new TreeItem<>(tceNode);
- tceNodeItem.setExpanded(true);
- allTceNodeTextItem.getChildren().add(tceNodeItem);
- createGeometryNodes(tce, tceNodeItem);
- createBoundarySurfaceNodes(tce.getBoundarySurfaces(), tceNodeItem);
+ buildCityObjectNode(tce, constructiveElementsGroupItem, tce.getBoundarySurfaces());
}
}
@@ -806,17 +777,18 @@ public class CityDoctorController {
if (tunnel.getTunnelParts().isEmpty()) {
return;
}
- AllTunnelPartsNode allTpsText = new AllTunnelPartsNode(tunnel.getTunnelParts());
- TreeItem allTpsTextItem = new TreeItem<>(allTpsText);
- root.getChildren().add(allTpsTextItem);
+
+ CityObjectGroupNode tunnelPartsGroupNode = new CityObjectGroupNode(tunnel.getTunnelParts(), "Tunnel parts", Color.DARKGRAY);
+ TreeItem tunnelPartsGroupItem = new TreeItem<>(tunnelPartsGroupNode);
+ root.getChildren().add(tunnelPartsGroupItem);
for (TunnelPart tp : tunnel.getTunnelParts()) {
- TunnelPartNode tpNode = new TunnelPartNode(tp);
- TreeItem tpNodeItem = new TreeItem<>(tpNode);
- tpNodeItem.setExpanded(true);
- allTpsTextItem.getChildren().add(tpNodeItem);
- createGeometryNodes(tp, tpNodeItem);
- createBoundarySurfaceNodes(tp.getBoundarySurfaces(), tpNodeItem);
+ TreeItem tpNodeItem = buildCityObjectNode(tp, tunnelPartsGroupItem, tp.getBoundarySurfaces());
+
+ createTunnelHollowNodes(tunnel, tpNodeItem);
+ createTunnelInstallationNodes(tunnel, tpNodeItem);
+ createTunnelFurnitureNodes(tunnel, tpNodeItem);
+ createTunnelConstructiveElementsNodes(tunnel, tpNodeItem);
}
}
@@ -836,18 +808,14 @@ public class CityDoctorController {
if (bridge.getConstructiveElements().isEmpty()) {
return;
}
- AllBridgeConstructiveElementsNode allBceNode = new AllBridgeConstructiveElementsNode(
- bridge.getConstructiveElements());
- TreeItem allBceNodeTextItem = new TreeItem<>(allBceNode);
- item.getChildren().add(allBceNodeTextItem);
+
+ CityObjectGroupNode constructiveElementsGroupNode = new CityObjectGroupNode(
+ bridge.getConstructiveElements(), "Constructive Elements", Color.CORAL);
+ TreeItem constructiveElementsGroupItem = new TreeItem<>(constructiveElementsGroupNode);
+ item.getChildren().add(constructiveElementsGroupItem);
for (BridgeConstructiveElement bce : bridge.getConstructiveElements()) {
- BridgeConstructiveElementNode bceNode = new BridgeConstructiveElementNode(bce);
- TreeItem bceNodeItem = new TreeItem<>(bceNode);
- bceNodeItem.setExpanded(true);
- allBceNodeTextItem.getChildren().add(bceNodeItem);
- createGeometryNodes(bce, bceNodeItem);
- createBoundarySurfaceNodes(bce.getBoundarySurfaces(), bceNodeItem);
+ buildCityObjectNode(bce, constructiveElementsGroupItem, bce.getBoundarySurfaces());
}
}
@@ -855,21 +823,22 @@ public class CityDoctorController {
if (bridge.getParts().isEmpty()) {
return;
}
- AllBridgePartsNode allBpsText = new AllBridgePartsNode(bridge.getParts());
- TreeItem allBpsTextItem = new TreeItem<>(allBpsText);
- item.getChildren().add(allBpsTextItem);
+
+ CityObjectGroupNode bridgePartsGroupNode = new CityObjectGroupNode(bridge.getParts(), "Bridge Parts", Color.CORAL);
+ TreeItem bridgePartsGroupItem = new TreeItem<>(bridgePartsGroupNode);
+ item.getChildren().add(bridgePartsGroupItem);
for (BridgeObject bp : bridge.getParts()) {
- BridgeNode bpNode = new BridgeNode(bp);
- TreeItem bpNodeItem = new TreeItem<>(bpNode);
- bpNodeItem.setExpanded(true);
- allBpsTextItem.getChildren().add(bpNodeItem);
- createGeometryNodes(bp, bpNodeItem);
- createBoundarySurfaceNodes(bp.getBoundarySurfaces(), bpNodeItem);
+ TreeItem bpNodeItem = buildCityObjectNode(bp, bridgePartsGroupItem, bp.getBoundarySurfaces());
+
+ createBridgeRoomNodes(bp, bpNodeItem);
+ createBridgeInstallationNodes(bp, bpNodeItem);
+ createBridgeFurnitureNodes(bp, bpNodeItem);
+ createBridgeConstructiveElementsNodes(bp, bpNodeItem);
}
}
- private void createBuildingInstallationNodes(Building ab, TreeItem root) {
+ private void createBuildingInstallationNodes(AbstractBuilding ab, TreeItem root) {
createInstallationNodes(ab.getBuildingInstallations(), root);
}
@@ -878,20 +847,16 @@ public class CityDoctorController {
return;
}
- AllInstallationsNode allBiNode = new AllInstallationsNode(installations);
- TreeItem allBpsTextItem = new TreeItem<>(allBiNode);
- root.getChildren().add(allBpsTextItem);
+ CityObjectGroupNode installationsGroupNode = new CityObjectGroupNode(installations, "Installations", null);
+ TreeItem installationsGroupItem = new TreeItem<>(installationsGroupNode);
+ root.getChildren().add(installationsGroupItem);
+
for (Installation bi : installations) {
- InstallationNode biNode = new InstallationNode(bi);
- TreeItem biItem = new TreeItem<>(biNode);
- biItem.setExpanded(true);
- allBpsTextItem.getChildren().add(biItem);
- createGeometryNodes(bi, biItem);
- createBoundarySurfaceNodes(bi.getBoundarySurfaces(), biItem);
+ buildCityObjectNode(bi, installationsGroupItem, bi.getBoundarySurfaces());
}
}
- private void createBuildingRoomNodes(Building ab, TreeItem root) {
+ private void createBuildingRoomNodes(AbstractBuilding ab, TreeItem root) {
createRoomNodes(ab.getBuildingRooms(), root);
}
@@ -900,58 +865,48 @@ public class CityDoctorController {
return;
}
- AllRoomsNode allRoNode = new AllRoomsNode(rooms);
- TreeItem allRoNodeTextItem = new TreeItem<>(allRoNode);
- root.getChildren().add(allRoNodeTextItem);
+ CityObjectGroupNode roomsGroupNode = new CityObjectGroupNode(rooms, "Rooms", null);
+ TreeItem roomsGroupItem = new TreeItem<>(roomsGroupNode);
+ root.getChildren().add(roomsGroupItem);
+
for (AbstractRoom room : rooms) {
- RoomNode roomNode = new RoomNode(room);
- TreeItem roomNodeTextItem = new TreeItem<>(roomNode);
- roomNodeTextItem.setExpanded(true);
- allRoNodeTextItem.getChildren().add(roomNodeTextItem);
- createGeometryNodes(room, roomNodeTextItem);
- createBoundarySurfaceNodes(room.getBoundarySurfaces(), roomNodeTextItem);
+ buildCityObjectNode(room, roomsGroupItem, room.getBoundarySurfaces());
}
}
- private void createBuildingStoreyNodes(Building ab, TreeItem root) {
+ private void createBuildingStoreyNodes(AbstractBuilding ab, TreeItem root) {
List storeys = ab.getBuildingStoreys();
if (storeys.isEmpty()) {
return;
}
- AllStoreysNode allSNode = new AllStoreysNode(storeys);
- TreeItem allSNodeTextItem = new TreeItem<>(allSNode);
- root.getChildren().add(allSNodeTextItem);
+
+ CityObjectGroupNode storeysGroupNode = new CityObjectGroupNode(storeys, "Storeys", null);
+ TreeItem storeysGroupItem = new TreeItem<>(storeysGroupNode);
+ root.getChildren().add(storeysGroupItem);
+
for (Storey storey : storeys) {
- StoreyNode storeyNode = new StoreyNode(storey);
- TreeItem storeyNodeTextItem = new TreeItem<>(storeyNode);
- storeyNodeTextItem.setExpanded(true);
- allSNodeTextItem.getChildren().add(storeyNodeTextItem);
- createGeometryNodes(storey, storeyNodeTextItem);
- createBoundarySurfaceNodes(storey.getBoundarySurfaces(), storeyNodeTextItem);
+ buildCityObjectNode(storey, storeysGroupItem, storey.getBoundarySurfaces());
}
}
- public void createBuildingUnitNodes(Building ab, TreeItem root) {
+ public void createBuildingUnitNodes(AbstractBuilding ab, TreeItem root) {
List buildingUnits = ab.getBuildingUnits();
if (buildingUnits.isEmpty()) {
return;
}
- AllBuildingUnitsNode allSNode = new AllBuildingUnitsNode(buildingUnits);
- TreeItem allSNodeTextItem = new TreeItem<>(allSNode);
- root.getChildren().add(allSNodeTextItem);
+
+ CityObjectGroupNode buildingUnitsGroupNode = new CityObjectGroupNode(buildingUnits, "Building Units", null);
+ TreeItem buildingUnitsGroupItem = new TreeItem<>(buildingUnitsGroupNode);
+ root.getChildren().add(buildingUnitsGroupItem);
+
for (BuildingUnit buildingUnit : buildingUnits) {
- BuildingUnitNode buildingUnitNode = new BuildingUnitNode(buildingUnit);
- TreeItem storeyNodeTextItem = new TreeItem<>(buildingUnitNode);
- storeyNodeTextItem.setExpanded(true);
- allSNodeTextItem.getChildren().add(storeyNodeTextItem);
- createGeometryNodes(buildingUnit, storeyNodeTextItem);
- createBoundarySurfaceNodes(buildingUnit.getBoundarySurfaces(), storeyNodeTextItem);
+ buildCityObjectNode(buildingUnit, buildingUnitsGroupItem, buildingUnit.getBoundarySurfaces());
}
}
- private void createBuildingFurnitureNodes(Building ab, TreeItem root) {
+ private void createBuildingFurnitureNodes(AbstractBuilding ab, TreeItem root) {
createFurnitureNodes(ab.getBuildingRoomFurnitureList(), root);
}
@@ -960,16 +915,12 @@ public class CityDoctorController {
return;
}
- AllFurnitureNode allFnNode = new AllFurnitureNode(furniture);
- TreeItem allFnNodeTextItem = new TreeItem<>(allFnNode);
- root.getChildren().add(allFnNodeTextItem);
+ CityObjectGroupNode furnitureGroupNode = new CityObjectGroupNode(furniture, "Furniture", null);
+ TreeItem furnitureGroupItem = new TreeItem<>(furnitureGroupNode);
+ root.getChildren().add(furnitureGroupItem);
+
for (AbstractFurniture fn : furniture) {
- FurnitureNode fnNode = new FurnitureNode(fn);
- TreeItem fnNodeTextItem = new TreeItem<>(fnNode);
- fnNodeTextItem.setExpanded(true);
- allFnNodeTextItem.getChildren().add(fnNodeTextItem);
- createGeometryNodes(fn, fnNodeTextItem);
- createBoundarySurfaceNodes(fn.getBoundarySurfaceList(), fnNodeTextItem);
+ buildCityObjectNode(fn, furnitureGroupItem, fn.getBoundarySurfaces());
}
}
@@ -977,25 +928,26 @@ public class CityDoctorController {
if (bsList.isEmpty()) {
return;
}
- AllBoundarySurfacesNode allBsText = new AllBoundarySurfacesNode(bsList);
- TreeItem allBpsTextItem = new TreeItem<>(allBsText);
- root.getChildren().add(allBpsTextItem);
- allBpsTextItem.getChildren().add(new TreeItem<>());
+ CityObjectGroupNode boundarySurfacesGroupNode = new CityObjectGroupNode(bsList, "Boundary Surfaces", null);
+ TreeItem boundarySurfacesGroupItem = new TreeItem<>(boundarySurfacesGroupNode);
+ root.getChildren().add(boundarySurfacesGroupItem);
- allBpsTextItem.expandedProperty().addListener((obs, old, newV) -> {
- if (Boolean.TRUE.equals(newV) && allBpsTextItem.getChildren().size() == 1) {
+ boundarySurfacesGroupItem.getChildren().add(new TreeItem<>());
+
+ boundarySurfacesGroupItem.expandedProperty().addListener((obs, old, newV) -> {
+ if (Boolean.TRUE.equals(newV) && boundarySurfacesGroupItem.getChildren().size() == 1) {
Platform.runLater(() -> {
- allBpsTextItem.getChildren().clear();
+ boundarySurfacesGroupItem.getChildren().clear();
for (BoundarySurface bs : bsList) {
- BoundarySurfaceNode bsText = new BoundarySurfaceNode(bs);
+ CityObjectNode bsText = new CityObjectNode(bs);
TreeItem bsTextItem = new TreeItem<>(bsText);
bsTextItem.setExpanded(true);
- allBpsTextItem.getChildren().add(bsTextItem);
+ boundarySurfacesGroupItem.getChildren().add(bsTextItem);
createGeometryNodes(bs, bsTextItem);
createOpeningNodes(bs.getOpenings(), bsTextItem);
}
- updateTree(allBpsTextItem);
+ updateTree(boundarySurfacesGroupItem);
});
}
});
@@ -1005,31 +957,35 @@ public class CityDoctorController {
if (openings == null || openings.isEmpty()) {
return;
}
- AllOpeningsNode allOpeningsNode = new AllOpeningsNode(openings);
- TreeItem allOpeningsItem = new TreeItem<>(allOpeningsNode);
+
+ CityObjectGroupNode openingsGroupNode = new CityObjectGroupNode(openings, "Openings", null);
+ TreeItem openingsGroupItem = new TreeItem<>(openingsGroupNode);
+ root.getChildren().add(openingsGroupItem);
+
for (Opening o : openings) {
OpeningNode openingNode = new OpeningNode(o);
- TreeItem openingsItem = new TreeItem<>(openingNode);
- allOpeningsItem.getChildren().add(openingsItem);
+ TreeItem openingItem = new TreeItem<>(openingNode);
+ openingsGroupItem.getChildren().add(openingItem);
}
- root.getChildren().add(allOpeningsItem);
+
}
private void createBuildingPartNodes(Building ab, TreeItem item) {
if (ab.getBuildingParts().isEmpty()) {
return;
}
- AllBuildingPartsNode allBpsText = new AllBuildingPartsNode(ab.getBuildingParts());
- TreeItem allBpsTextItem = new TreeItem<>(allBpsText);
- item.getChildren().add(allBpsTextItem);
+ CityObjectGroupNode buildingPartsGroupNode = new CityObjectGroupNode(ab.getBuildingParts(), "Building Parts", null);
+ TreeItem buildingPartsGroupItem = new TreeItem<>(buildingPartsGroupNode);
+ item.getChildren().add(buildingPartsGroupItem);
for (BuildingPart bp : ab.getBuildingParts()) {
- BuildingPartNode bpNode = new BuildingPartNode(bp);
- TreeItem bpNodeItem = new TreeItem<>(bpNode);
- bpNodeItem.setExpanded(true);
- allBpsTextItem.getChildren().add(bpNodeItem);
- createGeometryNodes(bp, bpNodeItem);
- createBoundarySurfaceNodes(bp.getBoundarySurfaces(), bpNodeItem);
+ TreeItem bpNodeItem = buildCityObjectNode(bp, buildingPartsGroupItem, bp.getBoundarySurfaces());
+
+ createBuildingInstallationNodes(bp, bpNodeItem);
+ createBuildingRoomNodes(bp, bpNodeItem);
+ createBuildingFurnitureNodes(bp, bpNodeItem);
+ createBuildingStoreyNodes(bp, bpNodeItem);
+ createBuildingUnitNodes(bp, bpNodeItem);
}
}
@@ -1043,11 +999,15 @@ public class CityDoctorController {
public void startChecks(ValidationConfiguration config, ProgressListener l) {
if (model == null) {
- logger.warn(Localization.getText("CityDoctorController.noDatamodel"));
+ if (logger.isWarnEnabled()) {
+ logger.warn(Localization.getText("CityDoctorController.noDatamodel"));
+ }
return;
}
if (sourceFile == null) {
- logger.warn(Localization.getText("CityDoctorController.noSourceFile"));
+ if (logger.isWarnEnabled()) {
+ logger.warn(Localization.getText("CityDoctorController.noSourceFile"));
+ }
return;
}
try {
@@ -1083,9 +1043,10 @@ public class CityDoctorController {
public void startZipFileChecks(ValidationConfiguration config, ProgressListener l, boolean lowMemoryMode,
Path outputPath, boolean pdfReports, boolean xmlReports) {
- if (zipArchive == null) {
+ if (zipArchive == null && logger.isWarnEnabled()) {
logger.warn(Localization.getText("CityDoctorController.noZipFile"));
}
+
if (lowMemoryMode) {
startZipFileCheckStream(config, outputPath, pdfReports, xmlReports);
return;
@@ -1262,6 +1223,7 @@ public class CityDoctorController {
addErrorStats(stats, model.getBridges());
addErrorStats(stats, model.getBuildings());
addErrorStats(stats, model.getLand());
+ addErrorStats(stats, model.getTunnels());
addErrorStats(stats, model.getTransportation());
addErrorStats(stats, model.getVegetation());
addErrorStats(stats, model.getWater());
@@ -1578,7 +1540,7 @@ public class CityDoctorController {
updateTree(mainWindow.getBuildingsView().getRoot());
break;
case VEGETATION:
- buildVegetation(model.getVegetation());
+ buildVegetation(model);
updateTree(mainWindow.getVegetationView().getRoot());
break;
case BRIDGE:
@@ -1590,15 +1552,14 @@ public class CityDoctorController {
updateTree(mainWindow.getTerrainView().getRoot());
break;
case TRANSPORTATION:
- buildTransportation(model.getTransportation());
+ buildTransportation(model);
updateTree(mainWindow.getTransportationView().getRoot());
break;
case TUNNEL:
- buildTunnel(model.getTunnels());
+ buildTunnel(model);
updateTree(mainWindow.getTunnelView().getRoot());
break;
case WATER:
-
buildWater(model);
updateTree(mainWindow.getWaterView().getRoot());
break;
@@ -1664,12 +1625,13 @@ public class CityDoctorController {
public void delete(TreeItem selectedItem) {
if (model == null) {
return;
- }
+ }/* TODO: Rework this properly via Renderable implementation
Renderable render = selectedItem.getValue();
if (render instanceof BuildingNode node) {
model.getBuildings().remove(node.getBuilding());
mainWindow.getBuildingsView().getRoot().getChildren().remove(selectedItem);
}
+ */
}
diff --git a/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/MainWindow.java b/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/MainWindow.java
index 055556f9c0ddf7f9b950e7f1be412da5409782c1..58810fd551a0c33520250578d8666b0b816ce481 100644
--- a/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/MainWindow.java
+++ b/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/MainWindow.java
@@ -6,7 +6,6 @@ import de.hft.stuttgart.citydoctor2.datastructure.BoundingBox;
import de.hft.stuttgart.citydoctor2.datastructure.CityObject;
import de.hft.stuttgart.citydoctor2.datastructure.FeatureType;
import de.hft.stuttgart.citydoctor2.gui.logger.GuiLogger;
-import de.hft.stuttgart.citydoctor2.gui.tree.FeatureNode;
import de.hft.stuttgart.citydoctor2.gui.tree.Renderable;
import de.hft.stuttgart.citydoctor2.gui.tree.RenderableTreeCell;
import de.hft.stuttgart.citydoctor2.parameter.ArgumentParser;
@@ -45,7 +44,6 @@ import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.*;
-import static javafx.scene.input.Clipboard.getSystemClipboard;
public class MainWindow extends Application {
@@ -789,46 +787,35 @@ public class MainWindow extends Application {
private void setupFeatureTabContextMenu(TreeView featureView) {
ContextMenu menu = new ContextMenu();
- MenuItem mi = new MenuItem(Localization.getText("MainWindow.export"));
- mi.setOnAction(ea -> {
- Renderable render = featureView.getSelectionModel().getSelectedItem().getValue();
- if (render instanceof FeatureNode node) {
- try {
- controller.export(node.getFeature());
- logger.info(Localization.getText("CityDoctorController.exportSuccess"));
- } catch (Exception e) {
- logger.error("Export failed: Unexpected error occurred");
- logger.error(e);
- }
- } else {
- logger.info(Localization.getText("MainWindow.infoTopLevelExport"));
- }
+ MenuItem exportOption = new MenuItem(Localization.getText("MainWindow.export"));
+ exportOption.setOnAction(ea -> {
+ Renderable node = featureView.getSelectionModel().getSelectedItem().getValue();
+ fetchExportAction(node);
});
- menu.getItems().add(mi);
-
- MenuItem clipMi = new MenuItem(Localization.getText("MainWindow.copyId"));
- clipMi.setOnAction(ea -> {
- Renderable render = featureView.getSelectionModel().getSelectedItem().getValue();
- if (render instanceof FeatureNode node) {
- Clipboard clipboard = getSystemClipboard();
- ClipboardContent content = new ClipboardContent();
- content.putString(node.getFeature().getGmlId().toString());
- if (!clipboard.setContent(content)) {
- logger.warn(Localization.getText("MainWindow.warnCopyIdFailed"));
- }
- } else {
- logger.info(Localization.getText("MainWindow.infoTopLevelCopyID"));
- }
+ menu.getItems().add(exportOption);
+ MenuItem copyToClipboardOption = new MenuItem(Localization.getText("MainWindow.copyId"));
+ copyToClipboardOption.setOnAction(ea -> {
+ Renderable node = featureView.getSelectionModel().getSelectedItem().getValue();
+ fetchCopyAction(node);
});
- menu.getItems().add(clipMi);
+ menu.getItems().add(copyToClipboardOption);
- MenuItem deleteMi = new MenuItem(Localization.getText("MainWindow.delete"));
- deleteMi.setOnAction(ae -> controller.delete(featureView.getSelectionModel().getSelectedItem()));
- menu.getItems().add(deleteMi);
+ MenuItem deleteOption = new MenuItem(Localization.getText("MainWindow.delete"));
+ deleteOption.setOnAction(ae -> controller.delete(featureView.getSelectionModel().getSelectedItem()));
+ menu.getItems().add(deleteOption);
featureView.setContextMenu(menu);
}
+ public void fetchCopyAction(Renderable node) {
+ node.getClipboardAction(this);
+ }
+
+ public void fetchExportAction(Renderable node) {
+ node.getFeatureExportAction(this);
+ }
+
+
private void setupSelectListener(TreeView view) {
view.getSelectionModel().selectedItemProperty().addListener((obs, oldI, newI) -> {
if (newI != null) {
@@ -1161,27 +1148,18 @@ public class MainWindow extends Application {
private Pair> getFeatureTabOf(CityObject co) {
FeatureType coType = co.getFeatureType();
- if (coType == FeatureType.BUILDING){
- return new Pair<>(buildingsTab, buildingsView);
- } else if (coType == FeatureType.VEGETATION){
- return new Pair<>(vegetationTab, vegetationView);
- } else if (coType == FeatureType.TRANSPORTATION){
- return new Pair<>(transportationTab,transView);
- } else if (coType == FeatureType.TUNNEL){
- return new Pair<>(tunnelTab, tunnelView);
- } else if (coType == FeatureType.BRIDGE){
- return new Pair<>(bridgeTab, bridgeView);
- } else if (coType == FeatureType.WATER){
- return new Pair<>(waterTab, waterView);
- } else if (coType == FeatureType.LAND){
- return new Pair<>(terrainTab, terrainView);
- } else if (coType == FeatureType.CITY_FURNITURE){
- return new Pair<>(cityFurnitureTab, cityFurnitureView);
- } else if (coType == FeatureType.GENERIC_CITY_OBJECT){
- return new Pair<>(otherObjectsTab, otherObjectsView);
- } else {
- throw new IllegalArgumentException("unknown feature type: " + coType);
- }
+ return switch (coType) {
+ case BUILDING -> new Pair<>(buildingsTab, buildingsView);
+ case VEGETATION -> new Pair<>(vegetationTab, vegetationView);
+ case TRANSPORTATION -> new Pair<>(transportationTab, transView);
+ case TUNNEL -> new Pair<>(tunnelTab, tunnelView);
+ case BRIDGE -> new Pair<>(bridgeTab, bridgeView);
+ case WATER -> new Pair<>(waterTab, waterView);
+ case LAND -> new Pair<>(terrainTab, terrainView);
+ case CITY_FURNITURE -> new Pair<>(cityFurnitureTab, cityFurnitureView);
+ case GENERIC_CITY_OBJECT -> new Pair<>(otherObjectsTab, otherObjectsView);
+ default -> throw new IllegalArgumentException("unknown feature type: " + coType);
+ };
}
public MainToolBar getMainToolbar() {
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 d86e5445a32901a71bf953d345a02b417090ab16..7c2279b3a04e39c85a2a047245e2226dc2f909fa 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
@@ -2,9 +2,16 @@ package de.hft.stuttgart.citydoctor2.gui;
import de.hft.stuttgart.citydoctor2.check.CheckError;
import de.hft.stuttgart.citydoctor2.check.Checkable;
+import de.hft.stuttgart.citydoctor2.utils.visitors.CityObjectCollector;
import de.hft.stuttgart.citydoctor2.datastructure.*;
import de.hft.stuttgart.citydoctor2.gui.filter.ViewFilter;
import de.hft.stuttgart.citydoctor2.gui.tree.*;
+import de.hft.stuttgart.citydoctor2.gui.tree.node.EdgeNode;
+import de.hft.stuttgart.citydoctor2.gui.tree.node.ErrorNode;
+import de.hft.stuttgart.citydoctor2.gui.tree.node.GenericAttributeNode;
+import de.hft.stuttgart.citydoctor2.gui.tree.node.LinearRingNode;
+import de.hft.stuttgart.citydoctor2.gui.tree.node.PolygonNode;
+import de.hft.stuttgart.citydoctor2.gui.tree.node.VertexNode;
import de.hft.stuttgart.citydoctor2.math.Triangle3d;
import javafx.application.Platform;
import javafx.scene.control.TreeItem;
@@ -177,332 +184,14 @@ public class Renderer {
}
}
- public void render(Building building) {
+ public void setupRefresher(CityObject co) {
refresher = () -> {
- Set setupBuildingPolygons = setupBuildingPolygons(building);
- mainWindow.zoomOutForBoundingBox(BoundingBox.of(setupBuildingPolygons));
- render(setupBuildingPolygons);
- Platform.runLater(() -> {
- errorUpdater = () -> displayErrors(building);
- errorUpdater.run();
- addGenericAttributesToView(building);
- });
- };
- refresher.run();
- }
-
- private Set setupBuildingPolygons(Building b) {
- Set polygons = new HashSet<>();
- addPolygons(b, polygons);
- for (BoundarySurface bs : b.getBoundarySurfaces()) {
- addPolygons(bs, polygons);
- for (Opening op : bs.getOpenings()) {
- addPolygons(op, polygons);
- }
- }
- for (Installation bi : b.getBuildingInstallations()) {
- addPolygons(bi, polygons);
- for (BoundarySurface bs : bi.getBoundarySurfaces()) {
- addPolygons(bs, polygons);
- for (Opening op : bs.getOpenings()) {
- addPolygons(op, polygons);
- }
- }
- }
- for (BuildingRoom br : b.getBuildingRooms()) {
- addPolygons(br, polygons);
- for (BoundarySurface bs : br.getBoundarySurfaces()) {
- addPolygons(bs, polygons);
- }
- }
- for (BuildingRoomFurniture brf : b.getBuildingRoomFurnitureList()) {
- addPolygons(brf, polygons);
- for (BoundarySurface bs : brf.getBoundarySurfaceList()) {
- addPolygons(bs, polygons);
- }
- }
- for (BuildingPart bp : b.getBuildingParts()) {
- polygons.addAll(setupBuildingPartPolygons(bp));
- }
- return polygons;
- }
-
- public void render(BuildingPart bp) {
- refresher = () -> {
- Set setupBuildingPartPolygons = setupBuildingPartPolygons(bp);
- mainWindow.zoomOutForBoundingBox(BoundingBox.of(setupBuildingPartPolygons));
- render(setupBuildingPartPolygons);
- Platform.runLater(() -> {
- errorUpdater = () -> displayErrors(bp);
- errorUpdater.run();
- addGenericAttributesToView(bp);
- });
- };
- refresher.run();
- }
-
- private Set setupBuildingPartPolygons(BuildingPart bp) {
- Set polygons = new HashSet<>();
- addPolygons(bp, polygons);
- for (BoundarySurface bs : bp.getBoundarySurfaces()) {
- addPolygons(bs, polygons);
- for (Opening op : bs.getOpenings()) {
- addPolygons(op, polygons);
- }
- }
- for (Installation bi : bp.getBuildingInstallations()) {
- addPolygons(bi, polygons);
- for (BoundarySurface bs : bi.getBoundarySurfaces()) {
- addPolygons(bs, polygons);
- for (Opening op : bs.getOpenings()) {
- addPolygons(op, polygons);
- }
- }
- }
- return polygons;
- }
-
- public void render(AbstractRoom room) {
- refresher = () -> {
- Set setupRoomPolygons = setupRoomPolygons(room);
- mainWindow.zoomOutForBoundingBox(BoundingBox.of(setupRoomPolygons));
- render(setupRoomPolygons);
- Platform.runLater(() -> {
- errorUpdater = () -> displayErrors(room);
- errorUpdater.run();
- addGenericAttributesToView(room);
- });
- };
- refresher.run();
- }
-
- private Set