diff --git a/src/c3nav/mapdata/models/level.py b/src/c3nav/mapdata/models/level.py index bc50b71d..561241d4 100644 --- a/src/c3nav/mapdata/models/level.py +++ b/src/c3nav/mapdata/models/level.py @@ -168,20 +168,24 @@ class LevelGeometries(): @cached_property def levelconnectors(self): - return self.get_levelconnectors() + return cascaded_union([levelconnector.geometry for levelconnector in self.level.levelconnectors]) - def intermediate_shadows(self, to_level=None): - shadows = self.buildings.buffer(0.3, join_style=JOIN_STYLE.mitre) - shadows = shadows.difference(self.get_levelconnectors(to_level).buffer(0.5, join_style=JOIN_STYLE.mitre)) - if to_level is not None: - shadows = shadows.intersection(to_level.geometries.accessible) + @cached_property + def intermediate_shadows(self): + qs = self.level.levelconnectors.prefetch_related('levels').filter(levels__altitude__lt=self.level.altitude) + connectors = cascaded_union([levelconnector.geometry for levelconnector in qs]) + + shadows = self.buildings.difference(connectors.buffer(0.3, join_style=JOIN_STYLE.mitre)) + shadows = shadows.buffer(0.3, join_style=JOIN_STYLE.mitre) return shadows + @cached_property def hole_shadows(self): holes = self.holes.buffer(0.1, join_style=JOIN_STYLE.mitre) shadows = holes.difference(self.holes.buffer(-0.3, join_style=JOIN_STYLE.mitre)) + qs = self.level.levelconnectors.prefetch_related('levels').filter(levels__altitude__lt=self.level.altitude) - print(self.level.name, qs) connectors = cascaded_union([levelconnector.geometry for levelconnector in qs]) + shadows = shadows.difference(connectors.buffer(0.3, join_style=JOIN_STYLE.mitre)) return shadows diff --git a/src/c3nav/mapdata/render/renderer.py b/src/c3nav/mapdata/render/renderer.py index ae36cc17..4689b45f 100644 --- a/src/c3nav/mapdata/render/renderer.py +++ b/src/c3nav/mapdata/render/renderer.py @@ -173,7 +173,7 @@ class LevelRenderer(): self.add_svg_image(svg, 'file://'+get_render_path('level-%s.base.png' % level.name)) contents = self.add_svg_content(svg) - contents.append(self.polygon_svg(self.level.geometries.hole_shadows(), + contents.append(self.polygon_svg(self.level.geometries.hole_shadows, fill_color='#000000', fill_opacity=0.1)) @@ -197,10 +197,11 @@ class LevelRenderer(): higher.append(level) contents = self.add_svg_content(svg) + accessible = self.level.geometries.accessible for level in higher: - contents.append(self.polygon_svg(level.geometries.intermediate_shadows(to_level=self.level), + contents.append(self.polygon_svg(level.geometries.intermediate_shadows.intersection(accessible), fill_color='#000000', - fill_opacity=0.1)) + fill_opacity=0.05)) for level in higher: self.add_svg_image(svg, 'file://'+get_render_path('level-%s.base.png' % level.name))