Commit 1da24add authored by Matthias Betz's avatar Matthias Betz
Browse files

Merge branch 'CheckEngineRework' into 'master'

Check engine rework

See merge request betzms/citydoctor2!4
parents 09470a4d cd494d75
Pipeline #2115 passed with stage
in 2 minutes and 53 seconds
/*-
* 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.checks.geometry;
import static org.junit.Assert.assertTrue;
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.Checker;
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;
import de.hft.stuttgart.quality.model.jaxb.RequirementId;
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);
ValidationConfiguration valConfig = ValidationConfiguration.loadStandardValidationConfig();
valConfig.setMinVertexDistanceInGlobalParameters(0.004);
Map<String, String> parameters = new HashMap<>();
parameters.put("degeneratedPolygonTolerance", "0.004");
valConfig.getRequirements().get(RequirementId.R_GE_P_NON_PLANAR.toString()).getParameters().putAll(parameters);
Checker c = new Checker(valConfig, model);
c.runChecks();
List<CheckError> errors = new ArrayList<>();
b.collectContainedErrors(errors);
assertTrue(errors.isEmpty());
}
}
......@@ -107,7 +107,7 @@ public class FaceOutCheckTest {
public void testGoodGeometry() {
Geometry geom = createGoodGeometry();
FaceOutCheck foc = new FaceOutCheck();
AllPolygonsWrongOrientationCheck foc = new AllPolygonsWrongOrientationCheck();
foc.check(geom);
Assert.assertEquals(ResultStatus.OK, geom.getCheckResult(foc).getResultStatus());
......@@ -117,7 +117,7 @@ public class FaceOutCheckTest {
public void testBadGeometry() {
Geometry geom = createBadGeometry();
FaceOutCheck foc = new FaceOutCheck();
AllPolygonsWrongOrientationCheck foc = new AllPolygonsWrongOrientationCheck();
foc.check(geom);
Assert.assertEquals(ResultStatus.ERROR, geom.getCheckResult(foc).getResultStatus());
......
......@@ -53,7 +53,7 @@ public class NumPointsCheckTest {
lr.addVertex(v2);
lr.addVertex(v0);
NumPointsCheck check = new NumPointsCheck();
TooFewPointsCheck check = new TooFewPointsCheck();
ParserConfiguration config = new ParserConfiguration(8, false);
check.init(Collections.emptyMap(), config);
check.check(lr);
......@@ -79,7 +79,7 @@ public class NumPointsCheckTest {
lr.addVertex(v3);
lr.addVertex(v0);
NumPointsCheck check = new NumPointsCheck();
TooFewPointsCheck check = new TooFewPointsCheck();
ParserConfiguration config = new ParserConfiguration(8, false);
check.init(Collections.emptyMap(), config);
check.check(lr);
......
......@@ -34,6 +34,7 @@ import de.hft.stuttgart.citydoctor2.datastructure.CityDoctorModel;
import de.hft.stuttgart.citydoctor2.datastructure.Geometry;
import de.hft.stuttgart.citydoctor2.parser.CityGmlParseException;
import de.hft.stuttgart.citydoctor2.parser.InvalidGmlFileException;
import de.hft.stuttgart.quality.model.jaxb.RequirementId;
/**
*
......@@ -52,10 +53,10 @@ public class NonManifoldEdgeSystemTest {
@Test
public void testNonManifoldEdge2() throws CityGmlParseException, IOException, InvalidGmlFileException {
Map<CheckId, Map<String, String>> paramMap = new HashMap<>();
Map<String, Map<String, String>> paramMap = new HashMap<>();
Map<String, String> parameter = new HashMap<>();
parameter.put("distanceTolerance", "0.1");
paramMap.put(CheckId.C_GE_P_NON_PLANAR, parameter);
paramMap.put(RequirementId.R_GE_P_NON_PLANAR.toString(), parameter);
CityDoctorModel c = TestUtil.loadAndCheckCityModel("src/test/resources/SimpleSolid_SrefBS-GE-gml-SO-0004-T0001.gml",
paramMap);
Geometry g = c.getBuildings().get(0).getGeometries().get(0);
......
......@@ -37,6 +37,7 @@ import de.hft.stuttgart.citydoctor2.parser.CityGmlParseException;
import de.hft.stuttgart.citydoctor2.parser.CityGmlParser;
import de.hft.stuttgart.citydoctor2.parser.InvalidGmlFileException;
import de.hft.stuttgart.citydoctor2.parser.ParserConfiguration;
import de.hft.stuttgart.quality.model.jaxb.RequirementId;
/**
*
......@@ -113,10 +114,10 @@ public class PlanarTest {
@Test
public void testPlanarPolygon4() throws CityGmlParseException, IOException, InvalidGmlFileException {
Map<CheckId, Map<String, String>> paramMap = new HashMap<>();
Map<String, Map<String, String>> paramMap = new HashMap<>();
Map<String, String> parameter = new HashMap<>();
parameter.put("distanceTolerance", "0.01");
paramMap.put(CheckId.C_GE_P_NON_PLANAR, parameter);
paramMap.put(RequirementId.R_GE_P_NON_PLANAR.toString(), parameter);
CityDoctorModel c = TestUtil.loadAndCheckCityModel("src/test/resources/SimpleSolid_SrefBS-GE-gml-PO-0002-T0001.gml", paramMap);
Polygon p = TestUtil.getPolygonById("_Simple_BD.1_PG.2", c);
CheckResult cr = p.getCheckResult(CheckId.C_GE_P_NON_PLANAR);
......@@ -126,11 +127,11 @@ public class PlanarTest {
@Test
public void testPlanarPolygon5() throws CityGmlParseException, IOException, InvalidGmlFileException {
Map<CheckId, Map<String, String>> paramMap = new HashMap<>();
Map<String, Map<String, String>> paramMap = new HashMap<>();
Map<String, String> parameter = new HashMap<>();
parameter.put("type", "distance");
parameter.put("distanceTolerance", "0.5");
paramMap.put(CheckId.C_GE_P_NON_PLANAR, parameter);
paramMap.put(RequirementId.R_GE_P_NON_PLANAR.toString(), parameter);
CityDoctorModel c = TestUtil.loadAndCheckCityModel("src/test/resources/SimpleSolid_SrefBS-GE-gml-PO-0002-T0001.gml", paramMap);
Polygon p = TestUtil.getPolygonById("_Simple_BD.1_PG.2", c);
CheckResult cr = p.getCheckResult(CheckId.C_GE_P_NON_PLANAR);
......@@ -139,10 +140,10 @@ public class PlanarTest {
@Test
public void testPlanarPolygon6() throws CityGmlParseException, IOException, InvalidGmlFileException {
Map<CheckId, Map<String, String>> paramMap = new HashMap<>();
Map<String, Map<String, String>> paramMap = new HashMap<>();
Map<String, String> parameter = new HashMap<>();
parameter.put("type", "both");
paramMap.put(CheckId.C_GE_P_NON_PLANAR, parameter);
paramMap.put(RequirementId.R_GE_P_NON_PLANAR.toString(), parameter);
CityDoctorModel c = TestUtil.loadAndCheckCityModel("src/test/resources/SimpleSolid_SrefBS-GE-gml-PO-0002-T0002.gml", paramMap);
Polygon p = TestUtil.getPolygonById("_Simple_BD.1_PG.1", c);
CheckResult cr = p.getCheckResult(CheckId.C_GE_P_NON_PLANAR);
......
......@@ -23,7 +23,6 @@ import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import de.hft.stuttgart.citydoctor2.check.CheckId;
import de.hft.stuttgart.citydoctor2.check.Checker;
import de.hft.stuttgart.citydoctor2.check.ValidationConfiguration;
import de.hft.stuttgart.citydoctor2.datastructure.CityDoctorModel;
......@@ -52,7 +51,7 @@ public class TestUtil {
public static CityDoctorModel loadAndCheckCityModel(String path, int numberOfRoundingPlaces)
throws CityGmlParseException, IOException, InvalidGmlFileException {
ValidationConfiguration config = ValidationConfiguration.loadStandardValidationConfig();
config.setNumberOfRoundingPlaces(numberOfRoundingPlaces);
config.setNumberOfRoundingPlacesInGlobalParameters(numberOfRoundingPlaces);
CityDoctorModel m = CityGmlParser.parseCityGmlFile(path, config.getParserConfiguration());
Checker c = new Checker(config, m);
c.runChecks();
......@@ -63,8 +62,8 @@ public class TestUtil {
public static CityDoctorModel loadAndCheckCityModel(String path, int numberOfRoundingPlaces, double minVertexDistance)
throws CityGmlParseException, IOException, InvalidGmlFileException {
ValidationConfiguration config = ValidationConfiguration.loadStandardValidationConfig();
config.setNumberOfRoundingPlaces(numberOfRoundingPlaces);
config.setMinVertexDistance(minVertexDistance);
config.setNumberOfRoundingPlacesInGlobalParameters(numberOfRoundingPlaces);
config.setMinVertexDistanceInGlobalParameters(minVertexDistance);
CityDoctorModel m = CityGmlParser.parseCityGmlFile(path, config.getParserConfiguration());
Checker c = new Checker(config, m);
c.runChecks();
......@@ -72,11 +71,11 @@ public class TestUtil {
}
public static CityDoctorModel loadAndCheckCityModel(String path, Map<CheckId, Map<String, String>> paramMap)
public static CityDoctorModel loadAndCheckCityModel(String path, Map<String, Map<String, String>> paramMap)
throws CityGmlParseException, IOException, InvalidGmlFileException {
ValidationConfiguration valConfig = ValidationConfiguration.loadStandardValidationConfig();
for (Entry<CheckId, Map<String, String>> e : paramMap.entrySet()) {
valConfig.getChecks().get(e.getKey()).setParameters(e.getValue());
for (Entry<String, Map<String, String>> e : paramMap.entrySet()) {
valConfig.getRequirements().get(e.getKey()).getParameters().putAll(e.getValue());
}
CityDoctorModel m = CityGmlParser.parseCityGmlFile(path, valConfig.getParserConfiguration());
Checker c = new Checker(valConfig, m);
......
numberOfRoundingPlaces: 8
globalParameters:
numberOfRoundingPlaces: 8
# in m
minVertexDistance: 0.0001
schematronFilePath: ''
useStreaming: false
xmlValidation: false
checks:
C_GE_R_TOO_FEW_POINTS:
requirements:
R_GE_R_TOO_FEW_POINTS:
enabled: true
C_GE_R_NOT_CLOSED:
R_GE_R_NOT_CLOSED:
enabled: true
C_GE_R_DUPLICATE_POINT:
R_GE_R_CONSECUTIVE_POINTS_SAME:
enabled: true
C_GE_R_SELF_INTERSECTION:
R_GE_R_SELF_INTERSECTION:
enabled: true
C_GE_S_MULTIPLE_CONNECTED_COMPONENTS:
R_GE_S_MULTIPLE_CONNECTED_COMPONENTS:
enabled: true
C_GE_P_INTERIOR_DISCONNECTED:
R_GE_P_INTERIOR_DISCONNECTED:
enabled: true
C_GE_P_INTERSECTING_RINGS:
R_GE_P_INTERSECTING_RINGS:
enabled: true
C_GE_P_NON_PLANAR:
R_GE_P_NON_PLANAR:
enabled: false
parameters:
# one of ("distance", "angle", "both")
type: distance
# in m
distanceTolerance: 0.01
angleTolerance: 0.1
C_GE_P_HOLE_OUTSIDE:
# in degree
angleTolerance: 1
# in m
degeneratedPolygonTolerance: 0
R_GE_P_HOLE_OUTSIDE:
enabled: true
C_GE_P_ORIENTATION_RINGS_SAME:
R_GE_P_ORIENTATION_RINGS_SAME:
enabled: true
C_GE_P_INNER_RINGS_NESTED:
R_GE_P_INNER_RINGS_NESTED:
enabled: true
C_GE_S_TOO_FEW_POLYGONS:
R_GE_S_TOO_FEW_POLYGONS:
enabled: true
C_GE_S_NOT_CLOSED:
R_GE_S_NOT_CLOSED:
enabled: true
C_GE_S_NON_MANIFOLD_EDGE:
R_GE_S_NON_MANIFOLD_EDGE:
enabled: true
C_GE_S_POLYGON_WRONG_ORIENTATION:
R_GE_S_POLYGON_WRONG_ORIENTATION:
enabled: true
C_GE_S_ALL_POLYGONS_WRONG_ORIENTATION:
R_GE_S_ALL_POLYGONS_WRONG_ORIENTATION:
enabled: true
C_GE_S_NON_MANIFOLD_VERTEX:
R_GE_S_NON_MANIFOLD_VERTEX:
enabled: true
C_GE_S_SELF_INTERSECTION:
R_GE_S_SELF_INTERSECTION:
enabled: true
\ No newline at end of file
numberOfRoundingPlaces: 8
globalParameters:
numberOfRoundingPlaces: 8
minVertexDistance: 0.0001
filter:
exclude:
# available types: BUILDING, VEGETATION, TRANSPORTATION, BRIDGE, LAND, WATER
......@@ -6,45 +8,47 @@ filter:
- BUILDING
# exlude matching ids (Regex)
ids:
checks:
C_GE_R_TOO_FEW_POINTS:
requirements:
R_GE_R_TOO_FEW_POINTS:
enabled: true
C_GE_R_NOT_CLOSED:
R_GE_R_NOT_CLOSED:
enabled: true
C_GE_R_DUPLICATE_POINT:
R_GE_R_CONSECUTIVE_POINTS_SAME:
enabled: true
C_GE_R_SELF_INTERSECTION:
R_GE_R_SELF_INTERSECTION:
enabled: true
C_GE_S_MULTIPLE_CONNECTED_COMPONENTS:
R_GE_S_MULTIPLE_CONNECTED_COMPONENTS:
enabled: true
C_GE_P_INTERIOR_DISCONNECTED:
R_GE_P_INTERIOR_DISCONNECTED:
enabled: true
C_GE_P_INTERSECTING_RINGS:
R_GE_P_INTERSECTING_RINGS:
enabled: true
C_GE_P_NON_PLANAR:
R_GE_P_NON_PLANAR:
enabled: false
parameters:
# one of ("distance", "angle", "both")
type: distance
# in m
distanceTolerance: 0.01
angleTolerance: 0.1
C_GE_P_HOLE_OUTSIDE:
# in degree
angleTolerance: 1
R_GE_P_HOLE_OUTSIDE:
enabled: true
C_GE_P_ORIENTATION_RINGS_SAME:
R_GE_P_ORIENTATION_RINGS_SAME:
enabled: true
C_GE_P_INNER_RINGS_NESTED:
R_GE_P_INNER_RINGS_NESTED:
enabled: true
C_GE_S_TOO_FEW_POLYGONS:
R_GE_S_TOO_FEW_POLYGONS:
enabled: true
C_GE_S_NOT_CLOSED:
R_GE_S_NOT_CLOSED:
enabled: true
C_GE_S_NON_MANIFOLD_EDGE:
R_GE_S_NON_MANIFOLD_EDGE:
enabled: true
C_GE_S_POLYGON_WRONG_ORIENTATION:
R_GE_S_POLYGON_WRONG_ORIENTATION:
enabled: true
C_GE_S_ALL_POLYGONS_WRONG_ORIENTATION:
R_GE_S_ALL_POLYGONS_WRONG_ORIENTATION:
enabled: true
C_GE_S_NON_MANIFOLD_VERTEX:
R_GE_S_NON_MANIFOLD_VERTEX:
enabled: true
C_GE_S_SELF_INTERSECTION:
R_GE_S_SELF_INTERSECTION:
enabled: true
\ No newline at end of file
numberOfRoundingPlaces: 8
globalParameters:
numberOfRoundingPlaces: 8
# in m
minVertexDistance: 0.0001
filter:
include:
# available types: BUILDING, VEGETATION, TRANSPORTATION, BRIDGE, LAND, WATER
......@@ -27,45 +30,47 @@ filter:
- UUID-8972-kghf-asgv
- UUID-567-asdf-GEGH
- UUID.*
checks:
C_GE_R_TOO_FEW_POINTS:
requirements:
R_GE_R_TOO_FEW_POINTS:
enabled: true
C_GE_R_NOT_CLOSED:
R_GE_R_NOT_CLOSED:
enabled: true
C_GE_R_DUPLICATE_POINT:
R_GE_R_CONSECUTIVE_POINTS_SAME:
enabled: true
C_GE_R_SELF_INTERSECTION:
R_GE_R_SELF_INTERSECTION:
enabled: true
C_GE_S_MULTIPLE_CONNECTED_COMPONENTS:
R_GE_S_MULTIPLE_CONNECTED_COMPONENTS:
enabled: true
C_GE_P_INTERIOR_DISCONNECTED:
R_GE_P_INTERIOR_DISCONNECTED:
enabled: true
C_GE_P_INTERSECTING_RINGS:
R_GE_P_INTERSECTING_RINGS:
enabled: true
C_GE_P_NON_PLANAR:
R_GE_P_NON_PLANAR:
enabled: false
parameters:
# one of ("distance", "angle", "both")
type: distance
# in m
distanceTolerance: 0.01
angleTolerance: 0.1
C_GE_P_HOLE_OUTSIDE:
# in degree
angleTolerance: 1
R_GE_P_HOLE_OUTSIDE:
enabled: true
C_GE_P_ORIENTATION_RINGS_SAME:
R_GE_P_ORIENTATION_RINGS_SAME:
enabled: true
C_GE_P_INNER_RINGS_NESTED:
R_GE_P_INNER_RINGS_NESTED:
enabled: true
C_GE_S_TOO_FEW_POLYGONS:
R_GE_S_TOO_FEW_POLYGONS:
enabled: true
C_GE_S_NOT_CLOSED:
R_GE_S_NOT_CLOSED:
enabled: true
C_GE_S_NON_MANIFOLD_EDGE:
R_GE_S_NON_MANIFOLD_EDGE:
enabled: true
C_GE_S_POLYGON_WRONG_ORIENTATION:
R_GE_S_POLYGON_WRONG_ORIENTATION:
enabled: true
C_GE_S_ALL_POLYGONS_WRONG_ORIENTATION:
R_GE_S_ALL_POLYGONS_WRONG_ORIENTATION:
enabled: true
C_GE_S_NON_MANIFOLD_VERTEX:
R_GE_S_NON_MANIFOLD_VERTEX:
enabled: true
C_GE_S_SELF_INTERSECTION:
R_GE_S_SELF_INTERSECTION:
enabled: true
\ No newline at end of file
numberOfRoundingPlaces: 8
globalParameters:
numberOfRoundingPlaces: 8
filter:
include:
# available types: BUILDING, VEGETATION, TRANSPORTATION, BRIDGE, LAND, WATER
types:
- TRANSPORTATION
checks:
C_GE_R_TOO_FEW_POINTS:
requirements:
R_GE_R_TOO_FEW_POINTS:
enabled: true
C_GE_R_NOT_CLOSED:
R_GE_R_NOT_CLOSED:
enabled: true
C_GE_R_DUPLICATE_POINT:
R_GE_R_CONSECUTIVE_POINTS_SAME:
enabled: true
C_GE_R_SELF_INTERSECTION:
R_GE_R_SELF_INTERSECTION:
enabled: true
C_GE_S_MULTIPLE_CONNECTED_COMPONENTS:
R_GE_S_MULTIPLE_CONNECTED_COMPONENTS:
enabled: true
C_GE_P_INTERIOR_DISCONNECTED:
R_GE_P_INTERIOR_DISCONNECTED:
enabled: true
C_GE_P_INTERSECTING_RINGS:
R_GE_P_INTERSECTING_RINGS:
enabled: true
C_GE_P_NON_PLANAR:
R_GE_P_NON_PLANAR:
enabled: false
parameters:
# one of ("distance", "angle", "both")
type: distance
distanceTolerance: 0.01
angleTolerance: 0.1
C_GE_P_HOLE_OUTSIDE:
R_GE_P_HOLE_OUTSIDE:
enabled: true
C_GE_P_ORIENTATION_RINGS_SAME:
R_GE_P_ORIENTATION_RINGS_SAME:
enabled: true
C_GE_P_INNER_RINGS_NESTED:
R_GE_P_INNER_RINGS_NESTED:
enabled: true
C_GE_S_TOO_FEW_POLYGONS:
R_GE_S_TOO_FEW_POLYGONS:
enabled: true
C_GE_S_NOT_CLOSED:
R_GE_S_NOT_CLOSED:
enabled: true
C_GE_S_NON_MANIFOLD_EDGE:
R_GE_S_NON_MANIFOLD_EDGE:
enabled: true
C_GE_S_POLYGON_WRONG_ORIENTATION:
R_GE_S_POLYGON_WRONG_ORIENTATION:
enabled: true
C_GE_S_ALL_POLYGONS_WRONG_ORIENTATION:
R_GE_S_ALL_POLYGONS_WRONG_ORIENTATION:
enabled: true
C_GE_S_NON_MANIFOLD_VERTEX:
R_GE_S_NON_MANIFOLD_VERTEX:
enabled: true
C_GE_S_SELF_INTERSECTION:
R_GE_S_SELF_INTERSECTION:
enabled: true
\ No newline at end of file
numberOfRoundingPlaces: 8
globalParameters:
numberOfRoundingPlaces: 8
schematronFilePath: src/test/resources/schematronTest.xml
useStreaming: true
schematronFilePath: src/test/resources/schematronTest.xml
checks:
C_GE_R_TOO_FEW_POINTS:
requirements:
R_GE_R_TOO_FEW_POINTS:
enabled: true
C_GE_R_NOT_CLOSED:
R_GE_R_NOT_CLOSED:
enabled: true
C_GE_R_DUPLICATE_POINT:
R_GE_R_CONSECUTIVE_POINTS_SAME:
enabled: true
C_GE_R_SELF_INTERSECTION:
R_GE_R_SELF_INTERSECTION:
enabled: true
C_GE_S_MULTIPLE_CONNECTED_COMPONENTS:
R_GE_S_MULTIPLE_CONNECTED_COMPONENTS:
enabled: true
C_GE_P_INTERIOR_DISCONNECTED:
R_GE_P_INTERIOR_DISCONNECTED:
enabled: true
C_GE_P_INTERSECTING_RINGS:
R_GE_P_INTERSECTING_RINGS:
enabled: true
C_GE_P_NON_PLANAR:
R_GE_P_NON_PLANAR:
enabled: false
parameters:
# one of ("distance", "angle", "both")
type: distance
distanceTolerance: 0.01
angleTolerance: 0.1
C_GE_P_HOLE_OUTSIDE:
R_GE_P_HOLE_OUTSIDE:
enabled: true
C_GE_P_ORIENTATION_RINGS_SAME:
R_GE_P_ORIENTATION_RINGS_SAME:
enabled: true
C_GE_P_INNER_RINGS_NESTED:
R_GE_P_INNER_RINGS_NESTED:
enabled: true
C_GE_S_TOO_FEW_POLYGONS:
R_GE_S_TOO_FEW_POLYGONS:
enabled: true
C_GE_S_NOT_CLOSED:
R_GE_S_NOT_CLOSED:
enabled: true
C_GE_S_NON_MANIFOLD_EDGE:
R_GE_S_NON_MANIFOLD_EDGE:
enabled: true
C_GE_S_POLYGON_WRONG_ORIENTATION:
R_GE_S_POLYGON_WRONG_ORIENTATION:
enabled: true
C_GE_S_ALL_POLYGONS_WRONG_ORIENTATION:
R_GE_S_ALL_POLYGONS_WRONG_ORIENTATION:
enabled: true
C_GE_S_NON_MANIFOLD_VERTEX:
R_GE_S_NON_MANIFOLD_VERTEX:
enabled: true
C_GE_S_SELF_INTERSECTION:
R_GE_S_SELF_INTERSECTION:
enabled: true
\ No newline at end of file
Markdown is supported
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