diff --git a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/check/AbstractCheck.java b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/check/AbstractCheck.java index 85d048f4de8ad992ffef2e65035302ecff8c117f..7910cdb0fd92052a1b9f80b26e262926b6326d70 100644 --- a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/check/AbstractCheck.java +++ b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/check/AbstractCheck.java @@ -22,13 +22,15 @@ import java.util.Collections; import java.util.Set; /** - * This is an empty implementation for a check. Can be used as a normal visitor - * for the city doctor data model + * + * This class serves as a Parent for non-validating checks that want to use the CheckEngine's Visitor-pattern for the + * implementation of utility functions like e.g. collecting the sub-CityObjects in a Feature. + * * * @author Matthias Betz * */ -public class AbstractCheck extends Check { +public abstract class AbstractCheck extends Check { @Override public Set appliesToRequirements() { @@ -50,4 +52,9 @@ public class AbstractCheck extends Check { return null; } + @Override + public final boolean isValidator() { + return false; + } + } diff --git a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/check/Check.java b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/check/Check.java index 4ae958f4c66f1f9b701540f8c3b958b51ff8c8cf..a50d6bcfbc5dc0b64a7ea4c3f8dd9ec62f404499 100644 --- a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/check/Check.java +++ b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/check/Check.java @@ -53,6 +53,7 @@ public abstract class Check { private final List> applicableToClasses = new ArrayList<>(2); + @SuppressWarnings("unchecked") protected Check() { Method[] declaredMethods = getClass().getDeclaredMethods(); @@ -102,6 +103,15 @@ public abstract class Check { */ public abstract RequirementType getType(); + /** + * Returns whether this check validates a feature. + * + * @return true if it validates, false otherwise + */ + public boolean isValidator() { + return true; + } + /** * Checks whether the check can be executed on this checkable, meaning the * checkable or its content can not have any error of any check dependent on diff --git a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/check/CheckId.java b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/check/CheckId.java index bcb0f822a9f81932c2a334de580307f14bb6b9c9..f793d8db0f3e5420ffd58b7bc45e9639a766c040 100644 --- a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/check/CheckId.java +++ b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/check/CheckId.java @@ -57,7 +57,6 @@ public record CheckId(String name) implements Serializable { public static final CheckId C_GE_P_ORIENTATION_RINGS_SAME = new CheckId("C_GE_P_ORIENTATION_RINGS_SAME"); public static final CheckId C_SE_POLYGON_WITHOUT_SURFACE = new CheckId("C_SE_POLYGON_WITHOUT_SURFACE"); - @Override public boolean equals(Object obj) { if (this == obj) diff --git a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/check/Checkable.java b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/check/Checkable.java index 0ef96239da0577336379f1dd0d59828b221c1a50..eee6292b740b02a30cc93eb80fe95a3af61868b4 100644 --- a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/check/Checkable.java +++ b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/check/Checkable.java @@ -24,6 +24,13 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import de.hft.stuttgart.citydoctor2.utils.CheckErrorFound; +import de.hft.stuttgart.citydoctor2.utils.visitors.CheckableErrorCollector; +import de.hft.stuttgart.citydoctor2.utils.visitors.ClearCheckResultsVisitor; +import de.hft.stuttgart.citydoctor2.utils.visitors.ClearMetaInformationVisitor; +import de.hft.stuttgart.citydoctor2.utils.visitors.ContainsAnyErrorVisitor; +import de.hft.stuttgart.citydoctor2.utils.visitors.ContainsErrorVisitor; +import de.hft.stuttgart.citydoctor2.utils.visitors.PrepareForCheckingVisitor; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -71,7 +78,9 @@ public abstract class Checkable implements Serializable { if (c.canExecute(this)) { c.check(this); } - setValidated(true); + if (c.isValidator()) { + setValidated(true); + } } /** @@ -81,29 +90,47 @@ public abstract class Checkable implements Serializable { * @return the GML-ID */ public abstract GmlId getGmlId(); - + /** * This should be called before executing a check if low memory consumption - * method has been enabled. This should create edges and additional meta + * method has been enabled. Creates edges and additional meta * information necessary to perform checks. */ - public abstract void prepareForChecking(); + public void prepareForChecking() { + this.accept(new PrepareForCheckingVisitor()); + } /** - * This should be called after checking has been done. This should remove any - * created meta information like edges to free up additional memory space + * This should be called after checking has been done. Removes any + * created meta information like edges to free up memory. */ - public abstract void clearMetaInformation(); + public void clearMetaInformation() { + this.accept(new ClearMetaInformationVisitor()); + } /** - * This method checks if the object or any object contained within this - * checkable has an error. It counts as an error if the result status if the - * given check is 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 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 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 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 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 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 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 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/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/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 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 setupRoomPolygons(AbstractRoom room) { - Set polygons = new HashSet<>(); - addPolygons(room, polygons); - for (BoundarySurface bs : room.getBoundarySurfaces()) { - addPolygons(bs, polygons); - for (Opening op : bs.getOpenings()) { - addPolygons(op, polygons); - } - } - return polygons; - } - - public void render(AbstractFurniture furniture) { - refresher = () -> { - Set setupFurniturePolygons = setupFurniturePolygons(furniture); - mainWindow.zoomOutForBoundingBox(BoundingBox.of(setupFurniturePolygons)); - render(setupFurniturePolygons); - Platform.runLater(() -> { - errorUpdater = () -> displayErrors(furniture); - errorUpdater.run(); - addGenericAttributesToView(furniture); - }); - }; - refresher.run(); - } - - private Set setupFurniturePolygons(AbstractFurniture furniture) { - Set polygons = new HashSet<>(); - addPolygons(furniture, polygons); - for (BoundarySurface bs : furniture.getBoundarySurfaceList()) { - addPolygons(bs, polygons); - for (Opening op : bs.getOpenings()) { - addPolygons(op, polygons); - } - } - return polygons; - } - - public void render(Storey storey) { - refresher = () -> { - Set setupStoreyPolygons = setupStoreyPolygons(storey); - mainWindow.zoomOutForBoundingBox(BoundingBox.of(setupStoreyPolygons)); - render(setupStoreyPolygons); - Platform.runLater(() -> { - errorUpdater = () -> displayErrors(storey); - errorUpdater.run(); - addGenericAttributesToView(storey); - }); - }; - refresher.run(); - } - - private Set setupStoreyPolygons(Storey storey) { - Set polygons = new HashSet<>(); - addPolygons(storey, polygons); - for (BoundarySurface bs : storey.getBoundarySurfaces()) { - addPolygons(bs, polygons); - for (Opening op : bs.getOpenings()) { - addPolygons(op, polygons); - } - } - return polygons; - } - - public void render(BuildingUnit buildingUnit) { - refresher = () -> { - Set setupBuildingUnitPolgons = setupBuildingUnitPolygons(buildingUnit); - mainWindow.zoomOutForBoundingBox(BoundingBox.of(setupBuildingUnitPolgons)); - render(setupBuildingUnitPolgons); - Platform.runLater(() -> { - errorUpdater = () -> displayErrors(buildingUnit); - errorUpdater.run(); - addGenericAttributesToView(buildingUnit); - }); - }; - refresher.run(); - } - - private Set setupBuildingUnitPolygons(BuildingUnit buildingUnit) { - Set polygons = new HashSet<>(); - addPolygons(buildingUnit, polygons); - for (BoundarySurface bs : buildingUnit.getBoundarySurfaces()) { - addPolygons(bs, polygons); - for (Opening op : bs.getOpenings()) { - addPolygons(op, polygons); - } - } - return polygons; - } - - private Set setupTransportationObjectPolygons(TransportationObject to) { - Set polygons = new HashSet<>(); - addPolygons(to, polygons); - - if (to instanceof TransportationSpace ts) { - if (ts instanceof TopLevelTransportFeature top) { - for (TransportSection sect : top.getSections()) { - polygons.addAll(setupTransportationObjectPolygons(sect)); - } - for (TransportSection isect : top.getIntersections()) { - polygons.addAll(setupTransportationObjectPolygons(isect)); - } - } - for (TrafficSpaceObject tso : ts.getTrafficSpaces()) { - polygons.addAll(setupTransportationObjectPolygons(tso)); - } - for (TrafficSpaceObject atso : ts.getAuxTrafficSpaces()) { - polygons.addAll(setupTransportationObjectPolygons(atso)); - } - } - - if (to instanceof TrafficSpaceObject tso) { - for (TrafficAreaObject tao : tso.getTrafficAreas()) { - polygons.addAll(setupTransportationObjectPolygons(tao)); - } - } - return polygons; - } - - public void render(Tunnel tunnel) { - refresher = () -> { - Set setupTunnelPolygons = setupTunnelPolygons(tunnel); - mainWindow.zoomOutForBoundingBox(BoundingBox.of(setupTunnelPolygons)); - render(setupTunnelPolygons); - Platform.runLater(() -> { - errorUpdater = () -> displayErrors(tunnel); - errorUpdater.run(); - addGenericAttributesToView(tunnel); - }); - }; - refresher.run(); - } - - private Set setupTunnelPolygons(Tunnel tunnel) { - Set polygons = new HashSet<>(); - addPolygons(tunnel, polygons); - for (BoundarySurface bs : tunnel.getBoundarySurfaces()) { - addPolygons(bs, polygons); - } - for (Installation ti : tunnel.getTunnelInstallations()) { - addPolygons(ti, polygons); - for (BoundarySurface bs : ti.getBoundarySurfaces()) { - addPolygons(bs, polygons); - for (Opening op : bs.getOpenings()) { - addPolygons(op, polygons); - } - } - } - for (TunnelHollow th : tunnel.getTunnelHollows()) { - addPolygons(th, polygons); - for (BoundarySurface bs : th.getBoundarySurfaces()) { - addPolygons(bs, polygons); - } - } - for (TunnelFurniture tf : tunnel.getTunnelFurniture()) { - addPolygons(tf, polygons); - for (BoundarySurface bs : tf.getBoundarySurfaceList()) { - addPolygons(bs, polygons); - } - } - for (TunnelPart tp : tunnel.getTunnelParts()) { - polygons.addAll(setupTunnelPartPolygons(tp)); - } - return polygons; - } - - private Set setupTunnelPartPolygons(TunnelPart tp) { - Set polygons = new HashSet<>(); - addPolygons(tp, polygons); - for (BoundarySurface bs : tp.getBoundarySurfaces()) { - addPolygons(bs, polygons); - for (Opening op : bs.getOpenings()) { - addPolygons(op, polygons); - } - } - for (Installation bi : tp.getTunnelInstallations()) { - addPolygons(bi, polygons); - for (BoundarySurface bs : bi.getBoundarySurfaces()) { - addPolygons(bs, polygons); - for (Opening op : bs.getOpenings()) { - addPolygons(op, polygons); - } - } - } - return polygons; - } - - public void render(BridgeObject bridge) { - refresher = () -> { - Set setupBridgePolygons = setupBridgePolygons(bridge); - mainWindow.zoomOutForBoundingBox(BoundingBox.of(setupBridgePolygons)); - render(setupBridgePolygons); - Platform.runLater(() -> { - errorUpdater = () -> displayErrors(bridge); - errorUpdater.run(); - addGenericAttributesToView(bridge); - }); - }; - refresher.run(); - } - - private Set setupBridgePolygons(BridgeObject bridge) { - Set polygons = new HashSet<>(); - addPolygons(bridge, polygons); - for (BoundarySurface bs : bridge.getBoundarySurfaces()) { - addPolygons(bs, polygons); - } - for (BridgeConstructiveElement consElement : bridge.getConstructiveElements()) { - addPolygons(consElement, polygons); - for (BoundarySurface bs : consElement.getBoundarySurfaces()) { - addPolygons(bs, polygons); - } - } - for (Installation inst : bridge.getBridgeInstallations()) { - addPolygons(inst, polygons); - for (BoundarySurface bs : inst.getBoundarySurfaces()) { - addPolygons(bs, polygons); - } - } - return polygons; - } - - public void render(CityObject co) { - refresher = () -> { - Set setupCityObjectPolygons = setupCityObjectPolygons(co); - mainWindow.zoomOutForBoundingBox(BoundingBox.of(setupCityObjectPolygons)); - render(setupCityObjectPolygons); + CityObjectCollector collector = new CityObjectCollector(); + co.accept(collector); + Set objectPolygons = new HashSet<>(); + collector.getCityObjects().forEach(object -> addPolygons(object, objectPolygons)); + mainWindow.zoomOutForBoundingBox(BoundingBox.of(objectPolygons)); + render(objectPolygons); Platform.runLater(() -> { errorUpdater = () -> displayErrors(co); errorUpdater.run(); @@ -512,142 +201,8 @@ public class Renderer { refresher.run(); } - public void render(ReliefObject relief) { - refresher = () -> { - Set setupCityObjectPolygons = setupReliefPolygons(relief); - mainWindow.zoomOutForBoundingBox(BoundingBox.of(setupCityObjectPolygons)); - render(setupCityObjectPolygons); - Platform.runLater(() -> { - errorUpdater = () -> displayErrors(relief); - errorUpdater.run(); - addGenericAttributesToView(relief); - }); - }; - refresher.run(); - } - - private Set setupReliefPolygons(ReliefObject relief) { - Set polygons = new HashSet<>(); - addPolygons(relief, polygons); - for (TinObject tin : relief.getComponents()) { - addPolygons(tin, polygons); - } - return polygons; - } - - public void render(Installation bi) { - refresher = () -> { - Set setupCityObjectPolygons = setupBuildingInstallationPolygons(bi); - mainWindow.zoomOutForBoundingBox(BoundingBox.of(setupCityObjectPolygons)); - render(setupCityObjectPolygons); - Platform.runLater(() -> { - errorUpdater = () -> displayErrors(bi); - errorUpdater.run(); - addGenericAttributesToView(bi); - }); - }; - refresher.run(); - } - - private Set setupBuildingInstallationPolygons(Installation bi) { - Set polygons = new HashSet<>(); - addPolygons(bi, polygons); - for (BoundarySurface bs : bi.getBoundarySurfaces()) { - addPolygons(bs, polygons); - for (Opening op : bs.getOpenings()) { - addPolygons(op, polygons); - } - } - return polygons; - } - - public void render(CityFurniture cf) { - refresher = () -> { - Set setupCityFurniturePolygons = setupCityFurniturePolygons(cf); - mainWindow.zoomOutForBoundingBox(BoundingBox.of(setupCityFurniturePolygons)); - render(setupCityFurniturePolygons); - Platform.runLater(() -> { - errorUpdater = () -> displayErrors(cf); - errorUpdater.run(); - addGenericAttributesToView(cf); - }); - }; - refresher.run(); - } - - private Set setupCityFurniturePolygons(CityFurniture cf) { - Set polygons = new HashSet<>(); - addPolygons(cf, polygons); - return polygons; - } - - public void render(GenericCityObject gco) { - refresher = () -> { - Set setupGenericCityObjectPolygons = setupGenericCityObjectPolygons(gco); - mainWindow.zoomOutForBoundingBox(BoundingBox.of(setupGenericCityObjectPolygons)); - render(setupGenericCityObjectPolygons); - Platform.runLater(() -> { - errorUpdater = () -> displayErrors(gco); - errorUpdater.run(); - addGenericAttributesToView(gco); - }); - }; - refresher.run(); - } - - private Set setupGenericCityObjectPolygons(GenericCityObject gco) { - Set polygons = new HashSet<>(); - addPolygons(gco, polygons); - for (BoundarySurface bs : gco.getBoundarySurfaces()) { - addPolygons(bs, polygons); - for (Opening op : bs.getOpenings()) { - addPolygons(op, polygons); - } - } - return polygons; - } - - public void render(TransportationObject to) { - refresher = () -> { - Set setupTransportationPolygons = setupTransportationObjectPolygons(to); - mainWindow.zoomOutForBoundingBox(BoundingBox.of(setupTransportationPolygons)); - render(setupTransportationPolygons); - Platform.runLater(() -> { - errorUpdater = () -> displayErrors(to); - errorUpdater.run(); - addGenericAttributesToView(to); - }); - }; - refresher.run(); - } - - public void render(BoundarySurface bs) { - refresher = () -> { - Set setupBoundarySurfacePolygons = setupBoundarySurfacePolygons(bs); - mainWindow.zoomOutForBoundingBox(BoundingBox.of(setupBoundarySurfacePolygons)); - render(setupBoundarySurfacePolygons); - Platform.runLater(() -> { - errorUpdater = () -> displayErrors(bs); - errorUpdater.run(); - addGenericAttributesToView(bs); - }); - }; - refresher.run(); - } - - private Set setupBoundarySurfacePolygons(BoundarySurface bs) { - Set polygons = new HashSet<>(); - addPolygons(bs, polygons); - for (Opening op : bs.getOpenings()) { - addPolygons(op, polygons); - } - return polygons; - } - - private Set setupCityObjectPolygons(CityObject co) { - Set polygons = new HashSet<>(); - addPolygons(co, polygons); - return polygons; + public void render(CityObject co) { + setupRefresher(co); } private void addPolygons(CityObject co, Set polygons) { @@ -693,7 +248,7 @@ public class Renderer { if (geom.getEdges() == null && currentGeometry != null) { // if there are no edges available low memory mode is enabled // clear the old geometry of all meta information - currentGeometry.clearMetaInformation(); + currentGeometry.clearMetaData(); } errVisitor.setGeometry(currentTriGeom); Platform.runLater(() -> { @@ -808,36 +363,7 @@ public class Renderer { } public void renderBuildings(List objects) { - errorUpdater = null; - refresher = () -> { - Platform.runLater(() -> { - loadingDialog.show(); - clearGeometryTrees(); - clearAttributes(); - }); - Thread t = new Thread(() -> { - Set polygons = new HashSet<>(); - for (Building b : objects) { - collectBuildingPolygons(polygons, b); - for (BuildingPart bp : b.getBuildingParts()) { - collectBuildingPolygons(polygons, bp); - } - } - currentTriGeom = TriangulatedGeometry.of(polygons); - errVisitor.setGeometry(currentTriGeom); - Platform.runLater(() -> { - setupRenderState(); - mainWindow.zoomOutForBoundingBox(BoundingBox.of(polygons)); - loadingDialog.hide(); - }); - }); - t.setUncaughtExceptionHandler((thread, e) -> { - Platform.runLater(() -> loadingDialog.hide()); - logger.catching(e); - }); - t.start(); - }; - refresher.run(); + renderCityObjects(objects, null); } public void render(CityDoctorModel model) { @@ -871,66 +397,11 @@ public class Renderer { } public void renderTransportation(List transportation) { - errorUpdater = null; - refresher = () -> { - Platform.runLater(() -> { - loadingDialog.show(); - clearGeometryTrees(); - clearAttributes(); - }); - Thread t = new Thread(() -> { - Set polygons = new HashSet<>(); - for (TransportationObject to : transportation) { - polygons.addAll(setupTransportationObjectPolygons(to)); - } - currentTriGeom = TriangulatedGeometry.of(polygons, Color.YELLOW); - errVisitor.setGeometry(currentTriGeom); - Platform.runLater(() -> { - setupRenderState(); - mainWindow.zoomOutForBoundingBox(BoundingBox.of(polygons)); - loadingDialog.hide(); - }); - }); - t.setUncaughtExceptionHandler((thread, e) -> { - Platform.runLater(() -> loadingDialog.hide()); - logger.catching(e); - }); - t.start(); - }; - refresher.run(); + renderCityObjects(transportation, Color.YELLOW); } public void renderBridges(List bridges) { - errorUpdater = null; - refresher = () -> { - Platform.runLater(() -> { - loadingDialog.show(); - clearGeometryTrees(); - clearAttributes(); - }); - Thread t = new Thread(() -> { - Set polygons = new HashSet<>(); - for (BridgeObject b : bridges) { - collectBridgePolygons(polygons, b); - for (BridgeObject bp : b.getParts()) { - collectBridgePolygons(polygons, bp); - } - } - currentTriGeom = TriangulatedGeometry.of(polygons, Color.CORAL); - errVisitor.setGeometry(currentTriGeom); - Platform.runLater(() -> { - setupRenderState(); - mainWindow.zoomOutForBoundingBox(BoundingBox.of(polygons)); - loadingDialog.hide(); - }); - }); - t.setUncaughtExceptionHandler((thread, e) -> { - Platform.runLater(() -> loadingDialog.hide()); - logger.catching(e); - }); - t.start(); - }; - refresher.run(); + renderCityObjects(bridges, Color.CORAL); } public void renderWater(List water) { @@ -938,72 +409,13 @@ public class Renderer { } public void renderCityFurniture(List cityFurniture) { - errorUpdater = null; - refresher = () -> { - Platform.runLater(() -> { - loadingDialog.show(); - clearGeometryTrees(); - clearAttributes(); - }); - Thread t = new Thread(() -> { - Set polygons = new HashSet<>(); - for (CityFurniture cf : cityFurniture) { - collectCityFurniture(polygons, cf); - } - currentTriGeom = TriangulatedGeometry.of(polygons, Color.BLUEVIOLET); - errVisitor.setGeometry(currentTriGeom); - Platform.runLater(() -> { - setupRenderState(); - mainWindow.zoomOutForBoundingBox(BoundingBox.of(polygons)); - loadingDialog.hide(); - }); - }); - t.setUncaughtExceptionHandler((thread, e) -> { - Platform.runLater(() -> loadingDialog.hide()); - logger.catching(e); - }); - t.start(); - }; - refresher.run(); - + renderCityObjects(cityFurniture, Color.BLUEVIOLET); } public void renderTerrain(List land) { - renderLandObjects(land, Color.BROWN); + renderCityObjects(land, Color.BROWN); } - private void renderLandObjects(List cos, Color baseColor) { - errorUpdater = null; - refresher = () -> { - Platform.runLater(() -> { - loadingDialog.show(); - clearGeometryTrees(); - clearAttributes(); - }); - Thread t = new Thread(() -> { - Set polygons = new HashSet<>(); - for (CityObject co : cos) { - addPolygons(co, polygons); - if (co instanceof ReliefObject) { - ReliefObject relief = (ReliefObject) co; - for (TinObject tin : relief.getComponents()) { - addPolygons(tin, polygons); - } - } - } - currentTriGeom = TriangulatedGeometry.of(polygons, baseColor); - errVisitor.setGeometry(currentTriGeom); - Platform.runLater(() -> { - setupRenderState(); - mainWindow.zoomOutForBoundingBox(BoundingBox.of(polygons)); - loadingDialog.hide(); - }); - }); - t.setUncaughtExceptionHandler((thread, e) -> Platform.runLater(() -> loadingDialog.hide())); - t.start(); - }; - refresher.run(); - } public void renderCityObjects(List cos, Color baseColor) { errorUpdater = null; @@ -1015,10 +427,14 @@ public class Renderer { }); Thread t = new Thread(() -> { Set polygons = new HashSet<>(); - for (CityObject co : cos) { - addPolygons(co, polygons); + CityObjectCollector collector = new CityObjectCollector(); + cos.forEach(cityObject -> cityObject.accept(collector)); + collector.getCityObjects().forEach(cityObject -> addPolygons(cityObject, polygons)); + if (baseColor != null) { + currentTriGeom = TriangulatedGeometry.of(polygons, baseColor); + } else { + currentTriGeom = TriangulatedGeometry.of(polygons); } - currentTriGeom = TriangulatedGeometry.of(polygons, baseColor); errVisitor.setGeometry(currentTriGeom); Platform.runLater(() -> { setupRenderState(); @@ -1033,129 +449,9 @@ public class Renderer { } public void renderTunnels(List objects) { - errorUpdater = null; - refresher = () -> { - Platform.runLater(() -> { - loadingDialog.show(); - clearGeometryTrees(); - clearAttributes(); - }); - Thread t = new Thread(() -> { - Set polygons = new HashSet<>(); - for (Tunnel tunnel : objects) { - collectTunnelPolygons(polygons, tunnel); - for (TunnelPart tp : tunnel.getTunnelParts()) { - collectTunnelPolygons(polygons, tp); - } - } - currentTriGeom = TriangulatedGeometry.of(polygons); - errVisitor.setGeometry(currentTriGeom); - Platform.runLater(() -> { - setupRenderState(); - mainWindow.zoomOutForBoundingBox(BoundingBox.of(polygons)); - loadingDialog.hide(); - }); - }); - t.setUncaughtExceptionHandler((thread, e) -> { - Platform.runLater(() -> loadingDialog.hide()); - logger.catching(e); - }); - t.start(); - }; - refresher.run(); - } - - private void collectBuildingPolygons(Set polygons, AbstractBuilding ab) { - addPolygons(ab, polygons); - for (Installation bi : ab.getBuildingInstallations()) { - addPolygons(bi, polygons); - for (BoundarySurface bs : bi.getBoundarySurfaces()) { - addPolygons(bs, polygons); - for (Opening o : bs.getOpenings()) { - addPolygons(o, polygons); - } - } - } - for (BuildingRoom br : ab.getBuildingRooms()) { - addPolygons(br, polygons); - for (BoundarySurface bs : br.getBoundarySurfaces()) { - addPolygons(bs, polygons); - } - } - for (BoundarySurface bs : ab.getBoundarySurfaces()) { - addPolygons(bs, polygons); - for (Opening o : bs.getOpenings()) { - addPolygons(o, polygons); - } - } + renderCityObjects(objects, Color.DARKGRAY); } - private void collectBridgePolygons(Set polygons, BridgeObject br) { - addPolygons(br, polygons); - for (Installation bi : br.getBridgeInstallations()) { - addPolygons(bi, polygons); - for (BoundarySurface bs : bi.getBoundarySurfaces()) { - addPolygons(bs, polygons); - for (Opening o : bs.getOpenings()) { - addPolygons(o, polygons); - } - } - } - for (BridgeRoom r : br.getBridgeRooms()) { - addPolygons(r, polygons); - for (BoundarySurface bs : r.getBoundarySurfaces()) { - addPolygons(bs, polygons); - } - } - for (BridgeConstructiveElement bce : br.getConstructiveElements()) { - addPolygons(bce, polygons); - for (BoundarySurface bs : bce.getBoundarySurfaces()) { - addPolygons(bs, polygons); - } - } - for (BoundarySurface bs : br.getBoundarySurfaces()) { - addPolygons(bs, polygons); - for (Opening o : bs.getOpenings()) { - addPolygons(o, polygons); - } - } - - } - - public void collectTunnelPolygons(Set polygons, AbstractTunnel at) { - addPolygons(at, polygons); - for (Installation ti : at.getTunnelInstallations()) { - addPolygons(ti, polygons); - for (BoundarySurface bs : ti.getBoundarySurfaces()) { - addPolygons(bs, polygons); - for (Opening o : bs.getOpenings()) { - addPolygons(o, polygons); - } - } - } - for (TunnelHollow th : at.getTunnelHollows()) { - addPolygons(th, polygons); - for (BoundarySurface bs : th.getBoundarySurfaces()) { - addPolygons(bs, polygons); - } - } - for (TunnelConstructiveElement tce : at.getTunnelConstructiveElements()) { - addPolygons(tce, polygons); - for (BoundarySurface bs : tce.getBoundarySurfaces()) { - addPolygons(bs, polygons); - } - } - for (BoundarySurface bs : at.getBoundarySurfaces()) { - addPolygons(bs, polygons); - for (Opening o : bs.getOpenings()) { - addPolygons(o, polygons); - } - } - } - - private void collectCityFurniture(Set polygons, CityFurniture cf) { - addPolygons(cf, polygons); - } private void addConcretePolygons(Set polygons, Geometry geom) { for (Polygon p : geom.getPolygons()) { diff --git a/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/TriangulatedGeometry.java b/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/TriangulatedGeometry.java index 5279c8a57e92e01f63708dfc5f5ba74bf39ecbba..9709b35373ee30f37f06bb958ee6a1934286e125 100644 --- a/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/TriangulatedGeometry.java +++ b/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/TriangulatedGeometry.java @@ -1,5 +1,6 @@ package de.hft.stuttgart.citydoctor2.gui; +import de.hft.stuttgart.citydoctor2.utils.visitors.CityObjectCollector; import de.hft.stuttgart.citydoctor2.datastructure.Polygon; import de.hft.stuttgart.citydoctor2.datastructure.*; import de.hft.stuttgart.citydoctor2.gui.filter.ViewFilter; @@ -75,117 +76,33 @@ public class TriangulatedGeometry { public static TriangulatedGeometry of(CityDoctorModel model, List filters) { List points = new ArrayList<>(); - addPointsFromBuildings(model.getBuildings(), points); - addPointsFromCityObject(model.getBridges(), points); - addPointsFromCityObject(model.getLand(), points); - addPointsFromTransportationObjects(model.getTransportation(), points); - addPointsFromCityObject(model.getVegetation(), points); - addPointsFromCityObject(model.getWater(), points); + addPointsFromCityObject(model.createFeatureStream().toList(), points); TriangulatedGeometry triGeom = new TriangulatedGeometry(); triGeom.materials = new ArrayList<>(); triGeom.meshes = new ArrayList<>(); triGeom.movedBy = triGeom.findCenter(points); - - addPolygonDataFromBuildings(model.getBuildings(), triGeom, filters); - addPolygonDataFromBridges(model.getBridges(), triGeom, filters); - addPolygonDataFromCityObjects(model.getLand(), triGeom, Color.BROWN, filters); - addPolygonDataFromTransportationObjects(model.getTransportation(), triGeom, filters); + + addPolygonDataFromCityObjects(model.getBuildings(), triGeom, Color.WHITE, filters); + addPolygonDataFromCityObjects(model.getBridges(), triGeom, Color.LIGHTSTEELBLUE, filters); + addPolygonDataFromCityObjects(model.getTunnels(), triGeom, Color.SLATEGRAY, filters); + addPolygonDataFromCityObjects(model.getLand(), triGeom, Color.TAN, filters); + addPolygonDataFromCityObjects(model.getTransportation(), triGeom, Color.DIMGRAY, filters); addPolygonDataFromCityObjects(model.getVegetation(), triGeom, Color.LIGHTGREEN, filters); addPolygonDataFromCityObjects(model.getWater(), triGeom, Color.LIGHTSKYBLUE, filters); addPolygonDataFromCityObjects(model.getCityFurniture(), triGeom, Color.BLUEVIOLET, filters); - addPolygonDataFromCityObjects(model.getGenericCityObjects(), triGeom, Color.DARKGRAY, filters); + addPolygonDataFromCityObjects(model.getGenericCityObjects(), triGeom, Color.BLACK, filters); return triGeom; } - - private static void addPolygonDataFromBuildings(List buildings, TriangulatedGeometry triGeom, List filters) { - for (Building b : buildings) { - addPolygonData(b, triGeom, Color.WHITE, filters); - addPolygonDataFromBoundarySurfaces(b.getBoundarySurfaces(), triGeom, filters); - addPolygonDataFromCityObjects(b.getBuildingInstallations(), triGeom, Color.WHITE, filters); - for (Installation bi : b.getBuildingInstallations()) { - addPolygonDataFromCityObjects(bi.getBoundarySurfaces(), triGeom, Color.WHITE, filters); - } - for (BuildingPart bp : b.getBuildingParts()) { - addPolygonData(bp, triGeom, Color.WHITE, filters); - addPolygonDataFromBoundarySurfaces(bp.getBoundarySurfaces(), triGeom, filters); - addPolygonDataFromCityObjects(bp.getBuildingInstallations(), triGeom, Color.WHITE, filters); - } - } - } - - private static void addPolygonDataFromBridges(List bridges, TriangulatedGeometry triGeom, List filters) { - for (BridgeObject b : bridges) { - addPolygonData(b, triGeom, Color.CORAL, filters); - addPolygonDataFromBoundarySurfaces(b.getBoundarySurfaces(), triGeom, filters); - addPolygonDataFromCityObjects(b.getBridgeInstallations(), triGeom, Color.CORAL, filters); - for (Installation bi : b.getBridgeInstallations()) { - addPolygonData(bi, triGeom, Color.CORAL, filters); - addPolygonDataFromCityObjects(bi.getBoundarySurfaces(), triGeom, Color.CORAL, filters); - } - for (BridgeConstructiveElement bce : b.getConstructiveElements()) { - addPolygonData(bce, triGeom, Color.CORAL, filters); - addPolygonDataFromCityObjects(bce.getBoundarySurfaces(), triGeom, Color.CORAL, filters); - } - addPolygonDataFromBridges(b.getParts(), triGeom, filters); - } - } - - private static void addPolygonDataFromTransportationObjects(List tos, TriangulatedGeometry triGeom, - List filters) { - for (TransportationObject to : tos) { - if (to instanceof TransportationSpace tsp) { - addPolygonDataFromTransportationSpace(tsp, triGeom, filters); - if (tsp instanceof TopLevelTransportFeature top) { - for (TransportSection tse : top.getSections()) { - addPolygonDataFromTransportationSpace(tse, triGeom, filters); - } - for (TransportSection tse : top.getIntersections()) { - addPolygonDataFromTransportationSpace(tse, triGeom, filters); - } - } - } else { - addPolygonData(to, triGeom, Color.YELLOW, filters); - } - } - } - - private static void addPolygonDataFromTransportationSpace(TransportationSpace ts, TriangulatedGeometry triGeom, - List filters) { - addPolygonData(ts, triGeom, Color.YELLOW, filters); - addPolygonDataFromTrafficSpaces(ts.getTrafficSpaces(), triGeom, filters); - addPolygonDataFromTrafficSpaces(ts.getAuxTrafficSpaces(), triGeom, filters); - } - - private static void addPolygonDataFromTrafficSpaces(List spaces, TriangulatedGeometry triGeom, - List filters) { - for (TrafficSpaceObject space : spaces) { - addPolygonData(space, triGeom, Color.YELLOW, filters); - for (TrafficAreaObject area : space.getTrafficAreas()) { - addPolygonData(area, triGeom, Color.YELLOW, filters); - } - } - } - - private static void addPolygonDataFromBoundarySurfaces(List boundarySurfaces, - TriangulatedGeometry triGeom, List filters) { - for (BoundarySurface bs : boundarySurfaces) { - addPolygonData(bs, triGeom, Color.WHITE, filters); - for (Opening o : bs.getOpenings()) { - addPolygonData(o, triGeom, Color.WHITE, filters); - } - } - } - private static void addPolygonDataFromCityObjects(List cos, TriangulatedGeometry triGeom, Color color, List filters) { - for (CityObject co : cos) { - addPolygonData(co, triGeom, color, filters); - } + CityObjectCollector collector = new CityObjectCollector(); + cos.forEach(cityObject -> cityObject.accept(collector)); + collector.getCityObjects().forEach(cityObject -> addPolygonData(cityObject, triGeom, color, filters)); } private static void addPolygonData(CityObject co, TriangulatedGeometry triGeom, Color color, List filters) { @@ -213,46 +130,10 @@ public class TriangulatedGeometry { return true; } - private static void addPointsFromBuildings(List buildings, List points) { - for (Building b : buildings) { - addPoints(b, points); - for (BuildingPart bp : b.getBuildingParts()) { - addPoints(bp, points); - addPointsFromCityObject(bp.getBoundarySurfaces(), points); - addPointsFromCityObject(bp.getBuildingInstallations(), points); - } - addPointsFromCityObject(b.getBoundarySurfaces(), points); - addPointsFromCityObject(b.getBuildingInstallations(), points); - } - } - - private static void addPointsFromTransportationObjects(List tos, List points) { - for (TransportationObject to : tos) { - addPoints(to, points); - if (to instanceof TransportationSpace ts) { - addPointsFromTrafficSpace(ts.getTrafficSpaces(), points); - addPointsFromTrafficSpace(ts.getAuxTrafficSpaces(), points); - if (ts instanceof TopLevelTransportFeature top) { - addPointsFromTransportationObjects(top.getSections(), points); - addPointsFromTransportationObjects(top.getIntersections(), points); - } - } - } - } - - private static void addPointsFromTrafficSpace(List tos, List points) { - for (TrafficSpaceObject to : tos) { - addPoints(to, points); - for (TrafficAreaObject area : to.getTrafficAreas()) { - addPoints(area, points); - } - } - } - private static void addPointsFromCityObject(List cos, List points) { - for (CityObject co : cos) { - addPoints(co, points); - } + CityObjectCollector collector = new CityObjectCollector(); + cos.forEach(cityObject -> cityObject.accept(collector)); + collector.getCityObjects().forEach(cityObject -> addPoints(cityObject, points)); } private static void addPoints(CityObject co, List points) { @@ -286,16 +167,9 @@ public class TriangulatedGeometry { private PhongMaterial calculateMaterial(Polygon p, Color baseColor) { Vector3d normal = p.calculateNormalNormalized(); - BoundarySurface bs = p.getPartOfSurface(); - if (bs != null) { - if (bs.getType() == BoundarySurfaceType.ROOF) { - baseColor = Color.RED; - } else if (bs.getType() == BoundarySurfaceType.GROUND) { - baseColor = Color.KHAKI; - } + if (p.getRenderColor() != null && p.getRenderColor() != Color.WHITE) { + baseColor = p.getRenderColor(); } - - baseColor = determineColorDependingOnParentType(p, baseColor); double cos = normal.dot(AXIS); double acos = Math.acos(cos); @@ -307,28 +181,6 @@ public class TriangulatedGeometry { return new PhongMaterial(derivedColor); } - private Color determineColorDependingOnParentType(Polygon p, Color baseColor) { - p = p.getOriginal(); - Polygon p1 = p.getLinkedFromPolygon(); - baseColor = changeBaseColorIfPolygonHasOpeningParent(p1, baseColor); - baseColor = changeBaseColorIfPolygonHasOpeningParent(p, baseColor); - return baseColor; - } - - private Color changeBaseColorIfPolygonHasOpeningParent(Polygon p, Color baseColor) { - if (p == null) { - return baseColor; - } - CityObject parent = p.getParent().getParent(); - if (parent instanceof Opening op) { - if (op.getType() == OpeningType.DOOR) { - baseColor = Color.ORANGE; - } else { - baseColor = Color.TEAL; - } - } - return baseColor; - } private Vector3d findCenter(List points) { double xMin = Double.MAX_VALUE; diff --git a/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/VertexClickHandler.java b/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/VertexClickHandler.java index 32bdbe709c3c085d5f78a841bc011130035f83ba..f5ff87f99a06aa9fddfd6940fa579d61d0346f9e 100644 --- a/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/VertexClickHandler.java +++ b/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/VertexClickHandler.java @@ -1,7 +1,6 @@ package de.hft.stuttgart.citydoctor2.gui; import de.hft.stuttgart.citydoctor2.datastructure.*; -import de.hft.stuttgart.citydoctor2.gui.tree.FeatureNode; import de.hft.stuttgart.citydoctor2.utils.Localization; import javafx.scene.input.Clipboard; import javafx.scene.input.ClipboardContent; diff --git a/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/ZipEntryManager.java b/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/ZipEntryManager.java index 2429a5ff003debeda1780d60e979bd06fe7239ec..b27a3f37a5a164cd6271907e671fbe280963a32f 100644 --- a/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/ZipEntryManager.java +++ b/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/ZipEntryManager.java @@ -1,7 +1,7 @@ package de.hft.stuttgart.citydoctor2.gui; import de.hft.stuttgart.citydoctor2.gui.tree.ZipEntryListCell; -import de.hft.stuttgart.citydoctor2.gui.tree.ZipEntryNode; +import de.hft.stuttgart.citydoctor2.gui.tree.node.ZipEntryNode; import de.hft.stuttgart.citydoctor2.utils.Localization; import de.hft.stuttgart.citydoctor2.zip.CityGmlZipArchive; import de.hft.stuttgart.citydoctor2.zip.CityGmlZipEntry; diff --git a/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/AllBoundarySurfacesNode.java b/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/AllBoundarySurfacesNode.java deleted file mode 100644 index 422d84a2e34933cb76e32687e1717f920818a06c..0000000000000000000000000000000000000000 --- a/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/AllBoundarySurfacesNode.java +++ /dev/null @@ -1,46 +0,0 @@ -package de.hft.stuttgart.citydoctor2.gui.tree; - -import java.util.List; - -import de.hft.stuttgart.citydoctor2.datastructure.BoundarySurface; -import de.hft.stuttgart.citydoctor2.gui.CheckStatus; -import de.hft.stuttgart.citydoctor2.gui.Renderer; - -public class AllBoundarySurfacesNode extends Renderable { - - private final List boundarySurfaces; - - public AllBoundarySurfacesNode(List boundarySurfaces) { - this.boundarySurfaces = boundarySurfaces; - } - - @Override - public String getText() { - return "Boundary Surfaces"; - } - - @Override - public void visit(Renderer renderer) { - renderer.clearCurrentRender(); - } - - @Override - public void refreshTextColor() { - boolean isValidated = false; - for (BoundarySurface bs : boundarySurfaces) { - if (bs.isValidated()) { - isValidated = true; - } - if (bs.containsAnyError()) { - setStatus(CheckStatus.ERROR); - return; - } - } - if (isValidated) { - setStatus(CheckStatus.OK); - } else { - setStatus(CheckStatus.NOT_CHECKED); - } - } - -} diff --git a/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/AllBridgeConstructiveElementsNode.java b/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/AllBridgeConstructiveElementsNode.java deleted file mode 100644 index 0f0bbd3378d9fbe1091ae2131f3b26e53363950a..0000000000000000000000000000000000000000 --- a/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/AllBridgeConstructiveElementsNode.java +++ /dev/null @@ -1,64 +0,0 @@ -/*- - * Copyright 2022 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.gui.tree; - -import java.util.List; - -import de.hft.stuttgart.citydoctor2.datastructure.BridgeConstructiveElement; -import de.hft.stuttgart.citydoctor2.gui.CheckStatus; -import de.hft.stuttgart.citydoctor2.gui.Renderer; - -public class AllBridgeConstructiveElementsNode extends Renderable { - - private final List constructiveElements; - - public AllBridgeConstructiveElementsNode(List constructiveElements) { - this.constructiveElements = constructiveElements; - } - - @Override - public String getText() { - return "Constructive Elements"; - } - - @Override - public void visit(Renderer renderer) { - renderer.clearCurrentRender(); - } - - @Override - public void refreshTextColor() { - boolean isValidated = false; - for (BridgeConstructiveElement bce : constructiveElements) { - if (bce.isValidated()) { - isValidated = true; - } - if (bce.containsAnyError()) { - setStatus(CheckStatus.ERROR); - return; - } - } - if (isValidated) { - setStatus(CheckStatus.OK); - } else { - setStatus(CheckStatus.NOT_CHECKED); - } - } - -} diff --git a/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/AllBridgePartsNode.java b/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/AllBridgePartsNode.java deleted file mode 100644 index 199651d566b40baad68f144310eb7c268f182e27..0000000000000000000000000000000000000000 --- a/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/AllBridgePartsNode.java +++ /dev/null @@ -1,64 +0,0 @@ -/*- - * Copyright 2022 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.gui.tree; - -import java.util.List; - -import de.hft.stuttgart.citydoctor2.datastructure.BridgeObject; -import de.hft.stuttgart.citydoctor2.gui.CheckStatus; -import de.hft.stuttgart.citydoctor2.gui.Renderer; - -public class AllBridgePartsNode extends Renderable { - - private final List bridgeParts; - - public AllBridgePartsNode(List bridgeParts) { - this.bridgeParts = bridgeParts; - } - - @Override - public String getText() { - return "Bridge Parts"; - } - - @Override - public void visit(Renderer renderer) { - renderer.clearCurrentRender(); - } - - @Override - public void refreshTextColor() { - boolean wasChecked = false; - for (BridgeObject bp : bridgeParts) { - if (bp.isValidated()) { - wasChecked = true; - if (bp.containsAnyError()) { - setStatus(CheckStatus.ERROR); - return; - } - } - } - if (wasChecked) { - setStatus(CheckStatus.OK); - } else { - setStatus(CheckStatus.NOT_CHECKED); - } - } - -} diff --git a/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/AllBridgesNode.java b/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/AllBridgesNode.java deleted file mode 100644 index 7ee41d69f7f23abacd662f72ab07616fa0b0d5dd..0000000000000000000000000000000000000000 --- a/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/AllBridgesNode.java +++ /dev/null @@ -1,30 +0,0 @@ -package de.hft.stuttgart.citydoctor2.gui.tree; - -import java.util.List; - -import de.hft.stuttgart.citydoctor2.datastructure.BridgeObject; -import de.hft.stuttgart.citydoctor2.gui.Renderer; - -public class AllBridgesNode extends Renderable { - - private final List bridges; - - public AllBridgesNode(List bridges) { - this.bridges = bridges; - } - - @Override - public void refreshTextColor() { - // no color changes - } - - @Override - public String getText() { - return "Bridges"; - } - - @Override - public void visit(Renderer renderer) { - renderer.renderBridges(bridges); - } -} diff --git a/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/AllBuildingPartsNode.java b/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/AllBuildingPartsNode.java deleted file mode 100644 index 55699c1ef69d1c5d7bd6940734701db955d50386..0000000000000000000000000000000000000000 --- a/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/AllBuildingPartsNode.java +++ /dev/null @@ -1,46 +0,0 @@ -package de.hft.stuttgart.citydoctor2.gui.tree; - -import java.util.List; - -import de.hft.stuttgart.citydoctor2.datastructure.BuildingPart; -import de.hft.stuttgart.citydoctor2.gui.CheckStatus; -import de.hft.stuttgart.citydoctor2.gui.Renderer; - -public class AllBuildingPartsNode extends Renderable { - - private final List buildingParts; - - public AllBuildingPartsNode(List buildingParts) { - this.buildingParts = buildingParts; - } - - @Override - public String getText() { - return "Building Parts"; - } - - @Override - public void visit(Renderer renderer) { - renderer.clearCurrentRender(); - } - - @Override - public void refreshTextColor() { - boolean wasChecked = false; - for (BuildingPart bp : buildingParts) { - if (bp.isValidated()) { - wasChecked = true; - if (bp.containsAnyError()) { - setStatus(CheckStatus.ERROR); - return; - } - } - } - if (wasChecked) { - setStatus(CheckStatus.OK); - } else { - setStatus(CheckStatus.NOT_CHECKED); - } - } - -} diff --git a/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/AllBuildingUnitsNode.java b/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/AllBuildingUnitsNode.java deleted file mode 100644 index e91e9600b300d7b40eba5c7a48bc094506d64dff..0000000000000000000000000000000000000000 --- a/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/AllBuildingUnitsNode.java +++ /dev/null @@ -1,46 +0,0 @@ -package de.hft.stuttgart.citydoctor2.gui.tree; - -import de.hft.stuttgart.citydoctor2.datastructure.BuildingUnit; -import de.hft.stuttgart.citydoctor2.gui.CheckStatus; -import de.hft.stuttgart.citydoctor2.gui.Renderer; - -import java.util.List; - -public class AllBuildingUnitsNode extends Renderable{ - - private final List buildingUnits; - - public AllBuildingUnitsNode(List buildingUnits) { - this.buildingUnits = buildingUnits; - } - - @Override - public String getText() { - return "Building Units"; - } - - @Override - public void visit(Renderer renderer) { - renderer.clearCurrentRender(); - } - - @Override - public void refreshTextColor() { - boolean wasChecked = false; - for (BuildingUnit buildingUnit : buildingUnits) { - if (buildingUnit.isValidated()) { - wasChecked = true; - if (buildingUnit.containsAnyError()) { - setStatus(CheckStatus.ERROR); - return; - } - } - } - if (wasChecked) { - setStatus(CheckStatus.OK); - } else { - setStatus(CheckStatus.NOT_CHECKED); - } - } - -} diff --git a/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/AllBuildingsNode.java b/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/AllBuildingsNode.java deleted file mode 100644 index 7f1c620b28b29aa03ac47a25eddbc596d27c506b..0000000000000000000000000000000000000000 --- a/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/AllBuildingsNode.java +++ /dev/null @@ -1,31 +0,0 @@ -package de.hft.stuttgart.citydoctor2.gui.tree; - -import java.util.List; - -import de.hft.stuttgart.citydoctor2.datastructure.Building; -import de.hft.stuttgart.citydoctor2.gui.Renderer; - -public class AllBuildingsNode extends Renderable { - - private final List buildings; - - public AllBuildingsNode(List buildings) { - this.buildings = buildings; - } - - @Override - public void refreshTextColor() { - // no color changes - } - - @Override - public String getText() { - return "Buildings"; - } - - @Override - public void visit(Renderer renderer) { - renderer.renderBuildings(buildings); - } - -} diff --git a/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/AllCityFurnitureNode.java b/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/AllCityFurnitureNode.java deleted file mode 100644 index 936e25f0e62384ccc03210e94877f3f3e76a6bd8..0000000000000000000000000000000000000000 --- a/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/AllCityFurnitureNode.java +++ /dev/null @@ -1,34 +0,0 @@ -package de.hft.stuttgart.citydoctor2.gui.tree; - - -import de.hft.stuttgart.citydoctor2.datastructure.CityFurniture; -import de.hft.stuttgart.citydoctor2.gui.Renderer; - -import java.util.List; - -public class AllCityFurnitureNode extends Renderable{ - - private final List cityFurnitures; - - public AllCityFurnitureNode(List cityFurnitures) { - this.cityFurnitures = cityFurnitures; - } - - @Override - public void refreshTextColor() { - // no color changes - } - - @Override - public String getText() { - return "CityFurniture"; - } - - @Override - public void visit(Renderer renderer) { - renderer.clearCurrentRender(); - renderer.renderCityFurniture(cityFurnitures); - } - -} - diff --git a/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/AllFurnitureNode.java b/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/AllFurnitureNode.java deleted file mode 100644 index 435f1c3b23fe734021cbe0f4e15a98bb8307c065..0000000000000000000000000000000000000000 --- a/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/AllFurnitureNode.java +++ /dev/null @@ -1,45 +0,0 @@ -package de.hft.stuttgart.citydoctor2.gui.tree; - -import de.hft.stuttgart.citydoctor2.datastructure.AbstractFurniture; -import de.hft.stuttgart.citydoctor2.gui.CheckStatus; -import de.hft.stuttgart.citydoctor2.gui.Renderer; - -import java.util.List; - -public class AllFurnitureNode extends Renderable{ - - private final List furniture; - - public AllFurnitureNode(List furniture) { - this.furniture = furniture; - } - - @Override - public String getText() { - return "Furniture"; - } - - @Override - public void visit(Renderer renderer) { - renderer.clearCurrentRender(); - } - - @Override - public void refreshTextColor() { - boolean wasChecked = false; - for (AbstractFurniture af : furniture) { - if (af.isValidated()) { - wasChecked = true; - if (af.containsAnyError()) { - setStatus(CheckStatus.ERROR); - return; - } - } - } - if (wasChecked) { - setStatus(CheckStatus.OK); - } else { - setStatus(CheckStatus.NOT_CHECKED); - } - } -} diff --git a/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/AllInstallationsNode.java b/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/AllInstallationsNode.java deleted file mode 100644 index 192a58d9c655fefb5e7c5b44c8a912766e9553e6..0000000000000000000000000000000000000000 --- a/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/AllInstallationsNode.java +++ /dev/null @@ -1,46 +0,0 @@ -package de.hft.stuttgart.citydoctor2.gui.tree; - -import java.util.List; - -import de.hft.stuttgart.citydoctor2.datastructure.Installation; -import de.hft.stuttgart.citydoctor2.gui.CheckStatus; -import de.hft.stuttgart.citydoctor2.gui.Renderer; - -public class AllInstallationsNode extends Renderable { - - private final List buildingInstallations; - - public AllInstallationsNode(List bis) { - this.buildingInstallations = bis; - } - - @Override - public String getText() { - return "Building Installations"; - } - - @Override - public void visit(Renderer renderer) { - renderer.clearCurrentRender(); - } - - @Override - public void refreshTextColor() { - boolean wasChecked = false; - for (Installation bp : buildingInstallations) { - if (bp.isValidated()) { - wasChecked = true; - if (bp.containsAnyError()) { - setStatus(CheckStatus.ERROR); - return; - } - } - } - if (wasChecked) { - setStatus(CheckStatus.OK); - } else { - setStatus(CheckStatus.NOT_CHECKED); - } - } - -} \ No newline at end of file diff --git a/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/AllOpeningsNode.java b/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/AllOpeningsNode.java deleted file mode 100644 index 64f35c902e132e2862d96b8909c907568eaba3a4..0000000000000000000000000000000000000000 --- a/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/AllOpeningsNode.java +++ /dev/null @@ -1,46 +0,0 @@ -package de.hft.stuttgart.citydoctor2.gui.tree; - -import java.util.List; - -import de.hft.stuttgart.citydoctor2.datastructure.Opening; -import de.hft.stuttgart.citydoctor2.gui.CheckStatus; -import de.hft.stuttgart.citydoctor2.gui.Renderer; - -public class AllOpeningsNode extends Renderable { - - private final List openings; - - public AllOpeningsNode(List openings) { - this.openings = openings; - } - - @Override - public void refreshTextColor() { - boolean wasChecked = false; - for (Opening op : openings) { - if (op.isValidated()) { - wasChecked = true; - if (op.containsAnyError()) { - setStatus(CheckStatus.ERROR); - return; - } - } - } - if (wasChecked) { - setStatus(CheckStatus.OK); - } else { - setStatus(CheckStatus.NOT_CHECKED); - } - } - - @Override - public String getText() { - return "Openings"; - } - - @Override - public void visit(Renderer renderer) { - renderer.clearCurrentRender(); - } - -} diff --git a/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/AllOtherObjectsNode.java b/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/AllOtherObjectsNode.java deleted file mode 100644 index c45ca90aaebef5ca37288698b3c1ff8a7bab645d..0000000000000000000000000000000000000000 --- a/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/AllOtherObjectsNode.java +++ /dev/null @@ -1,48 +0,0 @@ -package de.hft.stuttgart.citydoctor2.gui.tree; - -import de.hft.stuttgart.citydoctor2.datastructure.GenericCityObject; -import de.hft.stuttgart.citydoctor2.gui.CheckStatus; -import de.hft.stuttgart.citydoctor2.gui.Renderer; -import javafx.scene.paint.Color; - -import java.util.List; - -public class AllOtherObjectsNode extends Renderable{ - - private final List genericObjects; - - public AllOtherObjectsNode(List genericObjects) { - this.genericObjects = genericObjects; - } - - @Override - public void refreshTextColor() { - boolean wasChecked = false; - for (GenericCityObject gco : genericObjects) { - if (gco.isValidated()) { - wasChecked = true; - if (gco.containsAnyError()) { - setStatus(CheckStatus.ERROR); - return; - } - } - } - if (wasChecked) { - setStatus(CheckStatus.OK); - } else { - setStatus(CheckStatus.NOT_CHECKED); - } - } - - @Override - public String getText() { - return "GenericCityObjects"; - } - - @Override - public void visit(Renderer renderer) { - renderer.clearCurrentRender(); - renderer.renderCityObjects(genericObjects, Color.GRAY); - } - -} diff --git a/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/AllRoomsNode.java b/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/AllRoomsNode.java deleted file mode 100644 index 1f2f002eabbf8fd98bb44701bd14a9858783df90..0000000000000000000000000000000000000000 --- a/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/AllRoomsNode.java +++ /dev/null @@ -1,45 +0,0 @@ -package de.hft.stuttgart.citydoctor2.gui.tree; - -import de.hft.stuttgart.citydoctor2.datastructure.AbstractRoom; -import de.hft.stuttgart.citydoctor2.gui.CheckStatus; -import de.hft.stuttgart.citydoctor2.gui.Renderer; - -import java.util.List; - -public class AllRoomsNode extends Renderable{ - - private final List rooms; - - public AllRoomsNode(List rooms) { - this.rooms = rooms; - } - - @Override - public String getText() { - return "Building Rooms"; - } - - @Override - public void visit(Renderer renderer) { - renderer.clearCurrentRender(); - } - - @Override - public void refreshTextColor() { - boolean wasChecked = false; - for (AbstractRoom ar : rooms) { - if (ar.isValidated()) { - wasChecked = true; - if (ar.containsAnyError()) { - setStatus(CheckStatus.ERROR); - return; - } - } - } - if (wasChecked) { - setStatus(CheckStatus.OK); - } else { - setStatus(CheckStatus.NOT_CHECKED); - } - } -} diff --git a/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/AllStoreysNode.java b/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/AllStoreysNode.java deleted file mode 100644 index 9a2df0777e834dc1a3d22c31e12711ac8052a802..0000000000000000000000000000000000000000 --- a/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/AllStoreysNode.java +++ /dev/null @@ -1,46 +0,0 @@ -package de.hft.stuttgart.citydoctor2.gui.tree; - -import de.hft.stuttgart.citydoctor2.datastructure.Storey; -import de.hft.stuttgart.citydoctor2.gui.CheckStatus; -import de.hft.stuttgart.citydoctor2.gui.Renderer; - -import java.util.List; - -public class AllStoreysNode extends Renderable{ - - private final List storeys; - - public AllStoreysNode(List storeys) { - this.storeys = storeys; - } - - @Override - public String getText() { - return "Building Storeys"; - } - - @Override - public void visit(Renderer renderer) { - renderer.clearCurrentRender(); - } - - @Override - public void refreshTextColor() { - boolean wasChecked = false; - for (Storey storey : storeys) { - if (storey.isValidated()) { - wasChecked = true; - if (storey.containsAnyError()) { - setStatus(CheckStatus.ERROR); - return; - } - } - } - if (wasChecked) { - setStatus(CheckStatus.OK); - } else { - setStatus(CheckStatus.NOT_CHECKED); - } - } - -} diff --git a/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/AllTerrainNode.java b/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/AllTerrainNode.java deleted file mode 100644 index 61a8eb3f24ab26bae5d7ed4038b3d1784c9e053d..0000000000000000000000000000000000000000 --- a/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/AllTerrainNode.java +++ /dev/null @@ -1,31 +0,0 @@ -package de.hft.stuttgart.citydoctor2.gui.tree; - -import java.util.List; - -import de.hft.stuttgart.citydoctor2.datastructure.CityObject; -import de.hft.stuttgart.citydoctor2.gui.Renderer; - -public class AllTerrainNode extends Renderable { - - private final List land; - - public AllTerrainNode(List land) { - this.land = land; - } - - @Override - public void refreshTextColor() { - // no use - } - - @Override - public String getText() { - return "Terrain"; - } - - @Override - public void visit(Renderer renderer) { - renderer.renderTerrain(land); - } - -} diff --git a/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/AllTinNode.java b/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/AllTinNode.java deleted file mode 100644 index de8e3cee59fd24c209f0d8ae1e5da49594379c91..0000000000000000000000000000000000000000 --- a/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/AllTinNode.java +++ /dev/null @@ -1,41 +0,0 @@ -/*- - * Copyright 2022 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.gui.tree; - -import java.util.List; - -import de.hft.stuttgart.citydoctor2.datastructure.TinObject; -import de.hft.stuttgart.citydoctor2.gui.Renderer; - -public class AllTinNode extends Renderable { - - public AllTinNode(List components) {} - - @Override - public void refreshTextColor() {} - - @Override - public String getText() { - return "Components"; - } - - @Override - public void visit(Renderer renderer) {} - -} diff --git a/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/AllTrafficAreaNode.java b/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/AllTrafficAreaNode.java deleted file mode 100644 index e0b59d1fe3681249166b3481a14850282a7cd241..0000000000000000000000000000000000000000 --- a/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/AllTrafficAreaNode.java +++ /dev/null @@ -1,35 +0,0 @@ -package de.hft.stuttgart.citydoctor2.gui.tree; - -import de.hft.stuttgart.citydoctor2.datastructure.TrafficAreaObject; -import de.hft.stuttgart.citydoctor2.gui.Renderer; - -import java.util.List; - -public class AllTrafficAreaNode extends Renderable { - - private final List areas; - - private final String text; - - public AllTrafficAreaNode(List areas, TrafficAreaObject.TrafficAreaType type) { - this.areas = areas; - this.text = type.toString(); - - } - - @Override - public void refreshTextColor() { - // no use - } - - @Override - public String getText() { - return this.text; - } - - @Override - public void visit(Renderer renderer) { - renderer.renderTransportation(areas); - } - -} diff --git a/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/AllTrafficSpacesNode.java b/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/AllTrafficSpacesNode.java deleted file mode 100644 index e6e7b1b8cf07a6c128d04e86d9d62ff5bc306440..0000000000000000000000000000000000000000 --- a/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/AllTrafficSpacesNode.java +++ /dev/null @@ -1,35 +0,0 @@ -package de.hft.stuttgart.citydoctor2.gui.tree; - -import de.hft.stuttgart.citydoctor2.datastructure.TrafficSpaceObject; - -import de.hft.stuttgart.citydoctor2.gui.Renderer; - -import java.util.List; - -public class AllTrafficSpacesNode extends Renderable { - - private final List spaces; - - private final String text; - - public AllTrafficSpacesNode(List sections, TrafficSpaceObject.TrafficSpaceType type) { - this.spaces = sections; - this.text = type.toString(); - - } - - @Override - public void refreshTextColor() { - // no use - } - - @Override - public String getText() { - return this.text; - } - - @Override - public void visit(Renderer renderer) { - renderer.renderTransportation(spaces); - } -} diff --git a/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/AllTransportSectionNode.java b/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/AllTransportSectionNode.java deleted file mode 100644 index 465ebaf71b32c7e01793fcb86a5d6da7b8d7718d..0000000000000000000000000000000000000000 --- a/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/AllTransportSectionNode.java +++ /dev/null @@ -1,34 +0,0 @@ -package de.hft.stuttgart.citydoctor2.gui.tree; - -import de.hft.stuttgart.citydoctor2.datastructure.TransportSection; -import de.hft.stuttgart.citydoctor2.gui.Renderer; - -import java.util.List; - -public class AllTransportSectionNode extends Renderable { - - private final List sections; - - private final String text; - - public AllTransportSectionNode(List sections, TransportSection.SectionType type) { - this.sections = sections; - this.text = type.toString(); - - } - - @Override - public void refreshTextColor() { - // no use - } - - @Override - public String getText() { - return this.text; - } - - @Override - public void visit(Renderer renderer) { - renderer.renderTransportation(sections); - } -} diff --git a/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/AllTransportationNode.java b/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/AllTransportationNode.java deleted file mode 100644 index d72e7dcb2cb30c74c6d9615f4ce5e1784e8807a7..0000000000000000000000000000000000000000 --- a/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/AllTransportationNode.java +++ /dev/null @@ -1,31 +0,0 @@ -package de.hft.stuttgart.citydoctor2.gui.tree; - -import java.util.List; - -import de.hft.stuttgart.citydoctor2.datastructure.TransportationObject; -import de.hft.stuttgart.citydoctor2.gui.Renderer; - -public class AllTransportationNode extends Renderable { - - private final List transportation; - - public AllTransportationNode(List transportation) { - this.transportation = transportation; - } - - @Override - public void refreshTextColor() { - // no use - } - - @Override - public String getText() { - return "Transportation"; - } - - @Override - public void visit(Renderer renderer) { - renderer.renderTransportation(transportation); - } - -} diff --git a/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/AllTunnelConstructiveElementsNode.java b/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/AllTunnelConstructiveElementsNode.java deleted file mode 100644 index 053dc8e3f09ea656b1caa0faa27b9c138c9ebdfb..0000000000000000000000000000000000000000 --- a/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/AllTunnelConstructiveElementsNode.java +++ /dev/null @@ -1,46 +0,0 @@ -package de.hft.stuttgart.citydoctor2.gui.tree; - -import de.hft.stuttgart.citydoctor2.datastructure.TunnelConstructiveElement; -import de.hft.stuttgart.citydoctor2.gui.CheckStatus; -import de.hft.stuttgart.citydoctor2.gui.Renderer; - -import java.util.List; - -public class AllTunnelConstructiveElementsNode extends Renderable{ - - private final List constructiveElements; - - public AllTunnelConstructiveElementsNode(List constructiveElements) { - this.constructiveElements = constructiveElements; - } - - @Override - public String getText() { - return "Constructive Elements"; - } - - @Override - public void visit(Renderer renderer) { - renderer.clearCurrentRender(); - } - - @Override - public void refreshTextColor() { - boolean isValidated = false; - for (TunnelConstructiveElement bce : constructiveElements) { - if (bce.isValidated()) { - isValidated = true; - } - if (bce.containsAnyError()) { - setStatus(CheckStatus.ERROR); - return; - } - } - if (isValidated) { - setStatus(CheckStatus.OK); - } else { - setStatus(CheckStatus.NOT_CHECKED); - } - } - -} diff --git a/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/AllTunnelPartsNode.java b/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/AllTunnelPartsNode.java deleted file mode 100644 index 989bafac390816fe06c6632a35b263cee6a0a6ec..0000000000000000000000000000000000000000 --- a/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/AllTunnelPartsNode.java +++ /dev/null @@ -1,45 +0,0 @@ -package de.hft.stuttgart.citydoctor2.gui.tree; - -import de.hft.stuttgart.citydoctor2.datastructure.TunnelPart; -import de.hft.stuttgart.citydoctor2.gui.CheckStatus; -import de.hft.stuttgart.citydoctor2.gui.Renderer; - -import java.util.List; - -public class AllTunnelPartsNode extends Renderable{ - - private final List tunnelParts; - - public AllTunnelPartsNode(List tunnelParts) { - this.tunnelParts = tunnelParts; - } - - @Override - public String getText() { - return "Tunnel Parts"; - } - - @Override - public void visit(Renderer renderer) { - renderer.clearCurrentRender(); - } - - @Override - public void refreshTextColor() { - boolean wasChecked = false; - for (TunnelPart tp : tunnelParts) { - if (tp.isValidated()) { - wasChecked = true; - if (tp.containsAnyError()) { - setStatus(CheckStatus.ERROR); - return; - } - } - } - if (wasChecked) { - setStatus(CheckStatus.OK); - } else { - setStatus(CheckStatus.NOT_CHECKED); - } - } -} diff --git a/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/AllTunnelsNode.java b/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/AllTunnelsNode.java deleted file mode 100644 index 477b99233a5d3e5cbdab4cc61f1654e8c99141a6..0000000000000000000000000000000000000000 --- a/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/AllTunnelsNode.java +++ /dev/null @@ -1,31 +0,0 @@ -package de.hft.stuttgart.citydoctor2.gui.tree; - -import de.hft.stuttgart.citydoctor2.datastructure.Tunnel; -import de.hft.stuttgart.citydoctor2.gui.Renderer; - -import java.util.List; - -public class AllTunnelsNode extends Renderable{ - - private final List tunnels; - - public AllTunnelsNode(List tunnels) { - this.tunnels = tunnels; - } - - @Override - public void refreshTextColor() { - // no color changes - } - - @Override - public String getText() { - return "Tunnels"; - } - - @Override - public void visit(Renderer renderer) { - renderer.renderTunnels(tunnels); - } - -} diff --git a/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/AllVegetationNode.java b/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/AllVegetationNode.java deleted file mode 100644 index 7911341c79ee9fa053f350b7d17be6444e12b89d..0000000000000000000000000000000000000000 --- a/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/AllVegetationNode.java +++ /dev/null @@ -1,31 +0,0 @@ -package de.hft.stuttgart.citydoctor2.gui.tree; - -import java.util.List; - -import de.hft.stuttgart.citydoctor2.datastructure.Vegetation; -import de.hft.stuttgart.citydoctor2.gui.Renderer; - -public class AllVegetationNode extends Renderable { - - private final List vegetation; - - public AllVegetationNode(List vegetation) { - this.vegetation = vegetation; - } - - @Override - public void refreshTextColor() { - // no use - } - - @Override - public String getText() { - return "Vegetation"; - } - - @Override - public void visit(Renderer renderer) { - renderer.renderVegetation(vegetation); - } - -} diff --git a/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/AllWaterNode.java b/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/AllWaterNode.java deleted file mode 100644 index 3143d5895d660123588b285ed5d3ec3ea0cd0d39..0000000000000000000000000000000000000000 --- a/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/AllWaterNode.java +++ /dev/null @@ -1,31 +0,0 @@ -package de.hft.stuttgart.citydoctor2.gui.tree; - -import java.util.List; - -import de.hft.stuttgart.citydoctor2.datastructure.WaterObject; -import de.hft.stuttgart.citydoctor2.gui.Renderer; - -public class AllWaterNode extends Renderable { - - private final List water; - - public AllWaterNode(List water) { - this.water = water; - } - - @Override - public void refreshTextColor() { - // no use - } - - @Override - public String getText() { - return "Water"; - } - - @Override - public void visit(Renderer renderer) { - renderer.renderWater(water); - } - -} diff --git a/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/BoundarySurfaceNode.java b/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/BoundarySurfaceNode.java deleted file mode 100644 index 581bc2e94f566dfb09a2f5d127fe22babe40703c..0000000000000000000000000000000000000000 --- a/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/BoundarySurfaceNode.java +++ /dev/null @@ -1,35 +0,0 @@ -package de.hft.stuttgart.citydoctor2.gui.tree; - -import de.hft.stuttgart.citydoctor2.datastructure.BoundarySurface; -import de.hft.stuttgart.citydoctor2.gui.CheckStatus; -import de.hft.stuttgart.citydoctor2.gui.Renderer; - -public class BoundarySurfaceNode extends Renderable { - - private final BoundarySurface bs; - - public BoundarySurfaceNode(BoundarySurface bs) { - this.bs = bs; - } - - @Override - public String getText() { - return bs.getGmlId().getGmlString() + " [" + bs.getType() + "]"; - } - - @Override - public void visit(Renderer renderer) { - renderer.render(bs); - } - - @Override - public void refreshTextColor() { - if (!bs.isValidated()) { - setStatus(CheckStatus.NOT_CHECKED); - } else if (bs.containsAnyError()) { - setStatus(CheckStatus.ERROR); - } else { - setStatus(CheckStatus.OK); - } - } -} diff --git a/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/BridgeConstructiveElementNode.java b/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/BridgeConstructiveElementNode.java deleted file mode 100644 index d3f839dedd068f07b3a5e02ec3e104beb087b810..0000000000000000000000000000000000000000 --- a/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/BridgeConstructiveElementNode.java +++ /dev/null @@ -1,54 +0,0 @@ -/*- - * Copyright 2023 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.gui.tree; - -import de.hft.stuttgart.citydoctor2.datastructure.BridgeConstructiveElement; -import de.hft.stuttgart.citydoctor2.gui.CheckStatus; -import de.hft.stuttgart.citydoctor2.gui.Renderer; - -public class BridgeConstructiveElementNode extends Renderable { - - private final BridgeConstructiveElement bce; - - public BridgeConstructiveElementNode(BridgeConstructiveElement bce) { - this.bce = bce; - } - - @Override - public String getText() { - return bce.getGmlId().getGmlString(); - } - - @Override - public void visit(Renderer renderer) { - renderer.render(bce); - } - - @Override - public void refreshTextColor() { - if (!bce.isValidated()) { - setStatus(CheckStatus.NOT_CHECKED); - } else if (bce.containsAnyError()) { - setStatus(CheckStatus.ERROR); - } else { - setStatus(CheckStatus.OK); - } - } - -} diff --git a/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/BridgeNode.java b/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/BridgeNode.java deleted file mode 100644 index 8a0b96c2c16cd1f10db17559fef46c85487f7495..0000000000000000000000000000000000000000 --- a/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/BridgeNode.java +++ /dev/null @@ -1,60 +0,0 @@ -/*- - * Copyright 2022 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.gui.tree; - -import de.hft.stuttgart.citydoctor2.datastructure.BridgeObject; -import de.hft.stuttgart.citydoctor2.datastructure.CityObject; -import de.hft.stuttgart.citydoctor2.gui.CheckStatus; -import de.hft.stuttgart.citydoctor2.gui.Renderer; - -public class BridgeNode extends Renderable implements FeatureNode { - - private final BridgeObject bridge; - - public BridgeNode(BridgeObject bridge) { - this.bridge = bridge; - } - - @Override - public String getText() { - return bridge.getGmlId().getGmlString(); - } - - @Override - public void visit(Renderer renderer) { - renderer.render(bridge); - } - - @Override - public void refreshTextColor() { - if (!bridge.isValidated()) { - setStatus(CheckStatus.NOT_CHECKED); - } else if (bridge.containsAnyError()) { - setStatus(CheckStatus.ERROR); - } else { - setStatus(CheckStatus.OK); - } - } - - - @Override - public CityObject getFeature() { - return bridge; - } -} diff --git a/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/BuildingNode.java b/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/BuildingNode.java deleted file mode 100644 index 7334ab07d0e8e53dfdebb4ab04a3d57d24d9a0fb..0000000000000000000000000000000000000000 --- a/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/BuildingNode.java +++ /dev/null @@ -1,45 +0,0 @@ -package de.hft.stuttgart.citydoctor2.gui.tree; - -import de.hft.stuttgart.citydoctor2.datastructure.Building; -import de.hft.stuttgart.citydoctor2.datastructure.CityObject; -import de.hft.stuttgart.citydoctor2.gui.CheckStatus; -import de.hft.stuttgart.citydoctor2.gui.Renderer; - -public class BuildingNode extends Renderable implements FeatureNode { - - private final Building building; - - public BuildingNode(Building building) { - this.building = building; - } - - @Override - public String getText() { - return building.getGmlId().getGmlString(); - } - - public Building getBuilding() { - return building; - } - - @Override - public void visit(Renderer renderer) { - renderer.render(building); - } - - @Override - public void refreshTextColor() { - if (!building.isValidated()) { - setStatus(CheckStatus.NOT_CHECKED); - } else if (building.containsAnyError()) { - setStatus(CheckStatus.ERROR); - } else { - setStatus(CheckStatus.OK); - } - } - - @Override - public CityObject getFeature() { - return building; - } -} diff --git a/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/BuildingPartNode.java b/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/BuildingPartNode.java deleted file mode 100644 index 4c9b5e263d8464f94c23ae7ac705e06d5bedddea..0000000000000000000000000000000000000000 --- a/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/BuildingPartNode.java +++ /dev/null @@ -1,36 +0,0 @@ -package de.hft.stuttgart.citydoctor2.gui.tree; - -import de.hft.stuttgart.citydoctor2.datastructure.BuildingPart; -import de.hft.stuttgart.citydoctor2.gui.CheckStatus; -import de.hft.stuttgart.citydoctor2.gui.Renderer; - -public class BuildingPartNode extends Renderable { - - private final BuildingPart bp; - - public BuildingPartNode(BuildingPart bp) { - this.bp = bp; - } - - @Override - public String getText() { - return bp.getGmlId().getGmlString(); - } - - @Override - public void visit(Renderer renderer) { - renderer.render(bp); - } - - @Override - public void refreshTextColor() { - if (!bp.isValidated()) { - setStatus(CheckStatus.NOT_CHECKED); - } else if (bp.containsAnyError()) { - setStatus(CheckStatus.ERROR); - } else { - setStatus(CheckStatus.OK); - } - } - -} diff --git a/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/BuildingUnitNode.java b/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/BuildingUnitNode.java deleted file mode 100644 index 805b7503a7ca69501555564feb55d2edee826e8f..0000000000000000000000000000000000000000 --- a/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/BuildingUnitNode.java +++ /dev/null @@ -1,38 +0,0 @@ -package de.hft.stuttgart.citydoctor2.gui.tree; - -import de.hft.stuttgart.citydoctor2.datastructure.BuildingUnit; -import de.hft.stuttgart.citydoctor2.gui.CheckStatus; -import de.hft.stuttgart.citydoctor2.gui.Renderer; - -public class BuildingUnitNode extends Renderable{ - - private final BuildingUnit buildingUnit; - - public BuildingUnitNode(BuildingUnit buildingUnit) { - this.buildingUnit = buildingUnit; - } - - @Override - public String getText() { - return buildingUnit.getGmlId().getGmlString(); - } - - - @Override - public void visit(Renderer renderer) { - renderer.render(buildingUnit); - } - - @Override - public void refreshTextColor() { - if (!buildingUnit.isValidated()) { - setStatus(CheckStatus.NOT_CHECKED); - } else if (buildingUnit.containsAnyError()) { - setStatus(CheckStatus.ERROR); - } else { - setStatus(CheckStatus.OK); - } - } - - -} diff --git a/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/CityFurnitureNode.java b/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/CityFurnitureNode.java deleted file mode 100644 index 588669bb95efc72f36e52f2b24947908331fb575..0000000000000000000000000000000000000000 --- a/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/CityFurnitureNode.java +++ /dev/null @@ -1,42 +0,0 @@ -package de.hft.stuttgart.citydoctor2.gui.tree; - -import de.hft.stuttgart.citydoctor2.datastructure.CityFurniture; -import de.hft.stuttgart.citydoctor2.datastructure.CityObject; -import de.hft.stuttgart.citydoctor2.gui.CheckStatus; -import de.hft.stuttgart.citydoctor2.gui.Renderer; - -public class CityFurnitureNode extends Renderable implements FeatureNode { - - private final CityFurniture cityFurniture; - - public CityFurnitureNode(CityFurniture cityFurniture) { - this.cityFurniture = cityFurniture; - } - - @Override - public String getText() { - return cityFurniture.getGmlId().getGmlString(); - } - - - @Override - public void visit(Renderer renderer) { - renderer.render(cityFurniture); - } - - @Override - public void refreshTextColor() { - if (!cityFurniture.isValidated()) { - setStatus(CheckStatus.NOT_CHECKED); - } else if (cityFurniture.containsAnyError()) { - setStatus(CheckStatus.ERROR); - } else { - setStatus(CheckStatus.OK); - } - } - - @Override - public CityObject getFeature() { - return cityFurniture; - } -} diff --git a/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/ErrorItemVisitor.java b/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/ErrorItemVisitor.java index d28cca5eb34404b17232085c5ed1ba4ae7d95c03..943954cc70a49df4d6fb87e11e2e428df9037872 100644 --- a/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/ErrorItemVisitor.java +++ b/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/ErrorItemVisitor.java @@ -46,6 +46,11 @@ import de.hft.stuttgart.citydoctor2.datastructure.LinearRing.LinearRingType; import de.hft.stuttgart.citydoctor2.datastructure.Polygon; import de.hft.stuttgart.citydoctor2.datastructure.Vertex; import de.hft.stuttgart.citydoctor2.gui.CheckStatus; +import de.hft.stuttgart.citydoctor2.gui.tree.node.EdgeNode; +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.TextNode; +import de.hft.stuttgart.citydoctor2.gui.tree.node.VertexNode; import de.hft.stuttgart.citydoctor2.math.Triangle3d; import de.hft.stuttgart.citydoctor2.utils.Localization; import de.hft.stuttgart.citydoctor2.utils.PolygonIntersection; diff --git a/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/FeatureNode.java b/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/FeatureNode.java deleted file mode 100644 index 5ad2972c553b504a989b5ce26870e20295ce33fb..0000000000000000000000000000000000000000 --- a/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/FeatureNode.java +++ /dev/null @@ -1,8 +0,0 @@ -package de.hft.stuttgart.citydoctor2.gui.tree; - -import de.hft.stuttgart.citydoctor2.datastructure.CityObject; - -public interface FeatureNode { - - public CityObject getFeature(); -} diff --git a/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/FurnitureNode.java b/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/FurnitureNode.java deleted file mode 100644 index e78251ab4e1d4e6e0f7aba1362b9ebb1ad07c415..0000000000000000000000000000000000000000 --- a/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/FurnitureNode.java +++ /dev/null @@ -1,36 +0,0 @@ -package de.hft.stuttgart.citydoctor2.gui.tree; - -import de.hft.stuttgart.citydoctor2.datastructure.AbstractFurniture; -import de.hft.stuttgart.citydoctor2.gui.CheckStatus; -import de.hft.stuttgart.citydoctor2.gui.Renderer; - -public class FurnitureNode extends Renderable{ - - private final AbstractFurniture furniture; - - public FurnitureNode(AbstractFurniture furniture) { - this.furniture = furniture; - } - - @Override - public String getText() { - return furniture.getGmlId().getGmlString(); - } - - - @Override - public void visit(Renderer renderer) { - renderer.render(furniture); - } - - @Override - public void refreshTextColor() { - if (!furniture.isValidated()) { - setStatus(CheckStatus.NOT_CHECKED); - } else if (furniture.containsAnyError()) { - setStatus(CheckStatus.ERROR); - } else { - setStatus(CheckStatus.OK); - } - } -} diff --git a/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/GenericCityObjectsNode.java b/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/GenericCityObjectsNode.java deleted file mode 100644 index 36f9d912862ee98fde6267522cc76308fb658719..0000000000000000000000000000000000000000 --- a/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/GenericCityObjectsNode.java +++ /dev/null @@ -1,42 +0,0 @@ -package de.hft.stuttgart.citydoctor2.gui.tree; - -import de.hft.stuttgart.citydoctor2.datastructure.CityObject; -import de.hft.stuttgart.citydoctor2.datastructure.GenericCityObject; -import de.hft.stuttgart.citydoctor2.gui.CheckStatus; -import de.hft.stuttgart.citydoctor2.gui.Renderer; - -public class GenericCityObjectsNode extends Renderable implements FeatureNode { - - private final GenericCityObject gcobject; - - public GenericCityObjectsNode(GenericCityObject gcobject) { - this.gcobject = gcobject; - } - - @Override - public String getText() { - return gcobject.getGmlId().getGmlString(); - } - - - @Override - public void visit(Renderer renderer) { - renderer.render(gcobject); - } - - @Override - public void refreshTextColor() { - if (!gcobject.isValidated()) { - setStatus(CheckStatus.NOT_CHECKED); - } else if (gcobject.containsAnyError()) { - setStatus(CheckStatus.ERROR); - } else { - setStatus(CheckStatus.OK); - } - } - - @Override - public CityObject getFeature() { - return gcobject; - } -} diff --git a/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/InstallationNode.java b/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/InstallationNode.java deleted file mode 100644 index ffe009db7d5b80250dbbf82a7de7810a5f3de1ad..0000000000000000000000000000000000000000 --- a/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/InstallationNode.java +++ /dev/null @@ -1,35 +0,0 @@ -package de.hft.stuttgart.citydoctor2.gui.tree; - -import de.hft.stuttgart.citydoctor2.datastructure.Installation; -import de.hft.stuttgart.citydoctor2.gui.CheckStatus; -import de.hft.stuttgart.citydoctor2.gui.Renderer; - -public class InstallationNode extends Renderable { - - private final Installation bi; - - public InstallationNode(Installation bi) { - this.bi = bi; - } - - @Override - public String getText() { - return bi.getGmlId().getGmlString(); - } - - @Override - public void visit(Renderer renderer) { - renderer.render(bi); - } - - @Override - public void refreshTextColor() { - if (!bi.isValidated()) { - setStatus(CheckStatus.NOT_CHECKED); - } else if (bi.containsAnyError()) { - setStatus(CheckStatus.ERROR); - } else { - setStatus(CheckStatus.OK); - } - } -} \ No newline at end of file diff --git a/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/LandUseNode.java b/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/LandUseNode.java deleted file mode 100644 index 443829780723fa92a4825759f1b3ce06640ad41e..0000000000000000000000000000000000000000 --- a/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/LandUseNode.java +++ /dev/null @@ -1,54 +0,0 @@ -/*- - * Copyright 2022 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.gui.tree; - -import de.hft.stuttgart.citydoctor2.datastructure.LandObject; -import de.hft.stuttgart.citydoctor2.gui.CheckStatus; -import de.hft.stuttgart.citydoctor2.gui.Renderer; - -public class LandUseNode extends Renderable { - - private final LandObject landUse; - - public LandUseNode(LandObject landUse) { - this.landUse = landUse; - } - - @Override - public void refreshTextColor() { - if (!landUse.isValidated()) { - setStatus(CheckStatus.NOT_CHECKED); - } else if (landUse.containsAnyError()) { - setStatus(CheckStatus.ERROR); - } else { - setStatus(CheckStatus.OK); - } - } - - @Override - public String getText() { - return "[LandUse] " + landUse.getGmlId().getGmlString(); - } - - @Override - public void visit(Renderer renderer) { - renderer.render(landUse); - } - -} diff --git a/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/ReliefNode.java b/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/ReliefNode.java deleted file mode 100644 index 199d3dfa637ad5aaeb470471a687942ba6fe751c..0000000000000000000000000000000000000000 --- a/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/ReliefNode.java +++ /dev/null @@ -1,55 +0,0 @@ -/*- - * Copyright 2022 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.gui.tree; - -import de.hft.stuttgart.citydoctor2.datastructure.ReliefObject; -import de.hft.stuttgart.citydoctor2.gui.CheckStatus; -import de.hft.stuttgart.citydoctor2.gui.Renderer; - -public class ReliefNode extends Renderable { - - private final ReliefObject relief; - - public ReliefNode(ReliefObject relief) { - this.relief = relief; - } - - - @Override - public void refreshTextColor() { - if (!relief.isValidated()) { - setStatus(CheckStatus.NOT_CHECKED); - } else if (relief.containsAnyError()) { - setStatus(CheckStatus.ERROR); - } else { - setStatus(CheckStatus.OK); - } - } - - @Override - public String getText() { - return "[ReliefFeature] " + relief.getGmlId().getGmlString(); - } - - @Override - public void visit(Renderer renderer) { - renderer.render(relief); - } - -} diff --git a/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/Renderable.java b/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/Renderable.java index 12426a9e94d6d6dbeebaf413e39c1744d263f084..c07d2957d4aa9daf568fcd74e757a7eda18e42f6 100644 --- a/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/Renderable.java +++ b/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/Renderable.java @@ -1,14 +1,23 @@ package de.hft.stuttgart.citydoctor2.gui.tree; import de.hft.stuttgart.citydoctor2.gui.CheckStatus; +import de.hft.stuttgart.citydoctor2.gui.MainWindow; import de.hft.stuttgart.citydoctor2.gui.Renderer; +import de.hft.stuttgart.citydoctor2.utils.Localization; import javafx.beans.property.ObjectProperty; import javafx.beans.property.SimpleObjectProperty; +import javafx.scene.input.Clipboard; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +import static javafx.scene.input.Clipboard.getSystemClipboard; public abstract class Renderable { private final ObjectProperty statusProperty = new SimpleObjectProperty<>(); + private static Logger logger = LogManager.getLogger(Renderable.class); + /** * @return the status */ @@ -31,4 +40,18 @@ public abstract class Renderable { public abstract String getText(); public abstract void visit(Renderer renderer); + public void getClipboardAction(MainWindow mainWindow) { + Clipboard clipboard = getSystemClipboard(); + clipboard.clear(); + if (logger.isInfoEnabled()) { + logger.info(Localization.getText("MainWindow.infoTopLevelCopyID")); + } + } + + public void getFeatureExportAction(MainWindow mainWindow) { + if (logger.isInfoEnabled()) { + logger.info(Localization.getText("MainWindow.infoTopLevelExport")); + } + } + } diff --git a/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/RoomNode.java b/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/RoomNode.java deleted file mode 100644 index 21c283cc483ccd523fee98c5294d1f6e8099b620..0000000000000000000000000000000000000000 --- a/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/RoomNode.java +++ /dev/null @@ -1,36 +0,0 @@ -package de.hft.stuttgart.citydoctor2.gui.tree; - -import de.hft.stuttgart.citydoctor2.datastructure.AbstractRoom; -import de.hft.stuttgart.citydoctor2.gui.CheckStatus; -import de.hft.stuttgart.citydoctor2.gui.Renderer; - -public class RoomNode extends Renderable{ - - private final AbstractRoom room; - - public RoomNode(AbstractRoom room) { - this.room = room; - } - - @Override - public String getText() { - return room.getGmlId().getGmlString(); - } - - - @Override - public void visit(Renderer renderer) { - renderer.render(room); - } - - @Override - public void refreshTextColor() { - if (!room.isValidated()) { - setStatus(CheckStatus.NOT_CHECKED); - } else if (room.containsAnyError()) { - setStatus(CheckStatus.ERROR); - } else { - setStatus(CheckStatus.OK); - } - } -} diff --git a/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/StoreyNode.java b/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/StoreyNode.java deleted file mode 100644 index c0b0fe0ba052bc83610415044b90213ed49d00b6..0000000000000000000000000000000000000000 --- a/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/StoreyNode.java +++ /dev/null @@ -1,37 +0,0 @@ -package de.hft.stuttgart.citydoctor2.gui.tree; - -import de.hft.stuttgart.citydoctor2.datastructure.Storey; -import de.hft.stuttgart.citydoctor2.gui.CheckStatus; -import de.hft.stuttgart.citydoctor2.gui.Renderer; - -public class StoreyNode extends Renderable{ - - private final Storey storey; - - public StoreyNode(Storey storey) { - this.storey = storey; - } - - @Override - public String getText() { - return storey.getGmlId().getGmlString(); - } - - - @Override - public void visit(Renderer renderer) { - renderer.render(storey); - } - - @Override - public void refreshTextColor() { - if (!storey.isValidated()) { - setStatus(CheckStatus.NOT_CHECKED); - } else if (storey.containsAnyError()) { - setStatus(CheckStatus.ERROR); - } else { - setStatus(CheckStatus.OK); - } - } - -} diff --git a/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/TinNode.java b/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/TinNode.java deleted file mode 100644 index 123d1dd4659bc34240b397e38cb743d32d7507ef..0000000000000000000000000000000000000000 --- a/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/TinNode.java +++ /dev/null @@ -1,55 +0,0 @@ -/*- - * Copyright 2022 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.gui.tree; - -import de.hft.stuttgart.citydoctor2.datastructure.TinObject; -import de.hft.stuttgart.citydoctor2.gui.CheckStatus; -import de.hft.stuttgart.citydoctor2.gui.Renderer; - -public class TinNode extends Renderable { - - private final TinObject tin; - - public TinNode(TinObject tin) { - this.tin = tin; - } - - - @Override - public void refreshTextColor() { - if (!tin.isValidated()) { - setStatus(CheckStatus.NOT_CHECKED); - } else if (tin.containsAnyError()) { - setStatus(CheckStatus.ERROR); - } else { - setStatus(CheckStatus.OK); - } - } - - @Override - public String getText() { - return "[TINRelief] " + tin.getGmlId().getGmlString(); - } - - @Override - public void visit(Renderer renderer) { - renderer.render(tin); - } - -} diff --git a/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/TransportationObjectNode.java b/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/TransportationObjectNode.java deleted file mode 100644 index a54cdf27bced613280640ea06deb831972bf7803..0000000000000000000000000000000000000000 --- a/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/TransportationObjectNode.java +++ /dev/null @@ -1,35 +0,0 @@ -package de.hft.stuttgart.citydoctor2.gui.tree; - -import de.hft.stuttgart.citydoctor2.datastructure.TransportationObject; -import de.hft.stuttgart.citydoctor2.gui.CheckStatus; -import de.hft.stuttgart.citydoctor2.gui.Renderer; - -public class TransportationObjectNode extends Renderable { - - private final TransportationObject to; - - public TransportationObjectNode(TransportationObject to) { - this.to = to; - } - - @Override - public String getText() { - return to.getGmlId().getGmlString(); - } - - @Override - public void visit(Renderer renderer) { - renderer.render(to); - } - - @Override - public void refreshTextColor() { - if (!to.isValidated()) { - setStatus(CheckStatus.NOT_CHECKED); - } else if (to.containsAnyError()) { - setStatus(CheckStatus.ERROR); - } else { - setStatus(CheckStatus.OK); - } - } -} diff --git a/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/TunnelConstructiveElementNode.java b/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/TunnelConstructiveElementNode.java deleted file mode 100644 index b11a3239d6c9c3d5359a6dbc35d7eb852f8ac28c..0000000000000000000000000000000000000000 --- a/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/TunnelConstructiveElementNode.java +++ /dev/null @@ -1,35 +0,0 @@ -package de.hft.stuttgart.citydoctor2.gui.tree; - -import de.hft.stuttgart.citydoctor2.datastructure.TunnelConstructiveElement; -import de.hft.stuttgart.citydoctor2.gui.CheckStatus; -import de.hft.stuttgart.citydoctor2.gui.Renderer; - -public class TunnelConstructiveElementNode extends Renderable{ - - private final TunnelConstructiveElement tce; - - public TunnelConstructiveElementNode(TunnelConstructiveElement tce) { - this.tce = tce; - } - - @Override - public String getText() { - return tce.getGmlId().getGmlString(); - } - - @Override - public void visit(Renderer renderer) { - renderer.render(tce); - } - - @Override - public void refreshTextColor() { - if (!tce.isValidated()) { - setStatus(CheckStatus.NOT_CHECKED); - } else if (tce.containsAnyError()) { - setStatus(CheckStatus.ERROR); - } else { - setStatus(CheckStatus.OK); - } - } -} diff --git a/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/TunnelNode.java b/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/TunnelNode.java deleted file mode 100644 index 315bf0b2d68e62a42383cdd65e2e76738a0f280d..0000000000000000000000000000000000000000 --- a/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/TunnelNode.java +++ /dev/null @@ -1,45 +0,0 @@ -package de.hft.stuttgart.citydoctor2.gui.tree; - -import de.hft.stuttgart.citydoctor2.datastructure.CityObject; -import de.hft.stuttgart.citydoctor2.datastructure.Tunnel; -import de.hft.stuttgart.citydoctor2.gui.CheckStatus; -import de.hft.stuttgart.citydoctor2.gui.Renderer; - -public class TunnelNode extends Renderable implements FeatureNode { - - private final Tunnel tunnel; - - public TunnelNode(Tunnel tunnel) { - this.tunnel = tunnel; - } - - @Override - public String getText() { - return tunnel.getGmlId().getGmlString(); - } - - public Tunnel getTunnel() { - return tunnel; - } - - @Override - public void visit(Renderer renderer) { - renderer.render(tunnel); - } - - @Override - public void refreshTextColor() { - if (!tunnel.isValidated()) { - setStatus(CheckStatus.NOT_CHECKED); - } else if (tunnel.containsAnyError()) { - setStatus(CheckStatus.ERROR); - } else { - setStatus(CheckStatus.OK); - } - } - - @Override - public CityObject getFeature() { - return tunnel; - } -} diff --git a/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/TunnelPartNode.java b/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/TunnelPartNode.java deleted file mode 100644 index 04a9a9bbe21b725e3c07f64ffe1e75edfc4de283..0000000000000000000000000000000000000000 --- a/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/TunnelPartNode.java +++ /dev/null @@ -1,35 +0,0 @@ -package de.hft.stuttgart.citydoctor2.gui.tree; - -import de.hft.stuttgart.citydoctor2.datastructure.TunnelPart; -import de.hft.stuttgart.citydoctor2.gui.CheckStatus; -import de.hft.stuttgart.citydoctor2.gui.Renderer; - -public class TunnelPartNode extends Renderable{ - - private final TunnelPart tp; - - public TunnelPartNode(TunnelPart tp) { - this.tp = tp; - } - - @Override - public String getText() { - return tp.getGmlId().getGmlString(); - } - - @Override - public void visit(Renderer renderer) { - renderer.render(tp); - } - - @Override - public void refreshTextColor() { - if (!tp.isValidated()) { - setStatus(CheckStatus.NOT_CHECKED); - } else if (tp.containsAnyError()) { - setStatus(CheckStatus.ERROR); - } else { - setStatus(CheckStatus.OK); - } - } -} diff --git a/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/VegetationNode.java b/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/VegetationNode.java deleted file mode 100644 index d99e55f8629faaf6a59bb559d4b71243bb7e30aa..0000000000000000000000000000000000000000 --- a/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/VegetationNode.java +++ /dev/null @@ -1,61 +0,0 @@ -/*- - * Copyright 2022 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.gui.tree; - -import de.hft.stuttgart.citydoctor2.datastructure.CityObject; -import de.hft.stuttgart.citydoctor2.datastructure.Vegetation; -import de.hft.stuttgart.citydoctor2.gui.CheckStatus; -import de.hft.stuttgart.citydoctor2.gui.Renderer; - -public class VegetationNode extends Renderable implements FeatureNode { - - private final Vegetation veg; - private final String text; - - public VegetationNode(Vegetation veg) { - this.veg = veg; - text = "[" + veg.getVegetationType() + "] " + veg.getGmlId().getGmlString(); - } - - @Override - public void refreshTextColor() { - if (!veg.isValidated()) { - setStatus(CheckStatus.NOT_CHECKED); - } else if (veg.containsAnyError()) { - setStatus(CheckStatus.ERROR); - } else { - setStatus(CheckStatus.OK); - } - } - - @Override - public String getText() { - return text; - } - - @Override - public void visit(Renderer renderer) { - renderer.render(veg); - } - - @Override - public CityObject getFeature() { - return veg; - } -} diff --git a/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/ZipEntryListCell.java b/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/ZipEntryListCell.java index 7677a2fcd66ff192ba74d9faef894e5cd05ca007..745471880256b7eff20a9b6d7e44c0e54c8e297f 100644 --- a/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/ZipEntryListCell.java +++ b/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/ZipEntryListCell.java @@ -1,5 +1,6 @@ package de.hft.stuttgart.citydoctor2.gui.tree; +import de.hft.stuttgart.citydoctor2.gui.tree.node.ZipEntryNode; import javafx.scene.control.ListCell; public class ZipEntryListCell extends ListCell { diff --git a/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/node/CityObjectGroupNode.java b/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/node/CityObjectGroupNode.java new file mode 100644 index 0000000000000000000000000000000000000000..79409dc4d560171654f2c5d9d73abf7c12e28e42 --- /dev/null +++ b/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/node/CityObjectGroupNode.java @@ -0,0 +1,46 @@ +package de.hft.stuttgart.citydoctor2.gui.tree.node; + +import de.hft.stuttgart.citydoctor2.check.Checkable; +import de.hft.stuttgart.citydoctor2.datastructure.CityObject; +import de.hft.stuttgart.citydoctor2.gui.CheckStatus; +import de.hft.stuttgart.citydoctor2.gui.Renderer; +import de.hft.stuttgart.citydoctor2.gui.tree.Renderable; +import javafx.scene.paint.Color; + +import java.util.List; + +public class CityObjectGroupNode extends Renderable { + + private final List cityObjects; + private final Color renderColor; + private final String nodeText; + + public CityObjectGroupNode(List cityObjects, String nodeText, Color renderColor) { + this.cityObjects = cityObjects; + this.nodeText = nodeText; + this.renderColor = renderColor; + } + + @Override + public void refreshTextColor() { + if (cityObjects.stream().anyMatch(cityObject -> !cityObject.isValidated())) { + setStatus(CheckStatus.NOT_CHECKED); + } else if (cityObjects.stream().anyMatch(Checkable::containsAnyError)) { + setStatus(CheckStatus.ERROR); + } else { + setStatus(CheckStatus.OK); + } + } + + + @Override + public String getText() { + return nodeText; + } + + @Override + public void visit(Renderer renderer) { + renderer.renderCityObjects(cityObjects, renderColor); + } + +} diff --git a/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/CityObjectNode.java b/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/node/CityObjectNode.java similarity index 65% rename from CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/CityObjectNode.java rename to CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/node/CityObjectNode.java index 426469f1e478d093f255cb2a17353eca6df9f86f..170891fe8ce6d6e1d87a63c232300e133bcd8df3 100644 --- a/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/CityObjectNode.java +++ b/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/node/CityObjectNode.java @@ -1,10 +1,15 @@ -package de.hft.stuttgart.citydoctor2.gui.tree; +package de.hft.stuttgart.citydoctor2.gui.tree.node; import de.hft.stuttgart.citydoctor2.datastructure.CityObject; import de.hft.stuttgart.citydoctor2.gui.CheckStatus; import de.hft.stuttgart.citydoctor2.gui.Renderer; +import de.hft.stuttgart.citydoctor2.gui.tree.Renderable; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; -public class CityObjectNode extends Renderable implements FeatureNode{ +public class CityObjectNode extends Renderable { + + private static final Logger logger = LogManager.getLogger(CityObjectNode.class); private final CityObject co; @@ -25,7 +30,7 @@ public class CityObjectNode extends Renderable implements FeatureNode{ @Override public String getText() { - return co.getGmlId().getGmlString(); + return co.getDisplayText(); } @Override @@ -33,7 +38,6 @@ public class CityObjectNode extends Renderable implements FeatureNode{ renderer.render(co); } - @Override public CityObject getFeature() { return co; } diff --git a/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/EdgeNode.java b/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/node/EdgeNode.java similarity index 92% rename from CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/EdgeNode.java rename to CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/node/EdgeNode.java index af9a2858015afa00ee49c993fa4a499a40dc89e5..2ae5e10d50f769f8b0b380a09736790dd34d2535 100644 --- a/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/EdgeNode.java +++ b/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/node/EdgeNode.java @@ -1,4 +1,4 @@ -package de.hft.stuttgart.citydoctor2.gui.tree; +package de.hft.stuttgart.citydoctor2.gui.tree.node; import java.text.DecimalFormat; import java.text.DecimalFormatSymbols; @@ -6,6 +6,7 @@ import java.text.DecimalFormatSymbols; import de.hft.stuttgart.citydoctor2.datastructure.Edge; import de.hft.stuttgart.citydoctor2.datastructure.Vertex; import de.hft.stuttgart.citydoctor2.gui.Renderer; +import de.hft.stuttgart.citydoctor2.gui.tree.Renderable; public class EdgeNode extends Renderable { diff --git a/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/ErrorNode.java b/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/node/ErrorNode.java similarity index 81% rename from CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/ErrorNode.java rename to CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/node/ErrorNode.java index a3757cc31f0ac3328afcb099c0cc43bf47e60b35..caa947d9e0cff62205d96f8fdae84b1596661e0a 100644 --- a/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/ErrorNode.java +++ b/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/node/ErrorNode.java @@ -1,7 +1,8 @@ -package de.hft.stuttgart.citydoctor2.gui.tree; +package de.hft.stuttgart.citydoctor2.gui.tree.node; import de.hft.stuttgart.citydoctor2.check.CheckError; import de.hft.stuttgart.citydoctor2.gui.Renderer; +import de.hft.stuttgart.citydoctor2.gui.tree.Renderable; public class ErrorNode extends Renderable { diff --git a/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/GenericAttributeNode.java b/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/node/GenericAttributeNode.java similarity index 82% rename from CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/GenericAttributeNode.java rename to CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/node/GenericAttributeNode.java index 9f71ead88b5fadec34f32762b4a4926209e023b7..10c6d3aa76766f774319404335ee2d664fae6267 100644 --- a/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/GenericAttributeNode.java +++ b/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/node/GenericAttributeNode.java @@ -1,7 +1,8 @@ -package de.hft.stuttgart.citydoctor2.gui.tree; +package de.hft.stuttgart.citydoctor2.gui.tree.node; import de.hft.stuttgart.citydoctor2.datastructure.GenericAttribute; import de.hft.stuttgart.citydoctor2.gui.Renderer; +import de.hft.stuttgart.citydoctor2.gui.tree.Renderable; public class GenericAttributeNode extends Renderable { diff --git a/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/GeometryNode.java b/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/node/GeometryNode.java similarity index 91% rename from CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/GeometryNode.java rename to CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/node/GeometryNode.java index 28cbc7f0e60d44655054bcf297d9e010d2bd306d..68c6582e564187c32e7a21f8a70cc13ee4594489 100644 --- a/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/GeometryNode.java +++ b/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/node/GeometryNode.java @@ -1,9 +1,10 @@ -package de.hft.stuttgart.citydoctor2.gui.tree; +package de.hft.stuttgart.citydoctor2.gui.tree.node; import de.hft.stuttgart.citydoctor2.datastructure.Geometry; import de.hft.stuttgart.citydoctor2.datastructure.ImplicitGeometryHolder; import de.hft.stuttgart.citydoctor2.gui.CheckStatus; import de.hft.stuttgart.citydoctor2.gui.Renderer; +import de.hft.stuttgart.citydoctor2.gui.tree.Renderable; public class GeometryNode extends Renderable { diff --git a/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/LinearRingNode.java b/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/node/LinearRingNode.java similarity index 88% rename from CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/LinearRingNode.java rename to CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/node/LinearRingNode.java index ac1f4f83853ba0bfe2c6ef1da72256e7f662670c..8bcdded817ee63e2c92bf127409e12862b5fccdc 100644 --- a/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/LinearRingNode.java +++ b/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/node/LinearRingNode.java @@ -1,8 +1,9 @@ -package de.hft.stuttgart.citydoctor2.gui.tree; +package de.hft.stuttgart.citydoctor2.gui.tree.node; import de.hft.stuttgart.citydoctor2.datastructure.LinearRing; import de.hft.stuttgart.citydoctor2.gui.CheckStatus; import de.hft.stuttgart.citydoctor2.gui.Renderer; +import de.hft.stuttgart.citydoctor2.gui.tree.Renderable; public class LinearRingNode extends Renderable { diff --git a/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/OpeningNode.java b/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/node/OpeningNode.java similarity index 87% rename from CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/OpeningNode.java rename to CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/node/OpeningNode.java index c0e425ab545530fb6c02647499f1a07ea289a113..81ebece1b7956e041d6b75e1dcd12e9dcbbfa927 100644 --- a/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/OpeningNode.java +++ b/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/node/OpeningNode.java @@ -1,8 +1,9 @@ -package de.hft.stuttgart.citydoctor2.gui.tree; +package de.hft.stuttgart.citydoctor2.gui.tree.node; import de.hft.stuttgart.citydoctor2.datastructure.Opening; import de.hft.stuttgart.citydoctor2.gui.CheckStatus; import de.hft.stuttgart.citydoctor2.gui.Renderer; +import de.hft.stuttgart.citydoctor2.gui.tree.Renderable; public class OpeningNode extends Renderable { diff --git a/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/PolygonNode.java b/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/node/PolygonNode.java similarity index 87% rename from CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/PolygonNode.java rename to CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/node/PolygonNode.java index 768c4d070e5e3e5666e0c1218d5a0a37dab32595..0504e06510fb8614d857013f3231c0e2a9b64c74 100644 --- a/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/PolygonNode.java +++ b/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/node/PolygonNode.java @@ -1,8 +1,9 @@ -package de.hft.stuttgart.citydoctor2.gui.tree; +package de.hft.stuttgart.citydoctor2.gui.tree.node; import de.hft.stuttgart.citydoctor2.datastructure.Polygon; import de.hft.stuttgart.citydoctor2.gui.CheckStatus; import de.hft.stuttgart.citydoctor2.gui.Renderer; +import de.hft.stuttgart.citydoctor2.gui.tree.Renderable; public class PolygonNode extends Renderable { diff --git a/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/TextNode.java b/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/node/TextNode.java similarity index 78% rename from CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/TextNode.java rename to CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/node/TextNode.java index d050e7682a4d075a2eef857e7c7c1c83548b9458..d12484ba9aa94ae74d95c5f4be0693ddb2d352e4 100644 --- a/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/TextNode.java +++ b/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/node/TextNode.java @@ -1,6 +1,7 @@ -package de.hft.stuttgart.citydoctor2.gui.tree; +package de.hft.stuttgart.citydoctor2.gui.tree.node; import de.hft.stuttgart.citydoctor2.gui.Renderer; +import de.hft.stuttgart.citydoctor2.gui.tree.Renderable; public class TextNode extends Renderable { diff --git a/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/node/TopLevelCityObjectNode.java b/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/node/TopLevelCityObjectNode.java new file mode 100644 index 0000000000000000000000000000000000000000..7d59d78082e0370ba4c613647cd7ab66ad43d838 --- /dev/null +++ b/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/node/TopLevelCityObjectNode.java @@ -0,0 +1,47 @@ +package de.hft.stuttgart.citydoctor2.gui.tree.node; + +import de.hft.stuttgart.citydoctor2.datastructure.CityObject; +import de.hft.stuttgart.citydoctor2.gui.MainWindow; +import de.hft.stuttgart.citydoctor2.utils.Localization; +import javafx.scene.input.Clipboard; +import javafx.scene.input.ClipboardContent; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +import static javafx.scene.input.Clipboard.getSystemClipboard; + + +public class TopLevelCityObjectNode extends CityObjectNode { + + private static final Logger logger = LogManager.getLogger(TopLevelCityObjectNode.class); + + public TopLevelCityObjectNode(CityObject co) { + super(co); + } + + @Override + public void getClipboardAction(MainWindow mainWindow) { + Clipboard clipboard = getSystemClipboard(); + ClipboardContent content = new ClipboardContent(); + content.putString(this.getFeature().getGmlId().toString()); + if (!clipboard.setContent(content)) { + if (logger.isWarnEnabled()) { + logger.warn(Localization.getText("MainWindow.warnCopyIdFailed")); + } + + } + } + + @Override + public void getFeatureExportAction(MainWindow mainWindow) { + try { + mainWindow.getController().export(this.getFeature()); + if (logger.isWarnEnabled()) { + logger.info(Localization.getText("CityDoctorController.exportSuccess")); + } + } catch (Exception e) { + logger.error("Export failed: Unexpected error occurred"); + logger.error(e); + } + } +} diff --git a/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/VertexNode.java b/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/node/VertexNode.java similarity index 89% rename from CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/VertexNode.java rename to CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/node/VertexNode.java index c22b28cc3f01c200bf9aecb7fc6f8b6c86364aca..c8251e1fde5e1c25c25029ac03155a99bef28886 100644 --- a/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/VertexNode.java +++ b/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/node/VertexNode.java @@ -1,10 +1,11 @@ -package de.hft.stuttgart.citydoctor2.gui.tree; +package de.hft.stuttgart.citydoctor2.gui.tree.node; import java.text.DecimalFormat; import java.text.DecimalFormatSymbols; import de.hft.stuttgart.citydoctor2.datastructure.Vertex; import de.hft.stuttgart.citydoctor2.gui.Renderer; +import de.hft.stuttgart.citydoctor2.gui.tree.Renderable; public class VertexNode extends Renderable { diff --git a/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/ZipEntryNode.java b/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/node/ZipEntryNode.java similarity index 95% rename from CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/ZipEntryNode.java rename to CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/node/ZipEntryNode.java index ad5556754e068b9f6151a1d21d3719a4e99797dc..f4ba0875daaa35c29e0052f392d29a54b2aeecbc 100644 --- a/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/ZipEntryNode.java +++ b/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/node/ZipEntryNode.java @@ -1,4 +1,4 @@ -package de.hft.stuttgart.citydoctor2.gui.tree; +package de.hft.stuttgart.citydoctor2.gui.tree.node; import de.hft.stuttgart.citydoctor2.zip.CityGmlZipEntry; import javafx.scene.paint.Color; diff --git a/CityDoctorParent/Extensions/CityDoctorHealer/src/main/java/de/hft/stuttgart/citydoctor2/healer/Healer.java b/CityDoctorParent/Extensions/CityDoctorHealer/src/main/java/de/hft/stuttgart/citydoctor2/healer/Healer.java index e068492b3a2e3d64747d3b33d928bdfa0ef62e47..544a6856d9a6f0d3a410c8b0509dfdc6bc2bf657 100644 --- a/CityDoctorParent/Extensions/CityDoctorHealer/src/main/java/de/hft/stuttgart/citydoctor2/healer/Healer.java +++ b/CityDoctorParent/Extensions/CityDoctorHealer/src/main/java/de/hft/stuttgart/citydoctor2/healer/Healer.java @@ -263,7 +263,7 @@ public class Healer { co.reCreateGeometries(factory, checker.getConfig().getParserConfiguration()); byte[] gml = writeCityGml(co.getGmlObject()); // remove them again to save memory - co.unsetGmlGeometries(); + co.clearGmlGeometries(); SvrlContentHandler handler = Checker.executeSchematronValidationIfAvailable(config, new ByteArrayInputStream(gml)); if (handler != null) { diff --git a/CityDoctorParent/Extensions/CityDoctorHealer/src/test/java/de/hft/stuttgart/citydoctor2/healing/HealHoleOutsideErrorTest.java b/CityDoctorParent/Extensions/CityDoctorHealer/src/test/java/de/hft/stuttgart/citydoctor2/healing/HealHoleOutsideErrorTest.java index a929bcf887ac771c3886d51ea19b9630c02334ae..b5118c94420faaa08c85cd69cc08b6a4ec1c57fb 100644 --- a/CityDoctorParent/Extensions/CityDoctorHealer/src/test/java/de/hft/stuttgart/citydoctor2/healing/HealHoleOutsideErrorTest.java +++ b/CityDoctorParent/Extensions/CityDoctorHealer/src/test/java/de/hft/stuttgart/citydoctor2/healing/HealHoleOutsideErrorTest.java @@ -2,6 +2,8 @@ package de.hft.stuttgart.citydoctor2.healing; import java.io.IOException; +import de.hft.stuttgart.citydoctor2.datastructure.BoundarySurface; +import de.hft.stuttgart.citydoctor2.datastructure.Building; import org.junit.Assert; import org.junit.Test; @@ -24,14 +26,14 @@ public class HealHoleOutsideErrorTest { Checker c = new Checker(config, model); c.runChecks(); - - Geometry geom = model.getBuildings().get(0).getGeometries().get(0); - Assert.assertTrue(geom.containsError(CheckId.C_GE_P_HOLE_OUTSIDE)); + + Building building = model.getBuildings().get(0); + Assert.assertTrue(building.containsError(CheckId.C_GE_P_HOLE_OUTSIDE)); Healer healer = new Healer(c); healer.healCityObject(model.getBuildings().get(0)); - Assert.assertFalse(geom.containsError(CheckId.C_GE_P_HOLE_OUTSIDE)); + Assert.assertFalse(building.containsError(CheckId.C_GE_P_HOLE_OUTSIDE)); } } diff --git a/CityDoctorParent/Extensions/CityDoctorHealerGenetic/src/test/java/de/hft/stuttgart/citydoctor2/healer/genetic/NonPlanarGenetic.java b/CityDoctorParent/Extensions/CityDoctorHealerGenetic/src/test/java/de/hft/stuttgart/citydoctor2/healer/genetic/NonPlanarGenetic.java index 9d7f9e65edf83901115a0ab6f924fefaeed043b6..aad5053da4b1e852a02cc5035e74529ebb3d7a40 100644 --- a/CityDoctorParent/Extensions/CityDoctorHealerGenetic/src/test/java/de/hft/stuttgart/citydoctor2/healer/genetic/NonPlanarGenetic.java +++ b/CityDoctorParent/Extensions/CityDoctorHealerGenetic/src/test/java/de/hft/stuttgart/citydoctor2/healer/genetic/NonPlanarGenetic.java @@ -66,9 +66,9 @@ public class NonPlanarGenetic { private static final int ERROR_PENALTY = 100000; private Random r = new Random(); - private Map> durationMap = new HashMap<>(); + private Map> durationMap = new HashMap<>(); - @Test + //@Test public void findVerticesForNonPlanarTest() throws CityGmlParseException, InvalidGmlFileException, IOException { ValidationConfiguration config = ValidationConfiguration.loadStandardValidationConfig(); config.setNumberOfRoundingPlacesInGlobalParameters(8);