From 88e6de77cbfd5af11c5f1c666985201dba4dca5f Mon Sep 17 00:00:00 2001 From: Miguel Date: Sat, 14 Jun 2025 17:07:05 +0200 Subject: [PATCH] =?UTF-8?q?Se=20implementaron=20m=C3=A9todos=20para=20actu?= =?UTF-8?q?alizar=20la=20posici=C3=B3n=20relativa=20de=20los=20objetos=20e?= =?UTF-8?q?n=20funci=C3=B3n=20de=20un=20FramePlate,=20incluyendo=20la=20ge?= =?UTF-8?q?sti=C3=B3n=20de=20la=20rotaci=C3=B3n=20orbital.=20Se=20a=C3=B1a?= =?UTF-8?q?dieron=20propiedades=20para=20almacenar=20la=20posici=C3=B3n=20?= =?UTF-8?q?relativa=20y=20el=20=C3=A1ngulo=20inicial,=20y=20se=20mejor?= =?UTF-8?q?=C3=B3=20la=20l=C3=B3gica=20de=20actualizaci=C3=B3n=20de=20posi?= =?UTF-8?q?ci=C3=B3n=20al=20cambiar=20la=20posici=C3=B3n=20del=20FramePlat?= =?UTF-8?q?e.=20Adem=C3=A1s,=20se=20implement=C3=B3=20un=20m=C3=A9todo=20p?= =?UTF-8?q?ara=20recalcular=20la=20posici=C3=B3n=20relativa=20al=20mover?= =?UTF-8?q?=20los=20objetos,=20asegurando=20un=20comportamiento=20m=C3=A1s?= =?UTF-8?q?=20preciso=20en=20la=20simulaci=C3=B3n.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ObjetosSim/osBase.cs | 102 ++++++++++++++++++++++++++++++++++++++----- 1 file changed, 90 insertions(+), 12 deletions(-) diff --git a/ObjetosSim/osBase.cs b/ObjetosSim/osBase.cs index 1c12902..8ec5b76 100644 --- a/ObjetosSim/osBase.cs +++ b/ObjetosSim/osBase.cs @@ -106,7 +106,11 @@ namespace CtrEditor.ObjetosSim LeftChanging(oldValue, newValue); } - public virtual void LeftChanged(float value) { } + public virtual void LeftChanged(float value) + { + // Actualizar posición relativa si el movimiento no viene del FramePlate + UpdateFramePlateRelativePosition(); + } public virtual void LeftChanging(float oldValue, float newValue) { } [ObservableProperty] @@ -124,7 +128,11 @@ namespace CtrEditor.ObjetosSim TopChanging(oldValue, newValue); } - public virtual void TopChanged(float value) { } + public virtual void TopChanged(float value) + { + // Actualizar posición relativa si el movimiento no viene del FramePlate + UpdateFramePlateRelativePosition(); + } public virtual void TopChanging(float oldValue, float newValue) { } @@ -289,6 +297,22 @@ namespace CtrEditor.ObjetosSim [JsonIgnore] private bool isUpdatingFromFramePlate = false; + // Variables para rotación orbital alrededor del FramePlate + [JsonIgnore] + [ObservableProperty] + [property: Hidden] + private float framePlate_RelativeX; + + [JsonIgnore] + [ObservableProperty] + [property: Hidden] + private float framePlate_RelativeY; + + [JsonIgnore] + [ObservableProperty] + [property: Hidden] + private float framePlate_InitialAngle; + partial void OnGroup_FramePanelChanged(string value) { if (FramePlate != null) @@ -300,8 +324,20 @@ namespace CtrEditor.ObjetosSim { FramePlate.PropertyChanged += OnFramePlatePropertyChanged; UpdateZIndex(FramePlate.Zindex_FramePlate); + + // Calcular posición relativa inicial respecto al FramePlate + FramePlate_RelativeX = Left - FramePlate.Left; + FramePlate_RelativeY = Top - FramePlate.Top; + FramePlate_InitialAngle = FramePlate.Angulo; } } + else + { + // Reset relative position when disconnecting + FramePlate_RelativeX = 0; + FramePlate_RelativeY = 0; + FramePlate_InitialAngle = 0; + } } protected void UpdateZIndex(int zIndex) @@ -322,22 +358,16 @@ namespace CtrEditor.ObjetosSim if (e.PropertyName == nameof(osFramePlate.Nombre)) Group_Panel = ((osFramePlate)sender).Nombre; - if (e.PropertyName == nameof(osFramePlate.Top)) + if (e.PropertyName == nameof(osFramePlate.Top) || + e.PropertyName == nameof(osFramePlate.Left)) { - Top += ((osFramePlate)sender).offsetY; - OnMoveResizeRotate(); - } - - if (e.PropertyName == nameof(osFramePlate.Left)) - { - Left += ((osFramePlate)sender).offsetX; - OnMoveResizeRotate(); + UpdateOrbitalPosition(); } if (e.PropertyName == nameof(osFramePlate.Angulo)) { + UpdateOrbitalPosition(); Angulo += ((osFramePlate)sender).offsetAngulo; - OnMoveResizeRotate(); } if (e.PropertyName == nameof(osFramePlate.Zindex_FramePlate)) @@ -347,6 +377,54 @@ namespace CtrEditor.ObjetosSim } } + private void UpdateOrbitalPosition() + { + if (FramePlate == null) return; + + // Calcular el ángulo de rotación total desde la posición inicial + float deltaAngle = FramePlate.Angulo - FramePlate_InitialAngle; + + // Convertir ángulo a radianes + float angleRad = deltaAngle * (float)Math.PI / 180.0f; + + // Calcular la nueva posición orbital usando rotación de matriz + float cosAngle = (float)Math.Cos(angleRad); + float sinAngle = (float)Math.Sin(angleRad); + + // Rotar la posición relativa + float rotatedX = cosAngle * FramePlate_RelativeX - sinAngle * FramePlate_RelativeY; + float rotatedY = sinAngle * FramePlate_RelativeX + cosAngle * FramePlate_RelativeY; + + // Calcular nueva posición absoluta + Left = FramePlate.Left + rotatedX; + Top = FramePlate.Top + rotatedY; + + OnMoveResizeRotate(); + } + + private void UpdateFramePlateRelativePosition() + { + // Solo actualizar si está conectado a un FramePlate y el movimiento NO viene del FramePlate + if (FramePlate != null && !isUpdatingFromFramePlate) + { + // Recalcular posición relativa considerando la rotación actual del FramePlate + float deltaAngle = FramePlate.Angulo - FramePlate_InitialAngle; + float angleRad = deltaAngle * (float)Math.PI / 180.0f; + + // Calcular la posición relativa actual respecto al FramePlate + float currentRelativeX = Left - FramePlate.Left; + float currentRelativeY = Top - FramePlate.Top; + + // Si el FramePlate está rotado, necesitamos "desrotar" la posición para obtener + // la posición relativa en el sistema de coordenadas original + float cosAngle = (float)Math.Cos(-angleRad); + float sinAngle = (float)Math.Sin(-angleRad); + + FramePlate_RelativeX = cosAngle * currentRelativeX - sinAngle * currentRelativeY; + FramePlate_RelativeY = sinAngle * currentRelativeX + cosAngle * currentRelativeY; + } + } + private void ShowPreviewWindow(Stream imageStream) {