From df0598e5ee9069de25d69bdef4cd6b60b8b0d2f9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Laura=20Kl=C3=BCnder?= Date: Sat, 26 Nov 2016 18:19:55 +0100 Subject: [PATCH] improve renderer: add obstacles and doors --- src/c3nav/mapdata/models/level.py | 33 ++++++++++++++++++++ src/c3nav/mapdata/render/renderer.py | 45 +++++++++++++--------------- 2 files changed, 53 insertions(+), 25 deletions(-) diff --git a/src/c3nav/mapdata/models/level.py b/src/c3nav/mapdata/models/level.py index e0c35b57..3da52439 100644 --- a/src/c3nav/mapdata/models/level.py +++ b/src/c3nav/mapdata/models/level.py @@ -1,6 +1,7 @@ from django.db import models from django.utils.functional import cached_property from django.utils.translation import ugettext_lazy as _ +from shapely.geometry import JOIN_STYLE from shapely.ops import cascaded_union from c3nav.mapdata.models.base import MapItem @@ -57,3 +58,35 @@ class LevelGeometries(): @cached_property def areas(self): return cascaded_union([area.geometry for area in self.level.areas.all()]) + + @cached_property + def mapped(self): + return cascaded_union([self.buildings, self.areas]) + + @cached_property + def obstacles(self): + return cascaded_union([obstacle.geometry for obstacle in self.level.obstacles.all()]) + + @cached_property + def raw_doors(self): + return cascaded_union([door.geometry for door in self.level.doors.all()]).intersection(self.mapped) + + @cached_property + def areas_and_doors(self): + return cascaded_union([self.areas, self.raw_doors]) + + @cached_property + def walls(self): + return self.buildings.difference(self.areas) + + @cached_property + def walls_without_doors(self): + return self.walls.difference(self.areas_and_doors) + + @cached_property + def walls_shadow(self): + return self.walls_without_doors.buffer(0.2, join_style=JOIN_STYLE.mitre).intersection(self.mapped) + + @cached_property + def doors(self): + return self.raw_doors.difference(self.areas) diff --git a/src/c3nav/mapdata/render/renderer.py b/src/c3nav/mapdata/render/renderer.py index 9eb39e63..1efdf266 100644 --- a/src/c3nav/mapdata/render/renderer.py +++ b/src/c3nav/mapdata/render/renderer.py @@ -17,13 +17,13 @@ class LevelRenderer(): def get_dimensions(): aggregate = Package.objects.all().aggregate(Max('right'), Min('left'), Max('top'), Min('bottom')) return ( - (aggregate['right__max'] - aggregate['left__min']) * 10, - (aggregate['top__max'] - aggregate['bottom__min']) * 10 + (aggregate['right__max'] - aggregate['left__min']) * 32, + (aggregate['top__max'] - aggregate['bottom__min']) * 32 ) @staticmethod def polygon_svg(geometry, fill_color=None, stroke_width=0.0, stroke_color=None, filter=None): - element = ET.fromstring(scale(geometry, xfact=10, yfact=10, origin=(0, 0)).svg(0, fill_color or '#FFFFFF')) + element = ET.fromstring(scale(geometry, xfact=32, yfact=32, origin=(0, 0)).svg(0, fill_color or '#FFFFFF')) if element.tag != 'g': new_element = ET.Element('g') new_element.append(element) @@ -57,21 +57,6 @@ class LevelRenderer(): 'xmlns': 'http://www.w3.org/2000/svg', }) - svg.append(ET.fromstring(""" - - - - - - - - - - - - - """)) - contents = ET.Element('g', { 'transform': 'scale(1 -1) translate(0 -%d)' % (height), }) @@ -80,16 +65,26 @@ class LevelRenderer(): contents.append(self.polygon_svg(box(0, 0, width, height), fill_color='#000000')) contents.append(self.polygon_svg(self.level.geometries.buildings, + fill_color='#D5D5D5')) + + contents.append(self.polygon_svg(self.level.geometries.walls_shadow, + fill_color='#CCCCCC')) + + contents.append(self.polygon_svg(self.level.geometries.doors, + fill_color='#FFFFFF', + stroke_color='#CCCCCC', + stroke_width=2)) + + contents.append(self.polygon_svg(self.level.geometries.obstacles, + fill_color='#BDBDBD', + stroke_color='#9E9E9E', + stroke_width=3)) + + contents.append(self.polygon_svg(self.level.geometries.walls_without_doors, fill_color='#949494', stroke_color='#757575', - stroke_width=1.5)) + stroke_width=3)) - contents.append(self.polygon_svg(self.level.geometries.areas, - fill_color='#D5D5D5', - filter='url(#area-filter)')) - contents.append(self.polygon_svg(self.level.geometries.areas, - stroke_color='#757575', - stroke_width=1.5)) return ET.tostring(svg).decode() def write_svg(self):