in render_full immediate levels now cast shadows

This commit is contained in:
Laura Klünder 2016-12-04 02:33:50 +01:00
parent a1ed7534d9
commit a54a85da3b
8 changed files with 54 additions and 17 deletions

View file

@ -1,10 +1,12 @@
from django.db import models
from django.utils.functional import cached_property
from django.utils.translation import ugettext_lazy as _
from shapely.geometry import CAP_STYLE
from shapely.geometry import JOIN_STYLE
from shapely.ops import cascaded_union
from c3nav.mapdata.models.base import MapItem
from c3nav.mapdata.utils import assert_multipolygon
class Level(MapItem):
@ -136,3 +138,30 @@ class LevelGeometries():
@cached_property
def doors(self):
return self.raw_doors.difference(self.areas)
def get_levelconnectors(self, to_level=None):
queryset = self.level.levelconnectors.prefetch_related('levels')
print(to_level)
if to_level is not None:
queryset = queryset.filter(levels=to_level)
for item in queryset:
print(item.levels)
return cascaded_union([levelconnector.geometry for levelconnector in queryset])
@cached_property
def levelconnectors(self):
return self.get_levelconnectors()
def intermediate_shadows(self, to_level=None):
rings = []
for polygon in assert_multipolygon(self.buildings):
rings.append(polygon.exterior)
rings.extend(polygon.interiors)
objects = []
levelconnectors = self.get_levelconnectors(to_level)
for ring in rings:
objects.append(ring.difference(levelconnectors))
lines = cascaded_union(objects)
return lines.buffer(0.1, cap_style=CAP_STYLE.flat, join_style=JOIN_STYLE.mitre)

View file

@ -8,11 +8,11 @@ def render_all_levels():
renderers.append(LevelRenderer(level))
for renderer in renderers:
renderer.render_base()
pass#renderer.render_base()
for renderer in renderers:
if not renderer.level.intermediate:
renderer.render_simple()
pass #renderer.render_simple()
for renderer in renderers:
if not renderer.level.intermediate:

View file

@ -174,6 +174,11 @@ class LevelRenderer():
break
higher.append(level)
contents = self.add_svg_content(svg)
for level in higher:
contents.append(self.polygon_svg(level.geometries.intermediate_shadows(to_level=self.level),
fill_color='#9E9E9E'))
for level in higher:
self.add_svg_image(svg, 'file://'+get_render_path('level-%s.base.png' % level.name))

View file

@ -65,3 +65,16 @@ def clean_geometry(geometry):
return p
return geometry
def assert_multipolygon(geometry):
"""
given a Polygon or a MultiPolygon, return a list of Polygons
:param geometry: a Polygon or a MultiPolygon
:return: a list of Polygons
"""
if isinstance(geometry, Polygon):
polygons = [geometry]
else:
polygons = geometry.geoms
return polygons

View file

@ -7,7 +7,8 @@ from shapely.geometry import JOIN_STYLE, Polygon
from c3nav.routing.graph.point import GraphPoint
from c3nav.routing.graph.room import GraphRoom
from c3nav.routing.utils.base import assert_multipolygon, get_nearest_point
from c3nav.routing.utils.base import get_nearest_point
from c3nav.mapdata.utils import assert_multipolygon
from c3nav.routing.utils.draw import _ellipse_bbox, _line_coords

View file

@ -5,7 +5,7 @@ from matplotlib.path import Path
from shapely.geometry import JOIN_STYLE, LineString
from c3nav.routing.graph.point import GraphPoint
from c3nav.routing.utils.base import assert_multipolygon
from c3nav.mapdata.utils import assert_multipolygon
from c3nav.routing.utils.coords import get_coords_angles
from c3nav.routing.utils.mpl import polygon_to_mpl_paths

View file

@ -1,17 +1,6 @@
from shapely.geometry import Polygon
def assert_multipolygon(geometry):
"""
given a Polygon or a MultiPolygon, return a list of Polygons
:param geometry: a Polygon or a MultiPolygon
:return: a list of Polygons
"""
if isinstance(geometry, Polygon):
polygons = [geometry]
else:
polygons = geometry.geoms
return polygons
from c3nav.mapdata.utils import assert_multipolygon
def get_nearest_point(polygon, point):

View file

@ -1,6 +1,6 @@
from matplotlib.path import Path
from c3nav.routing.utils.base import assert_multipolygon
from c3nav.mapdata.utils import assert_multipolygon
def polygon_to_mpl_paths(polygon):