move all other code to AltitudeArea.points, no multi-point implementation yet

This commit is contained in:
Laura Klünder 2024-08-17 23:15:22 +02:00
parent 27ba0c0eaa
commit 2bc044e91f
4 changed files with 25 additions and 30 deletions

View file

@ -479,13 +479,17 @@ class AltitudeArea(LevelGeometryMixin, models.Model):
ramp.altitude = ramp.connected_to[0][0].altitude ramp.altitude = ramp.connected_to[0][0].altitude
continue continue
# todo: implement multiple points
if len(ramp.connected_to) > 2: if len(ramp.connected_to) > 2:
ramp.connected_to = sorted(ramp.connected_to, key=lambda item: item[1].area)[-2:] ramp.connected_to = sorted(ramp.connected_to, key=lambda item: item[1].area)[-2:]
ramp.point1 = ramp.connected_to[0][1].centroid ramp.points = [
ramp.point2 = ramp.connected_to[1][1].centroid AltitudeAreaPoint(coordinates=ramp.connected_to[0][1].centroid.coords,
ramp.altitude = ramp.connected_to[0][0].altitude altitude=float(ramp.connected_to[0][0].altitude)),
ramp.altitude2 = ramp.connected_to[1][0].altitude AltitudeAreaPoint(coordinates=ramp.connected_to[1][1].centroid.coords,
altitude=float(ramp.connected_to[1][0].altitude)),
]
ramp.tmpid = len(areas) ramp.tmpid = len(areas)
areas.append(ramp) areas.append(ramp)
@ -582,13 +586,15 @@ class AltitudeArea(LevelGeometryMixin, models.Model):
area = touches[0].obj area = touches[0].obj
elif touches: elif touches:
min_touches = sum((t.value for t in touches), 0)/4 min_touches = sum((t.value for t in touches), 0)/4
area = max(touches, key=lambda item: (item.value > min_touches, area = max(touches, key=lambda item: (
item.obj.altitude2 is not None, item.value > min_touches,
item.obj.altitude, item.obj.points is not None,
item.value)).obj item.obj.altitude or max(p.altitude for p in item.obj.points),
item.value
)).obj
else: else:
area = min(our_areas, area = min(our_areas,
key=lambda a: a.orig_geometry.distance(center)-(0 if a.altitude2 is None else 0.6)) key=lambda a: a.orig_geometry.distance(center)-(0 if a.points is None else 0.6))
area.polygons_to_add.append(polygon) area.polygons_to_add.append(polygon)
for i_area, area in enumerate(our_areas): for i_area, area in enumerate(our_areas):
@ -617,17 +623,16 @@ class AltitudeArea(LevelGeometryMixin, models.Model):
for candidate in all_candidates: for candidate in all_candidates:
new_area = None new_area = None
if candidate.altitude2 is None: if candidate.points is None:
for tmpid in level_areas.get(candidate.level, set()): for tmpid in level_areas.get(candidate.level, set()):
area = areas[tmpid] area = areas[tmpid]
if area.altitude2 is None and area.altitude == candidate.altitude: if area.points is None and area.altitude == candidate.altitude:
new_area = area new_area = area
break break
else: else:
potential_areas = [areas[tmpid] for tmpid in level_areas.get(candidate.level, set())] potential_areas = [areas[tmpid] for tmpid in level_areas.get(candidate.level, set())]
potential_areas = [area for area in potential_areas potential_areas = [area for area in potential_areas
if (candidate.altitude, candidate.altitude2) in ((area.altitude, area.altitude2), if set(p.altitude for p in candidate.points) == set(p.altitude for p in area.points)]
(area.altitude2, area.altitude))]
potential_areas = [(area, area.geometry.intersection(unwrap_geom(candidate.geometry)).area) potential_areas = [(area, area.geometry.intersection(unwrap_geom(candidate.geometry)).area)
for area in potential_areas for area in potential_areas
if candidate.geometry_prep.intersects(unwrap_geom(area.geometry))] if candidate.geometry_prep.intersects(unwrap_geom(area.geometry))]
@ -644,9 +649,7 @@ class AltitudeArea(LevelGeometryMixin, models.Model):
candidate.geometry = new_area.geometry candidate.geometry = new_area.geometry
candidate.altitude = new_area.altitude candidate.altitude = new_area.altitude
candidate.altitude2 = new_area.altitude2 candidate.points = new_area.points
candidate.point1 = new_area.point1
candidate.point2 = new_area.point2
candidate.save() candidate.save()
areas_to_save.discard(new_area.tmpid) areas_to_save.discard(new_area.tmpid)
level_areas[new_area.level].discard(new_area.tmpid) level_areas[new_area.level].discard(new_area.tmpid)

View file

@ -12,15 +12,11 @@ class AltitudeAreaGeometries:
if altitudearea is not None: if altitudearea is not None:
self.geometry = altitudearea.geometry self.geometry = altitudearea.geometry
self.altitude = int(altitudearea.altitude * 1000) self.altitude = int(altitudearea.altitude * 1000)
self.altitude2 = None if altitudearea.altitude2 is None else int(altitudearea.altitude2 * 1000) self.points = altitudearea.points
self.point1 = altitudearea.point1
self.point2 = altitudearea.point2
else: else:
self.geometry = None self.geometry = None
self.altitude = None self.altitude = None
self.altitude2 = None self.points = None
self.point1 = None
self.point2 = None
self.base = None self.base = None
self.bottom = None self.bottom = None
self.colors = colors self.colors = colors

View file

@ -227,9 +227,7 @@ class LevelRenderData:
new_altitudearea = AltitudeAreaGeometries() new_altitudearea = AltitudeAreaGeometries()
new_altitudearea.geometry = new_geometry new_altitudearea.geometry = new_geometry
new_altitudearea.altitude = altitudearea.altitude new_altitudearea.altitude = altitudearea.altitude
new_altitudearea.altitude2 = altitudearea.altitude2 new_altitudearea.points = altitudearea.points
new_altitudearea.point1 = altitudearea.point1
new_altitudearea.point2 = altitudearea.point2
new_colors = {} new_colors = {}
for color, areas in altitudearea.colors.items(): for color, areas in altitudearea.colors.items():

View file

@ -135,7 +135,7 @@ class Router:
if area_clear_geom.is_empty: if area_clear_geom.is_empty:
continue continue
area = RouterAltitudeArea(subgeom, area_clear_geom, area = RouterAltitudeArea(subgeom, area_clear_geom,
area.altitude, area.altitude2, area.point1, area.point2) area.altitude, area.points)
area_nodes = tuple(node for node in space_nodes if area.geometry_prep.intersects(node.point)) area_nodes = tuple(node for node in space_nodes if area.geometry_prep.intersects(node.point))
area.nodes = set(node.i for node in area_nodes) area.nodes = set(node.i for node in area_nodes)
for node in area_nodes: for node in area_nodes:
@ -625,13 +625,11 @@ class RouterPoint(BaseRouterProxy):
class RouterAltitudeArea: class RouterAltitudeArea:
def __init__(self, geometry, clear_geometry, altitude, altitude2, point1, point2): def __init__(self, geometry, clear_geometry, altitude, points):
self.geometry = geometry self.geometry = geometry
self.clear_geometry = clear_geometry self.clear_geometry = clear_geometry
self.altitude = altitude self.altitude = altitude
self.altitude2 = altitude2 self.points = points
self.point1 = point1
self.point2 = point2
self.nodes = frozenset() self.nodes = frozenset()
self.fallback_nodes = {} self.fallback_nodes = {}