BoundarySurface.java 7.18 KB
Newer Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
/*-
 *  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 <https://www.gnu.org/licenses/>.
 */
package de.hft.stuttgart.citydoctor2.datastructure;

import java.util.ArrayList;
import java.util.List;

Matthias Betz's avatar
Matthias Betz committed
24
25
26
27
import org.citygml4j.core.model.core.AbstractThematicSurface;
import org.citygml4j.core.util.geometry.GeometryFactory;
import org.xmlobjects.gml.model.geometry.aggregates.MultiSurface;
import org.xmlobjects.gml.model.geometry.aggregates.MultiSurfaceProperty;
28
29
30
31
32
33

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;
Matthias Betz's avatar
Matthias Betz committed
34
35
import de.hft.stuttgart.citydoctor2.utils.CopyHandler;
import de.hft.stuttgart.citydoctor2.utils.Copyable;
36
37
38
39
40
41
42
43
44
45
46
47
48
49

/**
 * Representing a boundary surface in CityGML
 * 
 * @author Matthias Betz
 *
 */
public class BoundarySurface extends CityObject {

	private static final long serialVersionUID = 8793865135393496408L;

	private SurfaceFeatureType featureType;
	private BoundarySurfaceType type;

Matthias Betz's avatar
Matthias Betz committed
50
	private List<Opening> openings = new ArrayList<>(2);
51
52
	private CityObject parent;

Matthias Betz's avatar
Matthias Betz committed
53
	private AbstractThematicSurface gmlObject;
54

Matthias Betz's avatar
Matthias Betz committed
55
	public BoundarySurface(AbstractThematicSurface aco) {
56
57
58
		this(SurfaceFeatureType.BUILDING, BoundarySurfaceType.UNDEFINED, aco);
	}

Matthias Betz's avatar
Matthias Betz committed
59
	public BoundarySurface(SurfaceFeatureType featureType, BoundarySurfaceType type, AbstractThematicSurface aco) {
60
61
62
63
64
65
66
67
68
69
70
71
72
		this.featureType = featureType;
		this.type = type;
		gmlObject = aco;
	}

	public void setFeatureType(SurfaceFeatureType featureType) {
		this.featureType = featureType;
	}

	public void setType(BoundarySurfaceType type) {
		this.type = type;
	}

Matthias Betz's avatar
Matthias Betz committed
73
	public void setGmlObject(AbstractThematicSurface gmlObject) {
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
		this.gmlObject = gmlObject;
	}

	public SurfaceFeatureType getSurfaceFeatureType() {
		return featureType;
	}

	public BoundarySurfaceType getType() {
		return type;
	}

	public List<Opening> getOpenings() {
		return openings;
	}

	@Override
Matthias Betz's avatar
Matthias Betz committed
90
91
	public void reCreateGeometries(GeometryFactory factory, ParserConfiguration config) {
		if (gmlObject.getId() == null) {
92
93
94
95
96
			gmlObject.setId(getGmlId().getGmlString());
		}
		for (Geometry geom : getGeometries()) {
			if (geom.getType() == GeometryType.MULTI_SURFACE) {
				MultiSurface ms = CityGmlUtils.createMultiSurface(geom, factory, config);
97
98
99
				if (ms != null) {
					setGeometryAccordingToLod(geom.getLod(), new MultiSurfaceProperty(ms));
				}
100
101
102
103
104
105
106
107
108
109
110
			} else {
				throw new IllegalStateException("BoundarySurfaces can only have MultiSurface geometries");
			}
		}
		for (Opening o : openings) {
			o.reCreateGeometries(factory, config);
		}
	}

