Commit 197b48b3 authored by Luna Riegel's avatar Luna Riegel
Browse files

Fix: Fix bug reported in #122

parent 7f0c003c
...@@ -44,8 +44,9 @@ public class ConcretePolygon extends Polygon { ...@@ -44,8 +44,9 @@ public class ConcretePolygon extends Polygon {
private LinearRing exterior; private LinearRing exterior;
private List<LinearRing> innerRings; private List<LinearRing> innerRings;
private BoundarySurface partOfSurface; private BoundarySurface partOfSurface = null;
private Installation partfOfInstallation; private Installation partfOfInstallation = null;
private AbstractFurniture partOfFurniture = null;
private CompositeCollection partOfComposite = null; private CompositeCollection partOfComposite = null;
private PatchCollection partOfPatch = null; private PatchCollection partOfPatch = null;
private Geometry parent; private Geometry parent;
...@@ -286,6 +287,16 @@ public class ConcretePolygon extends Polygon { ...@@ -286,6 +287,16 @@ public class ConcretePolygon extends Polygon {
return partfOfInstallation; return partfOfInstallation;
} }
@Override
public void setPartOfFurniture(AbstractFurniture furn) {
this.partOfFurniture = furn;
}
@Override
public AbstractFurniture getPartOfFurniture() {
return partOfFurniture;
}
/* /*
* (non-Javadoc) * (non-Javadoc)
* *
......
...@@ -260,6 +260,17 @@ public class LinkedPolygon extends Polygon { ...@@ -260,6 +260,17 @@ public class LinkedPolygon extends Polygon {
return poly.getPartOfInstallation(); return poly.getPartOfInstallation();
} }
@Override
public void setPartOfFurniture(AbstractFurniture furn) {
poly.setPartOfFurniture(furn);
}
@Override
public AbstractFurniture getPartOfFurniture() {
return poly.getPartOfFurniture();
}
@Override @Override
public boolean hasPointAsCorner(Vertex v) { public boolean hasPointAsCorner(Vertex v) {
return poly.hasPointAsCorner(v); return poly.hasPointAsCorner(v);
......
...@@ -67,6 +67,10 @@ public abstract class Polygon extends GmlElement { ...@@ -67,6 +67,10 @@ public abstract class Polygon extends GmlElement {
public abstract Installation getPartOfInstallation(); public abstract Installation getPartOfInstallation();
public abstract void setPartOfFurniture(AbstractFurniture furn);
public abstract AbstractFurniture getPartOfFurniture();
public abstract boolean hasPointAsCorner(Vertex v); public abstract boolean hasPointAsCorner(Vertex v);
public abstract void removeRings(); public abstract void removeRings();
......
...@@ -593,6 +593,19 @@ public class Citygml3FeatureMapper extends ObjectWalker { ...@@ -593,6 +593,19 @@ public class Citygml3FeatureMapper extends ObjectWalker {
parseAndAddAbstractGeometry(dProp.getLod3Geometry(), Lod.LOD3, cdBridgeInst, Orientation.OUTWARD); parseAndAddAbstractGeometry(dProp.getLod3Geometry(), Lod.LOD3, cdBridgeInst, Orientation.OUTWARD);
parseAndAddAbstractGeometry(dProp.getLod4Geometry(), Lod.LOD4, cdBridgeInst, Orientation.OUTWARD); parseAndAddAbstractGeometry(dProp.getLod4Geometry(), Lod.LOD4, cdBridgeInst, Orientation.OUTWARD);
for (BoundarySurface bs : cdBridgeInst.getBoundarySurfaces()) {
for (Geometry geom : bs.getGeometries()) {
for (Polygon p : geom.getPolygons()) {
p.setPartOfInstallation(cdBridgeInst);
}
}
}
for (Geometry geom : cdBridgeInst.getGeometries()) {
for (Polygon p : geom.getPolygons()) {
p.setPartOfInstallation(cdBridgeInst);
}
}
return cdBridgeInst; return cdBridgeInst;
} }
...@@ -621,6 +634,18 @@ public class Citygml3FeatureMapper extends ObjectWalker { ...@@ -621,6 +634,18 @@ public class Citygml3FeatureMapper extends ObjectWalker {
var dProp = bridgeFurn.getDeprecatedProperties(); var dProp = bridgeFurn.getDeprecatedProperties();
parseAndAddAbstractGeometry(dProp.getLod4Geometry(), Lod.LOD4, cdFurn, Orientation.OUTWARD); parseAndAddAbstractGeometry(dProp.getLod4Geometry(), Lod.LOD4, cdFurn, Orientation.OUTWARD);
for (BoundarySurface bs: cdFurn.getBoundarySurfaces()) {
for (Geometry geom: bs.getGeometries()){
for (Polygon poly: geom.getPolygons()){
poly.setPartOfFurniture(cdFurn);
}
}
}
for (Geometry geom : cdFurn.getGeometries()){
for(Polygon poly : geom.getPolygons()){
poly.setPartOfFurniture(cdFurn);
}
}
return cdFurn; return cdFurn;
} }
...@@ -733,6 +758,19 @@ public class Citygml3FeatureMapper extends ObjectWalker { ...@@ -733,6 +758,19 @@ public class Citygml3FeatureMapper extends ObjectWalker {
parseAndAddAbstractGeometry(dProp.getLod3Geometry(), Lod.LOD3, cdTunnelInst, Orientation.OUTWARD); parseAndAddAbstractGeometry(dProp.getLod3Geometry(), Lod.LOD3, cdTunnelInst, Orientation.OUTWARD);
parseAndAddAbstractGeometry(dProp.getLod4Geometry(), Lod.LOD4, cdTunnelInst, Orientation.OUTWARD); parseAndAddAbstractGeometry(dProp.getLod4Geometry(), Lod.LOD4, cdTunnelInst, Orientation.OUTWARD);
for (BoundarySurface bs : cdTunnelInst.getBoundarySurfaces()) {
for (Geometry geom : bs.getGeometries()) {
for (Polygon p : geom.getPolygons()) {
p.setPartOfInstallation(cdTunnelInst);
}
}
}
for (Geometry geom : cdTunnelInst.getGeometries()) {
for (Polygon p : geom.getPolygons()) {
p.setPartOfInstallation(cdTunnelInst);
}
}
return cdTunnelInst; return cdTunnelInst;
} }
...@@ -762,6 +800,20 @@ public class Citygml3FeatureMapper extends ObjectWalker { ...@@ -762,6 +800,20 @@ public class Citygml3FeatureMapper extends ObjectWalker {
var dProp = tunnelFurn.getDeprecatedProperties(); var dProp = tunnelFurn.getDeprecatedProperties();
parseAndAddAbstractGeometry(dProp.getLod4Geometry(), Lod.LOD4, cdTunnelFurn, Orientation.OUTWARD); parseAndAddAbstractGeometry(dProp.getLod4Geometry(), Lod.LOD4, cdTunnelFurn, Orientation.OUTWARD);
for (BoundarySurface bs: cdTunnelFurn.getBoundarySurfaces()) {
for (Geometry geom: bs.getGeometries()){
for (Polygon poly: geom.getPolygons()){
poly.setPartOfFurniture(cdTunnelFurn);
}
}
}
for (Geometry geom : cdTunnelFurn.getGeometries()){
for(Polygon poly : geom.getPolygons()){
poly.setPartOfFurniture(cdTunnelFurn);
}
}
return cdTunnelFurn; return cdTunnelFurn;
} }
...@@ -1353,6 +1405,18 @@ public class Citygml3FeatureMapper extends ObjectWalker { ...@@ -1353,6 +1405,18 @@ public class Citygml3FeatureMapper extends ObjectWalker {
var dProp = buildingFurn.getDeprecatedProperties(); var dProp = buildingFurn.getDeprecatedProperties();
parseAndAddAbstractGeometry(dProp.getLod4Geometry(), Lod.LOD4, cdFurn, Orientation.OUTWARD); parseAndAddAbstractGeometry(dProp.getLod4Geometry(), Lod.LOD4, cdFurn, Orientation.OUTWARD);
for (BoundarySurface bs: cdFurn.getBoundarySurfaces()) {
for (Geometry geom: bs.getGeometries()){
for (Polygon poly: geom.getPolygons()){
poly.setPartOfFurniture(cdFurn);
}
}
}
for (Geometry geom : cdFurn.getGeometries()){
for(Polygon poly : geom.getPolygons()){
poly.setPartOfFurniture(cdFurn);
}
}
return cdFurn; return cdFurn;
} }
...@@ -1459,12 +1523,6 @@ public class Citygml3FeatureMapper extends ObjectWalker { ...@@ -1459,12 +1523,6 @@ public class Citygml3FeatureMapper extends ObjectWalker {
parseAndAddAbstractGeometry(dProp.getLod3Geometry(), Lod.LOD3, cdInst, Orientation.OUTWARD); parseAndAddAbstractGeometry(dProp.getLod3Geometry(), Lod.LOD3, cdInst, Orientation.OUTWARD);
parseAndAddAbstractGeometry(dProp.getLod4Geometry(), Lod.LOD4, cdInst, Orientation.OUTWARD); parseAndAddAbstractGeometry(dProp.getLod4Geometry(), Lod.LOD4, cdInst, Orientation.OUTWARD);
return cdInst;
}
private void mapAbstractInstallation(AbstractInstallation abstractInst, Installation cdInst) {
mapAbstractOccupiedSpace(abstractInst, cdInst, Orientation.OUTWARD);
mapBoundedSpace(abstractInst, cdInst);
for (BoundarySurface bs : cdInst.getBoundarySurfaces()) { for (BoundarySurface bs : cdInst.getBoundarySurfaces()) {
for (Geometry geom : bs.getGeometries()) { for (Geometry geom : bs.getGeometries()) {
for (Polygon p : geom.getPolygons()) { for (Polygon p : geom.getPolygons()) {
...@@ -1477,6 +1535,13 @@ public class Citygml3FeatureMapper extends ObjectWalker { ...@@ -1477,6 +1535,13 @@ public class Citygml3FeatureMapper extends ObjectWalker {
p.setPartOfInstallation(cdInst); p.setPartOfInstallation(cdInst);
} }
} }
return cdInst;
}
private void mapAbstractInstallation(AbstractInstallation abstractInst, Installation cdInst) {
mapAbstractOccupiedSpace(abstractInst, cdInst, Orientation.OUTWARD);
mapBoundedSpace(abstractInst, cdInst);
} }
private void parseAndAddAbstractGeometry(GeometryProperty<?> geomProp, Lod lod, CityObject co, Orientation orientation) { private void parseAndAddAbstractGeometry(GeometryProperty<?> geomProp, Lod lod, CityObject co, Orientation orientation) {
......
...@@ -18,6 +18,7 @@ ...@@ -18,6 +18,7 @@
*/ */
package de.hft.stuttgart.citydoctor2.mapper.citygml3; package de.hft.stuttgart.citydoctor2.mapper.citygml3;
import de.hft.stuttgart.citydoctor2.check.CheckableUtilsVisitor;
import de.hft.stuttgart.citydoctor2.datastructure.*; import de.hft.stuttgart.citydoctor2.datastructure.*;
import de.hft.stuttgart.citydoctor2.parser.ParserConfiguration; import de.hft.stuttgart.citydoctor2.parser.ParserConfiguration;
import org.citygml4j.core.model.construction.*; import org.citygml4j.core.model.construction.*;
...@@ -85,6 +86,11 @@ public class SurfaceMapper extends ObjectWalker { ...@@ -85,6 +86,11 @@ public class SurfaceMapper extends ObjectWalker {
parseAndAddMultiSurface(afs.getLod2MultiSurface(), Lod.LOD2, o); parseAndAddMultiSurface(afs.getLod2MultiSurface(), Lod.LOD2, o);
parseAndAddMultiSurface(afs.getLod3MultiSurface(), Lod.LOD3, o); parseAndAddMultiSurface(afs.getLod3MultiSurface(), Lod.LOD3, o);
parseAndAddMultiSurface(afs.getDeprecatedProperties().getLod4MultiSurface(), Lod.LOD4, o); parseAndAddMultiSurface(afs.getDeprecatedProperties().getLod4MultiSurface(), Lod.LOD4, o);
for (Geometry geom : o.getGeometries()) {
for (Polygon p : geom.getPolygons()) {
p.setPartOfSurface(cdSurface);
}
}
o.unsetGmlGeometries(); o.unsetGmlGeometries();
} }
......
...@@ -21,7 +21,7 @@ public class PolygonWithoutSurfaceCheck extends Check { ...@@ -21,7 +21,7 @@ public class PolygonWithoutSurfaceCheck extends Check {
if (lod == Lod.LOD2 || lod == Lod.LOD3 || lod == Lod.LOD4) { if (lod == Lod.LOD2 || lod == Lod.LOD3 || lod == Lod.LOD4) {
// only check LOD2-4 // only check LOD2-4
CheckResult cr; CheckResult cr;
if (poly.getPartOfSurface() == null) { if (poly.getPartOfSurface() == null && poly.getPartOfInstallation() == null && poly.getPartOfFurniture() == null) {
PolygonWithoutSurfaceError err = new PolygonWithoutSurfaceError(poly); PolygonWithoutSurfaceError err = new PolygonWithoutSurfaceError(poly);
cr = new CheckResult(this, ResultStatus.ERROR, err); cr = new CheckResult(this, ResultStatus.ERROR, err);
} else { } else {
......
...@@ -5,7 +5,14 @@ import static org.junit.Assert.assertNotNull; ...@@ -5,7 +5,14 @@ import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull; import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertSame; import static org.junit.Assert.assertSame;
import static org.junit.Assert.assertTrue; import static org.junit.Assert.assertTrue;
import static org.junit.jupiter.api.Assertions.assertFalse;
import de.hft.stuttgart.citydoctor2.check.ValidationConfiguration;
import de.hft.stuttgart.citydoctor2.datastructure.Building;
import de.hft.stuttgart.citydoctor2.datastructure.CityDoctorModel;
import de.hft.stuttgart.citydoctor2.parser.CityGmlParseException;
import de.hft.stuttgart.citydoctor2.parser.CityGmlParser;
import de.hft.stuttgart.citydoctor2.parser.InvalidGmlFileException;
import org.junit.Test; import org.junit.Test;
import de.hft.stuttgart.citydoctor2.check.CheckError; import de.hft.stuttgart.citydoctor2.check.CheckError;
...@@ -73,4 +80,16 @@ public class PolygonWithoutSurfaceCheckTest { ...@@ -73,4 +80,16 @@ public class PolygonWithoutSurfaceCheckTest {
assertNull(checkResult); assertNull(checkResult);
} }
@Test
public void testFZKModel() throws CityGmlParseException, InvalidGmlFileException {
ValidationConfiguration config = ValidationConfiguration.loadStandardValidationConfig();
config.setSchematronFilePathInGlobalParameters(null);
CityDoctorModel m = CityGmlParser.parseCityGmlFile("src/test/resources/FZK_haus.gml", config.getParserConfiguration());
Building fzk = m.getBuildings().toList().get(0);
PolygonWithoutSurfaceCheck check = new PolygonWithoutSurfaceCheck();
fzk.accept(check);
assertFalse(fzk.containsError(CheckId.C_SE_POLYGON_WITHOUT_SURFACE));
}
} }
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