mirror of
https://github.com/dcs-retribution/dcs-retribution.git
synced 2025-11-10 15:41:24 +00:00
Move waypoints and commit boundaries to FastAPI.
This commit is contained in:
@@ -62,7 +62,7 @@ class ControlPointJs(QObject):
|
||||
@Property(list, notify=positionChanged)
|
||||
def position(self) -> LeafletLatLon:
|
||||
ll = self.theater.point_to_ll(self.control_point.position)
|
||||
return [ll.latitude, ll.longitude]
|
||||
return [ll.lat, ll.lng]
|
||||
|
||||
@Property(bool, notify=mobileChanged)
|
||||
def mobile(self) -> bool:
|
||||
|
||||
@@ -1,41 +1,19 @@
|
||||
from __future__ import annotations
|
||||
|
||||
from typing import List
|
||||
|
||||
from PySide2.QtCore import Property, QObject, Signal, Slot
|
||||
from shapely.geometry import LineString, Point as ShapelyPoint
|
||||
|
||||
from game.ato import Flight, FlightWaypoint
|
||||
from game.ato import Flight
|
||||
from game.ato.flightstate import InFlight
|
||||
from game.ato.flightwaypointtype import FlightWaypointType
|
||||
from game.server.leaflet import LeafletLatLon, LeafletPoly, ShapelyUtil
|
||||
from game.server.leaflet import LeafletLatLon
|
||||
from game.theater import ConflictTheater
|
||||
from game.utils import meters
|
||||
from gen.flights.flightplan import CasFlightPlan, PatrollingFlightPlan
|
||||
from qt_ui.models import AtoModel
|
||||
from .waypointjs import WaypointJs
|
||||
|
||||
|
||||
class FlightJs(QObject):
|
||||
idChanged = Signal()
|
||||
positionChanged = Signal()
|
||||
flightPlanChanged = Signal()
|
||||
blueChanged = Signal()
|
||||
selectedChanged = Signal()
|
||||
commitBoundaryChanged = Signal()
|
||||
|
||||
originChanged = Signal()
|
||||
|
||||
@Property(list, notify=originChanged)
|
||||
def origin(self) -> LeafletLatLon:
|
||||
return self._waypoints[0].position
|
||||
|
||||
targetChanged = Signal()
|
||||
|
||||
@Property(list, notify=targetChanged)
|
||||
def target(self) -> LeafletLatLon:
|
||||
ll = self.theater.point_to_ll(self.flight.package.target.position)
|
||||
return [ll.latitude, ll.longitude]
|
||||
|
||||
def __init__(
|
||||
self,
|
||||
@@ -49,42 +27,18 @@ class FlightJs(QObject):
|
||||
self._selected = selected
|
||||
self.theater = theater
|
||||
self.ato_model = ato_model
|
||||
self._waypoints = self.make_waypoints()
|
||||
|
||||
@Property(str, notify=idChanged)
|
||||
def id(self) -> str:
|
||||
return str(self.flight.id)
|
||||
|
||||
def update_waypoints(self) -> None:
|
||||
for waypoint in self._waypoints:
|
||||
waypoint.timingChanged.emit()
|
||||
|
||||
def make_waypoints(self) -> List[WaypointJs]:
|
||||
departure = FlightWaypoint(
|
||||
FlightWaypointType.TAKEOFF,
|
||||
self.flight.departure.position.x,
|
||||
self.flight.departure.position.y,
|
||||
meters(0),
|
||||
)
|
||||
departure.alt_type = "RADIO"
|
||||
waypoints = []
|
||||
for point in [departure] + self.flight.points:
|
||||
waypoint = WaypointJs(point, self, self.theater, self.ato_model)
|
||||
waypoint.positionChanged.connect(self.update_waypoints)
|
||||
waypoints.append(waypoint)
|
||||
return waypoints
|
||||
|
||||
@Property(list, notify=positionChanged)
|
||||
def position(self) -> LeafletLatLon:
|
||||
if isinstance(self.flight.state, InFlight):
|
||||
ll = self.theater.point_to_ll(self.flight.state.estimate_position())
|
||||
return [ll.latitude, ll.longitude]
|
||||
return [ll.lat, ll.lng]
|
||||
return []
|
||||
|
||||
@Property(list, notify=flightPlanChanged)
|
||||
def flightPlan(self) -> List[WaypointJs]:
|
||||
return self._waypoints
|
||||
|
||||
@Property(bool, notify=blueChanged)
|
||||
def blue(self) -> bool:
|
||||
return self.flight.departure.captured
|
||||
@@ -104,24 +58,3 @@ class FlightJs(QObject):
|
||||
def set_selected(self, value: bool) -> None:
|
||||
self._selected = value
|
||||
self.selectedChanged.emit()
|
||||
|
||||
@Property(list, notify=commitBoundaryChanged)
|
||||
def commitBoundary(self) -> LeafletPoly:
|
||||
if not isinstance(self.flight.flight_plan, PatrollingFlightPlan):
|
||||
return []
|
||||
start = self.flight.flight_plan.patrol_start
|
||||
end = self.flight.flight_plan.patrol_end
|
||||
if isinstance(self.flight.flight_plan, CasFlightPlan):
|
||||
center = self.flight.flight_plan.target.position
|
||||
commit_center = ShapelyPoint(center.x, center.y)
|
||||
else:
|
||||
commit_center = LineString(
|
||||
[
|
||||
ShapelyPoint(start.x, start.y),
|
||||
ShapelyPoint(end.x, end.y),
|
||||
]
|
||||
)
|
||||
bubble = commit_center.buffer(
|
||||
self.flight.flight_plan.engagement_distance.meters
|
||||
)
|
||||
return ShapelyUtil.poly_to_leaflet(bubble, self.theater)
|
||||
|
||||
@@ -30,7 +30,7 @@ class FrontLineJs(QObject):
|
||||
self.front_line.attack_heading.left.degrees, nautical_miles(2).meters
|
||||
)
|
||||
)
|
||||
return [[a.latitude, a.longitude], [b.latitude, b.longitude]]
|
||||
return [[a.lat, a.lng], [b.lat, b.lng]]
|
||||
|
||||
@Slot()
|
||||
def showPackageDialog(self) -> None:
|
||||
|
||||
@@ -101,7 +101,7 @@ class GroundObjectJs(QObject):
|
||||
@Property(list, notify=positionChanged)
|
||||
def position(self) -> LeafletLatLon:
|
||||
ll = self.theater.point_to_ll(self.tgo.position)
|
||||
return [ll.latitude, ll.longitude]
|
||||
return [ll.lat, ll.lng]
|
||||
|
||||
@Property(bool, notify=deadChanged)
|
||||
def dead(self) -> bool:
|
||||
|
||||
@@ -160,7 +160,7 @@ class MapModel(QObject):
|
||||
@staticmethod
|
||||
def leaflet_coord_for(point: Point, theater: ConflictTheater) -> LeafletLatLon:
|
||||
ll = theater.point_to_ll(point)
|
||||
return [ll.latitude, ll.longitude]
|
||||
return [ll.lat, ll.lng]
|
||||
|
||||
def reset(self) -> None:
|
||||
if self.game_model.game is None:
|
||||
@@ -183,7 +183,7 @@ class MapModel(QObject):
|
||||
|
||||
def reset_map_center(self, theater: ConflictTheater) -> None:
|
||||
ll = theater.point_to_ll(theater.terrain.map_view_default.position)
|
||||
self._map_center = [ll.latitude, ll.longitude]
|
||||
self._map_center = [ll.lat, ll.lng]
|
||||
self.mapCenterChanged.emit(self._map_center)
|
||||
|
||||
@Property(str, notify=apiKeyChanged)
|
||||
|
||||
@@ -30,5 +30,5 @@ class UnculledZone(QObject):
|
||||
for zone in game.get_culling_zones():
|
||||
ll = game.theater.point_to_ll(zone)
|
||||
yield UnculledZone(
|
||||
[ll.latitude, ll.longitude], game.settings.perf_culling_distance * 1000
|
||||
[ll.lat, ll.lng], game.settings.perf_culling_distance * 1000
|
||||
)
|
||||
|
||||
@@ -1,111 +0,0 @@
|
||||
from __future__ import annotations
|
||||
|
||||
from datetime import timedelta
|
||||
from typing import TYPE_CHECKING
|
||||
|
||||
from PySide2.QtCore import Property, QObject, Signal, Slot
|
||||
|
||||
from game.ato import Flight, FlightWaypoint
|
||||
from game.ato.flightwaypointtype import FlightWaypointType
|
||||
from game.server.leaflet import LeafletLatLon
|
||||
from game.theater import ConflictTheater, LatLon
|
||||
from gen.flights.flightplan import FlightPlan
|
||||
from qt_ui.models import AtoModel
|
||||
|
||||
if TYPE_CHECKING:
|
||||
from .flightjs import FlightJs
|
||||
|
||||
|
||||
class WaypointJs(QObject):
|
||||
positionChanged = Signal()
|
||||
altitudeFtChanged = Signal()
|
||||
altitudeReferenceChanged = Signal()
|
||||
nameChanged = Signal()
|
||||
timingChanged = Signal()
|
||||
isTargetPointChanged = Signal()
|
||||
isTakeoffChanged = Signal()
|
||||
isLandingChanged = Signal()
|
||||
isDivertChanged = Signal()
|
||||
isBullseyeChanged = Signal()
|
||||
|
||||
def __init__(
|
||||
self,
|
||||
waypoint: FlightWaypoint,
|
||||
flight_model: FlightJs,
|
||||
theater: ConflictTheater,
|
||||
ato_model: AtoModel,
|
||||
) -> None:
|
||||
super().__init__()
|
||||
self.waypoint = waypoint
|
||||
self.flight_model = flight_model
|
||||
self.theater = theater
|
||||
self.ato_model = ato_model
|
||||
|
||||
@property
|
||||
def flight(self) -> Flight:
|
||||
return self.flight_model.flight
|
||||
|
||||
@property
|
||||
def flight_plan(self) -> FlightPlan:
|
||||
return self.flight.flight_plan
|
||||
|
||||
@Property(list, notify=positionChanged)
|
||||
def position(self) -> LeafletLatLon:
|
||||
ll = self.theater.point_to_ll(self.waypoint.position)
|
||||
return [ll.latitude, ll.longitude]
|
||||
|
||||
@Property(int, notify=altitudeFtChanged)
|
||||
def altitudeFt(self) -> int:
|
||||
return int(self.waypoint.alt.feet)
|
||||
|
||||
@Property(str, notify=altitudeReferenceChanged)
|
||||
def altitudeReference(self) -> str:
|
||||
return "AGL" if self.waypoint.alt_type == "RADIO" else "MSL"
|
||||
|
||||
@Property(str, notify=nameChanged)
|
||||
def name(self) -> str:
|
||||
return self.waypoint.name
|
||||
|
||||
@Property(str, notify=timingChanged)
|
||||
def timing(self) -> str:
|
||||
prefix = "TOT"
|
||||
time = self.flight_plan.tot_for_waypoint(self.waypoint)
|
||||
if time is None:
|
||||
prefix = "Depart"
|
||||
time = self.flight_plan.depart_time_for_waypoint(self.waypoint)
|
||||
if time is None:
|
||||
return ""
|
||||
return f"{prefix} T+{timedelta(seconds=int(time.total_seconds()))}"
|
||||
|
||||
@Property(bool, notify=isTargetPointChanged)
|
||||
def isTargetPoint(self) -> bool:
|
||||
return self.waypoint.waypoint_type is FlightWaypointType.TARGET_POINT
|
||||
|
||||
@Property(bool, notify=isTakeoffChanged)
|
||||
def isTakeoff(self) -> bool:
|
||||
return self.waypoint.waypoint_type is FlightWaypointType.TAKEOFF
|
||||
|
||||
@Property(bool, notify=isLandingChanged)
|
||||
def isLanding(self) -> bool:
|
||||
return self.waypoint.waypoint_type is FlightWaypointType.LANDING_POINT
|
||||
|
||||
@Property(bool, notify=isDivertChanged)
|
||||
def isDivert(self) -> bool:
|
||||
return self.waypoint.waypoint_type is FlightWaypointType.DIVERT
|
||||
|
||||
@Property(bool, notify=isBullseyeChanged)
|
||||
def isBullseye(self) -> bool:
|
||||
return self.waypoint.waypoint_type is FlightWaypointType.BULLSEYE
|
||||
|
||||
@Slot(list, result=str)
|
||||
def setPosition(self, position: LeafletLatLon) -> str:
|
||||
point = self.theater.ll_to_point(LatLon(*position))
|
||||
self.waypoint.x = point.x
|
||||
self.waypoint.y = point.y
|
||||
package = self.ato_model.find_matching_package_model(self.flight.package)
|
||||
if package is None:
|
||||
return "Could not find package model containing modified flight"
|
||||
package.update_tot()
|
||||
self.positionChanged.emit()
|
||||
self.flight_model.commitBoundaryChanged.emit()
|
||||
return ""
|
||||
Reference in New Issue
Block a user