	private void setGeometryAccordingToLod(Lod lod, MultiSurfaceProperty ms) {
		switch (lod) {
Matthias Betz's avatar
Matthias Betz committed
111
112
113
114
115
116
		case LOD0:
			gmlObject.setLod0MultiSurface(ms);
			break;
		case LOD1:
			gmlObject.setLod1MultiSurface(ms);
			break;
117
		case LOD2:
Matthias Betz's avatar
Matthias Betz committed
118
			gmlObject.setLod2MultiSurface(ms);
119
120
			break;
		case LOD3:
Matthias Betz's avatar
Matthias Betz committed
121
			gmlObject.setLod3MultiSurface(ms);
122
123
			break;
		case LOD4:
Matthias Betz's avatar
Matthias Betz committed
124
			gmlObject.getDeprecatedProperties().setLod4MultiSurface(ms);
125
126
			break;
		default:
Matthias Betz's avatar
Matthias Betz committed
127
			throw new IllegalStateException("Found geometry with LOD other than LOD1-4, which is illegal for BoundarySurfaces: " + lod);
128
129
		}
	}
Matthias Betz's avatar
Matthias Betz committed
130
	
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
	@Override
	public void clearAllContainedCheckResults() {
		super.clearAllContainedCheckResults();
		for (Opening o : openings) {
			o.clearAllContainedCheckResults();
		}
	}

	@Override
	public void collectContainedErrors(List<CheckError> errors) {
		super.collectContainedErrors(errors);
		for (Opening o : openings) {
			o.collectContainedErrors(errors);
		}
	}

	@Override
	public boolean containsAnyError() {
		boolean hasError = super.containsAnyError();
		if (hasError) {
			return true;
		}
		for (Opening o : openings) {
			if (o.containsAnyError()) {
				return true;
			}
		}
		return false;
	}

	@Override
	public boolean containsError(CheckId checkIdentifier) {
		boolean hasError = super.containsError(checkIdentifier);
		if (hasError) {
			return true;
		}
		for (Opening o : openings) {
			if (o.containsError(checkIdentifier)) {
				return true;
			}
		}
		return false;
	}

	@Override
	public void accept(Check c) {
		super.accept(c);
		if (c.canExecute(this)) {
			c.check(this);
		}
		for (Opening o : openings) {
			o.accept(c);
		}
	}

	public void setParent(CityObject parent) {
		this.parent = parent;
	}

	public CityObject getParent() {
		return parent;
	}

Matthias Betz's avatar
Matthias Betz committed
194
	@Override
195
	public void unsetGmlGeometries() {
Matthias Betz's avatar
Matthias Betz committed
196
197
198
199
200
201
		gmlObject.setLod0MultiSurface(null);
		gmlObject.setLod1MultiSurface(null);
		gmlObject.setLod2MultiSurface(null);
		gmlObject.setLod3MultiSurface(null);
		gmlObject.getDeprecatedProperties().setLod4MultiSurface(null);
		
202
203
204
205
206
207
208
209
210
211
212
		for (Opening o : openings) {
			o.unsetGmlGeometries();
		}
	}

	@Override
	public String toString() {
		return "BoundarySurface [type=" + type + ", id=" + getGmlId() + "]";
	}

	void anonymize() {
Matthias Betz's avatar
Matthias Betz committed
213
214
215
216
217
218
219
220
		gmlObject.setAppearances(null);
		gmlObject.setBoundedBy(null);
		gmlObject.setCreationDate(null);
		gmlObject.setDescription(null);
		gmlObject.setExternalReferences(null);
		gmlObject.setGeneralizesTo(null);
		gmlObject.setADEProperties(null);
		gmlObject.setGenericAttributes(null);
221
222
223
224
225
		setGmlId(GmlId.generateId());
		gmlObject.setId(getGmlId().getGmlString());
	}

	@Override
Matthias Betz's avatar
Matthias Betz committed
226
	public AbstractThematicSurface getGmlObject() {
227
228
229
230
231
232
233
234
235
236
237
238
239
		return gmlObject;
	}

	@Override
	public FeatureType getFeatureType() {
		return FeatureType.BOUNDARY_SURFACE;
	}

	public void addOpening(Opening opening) {
		openings.add(opening);
		opening.setPartOfSurface(this);
	}

240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
	@Override
	public void prepareForChecking() {
		super.prepareForChecking();
		for (Opening o : openings) {
			o.prepareForChecking();
		}
	}

	@Override
	public void clearMetaInformation() {
		super.clearMetaInformation();
		for (Opening o : openings) {
			o.clearMetaInformation();
		}
	}

Matthias Betz's avatar
Matthias Betz committed
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
	@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;
	}
	
283
}