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.db import models
|
||||||
from django.utils.functional import cached_property
|
from django.utils.functional import cached_property
|
||||||
from django.utils.translation import ugettext_lazy as _
|
from django.utils.translation import ugettext_lazy as _
|
||||||
|
from shapely.geometry import CAP_STYLE
|
||||||
from shapely.geometry import JOIN_STYLE
|
from shapely.geometry import JOIN_STYLE
|
||||||
from shapely.ops import cascaded_union
|
from shapely.ops import cascaded_union
|
||||||
|
|
||||||
from c3nav.mapdata.models.base import MapItem
|
from c3nav.mapdata.models.base import MapItem
|
||||||
|
from c3nav.mapdata.utils import assert_multipolygon
|
||||||
|
|
||||||
|
|
||||||
class Level(MapItem):
|
class Level(MapItem):
|
||||||
|
@ -136,3 +138,30 @@ class LevelGeometries():
|
||||||
@cached_property
|
@cached_property
|
||||||
def doors(self):
|
def doors(self):
|
||||||
return self.raw_doors.difference(self.areas)
|
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))
|
renderers.append(LevelRenderer(level))
|
||||||
|
|
||||||
for renderer in renderers:
|
for renderer in renderers:
|
||||||
renderer.render_base()
|
pass#renderer.render_base()
|
||||||
|
|
||||||
for renderer in renderers:
|
for renderer in renderers:
|
||||||
if not renderer.level.intermediate:
|
if not renderer.level.intermediate:
|
||||||
renderer.render_simple()
|
pass #renderer.render_simple()
|
||||||
|
|
||||||
for renderer in renderers:
|
for renderer in renderers:
|
||||||
if not renderer.level.intermediate:
|
if not renderer.level.intermediate:
|
||||||
|
|
|
@ -174,6 +174,11 @@ class LevelRenderer():
|
||||||
break
|
break
|
||||||
higher.append(level)
|
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:
|
for level in higher:
|
||||||
self.add_svg_image(svg, 'file://'+get_render_path('level-%s.base.png' % level.name))
|
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 p
|
||||||
|
|
||||||
return geometry
|
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.point import GraphPoint
|
||||||
from c3nav.routing.graph.room import GraphRoom
|
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
|
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 shapely.geometry import JOIN_STYLE, LineString
|
||||||
|
|
||||||
from c3nav.routing.graph.point import GraphPoint
|
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.coords import get_coords_angles
|
||||||
from c3nav.routing.utils.mpl import polygon_to_mpl_paths
|
from c3nav.routing.utils.mpl import polygon_to_mpl_paths
|
||||||
|
|
||||||
|
|
|
@ -1,17 +1,6 @@
|
||||||
from shapely.geometry import Polygon
|
from shapely.geometry import Polygon
|
||||||
|
|
||||||
|
from c3nav.mapdata.utils import assert_multipolygon
|
||||||
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
|
|
||||||
|
|
||||||
|
|
||||||
def get_nearest_point(polygon, point):
|
def get_nearest_point(polygon, point):
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
from matplotlib.path import Path
|
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):
|
def polygon_to_mpl_paths(polygon):
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue