From bbbdfd15fbe33691198ec80cca65540a713afec4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Laura=20Kl=C3=BCnder?= Date: Sun, 18 Aug 2024 21:47:59 +0200 Subject: [PATCH] fix bugs with new ramps --- .../0107_altitudearea_multiple_points.py | 4 ++-- src/c3nav/mapdata/models/geometry/level.py | 9 +++++---- src/c3nav/mapdata/render/geometry/altitudearea.py | 15 +++++++++++++-- src/c3nav/mapdata/render/geometry/level.py | 4 ++-- src/c3nav/mapdata/render/renderdata.py | 4 ++-- src/c3nav/mapdata/render/utils.py | 2 +- 6 files changed, 25 insertions(+), 13 deletions(-) diff --git a/src/c3nav/mapdata/migrations/0107_altitudearea_multiple_points.py b/src/c3nav/mapdata/migrations/0107_altitudearea_multiple_points.py index 55018ba1..ce66894b 100644 --- a/src/c3nav/mapdata/migrations/0107_altitudearea_multiple_points.py +++ b/src/c3nav/mapdata/migrations/0107_altitudearea_multiple_points.py @@ -16,8 +16,8 @@ def forwards_func(apps, schema_editor): for area in AltitudeArea.objects.all(): if area.point1 is not None: area.points = [ - AltitudeAreaPoint(coordinates=[area.point1.x, area.point1.y], altitude=float(area.altitude1)), - AltitudeAreaPoint(coordinates=[area.point2.x, area.point2.y], altitude=float(area.altitude)) + AltitudeAreaPoint(coordinates=[area.point1.x, area.point1.y], altitude=float(area.altitude)), + AltitudeAreaPoint(coordinates=[area.point2.x, area.point2.y], altitude=float(area.altitude2)) ] area.altitude = None area.save() diff --git a/src/c3nav/mapdata/models/geometry/level.py b/src/c3nav/mapdata/models/geometry/level.py index 0a932797..2ffda860 100644 --- a/src/c3nav/mapdata/models/geometry/level.py +++ b/src/c3nav/mapdata/models/geometry/level.py @@ -269,9 +269,9 @@ class AltitudeArea(LevelGeometryMixin, models.Model): tuple(unwrap_geom(h.geometry) for h in space.holes.all())) ) - space_ramps = unary_union(tuple(unwrap_geom(r.geometry) for r in space.ramps.all())) - areas.append(space_accessible.difference(space_ramps)) - for geometry in assert_multipolygon(space_accessible.intersection(space_ramps)): + space_ramps_geom = unary_union(tuple(unwrap_geom(r.geometry) for r in space.ramps.all())) + areas.append(space_accessible.difference(space_ramps_geom)) + for geometry in assert_multipolygon(space_accessible.intersection(space_ramps_geom)): ramp = AltitudeArea(geometry=geometry, level=level) ramp.geometry_prep = prepared.prep(geometry) ramp.space = space.pk @@ -644,7 +644,8 @@ class AltitudeArea(LevelGeometryMixin, models.Model): else: potential_areas = [areas[tmpid] for tmpid in level_areas.get(candidate.level, set())] potential_areas = [area for area in potential_areas - if set(p.altitude for p in candidate.points) == set(p.altitude for p in area.points)] + if ((candidate.altitude, set(p.altitude for p in (candidate.points or ()))) == + (area.altitude, set(p.altitude for p in (area.points or ()))))] potential_areas = [(area, area.geometry.intersection(unwrap_geom(candidate.geometry)).area) for area in potential_areas if candidate.geometry_prep.intersects(unwrap_geom(area.geometry))] diff --git a/src/c3nav/mapdata/render/geometry/altitudearea.py b/src/c3nav/mapdata/render/geometry/altitudearea.py index 639d4540..b2939dc3 100644 --- a/src/c3nav/mapdata/render/geometry/altitudearea.py +++ b/src/c3nav/mapdata/render/geometry/altitudearea.py @@ -4,6 +4,7 @@ from itertools import chain import numpy as np from c3nav.mapdata.models import AltitudeArea +from c3nav.mapdata.models.geometry.level import AltitudeAreaPoint from c3nav.mapdata.render.geometry.hybrid import HybridGeometry @@ -11,8 +12,10 @@ class AltitudeAreaGeometries: def __init__(self, altitudearea=None, colors=None, obstacles=None): if altitudearea is not None: self.geometry = altitudearea.geometry - self.altitude = int(altitudearea.altitude * 1000) - self.points = altitudearea.points + self.altitude = None if altitudearea.altitude is None else int(altitudearea.altitude * 1000) + self.points = None if altitudearea.points is None else [AltitudeAreaPoint(coordinates=p.coordinates, + altitude=int(p.altitude*2)) + for p in altitudearea.points] else: self.geometry = None self.altitude = None @@ -22,6 +25,14 @@ class AltitudeAreaGeometries: self.colors = colors self.obstacles = obstacles + @property + def min_altitude(self): + return self.altitude if self.altitude is not None else min(p.altitude for p in self.points) + + @property + def max_altitude(self): + return self.altitude if self.altitude is not None else max(p.altitude for p in self.points) + def get_altitudes(self, points): # noinspection PyCallByClass,PyTypeChecker return AltitudeArea.get_altitudes(self, points/1000).astype(np.int32) diff --git a/src/c3nav/mapdata/render/geometry/level.py b/src/c3nav/mapdata/render/geometry/level.py index 7d69062f..d1f3eb52 100644 --- a/src/c3nav/mapdata/render/geometry/level.py +++ b/src/c3nav/mapdata/render/geometry/level.py @@ -250,9 +250,9 @@ class LevelGeometries: geoms.base_altitude = int(level.base_altitude * 1000) geoms.default_height = int(level.default_height * 1000) geoms.door_height = int(level.door_height * 1000) - geoms.min_altitude = (min(area.altitude for area in geoms.altitudeareas) + geoms.min_altitude = (min(area.min_altitude for area in geoms.altitudeareas) if geoms.altitudeareas else geoms.base_altitude) - geoms.max_altitude = (max(area.altitude for area in geoms.altitudeareas) + geoms.max_altitude = (max(area.max_altitude for area in geoms.altitudeareas) if geoms.altitudeareas else geoms.base_altitude) geoms.max_height = (min(height for area, height in geoms.heightareas) if geoms.heightareas else geoms.default_height) diff --git a/src/c3nav/mapdata/render/renderdata.py b/src/c3nav/mapdata/render/renderdata.py index f2818002..b60c7c1e 100644 --- a/src/c3nav/mapdata/render/renderdata.py +++ b/src/c3nav/mapdata/render/renderdata.py @@ -303,9 +303,9 @@ class LevelRenderData: new_geoms.base_altitude = old_geoms.base_altitude new_geoms.default_height = old_geoms.default_height new_geoms.door_height = old_geoms.door_height - new_geoms.min_altitude = (min(area.altitude for area in new_geoms.altitudeareas) + new_geoms.min_altitude = (min(area.min_altitude for area in new_geoms.altitudeareas) if new_geoms.altitudeareas else new_geoms.base_altitude) - new_geoms.max_altitude = (max(area.altitude for area in new_geoms.altitudeareas) + new_geoms.max_altitude = (max(area.max_altitude for area in new_geoms.altitudeareas) if new_geoms.altitudeareas else new_geoms.base_altitude) new_geoms.max_height = (min(height for area, height in new_geoms.heightareas) if new_geoms.heightareas else new_geoms.default_height) diff --git a/src/c3nav/mapdata/render/utils.py b/src/c3nav/mapdata/render/utils.py index 3f56275e..618df5ab 100644 --- a/src/c3nav/mapdata/render/utils.py +++ b/src/c3nav/mapdata/render/utils.py @@ -4,7 +4,7 @@ from c3nav.mapdata.render.renderdata import LevelRenderData def get_min_altitude(levels, default): - min_altitude = min(chain(*(tuple(area.altitude for area in geoms.altitudeareas) + min_altitude = min(chain(*(tuple(area.min_altitude for area in geoms.altitudeareas) for geoms in levels)), default=None) if min_altitude is None: