180 lines
5.8 KiB
C#
180 lines
5.8 KiB
C#
using System.Numerics;
|
|
using System.ComponentModel;
|
|
using CtrEditor.ObjetosSim;
|
|
|
|
namespace CtrEditor.HydraulicSimulator
|
|
{
|
|
/// <summary>
|
|
/// Clase base para objetos hidráulicos en la simulación
|
|
/// Similar a simBase pero para el sistema hidráulico
|
|
/// </summary>
|
|
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;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Método virtual para actualizar propiedades específicas del objeto
|
|
/// </summary>
|
|
public virtual void UpdateProperties()
|
|
{
|
|
// Implementación base - puede ser sobrescrita
|
|
}
|
|
|
|
/// <summary>
|
|
/// Método virtual para aplicar resultados de la simulación al objeto WPF
|
|
/// </summary>
|
|
public virtual void ApplySimulationResults()
|
|
{
|
|
// Implementación base - puede ser sobrescrita
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Representa una bomba hidráulica en la simulación
|
|
/// </summary>
|
|
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);
|
|
}
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Representa un tanque hidráulico en la simulación
|
|
/// </summary>
|
|
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);
|
|
}
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Representa una tubería hidráulica en la simulación
|
|
/// </summary>
|
|
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
|
|
}
|
|
}
|
|
}
|
|
}
|