@startuml class Section { name: str altitude: Decimal } class Source { name: str bottom: Decimal left: Decimal top: Decimal right: Decimal image: file } abstract class GeometryMixin { geometry: } abstract class SectionGeometryMixin { } GeometryMixin <|-- SectionGeometryMixin Section "1" *-- "*" SectionGeometryMixin: section class Building { geometry: polygon } SectionGeometryMixin <|-- Building class Category << (E,#FF7700) >> { empty string stairs escalator elevator } class Level << (E,#FF7700) >> { empty string upper lower } class Space { geometry: polygon public: bool } SectionGeometryMixin <|-- Space Category "1" <-- Space: category Level "1" <-- Space: level class Door { geometry: polygon } SectionGeometryMixin <|-- Door Level "1" <-- Door: level class Hole { geometry: polygon } SectionGeometryMixin <|-- Hole abstract class SpaceGeometryMixin { } GeometryMixin <|-- SpaceGeometryMixin Space "1" *-- "*" SpaceGeometryMixin: space class Area { geometry: polygon } SpaceGeometryMixin <|-- Area class Point { geometry: point } SpaceGeometryMixin <|-- Point class Stair { geometry: linestring } SpaceGeometryMixin <|-- Stair class Obstacle { geometry: polygon } SpaceGeometryMixin <|-- Obstacle class LineObstacle { geometry: linestring } SpaceGeometryMixin <|-- LineObstacle abstract class Location { titles: dict public: bool can_search: bool can_describe: bool color: str } abstract class SpecificLocation { } SpecificLocation --|> Location Section --|> SpecificLocation Space --|> SpecificLocation Area --|> SpecificLocation Point --|> SpecificLocation class LocationGroup { compiled_room: bool compiled_area: bool } LocationGroup --|> Location SpecificLocation "*" --o "*" LocationGroup: groups class LocationSlug { slug: str } Location "1" -- "1" LocationSlug class GraphNode { x: int y: int transfer: bool desc: json } Space "1" *-- "*" GraphNode: space class GraphLine { category: str } GraphNode "1" *-- "*" GraphLine: start GraphNode "1" *-- "*" GraphLine: end hide methods @enduml