track altitude in svg utils
This commit is contained in:
parent
aa5399c82c
commit
4d3fb7786f
2 changed files with 27 additions and 5 deletions
|
@ -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()
|
||||||
|
|
|
@ -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')
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue