in render_full immediate levels now cast shadows
This commit is contained in:
parent
a1ed7534d9
commit
a54a85da3b
8 changed files with 54 additions and 17 deletions
|
@ -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)
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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))
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
||||
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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):
|
||||
|
|
|
@ -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):
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue