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.CurrentLevelM;
MaxLevel = tank.MaxLevelM;
MinLevel = tank.MinLevelM;
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
}
}
}
}