185 lines
5.8 KiB
C#
185 lines
5.8 KiB
C#
using System;
|
|
using System.ComponentModel;
|
|
using Newtonsoft.Json;
|
|
|
|
namespace CtrEditor.ObjetosSim
|
|
{
|
|
/// <summary>
|
|
/// Tipos de fluido en el sistema hidráulico
|
|
/// </summary>
|
|
public enum FluidType
|
|
{
|
|
[Description("Aire (tanque vacío)")]
|
|
Air,
|
|
[Description("Agua")]
|
|
Water,
|
|
[Description("Jarabe con sacarosa")]
|
|
Syrup,
|
|
[Description("Soda cáustica (CIP)")]
|
|
CausticSoda,
|
|
[Description("Mezcla")]
|
|
Mix
|
|
}
|
|
|
|
/// <summary>
|
|
/// Propiedades de un fluido en el sistema
|
|
/// </summary>
|
|
[JsonObject(MemberSerialization.OptIn)]
|
|
public class FluidProperties
|
|
{
|
|
[JsonProperty]
|
|
public FluidType Type { get; set; } = FluidType.Water;
|
|
|
|
[JsonProperty]
|
|
public double Temperature { get; set; } = 20.0; // °C
|
|
|
|
[JsonProperty]
|
|
public double Brix { get; set; } = 0.0; // % para jarabes
|
|
|
|
[JsonProperty]
|
|
public double Concentration { get; set; } = 0.0; // % para soda cáustica
|
|
|
|
[JsonProperty]
|
|
public double Volume { get; set; } = 0.0; // Litros
|
|
|
|
/// <summary>
|
|
/// Densidad del fluido en kg/L
|
|
/// </summary>
|
|
[JsonIgnore]
|
|
public double Density
|
|
{
|
|
get
|
|
{
|
|
return Type switch
|
|
{
|
|
FluidType.Air => 0.0012, // kg/L a 20°C
|
|
FluidType.Water => 1.0 - (Temperature - 20) * 0.0002, // Aproximación
|
|
FluidType.Syrup => 1.0 + (Brix * 0.004), // Aproximación: +0.4% densidad por grado Brix
|
|
FluidType.CausticSoda => 1.0 + (Concentration * 0.01), // Aproximación
|
|
FluidType.Mix => 1.0, // Se calculará en runtime
|
|
_ => 1.0
|
|
};
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Viscosidad dinámica en cP (centipoise)
|
|
/// </summary>
|
|
[JsonIgnore]
|
|
public double Viscosity
|
|
{
|
|
get
|
|
{
|
|
return Type switch
|
|
{
|
|
FluidType.Air => 0.018,
|
|
FluidType.Water => Math.Max(0.3, 1.0 - (Temperature - 20) * 0.025), // Disminuye con temperatura
|
|
FluidType.Syrup => Math.Max(1.0, 1.0 + Math.Pow(Brix / 10.0, 2.5)), // Aumenta exponencialmente con Brix
|
|
FluidType.CausticSoda => Math.Max(0.8, 1.0 + Concentration * 0.02),
|
|
FluidType.Mix => 1.0, // Se calculará en runtime
|
|
_ => 1.0
|
|
};
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Color representativo del fluido para UI
|
|
/// </summary>
|
|
[JsonIgnore]
|
|
public string Color
|
|
{
|
|
get
|
|
{
|
|
return Type switch
|
|
{
|
|
FluidType.Air => "#E0E0E0",
|
|
FluidType.Water => "#87CEEB",
|
|
FluidType.Syrup => $"#{Math.Min(255, 139 + (int)(Brix * 2)):X2}{Math.Min(255, 69 + (int)(Brix)):X2}19", // Marrón más intenso con más Brix
|
|
FluidType.CausticSoda => "#FF6347",
|
|
FluidType.Mix => "#DDA0DD",
|
|
_ => "#CCCCCC"
|
|
};
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Descripción del fluido
|
|
/// </summary>
|
|
[JsonIgnore]
|
|
public string Description
|
|
{
|
|
get
|
|
{
|
|
return Type switch
|
|
{
|
|
FluidType.Air => "Aire",
|
|
FluidType.Water => $"Agua {Temperature:F1}°C",
|
|
FluidType.Syrup => $"Jarabe {Brix:F1}°Bx {Temperature:F1}°C",
|
|
FluidType.CausticSoda => $"NaOH {Concentration:F1}% {Temperature:F1}°C",
|
|
FluidType.Mix => $"Mezcla {Temperature:F1}°C",
|
|
_ => "Fluido"
|
|
};
|
|
}
|
|
}
|
|
|
|
public FluidProperties()
|
|
{
|
|
}
|
|
|
|
public FluidProperties(FluidType type, double temperature = 20.0, double brix = 0.0, double concentration = 0.0)
|
|
{
|
|
Type = type;
|
|
Temperature = temperature;
|
|
Brix = brix;
|
|
Concentration = concentration;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Crea una copia de las propiedades del fluido
|
|
/// </summary>
|
|
public FluidProperties Clone()
|
|
{
|
|
return new FluidProperties(Type, Temperature, Brix, Concentration) { Volume = Volume };
|
|
}
|
|
|
|
/// <summary>
|
|
/// Mezcla este fluido con otro fluido
|
|
/// </summary>
|
|
public FluidProperties MixWith(FluidProperties other, double mixRatio)
|
|
{
|
|
if (other == null || mixRatio <= 0) return this.Clone();
|
|
if (mixRatio >= 1) return other.Clone();
|
|
|
|
var mixed = new FluidProperties
|
|
{
|
|
Type = FluidType.Mix,
|
|
Temperature = Temperature * (1 - mixRatio) + other.Temperature * mixRatio,
|
|
Brix = Brix * (1 - mixRatio) + other.Brix * mixRatio,
|
|
Concentration = Concentration * (1 - mixRatio) + other.Concentration * mixRatio,
|
|
Volume = Volume + other.Volume
|
|
};
|
|
|
|
return mixed;
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Estado de mezcla del tanque
|
|
/// </summary>
|
|
public enum MixingState
|
|
{
|
|
[Description("Solo fluido primario")]
|
|
PrimaryOnly,
|
|
[Description("Solo fluido secundario")]
|
|
SecondaryOnly,
|
|
[Description("Vaciando secundario")]
|
|
EmptyingSecondary,
|
|
[Description("Mezclando")]
|
|
Mixing,
|
|
[Description("Vaciando primario")]
|
|
EmptyingPrimary,
|
|
[Description("Vacío")]
|
|
Empty
|
|
}
|
|
}
|