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.ObjetosSim;
using CtrEditor.Simulacion;
using System.Diagnostics; using System.Diagnostics;
using System.Globalization; using System.Globalization;
using System.Windows; using System.Windows;
@ -45,6 +46,9 @@ namespace CtrEditor
private dataDebug dataDebug = new dataDebug(); private dataDebug dataDebug = new dataDebug();
// Manager para la visualización 3D
private BEPUVisualization3DManager _visualization3DManager;
public MainWindow() public MainWindow()
{ {
InitializeComponent(); InitializeComponent();
@ -91,10 +95,18 @@ namespace CtrEditor
viewModel.MainWindow = this; viewModel.MainWindow = this;
viewModel.ImageSelected += ViewModel_ImageSelected; viewModel.ImageSelected += ViewModel_ImageSelected;
viewModel?.LoadInitialData(); viewModel?.LoadInitialData();
viewModel.MainCanvas = ImagenEnTrabajoCanvas; viewModel.MainCanvas = ImagenEnTrabajoCanvas;
// Inicializar ObjectHierarchyView // Inicializar ObjectHierarchyView
ObjectHierarchy.Initialize(viewModel); 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) partial void OnArco_en_gradosChanged(float value)
{ {
OnPropertyChanged(nameof(AnguloFinal));
ActualizarGeometrias(); 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] [Hidden]
public float AnguloFinal public float AnguloFinal
{ {
@ -253,7 +286,7 @@ namespace CtrEditor.ObjetosSim
{ {
if (_visualRepresentation is ucTransporteCurvaGuias uc) 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(); ActualizarGuiasCurvas();
SetSpeed(); SetSpeed();
} }
@ -325,7 +358,8 @@ namespace CtrEditor.ObjetosSim
punto1 += centro; punto1 += centro;
punto2 += centro; punto2 += centro;
simGuia guiaSegmento = simulationManager.AddLine(punto1, punto2); simGuia guiaSegmento = CrearGuiaDesdeDosPuntos(punto1, punto2);
if (guiaSegmento != null)
GuiasSuperiores.Add(guiaSegmento); GuiasSuperiores.Add(guiaSegmento);
} }
@ -349,11 +383,40 @@ namespace CtrEditor.ObjetosSim
punto1 += centro; punto1 += centro;
punto2 += centro; punto2 += centro;
simGuia guiaSegmento = simulationManager.AddLine(punto1, punto2); simGuia guiaSegmento = CrearGuiaDesdeDosPuntos(punto1, punto2);
if (guiaSegmento != null)
GuiasInferiores.Add(guiaSegmento); 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;
}
}
public override void OnMoveResizeRotate() public override void OnMoveResizeRotate()
{ {
ActualizarGeometrias(); ActualizarGeometrias();
@ -417,6 +480,9 @@ namespace CtrEditor.ObjetosSim
// Ensure radioInterno is always less than radioExterno // Ensure radioInterno is always less than radioExterno
if (RadioInterno >= RadioExterno) if (RadioInterno >= RadioExterno)
RadioInterno = RadioExterno * 0.75f; RadioInterno = RadioExterno * 0.75f;
// ✅ NUEVO: Actualizar geometrías en BEPU después del redimensionamiento
ActualizarGeometrias();
} }
public osTransporteCurvaGuias() public osTransporteCurvaGuias()
@ -466,7 +532,9 @@ namespace CtrEditor.ObjetosSim
if (_visualRepresentation is ucTransporteCurvaGuias uc) 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 CrearGuiasCurvas(); // Crear las guías curvas
CrearAnimacionStoryBoardTrasnporteCircular(uc.Transporte.TransportePath, InvertirDireccion, Angulo); CrearAnimacionStoryBoardTrasnporteCircular(uc.Transporte.TransportePath, InvertirDireccion, Angulo);
} }