@startuml class Level { name: str altitude: Decimal } class Source { name: str bottom: Decimal left: Decimal top: Decimal right: Decimal } abstract class GeometryMixin { geometry: } abstract class LevelGeometryMixin { } GeometryMixin <|-- LevelGeometryMixin Level "1" *-- "*" LevelGeometryMixin: section class Building { geometry: polygon } LevelGeometryMixin <|-- Building class Space { geometry: polygon public: bool } LevelGeometryMixin <|-- Space class Door { geometry: polygon } LevelGeometryMixin <|-- Door abstract class SpaceGeometryMixin { } GeometryMixin <|-- SpaceGeometryMixin Space "1" *-- "*" SpaceGeometryMixin: space class Hole { geometry: polygon } SpaceGeometryMixin <|-- Hole class Area { geometry: polygon } SpaceGeometryMixin <|-- Area class POI { geometry: point } SpaceGeometryMixin <|-- POI 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 Level --|> SpecificLocation Space --|> SpecificLocation Area --|> SpecificLocation POI --|> SpecificLocation class LocationGroupCategory { name: str titles: dict } class LocationGroup { } LocationGroup --|> Location SpecificLocation "*" --o "*" LocationGroup: groups LocationGroup "*" --o "1" LocationGroupCategory: category class LocationSlug { slug: str } Location "1" -- "1" LocationSlug hide methods @enduml