Commit f7d00dee authored by Matthias Betz's avatar Matthias Betz
Browse files

upload of CityDoctor2 Documentation

parent cd022528
Pipeline #7225 passed with stages
in 12 seconds
# CityDoctor2
CityDoctor2 ist eine Qualitätsprüfungssoftware für 3D Stadtmodelle im CityGML format. CityDoctor kann CityGML 1/2 Dokumente einlesen und seit Version 3.12 kann auch eingeschränkt CityGML 3 gelesen werden. Alle Prüfergebnisse können in xml oder pdf Form ausgegeben werden. Zusätzlich implementiert CityDoctor die [QualityADE](https://transfer.hft-stuttgart.de/gitlab/citydoctor/qualityade) um Prüfergebnisse direkt in CityGML zu speichern.
![examplePicture](img/checked.png)
# Benötigte Software
## Java
Vor der CityDoctor Version 3.12.x wird Java 8 entweder als JDK oder als JRE benötigt. Ab der Version 3.12.x wird Java 17 benötigt.
!!! warning
Es wichtig, dass die installierte Java Version die JavaFX Bibliotheken mit einschließt. Diese werden für die grafische Oberfläche benötigt.
[Die Liberica JRE oder JDK](https://bell-sw.com/libericajdk/) hat sich für einen Einsatz mit CityDoctor bewährt.
!!! note
Die Liberica Distribution ist zu 100% frei und OpenSource.
!!! note
Für die Entwicklung mit CityDoctor wird eine JDK benötigt.
## CityDoctor2
CityDoctor kann von verschiedenen Seiten heruntergeladen werden. Die aktuellste Stelle ist ein [gitlab Repository](https://gitlab.com/volkercoors/CiD4Sim/-/tree/master/CityDoctorExtension). Alternativ werden Releases auch auf der [CityDoctor Homepage der BHT](https://projekt.bht-berlin.de/citydoctor2/downloads/) gelistet. Es gibt dabei immer zwei Versionen:
* **CityDoctorGUI-3.x.x.zip:** Das ist die grafische Oberfläche inklusive der Prüfungen. Geeignet für den Endnutzer auf einem Desktop PC.
* **CityDoctorValidation-3.x.x.zip:** Das ist die Batch-Version die für die Integration in Servern oder anderen bestehenden Systemen geeignet ist und hat keine grafische Oberfläche sondern arbeitet Dateibasiert als Prozess.
!!! note
Es gibt manchmal Spezialversionen die Testweise erstellt worden sind um verschiedene Auslieferungsmöglichkeiten zu testen. Bsp: CityDoctorGUI-x.x.x-win.zip beinhaltet die JavaFX Bibliotheken sodass eine Java Umgebung ohne JavaFX auch verwendet werden kann.
\ No newline at end of file
# Anforderungen und Prüfungen für die Validierung von CityGML-Modellen
Die Anforderungen sind die Grundbausteine für ein Validierungsplan um CityGML-Modelle zu validieren. Für Namenskonventionen und Definitionen, siehe [Grundbegriffe](basic.md).
Eine Anforderung kann durch einen oder mehrere Prüfungen validiert werden. Eine Prüfung validiert ein oder mehrere Anforderungen bei einem Modell. Jede Prüfung kann Vorbedingungen haben. Wenn diese Vorbedingungen nicht erfüllt sind wird die Prüfung nicht ausgeführt.
Unterschieden wird dabei zwischen:
* [Schemaanforderungen](schemaRequirements.md)
* [Geometrieanforderungen](geometric.md)
* [Semantische Anforderungen](semantic.md)
# Schemaanforderungen
## R_SC_SCHEMA_VALIDATION
### Anforderung
| ID | R_SC_SCHEMA_VALIDATION |
| ---- | ---- |
| Beschreibung | Eine grundlengende Anforderung ist, dass jedes CityGML Dokument wohl definiert sein muss und XSD valide ist. |
| Fehlercode | SC-SCHEMA-NOT-VALID |
### Prüfung
| ID | SC_SCHEMA_VALIDATION|
| ---- | ---- |
| Anforderungs ID | R_SC_SCHEMA_VALIDATION |
| Vorbedingungen | keine |
| Beschreibung | Werkzeuge um eine XSD Validierung durchzuführen sind verfügbar und geben verlässliche Ergebnisse |
| Fehlercode | SC_SCHEMA_NOT_VALID |
\ No newline at end of file
# Semantische Anforderungen
Die semantischen Anforderungen sind meistens auf Attributbasis. Daraus ergeben sich 3 Fehlerzustände für ein Attribut:
* **SE_ATTRIBUTE_WRONG_VALUE:** Wenn ein Attribut ein falschen Wert hat.
* **SE_ATTRIBUTE_MISSING:** Wenn ein Attribut fehlt, aber vorhanden sein sollte.
* **SE_ATTRIBUTE_INVALID:** Wenn ein Attribut vorhanden ist aber verboten ist.
!!! warning
**SE_ATTRIBUTE_INVALID:** ist noch nicht in CityDoctor und der QualityADE umgesetzt ist aber geplant in einer neuen Version zu unterstützen.
## Schematron
In CityDoctor wurde das [XML Validierungssystem Schematron](https://de.wikipedia.org/wiki/Schematron) integriert um flexibel Attributprüfungen anzupassen und zu unterstützen.
Hier ist ein Beispiel für eine Schematron Datei die CityDoctor integrieren kann:
``` xml
<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://purl.oclc.org/dsdl/schematron" queryBinding="xslt2">
<ns prefix="gml" uri="http://www.opengis.net/gml"/>
<ns prefix="bldg" uri="http://www.opengis.net/citygml/building/2.0"/>
<pattern>
<rule context="//*:Building">
<assert test="count(descendant::*:lod1Solid) &gt; 0 or count(descendant::*:lod2Solid) &gt; 0 or count(descendant::*:lod3Solid) &gt; 0 or count(descendant::*:lod4Solid) &gt; 0"><value-of select="@gml:id | @id"/>||||SE_ATTRIBUTE_MISSING||any solid||false</assert>
</rule>
<rule context="//*:BuildingPart">
<assert test="count(*:lod1Solid) = 1 or count(*:lod2Solid) = 1 or count(*:lod3Solid) = 1 or count(*:lod4Solid) = 1"><value-of select="ancestor::*:Building/@*:id"/>||<value-of select="@gml:id | @id"/>||SE_ATTRIBUTE_MISSING||any solid||false</assert>
</rule>
</pattern>
</schema>
```
Diese Datei prüft, dass alle Buildings in sich selbst oder in einem ihrer Unterelementen ein Solid beliebigen LODSs vorhanden ist. Außerdem stellt die Datei sicher, dass jedes BuildingPart ein Solid enthält. Wenn dies nicht der Fall ist wird eine Fehlermeldung ausgegeben. Die Fehlermeldung ist dabei so formattiert, dass CityDoctor sie interpretieren und in das interne Datenmodell einbinden kann.
### Fehlerformat
Das Fehlerformat ist ein CSV-Format mit || als Trennzeichen
```
parent id||child id||error code||error type||is generic attribute
```
Die Fehlermeldung besteht aus den folgenden Teilen:
* Die `parent id` ist die gml id des obersten Elements z.B. Building oder Bridge.
* Falls der Fehler in einem Unterelement aufgetreten ist so kann diese ID in dem Feld für die `child id` eingetragen werden.
* Im Feld `error type` ist einer der 3 Fehlertypen einzutragen: `SE_ATTRIBUTE_WRONG_VALUE, SE_ATTRIBUTE_MISSING, SE_ATTRIBUTE_INVALID`.
* Um ein generisches Attribut mit dem Namen `measuredHeight` von dem nicht generischen Attribut zu unterscheiden ist im letzten Feld vorgesehen `true` einzutragen wenn es sich um ein generisches Attribut handelt ansonsten `false`.
\ No newline at end of file
# Nutzeroberfläche
## CityDoctor
![interface](img/userInterface.png)
In der oberen Leiste sind folgende Schaltflächen in Reihenfolge:
* **Laden:** Öffnet den Dialog zum laden einer CityGML Datei
* **Prüfen:** Öffnet den Dialog zum prüfen einer geladenen CityGML
* **Prüfberichte:** Öffnet den Dialog zum schreiben eines Prüfprotokolls in xml oder pdf Form
* **Gitternetz:** Zeigt/Versteckt das Gitternetz anstatt gefüllter Polygone
* **Rückseiten:** Zeigt/Versteckt Rückseiten von Polygonen
* **Globale Ansicht:** Lädt alle Elemente einer CityGML in die Ansicht
* **LODs:** Schaltet einzelne LODs von der Ansicht an oder aus
* **Speichern:** Speichert eine CityGML Datei zurück, falls die Datei geprüft wurde wird die QualityADE mitgeschrieben.
* **About:** Öffnet den Dialog mit Informationen zu dem Projekt CityDoctor2
* **Ansichten:** Wechselt verschiedene Ansichten. Für die Prüfung gibt es nur eine.
* **Sprache:** Hier kann die Sprache eingestellt werden (Deutsch/Englisch)
!!! warning
Das Anzeigen der Globalen Ansicht kann bei großen CityGML Dateien (> 100mb je nach System) zu abstürzen führen. Das Anzeigen kann kurz dauern.
## Laden
Über die Schaltfläche Laden wird der Dialog zum laden einer CityGML Datei geöffnet.
![open](img/open.png)
In der Datei Leiste kann ein Dateipfad eingetragen werden oder über die Schaltfläche **Auswählen** ausgewählt werden.
Außerdem können weitere Einstellungen für das Lesen der Datei angegeben werden.
* **NumberOfRoundingPlaces:** Auf wie viele Nachkommastellen werden die eingelesenen Werte gerundet.
* **XML-Validierung:** Führt eine XML Validierung durch. Fehler werden dabei direkt beim einlesen festgestellt und das Einlesen wird abgebrochen.
* **Speicherverbrauch:** Spart RAM um größere Dateien in der GUI zu ermöglichen. Kostet geringfügig Performance bei der Prüfung.
Beim Laden wird der Fortschritt ungefähr durch den Ladebalken repräsentiert.
!!! note
Dateien können auch direkt per Drag and Drop vom Dateimanager in die GUI gezogen werden ohne den Laden Dialog zu verwenden. Dabei werden die Default Werte angenommen (8 Nachkommastellen, keine XML-Validierung)
Nach dem Laden einer CityGML Datei werden die Elemente in den einzelnen Tabs angezeigt. Durch auswählen eines Elements wird das in der Ansicht angezeigt.
![loadedFile](img/interfaceLoad.png)
!!! note
Durch Auswählen des obersten Elements eines Reiters werden alle Elemente innerhalb diese Reiters angezeigt. Wie obige Warnung schon besagt, gilt auch hier, dass größere Datenmengen zu Abstürzen führen.
## Prüfen
![checkDialog](img/checkDialog.png)
Im Prüfdialog kann der Validierungsplan angepasst werden. Hier werden neben den Verfügbaren Prüfungen auch die globalen Parameter angezeigt.
Verändert können die Parameter mit einem Doppelklick in die Wert Spalte. Die Einheit ist dabei fest.
!!! note
Der Parameter numberOfRoundingPlaces kann nicht verändert werden. Er wurde beim Laden der Datei festgelegt.
Falls Prüfungen nicht ausgeführt werden sollen können sie in der Spalte Aktiv deaktiviert werden.
!!! warning
Wenn Prüfungen deaktiviert wurden die andere aktiven Prüfungen aber als Abhängigkeit benötigen werden sie bei der Prüfung wieder aktiviert um die Stabilität zu gewährleisten. Siehe [Anforderungen](requirements.md).
In dem Feld Schematron Datei kann ein Pfad zu einer Schematron Datei eingetragen werden. In dieser Datei können flexible Regeln für die semantischen Anforderungen festgelegt werden. Siehe [Semantische Prüfungen](semantic.md)
Über die beiden Schaltflächen oben rechts kann der Prüfplan gespeichert und geladen werden.
Nach der Prüfung werden fehlerhafte Elemente rot und fehlerfreie Elemente grün eingefärbt. Bei der Auswahl eines Elements das fehler beinhaltet werden die Fehler in dem unteren Tab **Fehler** angezeigt. Dort kann der Fehler ausgewählt werden um ihn in CityDoctor anzuzeigen und weitere Informationen zu erhalten.
![checked](img/checked.png)
Die Elemente können mit dem Dropdown-Menü gefiltert werden um nur fehlerhafte Elemente anzuzeigen.
## Prüfberichte
In diesem Dialog gibt es nochmal eine Übersicht über die Fehler in Bildform und die Möglichkeit einen xml oder pdf Bericht zu schreiben.
![reportDialog](img/reportDialog.png)
\ No newline at end of file
# Validierungsplan
der Validierungsplan für CityDoctor wird in [YAML](https://de.wikipedia.org/wiki/YAML) angegeben.
Für die Version 3.12.x sieht ein Beispiel so aus:
``` {.yaml .annotate}
globalParameters:
numberOfRoundingPlaces: 8
# in m
minVertexDistance: 0.0001
schematronPath: 'checkForSolid.xml'
useStreaming: true # (1)!
requirements:
R_GE_R_TOO_FEW_POINTS:
enabled: true
R_GE_R_NOT_CLOSED:
enabled: true
R_GE_R_CONSECUTIVE_POINTS_SAME:
enabled: true
R_GE_R_SELF_INTERSECTION:
enabled: true
R_GE_S_MULTIPLE_CONNECTED_COMPONENTS:
enabled: true
R_GE_P_INTERIOR_DISCONNECTED:
enabled: true
R_GE_P_INTERSECTING_RINGS:
enabled: true
R_GE_P_NON_PLANAR:
enabled: true
parameters:
# one of ("distance", "angle", "both")
type: distance
# in m
distanceTolerance: 0.01
# in degree
angleTolerance: 1
R_GE_P_HOLE_OUTSIDE:
enabled: true
R_GE_P_ORIENTATION_RINGS_SAME:
enabled: true
R_GE_P_INNER_RINGS_NESTED:
enabled: true
R_GE_S_TOO_FEW_POLYGONS:
enabled: true
R_GE_S_NOT_CLOSED:
enabled: true
R_GE_S_NON_MANIFOLD_EDGE:
enabled: true
R_GE_S_POLYGON_WRONG_ORIENTATION:
enabled: true
R_GE_S_ALL_POLYGONS_WRONG_ORIENTATION:
enabled: true
R_GE_S_NON_MANIFOLD_VERTEX:
enabled: true
R_GE_S_SELF_INTERSECTION:
enabled: true
R_SE_BS_IS_WALL:
enabled: false
parameters:
lowerAngle: '45'
upperAngle: '135'
R_SE_BS_IS_FLOOR:
enabled: false
R_SE_BS_GROUND_UNFRAGMENTED:
enabled: false
R_SE_BS_IS_GROUND:
enabled: false
R_SE_BS_IS_CEILING:
enabled: false
```
1. Der Parameter `useStreaming` ist ein Schalter um eine Datei Stück für Stück einzulesen anstelle erst die komplette Datei zu lesen bevor die Prüfung stattfindet. Mit dieser Einstellung können auch Dateien > 2GB ohne große RAM Anforderungen geprüft werden.
In dem Validierungsplan finden sich die selben Einstellungen wieder, die in der grafischen Oberfläche auch aufgelistet sind.
Unter requirements sind alle Anforderungen gelistet die geprüft werden sollen. Dabei sind die semantischen Prüfungen standardmäßig deaktiviert.
\ No newline at end of file
site_name: CityDoctor2
nav:
- CityDoctor2: index.md
- Installation: requiredSoftware.md
- Erster Start: firstRun.md
- Nutzeroberfläche: userInterface.md
- Prüfplan: validationPlan.md
- Anforderungen:
- Grundbegriffe: basic.md
- Übersicht: requirements.md
- Schemaanforderungen: schemaRequirements.md
- Geometrische Anforderungen: geometric.md
- Semantische Anforderungen: semantic.md
- Details:
- R_TOO_FEW_POINTS: R_GE_R_TOO_FEW_POINTS.md
- R_CONSECUTIVE_POINTS_SAME: R_GE_R_CONSECUTIVE_POINTS_SAME.md
- R_RING_NOT_CLOSED: R_GE_R_NOT_CLOSED.md
- R_RING_SELF_INTERSECTION: R_GE_R_SELF_INTERSECTION.md
- R_COLLAPSED_TO_LINE: R_GE_R_COLLAPSED_TO_LINE.md
- P_INTERSECTING_RINGS: R_GE_P_INTERSECTING_RINGS.md
- P_NON_PLANAR: R_GE_P_NON_PLANAR.md
- P_INTERIOR_DISCONNECTED: R_GE_P_INTERIOR_DISCONNECTED.md
- P_HOLE_OUTSIDE: R_GE_P_HOLE_OUTSIDE.md
- P_INNER_RINGS_NESTED: R_GE_P_INNER_RINGS_NESTED.md
- P_ORIENTATION_RINGS_SAME: R_GE_P_ORIENTATION_RINGS_SAME.md
- MULTI_SURFACE: R_GE_MS.md
- S_TOO_FEW_POLYGONS: R_GE_S_TOO_FEW_POLYGONS.md
- S_NOT_CLOSED: R_GE_S_NOT_CLOSED.md
- S_NON_MANIFOLD_VERTEX: R_GE_S_NON_MANIFOLD_VERTEX.md
- S_NON_MANIFOLD_EDGE: R_GE_S_NON_MANIFOLD_EDGE.md
- S_MULTIPLE_CONNECTED_COMPONENTS: R_GE_S_MULTIPLE_CONNECTED_COMPONENTS.md
- S_SELF_INTERSECTION: R_GE_S_SELF_INTERSECTION.md
- S_POLYGON_WRONG_ORIENTATION: R_GE_S_POLYGON_WRONG_ORIENTATION.md
- S_ALL_POLYGONS_WRONG_ORIENTATION: R_GE_S_ALL_POLYGONS_WRONG_ORIENTATION.md
- SOLID: R_GE_SO.md
theme:
name: material
language: de
favicon: img/citydoctor_logo.png
features:
- content.code.annotate
palette:
- media: "(prefers-color-scheme: light)"
primary: red
scheme: default
toggle:
icon: material/brightness-7
name: Dunkelmodus verwenden
- media: "(prefers-color-scheme: dark)"
scheme: slate
toggle:
icon: material/brightness-4
name: Hellen Modus verwenden
markdown_extensions:
- admonition
- toc:
permalink: true
- pymdownx.highlight:
anchor_linenums: true
- pymdownx.inlinehilite
- pymdownx.snippets
- pymdownx.superfences:
custom_fences:
-
name: mermaid
class: mermaid
format: !!python/name:pymdownx.superfences.fence_code_format
extra_css:
- https://unpkg.com/mermaid/dist/mermaid.css
extra_javascript:
- https://unpkg.com/mermaid/dist/mermaid.min.js
\ No newline at end of file
<!doctype html>
<html lang="de" class="no-js">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<link rel="icon" href="/img/citydoctor_logo.png">
<meta name="generator" content="mkdocs-1.4.2, mkdocs-material-9.0.6">
<title>CityDoctor2</title>
<link rel="stylesheet" href="/assets/stylesheets/main.558e4712.min.css">
<link rel="stylesheet" href="/assets/stylesheets/palette.2505c338.min.css">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback">
<style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style>
<link rel="stylesheet" href="https://unpkg.com/mermaid/dist/mermaid.css">
<script>__md_scope=new URL("/",location),__md_hash=e=>[...e].reduce((e,_)=>(e<<5)-e+_.charCodeAt(0),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script>
</head>
<body dir="ltr" data-md-color-scheme="default" data-md-color-primary="red" data-md-color-accent="">
<script>var palette=__md_get("__palette");if(palette&&"object"==typeof palette.color)for(var key of Object.keys(palette.color))document.body.setAttribute("data-md-color-"+key,palette.color[key])</script>
<input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
<input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
<label class="md-overlay" for="__drawer"></label>
<div data-md-component="skip">
</div>
<div data-md-component="announce">
</div>
<header class="md-header" data-md-component="header">
<nav class="md-header__inner md-grid" aria-label="Kopfzeile">
<a href="/." title="CityDoctor2" class="md-header__button md-logo" aria-label="CityDoctor2" data-md-component="logo">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54Z"/></svg>
</a>
<label class="md-header__button md-icon" for="__drawer">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3V6m0 5h18v2H3v-2m0 5h18v2H3v-2Z"/></svg>
</label>
<div class="md-header__title" data-md-component="header-title">
<div class="md-header__ellipsis">
<div class="md-header__topic">
<span class="md-ellipsis">
CityDoctor2
</span>
</div>
<div class="md-header__topic" data-md-component="header-topic">
<span class="md-ellipsis">
</span>
</div>
</div>
</div>
<form class="md-header__option" data-md-component="palette">
<input class="md-option" data-md-color-media="(prefers-color-scheme: light)" data-md-color-scheme="default" data-md-color-primary="red" data-md-color-accent="" aria-label="Dunkelmodus verwenden" type="radio" name="__palette" id="__palette_1">
<label class="md-header__button md-icon" title="Dunkelmodus verwenden" for="__palette_2" hidden>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 8a4 4 0 0 0-4 4 4 4 0 0 0 4 4 4 4 0 0 0 4-4 4 4 0 0 0-4-4m0 10a6 6 0 0 1-6-6 6 6 0 0 1 6-6 6 6 0 0 1 6 6 6 6 0 0 1-6 6m8-9.31V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12 20 8.69Z"/></svg>
</label>
<input class="md-option" data-md-color-media="(prefers-color-scheme: dark)" data-md-color-scheme="slate" data-md-color-primary="" data-md-color-accent="" aria-label="Hellen Modus verwenden" type="radio" name="__palette" id="__palette_2">
<label class="md-header__button md-icon" title="Hellen Modus verwenden" for="__palette_1" hidden>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 18c-.89 0-1.74-.2-2.5-.55C11.56 16.5 13 14.42 13 12c0-2.42-1.44-4.5-3.5-5.45C10.26 6.2 11.11 6 12 6a6 6 0 0 1 6 6 6 6 0 0 1-6 6m8-9.31V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12 20 8.69Z"/></svg>
</label>
</form>
<label class="md-header__button md-icon" for="__search">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z"/></svg>
</label>
<div class="md-search" data-md-component="search" role="dialog">
<label class="md-search__overlay" for="__search"></label>
<div class="md-search__inner" role="search">
<form class="md-search__form" name="search">
<input type="text" class="md-search__input" name="query" aria-label="Suche" placeholder="Suche" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required>
<label class="md-search__icon md-icon" for="__search">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12Z"/></svg>
</label>
<nav class="md-search__options" aria-label="Suche">
<button type="reset" class="md-search__icon md-icon" title="Zurücksetzen" aria-label="Zurücksetzen" tabindex="-1">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41Z"/></svg>
</button>
</nav>
</form>
<div class="md-search__output">
<div class="md-search__scrollwrap" data-md-scrollfix>
<div class="md-search-result" data-md-component="search-result">
<div class="md-search-result__meta">
Suche wird initialisiert
</div>
<ol class="md-search-result__list" role="presentation"></ol>
</div>
</div>
</div>
</div>
</div>
</nav>
</header>
<div class="md-container" data-md-component="container">
<main class="md-main" data-md-component="main">
<div class="md-main__inner md-grid">
<div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" >
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--primary" aria-label="Navigation" data-md-level="0">
<label class="md-nav__title" for="__drawer">
<a href="/." title="CityDoctor2" class="md-nav__button md-logo" aria-label="CityDoctor2" data-md-component="logo">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54Z"/></svg>
</a>
CityDoctor2
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="/." class="md-nav__link">
CityDoctor2
</a>
</li>
<li class="md-nav__item">
<a href="/requiredSoftware/" class="md-nav__link">
Installation
</a>
</li>
<li class="md-nav__item">
<a href="/firstRun/" class="md-nav__link">
Erster Start
</a>
</li>
<li class="md-nav__item">
<a href="/userInterface/" class="md-nav__link">
Nutzeroberfläche
</a>
</li>
<li class="md-nav__item">
<a href="/validationPlan/" class="md-nav__link">
Prüfplan
</a>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " data-md-toggle="__nav_6" type="checkbox" id="__nav_6" >
<label class="md-nav__link" for="__nav_6" tabindex="0" aria-expanded="false">
Anforderungen
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Anforderungen" data-md-level="1">
<label class="md-nav__title" for="__nav_6">
<span class="md-nav__icon md-icon"></span>
Anforderungen
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="/basic/" class="md-nav__link">
Grundbegriffe
</a>
</li>
<li class="md-nav__item">
<a href="/requirements/" class="md-nav__link">
Übersicht
</a>
</li>
<li class="md-nav__item">
<a href="/schemaRequirements/" class="md-nav__link">
Schemaanforderungen
</a>
</li>
<li class="md-nav__item">
<a href="/geometric/" class="md-nav__link">
Geometrische Anforderungen
</a>
</li>
<li class="md-nav__item">
<a href="/semantic/" class="md-nav__link">
Semantische Anforderungen
</a>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " data-md-toggle="__nav_6_6" type="checkbox" id="__nav_6_6" >
<label class="md-nav__link" for="__nav_6_6" tabindex="0" aria-expanded="false">
Details
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Details" data-md-level="2">
<label class="md-nav__title" for="__nav_6_6">
<span class="md-nav__icon md-icon"></span>
Details
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="/R_GE_R_TOO_FEW_POINTS/" class="md-nav__link">
R_TOO_FEW_POINTS
</a>
</li>
<li class="md-nav__item">
<a href="/R_GE_R_CONSECUTIVE_POINTS_SAME/" class="md-nav__link">
R_CONSECUTIVE_POINTS_SAME
</a>
</li>
<li class="md-nav__item">
<a href="/R_GE_R_NOT_CLOSED/" class="md-nav__link">
R_RING_NOT_CLOSED
</a>
</li>
<li class="md-nav__item">
<a href="/R_GE_R_SELF_INTERSECTION/" class="md-nav__link">
R_RING_SELF_INTERSECTION
</a>
</li>
<li class="md-nav__item">
<a href="/R_GE_R_COLLAPSED_TO_LINE/" class="md-nav__link">
R_COLLAPSED_TO_LINE
</a>
</li>
<li class="md-nav__item">
<a href="/R_GE_P_INTERSECTING_RINGS/" class="md-nav__link">
P_INTERSECTING_RINGS
</a>
</li>
<li class="md-nav__item">
<a href="/R_GE_P_NON_PLANAR/" class="md-nav__link">
P_NON_PLANAR
</a>
</li>
<li class="md-nav__item">
<a href="/R_GE_P_INTERIOR_DISCONNECTED/" class="md-nav__link">
P_INTERIOR_DISCONNECTED
</a>
</li>
<li class="md-nav__item">
<a href="/R_GE_P_HOLE_OUTSIDE/" class="md-nav__link">
P_HOLE_OUTSIDE
</a>
</li>
<li class="md-nav__item">
<a href="/R_GE_P_INNER_RINGS_NESTED/" class="md-nav__link">
P_INNER_RINGS_NESTED
</a>
</li>
<li class="md-nav__item">
<a href="/R_GE_P_ORIENTATION_RINGS_SAME/" class="md-nav__link">
P_ORIENTATION_RINGS_SAME
</a>
</li>
<li class="md-nav__item">
<a href="/R_GE_MS/" class="md-nav__link">
MULTI_SURFACE
</a>
</li>
<li class="md-nav__item">
<a href="/R_GE_S_TOO_FEW_POLYGONS/" class="md-nav__link">
S_TOO_FEW_POLYGONS
</a>
</li>
<li class="md-nav__item">
<a href="/R_GE_S_NOT_CLOSED/" class="md-nav__link">
S_NOT_CLOSED
</a>
</li>
<li class="md-nav__item">
<a href="/R_GE_S_NON_MANIFOLD_VERTEX/" class="md-nav__link">
S_NON_MANIFOLD_VERTEX
</a>
</li>
<li class="md-nav__item">
<a href="/R_GE_S_NON_MANIFOLD_EDGE/" class="md-nav__link">
S_NON_MANIFOLD_EDGE
</a>
</li>
<li class="md-nav__item">
<a href="/R_GE_S_MULTIPLE_CONNECTED_COMPONENTS/" class="md-nav__link">
S_MULTIPLE_CONNECTED_COMPONENTS
</a>
</li>
<li class="md-nav__item">
<a href="/R_GE_S_SELF_INTERSECTION/" class="md-nav__link">
S_SELF_INTERSECTION
</a>
</li>
<li class="md-nav__item">
<a href="/R_GE_S_POLYGON_WRONG_ORIENTATION/" class="md-nav__link">
S_POLYGON_WRONG_ORIENTATION
</a>
</li>
<li class="md-nav__item">
<a href="/R_GE_S_ALL_POLYGONS_WRONG_ORIENTATION/" class="md-nav__link">
S_ALL_POLYGONS_WRONG_ORIENTATION
</a>
</li>
<li class="md-nav__item">
<a href="/R_GE_SO/" class="md-nav__link">
SOLID
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" >
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--secondary" aria-label="Inhaltsverzeichnis">
</nav>
</div>
</div>
</div>
<div class="md-content" data-md-component="content">
<article class="md-content__inner md-typeset">
<h1>404 - Not found</h1>
</article>
</div>
</div>
</main>
<footer class="md-footer">
<div class="md-footer-meta md-typeset">
<div class="md-footer-meta__inner md-grid">
<div class="md-copyright">
Made with
<a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener">
Material for MkDocs
</a>
</div>
</div>
</div>
</footer>
</div>
<div class="md-dialog" data-md-component="dialog">
<div class="md-dialog__inner md-typeset"></div>
</div>
<script id="__config" type="application/json">{"base": "/", "features": ["content.code.annotate"], "search": "/assets/javascripts/workers/search.e5c33ebb.min.js", "translations": {"clipboard.copied": "In Zwischenablage kopiert", "clipboard.copy": "In Zwischenablage kopieren", "search.result.more.one": "1 weiteres Suchergebnis auf dieser Seite", "search.result.more.other": "# weitere Suchergebnisse auf dieser Seite", "search.result.none": "Keine Suchergebnisse", "search.result.one": "1 Suchergebnis", "search.result.other": "# Suchergebnisse", "search.result.placeholder": "Suchbegriff eingeben", "search.result.term.missing": "Es fehlt", "select.version": "Version ausw\u00e4hlen"}}</script>
<script src="/assets/javascripts/bundle.51d95adb.min.js"></script>
<script src="https://unpkg.com/mermaid/dist/mermaid.min.js"></script>
</body>
</html>
\ 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