From 88ded72524ba374ab12c386efc928b962792b86b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Laura=20Kl=C3=BCnder?= Date: Wed, 21 Dec 2016 22:23:42 +0100 Subject: [PATCH] render area segments and deliver them --- src/c3nav/mapdata/render/__init__.py | 4 +++ src/c3nav/mapdata/render/renderer.py | 42 +++++++++++++++++++++++++++- src/c3nav/site/views.py | 2 ++ 3 files changed, 47 insertions(+), 1 deletion(-) diff --git a/src/c3nav/mapdata/render/__init__.py b/src/c3nav/mapdata/render/__init__.py index b0ddfe68..cea5c070 100644 --- a/src/c3nav/mapdata/render/__init__.py +++ b/src/c3nav/mapdata/render/__init__.py @@ -19,3 +19,7 @@ def render_all_levels(show_accessibles=False): for renderer in renderers: if not renderer.level.intermediate: renderer.render_full() + + for renderer in renderers: + if not renderer.level.intermediate: + renderer.render_segments() diff --git a/src/c3nav/mapdata/render/renderer.py b/src/c3nav/mapdata/render/renderer.py index f8417ca2..32d52283 100644 --- a/src/c3nav/mapdata/render/renderer.py +++ b/src/c3nav/mapdata/render/renderer.py @@ -6,7 +6,8 @@ from django.conf import settings from shapely.affinity import scale from shapely.geometry import JOIN_STYLE, box -from c3nav.mapdata.utils.misc import get_dimensions, get_render_dimensions, get_render_path +from c3nav.mapdata.inclusion import get_maybe_invisible_areas +from c3nav.mapdata.utils.misc import get_dimensions, get_public_private_area, get_render_dimensions, get_render_path class LevelRenderer(): @@ -86,6 +87,7 @@ class LevelRenderer(): 'xlink:href': 'file://'+os.path.abspath(image) }) svg.append(contents) + return contents def render_base(self, png=True, show_accessibles=False): svg = self.create_svg() @@ -238,3 +240,41 @@ class LevelRenderer(): if png: png_filename = self.get_filename('full', 'png') subprocess.call(['rsvg-convert', filename, '-o', png_filename]) + + def add_clippath(self, svg): + defs = ET.Element('defs') + svg.append(defs) + clippath = ET.Element('clipPath', { + 'id': 'clip-path', + }) + defs.append(clippath) + return self.add_svg_content(clippath) + + def render_segments(self, png=True): + if self.only_public: + return + + for area in get_maybe_invisible_areas(): + svg = self.create_svg() + + public_area, private_area = get_public_private_area(self.level) + + if area.level == self.level: + clippath = self.add_clippath(svg) + + geometry = area.geometry.intersection(self.level.geometries.areas_and_doors) + geometry = geometry.buffer(-0.1, join_style=JOIN_STYLE.mitre) + geometry = geometry.intersection(private_area).buffer(1.5, join_style=JOIN_STYLE.mitre) + polygon = self.polygon_svg(geometry) + clippath.append(polygon) + + image = self.add_svg_image(svg, self.get_filename('simple', 'png')) + image.attrib['clip-path'] = 'url(#clip-path)' + + filename = self.get_filename('full', area.location_id+'.svg') + with open(filename, 'w') as f: + f.write(ET.tostring(svg).decode()) + + if png: + png_filename = self.get_filename('full', area.location_id+'.png') + subprocess.call(['rsvg-convert', filename, '-o', png_filename]) diff --git a/src/c3nav/site/views.py b/src/c3nav/site/views.py index 4685ce70..7f9cb85c 100644 --- a/src/c3nav/site/views.py +++ b/src/c3nav/site/views.py @@ -223,6 +223,8 @@ def map_image(request, area, level): if not request.c3nav_full_access: raise Http404 img = get_render_path('png', level.name, 'full', False) + elif area in request.c3nav_access_list: + img = get_render_path(area+'.png', level.name, 'full', False) else: raise Http404