aggiunta la preview dei movimenti di tipo duration

This commit is contained in:
VALLONGOL 2025-10-14 13:57:08 +02:00
parent 8449e36c1c
commit 638e4a648f
2 changed files with 34 additions and 4 deletions

View File

@ -122,8 +122,10 @@ class Target:
total_duration = sum(wp.duration_s or 0.0 for wp in self.trajectory if wp.duration_s)
# Create a time mapping for each point in the spline path
self._spline_point_times = [i * (total_duration / (len(self._spline_path) - 1)) for i in range(len(self._spline_path))]
if not self._spline_point_times: self._spline_point_times = [0.0]
if self._spline_path is not None and len(self._spline_path) > 1:
self._spline_point_times = [i * (total_duration / (len(self._spline_path) - 1)) for i in range(len(self._spline_path))]
else:
self._spline_point_times = [0.0]
self._update_current_polar_coords()

View File

@ -12,6 +12,7 @@ import numpy as np
import copy
from matplotlib.figure import Figure
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
from target_simulator.core.models import NM_TO_FT
# Use absolute imports
from target_simulator.core.models import Target, Waypoint, ManeuverType
@ -192,8 +193,35 @@ class PPIDisplay(ttk.Frame):
return
# Classic preview (polyline) SOLO se spline non attiva
# (la preview spline cancella la classica)
thetas = [math.radians(getattr(wp, 'target_azimuth_deg', 0)) for wp in waypoints]
rs = [getattr(wp, 'target_range_nm', 0) for wp in waypoints]
# Costruisci la lista dei punti da visualizzare
points = []
for i, wp in enumerate(waypoints):
if getattr(wp, 'maneuver_type', None) == ManeuverType.FLY_TO_POINT:
# Usa range/azimuth
r = getattr(wp, 'target_range_nm', 0)
theta = math.radians(getattr(wp, 'target_azimuth_deg', 0))
points.append((theta, r, wp))
elif getattr(wp, 'maneuver_type', None) == ManeuverType.FLY_FOR_DURATION:
# Calcola punto terminale
# Serve punto di partenza
if i == 0:
# Se non c'è punto iniziale, ignora
continue
prev_wp = waypoints[i-1]
r0 = getattr(prev_wp, 'target_range_nm', 0)
theta0 = math.radians(getattr(prev_wp, 'target_azimuth_deg', 0))
vel_fps = getattr(wp, 'target_velocity_fps', 0)
vel_nmps = vel_fps / NM_TO_FT if vel_fps else 0
duration = getattr(wp, 'duration_s', 0)
heading_deg = getattr(wp, 'target_heading_deg', 0)
heading_rad = math.radians(heading_deg)
# Calcola delta x/y in coordinate polari
dr = vel_nmps * duration
theta1 = theta0 + heading_rad
r1 = r0 + dr
points.append((theta1, r1, wp))
thetas = [p[0] for p in points]
rs = [p[1] for p in points]
if len(thetas) == 1:
# Mostra solo il punto iniziale con stile simulazione
self._preview_artist.set_data([], [])