138 lines
4.6 KiB
C#
138 lines
4.6 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Text;
|
|
using CtrEditor.ObjetosSim;
|
|
|
|
namespace CtrEditor.HydraulicSimulator.TSNet.Components
|
|
{
|
|
/// <summary>
|
|
/// Adaptador simplificado para osHydPipe - SOLO lectura de configuración y almacenamiento de resultados
|
|
/// Los valores se capturan al INICIAR la simulación y no se modifican durante la ejecución
|
|
/// </summary>
|
|
public class TSNetPipeAdapter
|
|
{
|
|
private readonly osHydPipe pipe;
|
|
private string pipeId;
|
|
|
|
// Configuración capturada al inicio de simulación (INMUTABLE durante simulación)
|
|
public PipeConfiguration Configuration { get; private set; }
|
|
|
|
// Resultados calculados por TSNet (SOLO escritura desde TSNet)
|
|
public TSNetPipeResults Results { get; private set; }
|
|
|
|
public TSNetPipeAdapter(osHydPipe pipe)
|
|
{
|
|
this.pipe = pipe ?? throw new ArgumentNullException(nameof(pipe));
|
|
|
|
// Validación defensiva para Id
|
|
if (pipe.Id == null)
|
|
{
|
|
throw new InvalidOperationException($"La tubería '{pipe.Nombre ?? "sin nombre"}' no tiene un Id válido");
|
|
}
|
|
|
|
this.pipeId = $"PIPE_{pipe.Id.Value}";
|
|
this.Results = new TSNetPipeResults { PipeId = pipeId };
|
|
}
|
|
|
|
/// <summary>
|
|
/// ID único de la tubería para TSNet
|
|
/// </summary>
|
|
public string PipeId => pipeId;
|
|
|
|
/// <summary>
|
|
/// Captura la configuración actual de la tubería al INICIO de la simulación
|
|
/// Esta configuración queda CONGELADA hasta que se detenga y reinicie la simulación
|
|
/// </summary>
|
|
public void CaptureConfigurationForSimulation()
|
|
{
|
|
Configuration = new PipeConfiguration
|
|
{
|
|
PipeId = pipeId,
|
|
Length = pipe.Length,
|
|
Diameter = pipe.Diameter,
|
|
Roughness = pipe.Roughness,
|
|
CapturedAt = DateTime.Now
|
|
};
|
|
}
|
|
|
|
/// <summary>
|
|
/// Resetea los resultados (para nueva simulación)
|
|
/// </summary>
|
|
public void ResetCalculatedValues()
|
|
{
|
|
Results = new TSNetPipeResults { PipeId = pipeId };
|
|
}
|
|
|
|
/// <summary>
|
|
/// Validación de configuración capturada
|
|
/// </summary>
|
|
public List<string> ValidateConfiguration()
|
|
{
|
|
var errors = new List<string>();
|
|
|
|
if (Configuration == null)
|
|
{
|
|
errors.Add($"Tubería {PipeId}: Configuración no capturada");
|
|
return errors;
|
|
}
|
|
|
|
if (Configuration.Length <= 0)
|
|
errors.Add($"Tubería {PipeId}: Length debe ser mayor que 0");
|
|
|
|
if (Configuration.Diameter <= 0)
|
|
errors.Add($"Tubería {PipeId}: Diameter debe ser mayor que 0");
|
|
|
|
if (Configuration.Roughness < 0)
|
|
errors.Add($"Tubería {PipeId}: Roughness no puede ser negativo");
|
|
|
|
return errors;
|
|
}
|
|
|
|
public override string ToString()
|
|
{
|
|
var configStatus = Configuration != null ? "Configured" : "Not Configured";
|
|
var resultStatus = Results?.FlowStatus ?? "No Results";
|
|
return $"TSNetPipeAdapter[{PipeId}] - Config: {configStatus}, Results: {resultStatus}";
|
|
}
|
|
|
|
/// <summary>
|
|
/// Aplica los resultados de TSNet a la tubería
|
|
/// </summary>
|
|
public void ApplyTSNetResults(Dictionary<string, double> flows, Dictionary<string, double> pressures)
|
|
{
|
|
if (Results == null) return;
|
|
|
|
try
|
|
{
|
|
// Actualizar resultados desde los diccionarios de TSNet
|
|
if (flows.ContainsKey(PipeId))
|
|
{
|
|
Results.CalculatedFlowM3s = flows[PipeId];
|
|
Results.CalculatedFlowLMin = flows[PipeId] * 60000; // m³/s a L/min
|
|
}
|
|
|
|
Results.Timestamp = DateTime.Now;
|
|
Results.FlowStatus = "Updated from TSNet";
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Results.FlowStatus = $"Error: {ex.Message}";
|
|
}
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Configuración inmutable de la tubería capturada al inicio de simulación
|
|
/// </summary>
|
|
public class PipeConfiguration
|
|
{
|
|
public string PipeId { get; set; }
|
|
public DateTime CapturedAt { get; set; }
|
|
|
|
// Propiedades físicas de la tubería
|
|
public double Length { get; set; }
|
|
public double Diameter { get; set; }
|
|
public double Roughness { get; set; }
|
|
}
|
|
}
|