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:
|
||||
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()
|
||||
|
|
|
@ -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')
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue