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); }