render space inventory
This commit is contained in:
parent
f0b35a902f
commit
31160e1141
2 changed files with 40 additions and 1 deletions
|
@ -80,7 +80,7 @@ class Space(SpecificLocation, LevelSectionGeometryMixin, models.Model):
|
||||||
def get_color(self):
|
def get_color(self):
|
||||||
color = {
|
color = {
|
||||||
'stairs': '#dddddd',
|
'stairs': '#dddddd',
|
||||||
'escalator': '#a9a9a9',
|
'escalator': '#bbbbbb',
|
||||||
'elevator': '#00ffff',
|
'elevator': '#00ffff',
|
||||||
}.get(self.category)
|
}.get(self.category)
|
||||||
if not color:
|
if not color:
|
||||||
|
|
|
@ -38,6 +38,31 @@ class Section(SpecificLocation, EditorFormMixin, models.Model):
|
||||||
result['altitude'] = float(str(self.altitude))
|
result['altitude'] = float(str(self.altitude))
|
||||||
return result
|
return result
|
||||||
|
|
||||||
|
def _render_space_ground(self, svg, space):
|
||||||
|
areas_by_color = {}
|
||||||
|
for area in space.areas.all():
|
||||||
|
areas_by_color.setdefault(area.get_color(), []).append(area)
|
||||||
|
areas_by_color.pop(None, None)
|
||||||
|
areas_by_color.pop('', None)
|
||||||
|
for i, (color, color_areas) in enumerate(areas_by_color.items()):
|
||||||
|
geometries = cascaded_union(tuple(area.geometry for area in color_areas)).intersection(space.geometry)
|
||||||
|
svg.add_geometry(geometries, fill_color=color)
|
||||||
|
|
||||||
|
stair_geometries = tuple(stair.geometry for stair in space.stairs.all())
|
||||||
|
svg.add_geometry(cascaded_union(stair_geometries).intersection(space.geometry),
|
||||||
|
stroke_width=0.06, stroke_color='#000000', opacity=0.15)
|
||||||
|
for i in range(2):
|
||||||
|
svg.add_geometry(cascaded_union(tuple(g.parallel_offset(0.06+0.04*i, 'right', join_style=JOIN_STYLE.mitre)
|
||||||
|
for g in stair_geometries)).intersection(space.geometry),
|
||||||
|
stroke_width=0.04, stroke_color='#000000', opacity=0.07-0.05*i)
|
||||||
|
|
||||||
|
def _render_space_inventory(self, svg, space):
|
||||||
|
obstacle_geometries = cascaded_union(
|
||||||
|
tuple(obstacle.geometry for obstacle in space.obstacles.all()) +
|
||||||
|
tuple(obstacle.buffered_geometry for obstacle in space.lineobstacles.all())
|
||||||
|
).intersection(space.geometry)
|
||||||
|
svg.add_geometry(obstacle_geometries, fill_color='#999999')
|
||||||
|
|
||||||
def render_svg(self):
|
def render_svg(self):
|
||||||
width, height = get_dimensions()
|
width, height = get_dimensions()
|
||||||
svg = SVGImage(width=width, height=height, scale=settings.RENDER_SCALE)
|
svg = SVGImage(width=width, height=height, scale=settings.RENDER_SCALE)
|
||||||
|
@ -67,6 +92,10 @@ class Section(SpecificLocation, EditorFormMixin, models.Model):
|
||||||
geometries = cascaded_union(tuple(space.geometry for space in color_spaces))
|
geometries = cascaded_union(tuple(space.geometry for space in color_spaces))
|
||||||
svg.add_geometry(geometries, fill_color=color or '#d1d1d1')
|
svg.add_geometry(geometries, fill_color=color or '#d1d1d1')
|
||||||
|
|
||||||
|
for space in space_levels['lower']:
|
||||||
|
self._render_space_ground(svg, space)
|
||||||
|
self._render_space_inventory(svg, space)
|
||||||
|
|
||||||
# draw space background
|
# draw space background
|
||||||
door_geometries = cascaded_union(tuple(d.geometry for d in self.doors.all()))
|
door_geometries = cascaded_union(tuple(d.geometry for d in self.doors.all()))
|
||||||
section_geometry = cascaded_union((space_geometries[''], building_geometries, door_geometries))
|
section_geometry = cascaded_union((space_geometries[''], building_geometries, door_geometries))
|
||||||
|
@ -84,6 +113,9 @@ class Section(SpecificLocation, EditorFormMixin, models.Model):
|
||||||
geometries = cascaded_union(tuple(space.geometry for space in color_spaces))
|
geometries = cascaded_union(tuple(space.geometry for space in color_spaces))
|
||||||
svg.add_geometry(geometries, fill_color=color)
|
svg.add_geometry(geometries, fill_color=color)
|
||||||
|
|
||||||
|
for space in space_levels['']:
|
||||||
|
self._render_space_ground(svg, space)
|
||||||
|
|
||||||
# calculate walls
|
# calculate walls
|
||||||
wall_geometry = building_geometries.difference(space_geometries['']).difference(door_geometries)
|
wall_geometry = building_geometries.difference(space_geometries['']).difference(door_geometries)
|
||||||
|
|
||||||
|
@ -91,6 +123,9 @@ class Section(SpecificLocation, EditorFormMixin, models.Model):
|
||||||
wall_dilated_geometry = wall_geometry.buffer(0.7, join_style=JOIN_STYLE.mitre)
|
wall_dilated_geometry = wall_geometry.buffer(0.7, join_style=JOIN_STYLE.mitre)
|
||||||
svg.add_geometry(wall_dilated_geometry, fill_color='#000000', opacity=0.1, filter='wallblur', clip_path=section_clip)
|
svg.add_geometry(wall_dilated_geometry, fill_color='#000000', opacity=0.1, filter='wallblur', clip_path=section_clip)
|
||||||
|
|
||||||
|
for space in space_levels['']:
|
||||||
|
self._render_space_inventory(svg, space)
|
||||||
|
|
||||||
# draw walls
|
# draw walls
|
||||||
svg.add_geometry(wall_geometry, fill_color='#929292', stroke_color='#333333', stroke_width=0.07)
|
svg.add_geometry(wall_geometry, fill_color='#929292', stroke_color='#333333', stroke_width=0.07)
|
||||||
|
|
||||||
|
@ -107,4 +142,8 @@ class Section(SpecificLocation, EditorFormMixin, models.Model):
|
||||||
geometries = cascaded_union(tuple(space.geometry for space in color_spaces))
|
geometries = cascaded_union(tuple(space.geometry for space in color_spaces))
|
||||||
svg.add_geometry(geometries, fill_color=color or '#d1d1d1')
|
svg.add_geometry(geometries, fill_color=color or '#d1d1d1')
|
||||||
|
|
||||||
|
for space in space_levels['upper']:
|
||||||
|
self._render_space_ground(svg, space)
|
||||||
|
self._render_space_inventory(svg, space)
|
||||||
|
|
||||||
return svg.get_xml()
|
return svg.get_xml()
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue