From 81329e4c09e527ae59f0641b0be0dcfb510abf45 Mon Sep 17 00:00:00 2001 From: Miguel Date: Tue, 24 Jun 2025 17:07:37 +0200 Subject: [PATCH] =?UTF-8?q?Se=20a=C3=B1adieron=20nuevas=20propiedades=20y?= =?UTF-8?q?=20m=C3=A9todos=20en=20la=20clase=20ucTransporteCurvaGuias=20pa?= =?UTF-8?q?ra=20gestionar=20gu=C3=ADas=20curvas,=20incluyendo=20la=20creac?= =?UTF-8?q?i=C3=B3n=20y=20actualizaci=C3=B3n=20de=20segmentos=20de=20gu?= =?UTF-8?q?=C3=ADas.=20Se=20implementaron=20validaciones=20para=20el=20n?= =?UTF-8?q?=C3=BAmero=20de=20segmentos=20y=20se=20mejor=C3=B3=20la=20l?= =?UTF-8?q?=C3=B3gica=20de=20actualizaci=C3=B3n=20de=20geometr=C3=ADas=20a?= =?UTF-8?q?l=20cambiar=20propiedades=20relevantes.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Estaticos/ucTransporteCurvaGuias.xaml.cs | 152 +++++++++++++++++- 1 file changed, 148 insertions(+), 4 deletions(-) diff --git a/ObjetosSim/Estaticos/ucTransporteCurvaGuias.xaml.cs b/ObjetosSim/Estaticos/ucTransporteCurvaGuias.xaml.cs index 3b118c7..26ea6e5 100644 --- a/ObjetosSim/Estaticos/ucTransporteCurvaGuias.xaml.cs +++ b/ObjetosSim/Estaticos/ucTransporteCurvaGuias.xaml.cs @@ -18,14 +18,17 @@ namespace CtrEditor.ObjetosSim private osBase Motor = null; private simCurve Simulation_TransporteCurvaGuias; + // Listas para almacenar los segmentos de las guías curvas + private List GuiasSuperiores = new List(); + private List GuiasInferiores = new List(); private float _velocidadActual; public static string NombreClase() { - return "Transporte Curva 90"; + return "Transporte Curva Guias"; } - private string nombre = "Transporte Curva 90"; + private string nombre = "Transporte Curva Guias"; public override string Nombre { get => nombre; @@ -83,7 +86,43 @@ namespace CtrEditor.ObjetosSim [ObservableProperty] private float radioInterno; + partial void OnRadioInternoChanged(float value) + { + ActualizarGeometrias(); + } + [ObservableProperty] + [property: Description("Número de segmentos para las guías (máximo 20)")] + [property: Category("Guías")] + private int numeroSegmentosGuias; + + partial void OnNumeroSegmentosGuiasChanged(int value) + { + // Limitar entre 4 y 20 segmentos + if (value < 4) NumeroSegmentosGuias = 4; + if (value > 20) NumeroSegmentosGuias = 20; + ActualizarGeometrias(); + } + + [ObservableProperty] + [property: Description("Grosor de las guías")] + [property: Category("Guías")] + private float grosorGuias; + + partial void OnGrosorGuiasChanged(float value) + { + ActualizarGeometrias(); + } + + [ObservableProperty] + [property: Description("Distancia de separación de las guías desde el borde")] + [property: Category("Guías")] + private float distanciaGuias; + + partial void OnDistanciaGuiasChanged(float value) + { + ActualizarGeometrias(); + } [ObservableProperty] [property: Description("Bit to enable Link to Motor")] @@ -124,12 +163,18 @@ namespace CtrEditor.ObjetosSim public override void AnguloChanged(float value) { OnPropertyChanged(nameof(AnguloFinal)); + ActualizarGeometrias(); } [ObservableProperty] [NotifyPropertyChangedFor(nameof(AnguloFinal))] private float arco_en_grados; + partial void OnArco_en_gradosChanged(float value) + { + ActualizarGeometrias(); + } + [Hidden] public float AnguloFinal { @@ -141,10 +186,106 @@ namespace CtrEditor.ObjetosSim if (_visualRepresentation is ucTransporteCurvaGuias uc) { UpdateCurve(Simulation_TransporteCurvaGuias, RadioInterno, RadioExterno, Angulo, Angulo + Arco_en_grados); + ActualizarGuiasCurvas(); SetSpeed(); } } + private void ActualizarGuiasCurvas() + { + // Limpiar guías existentes + EliminarGuiasExistentes(); + + // Crear nuevas guías + CrearGuiasCurvas(); + } + + private void EliminarGuiasExistentes() + { + foreach (var guia in GuiasSuperiores) + { + simulationManager?.Remove(guia); + } + foreach (var guia in GuiasInferiores) + { + simulationManager?.Remove(guia); + } + GuiasSuperiores.Clear(); + GuiasInferiores.Clear(); + } + + private void CrearGuiasCurvas() + { + if (NumeroSegmentosGuias < 4 || simulationManager == null) + return; + + float radioGuiaSuperior = RadioExterno + DistanciaGuias; + float radioGuiaInferior = RadioInterno - DistanciaGuias; + + // Asegurar que el radio interior de la guía no sea negativo + if (radioGuiaInferior < 0.01f) + radioGuiaInferior = 0.01f; + + // Convertir ángulos a radianes + float anguloInicioRad = simBase.GradosARadianes(Angulo); + float anguloFinalRad = simBase.GradosARadianes(AnguloFinal); + float rangoAngular = anguloFinalRad - anguloInicioRad; + + // Calcular el paso angular entre segmentos + float pasoAngular = rangoAngular / NumeroSegmentosGuias; + + // Obtener el centro una vez para todo el método + nkast.Aether.Physics2D.Common.Vector2 centro = GetCurveCenterInMeter(RadioExterno); + + // Crear segmentos para guía superior (externa) + for (int i = 0; i < NumeroSegmentosGuias; i++) + { + float angulo1 = anguloInicioRad + i * pasoAngular; + float angulo2 = anguloInicioRad + (i + 1) * pasoAngular; + + nkast.Aether.Physics2D.Common.Vector2 punto1 = new nkast.Aether.Physics2D.Common.Vector2( + radioGuiaSuperior * (float)Math.Cos(angulo1), + radioGuiaSuperior * (float)Math.Sin(angulo1) + ); + + nkast.Aether.Physics2D.Common.Vector2 punto2 = new nkast.Aether.Physics2D.Common.Vector2( + radioGuiaSuperior * (float)Math.Cos(angulo2), + radioGuiaSuperior * (float)Math.Sin(angulo2) + ); + + // Ajustar por la posición del objeto + punto1 += centro; + punto2 += centro; + + simGuia guiaSegmento = simulationManager.AddLine(punto1, punto2); + GuiasSuperiores.Add(guiaSegmento); + } + + // Crear segmentos para guía inferior (interna) + for (int i = 0; i < NumeroSegmentosGuias; i++) + { + float angulo1 = anguloInicioRad + i * pasoAngular; + float angulo2 = anguloInicioRad + (i + 1) * pasoAngular; + + nkast.Aether.Physics2D.Common.Vector2 punto1 = new nkast.Aether.Physics2D.Common.Vector2( + radioGuiaInferior * (float)Math.Cos(angulo1), + radioGuiaInferior * (float)Math.Sin(angulo1) + ); + + nkast.Aether.Physics2D.Common.Vector2 punto2 = new nkast.Aether.Physics2D.Common.Vector2( + radioGuiaInferior * (float)Math.Cos(angulo2), + radioGuiaInferior * (float)Math.Sin(angulo2) + ); + + // Ajustar por la posición del objeto + punto1 += centro; + punto2 += centro; + + simGuia guiaSegmento = simulationManager.AddLine(punto1, punto2); + GuiasInferiores.Add(guiaSegmento); + } + } + public override void OnMoveResizeRotate() { ActualizarGeometrias(); @@ -195,8 +336,6 @@ namespace CtrEditor.ObjetosSim RadioInterno = RadioExterno * 0.75f; } - - public osTransporteCurvaGuias() { RadioExterno = 1.3f; @@ -205,6 +344,9 @@ namespace CtrEditor.ObjetosSim Alto = RadioExterno * 2; // Set initial height based on external radius Arco_en_grados = 90; Tag_ReleActivatedMotor = "1"; + NumeroSegmentosGuias = 12; // Valor por defecto + GrosorGuias = 0.03f; + DistanciaGuias = 0.05f; } public override void UpdateGeometryStart() @@ -241,6 +383,7 @@ namespace CtrEditor.ObjetosSim if (_visualRepresentation is ucTransporteCurvaGuias uc) { Simulation_TransporteCurvaGuias = AddCurve(RadioInterno, RadioExterno, Angulo, Angulo + Arco_en_grados); + CrearGuiasCurvas(); // Crear las guías curvas CrearAnimacionStoryBoardTrasnporteCircular(uc.Transporte.TransportePath, InvertirDireccion, Angulo); } } @@ -249,6 +392,7 @@ namespace CtrEditor.ObjetosSim // El UserControl se esta eliminando // eliminar el objeto de simulacion simulationManager?.Remove(Simulation_TransporteCurvaGuias); + EliminarGuiasExistentes(); } }