Commit 3dac795e authored by Riegel's avatar Riegel
Browse files

Merge branch 'dev' into 'master'

Version 3.17.0 Release

See merge request !28
1 merge request!28Version 3.17.0 Release
Pipeline #11011 passed with stage
in 1 minute and 14 seconds
Showing with 297 additions and 34 deletions
+297 -34
......@@ -4,3 +4,5 @@
/CityDoctorParent/.idea/jarRepositories.xml
/CityDoctorParent/.idea/misc.xml
/CityDoctorParent/.idea/vcs.xml
.idea
/GUISettings.properties
# Title: Summary, imperative, start upper case, don't end with a period
# Follow the formatting of <type>:<description>
# No more than 50 chars. #### 50 chars is here: #
# Types: Fix, Feat, Build, CI, Docs, Perf, Refactor, Style, Test
# See: https://www.conventionalcommits.org/en/v1.0.0/
# Remember blank line between title and body.
# Body: Explain *what* and *why* (not *how*). Include task ID (Jira issue).
# Wrap at 72 chars. ################################## which is here: #
# At the end: Include Co-authored-by for all contributors.
# Include at least one empty line before it. Format:
# Co-authored-by: name <user@users.noreply.github.com>
#
# Tell Git to use this template with: git config commit.template .gitlab/.gitmessage
# How to Write a Git Commit Message:
# https://chris.beams.io/posts/git-commit/
#
# 1. Separate subject from body with a blank line
# 2. Limit the subject line to 50 characters
# 3. Capitalize the subject line
# 4. Do not end the subject line with a period
# 5. Use the imperative mood in the subject line
# 6. Wrap the body at 72 characters
# 7. Use the body to explain what and why vs. how
\ No newline at end of file
# https://chris.beams.io/posts/git-commit/
\ No newline at end of file
......@@ -5,7 +5,24 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
## [3.16.0] ((2024-11-11))
## [3.17.0] (2025-03-13)
### Added
- Checking of CityGml ZIP-archives with CityDoctor (#12)
### Changed
- Changed GUI to allow loading and checking of ZIP-archives. (#12)
### Fixes
- Reworked self-intersection calculations to eliminate false-positives (#65)
- CityGml objects added in 3.16.0 are now being recorded in error statistics and validation reports (#104)
- Envelope and CRS will now be included when exporting singular features
- Fixed various minor errors and bugs in CityDoctorGUI
## [3.16.0] (2024-11-11)
CityDoctor now supports the import, export and validation of CityGML 3.0 files.
......
<?xml version="1.0" encoding="utf-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0">
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>de.hft.stuttgart</groupId>
<artifactId>CityDoctorParent</artifactId>
<version>3.16.0</version>
<version>3.17.0</version>
</parent>
<artifactId>CityDoctorCheckResult</artifactId>
<dependencies>
......
......@@ -105,6 +105,9 @@ public class CheckReport {
addFeatureReports(report, valResults.getTransportationReports());
addFeatureReports(report, valResults.getVegetationReports());
addFeatureReports(report, valResults.getWaterReports());
addFeatureReports(report, valResults.getTunnelReports());
addFeatureReports(report, valResults.getCityFurnitureReports());
addFeatureReports(report, valResults.getGenericCityObjectReports());
}
}
......
......@@ -43,6 +43,15 @@ public class GlobalErrorStatistics {
@XmlElement(name = "num_error_transportation")
private int numErrorTransportation;
@XmlElement(name = "num_error_tunnel_objects")
private int numErrorTunnelObjects;
@XmlElement(name = "num_error_city_furniture")
private int numErrorCityFurniture;
@XmlElement(name = "num_error_generic_city_objects")
private int numErrorGenericCityObjects;
public int getNumErrorBuildings() {
return numErrorBuildings;
}
......@@ -91,5 +100,27 @@ public class GlobalErrorStatistics {
this.numErrorTransportation = numErrorTransportation;
}
public int getNumErrorTunnelObjects() {
return numErrorTunnelObjects;
}
public void setNumErrorTunnelObjects(int numErrorTunnelObjects) {
this.numErrorTunnelObjects = numErrorTunnelObjects;
}
public int getNumErrorCityFurniture() {
return numErrorCityFurniture;
}
public void setNumErrorCityFurniture(int numErrorCityFurniture) {
this.numErrorCityFurniture = numErrorCityFurniture;
}
public int getNumErrorGenericCityObjects() {
return numErrorGenericCityObjects;
}
public void setNumErrorGenericCityObjects(int numErrorGenericCityObjects) {
this.numErrorGenericCityObjects = numErrorGenericCityObjects;
}
}
......@@ -43,6 +43,16 @@ public class ModelStatistics {
@XmlElement(name = "num_water_objects", required = true)
private int numWaterObjects;
@XmlElement(name = "num_tunnel_objects", required = true)
private int numTunnelObjects;
@XmlElement(name = "num_city_furniture", required = true)
private int numCityFurniture;
@XmlElement(name = "num_generic_city_objects", required = true)
private int numGenericCityObjects;
public int getNumBuildings() {
return numBuildings;
}
......@@ -91,4 +101,27 @@ public class ModelStatistics {
this.numWaterObjects = numWaterObjects;
}
public int getNumTunnelObjects() {
return numTunnelObjects;
}
public void setNumTunnelObjects(int numTunnelObjects) {
this.numTunnelObjects = numTunnelObjects;
}
public int getNumCityFurniture() {
return numCityFurniture;
}
public void setNumCityFurniture(int numCityFurniture) {
this.numCityFurniture = numCityFurniture;
}
public int getNumGenericCityObjects() {
return numGenericCityObjects;
}
public void setNumGenericCityObjects(int numGenericCityObjects) {
this.numGenericCityObjects = numGenericCityObjects;
}
}
......@@ -50,7 +50,15 @@ public class ValidationResults {
@XmlElement(name = "water_object_report")
private List<FeatureReport> waterReports;
@XmlElement(name = "tunnel_report")
private List<FeatureReport> tunnelReports;
@XmlElement(name = "city_furniture_report")
private List<FeatureReport> cityFurnitureReports;
@XmlElement(name = "generic_city_object_report")
private List<FeatureReport> genericCityObjectReports;
public List<FeatureReport> getBuildingReports() {
if (buildingReports == null) {
......@@ -128,7 +136,38 @@ public class ValidationResults {
public void setWaterReports(List<FeatureReport> waterReports) {
this.waterReports = waterReports;
}
public List<FeatureReport> getTunnelReports() {
if (tunnelReports == null) {
tunnelReports = new ArrayList<>();
}
return tunnelReports;
}
public void setTunnelReports(List<FeatureReport> tunnelReports) {
this.tunnelReports = tunnelReports;
}
public List<FeatureReport> getCityFurnitureReports() {
if (cityFurnitureReports == null) {
cityFurnitureReports = new ArrayList<>();
}
return cityFurnitureReports;
}
public void setCityFurnitureReports(List<FeatureReport> cityFurnitureReports) {
this.cityFurnitureReports = cityFurnitureReports;
}
public List<FeatureReport> getGenericCityObjectReports() {
if (genericCityObjectReports == null) {
genericCityObjectReports = new ArrayList<>();
}
return genericCityObjectReports;
}
public void setGenericCityObjectReports(List<FeatureReport> genericCityObjectReports) {
this.genericCityObjectReports = genericCityObjectReports;
}
}
<?xml version="1.0" encoding="utf-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0">
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>de.hft.stuttgart</groupId>
<artifactId>CityDoctorParent</artifactId>
<version>3.16.0</version>
<version>3.17.0</version>
</parent>
<artifactId>CityDoctorEdge</artifactId>
<dependencies>
......
......@@ -29,7 +29,6 @@ public class Vector2d {
this.y = y;
}
@SuppressWarnings("SuspiciousNameCombination")
public Vector2d getPerpendicularVector() {
return new Vector2d(y, -x);
}
......
<?xml version="1.0" encoding="utf-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0">
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>de.hft.stuttgart</groupId>
<artifactId>CityDoctorParent</artifactId>
<version>3.16.0</version>
<version>3.17.0</version>
</parent>
<properties>
<versionString>${project.version}-${git.commit.id.abbrev}</versionString>
......@@ -58,6 +60,24 @@
<groupId>org.locationtech.proj4j</groupId>
<artifactId>proj4j</artifactId>
</dependency>
<dependency>
<groupId>org.locationtech.proj4j</groupId>
<artifactId>proj4j-epsg</artifactId>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.16.1</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.locationtech.jts</groupId>
<artifactId>jts-core</artifactId>
</dependency>
<dependency>
<groupId>io.github.earcut4j</groupId>
<artifactId>earcut4j</artifactId>
</dependency>
</dependencies>
<build>
<resources>
......@@ -84,7 +104,8 @@
<prefix>git</prefix>
<verbose>false</verbose>
<generateGitPropertiesFile>true</generateGitPropertiesFile>
<generateGitPropertiesFilename>${project.build.outputDirectory}/git.properties</generateGitPropertiesFilename>
<generateGitPropertiesFilename>
${project.build.outputDirectory}/git.properties</generateGitPropertiesFilename>
<gitDescribe>
<skip>false</skip>
<always>false</always>
......
......@@ -60,10 +60,8 @@ import de.hft.stuttgart.citydoctor2.check.error.UnknownCheckError;
* @author Matthias Betz
*
*/
@SuppressWarnings("unused")
public interface HealingMethod {
public HealingID getID();
default boolean visit(CheckError e, ModificationListener l) {
......
......@@ -374,10 +374,12 @@ public abstract class AbstractBuilding extends CityObject {
public void addStorey(Storey storey) {
buildingStoreys.add(storey);
storey.setParent(this);
}
public void addBuildingUnit(BuildingUnit buildingUnit) {
buildingUnits.add(buildingUnit);
buildingUnit.setParent(this);
}
public void setGmlObject(org.citygml4j.core.model.building.AbstractBuilding ab) {
......
......@@ -29,8 +29,9 @@ public abstract class AbstractBuildingSubdivision extends CityObject {
private final List<Installation> buildingInstallations = new ArrayList<>(2);
private final List<BoundarySurface> boundarySurfaceList = new ArrayList<>();
private final List<BuildingRoom> buildingRooms = new ArrayList<>();
private final List<BuildingRoomFurniture> buildingRoomFurnitureList = new ArrayList<>();
private AbstractBuilding parent;
protected org.citygml4j.core.model.building.AbstractBuildingSubdivision abs;
/**
......@@ -52,6 +53,19 @@ public abstract class AbstractBuildingSubdivision extends CityObject {
return FeatureType.BUILDING_SUBDIVISION;
}
public void setParent(AbstractBuilding parent) {
this.parent = parent;
}
public AbstractBuilding getParent() {
return parent;
}
@Override
public CityObject getTopLevelCityObject() {
return getParent().getTopLevelCityObject();
}
@Override
public void unsetGmlGeometries() {
abs.setLod1Solid(null);
......
......@@ -92,6 +92,11 @@ public abstract class AbstractFurniture extends CityObject {
return af;
}
@Override
public CityObject getTopLevelCityObject(){
return parent;
}
public void addBoundarySurface(BoundarySurface boundarySurface) {
boundarySurfaceList.add(boundarySurface);
boundarySurface.setParent(this);
......@@ -124,7 +129,10 @@ public abstract class AbstractFurniture extends CityObject {
public void setParent(CityObject co) {
parent = co;
}
public CityObject getParent() {
return parent;
}
@Override
public void unsetGmlGeometries() {
......
......@@ -350,6 +350,7 @@ public abstract class AbstractTunnel extends CityObject {
public void addTunnelConstructiveElement(TunnelConstructiveElement te) {
tunnelConstructiveElements.add(te);
te.setParent(this);
}
public void addTunnelPart(TunnelPart tunnelPart) {
......@@ -368,7 +369,7 @@ public abstract class AbstractTunnel extends CityObject {
return tunnelHollows;
}
public List<TunnelFurniture> getTunnelFurnitureList() {
public List<TunnelFurniture> getTunnelFurniture() {
return tunnelFurnitureList;
}
......
......@@ -207,6 +207,11 @@ public class BoundarySurface extends CityObject {
}
}
@Override
public CityObject getTopLevelCityObject() {
return getParent().getTopLevelCityObject();
}
@Override
public String toString() {
return "BoundarySurface [type=" + type + ", id=" + getGmlId() + "]";
......
......@@ -52,12 +52,21 @@ public class BridgeConstructiveElement extends CityObject {
private final org.citygml4j.core.model.bridge.BridgeConstructiveElement gmlBridgeElement;
private final List<BoundarySurface> boundarySurfaceList = new ArrayList<>();
private BridgeObject parent;
public BridgeConstructiveElement(org.citygml4j.core.model.bridge.BridgeConstructiveElement gmlObject) {
this.gmlBridgeElement = gmlObject;
}
public void setParent(BridgeObject parent) {
this.parent = parent;
}
public BridgeObject getParent() {
return parent;
}
@Override
public Copyable createCopyInstance() {
return new BridgeConstructiveElement(gmlBridgeElement);
......@@ -244,6 +253,11 @@ public class BridgeConstructiveElement extends CityObject {
}
}
@Override
public CityObject getTopLevelCityObject() {
return getParent().getTopLevelCityObject();
}
@Override
public FeatureType getFeatureType() {
return FeatureType.BRIDGE_CONSTRUCTION_ELEMENT;
......
......@@ -52,13 +52,28 @@ public class BridgeObject extends CityObject {
private final List<BridgeConstructiveElement> elements = new ArrayList<>(2);
private final List<BoundarySurface> boundarySurfaces = new ArrayList<>(2);
private final List<Installation> bridgeInstallations = new ArrayList<>(2);
private final List<BridgeRoomFurniture> bridgeFurniture = new ArrayList<>(2);
private final List<BridgeRoom> bridgeRooms = new ArrayList<>(2);
private AbstractBridge ab;
private BridgeType type;
private BridgeObject parent;
public BridgeObject(BridgeType type, AbstractBridge ab) {
public BridgeObject(AbstractBridge ab) {
this.ab = ab;
this.type = BridgeType.BRIDGE;
this.parent = null;
}
public BridgeObject(AbstractBridge ab, BridgeObject parent) {
this.ab = ab;
this.type = BridgeType.BRIDGE_PART;
this.parent = parent;
}
private BridgeObject(BridgeType type, AbstractBridge ab, BridgeObject parent) {
this.ab = ab;
this.type = type;
this.parent = parent;
}
@Override
......@@ -78,6 +93,10 @@ public class BridgeObject extends CityObject {
return bridgeRooms;
}
public List<BridgeRoomFurniture> getBridgeFurniture() {
return bridgeFurniture;
}
@Override
public void reCreateGeometries(GeometryFactory factory, ParserConfiguration config) {
for (Geometry geom : getGeometries()) {
......@@ -107,6 +126,9 @@ public class BridgeObject extends CityObject {
for (BridgeRoom br : bridgeRooms) {
br.reCreateGeometries(factory, config);
}
for (BridgeRoomFurniture bri : bridgeFurniture) {
bri.reCreateGeometries(factory, config);
}
}
......@@ -157,6 +179,11 @@ public class BridgeObject extends CityObject {
bridgeRooms.add(room);
}
public void addBridgeFurniture(BridgeRoomFurniture furniture){
bridgeFurniture.add(furniture);
furniture.setParent(this);
}
@Override
public void clearAllContainedCheckResults() {
super.clearAllContainedCheckResults();
......@@ -175,6 +202,9 @@ public class BridgeObject extends CityObject {
for (BridgeRoom br : bridgeRooms) {
br.clearAllContainedCheckResults();
}
for (BridgeRoomFurniture bri : bridgeFurniture) {
bri.clearAllContainedCheckResults();
}
}
@Override
......@@ -195,6 +225,9 @@ public class BridgeObject extends CityObject {
for (BridgeRoom br : bridgeRooms) {
br.collectContainedErrors(errors);
}
for (BridgeRoomFurniture bri : bridgeFurniture) {
bri.collectContainedErrors(errors);
}
}
......@@ -227,6 +260,11 @@ public class BridgeObject extends CityObject {
return true;
}
}
for (BridgeRoomFurniture bri : bridgeFurniture) {
if (bri.containsAnyError()) {
return true;
}
}
return false;
}
......@@ -269,6 +307,11 @@ public class BridgeObject extends CityObject {
return true;
}
}
for (BridgeRoomFurniture bri : bridgeFurniture) {
if (bri.containsError(checkIdentifier)) {
return true;
}
}
return false;
}
......@@ -303,6 +346,9 @@ public class BridgeObject extends CityObject {
for (BridgeRoom br : bridgeRooms) {
br.accept(c);
}
for (BridgeRoomFurniture bri : bridgeFurniture) {
bri.accept(c);
}
}
......@@ -363,9 +409,20 @@ public class BridgeObject extends CityObject {
for (BridgeRoom br : bridgeRooms) {
br.unsetGmlGeometries();
}
for (BridgeRoomFurniture bri : bridgeFurniture) {
bri.unsetGmlGeometries();
}
}
@Override
public CityObject getTopLevelCityObject() {
if (parent != null){
return parent.getTopLevelCityObject();
}
return this;
}
@Override
public String toString() {
return "BridgeObject [type=" + type + ", id=" + getGmlId() + "]";
......@@ -390,6 +447,12 @@ public class BridgeObject extends CityObject {
for (BridgeObject part : parts) {
part.prepareForChecking();
}
for (BridgeRoom br : bridgeRooms) {
br.prepareForChecking();
}
for (BridgeRoomFurniture bri : bridgeFurniture) {
bri.prepareForChecking();
}
}
@Override
......@@ -414,6 +477,9 @@ public class BridgeObject extends CityObject {
for (BridgeRoom br : bridgeRooms) {
br.clearMetaInformation();
}
for (BridgeRoomFurniture bri : bridgeFurniture) {
bri.clearMetaInformation();
}
}
......@@ -440,6 +506,10 @@ public class BridgeObject extends CityObject {
handler.addInstance(br);
}
for (BridgeRoomFurniture bri : bridgeFurniture) {
handler.addInstance(bri);
}
}
public void anonymize() {
......@@ -483,6 +553,10 @@ public class BridgeObject extends CityObject {
getBridgeRooms().add(handler.getCopyInstance(br));
}
for (BridgeRoomFurniture bri : originalBo.bridgeFurniture) {
getBridgeFurniture().add(handler.getCopyInstance(bri));
}
}
public List<BoundarySurface> getBoundarySurfaces() {
......@@ -491,11 +565,12 @@ public class BridgeObject extends CityObject {
public void addConstructiveElement(BridgeConstructiveElement element) {
getConstructiveElements().add(element);
element.setParent(this);
}
@Override
public Copyable createCopyInstance() {
return new BridgeObject(type, ab);
return new BridgeObject(type, ab, parent);
}
public List<BridgeObject> getParts() {
......
......@@ -37,6 +37,11 @@ public class BridgeRoom extends AbstractRoom {
parent = handler.getCopyInstance(oRoom.getParent());
}
@Override
public CityObject getTopLevelCityObject() {
return getParent();
}
@Override
public void collectInstances(CopyHandler handler) {
super.collectInstances(handler);
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment