using System.Windows; using System.Windows.Controls; using CommunityToolkit.Mvvm.ComponentModel; using CtrEditor.Convertidores; using CtrEditor.Siemens; using CtrEditor.Simulacion; namespace CtrEditor.ObjetosSim { /// /// Interaction logic for ucTransporteCurva.xaml /// public partial class osTransporteCurva : osBase, IosBase { private float frictionCoefficient; private float velMax50hz; // en metros por minuto private float tiempoRampa; private bool esMarcha; private float _velocidadActual; private osBase _osMotor = null; private simCurve Simulation_TransporteCurva; public static string NombreClase() { return "Transporte Curva 90"; } private string nombre = "Transporte Curva 90"; public override string Nombre { get => nombre; set => SetProperty(ref nombre, value); } [ObservableProperty] private float radioExterno; [ObservableProperty] private float radioInterno; [ObservableProperty] private string motor; [ObservableProperty] [NotifyPropertyChangedFor(nameof(AnguloFinal))] public float angulo; [ObservableProperty] [NotifyPropertyChangedFor(nameof(AnguloFinal))] private float arco_en_grados; [Hidden] public float AnguloFinal { get => Angulo+Arco_en_grados; } public float VelocidadActual { get => _velocidadActual; set { _velocidadActual = value; Simulation_TransporteCurva?.SetSpeed(value); OnPropertyChanged(nameof(VelocidadActual)); } } private void ActualizarGeometrias() { if (_visualRepresentation is ucTransporteCurva uc) { UpdateCurve(Simulation_TransporteCurva, RadioInterno, RadioExterno, Angulo, Angulo+Arco_en_grados); Simulation_TransporteCurva.Speed = VelocidadActual; } } public float FrictionCoefficient { get => frictionCoefficient; set => frictionCoefficient = value; } public float VelMax50hz { get => velMax50hz; set => velMax50hz = value; } public float TiempoRampa { get => tiempoRampa; set => tiempoRampa = value; } public bool EsMarcha { get => esMarcha; set => esMarcha = value; } public osTransporteCurva() { RadioExterno = 1.3f; RadioInterno = 1; Arco_en_grados = 90; } public override void UpdateGeometryStart() { // Se llama antes de la simulacion ActualizarGeometrias(); } public override void UpdatePLC(PLCModel plc, int elapsedMilliseconds) { if (_osMotor != null) { if (_osMotor is osVMmotorSim motor) VelocidadActual = motor.Velocidad; } else _osMotor = ObtenerLink(Motor, typeof(osVMmotorSim)); } public override void ucLoaded() { // El UserControl ya se ha cargado y podemos obtener las coordenadas para // crear el objeto de simulacion ActualizarLeftTop(); if (_visualRepresentation is ucTransporteCurva uc) Simulation_TransporteCurva = AddCurve(RadioInterno,RadioExterno, Angulo, Angulo + Arco_en_grados); // AddCurve(float innerRadius, float outerRadius, float startAngle, float endAngle, Vector2 position) } public override void ucUnLoaded() { // El UserControl se esta eliminando // eliminar el objeto de simulacion simulationManager?.Remove(Simulation_TransporteCurva); } } public partial class ucTransporteCurva : UserControl, IDataContainer { public osBase? Datos { get; set; } public ucTransporteCurva() { InitializeComponent(); this.Loaded += OnLoaded; this.Unloaded += OnUnloaded; } private void OnLoaded(object sender, RoutedEventArgs e) { Datos?.ucLoaded(); } private void OnUnloaded(object sender, RoutedEventArgs e) { Datos?.ucUnLoaded(); } public void Resize(float RadioExterno, float RadioInterno) { if (Datos is osTransporteCurva datos) { if (RadioExterno > RadioInterno && RadioExterno > 0 && RadioInterno >= 0) { datos.RadioExterno = PixelToMeter.Instance.calc.PixelsToMeters(RadioExterno); datos.RadioInterno = PixelToMeter.Instance.calc.PixelsToMeters(RadioInterno); } } } public void Move(float LeftPixels, float TopPixels) { if (Datos != null) { Datos.Left = PixelToMeter.Instance.calc.PixelsToMeters(LeftPixels); Datos.Top = PixelToMeter.Instance.calc.PixelsToMeters(TopPixels); } } public void Rotate(float Angle) { if (Datos != null) if (Datos is osTransporteCurva datos) datos.Angulo = Angle; } public void Highlight(bool State) { } public int ZIndex() { return 1; } } }