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; } } }