using Newtonsoft.Json.Linq; using System; using System.Collections.Generic; using System.ComponentModel; using System.Globalization; using System.Linq; using System.Text; using System.Text.Json.Serialization; using System.Threading.Tasks; using System.Windows.Controls; using System.Windows.Data; using static System.Runtime.InteropServices.JavaScript.JSType; namespace CtrEditor.ObjetosSim { public interface IosBase { string Nombre { get; } void ConnectSimManager(SimulationManager simulationManager); void UpdateControl(); } public interface IDataContainer { osBase? Datos { get; set; } void Resize(float width, float height); void Move(float Left, float Top); void Rotate(float Angle); void Highlight(bool State); int ZIndex(); } public abstract class osBase : INotifyPropertyChanged, IosBase { public abstract float Left { get; set; } public abstract float Top { get; set; } public bool Inicializado = false; protected UserControl? _visualRepresentation = null; public abstract string Nombre { get; set; } public abstract void ConnectSimManager(SimulationManager simulationManager); public abstract void UpdateControl(); [JsonIgnore] public UserControl? VisualRepresentation { get => _visualRepresentation; set => _visualRepresentation = value; } public void CanvasSetLeftinMeter(float left) { if (_visualRepresentation != null) Canvas.SetLeft(_visualRepresentation, PixelToMeter.Instance.calc.MetersToPixels(left)); } public void CanvasSetTopinMeter(float top) { if (_visualRepresentation != null) Canvas.SetTop(_visualRepresentation, PixelToMeter.Instance.calc.MetersToPixels(top)); } public event PropertyChangedEventHandler PropertyChanged; protected virtual void OnPropertyChanged(string propertyName) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } } public class PixelToMeter { // Instancia privada estática, parte del patrón Singleton private static PixelToMeter? _instance; public UnitConverter calc = new UnitConverter(0.01f); // Propiedad pública estática para acceder a la instancia public static PixelToMeter Instance { get { if (_instance == null) { _instance = new PixelToMeter(); } return _instance; } } } public class MeterToPixelConverter : IValueConverter { public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { float meters = (float)value; return PixelToMeter.Instance.calc.MetersToPixels(meters); } public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { float pixels = (float)value; return PixelToMeter.Instance.calc.PixelsToMeters(pixels); } } public class MeterToPixelConverterDbl : IValueConverter { public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { double meters = (double)value; return (double)PixelToMeter.Instance.calc.MetersToPixels((float)meters); } public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { double pixels = (double)value; return PixelToMeter.Instance.calc.PixelsToMeters((float)pixels); } } public class UnitConverter { // La escala representa cuántos metros hay en un píxel public float Scale { get; private set; } public UnitConverter(float scale) { if (scale <= 0) throw new ArgumentException("Scale must be greater than zero."); Scale = scale; } // Convierte una distancia en metros a píxeles public float MetersToPixels(float meters) { return meters / Scale; } // Convierte una distancia en píxeles a metros public float PixelsToMeters(float pixels) { return pixels * Scale; } // Configurar o ajustar la escala public void SetScale(float newScale) { if (newScale <= 0) throw new ArgumentException("Scale must be greater than zero."); Scale = newScale; } } }