track altitude in svg utils

This commit is contained in:
Laura Klünder 2017-10-16 17:39:25 +02:00
parent aa5399c82c
commit 4d3fb7786f
2 changed files with 27 additions and 5 deletions

View file

@ -20,10 +20,11 @@ def render_svg(level, miny, minx, maxy, maxx, scale=1):
for level in levels: for level in levels:
buildings_geom = bbox.intersection(unary_union([b.geometry for b in level.buildings.all()])) buildings_geom = bbox.intersection(unary_union([b.geometry for b in level.buildings.all()]))
svg.add_geometry(buildings_geom, fill_color='#aaaaaa') # svg.add_geometry(buildings_geom, fill_color='#aaaaaa')
for altitudearea in level.altitudeareas.all(): for altitudearea in level.altitudeareas.all():
svg.add_geometry(bbox.intersection(altitudearea.geometry), fill_color='#ececec') svg.add_geometry(bbox.intersection(altitudearea.geometry),
fill_color='#ffffff', altitude=altitudearea.altitude)
for space in level.spaces.all(): for space in level.spaces.all():
if space.outside: if space.outside:
@ -33,10 +34,11 @@ def render_svg(level, miny, minx, maxy, maxx, scale=1):
doors_geom = bbox.intersection(unary_union([d.geometry for d in level.doors.all()])) doors_geom = bbox.intersection(unary_union([d.geometry for d in level.doors.all()]))
svg.add_geometry(spaces_geom, fill_color='#eeeeee') svg.add_geometry(spaces_geom, fill_color='#eeeeee')
svg.add_geometry(doors_geom.difference(spaces_geom), fill_color='#ffffff') # svg.add_geometry(doors_geom.difference(spaces_geom), fill_color='#ffffff')
walls_geom = buildings_geom.difference(spaces_geom).difference(doors_geom) walls_geom = buildings_geom.difference(spaces_geom).difference(doors_geom)
svg.add_geometry(walls_geom, fill_color='#aaaaaa', stroke_px=0.5, stroke_color='#aaaaaa') svg.add_geometry(walls_geom, fill_color='#aaaaaa', stroke_px=0.5, stroke_color='#aaaaaa',
elevation=level.default_height)
return svg.get_xml() return svg.get_xml()

View file

@ -3,6 +3,7 @@ import xml.etree.ElementTree as ET
from itertools import chain from itertools import chain
from shapely.affinity import scale, translate from shapely.affinity import scale, translate
from shapely.ops import unary_union
class SVGImage: class SVGImage:
@ -14,6 +15,8 @@ class SVGImage:
self.g = ET.Element('g', {}) self.g = ET.Element('g', {})
self.defs = ET.Element('defs') self.defs = ET.Element('defs')
self.def_i = 0 self.def_i = 0
self.altitudes = {}
self.last_altitude = None
blur_filter = ET.Element('filter', {'id': 'wallblur'}) blur_filter = ET.Element('filter', {'id': 'wallblur'})
blur_filter.append(ET.Element('feGaussianBlur', blur_filter.append(ET.Element('feGaussianBlur',
@ -83,9 +86,22 @@ class SVGImage:
self.defs.append(clippath) self.defs.append(clippath)
return defid return defid
def clip_altitudes(self, new_geometry, new_altitude=None):
for altitude, geometry in self.altitudes.items():
if altitude != new_altitude:
self.altitudes[altitude] = geometry.difference(new_geometry)
if new_altitude is not None:
if self.last_altitude is not None and self.last_altitude > new_altitude:
raise ValueError('Altitudes have to be ascending.')
self.last_altitude = new_altitude
if new_altitude in self.altitudes:
self.altitudes[new_altitude] = unary_union([self.altitudes[new_altitude], new_geometry])
else:
self.altitudes[new_altitude] = new_geometry
def add_geometry(self, geometry=None, fill_color=None, fill_opacity=None, opacity=None, filter=None, def add_geometry(self, geometry=None, fill_color=None, fill_opacity=None, opacity=None, filter=None,
stroke_px=0.0, stroke_width=0.0, stroke_color=None, stroke_opacity=None, stroke_linejoin=None, stroke_px=0.0, stroke_width=0.0, stroke_color=None, stroke_opacity=None, stroke_linejoin=None,
clip_path=None): clip_path=None, altitude=None, elevation=None):
if geometry is not None: if geometry is not None:
if not geometry: if not geometry:
return return
@ -93,6 +109,10 @@ class SVGImage:
element = ET.Element('use', {'xlink:href': '#'+geometry}) element = ET.Element('use', {'xlink:href': '#'+geometry})
else: else:
element = self._create_geometry(geometry) element = self._create_geometry(geometry)
if altitude is not None or elevation is not None:
self.clip_altitudes(geometry, altitude)
else: else:
element = ET.Element('rect', {'width': '100%', 'height': '100%'}) element = ET.Element('rect', {'width': '100%', 'height': '100%'})
element.set('fill', fill_color or 'none') element.set('fill', fill_color or 'none')