Commit b8bac3e6 authored by Luna Riegel's avatar Luna Riegel
Browse files

Merge branch 'dev' into 'master'

CityDoctor Version 3.18.2

See merge request !40
parents 947020ff 4b27a7e4
Pipeline #12385 passed with stage
in 2 minutes and 4 seconds
......@@ -2,6 +2,7 @@
<?import javafx.geometry.Insets?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Hyperlink?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.ProgressBar?>
<?import javafx.scene.control.Tab?>
......@@ -60,6 +61,15 @@
<Font size="16.0" />
</font>
</Label>
<Label fx:id="checkDescriptionsLabel" layoutX="10.0" layoutY="10.0" text="Check Descriptions Available At:">
<font>
<Font size="16.0" />
</font>
<HBox.margin>
<Insets left="100.0" />
</HBox.margin>
</Label>
<Hyperlink fx:id="homepageHyperlink" alignment="CENTER" text="Hyperlink" />
</children>
</HBox>
<HBox spacing="5.0" VBox.vgrow="ALWAYS">
......@@ -71,6 +81,16 @@
<Font size="16.0" />
</font>
</Label>
<HBox>
<children>
<Button fx:id="selectAllGCBtn" mnemonicParsing="false" text="Select All" />
<Button fx:id="selectNoneGCBtn" layoutX="10.0" layoutY="10.0" mnemonicParsing="false" text="Select None">
<HBox.margin>
<Insets left="10.0" />
</HBox.margin>
</Button>
</children>
</HBox>
<TreeTableView fx:id="geometricTable" editable="true" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" minHeight="400.0" minWidth="400.0" prefWidth="600.0" showRoot="false" VBox.vgrow="ALWAYS" />
</children>
</VBox>
......@@ -81,6 +101,16 @@
<Font size="16.0" />
</font>
</Label>
<HBox>
<children>
<Button fx:id="selectAllSCBtn" mnemonicParsing="false" text="Select All" />
<Button fx:id="selectNoneSCBtn" layoutX="10.0" layoutY="10.0" mnemonicParsing="false" text="Select None">
<HBox.margin>
<Insets left="10.0" />
</HBox.margin>
</Button>
</children>
</HBox>
<TreeTableView fx:id="semanticTable" editable="true" maxHeight="1.7976931348623157E308" minWidth="400.0" prefWidth="600.0" showRoot="false" VBox.vgrow="ALWAYS" />
</children>
</VBox>
......
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.geometry.Insets?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.ProgressIndicator?>
<?import javafx.scene.layout.VBox?>
<?import javafx.scene.text.Font?>
<VBox alignment="CENTER" maxHeight="-Infinity" maxWidth="-Infinity" minWidth="300.0" spacing="10.0" style="-fx-border-image-width: 2; -fx-border-color: BLACK;" xmlns="http://javafx.com/javafx/22" xmlns:fx="http://javafx.com/fxml/1">
<children>
<Label fx:id="messageLbl" text="Message">
<font>
<Font size="14.0" />
</font>
</Label>
<ProgressIndicator />
</children>
<padding>
<Insets bottom="20.0" left="20.0" right="20.0" top="20.0" />
</padding>
</VBox>
......@@ -6,7 +6,7 @@
<parent>
<groupId>de.hft.stuttgart</groupId>
<artifactId>CityDoctorParent</artifactId>
<version>3.18.1</version>
<version>3.18.2</version>
<relativePath>../../pom.xml</relativePath>
</parent>
<artifactId>CityDoctorHealer</artifactId>
......
package de.hft.stuttgart.citydoctor2.connect.edge;
/**
* Marker interface for excluding testcases that use the deprecated connection to the C++ library.
* The tests are kept for the Java replacement library that is currently being developed.
*/
public interface CppTest {
}
......@@ -12,6 +12,9 @@ import java.util.List;
import java.util.Map;
import java.util.Objects;
import de.hft.stuttgart.citydoctor2.database.CityObjectCache;
import de.hft.stuttgart.citydoctor2.database.UnconnectedCache;
import de.hft.stuttgart.citydoctor2.exceptions.CityObjectCacheException;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.citygml4j.core.ade.ADEException;
......@@ -64,7 +67,7 @@ public class Healer {
private Checker checker;
private ModificationListener l;
private HealingPlan plan;
private CityObjectCache cache;
static {
// CppInitializer.initCpp();
}
......@@ -156,7 +159,7 @@ public class Healer {
if (configFile == null) {
config = ValidationConfiguration.loadStandardValidationConfig();
} else {
config = ValidationConfiguration.loadValidationConfig(configFile.getAbsolutePath());
config = ValidationConfiguration.loadValidationConfigFile(configFile.getAbsolutePath());
}
CityDoctorModel model = CityGmlParser.parseCityGmlFile(in.getAbsolutePath(), config.getParserConfiguration());
Checker c = new Checker(config, model);
......@@ -187,6 +190,12 @@ public class Healer {
}
};
}
if(checker.getModel() != null){
cache = checker.getModel().getCache();
} else {
//Stream healing is being used, use an unconnected cache
cache = new UnconnectedCache();
}
this.l = l;
}
......@@ -208,7 +217,12 @@ public class Healer {
}
public void healModel(CityDoctorModel model) {
try (AutoCloseable checkingContext = model.getCache().startCheckingMode()){
model.createFeatureStream().forEach(this::healCityObject);
} catch (Exception e) {
throw new CityObjectCacheException("Healer critically failed during attempt to heal the model",e);
}
}
public void healCityObject(CityObject co) {
......@@ -282,14 +296,12 @@ public class Healer {
*
* @param aco the feature to write
* @return the byte array containing the feature
* @throws ADEException
* @throws CityGMLBuilderException
* @throws CityGMLWriteException
* @throws CityGMLWriteException if writing of the CityGML file fails
*/
private byte[] writeCityGml(AbstractCityObject aco) throws CityGMLWriteException {
CityModel model = new CityModel();
model.getCityObjectMembers().add(new AbstractCityObjectProperty(aco));
CityGMLContext context = CityGmlParser.getContext();
CityGMLContext context = CityGmlParser.setupContext();
CityGMLOutputFactory outputFactory = context.createCityGMLOutputFactory(CityGMLVersion.v2_0);
ByteArrayOutputStream out = new ByteArrayOutputStream();
try (CityGMLWriter writer = outputFactory.createCityGMLWriter(out)) {
......@@ -348,6 +360,8 @@ public class Healer {
if (checker.getConfig().getParserConfiguration().useLowMemoryConsumption()) {
co.clearMetaInformation();
}
//Reinsert object into cache and release locks
cache.put(co);
}
}
......
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE Configuration>
<Configuration status="INFO">
<Appenders>
<Console name="console" target="SYSTEM_OUT">
<PatternLayout
pattern="[%-5level] %d{HH:mm:ss.SSS} %c{1} - %msg%n" />
</Console>
</Appenders>
<Loggers>
<Root level="debug" additivity="false">
<AppenderRef ref="console" />
</Root>
<Logger name="com.zaxxer.hikari" level="INFO" additivity="false">
<AppenderRef ref="console"/>
</Logger>
</Loggers>
</Configuration>
\ No newline at end of file
......@@ -29,6 +29,8 @@ import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import de.hft.stuttgart.citydoctor2.database.UnconnectedCache;
import org.citygml4j.core.model.CityGMLVersion;
import org.citygml4j.core.model.core.AbstractThematicSurface;
import org.citygml4j.core.model.core.CityModel;
import org.junit.Rule;
......@@ -70,7 +72,8 @@ public class HealMissingSolidTest {
@Test
public void testCreateSolid() throws CityDoctorWriteException, IOException, CityGmlParseException, InvalidGmlFileException {
ValidationConfiguration config = ValidationConfiguration.loadStandardValidationConfig();
CityDoctorModel model = new CityDoctorModel(config.getParserConfiguration(), new File("test"));
CityDoctorModel model = new CityDoctorModel(config.getParserConfiguration(), new File("test"), new UnconnectedCache());
model.setParsedCityGMLVersion(CityGMLVersion.v3_0);
model.setCityModel(new CityModel());
Building b = new Building();
model.addBuilding(b);
......
......@@ -7,6 +7,7 @@ import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import de.hft.stuttgart.citydoctor2.connect.edge.CppTest;
import org.junit.Assert;
import org.junit.Test;
......@@ -31,6 +32,7 @@ import de.hft.stuttgart.citydoctor2.datastructure.Geometry.Orientation;
import de.hft.stuttgart.citydoctor2.healer.Healer;
import de.hft.stuttgart.citydoctor2.parser.CityGmlParseException;
import de.hft.stuttgart.citydoctor2.parser.InvalidGmlFileException;
import org.junit.experimental.categories.Category;
public class HealPlanarPolygonErrorTest {
......@@ -47,7 +49,6 @@ public class HealPlanarPolygonErrorTest {
Assert.assertTrue(geom.containsError(CheckId.C_GE_P_NON_PLANAR));
Healer healer = new Healer(c);
healer.setNumberOfIterations(2);
healer.healCityObject(model.getBuildings().toList().get(0));
Assert.assertFalse(geom.containsError(CheckId.C_GE_P_NON_PLANAR));
......@@ -55,6 +56,7 @@ public class HealPlanarPolygonErrorTest {
}
@Test
@Category(CppTest.class)
public void testNonplanarPolygon() {
CppInitializer.initCpp();
Building b = new Building();
......@@ -160,6 +162,7 @@ public class HealPlanarPolygonErrorTest {
}
@Test
@Category(CppTest.class)
public void testNonplanarPolygon_Split() {
CppInitializer.initCpp();
Building b = new Building();
......@@ -274,6 +277,7 @@ public class HealPlanarPolygonErrorTest {
}
@Test
@Category(CppTest.class)
public void testNonplanarPolygon_Split2() {
CppInitializer.initCpp();
Building b = new Building();
......
......@@ -4,8 +4,11 @@ import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import java.io.File;
import java.io.IOException;
import java.nio.file.Path;
import de.hft.stuttgart.citydoctor2.connect.edge.CppTest;
import org.citygml4j.xml.writer.CityGMLWriteException;
import org.junit.Assert;
import org.junit.Test;
......@@ -33,13 +36,16 @@ import de.hft.stuttgart.citydoctor2.datastructure.Geometry.Orientation;
import de.hft.stuttgart.citydoctor2.healer.Healer;
import de.hft.stuttgart.citydoctor2.parser.CityGmlParseException;
import de.hft.stuttgart.citydoctor2.parser.InvalidGmlFileException;
import org.junit.experimental.categories.Category;
public class HealSolidNotClosedErrorTest {
/**
* One polygon is split up in 3 but has not matching edges
*/
@Test
@Category(CppTest.class)
public void testVertexCloseToEdge() {
CppInitializer.initCpp();
Building b = new Building(); //Angelika: als Test eingefügt
......@@ -164,6 +170,7 @@ public class HealSolidNotClosedErrorTest {
}
@Test
@Category(CppTest.class)
public void testMissingPolygon() {
CppInitializer.initCpp();
Building b = new Building();
......@@ -343,6 +350,7 @@ public class HealSolidNotClosedErrorTest {
}
@Test
@Category(CppTest.class)
public void test2MissingPolygonsCpp() {
CppInitializer.initCpp();
Building b = new Building();
......@@ -421,6 +429,8 @@ public class HealSolidNotClosedErrorTest {
assertEquals(ResultStatus.OK, cr.getResultStatus());
}
/**
* Missing Polygon has a self intersection
* @throws IOException
......@@ -431,24 +441,22 @@ public class HealSolidNotClosedErrorTest {
*/
@Test
public void testMissingPolygon2() throws CityGmlParseException, IOException, InvalidGmlFileException {
String path = "src/test/resources/SimpleSolid_SrefBS-GE-gml-SO-0002-T0002.gml"; //bei diesem Modell stürzt die VM ab
// String path = "src/test/resources/SimpleSolid_SrefBS-GE-gml-SO-0002-T0002.gml"; //bei diesem Modell stürzt die VM ab
// String path = "src/test/resources/SimpleSolid_SrefBS-GE-gml-SO-0002-T0001.gml"; //hier nur Fehlermeldung
String path = "src/test/resources/SimpleSolid_SrefBS-GE-gml-LR-0004-T0005.gml";
// String path = "src/test/resources/SimpleSolid_SrefBS.gml";
ValidationConfiguration config = ValidationConfiguration.loadStandardValidationConfig();
CityDoctorModel model = TestUtil.loadCityModel(path, config);
Checker c = new Checker(config, model);
c.runChecks();
Geometry geom = model.getBuildings().toList().get(0).getGeometries().get(0);
geom.updateVertices();
for (Vertex v : geom.getVertices()) {
v.setX(v.getX() - 10);
v.setY(v.getY() - 10);
}
Assert.assertTrue(geom.containsError(CheckId.C_GE_S_NOT_CLOSED));
Healer healer = new Healer(c);
//healer.setNumberOfIterations(2);
healer.setNumberOfIterations(2);
healer.healCityObject(model.getBuildings().toList().get(0));
Assert.assertFalse(geom.containsError(CheckId.C_GE_S_NOT_CLOSED));
......
......@@ -150,15 +150,14 @@ public class TestHealer {
Checker c = new Checker(config, model);
c.runChecks();
Geometry geom = model.getBuildings().toList().get(0).getGeometries().get(0);
Building b = model.getBuildings().toList().get(0);
Geometry geom = b.getGeometries().get(0);
Healer healer = new Healer(c);
healer.setNumberOfIterations(33);
healer.healCityObject(model.getBuildings().toList().get(0));
healer.healCityObject(b);
c.runChecks();
assertFalse(geom.containsAnyError());
}
@Test
......@@ -193,7 +192,6 @@ public class TestHealer {
Geometry geom = model.getBuildings().toList().get(0).getGeometries().get(0);
Healer healer = new Healer(c);
healer.setNumberOfIterations(83);
healer.healCityObject(model.getBuildings().toList().get(0));
c.runChecks();
......@@ -213,7 +211,6 @@ public class TestHealer {
Geometry geom = model.getBuildings().toList().get(0).getGeometries().get(0);
Healer healer = new Healer(c);
healer.setNumberOfIterations(165);
healer.healCityObject(model.getBuildings().toList().get(0));
c.runChecks();
......@@ -264,7 +261,6 @@ public class TestHealer {
Geometry geom = model.getBuildings().toList().get(0).getGeometries().get(0);
Healer healer = new Healer(c);
healer.setNumberOfIterations(45);
healer.healCityObject(model.getBuildings().toList().get(0));
c.runChecks();
......@@ -282,7 +278,6 @@ public class TestHealer {
Healer healer = new Healer(c);
healer.setNumberOfIterations(45);
healer.healModel(model);
}
......@@ -299,7 +294,7 @@ public class TestHealer {
Geometry geom = model.getBuildings().toList().get(0).getGeometries().get(0);
Healer healer = new Healer(c);
healer.setNumberOfIterations(100);
healer.healCityObject(model.getBuildings().toList().get(0));
c.runChecks();
......
......@@ -31,7 +31,7 @@ public class TestUtil {
}
public static CityDoctorModel loadCityModel(String path, ValidationConfiguration config) throws CityGmlParseException, IOException, InvalidGmlFileException {
return CityGmlParser.parseCityGmlFile(path, config.getParserConfiguration());
return CityGmlParser.nestedCityGmlFileParse(path, config.getParserConfiguration());
}
public static Polygon getPolygonById(String gmlId, CityDoctorModel model) {
......
......@@ -7,7 +7,7 @@
<parent>
<groupId>de.hft.stuttgart</groupId>
<artifactId>CityDoctorParent</artifactId>
<version>3.18.1</version>
<version>3.18.2</version>
<relativePath>../../pom.xml</relativePath>
</parent>
<artifactId>CityDoctorHealerGUI</artifactId>
......@@ -22,10 +22,10 @@
<groupId>de.hft.stuttgart</groupId>
<artifactId>CityDoctorHealer</artifactId>
</dependency>
<dependency>
<!-- <dependency>
<groupId>de.hft.stuttgart</groupId>
<artifactId>CityDoctorAutoPro</artifactId>
</dependency>
</dependency> -->
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-controls</artifactId>
......
......@@ -2,36 +2,33 @@ package de.hft.stuttgart.citydoctor2.healer.gui;
import java.util.ArrayList;
import java.util.EnumMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Optional;
import java.util.Set;
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.RequirementType;
import de.hft.stuttgart.citydoctor2.check.Checker;
import de.hft.stuttgart.citydoctor2.check.Requirement;
import de.hft.stuttgart.citydoctor2.check.RequirementType;
import de.hft.stuttgart.citydoctor2.datastructure.AbstractBuilding;
import de.hft.stuttgart.citydoctor2.datastructure.BoundarySurface;
import de.hft.stuttgart.citydoctor2.datastructure.Building;
import de.hft.stuttgart.citydoctor2.datastructure.Installation;
import de.hft.stuttgart.citydoctor2.datastructure.BuildingPart;
import de.hft.stuttgart.citydoctor2.datastructure.CityDoctorModel;
import de.hft.stuttgart.citydoctor2.datastructure.CityObject;
import de.hft.stuttgart.citydoctor2.datastructure.ConcretePolygon;
import de.hft.stuttgart.citydoctor2.datastructure.Geometry;
import de.hft.stuttgart.citydoctor2.datastructure.Geometry.Orientation;
import de.hft.stuttgart.citydoctor2.datastructure.GeometryType;
import de.hft.stuttgart.citydoctor2.datastructure.GmlId;
import de.hft.stuttgart.citydoctor2.datastructure.Installation;
import de.hft.stuttgart.citydoctor2.datastructure.LinkedPolygon;
import de.hft.stuttgart.citydoctor2.datastructure.Lod;
import de.hft.stuttgart.citydoctor2.datastructure.Opening;
import de.hft.stuttgart.citydoctor2.datastructure.Polygon;
import de.hft.stuttgart.citydoctor2.datastructure.Geometry.Orientation;
import de.hft.stuttgart.citydoctor2.gui.AutoProWindow;
import de.hft.stuttgart.citydoctor2.gui.HighlightController;
import de.hft.stuttgart.citydoctor2.gui.ListErrorVisitor;
import de.hft.stuttgart.citydoctor2.gui.TriangulatedGeometry;
......@@ -86,10 +83,10 @@ public class HealerController {
if (model == null) {
return;
}
model.createFeatureStream().forEach(CityObject::prepareForChecking);
AutoProWindow window = new AutoProWindow(model);
window.setLocationRelativeTo(null);
window.setVisible(true);
// model.createFeatureStream().forEach(CityObject::prepareForChecking);
// AutoProWindow window = new AutoProWindow(model);
// window.setLocationRelativeTo(null);
// window.setVisible(true);
}
public void setCurrentModel(CityDoctorModel model) {
......@@ -541,8 +538,7 @@ public class HealerController {
// if (model == null || currentFeature == null) {
// return;
// }
for (Building b : model.getBuildings()) {
model.getBuildings().forEach(b -> {
// collect polygons
Map<Lod, List<Polygon>> availablePolygons = new EnumMap<>(Lod.class);
Map<Lod, Set<Polygon>> existingPolygons = new EnumMap<>(Lod.class);
......@@ -571,7 +567,7 @@ public class HealerController {
insertSolidGeometry(availablePolygons, part, existingPolygons, Lod.LOD4);
}
}
}
});
}
......
......@@ -74,6 +74,7 @@ public class HealerToolbar {
saveBtn.setDisable(true);
saveImage.setImage(new Image(MainWindow.class.getResourceAsStream("icons/save.png")));
simplyBtn.setOnAction(ae -> controller.showSimplyfication());
simplyBtn.setDisable(true);
}
public HBox getToolBar() {
......
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE Configuration>
<Configuration status="INFO">
<Appenders>
<Console name="console" target="SYSTEM_OUT">
<PatternLayout
pattern="[%-5level] %d{HH:mm:ss.SSS} %c{1} - %msg%n" />
</Console>
</Appenders>
<Loggers>
<Root level="debug" additivity="false">
<AppenderRef ref="console" />
</Root>
<Logger name="com.zaxxer.hikari" level="INFO" additivity="false">
<AppenderRef ref="console"/>
</Logger>
</Loggers>
</Configuration>
\ No newline at end of file
......@@ -4,7 +4,7 @@
<parent>
<groupId>de.hft.stuttgart</groupId>
<artifactId>CityDoctorParent</artifactId>
<version>3.18.1</version>
<version>3.18.2</version>
<relativePath>../../pom.xml</relativePath>
</parent>
<artifactId>CityDoctorHealerGenetic</artifactId>
......
......@@ -329,7 +329,7 @@ public class GeneticsGUI extends View {
parserConfig);
currentChecker = new Checker(model1);
currentChecker.runChecks();
Building building = model1.getBuildings().toList().getFirst();
Building building = model1.getBuildings().findFirst().get();
currentGeometry = building.getGeometries().get(0);
currentFeature = building;
showCurrentGeometry();
......
......@@ -5,7 +5,7 @@
<modelVersion>4.0.0</modelVersion>
<groupId>de.hft.stuttgart</groupId>
<artifactId>CityDoctorParent</artifactId>
<version>3.18.1</version>
<version>3.18.2</version>
<packaging>pom</packaging>
<name>CityDoctorParent</name>
<properties>
......@@ -41,6 +41,9 @@
<excludes>
<exclude>**/SolidSelfIntCheckFalsePositiveBigMeshTest.java</exclude>
</excludes>
<excludedGroups>
de.hft.stuttgart.citydoctor2.connect.edge.CppTest
</excludedGroups>
</configuration>
</plugin>
</plugins>
......@@ -285,7 +288,6 @@
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j18-impl</artifactId>
<version>2.18.0</version>
<scope>test</scope>
</dependency>
<dependency>
......@@ -304,9 +306,9 @@
<!--CityDoctor2 Extension Modules-->
<module>Extensions/CityDoctorGUI</module>
<!-- <module>Extensions/CityDoctorAutoPro</module>-->
<!-- <module>Extensions/CityDoctorHealer</module>-->
<module>Extensions/CityDoctorHealer</module>
<!-- <module>Extensions/CityDoctorHealerGenetic</module>-->
<!-- <module>Extensions/CityDoctorHealerGUI</module>-->
<module>Extensions/CityDoctorHealerGUI</module>
</modules>
</project>
\ No newline at end of file
! 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.
```bash
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.
......@@ -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:
```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:
- -xmlReport, -pdfReport and -out are optional
- If a ZIP file is given as input, CityDoctor2 will check all contained CityGML files. The -out parameter is required in
this case
- -xmlReport, -pdfReport, -out, -db_location and -db_settings are optional
- Paths will be resolved from CityDoctor's working directory
- 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
......
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