diff --git a/src/c3nav/mapdata/management/commands/renderstl.py b/src/c3nav/mapdata/management/commands/renderstl.py index 39485775..2ba6ff6d 100644 --- a/src/c3nav/mapdata/management/commands/renderstl.py +++ b/src/c3nav/mapdata/management/commands/renderstl.py @@ -54,11 +54,14 @@ class Command(BaseCommand): help=_('levels to render, e.g. 0,1,2 or * for all levels (default)')) parser.add_argument('--permissions', default='0', type=self.permissions_value, help=_('permissions, e.g. 2,3 or * for all permissions or 0 for none (default)')) + parser.add_argument('--full-levels', action='store_const', const=True, default=False, + help=_('render all levels completely')) def handle(self, *args, **options): (minx, miny), (maxx, maxy) = Source.max_bounds() for level in options['levels']: - renderer = MapRenderer(level.pk, minx, miny, maxx, maxy, access_permissions=options['permissions']) + renderer = MapRenderer(level.pk, minx, miny, maxx, maxy, access_permissions=options['permissions'], + full_levels=options['full_levels']) stl = renderer.render(STLEngine) data = stl.render() diff --git a/src/c3nav/mapdata/render/data.py b/src/c3nav/mapdata/render/data.py index 676a75a9..39415902 100644 --- a/src/c3nav/mapdata/render/data.py +++ b/src/c3nav/mapdata/render/data.py @@ -223,6 +223,8 @@ class LevelRenderData: if not new_area.is_empty: new_geoms.restricted_spaces_outdoors[access_restriction] = new_area + new_geoms.pk = old_geoms.pk + new_geoms.on_top_of_id = old_geoms.on_top_of_id new_geoms.default_height = old_geoms.default_height new_geoms.build_mesh() @@ -280,6 +282,8 @@ class LevelGeometries: self.restricted_spaces_outdoors = None self.affected_area = None + self.pk = None + self.on_top_of_id = None self.default_height = None @staticmethod @@ -369,6 +373,8 @@ class LevelGeometries: geoms.walls = buildings_geom.difference(spaces_geom).difference(doors_geom) # general level infos + geoms.pk = level.pk + geoms.on_top_of_id = level.on_top_of_id geoms.default_height = level.default_height return geoms diff --git a/src/c3nav/mapdata/render/renderer.py b/src/c3nav/mapdata/render/renderer.py index d82d3744..0f53b9e0 100644 --- a/src/c3nav/mapdata/render/renderer.py +++ b/src/c3nav/mapdata/render/renderer.py @@ -1,3 +1,5 @@ +from itertools import chain + from django.core.cache import cache from django.utils.functional import cached_property from shapely import prepared @@ -10,7 +12,7 @@ from c3nav.mapdata.render.engines.base import FillAttribs, StrokeAttribs class MapRenderer: - def __init__(self, level, minx, miny, maxx, maxy, scale=1, access_permissions=None): + def __init__(self, level, minx, miny, maxx, maxy, scale=1, access_permissions=None, full_levels=False): self.level = level.pk if isinstance(level, Level) else level self.minx = minx self.miny = miny @@ -18,6 +20,7 @@ class MapRenderer: self.maxy = maxy self.scale = scale self.access_permissions = set(access_permissions) if access_permissions else set() + self.full_levels = full_levels self.width = int(round((maxx - minx) * scale)) self.height = int(round((maxy - miny) * scale)) @@ -71,7 +74,16 @@ class MapRenderer: bbox = prepared.prep(self.bbox) - for geoms in self.level_render_data.levels: + if self.full_levels: + levels = tuple(chain(*( + tuple(sublevel for sublevel in LevelRenderData.get(level.pk).levels + if sublevel.pk == level.pk or sublevel.on_top_of_id == level.pk) + for level in self.level_render_data.levels if level.on_top_of_id is None + ))) + else: + levels = self.level_render_data.levels + + for geoms in levels: if not bbox.intersects(geoms.affected_area): continue