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