From 3773da0ee3fae0b68e1b7e769bfb5ec134a4d779 Mon Sep 17 00:00:00 2001 From: Miguel Date: Tue, 1 Jul 2025 20:02:23 +0200 Subject: [PATCH] =?UTF-8?q?Se=20a=C3=B1adi=C3=B3=20un=20nuevo=20manager=20?= =?UTF-8?q?para=20la=20visualizaci=C3=B3n=203D=20en=20MainWindow=20y=20se?= =?UTF-8?q?=20conect=C3=B3=20con=20el=20simulation=20manager.=20Adem=C3=A1?= =?UTF-8?q?s,=20se=20implementaron=20m=C3=A9todos=20para=20manejar=20cambi?= =?UTF-8?q?os=20de=20posici=C3=B3n=20en=20ucTransporteCurvaGuias,=20actual?= =?UTF-8?q?izando=20la=20geometr=C3=ADa=20en=20BEPU=20y=20sincronizando=20?= =?UTF-8?q?con=20la=20visualizaci=C3=B3n=203D.=20Se=20mejor=C3=B3=20la=20c?= =?UTF-8?q?reaci=C3=B3n=20de=20gu=C3=ADas=20desde=20dos=20puntos=20y=20se?= =?UTF-8?q?=20corrigieron=20errores=20en=20la=20actualizaci=C3=B3n=20de=20?= =?UTF-8?q?curvas.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- MainWindow.xaml.cs | 12 +++ .../Estaticos/ucTransporteCurvaGuias.xaml.cs | 80 +++++++++++++++++-- 2 files changed, 86 insertions(+), 6 deletions(-) diff --git a/MainWindow.xaml.cs b/MainWindow.xaml.cs index 05f31be..fd8c16c 100644 --- a/MainWindow.xaml.cs +++ b/MainWindow.xaml.cs @@ -1,4 +1,5 @@ using CtrEditor.ObjetosSim; +using CtrEditor.Simulacion; using System.Diagnostics; using System.Globalization; using System.Windows; @@ -45,6 +46,9 @@ namespace CtrEditor private dataDebug dataDebug = new dataDebug(); + // Manager para la visualización 3D + private BEPUVisualization3DManager _visualization3DManager; + public MainWindow() { InitializeComponent(); @@ -91,10 +95,18 @@ namespace CtrEditor viewModel.MainWindow = this; viewModel.ImageSelected += ViewModel_ImageSelected; viewModel?.LoadInitialData(); + viewModel.MainCanvas = ImagenEnTrabajoCanvas; // Inicializar ObjectHierarchyView ObjectHierarchy.Initialize(viewModel); + + // Inicializar el manager de visualización 3D + _visualization3DManager = new BEPUVisualization3DManager(Debug3DViewport, viewModel.simulationManager); + viewModel.Visualization3DManager = _visualization3DManager; + + // Conectar el manager 3D con el simulation manager (orden correcto de inicialización) + viewModel.simulationManager.Visualization3DManager = _visualization3DManager; } } diff --git a/ObjetosSim/Estaticos/ucTransporteCurvaGuias.xaml.cs b/ObjetosSim/Estaticos/ucTransporteCurvaGuias.xaml.cs index 2ad76ef..818c37c 100644 --- a/ObjetosSim/Estaticos/ucTransporteCurvaGuias.xaml.cs +++ b/ObjetosSim/Estaticos/ucTransporteCurvaGuias.xaml.cs @@ -240,9 +240,42 @@ namespace CtrEditor.ObjetosSim partial void OnArco_en_gradosChanged(float value) { + OnPropertyChanged(nameof(AnguloFinal)); ActualizarGeometrias(); } + // ✅ NUEVO: Manejar cambios de posición usando métodos virtuales de osBase + public override void LeftChanging(float oldValue, float newValue) + { + base.LeftChanging(oldValue, newValue); + ActualizarPosicionBEPU(); + } + + public override void TopChanging(float oldValue, float newValue) + { + base.TopChanging(oldValue, newValue); + ActualizarPosicionBEPU(); + } + + /// + /// ✅ NUEVO: Actualizar posición en BEPU cuando cambia la posición del objeto + /// + private void ActualizarPosicionBEPU() + { + if (Simulation_TransporteCurvaGuias != null) + { + // Recrear la curva con nueva posición usando el mismo patrón que ucTransporteCurva + var topLeft = new Vector2(Left, Top); + Simulation_TransporteCurvaGuias.Create(RadioInterno, RadioExterno, Angulo, Angulo + Arco_en_grados, topLeft, 0); + + // Recrear las guías en la nueva posición + ActualizarGuiasCurvas(); + + // Sincronizar con la visualización 3D tras la actualización + simulationManager?.Visualization3DManager?.SynchronizeWorld(); + } + } + [Hidden] public float AnguloFinal { @@ -253,7 +286,7 @@ namespace CtrEditor.ObjetosSim { if (_visualRepresentation is ucTransporteCurvaGuias uc) { - UpdateCurve(Simulation_TransporteCurvaGuias, RadioInterno, RadioExterno, Angulo, Angulo + Arco_en_grados); + Simulation_TransporteCurvaGuias?.UpdateCurve(RadioInterno, RadioExterno, Angulo, Angulo + Arco_en_grados); ActualizarGuiasCurvas(); SetSpeed(); } @@ -325,8 +358,9 @@ namespace CtrEditor.ObjetosSim punto1 += centro; punto2 += centro; - simGuia guiaSegmento = simulationManager.AddLine(punto1, punto2); - GuiasSuperiores.Add(guiaSegmento); + simGuia guiaSegmento = CrearGuiaDesdeDosPuntos(punto1, punto2); + if (guiaSegmento != null) + GuiasSuperiores.Add(guiaSegmento); } // Crear segmentos para guía inferior (interna) @@ -349,8 +383,37 @@ namespace CtrEditor.ObjetosSim punto1 += centro; punto2 += centro; - simGuia guiaSegmento = simulationManager.AddLine(punto1, punto2); - GuiasInferiores.Add(guiaSegmento); + simGuia guiaSegmento = CrearGuiaDesdeDosPuntos(punto1, punto2); + if (guiaSegmento != null) + GuiasInferiores.Add(guiaSegmento); + } + } + + /// + /// Método helper para crear una guía desde dos puntos + /// Convierte dos puntos Vector2 a los parámetros requeridos por AddLine + /// + private simGuia CrearGuiaDesdeDosPuntos(Vector2 punto1, Vector2 punto2) + { + try + { + // Calcular la longitud entre los dos puntos + var direccion = punto2 - punto1; + float longitud = direccion.Length(); + + if (longitud < 0.001f) // Evitar líneas de longitud cero + return null; + + // Calcular el ángulo de la línea + float angulo = (float)Math.Atan2(direccion.Y, direccion.X) * 180f / (float)Math.PI; + + // Usar punto1 como topLeft y la longitud como width + return simulationManager.AddLine(longitud, GrosorGuias, punto1, angulo); + } + catch (Exception ex) + { + System.Diagnostics.Debug.WriteLine($"Error creando guía desde dos puntos: {ex.Message}"); + return null; } } @@ -417,6 +480,9 @@ namespace CtrEditor.ObjetosSim // Ensure radioInterno is always less than radioExterno if (RadioInterno >= RadioExterno) RadioInterno = RadioExterno * 0.75f; + + // ✅ NUEVO: Actualizar geometrías en BEPU después del redimensionamiento + ActualizarGeometrias(); } public osTransporteCurvaGuias() @@ -466,7 +532,9 @@ namespace CtrEditor.ObjetosSim if (_visualRepresentation is ucTransporteCurvaGuias uc) { - Simulation_TransporteCurvaGuias = AddCurve(RadioInterno, RadioExterno, Angulo, Angulo + Arco_en_grados); + // ✅ CORRIGIDO: Usar simulationManager?.AddCurve con todos los parámetros requeridos + var topLeft = new Vector2(Left, Top); + Simulation_TransporteCurvaGuias = simulationManager?.AddCurve(RadioInterno, RadioExterno, Angulo, Angulo + Arco_en_grados, topLeft, 0); CrearGuiasCurvas(); // Crear las guías curvas CrearAnimacionStoryBoardTrasnporteCircular(uc.Transporte.TransportePath, InvertirDireccion, Angulo); }