/*- * 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.Iterator; import java.util.List; import java.util.Objects; import org.citygml4j.factory.GMLGeometryFactory; import org.citygml4j.model.citygml.core.AbstractCityObject; 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; /** * Abstract class for general features such as Buildings, Water objects, ... *
* Contains the geometries * * @author Matthias Betz * */ public abstract class CityObject extends GmlElement { private static final long serialVersionUID = 651712070755024188L; private List geometryList = new ArrayList<>(); /** * Recreates the CityGML4j geometry in this object. The CityGML4j geometry is * deleted from the data structure as was mapped to the city doctor data * structure. For writing CityGML files the geometry has to be restored. Also * maps changes to geometry back to CityGML4j * * @param factory needed to create CityGML4j data structures * @param config contains information whether a city doctor point was * transformed to a different coordinate system. It would need to * be transformed to the original coordinate system */ public abstract void reCreateGeometries(GMLGeometryFactory factory, ParserConfiguration config); /** * Getter for the CityGML4j data object * * @return the CityGML4j data object */ public abstract AbstractCityObject getGmlObject(); /** * Remove the CityGML4j geometries from the data structure to save memory */ public abstract void unsetGmlGeometries(); @Override public CityObject copy() { return (CityObject) super.copy(); } public void addGeometry(Geometry geom) { Objects.requireNonNull(geom); geometryList.add(geom); geom.setParent(this); } public List getGeometries() { return geometryList; } public void removeGeometry(Lod lod) { Iterator it = geometryList.iterator(); while (it.hasNext()) { Geometry next = it.next(); if (next.getLod() == lod) { it.remove(); } } } public Geometry getHighestLodGeometry() { Geometry highestLodGeometry = null; Lod highestLod = null; for (Geometry geom : geometryList) { if (highestLod == null || geom.getLod().isHigher(highestLod)) { highestLodGeometry = geom; highestLod = geom.getLod(); } } return highestLodGeometry; } public abstract FeatureType getFeatureType(); @Override public void accept(Check c) { super.accept(c); if (c.canExecute(this)) { c.check(this); } for (Geometry geom : geometryList) { geom.accept(c); } } @Override public boolean containsError(CheckId checkIdentifier) { boolean hasError = super.containsError(checkIdentifier); if (hasError) { return true; } for (Geometry geom : geometryList) { if (geom.containsError(checkIdentifier)) { return true; } } return false; } @Override public void clearAllContainedCheckResults() { super.clearCheckResults(); for (Geometry geom : geometryList) { geom.clearAllContainedCheckResults(); } } @Override public void collectContainedErrors(List errors) { super.collectContainedErrors(errors); for (Geometry geom : geometryList) { geom.collectContainedErrors(errors); } } @Override public boolean containsAnyError() { boolean hasError = super.containsAnyError(); if (hasError) { return true; } for (Geometry geom : geometryList) { if (geom.containsAnyError()) { return true; } } return false; } public Geometry getGeometry(GeometryType type, Lod lod) { for (Geometry geom : geometryList) { if (geom.getType() == type && geom.getLod() == lod) { return geom; } } return null; } @Override public void prepareForChecking() { for (Geometry geom : geometryList) { geom.prepareForChecking(); } } @Override public void clearMetaInformation() { for (Geometry geom : geometryList) { geom.clearMetaInformation(); } } }