/*- * 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.core.model.core.AbstractCityObject; import org.citygml4j.core.model.waterbody.WaterBody; import org.citygml4j.core.util.geometry.GeometryFactory; import org.xmlobjects.gml.model.geometry.aggregates.MultiSurface; import org.xmlobjects.gml.model.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. * * @author Matthias Betz * */ public class WaterObject extends CityObject { private static final long serialVersionUID = -3821060595086337424L; private WaterBody gmlWater; private List boundarySurfaceList = new ArrayList<>(); @Override public void reCreateGeometries(GeometryFactory factory, ParserConfiguration config) { for (Geometry geom : getGeometries()) { if (geom.getType() == GeometryType.MULTI_SURFACE) { MultiSurface ms = CityGmlUtils.createMultiSurface(geom, factory, config); if (geom.getLod() == Lod.LOD0) { gmlWater.setLod0MultiSurface(new MultiSurfaceProperty(ms)); } else if (geom.getLod() == Lod.LOD1) { gmlWater.getDeprecatedProperties().setLod1MultiSurface(new MultiSurfaceProperty(ms)); } else { throw new IllegalStateException( "Cannot add MultiSurface geometry with lod to WaterBody:" + geom.getLod()); } } else { throw new IllegalStateException("Cannot add Solid geometry to WaterBody"); } } } /** * Getter for all boundary surfaces contained in this building. * * @return the boundary surfaces */ public List getBoundarySurfaces() { return boundarySurfaceList; } public void addBoundarySurface(BoundarySurface bs) { boundarySurfaceList.add(bs); bs.setParent(this); } @Override public FeatureType getFeatureType() { return FeatureType.WATER; } @Override public void accept(Check c) { super.accept(c); if (c.canExecute(this)) { c.check(this); } } @Override public AbstractCityObject getGmlObject() { return gmlWater; } @Override public void unsetGmlGeometries() { gmlWater.setLod0MultiSurface(null); gmlWater.getDeprecatedProperties().setLod1MultiSurface(null); } public void setGmlObject(WaterBody waterBody) { gmlWater = waterBody; } @Override public String toString() { 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; } }