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
continue
# todo: implement multiple points
if len(ramp.connected_to) > 2:
ramp.connected_to = sorted(ramp.connected_to, key=lambda item: item[1].area)[-2:]
ramp.point1 = ramp.connected_to[0][1].centroid
ramp.point2 = ramp.connected_to[1][1].centroid
ramp.altitude = ramp.connected_to[0][0].altitude
ramp.altitude2 = ramp.connected_to[1][0].altitude
ramp.points = [
AltitudeAreaPoint(coordinates=ramp.connected_to[0][1].centroid.coords,
altitude=float(ramp.connected_to[0][0].altitude)),
AltitudeAreaPoint(coordinates=ramp.connected_to[1][1].centroid.coords,
altitude=float(ramp.connected_to[1][0].altitude)),
]
ramp.tmpid = len(areas)
areas.append(ramp)
@ -582,13 +586,15 @@ class AltitudeArea(LevelGeometryMixin, models.Model):
area = touches[0].obj
elif touches:
min_touches = sum((t.value for t in touches), 0)/4
area = max(touches, key=lambda item: (item.value > min_touches,
item.obj.altitude2 is not None,
item.obj.altitude,
item.value)).obj
area = max(touches, key=lambda item: (
item.value > min_touches,
item.obj.points is not None,
item.obj.altitude or max(p.altitude for p in item.obj.points),
item.value
)).obj
else:
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)
for i_area, area in enumerate(our_areas):
@ -617,17 +623,16 @@ class AltitudeArea(LevelGeometryMixin, models.Model):
for candidate in all_candidates:
new_area = None
if candidate.altitude2 is None:
if candidate.points is None:
for tmpid in level_areas.get(candidate.level, set()):
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
break
else:
potential_areas = [areas[tmpid] for tmpid in level_areas.get(candidate.level, set())]
potential_areas = [area for area in potential_areas
if (candidate.altitude, candidate.altitude2) in ((area.altitude, area.altitude2),
(area.altitude2, area.altitude))]
if set(p.altitude for p in candidate.points) == set(p.altitude for p in area.points)]
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))]
@ -644,9 +649,7 @@ class AltitudeArea(LevelGeometryMixin, models.Model):
candidate.geometry = new_area.geometry
candidate.altitude = new_area.altitude
candidate.altitude2 = new_area.altitude2
candidate.point1 = new_area.point1
candidate.point2 = new_area.point2
candidate.points = new_area.points
candidate.save()
areas_to_save.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:
self.geometry = altitudearea.geometry
self.altitude = int(altitudearea.altitude * 1000)
self.altitude2 = None if altitudearea.altitude2 is None else int(altitudearea.altitude2 * 1000)
self.point1 = altitudearea.point1
self.point2 = altitudearea.point2
self.points = altitudearea.points
else:
self.geometry = None
self.altitude = None
self.altitude2 = None
self.point1 = None
self.point2 = None
self.points = None
self.base = None
self.bottom = None
self.colors = colors

View file

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

View file

@ -135,7 +135,7 @@ class Router:
if area_clear_geom.is_empty:
continue
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 = set(node.i for node in area_nodes)
for node in area_nodes:
@ -625,13 +625,11 @@ class RouterPoint(BaseRouterProxy):
class RouterAltitudeArea:
def __init__(self, geometry, clear_geometry, altitude, altitude2, point1, point2):
def __init__(self, geometry, clear_geometry, altitude, points):
self.geometry = geometry
self.clear_geometry = clear_geometry
self.altitude = altitude
self.altitude2 = altitude2
self.point1 = point1
self.point2 = point2
self.points = points
self.nodes = frozenset()
self.fallback_nodes = {}