Bachelorarbeit Weiterentwicklung und Implementie- rung eines Analysetools zum Tras- sieren von vorhandenen und zu pla- nenden Verkehrswegen in das vor- handene (E)DCC-Modell Verfasser: Janek Greif Studiengang: Softwaretechnik B. Sc. Prüfer: Prof. Dr. Stefan Wagner Zweitprüfer: Prof. Dr.-Ing. Ullrich Martin Betreuer: Vitali Schuk, M. Sc. Stuttgart, den 18. Dezember 2020 stud E-2020/21 Bachelorarbeit Janek Greif Erklärung Seite I Erklärung Hiermit erkläre ich, dass ich die von mir am heutigen Tage eingereichte Bachelorarbeit selbst- ständig verfasst habe, dass ich keine anderen als die angegebenen Quellen benutzt und alle wörtlich oder sinngemäß aus anderen Werken übernommenen Aussagen als solche gekenn- zeichnet habe, dass die eingereichte Bachelorarbeit weder vollständig noch in wesentlichen Teilen Gegenstand eines anderen Prüfungsverfahrens gewesen ist, dass ich die Bachelorar- beit weder vollständig noch in Teilen bereits veröffentlicht habe und dass das elektronische Exemplar mit den anderen Exemplaren übereinstimmt. Stuttgart, den 18. Dezember 2020 ................................................ Unterschrift Janek Greif Hinweis Eine Vervielfältigung oder Weitergabe insbesondere in digitalisierter Form sowie eine Veröf- fentlichung bedarf des Einverständnisses der Verfasserin bzw. des Verfassers im Benehmen mit dem Institut für Eisenbahn- und Verkehrswesen der Universität Stuttgart (IEV). Auch wenn in die vorliegende Arbeit grundsätzlich die Fachkompetenz des IEV eingeflossen ist, obliegt die Verantwortung für den gesamten Inhalt und dessen Darstellung ausschließlich der Verfas- serin bzw. dem Verfasser. Bei der Arbeit handelt es sich um eine bewertete Studienleistung, die nicht zwangsläufig inhaltlich und qualitativ die fachlichen Ansichten des IEV widerspiegelt. Ein Anspruch auf Einsichtnahme in die Bewertung der Arbeit besteht für Dritte regelmäßig nicht. Sofern die Arbeit nicht mit einem noch nicht abgelaufenen Sperrvermerk versehen ist, kann ein Druckexemplar nach vorheriger Terminvereinbarung in der Präsenzbibliothek des IEV eingesehen werden. Bachelorarbeit Janek Greif Aufgabenstellung Seite II Aufgabenstellung Thema: Weiterentwicklung und Implementierung eines Analysetools zum Trassieren von vor- handenen und zu planenden Verkehrswegen in das vorhandene EDCC-Modell Further Development and Implementation of an Analysis Tool for Routing Existing and Planned Traffic Routes into the Existing EDCC Model Am Institut für Eisenbahn- und Verkehrswesen wurde der Modellansatz (EDCC = Environment, Discretization, Categorization and Characterization) zur Analyse des Bahnkörpers entwickelt. Hierzu wurde bereits ein Studienprojekt durchgeführt, in dessen Rahmen eine grafenbasierte Datenbank-Implementierung des (E)DCC-Modells auf Basis einer OrientDB Technologie um- gesetzt wurde. Neben der Implementierung einer Datenbank in das (E)DCC-Modell, sollen auch leistungsfähige Planungstools entwickelt werden. U. a. soll ein Analyse-Tool zum Tras- sieren von vorhandenen und zu planenden Verkehrswegen im Grund- und Aufriss entwickelt und integriert werden, welches bereits prototypmäßig vorhanden ist. Das Ziel dieser Arbeit ist die Weiterentwicklung eines vorhandenen Trassierungstools zur Aus- legung eines Verkehrsweges (Schiene & Straße) im Grund- (Lageplan) und Aufriss (Höhen- plan). Dabei sollen zunächst die noch für das Trassierungstool erforderlichen Daten in die vorhandene Datenbank aufgenommen und zwischen den Daten sogenannte Abhängigkeiten angelegt sowie mit Hilfe des Modellierungswerkzeuges Enterprise Architect formal strukturiert beschrieben werden. Anschließend ist das oben genannte Tool gemäß den Vorgaben der Richtlinie 800.0110 „Linienführung“ der DB AG und der „TRStrab Trassierung“ sowie den Vor- gaben der RAL 12, RAA 08 & RASt 06 mit der Programmiersprache Java weiterzuentwickeln und anhand von Beispielen auf die richtige Funktionsweise zu validieren. Im Einzelnen wird verlangt: ▪ Untersuchen Sie zuerst wie die für die Weiterentwicklung des Tools nötigen Datens- ätze in das bestehende Datenbankmodell integriert werden können und tragen Sie die zugehörigen Daten inkl. Parameter & Attribute in die (E)DCC-Datenbank ein. Legen Sie zusätzlich unter Zuhilfenahme des Betreuers zwischen den eingefügten Daten so- genannte Abhängigkeiten an. Die dadurch in der Datenbank entstehende Daten- struktur ist im Vorfeld mit dem Betreuer abzustimmen. Beschreiben Sie die in die Datenbank eingetragenen Daten und Abhängigkeiten mit Hilfe von Klassendiagram- men oder ähnlichem. Bachelorarbeit Janek Greif Aufgabenstellung Seite III ▪ Überlegen Sie sich als nächstes, wie man entlang des zu planenden Verkehrsweges Übergangsstellen und Sonderabschnitte in Form von baulichen Anlagen (Tunnel, Brücken) und Änderungen im Oberbau (z. B. FF, SchO, Änderung des Gleisrostes, der Befestigungsart und der Schwellenart) berücksichtigen könnte, und setzen Sie dies um. ▪ Erweitern Sie das vorhandene Trassierungstool, welches eine verkehrsträgerüber- greifende Trassierung der Verkehrswege im Grund- und Aufriss inkl. Krümmungs-, Überhöhungs-, Querneigungs-, Beschleunigungs- und Geschwindigkeitsband ermög- licht. Die Trasse ist dabei sowohl im Arbeitsfeld des Trassierungswerkzeugs als auch in Form eines sogenannten Diskretisierungsgraphs zu visualisieren. Bei der Weiterentwicklung des Trassierungstools sind die in Verbindung mit (E)DCC-Daten- bank gebrachten zwei Entwurfsmodi (geführter und individueller Entwurfsvorgang) zwingend zu berücksichtigen. ▪ Berücksichtigen Sie bei der Weiterentwicklung des Trassierungstools die sogenannte „Freie Attributierung & Parametrierung“ der Trasse. ▪ Bauen Sie in dem weiterzuentwickelnden Tool die Funktion für das Importieren und Exportieren von Geodaten inkl. Geoinformationen sowie digitalen Karten [wie Lie- genschaftskarte/ Katasterkarte, Luftbild, topografische Karte] mit und ohne darauf lie- gender Trasse in den gängigen (BIM-)Formaten mit einer maßstabsgetreuen Geore- ferenzierung ein. Prüfen Sie in diesem Zuge darüber hinaus, inwiefern sich die Da- tensätze der gesamten geplanten Trassierung BIM-fähig importieren und exportie- ren lassen und setzen Sie diese Funktion um. Hinsichtlich der BIM-Fähigkeit sind bei Bedarf VDI-Richtlinien einzuhalten. ▪ Berücksichtigen Sie, dass die im Trassierungstool entstehenden Daten in einer Pro- jektdatei in der Datenbank abgelegt und verwaltet werden sollen. Die genaue Metho- dik hierzu wird parallel zu dieser Bachelorarbeit erarbeitet. Export- und Importfunktion sind ebenfalls vorzusehen. ▪ Entwickeln Sie in dem Trassierungstool prototypisch die Importfunktion für ein soge- nanntes Digitales Gelände Modell [DGM], und hinterlegen sie dieses im Trassie- rungstool zur Trassenbestimmung eines Verkehrsweges. ▪ Verbinden Sie das von Ihnen entwickelte Trassierungstool mit dem Tool zur Ein- zelfehlerdetektion, welches bereits in dem PULTrack eingebaut ist. ▪ Die Benutzeroberfläche des gesamten Trassierungstools ist benutzerfreundlich unter Berücksichtigung der „8 Goldenen Regeln“ auszulegen. ▪ Validieren Sie das von Ihnen entwickelten Tool in Absprache mit dem Betreuer anhand von drei geplanten Verkehrswegen, welche in der Praxis bereits umgesetzt sind. ▪ Stellen Sie Ihre Ergebnisse strukturiert zusammen, u. a. mittels der UML- Bachelorarbeit Janek Greif Aufgabenstellung Seite IV Diagramme, so dass die Implementierung der neuen Tools für die Weiterentwicklung und Wartung der Software leicht verständlich ist. Hierbei sind ein Benutzerhand- und Entwicklerhandbuch zu erstellen. Der Code muss hinreichen dokumentiert sein. ▪ Stellen Sie Ihre Vorgehensweise, Methoden, Ergebnisse o. Ä. mithilfe der Soft- ware Enterprise Architect von Beginn an strukturiert zusammen, sodass darauf aufbauend weiterführende Untersuchungen durchgeführt werden können. Das Ziel ist dabei, Fließtexte, Tabellen und Abbildungen außerhalb der strukturierten Darstellung auf das notwendige Mindestmaß zu begrenzen. Bachelorarbeit Janek Greif Inhaltsverzeichnis Seite V Inhaltsverzeichnis Erklärung ............................................................................................................................... I Hinweis .................................................................................................................................. I Aufgabenstellung ................................................................................................................ II Inhaltsverzeichnis ................................................................................................................ V Abbildungsverzeichnis ...................................................................................................... VII Tabellenverzeichnis ............................................................................................................ IX Abkürzungsverzeichnis ....................................................................................................... X Kurzfassung ........................................................................................................................ XI Abstract ............................................................................................................................... XI 1 Einleitung ................................................................................................................... 1 2 (E)DCC-Ansatz und die Software PULTrack ............................................................ 3 2.1 (E)DCC-Modell ........................................................................................................ 3 2.2 Software PULTrack .................................................................................................. 4 3 Trassierungstool ....................................................................................................... 5 3.1 Graphische Oberfläche ............................................................................................ 5 3.2 Trassierungselemente ............................................................................................. 6 3.2.1 Geraden .................................................................................................................. 7 3.2.2 Kreisbogen .............................................................................................................. 8 3.2.3 Übergangsbogen ................................................................................................... 10 3.3 Trassieren.............................................................................................................. 15 3.4 Updates ................................................................................................................. 16 3.5 Relevante Knoten und Kanten für das Trassierungstool ........................................ 17 4 Projekt ...................................................................................................................... 17 4.1 Persistente Speicherung ........................................................................................ 17 4.1.1 Neues Projekt anlegen .......................................................................................... 19 4.1.2 Projekt öffnen ........................................................................................................ 20 4.2 Datenstruktur ......................................................................................................... 21 4.3 Erstellung .............................................................................................................. 23 Bachelorarbeit Janek Greif Inhaltsverzeichnis Seite VI 4.4 Vorschriftenauswahl .............................................................................................. 25 5 Funktionen und Prädikate ...................................................................................... 29 5.1 Allgemeine Funktionen .......................................................................................... 29 5.1.1 Script-Funktion ...................................................................................................... 31 5.1.2 Tag-Funktion ......................................................................................................... 34 5.1.3 Script-Funktion vs Tag-Funktion ............................................................................ 35 5.1.4 Zusammenbau der Funktionen .............................................................................. 35 5.1.5 Zusätzliche Checks ................................................................................................ 36 5.1.6 Beispiel .................................................................................................................. 36 5.2 Prädikate für globale Parameter ............................................................................ 38 5.2.1 Regeln ................................................................................................................... 38 5.2.2 Regeln-Format ....................................................................................................... 39 6 Anwendungsdesign ................................................................................................ 41 6.1 Java-Module .......................................................................................................... 42 6.2 Dependency Injection ............................................................................................ 45 6.2.1 Resource Loader ................................................................................................... 45 6.2.2 View Controller und View Dialog ............................................................................ 45 6.2.3 File Reader und File Writer .................................................................................... 45 6.2.4 Datenbankinteraktion ............................................................................................. 46 6.2.5 Asynchrone Tasks ................................................................................................. 46 7 Ausblick ................................................................................................................... 46 Quellenverzeichnis ............................................................................................................ 48 Anhang A Berechnungen ................................................................................................ 1 Anhang B Benutzerhandbuch ......................................................................................... 2 Bachelorarbeit Janek Greif Abbildungsverzeichnis Seite VII Abbildungsverzeichnis Abbildung 1: Gliederung der Arbeit (Quelle: Eigene Darstellung) ........................................... 2 Abbildung 2 Ebenen der Datenbank (Quelle: IEV) ................................................................. 3 Abbildung 3: Statische Softwarearchitektur der Software PULTrack (Quelle: IEV) ................. 4 Abbildung 4: Idee des (E)DCC-Modellansatzes für die streckenbezogene Planung von Eisenbahninfrastrukturen (Quelle: IEV) .................................................................................. 5 Abbildung 5 Erstellen einer Geraden, ohne Anpassung des rechten Punktes (Quelle: Eigene Darstellung) ........................................................................................................................... 7 Abbildung 6 Erstellen einer Geraden, mit Anpassung des rechten Punktes (Quelle: Eigene Darstellung) ........................................................................................................................... 8 Abbildung 7 Erstellung eines Kreisbogens, ohne Richtungsvektor am linken Punkt (Quelle: Eigene Darstellung) ............................................................................................................... 8 Abbildung 8 Zwei tangential anschließende Kreisbögen (Quelle: Eigene Darstellung) ......... 10 Abbildung 9 Übergangsbogen zwischen einer Geraden und einem Kreisbogen (Quelle: Eigene Darstellung) ............................................................................................................. 13 Abbildung 10 Übergangsbogen zwischen Kreisbogen und Gerade (Quelle: Eigene Darstellung) ......................................................................................................................... 13 Abbildung 11 Wendeübergangsbogen (Quelle: Eigene Darstellung) .................................... 14 Abbildung 12: Trassierung eines Verkehrsweges durchführen (Quelle: Eigene Darstellung in Anlehnung an IEV) ............................................................................................................... 15 Abbildung 13 Strecke bevor Änderung (Quelle: Eigene Darstellung) ................................... 16 Abbildung 14 Strecke nach einer Änderung (Quelle: Eigene Darstellung) ............................ 16 Abbildung 15: Verbindungskanten der Trassierung und Funktionen (Quelle: Eigene Darstellung) ......................................................................................................................... 17 Abbildung 16: Neues Projekt anlegen (Quelle: Eigene Darstellung in Anlehnung an IEV) .... 19 Abbildung 17: Projekt öffnen (Quelle: Eigene Darstellung in Anlehnung an IEV).................. 20 Abbildung 18 Projekt öffnen Dialog (Quelle: Eigene Darstellung) ......................................... 21 Abbildung 19: Datenstruktur des Projektes (Quelle: Eigene Darstellung) ............................. 23 Abbildung 20 Neues Projekt anlegen Dialog (Quelle: Eigene Darstellung) ........................... 25 Abbildung 21 Struktur einer gruppierten Vorschrift. (Quelle: Eigene Darstellung) ................. 26 Abbildung 22 Struktur einer gruppenlosen Vorschrift. (Quelle: Eigene Darstellung) ............. 27 Abbildung 23 Struktur einer individuellen Richtlinie. (Quelle: Eigene Darstellung) ................ 27 Bachelorarbeit Janek Greif Abbildungsverzeichnis Seite VIII Abbildung 24 Richtlinienauswahl für ein neues Projekt (Quelle: Eigene Darstellung) ........... 28 Abbildung 25 Klassendiagramm der Funktionen (Quelle: Eigene Darstellung) ..................... 31 Abbildung 26 Abtract Syntax Tree der Script-Funktionen (Quelle: Eigene Darstellung) ........ 33 Abbildung 27 Objektdiagramm der X Position des Übergangsbogen nach Bloss 2 (Quelle: Eigene Darstellung) ............................................................................................................. 37 Abbildung 28 Klassendiagramm des Regel-Formates (Quelle: Eigene Darstellung) ............ 39 Abbildung 29 Abhängigkeiten der Java-Module (Quelle: Eigene Darstellung) ...................... 44 Bachelorarbeit Janek Greif Tabellenverzeichnis Seite IX Tabellenverzeichnis Tabelle 1: Übergangsbogen als Klothoide (Quelle: IEV) ...................................................... 10 Tabelle 2: Übergangsbogen nach Bloss (Quelle: IEV) ......................................................... 11 Tabelle 3: Übergangsbogen nach Schramm (Quelle: IEV) ................................................... 11 Bachelorarbeit Janek Greif Abkürzungsverzeichnis Seite X Abkürzungsverzeichnis AST Abstract Syntax Tree EBNF Extended Backus–Naur Form HTML HyperText Markup Language IEV Institut für Eisenbahn-und Verkehrswesen der Universität Stuttgart IFC Industry Foundation Classes JSON JavaScript Object Notation POJO Plain Old Java Object SQL Structured Query Language UML Unified Modeling Language UUID Universal Unique Identifier XML Extensible Markup Language (E)DCC Bachelorarbeit Janek Greif Kurzfassung Seite XI Kurzfassung Diese Arbeit befasst sich mit der Darstellung und Verwendung von Vorschriften für das Planen und Warten von Verkehrswegen. Dazu wird die Datenbank erweitert um die Vorschriften als Abhängigkeit zwischen einzelnen Parametern darzustellen, und diese Parameter in Relation zueinander zu stellen, indem allgemeine logische Ausdrücke formuliert werden können, die von der Anwendung ausgewertet werden. Verwendet wird diese Mechanik, um Strecken er- stellen zu können, die diesen Vorschriften entsprechen und dadurch, dass die Vorschriften in einer Datenbank abgelegt sind, können auch neue Vorschriften hinzugefügt werden, ohne große Änderungen in der Anwendung durchführen zu müssen. Dazu muss die Anwendung in der Lage sein, die Grundelemente der Trassierung berechnen und anzeigen zu können. Die angelegten Strecken werden in Projekten gespeichert, und diese in der Datenbank abgelegt. Abstract This bachelor thesis deals with the representation and use of regulations for planning and maintenance of traffic routes. For this purpose, the database is extended to represent the reg- ulations as dependencies between individual parameters, and to relate these parameters to each other by formulating general logical expressions that are evaluated by the application. This mechanism is used to create routes that comply with these rules and, because the rules are stored in a database, new rules can be added without having to make major changes to the application. To do this, the application must be able to calculate and display the basic elements of the routing. The created routes are saved in projects, and these are stored in the database. Bachelorarbeit Janek Greif Einleitung Seite 1 1 Einleitung In der Gegenwart der Mobilitätswende sind Änderungen der Verkehrswege unvermeidlich. Schienen- und Straßenverkehrswege werden geplant oder gewartet. Währenddessen dürfen aber nicht die rechtlichen Grundlagen außer Acht gelassen werden. Diese Arbeit erweitert eine Anwendung, die mithilfe einer Graphdatenbank diese rechtlichen Abhängigkeiten darstellt. Dazu wird zum einen die Datenbank an sich erweitert, indem ein System hinzugefügt wird, um Abhängigkeiten so darzustellen, dass die Anwendung diese lesen und auswerten kann. Au- ßerdem können Trassierungsverläufe im Grundriss für verschiedene Verkehrsträger erstellt werden, die diese Abhängigkeiten benutzt. Die Trassierungsverläufe werden in einem Projekt abgelegt, welches in der Datenbank ge- speichert wird. Bachelorarbeit Janek Greif Einleitung Seite 2 Abbildung 1: Gliederung der Arbeit (Quelle: Eigene Darstellung) Bachelorarbeit Janek Greif (E)DCC-Ansatz und die Software PULTrack Seite 3 2 (E)DCC-Ansatz und die Software PULTrack 2.1 (E)DCC-Modell Das Modell erzielt die Daten als Baum darzustellen. Die einzelnen Ebenen des Baumes wer- den in Gruppen unterteilt, um durch die erhöhte Struktur eine bessere Ordnung der Daten zu erzielen. (E)DCC ist ein Akronym aus den Startbuchstaben der Ebenen: Enviroment Layer, Discretization Layer, Categorization Layer und Characterization Layer. Diese Ebenen sind selbst noch einmal in Unterebenen unterteilt, um eine feinere Kontrolle über die Platzie- rung der Knoten zu erhalten. Zwischen den Ebenen werden zwei verschiedene Kanten verwendet. Die Navigations- kante ordnet die Knoten in den Ebenen an. Dabei kann jede in der Datenbank abgelegte Komponente durch Durchlaufen der Navigationskanten vom Start aus erreicht werden. Die Verbindungskante zeigt Abhängigkeiten zwischen Knoten an, die außerhalb der Struktur der Ebenen liegen. Die Art der Abhängigkeit wird durch die konkrete Klasse der Kante ange- geben. Abbildung 2 Ebenen der Datenbank (Quelle: IEV) Abbildung 2 Ebenen der Datenbank zeigt die Ebenen und deren Unterebenen beziehungs- weise Gruppierungen. Bachelorarbeit Janek Greif (E)DCC-Ansatz und die Software PULTrack Seite 4 2.2 Software PULTrack Abbildung 3: Statische Softwarearchitektur der Software PULTrack (Quelle: IEV) Unterteilt ist die Anwendung nach der graphischen Oberfläche, der Business-Logik und der Datenbank. Als Framework für die Benutzeroberfläche wird JavaFX gewählt. Als Datenbank- managementsystem wurde die OrientDB Community Edition gewählt. Sie ist in die Anwendung integriert, wodurch keine Netzwerkkommunikation zwischen Anwendung und Datenbank er- forderlich ist. Dies ermöglicht eine Offline-Benutzung der Anwendung. Die Business-Logik selbst ist in verschiedene Komponenten unterteilt. Die logischen Pla- nungswerkzeuge sind dabei die verschiedenen Tools, die dem Benutzer zur Verfügung ste- hen. Diese kommunizieren mit internen Komponenten, die mit den Informationen aus der Da- tenbank die Aufgaben der Tools bearbeiten. Dabei wird gibt es keine direkte Kommunikation zwischen der Benutzeroberfläche und der Datenbank. Bachelorarbeit Janek Greif Trassierungstool Seite 5 3 Trassierungstool Abbildung 4: Idee des (E)DCC-Modellansatzes für die streckenbezogene Planung von Eisenbahninfra- strukturen (Quelle: IEV) Mit der Anwendung sollen bestehende und zu planende Trassen bearbeitet werden. Dazu soll der Planer aus einzelne Trassierungselemente eine Trasse (Achse) erstellen und bearbeiten können. Jedes Trassierungselement hat deswegen seine eigenen globalen Parameter, die aus der Datenbank geladen werden. Mit diesen Parametern können den einzelnen Elementen generische Informationen zugewiesen werden, sowie Regeln, die mit diesen Informationen arbeiten. Es wird darauf geachtet, dass die Anwendung generisch zu implementieren und als Informationsquelle die Datenbank zu befragen. Damit kann ein Planer die verschiedenen An- hängigkeiten modellieren, ohne direkt an der Anwendung Änderungen durchzuführen. 3.1 Graphische Oberfläche Aufgeteilt ist die Oberfläche in zwei Teile, der Projektbaum und das Arbeitsfeld. Der Projekt- baum besteht aus DraftElementSelections, welche die Hierarchie des Projekts Bachelorarbeit Janek Greif Trassierungstool Seite 6 widerspiegeln. Jeder Verkehrsträger hat eine Unterebene für seine Varianten, die durch ein Kontextmenü erstellt werden, das mit einem Rechtsklick auf den Verkehrsträger geöffnet wird. Das Kontextmenü der Variante erlaubt es dem Benutzer eine neue Achse anzulegen. Der Dialog dafür erwartet den Namen, eine Beschreibung und den globalen Parameter Achstyp (ID: achstyp). Dort können auch die für den Verkehrsträger relevanten Vorschriften angese- hen werden, sowie die verwendeten Funktionen der Trassierungselemente und die globalen Parameter der Parametergruppe Grenzwerte (ID: limits) eingestellt werden. Dieser Dialog kann durch den Kontextmenu der Achse wieder aufgerufen werden. Die angezeigten Formeln werden gruppiert nach Parametergruppen, dann Parametername der Auswahlgruppe, dann Auswahlelement der Auswahlgruppe und letztendlich nach der ID der Funktionskante. Es werden nur Funktionen angezeigt, deren display Attribut einen Wert haben. Dadurch kann für aufgeteilte Funktionen nur der Eintrag, der die ganze Funktion dar- stellt, angezeigt werden. Das display Attribut wird als Latex-Text formuliert. Dabei müssen Fließkommazahlen als Dezimalindikator den Punkt verwenden. Die Anwendung übersetzt die Zahlen dann in die Anzeigesprache. Intern wird der Latex-Text nach MathML übersetzt und dann in ein Rasterbild transformiert, welches letztendlich angezeigt wird. Für alle DraftElementSelections außer dem Projekt, kann der Name direkt im Projekt- baum abgeändert werden. Nachdem eine Achse erstellt worden ist, kann diese ausgewählt werden. Es kann maximal eine Achse ausgewählt sein. Aktionen im Arbeitsfeld benutzen die ausgewählte Achse, wes- wegen immer eine Achse ausgewählt sein muss, um Aktionen im Arbeitsfeld durchzuführen. Die Hauptaktion im Arbeitsfeld ist das Setzen eines Punktes. Die Koordinaten des Punktes werden von den Mauskoordinaten übernommen und der Richtungsvektor ist noch nicht ge- setzt. Sobald der zweite Punkt gesetzt ist, wird der Benutzer aufgefordert, ein Trassierungs- element auszuwählen, welches zwischen den beiden Punkten platziert werden soll. Im Folgenden wird die Bezeichnung von linken und rechten Elementen benutzt. Das linke Ele- ment eines Trassierungselementes ist das in Trassierungsrichtung vorfolgende Element und das rechte Element ist das in Trassierungsrichtung nachfolgende Element. 3.2 Trassierungselemente Alle Trassierungselemente erben von einem gemeinsamen abstrakten Element. Unter dem Begriff Trassierungselement versteht man „Teilstück des Gleises mit entweder vertikalem Bachelorarbeit Janek Greif Trassierungstool Seite 7 Verlauf, horizontalem Verlauf oder Überhöhung; einer eindeutigen mathematischen Beschrei- bung als Funktion der Kilometrierung folgend Anmerkung 1 zum Begriff: Soweit nicht anders angegeben, sind die der Linienführung zuge- hörigen Parameter für die Gleismittellinie definiert und die Weglänge wird auf der Grundlage der Projektion der Gleismittellinie in die horizontale Ebene definiert.“1 3.2.2 Geraden Sollte der linke Punkt keinen Richtungsvektor haben, kann die Gerade genau zwischen den beiden Punkten generiert werden, ohne dass ein Punkt verschoben werden muss. Abbildung 5 Erstellen einer Geraden, ohne Anpassung des rechten Punktes (Quelle: Eigene Darstellung) Beide Punkte erhalten dann den Richtungsvektor: 𝑑 = 𝑝𝑟 − 𝑝𝑙 |𝑝𝑟 − 𝑝𝑙| (3.1) Im Falle, dass der linke Punkt ein Richtungsvektor besitzt, wird der rechte Punkt verschoben und erhält denselben Richtungsverkehr wie der linke Punkt: 𝑝𝑟 = 𝑝𝑙 + 𝑑𝑙 ⃗⃗ ⃗⃗ ⋅ |𝑝𝑟 − 𝑝𝑙| (3.2) 1 DIN EN 13 803 (2014), S. 7 Bachelorarbeit Janek Greif Trassierungstool Seite 8 Abbildung 6 Erstellen einer Geraden, mit Anpassung des rechten Punktes (Quelle: Eigene Darstellung) 𝑑 ist der normalisierte Richtungsvektor beider Punkte. 𝑝𝑟 ist die Position des rechten Punktes im globalen Koordinatensystem. Die errechnete Länge der Gerade wird im globalen Parameter mit ID laenge abgelegt. Das Bearbeiten dieses Parameters ändert die Länge und somit auch die Position des rechten Punktes, wodurch sich alle folgenden Trassierungselemente verschieben. 3.2.3 Kreisbogen Kreisbogen ist ein „gekrümmtes Trassierungselement mit konstanter Krümmung“2. Sollte der linke Punkt keinen Richtungsvektor haben, wird der Benutzer aufgefordert zusätzlich den Radius des Kreisbogens einzugeben. Abbildung 7 Erstellung eines Kreisbogens, ohne Richtungsvektor am linken Punkt (Quelle: Eigene Dar- stellung) Der Radius ist vorzeichenbehaftet und gibt an, auf welcher Seite das Zentrum des Kreisbogens liegt. Die Position des Zentrums wird dann berechnet mit: 2 DIN EN 13 803 (2014), S. 7 Bachelorarbeit Janek Greif Trassierungstool Seite 9 𝑡𝑟: 𝑅2 → 𝑅2: ( 𝑥 𝑦 ) ⟼ ( −𝑦 𝑥 ) 𝑝𝑚 = 𝑝𝑟 + (𝑝𝑙 − 𝑝𝑟)/2 𝑑𝑐 ⃗⃗⃗⃗⃗ = 𝑡𝑟(𝑝𝑟 − 𝑝𝑙) |𝑝𝑟 − 𝑝𝑙| 𝑝𝑚𝑝𝑐̅̅ ̅̅ ̅̅ ̅ = √𝑟2 − |𝑝𝑚 − 𝑝𝑙|2 𝑝𝑐 = 𝑑𝑐 ⃗⃗⃗⃗⃗ ⋅ 𝑝𝑚𝑝𝑐̅̅ ̅̅ ̅̅ ̅ ⋅ 𝑟 |𝑟| (3.3) 𝑡𝑟 ist eine Funktion, die einen Vektor um 90° gegen den Uhrzeigersinn dreht, 𝑝𝑚 ist der Mittel- punk zwischen 𝑝𝑙 und 𝑝𝑟, 𝑑𝑐 ⃗⃗⃗⃗⃗ ist der normalisierte Vektor in Richtung des Kreiszentrums, 𝑝𝑚𝑝𝑐̅̅ ̅̅ ̅̅ ̅ ist die Länge der Strecke vom Mittelpunkt bis zum Kreiszentrum und 𝑝𝑐 ist die Position des Kreiszentrums. Sollte 𝑝𝑚𝑝𝑐̅̅ ̅̅ ̅̅ ̅ keine reelle Zahl sein, kann kein Kreisbogen mit diesem Radius zwischen den beiden Punkten aufgespannt werden. In dem Fall wird der rechte Punkt ange- nähert, sodass die Distanz zwischen 𝑝𝑙 und 𝑝𝑟 gleich 2 ⋅ 𝑟 ist. Die Richtungsvektoren der bei- den Punkte ist die um 90° gedrehte und normalisierte Richtung zum Kreiszentrum. Sollte der linke Punkt ein Richtungsvektor aufweisen, wird keine zusätzliche Radiuseingabe gefordert. Wenn der rechte Punkt auf einer Geraden liegt, die von der Position und der Rich- tung des linken Punktes aufgespannt wird, kann kein Kreisbogen generiert werden. Stattdessen wird eine Gerade generiert. Ansonsten kann der Kreisbogen eindeutig bestimmt werden. 𝑐: (𝑅2, 𝑅2) → 𝑅: ( 𝑑𝑥 𝑑𝑦 ) , ( 𝑏𝑥 𝑏𝑦 ) ⟼ 𝑏𝑥 2 + 𝑏𝑦 2 2 ⋅ (𝑑𝑥 ⋅ 𝑏𝑥 + 𝑑𝑦 ⋅ 𝑏𝑦) 𝑝𝑙𝑝𝑐̅̅ ̅̅ ̅̅ = 𝑐(𝑑𝑐 ⃗⃗⃗⃗⃗, 𝑝𝑟 − 𝑝𝑙) 𝑝𝑐 = 𝑝𝑙 + 𝑡𝑟(𝑑𝑙) ⋅ 𝑝𝑙𝑝𝑐̅̅ ̅̅ ̅̅ (3.4) 𝑐 berechnet die Distanz zum Kreiszentrum anhand der Richtung zum Zentrum und einem Vek- tor vom linken zum rechten Punkt, 𝑝𝑙𝑝𝑐̅̅ ̅̅ ̅̅ ist die Distanz vom linken Punkt zum Kreiszentrum und 𝑝𝑐 ist die Position des Kreiszentrums. Bachelorarbeit Janek Greif Trassierungstool Seite 10 Abbildung 8 Zwei tangential anschließende Kreisbögen (Quelle: Eigene Darstellung) 3.2.4 Übergangsbogen Der Übergangsbogen ist ein Trassierungselement, welches nur zwischen Nicht-Übergangsbö- gen vorkommen kann. Außerdem kann er auch nicht zwischen zwei Geraden verwendet wer- den. Die DIN EN 13 803 definiert den Übergangsbogen als „Trassierungselement, bei dem sich die Krümmung abhängig von der Kilometrierung ändert“3. In der Software PULTrack wur- den folgende Übergangsbogenarten in der Datenbank modelliert: Übergangsbogen Klothoide 1 Fresnel`sche Integrale (klassische Klothoide) 𝑥 = ∫ cos( 𝐿2 2 ∙ 𝐴2 ) 𝑙𝑅 0 𝑑𝐿 𝑦 = ∫ sin( 𝐿2 2 ∙ 𝐴2 ) 𝑙𝑅 0 𝑑𝐿 2 Taylor-Reihen (Klothoide) 𝑥 = √𝑙𝑅 ∙ 𝑟 ∙ √2 ∙ 𝜏 ∙ (1 − 𝜏2 5 ∙ 2! + 𝜏4 9 ∙ 4! − 𝜏6 13 ∙ 6! ± ⋯ ) 𝑦 = √𝑙𝑅 ∙ 𝑟 ∙ √2 ∙ 𝜏 ∙ ( 𝜏 3 − 𝜏3 7 ∙ 3! + 𝜏5 11 ∙ 5! − 𝜏7 15 ∙ 7! ± ⋯ ) 3 Kubische Parabel (Para- bel 3.ordnung) (Klothoide) 𝑦 = 𝑥3 6 ∙ 𝑟 ∙ 𝑙𝑅 ; 𝑔𝑢𝑡𝑒 𝑁äℎ𝑒𝑟𝑢𝑛𝑔 𝑤𝑒𝑛𝑛 𝑙𝑅 ≤ 𝑟 3,5 Tabelle 1: Übergangsbogen als Klothoide (Quelle: IEV) Übergangsbogen nach Bloss (s-förmig) 3 DIN EN 13 803 (2014), S. 7 Bachelorarbeit Janek Greif Trassierungstool Seite 11 1 nach Bloss (Parabel 5.Ordnung) 𝑦 = 𝑥4 4 ∙ 𝑟 ∙ 𝑙𝑅𝐵 2 − 𝑥5 10 ∙ 𝑟 ∙ 𝑙𝑅𝐵 3 2 nach Bloss (Cosinus- Funktion) 𝑦 = 𝑥2 4 ∙ 𝑟 + 𝑙𝑅𝐵 2 2 ∙ 𝑟 ∙ 𝜋2 ∙ cos ( 𝜋 𝑙𝑅𝐵 ∙ 𝑥) − 𝑙𝑅𝐵 2 2 ∙ 𝑟 ∙ 𝜋2 3 nach Bloss (Fres- nel`sche Integrale) 𝑥 = ∫ cos τ(𝑙𝑅𝐵) 𝑙𝑅𝐵 0 𝑑𝑙𝑅𝐵 𝑦 = ∫ sin 𝜏(𝑙𝑅𝐵) 𝑙𝑅𝐵 0 𝑑𝑙𝑅𝐵 mit 𝜏 = ∫ k (𝑙𝑅𝐵) 𝑙𝑅𝐵 0 𝑑𝑙𝑅𝐵 = 𝑙𝑅𝐵 3 𝑟 ∙ 𝐿𝑅𝐵 2 − 𝑙𝑅𝐵 4 2 ∙ 𝑟 ∙ 𝐿𝑅𝐵 3 Tabelle 2: Übergangsbogen nach Bloss (Quelle: IEV) Übergangsbogen nach Schramm (s-förmig) Parabel 4.Ordnung 𝑦 = 𝑥4 6 ∙ 𝑟 ∙ 𝑙𝑅𝑆 2 𝑓ü𝑟 0 ≤ 𝑥 ≤ 𝑙𝑅𝑆 2 𝑦 = 𝑧4 6 ∙ 𝑟 ∙ 𝑙𝑅𝑆 2 𝑓ü𝑟 0 ≤ 𝑧 ≤ 𝑙𝑅𝑆 Tabelle 3: Übergangsbogen nach Schramm (Quelle: IEV) Wenn der Benutzer ein Übergangsbogen auswählt, wird er aufgefordert einen weiteren Punkt anzugeben, um das nächste Element berechnen zu können. Neben dem extra Punkt kann auch ein Radius angegeben werden, wenn das nächste Element keine Gerade, sondern ein Kreisbogen sein soll. Die Übergangsbogenlänge wird aus der Differenz der Überhöhung des linken und rechten Elementes berechnet. Unterschiedliche Übergangsbögen haben dazu unterschiedliche Funk- tionen, die aus der Datenbank geladen werden. Dazu wird die Funktionskante mit ID laenge verwendet. Übergangsbögen zwischen Kreisbögen habe zwei unterschiedliche Varianten, je nachdem, ob die Vorzeichen der Radien gleich sind oder nicht. Bei gleichem Vorzeichen wird nur ein Teilstück des Bogens verwendet. Bei ungleichem Vorzeichen werden zwei Übergangs- bögen aneinandergesetzt. Dieser Fall wird mit Wendeklothoide bezeichnet. Bachelorarbeit Janek Greif Trassierungstool Seite 12 Ein Übergangsbogen speichert zwei Radien als globale Parameter radiusBegin und radiu- sEnd. Da eine Gerade auch als Kreisbogen mit unendlichem Radius aufgefasst werden kann, wird der Radius des Übergangsbogen, der an einer Gerade anliegt, als unendlich gewertet. Der double-Datentyp kann zwar positiv unendlich und negativ unendlich darstellen, aber die globalen Eingabeparameter nicht. Daher wird stattdessen ein leerer Wert in diesem gespei- chert. Zur Berechnung des rechten Punktes des Übergangsbogen, werden zwei Funktionen verwen- det, die aus der Datenbank geladen werden. Diese berechnen jeweils die X- und Y-Kompo- nente der Position in einem lokalen Koordinatensystem. Die ID für die X-Komponente ist x_po- sition und y_position für die Y-Komponente. Außerdem wird zusätzlich eine Funktion mit der ID winkel verwendet, mit der der Tangentenwinkel am Endpunkt mithilfe des Radius (Variable r) und der Länge (Variable L) berechnet wird. Die Funktionen für die Positionsberechnung erwarten als Eingabe den Endradius (Variable r), davon ausgehend, dass der Startradius un- endlich ist, die Länge (Variable L) und die Länge des Teilstücks (Variable lR) für die, die Po- sition berechnet werden soll. Die Position ist in einem lokalen Koordinatensystem, wobei die Position mit Teillänge 0 am Ursprung (0 0 ) liegt. Dort hat die Kurve auch keine Krümmung, was gleich einem unendlichen Radius ist. Die Länge des Übergangsbogens wird aus der Überhö- hungsdifferenz berechnet und erwartet als Parameter diese Differenz (Variable Du) und die Geschwindigkeit des Trassierungselements (Variable v). Berechnet wird ein Übergangsbogen immer vom größeren Radius zum kleineren. Dadurch gibt es Unterschiede in der Positionsbe- rechnung des rechten Punktes. Übergangsbogen zwischen Gerade und Kreisbogen 𝑟𝑜𝑡: ℝ → ℝ2×2: α ⟼ ( 𝑐𝑜𝑠(α) − 𝑠𝑖𝑛(α) 𝑠𝑖𝑛(α) 𝑐𝑜𝑠(α) ) 𝑛𝑜𝑟𝑚: ℝ2 → ℝ2: 𝑣 ⟼ 𝑣 |𝑣| 𝑙 = 𝑑𝑏𝑙𝑎𝑒𝑛𝑔𝑒(𝑣 = 𝑣, 𝐷𝑢 = Δ𝑢) 𝑥 = 𝑑𝑏𝑥_𝑝𝑜𝑠𝑖𝑡𝑖𝑜𝑛(𝑟 = 𝑟, 𝐿 = 𝑙, 𝑙𝑅 = 𝑙) 𝑦 = 𝑑𝑏𝑦_𝑝𝑜𝑠𝑖𝑡𝑖𝑜𝑛(𝑟 = 𝑟, 𝐿 = 𝑙, 𝑙𝑅 = 𝑙) τ = 𝑑𝑏𝑤𝑖𝑛𝑘𝑒𝑙(𝑟 = 𝑟, 𝐿 = 𝑙) 𝑝𝑟 = 𝑝𝑙 + 𝑑𝑙 ⋅ x + 𝑡𝑟(𝑑𝑙) ⋅ 𝑦 𝑑𝑟 = 𝑛𝑜𝑟𝑚(𝑟𝑜𝑡(τ) ⋅ 𝑑𝑙) (3.5) 𝑣 ist die Geschwindigkeit des Trassierungselementes und Δ𝑢 die Überhöhungsdifferenz. 𝑟𝑜𝑡(α) erstellt eine Rotationsmatrix, und 𝑛𝑜𝑟𝑚(𝑣) normalisiert einen Vektor. 𝑑𝑏𝑥 sind Bachelorarbeit Janek Greif Trassierungstool Seite 13 Funktionen, die aus der Datenbank mit ID 𝑥 geladen werden. Die Überhöhung einer Gerade ist 0, während sie bei einem Kreisbogen erst berechnet werden muss. Abbildung 9 Übergangsbogen zwischen einer Geraden und einem Kreisbogen (Quelle: Eigene Darstel- lung) Übergangsbogen zwischen Kreisbogen und Gerade 𝑡𝑙: ℝ2 → ℝ2, ( 𝑥 𝑦 ) ⟼ ( 𝑦 −𝑥 ) 𝑑𝑟 ⃗⃗⃗⃗⃗ = 𝑛𝑜𝑟𝑚(𝑟𝑜𝑡(τ) ⋅ 𝑑𝑙 ⃗⃗ ⃗⃗ ) 𝑦𝑐𝑜𝑟𝑟𝑒𝑐𝑡𝑖𝑜𝑛 = 𝑡𝑟(𝑑𝑟 ⃗⃗⃗⃗⃗) ⋅ 2 ⋅ 𝑦 𝑝𝑟 = 𝑟𝑜𝑡(τ) ⋅ (𝑑𝑙 ⃗⃗ ⃗⃗ ⋅ 𝑥 + 𝑡𝑙(𝑑𝑙 ⃗⃗ ⃗⃗ ) ⋅ 𝑦) + 𝑝𝑙 + 𝑦𝑐𝑜𝑟𝑟𝑒𝑐𝑡𝑖𝑜𝑛 Dieser Fall ist ähnlich zur anderen Richtung, aber wird vom rechten Punkt aus zum linken berechnet. Abbildung 10 Übergangsbogen zwischen Kreisbogen und Gerade (Quelle: Eigene Darstellung) Bachelorarbeit Janek Greif Trassierungstool Seite 14 Übergangsbogen zwischen zwei Kreisbögen mit unterschiedlichem Vor- zeichen im Radius Dazu wird ein Übergangsbogen vom linken Kreisbogen zu einer Geraden berechnet, gefolgt mit einem weiteren Übergangsbogen von einer Geraden nach einem Kreisbogen. Dazu wird erst der Übergangsbogen zwischen Kreisbogen und Gerade berechnet und der zweite von dem daraus entstandenen Mittelpunkt bis zum Ende. Das Ergebnis ist ein Wendeübergangs- bogen. Abbildung 11 Wendeübergangsbogen (Quelle: Eigene Darstellung) Übergangsbogen zwischen zwei Kreisbögen mit gleichem Vorzeichen im Radius Dieser Fall wurde im Rahmen dieser Arbeit nicht umgesetzt. In Zukunft soll dieser Fall, als auch verschiedenen Varianten der anderen Fälle, implementiert werden. Dadurch wurden aber nur die rechten Punkte und deren Richtungsvektoren bestimmt. Um ein Übergangsbogen auch graphisch anzuzeigen werden in regelmäßigen Schritten die Positions- bestimmung erneut durchgeführt, allerdings mit einem von null bis 𝑙 durchlaufenden 𝑙𝑅. Die damit erhaltenen Punkte werden direkt miteinander verbunden, sodass der Verlauf des Über- gangsbogen approximiert wird. Bachelorarbeit Janek Greif Trassierungstool Seite 15 3.3 Trassieren Abbildung 12: Trassierung eines Verkehrsweges durchführen (Quelle: Eigene Darstellung in Anlehnung an IEV) Trassierungselemente werden zwischen Punkten erstellt, die der Benutzer setzt. Damit ist die Aktion, einen Punkt zu setzten, die Hauptinteraktionsmöglichkeit des Benutzers zum Trassie- ren. Mit dem ersten Punkt allein, den der Benutzer setzt, kann noch kein Trassierungselement erstellt werden. Daher wird dieser nur vom Benutzer bestätigt und das Programm wartet auf einen weiteren Punkt. Sobald dieser gegeben ist, kann für das nächste Trassierungselement mit den ausgewählten Richtlinien eine neue Globale-Parameter-Menge und das Trassierungs- element selbst erstellt werden. Abschließend wird es der Achse hinzugefügt und angezeigt. Bachelorarbeit Janek Greif Trassierungstool Seite 16 3.4 Updates Sollte sich ein Trassierungselement ändern, kann es seine linken und rechten Nachbarn auf- fordern ein Update durchzuführen. Updates werden nach rechts weitergeleitet, wodurch sich der Achse entlang alle folgenden Elemente anpassen, damit alle Anschlüsse tangential blei- ben. Ändert sich ein Wert bei einem Kreisbogen, der auf der linken Seite ein Übergangsbogen hat, wird das Update stattessen nach links gegeben, damit sich dieser Übergangsbogen an- passen kann. Danach wird die Updatenachricht wieder nach rechts zum Ursprung gegeben, weil auch dieses sich eventuell ein weiteres Mal ändern muss, da sich der Kreisbogen auf- grund der Änderung im rechten Punkt des Übergangsbogen anpassen muss. Abschließend erhalten auch alle folgenden Trassierungselemente ein Update. Abbildung 13 Strecke bevor Änderung (Quelle: Eigene Darstellung) Bei einer Streck soll ein Kreisbigen geändert werden. Er soll einen größeren Radius bekom- men und seine Länger verkürzen. Da auf beiden Seiten ein Übergangsbogen existiert, müssen auch diese Angepasst werden. Abbildung 14 Strecke nach einer Änderung (Quelle: Eigene Darstellung) Der Radius wurde auf 450m erhöht und der Länge auf 20° reduziert. Beide Übergangsbögen sind deswegen kürzer geworden. Bachelorarbeit Janek Greif Projekt Seite 17 3.5 Relevante Knoten und Kanten für das Trassierungstool Die Ausschlusskante und die Vorgabenassoziationskante werden zwischen Vorgaben ange- wendet, um bei der Projekterstellung dem Benutzer anzuzeigen, dass Vorgaben zusammen- gehören, oder zu verhindern, dass Vorgaben gleichzeitig angezeigt werden können. Die Formelkante gruppiert alle Formen unter einem Formeln-Knoten, ähnlich wie der Globale- Parameter-Knoten die globalen Parameter gruppiert. Die Variablenzuweisungskante ermöglicht es Funktionen als Zwischenschritt zu verwenden. Sie kann von Funktionen und globalen Parametern verwendet werden. Die Vorschriftenkonstantenkante und die Variablenparameterkante werden von den globalen Parametern verwendet, um Abhängigkeiten auf andere Parameter beziehungsweise Vorschrif- ten darzustellen, die in Regeln verwendet werden könne. Abbildung 15: Verbindungskanten der Trassierung und Funktionen (Quelle: Eigene Darstellung) 4 Projekt 4.1 Persistente Speicherung In der Anwendung werden alle projektbezogenen Daten in einer Struktur gehalten. Um diese in der Datenbank anzulegen muss diese Struktur erst in eine persistente4 Form gebracht 4 Zur Laufzeit wird mit einem dynamischen Objekt gearbeitet. Zum Speichern muss in eine feste Form gebracht werden, die auch nach Schließung der Anwendung noch gültig ist. Bachelorarbeit Janek Greif Projekt Seite 18 werden. Als Format wurde zunächst XML angedacht, da es ein weit verbreitetes Format ist, um komplexe Objekte darzustellen. Das Projekt wird aber nicht als plain old java object (POJO) gehalten und somit müssen erst einmal alle internen Referenzen aufgelöst werden. Dafür wird genau einer Referenz die Rolle des Besitzers zugewiesen. An dieser Stelle wird das Objekt dann geschrieben, alle anderen Objekte erhalten nur eine ID, die das originale Objekt eindeu- tig identifiziert. Diese IDs werden als UUID realisiert. Ein Problem dabei ist aber, dass UUIDs auch mit Ziffern beginnen können, wodurch diese nicht als Name eines Elements im XML- Format benutzt werden können. Des Weiteren können Listen in XML nur als Menge an Ele- menten dargestellt werden. Aus diesen zwei Gründen wurde schließlich das JSON-Format gewählt. Ein Projekt wird in der Datenbank in einem Projekt-Knoten abgelegt. Alle Projekte werden an einem Sammelknoten auf der Umgebungsebene angehängt. Die Anwendung ist dafür verant- wortlich die Projekte zu sortieren du zu filtern, da alle dafür benötigten Daten nicht als Attribute in einem Knoten abgelegt sind und die Datenbank somit keine Information über den Inhalt eines Projektes hat. Ein Projekt-Knoten hat zwei Attributfelder meta und data, auf denen das Projekt aufgeteilt wird. Um eine Auswahl von Projekten zu erstellen muss nur das meta-Feld ausgelesen werden. Eine vollständige Deserialisierung5 ist zu aufwendig und wird nur ge- macht, wenn das Projekt geladen werden soll. Auch beim Export und Import wird diese Aufteilung eingehalten. Die dabei entstehende PUL- Datei beinhaltet als Zip-Archiv zwei Dateien meta.json und data.json. Dadurch muss bei einem Export nur die beiden Felder des Knotens in die Datei geschrieben werden. Der Import ist das Gleiche nur umgekehrt. Eine weitere benötigte Eigenschaft der persistenten Speicherung ist es, Knoten abzulegen, die beim Einlesen wieder mit der Datenbank verknüpft werden können. Jeder Knoten wird damit mit einer UUID erweitert. Diese werden von der Datenbank einmalig vergeben, sodass anhand der UUID der Knoten wiedergefunden werden kann. OrientDB kann beim Erstellen eines Knotens automatisch eine UUID generieren. Jedoch wird diese Funktionalität nicht kor- rekt vom OrientDB-Studio umgesetzt, sodass im Nachhinein die fehlende UUID eines Knotens ergänzt werden muss. Folgender Befehl befüllt leere UUID-Attribute: UPDATE Datensatz SET uuid = uuid() WHERE uuid is null 5 Eine Umwandlung von einer Text-Repräsentation zu einem Objekt. Die Struktur des Objektes wird von der Anwendung definiert und eine neue Instanz dieser Struktur wird erstellt. Bachelorarbeit Janek Greif Projekt Seite 19 OrientDB vergibt beim Importieren einer Datenbank jedem Knoten eine ID. Jedoch ist diese nicht gleich für verschiedene Datenbankinstanzen. Auch wenn dieselbe Datenbank mehrmals importiert wird, können für verschiedene Knoten unterschiedliche interne IDs vergeben wer- den. Um ein exportiertes Projekt auch in einer separaten Anwendung wieder importieren zu können, braucht es eine Möglichkeit gespeicherte Knoten unabhängig der Datenbankinstanz zu laden. Deswegen darf ein bereits existierender Knoten seine UUID nicht ändern. 4.1.2 Neues Projekt anlegen Abbildung 16: Neues Projekt anlegen (Quelle: Eigene Darstellung in Anlehnung an IEV) Im Hauptmenu wählt der Benutzer zuerst die Planungsart aus, danach wird der Verkehrsträger aus allen in der Datenbank modellierten Verkehrsträgern ausgewählt. Dies öffnet ein Dialog, wo der Benutzer Angaben zu Entwurfsmodus und Land gibt, sowie Name und Bezeichnung festgelegt wird. Mit diesen Angaben werden dann die zugehörigen Vorschriften aus der Datenbank geladen, welcher der Planer auswählt. Sollte er seine Einga- ben bestätigen, wird das Projekt erstellt und in der Datenbank abgelegt. Bachelorarbeit Janek Greif Projekt Seite 20 4.1.3 Projekt öffnen Abbildung 17: Projekt öffnen (Quelle: Eigene Darstellung in Anlehnung an IEV) Gleich wie beim Szenario „Neues Projekt anlegen“, gibt der Benutzer die Planungsart und ein Verkehrsträger an. Nur wird im Dialog eine Liste an Projekten angezeigt, die mit der Planungs- art und dem Verkehrsträger übereinstimmen. Dazu werden aus der Datenbank alle Projekte geladen und teilweise deserialisiert. Diese Teilprojekte genügen, um dem Benutzer die Aus- wahl anzuzeigen. Nachdem der Benutzer ein Teilprojekt ausgewählt hat, wird diese vollstän- diger deserialisiert und geladen. Zum Schluss wird das Trassierungstool angezeigt. Bachelorarbeit Janek Greif Projekt Seite 21 Abbildung 18 Projekt öffnen Dialog (Quelle: Eigene Darstellung) 4.2 Datenstruktur Das Projekt ist in verschiedene Unterprojekte aufgeteilt. Momentan existieren zwei Unterpro- jekte, das DimensioningProject und das DraftProject, und ein separates MetaPro- ject. Auf das DimensioningProject wird in der Arbeit nicht eingegangen. Das Metapro- jekt ist die Datenstruktur, die in das meta-Attribut des Projektknotens serialisiert wird. Das Metaprojekt hält Informationen wie den Namen des Projektes, die Beschreibung, der Ent- wurfsmodus (Klasse Mode), das Land (Klasse Country), die Planungsart (Enumeration De- signProcess), alle Verkehrsträger (Klasse ModeOfTransport) und die ausgewählten Vor- schriften. Die Klasse Document entspricht genau einem Knoten aus der Datenbank. Alle Vor- schriften (Klasse Regulation) werden in einer Liste gehalten, die nach dem Verkehrsträger und der UUID des Datenbankknotens sortiert ist. Die Zuordnung von Verkehrsträger nach Vor- schrift ist in einer separaten Struktur gehalten. Jeder Verkehrsträger hat seinen eigenen Ein- trag und damit auch eigene Vorschriften. Dabei wird als Schlüssel die UUID des Verkehrsträ- gers genutzt und der Wert sind vier Listen, repräsentiert durch die Klasse RegulationCom- bination, die entweder die UUIDs der Gesetze, Rechtsnormen und Richtlinien oder die UUIDs der individuellen Richtlinien (Pseudo-Richtlinien) halten. Um die Vorschriften pro Ver- kehrsträger zu rekonstruieren, kann mit der UUID des Verkehrsträgers und der UUID der Vor- schrift die eigentliche Vorschrifteninstanz gefunden werden. Das Trassierungsunterprojekt an sich enthält nur eine Zuordnung von Verkehrsträger nach einer Liste an Varianten (Klasse VariantList). Eine Variante (Klasse Variant) ist mit einer Liste an Achsen (Klasse Axis) assoziiert. Umgesetzt ist eine Achse durch zwei Linked-Lists. Eine für die Elemente und eine für die Punkte zwischen den Elementen. Beide Linked-Lists Bachelorarbeit Janek Greif Projekt Seite 22 sind miteinander verschachtelt. Somit hat jedes Element einer Liste neben dem linken und rechten Hauptelement auch ein linkes und rechtes Nebenelement. Die Nebenelemente für Punkte sind die Trassierungselemente und die Nebenelemente für die Trassierungselemente sind die Punkte. Diese speichern ihre Position im globalen Koordinatensystem und einen nor- malisierten Richtungsvektor, der verwendet wird, um einen tangentialen Anschluss zu berech- nen. Das Trassierungselement (Klasse DrawElement) selbst ist abstrakt und hat vier Gene- ralisierungen. Drei für die Trassierungselement (Klassen DrawKlothoide, DrawArc und DrawLine) und eine für die Punkte (Klasse DrawPoint). Eine DrawKlothoide ist mit vier Funktionen assoziiert, die für die Berechnung des Übergangsbogen verwendet werden. Ein DrawArc benutzt nur eine Funktion zum Berechnen der Überhöhung. Abbildung 19: Datenstruktur des Projektes zeigt den Aufbau des Projektes als UML-Klassen- diagramm mit der Aufteilung des Projektes in die zwei Unterprojekte und das Metaprojekt. Bachelorarbeit Janek Greif Projekt Seite 23 Abbildung 19: Datenstruktur des Projektes (Quelle: Eigene Darstellung) 4.3 Erstellung Start des Erstellungsprozesses ist die Auswahl mindestens eines Verkehrsträgers. Verkehrs- träger sind Knoten, die auf der Unterunterumgebungsebene liegen, das Attribute globale_pa- rameter nicht gesetzt haben, keine Instanz der Klasse Formeln sind und indirekt an einem Umgebungsknoten hängen, welcher das Attribut Verkehrstraeger gesetzt hat. Beim Laden Bachelorarbeit Janek Greif Projekt Seite 24 dieses Verkehrsträgers wird er sogleich mit seinem Globalen-Parameter-Knoten assoziiert. Das Laden erfolgt durch eine von OrientDB angepasste SQL-Query, der Match-Query: MATCH {class: Start}.outE("Startkante"){as:startL}.inV() {class: Umgebungsebene, as: verk, where: (Verkehrstraeger = true)} -Umgebungskante-> {class: Unterumgebungsebene, as: unterVerk} .outE("Unterumgebungskante"){as: uumgL}.inV() {class: Unterunterumgebungsebene, as: unterunterVerk, where: ( not(globale_parameter = true OR @class INSTANCEOF 'Formeln') )} <-Unterumgebungskante- {class: Unterumgebungsebene} -Unterumgebungskante-> {class: Unterunterumgebungsebene, as: glob, where: ( globale_parameter = true AND not(@class INSTANCEOF 'Formeln') )} RETURN verk.Name, unterVerk.Name, unterunterVerk, glob ORDER BY startL.Reihenfolge, uumgL.Reihenfolge In einer Match-Query wird eine Struktur von Knoten und Kanten definiert, wofür die Datenbank alle Subgraphen sucht, die dieser Form entsprechen. In dieser Query wird vom Startknoten eine Startkante zu einem Knoten auf der Umgebungsebene erwartet, welcher das Verkehrs- trägerattribut gesetzt haben muss. Von dort aus wird eine Unterumgebungskante zu einem Knoten auf der Unterunterumgebungsebene erwartet. Die unterschiedliche Darstellung der Kanten als Pfeil und als geschweifte Klammern ist von Nöten, da die Pfeildarstellung Informa- tionen der Kante nicht zur Verfügung stellt. Diese werden aber für eine Sortierung nach dem Reihenfolgeattribut benötigt. Über eine Unterumgebungskante wird der eigentliche Verkehrs- trägerknoten erreicht. Damit dieser mit dem passenden Globalen-Parameter-Knoten assoziiert werden kann, wird noch einmal über eine Unterumgebungskante zurück auf die Unterumge- bungsebene geschaut, um den Knoten für die globalen Parameter zu finden. Das Ergebnis dieser Suche ist der Name der Umgebungsebene und Unterumgebungsebene, als auch die Knoten des Verkehrsträgers und des globalen Parameters, sortiert nach der Reihenfolge der Startkante und der Unterumgebungskante. An dem Globale-Parameter-Knoten werden auch Vorschriften angehängt. Da jedoch nicht alle Vorschriften für jeden Verkehrsträger mit demselben Globale-Parameter-Knoten gelten, wer- den Attribute verwendet, die die jeweiligen Vorschriften mit den relevanten Verkehrsträgern assoziieren. Dazu werden alle Namen der Attribute in eine EMBEDDEDB LIST in dem Attribut AttributZuordnung im Globalen-Parameter-Knoten gespeichert. Neben den Vorschriften ha- ben auch die Verkehrsträger diese Attribute, um zu definieren, welche dieser Attribute gesetzt sein muss, um die Vorschrift mit dem Verkehrsträger zu assoziieren. Dadurch können neue Bachelorarbeit Janek Greif Projekt Seite 25 Verkehrsträger und Richtlinien hinzugefügt werden, ohne dass die Attribute in der Anwendung wiederholt werden müssen. Zum Erstellen eines Projektes wird noch ein Name, eine Bezeichnung, den Entwurfsmodus, den Entwurfsvorgang und das Land angefragt. Abbildung 20 Neues Projekt anlegen Dialog (Quelle: Eigene Darstellung) Mit diesen Informationen können die Vorschriften geladen werden, die der Benutzer beim Er- stellen eines Projektes auswählen muss. 4.4 Vorschriftenauswahl Für jeden Verkehrsträger wählt der Benutzer eine eigene Auswahl der Vorschriften aus. Dazu werden die Vorschriften in Kategorien aufgeteilt angezeigt. Die Kategorien sind in einer festen Liste in der Anwendung abgelegt. Angezeigt werden nur diejenigen Vorschriften, die mit der Auswahl des Verkehrsträgers, des Landes, des Entwurfsmodus und der Planungsart überein- stimmen. Vorschriften können mithilfe Kategorisierungsgruppen gruppiert sein. Diese Gruppen können als Filter verwendet werden, um andere Gruppen auszublenden. Bachelorarbeit Janek Greif Projekt Seite 26 Abbildung 21 Struktur einer gruppierten Vorschrift. (Quelle: Eigene Darstellung) Bachelorarbeit Janek Greif Projekt Seite 27 Abbildung 22 Struktur einer gruppenlosen Vorschrift. (Quelle: Eigene Darstellung) Abbildung 23 Struktur einer individuellen Richtlinie. (Quelle: Eigene Darstellung) Bachelorarbeit Janek Greif Projekt Seite 28 Eine Vorschrift muss nicht zwangläufig eine Gruppe haben. Wenn dies der Fall ist, wird die Kategorisierungsgruppe übersprungen. Wenn aber in der Anwendung nach Gruppen gefiltert wird, werden gruppenlose Vorschriften nicht angezeigt. Individuelle Richtlinien werden auch speziell geladen, da diese weder Gruppen haben, noch einem Land zugeordnet sind. Vorschriften haben ein Attribut Elementbeschreibung, welches in einer Nebenansicht ange- zeigt wird. Die Nebenansicht verwendet das HTML-Format, um der Elementbeschreibung For- mationsmöglichkeiten zu geben. Das Pflicht Attribut gibt an, dass die Vorschrift immer ausge- wählt sein muss und auch standartmäßig ist. Zwischen Vorschriften gibt es zwei Kanten, die Verhältnisse der Vorschriften angeben. Die Ausschlusskante gibt an, dass zwei Vorschriften nicht gleichzeitig ausgewählt werden können. Die Vorgabenassoziationskante gibt an, dass zwei Vorschriften zusammengehören. Wenn in der Vorschriftenauswahl eine Vorschrift aus- gewählt ist, werden alle ausgeschlossenen Vorschriften rot markiert, und alle assoziierten Vor- schriften grün umrandet. Sollte mindestens eine Vorschrift zwischen Ausschlusskanten das Pflichtattribut gesetzt haben, so müssen alle verbundenen Vorschriften das Attribut auch ge- setzt haben. Da nun aber nicht mehr alle Vorschriften ausgewählt sein können, wird aus den Vorschriften eine Auswahlgruppe gebildet, bei der genau eine Vorschrift ausgewählt sein muss. Das Standartelement ist dann die Vorschrift, mit dem aktuellsten Datum, welches im Attribut Aktualisierung abgelegt ist. Abbildung 24 Richtlinienauswahl für ein neues Projekt (Quelle: Eigene Darstellung) Sollte der individuelle Modus ausgewählt sein, werden die individuellen Richtlinien geladen und nicht die Vorschriften, aufgeteilt in Gesetz, Rechtsnormen und Richtlinien. Dabei wird die Landeingabe nicht verwendet. Bachelorarbeit Janek Greif Funktionen und Prädikate Seite 29 Um ein Projekt erstellen zu können, müssen alle genannten Eingaben einen Wert erhalten. Die einzige optionale Eingabe ist die Planungsstufe. Diese können ausgewählt werden und genauer angesehen werden, sind aber für die restliche Anwendung nicht von Bedeutung. Die Ansicht der Planungsstufen erfolgt auch über eine HTML-Ansicht, sodass die Inhalte in der Datenbank Formationselemente enthalten können. Damit Knoten als Vorschriften erkannt werden können müssen sie eine bestimmte Struktur einhalten. Wenn das Projekt erstellt wurde, wird dieses in der Datenbank gespeichert und die Ansicht wechselt zum Trassierungstool. 5 Funktionen und Prädikate Um die individuelle Natur von Gesetzen und Rechtsnormen in der Datenbank darstellen zu können und automatisiert zu überprüfen, wird die Anwendung und Datenbank um eine neue Mechanik erweitert. Dabei handelt es sich um Funktionen und Prädikate. Das sind evaluierbare Strukturen, die die Anwendung auswerten kann, um ein Ergebnis zu erhalten. Funktion ist dabei ein Überbegriff für Prädikat, mit dem Unterschied, dass Prädikate nur nach booleschen Werten evaluiert werden und Funktionen zusätzlich numerische Werte oder Auswahlelemente als Ergebnis haben können. 5.1 Allgemeine Funktionen Pro Funktion wird ein Knoten in der Datenbank angelegt. Dieser Knoten ist eine Instanz der Funktions-Klasse, welche von der Kategorisierung erbt. Angehängt werden diese Funktions- Knoten an einem Formeln-Knoten mit einer Formelkante. Die Formelkante ist eine Navigati- onskante und der Formeln-Knoten liegt auf der Unterunterdiskretisierungsebene. Somit ist der Formeln-Knoten parallel zu den Verkehrsträgern und dem Globale-Parameter-Knoten. Die Struktur der Formeln und Funktionen, ist der Struktur der globalen Parameter und Vorschriften nachempfunden. Eine Funktion ist eine Abbildung von einer beliebigen Menge an Eingaben nach einem Wert. Ein Wert kann entweder eine Fließkommazahl, ein boolescher Wert oder ein Auswahlelement sein. Jede Funktion definiert ihre Eingaben, indem eine Menge an Variablen als Eingaben angegeben wird, die für die Evaluation einen konkreten Wert erhalten müssen. Angegeben wird diese Menge als Text in dem Attribut freie_vaiablen. Es wird aber ein speziell formatierter Bachelorarbeit Janek Greif Funktionen und Prädikate Seite 30 Text erwartet, wobei in eckigen Klammern eine mit Komma getrennte Liste an Variablen an- gegeben wird. Variablen sind beliebige Namen, die einem „Java-Identifier“ nachempfunden sind. Sie dürfen nur große und kleine Buchstaben, Ziffern und den Unterstrich enthalten. Zu- sätzlich dürfen Variablen nicht mit einer Ziffer beginnen. Ein Beispiel einer freien Variablen Angabe ist „[v, r]“. Damit werden zwei Variablen beschrieben, v und r, welche bei Verwen- dung einen Wert erhalten müssen. Das zweite Attribut, das eine Funktion hat, nennt sich dis- play. Es erhält eine Latex-Repräsentation der Funktion. Dies ist nur für eine Visualisierung für den Benutzer und steht in keinem Zusammenhang mit dem, was in Wirklichkeit berechnet wird. Für die eigentliche Berechnungsvorschrift werden zwei Spezialisierungen verwendet. Diese werden mit den Klassen ScriptFunktion und TagFunktion, welche von Funktion erben, dargestellt. Der entscheidende Unterschied liegt darin, wo die Berechnungsvorschrift hinter- legt ist. Bei einer ScriptFunktion wird ein script als Attribut in dem Knoten abgelegt, wäh- rend bei einer TagFunktion eine in der Anwendung implementierte Java-Methode genannt wird. Abbildung 25 Klassendiagramm der Funktionen zeigt ein UML-Diagramm, mit den für Funkti- onen verwendeten Klassen. Bachelorarbeit Janek Greif Funktionen und Prädikate Seite 31 Abbildung 25 Klassendiagramm der Funktionen (Quelle: Eigene Darstellung) 5.1.2 Script-Funktion Eine Script-Funktion hat ein Attribut script, welches einen Term enthält, mit dem ein Wert berechnet werden kann. Das script ist in der Datenbank als Text gespeichert. Eine Überfüh- rung in eine auswertbare Form ist somit notwendig. Dieser Schritt wird von einem „Parser“ ge- macht. Die in der Vorlesung Programmierparadigmen (Pradel M, 2019/2020) vorgestellten Parser teilen sich die Arbeit in verschiedene Schritte ein. Der zu parsende String wird dabei als Listen an einzelnen Zeichen angesehen. Begonnen wird mit einem Lexer, welcher die Liste aus Zeichen in eine Liste aus Tokens überführt. Mehrere aneinander folgende Zeichen werden dazu als ein Token zusammengefasst. Für die nächsten Schritte sind Tokens sinnvolle Bachelorarbeit Janek Greif Funktionen und Prädikate Seite 32 Grundbausteine, die analysiert werden, um das Parsen abzuschließen. In der Anwendung sind Variablennamen, Operationen und Fließkommazahlen die verwendeten Tokens. Auch zusätz- liche Leerzeichen kann der Lexer berücksichtigen. Als zweiten Schritt wird aus der Tokenliste ein Parse-Baum generiert. Dieser ist eine Darstellung der Ableitungsregeln, mit dem der zu parsende Text erzeugt werden kann. Dazu gibt es verschiedene Verfahren, manuelle oder generische, die mit aus der Grammatik erzeugten Tabellen arbeiten. Zum Schluss wird der Parse-Baum in einen Abstract Syntax Tree (AST) überführt, eine für die Anwendung spezielle Datenstruktur. Im Falle von Script-Funktionen ist der AST bereits ausführbar und es müssen aufgrund des Parsen keine weiteren Schritte mehr erfolgen. In der Umsetzung der Anwendung wird der Parser mit der Parser-Kombinierer Bibliothek „jparsec“ erstellt. Dabei werden die letz- ten beiden Schritte zusammengefasst. Der Parser wird dann durch das Kombinieren von ein- facheren Parsern zusammengesetzt. Ein solcher Kombinierer nimmt entweder andere Parser oder spezielle Token-Parser als Eingabe und gibt einen neuen zusammengesetzten Parser aus. Es ist auch möglich, dass ein Parser sich selbst rekursiv als Eingabe nimmt. Ein Token- Parser erwartet genau ein Token und gibt ein Objekt zurück. Es gibt drei Arten von Tokens für ein Script: Java-Identifier, Dezimalzahlen und Operatoren. Aus Identifier werden Var-Objekte, aus Dezimalzahlen Num-Objekte und aus Operatoren werden Funktionen, die weitere Ergeb- nisse von anderen Parsern erwarten, um ihr AST-Objekt zu erstellen. Diese Token-Parser werden kombiniert, um dann ein Parser zu erhalten, der von der Eingabe direkt den AST er- zeugt. In Abbildung 26 Abtract Syntax Tree der Script-Funktionen ist der gesamte AST als UML-Klassendiagramm dargestellt. Bachelorarbeit Janek Greif Funktionen und Prädikate Seite 33 Abbildung 26 Abtract Syntax Tree der Script-Funktionen (Quelle: Eigene Darstellung) Der AST ist in verschiedene Untergruppen unterteilt. Einmal die mathematischen Operationen Sum, Sub, Mul, Div, Pow, Neg und auch If als Unterklasse von Op. Die bedingte Auswertung If zählt auch als Op, da das Ergebnis dieser Operation wie bei den anderen Operationen eine Fließkommazahl sein muss. Die Prädikate als Klasse Pred. Die Prädikate habe als Speziali- sierung die logischen Operatoren Not, And, Or und Impl, sowie verschiedene Vergleiche (Klasse Cmp). number = ? Java-Fließkommazahl ? ; variable = ? Java-Indentifier ? ; op-atom = number | variable ; operator = '+'(%prec 10) | '-'(%prec 10) | '*'(%prec 20) | '/'(%prec 20) | '-'(%prec 30) | '^'(%prec 40) ; operation-if = op-atom (operator op-atom )* | '(' operation-if ')' | predicate-non-if '?' operation-if ':' operation-if ; operation-non-if = op-atom (operator op-atom )* | '(' operation-non-if ')' ; Bachelorarbeit Janek Greif Funktionen und Prädikate Seite 34 cmp-operator = '=' | '!=' | '<=' | '<' | '>=' | '>' ; comparison-if = operation-if cmp-operator operation-if ; comparison-non-if = operation-non-if cmp-operator operation-non-if ; pred-if-atom = comparison-if | variable ; pred-non-if-atom = comparison-non-if | variable ; pred-operator = '!'(%pred 40) | '&'(%pred 30) | '|'(%prec 20) | '=>'(%prec 10) ; predicate-if = pred-if-atom (pred-operator predicate-if-atom)* | '(' predicate-if ')' ; predicate-non-if = pred-non-if-atom (pred-operator pred-non-if-atom)* | ' (' predicate-non-if ')' ; parser = predicate-if | operation-if ; Für die Vollständigkeit ist die Grammatik als EBNF mit Operatorpräzedenzangaben der Script- Funktionen angegeben. 5.1.3 Tag-Funktion Im Gegenzug zu einer Script-Funktion enthält eine Tag-Funktion zwei Attribute. Einmal ein tag Attribut, mit dem eine Java-Methode assoziiert ist und eine Menge an konstanten, welche Werte zu Variablen zuordnen. Die Java-Methode hat dann freie Variablen und die Variablen aus den Konstanten zur Berechnung verfügbar. Damit eine Java-Methode als Tag-Funktion verwendet werden kann, muss sie mit @TagFn annotiert sein, muss static, public und nicht synchronized sein, eine EvaluationException werfen, einen Parameter mit Typ Map nehmen und String, boolean, double oder Value zurückgeben. Der tag der Funktion wird in der Annotation angegeben, sollte dort kein Wert angegeben sein, wird der Name der Java-Methode verwendet. Die Kosinus-Funktion ist zum Beispiel folgendermaßen definiert: @TagFn public static double cos(Map bindings) throws EvaluationException { return Math.cos(getNumber(bindings, ″x″)); } In der Annotation wird kein Name angegeben, daher wird der Name der Methode cos, ver- wendet. Diese Tag-Funktion nimmt den Wert der Variablen x als Fließkommazahl und berech- net daraus den Kosinus mithilfe der Java-Standart-Bibliothek. Bachelorarbeit Janek Greif Funktionen und Prädikate Seite 35 In Script-Funktionen werden konstante Werte innerhalb des Scripts angegeben. Da solche Werte auch für Tag-Funktionen in der Datenbank gehalten werden sollen, werden diese im Attribut konstanten abgelegt. Dabei wird in geschweiften Klammern eine mit Komma getrennte Liste an Variablen-Wert-Paaren gespeichert. Ein Variable-Wert-Paar ist aus dem Namen der Variable, gefolgt von einem Doppelpunkt und anschließen dem Wert der Variable aufgebaut. Ein Beispiel für eine solche Angabe ist: „{a: 5, b: -7.1}“. Sie definiert zwei Variablen a und b, die jeweils den Wert 5 und -7.1 bekommen. 5.1.4 Script-Funktion vs Tag-Funktion Script-Funktionen werden vollständig in der Datenbank dargestellt. Dies erlaubt das Hinzufü- gen, Löschen und Ändern der Script-Funktionen ohne Anpassung der Anwendung. Allerdings ist nicht alles als Script-Funktion darstellbar. Als Beispiel können hier die trigonometrischen Funktionen sowie Integrale genannt werden. Tag-Funktionen sind Java-Methoden und haben daher die Java-Standart-Bibliothek und auch weitere Bibliotheken von Drittanbietern zur Berechnung verfügbar. Dies erlaubt die Berech- nung von allem, was mit Java berechenbar ist. Jedoch muss für das Hinzufügen und auch für eine Änderung die Anwendung angepasst werden. Funktionen, die zum Teil aus Termen bestehen, die nur als Tag-Funktion realisiert werden können, müssen entweder mit mehreren Funktionen dargestellt werden oder auch als Tag- Funktion in der Anwendung implementiert werden. Die Entscheidung, ob eine Funktion aufgeteilt wird oder als Tag-Funktion realisiert wird, ist demjenigen überlassen, der die Funktion erstellen möchte. Ich empfehle eine solche Funktion aufzuteilen, wenn sie nicht mehr als zwei Tag-Funktion-Komponenten hat. Sollten es mehr sein, hängt es davon ab, ob die einzelnen Teile auch für andere Funktionen verwendet werden. Wenn dies der Fall ist, lohnt es sich trotzdem, die Funktion aufzuteilen. 5.1.5 Zusammenbau der Funktionen Funktionen können andere Funktionen als Berechnungsschritt verwenden. Dazu müssen alle freien Variablen einen Wert erhalten und es muss den Namen der Variable angegeben wer- den, die den Wert erhalten wird. Diese Informationen werden in der Variablenzuweisungskante gehalten. Alle freien Variablen, vereinigt mit allen Variablen, die in allen eingehenden Variab- lenzuweisungskanten definiert sind, können von der Funktion verwendet werden. In Zuwei- sungen sind alle existierenden Variablen erlaubt. Deswegen ist die Evaluationsreihenfolge die- ser nicht egal. Zur Bestimmung der Reihenfolge wird aus den Variablenzuweisungskanten ein Bachelorarbeit Janek Greif Funktionen und Prädikate Seite 36 Graph erstellt, wobei die Kanten die Abhängigkeiten zwischen den berechneten Variablen und die zugewiesenen Variablen darstellen. Nun wird dieser Graph mit Kahn’s Algorithmus topo- logisch sortiert. Die daraus erhaltene Liste gibt dann die Reihenfolge an. Des Weiteren wird damit auch detektiert, ob es zyklische Abhängigkeiten zwischen Variablenzuweisungskanten gibt. Sollte dies der Fall sein, wird das Zusammenbauen der Funktion mit einem Fehler been- det. 5.1.6 Zusätzliche Checks Für ein erfolgreiches Zusammenbauen werden noch einige Tatsachen im Vorfeld überprüft. - Jede freie Variable muss einem konkreten Wert oder einer bekannten Variablen zuge- wiesen sein. - Jede in einem Script verwendete Variable muss bekannt sein. - Freie Variablen und zugewiesene Variablen müssen verwendet werden. - Es darf keine zyklischen Abhängigkeiten zwischen Funktionen geben. Nur wenn alle Bedingungen erfüllt sind, wird die Funktion erfolgreich erstellt. 5.1.7 Beispiel In der Anwendung wird eine Funktion verwendet, die die X-Position eines Übergangsbogen berechnet: Bachelorarbeit Janek Greif Funktionen und Prädikate Seite 37 Abbildung 27 Objektdiagramm der X Position des Übergangsbogen nach Bloss 2 (Quelle: Eigene Darstel- lung) Diese aufgeteilte Funktion soll folgendermaßen einen Wert berechnen: 𝑥2 4 ⋅ 𝑟 + 𝑙𝑅𝐵 2 2 ⋅ 𝑟 ⋅ π2 ⋅ (𝑐𝑜𝑠 ( π 𝑙𝑅𝐵 ⋅ 𝑥) − 1) (5.1) Das display Attribut speichert diese Darstellung als Latex-Text. Dabei werden drei weitere Funktionen verwendet. Die Kosinus Funktion und die konstante Funktion, die den Wert π zu- rück gibt, sind allgemeine Funktionen, die auch von anderen Funktionen verwendet werden. Deshalb muss nur eine weitere Funktion zur Berechnung hinzugefügt werden. cos_body = π 𝑙𝑅𝐵 ⋅ 𝑥 cos_term = 𝑐𝑜𝑠(cos_body) 𝑥2 4 ⋅ 𝑟 + 𝑙𝑅𝐵 2 2 ⋅ 𝑟 ⋅ π2 ⋅ (cos_term − 1) (5.2) Die Aufteilung berechnet zuerst die Variable cos_body. Dies ist das Argument der Kosinus Funktion und muss im Vorfeld berechnet werden, da das Ergebnis im nächsten Schritt Bachelorarbeit Janek Greif Funktionen und Prädikate Seite 38 verwendet wird. Der Wert kann anschließend in der Hauptfunktion als Variable cos_term ver- wendet werden. 5.2 Prädikate für globale Parameter Um nun beliebige Vorschriften zu überprüfen, werden die globalen Parameter mit Prädikats- funktionen erweitert. Dabei können mehrere Regeln für ein globalen Parameter erstellt wer- den, die der Parameter erfüllen muss. 5.2.2 Regeln Eine Regel ist eine Prädikatsfunktion mit zusätzlichen Abhängigkeiten auf anderen globalen Parametern und mit Informationen über ausgewählte Vorschriften. Die eigentlichen Prädikats- funktionen werden als EMBEDDED MAP in dem Attribut Einschraenkungen abgelegt. Dazu wird pro Regel ein kurzer eindeutiger Name vergeben, um daraus mit dem Script ein Schlüs- sel-Wert-Paar zu bilden, das in dem Attribut abgelegt wird. Die Abgängigkeiten zu anderen globalen Parametern werden durch Variablenparameterkanten angegeben. Diese geben den Namen der Variable an, die im Script verwendet werden kann, sowohl auch eine relative Po- sition. Diese Position ist eine ganze Zahl, mit der angegeben wird, ob der Wert des Parameters vom linken oder rechten Trassierungselement derselben Achse geladen werden soll. Sollte es kein Trassierungselement geben, hat die Variable keinen Wert. Variablen, die keinen Wert haben, sind nur eingeschränkt nutzbar. Sie können nicht für ma- thematische Operationen verwendet werden. Außerdem sind nur Vergleiche auf Gleichheit und Ungleichheit möglich, wobei ein fehlender Wert immer ungleich eines anderen Wertes ist, es sei denn, dieser andere Wert ist genauso fehlend. Eine Missachtung führt zu einer Evalu- ationException. Fehlende Variablen können als boolesche Werte interpretiert werden und so mit den logischen Verknüpfungsoperationen verwendet werden. Dabei wird die Variable immer als false gewertet. Letztendlich können Variablen mit einem fehlenden Wert auch an Funktionen übergeben werden. Regeln können auch bereits existierende Funktionen zur Berechnung ihres Prädikates ver- wenden. Die Variablen für die Zuweisung werden in Variablenparameterkanten, Vorschriften- konstantenkanten oder anderen Variablenzuweisungskanten definiert und müssen wie bei all- gemeinen Funktionen angegeben werden. Vorschriftenkonstantenkanten und Globale-Parameter-Knoten halten, wie Tag-Funktionen, eine Menge an Konstanten. Beide verwenden dazu das Attribut konstanten. Die Konstanten aus den Vorschriftenkonstantenkanten werden nur geladen, wenn die verbundene Vorschrift Bachelorarbeit Janek Greif Funktionen und Prädikate Seite 39 im Projekt ausgewählt worden ist. Dabei werden die Konstanten im Globale-Parameter-Knoten überschrieben. 5.2.3 Regeln-Format Um die Regeln auch außerhalb der Datenbank zu dokumentieren, soll ein spezielles Format verwendet werden. Dabei werden alle verwendeten Variablen mit ihrer relativen Position, die verwendeten Konstanten und Funktionen, sowie die eigentlichen Prädikate der Regeln ver- merkt. Abbildung 28 Klassendiagramm des Regel-Formates (Quelle: Eigene Darstellung) Das Format und die Erstellung einer Regel wird anhand eines Beispiels dargestellt. Es wird der globale Parameter „Freie Trassierungselemente“ (ID freie_elemente) eingeschränkt, so- dass, wenn das linke Trassierungselement eine Gerade ist und das aktuelle Trassierungsele- ment ein Kreisbogen ist, nur unter speziellen Umständen der Übergangsbogen übersprungen werden darf. Begonnen wird mit der Angabe, für welchen globalen Parameter die Regeln de- finiert werden sollen. Für diesen Parameter werden dann alle Variablen definiert, die Konstan- ten, die Vorschriftenkonstanten, verwendete Funktionen und dann die Regeln. Variablen, Kon- stanten, Vorschriftenkonstanten und Funktionen sind für alle Regeln verwendbar, wodurch auch keine doppelten Kanten angelegt werden müssen. Jeder globale Parameter hat eine Variable namens self. Diese hält den Wert des aktuellen globalen Parameters mit relativer Bachelorarbeit Janek Greif Funktionen und Prädikate Seite 40 Position null. Für spezielle relative Positionen braucht es eine Kante auf den gleichen Knoten. Zur Variablen wird auch der Name des globalen Parameters angegeben. Wenn eine Variable für eine Auswahlgruppe definiert ist, sollen auch die Variablen der Auswahlelemente aufgelis- tet werden. Die Beispielsregel verwendet vier externe Variablen, gleistyp, left_elem, v und r. gleistyp und left_elem sind beides Auswahlgruppen und listen somit auch die Variablen für ihre Aus- wahlelemente auf. left_elem ist auch eine Variable für den globalen Parameter „Freie Tras- sierungselemente“, aber mit relativer Position -1, womit diese Variablen den Wert des linken Trassierungselementes hält, falls es existiert. Diese Regel benutzt keine Konstanten, Vorschriftenkonstanten und Funktionen und somit wird nur angegeben, dass es keine gibt. In der Sektion Konstanten wird eine Zuweisung von Vari- ablen auf Werte dargestellt, die in dem globalen Parameter gespeichert werden. Die Vorschrif- tenkonstantensektion ist ähnlich, nur dass die Zuweisungsliste pro Richtlinie gespeichert wird, die die Konstanten des globalen Parameters bei ausgewählter Vorschrift überschreiben. Für Funktionen werden die berechnete Variable, die Zuweisungen und der Name der Funktion angegeben. Die eigentliche Berechnungsvorschrift, wird in den Regeln nicht angegeben, je- doch sollten alle Namen sinnvoll vergeben sein, sodass Funktionen auch ohne ihre Berech- nungsvorschrift verstanden werden können. Die letzte Sektion listet dann alle Regeln auf. Jeder Regel wird einen Namen gegeben. Dieser Name ist mehr eine kurze eindeutige Beschreibung, die für jede Regel anders sein muss. Für die erste Regel, die nicht erfüllt wird, wird dem Benutzer gemeldet, dass eine Regel mit diesem Namen nicht erfüllt ist. Der zweite Teil einer Regel ist das Prädikat. Im Gegensatz zu allgemei- nen Funktionen müssen in einer Regel nicht alle definierten Variablen verwendet werden. Die Beispielregel hat einen Eintrag in dieser Sektion mit dem Namen „Verzicht auf Übergangsbö- gen“. Das Prädikat verwendet eine Implikation, um zuerst einige Bedingungen zu definieren, die erfüllt sein müssen, ob die Überprüfung des Verzichts eines Übergangsbogens überhaupt nötig und möglich ist. Deswegen wird überprüf, ob das linke Element eine Gerade ist und das aktuelle ein Kreisbogen. Die Variable left_elem kann eventuell keinen Wert haben. Da sie aber nur auf Gleichheit überprüft wird, führt das zu keinem Problem. Die Überprüfung ergibt false in diesem Fall. Außerdem ist eine Pflicht auf Übergangsbögen nur bei bestimmen Gleis- typen vorhanden. Auch hier könnte der gleistyp keinen Wert haben, aber wie bei der left_e- lem Variable evaluieren Gleichheitsvergleiche zu false, wenn das der Fall ist. Die rechte Seite der Implikation wird nur ausgewertet, wenn nötig. Sollte also die linke Seite nach false evaluiert werden, muss die rechte Seite der Implikation nicht mehr evaluiert werden, da das Bachelorarbeit Janek Greif Anwendungsdesign Seite 41 Ergebnis bereits bekannt ist. Alle binären logischen Operatoren haben dieses Verhalten, dass wenn mit dem linken Parameter das Ergebnis bekannt ist, die andere Seite nicht mehr ausge- wertet wird. Bei der Implikation speziell ist mit eine nach false evaluierte linke Seite die ganze Implikation wahr und somit wird dem Benutzer kein Fehler angezeigt. Für das Beispiel ist ein Auszug der Regeln angegeben. Regeln für Freie Trassierungselemente: Variablen: - self, - arc - line - bogen - gleistyp, Gleistyp, relative position: 0 - andere_hgl - durchgehende_hgl - hgl - uebrige_gl - zba - nebengleise - left_elem, Freie Trassierungselemente, relative position: -1 - v, Geschwindigkeit, relative position: 0 - r, Radius, relative position: 0 Konstanten: (keine) Vorschriftenkonstanten: (keine) Funktionen: (keine) Regeln: - Verzicht auf Übergangsbögen: self = arc & left_elem = line & (gleistyp = andere_hgl | gleistyp = durchgehende_hgl | gleistyp = hgl) => v <= 70 & r >= 0.25*v*v 6 Anwendungsdesign Im Zuge der Bearbeitung der Anwendung wurden auch Konzepte eingeführt, mit denen Wart- barkeit, Nachvollziehbarkeit und Testbarkeit erhöht werden sollen. Diese Konzepte sind eine Modularisierung der Anwendung und „dependency injection“. Bachelorarbeit Janek Greif Anwendungsdesign Seite 42 6.1 Java-Module Die Anwendung wird in Java-Modulen unterteilt. Java-Module sind eigenständige Einheiten, die explizit angeben, welche anderen Module sie verwenden und auch welche Pakete von anderen Modulen sichtbar sind. Dadurch definiert jedes Modul eine öffentliche Schnittstelle mit der interagiert wird. Externe Bibliotheken, die keine Module sind, können weiterhin verwendet werden, da diese automatisch in Module umgewandelt werden. Es ist aber nicht erlaubt, dass zwei Module das- selbe Paket exportieren. In diesem Fall werden die einzelnen Bibliotheken zusammengefasst. Dazu wird im buidscript angegeben, welches Modul mit welchen Bibliotheken erweitert wird. Angegeben wird dies in der äußersten build.gradle-Datei, indem die patchModules.config Liste erweitert wird. Jeder Eintrag der Liste gibt ein Modul an und die Bibliotheken, mit denen es erweitert wird. ′orientdb.core=orientdb-client-3.0.34.jar;orientdb-object-3.0.34.jar;orientdb-dis- tributed-3.0.34.jar′ Das Modul orientdb.core wird mit den Bibliotheken für den OrientDB-Client, -Object und -Dis- tributed erweitert. Angegeben wird der vollständige Name der Jar-Datei der Bibliothek, ge- trennt mit einem Semikolon. Das Plugin, um Java-Module in Gradle verwenden zu können, ist lokal als build-Abhängigkeit eingebunden. Der Grund dazu ist es das Plugin mit der Möglichkeit zu erweitern, ein Modul mit mehreren Bibliotheken zu erweitern. Ein Modul wird von Gradle als Unterprojekt angesehen. Ein Unterprojekt hat folgende Ord- nerstruktur: - pultrack. - src - main - java - de/uni_stuttgart/ievvwi/ - module-info.java - test - build.gradle Die build.gradle Datei kann ihre eigenen Plugins und Abhängigkeiten definieren. Abhängigkei- ten auf andere Pultrack-Module wird mit einem Aufruf von implementation pro- ject(′:pultrack.′) definiert. Für transitive Abhängigkeiten kann das 'java-library' Plugin verwendet werden. Nun muss Gradle gesagt werden, dass das Unterprojekt verwendet werden soll. Dazu wird folgender Eintrag in die settings.gradle-Datei geschrieben: in- clude ′pultrack.′. Bachelorarbeit Janek Greif Anwendungsdesign Seite 43 Die module-info.java-Datei enthält Informationen zum Modulimport und Paketexport, sowie Angaben über die Sichtbarkeit der Elemente mit „Java-Reflection“. Abbildung 29 Abhängigkeiten der Java-Module zeigt die Abhängigkeiten zwischen den Java- Modulen der Anwendung. Es gibt zwei allgemeine Module, das pultrack.common-Modul und das pultrack.common_gui-Modul. Beide Enthalten allgemeine Funktionalitäten bezüg- lich ihres Gebiets. pultrack.common_gui stellt speziell dabei Schnittstellen zur Benutzer- oberfläche zur Verfügung, die in mehreren Stellen verwendet werden. pultrack.resources vergibt Zugriff auf statische Ressourcen. Besonders wichtig dabei sind die Übersetzungen von Texten, die dem Benutzer angezeigt werden. Abgelegt sind diese in einer properties-Datei, in der einem Schlüsselwerttext eine Übersetzung angegeben wird. Dabei gibt es pro Sprache eine Datei. Die Übersetzungen können spezielle Formationszei- chen6 enthalten, die als Platzhalter für Werte dienen, die von der Anwendung bestimmt wer- den. Wichtig dabei ist, dass es keine Zyklen gibt, da dies mit Java-Modulen nicht erlaubt ist. Um die Anwendung zu bauen, gibt es zwei Befehle, die für die beiden Betriebssysteme Windows und MacOS die Anwendung erstellen. Für Window: gradlew –rerun-tasks deploy -PtargetProp=win Für MacOS: gradlew –rerun-tasks deploy -PtargetProp=mac 6 Definiert in der Spezifikation für java.util.Formatter: https://docs.oracle.com/en/java/ja- vase/11/docs/api/java.base/java/util/Formatter.html#detail https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/Formatter.html#detail https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/Formatter.html#detail Bachelorarbeit Janek Greif Anwendungsdesign Seite 44 Abbildung 29 Abhängigkeiten der Java-Module (Quelle: Eigene Darstellung) Bachelorarbeit Janek Greif Anwendungsdesign Seite 45 6.2 Dependency Injection Eine weitere Anwendungsdesignentscheidung ist es, Abhängigkeiten zwischen Codeeinheiten (dependencies) abzuschwächen. Abschwächen bedeutet, dass eine Codeeinheit nicht auf ihre dependency direkt zugreift, sondern dass bei der Erstellung der Codeeinheit eine Referenz auf die dependency gegeben wird. Somit kontrolliert nicht mehr die Codeeinheit selbst welche dependency benutzt wird, sondern derjenige, der die Codeeinheit erstellt. Dies erzwingt, dass nicht auf eine spezielle Implementation verlassen werden kann, sondern nur auf eine Schnitt- stelle. Eine Codeeinheit hat eine Standardimplementation, die aber nicht direkt verwenden werden sollte. Objekte, die Zugriff auf dependencies benötigen, sollten nicht direkt an Ort und Stelle erstellt werden. Denn dazu müssten die eigenen dependencies weitergereicht werden. Stattdessen soll eine weitere Codeeinheit erstellt werden, deren einzige Aufgabe es ist, diese Objekte zu erstellen und alle dependencies zu übergeben. Damit kann genau definiert wer- den, welche Codeeinheit welche dependency bekommt und weil dependencies nicht weiter- gegeben werden, muss auch nicht darauf geachtet werden, wohin spezielle dependencies vergeben werden. Wichtige Codeeinheiten sollen hier erwähnt und kurz erläutert werden. 6.2.2 Resource Loader Diese Codeeinheit ermöglicht es Nicht-Code-Ressourcen zu laden. Dazu zählen Bilder, Über- setzungen und FXML-Dateien. FXML-Dateien beschreiben ein graphisches Layout für eine Benutzeroberfläche und werden verwendet, um neue Fenster zu öffnen. 6.2.3 View Controller und View Dialog Jede FXML-Datei definiert eine Klasse, deren Instanz die Interaktivität für den Teil der Benut- zeroberfläche enthält. Diese Klassen erben entweder von ViewController oder Dia- logController. Sie werden zwar nicht als dependencies verwendet, jedoch konsumieren sie diese. Deswegen muss jedes Java-Modul dem Resource Loader melden, wie aus einer Klasse eine Instanz erstellt wird. Hier kann ausgesucht werden, welche Implementation für eine dependency verwendet werden soll und dies auch rekursiv. 6.2.4 File Reader und File Writer Dateizugriff kann Tests erschweren und daher wird eine dependency verwendet, sodass in Tests diese für eine Moc-Implementation ausgetauscht werden kann. Bachelorarbeit Janek Greif Ausblick Seite 46 6.2.5 Datenbankinteraktion Auch Datenbankzugriffen können Tests erschweren. Es gibt dazu mehrere dependencies die auf die Datenbank zugreifen. Aufgrund bereits existierenden Codes konnte die Datenbank nicht komplett verschachtelt werden. Zukünftiges „Refactoring“ sollte diese Aufgabe angehen. 6.2.6 Asynchrone Tasks JavaFX bietet eine Möglichkeit an, Aufgaben asynchron in einem anderen Thread auszuführen und zum Schluss mit dem Ergebnis der Aufgabe im Haupthread fortzuführen. Diese depen- dency bietet eine Schnittstelle an, um solche Aufgaben einfacher zu erstellen und in einem Threadpool auszuführen. 7 Ausblick Das Trassierungstool kann momentan keine Abzweigungen darstellen. Zwar war das nie die Intension dieser Arbeit, dennoch ist das eine notwendige Erweiterung, um die Anwendung in der Praxis verwenden zu können. Ein Trassierungselement hat dazu mehr Nachbarn als nur ein linker und rechter. Auch die relative Position muss angepasst werden, da diese nur eine eindimensionale Information über andere Trassierungselement gibt. Verschiedene Verkehrsträger haben auch unterschiedliche Vorgänge, wie eine Strecke ge- plant wird. Besonders bei Übergangsbögen gibt es Unterschiede, wie diese angelegt werden. So wird beim Schienenverkehr die Länge eines Übergangsbogens aus der Überhöhungsdiffe- renz berechnet, während bei der Straße kein Konzept der Überhöhung existiert. Eine mögliche Umsetzung ergänzt einen Verkehrsträger mit der Auswahl eines Arbeitsvorganges. Diese Vor- gänge werden von der Anwendung implementiert und haben Auswirkungen, welche Informa- tionen der Benutzer angeben muss, um ein Trassierungselement zu erstellen. Die erstellten Verkehrswege werden als Projekt in der Datenbank gespeichert und können auch als Datei exportiert werden. Dieses Format kann aber nur von der Anwendung verwendet werden. Ein Export für verschiedene Dateiformate ermöglicht eine Interaktion mit anderen An- wendungen. Besonders das IFC-Format wurde angedacht als Schnittstelle zu anderen An- wendungen. IFC (ISO 16739-1:2018) ist ein standardisiertes Format von buildingSMART In- ternational (https://technical.buildingsmart.org/) welche verwendet wird, um Gebäude oder zi- vile Infrastrukturen in einer Umgebung digital beschreiben zu können. Jedoch gibt es keine öffentlichen Java-Bibliotheken, um Dateien mit diesem Format zu erstellen. Deshalb müsste die Anwendung einen Teil der IFC-Spezifikation umsetzen, um Streckenverläufe darzustellen. Wenn eine Tag-Funktion erstellt wurde, muss die gesamte Anwendung neu gebaut werden. Durch ein Plugin-System können Tag-Funktionen unabhängig von der Anwendung erstellt und https://technical.buildingsmart.org/ Bachelorarbeit Janek Greif Ausblick Seite 47 verbreitet werden. Da Plugins aber nicht nur die Java-Standartbibliothek, sondern auch ver- schiedene Drittanbieterbibliotheken brauchen, sollte eine Umgebung erschaffen werden, in der Tag-Funktionen-Plugins erstellt werden können. Dort hat ein Plugin Zugriff auf weitere Bibliotheken, die aber nicht mit dem Plugin verteilt werden, da sonst häufig vorkommende Bibliotheken von der Anwendung mehrmals geladen werden. Bachelorarbeit Janek Greif Quellenverzeichnis Seite 48 Quellenverzeichnis buildingSMART International, https://technical.buildingsmart.org/ heruntergeladen am 14.12.2020, 15:45Uhr buildingSMART International. (2018). Industry Foundation Classes (IFC) for data sharing in the construction and facility management industries — Part 1: Data schema (ISO 16739- 1:2018). Abgerufen von https://www.iso.org/standard/70303.html Latex, https://www.latex-project.org/, heruntergeladen am 14.12.2020, 15:45Uhr MathML, https://www.w3.org/Math/, heruntergeladen am 14.12.2020, 15:45Uhr Oracle: Java Formatter, https://docs.oracle.com/en/java/ja- vase/11/docs/api/java.base/java/util/Formatter.html#detail, heruntergeladen am 14.12.2020, 15:45Uhr jparsec, https://github.com/jparsec/jparsec, heruntergeladen am 14.12.2020, 15:45Uhr Pradel, M. (2019/2020). Programmieparadigmen [Vorlesungsfolien], Universität Stuttgart SoftwareLab, https://software-lab.org/teaching/winter2019/pp/ S. Enterprise.Home: OrientDB Community Edition, https://orientdb.org/ heruntergeladen am 17.12.2020, 15:45Uhr Weiss, T. (2020). Masterarbeit. Entwicklung und Implementierungeines selbstlernendenDi- mensionierungstools zumAbbilden und zur konstruktivenAuslegung eines Bahnkörpers von- Eisenbahnstrecken im(E)DCC-Modellansatz, 2020(1) https://technical.buildingsmart.org/ https://www.latex-project.org/ https://www.w3.org/Math/ https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/Formatter.html#detail https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/Formatter.html#detail https://github.com/jparsec/jparsec https://software-lab.org/teaching/winter2019/pp/ https://orientdb.org/ Bachelorarbeit Janek Greif Anhang A Seite 1 Anhang A Berechnungen Seien 𝑎, 𝑏 zwei Punkte mit bekannter Position, die auf einem Kreisbogen liegen, und 𝑐 das Zentrum des Kreises ohne bekannte Position. Sei 𝑑 der normalisierte Richtungsvektor von 𝑎 zum Zentrum. Sei 𝑡𝑎 die Distanz von 𝑎 nach 𝑐 und 𝑡𝑏 die Distanz von 𝑏 nach 𝑐. Somit kann die Position von 𝑐 dargestellt werden mit: 𝑡𝑎 = |𝑐 − 𝑏| 𝑡𝑏 = |𝑡𝑎 ⋅ 𝑑 + 𝑎 − 𝑏| 𝑐 = 𝑡𝑎 ⋅ 𝑑 Da 𝑡𝑎 = 𝑡𝑏 gilt: 𝑡𝑎 = 𝑡𝑏 = 𝑡 = |𝑡 ⋅ 𝑑 + 𝑎 − 𝑏| Ohne Einschränkung der Allgemeinheit kann mit 𝑎 = 0 ausgegangen werden. Damit gilt: 𝑡 = |𝑡 ⋅ 𝑑 − 𝑏| 𝑡 = √(𝑡 ⋅ 𝑑𝑥 − 𝑏𝑥)2 + (𝑡 ⋅ 𝑑𝑦 − 𝑏𝑦) 2 𝑡2 = (𝑡 ⋅ 𝑑𝑥 − 𝑏𝑥)2 + (𝑡 ⋅ 𝑑𝑦 − 𝑏𝑦) 2 𝑡2 = 𝑡2𝑑0 2 − 2𝑡𝑑𝑥𝑏𝑥 + 𝑏𝑥 2 + 𝑡1𝑑𝑦 2 − 2𝑡𝑑𝑦𝑏𝑦 + 𝑏𝑦 2 0 = 𝑡2 ⋅ (𝑑𝑥 2 + 𝑑𝑦 2 − 1) − 𝑡 ⋅ (2𝑑𝑥𝑏𝑥 + 2𝑑𝑦𝑏𝑦) + 𝑏𝑥 2 + 𝑏𝑦 2 Da 𝑑𝑥 2 + 𝑑𝑦 2 = 1 folgt: 0 = −𝑡 ⋅ (2𝑑𝑥𝑏𝑥 + 2𝑑𝑦𝑏𝑦) + 𝑏𝑥 2 + 𝑏𝑦 2 𝑡 = 𝑏𝑥 2 + 𝑏𝑦 2 2 ⋅ (𝑑𝑥𝑏𝑥 + 𝑑𝑦𝑏𝑦) 𝑡 ist der Radius des Kreisbogens. Bachelorarbeit Janek Greif Anhang B Seite 2 Anhang B Benutzerhandbuch Ein Auszug aus dem zugehörigen Benutzerhandbuch. Es sind nur die Gliederung und die re- levanten Kapitel 5 und 6 vorhanden. In Kapitel 5 wird auf das Projektmanagement eingegan- gen. Dazu zählt Projekte erstellen, öffnen und verwalten. Bachelorarbeit Janek Greif Anhang B Seite 3 PULTRACK BENUTZERHANDBUCH Institut für Eisenbahn – und Verkehrswesen Bachelorarbeit Janek Greif Anhang B Seite 4 Inhaltsverzeichnis 1 Einleitung...................................................................................................................... 4 2 Allgemeine Hinweise ................................................................................................... 4 3 Datenbanktools ............................................................................................................ 4 3.1 DataTrack – Betrachtungstool ................................................................................. 4 3.1.1 Dynamisches Fenster ....................................................................................... 4 3.1.2 Navigation ........................................................................................................ 5 3.1.3 Filterung ........................................................................................................... 7 3.1.4 Schnellzugriffsleiste .......................................................................................... 7 3.1.5 Suchfunktionen ................................................................................................. 8 3.1.6 Visualisierung ................................................................................................... 8 3.1.7 Dateianzeige................................................................................................... 10 3.2 DataTrack – Bearbeitungstool [Admin] ................................................................... 11 3.2.1 Kontextmenü des Navigationsbaumes ............................................................ 12 3.2.2 Änderungsverwaltung ..................................................................................... 13 3.2.3 Binärdateien verknüpfen ................................................................................. 13 3.2.4 Kantenverwaltung ........................................................................................... 14 3.2.5 Kanten bearbeiten .......................................................................................... 15 3.2.6 Kanten anlegen .............................................................................................. 16 3.2.7 Knotenverwaltung ........................................................................................... 18 3.2.8 Klassenverwaltung.......................................................................................... 22 3.3 PULReader ............................................................................................................ 25 3.3.1 Visualisierung ................................................................................................. 26 3.3.2 Archivfunktion ................................................................................................. 26 3.3.3 Favoriten ........................................................................................................ 27 3.3.4 Kommentare ................................................................................................... 27 3.4 Parametrische Suche ............................................................................................ 28 3.4.1 Suchparameter auswählen ............................................................................. 29 3.4.2 Richtlinien auswählen ..................................................................................... 30 3.5 Intelligente Suche .................................................................................................. 31 3.5.1 Visualisierung ................................................................................................. 32 3.5.2 Richtlinienauswahl .......................................................................................... 33 3.5.3 Auswahl globaler Parameter ........................................................................... 35 Bachelorarbeit Janek Greif Anhang B Seite 5 3.5.4 Abhängigkeiten visualisieren ..................................................................