Commit f57a3515 authored by Luna Riegel's avatar Luna Riegel
Browse files

Feat: Add data model classes for filling elements

parent 37d7d93f
package de.hft.stuttgart.citydoctor2.datastructure;
import de.hft.stuttgart.citydoctor2.check.CheckableVisitor;
import de.hft.stuttgart.citydoctor2.parser.ParserConfiguration;
import de.hft.stuttgart.citydoctor2.utils.CityGmlUtils;
import org.citygml4j.core.model.construction.AbstractFillingElement;
import org.citygml4j.core.model.core.AbstractCityObject;
import org.citygml4j.core.util.geometry.GeometryFactory;
import org.xmlobjects.gml.model.geometry.GeometryProperty;
import org.xmlobjects.gml.model.geometry.aggregates.MultiSurface;
import org.xmlobjects.gml.model.geometry.aggregates.MultiSurfaceProperty;
import org.xmlobjects.gml.model.geometry.complexes.CompositeSurface;
import org.xmlobjects.gml.model.geometry.primitives.Solid;
import org.xmlobjects.gml.model.geometry.primitives.SolidProperty;
import java.io.Serial;
import java.util.ArrayList;
import java.util.List;
public abstract class AbstractConstructiveFillingElement extends CityObject {
private static final String CANNOT_ADD = "Cannot add ";
@Serial
private static final long serialVersionUID = -4183072041020247520L;
private CityObject parent;
private final List<BoundarySurface> boundarySurfaceList = new ArrayList<>();
private AbstractFillingElement gmlElement;
protected AbstractConstructiveFillingElement(AbstractFillingElement gmlElement) {
this.gmlElement = gmlElement;
}
@Override
public void accept(CheckableVisitor c){
super.accept(c);
for (BoundarySurface bs : boundarySurfaceList) {
bs.accept(c);
}
}
public void setParent(CityObject parent) {
this.parent = parent;
}
public CityObject getParent() {
return parent;
}
@Override
public void rebuildGeometries(GeometryFactory factory, ParserConfiguration config) {
// only handles CityGML2 for now
// unknown which CityGML is handled here
// need context information to decide
for (Geometry geom : getGeometries()) {
if (geom instanceof ImplicitGeometryHolder) {
continue;
}
switch (geom.getType()) {
case SOLID:
Solid solid = CityGmlUtils.createSolid(geom, factory, config);
setSolidAccordingToLod(geom, solid);
break;
case MULTI_SURFACE:
MultiSurface ms = CityGmlUtils.createMultiSurface(geom, factory, config);
setMultiSurfaceAccordingToLod(geom, ms);
break;
}
}
}
private void setSolidAccordingToLod(Geometry geom, Solid solid) {
switch (geom.getLod()) {
case LOD1:
gmlElement.setLod1Solid(new SolidProperty(solid));
break;
case LOD2:
gmlElement.setLod2Solid(new SolidProperty(solid));
break;
case LOD3:
gmlElement.setLod3Solid(new SolidProperty(solid));
break;
default:
throw new IllegalStateException(CANNOT_ADD + geom.getLod() + " solid to buildings");
}
}
private void setMultiSurfaceAccordingToLod(Geometry geom, MultiSurface ms) {
switch (geom.getLod()) {
case LOD0:
gmlElement.setLod0MultiSurface(new MultiSurfaceProperty(ms));
break;
case LOD2:
gmlElement.setLod2MultiSurface(new MultiSurfaceProperty(ms));
break;
case LOD3:
gmlElement.setLod3MultiSurface(new MultiSurfaceProperty(ms));
break;
default:
throw new IllegalStateException(CANNOT_ADD + geom.getLod() + " multi surface to buildings");
}
}
@Override
public AbstractCityObject getGmlObject() {
return gmlElement;
}
@Override
public void unsetGmlGeometries() {
gmlElement.setLod0MultiSurface(null);
gmlElement.setLod1Solid(null);
gmlElement.setLod2Solid(null);
gmlElement.setLod2MultiSurface(null);
gmlElement.setLod3Solid(null);
gmlElement.setLod3MultiSurface(null);
}
@Override
public CityObject getTopLevelCityObject() {
return parent.getTopLevelCityObject();
}
public void addBoundarySurface(BoundarySurface bs) {
boundarySurfaceList.add(bs);
bs.setParent(this);
}
public List<BoundarySurface> getBoundarySurfaces() {
return boundarySurfaceList;
}
}
......@@ -25,6 +25,6 @@ package de.hft.stuttgart.citydoctor2.datastructure;
*/
public enum BoundarySurfaceType {
UNDEFINED, ROOF, WALL, GROUND, CLOSURE, OUTER_FLOOR, OUTER_CEILING, CEILING, INTERIOR_WALL, FLOOR
UNDEFINED, ROOF, WALL, GROUND, CLOSURE, OUTER_FLOOR, OUTER_CEILING, CEILING, INTERIOR_WALL, FLOOR, WINDOW, DOOR
}
package de.hft.stuttgart.citydoctor2.datastructure;
import javafx.scene.paint.Color;
public class DoorObject extends AbstractConstructiveFillingElement
{
public DoorObject(org.citygml4j.core.model.construction.Door door) {
super(door);
}
public String getDisplayText() {
return String.format("[Door] %s", this.getGmlId().toString());
}
@Override
public Color getRenderColor() {
return Color.ORANGE;
}
@Override
public FeatureType getFeatureType() {
return FeatureType.DOOR;
}
}
......@@ -29,7 +29,7 @@ public enum FeatureType {
BUILDING, TRANSPORTATION, VEGETATION, BRIDGE, LAND, WATER, BOUNDARY_SURFACE, INSTALLATION, OPENING,
BUILDING_PART, BUILDING_SUBDIVISION, BRIDGE_CONSTRUCTION_ELEMENT, BRIDGE_INSTALLATION, ROOM, FURNITURE, CITY_FURNITURE,
OTHER_CITY_OBJECT, TUNNEL, TUNNEL_PART, TUNNEL_CONSTRUCTION_ELEMENT, TUNNEL_INSTALLATION;
OTHER_CITY_OBJECT, TUNNEL, TUNNEL_PART, TUNNEL_CONSTRUCTION_ELEMENT, TUNNEL_INSTALLATION, WINDOW, DOOR;
public TopLevelFeatureType mapToTopLevelFeatureType() {
return switch (this) {
......
package de.hft.stuttgart.citydoctor2.datastructure;
import javafx.scene.paint.Color;
;
public class WindowObject extends AbstractConstructiveFillingElement {
public WindowObject(org.citygml4j.core.model.construction.Window window) {
super(window);
}
@Override
public String getDisplayText() {
return String.format("[Window] %s", this.getGmlId().toString());
}
@Override
public Color getRenderColor() {
return Color.TEAL;
}
@Override
public FeatureType getFeatureType() {
return FeatureType.WINDOW;
}
}
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