/*- * 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.datastructure; import java.util.ArrayList; import java.util.List; import org.citygml4j.factory.GMLGeometryFactory; import org.citygml4j.model.citygml.core.AbstractCityObject; import org.citygml4j.model.citygml.transportation.AbstractTransportationObject; import org.citygml4j.model.citygml.transportation.AuxiliaryTrafficArea; import org.citygml4j.model.citygml.transportation.TrafficArea; import org.citygml4j.model.citygml.transportation.TransportationComplex; import org.citygml4j.model.gml.geometry.aggregates.MultiSurface; import org.citygml4j.model.gml.geometry.aggregates.MultiSurfaceProperty; 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; /** * Representation of a transportation object. * * @author Matthias Betz * */ public class TransportationObject extends CityObject { private static final long serialVersionUID = -2698907271726700390L; public enum TransportationType { ROAD, TRACK, RAILWAY, TRAFFIC_AREA, AUXILLIARY_TRAFFIC_AREA, TRANSPORTATION_COMPLEX, SQUARE } private AbstractTransportationObject ato; private List composesOf = new ArrayList<>(1); private TransportationType type; public TransportationObject(TransportationType type) { this.type = type; } @Override public FeatureType getFeatureType() { return FeatureType.TRANSPORTATION; } @Override public void reCreateGeometries(GMLGeometryFactory factory, ParserConfiguration config) { for (Geometry geom : getGeometries()) { if (geom.getType() == GeometryType.MULTI_SURFACE) { MultiSurface ms = CityGmlUtils.createMultiSurface(geom, factory, config); switch (type) { case ROAD: case TRACK: case RAILWAY: case SQUARE: case TRANSPORTATION_COMPLEX: TransportationComplex tc = (TransportationComplex) ato; setMultiSurfaceAccordingToLod(tc, ms, geom.getLod()); break; case TRAFFIC_AREA: TrafficArea ta = (TrafficArea) ato; setMultiSurfaceAccordingToLod(ta, ms, geom.getLod()); break; case AUXILLIARY_TRAFFIC_AREA: AuxiliaryTrafficArea ata = (AuxiliaryTrafficArea) ato; setMultiSurfaceAccordingToLod(ata, ms, geom.getLod()); break; } } else { throw new IllegalStateException("Geometry in TransportationObject cannot be of type " + geom.getType() + ". Only MultiSurface allowed"); } } for (TransportationObject children : composesOf) { children.reCreateGeometries(factory, config); } } private void setMultiSurfaceAccordingToLod(TransportationComplex tc, MultiSurface ms, Lod lod) { switch (lod) { case LOD1: tc.setLod1MultiSurface(new MultiSurfaceProperty(ms)); break; case LOD2: tc.setLod2MultiSurface(new MultiSurfaceProperty(ms)); break; case LOD3: tc.setLod3MultiSurface(new MultiSurfaceProperty(ms)); break; case LOD4: tc.setLod4MultiSurface(new MultiSurfaceProperty(ms)); break; default: throw new IllegalStateException("cannot set geometry with LOD for TransportationComplex: " + lod); } } private void setMultiSurfaceAccordingToLod(AuxiliaryTrafficArea ata, MultiSurface ms, Lod lod) { switch (lod) { case LOD2: ata.setLod2MultiSurface(new MultiSurfaceProperty(ms)); break; case LOD3: ata.setLod3MultiSurface(new MultiSurfaceProperty(ms)); break; case LOD4: ata.setLod4MultiSurface(new MultiSurfaceProperty(ms)); break; default: throw new IllegalStateException("cannot set geometry with LOD for AuxiliaryTrafficArea: " + lod); } } private void setMultiSurfaceAccordingToLod(TrafficArea ta, MultiSurface ms, Lod lod) { switch (lod) { case LOD2: ta.setLod2MultiSurface(new MultiSurfaceProperty(ms)); break; case LOD3: ta.setLod3MultiSurface(new MultiSurfaceProperty(ms)); break; case LOD4: ta.setLod4MultiSurface(new MultiSurfaceProperty(ms)); break; default: throw new IllegalStateException("cannot set geometry with LOD for TrafficArea: " + lod); } } @Override public boolean containsError(CheckId checkIdentifier) { boolean hasError = super.containsError(checkIdentifier); if (hasError) { return true; } for (TransportationObject to : composesOf) { if (to.containsError(checkIdentifier)) { return true; } } return false; } @Override public void clearAllContainedCheckResults() { super.clearAllContainedCheckResults(); for (TransportationObject to : composesOf) { to.clearAllContainedCheckResults(); } } @Override public void collectContainedErrors(List errors) { super.collectContainedErrors(errors); for (TransportationObject to : composesOf) { to.collectContainedErrors(errors); } } @Override public boolean containsAnyError() { boolean hasError = super.containsAnyError(); if (hasError) { return true; } for (TransportationObject to : composesOf) { if (to.containsAnyError()) { return true; } } return false; } @Override public void accept(Check c) { super.accept(c); if (c.canExecute(this)) { c.check(this); } for (TransportationObject to : composesOf) { to.accept(c); } } @Override public AbstractCityObject getGmlObject() { return ato; } @Override public void unsetGmlGeometries() { switch (type) { case ROAD: case TRACK: case RAILWAY: case SQUARE: case TRANSPORTATION_COMPLEX: TransportationComplex tc = (TransportationComplex) ato; tc.unsetLod1MultiSurface(); tc.unsetLod2MultiSurface(); tc.unsetLod3MultiSurface(); tc.unsetLod4MultiSurface(); break; case TRAFFIC_AREA: TrafficArea ta = (TrafficArea) ato; ta.unsetLod2MultiSurface(); ta.unsetLod3MultiSurface(); ta.unsetLod4MultiSurface(); break; case AUXILLIARY_TRAFFIC_AREA: AuxiliaryTrafficArea ata = (AuxiliaryTrafficArea) ato; ata.unsetLod2MultiSurface(); ata.unsetLod3MultiSurface(); ata.unsetLod4MultiSurface(); break; } } public void setGmlObject(AbstractTransportationObject tc) { ato = tc; } public void addChild(TransportationObject subTrans) { composesOf.add(subTrans); } public List getChildren() { return composesOf; } public TransportationType getTransportationType() { return type; } @Override public String toString() { return "TransportationObject [id=" + getGmlId() + "]"; } @Override public void prepareForChecking() { super.prepareForChecking(); for (TransportationObject child : composesOf) { child.prepareForChecking(); } } @Override public void clearMetaInformation() { super.clearMetaInformation(); for (TransportationObject child : composesOf) { child.clearMetaInformation(); } } }