From 26cb860efb8c2a4e234b40f0a570166840fc325b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Laura=20Kl=C3=BCnder?= Date: Wed, 20 Dec 2017 12:21:44 +0100 Subject: [PATCH] darken lower levels --- src/c3nav/mapdata/render/engines/base.py | 5 ++++- src/c3nav/mapdata/render/engines/svg.py | 6 +++++- src/c3nav/mapdata/render/renderdata.py | 23 +++++++++++++++++++++++ src/c3nav/mapdata/render/renderer.py | 7 +++++-- 4 files changed, 37 insertions(+), 4 deletions(-) diff --git a/src/c3nav/mapdata/render/engines/base.py b/src/c3nav/mapdata/render/engines/base.py index cfdf169d..4ea48761 100644 --- a/src/c3nav/mapdata/render/engines/base.py +++ b/src/c3nav/mapdata/render/engines/base.py @@ -70,6 +70,9 @@ class RenderEngine(ABC): def add_group(self, group): pass + def darken(self, area): + pass + def add_geometry(self, geometry, fill: Optional[FillAttribs] = None, stroke: Optional[StrokeAttribs] = None, altitude=None, height=None, shape_cache_key=None, category=None, item=None): # draw a shapely geometry with a given style @@ -86,7 +89,7 @@ class RenderEngine(ABC): @abstractmethod def _add_geometry(self, geometry, fill: Optional[FillAttribs], stroke: Optional[StrokeAttribs], - altitude=None, height=None, shape_cache_key=None, item=None): + altitude=None, height=None, shape_cache_key=None, category=None, item=None): pass def set_mesh_lookup_data(self, data): diff --git a/src/c3nav/mapdata/render/engines/svg.py b/src/c3nav/mapdata/render/engines/svg.py index 64b20d86..03908d00 100644 --- a/src/c3nav/mapdata/render/engines/svg.py +++ b/src/c3nav/mapdata/render/engines/svg.py @@ -214,9 +214,13 @@ class SVGEngine(RenderEngine): else: self.altitudes[new_altitude] = new_geometry + def darken(self, area): + if area: + self.add_geometry(geometry=area, fill=FillAttribs('#000000', 0.1), category='darken') + def _add_geometry(self, geometry, fill: Optional[FillAttribs], stroke: Optional[StrokeAttribs], altitude=None, height=None, shape_cache_key=None, **kwargs): - geometry = self.buffered_bbox.intersection(geometry.geom) + geometry = self.buffered_bbox.intersection(geometry.geom if hasattr(geometry, 'geom') else geometry) if geometry.is_empty: return diff --git a/src/c3nav/mapdata/render/renderdata.py b/src/c3nav/mapdata/render/renderdata.py index 900e447f..c684969a 100644 --- a/src/c3nav/mapdata/render/renderdata.py +++ b/src/c3nav/mapdata/render/renderdata.py @@ -42,6 +42,8 @@ class LevelRenderData: def __init__(self): self.levels = [] self.base_altitude = None + self.lowest_important_level = None + self.darken_area = None @staticmethod def rebuild(): @@ -95,12 +97,25 @@ class LevelRenderData: # levels above them. crop_to = None primary_level_count = 0 + main_level_passed = 0 + lowest_important_level = None for sublevel in reversed(sublevels): geoms = single_level_geoms[sublevel.pk] if geoms.holes is not None: primary_level_count += 1 + # get lowest intermediate level directly below main level + + if not main_level_passed: + if geoms.pk == level.pk: + main_level_passed = 1 + else: + if not sublevel.on_top_of_id: + main_level_passed += 1 + if main_level_passed < 2: + lowest_important_level = sublevel + # set crop area if we area on the second primary layer from top or below level_crop_to[sublevel.pk] = Cropper(crop_to if primary_level_count > 1 else None) @@ -115,9 +130,11 @@ class LevelRenderData: render_data = LevelRenderData() render_data.base_altitude = level.base_altitude + render_data.lowest_important_level = lowest_important_level.pk access_restriction_affected = {} # go through sublevels, get their level geometries and crop them + lowest_important_level_passed = False for sublevel in sublevels: try: crop_to = level_crop_to[sublevel.pk] @@ -126,6 +143,12 @@ class LevelRenderData: old_geoms = single_level_geoms[sublevel.pk] + if render_data.lowest_important_level == sublevel.pk: + lowest_important_level_passed = True + + if old_geoms.holes and render_data.darken_area is None and lowest_important_level_passed: + render_data.darken_area = old_geoms.holes + if crop_to.geometry is not None: map_history.composite(MapHistory.open_level(sublevel.pk, 'base'), crop_to.geometry) elif level.pk != sublevel.pk: diff --git a/src/c3nav/mapdata/render/renderer.py b/src/c3nav/mapdata/render/renderer.py index d9165c74..751bf0ae 100644 --- a/src/c3nav/mapdata/render/renderer.py +++ b/src/c3nav/mapdata/render/renderer.py @@ -54,11 +54,14 @@ class MapRenderer: not_full_levels = engine.is_3d # always do non-full-levels until after the first primary level full_levels = self.full_levels and engine.is_3d for geoms in levels: + engine.add_group('level_%s' % geoms.short_label) + + if geoms.pk == level_render_data.lowest_important_level: + engine.darken(level_render_data.darken_area) + if not bbox.intersects(geoms.affected_area): continue - engine.add_group('level_%s' % geoms.short_label) - # hide indoor and outdoor rooms if their access restriction was not unlocked add_walls = hybrid_union(tuple(area for access_restriction, area in geoms.restricted_spaces_indoors.items() if access_restriction not in access_permissions))