diff --git a/src/c3nav/routing/level.py b/src/c3nav/routing/level.py index b0130a94..d34a70f3 100644 --- a/src/c3nav/routing/level.py +++ b/src/c3nav/routing/level.py @@ -127,16 +127,16 @@ class GraphLevel(): self._built_arealocations = {} self._built_excludables = {} for arealocation in self.level.arealocations.all(): - self._built_arealocations[arealocation.name] = shapely_to_mpl(arealocation.geometry) + self._built_arealocations[arealocation.name] = arealocation.geometry if arealocation.routing_inclusion != 'default' or arealocation.package not in public_packages: self._built_excludables[arealocation.name] = arealocation.geometry public_area, private_area = get_public_private_area(self.level) - self._built_arealocations[':public'] = shapely_to_mpl(public_area) + self._built_arealocations[':public'] = public_area self._built_excludables[':public'] = public_area - self._built_arealocations[':private'] = shapely_to_mpl(private_area) + self._built_arealocations[':private'] = private_area self._built_excludables[':private'] = private_area def create_doors(self): @@ -269,12 +269,14 @@ class GraphLevel(): def collect_arealocation_points(self): self.arealocation_points = {} - for name, mpl_arealocation in self._built_arealocations.items(): + for name, arealocation in self._built_arealocations.items(): + mpl_area = shapely_to_mpl(arealocation) + rooms = [room for room in self.rooms - if room.mpl_clear.intersects_path(mpl_arealocation.exterior, filled=True)] + if any(room.mpl_clear.intersects_path(exterior, filled=True) for exterior in mpl_area.exteriors)] possible_points = tuple(point for point in sum((room._built_points for room in rooms), []) if point.room) self.arealocation_points[name] = tuple(point.i for point in possible_points - if mpl_arealocation.contains_point(point.xy)) + if mpl_area.contains_point(point.xy)) # Drawing ctype_colors = { diff --git a/src/c3nav/routing/utils/mpl.py b/src/c3nav/routing/utils/mpl.py index f88379a0..20b2ddc5 100644 --- a/src/c3nav/routing/utils/mpl.py +++ b/src/c3nav/routing/utils/mpl.py @@ -20,6 +20,10 @@ class MplMultipolygonPath(MplPathProxy): def __init__(self, polygon): self.polygons = [MplPolygonPath(polygon) for polygon in assert_multipolygon(polygon)] + @property + def exteriors(self): + return tuple(polygon.exterior for polygon in self.polygons) + def intersects_path(self, path, filled=False): for polygon in self.polygons: if polygon.intersects_path(path, filled=filled): @@ -38,6 +42,10 @@ class MplPolygonPath(MplPathProxy): self.exterior = linearring_to_mpl_path(polygon.exterior) self.interiors = [linearring_to_mpl_path(interior) for interior in polygon.interiors] + @property + def exteriors(self): + return (self.exterior, ) + def intersects_path(self, path, filled=False): if filled: if not self.exterior.intersects_path(path, filled=True):