diff --git a/src/c3nav/mapdata/models/level.py b/src/c3nav/mapdata/models/level.py index 55e4818f..a697de89 100644 --- a/src/c3nav/mapdata/models/level.py +++ b/src/c3nav/mapdata/models/level.py @@ -113,24 +113,31 @@ class LevelGeometries(): return cascaded_union(lineobstacles) @cached_property - def obstacles(self): + def uncropped_obstacles(self): + obstacles = [obstacle.geometry for obstacle in self.level.obstacles.filter(crop_to_level__isnull=True)] + return cascaded_union(obstacles).intersection(self.mapped) + + @cached_property + def cropped_obstacles(self): levels_by_name = {} obstacles_by_crop_to_level = {} - for obstacle in self.level.obstacles.all(): - level_name = None if obstacle.crop_to_level is None else obstacle.crop_to_level.name + for obstacle in self.level.obstacles.filter(crop_to_level__isnull=False): + level_name = obstacle.crop_to_level.name levels_by_name.setdefault(level_name, obstacle.crop_to_level) obstacles_by_crop_to_level.setdefault(level_name, []).append(obstacle.geometry) all_obstacles = [] for level_name, obstacles in obstacles_by_crop_to_level.items(): - obstacles = cascaded_union(obstacles) - if level_name is not None: - obstacles = obstacles.intersection(levels_by_name[level_name].geometries.mapped) + obstacles = cascaded_union(obstacles).intersection(levels_by_name[level_name].geometries.mapped) all_obstacles.append(obstacles) all_obstacles.extend(self.lineobstacles) return cascaded_union(all_obstacles).intersection(self.mapped) + @cached_property + def obstacles(self): + return cascaded_union([self.uncropped_obstacles, self.cropped_obstacles]) + @cached_property def raw_doors(self): return cascaded_union([door.geometry for door in self.level.doors.all()]).intersection(self.mapped) diff --git a/src/c3nav/mapdata/render/renderer.py b/src/c3nav/mapdata/render/renderer.py index 8f1efff9..8c62afdf 100644 --- a/src/c3nav/mapdata/render/renderer.py +++ b/src/c3nav/mapdata/render/renderer.py @@ -100,14 +100,15 @@ class LevelRenderer(): svg = self.create_svg() contents = self.add_svg_content(svg) + MITRE = JOIN_STYLE.mitre if not self.level.intermediate: width, height = get_dimensions() - holes = self.level.geometries.holes.buffer(0.1, join_style=JOIN_STYLE.mitre) + holes = self.level.geometries.holes.buffer(0.1, join_style=MITRE) contents.append(self.polygon_svg(box(0, 0, width, height).difference(holes), fill_color='#000000')) contents.append(self.polygon_svg(self.level.geometries.buildings_with_holes, - fill_color=('#EBEBEB' if self.level.intermediate else '#D5D5D5'))) + fill_color='#D5D5D5')) contents.append(self.polygon_svg(self.level.geometries.outsides_with_holes, fill_color='#DCE6DC')) @@ -126,9 +127,9 @@ class LevelRenderer(): fill_opacity=0.06)) if show_accessibles: - main_geometry = self.level.geometries.accessible.buffer(-0.6, join_style=JOIN_STYLE.mitre) - clear_geometry = self.level.geometries.accessible.buffer(-0.3, join_style=JOIN_STYLE.mitre) - missing_geometry = clear_geometry.difference(main_geometry.buffer(0.31, join_style=JOIN_STYLE.mitre)) + main_geometry = self.level.geometries.accessible.buffer(-0.6, join_style=MITRE) + clear_geometry = self.level.geometries.accessible.buffer(-0.3, join_style=MITRE) + missing_geometry = clear_geometry.difference(main_geometry.buffer(0.31, join_style=MITRE)) contents.append(self.polygon_svg(clear_geometry, fill_color='#FFFF00', @@ -150,7 +151,12 @@ class LevelRenderer(): stroke_color='#3c3c3c', stroke_width=0.05)) - contents.append(self.polygon_svg(self.level.geometries.obstacles, + contents.append(self.polygon_svg(self.level.geometries.uncropped_obstacles, + fill_color='#BDBDBD', + stroke_color='#9E9E9E', + stroke_width=0.05)) + + contents.append(self.polygon_svg(self.level.geometries.cropped_obstacles.buffer(-0.06, join_style=MITRE), fill_color='#BDBDBD', stroke_color='#9E9E9E', stroke_width=0.05)) @@ -219,7 +225,7 @@ class LevelRenderer(): for level in higher: contents.append(self.polygon_svg(level.geometries.intermediate_shadows, fill_color='#000000', - fill_opacity=0.05)) + fill_opacity=0.07)) for level in higher: self.add_svg_image(svg, 'file://'+get_render_path('level-%s.base.png' % level.name))