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:
parent
fbac81ec45
commit
3773da0ee3
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue