using HydraulicSimulator.Models;
using System.Collections.Generic;
namespace CtrEditor.HydraulicSimulator
{
///
/// Interfaz base para objetos que tienen componentes hidráulicos
///
public interface IHydraulicComponent
{
///
/// Indica si este objeto tiene componentes hidráulicos activos
///
bool HasHydraulicComponents { get; }
///
/// Obtiene los nodos hidráulicos asociados a este objeto
///
/// Lista de definiciones de nodos
List GetHydraulicNodes();
///
/// Obtiene los elementos hidráulicos asociados a este objeto
///
/// Lista de definiciones de elementos hidráulicos
List GetHydraulicElements();
///
/// Actualiza las propiedades hidráulicas del objeto antes de la simulación
///
void UpdateHydraulicProperties();
///
/// Aplica los resultados de la simulación hidráulica al objeto
///
/// Caudales calculados
/// Presiones calculadas
void ApplyHydraulicResults(Dictionary flows, Dictionary pressures);
}
///
/// Interfaz para objetos que pueden recibir información de caudal
///
public interface IHydraulicFlowReceiver
{
///
/// Establece el caudal actual del objeto
///
/// Caudal en m³/s
void SetFlow(double flow);
///
/// Obtiene el caudal actual del objeto
///
/// Caudal en m³/s
double GetFlow();
}
///
/// Interfaz para objetos que pueden recibir información de presión
///
public interface IHydraulicPressureReceiver
{
///
/// Establece la presión actual del objeto
///
/// Presión en Pa
void SetPressure(double pressure);
///
/// Obtiene la presión actual del objeto
///
/// Presión en Pa
double GetPressure();
}
///
/// Interfaz para objetos que son bombas hidráulicas
///
public interface IHydraulicPump : IHydraulicComponent, IHydraulicFlowReceiver, IHydraulicPressureReceiver
{
///
/// Cabeza de la bomba a caudal cero (m)
///
double PumpHead { get; set; }
///
/// Caudal máximo de la bomba (m³/s)
///
double MaxFlow { get; set; }
///
/// Velocidad relativa de la bomba (0.0 a 1.0)
///
double SpeedRatio { get; set; }
///
/// Indica si la bomba está encendida
///
bool IsRunning { get; set; }
///
/// Dirección de la bomba (+1 o -1)
///
int PumpDirection { get; set; }
}
///
/// Interfaz para objetos que son válvulas hidráulicas
///
public interface IHydraulicValve : IHydraulicComponent, IHydraulicFlowReceiver, IHydraulicPressureReceiver
{
///
/// Coeficiente Kv de la válvula completamente abierta (m³/h/√bar)
///
double KvFull { get; set; }
///
/// Apertura actual de la válvula (0.0 a 1.0)
///
double Opening { get; set; }
///
/// Indica si la válvula está completamente cerrada
///
bool IsClosed { get; }
///
/// Indica si la válvula está completamente abierta
///
bool IsFullyOpen { get; }
}
///
/// Interfaz para objetos que son tuberías hidráulicas
///
public interface IHydraulicPipe : IHydraulicComponent, IHydraulicFlowReceiver, IHydraulicPressureReceiver
{
///
/// Longitud de la tubería (m)
///
double Length { get; set; }
///
/// Diámetro interno de la tubería (m)
///
double Diameter { get; set; }
///
/// Rugosidad absoluta de la tubería (m)
///
double Roughness { get; set; }
}
///
/// Interfaz para objetos que son tanques hidráulicos
///
public interface IHydraulicTank : IHydraulicComponent, IHydraulicPressureReceiver
{
///
/// Presión del tanque (Pa)
///
double TankPressure { get; set; }
///
/// Nivel actual del tanque (m)
///
double Level { get; set; }
///
/// Área de la sección transversal del tanque (m²)
///
double CrossSectionalArea { get; set; }
///
/// Indica si el tanque tiene presión fija
///
bool IsFixedPressure { get; }
}
///
/// Definición de un nodo hidráulico
///
public class HydraulicNodeDefinition
{
///
/// Nombre único del nodo
///
public string Name { get; set; }
///
/// Indica si el nodo tiene presión fija
///
public bool IsFixedPressure { get; set; }
///
/// Presión del nodo (Pa), si es de presión fija
///
public double? Pressure { get; set; }
///
/// Descripción del nodo
///
public string Description { get; set; } = "";
public HydraulicNodeDefinition(string name, bool isFixedPressure = false, double? pressure = null, string description = "")
{
Name = name;
IsFixedPressure = isFixedPressure;
Pressure = pressure;
Description = description;
}
}
///
/// Definición de un elemento hidráulico
///
public class HydraulicElementDefinition
{
///
/// Nombre único del elemento
///
public string Name { get; set; }
///
/// Nodo de origen
///
public string FromNode { get; set; }
///
/// Nodo de destino
///
public string ToNode { get; set; }
///
/// Elemento hidráulico
///
public Element Element { get; set; }
///
/// Descripción del elemento
///
public string Description { get; set; } = "";
public HydraulicElementDefinition(string name, string fromNode, string toNode, Element element, string description = "")
{
Name = name;
FromNode = fromNode;
ToNode = toNode;
Element = element;
Description = description;
}
}
///
/// Tipos de elementos hidráulicos
///
public enum HydraulicElementType
{
Pipe,
Pump,
Valve,
MinorLoss,
Tank,
Junction
}
///
/// Configuración de un elemento hidráulico
///
public class HydraulicElementConfiguration
{
public HydraulicElementType Type { get; set; }
public Dictionary Parameters { get; set; } = new Dictionary();
public HydraulicElementConfiguration(HydraulicElementType type)
{
Type = type;
}
///
/// Establece un parámetro de configuración
///
public void SetParameter(string key, object value)
{
Parameters[key] = value;
}
///
/// Obtiene un parámetro de configuración
///
public T GetParameter(string key, T defaultValue = default(T))
{
if (Parameters.ContainsKey(key) && Parameters[key] is T)
{
return (T)Parameters[key];
}
return defaultValue;
}
}
}