using System.ComponentModel; using System.Windows; using System.Windows.Controls; using CommunityToolkit.Mvvm.ComponentModel; using LibS7Adv; using CtrEditor.Simulacion; using Xceed.Wpf.Toolkit.PropertyGrid.Attributes; using CtrEditor.FuncionesBase; namespace CtrEditor.ObjetosSim { /// /// Interaction logic for ucTransporteCurva.xaml /// public partial class osTransporteCurva : osBase, IosBase { private osBase Motor = null; private simCurve Simulation_TransporteCurva; private float _velocidadActual; 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] public float velocidadActual; partial void OnVelocidadActualChanged(float value) { SetSpeed(); } [ObservableProperty] bool invertirDireccion; partial void OnInvertirDireccionChanged(bool value) { SetSpeed(); } void SetSpeed() { if (InvertirDireccion) Simulation_TransporteCurva?.SetSpeed(-VelocidadActual); else Simulation_TransporteCurva?.SetSpeed(VelocidadActual); } [ObservableProperty] private float radioExterno; [ObservableProperty] private float radioInterno; [ObservableProperty] [property: Description("Link to Motor")] [property: Category("PLC link:")] [property: ItemsSource(typeof(osBaseItemsSource))] string id_Motor; partial void OnId_MotorChanged(string value) { if (Motor != null) Motor.PropertyChanged -= OnMotorPropertyChanged; if (_mainViewModel != null && value != null && value.Length > 0) { Motor = (osVMmotorSim)_mainViewModel.ObjetosSimulables.FirstOrDefault(s => (s is osVMmotorSim && s.Nombre == value), null); if (Motor != null) Motor.PropertyChanged += OnMotorPropertyChanged; } } private void OnMotorPropertyChanged(object sender, PropertyChangedEventArgs e) { if (e.PropertyName == nameof(osVMmotorSim.Nombre)) { Id_Motor = ((osVMmotorSim)sender).Nombre; } } public override void AnguloChanged(float value) { OnPropertyChanged(nameof(AnguloFinal)); } [ObservableProperty] [NotifyPropertyChangedFor(nameof(AnguloFinal))] private float arco_en_grados; [Hidden] public float AnguloFinal { get => Angulo+Arco_en_grados; } private void ActualizarGeometrias() { if (_visualRepresentation is ucTransporteCurva uc) { UpdateCurve(Simulation_TransporteCurva, RadioInterno, RadioExterno, Angulo, Angulo+Arco_en_grados); SetSpeed(); } } [ObservableProperty] public float frictionCoefficient; [ObservableProperty] public float velMax50hz; [ObservableProperty] public float tiempoRampa; [ObservableProperty] public bool esMarcha; 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(PLCViewModel plc, int elapsedMilliseconds) { if (Motor != null) { if (Motor is osVMmotorSim motor) VelocidadActual = motor.Velocidad; } } public override void ucLoaded() { // El UserControl ya se ha cargado y podemos obtener las coordenadas para // crear el objeto de simulacion base.ucLoaded(); OnId_MotorChanged(Id_Motor); // Link Id_Motor = Motor 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 Highlight(bool State) { } public ZIndexEnum ZIndex() { return ZIndexEnum.Estaticos; } } }