From a54a85da3b57ff48a5e989dcc26b3428847b1c5c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Laura=20Kl=C3=BCnder?= Date: Sun, 4 Dec 2016 02:33:50 +0100 Subject: [PATCH] in render_full immediate levels now cast shadows --- src/c3nav/mapdata/models/level.py | 29 ++++++++++++++++++++++++++++ src/c3nav/mapdata/render/__init__.py | 4 ++-- src/c3nav/mapdata/render/renderer.py | 5 +++++ src/c3nav/mapdata/utils.py | 13 +++++++++++++ src/c3nav/routing/graph/level.py | 3 ++- src/c3nav/routing/graph/room.py | 2 +- src/c3nav/routing/utils/base.py | 13 +------------ src/c3nav/routing/utils/mpl.py | 2 +- 8 files changed, 54 insertions(+), 17 deletions(-) diff --git a/src/c3nav/mapdata/models/level.py b/src/c3nav/mapdata/models/level.py index cc88f154..f6c5a5c4 100644 --- a/src/c3nav/mapdata/models/level.py +++ b/src/c3nav/mapdata/models/level.py @@ -1,10 +1,12 @@ from django.db import models from django.utils.functional import cached_property from django.utils.translation import ugettext_lazy as _ +from shapely.geometry import CAP_STYLE from shapely.geometry import JOIN_STYLE from shapely.ops import cascaded_union from c3nav.mapdata.models.base import MapItem +from c3nav.mapdata.utils import assert_multipolygon class Level(MapItem): @@ -136,3 +138,30 @@ class LevelGeometries(): @cached_property def doors(self): return self.raw_doors.difference(self.areas) + + def get_levelconnectors(self, to_level=None): + queryset = self.level.levelconnectors.prefetch_related('levels') + print(to_level) + if to_level is not None: + queryset = queryset.filter(levels=to_level) + for item in queryset: + print(item.levels) + return cascaded_union([levelconnector.geometry for levelconnector in queryset]) + + @cached_property + def levelconnectors(self): + return self.get_levelconnectors() + + def intermediate_shadows(self, to_level=None): + rings = [] + for polygon in assert_multipolygon(self.buildings): + rings.append(polygon.exterior) + rings.extend(polygon.interiors) + + objects = [] + levelconnectors = self.get_levelconnectors(to_level) + for ring in rings: + objects.append(ring.difference(levelconnectors)) + lines = cascaded_union(objects) + + return lines.buffer(0.1, cap_style=CAP_STYLE.flat, join_style=JOIN_STYLE.mitre) diff --git a/src/c3nav/mapdata/render/__init__.py b/src/c3nav/mapdata/render/__init__.py index e0cdc89a..a8ce965f 100644 --- a/src/c3nav/mapdata/render/__init__.py +++ b/src/c3nav/mapdata/render/__init__.py @@ -8,11 +8,11 @@ def render_all_levels(): renderers.append(LevelRenderer(level)) for renderer in renderers: - renderer.render_base() + pass#renderer.render_base() for renderer in renderers: if not renderer.level.intermediate: - renderer.render_simple() + pass #renderer.render_simple() for renderer in renderers: if not renderer.level.intermediate: diff --git a/src/c3nav/mapdata/render/renderer.py b/src/c3nav/mapdata/render/renderer.py index 6cbb85ad..1cc04c9d 100644 --- a/src/c3nav/mapdata/render/renderer.py +++ b/src/c3nav/mapdata/render/renderer.py @@ -174,6 +174,11 @@ class LevelRenderer(): break higher.append(level) + contents = self.add_svg_content(svg) + for level in higher: + contents.append(self.polygon_svg(level.geometries.intermediate_shadows(to_level=self.level), + fill_color='#9E9E9E')) + for level in higher: self.add_svg_image(svg, 'file://'+get_render_path('level-%s.base.png' % level.name)) diff --git a/src/c3nav/mapdata/utils.py b/src/c3nav/mapdata/utils.py index bfc7b248..b8981f18 100644 --- a/src/c3nav/mapdata/utils.py +++ b/src/c3nav/mapdata/utils.py @@ -65,3 +65,16 @@ def clean_geometry(geometry): return p return geometry + + +def assert_multipolygon(geometry): + """ + given a Polygon or a MultiPolygon, return a list of Polygons + :param geometry: a Polygon or a MultiPolygon + :return: a list of Polygons + """ + if isinstance(geometry, Polygon): + polygons = [geometry] + else: + polygons = geometry.geoms + return polygons diff --git a/src/c3nav/routing/graph/level.py b/src/c3nav/routing/graph/level.py index 5e25a983..d75adbfb 100644 --- a/src/c3nav/routing/graph/level.py +++ b/src/c3nav/routing/graph/level.py @@ -7,7 +7,8 @@ from shapely.geometry import JOIN_STYLE, Polygon from c3nav.routing.graph.point import GraphPoint from c3nav.routing.graph.room import GraphRoom -from c3nav.routing.utils.base import assert_multipolygon, get_nearest_point +from c3nav.routing.utils.base import get_nearest_point +from c3nav.mapdata.utils import assert_multipolygon from c3nav.routing.utils.draw import _ellipse_bbox, _line_coords diff --git a/src/c3nav/routing/graph/room.py b/src/c3nav/routing/graph/room.py index 4bbb6163..b0bb7b64 100644 --- a/src/c3nav/routing/graph/room.py +++ b/src/c3nav/routing/graph/room.py @@ -5,7 +5,7 @@ from matplotlib.path import Path from shapely.geometry import JOIN_STYLE, LineString from c3nav.routing.graph.point import GraphPoint -from c3nav.routing.utils.base import assert_multipolygon +from c3nav.mapdata.utils import assert_multipolygon from c3nav.routing.utils.coords import get_coords_angles from c3nav.routing.utils.mpl import polygon_to_mpl_paths diff --git a/src/c3nav/routing/utils/base.py b/src/c3nav/routing/utils/base.py index a69bf6ea..e363fd4b 100644 --- a/src/c3nav/routing/utils/base.py +++ b/src/c3nav/routing/utils/base.py @@ -1,17 +1,6 @@ from shapely.geometry import Polygon - -def assert_multipolygon(geometry): - """ - given a Polygon or a MultiPolygon, return a list of Polygons - :param geometry: a Polygon or a MultiPolygon - :return: a list of Polygons - """ - if isinstance(geometry, Polygon): - polygons = [geometry] - else: - polygons = geometry.geoms - return polygons +from c3nav.mapdata.utils import assert_multipolygon def get_nearest_point(polygon, point): diff --git a/src/c3nav/routing/utils/mpl.py b/src/c3nav/routing/utils/mpl.py index 6b7401ab..6c129692 100644 --- a/src/c3nav/routing/utils/mpl.py +++ b/src/c3nav/routing/utils/mpl.py @@ -1,6 +1,6 @@ from matplotlib.path import Path -from c3nav.routing.utils.base import assert_multipolygon +from c3nav.mapdata.utils import assert_multipolygon def polygon_to_mpl_paths(polygon):