Commit 5c91d943 authored by Luna Riegel's avatar Luna Riegel
Browse files

Merge branch 'refs/heads/dev' into dev_topo_checks

parents c24b7869 bd40b396
...@@ -23,6 +23,7 @@ import java.io.FileNotFoundException; ...@@ -23,6 +23,7 @@ import java.io.FileNotFoundException;
import java.io.IOException; import java.io.IOException;
import java.util.List; import java.util.List;
import de.hft.stuttgart.citydoctor2.database.DatabaseSettings;
import de.hft.stuttgart.citydoctor2.utils.Localization; import de.hft.stuttgart.citydoctor2.utils.Localization;
import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Logger;
...@@ -70,6 +71,8 @@ public class CityDoctorValidation { ...@@ -70,6 +71,8 @@ public class CityDoctorValidation {
String xmlOutput = getXmlOutput(argParser); String xmlOutput = getXmlOutput(argParser);
String pdfOutput = getPdfOutput(argParser); String pdfOutput = getPdfOutput(argParser);
String outputFile = getOutputFile(argParser, true); String outputFile = getOutputFile(argParser, true);
lookForDbConfigFileParameter(argParser);
lookForDbLocationParameter(argParser);
ValidationConfiguration config = getValidationConfig(argParser); ValidationConfiguration config = getValidationConfig(argParser);
startValidationProcess(inputFile, xmlOutput, pdfOutput, config, outputFile); startValidationProcess(inputFile, xmlOutput, pdfOutput, config, outputFile);
...@@ -81,18 +84,42 @@ public class CityDoctorValidation { ...@@ -81,18 +84,42 @@ public class CityDoctorValidation {
if (optional) { if (optional) {
return null; return null;
} }
logger.error(Localization.getText("CityDoctorValidation.noOutputFile")); logger.fatal(Localization.getText("CityDoctorValidation.noOutputFile"));
System.exit(11); System.exit(11);
} }
List<String> outFiles = argParser.getValues("out"); List<String> outFiles = argParser.getValues("out");
if (outFiles.size() != 1) { if (outFiles.size() != 1) {
logger.error(Localization.getText("CityDoctorValidation.notExactlyOneOutputFile")); logger.fatal(Localization.getText("CityDoctorValidation.notExactlyOneOutputFile"));
System.exit(12); System.exit(12);
} }
outputFile = outFiles.get(0); outputFile = outFiles.get(0);
return outputFile; return outputFile;
} }
public static void lookForDbConfigFileParameter(ArgumentParser argParser) {
if (!argParser.containsOption("db_config")) {
return;
}
List<String> dbConfigFiles = argParser.getValues("db_config");
if (dbConfigFiles.size() == 1) {
DatabaseSettings.loadPropertiesFromFile(new File(dbConfigFiles.get(0)));
} else if (dbConfigFiles.size() > 1) {
logger.warn("More than one DB config file provided! Using standard config instead.");
}
}
public static void lookForDbLocationParameter(ArgumentParser argParser) {
if (!argParser.containsOption("db_location")) {
return;
}
List<String> dbLocations = argParser.getValues("db_location");
if (dbLocations.size() == 1) {
DatabaseSettings.setDBLocation(dbLocations.get(0));
} else if (dbLocations.size() > 1) {
logger.warn("More than one DB location provided! Using standard location instead.");
}
}
/** /**
* Validates the cityGML input file with a standard validation configuration. * Validates the cityGML input file with a standard validation configuration.
* *
...@@ -202,7 +229,7 @@ public class CityDoctorValidation { ...@@ -202,7 +229,7 @@ public class CityDoctorValidation {
if (argParser.containsOption("pdfreport")) { if (argParser.containsOption("pdfreport")) {
List<String> reportFiles = argParser.getValues("pdfreport"); List<String> reportFiles = argParser.getValues("pdfreport");
if (reportFiles.size() != 1) { if (reportFiles.size() != 1) {
logger.error(Localization.getText("CityDoctorValidation.notExactlyOnePDFOutput")); logger.fatal(Localization.getText("CityDoctorValidation.notExactlyOnePDFOutput"));
System.exit(6); System.exit(6);
} }
return reportFiles.get(0); return reportFiles.get(0);
...@@ -214,7 +241,7 @@ public class CityDoctorValidation { ...@@ -214,7 +241,7 @@ public class CityDoctorValidation {
if (argParser.containsOption("xmlreport")) { if (argParser.containsOption("xmlreport")) {
List<String> reportFiles = argParser.getValues("xmlreport"); List<String> reportFiles = argParser.getValues("xmlreport");
if (reportFiles.size() != 1) { if (reportFiles.size() != 1) {
logger.error(Localization.getText("CityDoctorValidation.notExactlyOneXMLOutput")); logger.fatal(Localization.getText("CityDoctorValidation.notExactlyOneXMLOutput"));
System.exit(5); System.exit(5);
} }
return reportFiles.get(0); return reportFiles.get(0);
...@@ -231,7 +258,7 @@ public class CityDoctorValidation { ...@@ -231,7 +258,7 @@ public class CityDoctorValidation {
if (argParser.containsOption("config")) { if (argParser.containsOption("config")) {
List<String> configFiles = argParser.getValues("config"); List<String> configFiles = argParser.getValues("config");
if (configFiles.size() != 1) { if (configFiles.size() != 1) {
logger.error(Localization.getText("CityDoctorValidation.notExactlyOneConfigFile")); logger.fatal(Localization.getText("CityDoctorValidation.notExactlyOneConfigFile"));
System.exit(4); System.exit(4);
} }
return ValidationConfiguration.loadValidationConfigFile(configFiles.get(0)); return ValidationConfiguration.loadValidationConfigFile(configFiles.get(0));
...@@ -240,7 +267,7 @@ public class CityDoctorValidation { ...@@ -240,7 +267,7 @@ public class CityDoctorValidation {
logger.warn(Localization.getText("CityDoctorValidation.loadingDefaultConfig")); logger.warn(Localization.getText("CityDoctorValidation.loadingDefaultConfig"));
return ValidationConfiguration.loadStandardValidationConfig(); return ValidationConfiguration.loadStandardValidationConfig();
} else { } else {
logger.error(Localization.getText("CityDoctorValidation.noConfig")); logger.fatal(Localization.getText("CityDoctorValidation.noConfig"));
System.exit(7); System.exit(7);
return null; return null;
} }
...@@ -252,7 +279,7 @@ public class CityDoctorValidation { ...@@ -252,7 +279,7 @@ public class CityDoctorValidation {
if (argParser.containsOption("out")) { if (argParser.containsOption("out")) {
List<String> outFiles = argParser.getValues("out"); List<String> outFiles = argParser.getValues("out");
if (outFiles.size() != 1) { if (outFiles.size() != 1) {
logger.error(Localization.getText("CityDoctorValidation.multipleOutputFiles")); logger.fatal(Localization.getText("CityDoctorValidation.multipleOutputFiles"));
System.exit(3); System.exit(3);
} }
return outFiles.get(0); return outFiles.get(0);
...@@ -271,12 +298,12 @@ public class CityDoctorValidation { ...@@ -271,12 +298,12 @@ public class CityDoctorValidation {
if (optional) { if (optional) {
return null; return null;
} }
logger.error(Localization.getText("CityDoctorValidation.noInputFile")); logger.fatal(Localization.getText("CityDoctorValidation.noInputFile"));
System.exit(1); System.exit(1);
} }
List<String> inFiles = argParser.getValues("in"); List<String> inFiles = argParser.getValues("in");
if (inFiles.size() != 1) { if (inFiles.size() != 1) {
logger.error(Localization.getText("CityDoctorValidation.notExactlyOneInputFile")); logger.fatal(Localization.getText("CityDoctorValidation.notExactlyOneInputFile"));
System.exit(2); System.exit(2);
} }
inputFile = inFiles.get(0); inputFile = inFiles.get(0);
......
...@@ -2,6 +2,7 @@ package de.hft.stuttgart.citydoctor2; ...@@ -2,6 +2,7 @@ package de.hft.stuttgart.citydoctor2;
import de.hft.stuttgart.citydoctor2.check.ValidationConfiguration; import de.hft.stuttgart.citydoctor2.check.ValidationConfiguration;
import de.hft.stuttgart.citydoctor2.database.DatabaseSettings;
import de.hft.stuttgart.citydoctor2.exceptions.CityDoctorWriteException; import de.hft.stuttgart.citydoctor2.exceptions.CityDoctorWriteException;
import de.hft.stuttgart.citydoctor2.parser.CityGmlParseException; import de.hft.stuttgart.citydoctor2.parser.CityGmlParseException;
import de.hft.stuttgart.citydoctor2.parser.InvalidGmlFileException; import de.hft.stuttgart.citydoctor2.parser.InvalidGmlFileException;
...@@ -26,20 +27,30 @@ public class CityDoctorValidationCLI implements Runnable { ...@@ -26,20 +27,30 @@ public class CityDoctorValidationCLI implements Runnable {
private File config; private File config;
@Option(names = {"-x" , "--xml" , "--xmlReport"}, @Option(names = {"-x" , "--xml" , "--xmlReport"},
description = "Create a XML validation report at target location", description = "Creates a XML validation report at target location",
defaultValue = Option.NULL_VALUE) defaultValue = Option.NULL_VALUE)
private String xmlReport; private String xmlReport;
@Option(names = {"-p" , "--pdf" , "--pdfReport"}, @Option(names = {"-p" , "--pdf" , "--pdfReport"},
description = "Create a PDF validation report at target location", description = "Creates a PDF validation report at target location",
defaultValue = Option.NULL_VALUE) defaultValue = Option.NULL_VALUE)
private String pdfReport; private String pdfReport;
@Option(names = {"-o" , "--out" , "--output"}, @Option(names = {"-o" , "--out" , "--output"},
description = "Create a validated copy of the CityGML input with QualityADE at target location.", description = "Creates a validated copy of the CityGML input with QualityADE at target location.",
defaultValue = Option.NULL_VALUE) defaultValue = Option.NULL_VALUE)
private String output; private String output;
@Option(names = {"--db_location", "--db_loc"},
description = "Creates the embedded database file at target location instead of CityDoctor's working directory.",
defaultValue = Option.NULL_VALUE)
private String dbLocation;
@Option(names = {"-db", "--db_config", "--db_settings"},
description = "Filepath to a .properties file for overriding the default configuration of the embedded database",
defaultValue = Option.NULL_VALUE)
private String dbConfig;
@Override @Override
public void run(){ public void run(){
try { try {
...@@ -49,6 +60,12 @@ public class CityDoctorValidationCLI implements Runnable { ...@@ -49,6 +60,12 @@ public class CityDoctorValidationCLI implements Runnable {
} else{ } else{
valConfig=ValidationConfiguration.loadValidationConfigFile(config.getAbsolutePath()); valConfig=ValidationConfiguration.loadValidationConfigFile(config.getAbsolutePath());
} }
if(dbConfig != null){
DatabaseSettings.loadPropertiesFromFile(new File(dbConfig));
}
if (dbLocation != null) {
DatabaseSettings.setDBLocation(dbLocation);
}
CityDoctorValidation.startValidationProcess(input, xmlReport, pdfReport, valConfig,output); CityDoctorValidation.startValidationProcess(input, xmlReport, pdfReport, valConfig,output);
} catch (CityDoctorWriteException | CityGmlParseException | IOException | InvalidGmlFileException e) { } catch (CityDoctorWriteException | CityGmlParseException | IOException | InvalidGmlFileException e) {
throw new RuntimeException(e); throw new RuntimeException(e);
......
...@@ -118,13 +118,15 @@ public class AllPolygonsWrongOrientationCheck extends Check { ...@@ -118,13 +118,15 @@ public class AllPolygonsWrongOrientationCheck extends Check {
// find the centroid of a triangle // find the centroid of a triangle
Vector3d centroid = t.getCentroid(); Vector3d centroid = t.getCentroid();
// create a point outside of the geometry // create a point outside of the geometry
Vector3d outsidePoint = bbox[0].minus(Vector3d.X, 5).minus(Vector3d.Y, 5).minus(Vector3d.Z, 5); Vector3d outsideDif1 = new Vector3d(5, 5, 5);
Vector3d outsidePoint = bbox[0].minus(outsideDif1);
// create a second point outside of the geometry // create a second point outside of the geometry
// the check can fail if the building is exactly oriented so that the ray is // the check can fail if the building is exactly oriented so that the ray is
// parallel to a side of the building // parallel to a side of the building
// in order to avoid this we check two rays, if one of those says it is oriented // in order to avoid this we check two rays, if one of those says it is oriented
// correctly it is oriented correctly // correctly it is oriented correctly
Vector3d secondOutsidePoint = bbox[0].minus(Vector3d.X, 5).minus(Vector3d.Y, 10).minus(Vector3d.Z, 5); Vector3d outsideDif2 = new Vector3d(7, 10, 5);
Vector3d secondOutsidePoint = bbox[0].minus(outsideDif2);
return checkIfGeometryIsWrongOriented(tessPolygons, centroid, outsidePoint) return checkIfGeometryIsWrongOriented(tessPolygons, centroid, outsidePoint)
|| checkIfGeometryIsWrongOriented(tessPolygons, centroid, secondOutsidePoint); || checkIfGeometryIsWrongOriented(tessPolygons, centroid, secondOutsidePoint);
} }
...@@ -164,8 +166,8 @@ public class AllPolygonsWrongOrientationCheck extends Check { ...@@ -164,8 +166,8 @@ public class AllPolygonsWrongOrientationCheck extends Check {
} }
private Triangle3d findSuitableTriangle(TesselatedPolygon p1) { private Triangle3d findSuitableTriangle(TesselatedPolygon p1) {
Triangle3d t = p1.getTriangles().get(0); Triangle3d t = null;
double maxArea = t.getArea(); double maxArea = Double.NEGATIVE_INFINITY;
for (Triangle3d tri : p1.getTriangles()) { for (Triangle3d tri : p1.getTriangles()) {
double area = tri.getArea(); double area = tri.getArea();
if (area > maxArea) { if (area > maxArea) {
...@@ -173,6 +175,9 @@ public class AllPolygonsWrongOrientationCheck extends Check { ...@@ -173,6 +175,9 @@ public class AllPolygonsWrongOrientationCheck extends Check {
t = tri; t = tri;
} }
} }
if (t == null) {
throw new IllegalStateException("No suitable triangle found");
}
return t; return t;
} }
......
...@@ -29,6 +29,7 @@ import de.hft.stuttgart.citydoctor2.check.CheckId; ...@@ -29,6 +29,7 @@ import de.hft.stuttgart.citydoctor2.check.CheckId;
import de.hft.stuttgart.citydoctor2.check.CheckResult; import de.hft.stuttgart.citydoctor2.check.CheckResult;
import de.hft.stuttgart.citydoctor2.check.Requirement; import de.hft.stuttgart.citydoctor2.check.Requirement;
import de.hft.stuttgart.citydoctor2.check.RequirementType; import de.hft.stuttgart.citydoctor2.check.RequirementType;
import de.hft.stuttgart.citydoctor2.check.ResultStatus;
import de.hft.stuttgart.citydoctor2.checks.util.CollectionUtils; import de.hft.stuttgart.citydoctor2.checks.util.CollectionUtils;
import de.hft.stuttgart.citydoctor2.checks.util.UnfragmentedCheck; import de.hft.stuttgart.citydoctor2.checks.util.UnfragmentedCheck;
import de.hft.stuttgart.citydoctor2.database.CityObjectCache; import de.hft.stuttgart.citydoctor2.database.CityObjectCache;
...@@ -81,6 +82,10 @@ public class RoofSurfaceUnfragmentedCheck extends Check { ...@@ -81,6 +82,10 @@ public class RoofSurfaceUnfragmentedCheck extends Check {
} }
// only use lod1 and lod2 polygons // only use lod1 and lod2 polygons
CheckResult cr = UnfragmentedCheck.checkForFragmentedBoundarySurfaces(this, bs, maxAngleDeviation); CheckResult cr = UnfragmentedCheck.checkForFragmentedBoundarySurfaces(this, bs, maxAngleDeviation);
if (cr.getResultStatus() == ResultStatus.OK) {
// check if neighboring roof surfaces have the same average normal
// they should be merged
}
bs.addCheckResult(cr); bs.addCheckResult(cr);
} }
......
...@@ -24,7 +24,7 @@ import java.util.List; ...@@ -24,7 +24,7 @@ import java.util.List;
import de.hft.stuttgart.citydoctor2.check.Check; import de.hft.stuttgart.citydoctor2.check.Check;
import de.hft.stuttgart.citydoctor2.check.CheckResult; import de.hft.stuttgart.citydoctor2.check.CheckResult;
import de.hft.stuttgart.citydoctor2.check.ResultStatus; import de.hft.stuttgart.citydoctor2.check.ResultStatus;
import de.hft.stuttgart.citydoctor2.check.error.SurfaceUnfragmentedError; import de.hft.stuttgart.citydoctor2.check.error.SurfaceFragmentedError;
import de.hft.stuttgart.citydoctor2.datastructure.BoundarySurface; import de.hft.stuttgart.citydoctor2.datastructure.BoundarySurface;
import de.hft.stuttgart.citydoctor2.datastructure.Geometry; import de.hft.stuttgart.citydoctor2.datastructure.Geometry;
import de.hft.stuttgart.citydoctor2.datastructure.Polygon; import de.hft.stuttgart.citydoctor2.datastructure.Polygon;
...@@ -75,7 +75,7 @@ public class UnfragmentedCheck { ...@@ -75,7 +75,7 @@ public class UnfragmentedCheck {
double dot = averageNormal.dot(n); double dot = averageNormal.dot(n);
double acos = Math.acos(dot); double acos = Math.acos(dot);
if (acos > delta) { if (acos > delta) {
SurfaceUnfragmentedError err = new SurfaceUnfragmentedError(bs, acos); SurfaceFragmentedError err = new SurfaceFragmentedError(bs, acos);
return new CheckResult(c, ResultStatus.ERROR, err); return new CheckResult(c, ResultStatus.ERROR, err);
} }
} }
......
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
<parent> <parent>
<groupId>de.hft.stuttgart</groupId> <groupId>de.hft.stuttgart</groupId>
<artifactId>CityDoctorParent</artifactId> <artifactId>CityDoctorParent</artifactId>
<version>3.18.1</version> <version>3.18.2</version>
<relativePath>../../pom.xml</relativePath> <relativePath>../../pom.xml</relativePath>
</parent> </parent>
<artifactId>CityDoctorAutoPro</artifactId> <artifactId>CityDoctorAutoPro</artifactId>
......
#Embedded database configuration
#Mon Jan 19 13:16:58 CET 2026
#database.attemptFallback=true
#database.connectionPoolSize=22
#database.debugMode=false
#database.directory=\\database\\
#database.inMemoryMode=false
#database.name=cd_db
#database.tempMode=false
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
<parent> <parent>
<groupId>de.hft.stuttgart</groupId> <groupId>de.hft.stuttgart</groupId>
<artifactId>CityDoctorParent</artifactId> <artifactId>CityDoctorParent</artifactId>
<version>3.18.1</version> <version>3.18.3</version>
<relativePath>../../pom.xml</relativePath> <relativePath>../../pom.xml</relativePath>
</parent> </parent>
<artifactId>CityDoctorGUI</artifactId> <artifactId>CityDoctorGUI</artifactId>
......
...@@ -40,7 +40,7 @@ import de.hft.stuttgart.citydoctor2.check.error.SchematronError; ...@@ -40,7 +40,7 @@ import de.hft.stuttgart.citydoctor2.check.error.SchematronError;
import de.hft.stuttgart.citydoctor2.check.error.SolidError; import de.hft.stuttgart.citydoctor2.check.error.SolidError;
import de.hft.stuttgart.citydoctor2.check.error.SolidNotClosedError; import de.hft.stuttgart.citydoctor2.check.error.SolidNotClosedError;
import de.hft.stuttgart.citydoctor2.check.error.SolidSelfIntError; import de.hft.stuttgart.citydoctor2.check.error.SolidSelfIntError;
import de.hft.stuttgart.citydoctor2.check.error.SurfaceUnfragmentedError; import de.hft.stuttgart.citydoctor2.check.error.SurfaceFragmentedError;
import de.hft.stuttgart.citydoctor2.check.error.TooFewPolygonsError; import de.hft.stuttgart.citydoctor2.check.error.TooFewPolygonsError;
import de.hft.stuttgart.citydoctor2.check.error.UnknownCheckError; import de.hft.stuttgart.citydoctor2.check.error.UnknownCheckError;
import de.hft.stuttgart.citydoctor2.check.error.XMLValidationError; import de.hft.stuttgart.citydoctor2.check.error.XMLValidationError;
...@@ -188,7 +188,7 @@ public class GlobalErrorVisitor implements ErrorVisitor { ...@@ -188,7 +188,7 @@ public class GlobalErrorVisitor implements ErrorVisitor {
} }
@Override @Override
public void visit(SurfaceUnfragmentedError err) { public void visit(SurfaceFragmentedError err) {
} }
@Override @Override
......
...@@ -42,7 +42,7 @@ import de.hft.stuttgart.citydoctor2.check.error.SchematronError; ...@@ -42,7 +42,7 @@ import de.hft.stuttgart.citydoctor2.check.error.SchematronError;
import de.hft.stuttgart.citydoctor2.check.error.SolidError; import de.hft.stuttgart.citydoctor2.check.error.SolidError;
import de.hft.stuttgart.citydoctor2.check.error.SolidNotClosedError; import de.hft.stuttgart.citydoctor2.check.error.SolidNotClosedError;
import de.hft.stuttgart.citydoctor2.check.error.SolidSelfIntError; import de.hft.stuttgart.citydoctor2.check.error.SolidSelfIntError;
import de.hft.stuttgart.citydoctor2.check.error.SurfaceUnfragmentedError; import de.hft.stuttgart.citydoctor2.check.error.SurfaceFragmentedError;
import de.hft.stuttgart.citydoctor2.check.error.DegeneratedRingError; import de.hft.stuttgart.citydoctor2.check.error.DegeneratedRingError;
import de.hft.stuttgart.citydoctor2.check.error.TooFewPolygonsError; import de.hft.stuttgart.citydoctor2.check.error.TooFewPolygonsError;
import de.hft.stuttgart.citydoctor2.check.error.UnknownCheckError; import de.hft.stuttgart.citydoctor2.check.error.UnknownCheckError;
...@@ -244,7 +244,7 @@ public class ListErrorVisitor implements ErrorVisitor { ...@@ -244,7 +244,7 @@ public class ListErrorVisitor implements ErrorVisitor {
} }
@Override @Override
public void visit(SurfaceUnfragmentedError err) { public void visit(SurfaceFragmentedError err) {
// nothing to display // nothing to display
} }
......
...@@ -280,6 +280,8 @@ public class MainWindow extends Application { ...@@ -280,6 +280,8 @@ public class MainWindow extends Application {
System.exit(4); System.exit(4);
} }
} }
CityDoctorValidation.lookForDbConfigFileParameter(argParser);
CityDoctorValidation.lookForDbLocationParameter(argParser);
Application.launch(args); Application.launch(args);
} }
...@@ -820,8 +822,11 @@ public class MainWindow extends Application { ...@@ -820,8 +822,11 @@ public class MainWindow extends Application {
MenuItem deleteOption = new MenuItem(Localization.getText("MainWindow.delete")); MenuItem deleteOption = new MenuItem(Localization.getText("MainWindow.delete"));
deleteOption.setOnAction(ae -> controller.delete(featureView.getSelectionModel().getSelectedItem())); deleteOption.setOnAction(ae -> controller.delete(featureView.getSelectionModel().getSelectedItem()));
menu.getItems().add(deleteOption); menu.getItems().add(deleteOption);
featureView.setContextMenu(menu);
*/ */
featureView.setContextMenu(menu);
} }
public void fetchCopyAction(Renderable node) { public void fetchCopyAction(Renderable node) {
......
...@@ -38,7 +38,7 @@ import de.hft.stuttgart.citydoctor2.check.error.RingTooFewPointsError; ...@@ -38,7 +38,7 @@ import de.hft.stuttgart.citydoctor2.check.error.RingTooFewPointsError;
import de.hft.stuttgart.citydoctor2.check.error.SchematronError; import de.hft.stuttgart.citydoctor2.check.error.SchematronError;
import de.hft.stuttgart.citydoctor2.check.error.SolidNotClosedError; import de.hft.stuttgart.citydoctor2.check.error.SolidNotClosedError;
import de.hft.stuttgart.citydoctor2.check.error.SolidSelfIntError; import de.hft.stuttgart.citydoctor2.check.error.SolidSelfIntError;
import de.hft.stuttgart.citydoctor2.check.error.SurfaceUnfragmentedError; import de.hft.stuttgart.citydoctor2.check.error.SurfaceFragmentedError;
import de.hft.stuttgart.citydoctor2.check.error.TooFewPolygonsError; import de.hft.stuttgart.citydoctor2.check.error.TooFewPolygonsError;
import de.hft.stuttgart.citydoctor2.check.error.UnknownCheckError; import de.hft.stuttgart.citydoctor2.check.error.UnknownCheckError;
import de.hft.stuttgart.citydoctor2.datastructure.ConcretePolygon; import de.hft.stuttgart.citydoctor2.datastructure.ConcretePolygon;
...@@ -400,7 +400,7 @@ public class ErrorItemVisitor extends AbstractErrorVisitor { ...@@ -400,7 +400,7 @@ public class ErrorItemVisitor extends AbstractErrorVisitor {
} }
@Override @Override
public void visit(SurfaceUnfragmentedError err) { public void visit(SurfaceFragmentedError err) {
TextNode textNode = new TextNode( TextNode textNode = new TextNode(
Localization.getText("ErrorItemVisitor.deviation") + ": " + err.getAngleDeviation()); Localization.getText("ErrorItemVisitor.deviation") + ": " + err.getAngleDeviation());
TreeItem<Renderable> textItem = new TreeItem<>(textNode); TreeItem<Renderable> textItem = new TreeItem<>(textNode);
......
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
<parent> <parent>
<groupId>de.hft.stuttgart</groupId> <groupId>de.hft.stuttgart</groupId>
<artifactId>CityDoctorParent</artifactId> <artifactId>CityDoctorParent</artifactId>
<version>3.18.1</version> <version>3.18.3</version>
<relativePath>../../pom.xml</relativePath> <relativePath>../../pom.xml</relativePath>
</parent> </parent>
<artifactId>CityDoctorHealer</artifactId> <artifactId>CityDoctorHealer</artifactId>
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
<parent> <parent>
<groupId>de.hft.stuttgart</groupId> <groupId>de.hft.stuttgart</groupId>
<artifactId>CityDoctorParent</artifactId> <artifactId>CityDoctorParent</artifactId>
<version>3.18.1</version> <version>3.18.3</version>
<relativePath>../../pom.xml</relativePath> <relativePath>../../pom.xml</relativePath>
</parent> </parent>
<artifactId>CityDoctorHealerGUI</artifactId> <artifactId>CityDoctorHealerGUI</artifactId>
......
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
<parent> <parent>
<groupId>de.hft.stuttgart</groupId> <groupId>de.hft.stuttgart</groupId>
<artifactId>CityDoctorParent</artifactId> <artifactId>CityDoctorParent</artifactId>
<version>3.18.1</version> <version>3.18.2</version>
<relativePath>../../pom.xml</relativePath> <relativePath>../../pom.xml</relativePath>
</parent> </parent>
<artifactId>CityDoctorHealerGenetic</artifactId> <artifactId>CityDoctorHealerGenetic</artifactId>
......
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<groupId>de.hft.stuttgart</groupId> <groupId>de.hft.stuttgart</groupId>
<artifactId>CityDoctorParent</artifactId> <artifactId>CityDoctorParent</artifactId>
<version>3.18.1</version> <version>3.18.3</version>
<packaging>pom</packaging> <packaging>pom</packaging>
<name>CityDoctorParent</name> <name>CityDoctorParent</name>
<properties> <properties>
......
! Embedded database configuration
! Remove # at the beginning of a parameter line to override the value.
! Directory for the database file. DEFAULT: \\database\\
# database.directory=\\database\\
! Name of the database file. DEFAULT: cd_db
# database.name=cd_db
! Sets a limit for the number of pooled connections to the embedded database. DEFAULT: 10
! If not overridden CityDoctor will use the number of available CPU cores as limit.
# database.connectionPoolSize=10
! If temp mode is enabled the database-file will be created in the System's TEMP directory. DEFAULT: false
# database.tempMode=false
! If in-memory mode is enabled the database will be created in the Systems RAM. DEFAULT: false
! WARNING: Enabling in-memory mode can lead to out-of-memory errors when loading bigger CityGML files.
# database.inMemoryMode=false
! If fallback is enabled CityDoctor will attempt to use the in-memory mode if database-file creation fails DEFAULT: true
# database.attemptFallback=true
! If debug mode is enabled the embedded database will start in automatic mixed mode DEFAULT: false
! NOTE: Activating this mode will start a local server with random ports. This may trigger a Firewall request, which can be safely denied.
! NOTE: This server is only accessible locally and automatically rejects any remote connections.
# database.debugMode=false
...@@ -43,7 +43,7 @@ Use [Maven](https://maven.apache.org/) to build CityDoctor2. ...@@ -43,7 +43,7 @@ Use [Maven](https://maven.apache.org/) to build CityDoctor2.
```bash ```bash
cd CityDoctorParent cd CityDoctorParent
mvn install mvn clean install -P create-binaries
``` ```
CityDoctor2 uses the [quality ade plugin](https://transfer.hft-stuttgart.de/gitlab/betzms/qualityade). A jar is provided in a local repository for ease of use. CityDoctor2 uses the [quality ade plugin](https://transfer.hft-stuttgart.de/gitlab/betzms/qualityade). A jar is provided in a local repository for ease of use.
...@@ -55,14 +55,16 @@ Once built there is a CityDoctorValidation-\<version\>.zip file in the target fo ...@@ -55,14 +55,16 @@ Once built there is a CityDoctorValidation-\<version\>.zip file in the target fo
There is a start script included in the binary releases of citydoctor. An example start command looks like this: There is a start script included in the binary releases of citydoctor. An example start command looks like this:
```bash ```bash
java -classpath libs/*;plugins/*;CityDoctorValidation-<version>.jar de.hft.stuttgart.citydoctor2.CityDoctorValidation -in <path-to-gml-file>.gml -config <path-to-validation-config>.yml -xmlReport <path-to-xml-output>.xml -pdfReport <path-to-pdf-output>.pdf -out <path-to-output-gml>.gml java -classpath libs/*;plugins/*;CityDoctorValidation-<version>.jar de.hft.stuttgart.citydoctor2.CityDoctorValidation -in <path-to-gml-file>.gml -config <path-to-validation-config>.yml -xmlReport <path-to-xml-output>.xml -pdfReport <path-to-pdf-output>.pdf -out <path-to-output-gml>.gml -db_location <path-for-database-file> -db_settings <path-to-database-settings-file>.properties
``` ```
Notes: Notes:
- -xmlReport, -pdfReport and -out are optional - -xmlReport, -pdfReport, -out, -db_location and -db_settings are optional
- If a ZIP file is given as input, CityDoctor2 will check all contained CityGML files. The -out parameter is required in - Paths will be resolved from CityDoctor's working directory
this case - See [DBSettings.properties](DBSettings.properties) for the formatting of the database-settings file
- The -db_location parameter takes precedence over the location set in the database-settings file
- The start scripts included in the binary releases have -db_location set to the system's temp directory
## Extension modules ## Extension modules
......
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