/*- * 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 java.util.ArrayList; import java.util.Collections; import java.util.List; 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.check.CheckResult; import de.hft.stuttgart.citydoctor2.check.CheckType; import de.hft.stuttgart.citydoctor2.check.Checkable; import de.hft.stuttgart.citydoctor2.check.ResultStatus; import de.hft.stuttgart.citydoctor2.check.error.NonManifoldEdgeError; import de.hft.stuttgart.citydoctor2.datastructure.Edge; import de.hft.stuttgart.citydoctor2.datastructure.Geometry; import de.hft.stuttgart.citydoctor2.datastructure.GeometryType; /** * This class detects half edges with more than two neighbors, i.e. * non-2-manifold geometries * * @author dwagner, alam */ public class NonManifoldEdgeCheck extends Check { private static final List dependencies; private static final List> applicableToClasses; 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_INTERIOR_DISCONNECTED); deps.add(CheckId.C_GE_P_INTERSECTING_RINGS); deps.add(CheckId.C_GE_P_NON_PLANAR); deps.add(CheckId.C_GE_S_TOO_FEW_POLYGONS); dependencies = Collections.unmodifiableList(deps); ArrayList> classes = new ArrayList<>(); classes.add(Geometry.class); applicableToClasses = Collections.unmodifiableList(classes); } public NonManifoldEdgeCheck() { super(CheckId.C_GE_S_NON_MANIFOLD_EDGE); } @Override public void check(Geometry g) { // only check solids if (g.getType() != GeometryType.SOLID) { return; } List errorEdges = new ArrayList<>(); for (Edge edge : g.getEdges()) { if (edge.getNumberOfAllHalfEdges() > 2) { errorEdges.add(edge); } } CheckResult cr; if (errorEdges.isEmpty()) { cr = new CheckResult(this, ResultStatus.OK, null); } else { CheckError err = new NonManifoldEdgeError(g, errorEdges); cr = new CheckResult(this, ResultStatus.ERROR, err); } g.addCheckResult(cr); } @Override public List getDependencies() { return dependencies; } @Override public List> getApplicableToClasses() { return applicableToClasses; } @Override public CheckType getType() { return CheckType.GEOMETRY; } @Override public Check createNewInstance() { return new NonManifoldEdgeCheck(); } }