darken lower levels
This commit is contained in:
parent
07a1a79cc4
commit
26cb860efb
4 changed files with 37 additions and 4 deletions
|
@ -70,6 +70,9 @@ class RenderEngine(ABC):
|
||||||
def add_group(self, group):
|
def add_group(self, group):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
def darken(self, area):
|
||||||
|
pass
|
||||||
|
|
||||||
def add_geometry(self, geometry, fill: Optional[FillAttribs] = None, stroke: Optional[StrokeAttribs] = None,
|
def add_geometry(self, geometry, fill: Optional[FillAttribs] = None, stroke: Optional[StrokeAttribs] = None,
|
||||||
altitude=None, height=None, shape_cache_key=None, category=None, item=None):
|
altitude=None, height=None, shape_cache_key=None, category=None, item=None):
|
||||||
# draw a shapely geometry with a given style
|
# draw a shapely geometry with a given style
|
||||||
|
@ -86,7 +89,7 @@ class RenderEngine(ABC):
|
||||||
|
|
||||||
@abstractmethod
|
@abstractmethod
|
||||||
def _add_geometry(self, geometry, fill: Optional[FillAttribs], stroke: Optional[StrokeAttribs],
|
def _add_geometry(self, geometry, fill: Optional[FillAttribs], stroke: Optional[StrokeAttribs],
|
||||||
altitude=None, height=None, shape_cache_key=None, item=None):
|
altitude=None, height=None, shape_cache_key=None, category=None, item=None):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
def set_mesh_lookup_data(self, data):
|
def set_mesh_lookup_data(self, data):
|
||||||
|
|
|
@ -214,9 +214,13 @@ class SVGEngine(RenderEngine):
|
||||||
else:
|
else:
|
||||||
self.altitudes[new_altitude] = new_geometry
|
self.altitudes[new_altitude] = new_geometry
|
||||||
|
|
||||||
|
def darken(self, area):
|
||||||
|
if area:
|
||||||
|
self.add_geometry(geometry=area, fill=FillAttribs('#000000', 0.1), category='darken')
|
||||||
|
|
||||||
def _add_geometry(self, geometry, fill: Optional[FillAttribs], stroke: Optional[StrokeAttribs],
|
def _add_geometry(self, geometry, fill: Optional[FillAttribs], stroke: Optional[StrokeAttribs],
|
||||||
altitude=None, height=None, shape_cache_key=None, **kwargs):
|
altitude=None, height=None, shape_cache_key=None, **kwargs):
|
||||||
geometry = self.buffered_bbox.intersection(geometry.geom)
|
geometry = self.buffered_bbox.intersection(geometry.geom if hasattr(geometry, 'geom') else geometry)
|
||||||
|
|
||||||
if geometry.is_empty:
|
if geometry.is_empty:
|
||||||
return
|
return
|
||||||
|
|
|
@ -42,6 +42,8 @@ class LevelRenderData:
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self.levels = []
|
self.levels = []
|
||||||
self.base_altitude = None
|
self.base_altitude = None
|
||||||
|
self.lowest_important_level = None
|
||||||
|
self.darken_area = None
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def rebuild():
|
def rebuild():
|
||||||
|
@ -95,12 +97,25 @@ class LevelRenderData:
|
||||||
# levels above them.
|
# levels above them.
|
||||||
crop_to = None
|
crop_to = None
|
||||||
primary_level_count = 0
|
primary_level_count = 0
|
||||||
|
main_level_passed = 0
|
||||||
|
lowest_important_level = None
|
||||||
for sublevel in reversed(sublevels):
|
for sublevel in reversed(sublevels):
|
||||||
geoms = single_level_geoms[sublevel.pk]
|
geoms = single_level_geoms[sublevel.pk]
|
||||||
|
|
||||||
if geoms.holes is not None:
|
if geoms.holes is not None:
|
||||||
primary_level_count += 1
|
primary_level_count += 1
|
||||||
|
|
||||||
|
# get lowest intermediate level directly below main level
|
||||||
|
|
||||||
|
if not main_level_passed:
|
||||||
|
if geoms.pk == level.pk:
|
||||||
|
main_level_passed = 1
|
||||||
|
else:
|
||||||
|
if not sublevel.on_top_of_id:
|
||||||
|
main_level_passed += 1
|
||||||
|
if main_level_passed < 2:
|
||||||
|
lowest_important_level = sublevel
|
||||||
|
|
||||||
# set crop area if we area on the second primary layer from top or below
|
# set crop area if we area on the second primary layer from top or below
|
||||||
level_crop_to[sublevel.pk] = Cropper(crop_to if primary_level_count > 1 else None)
|
level_crop_to[sublevel.pk] = Cropper(crop_to if primary_level_count > 1 else None)
|
||||||
|
|
||||||
|
@ -115,9 +130,11 @@ class LevelRenderData:
|
||||||
|
|
||||||
render_data = LevelRenderData()
|
render_data = LevelRenderData()
|
||||||
render_data.base_altitude = level.base_altitude
|
render_data.base_altitude = level.base_altitude
|
||||||
|
render_data.lowest_important_level = lowest_important_level.pk
|
||||||
access_restriction_affected = {}
|
access_restriction_affected = {}
|
||||||
|
|
||||||
# go through sublevels, get their level geometries and crop them
|
# go through sublevels, get their level geometries and crop them
|
||||||
|
lowest_important_level_passed = False
|
||||||
for sublevel in sublevels:
|
for sublevel in sublevels:
|
||||||
try:
|
try:
|
||||||
crop_to = level_crop_to[sublevel.pk]
|
crop_to = level_crop_to[sublevel.pk]
|
||||||
|
@ -126,6 +143,12 @@ class LevelRenderData:
|
||||||
|
|
||||||
old_geoms = single_level_geoms[sublevel.pk]
|
old_geoms = single_level_geoms[sublevel.pk]
|
||||||
|
|
||||||
|
if render_data.lowest_important_level == sublevel.pk:
|
||||||
|
lowest_important_level_passed = True
|
||||||
|
|
||||||
|
if old_geoms.holes and render_data.darken_area is None and lowest_important_level_passed:
|
||||||
|
render_data.darken_area = old_geoms.holes
|
||||||
|
|
||||||
if crop_to.geometry is not None:
|
if crop_to.geometry is not None:
|
||||||
map_history.composite(MapHistory.open_level(sublevel.pk, 'base'), crop_to.geometry)
|
map_history.composite(MapHistory.open_level(sublevel.pk, 'base'), crop_to.geometry)
|
||||||
elif level.pk != sublevel.pk:
|
elif level.pk != sublevel.pk:
|
||||||
|
|
|
@ -54,11 +54,14 @@ class MapRenderer:
|
||||||
not_full_levels = engine.is_3d # always do non-full-levels until after the first primary level
|
not_full_levels = engine.is_3d # always do non-full-levels until after the first primary level
|
||||||
full_levels = self.full_levels and engine.is_3d
|
full_levels = self.full_levels and engine.is_3d
|
||||||
for geoms in levels:
|
for geoms in levels:
|
||||||
|
engine.add_group('level_%s' % geoms.short_label)
|
||||||
|
|
||||||
|
if geoms.pk == level_render_data.lowest_important_level:
|
||||||
|
engine.darken(level_render_data.darken_area)
|
||||||
|
|
||||||
if not bbox.intersects(geoms.affected_area):
|
if not bbox.intersects(geoms.affected_area):
|
||||||
continue
|
continue
|
||||||
|
|
||||||
engine.add_group('level_%s' % geoms.short_label)
|
|
||||||
|
|
||||||
# hide indoor and outdoor rooms if their access restriction was not unlocked
|
# hide indoor and outdoor rooms if their access restriction was not unlocked
|
||||||
add_walls = hybrid_union(tuple(area for access_restriction, area in geoms.restricted_spaces_indoors.items()
|
add_walls = hybrid_union(tuple(area for access_restriction, area in geoms.restricted_spaces_indoors.items()
|
||||||
if access_restriction not in access_permissions))
|
if access_restriction not in access_permissions))
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue