using System.Numerics; using System.ComponentModel; using CtrEditor.ObjetosSim; namespace CtrEditor.HydraulicSimulator { /// /// Clase base para objetos hidráulicos en la simulación /// Similar a simBase pero para el sistema hidráulico /// public class simHydraulicBase { public string SimObjectType { get; set; } = ""; public osBase WpfObject { get; set; } public string Nombre { get; set; } public bool Descartar { get; set; } = false; protected HydraulicSimulationManager _hydraulicManager; public simHydraulicBase(HydraulicSimulationManager hydraulicManager) { _hydraulicManager = hydraulicManager; } /// /// Método virtual para actualizar propiedades específicas del objeto /// public virtual void UpdateProperties() { // Implementación base - puede ser sobrescrita } /// /// Método virtual para aplicar resultados de la simulación al objeto WPF /// public virtual void ApplySimulationResults() { // Implementación base - puede ser sobrescrita } } /// /// Representa una bomba hidráulica en la simulación /// public class simHydraulicPump : simHydraulicBase { public double PumpHead { get; set; } public double MaxFlow { get; set; } public double SpeedRatio { get; set; } public bool IsRunning { get; set; } public int PumpDirection { get; set; } // Resultados de la simulación public double CurrentFlow { get; set; } public double CurrentPressure { get; set; } public simHydraulicPump(HydraulicSimulationManager hydraulicManager) : base(hydraulicManager) { SimObjectType = "HydraulicPump"; } public override void UpdateProperties() { // Actualizar propiedades específicas de la bomba if (WpfObject is IHydraulicPump pump) { PumpHead = pump.PumpHead; MaxFlow = pump.MaxFlow; SpeedRatio = pump.SpeedRatio; IsRunning = pump.IsRunning; PumpDirection = pump.PumpDirection; } } public override void ApplySimulationResults() { // Aplicar resultados al objeto WPF if (WpfObject is IHydraulicPump pump) { pump.SetFlow(CurrentFlow); pump.SetPressure(CurrentPressure); } } } /// /// Representa un tanque hidráulico en la simulación /// public class simHydraulicTank : simHydraulicBase { public double TankPressure { get; set; } public double CurrentLevel { get; set; } public double MaxLevel { get; set; } public double MinLevel { get; set; } public double CrossSectionalArea { get; set; } public bool IsFixedPressure { get; set; } // Resultados de la simulación public double InletFlow { get; set; } public double OutletFlow { get; set; } public double CurrentPressure { get; set; } public simHydraulicTank(HydraulicSimulationManager hydraulicManager) : base(hydraulicManager) { SimObjectType = "HydraulicTank"; } public override void UpdateProperties() { // Actualizar propiedades específicas del tanque if (WpfObject is osHydTank tank) { TankPressure = tank.TankPressure; CurrentLevel = tank.CurrentLevel; MaxLevel = tank.MaxLevel; MinLevel = tank.MinLevel; CrossSectionalArea = tank.CrossSectionalArea; IsFixedPressure = tank.IsFixedPressure; } } public override void ApplySimulationResults() { // Aplicar resultados al objeto WPF if (WpfObject is IHydraulicFlowReceiver flowReceiver) { flowReceiver.SetFlow(InletFlow - OutletFlow); // Flujo neto } if (WpfObject is IHydraulicPressureReceiver pressureReceiver) { pressureReceiver.SetPressure(CurrentPressure); } } } /// /// Representa una tubería hidráulica en la simulación /// public class simHydraulicPipe : simHydraulicBase { public double Length { get; set; } public double Diameter { get; set; } public double Roughness { get; set; } public string ComponenteAId { get; set; } public string ComponenteBId { get; set; } // Resultados de la simulación public double CurrentFlow { get; set; } public double PressureDrop { get; set; } public simHydraulicPipe(HydraulicSimulationManager hydraulicManager) : base(hydraulicManager) { SimObjectType = "HydraulicPipe"; } public override void UpdateProperties() { // Actualizar propiedades específicas de la tubería if (WpfObject is IHydraulicPipe pipe) { Length = pipe.Length; Diameter = pipe.Diameter; Roughness = pipe.Roughness; // Obtener IDs de componentes conectados (esto se manejará en el manager) } } public override void ApplySimulationResults() { // Aplicar resultados al objeto WPF if (WpfObject is IHydraulicPipe pipe) { pipe.SetFlow(CurrentFlow); pipe.SetPressure(PressureDrop); // En tuberías, "presión" es la pérdida de presión } } } }