Se añadió un nuevo manager para la visualización 3D en MainWindow y se conectó con el simulation manager. Además, se implementaron métodos para manejar cambios de posición en ucTransporteCurvaGuias, actualizando la geometría en BEPU y sincronizando con la visualización 3D. Se mejoró la creación de guías desde dos puntos y se corrigieron errores en la actualización de curvas.

This commit is contained in:
Miguel 2025-07-01 20:02:23 +02:00
parent fbac81ec45
commit 3773da0ee3
2 changed files with 86 additions and 6 deletions

View File

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

View File

@ -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();
}
/// <summary>
/// ✅ NUEVO: Actualizar posición en BEPU cuando cambia la posición del objeto
/// </summary>
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);
}
}
/// <summary>
/// Método helper para crear una guía desde dos puntos
/// Convierte dos puntos Vector2 a los parámetros requeridos por AddLine
/// </summary>
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);
}