Commit 67343044 authored by Matthias Betz's avatar Matthias Betz
Browse files

replace copy mechanism

logo now in jar, extracted when needed to temp dir
change version to 3.10
parent 3d26f0e9
Pipeline #5579 failed with stage
in 39 seconds
......@@ -31,6 +31,8 @@ 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;
/**
* Representing a boundary surface in CityGML
......@@ -45,7 +47,7 @@ public class BoundarySurface extends CityObject {
private SurfaceFeatureType featureType;
private BoundarySurfaceType type;
private List<Opening> openings;
private List<Opening> openings = new ArrayList<>(2);
private CityObject parent;
private AbstractCityObject gmlObject;
......@@ -54,16 +56,10 @@ public class BoundarySurface extends CityObject {
this(SurfaceFeatureType.BUILDING, BoundarySurfaceType.UNDEFINED, aco);
}
@Override
public CityObject copy() {
throw new UnsupportedOperationException("Cannot copy BoundarySurface");
}
public BoundarySurface(SurfaceFeatureType featureType, BoundarySurfaceType type, AbstractCityObject aco) {
this.featureType = featureType;
this.type = type;
gmlObject = aco;
openings = new ArrayList<>(2);
}
public void setFeatureType(SurfaceFeatureType featureType) {
......@@ -313,4 +309,31 @@ public class BoundarySurface extends CityObject {
}
}
@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;
}
}
......@@ -18,7 +18,7 @@
*/
package de.hft.stuttgart.citydoctor2.datastructure;
import java.util.LinkedList;
import java.util.ArrayList;
import java.util.List;
import org.citygml4j.factory.GMLGeometryFactory;
......@@ -33,6 +33,8 @@ 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;
/**
* Bridge representation object of CityGML bridge objects
......@@ -51,8 +53,8 @@ public class BridgeObject extends CityObject {
private AbstractBridge ab;
private BridgeType type;
private List<BoundarySurface> boundarySurfaces = new LinkedList<>();
private List<BoundarySurface> boundarySurfaces = new ArrayList<>();
public BridgeObject(BridgeType type, AbstractBridge ab) {
this.ab = ab;
this.type = type;
......@@ -239,5 +241,27 @@ public class BridgeObject extends CityObject {
bs.clearMetaInformation();
}
}
@Override
public void collectInstances(CopyHandler handler) {
super.collectInstances(handler);
for (BoundarySurface bs : boundarySurfaces) {
handler.addInstance(bs);
}
}
@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));
}
}
@Override
public Copyable createCopyInstance() {
return new BridgeObject(type, ab);
}
}
......@@ -30,6 +30,8 @@ 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;
public class Building extends AbstractBuilding {
......@@ -41,11 +43,6 @@ public class Building extends AbstractBuilding {
return buildingParts;
}
@Override
public Building copy() {
return (Building) super.copy();
}
@Override
public void reCreateGeometries(GMLGeometryFactory factory, ParserConfiguration config) {
super.reCreateGeometries(factory, config);
......@@ -150,4 +147,27 @@ public class Building extends AbstractBuilding {
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();
}
}
......@@ -35,6 +35,8 @@ 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;
public class BuildingInstallation extends CityObject {
......@@ -67,11 +69,6 @@ public class BuildingInstallation extends CityObject {
}
}
@Override
public CityObject copy() {
throw new UnsupportedOperationException("Cannot copy BuildingInstallation");
}
private void setGeometryAccordingToLod(Lod lod, GeometryProperty<?> ms) {
switch (lod) {
case LOD2:
......@@ -219,6 +216,29 @@ public class BuildingInstallation extends CityObject {
}
}
@Override
public void fillValues(Copyable original, CopyHandler handler) {
super.fillValues(original, handler);
BuildingInstallation originalBi = (BuildingInstallation) 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 BuildingInstallation();
}
}
......@@ -18,22 +18,23 @@
*/
package de.hft.stuttgart.citydoctor2.datastructure;
import de.hft.stuttgart.citydoctor2.utils.CopyHandler;
import de.hft.stuttgart.citydoctor2.utils.Copyable;
public class BuildingPart extends AbstractBuilding {
private static final long serialVersionUID = 8200322261958679163L;
private Building parent;
private BuildingPart() {
}
public BuildingPart(Building parent) {
this.parent = parent;
parent.addBuildingPart(this);
}
@Override
public CityObject copy() {
throw new UnsupportedOperationException("Cannot copy BuildingPart");
}
public Building getParent() {
return parent;
}
......@@ -48,5 +49,22 @@ 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();
}
}
......@@ -18,15 +18,21 @@
*/
package de.hft.stuttgart.citydoctor2.datastructure;
import java.io.BufferedWriter;
import java.io.File;
import java.io.IOException;
import java.io.UncheckedIOException;
import java.nio.file.Files;
import java.time.ZonedDateTime;
import java.util.ArrayList;
import java.util.EnumMap;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.ServiceLoader;
import java.util.Map.Entry;
import java.util.ServiceLoader;
import java.util.Set;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.stream.Stream;
......@@ -44,6 +50,8 @@ import org.citygml4j.xml.io.CityGMLOutputFactory;
import org.citygml4j.xml.io.writer.CityGMLWriteException;
import org.citygml4j.xml.io.writer.CityGMLWriter;
import de.hft.stuttgart.citydoctor2.check.AbstractCheck;
import de.hft.stuttgart.citydoctor2.check.Check;
import de.hft.stuttgart.citydoctor2.check.CheckError;
import de.hft.stuttgart.citydoctor2.check.ErrorId;
import de.hft.stuttgart.citydoctor2.parser.ParserConfiguration;
......@@ -127,6 +135,14 @@ public class CityDoctorModel {
}
public void saveAs(String file) throws CityGMLBuilderException, CityGMLWriteException, ADEException {
if (file.endsWith(".off")) {
exportAsOff(file);
} else {
exportAsGML(file);
}
}
private void exportAsGML(String file) throws ADEException, CityGMLBuilderException, CityGMLWriteException {
CityGMLContext gmlContext = CityGMLContext.getInstance();
// setup energy ade stuff, so the parser doesn't crash on encountering this
if (!gmlContext.hasADEContexts()) {
......@@ -165,6 +181,83 @@ public class CityDoctorModel {
}
}
private void exportAsOff(String file) {
file = file.substring(0, file.lastIndexOf('.'));
File folder = new File(file);
folder.mkdirs();
createFeatureStream().forEach(co -> {
Map<Lod, Set<Polygon>> polygonMap = new EnumMap<>(Lod.class);
Check c = new AbstractCheck() {
@Override
public void check(Geometry geom) {
polygonMap.compute(geom.getLod(), (lod, polys) -> {
if (polys == null) {
polys = new HashSet<>();
}
for (Polygon poly : geom.getPolygons()) {
polys.add(poly.getOriginal());
}
return polys;
});
}
};
co.accept(c);
Set<Polygon> highestLod = polygonMap.get(Lod.LOD2);
if (highestLod == null) {
highestLod = polygonMap.get(Lod.LOD1);
}
if (highestLod == null) {
return;
}
Map<Vertex, Integer> idMap = new LinkedHashMap<>();
int counter = 0;
for (Polygon poly : highestLod) {
counter = addRing(poly.getExteriorRing(), idMap, counter);
}
try (BufferedWriter writer = Files.newBufferedWriter(folder.toPath().resolve(co.getGmlId() + ".off"))) {
writer.write("OFF\n");
writer.write(Integer.toString(idMap.size()));
writer.write(' ');
writer.write(Integer.toString(highestLod.size()));
writer.write(" 0\n");
for (Vertex v : idMap.keySet()) {
writer.write(Double.toString(v.getX()));
writer.write(' ');
writer.write(Double.toString(v.getY()));
writer.write(' ');
writer.write(Double.toString(v.getZ()));
writer.write('\n');
}
for (Polygon poly : highestLod) {
writer.write(Integer.toString(poly.getExteriorRing().getVertices().size() - 1));
writer.write(' ');
for (int i = 0; i < poly.getExteriorRing().getVertices().size() - 1; i++) {
Vertex v = poly.getExteriorRing().getVertices().get(i);
writer.write(Integer.toString(idMap.get(v)));
writer.write(' ');
}
writer.write('\n');
}
} catch (IOException e) {
throw new UncheckedIOException(e);
}
});
}
private int addRing(LinearRing ring, Map<Vertex, Integer> idMap, int counter) {
for (Vertex v : ring.getVertices()) {
if (!idMap.containsKey(v)) {
idMap.put(v, counter);
counter++;
}
}
return counter;
}
private void storeCityObjects(List<? extends CityObject> cos, GMLGeometryFactory gmlFactory) {
for (CityObject co : cos) {
QualityADEUtils.removeValidationResult(co);
......
......@@ -30,6 +30,8 @@ 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;
/**
* Abstract class for general features such as Buildings, Water objects, ...
......@@ -69,11 +71,14 @@ public abstract class CityObject extends GmlElement {
* Remove the CityGML4j geometries from the data structure to save memory
*/
public abstract void unsetGmlGeometries();
@Override
public CityObject copy() {
return (CityObject) super.copy();
}
// void copyAttributesInto(CityObject copy, ReferenceStore store) {
// super.copyAttributesInto(copy);
// copy.geometryList = new ArrayList<>();
// for (Geometry geom : geometryList) {
// copy.geometryList.add(geom.copy(store));
// }
// }
public void addGeometry(Geometry geom) {
Objects.requireNonNull(geom);
......@@ -186,4 +191,20 @@ public abstract class CityObject extends GmlElement {
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));
}
}
}
......@@ -27,8 +27,10 @@ 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.TesselatedPolygon;
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;
/**
* A polygon that actually contains the rings and points representing the
......@@ -455,4 +457,44 @@ public class ConcretePolygon extends Polygon {
public void clearMetaInformation() {
parent.clearMetaInformation();
}
@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);
}
}
......@@ -22,13 +22,16 @@ import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import de.hft.stuttgart.citydoctor2.utils.CopyHandler;
import de.hft.stuttgart.citydoctor2.utils.Copyable;
/**
* Representing an edge between two consecutive points of a linear ring
*
* @author Matthias Betz
*
*/
public class Edge implements Serializable {
public class Edge implements Serializable, Copyable {
private static final long serialVersionUID = -504694863498128296L;
......@@ -47,6 +50,9 @@ public class Edge implements Serializable {
this.to = to;
}
private Edge() {
}
public Vertex getFrom() {
return from;
}
......@@ -67,7 +73,8 @@ public class Edge implements Serializable {
numberOfOppositeHalfEdges++;
return;
}
throw new IllegalStateException("The given vertices do not form this edge\n v0=" + v0 + ", v1=" + v1 + ", edge" + this);
throw new IllegalStateException(
"The given vertices do not form this edge\n v0=" + v0 + ", v1=" + v1 + ", edge" + this);
}
private boolean isPointOfEdge(Vertex v0, Vertex edgePoint) {
......@@ -192,4 +199,32 @@ public class Edge implements Serializable {
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));
}
}
}
......@@ -23,6 +23,7 @@ import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Random;
import java.util.Set;
......@@ -33,6 +34,8 @@ 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;
/**
......@@ -367,16 +370,11 @@ public class Geometry extends GmlElement {
return false;
}
@Override
public Geometry copy() {
return (Geometry) super.copy();
}
@Override
public void prepareForChecking() {
updateEdgesAndVertices();
}
@Override
public void clearMetaInformation() {
if (vertices != null) {
......@@ -388,4 +386,58 @@ public class Geometry extends GmlElement {
edges = null;
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<SerializablePair<Vertex, Vertex>, 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<SerializablePair<Vertex, Vertex>, Edge> originalEntry : originalGeometry.edgeMap.entrySet()) {
Vertex copyV0 = handler.getCopyInstance(originalEntry.getKey().getValue0());
Vertex copyV1 = handler.getCopyInstance(originalEntry.getKey().getValue1());
SerializablePair<Vertex, Vertex> 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);
}
}
......@@ -18,14 +18,9 @@
*/
package de.hft.stuttgart.citydoctor2.datastructure;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.UncheckedIOException;
import de.hft.stuttgart.citydoctor2.check.Checkable;
import de.hft.stuttgart.citydoctor2.utils.CopyHandler;
import de.hft.stuttgart.citydoctor2.utils.Copyable;
/**
* A general GML element that has a gml id
......@@ -33,26 +28,12 @@ import de.hft.stuttgart.citydoctor2.check.Checkable;
* @author Matthias Betz
*
*/
public abstract class GmlElement extends Checkable {
public abstract class GmlElement extends Checkable implements Copyable {
private static final long serialVersionUID = -3242505393303017359L;
private GmlId gmlId;
public GmlElement copy() {
ByteArrayOutputStream arrayOutputStream = new ByteArrayOutputStream();
try {
ObjectOutputStream oos = new ObjectOutputStream(arrayOutputStream);
oos.writeObject(this);
ObjectInputStream ooi = new ObjectInputStream(new ByteArrayInputStream(arrayOutputStream.toByteArray()));
return (GmlElement) ooi.readObject();
} catch (IOException e) {
throw new UncheckedIOException(e);
} catch (ClassNotFoundException e) {
throw new IllegalStateException(e);
}
}
public void setGmlId(GmlId id) {
gmlId = id;
}
......@@ -64,4 +45,12 @@ public abstract class GmlElement extends Checkable {
}
return gmlId;
}
@Override
public void fillValues(Copyable original, CopyHandler handler) {
GmlElement originalElement = (GmlElement) original;
// generate gml id before copying
gmlId = originalElement.getGmlId();
}
}
......@@ -27,6 +27,7 @@ import org.citygml4j.model.gml.geometry.aggregates.MultiSurfaceProperty;
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;
/**
* Represents a land use CityGML object.
......@@ -111,5 +112,10 @@ public class LandObject extends CityObject {
public String toString() {
return "LandObject [id=" + getGmlId() + "]";
}
@Override
public Copyable createCopyInstance() {
return new LandObject(lu);
}
}
......@@ -27,6 +27,8 @@ import de.hft.stuttgart.citydoctor2.math.Ring2d;
import de.hft.stuttgart.citydoctor2.math.UnitVector3d;
import de.hft.stuttgart.citydoctor2.math.Vector2d;
import de.hft.stuttgart.citydoctor2.math.Vector3d;
import de.hft.stuttgart.citydoctor2.utils.CopyHandler;
import de.hft.stuttgart.citydoctor2.utils.Copyable;
/**
* Represents a linear ring used in polygons. The ring contains the vertices.
......@@ -252,4 +254,28 @@ public class LinearRing extends GmlElement {
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));
}
}
@Override
public void collectInstances(CopyHandler handler) {
for (Vertex v : vertices) {
handler.addInstance(v);
}
handler.addInstance(parent);
}
@Override
public Copyable createCopyInstance() {
return new LinearRing(type);
}
}
......@@ -27,6 +27,8 @@ 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;
/**
* A polygon that does not contain the geometry but is only a link to an actual
......@@ -41,7 +43,10 @@ public class LinkedPolygon extends Polygon {
private Geometry parent;
private ConcretePolygon poly;
private LinkedPolygon() {
}
/**
*
* @param poly polygon this is linked to
......@@ -267,4 +272,22 @@ 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);
}
}
......@@ -26,6 +26,8 @@ import org.citygml4j.model.gml.geometry.aggregates.MultiSurfaceProperty;
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;
/**
* Represents an Opening suchs a window or Door in a surface of a feature.
......@@ -44,6 +46,10 @@ public class Opening extends CityObject {
private SurfaceFeatureType featureType;
private AbstractCityObject ao;
private Opening(OpeningType type) {
this.type = type;
}
public Opening(OpeningType type, SurfaceFeatureType featureType, BoundarySurface partOf, AbstractCityObject ao) {
this.featureType = featureType;
......@@ -52,11 +58,6 @@ public class Opening extends CityObject {
this.ao = ao;
}
@Override
public CityObject copy() {
throw new UnsupportedOperationException("Cannot copy Opening");
}
public void reCreateGeometries(GMLGeometryFactory factory, ParserConfiguration config) {
if (!ao.isSetId()) {
ao.setId(getGmlId().getGmlString());
......@@ -183,4 +184,25 @@ public class Opening extends CityObject {
return FeatureType.OPENING;
}
@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;
}
}
......@@ -35,6 +35,8 @@ 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;
/**
* Representation of a transportation object.
......@@ -272,5 +274,28 @@ public class TransportationObject extends CityObject {
child.clearMetaInformation();
}
}
@Override
public void collectInstances(CopyHandler handler) {
super.collectInstances(handler);
for (TransportationObject to : composesOf) {
handler.addInstance(to);
}
}
@Override
public void fillValues(Copyable original, CopyHandler handler) {
super.fillValues(original, handler);
TransportationObject originalTo = (TransportationObject) original;
for (TransportationObject to : originalTo.composesOf) {
composesOf.add(handler.getCopyInstance(to));
}
ato = originalTo.ato;
}
@Override
public Copyable createCopyInstance() {
return new TransportationObject(type);
}
}
......@@ -33,6 +33,8 @@ import org.citygml4j.model.gml.geometry.primitives.SolidProperty;
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;
/**
* Representation of CityGML vegetation objects
......@@ -205,4 +207,15 @@ public class Vegetation extends CityObject {
return "Vegetation [id=" + getGmlId() + "]";
}
@Override
public Copyable createCopyInstance() {
return new Vegetation(type);
}
@Override
public void fillValues(Copyable original, CopyHandler handler) {
super.fillValues(original, handler);
}
}
......@@ -24,6 +24,8 @@ import java.util.List;
import java.util.Set;
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;
/**
......@@ -32,7 +34,7 @@ import de.hft.stuttgart.citydoctor2.utils.SerializablePair;
* @author Matthias Betz
*
*/
public class Vertex extends Vector3d {
public class Vertex extends Vector3d implements Copyable {
private static final long serialVersionUID = -5525361920397934892L;
......@@ -134,4 +136,35 @@ public class Vertex extends Vector3d {
void clearAdjacentRings() {
adjacentRings = new ArrayList<>(2);
}
@Override
public void collectInstances(CopyHandler handler) {
for (SerializablePair<Geometry, HashSet<LinearRing>> 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<Geometry, HashSet<LinearRing>> pair : originalVertex.adjacentRings) {
Geometry geomCopy = handler.getCopyInstance(pair.getValue0());
HashSet<LinearRing> set = new HashSet<>();
for (LinearRing originalRing : pair.getValue1()) {
set.add(handler.getCopyInstance(originalRing));
}
SerializablePair<Geometry, HashSet<LinearRing>> copyPair = new SerializablePair<>(geomCopy, set);
adjacentRings.add(copyPair);
}
}
}
......@@ -27,6 +27,8 @@ import org.citygml4j.model.gml.geometry.aggregates.MultiSurfaceProperty;
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;
/**
* Represents cityGML water body objects.
......@@ -96,4 +98,15 @@ 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;
gmlWater = wo.gmlWater;
}
}
......@@ -71,7 +71,7 @@ public class UnitVector3d extends Vector3d {
}
@Override
public UnitVector3d copy() {
public UnitVector3d copyVector() {
return new UnitVector3d(getX(), getY(), getZ());
}
......
Markdown is supported
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