diff --git a/src/c3nav/routing/graph/graph.py b/src/c3nav/routing/graph/graph.py index cb94cd79..35ded802 100644 --- a/src/c3nav/routing/graph/graph.py +++ b/src/c3nav/routing/graph/graph.py @@ -1,3 +1,5 @@ +from itertools import permutations + from c3nav.mapdata.models import Level from c3nav.routing.graph.connection import GraphConnection from c3nav.routing.graph.level import GraphLevel @@ -7,6 +9,7 @@ class Graph(): def __init__(self): self.levels = {} self.connections = [] + self.levelconnector_points = {} def build(self): for level in Level.objects.all(): @@ -14,7 +17,19 @@ class Graph(): for level in self.levels.values(): level.build() + + self.connect_levelconnectors() + + for level in self.levels.values(): level.draw_png() + def add_levelconnector_point(self, levelconnector, point): + self.levelconnector_points.setdefault(levelconnector.name, []).append(point) + + def connect_levelconnectors(self): + for levelconnector_name, points in self.levelconnector_points.items(): + for from_point, to_point in permutations(points, 2): + self.add_connection(from_point, to_point) + def add_connection(self, from_point, to_point): self.connections.append(GraphConnection(self, from_point, to_point)) diff --git a/src/c3nav/routing/graph/level.py b/src/c3nav/routing/graph/level.py index f459d943..8e73bab1 100644 --- a/src/c3nav/routing/graph/level.py +++ b/src/c3nav/routing/graph/level.py @@ -53,6 +53,24 @@ class GraphLevel(): for from_point, to_point in permutations(points, 2): from_point.connect_to(to_point) + levelconnectors = self.level.geometries.levelconnectors + levelconnectors = assert_multipolygon(levelconnectors) + for levelconnector in self.level.levelconnectors.all(): + polygon = levelconnector.geometry + center = polygon.centroid + + for room in self.rooms: + if not polygon.intersects(room.geometry): + continue + + point = center + if not point.within(room.clear_geometry): + point = get_nearest_point(room.clear_geometry, point) + + point = GraphPoint(room, *point.coords[0]) + room.points.append(point) + self.graph.add_levelconnector_point(levelconnector, point) + for room in self.rooms: room.connect_points()