CtrEditor/Simulacion/simPumpExample.cs

198 lines
6.1 KiB
C#

using BepuPhysics.Collidables;
using BepuPhysics.Constraints;
using BepuPhysics;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Numerics;
using System.Text;
using System.Threading.Tasks;
using CtrEditor.HydraulicSimulator;
namespace CtrEditor.Simulacion
{
public class simPumpExample : simBase
{
public float Width;
public float Height;
public float Depth;
private float _mass;
// Propiedades hidráulicas
public double PumpHead { get; set; } = 50.0;
public double MaxFlow { get; set; } = 0.01;
public double SpeedRatio { get; set; } = 1.0;
public bool IsRunning { get; set; } = true;
public int PumpDirection { get; set; } = 1;
// Estado actual de la simulación hidráulica
public double CurrentFlow { get; set; } = 0.0;
public double CurrentPressure { get; set; } = 0.0;
public simPumpExample(Simulation simulation, List<Action> deferredActions, Vector3 dimensions, Vector2 position, float mass)
{
_simulation = simulation;
Width = dimensions.X;
Height = dimensions.Y;
Depth = dimensions.Z;
_mass = mass;
// Usar COORDINATECONVERTER para conversión centralizada
var position3D = new Vector3(position.X, CoordinateConverter.WpfYToBepuY(position.Y), Depth / 2f + zPos_Transporte + zAltura_Transporte);
Create(position3D);
}
public float CenterX
{
get
{
return GetPosition().X;
}
set
{
var pos = GetPosition();
SetPosition(value, pos.Y, pos.Z);
}
}
public float CenterY
{
get
{
// Usar COORDINATECONVERTER para conversión centralizada
return CoordinateConverter.BepuYToWpfY(GetPosition().Y);
}
set
{
var pos = GetPosition();
// Usar COORDINATECONVERTER para conversión centralizada
SetPosition(pos.X, CoordinateConverter.WpfYToBepuY(value), pos.Z);
}
}
public Vector2 Center
{
get
{
var pos3D = GetPosition();
// Usar COORDINATECONVERTER para conversión centralizada
return CoordinateConverter.BepuVector3ToWpfVector2(pos3D);
}
set
{
// Mantener la Z actual, solo cambiar X, Y
var currentPos = GetPosition();
// Usar COORDINATECONVERTER para conversión centralizada
SetPosition(value.X, CoordinateConverter.WpfYToBepuY(value.Y), currentPos.Z);
}
}
public float Mass
{
get
{
if (_simulation != null && _simulation.Bodies.BodyExists(BodyHandle))
{
var bodyReference = _simulation.Bodies.GetBodyReference(BodyHandle);
return 1f / bodyReference.LocalInertia.InverseMass;
}
return _mass;
}
set
{
_mass = value;
if (_simulation != null && _simulation.Bodies.BodyExists(BodyHandle))
{
var box = new Box(Width, Height, Depth);
var inertia = box.ComputeInertia(_mass);
_simulation.Bodies.SetLocalInertia(BodyHandle, inertia);
}
}
}
private void Create(Vector3 position)
{
RemoverBody();
var box = new Box(Width, Height, Depth);
var shapeIndex = _simulation.Shapes.Add(box);
// Crear el cuerpo estático (las bombas no se mueven físicamente)
var inertia = box.ComputeInertia(_mass);
var bodyDescription = BodyDescription.CreateKinematic(
new RigidPose(position),
new CollidableDescription(shapeIndex, 0),
new BodyActivityDescription(-1f)
);
BodyHandle = _simulation.Bodies.Add(bodyDescription);
_bodyCreated = true;
// Registrar en el diccionario del SimulationManager
if (_simulationManager != null)
_simulationManager.CollidableData[BodyHandle.Value] = this;
}
public void SetDimensions(Vector3 dimensions)
{
Width = dimensions.X;
Height = dimensions.Y;
Depth = dimensions.Z;
if (_simulation != null && _simulation.Bodies.BodyExists(BodyHandle))
{
var box = new Box(Width, Height, Depth);
var shapeIndex = _simulation.Shapes.Add(box);
ChangeBodyShape(shapeIndex);
}
}
public void SetMass(float mass)
{
Mass = mass;
}
/// <summary>
/// Actualiza las propiedades hidráulicas de la bomba
/// </summary>
public void UpdateHydraulicProperties(double pumpHead, double maxFlow, double speedRatio, bool isRunning, int direction)
{
PumpHead = pumpHead;
MaxFlow = maxFlow;
SpeedRatio = speedRatio;
IsRunning = isRunning;
PumpDirection = direction;
}
/// <summary>
/// Aplica los resultados de la simulación hidráulica
/// </summary>
public void ApplyHydraulicResults(double flow, double pressure)
{
CurrentFlow = flow;
CurrentPressure = pressure;
}
/// <summary>
/// Obtiene el caudal actual de la bomba
/// </summary>
public double GetCurrentFlow()
{
return CurrentFlow;
}
/// <summary>
/// Obtiene la presión actual de la bomba
/// </summary>
public double GetCurrentPressure()
{
return CurrentPressure;
}
public new void RemoverBody()
{
base.RemoverBody();
}
}
}