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:
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():
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():
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()]))
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)
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()

View file

@ -3,6 +3,7 @@ import xml.etree.ElementTree as ET
from itertools import chain
from shapely.affinity import scale, translate
from shapely.ops import unary_union
class SVGImage:
@ -14,6 +15,8 @@ class SVGImage:
self.g = ET.Element('g', {})
self.defs = ET.Element('defs')
self.def_i = 0
self.altitudes = {}
self.last_altitude = None
blur_filter = ET.Element('filter', {'id': 'wallblur'})
blur_filter.append(ET.Element('feGaussianBlur',
@ -83,9 +86,22 @@ class SVGImage:
self.defs.append(clippath)
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,
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 not geometry:
return
@ -93,6 +109,10 @@ class SVGImage:
element = ET.Element('use', {'xlink:href': '#'+geometry})
else:
element = self._create_geometry(geometry)
if altitude is not None or elevation is not None:
self.clip_altitudes(geometry, altitude)
else:
element = ET.Element('rect', {'width': '100%', 'height': '100%'})
element.set('fill', fill_color or 'none')