From 4c547326bf402430576c25ff676796ed4f1fb7dd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Laura=20Kl=C3=BCnder?= Date: Tue, 27 Dec 2016 01:49:23 +0100 Subject: [PATCH] routing: stuffedareas --- src/c3nav/routing/area.py | 3 +++ src/c3nav/routing/level.py | 10 ++++++++++ src/c3nav/routing/room.py | 6 +++++- src/c3nav/routing/utils/mpl.py | 2 +- 4 files changed, 19 insertions(+), 2 deletions(-) diff --git a/src/c3nav/routing/area.py b/src/c3nav/routing/area.py index 878e4cc5..321847e7 100644 --- a/src/c3nav/routing/area.py +++ b/src/c3nav/routing/area.py @@ -47,6 +47,9 @@ class GraphArea(): if self.mpl_clear.intersects_path(path): return None, None, None + if self.room.stuffedareas.intersects_path(path, filled=True): + distance *= 2.5 + # stair checker angle = coord_angle(point1, point2) stair_direction_up = None diff --git a/src/c3nav/routing/level.py b/src/c3nav/routing/level.py index 09760410..d0faf31b 100644 --- a/src/c3nav/routing/level.py +++ b/src/c3nav/routing/level.py @@ -69,6 +69,7 @@ class GraphLevel(): self.create_elevatorlevels() self.collect_arealocations() + self.collect_stuffedareas() self._built_points = sum((room._built_points for room in self.rooms), []) self._built_points.extend(self._built_room_transfer_points) @@ -156,6 +157,15 @@ class GraphLevel(): for interior in polygon.interiors: room._add_ring(interior, want_left=False) + def collect_stuffedareas(self): + self._built_stuffedareas = self.level.geometries.stuffedareas + for polygon in assert_multipolygon(self._built_stuffedareas.buffer(0.05, join_style=JOIN_STYLE.mitre)): + for room in self.rooms: + room._add_ring(polygon.exterior, want_left=True) + + for interior in polygon.interiors: + room._add_ring(interior, want_left=False) + def create_doors(self): doors = self.level.geometries.doors doors = assert_multipolygon(doors) diff --git a/src/c3nav/routing/room.py b/src/c3nav/routing/room.py index eebb9f4a..1728c34a 100644 --- a/src/c3nav/routing/room.py +++ b/src/c3nav/routing/room.py @@ -29,6 +29,7 @@ class GraphRoom(): self.distances = np.zeros((1, )) self.ctypes = None self.excludables = None + self.stuffedareas = None def serialize(self): return ( @@ -40,13 +41,14 @@ class GraphRoom(): self.ctypes, self.excludables, self.excludable_points, + self.stuffedareas, ) @classmethod def unserialize(cls, level, data): room = cls(level) (room.mpl_clear, areas, room.points, room.room_transfer_points, - room.distances, room.ctypes, room.excludables, room.excludable_points) = data + room.distances, room.ctypes, room.excludables, room.excludable_points, room.stuffedareas) = data room.areas = tuple(GraphArea(room, *area) for area in areas) return room @@ -206,6 +208,8 @@ class GraphRoom(): if self._built_is_elevatorlevel: return + self.stuffedareas = shapely_to_mpl(self.level._built_stuffedareas.intersection(self._built_geometry)) + for area in self.areas: area.build_connections() diff --git a/src/c3nav/routing/utils/mpl.py b/src/c3nav/routing/utils/mpl.py index 20b2ddc5..6c5f6343 100644 --- a/src/c3nav/routing/utils/mpl.py +++ b/src/c3nav/routing/utils/mpl.py @@ -82,7 +82,7 @@ def shapely_to_mpl(geometry): """ if isinstance(geometry, Polygon): return MplPolygonPath(geometry) - elif isinstance(geometry, MultiPolygon): + elif isinstance(geometry, MultiPolygon) or geometry.is_empty: return MplMultipolygonPath(geometry) raise TypeError