/*- * 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.semantics; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Map; import java.util.Set; import de.hft.stuttgart.citydoctor2.check.Check; import de.hft.stuttgart.citydoctor2.check.CheckId; import de.hft.stuttgart.citydoctor2.check.CheckResult; import de.hft.stuttgart.citydoctor2.check.Requirement; import de.hft.stuttgart.citydoctor2.check.RequirementType; import de.hft.stuttgart.citydoctor2.checks.util.CollectionUtils; import de.hft.stuttgart.citydoctor2.checks.util.UnfragmentedCheck; import de.hft.stuttgart.citydoctor2.datastructure.BoundarySurface; import de.hft.stuttgart.citydoctor2.datastructure.BoundarySurfaceType; import de.hft.stuttgart.citydoctor2.parser.ParserConfiguration; /** * Checks whether all polygons in the same plane of a roof surface * * @author Matthias Betz * */ public class RoofSurfaceUnfragmentedCheck extends Check { private static final List dependencies; private static final String MAX_ANGLE_DEVIATION = "maxAngleDeviation"; private double maxAngleDeviation = Math.toRadians(1); static { ArrayList deps = new ArrayList<>(); deps.add(CheckId.C_GE_R_TOO_FEW_POINTS); deps.add(CheckId.C_GE_R_NOT_CLOSED); deps.add(CheckId.C_GE_R_DUPLICATE_POINT); deps.add(CheckId.C_GE_R_SELF_INTERSECTION); deps.add(CheckId.C_GE_P_NON_PLANAR); dependencies = Collections.unmodifiableList(deps); } @Override public void init(Map params, ParserConfiguration config) { String maxAngleString = params.get(MAX_ANGLE_DEVIATION); if (maxAngleString != null) { maxAngleDeviation = Math.toRadians(Double.parseDouble(maxAngleString)); } } @Override public void check(BoundarySurface bs) { // only use roof surfaces if (bs.getType() != BoundarySurfaceType.ROOF) { return; } // only use lod1 and lod2 polygons CheckResult cr = UnfragmentedCheck.checkForFragmentedBoundarySurfaces(this, bs, maxAngleDeviation); bs.addCheckResult(cr); } @Override public List getDependencies() { return dependencies; } @Override public Set appliesToRequirements() { return CollectionUtils.singletonSet(Requirement.R_SE_BS_ROOF_UNFRAGMENTED); } @Override public RequirementType getType() { return RequirementType.SEMANTIC; } @Override public Check createNewInstance() { return new RoofSurfaceUnfragmentedCheck(); } @Override public CheckId getCheckId() { return CheckId.C_SE_BS_ROOF_UNFRAGMENTED; } }