/*- * 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.checks.geometry; import static org.junit.Assert.assertEquals; import java.io.File; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.junit.Test; import de.hft.stuttgart.citydoctor2.check.CheckError; import de.hft.stuttgart.citydoctor2.check.CheckId; import de.hft.stuttgart.citydoctor2.check.Checker; import de.hft.stuttgart.citydoctor2.check.ErrorId; 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.datastructure.ConcretePolygon; import de.hft.stuttgart.citydoctor2.datastructure.Geometry; import de.hft.stuttgart.citydoctor2.datastructure.GeometryType; import de.hft.stuttgart.citydoctor2.datastructure.LinearRing; import de.hft.stuttgart.citydoctor2.datastructure.LinearRing.LinearRingType; import de.hft.stuttgart.citydoctor2.datastructure.Lod; import de.hft.stuttgart.citydoctor2.datastructure.Vertex; import de.hft.stuttgart.citydoctor2.parser.ParserConfiguration; public class DegeneratedPolygonCheckTest { @Test public void testDegeneratedPolygon() { Geometry geom = new Geometry(GeometryType.MULTI_SURFACE, Lod.LOD1); ConcretePolygon polygon = new ConcretePolygon(); geom.getPolygons().add(polygon); polygon.setParent(geom); LinearRing lr = new LinearRing(LinearRingType.EXTERIOR); polygon.setExteriorRing(lr); Vertex v1 = new Vertex(427583.301, 6003502.571, 9.711); lr.getVertices().add(v1); Vertex v2 = new Vertex(427583.304, 6003502.574, 9.713); lr.getVertices().add(v2); Vertex v3 = new Vertex(427583.304, 6003502.574, 4.097); lr.getVertices().add(v3); Vertex v4 = new Vertex(427583.301, 6003502.571, 4.097); lr.getVertices().add(v4); lr.getVertices().add(v1); geom.updateEdgesAndVertices(); Building b = new Building(); b.addGeometry(geom); ParserConfiguration config = new ParserConfiguration(8, false); CityDoctorModel model = new CityDoctorModel(config, new File("")); model.addBuilding(b); // model // Edge [from=Vertex [x=427583.301, y=6003502.571, z=9.711], to=Vertex [x=427583.304, y=6003502.574, z=9.713]], // Edge [from=Vertex [x=427583.304, y=6003502.574, z=9.713], to=Vertex [x=427583.304, y=6003502.574, z=4.097]], // Edge [from=Vertex [x=427583.304, y=6003502.574, z=4.097], to=Vertex [x=427583.301, y=6003502.571, z=4.097]], // Edge [from=Vertex [x=427583.301, y=6003502.571, z=4.097], to=Vertex [x=427583.301, y=6003502.571, z=9.711]]] // test // Edge [from=Vertex [x=427583.301, y=6003502.571, z=9.711], to=Vertex [x=427583.304, y=6003502.574, z=9.713]], // Edge [from=Vertex [x=427583.304, y=6003502.574, z=9.713], to=Vertex [x=427583.304, y=6003502.574, z=4.097]], // Edge [from=Vertex [x=427583.304, y=6003502.574, z=4.097], to=Vertex [x=427583.301, y=6003502.571, z=4.097]], // Edge [from=Vertex [x=427583.301, y=6003502.571, z=4.097], to=Vertex [x=427583.301, y=6003502.571, z=9.711]]] // Segment3d [pointA=Vertex [x=427583.301, y=6003502.571, z=9.711], pointB=Vertex [x=427583.304, y=6003502.574, z=9.713]] // Vertex [x=427583.301, y=6003502.571, z=9.711] ValidationConfiguration valConfig = ValidationConfiguration.loadStandardValidationConfig(); Map parameters = new HashMap<>(); parameters.put("degeneratedPolygonTolerance", "0.0001"); valConfig.getChecks().get(CheckId.C_GE_P_NON_PLANAR).setParameters(parameters); Checker c = new Checker(valConfig, model); c.runChecks(); List errors = new ArrayList<>(); b.collectContainedErrors(errors); CheckError checkError = errors.get(0); assertEquals(ErrorId.GE_P_DEGENERATED_POLYGON, checkError.getErrorId()); } }