Compare commits
No commits in common. "9ed8a0b7bd140e8056f69da9516efa1b2388e4f4" and "664d325de81c5e79dca11a0be43691fbe8e03078" have entirely different histories.
9ed8a0b7bd
...
664d325de8
104
MainViewModel.cs
104
MainViewModel.cs
|
@ -59,8 +59,8 @@ namespace CtrEditor
|
|||
// Evento que se dispara cuando se selecciona una nueva imagen
|
||||
public event EventHandler<string> ImageSelected;
|
||||
public event EventHandler<TickSimulacionEventArgs> TickSimulacion;
|
||||
public event Action<UserControl> OnUserControlSelected;
|
||||
|
||||
// Propiedades
|
||||
|
||||
private bool isSimulationRunning;
|
||||
private bool isConnected;
|
||||
|
@ -70,9 +70,6 @@ namespace CtrEditor
|
|||
private ObservableCollection<osBase> _objetosSimulables = new ObservableCollection<osBase>();
|
||||
private float _left;
|
||||
private float _top;
|
||||
private MainWindow mainWindow;
|
||||
|
||||
public MainWindow MainWindow { get => mainWindow; set => mainWindow = value; }
|
||||
|
||||
public float CanvasLeft
|
||||
{
|
||||
|
@ -83,7 +80,6 @@ namespace CtrEditor
|
|||
OnPropertyChanged(nameof(CanvasLeft));
|
||||
}
|
||||
}
|
||||
|
||||
public float CanvasTop
|
||||
{
|
||||
get => _top;
|
||||
|
@ -204,9 +200,6 @@ namespace CtrEditor
|
|||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Constructor
|
||||
//
|
||||
|
||||
public MainViewModel()
|
||||
{
|
||||
|
@ -244,40 +237,21 @@ namespace CtrEditor
|
|||
directorioTrabajo = EstadoPersistente.Instance.directorio;
|
||||
}
|
||||
|
||||
// Crear un nuevo Objeto
|
||||
private void ExecuteDoubleClick(object parameter)
|
||||
{
|
||||
if (parameter is TipoSimulable tipoSimulable)
|
||||
{
|
||||
CrearObjetoSimulableEnCentroCanvas(tipoSimulable.Tipo);
|
||||
}
|
||||
}
|
||||
|
||||
public void CrearObjetoSimulableEnCentroCanvas(Type tipoSimulable)
|
||||
{
|
||||
var CentroCanvas = MainWindow.ObtenerCentroCanvasMeters();
|
||||
CrearObjetoSimulable(tipoSimulable,CentroCanvas.X,CentroCanvas.Y);
|
||||
}
|
||||
|
||||
public osBase CrearObjetoSimulable(Type tipoSimulable,float Left,float Top)
|
||||
public void CrearUserControl(Type tipoSimulable)
|
||||
{
|
||||
// Crear una nueva instancia del osBase correspondiente
|
||||
osBase? NuevoOsBase = UserControlFactory.GetInstanceForType(tipoSimulable);
|
||||
|
||||
NuevoOsBase.Left = Left;
|
||||
NuevoOsBase.Top = Top;
|
||||
|
||||
if (NuevoOsBase != null)
|
||||
osBase? newosBase = UserControlFactory.GetInstanceForType(tipoSimulable);
|
||||
if (newosBase != null)
|
||||
{
|
||||
if (CrearUserControlDesdeObjetoSimulable(NuevoOsBase))
|
||||
if (CrearUsercontrol(newosBase))
|
||||
// Añadir el nuevo osBase a la colección de objetos simulables
|
||||
ObjetosSimulables.Add(NuevoOsBase);
|
||||
ObjetosSimulables.Add(newosBase);
|
||||
}
|
||||
return NuevoOsBase;
|
||||
}
|
||||
|
||||
// Crear UserControl desde osBase : Nuevo o desde Deserealizacion
|
||||
private bool CrearUserControlDesdeObjetoSimulable(osBase osObjeto)
|
||||
private bool CrearUsercontrol(osBase osObjeto)
|
||||
{
|
||||
Type tipoObjeto = osObjeto.GetType();
|
||||
|
||||
|
@ -290,20 +264,18 @@ namespace CtrEditor
|
|||
UserControlFactory.AssignDatos(userControl, osObjeto, simulationManager);
|
||||
osObjeto._mainViewModel = this;
|
||||
|
||||
MainWindow.AgregarRegistrarUserControlCanvas(userControl);
|
||||
OnUserControlSelected?.Invoke(userControl);
|
||||
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public void RemoverObjetoSimulable(osBase osObjeto)
|
||||
private void ExecuteDoubleClick(object parameter)
|
||||
{
|
||||
if (osObjeto != null && ObjetosSimulables.Contains(osObjeto))
|
||||
if (parameter is TipoSimulable tipoSimulable)
|
||||
{
|
||||
ObjetosSimulables.Remove(osObjeto);
|
||||
if (osObjeto.VisualRepresentation != null)
|
||||
MainWindow.EliminarUserControlDelCanvas(osObjeto.VisualRepresentation);
|
||||
CrearUserControl(tipoSimulable.Tipo);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -355,15 +327,8 @@ namespace CtrEditor
|
|||
|
||||
simulationManager.Step();
|
||||
|
||||
var objetosSimulablesCopy = new List<osBase>(ObjetosSimulables);
|
||||
|
||||
foreach (var objetoSimulable in objetosSimulablesCopy)
|
||||
{
|
||||
if (!objetoSimulable.RemoverDesdeSimulacion)
|
||||
objetoSimulable.UpdateControl((int)elapsedMilliseconds);
|
||||
else
|
||||
RemoverObjetoSimulable(objetoSimulable);
|
||||
}
|
||||
foreach (var objetoSimulable in ObjetosSimulables)
|
||||
objetoSimulable.UpdateControl((int)elapsedMilliseconds);
|
||||
|
||||
}
|
||||
|
||||
|
@ -415,6 +380,8 @@ namespace CtrEditor
|
|||
public void Save()
|
||||
{
|
||||
SaveStateObjetosSimulables();
|
||||
ImageSelected?.Invoke(this, datosDeTrabajo.Imagenes[_selectedImage]); // Dispara el evento con la nueva ruta de imagen
|
||||
LoadStateObjetosSimulables();
|
||||
}
|
||||
|
||||
public void SaveStateObjetosSimulables()
|
||||
|
@ -423,33 +390,19 @@ namespace CtrEditor
|
|||
{
|
||||
StopSimulation();
|
||||
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
|
||||
{
|
||||
Formatting = Formatting.Indented,
|
||||
NullValueHandling = NullValueHandling.Ignore,
|
||||
TypeNameHandling = TypeNameHandling.Auto
|
||||
};
|
||||
|
||||
// Crear un objeto que incluya tanto los ObjetosSimulables como el UnitConverter y PLC_ConnectionData
|
||||
foreach (var obj in ObjetosSimulables)
|
||||
{
|
||||
obj.VisualRepresentation = null;
|
||||
obj.simulationManager = null;
|
||||
obj._mainViewModel = null;
|
||||
}
|
||||
// Crear un objeto que incluya tanto los ObjetosSimulables como el UnitConverter
|
||||
var dataToSerialize = new SimulationData
|
||||
{
|
||||
ObjetosSimulables = ObjetosSimulables,
|
||||
|
@ -457,22 +410,11 @@ namespace CtrEditor
|
|||
PLC_ConnectionData = PLCViewModel
|
||||
};
|
||||
|
||||
// Serializar
|
||||
var serializedData = JsonConvert.SerializeObject(dataToSerialize, settings);
|
||||
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()
|
||||
{
|
||||
try
|
||||
|
@ -513,7 +455,7 @@ namespace CtrEditor
|
|||
|
||||
// Recorrer la colección de objetos simulables
|
||||
foreach (var objetoSimulable in ObjetosSimulables)
|
||||
CrearUserControlDesdeObjetoSimulable(objetoSimulable);
|
||||
CrearUsercontrol(objetoSimulable);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -61,14 +61,15 @@ namespace CtrEditor
|
|||
{
|
||||
if (DataContext is MainViewModel viewModel)
|
||||
{
|
||||
viewModel.MainWindow = this;
|
||||
viewModel.ImageSelected += ViewModel_ImageSelected;
|
||||
viewModel.ImageSelected += ViewModel_ImageSelected;
|
||||
//viewModel.TickSimulacion += MainViewModel_TickSimulacion;
|
||||
viewModel.OnUserControlSelected += AgregarUserControl;
|
||||
viewModel?.LoadInitialData(); // Carga la primera imagen por defecto una vez cargada la ventana principal
|
||||
viewModel.simulationManager.DebugCanvas = ImagenEnTrabajoCanvas;
|
||||
}
|
||||
}
|
||||
|
||||
public (float X, float Y) ObtenerCentroCanvasPixels()
|
||||
private (float X, float Y) ObtenerCentroCanvasPixels()
|
||||
{
|
||||
var scaleTransform = ImagenEnTrabajoCanvas.LayoutTransform as ScaleTransform;
|
||||
float scaleX = (float)(scaleTransform?.ScaleX ?? 1.0);
|
||||
|
@ -89,28 +90,48 @@ namespace CtrEditor
|
|||
return (centerX, centerY);
|
||||
}
|
||||
|
||||
public (float X, float Y) ObtenerCentroCanvasMeters()
|
||||
private (float X, float Y) ObtenerCentroCanvasMeters()
|
||||
{
|
||||
var c = ObtenerCentroCanvasPixels();
|
||||
return (PixelToMeter.Instance.calc.PixelsToMeters(c.X), PixelToMeter.Instance.calc.PixelsToMeters(c.Y));
|
||||
}
|
||||
|
||||
public void SuscribirEventos(UserControl userControl)
|
||||
{
|
||||
userControl.MouseEnter += UserControl_MouseEnter;
|
||||
userControl.MouseLeave += UserControl_MouseLeave;
|
||||
|
||||
// Suscribir a eventos de mouse para panning
|
||||
userControl.MouseLeftButtonDown += UserControl_MouseLeftButtonDown;
|
||||
userControl.MouseLeftButtonUp += UserControl_MouseLeftButtonUp;
|
||||
userControl.MouseMove += UserControl_MouseMove;
|
||||
}
|
||||
|
||||
public void AgregarRegistrarUserControlCanvas(UserControl userControl)
|
||||
private void AgregarUserControl(UserControl userControl)
|
||||
{
|
||||
if (userControl is IDataContainer dataContainer)
|
||||
{
|
||||
SuscribirEventos(userControl);
|
||||
var NuevoOS = dataContainer.Datos;
|
||||
if (!NuevoOS.Inicializado) // Aun no fue inicializado
|
||||
{
|
||||
Random rnd = new Random();
|
||||
|
||||
var centro = ObtenerCentroCanvasPixels();
|
||||
|
||||
// Ajusta la posición del UserControl para que esté centrado en el área visible
|
||||
double leftPixels = centro.X - (userControl.ActualWidth / 2);
|
||||
double topPixels = centro.Y - (userControl.ActualHeight / 2);
|
||||
|
||||
// Establece la posición del UserControl
|
||||
NuevoOS.Left = PixelToMeter.Instance.calc.PixelsToMeters((float)leftPixels + (float)(rnd.NextDouble() - 0.5) );
|
||||
NuevoOS.Top = PixelToMeter.Instance.calc.PixelsToMeters((float)topPixels + (float)(rnd.NextDouble() - 0.5) );
|
||||
|
||||
NuevoOS.Inicializado = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
// Fuerza a Establecer la posición del UserControl
|
||||
NuevoOS.Left = NuevoOS.Left;
|
||||
NuevoOS.Top = NuevoOS.Top;
|
||||
}
|
||||
|
||||
// Suscribirse a eventos de mouse para marcar el Control
|
||||
userControl.MouseEnter += UserControl_MouseEnter;
|
||||
userControl.MouseLeave += UserControl_MouseLeave;
|
||||
|
||||
// Suscribir a eventos de mouse para panning
|
||||
userControl.MouseLeftButtonDown += UserControl_MouseLeftButtonDown;
|
||||
userControl.MouseLeftButtonUp += UserControl_MouseLeftButtonUp;
|
||||
userControl.MouseMove += UserControl_MouseMove;
|
||||
|
||||
// Añade el UserControl al Canvas
|
||||
Canvas.SetZIndex(userControl, dataContainer.ZIndex());
|
||||
|
@ -118,14 +139,6 @@ namespace CtrEditor
|
|||
}
|
||||
}
|
||||
|
||||
public void EliminarUserControlDelCanvas(UserControl userControl)
|
||||
{
|
||||
if (ImagenEnTrabajoCanvas.Children.Contains(userControl))
|
||||
{
|
||||
ImagenEnTrabajoCanvas.Children.Remove(userControl);
|
||||
}
|
||||
}
|
||||
|
||||
private void UserControl_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
|
||||
{
|
||||
if (!_isDrawingCanvas)
|
||||
|
|
|
@ -6,7 +6,6 @@ using System.Text;
|
|||
using System.Threading.Tasks;
|
||||
using System.Windows.Controls;
|
||||
using CtrEditor.Simulacion;
|
||||
using System.Reflection;
|
||||
|
||||
namespace CtrEditor.ObjetosSim
|
||||
{
|
||||
|
@ -14,42 +13,60 @@ namespace CtrEditor.ObjetosSim
|
|||
{
|
||||
public static UserControl? GetControlForType(Type tipoObjeto)
|
||||
{
|
||||
// Obtener el nombre del tipo de objeto
|
||||
string typeName = tipoObjeto.Name;
|
||||
if (tipoObjeto == typeof(osBotella))
|
||||
return new ucBotella();
|
||||
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);
|
||||
|
||||
// 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);
|
||||
}
|
||||
}
|
||||
// Puedes añadir más condiciones para otros tipos
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
public static osBase? GetInstanceForType(Type tipoObjeto)
|
||||
{
|
||||
// Verifica si el tipo pasado es un subtipo de osBase
|
||||
if (!typeof(osBase).IsAssignableFrom(tipoObjeto))
|
||||
{
|
||||
throw new ArgumentException("El tipo pasado no es un subtipo de osBase", nameof(tipoObjeto));
|
||||
}
|
||||
if (tipoObjeto == typeof(osBotella))
|
||||
return new osBotella();
|
||||
if (tipoObjeto == typeof(osTransporteTTop))
|
||||
return new osTransporteTTop();
|
||||
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
|
||||
return (osBase?)Activator.CreateInstance(tipoObjeto);
|
||||
|
||||
// Puedes añadir más condiciones para otros tipos
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
public static osBase? CreateInstanceAndPopulate(Type tipoObjeto, string jsonString)
|
||||
|
|
|
@ -27,7 +27,7 @@ namespace CtrEditor.ObjetosSim
|
|||
|
||||
public interface IosBase
|
||||
{
|
||||
string Nombre { get; }
|
||||
string Nombre { get; }
|
||||
|
||||
void UpdateControl(int elapsedMilliseconds);
|
||||
}
|
||||
|
@ -49,8 +49,6 @@ namespace CtrEditor.ObjetosSim
|
|||
public abstract float Top { get; set; }
|
||||
|
||||
public bool Inicializado = false;
|
||||
public bool AutoCreated = false;
|
||||
public bool RemoverDesdeSimulacion = false; // La simulacion indica que se debe remover
|
||||
|
||||
[JsonIgnore]
|
||||
protected UserControl? _visualRepresentation = null;
|
||||
|
@ -62,7 +60,6 @@ namespace CtrEditor.ObjetosSim
|
|||
public abstract void UpdateGeometryStep();
|
||||
public abstract void UpdatePLC(PLCModel plc, int elapsedMilliseconds);
|
||||
public abstract void ucLoaded();
|
||||
public abstract void ucUnLoaded();
|
||||
|
||||
[JsonIgnore]
|
||||
public MainViewModel _mainViewModel;
|
||||
|
@ -92,12 +89,6 @@ namespace CtrEditor.ObjetosSim
|
|||
return null;
|
||||
}
|
||||
|
||||
public void ActualizarLeftTop()
|
||||
{
|
||||
Left = Left;
|
||||
Top = Top;
|
||||
}
|
||||
|
||||
public bool LeerBitTag(PLCModel plc, string Tag)
|
||||
{
|
||||
if (!string.IsNullOrEmpty(Tag))
|
||||
|
@ -225,18 +216,18 @@ namespace CtrEditor.ObjetosSim
|
|||
return new Vector2((topLeft.X + bottomRight.X) / 2, (topLeft.Y + bottomRight.Y) / 2);
|
||||
}
|
||||
|
||||
public void UpdateRectangle(simTransporte simRect, System.Windows.Shapes.Rectangle wpfRect, float Alto, float Ancho, float Angulo)
|
||||
public void UpdateRectangle(simRectangle simRect, System.Windows.Shapes.Rectangle wpfRect, float Alto, float Ancho, float Angulo)
|
||||
{
|
||||
if (simRect != null)
|
||||
simRect.Create(Ancho, Alto, GetRectangleCenter(wpfRect), Angulo);
|
||||
}
|
||||
|
||||
public simTransporte AddRectangle(SimulationManagerFP simulationManager, System.Windows.Shapes.Rectangle wpfRect, float Alto, float Ancho, float Angulo)
|
||||
public simRectangle AddRectangle(SimulationManagerFP simulationManager, System.Windows.Shapes.Rectangle wpfRect, float Alto, float Ancho, float Angulo)
|
||||
{
|
||||
return simulationManager.AddRectangle(Ancho, Alto, GetRectangleCenter(wpfRect), Angulo);
|
||||
}
|
||||
|
||||
public void UpdateOrCreateLine(simGuia simGuia, System.Windows.Shapes.Rectangle wpfRect)
|
||||
public void UpdateOrCreateLine(simLine simGuia, System.Windows.Shapes.Rectangle wpfRect)
|
||||
{
|
||||
if (simGuia != null)
|
||||
{
|
||||
|
@ -247,7 +238,7 @@ namespace CtrEditor.ObjetosSim
|
|||
}
|
||||
}
|
||||
|
||||
public simGuia AddLine(SimulationManagerFP simulationManager, System.Windows.Shapes.Rectangle wpfRect)
|
||||
public simLine AddLine(SimulationManagerFP simulationManager, System.Windows.Shapes.Rectangle wpfRect)
|
||||
{
|
||||
var coords = GetCenterLineVectors(wpfRect);
|
||||
return simulationManager.AddLine(coords.Start, coords.End);
|
||||
|
|
|
@ -120,14 +120,7 @@ namespace CtrEditor.ObjetosSim
|
|||
{
|
||||
// El UserControl ya se ha cargado y podemos obtener las coordenadas para
|
||||
// crear el objeto de simulacion
|
||||
ActualizarLeftTop();
|
||||
}
|
||||
public override void ucUnLoaded()
|
||||
{
|
||||
// El UserControl se esta eliminando
|
||||
// eliminar el objeto de simulacion
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
@ -139,16 +132,11 @@ namespace CtrEditor.ObjetosSim
|
|||
{
|
||||
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 osBasicExample datos)
|
||||
{
|
||||
|
|
|
@ -31,7 +31,7 @@ namespace CtrEditor.ObjetosSim
|
|||
private float _mass;
|
||||
private Vector2 _centro = new Vector2(); // Centro
|
||||
private string _nombre = "Botella";
|
||||
private simBotella Simulacion_Botella;
|
||||
private simCircle Simulacion_Botella;
|
||||
|
||||
// Otros datos y métodos relevantes para la simulación
|
||||
|
||||
|
@ -63,7 +63,6 @@ namespace CtrEditor.ObjetosSim
|
|||
{
|
||||
_centro.X = value+Diametro/2;
|
||||
CanvasSetLeftinMeter(value);
|
||||
OnPropertyChanged(nameof(CenterX));
|
||||
OnPropertyChanged(nameof(Left));
|
||||
}
|
||||
}
|
||||
|
@ -74,7 +73,6 @@ namespace CtrEditor.ObjetosSim
|
|||
{
|
||||
_centro.Y = value + Diametro / 2;
|
||||
CanvasSetTopinMeter(value);
|
||||
OnPropertyChanged(nameof(CenterY));
|
||||
OnPropertyChanged(nameof(Top));
|
||||
}
|
||||
}
|
||||
|
@ -147,24 +145,13 @@ namespace CtrEditor.ObjetosSim
|
|||
{
|
||||
CenterX = Simulacion_Botella.CenterX;
|
||||
CenterY = Simulacion_Botella.CenterY;
|
||||
|
||||
if (Simulacion_Botella.Descartar) // Ha sido marcada para remover
|
||||
RemoverDesdeSimulacion = true;
|
||||
}
|
||||
|
||||
public override void ucLoaded()
|
||||
{
|
||||
// El UserControl ya se ha cargado y podemos obtener las coordenadas para
|
||||
// crear el objeto de simulacion
|
||||
ActualizarLeftTop();
|
||||
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);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
@ -176,17 +163,11 @@ namespace CtrEditor.ObjetosSim
|
|||
{
|
||||
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) { }
|
||||
public void Move(float LeftPixels, float TopPixels)
|
||||
{
|
||||
|
|
|
@ -162,12 +162,6 @@ namespace CtrEditor.ObjetosSim
|
|||
{
|
||||
// El UserControl ya se ha cargado y podemos obtener las coordenadas para
|
||||
// crear el objeto de simulacion
|
||||
ActualizarLeftTop();
|
||||
}
|
||||
public override void ucUnLoaded()
|
||||
{
|
||||
// El UserControl se esta eliminando
|
||||
// eliminar el objeto de simulacion
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -179,18 +173,14 @@ namespace CtrEditor.ObjetosSim
|
|||
public ucBoton()
|
||||
{
|
||||
InitializeComponent();
|
||||
this.DataContextChanged += OnDataContextChanged;
|
||||
this.Loaded += OnLoaded;
|
||||
this.Unloaded += OnUnloaded;
|
||||
this.DataContextChanged += OnDataContextChanged;
|
||||
}
|
||||
|
||||
private void OnLoaded(object sender, RoutedEventArgs e)
|
||||
{
|
||||
Datos?.ucLoaded();
|
||||
}
|
||||
private void OnUnloaded(object sender, RoutedEventArgs e)
|
||||
{
|
||||
Datos?.ucUnLoaded();
|
||||
}
|
||||
|
||||
private void OnDataContextChanged(object sender, DependencyPropertyChangedEventArgs e)
|
||||
{
|
||||
|
|
|
@ -1,37 +0,0 @@
|
|||
<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>
|
|
@ -1,180 +0,0 @@
|
|||
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,28 +38,7 @@ namespace CtrEditor.ObjetosSim
|
|||
private string _tag_consenso;
|
||||
private bool _consenso;
|
||||
private float TiempoRestante;
|
||||
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));
|
||||
}
|
||||
}
|
||||
private List<simCircle> Botellas = new List<simCircle>();
|
||||
|
||||
public bool Consenso
|
||||
{
|
||||
|
@ -196,35 +175,24 @@ namespace CtrEditor.ObjetosSim
|
|||
|
||||
public override void UpdateControl(int elapsedMilliseconds)
|
||||
{
|
||||
if (Consenso && Velocidad_actual_percentual > 0)
|
||||
if (Consenso && Velocidad_actual_percentual>0)
|
||||
{
|
||||
TiempoRestante -= elapsedMilliseconds / 1000.0f;
|
||||
if (TiempoRestante <= 0)
|
||||
{
|
||||
TiempoRestante = 3600 / (Botellas_hora * (Velocidad_actual_percentual / 100.0f));
|
||||
TiempoRestante = Botellas_hora * (Velocidad_actual_percentual / 100.0f) / 3600.0f;
|
||||
var PosSalida = new Vector2(Left, Top);
|
||||
|
||||
var UltimaBotellla = GetLastElement<osBotella>(Botellas);
|
||||
if (UltimaBotellla == null || (UltimaBotellla != null && !(UltimaBotellla.Left == Left && UltimaBotellla.Top == Top)))
|
||||
{
|
||||
var Botella = _mainViewModel.CrearObjetoSimulable(typeof(osBotella), Left + OffsetLeftSalida, Top + OffsetTopSalida);
|
||||
Botella.AutoCreated = true;
|
||||
Botellas.Add((osBotella)Botella);
|
||||
}
|
||||
var UltimaBotellla = GetLastElement<simCircle>(Botellas);
|
||||
if (UltimaBotellla != null && UltimaBotellla.Center != PosSalida)
|
||||
Botellas.Add(simulationManager.AddCircle(Diametro_botella, PosSalida, 1));
|
||||
}
|
||||
}
|
||||
else
|
||||
TiempoRestante = 0;
|
||||
}
|
||||
public override void ucLoaded()
|
||||
{
|
||||
// El UserControl ya se ha cargado y podemos obtener las coordenadas para
|
||||
// crear el objeto de simulacion
|
||||
ActualizarLeftTop();
|
||||
}
|
||||
public override void ucUnLoaded()
|
||||
{
|
||||
// El UserControl se esta eliminando
|
||||
// eliminar el objeto de simulacion
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -237,16 +205,11 @@ namespace CtrEditor.ObjetosSim
|
|||
{
|
||||
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 osFiller datos)
|
||||
|
|
|
@ -33,7 +33,7 @@ namespace CtrEditor.ObjetosSim
|
|||
private float _angulo;
|
||||
private string _nombre = "Guia";
|
||||
|
||||
private simGuia Simulation_Guia;
|
||||
private simLine Simulation_Guia;
|
||||
|
||||
public override float Left
|
||||
{
|
||||
|
@ -126,17 +126,9 @@ namespace CtrEditor.ObjetosSim
|
|||
{
|
||||
// El UserControl ya se ha cargado y podemos obtener las coordenadas para
|
||||
// crear el objeto de simulacion
|
||||
ActualizarLeftTop();
|
||||
|
||||
if (_visualRepresentation is ucGuia uc)
|
||||
Simulation_Guia = AddLine(simulationManager, uc.Guia);
|
||||
}
|
||||
public override void ucUnLoaded()
|
||||
{
|
||||
// El UserControl se esta eliminando
|
||||
// eliminar el objeto de simulacion
|
||||
simulationManager.Remove(Simulation_Guia);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
@ -149,15 +141,10 @@ namespace CtrEditor.ObjetosSim
|
|||
{
|
||||
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();
|
||||
Datos?.ucLoaded();
|
||||
}
|
||||
public void Resize(float width, float height)
|
||||
{
|
||||
|
|
|
@ -169,13 +169,6 @@ namespace CtrEditor.ObjetosSim
|
|||
{
|
||||
// El UserControl ya se ha cargado y podemos obtener las coordenadas para
|
||||
// crear el objeto de simulacion
|
||||
ActualizarLeftTop();
|
||||
|
||||
}
|
||||
public override void ucUnLoaded()
|
||||
{
|
||||
// El UserControl se esta eliminando
|
||||
// eliminar el objeto de simulacion
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -188,16 +181,11 @@ namespace CtrEditor.ObjetosSim
|
|||
{
|
||||
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 osSensTemperatura datos)
|
||||
|
|
|
@ -287,13 +287,6 @@ namespace CtrEditor.ObjetosSim
|
|||
{
|
||||
// El UserControl ya se ha cargado y podemos obtener las coordenadas para
|
||||
// crear el objeto de simulacion
|
||||
ActualizarLeftTop();
|
||||
|
||||
}
|
||||
public override void ucUnLoaded()
|
||||
{
|
||||
// El UserControl se esta eliminando
|
||||
// eliminar el objeto de simulacion
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -306,16 +299,11 @@ namespace CtrEditor.ObjetosSim
|
|||
{
|
||||
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 osTanque datos)
|
||||
|
|
|
@ -43,9 +43,9 @@ namespace CtrEditor.ObjetosSim
|
|||
private osBase _osMotor = null;
|
||||
private string _motor;
|
||||
|
||||
private simTransporte? TransporteCentral;
|
||||
private simGuia? Guia_Superior;
|
||||
private simGuia? Guia_Inferior;
|
||||
private simRectangle? TransporteCentral;
|
||||
private simLine? Guia_Superior;
|
||||
private simLine? Guia_Inferior;
|
||||
|
||||
|
||||
|
||||
|
@ -211,8 +211,6 @@ namespace CtrEditor.ObjetosSim
|
|||
{
|
||||
// El UserControl ya se ha cargado y podemos obtener las coordenadas para
|
||||
// crear el objeto de simulacion
|
||||
ActualizarLeftTop();
|
||||
|
||||
simulationManager.rectangles.Add(TransporteCentral);
|
||||
simulationManager.lines.Add(Guia_Superior);
|
||||
simulationManager.lines.Add(Guia_Inferior);
|
||||
|
@ -227,14 +225,6 @@ namespace CtrEditor.ObjetosSim
|
|||
}
|
||||
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);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
@ -247,16 +237,11 @@ namespace CtrEditor.ObjetosSim
|
|||
{
|
||||
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 osTransporteGuias datos)
|
||||
|
|
|
@ -30,7 +30,7 @@ namespace CtrEditor.ObjetosSim
|
|||
private osBase _osMotor = null;
|
||||
private string _motor;
|
||||
|
||||
private simTransporte Simulation_Transporte;
|
||||
private simRectangle Simulation_Transporte;
|
||||
|
||||
public string Motor
|
||||
{
|
||||
|
@ -163,17 +163,9 @@ namespace CtrEditor.ObjetosSim
|
|||
{
|
||||
// El UserControl ya se ha cargado y podemos obtener las coordenadas para
|
||||
// crear el objeto de simulacion
|
||||
ActualizarLeftTop();
|
||||
|
||||
if (_visualRepresentation is ucTransporteTTop uc)
|
||||
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);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
@ -185,16 +177,11 @@ namespace CtrEditor.ObjetosSim
|
|||
{
|
||||
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 osTransporteTTop datos)
|
||||
|
|
|
@ -198,14 +198,8 @@ namespace CtrEditor.ObjetosSim
|
|||
{
|
||||
// El UserControl ya se ha cargado y podemos obtener las coordenadas para
|
||||
// crear el objeto de simulacion
|
||||
ActualizarLeftTop();
|
||||
}
|
||||
|
||||
}
|
||||
public override void ucUnLoaded()
|
||||
{
|
||||
// El UserControl se esta eliminando
|
||||
// eliminar el objeto de simulacion
|
||||
}
|
||||
}
|
||||
|
||||
public partial class ucVMmotorSim : UserControl, IDataContainer
|
||||
|
@ -216,16 +210,11 @@ namespace CtrEditor.ObjetosSim
|
|||
{
|
||||
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) { }
|
||||
public void Move(float LeftPixels, float TopPixels)
|
||||
{
|
||||
|
|
|
@ -13,57 +13,16 @@ using FarseerPhysics.Common;
|
|||
using System.Windows;
|
||||
using System.Diagnostics;
|
||||
using System.Windows.Documents;
|
||||
using CtrEditor.ObjetosSim;
|
||||
using static System.Runtime.InteropServices.JavaScript.JSType;
|
||||
|
||||
namespace CtrEditor.Simulacion
|
||||
{
|
||||
|
||||
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 class simRectangle
|
||||
{
|
||||
public Body Body { get; private set; }
|
||||
public float Speed { get; set; } // Velocidad para efectos de cinta transportadora
|
||||
public World _world;
|
||||
|
||||
public simTransporte(World world, float width, float height, Vector2 position, float angle = 0)
|
||||
public simRectangle(World world, float width, float height, Vector2 position, float angle = 0)
|
||||
{
|
||||
_world = world;
|
||||
Create(width, height, position, angle);
|
||||
|
@ -107,12 +66,12 @@ namespace CtrEditor.Simulacion
|
|||
}
|
||||
}
|
||||
|
||||
public class simGuia
|
||||
public class simLine
|
||||
{
|
||||
public Body Body { get; private set; }
|
||||
public World _world;
|
||||
|
||||
public simGuia(World world, Vector2 start, Vector2 end)
|
||||
public simLine(World world, Vector2 start, Vector2 end)
|
||||
{
|
||||
_world = world;
|
||||
Create(start, end);
|
||||
|
@ -135,15 +94,14 @@ namespace CtrEditor.Simulacion
|
|||
}
|
||||
}
|
||||
|
||||
public class simBotella
|
||||
public class simCircle
|
||||
{
|
||||
public Body Body { get; private set; }
|
||||
public World _world;
|
||||
private float _radius;
|
||||
private float _mass;
|
||||
public bool Descartar = false;
|
||||
|
||||
public simBotella(World world, float diameter, Vector2 position, float mass)
|
||||
public simCircle(World world, float diameter, Vector2 position, float mass)
|
||||
{
|
||||
_world = world;
|
||||
_radius = diameter / 2;
|
||||
|
@ -222,13 +180,9 @@ namespace CtrEditor.Simulacion
|
|||
|
||||
private bool HandleCollision(Fixture fixtureA, Fixture fixtureB, FarseerPhysics.Dynamics.Contacts.Contact contact)
|
||||
{
|
||||
if (fixtureB.Body.UserData is simDescarte)
|
||||
if (fixtureB.Body.UserData is simRectangle)
|
||||
{
|
||||
Descartar = true;
|
||||
return true;
|
||||
} else if (fixtureB.Body.UserData is simTransporte)
|
||||
{
|
||||
simTransporte conveyor = fixtureB.Body.UserData as simTransporte;
|
||||
simRectangle conveyor = fixtureB.Body.UserData as simRectangle;
|
||||
CircleShape circleShape = fixtureA.Shape as CircleShape;
|
||||
PolygonShape polygonShape = fixtureB.Shape as PolygonShape;
|
||||
|
||||
|
@ -265,7 +219,7 @@ namespace CtrEditor.Simulacion
|
|||
// Aquí puedes restablecer cualquier estado si es necesario al separarse de un simRectangle
|
||||
}
|
||||
|
||||
private void ApplyConveyorEffect(simTransporte conveyor, Fixture circleFixture, float porcentajeCompartido)
|
||||
private void ApplyConveyorEffect(simRectangle conveyor, Fixture circleFixture, float porcentajeCompartido)
|
||||
{
|
||||
float speedMetersPerSecond = conveyor.Speed / 60.0f;
|
||||
Vector2 desiredVelocity = new Vector2((float)Math.Cos(conveyor.Body.Rotation), (float)Math.Sin(conveyor.Body.Rotation)) * speedMetersPerSecond;
|
||||
|
@ -277,10 +231,9 @@ namespace CtrEditor.Simulacion
|
|||
{
|
||||
private World world;
|
||||
private Canvas simulationCanvas;
|
||||
public List<simBotella> circles;
|
||||
public List<simTransporte> rectangles;
|
||||
public List<simGuia> lines;
|
||||
public List<simDescarte> descartes;
|
||||
public List<simCircle> circles;
|
||||
public List<simRectangle> rectangles;
|
||||
public List<simLine> lines;
|
||||
public Stopwatch stopwatch;
|
||||
|
||||
public Canvas DebugCanvas { get => simulationCanvas; set => simulationCanvas = value; }
|
||||
|
@ -288,10 +241,9 @@ namespace CtrEditor.Simulacion
|
|||
public SimulationManagerFP()
|
||||
{
|
||||
world = new World(new Vector2(0, 0)); // Vector2.Zero
|
||||
circles = new List<simBotella>();
|
||||
rectangles = new List<simTransporte>();
|
||||
lines = new List<simGuia>();
|
||||
descartes = new List<simDescarte>();
|
||||
circles = new List<simCircle>();
|
||||
rectangles = new List<simRectangle>();
|
||||
lines = new List<simLine>();
|
||||
stopwatch = new Stopwatch();
|
||||
}
|
||||
|
||||
|
@ -316,55 +268,27 @@ namespace CtrEditor.Simulacion
|
|||
world.Step(elapsedMilliseconds / 1000.0f);
|
||||
}
|
||||
|
||||
public void Remove(object Objeto)
|
||||
public simCircle AddCircle(float diameter, Vector2 position, float 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);
|
||||
simCircle circle = new simCircle(world, diameter, position, mass);
|
||||
circles.Add(circle);
|
||||
return circle;
|
||||
}
|
||||
|
||||
public simTransporte AddRectangle(float width, float height, Vector2 position, float angle)
|
||||
public simRectangle AddRectangle(float width, float height, Vector2 position, float angle)
|
||||
{
|
||||
simTransporte rectangle = new simTransporte(world, width, height, position, angle);
|
||||
simRectangle rectangle = new simRectangle(world, width, height, position, angle);
|
||||
rectangles.Add(rectangle);
|
||||
return rectangle;
|
||||
}
|
||||
|
||||
public simGuia AddLine(Vector2 start, Vector2 end)
|
||||
public simLine AddLine(Vector2 start, Vector2 end)
|
||||
{
|
||||
simGuia line = new simGuia(world, start, end);
|
||||
simLine line = new simLine(world, start, end);
|
||||
lines.Add(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()
|
||||
{
|
||||
ClearSimulationShapes();
|
||||
|
|
Loading…
Reference in New Issue