Commit 81be0b1d authored by Riegel's avatar Riegel
Browse files

Merge branch 'dev_GUI' into 'dev'

Open source release of CityDoctorGUI and other extensions.

See merge request !6
parents 12d96d95 5a4d0a74
Pipeline #10056 passed with stage
in 1 minute and 6 seconds
......@@ -28,6 +28,8 @@ import de.hft.stuttgart.citydoctor2.check.ModificationListener;
import de.hft.stuttgart.citydoctor2.datastructure.GmlElement;
import de.hft.stuttgart.citydoctor2.datastructure.LinearRing;
import java.io.Serial;
/**
* If the first and last point of a linear ring are not the same, this error is
* created.
......@@ -37,9 +39,10 @@ import de.hft.stuttgart.citydoctor2.datastructure.LinearRing;
*/
public class RingNotClosedError implements CheckError {
@Serial
private static final long serialVersionUID = 2554099996830579201L;
private LinearRing ring;
private final LinearRing ring;
public RingNotClosedError(LinearRing ring) {
this.ring = ring;
......
......@@ -28,6 +28,8 @@ import de.hft.stuttgart.citydoctor2.check.ModificationListener;
import de.hft.stuttgart.citydoctor2.datastructure.GmlElement;
import de.hft.stuttgart.citydoctor2.datastructure.LinearRing;
import java.io.Serial;
/**
* If a linear ring has less than 4 distinct points, it is has too few points.
*
......@@ -36,9 +38,10 @@ import de.hft.stuttgart.citydoctor2.datastructure.LinearRing;
*/
public class RingTooFewPointsError implements CheckError {
@Serial
private static final long serialVersionUID = 7207518573842743261L;
private LinearRing lr;
private final LinearRing lr;
public RingTooFewPointsError(LinearRing lr) {
this.lr = lr;
......
......@@ -27,14 +27,17 @@ import de.hft.stuttgart.citydoctor2.check.HealingMethod;
import de.hft.stuttgart.citydoctor2.check.ModificationListener;
import de.hft.stuttgart.citydoctor2.datastructure.GmlElement;
import java.io.Serial;
public class SchematronError implements CheckError {
@Serial
private static final long serialVersionUID = -2964084500589868928L;
private String errorId;
private String gmlId;
private String childId;
private String nameOfAttribute;
private final String errorId;
private final String gmlId;
private final String childId;
private final String nameOfAttribute;
public SchematronError(String errorId, String gmlId, String childId, String nameOfAttribute) {
this.errorId = errorId;
......
......@@ -18,6 +18,7 @@
*/
package de.hft.stuttgart.citydoctor2.check.error;
import java.io.Serial;
import java.util.List;
import de.hft.stuttgart.citydoctor2.check.CheckError;
......@@ -40,10 +41,11 @@ import de.hft.stuttgart.citydoctor2.datastructure.GmlElement;
*/
public class SolidNotClosedError implements CheckError {
@Serial
private static final long serialVersionUID = 8256385219885788891L;
private List<Edge> errorEdges;
private Geometry g;
private final List<Edge> errorEdges;
private final Geometry g;
public SolidNotClosedError(Geometry g, List<Edge> errorEdges) {
this.errorEdges = errorEdges;
......
......@@ -18,6 +18,7 @@
*/
package de.hft.stuttgart.citydoctor2.check.error;
import java.io.Serial;
import java.util.List;
import de.hft.stuttgart.citydoctor2.check.CheckError;
......@@ -39,11 +40,12 @@ import de.hft.stuttgart.citydoctor2.utils.PolygonIntersection;
*/
public class SolidSelfIntError implements CheckError {
@Serial
private static final long serialVersionUID = -4479936555545861422L;
private Geometry g;
private final Geometry g;
private List<PolygonIntersection> intersections;
private final List<PolygonIntersection> intersections;
public SolidSelfIntError(Geometry g, List<PolygonIntersection> intersections) {
this.g = g;
......
......@@ -28,6 +28,8 @@ import de.hft.stuttgart.citydoctor2.check.ModificationListener;
import de.hft.stuttgart.citydoctor2.datastructure.BoundarySurface;
import de.hft.stuttgart.citydoctor2.datastructure.GmlElement;
import java.io.Serial;
/**
* Container object for an unfragmented error
*
......@@ -36,10 +38,11 @@ import de.hft.stuttgart.citydoctor2.datastructure.GmlElement;
*/
public class SurfaceUnfragmentedError implements CheckError {
@Serial
private static final long serialVersionUID = 3146243879393474196L;
private BoundarySurface bs;
private double angleDeviation;
private final BoundarySurface bs;
private final double angleDeviation;
public SurfaceUnfragmentedError(BoundarySurface bs, double angleDerivation) {
this.bs = bs;
......
......@@ -28,6 +28,8 @@ import de.hft.stuttgart.citydoctor2.check.ModificationListener;
import de.hft.stuttgart.citydoctor2.datastructure.Geometry;
import de.hft.stuttgart.citydoctor2.datastructure.GmlElement;
import java.io.Serial;
/**
* When a geometry has less than 4 polygons, it cannot form a valid solid.
*
......@@ -36,9 +38,10 @@ import de.hft.stuttgart.citydoctor2.datastructure.GmlElement;
*/
public class TooFewPolygonsError implements CheckError {
@Serial
private static final long serialVersionUID = 5800732409355221678L;
private Geometry g;
private final Geometry g;
public TooFewPolygonsError(Geometry g) {
this.g = g;
......
......@@ -30,6 +30,8 @@ import de.hft.stuttgart.citydoctor2.check.HealingMethod;
import de.hft.stuttgart.citydoctor2.check.ModificationListener;
import de.hft.stuttgart.citydoctor2.datastructure.GmlElement;
import java.io.Serial;
/**
* This error is created when an unexpected exception is thrown by the code.
*
......@@ -38,11 +40,12 @@ import de.hft.stuttgart.citydoctor2.datastructure.GmlElement;
*/
public class UnknownCheckError implements CheckError {
@Serial
private static final long serialVersionUID = -6554097632341055596L;
private Checkable c;
private Exception e;
private CheckId checkId;
private final Checkable c;
private final Exception e;
private final CheckId checkId;
public UnknownCheckError(Checkable c, Exception e, Check check) {
this.c = c;
......
......@@ -18,6 +18,7 @@
*/
package de.hft.stuttgart.citydoctor2.datastructure;
import java.io.Serial;
import java.util.ArrayList;
import java.util.List;
......@@ -47,12 +48,13 @@ import de.hft.stuttgart.citydoctor2.utils.Copyable;
*/
public abstract class AbstractBuilding extends CityObject {
@Serial
private static final long serialVersionUID = -2196414503088741206L;
private static final Logger logger = LogManager.getLogger(AbstractBuilding.class);
private List<Installation> buildingInstallations = new ArrayList<>(2);
private List<BoundarySurface> boundarySurfaceList = new ArrayList<>();
private final List<Installation> buildingInstallations = new ArrayList<>(2);
private final List<BoundarySurface> boundarySurfaceList = new ArrayList<>();
private org.citygml4j.core.model.building.AbstractBuilding ab;
......
......@@ -18,6 +18,7 @@
*/
package de.hft.stuttgart.citydoctor2.datastructure;
import java.io.Serial;
import java.util.ArrayList;
import java.util.List;
......@@ -42,12 +43,13 @@ import de.hft.stuttgart.citydoctor2.utils.Copyable;
*/
public class BoundarySurface extends CityObject {
@Serial
private static final long serialVersionUID = 8793865135393496408L;
private SurfaceFeatureType featureType;
private BoundarySurfaceType type;
private List<Opening> openings = new ArrayList<>(2);
private final List<Opening> openings = new ArrayList<>(2);
private CityObject parent;
private AbstractThematicSurface gmlObject;
......
......@@ -32,7 +32,7 @@ import de.hft.stuttgart.citydoctor2.utils.BoundingBoxCalculator;
*/
public class BoundingBox {
private Vector3d[] bbox;
private final Vector3d[] bbox;
/**
* Creates an axis aligned bounding box containing all points of all polygons
......@@ -142,11 +142,7 @@ public class BoundingBox {
public double getLongestSide() {
double width = getWidth();
double depth = getDepth();
if (width > depth) {
return width;
} else {
return depth;
}
return Math.max(width, depth);
}
/**
......
......@@ -18,6 +18,7 @@
*/
package de.hft.stuttgart.citydoctor2.datastructure;
import java.io.Serial;
import java.util.ArrayList;
import java.util.List;
......@@ -47,10 +48,11 @@ public class BridgeConstructiveElement extends CityObject {
private static final String CANNOT_ADD = "Cannot add ";
@Serial
private static final long serialVersionUID = 7353233899458901155L;
private org.citygml4j.core.model.bridge.BridgeConstructiveElement gmlBridgeElement;
private List<BoundarySurface> boundarySurfaceList = new ArrayList<>();
private final org.citygml4j.core.model.bridge.BridgeConstructiveElement gmlBridgeElement;
private final List<BoundarySurface> boundarySurfaceList = new ArrayList<>();
public BridgeConstructiveElement(org.citygml4j.core.model.bridge.BridgeConstructiveElement gmlObject) {
......
......@@ -18,9 +18,13 @@
*/
package de.hft.stuttgart.citydoctor2.datastructure;
import java.util.ArrayList;
import java.util.List;
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.bridge.AbstractBridge;
import org.citygml4j.core.model.bridge.BridgeInstallation;
import org.citygml4j.core.model.bridge.BridgeInstallationProperty;
......@@ -31,37 +35,25 @@ 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 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 java.io.Serial;
import java.util.ArrayList;
import java.util.List;
/**
* Bridge representation object of CityGML bridge objects
*
* @author Matthias Betz
*
*/
public class BridgeObject extends CityObject {
@Serial
private static final long serialVersionUID = 6301112640328373842L;
public enum BridgeType {
BRIDGE, BRIDGE_PART
}
private final List<BridgeObject> parts = new ArrayList<>(2);
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 AbstractBridge ab;
private BridgeType type;
private List<BridgeObject> parts = null;
private List<BridgeConstructiveElement> elements = null;
private List<BoundarySurface> boundarySurfaces = new ArrayList<>(2);
private List<Installation> bridgeInstallations = new ArrayList<>(2);
public BridgeObject(BridgeType type, AbstractBridge ab) {
this.ab = ab;
this.type = type;
......@@ -73,9 +65,6 @@ public class BridgeObject extends CityObject {
}
public List<BridgeConstructiveElement> getConstructiveElements() {
if (elements == null) {
elements = new ArrayList<>(2);
}
return elements;
}
......@@ -100,16 +89,13 @@ public class BridgeObject extends CityObject {
for (Installation bi : bridgeInstallations) {
bi.reCreateGeometries(factory, config);
}
if (parts != null) {
for (BridgeObject part : parts) {
part.reCreateGeometries(factory, config);
}
}
if (elements != null) {
for (BridgeConstructiveElement ele : elements) {
ele.reCreateGeometries(factory, config);
}
}
}
private void setMultiSurfaceAccordingToLod(Geometry geom, MultiSurface ms) {
......@@ -149,7 +135,6 @@ public class BridgeObject extends CityObject {
throw new IllegalStateException("Cannot add " + geom.getLod() + " solid to bridges");
}
}
public void addBridgeInstallation(Installation coBi) {
bridgeInstallations.add(coBi);
coBi.setParent(this);
......@@ -164,17 +149,13 @@ public class BridgeObject extends CityObject {
for (Installation bi : bridgeInstallations) {
bi.clearAllContainedCheckResults();
}
if (parts != null) {
for (BridgeObject part : parts) {
part.clearAllContainedCheckResults();
}
}
if (elements != null) {
for (BridgeConstructiveElement ele : elements) {
ele.clearAllContainedCheckResults();
}
}
}
@Override
public void collectContainedErrors(List<CheckError> errors) {
......@@ -185,16 +166,13 @@ public class BridgeObject extends CityObject {
for (Installation bi : bridgeInstallations) {
bi.collectContainedErrors(errors);
}
if (parts != null) {
for (BridgeObject part : parts) {
part.collectContainedErrors(errors);
}
}
if (elements != null) {
for (BridgeConstructiveElement ele : elements) {
ele.collectContainedErrors(errors);
}
}
}
@Override
......@@ -216,24 +194,21 @@ public class BridgeObject extends CityObject {
if (doPartsContainAnyError()) {
return true;
}
if (elements != null) {
for (BridgeConstructiveElement ele : elements) {
if (ele.containsAnyError()) {
return true;
}
}
}
return false;
}
private boolean doPartsContainAnyError() {
if (parts != null) {
for (BridgeObject part : parts) {
if (part.containsAnyError()) {
return true;
}
}
}
return false;
}
......@@ -256,24 +231,21 @@ public class BridgeObject extends CityObject {
if (doPartsContainError(checkIdentifier)) {
return true;
}
if (elements != null) {
for (BridgeConstructiveElement ele : elements) {
if (ele.containsError(checkIdentifier)) {
return true;
}
}
}
return false;
}
private boolean doPartsContainError(CheckId checkIdentifier) {
if (parts != null) {
for (BridgeObject part : parts) {
if (part.containsError(checkIdentifier)) {
return true;
}
}
}
return false;
}
......@@ -289,16 +261,13 @@ public class BridgeObject extends CityObject {
for (Installation bi : bridgeInstallations) {
bi.accept(c);
}
if (parts != null) {
for (BridgeObject part : parts) {
part.accept(c);
}
}
if (elements != null) {
for (BridgeConstructiveElement ele : elements) {
ele.accept(c);
}
}
}
/**
......@@ -329,6 +298,10 @@ public class BridgeObject extends CityObject {
return ab;
}
public void setGmlObject(AbstractBridge aBridge) {
ab = aBridge;
}
@Override
public void unsetGmlGeometries() {
ab.setLod1Solid(null);
......@@ -345,20 +318,13 @@ public class BridgeObject extends CityObject {
for (Installation bi : bridgeInstallations) {
bi.unsetGmlGeometries();
}
if (parts != null) {
for (BridgeObject part : parts) {
part.unsetGmlGeometries();
}
}
if (elements != null) {
for (BridgeConstructiveElement ele : elements) {
ele.unsetGmlGeometries();
}
}
}
public void setGmlObject(AbstractBridge aBridge) {
ab = aBridge;
}
@Override
......@@ -369,16 +335,13 @@ public class BridgeObject extends CityObject {
@Override
public void prepareForChecking() {
super.prepareForChecking();
if (elements != null) {
for (BridgeConstructiveElement e : elements) {
e.prepareForChecking();
}
}
if (parts != null) {
for (BridgeObject part : parts) {
part.prepareForChecking();
}
}
for (BoundarySurface bs : boundarySurfaces) {
bs.prepareForChecking();
}
......@@ -396,16 +359,16 @@ public class BridgeObject extends CityObject {
for (Installation bi : bridgeInstallations) {
bi.clearMetaInformation();
}
if (parts != null) {
for (BridgeObject part : parts) {
part.clearMetaInformation();
}
}
if (elements != null) {
for (BridgeConstructiveElement ele : elements) {
ele.clearMetaInformation();
}
}
}
@Override
......@@ -417,16 +380,16 @@ public class BridgeObject extends CityObject {
for (Installation bi : bridgeInstallations) {
handler.addInstance(bi);
}
if (parts != null) {
for (BridgeObject part : parts) {
handler.addInstance(part);
}
}
if (elements != null) {
for (BridgeConstructiveElement ele : elements) {
handler.addInstance(ele);
}
}
}
public void anonymize() {
......@@ -446,7 +409,6 @@ public class BridgeObject extends CityObject {
this.ab = gmlB;
}
@Override
public void fillValues(Copyable original, CopyHandler handler) {
super.fillValues(original, handler);
......@@ -457,16 +419,16 @@ public class BridgeObject extends CityObject {
for (Installation originalBi : originalBo.bridgeInstallations) {
bridgeInstallations.add(handler.getCopyInstance(originalBi));
}
if (originalBo.parts != null) {
for (BridgeObject part : originalBo.parts) {
getParts().add(handler.getCopyInstance(part));
}
}
if (originalBo.elements != null) {
for (BridgeConstructiveElement ele : originalBo.elements) {
getConstructiveElements().add(handler.getCopyInstance(ele));
}
}
}
public List<BoundarySurface> getBoundarySurfaces() {
......@@ -483,9 +445,6 @@ public class BridgeObject extends CityObject {
}
public List<BridgeObject> getParts() {
if (parts == null) {
parts = new ArrayList<>(2);
}
return parts;
}
......@@ -493,4 +452,8 @@ public class BridgeObject extends CityObject {
getParts().add(bPart);
}
public enum BridgeType {
BRIDGE, BRIDGE_PART
}
}
......@@ -18,6 +18,7 @@
*/
package de.hft.stuttgart.citydoctor2.datastructure;
import java.io.Serial;
import java.util.ArrayList;
import java.util.List;
......@@ -35,9 +36,10 @@ import de.hft.stuttgart.citydoctor2.utils.Copyable;
public class Building extends AbstractBuilding {
@Serial
private static final long serialVersionUID = 588480113268630052L;
private List<BuildingPart> buildingParts = new ArrayList<>(2);
private final List<BuildingPart> buildingParts = new ArrayList<>(2);
public List<BuildingPart> getBuildingParts() {
return buildingParts;
......
......@@ -21,8 +21,11 @@ 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 {
@Serial
private static final long serialVersionUID = 8200322261958679163L;
private Building parent;
......
......@@ -30,6 +30,7 @@ import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.stream.Stream;
import org.citygml4j.core.model.CityGMLVersion;
......@@ -53,17 +54,17 @@ import de.hft.stuttgart.quality.model.types.ValidationPlan;
public class CityDoctorModel {
private static final String COULD_NOT_FIND_FEATURE = "Could not find feature: ";
private List<Building> buildings;
private List<Vegetation> vegetation;
private List<BridgeObject> bridges;
private List<CityObject> land;
private List<TransportationObject> roads;
private List<WaterObject> water;
private final List<Building> buildings;
private final List<Vegetation> vegetation;
private final List<BridgeObject> bridges;
private final List<CityObject> land;
private final List<TransportationObject> roads;
private final List<WaterObject> water;
private CityModel cModel;
private ParserConfiguration config;
private String fileName;
private File file;
private List<CheckError> globalErrors;
private final ParserConfiguration config;
private final String fileName;
private final File file;
private final List<CheckError> globalErrors;
private boolean isValidated = false;
private ValidationPlan plan;
private CityGMLVersion cityGMLVersion;
......@@ -173,9 +174,9 @@ public class CityDoctorModel {
return;
}
Map<Vertex, Integer> idMap = new LinkedHashMap<>();
int counter = 0;
AtomicInteger counter = new AtomicInteger(0);
for (Polygon poly : highestLod) {
counter = addRing(poly.getExteriorRing(), idMap, counter);
addRing(poly.getExteriorRing(), idMap, counter);
}
try (BufferedWriter writer = Files.newBufferedWriter(folder.toPath().resolve(co.getGmlId() + ".off"))) {
......@@ -209,15 +210,11 @@ public class CityDoctorModel {
});
}
private int addRing(LinearRing ring, Map<Vertex, Integer> idMap, int counter) {
private void addRing(LinearRing ring, Map<Vertex, Integer> idMap, AtomicInteger counter) {
for (Vertex v : ring.getVertices()) {
if (!idMap.containsKey(v)) {
idMap.put(v, counter);
counter++;
idMap.computeIfAbsent(v, k -> counter.getAndIncrement());
}
}
return counter;
}
public Set<CheckError> collectErrors() {
List<CheckError> errors = new ArrayList<>();
......
......@@ -18,8 +18,8 @@
*/
package de.hft.stuttgart.citydoctor2.datastructure;
import java.io.Serial;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Objects;
......@@ -43,9 +43,10 @@ import de.hft.stuttgart.citydoctor2.utils.Copyable;
*/
public abstract class CityObject extends GmlElement {
@Serial
private static final long serialVersionUID = 651712070755024188L;
private List<Geometry> geometryList = new ArrayList<>();
private final List<Geometry> geometryList = new ArrayList<>();
/**
* Recreates the CityGML4j geometry in this object. The CityGML4j geometry is
......@@ -83,23 +84,11 @@ public abstract class CityObject extends GmlElement {
}
public void removeGeometry(Lod lod) {
Iterator<Geometry> it = geometryList.iterator();
while (it.hasNext()) {
Geometry next = it.next();
if (next.getLod() == lod) {
it.remove();
}
}
geometryList.removeIf(geom -> geom.getLod() == lod);
}
public void removeGeometry(Lod lod, GeometryType type) {
Iterator<Geometry> it = geometryList.iterator();
while (it.hasNext()) {
Geometry next = it.next();
if (next.getLod() == lod && next.getType() == type) {
it.remove();
}
}
geometryList.removeIf(geom -> geom.getLod() == lod && geom.getType() == type);
}
public Geometry getHighestLodGeometry() {
......
......@@ -18,6 +18,7 @@
*/
package de.hft.stuttgart.citydoctor2.datastructure;
import java.io.Serial;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
......@@ -41,6 +42,7 @@ import de.hft.stuttgart.citydoctor2.utils.Copyable;
*/
public class ConcretePolygon extends Polygon {
@Serial
private static final long serialVersionUID = -2208347892270418372L;
private LinearRing exterior;
......
......@@ -18,6 +18,7 @@
*/
package de.hft.stuttgart.citydoctor2.datastructure;
import java.io.Serial;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
......@@ -33,10 +34,11 @@ import de.hft.stuttgart.citydoctor2.utils.Copyable;
*/
public class Edge implements Serializable, Copyable {
@Serial
private static final long serialVersionUID = -504694863498128296L;
private List<Polygon> adjacentPolygons = new ArrayList<>(2);
private List<LinearRing> adjacentRings = new ArrayList<>(2);
private final List<Polygon> adjacentPolygons = new ArrayList<>(2);
private final List<LinearRing> adjacentRings = new ArrayList<>(2);
private Vertex from;
private Vertex to;
......@@ -78,15 +80,7 @@ public class Edge implements Serializable, Copyable {
}
private boolean isPointOfEdge(Vertex v0, Vertex edgePoint) {
if (v0.equals(edgePoint)) {
return true;
}
// for (Vertex v : v0.getNeighbors()) {
// if (v.equals(edgePoint)) {
// return true;
// }
// }
return false;
return v0.equals(edgePoint);
}
public boolean formedByIgnoreDirection(Vertex v1, Vertex v2) {
......@@ -146,13 +140,8 @@ public class Edge implements Serializable, Copyable {
return false;
}
if (to == null) {
if (other.to != null) {
return false;
}
} else if (!to.equals(other.to)) {
return false;
}
return true;
return other.to == null;
} else return to.equals(other.to);
}
public void addAdjacentPolygon(Polygon p) {
......
......@@ -27,6 +27,6 @@ package de.hft.stuttgart.citydoctor2.datastructure;
public enum FeatureType {
BUILDING, TRANSPORTATION, VEGETATION, BRIDGE, LAND, WATER, BOUNDARY_SURFACE, INSTALLATION, OPENING,
BUILDING_PART, BRIDGE_CONSTRUCTION_ELEMENT, BRIDGE_INSTALLATION;
BUILDING_PART, BRIDGE_CONSTRUCTION_ELEMENT, BRIDGE_INSTALLATION
}
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