Mejorado el sistema de SaveStateObjetosSimulables y trabajando en el usercontrol Descarte
This commit is contained in:
parent
ebe7986142
commit
9ed8a0b7bd
|
@ -249,19 +249,23 @@ namespace CtrEditor
|
||||||
{
|
{
|
||||||
if (parameter is TipoSimulable tipoSimulable)
|
if (parameter is TipoSimulable tipoSimulable)
|
||||||
{
|
{
|
||||||
CrearObjetoSimulable(tipoSimulable.Tipo);
|
CrearObjetoSimulableEnCentroCanvas(tipoSimulable.Tipo);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void CrearObjetoSimulable(Type tipoSimulable)
|
public void CrearObjetoSimulableEnCentroCanvas(Type tipoSimulable)
|
||||||
|
{
|
||||||
|
var CentroCanvas = MainWindow.ObtenerCentroCanvasMeters();
|
||||||
|
CrearObjetoSimulable(tipoSimulable,CentroCanvas.X,CentroCanvas.Y);
|
||||||
|
}
|
||||||
|
|
||||||
|
public osBase CrearObjetoSimulable(Type tipoSimulable,float Left,float Top)
|
||||||
{
|
{
|
||||||
// Crear una nueva instancia del osBase correspondiente
|
// Crear una nueva instancia del osBase correspondiente
|
||||||
osBase? NuevoOsBase = UserControlFactory.GetInstanceForType(tipoSimulable);
|
osBase? NuevoOsBase = UserControlFactory.GetInstanceForType(tipoSimulable);
|
||||||
|
|
||||||
var CentroCanvas = MainWindow.ObtenerCentroCanvasPixels();
|
NuevoOsBase.Left = Left;
|
||||||
|
NuevoOsBase.Top = Top;
|
||||||
NuevoOsBase.Left = CentroCanvas.X;
|
|
||||||
NuevoOsBase.Top = CentroCanvas.Y;
|
|
||||||
|
|
||||||
if (NuevoOsBase != null)
|
if (NuevoOsBase != null)
|
||||||
{
|
{
|
||||||
|
@ -269,6 +273,7 @@ namespace CtrEditor
|
||||||
// Añadir el nuevo osBase a la colección de objetos simulables
|
// Añadir el nuevo osBase a la colección de objetos simulables
|
||||||
ObjetosSimulables.Add(NuevoOsBase);
|
ObjetosSimulables.Add(NuevoOsBase);
|
||||||
}
|
}
|
||||||
|
return NuevoOsBase;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Crear UserControl desde osBase : Nuevo o desde Deserealizacion
|
// Crear UserControl desde osBase : Nuevo o desde Deserealizacion
|
||||||
|
@ -292,6 +297,16 @@ namespace CtrEditor
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void RemoverObjetoSimulable(osBase osObjeto)
|
||||||
|
{
|
||||||
|
if (osObjeto != null && ObjetosSimulables.Contains(osObjeto))
|
||||||
|
{
|
||||||
|
ObjetosSimulables.Remove(osObjeto);
|
||||||
|
if (osObjeto.VisualRepresentation != null)
|
||||||
|
MainWindow.EliminarUserControlDelCanvas(osObjeto.VisualRepresentation);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private void InitializeTipoSimulableList()
|
private void InitializeTipoSimulableList()
|
||||||
{
|
{
|
||||||
var baseType = typeof(osBase);
|
var baseType = typeof(osBase);
|
||||||
|
@ -340,8 +355,15 @@ namespace CtrEditor
|
||||||
|
|
||||||
simulationManager.Step();
|
simulationManager.Step();
|
||||||
|
|
||||||
foreach (var objetoSimulable in ObjetosSimulables)
|
var objetosSimulablesCopy = new List<osBase>(ObjetosSimulables);
|
||||||
objetoSimulable.UpdateControl((int)elapsedMilliseconds);
|
|
||||||
|
foreach (var objetoSimulable in objetosSimulablesCopy)
|
||||||
|
{
|
||||||
|
if (!objetoSimulable.RemoverDesdeSimulacion)
|
||||||
|
objetoSimulable.UpdateControl((int)elapsedMilliseconds);
|
||||||
|
else
|
||||||
|
RemoverObjetoSimulable(objetoSimulable);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -393,8 +415,6 @@ namespace CtrEditor
|
||||||
public void Save()
|
public void Save()
|
||||||
{
|
{
|
||||||
SaveStateObjetosSimulables();
|
SaveStateObjetosSimulables();
|
||||||
ImageSelected?.Invoke(this, datosDeTrabajo.Imagenes[_selectedImage]); // Dispara el evento con la nueva ruta de imagen
|
|
||||||
LoadStateObjetosSimulables();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void SaveStateObjetosSimulables()
|
public void SaveStateObjetosSimulables()
|
||||||
|
@ -403,19 +423,33 @@ namespace CtrEditor
|
||||||
{
|
{
|
||||||
StopSimulation();
|
StopSimulation();
|
||||||
PLCViewModel.Disconnect();
|
PLCViewModel.Disconnect();
|
||||||
|
|
||||||
|
// Crear copias temporales de las propiedades que serán anuladas
|
||||||
|
var tempVisualRepresentations = new Dictionary<osBase, UserControl>();
|
||||||
|
var tempSimulationManagers = new Dictionary<osBase, SimulationManagerFP>();
|
||||||
|
var tempMainViewModels = new Dictionary<osBase, MainViewModel>();
|
||||||
|
|
||||||
|
foreach (var obj in ObjetosSimulables)
|
||||||
|
{
|
||||||
|
// Guardar referencias temporales
|
||||||
|
tempVisualRepresentations[obj] = obj.VisualRepresentation;
|
||||||
|
tempSimulationManagers[obj] = obj.simulationManager;
|
||||||
|
tempMainViewModels[obj] = obj._mainViewModel;
|
||||||
|
|
||||||
|
// Anular propiedades para la serialización
|
||||||
|
obj.VisualRepresentation = null;
|
||||||
|
obj.simulationManager = null;
|
||||||
|
obj._mainViewModel = null;
|
||||||
|
}
|
||||||
|
|
||||||
var settings = new JsonSerializerSettings
|
var settings = new JsonSerializerSettings
|
||||||
{
|
{
|
||||||
Formatting = Formatting.Indented,
|
Formatting = Formatting.Indented,
|
||||||
NullValueHandling = NullValueHandling.Ignore,
|
NullValueHandling = NullValueHandling.Ignore,
|
||||||
TypeNameHandling = TypeNameHandling.Auto
|
TypeNameHandling = TypeNameHandling.Auto
|
||||||
};
|
};
|
||||||
foreach (var obj in ObjetosSimulables)
|
|
||||||
{
|
// Crear un objeto que incluya tanto los ObjetosSimulables como el UnitConverter y PLC_ConnectionData
|
||||||
obj.VisualRepresentation = null;
|
|
||||||
obj.simulationManager = null;
|
|
||||||
obj._mainViewModel = null;
|
|
||||||
}
|
|
||||||
// Crear un objeto que incluya tanto los ObjetosSimulables como el UnitConverter
|
|
||||||
var dataToSerialize = new SimulationData
|
var dataToSerialize = new SimulationData
|
||||||
{
|
{
|
||||||
ObjetosSimulables = ObjetosSimulables,
|
ObjetosSimulables = ObjetosSimulables,
|
||||||
|
@ -423,11 +457,22 @@ namespace CtrEditor
|
||||||
PLC_ConnectionData = PLCViewModel
|
PLC_ConnectionData = PLCViewModel
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Serializar
|
||||||
var serializedData = JsonConvert.SerializeObject(dataToSerialize, settings);
|
var serializedData = JsonConvert.SerializeObject(dataToSerialize, settings);
|
||||||
File.WriteAllText(datosDeTrabajo.ObtenerPathImagenConExtension(_selectedImage, ".json"), serializedData);
|
File.WriteAllText(datosDeTrabajo.ObtenerPathImagenConExtension(_selectedImage, ".json"), serializedData);
|
||||||
|
|
||||||
|
// Restaurar las propiedades originales de los objetos
|
||||||
|
foreach (var obj in ObjetosSimulables)
|
||||||
|
{
|
||||||
|
obj.VisualRepresentation = tempVisualRepresentations[obj];
|
||||||
|
obj.simulationManager = tempSimulationManagers[obj];
|
||||||
|
obj._mainViewModel = tempMainViewModels[obj];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public void LoadStateObjetosSimulables()
|
public void LoadStateObjetosSimulables()
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
|
|
|
@ -118,6 +118,14 @@ namespace CtrEditor
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void EliminarUserControlDelCanvas(UserControl userControl)
|
||||||
|
{
|
||||||
|
if (ImagenEnTrabajoCanvas.Children.Contains(userControl))
|
||||||
|
{
|
||||||
|
ImagenEnTrabajoCanvas.Children.Remove(userControl);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private void UserControl_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
|
private void UserControl_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
|
||||||
{
|
{
|
||||||
if (!_isDrawingCanvas)
|
if (!_isDrawingCanvas)
|
||||||
|
|
|
@ -6,6 +6,7 @@ using System.Text;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using System.Windows.Controls;
|
using System.Windows.Controls;
|
||||||
using CtrEditor.Simulacion;
|
using CtrEditor.Simulacion;
|
||||||
|
using System.Reflection;
|
||||||
|
|
||||||
namespace CtrEditor.ObjetosSim
|
namespace CtrEditor.ObjetosSim
|
||||||
{
|
{
|
||||||
|
@ -13,60 +14,42 @@ namespace CtrEditor.ObjetosSim
|
||||||
{
|
{
|
||||||
public static UserControl? GetControlForType(Type tipoObjeto)
|
public static UserControl? GetControlForType(Type tipoObjeto)
|
||||||
{
|
{
|
||||||
if (tipoObjeto == typeof(osBotella))
|
// Obtener el nombre del tipo de objeto
|
||||||
return new ucBotella();
|
string typeName = tipoObjeto.Name;
|
||||||
if (tipoObjeto == typeof(osTransporteTTop))
|
|
||||||
return new ucTransporteTTop();
|
|
||||||
if (tipoObjeto == typeof(osGuia))
|
|
||||||
return new ucGuia();
|
|
||||||
if (tipoObjeto == typeof(osTransporteGuias))
|
|
||||||
return new ucTransporteGuias();
|
|
||||||
//if (tipoObjeto == typeof(osTransporteCurva))
|
|
||||||
// return new ucTransporteCurva();
|
|
||||||
if (tipoObjeto == typeof(osVMmotorSim ))
|
|
||||||
return new ucVMmotorSim();
|
|
||||||
if (tipoObjeto == typeof(osBoton))
|
|
||||||
return new ucBoton();
|
|
||||||
if (tipoObjeto == typeof(osTanque))
|
|
||||||
return new ucTanque();
|
|
||||||
if (tipoObjeto == typeof(osSensTemperatura))
|
|
||||||
return new ucSensTemperatura();
|
|
||||||
if (tipoObjeto == typeof(osFiller))
|
|
||||||
return new ucFiller();
|
|
||||||
|
|
||||||
|
// Cambiar las primeras dos letras de 'os' a 'uc'
|
||||||
|
if (typeName.StartsWith("os"))
|
||||||
|
{
|
||||||
|
string newTypeName = "uc" + typeName.Substring(2);
|
||||||
|
|
||||||
// Puedes añadir más condiciones para otros tipos
|
// Obtener el ensamblado donde se encuentra el tipo UserControl
|
||||||
|
Assembly assembly = Assembly.GetExecutingAssembly();
|
||||||
|
|
||||||
|
// Buscar el tipo en los ensamblados cargados
|
||||||
|
Type? controlType = AppDomain.CurrentDomain.GetAssemblies()
|
||||||
|
.SelectMany(a => a.GetTypes())
|
||||||
|
.FirstOrDefault(t => t.Name == newTypeName);
|
||||||
|
|
||||||
|
if (controlType != null && typeof(UserControl).IsAssignableFrom(controlType))
|
||||||
|
{
|
||||||
|
// Crear una instancia del tipo encontrado
|
||||||
|
return (UserControl?)Activator.CreateInstance(controlType);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static osBase? GetInstanceForType(Type tipoObjeto)
|
public static osBase? GetInstanceForType(Type tipoObjeto)
|
||||||
{
|
{
|
||||||
if (tipoObjeto == typeof(osBotella))
|
// Verifica si el tipo pasado es un subtipo de osBase
|
||||||
return new osBotella();
|
if (!typeof(osBase).IsAssignableFrom(tipoObjeto))
|
||||||
if (tipoObjeto == typeof(osTransporteTTop))
|
{
|
||||||
return new osTransporteTTop();
|
throw new ArgumentException("El tipo pasado no es un subtipo de osBase", nameof(tipoObjeto));
|
||||||
if (tipoObjeto == typeof(osGuia))
|
}
|
||||||
return new osGuia();
|
|
||||||
if (tipoObjeto == typeof(osTransporteGuias))
|
|
||||||
return new osTransporteGuias();
|
|
||||||
//if (tipoObjeto == typeof(osTransporteCurva))
|
|
||||||
// return new osTransporteCurva();
|
|
||||||
if (tipoObjeto == typeof(osVMmotorSim))
|
|
||||||
return new osVMmotorSim();
|
|
||||||
if (tipoObjeto == typeof(osBoton))
|
|
||||||
return new osBoton();
|
|
||||||
if (tipoObjeto == typeof(osTanque))
|
|
||||||
return new osTanque();
|
|
||||||
if (tipoObjeto == typeof(osSensTemperatura))
|
|
||||||
return new osSensTemperatura();
|
|
||||||
if (tipoObjeto == typeof(osFiller))
|
|
||||||
return new osFiller();
|
|
||||||
|
|
||||||
|
// Crear una instancia del tipo especificado
|
||||||
// Puedes añadir más condiciones para otros tipos
|
return (osBase?)Activator.CreateInstance(tipoObjeto);
|
||||||
|
|
||||||
return null;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static osBase? CreateInstanceAndPopulate(Type tipoObjeto, string jsonString)
|
public static osBase? CreateInstanceAndPopulate(Type tipoObjeto, string jsonString)
|
||||||
|
|
|
@ -27,7 +27,7 @@ namespace CtrEditor.ObjetosSim
|
||||||
|
|
||||||
public interface IosBase
|
public interface IosBase
|
||||||
{
|
{
|
||||||
string Nombre { get; }
|
string Nombre { get; }
|
||||||
|
|
||||||
void UpdateControl(int elapsedMilliseconds);
|
void UpdateControl(int elapsedMilliseconds);
|
||||||
}
|
}
|
||||||
|
@ -49,6 +49,8 @@ namespace CtrEditor.ObjetosSim
|
||||||
public abstract float Top { get; set; }
|
public abstract float Top { get; set; }
|
||||||
|
|
||||||
public bool Inicializado = false;
|
public bool Inicializado = false;
|
||||||
|
public bool AutoCreated = false;
|
||||||
|
public bool RemoverDesdeSimulacion = false; // La simulacion indica que se debe remover
|
||||||
|
|
||||||
[JsonIgnore]
|
[JsonIgnore]
|
||||||
protected UserControl? _visualRepresentation = null;
|
protected UserControl? _visualRepresentation = null;
|
||||||
|
@ -60,6 +62,7 @@ namespace CtrEditor.ObjetosSim
|
||||||
public abstract void UpdateGeometryStep();
|
public abstract void UpdateGeometryStep();
|
||||||
public abstract void UpdatePLC(PLCModel plc, int elapsedMilliseconds);
|
public abstract void UpdatePLC(PLCModel plc, int elapsedMilliseconds);
|
||||||
public abstract void ucLoaded();
|
public abstract void ucLoaded();
|
||||||
|
public abstract void ucUnLoaded();
|
||||||
|
|
||||||
[JsonIgnore]
|
[JsonIgnore]
|
||||||
public MainViewModel _mainViewModel;
|
public MainViewModel _mainViewModel;
|
||||||
|
@ -222,18 +225,18 @@ namespace CtrEditor.ObjetosSim
|
||||||
return new Vector2((topLeft.X + bottomRight.X) / 2, (topLeft.Y + bottomRight.Y) / 2);
|
return new Vector2((topLeft.X + bottomRight.X) / 2, (topLeft.Y + bottomRight.Y) / 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void UpdateRectangle(simRectangle simRect, System.Windows.Shapes.Rectangle wpfRect, float Alto, float Ancho, float Angulo)
|
public void UpdateRectangle(simTransporte simRect, System.Windows.Shapes.Rectangle wpfRect, float Alto, float Ancho, float Angulo)
|
||||||
{
|
{
|
||||||
if (simRect != null)
|
if (simRect != null)
|
||||||
simRect.Create(Ancho, Alto, GetRectangleCenter(wpfRect), Angulo);
|
simRect.Create(Ancho, Alto, GetRectangleCenter(wpfRect), Angulo);
|
||||||
}
|
}
|
||||||
|
|
||||||
public simRectangle AddRectangle(SimulationManagerFP simulationManager, System.Windows.Shapes.Rectangle wpfRect, float Alto, float Ancho, float Angulo)
|
public simTransporte AddRectangle(SimulationManagerFP simulationManager, System.Windows.Shapes.Rectangle wpfRect, float Alto, float Ancho, float Angulo)
|
||||||
{
|
{
|
||||||
return simulationManager.AddRectangle(Ancho, Alto, GetRectangleCenter(wpfRect), Angulo);
|
return simulationManager.AddRectangle(Ancho, Alto, GetRectangleCenter(wpfRect), Angulo);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void UpdateOrCreateLine(simLine simGuia, System.Windows.Shapes.Rectangle wpfRect)
|
public void UpdateOrCreateLine(simGuia simGuia, System.Windows.Shapes.Rectangle wpfRect)
|
||||||
{
|
{
|
||||||
if (simGuia != null)
|
if (simGuia != null)
|
||||||
{
|
{
|
||||||
|
@ -244,7 +247,7 @@ namespace CtrEditor.ObjetosSim
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public simLine AddLine(SimulationManagerFP simulationManager, System.Windows.Shapes.Rectangle wpfRect)
|
public simGuia AddLine(SimulationManagerFP simulationManager, System.Windows.Shapes.Rectangle wpfRect)
|
||||||
{
|
{
|
||||||
var coords = GetCenterLineVectors(wpfRect);
|
var coords = GetCenterLineVectors(wpfRect);
|
||||||
return simulationManager.AddLine(coords.Start, coords.End);
|
return simulationManager.AddLine(coords.Start, coords.End);
|
||||||
|
|
|
@ -122,6 +122,12 @@ namespace CtrEditor.ObjetosSim
|
||||||
// crear el objeto de simulacion
|
// crear el objeto de simulacion
|
||||||
ActualizarLeftTop();
|
ActualizarLeftTop();
|
||||||
}
|
}
|
||||||
|
public override void ucUnLoaded()
|
||||||
|
{
|
||||||
|
// El UserControl se esta eliminando
|
||||||
|
// eliminar el objeto de simulacion
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -133,11 +139,16 @@ namespace CtrEditor.ObjetosSim
|
||||||
{
|
{
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
this.Loaded += OnLoaded;
|
this.Loaded += OnLoaded;
|
||||||
|
this.Unloaded += OnUnloaded;
|
||||||
}
|
}
|
||||||
private void OnLoaded(object sender, RoutedEventArgs e)
|
private void OnLoaded(object sender, RoutedEventArgs e)
|
||||||
{
|
{
|
||||||
Datos?.ucLoaded();
|
Datos?.ucLoaded();
|
||||||
}
|
}
|
||||||
|
private void OnUnloaded(object sender, RoutedEventArgs e)
|
||||||
|
{
|
||||||
|
Datos?.ucUnLoaded();
|
||||||
|
}
|
||||||
public void Resize(float width, float height) {
|
public void Resize(float width, float height) {
|
||||||
if (Datos is osBasicExample datos)
|
if (Datos is osBasicExample datos)
|
||||||
{
|
{
|
||||||
|
|
|
@ -31,7 +31,7 @@ namespace CtrEditor.ObjetosSim
|
||||||
private float _mass;
|
private float _mass;
|
||||||
private Vector2 _centro = new Vector2(); // Centro
|
private Vector2 _centro = new Vector2(); // Centro
|
||||||
private string _nombre = "Botella";
|
private string _nombre = "Botella";
|
||||||
private simCircle Simulacion_Botella;
|
private simBotella Simulacion_Botella;
|
||||||
|
|
||||||
// Otros datos y métodos relevantes para la simulación
|
// Otros datos y métodos relevantes para la simulación
|
||||||
|
|
||||||
|
@ -63,6 +63,7 @@ namespace CtrEditor.ObjetosSim
|
||||||
{
|
{
|
||||||
_centro.X = value+Diametro/2;
|
_centro.X = value+Diametro/2;
|
||||||
CanvasSetLeftinMeter(value);
|
CanvasSetLeftinMeter(value);
|
||||||
|
OnPropertyChanged(nameof(CenterX));
|
||||||
OnPropertyChanged(nameof(Left));
|
OnPropertyChanged(nameof(Left));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -73,6 +74,7 @@ namespace CtrEditor.ObjetosSim
|
||||||
{
|
{
|
||||||
_centro.Y = value + Diametro / 2;
|
_centro.Y = value + Diametro / 2;
|
||||||
CanvasSetTopinMeter(value);
|
CanvasSetTopinMeter(value);
|
||||||
|
OnPropertyChanged(nameof(CenterY));
|
||||||
OnPropertyChanged(nameof(Top));
|
OnPropertyChanged(nameof(Top));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -145,7 +147,11 @@ namespace CtrEditor.ObjetosSim
|
||||||
{
|
{
|
||||||
CenterX = Simulacion_Botella.CenterX;
|
CenterX = Simulacion_Botella.CenterX;
|
||||||
CenterY = Simulacion_Botella.CenterY;
|
CenterY = Simulacion_Botella.CenterY;
|
||||||
|
|
||||||
|
if (Simulacion_Botella.Descartar) // Ha sido marcada para remover
|
||||||
|
RemoverDesdeSimulacion = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void ucLoaded()
|
public override void ucLoaded()
|
||||||
{
|
{
|
||||||
// El UserControl ya se ha cargado y podemos obtener las coordenadas para
|
// El UserControl ya se ha cargado y podemos obtener las coordenadas para
|
||||||
|
@ -153,6 +159,12 @@ namespace CtrEditor.ObjetosSim
|
||||||
ActualizarLeftTop();
|
ActualizarLeftTop();
|
||||||
Simulacion_Botella = simulationManager.AddCircle(Diametro, _centro, Mass);
|
Simulacion_Botella = simulationManager.AddCircle(Diametro, _centro, Mass);
|
||||||
}
|
}
|
||||||
|
public override void ucUnLoaded()
|
||||||
|
{
|
||||||
|
// El UserControl se esta eliminando
|
||||||
|
// eliminar el objeto de simulacion
|
||||||
|
simulationManager.Remove(Simulacion_Botella);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -164,11 +176,17 @@ namespace CtrEditor.ObjetosSim
|
||||||
{
|
{
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
this.Loaded += OnLoaded;
|
this.Loaded += OnLoaded;
|
||||||
|
this.Unloaded += OnUnloaded;
|
||||||
}
|
}
|
||||||
private void OnLoaded(object sender, RoutedEventArgs e)
|
private void OnLoaded(object sender, RoutedEventArgs e)
|
||||||
{
|
{
|
||||||
Datos?.ucLoaded();
|
Datos?.ucLoaded();
|
||||||
}
|
}
|
||||||
|
private void OnUnloaded(object sender, RoutedEventArgs e)
|
||||||
|
{
|
||||||
|
Datos?.ucUnLoaded();
|
||||||
|
}
|
||||||
|
|
||||||
public void Resize(float width, float height) { }
|
public void Resize(float width, float height) { }
|
||||||
public void Move(float LeftPixels, float TopPixels)
|
public void Move(float LeftPixels, float TopPixels)
|
||||||
{
|
{
|
||||||
|
|
|
@ -164,6 +164,11 @@ namespace CtrEditor.ObjetosSim
|
||||||
// crear el objeto de simulacion
|
// crear el objeto de simulacion
|
||||||
ActualizarLeftTop();
|
ActualizarLeftTop();
|
||||||
}
|
}
|
||||||
|
public override void ucUnLoaded()
|
||||||
|
{
|
||||||
|
// El UserControl se esta eliminando
|
||||||
|
// eliminar el objeto de simulacion
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -174,14 +179,18 @@ namespace CtrEditor.ObjetosSim
|
||||||
public ucBoton()
|
public ucBoton()
|
||||||
{
|
{
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
|
this.DataContextChanged += OnDataContextChanged;
|
||||||
this.Loaded += OnLoaded;
|
this.Loaded += OnLoaded;
|
||||||
this.DataContextChanged += OnDataContextChanged;
|
this.Unloaded += OnUnloaded;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void OnLoaded(object sender, RoutedEventArgs e)
|
private void OnLoaded(object sender, RoutedEventArgs e)
|
||||||
{
|
{
|
||||||
Datos?.ucLoaded();
|
Datos?.ucLoaded();
|
||||||
}
|
}
|
||||||
|
private void OnUnloaded(object sender, RoutedEventArgs e)
|
||||||
|
{
|
||||||
|
Datos?.ucUnLoaded();
|
||||||
|
}
|
||||||
|
|
||||||
private void OnDataContextChanged(object sender, DependencyPropertyChangedEventArgs e)
|
private void OnDataContextChanged(object sender, DependencyPropertyChangedEventArgs e)
|
||||||
{
|
{
|
||||||
|
|
|
@ -0,0 +1,37 @@
|
||||||
|
<UserControl x:Class="CtrEditor.ObjetosSim.ucDescarte"
|
||||||
|
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||||
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||||
|
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||||
|
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||||
|
xmlns:local="clr-namespace:CtrEditor.ObjetosSim"
|
||||||
|
mc:Ignorable="d"
|
||||||
|
xmlns:convert="clr-namespace:CtrEditor.Convertidores">
|
||||||
|
<UserControl.Resources>
|
||||||
|
<convert:MeterToPixelConverter x:Key="MeterToPixelConverter"/>
|
||||||
|
<Storyboard x:Key="PulsingStoryboard" RepeatBehavior="Forever">
|
||||||
|
<DoubleAnimation
|
||||||
|
Storyboard.TargetName="PulsingEllipse"
|
||||||
|
Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[0].(ScaleTransform.ScaleX)"
|
||||||
|
From="1" To="0.5" Duration="0:0:1" AutoReverse="True" />
|
||||||
|
<DoubleAnimation
|
||||||
|
Storyboard.TargetName="PulsingEllipse"
|
||||||
|
Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[0].(ScaleTransform.ScaleY)"
|
||||||
|
From="1" To="0.5" Duration="0:0:1" AutoReverse="True" />
|
||||||
|
</Storyboard>
|
||||||
|
</UserControl.Resources>
|
||||||
|
|
||||||
|
<Grid>
|
||||||
|
<Ellipse x:Name="PulsingEllipse"
|
||||||
|
Height="{Binding Diametro, Converter={StaticResource MeterToPixelConverter}}"
|
||||||
|
Stroke="Yellow"
|
||||||
|
Fill="Black"
|
||||||
|
Opacity="0.5"
|
||||||
|
Width="{Binding Diametro, Converter={StaticResource MeterToPixelConverter}}">
|
||||||
|
<Ellipse.RenderTransform>
|
||||||
|
<TransformGroup>
|
||||||
|
<ScaleTransform />
|
||||||
|
</TransformGroup>
|
||||||
|
</Ellipse.RenderTransform>
|
||||||
|
</Ellipse>
|
||||||
|
</Grid>
|
||||||
|
</UserControl>
|
|
@ -0,0 +1,180 @@
|
||||||
|
using CtrEditor.Convertidores;
|
||||||
|
using CtrEditor.Siemens;
|
||||||
|
using CtrEditor.Simulacion;
|
||||||
|
using System.Windows;
|
||||||
|
using System.Windows.Controls;
|
||||||
|
using Microsoft.Xna.Framework;
|
||||||
|
namespace CtrEditor.ObjetosSim
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Interaction logic for ucDescarte.xaml
|
||||||
|
/// </summary>
|
||||||
|
public class osDescarte : osBase
|
||||||
|
{
|
||||||
|
// Otros datos y métodos relevantes para la simulación
|
||||||
|
|
||||||
|
private string _nombre = "Descarte";
|
||||||
|
private float _diametro;
|
||||||
|
private Vector2 _centro = new Vector2(); // Centro
|
||||||
|
private simDescarte AreaDeDescarte;
|
||||||
|
|
||||||
|
public override float Left
|
||||||
|
{
|
||||||
|
get => _centro.X - Diametro / 2;
|
||||||
|
set
|
||||||
|
{
|
||||||
|
_centro.X = value + Diametro / 2;
|
||||||
|
CanvasSetLeftinMeter(value);
|
||||||
|
OnPropertyChanged(nameof(CenterX));
|
||||||
|
OnPropertyChanged(nameof(Left));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public override float Top
|
||||||
|
{
|
||||||
|
get => _centro.Y - Diametro / 2;
|
||||||
|
set
|
||||||
|
{
|
||||||
|
_centro.Y = value + Diametro / 2;
|
||||||
|
CanvasSetTopinMeter(value);
|
||||||
|
OnPropertyChanged(nameof(CenterY));
|
||||||
|
OnPropertyChanged(nameof(Top));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public float CenterX
|
||||||
|
{
|
||||||
|
get => _centro.X;
|
||||||
|
set
|
||||||
|
{
|
||||||
|
_centro.X = value;
|
||||||
|
CanvasSetLeftinMeter(Left);
|
||||||
|
OnPropertyChanged(nameof(CenterX));
|
||||||
|
OnPropertyChanged(nameof(Left));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public float CenterY
|
||||||
|
{
|
||||||
|
get => _centro.Y;
|
||||||
|
set
|
||||||
|
{
|
||||||
|
_centro.Y = value;
|
||||||
|
CanvasSetTopinMeter(Top);
|
||||||
|
OnPropertyChanged(nameof(CenterY));
|
||||||
|
OnPropertyChanged(nameof(Top));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public float Diametro
|
||||||
|
{
|
||||||
|
get => _diametro;
|
||||||
|
set
|
||||||
|
{
|
||||||
|
_diametro = value;
|
||||||
|
AreaDeDescarte?.SetDiameter(Diametro);
|
||||||
|
OnPropertyChanged(nameof(Diametro));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public override string Nombre
|
||||||
|
{
|
||||||
|
get => _nombre;
|
||||||
|
set
|
||||||
|
{
|
||||||
|
if (_nombre != value)
|
||||||
|
{
|
||||||
|
_nombre = value;
|
||||||
|
OnPropertyChanged(nameof(Nombre));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void ActualizarGeometrias()
|
||||||
|
{
|
||||||
|
if (AreaDeDescarte != null)
|
||||||
|
{
|
||||||
|
AreaDeDescarte.SetDiameter(Diametro);
|
||||||
|
AreaDeDescarte.SetPosition(CenterX, CenterY);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public osDescarte()
|
||||||
|
{
|
||||||
|
Diametro = 1f;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void UpdateGeometryStart()
|
||||||
|
{
|
||||||
|
// Se llama antes de la simulacion
|
||||||
|
ActualizarGeometrias();
|
||||||
|
}
|
||||||
|
public override void UpdateGeometryStep()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
public override void UpdatePLC(PLCModel plc, int elapsedMilliseconds)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void UpdateControl(int elapsedMilliseconds)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
public override void ucLoaded()
|
||||||
|
{
|
||||||
|
// El UserControl ya se ha cargado y podemos obtener las coordenadas para
|
||||||
|
// crear el objeto de simulacion
|
||||||
|
ActualizarLeftTop();
|
||||||
|
AreaDeDescarte = simulationManager.AddDescarte(Diametro, _centro);
|
||||||
|
}
|
||||||
|
public override void ucUnLoaded()
|
||||||
|
{
|
||||||
|
// El UserControl se esta eliminando
|
||||||
|
// eliminar el objeto de simulacion
|
||||||
|
simulationManager.Remove(AreaDeDescarte);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public partial class ucDescarte : UserControl, IDataContainer
|
||||||
|
{
|
||||||
|
public osBase? Datos { get; set; }
|
||||||
|
|
||||||
|
public ucDescarte()
|
||||||
|
{
|
||||||
|
InitializeComponent();
|
||||||
|
this.Loaded += OnLoaded;
|
||||||
|
this.Unloaded += OnUnloaded;
|
||||||
|
}
|
||||||
|
private void OnLoaded(object sender, RoutedEventArgs e)
|
||||||
|
{
|
||||||
|
Datos?.ucLoaded();
|
||||||
|
}
|
||||||
|
private void OnUnloaded(object sender, RoutedEventArgs e)
|
||||||
|
{
|
||||||
|
Datos?.ucUnLoaded();
|
||||||
|
}
|
||||||
|
public void Resize(float width, float height)
|
||||||
|
{
|
||||||
|
if (Datos is osDescarte datos)
|
||||||
|
{
|
||||||
|
datos.Diametro = PixelToMeter.Instance.calc.PixelsToMeters(width);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public void Move(float LeftPixels, float TopPixels)
|
||||||
|
{
|
||||||
|
if (Datos != null)
|
||||||
|
{
|
||||||
|
Datos.Left = PixelToMeter.Instance.calc.PixelsToMeters(LeftPixels);
|
||||||
|
Datos.Top = PixelToMeter.Instance.calc.PixelsToMeters(TopPixels);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public void Rotate(float Angle)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
public void Highlight(bool State) { }
|
||||||
|
public int ZIndex()
|
||||||
|
{
|
||||||
|
return 10;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -38,7 +38,28 @@ namespace CtrEditor.ObjetosSim
|
||||||
private string _tag_consenso;
|
private string _tag_consenso;
|
||||||
private bool _consenso;
|
private bool _consenso;
|
||||||
private float TiempoRestante;
|
private float TiempoRestante;
|
||||||
private List<simCircle> Botellas = new List<simCircle>();
|
private float _leftSalida;
|
||||||
|
private float _topSalida;
|
||||||
|
private List<osBotella> Botellas = new List<osBotella>();
|
||||||
|
|
||||||
|
public float OffsetLeftSalida
|
||||||
|
{
|
||||||
|
get => _leftSalida;
|
||||||
|
set
|
||||||
|
{
|
||||||
|
_leftSalida = value;
|
||||||
|
OnPropertyChanged(nameof(OffsetLeftSalida));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public float OffsetTopSalida
|
||||||
|
{
|
||||||
|
get => _topSalida;
|
||||||
|
set
|
||||||
|
{
|
||||||
|
_topSalida = value;
|
||||||
|
OnPropertyChanged(nameof(OffsetTopSalida));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public bool Consenso
|
public bool Consenso
|
||||||
{
|
{
|
||||||
|
@ -175,19 +196,24 @@ namespace CtrEditor.ObjetosSim
|
||||||
|
|
||||||
public override void UpdateControl(int elapsedMilliseconds)
|
public override void UpdateControl(int elapsedMilliseconds)
|
||||||
{
|
{
|
||||||
if (Consenso && Velocidad_actual_percentual>0)
|
if (Consenso && Velocidad_actual_percentual > 0)
|
||||||
{
|
{
|
||||||
TiempoRestante -= elapsedMilliseconds / 1000.0f;
|
TiempoRestante -= elapsedMilliseconds / 1000.0f;
|
||||||
if (TiempoRestante <= 0)
|
if (TiempoRestante <= 0)
|
||||||
{
|
{
|
||||||
TiempoRestante = Botellas_hora * (Velocidad_actual_percentual / 100.0f) / 3600.0f;
|
TiempoRestante = 3600 / (Botellas_hora * (Velocidad_actual_percentual / 100.0f));
|
||||||
var PosSalida = new Vector2(Left, Top);
|
|
||||||
|
|
||||||
var UltimaBotellla = GetLastElement<simCircle>(Botellas);
|
var UltimaBotellla = GetLastElement<osBotella>(Botellas);
|
||||||
if (UltimaBotellla != null && UltimaBotellla.Center != PosSalida)
|
if (UltimaBotellla == null || (UltimaBotellla != null && !(UltimaBotellla.Left == Left && UltimaBotellla.Top == Top)))
|
||||||
Botellas.Add(simulationManager.AddCircle(Diametro_botella, PosSalida, 1));
|
{
|
||||||
|
var Botella = _mainViewModel.CrearObjetoSimulable(typeof(osBotella), Left + OffsetLeftSalida, Top + OffsetTopSalida);
|
||||||
|
Botella.AutoCreated = true;
|
||||||
|
Botellas.Add((osBotella)Botella);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
TiempoRestante = 0;
|
||||||
}
|
}
|
||||||
public override void ucLoaded()
|
public override void ucLoaded()
|
||||||
{
|
{
|
||||||
|
@ -195,6 +221,11 @@ namespace CtrEditor.ObjetosSim
|
||||||
// crear el objeto de simulacion
|
// crear el objeto de simulacion
|
||||||
ActualizarLeftTop();
|
ActualizarLeftTop();
|
||||||
}
|
}
|
||||||
|
public override void ucUnLoaded()
|
||||||
|
{
|
||||||
|
// El UserControl se esta eliminando
|
||||||
|
// eliminar el objeto de simulacion
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -206,11 +237,16 @@ namespace CtrEditor.ObjetosSim
|
||||||
{
|
{
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
this.Loaded += OnLoaded;
|
this.Loaded += OnLoaded;
|
||||||
|
this.Unloaded += OnUnloaded;
|
||||||
}
|
}
|
||||||
private void OnLoaded(object sender, RoutedEventArgs e)
|
private void OnLoaded(object sender, RoutedEventArgs e)
|
||||||
{
|
{
|
||||||
Datos?.ucLoaded();
|
Datos?.ucLoaded();
|
||||||
}
|
}
|
||||||
|
private void OnUnloaded(object sender, RoutedEventArgs e)
|
||||||
|
{
|
||||||
|
Datos?.ucUnLoaded();
|
||||||
|
}
|
||||||
public void Resize(float width, float height)
|
public void Resize(float width, float height)
|
||||||
{
|
{
|
||||||
if (Datos is osFiller datos)
|
if (Datos is osFiller datos)
|
||||||
|
|
|
@ -33,7 +33,7 @@ namespace CtrEditor.ObjetosSim
|
||||||
private float _angulo;
|
private float _angulo;
|
||||||
private string _nombre = "Guia";
|
private string _nombre = "Guia";
|
||||||
|
|
||||||
private simLine Simulation_Guia;
|
private simGuia Simulation_Guia;
|
||||||
|
|
||||||
public override float Left
|
public override float Left
|
||||||
{
|
{
|
||||||
|
@ -131,6 +131,12 @@ namespace CtrEditor.ObjetosSim
|
||||||
if (_visualRepresentation is ucGuia uc)
|
if (_visualRepresentation is ucGuia uc)
|
||||||
Simulation_Guia = AddLine(simulationManager, uc.Guia);
|
Simulation_Guia = AddLine(simulationManager, uc.Guia);
|
||||||
}
|
}
|
||||||
|
public override void ucUnLoaded()
|
||||||
|
{
|
||||||
|
// El UserControl se esta eliminando
|
||||||
|
// eliminar el objeto de simulacion
|
||||||
|
simulationManager.Remove(Simulation_Guia);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -143,10 +149,15 @@ namespace CtrEditor.ObjetosSim
|
||||||
{
|
{
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
this.Loaded += OnLoaded;
|
this.Loaded += OnLoaded;
|
||||||
|
this.Unloaded += OnUnloaded;
|
||||||
}
|
}
|
||||||
private void OnLoaded(object sender, RoutedEventArgs e)
|
private void OnLoaded(object sender, RoutedEventArgs e)
|
||||||
{
|
{
|
||||||
Datos?.ucLoaded();
|
Datos?.ucLoaded();
|
||||||
|
}
|
||||||
|
private void OnUnloaded(object sender, RoutedEventArgs e)
|
||||||
|
{
|
||||||
|
Datos?.ucUnLoaded();
|
||||||
}
|
}
|
||||||
public void Resize(float width, float height)
|
public void Resize(float width, float height)
|
||||||
{
|
{
|
||||||
|
|
|
@ -172,6 +172,11 @@ namespace CtrEditor.ObjetosSim
|
||||||
ActualizarLeftTop();
|
ActualizarLeftTop();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
public override void ucUnLoaded()
|
||||||
|
{
|
||||||
|
// El UserControl se esta eliminando
|
||||||
|
// eliminar el objeto de simulacion
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -183,11 +188,16 @@ namespace CtrEditor.ObjetosSim
|
||||||
{
|
{
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
this.Loaded += OnLoaded;
|
this.Loaded += OnLoaded;
|
||||||
|
this.Unloaded += OnUnloaded;
|
||||||
}
|
}
|
||||||
private void OnLoaded(object sender, RoutedEventArgs e)
|
private void OnLoaded(object sender, RoutedEventArgs e)
|
||||||
{
|
{
|
||||||
Datos?.ucLoaded();
|
Datos?.ucLoaded();
|
||||||
}
|
}
|
||||||
|
private void OnUnloaded(object sender, RoutedEventArgs e)
|
||||||
|
{
|
||||||
|
Datos?.ucUnLoaded();
|
||||||
|
}
|
||||||
public void Resize(float width, float height)
|
public void Resize(float width, float height)
|
||||||
{
|
{
|
||||||
if (Datos is osSensTemperatura datos)
|
if (Datos is osSensTemperatura datos)
|
||||||
|
|
|
@ -290,6 +290,11 @@ namespace CtrEditor.ObjetosSim
|
||||||
ActualizarLeftTop();
|
ActualizarLeftTop();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
public override void ucUnLoaded()
|
||||||
|
{
|
||||||
|
// El UserControl se esta eliminando
|
||||||
|
// eliminar el objeto de simulacion
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -301,11 +306,16 @@ namespace CtrEditor.ObjetosSim
|
||||||
{
|
{
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
this.Loaded += OnLoaded;
|
this.Loaded += OnLoaded;
|
||||||
|
this.Unloaded += OnUnloaded;
|
||||||
}
|
}
|
||||||
private void OnLoaded(object sender, RoutedEventArgs e)
|
private void OnLoaded(object sender, RoutedEventArgs e)
|
||||||
{
|
{
|
||||||
Datos?.ucLoaded();
|
Datos?.ucLoaded();
|
||||||
}
|
}
|
||||||
|
private void OnUnloaded(object sender, RoutedEventArgs e)
|
||||||
|
{
|
||||||
|
Datos?.ucUnLoaded();
|
||||||
|
}
|
||||||
public void Resize(float width, float height)
|
public void Resize(float width, float height)
|
||||||
{
|
{
|
||||||
if (Datos is osTanque datos)
|
if (Datos is osTanque datos)
|
||||||
|
|
|
@ -43,9 +43,9 @@ namespace CtrEditor.ObjetosSim
|
||||||
private osBase _osMotor = null;
|
private osBase _osMotor = null;
|
||||||
private string _motor;
|
private string _motor;
|
||||||
|
|
||||||
private simRectangle? TransporteCentral;
|
private simTransporte? TransporteCentral;
|
||||||
private simLine? Guia_Superior;
|
private simGuia? Guia_Superior;
|
||||||
private simLine? Guia_Inferior;
|
private simGuia? Guia_Inferior;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -227,6 +227,14 @@ namespace CtrEditor.ObjetosSim
|
||||||
}
|
}
|
||||||
Motor = Motor; // Forzar la busqueda
|
Motor = Motor; // Forzar la busqueda
|
||||||
}
|
}
|
||||||
|
public override void ucUnLoaded()
|
||||||
|
{
|
||||||
|
// El UserControl se esta eliminando
|
||||||
|
// eliminar el objeto de simulacion
|
||||||
|
simulationManager.Remove(TransporteCentral);
|
||||||
|
simulationManager.Remove(Guia_Superior);
|
||||||
|
simulationManager.Remove(Guia_Inferior);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -239,11 +247,16 @@ namespace CtrEditor.ObjetosSim
|
||||||
{
|
{
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
this.Loaded += OnLoaded;
|
this.Loaded += OnLoaded;
|
||||||
|
this.Unloaded += OnUnloaded;
|
||||||
}
|
}
|
||||||
private void OnLoaded(object sender, RoutedEventArgs e)
|
private void OnLoaded(object sender, RoutedEventArgs e)
|
||||||
{
|
{
|
||||||
Datos?.ucLoaded();
|
Datos?.ucLoaded();
|
||||||
}
|
}
|
||||||
|
private void OnUnloaded(object sender, RoutedEventArgs e)
|
||||||
|
{
|
||||||
|
Datos?.ucUnLoaded();
|
||||||
|
}
|
||||||
public void Resize(float width, float height)
|
public void Resize(float width, float height)
|
||||||
{
|
{
|
||||||
if (Datos is osTransporteGuias datos)
|
if (Datos is osTransporteGuias datos)
|
||||||
|
|
|
@ -30,7 +30,7 @@ namespace CtrEditor.ObjetosSim
|
||||||
private osBase _osMotor = null;
|
private osBase _osMotor = null;
|
||||||
private string _motor;
|
private string _motor;
|
||||||
|
|
||||||
private simRectangle Simulation_Transporte;
|
private simTransporte Simulation_Transporte;
|
||||||
|
|
||||||
public string Motor
|
public string Motor
|
||||||
{
|
{
|
||||||
|
@ -168,6 +168,12 @@ namespace CtrEditor.ObjetosSim
|
||||||
if (_visualRepresentation is ucTransporteTTop uc)
|
if (_visualRepresentation is ucTransporteTTop uc)
|
||||||
Simulation_Transporte = AddRectangle(simulationManager, uc.Transporte, Alto, Ancho, Angulo);
|
Simulation_Transporte = AddRectangle(simulationManager, uc.Transporte, Alto, Ancho, Angulo);
|
||||||
}
|
}
|
||||||
|
public override void ucUnLoaded()
|
||||||
|
{
|
||||||
|
// El UserControl se esta eliminando
|
||||||
|
// eliminar el objeto de simulacion
|
||||||
|
simulationManager.Remove(Simulation_Transporte);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -179,11 +185,16 @@ namespace CtrEditor.ObjetosSim
|
||||||
{
|
{
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
this.Loaded += OnLoaded;
|
this.Loaded += OnLoaded;
|
||||||
|
this.Unloaded += OnUnloaded;
|
||||||
}
|
}
|
||||||
private void OnLoaded(object sender, RoutedEventArgs e)
|
private void OnLoaded(object sender, RoutedEventArgs e)
|
||||||
{
|
{
|
||||||
Datos?.ucLoaded();
|
Datos?.ucLoaded();
|
||||||
}
|
}
|
||||||
|
private void OnUnloaded(object sender, RoutedEventArgs e)
|
||||||
|
{
|
||||||
|
Datos?.ucUnLoaded();
|
||||||
|
}
|
||||||
public void Resize(float width, float height)
|
public void Resize(float width, float height)
|
||||||
{
|
{
|
||||||
if (Datos is osTransporteTTop datos)
|
if (Datos is osTransporteTTop datos)
|
||||||
|
|
|
@ -201,7 +201,11 @@ namespace CtrEditor.ObjetosSim
|
||||||
ActualizarLeftTop();
|
ActualizarLeftTop();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
public override void ucUnLoaded()
|
||||||
|
{
|
||||||
|
// El UserControl se esta eliminando
|
||||||
|
// eliminar el objeto de simulacion
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public partial class ucVMmotorSim : UserControl, IDataContainer
|
public partial class ucVMmotorSim : UserControl, IDataContainer
|
||||||
|
@ -212,11 +216,16 @@ namespace CtrEditor.ObjetosSim
|
||||||
{
|
{
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
this.Loaded += OnLoaded;
|
this.Loaded += OnLoaded;
|
||||||
|
this.Unloaded += OnUnloaded;
|
||||||
}
|
}
|
||||||
private void OnLoaded(object sender, RoutedEventArgs e)
|
private void OnLoaded(object sender, RoutedEventArgs e)
|
||||||
{
|
{
|
||||||
Datos?.ucLoaded();
|
Datos?.ucLoaded();
|
||||||
}
|
}
|
||||||
|
private void OnUnloaded(object sender, RoutedEventArgs e)
|
||||||
|
{
|
||||||
|
Datos?.ucUnLoaded();
|
||||||
|
}
|
||||||
public void Resize(float width, float height) { }
|
public void Resize(float width, float height) { }
|
||||||
public void Move(float LeftPixels, float TopPixels)
|
public void Move(float LeftPixels, float TopPixels)
|
||||||
{
|
{
|
||||||
|
|
|
@ -13,16 +13,57 @@ using FarseerPhysics.Common;
|
||||||
using System.Windows;
|
using System.Windows;
|
||||||
using System.Diagnostics;
|
using System.Diagnostics;
|
||||||
using System.Windows.Documents;
|
using System.Windows.Documents;
|
||||||
|
using CtrEditor.ObjetosSim;
|
||||||
|
using static System.Runtime.InteropServices.JavaScript.JSType;
|
||||||
|
|
||||||
namespace CtrEditor.Simulacion
|
namespace CtrEditor.Simulacion
|
||||||
{
|
{
|
||||||
public class simRectangle
|
|
||||||
|
public class simDescarte
|
||||||
|
{
|
||||||
|
public Body Body { get; private set; }
|
||||||
|
private float _radius;
|
||||||
|
public World _world;
|
||||||
|
|
||||||
|
public simDescarte(World world, float diameter, Vector2 position)
|
||||||
|
{
|
||||||
|
_world = world;
|
||||||
|
_radius = diameter / 2;
|
||||||
|
Create(position);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SetPosition(float x, float y)
|
||||||
|
{
|
||||||
|
Body.SetTransform(new Vector2(x, y), Body.Rotation);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SetDiameter(float diameter)
|
||||||
|
{
|
||||||
|
_radius = diameter / 2;
|
||||||
|
Create(Body.Position); // Recrear el círculo con el nuevo tamaño
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Create(Vector2 position)
|
||||||
|
{
|
||||||
|
if (Body != null)
|
||||||
|
{
|
||||||
|
_world.RemoveBody(Body);
|
||||||
|
}
|
||||||
|
Body = BodyFactory.CreateCircle(_world, _radius, 1f, position);
|
||||||
|
|
||||||
|
Body.FixtureList[0].IsSensor = true;
|
||||||
|
Body.BodyType = BodyType.Static;
|
||||||
|
Body.UserData = this; // Importante para la identificación durante la colisión
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public class simTransporte
|
||||||
{
|
{
|
||||||
public Body Body { get; private set; }
|
public Body Body { get; private set; }
|
||||||
public float Speed { get; set; } // Velocidad para efectos de cinta transportadora
|
public float Speed { get; set; } // Velocidad para efectos de cinta transportadora
|
||||||
public World _world;
|
public World _world;
|
||||||
|
|
||||||
public simRectangle(World world, float width, float height, Vector2 position, float angle = 0)
|
public simTransporte(World world, float width, float height, Vector2 position, float angle = 0)
|
||||||
{
|
{
|
||||||
_world = world;
|
_world = world;
|
||||||
Create(width, height, position, angle);
|
Create(width, height, position, angle);
|
||||||
|
@ -66,12 +107,12 @@ namespace CtrEditor.Simulacion
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public class simLine
|
public class simGuia
|
||||||
{
|
{
|
||||||
public Body Body { get; private set; }
|
public Body Body { get; private set; }
|
||||||
public World _world;
|
public World _world;
|
||||||
|
|
||||||
public simLine(World world, Vector2 start, Vector2 end)
|
public simGuia(World world, Vector2 start, Vector2 end)
|
||||||
{
|
{
|
||||||
_world = world;
|
_world = world;
|
||||||
Create(start, end);
|
Create(start, end);
|
||||||
|
@ -94,14 +135,15 @@ namespace CtrEditor.Simulacion
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public class simCircle
|
public class simBotella
|
||||||
{
|
{
|
||||||
public Body Body { get; private set; }
|
public Body Body { get; private set; }
|
||||||
public World _world;
|
public World _world;
|
||||||
private float _radius;
|
private float _radius;
|
||||||
private float _mass;
|
private float _mass;
|
||||||
|
public bool Descartar = false;
|
||||||
|
|
||||||
public simCircle(World world, float diameter, Vector2 position, float mass)
|
public simBotella(World world, float diameter, Vector2 position, float mass)
|
||||||
{
|
{
|
||||||
_world = world;
|
_world = world;
|
||||||
_radius = diameter / 2;
|
_radius = diameter / 2;
|
||||||
|
@ -180,9 +222,13 @@ namespace CtrEditor.Simulacion
|
||||||
|
|
||||||
private bool HandleCollision(Fixture fixtureA, Fixture fixtureB, FarseerPhysics.Dynamics.Contacts.Contact contact)
|
private bool HandleCollision(Fixture fixtureA, Fixture fixtureB, FarseerPhysics.Dynamics.Contacts.Contact contact)
|
||||||
{
|
{
|
||||||
if (fixtureB.Body.UserData is simRectangle)
|
if (fixtureB.Body.UserData is simDescarte)
|
||||||
{
|
{
|
||||||
simRectangle conveyor = fixtureB.Body.UserData as simRectangle;
|
Descartar = true;
|
||||||
|
return true;
|
||||||
|
} else if (fixtureB.Body.UserData is simTransporte)
|
||||||
|
{
|
||||||
|
simTransporte conveyor = fixtureB.Body.UserData as simTransporte;
|
||||||
CircleShape circleShape = fixtureA.Shape as CircleShape;
|
CircleShape circleShape = fixtureA.Shape as CircleShape;
|
||||||
PolygonShape polygonShape = fixtureB.Shape as PolygonShape;
|
PolygonShape polygonShape = fixtureB.Shape as PolygonShape;
|
||||||
|
|
||||||
|
@ -219,7 +265,7 @@ namespace CtrEditor.Simulacion
|
||||||
// Aquí puedes restablecer cualquier estado si es necesario al separarse de un simRectangle
|
// Aquí puedes restablecer cualquier estado si es necesario al separarse de un simRectangle
|
||||||
}
|
}
|
||||||
|
|
||||||
private void ApplyConveyorEffect(simRectangle conveyor, Fixture circleFixture, float porcentajeCompartido)
|
private void ApplyConveyorEffect(simTransporte conveyor, Fixture circleFixture, float porcentajeCompartido)
|
||||||
{
|
{
|
||||||
float speedMetersPerSecond = conveyor.Speed / 60.0f;
|
float speedMetersPerSecond = conveyor.Speed / 60.0f;
|
||||||
Vector2 desiredVelocity = new Vector2((float)Math.Cos(conveyor.Body.Rotation), (float)Math.Sin(conveyor.Body.Rotation)) * speedMetersPerSecond;
|
Vector2 desiredVelocity = new Vector2((float)Math.Cos(conveyor.Body.Rotation), (float)Math.Sin(conveyor.Body.Rotation)) * speedMetersPerSecond;
|
||||||
|
@ -231,9 +277,10 @@ namespace CtrEditor.Simulacion
|
||||||
{
|
{
|
||||||
private World world;
|
private World world;
|
||||||
private Canvas simulationCanvas;
|
private Canvas simulationCanvas;
|
||||||
public List<simCircle> circles;
|
public List<simBotella> circles;
|
||||||
public List<simRectangle> rectangles;
|
public List<simTransporte> rectangles;
|
||||||
public List<simLine> lines;
|
public List<simGuia> lines;
|
||||||
|
public List<simDescarte> descartes;
|
||||||
public Stopwatch stopwatch;
|
public Stopwatch stopwatch;
|
||||||
|
|
||||||
public Canvas DebugCanvas { get => simulationCanvas; set => simulationCanvas = value; }
|
public Canvas DebugCanvas { get => simulationCanvas; set => simulationCanvas = value; }
|
||||||
|
@ -241,9 +288,10 @@ namespace CtrEditor.Simulacion
|
||||||
public SimulationManagerFP()
|
public SimulationManagerFP()
|
||||||
{
|
{
|
||||||
world = new World(new Vector2(0, 0)); // Vector2.Zero
|
world = new World(new Vector2(0, 0)); // Vector2.Zero
|
||||||
circles = new List<simCircle>();
|
circles = new List<simBotella>();
|
||||||
rectangles = new List<simRectangle>();
|
rectangles = new List<simTransporte>();
|
||||||
lines = new List<simLine>();
|
lines = new List<simGuia>();
|
||||||
|
descartes = new List<simDescarte>();
|
||||||
stopwatch = new Stopwatch();
|
stopwatch = new Stopwatch();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -268,27 +316,55 @@ namespace CtrEditor.Simulacion
|
||||||
world.Step(elapsedMilliseconds / 1000.0f);
|
world.Step(elapsedMilliseconds / 1000.0f);
|
||||||
}
|
}
|
||||||
|
|
||||||
public simCircle AddCircle(float diameter, Vector2 position, float mass)
|
public void Remove(object Objeto)
|
||||||
{
|
{
|
||||||
simCircle circle = new simCircle(world, diameter, position, mass);
|
switch (Objeto)
|
||||||
|
{
|
||||||
|
case simBotella obj:
|
||||||
|
circles.Remove(obj);
|
||||||
|
break;
|
||||||
|
case simTransporte obj:
|
||||||
|
rectangles.Remove(obj);
|
||||||
|
break;
|
||||||
|
case simGuia obj:
|
||||||
|
lines.Remove(obj);
|
||||||
|
break;
|
||||||
|
case simDescarte obj:
|
||||||
|
descartes.Remove(obj);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
throw new InvalidOperationException("Tipo no soportado");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public simBotella AddCircle(float diameter, Vector2 position, float mass)
|
||||||
|
{
|
||||||
|
simBotella circle = new simBotella(world, diameter, position, mass);
|
||||||
circles.Add(circle);
|
circles.Add(circle);
|
||||||
return circle;
|
return circle;
|
||||||
}
|
}
|
||||||
|
|
||||||
public simRectangle AddRectangle(float width, float height, Vector2 position, float angle)
|
public simTransporte AddRectangle(float width, float height, Vector2 position, float angle)
|
||||||
{
|
{
|
||||||
simRectangle rectangle = new simRectangle(world, width, height, position, angle);
|
simTransporte rectangle = new simTransporte(world, width, height, position, angle);
|
||||||
rectangles.Add(rectangle);
|
rectangles.Add(rectangle);
|
||||||
return rectangle;
|
return rectangle;
|
||||||
}
|
}
|
||||||
|
|
||||||
public simLine AddLine(Vector2 start, Vector2 end)
|
public simGuia AddLine(Vector2 start, Vector2 end)
|
||||||
{
|
{
|
||||||
simLine line = new simLine(world, start, end);
|
simGuia line = new simGuia(world, start, end);
|
||||||
lines.Add(line);
|
lines.Add(line);
|
||||||
return line;
|
return line;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public simDescarte AddDescarte(float diameter, Vector2 position)
|
||||||
|
{
|
||||||
|
simDescarte descarte = new simDescarte(world, diameter, position);
|
||||||
|
descartes.Add(descarte);
|
||||||
|
return descarte;
|
||||||
|
}
|
||||||
|
|
||||||
public void Debug_DrawInitialBodies()
|
public void Debug_DrawInitialBodies()
|
||||||
{
|
{
|
||||||
ClearSimulationShapes();
|
ClearSimulationShapes();
|
||||||
|
|
Loading…
Reference in New Issue