Cambios de directorio
This commit is contained in:
parent
25da24d042
commit
e54dba175a
|
@ -216,6 +216,28 @@ namespace CtrEditor.Convertidores
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public class DoubleToFormattedStringConverter : IValueConverter
|
||||||
|
{
|
||||||
|
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
|
||||||
|
{
|
||||||
|
if (value is double floatValue)
|
||||||
|
{
|
||||||
|
return floatValue.ToString("0.00", culture); // Formatear a dos decimales
|
||||||
|
}
|
||||||
|
return value; // Devolver el valor original si no es un float
|
||||||
|
}
|
||||||
|
|
||||||
|
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
|
||||||
|
{
|
||||||
|
if (value is string stringValue && double.TryParse(stringValue, NumberStyles.Float, culture, out double result))
|
||||||
|
{
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
return value; // Devolver el valor original si no se puede convertir
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
public class UnitConverter
|
public class UnitConverter
|
||||||
{
|
{
|
||||||
// La escala representa cuántos metros hay en un píxel
|
// La escala representa cuántos metros hay en un píxel
|
||||||
|
|
|
@ -9,7 +9,6 @@
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Compile Remove="ObjetosSim\ucBasicExample.xaml.cs" />
|
|
||||||
<Compile Remove="ObjetosSim\ucTransporteCurva.xaml.cs" />
|
<Compile Remove="ObjetosSim\ucTransporteCurva.xaml.cs" />
|
||||||
<Compile Remove="Simulacion\GeometrySimulator.cs" />
|
<Compile Remove="Simulacion\GeometrySimulator.cs" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
@ -41,7 +40,6 @@
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Page Remove="ObjetosSim\ucBasicExample.xaml" />
|
|
||||||
<Page Remove="ObjetosSim\ucTransporteCurva.xaml" />
|
<Page Remove="ObjetosSim\ucTransporteCurva.xaml" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
|
|
261
MainViewModel.cs
261
MainViewModel.cs
|
@ -4,30 +4,29 @@ using System.Windows.Controls;
|
||||||
using System.Windows.Input;
|
using System.Windows.Input;
|
||||||
using Ookii.Dialogs.Wpf;
|
using Ookii.Dialogs.Wpf;
|
||||||
using System.Collections.ObjectModel;
|
using System.Collections.ObjectModel;
|
||||||
using System.Windows.Media;
|
|
||||||
using System.Windows.Threading;
|
using System.Windows.Threading;
|
||||||
using CtrEditor.ObjetosSim;
|
using CtrEditor.ObjetosSim;
|
||||||
using CtrEditor.Siemens;
|
using CtrEditor.Siemens;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
// using System.Windows.Forms;
|
|
||||||
using Newtonsoft.Json;
|
using Newtonsoft.Json;
|
||||||
using System.Windows.Data;
|
|
||||||
using System.Windows;
|
using System.Windows;
|
||||||
using CtrEditor.Convertidores;
|
using CtrEditor.Convertidores;
|
||||||
using CtrEditor.Simulacion;
|
using CtrEditor.Simulacion;
|
||||||
using System.Diagnostics;
|
using System.Diagnostics;
|
||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
|
using CommunityToolkit.Mvvm.ComponentModel;
|
||||||
|
|
||||||
|
|
||||||
namespace CtrEditor
|
namespace CtrEditor
|
||||||
{
|
{
|
||||||
|
|
||||||
public class MainViewModel : INotifyPropertyChanged
|
public partial class MainViewModel : ObservableObject
|
||||||
{
|
{
|
||||||
public DatosDeTrabajo datosDeTrabajo { get; }
|
public Stopwatch stopwatch_Sim;
|
||||||
public ObservableCollection<string> listaImagenes { get; private set; } // Publicación de las claves del diccionario
|
|
||||||
public ObservableCollection<TipoSimulable> ListaOsBase { get; } = new ObservableCollection<TipoSimulable>();
|
private double stopwatch_SimPLC_last;
|
||||||
public Stopwatch stopwatch_PLCRefresh;
|
private double stopwatch_SimModel_last;
|
||||||
public Stopwatch stopwatch_SimRefresh;
|
|
||||||
private float TiempoDesdeStartSimulacion;
|
private float TiempoDesdeStartSimulacion;
|
||||||
private bool Debug_SimulacionCreado = false;
|
private bool Debug_SimulacionCreado = false;
|
||||||
|
|
||||||
|
@ -35,6 +34,15 @@ namespace CtrEditor
|
||||||
|
|
||||||
private readonly DispatcherTimer _timerSimulacion;
|
private readonly DispatcherTimer _timerSimulacion;
|
||||||
|
|
||||||
|
[ObservableProperty]
|
||||||
|
private DatosDeTrabajo datosDeTrabajo;
|
||||||
|
|
||||||
|
[ObservableProperty]
|
||||||
|
private ObservableCollection<string> listaImagenes; // Publicación de las claves del diccionario
|
||||||
|
|
||||||
|
[ObservableProperty]
|
||||||
|
public ObservableCollection<TipoSimulable> listaOsBase;
|
||||||
|
|
||||||
public ICommand StartSimulationCommand { get; }
|
public ICommand StartSimulationCommand { get; }
|
||||||
public ICommand StopSimulationCommand { get; }
|
public ICommand StopSimulationCommand { get; }
|
||||||
public ICommand ItemDoubleClickCommand { get; private set; }
|
public ICommand ItemDoubleClickCommand { get; private set; }
|
||||||
|
@ -47,7 +55,6 @@ namespace CtrEditor
|
||||||
|
|
||||||
public ICommand TBEliminarUserControlCommand { get; }
|
public ICommand TBEliminarUserControlCommand { get; }
|
||||||
public ICommand TBDuplicarUserControlCommand { get; }
|
public ICommand TBDuplicarUserControlCommand { get; }
|
||||||
|
|
||||||
|
|
||||||
public ICommand OpenWorkDirectoryCommand { get; }
|
public ICommand OpenWorkDirectoryCommand { get; }
|
||||||
|
|
||||||
|
@ -57,58 +64,33 @@ namespace CtrEditor
|
||||||
|
|
||||||
// Propiedades
|
// Propiedades
|
||||||
|
|
||||||
private bool isSimulationRunning;
|
|
||||||
private bool isConnected;
|
|
||||||
private bool habilitarEliminarUserControl;
|
private bool habilitarEliminarUserControl;
|
||||||
public PLCViewModel plcViewModelData;
|
|
||||||
private osBase _selectedItemOsList;
|
|
||||||
private string _selectedImage = null;
|
|
||||||
private float _left;
|
|
||||||
private float _top;
|
|
||||||
private MainWindow mainWindow;
|
private MainWindow mainWindow;
|
||||||
|
|
||||||
public MainWindow MainWindow { get => mainWindow; set => mainWindow = value; }
|
public MainWindow MainWindow { get => mainWindow; set => mainWindow = value; }
|
||||||
|
|
||||||
public float CanvasLeft
|
|
||||||
|
[ObservableProperty]
|
||||||
|
private float canvasLeft;
|
||||||
|
|
||||||
|
[ObservableProperty]
|
||||||
|
private float canvasTop;
|
||||||
|
|
||||||
|
[ObservableProperty]
|
||||||
|
private bool isSimulationRunning;
|
||||||
|
|
||||||
|
partial void OnIsSimulationRunningChanged(bool value)
|
||||||
{
|
{
|
||||||
get => _left;
|
CommandManager.InvalidateRequerySuggested(); // Notificar que el estado de los comandos ha cambiado
|
||||||
set
|
|
||||||
{
|
|
||||||
_left = value;
|
|
||||||
OnPropertyChanged(nameof(CanvasLeft));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public float CanvasTop
|
|
||||||
{
|
|
||||||
get => _top;
|
|
||||||
set
|
|
||||||
{
|
|
||||||
_top = value;
|
|
||||||
OnPropertyChanged(nameof(CanvasTop));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool IsSimulationRunning
|
[ObservableProperty]
|
||||||
{
|
private bool isConnected;
|
||||||
get => isSimulationRunning;
|
|
||||||
set
|
|
||||||
{
|
|
||||||
isSimulationRunning = value;
|
|
||||||
OnPropertyChanged(nameof(IsSimulationRunning));
|
|
||||||
CommandManager.InvalidateRequerySuggested(); // Notificar que el estado de los comandos ha cambiado
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public bool IsConnected
|
partial void OnIsConnectedChanged(bool value)
|
||||||
{
|
{
|
||||||
get => isConnected;
|
CommandManager.InvalidateRequerySuggested();
|
||||||
set
|
|
||||||
{
|
|
||||||
isConnected = value;
|
|
||||||
OnPropertyChanged(nameof(IsConnected));
|
|
||||||
CommandManager.InvalidateRequerySuggested();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public string directorioTrabajo
|
public string directorioTrabajo
|
||||||
|
@ -120,90 +102,51 @@ namespace CtrEditor
|
||||||
{
|
{
|
||||||
EstadoPersistente.Instance.directorio = value; // Actualizar el estado persistente
|
EstadoPersistente.Instance.directorio = value; // Actualizar el estado persistente
|
||||||
EstadoPersistente.Instance.GuardarEstado(); // Guardar el estado actualizado
|
EstadoPersistente.Instance.GuardarEstado(); // Guardar el estado actualizado
|
||||||
datosDeTrabajo.CargarImagenes();
|
DatosDeTrabajo.CargarImagenes();
|
||||||
listaImagenes = new ObservableCollection<string>(datosDeTrabajo.Imagenes.Keys); // Actualizar claves
|
ListaImagenes = new ObservableCollection<string>(DatosDeTrabajo.Imagenes.Keys); // Actualizar claves
|
||||||
SelectedImage = null;
|
SelectedImage = null;
|
||||||
if (listaImagenes.FirstOrDefault() != null)
|
if (ListaImagenes.FirstOrDefault() != null)
|
||||||
SelectedImage = listaImagenes.FirstOrDefault();
|
SelectedImage = ListaImagenes.FirstOrDefault();
|
||||||
OnPropertyChanged(nameof(directorioTrabajo)); // Notificar el cambio de propiedad
|
OnPropertyChanged(nameof(directorioTrabajo)); // Notificar el cambio de propiedad
|
||||||
OnPropertyChanged(nameof(listaImagenes)); // Notificar que la lista de imágenes ha cambiado
|
OnPropertyChanged(nameof(ListaImagenes)); // Notificar que la lista de imágenes ha cambiado
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public PLCViewModel PLCViewModel
|
[ObservableProperty]
|
||||||
|
private PLCViewModel pLCViewModel;
|
||||||
|
|
||||||
|
[ObservableProperty]
|
||||||
|
private string selectedImage;
|
||||||
|
|
||||||
|
partial void OnSelectedImageChanged(string value)
|
||||||
{
|
{
|
||||||
get { return plcViewModelData; }
|
if (value != null)
|
||||||
set
|
|
||||||
{
|
{
|
||||||
plcViewModelData = value;
|
StopSimulation();
|
||||||
OnPropertyChanged(nameof(PLCViewModel));
|
// SaveStateObjetosSimulables(); // Guarda el estado antes de cambiar la imagen
|
||||||
|
ImageSelected?.Invoke(this, datosDeTrabajo.Imagenes[value]); // Dispara el evento con la nueva ruta de imagen
|
||||||
|
LoadStateObjetosSimulables();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public string SelectedImage
|
[ObservableProperty]
|
||||||
|
private osBase selectedItemOsList;
|
||||||
|
|
||||||
|
partial void OnSelectedItemOsListChanged(osBase value)
|
||||||
{
|
{
|
||||||
get => _selectedImage;
|
if (value != null)
|
||||||
set
|
habilitarEliminarUserControl = true;
|
||||||
{
|
else
|
||||||
if (_selectedImage != value && value != null)
|
habilitarEliminarUserControl = false;
|
||||||
{
|
|
||||||
StopSimulation();
|
|
||||||
SaveStateObjetosSimulables(); // Guarda el estado antes de cambiar la imagen
|
|
||||||
_selectedImage = value;
|
|
||||||
ImageSelected?.Invoke(this, datosDeTrabajo.Imagenes[value]); // Dispara el evento con la nueva ruta de imagen
|
|
||||||
LoadStateObjetosSimulables();
|
|
||||||
}
|
|
||||||
_selectedImage = value;
|
|
||||||
OnPropertyChanged(nameof(SelectedImage));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public osBase SelectedItemOsList
|
[ObservableProperty]
|
||||||
{
|
private TipoSimulable selectedItem;
|
||||||
get => _selectedItemOsList;
|
|
||||||
set
|
|
||||||
{
|
|
||||||
if (_selectedItemOsList != value)
|
|
||||||
{
|
|
||||||
if (value != null)
|
|
||||||
habilitarEliminarUserControl = true;
|
|
||||||
else
|
|
||||||
habilitarEliminarUserControl = false;
|
|
||||||
|
|
||||||
_selectedItemOsList = value;
|
|
||||||
OnPropertyChanged(nameof(SelectedItemOsList));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private TipoSimulable _selectedItem = null;
|
|
||||||
public TipoSimulable SelectedItem
|
|
||||||
{
|
|
||||||
get => _selectedItem;
|
|
||||||
set
|
|
||||||
{
|
|
||||||
if (_selectedItem != value)
|
|
||||||
{
|
|
||||||
_selectedItem = value;
|
|
||||||
OnPropertyChanged(nameof(SelectedItem)); // Notificar que la propiedad ha cambiado
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public ObservableCollection<osBase> ObjetosSimulables
|
|
||||||
{
|
|
||||||
get => _objetosSimulables;
|
|
||||||
set
|
|
||||||
{
|
|
||||||
if (_objetosSimulables != value)
|
|
||||||
{
|
|
||||||
_objetosSimulables = value;
|
|
||||||
OnPropertyChanged(nameof(ObjetosSimulables));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
[ObservableProperty]
|
||||||
|
public ObservableCollection<osBase> objetosSimulables;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Constructor
|
// Constructor
|
||||||
//
|
//
|
||||||
|
@ -213,9 +156,12 @@ namespace CtrEditor
|
||||||
OpenWorkDirectoryCommand = new RelayCommand(OpenWorkDirectory);
|
OpenWorkDirectoryCommand = new RelayCommand(OpenWorkDirectory);
|
||||||
datosDeTrabajo = new DatosDeTrabajo();
|
datosDeTrabajo = new DatosDeTrabajo();
|
||||||
|
|
||||||
|
ObjetosSimulables = new ObservableCollection<osBase>();
|
||||||
|
ListaOsBase = new ObservableCollection<TipoSimulable>();
|
||||||
|
|
||||||
// Inicializa el PLCViewModel
|
// Inicializa el PLCViewModel
|
||||||
plcViewModelData = new PLCViewModel();
|
PLCViewModel = new PLCViewModel();
|
||||||
plcViewModelData.RefreshEvent += OnRefreshEvent;
|
PLCViewModel.RefreshEvent += OnRefreshEvent;
|
||||||
|
|
||||||
InitializeTipoSimulableList();
|
InitializeTipoSimulableList();
|
||||||
|
|
||||||
|
@ -237,8 +183,8 @@ namespace CtrEditor
|
||||||
TBEliminarUserControlCommand = new RelayCommand(EliminarUserControl, () => habilitarEliminarUserControl);
|
TBEliminarUserControlCommand = new RelayCommand(EliminarUserControl, () => habilitarEliminarUserControl);
|
||||||
TBDuplicarUserControlCommand = new RelayCommand(DuplicarUserControl, () => habilitarEliminarUserControl);
|
TBDuplicarUserControlCommand = new RelayCommand(DuplicarUserControl, () => habilitarEliminarUserControl);
|
||||||
|
|
||||||
stopwatch_PLCRefresh = new Stopwatch();
|
stopwatch_Sim = new Stopwatch();
|
||||||
stopwatch_SimRefresh = new Stopwatch();
|
stopwatch_Sim.Start();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void LoadInitialData()
|
public void LoadInitialData()
|
||||||
|
@ -386,8 +332,6 @@ namespace CtrEditor
|
||||||
Debug_SimulacionCreado = true;
|
Debug_SimulacionCreado = true;
|
||||||
|
|
||||||
_timerSimulacion.Start();
|
_timerSimulacion.Start();
|
||||||
simulationManager.stopwatch.Start();
|
|
||||||
stopwatch_SimRefresh.Start();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void StopSimulation()
|
private void StopSimulation()
|
||||||
|
@ -403,24 +347,19 @@ namespace CtrEditor
|
||||||
Debug_SimulacionCreado = false;
|
Debug_SimulacionCreado = false;
|
||||||
}
|
}
|
||||||
_timerSimulacion.Stop();
|
_timerSimulacion.Stop();
|
||||||
simulationManager.stopwatch.Stop();
|
|
||||||
stopwatch_SimRefresh.Stop();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void OnTickSimulacion(object sender, EventArgs e)
|
private void OnTickSimulacion(object sender, EventArgs e)
|
||||||
{
|
{
|
||||||
// Detener el cronómetro y obtener el tiempo transcurrido en milisegundos
|
// Detener el cronómetro y obtener el tiempo transcurrido en milisegundos
|
||||||
stopwatch_SimRefresh.Stop();
|
var elapsedMilliseconds = stopwatch_Sim.Elapsed.TotalMilliseconds - stopwatch_SimModel_last;
|
||||||
float elapsedMilliseconds = (float)stopwatch_SimRefresh.Elapsed.TotalMilliseconds;
|
stopwatch_SimModel_last = stopwatch_Sim.Elapsed.TotalMilliseconds;
|
||||||
|
|
||||||
// Eliminar el diseño de Debug luego de 2 segundos
|
// Eliminar el diseño de Debug luego de 2 segundos
|
||||||
if (TiempoDesdeStartSimulacion > 2000)
|
if (TiempoDesdeStartSimulacion > 2000)
|
||||||
simulationManager.Debug_ClearSimulationShapes();
|
simulationManager.Debug_ClearSimulationShapes();
|
||||||
else
|
else
|
||||||
TiempoDesdeStartSimulacion += elapsedMilliseconds;
|
TiempoDesdeStartSimulacion += (float)elapsedMilliseconds;
|
||||||
|
|
||||||
// Reiniciar el cronómetro para la próxima medición
|
|
||||||
stopwatch_SimRefresh.Restart();
|
|
||||||
|
|
||||||
foreach (var objetoSimulable in ObjetosSimulables)
|
foreach (var objetoSimulable in ObjetosSimulables)
|
||||||
objetoSimulable.UpdateGeometryStep();
|
objetoSimulable.UpdateGeometryStep();
|
||||||
|
@ -441,13 +380,12 @@ namespace CtrEditor
|
||||||
|
|
||||||
private void ConnectPLC()
|
private void ConnectPLC()
|
||||||
{
|
{
|
||||||
plcViewModelData.Connect();
|
PLCViewModel.Connect();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void DisconnectPLC()
|
private void DisconnectPLC()
|
||||||
{
|
{
|
||||||
plcViewModelData.Disconnect();
|
PLCViewModel.Disconnect();
|
||||||
IsConnected = false;
|
IsConnected = false;
|
||||||
foreach (var objetoSimulable in ObjetosSimulables)
|
foreach (var objetoSimulable in ObjetosSimulables)
|
||||||
objetoSimulable.SetPLC(null);
|
objetoSimulable.SetPLC(null);
|
||||||
|
@ -456,28 +394,23 @@ namespace CtrEditor
|
||||||
|
|
||||||
private void OnRefreshEvent(object sender, EventArgs e)
|
private void OnRefreshEvent(object sender, EventArgs e)
|
||||||
{
|
{
|
||||||
if (plcViewModelData.IsConnected)
|
if (PLCViewModel.IsConnected)
|
||||||
{
|
{
|
||||||
if (!isConnected)
|
if (!isConnected)
|
||||||
{
|
{
|
||||||
IsConnected = true;
|
IsConnected = true;
|
||||||
foreach (var objetoSimulable in ObjetosSimulables)
|
foreach (var objetoSimulable in ObjetosSimulables)
|
||||||
objetoSimulable.SetPLC(plcViewModelData.PLCInterface);
|
objetoSimulable.SetPLC(PLCViewModel.PLCInterface);
|
||||||
|
|
||||||
}
|
}
|
||||||
// Detener el cronómetro y obtener el tiempo transcurrido en milisegundos
|
// Detener el cronómetro y obtener el tiempo transcurrido en milisegundos
|
||||||
stopwatch_PLCRefresh.Stop();
|
var elapsedMilliseconds = stopwatch_Sim.Elapsed.TotalMilliseconds - stopwatch_SimPLC_last;
|
||||||
float elapsedMilliseconds = (float)stopwatch_PLCRefresh.Elapsed.TotalMilliseconds;
|
stopwatch_SimPLC_last = stopwatch_Sim.Elapsed.TotalMilliseconds;
|
||||||
|
|
||||||
|
|
||||||
// Reiniciar el cronómetro para la próxima medición
|
// Reiniciar el cronómetro para la próxima medición
|
||||||
stopwatch_PLCRefresh.Restart();
|
|
||||||
|
|
||||||
foreach (var objetoSimulable in ObjetosSimulables)
|
foreach (var objetoSimulable in ObjetosSimulables)
|
||||||
objetoSimulable.UpdatePLC(plcViewModelData.PLCInterface, (int) elapsedMilliseconds);
|
objetoSimulable.UpdatePLC(PLCViewModel.PLCInterface, (int) elapsedMilliseconds);
|
||||||
} else
|
}
|
||||||
stopwatch_PLCRefresh.Stop();
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void OpenWorkDirectory()
|
private void OpenWorkDirectory()
|
||||||
|
@ -500,13 +433,13 @@ namespace CtrEditor
|
||||||
|
|
||||||
public void SaveStateObjetosSimulables()
|
public void SaveStateObjetosSimulables()
|
||||||
{
|
{
|
||||||
if (_selectedImage != null)
|
if (SelectedImage != null)
|
||||||
{
|
{
|
||||||
StopSimulation();
|
StopSimulation();
|
||||||
DisconnectPLC();
|
DisconnectPLC();
|
||||||
|
|
||||||
// Ruta del archivo a ser guardado
|
// Ruta del archivo a ser guardado
|
||||||
var path = datosDeTrabajo.ObtenerPathImagenConExtension(_selectedImage, ".json");
|
var path = DatosDeTrabajo.ObtenerPathImagenConExtension(SelectedImage, ".json");
|
||||||
|
|
||||||
// Verificar si el archivo ya existe y crear un respaldo
|
// Verificar si el archivo ya existe y crear un respaldo
|
||||||
if (File.Exists(path))
|
if (File.Exists(path))
|
||||||
|
@ -552,9 +485,9 @@ namespace CtrEditor
|
||||||
DisconnectPLC();
|
DisconnectPLC();
|
||||||
ObjetosSimulables.Clear();
|
ObjetosSimulables.Clear();
|
||||||
simulationManager.Clear();
|
simulationManager.Clear();
|
||||||
if (_selectedImage != null)
|
if (SelectedImage != null)
|
||||||
{
|
{
|
||||||
string jsonPath = datosDeTrabajo.ObtenerPathImagenConExtension(_selectedImage, ".json");
|
string jsonPath = datosDeTrabajo.ObtenerPathImagenConExtension(SelectedImage, ".json");
|
||||||
if (File.Exists(jsonPath))
|
if (File.Exists(jsonPath))
|
||||||
{
|
{
|
||||||
string jsonString = File.ReadAllText(jsonPath);
|
string jsonString = File.ReadAllText(jsonPath);
|
||||||
|
@ -580,7 +513,7 @@ namespace CtrEditor
|
||||||
PixelToMeter.Instance.calc = simulationData.UnitConverter;
|
PixelToMeter.Instance.calc = simulationData.UnitConverter;
|
||||||
|
|
||||||
// Re-register to the events
|
// Re-register to the events
|
||||||
plcViewModelData.RefreshEvent += OnRefreshEvent;
|
PLCViewModel.RefreshEvent += OnRefreshEvent;
|
||||||
|
|
||||||
// Recorrer la colección de objetos simulables
|
// Recorrer la colección de objetos simulables
|
||||||
foreach (var objetoSimulable in ObjetosSimulables)
|
foreach (var objetoSimulable in ObjetosSimulables)
|
||||||
|
@ -598,14 +531,6 @@ namespace CtrEditor
|
||||||
UserControlFactory.CargarPropiedadesosDatos(selectedObject,PanelEdicion, Resources);
|
UserControlFactory.CargarPropiedadesosDatos(selectedObject,PanelEdicion, Resources);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Implementación de INotifyPropertyChanged...
|
|
||||||
|
|
||||||
public event PropertyChangedEventHandler PropertyChanged;
|
|
||||||
protected void OnPropertyChanged([CallerMemberName] string propertyName = null)
|
|
||||||
{
|
|
||||||
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
|
|
||||||
}
|
|
||||||
|
|
||||||
private RelayCommand saveCommand;
|
private RelayCommand saveCommand;
|
||||||
public ICommand SaveCommand => saveCommand ??= new RelayCommand(Save);
|
public ICommand SaveCommand => saveCommand ??= new RelayCommand(Save);
|
||||||
|
|
||||||
|
@ -624,15 +549,15 @@ namespace CtrEditor
|
||||||
}
|
}
|
||||||
public class SimulationData
|
public class SimulationData
|
||||||
{
|
{
|
||||||
public ObservableCollection<osBase> ObjetosSimulables { get; set; }
|
public ObservableCollection<osBase>? ObjetosSimulables { get; set; }
|
||||||
public UnitConverter UnitConverter { get; set; }
|
public UnitConverter? UnitConverter { get; set; }
|
||||||
public PLCViewModel PLC_ConnectionData { get; set; }
|
public PLCViewModel? PLC_ConnectionData { get; set; }
|
||||||
}
|
}
|
||||||
|
|
||||||
public class TipoSimulable
|
public class TipoSimulable
|
||||||
{
|
{
|
||||||
public string Nombre { get; set; }
|
public string? Nombre { get; set; }
|
||||||
public Type Tipo { get; set; }
|
public Type? Tipo { get; set; }
|
||||||
}
|
}
|
||||||
|
|
||||||
public class TickSimulacionEventArgs : EventArgs
|
public class TickSimulacionEventArgs : EventArgs
|
||||||
|
|
|
@ -15,6 +15,7 @@
|
||||||
|
|
||||||
<Window.Resources>
|
<Window.Resources>
|
||||||
<convert:FloatToFormattedStringConverter x:Key="floatFormatter"/>
|
<convert:FloatToFormattedStringConverter x:Key="floatFormatter"/>
|
||||||
|
<convert:DoubleToFormattedStringConverter x:Key="doubleFormatter"/>
|
||||||
<convert:BrushToColorNameConverter x:Key="BrushToColorNameConverter"/>
|
<convert:BrushToColorNameConverter x:Key="BrushToColorNameConverter"/>
|
||||||
|
|
||||||
<!-- Style for Start/Stop Button -->
|
<!-- Style for Start/Stop Button -->
|
||||||
|
@ -65,7 +66,7 @@
|
||||||
<RowDefinition Height="2*"/>
|
<RowDefinition Height="2*"/>
|
||||||
<RowDefinition Height="Auto"/>
|
<RowDefinition Height="Auto"/>
|
||||||
</Grid.RowDefinitions>
|
</Grid.RowDefinitions>
|
||||||
<ListBox x:Name="ListaImagenes" Grid.Row="0" Margin="5" ItemsSource="{Binding listaImagenes}" SelectedItem="{Binding SelectedImage}" />
|
<ListBox x:Name="ListaImagenes" Grid.Row="0" Margin="5" ItemsSource="{Binding ListaImagenes}" SelectedItem="{Binding SelectedImage}" />
|
||||||
<ListBox x:Name="ListaFunciones" Grid.Row="1" Margin="5" ItemsSource="{Binding ListaOsBase}" DisplayMemberPath="Nombre" SelectedItem="{Binding SelectedItem}">
|
<ListBox x:Name="ListaFunciones" Grid.Row="1" Margin="5" ItemsSource="{Binding ListaOsBase}" DisplayMemberPath="Nombre" SelectedItem="{Binding SelectedItem}">
|
||||||
<i:Interaction.Triggers>
|
<i:Interaction.Triggers>
|
||||||
<i:EventTrigger EventName="MouseDoubleClick">
|
<i:EventTrigger EventName="MouseDoubleClick">
|
||||||
|
|
|
@ -28,25 +28,39 @@ namespace CtrEditor.ObjetosSim
|
||||||
}
|
}
|
||||||
|
|
||||||
[ObservableProperty]
|
[ObservableProperty]
|
||||||
public float offsetLeftSalida;
|
private float offsetLeftSalida;
|
||||||
[ObservableProperty]
|
[ObservableProperty]
|
||||||
public float offsetTopSalida;
|
private float offsetTopSalida;
|
||||||
[ObservableProperty]
|
[ObservableProperty]
|
||||||
public bool consenso;
|
private bool consenso;
|
||||||
[ObservableProperty]
|
[ObservableProperty]
|
||||||
public float botellas_hora;
|
private float botellas_hora;
|
||||||
|
|
||||||
|
partial void OnBotellas_horaChanged(float value)
|
||||||
|
{
|
||||||
|
Botellas_segundo = value / 3600;
|
||||||
|
}
|
||||||
|
|
||||||
[ObservableProperty]
|
[ObservableProperty]
|
||||||
public float velocidad_actual_percentual;
|
private float botellas_segundo;
|
||||||
|
|
||||||
|
partial void OnBotellas_segundoChanged(float value)
|
||||||
|
{
|
||||||
|
Botellas_hora = value * 3600;
|
||||||
|
}
|
||||||
|
|
||||||
[ObservableProperty]
|
[ObservableProperty]
|
||||||
public float diametro_botella;
|
private float velocidad_actual_percentual;
|
||||||
[ObservableProperty]
|
[ObservableProperty]
|
||||||
public string tag_consenso;
|
private float diametro_botella;
|
||||||
[ObservableProperty]
|
[ObservableProperty]
|
||||||
public float ancho;
|
private string tag_consenso;
|
||||||
[ObservableProperty]
|
[ObservableProperty]
|
||||||
public float alto;
|
private float ancho;
|
||||||
[ObservableProperty]
|
[ObservableProperty]
|
||||||
public float angulo;
|
private float alto;
|
||||||
|
[ObservableProperty]
|
||||||
|
private float angulo;
|
||||||
|
|
||||||
public osFiller()
|
public osFiller()
|
||||||
{
|
{
|
||||||
|
@ -70,7 +84,7 @@ namespace CtrEditor.ObjetosSim
|
||||||
TiempoRestante -= elapsedMilliseconds / 1000.0f;
|
TiempoRestante -= elapsedMilliseconds / 1000.0f;
|
||||||
if (TiempoRestante <= 0)
|
if (TiempoRestante <= 0)
|
||||||
{
|
{
|
||||||
TiempoRestante = 3600 / (Botellas_hora * (Velocidad_actual_percentual / 100.0f));
|
TiempoRestante += 3600 / (Botellas_hora * (Velocidad_actual_percentual / 100.0f));
|
||||||
|
|
||||||
var X = Left + OffsetLeftSalida;
|
var X = Left + OffsetLeftSalida;
|
||||||
var Y = Top + OffsetTopSalida;
|
var Y = Top + OffsetTopSalida;
|
|
@ -20,7 +20,6 @@ namespace CtrEditor.ObjetosSim
|
||||||
|
|
||||||
private float _velocidadActual;
|
private float _velocidadActual;
|
||||||
private osBase _osMotor = null;
|
private osBase _osMotor = null;
|
||||||
private string _motor;
|
|
||||||
|
|
||||||
private simCurve Simulation_TransporteCurva;
|
private simCurve Simulation_TransporteCurva;
|
||||||
|
|
||||||
|
@ -101,7 +100,7 @@ namespace CtrEditor.ObjetosSim
|
||||||
VelocidadActual = motor.Velocidad;
|
VelocidadActual = motor.Velocidad;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
_osMotor = ObtenerLink(_motor, typeof(osVMmotorSim));
|
_osMotor = ObtenerLink(Motor, typeof(osVMmotorSim));
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void ucLoaded()
|
public override void ucLoaded()
|
|
@ -30,20 +30,13 @@ namespace CtrEditor.ObjetosSim
|
||||||
set => SetProperty(ref nombre, value);
|
set => SetProperty(ref nombre, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[ObservableProperty]
|
||||||
private float velocidadActual;
|
private float velocidadActual;
|
||||||
public float VelocidadActual
|
|
||||||
|
partial void OnVelocidadActualChanged(float value)
|
||||||
{
|
{
|
||||||
get => velocidadActual;
|
SimGeometria?.SetSpeed(value);
|
||||||
set
|
ActualizarAnimacionStoryBoardTransporte(VelocidadActual);
|
||||||
{
|
|
||||||
if (value != velocidadActual)
|
|
||||||
{
|
|
||||||
velocidadActual = value;
|
|
||||||
SimGeometria?.SetSpeed(value);
|
|
||||||
SetProperty(ref velocidadActual, value);
|
|
||||||
ActualizarAnimacionStoryBoardTransporte(VelocidadActual);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
[ObservableProperty]
|
[ObservableProperty]
|
||||||
|
@ -58,6 +51,12 @@ namespace CtrEditor.ObjetosSim
|
||||||
public float ancho;
|
public float ancho;
|
||||||
[ObservableProperty]
|
[ObservableProperty]
|
||||||
public float alto;
|
public float alto;
|
||||||
|
|
||||||
|
partial void OnAltoChanged(float value)
|
||||||
|
{
|
||||||
|
ActualizarGeometrias();
|
||||||
|
}
|
||||||
|
|
||||||
[ObservableProperty]
|
[ObservableProperty]
|
||||||
public float angulo;
|
public float angulo;
|
||||||
[ObservableProperty]
|
[ObservableProperty]
|
||||||
|
@ -81,6 +80,7 @@ namespace CtrEditor.ObjetosSim
|
||||||
UpdateOrCreateLine(Guia_Superior, uc.GuiaSuperior);
|
UpdateOrCreateLine(Guia_Superior, uc.GuiaSuperior);
|
||||||
UpdateOrCreateLine(Guia_Inferior, uc.GuiaInferior) ;
|
UpdateOrCreateLine(Guia_Inferior, uc.GuiaInferior) ;
|
||||||
|
|
||||||
|
SimGeometria.DistanceGuide2Guide = Alto;
|
||||||
SimGeometria.Speed = VelocidadActual;
|
SimGeometria.Speed = VelocidadActual;
|
||||||
ActualizarAnimacionStoryBoardTransporte(VelocidadActual);
|
ActualizarAnimacionStoryBoardTransporte(VelocidadActual);
|
||||||
}
|
}
|
||||||
|
@ -126,6 +126,8 @@ namespace CtrEditor.ObjetosSim
|
||||||
if (_visualRepresentation is ucTransporteGuias uc)
|
if (_visualRepresentation is ucTransporteGuias uc)
|
||||||
{
|
{
|
||||||
SimGeometria = AddRectangle(simulationManager, uc.Transporte, Alto, Ancho, Angulo);
|
SimGeometria = AddRectangle(simulationManager, uc.Transporte, Alto, Ancho, Angulo);
|
||||||
|
SimGeometria.TransportWithGuides = true;
|
||||||
|
SimGeometria.DistanceGuide2Guide = Alto;
|
||||||
Guia_Superior = AddLine(simulationManager, uc.GuiaSuperior);
|
Guia_Superior = AddLine(simulationManager, uc.GuiaSuperior);
|
||||||
Guia_Inferior = AddLine(simulationManager, uc.GuiaInferior);
|
Guia_Inferior = AddLine(simulationManager, uc.GuiaInferior);
|
||||||
|
|
|
@ -0,0 +1,46 @@
|
||||||
|
<UserControl x:Class="CtrEditor.ObjetosSim.ucGearEncoder"
|
||||||
|
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.UserControls"
|
||||||
|
mc:Ignorable="d"
|
||||||
|
xmlns:vm="clr-namespace:CtrEditor.ObjetosSim"
|
||||||
|
xmlns:convert="clr-namespace:CtrEditor.Convertidores">
|
||||||
|
|
||||||
|
<UserControl.Resources>
|
||||||
|
<convert:MeterToPixelConverter x:Key="MeterToPixelConverter"/>
|
||||||
|
</UserControl.Resources>
|
||||||
|
|
||||||
|
<UserControl.DataContext>
|
||||||
|
<vm:osGearEncoder Dientes="9"/>
|
||||||
|
</UserControl.DataContext>
|
||||||
|
|
||||||
|
<Grid>
|
||||||
|
<Grid.ColumnDefinitions>
|
||||||
|
<ColumnDefinition Width="{Binding Radio_Externo, Converter={StaticResource MeterToPixelConverter}, ConverterParameter=1}"/>
|
||||||
|
<ColumnDefinition Width="{Binding Radio_Externo, Converter={StaticResource MeterToPixelConverter}, ConverterParameter=0.02}"/>
|
||||||
|
<!-- Espacio entre el Rectangle y el Canvas -->
|
||||||
|
<ColumnDefinition Width="{Binding Radio_Externo, Converter={StaticResource MeterToPixelConverter}, ConverterParameter=1}"/>
|
||||||
|
</Grid.ColumnDefinitions>
|
||||||
|
|
||||||
|
<!-- StackPanel to contain the Rectangle -->
|
||||||
|
<Canvas Grid.Column="0" HorizontalAlignment="Right">
|
||||||
|
<Rectangle Canvas.Top="{Binding Radio_Externo, Converter={StaticResource MeterToPixelConverter}, ConverterParameter=-0.12}"
|
||||||
|
Grid.Column="0" Width="{Binding Radio_Externo, Converter={StaticResource MeterToPixelConverter}, ConverterParameter=1}"
|
||||||
|
Height="{Binding Radio_Externo, Converter={StaticResource MeterToPixelConverter}, ConverterParameter=0.25}"
|
||||||
|
Fill="{Binding Color_oculto}"
|
||||||
|
HorizontalAlignment="Left" VerticalAlignment="Center"/>
|
||||||
|
</Canvas>
|
||||||
|
<Canvas Grid.Column="0" HorizontalAlignment="Left">
|
||||||
|
<Canvas.RenderTransform>
|
||||||
|
<RotateTransform Angle="{Binding Angulo}" CenterX="0" CenterY="0"/>
|
||||||
|
</Canvas.RenderTransform>
|
||||||
|
|
||||||
|
<local:GearControl ToothWidthRatio="{Binding Ancho_Dientes}" TeethCount="{Binding Dientes}"
|
||||||
|
InnerRadius="{Binding Radio_Interno, Converter={StaticResource MeterToPixelConverter}}"
|
||||||
|
OuterRadius="{Binding Radio_Externo, Converter={StaticResource MeterToPixelConverter}}"
|
||||||
|
HorizontalAlignment="Center" VerticalAlignment="Center" />
|
||||||
|
</Canvas>
|
||||||
|
</Grid>
|
||||||
|
</UserControl>
|
|
@ -5,8 +5,9 @@ using System.Windows.Controls;
|
||||||
using System.Windows.Media;
|
using System.Windows.Media;
|
||||||
using Newtonsoft.Json;
|
using Newtonsoft.Json;
|
||||||
using CommunityToolkit.Mvvm.ComponentModel;
|
using CommunityToolkit.Mvvm.ComponentModel;
|
||||||
|
using System.Diagnostics;
|
||||||
|
|
||||||
namespace CtrEditor.ObjetosSim.UserControls
|
namespace CtrEditor.ObjetosSim
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Interaction logic for ucGearEncoder.xaml
|
/// Interaction logic for ucGearEncoder.xaml
|
||||||
|
@ -14,6 +15,8 @@ namespace CtrEditor.ObjetosSim.UserControls
|
||||||
public partial class osGearEncoder : osBase, IosBase
|
public partial class osGearEncoder : osBase, IosBase
|
||||||
{
|
{
|
||||||
private osBase _osMotor = null;
|
private osBase _osMotor = null;
|
||||||
|
private Stopwatch Stopwatch = new Stopwatch();
|
||||||
|
private double stopwatch_last = 0;
|
||||||
|
|
||||||
// Otros datos y métodos relevantes para la simulación
|
// Otros datos y métodos relevantes para la simulación
|
||||||
|
|
||||||
|
@ -21,6 +24,7 @@ namespace CtrEditor.ObjetosSim.UserControls
|
||||||
{
|
{
|
||||||
return "Ruota Fonica";
|
return "Ruota Fonica";
|
||||||
}
|
}
|
||||||
|
|
||||||
private string nombre = NombreClase();
|
private string nombre = NombreClase();
|
||||||
public override string Nombre
|
public override string Nombre
|
||||||
{
|
{
|
||||||
|
@ -32,10 +36,56 @@ namespace CtrEditor.ObjetosSim.UserControls
|
||||||
public string tag;
|
public string tag;
|
||||||
[ObservableProperty]
|
[ObservableProperty]
|
||||||
public bool pulso;
|
public bool pulso;
|
||||||
|
|
||||||
|
partial void OnPulsoChanged(bool value)
|
||||||
|
{
|
||||||
|
if (value)
|
||||||
|
{
|
||||||
|
var dTime = Stopwatch.ElapsedMilliseconds - stopwatch_last;
|
||||||
|
stopwatch_last = Stopwatch.ElapsedMilliseconds;
|
||||||
|
Tiempo_Pulso = (float)dTime;
|
||||||
|
}
|
||||||
|
|
||||||
|
EscribirBitTag(Tag, Pulso);
|
||||||
|
if (value)
|
||||||
|
Color_oculto = Brushes.LightGreen;
|
||||||
|
else
|
||||||
|
Color_oculto = Brushes.Gray;
|
||||||
|
}
|
||||||
|
|
||||||
|
[ObservableProperty]
|
||||||
|
private Brush color_oculto;
|
||||||
[ObservableProperty]
|
[ObservableProperty]
|
||||||
public float velocidadActual;
|
public float velocidadActual;
|
||||||
[ObservableProperty]
|
[ObservableProperty]
|
||||||
public float angulo;
|
public double angulo;
|
||||||
|
|
||||||
|
partial void OnAnguloChanged(double value)
|
||||||
|
{
|
||||||
|
// Generar pulsos cuadrados en función del ángulo
|
||||||
|
Pulso = DetectarDiente();
|
||||||
|
}
|
||||||
|
|
||||||
|
[ObservableProperty]
|
||||||
|
public float tiempo_Pulso;
|
||||||
|
|
||||||
|
[ObservableProperty]
|
||||||
|
public float pulsos_Por_Segundo;
|
||||||
|
|
||||||
|
partial void OnPulsos_Por_SegundoChanged(float value)
|
||||||
|
{
|
||||||
|
if (VelocidadActual > 0)
|
||||||
|
Giros_segundo_a_100 = (float)((pulsos_Por_Segundo / Dientes) * 100 / VelocidadActual);
|
||||||
|
}
|
||||||
|
[ObservableProperty]
|
||||||
|
private bool homing;
|
||||||
|
|
||||||
|
partial void OnHomingChanged(bool value)
|
||||||
|
{
|
||||||
|
homing = false;
|
||||||
|
Angulo = 0;
|
||||||
|
}
|
||||||
|
|
||||||
[ObservableProperty]
|
[ObservableProperty]
|
||||||
public float dientes;
|
public float dientes;
|
||||||
[ObservableProperty]
|
[ObservableProperty]
|
||||||
|
@ -45,7 +95,7 @@ namespace CtrEditor.ObjetosSim.UserControls
|
||||||
[ObservableProperty]
|
[ObservableProperty]
|
||||||
public float ancho_Dientes;
|
public float ancho_Dientes;
|
||||||
[ObservableProperty]
|
[ObservableProperty]
|
||||||
public float giros_segundo_a_50hz;
|
public float giros_segundo_a_100;
|
||||||
[ObservableProperty]
|
[ObservableProperty]
|
||||||
public string motor;
|
public string motor;
|
||||||
|
|
||||||
|
@ -54,13 +104,14 @@ namespace CtrEditor.ObjetosSim.UserControls
|
||||||
_osMotor = ObtenerLink(Motor, typeof(osVMmotorSim));
|
_osMotor = ObtenerLink(Motor, typeof(osVMmotorSim));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public osGearEncoder()
|
public osGearEncoder()
|
||||||
{
|
{
|
||||||
Ancho_Dientes = 0.5f;
|
Ancho_Dientes = 0.5f;
|
||||||
Dientes = 10;
|
Dientes = 10;
|
||||||
Radio_Interno = 0.5f;
|
Radio_Interno = 0.5f;
|
||||||
Radio_Externo = 0.6f;
|
Radio_Externo = 0.6f;
|
||||||
|
Color_oculto = Brushes.Gray;
|
||||||
|
Stopwatch.Start();
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void UpdateGeometryStart()
|
public override void UpdateGeometryStart()
|
||||||
|
@ -77,7 +128,7 @@ namespace CtrEditor.ObjetosSim.UserControls
|
||||||
VelocidadActual = motor.Velocidad;
|
VelocidadActual = motor.Velocidad;
|
||||||
|
|
||||||
// Calcular la cantidad de giros por segundo
|
// Calcular la cantidad de giros por segundo
|
||||||
double girosPorSegundo = (VelocidadActual / 50.0) * Giros_segundo_a_50hz;
|
double girosPorSegundo = (VelocidadActual / 100.0) * Giros_segundo_a_100;
|
||||||
|
|
||||||
// Calcular la fracción del segundo que ha pasado
|
// Calcular la fracción del segundo que ha pasado
|
||||||
double segundosTranscurridos = elapsedMilliseconds / 1000.0;
|
double segundosTranscurridos = elapsedMilliseconds / 1000.0;
|
||||||
|
@ -86,20 +137,48 @@ namespace CtrEditor.ObjetosSim.UserControls
|
||||||
double incrementoAngulo = (girosPorSegundo * 360.0) * segundosTranscurridos;
|
double incrementoAngulo = (girosPorSegundo * 360.0) * segundosTranscurridos;
|
||||||
|
|
||||||
// Actualizar el ángulo
|
// Actualizar el ángulo
|
||||||
Angulo = (float)(Angulo + incrementoAngulo) % 360;
|
Angulo = (Angulo + incrementoAngulo) % 360;
|
||||||
|
|
||||||
// Calcular la duración de un pulso
|
|
||||||
double duracionPulso = (360.0 / Dientes) / 2;
|
|
||||||
|
|
||||||
// Generar pulsos cuadrados en función del ángulo
|
|
||||||
Pulso = ((Angulo % (360.0 / Dientes)) < duracionPulso) ? true : false;
|
|
||||||
|
|
||||||
EscribirBitTag(Tag,Pulso);
|
|
||||||
}
|
}
|
||||||
} else if (Motor.Length>0)
|
} else if (Motor.Length>0)
|
||||||
_osMotor = ObtenerLink(Motor, typeof(osVMmotorSim));
|
_osMotor = ObtenerLink(Motor, typeof(osVMmotorSim));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public bool DetectarDiente()
|
||||||
|
{
|
||||||
|
double angleStep = 360.0 / Dientes;
|
||||||
|
double halfToothWidthAngle = (angleStep * Ancho_Dientes) / 2;
|
||||||
|
|
||||||
|
// Normalize the Angulo to be within 0-360 degrees
|
||||||
|
double normalizedAngle = Angulo % 360;
|
||||||
|
if (normalizedAngle < 0) normalizedAngle += 360;
|
||||||
|
|
||||||
|
// Calculate the position of the first tooth's center at angle 0
|
||||||
|
double firstToothCenterAngle = 0;
|
||||||
|
|
||||||
|
// Calculate the angular distance from the current angle to the first tooth's center
|
||||||
|
double angularDistance = Math.Abs(firstToothCenterAngle - normalizedAngle);
|
||||||
|
if (angularDistance > 180) angularDistance = 360 - angularDistance;
|
||||||
|
|
||||||
|
// Check if the normalized angle falls within the segment of the first tooth
|
||||||
|
if (angularDistance <= halfToothWidthAngle)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Calculate the number of steps to reach the nearest tooth's center
|
||||||
|
int steps = (int)Math.Round(normalizedAngle / angleStep);
|
||||||
|
|
||||||
|
// Calculate the angular position of the nearest tooth's center
|
||||||
|
double nearestToothCenterAngle = steps * angleStep;
|
||||||
|
|
||||||
|
// Calculate the angular distance from the current angle to the nearest tooth's center
|
||||||
|
angularDistance = Math.Abs(nearestToothCenterAngle - normalizedAngle);
|
||||||
|
if (angularDistance > 180) angularDistance = 360 - angularDistance;
|
||||||
|
|
||||||
|
// Check if the normalized angle falls within the segment of the nearest tooth
|
||||||
|
return angularDistance <= halfToothWidthAngle;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
public override void UpdateControl(int elapsedMilliseconds)
|
public override void UpdateControl(int elapsedMilliseconds)
|
||||||
{
|
{
|
|
@ -1,11 +1,11 @@
|
||||||
<UserControl x:Class="CtrEditor.ObjetosSim.UserControls.ucPhotocell"
|
<UserControl x:Class="CtrEditor.ObjetosSim.ucPhotocell"
|
||||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||||
xmlns:local="clr-namespace:CtrEditor.ObjetosSim.UserControls"
|
xmlns:local="clr-namespace:CtrEditor.ObjetosSim.UserControls"
|
||||||
mc:Ignorable="d"
|
mc:Ignorable="d"
|
||||||
xmlns:vm="clr-namespace:CtrEditor.ObjetosSim.UserControls"
|
xmlns:vm="clr-namespace:CtrEditor.ObjetosSim"
|
||||||
xmlns:convert="clr-namespace:CtrEditor.Convertidores">
|
xmlns:convert="clr-namespace:CtrEditor.Convertidores">
|
||||||
|
|
||||||
<UserControl.Resources>
|
<UserControl.Resources>
|
|
@ -7,7 +7,7 @@ using System.Windows.Media;
|
||||||
using CommunityToolkit.Mvvm.ComponentModel;
|
using CommunityToolkit.Mvvm.ComponentModel;
|
||||||
|
|
||||||
|
|
||||||
namespace CtrEditor.ObjetosSim.UserControls
|
namespace CtrEditor.ObjetosSim
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Interaction logic for ucPhotocell.xaml
|
/// Interaction logic for ucPhotocell.xaml
|
|
@ -1,4 +1,4 @@
|
||||||
<UserControl x:Class="CtrEditor.ObjetosSim.UserControls.ucAnalogTag"
|
<UserControl x:Class="CtrEditor.ObjetosSim.ucAnalogTag"
|
||||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||||
xmlns:i="http://schemas.microsoft.com/xaml/behaviors"
|
xmlns:i="http://schemas.microsoft.com/xaml/behaviors"
|
||||||
|
@ -6,7 +6,7 @@
|
||||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||||
xmlns:convert="clr-namespace:CtrEditor.Convertidores"
|
xmlns:convert="clr-namespace:CtrEditor.Convertidores"
|
||||||
xmlns:vm="clr-namespace:CtrEditor.ObjetosSim.UserControls"
|
xmlns:vm="clr-namespace:CtrEditor.ObjetosSim"
|
||||||
mc:Ignorable="d">
|
mc:Ignorable="d">
|
||||||
|
|
||||||
<UserControl.Resources>
|
<UserControl.Resources>
|
|
@ -6,7 +6,7 @@ using System.Windows.Media;
|
||||||
using CommunityToolkit.Mvvm.ComponentModel;
|
using CommunityToolkit.Mvvm.ComponentModel;
|
||||||
using Newtonsoft.Json.Linq;
|
using Newtonsoft.Json.Linq;
|
||||||
|
|
||||||
namespace CtrEditor.ObjetosSim.UserControls
|
namespace CtrEditor.ObjetosSim
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Interaction logic for ucAnalogTag.xaml
|
/// Interaction logic for ucAnalogTag.xaml
|
||||||
|
@ -32,17 +32,23 @@ namespace CtrEditor.ObjetosSim.UserControls
|
||||||
[ObservableProperty]
|
[ObservableProperty]
|
||||||
public float tamano;
|
public float tamano;
|
||||||
[ObservableProperty]
|
[ObservableProperty]
|
||||||
|
[NotifyPropertyChangedFor(nameof(Value))]
|
||||||
public string tag;
|
public string tag;
|
||||||
[ObservableProperty]
|
[ObservableProperty]
|
||||||
public string descripcion;
|
public string descripcion;
|
||||||
[ObservableProperty]
|
[ObservableProperty]
|
||||||
|
[NotifyPropertyChangedFor(nameof(Value))]
|
||||||
public float min_IN_Scaled;
|
public float min_IN_Scaled;
|
||||||
[ObservableProperty]
|
[ObservableProperty]
|
||||||
|
[NotifyPropertyChangedFor(nameof(Value))]
|
||||||
public float max_IN_Scaled;
|
public float max_IN_Scaled;
|
||||||
[ObservableProperty]
|
[ObservableProperty]
|
||||||
|
[NotifyPropertyChangedFor(nameof(Value))]
|
||||||
public float min_OUT_Scaled;
|
public float min_OUT_Scaled;
|
||||||
[ObservableProperty]
|
[ObservableProperty]
|
||||||
|
[NotifyPropertyChangedFor(nameof(Value))]
|
||||||
public float max_OUT_Scaled;
|
public float max_OUT_Scaled;
|
||||||
|
|
||||||
[ObservableProperty]
|
[ObservableProperty]
|
||||||
public float value;
|
public float value;
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
<UserControl x:Class="CtrEditor.ObjetosSim.UserControls.ucBoolTag"
|
<UserControl x:Class="CtrEditor.ObjetosSim.ucBoolTag"
|
||||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||||
xmlns:i="http://schemas.microsoft.com/xaml/behaviors"
|
xmlns:i="http://schemas.microsoft.com/xaml/behaviors"
|
||||||
|
@ -6,7 +6,7 @@
|
||||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||||
xmlns:convert="clr-namespace:CtrEditor.Convertidores"
|
xmlns:convert="clr-namespace:CtrEditor.Convertidores"
|
||||||
xmlns:vm="clr-namespace:CtrEditor.ObjetosSim.UserControls"
|
xmlns:vm="clr-namespace:CtrEditor.ObjetosSim"
|
||||||
mc:Ignorable="d">
|
mc:Ignorable="d">
|
||||||
|
|
||||||
<UserControl.Resources>
|
<UserControl.Resources>
|
|
@ -4,8 +4,9 @@ using System.Windows;
|
||||||
using System.Windows.Controls;
|
using System.Windows.Controls;
|
||||||
using System.Windows.Media;
|
using System.Windows.Media;
|
||||||
using CommunityToolkit.Mvvm.ComponentModel;
|
using CommunityToolkit.Mvvm.ComponentModel;
|
||||||
|
using Newtonsoft.Json.Linq;
|
||||||
|
|
||||||
namespace CtrEditor.ObjetosSim.UserControls
|
namespace CtrEditor.ObjetosSim
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Interaction logic for ucBoolTag.xaml
|
/// Interaction logic for ucBoolTag.xaml
|
||||||
|
@ -31,8 +32,12 @@ namespace CtrEditor.ObjetosSim.UserControls
|
||||||
[ObservableProperty]
|
[ObservableProperty]
|
||||||
private Brush color_oculto;
|
private Brush color_oculto;
|
||||||
|
|
||||||
|
[ObservableProperty]
|
||||||
|
public bool estado;
|
||||||
|
|
||||||
partial void OnEstadoChanged(bool value)
|
partial void OnEstadoChanged(bool value)
|
||||||
{
|
{
|
||||||
|
EscribirBitTag(Tag, value);
|
||||||
if (value)
|
if (value)
|
||||||
Color_oculto = Brushes.LightGreen;
|
Color_oculto = Brushes.LightGreen;
|
||||||
else
|
else
|
||||||
|
@ -42,12 +47,11 @@ namespace CtrEditor.ObjetosSim.UserControls
|
||||||
[ObservableProperty]
|
[ObservableProperty]
|
||||||
public float tamano;
|
public float tamano;
|
||||||
[ObservableProperty]
|
[ObservableProperty]
|
||||||
|
[NotifyPropertyChangedFor(nameof(Estado))]
|
||||||
public string tag;
|
public string tag;
|
||||||
|
|
||||||
[ObservableProperty]
|
[ObservableProperty]
|
||||||
public string descripcion;
|
public string descripcion;
|
||||||
[ObservableProperty]
|
|
||||||
public bool estado;
|
|
||||||
|
|
||||||
|
|
||||||
public osBoolTag()
|
public osBoolTag()
|
||||||
{
|
{
|
||||||
|
@ -56,22 +60,6 @@ namespace CtrEditor.ObjetosSim.UserControls
|
||||||
Descripcion = "Nombre del Tag";
|
Descripcion = "Nombre del Tag";
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void UpdateGeometryStart()
|
|
||||||
{
|
|
||||||
// Se llama antes de la simulacion
|
|
||||||
|
|
||||||
}
|
|
||||||
public override void UpdatePLC(PLCModel plc, int elapsedMilliseconds)
|
|
||||||
{
|
|
||||||
plc.EscribirTagBool(Tag, Estado);
|
|
||||||
}
|
|
||||||
|
|
||||||
public override void UpdateControl(int elapsedMilliseconds)
|
|
||||||
{
|
|
||||||
// Calculamos la velocidad
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
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
|
|
@ -1,10 +1,10 @@
|
||||||
<UserControl x:Class="CtrEditor.ObjetosSim.UserControls.ucConsensGeneric"
|
<UserControl x:Class="CtrEditor.ObjetosSim.ucConsensGeneric"
|
||||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||||
mc:Ignorable="d"
|
mc:Ignorable="d"
|
||||||
xmlns:vm="clr-namespace:CtrEditor.ObjetosSim.UserControls"
|
xmlns:vm="clr-namespace:CtrEditor.ObjetosSim"
|
||||||
xmlns:convert="clr-namespace:CtrEditor.Convertidores"
|
xmlns:convert="clr-namespace:CtrEditor.Convertidores"
|
||||||
Background="LightGray">
|
Background="LightGray">
|
||||||
|
|
|
@ -5,7 +5,7 @@ using System.Windows;
|
||||||
using System.Windows.Controls;
|
using System.Windows.Controls;
|
||||||
|
|
||||||
|
|
||||||
namespace CtrEditor.ObjetosSim.UserControls
|
namespace CtrEditor.ObjetosSim
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Interaction logic for ucConsensGeneric.xaml
|
/// Interaction logic for ucConsensGeneric.xaml
|
|
@ -102,7 +102,7 @@ namespace CtrEditor.ObjetosSim
|
||||||
Grid.SetColumn(label, 0);
|
Grid.SetColumn(label, 0);
|
||||||
grid.Children.Add(label);
|
grid.Children.Add(label);
|
||||||
|
|
||||||
if (property.PropertyType == typeof(float) || property.PropertyType == typeof(string) || property.PropertyType == typeof(int))
|
if (property.PropertyType == typeof(double) || property.PropertyType == typeof(float) || property.PropertyType == typeof(string) || property.PropertyType == typeof(int))
|
||||||
{
|
{
|
||||||
var textBox = new TextBox
|
var textBox = new TextBox
|
||||||
{
|
{
|
||||||
|
@ -123,6 +123,11 @@ namespace CtrEditor.ObjetosSim
|
||||||
if (Resources != null)
|
if (Resources != null)
|
||||||
binding.Converter = (FloatToFormattedStringConverter)Resources["floatFormatter"];
|
binding.Converter = (FloatToFormattedStringConverter)Resources["floatFormatter"];
|
||||||
}
|
}
|
||||||
|
if (property.PropertyType == typeof(double))
|
||||||
|
{
|
||||||
|
if (Resources != null)
|
||||||
|
binding.Converter = (DoubleToFormattedStringConverter)Resources["doubleFormatter"];
|
||||||
|
}
|
||||||
|
|
||||||
textBox.SetBinding(TextBox.TextProperty, binding);
|
textBox.SetBinding(TextBox.TextProperty, binding);
|
||||||
|
|
||||||
|
@ -226,7 +231,7 @@ namespace CtrEditor.ObjetosSim
|
||||||
Grid.SetColumn(label, 0);
|
Grid.SetColumn(label, 0);
|
||||||
grid.Children.Add(label);
|
grid.Children.Add(label);
|
||||||
|
|
||||||
if (property.PropertyType == typeof(float) || property.PropertyType == typeof(string) || property.PropertyType == typeof(int))
|
if (property.PropertyType == typeof(double) || property.PropertyType == typeof(float) || property.PropertyType == typeof(string) || property.PropertyType == typeof(int))
|
||||||
{
|
{
|
||||||
var textBox = new TextBox
|
var textBox = new TextBox
|
||||||
{
|
{
|
||||||
|
@ -247,6 +252,11 @@ namespace CtrEditor.ObjetosSim
|
||||||
if (Resources != null)
|
if (Resources != null)
|
||||||
binding.Converter = (FloatToFormattedStringConverter)Resources["floatFormatter"];
|
binding.Converter = (FloatToFormattedStringConverter)Resources["floatFormatter"];
|
||||||
}
|
}
|
||||||
|
if (property.PropertyType == typeof(double))
|
||||||
|
{
|
||||||
|
if (Resources != null)
|
||||||
|
binding.Converter = (DoubleToFormattedStringConverter)Resources["doubleFormatter"];
|
||||||
|
}
|
||||||
|
|
||||||
textBox.SetBinding(TextBox.TextProperty, binding);
|
textBox.SetBinding(TextBox.TextProperty, binding);
|
||||||
|
|
||||||
|
|
|
@ -1,16 +1,6 @@
|
||||||
using System;
|
using System.Windows;
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
using System.Windows;
|
|
||||||
using System.Windows.Controls;
|
using System.Windows.Controls;
|
||||||
using System.Windows.Data;
|
|
||||||
using System.Windows.Documents;
|
|
||||||
using System.Windows.Input;
|
|
||||||
using System.Windows.Media;
|
using System.Windows.Media;
|
||||||
using System.Windows.Media.Imaging;
|
|
||||||
using System.Windows.Navigation;
|
|
||||||
using System.Windows.Shapes;
|
using System.Windows.Shapes;
|
||||||
|
|
||||||
namespace CtrEditor.ObjetosSim.UserControls
|
namespace CtrEditor.ObjetosSim.UserControls
|
||||||
|
@ -94,8 +84,25 @@ namespace CtrEditor.ObjetosSim.UserControls
|
||||||
Canvas.SetTop(innerCircle, centerY - InnerRadius);
|
Canvas.SetTop(innerCircle, centerY - InnerRadius);
|
||||||
GearCanvas.Children.Add(innerCircle);
|
GearCanvas.Children.Add(innerCircle);
|
||||||
|
|
||||||
|
// Draw the zero angle marker
|
||||||
|
double zeroAngle = 0;
|
||||||
|
double radianZero = zeroAngle * Math.PI / 180;
|
||||||
|
double markerLength = InnerRadius * 1.2; // Length of the marker line extending outside the inner circle
|
||||||
|
|
||||||
|
Line zeroAngleMarker = new Line
|
||||||
|
{
|
||||||
|
X1 = centerX,
|
||||||
|
Y1 = centerY,
|
||||||
|
X2 = centerX + markerLength * Math.Cos(radianZero),
|
||||||
|
Y2 = centerY - markerLength * Math.Sin(radianZero),
|
||||||
|
Stroke = Brushes.Red,
|
||||||
|
StrokeThickness = 2
|
||||||
|
};
|
||||||
|
GearCanvas.Children.Add(zeroAngleMarker);
|
||||||
|
|
||||||
for (int i = 0; i < TeethCount; i++)
|
for (int i = 0; i < TeethCount; i++)
|
||||||
{
|
{
|
||||||
|
// Offset the angle to center the first tooth on the 0 angle
|
||||||
double angle = i * angleStep;
|
double angle = i * angleStep;
|
||||||
double radianStart = (angle - toothWidthAngle / 2) * Math.PI / 180;
|
double radianStart = (angle - toothWidthAngle / 2) * Math.PI / 180;
|
||||||
double radianEnd = (angle + toothWidthAngle / 2) * Math.PI / 180;
|
double radianEnd = (angle + toothWidthAngle / 2) * Math.PI / 180;
|
||||||
|
@ -107,14 +114,16 @@ namespace CtrEditor.ObjetosSim.UserControls
|
||||||
|
|
||||||
Polygon tooth = new Polygon
|
Polygon tooth = new Polygon
|
||||||
{
|
{
|
||||||
Stroke = Brushes.Black,
|
Fill = Brushes.Black,
|
||||||
StrokeThickness = 2,
|
|
||||||
Fill = Brushes.LightGray,
|
|
||||||
Points = new PointCollection { p1, p2, p3, p4 }
|
Points = new PointCollection { p1, p2, p3, p4 }
|
||||||
};
|
};
|
||||||
|
|
||||||
GearCanvas.Children.Add(tooth);
|
GearCanvas.Children.Add(tooth);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,29 +0,0 @@
|
||||||
<UserControl x:Class="CtrEditor.ObjetosSim.UserControls.ucGearEncoder"
|
|
||||||
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.UserControls"
|
|
||||||
mc:Ignorable="d"
|
|
||||||
xmlns:vm="clr-namespace:CtrEditor.ObjetosSim.UserControls"
|
|
||||||
xmlns:convert="clr-namespace:CtrEditor.Convertidores">
|
|
||||||
|
|
||||||
<UserControl.Resources>
|
|
||||||
<convert:MeterToPixelConverter x:Key="MeterToPixelConverter"/>
|
|
||||||
</UserControl.Resources>
|
|
||||||
|
|
||||||
<UserControl.DataContext>
|
|
||||||
<vm:osGearEncoder/>
|
|
||||||
</UserControl.DataContext>
|
|
||||||
|
|
||||||
<Canvas>
|
|
||||||
<Canvas.RenderTransform>
|
|
||||||
<RotateTransform Angle="{Binding Angulo}" CenterX="0" CenterY="0"/>
|
|
||||||
</Canvas.RenderTransform>
|
|
||||||
|
|
||||||
<local:GearControl ToothWidthRatio="{Binding Ancho_Dientes}" TeethCount="{Binding Dientes}"
|
|
||||||
InnerRadius="{Binding Radio_Interno, Converter={StaticResource MeterToPixelConverter}}"
|
|
||||||
OuterRadius="{Binding Radio_Externo, Converter={StaticResource MeterToPixelConverter}}"
|
|
||||||
HorizontalAlignment="Center" VerticalAlignment="Center" />
|
|
||||||
</Canvas>
|
|
||||||
</UserControl>
|
|
|
@ -423,14 +423,6 @@ namespace CtrEditor.ObjetosSim
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public event PropertyChangedEventHandler PropertyChanged;
|
|
||||||
|
|
||||||
protected virtual void OnPropertyChanged(string propertyName)
|
|
||||||
{
|
|
||||||
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
[AttributeUsage(AttributeTargets.Property)]
|
[AttributeUsage(AttributeTargets.Property)]
|
||||||
|
|
|
@ -42,7 +42,7 @@ namespace CtrEditor.Siemens
|
||||||
{
|
{
|
||||||
IsConnected = false;
|
IsConnected = false;
|
||||||
PLCInterface = new PLCModel();
|
PLCInterface = new PLCModel();
|
||||||
_timer = new DispatcherTimer { Interval = TimeSpan.FromMilliseconds(1) };
|
_timer = new DispatcherTimer { Interval = TimeSpan.FromMilliseconds(30) };
|
||||||
_timer.Tick += (s, e) => Refresh();
|
_timer.Tick += (s, e) => Refresh();
|
||||||
|
|
||||||
ConnectCommand = new RelayCommand(Connect, () => true);
|
ConnectCommand = new RelayCommand(Connect, () => true);
|
||||||
|
|
|
@ -15,6 +15,7 @@ using System.Diagnostics;
|
||||||
|
|
||||||
using FarseerPhysics.Dynamics.Joints;
|
using FarseerPhysics.Dynamics.Joints;
|
||||||
using CtrEditor.ObjetosSim;
|
using CtrEditor.ObjetosSim;
|
||||||
|
using System.Windows.Documents;
|
||||||
|
|
||||||
namespace CtrEditor.Simulacion
|
namespace CtrEditor.Simulacion
|
||||||
{
|
{
|
||||||
|
@ -169,6 +170,8 @@ namespace CtrEditor.Simulacion
|
||||||
public class simTransporte : simBase
|
public class simTransporte : simBase
|
||||||
{
|
{
|
||||||
public float Speed { get; set; } // Velocidad para efectos de cinta transportadora
|
public float Speed { get; set; } // Velocidad para efectos de cinta transportadora
|
||||||
|
public float DistanceGuide2Guide { get; set; }
|
||||||
|
public bool TransportWithGuides = false;
|
||||||
|
|
||||||
public simTransporte(World world, float width, float height, Vector2 position, float angle = 0)
|
public simTransporte(World world, float width, float height, Vector2 position, float angle = 0)
|
||||||
{
|
{
|
||||||
|
@ -318,7 +321,7 @@ namespace CtrEditor.Simulacion
|
||||||
private void Create(Vector2 position)
|
private void Create(Vector2 position)
|
||||||
{
|
{
|
||||||
RemoverBody();
|
RemoverBody();
|
||||||
Body = BodyFactory.CreateCircle(_world, _radius, 1f, position);
|
Body = BodyFactory.CreateCircle(_world, _radius, 0.2f, position);
|
||||||
Body.BodyType = BodyType.Dynamic;
|
Body.BodyType = BodyType.Dynamic;
|
||||||
|
|
||||||
// Restablecer manejador de eventos de colisión
|
// Restablecer manejador de eventos de colisión
|
||||||
|
@ -328,13 +331,13 @@ namespace CtrEditor.Simulacion
|
||||||
Body.UserData = this; // Importante para la identificación durante la colisión
|
Body.UserData = this; // Importante para la identificación durante la colisión
|
||||||
|
|
||||||
// Configurar la fricción
|
// Configurar la fricción
|
||||||
Body.Friction = 0.5f; // Ajustar según sea necesario para tu simulación
|
Body.Friction = 0.3f; // Ajustar según sea necesario para tu simulación
|
||||||
|
|
||||||
// Configurar amortiguamiento
|
// Configurar amortiguamiento
|
||||||
Body.LinearDamping = 0f; // Ajustar para controlar la reducción de la velocidad lineal
|
Body.LinearDamping = 0.4f; // Ajustar para controlar la reducción de la velocidad lineal
|
||||||
Body.AngularDamping = 0f; // Ajustar para controlar la reducción de la velocidad angular
|
Body.AngularDamping = 0.4f; // Ajustar para controlar la reducción de la velocidad angular
|
||||||
Body.Restitution = 0.2f; // Baja restitución para menos rebote
|
Body.Restitution = 0.2f; // Baja restitución para menos rebote
|
||||||
Body.IsBullet = true;
|
// Body.IsBullet = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void SetDiameter(float diameter)
|
public void SetDiameter(float diameter)
|
||||||
|
@ -394,7 +397,11 @@ namespace CtrEditor.Simulacion
|
||||||
float porcentajeCompartido = InterseccionCirculoRectangulo.CalcularSuperficieCompartida(vertices, centroCirculo, radio);
|
float porcentajeCompartido = InterseccionCirculoRectangulo.CalcularSuperficieCompartida(vertices, centroCirculo, radio);
|
||||||
|
|
||||||
// Aplicar el efecto del transportador usando el porcentaje calculado
|
// Aplicar el efecto del transportador usando el porcentaje calculado
|
||||||
|
if (conveyor.TransportWithGuides)
|
||||||
|
if (conveyor.DistanceGuide2Guide <= radio * 2)
|
||||||
|
CenterFixtureOnConveyor(fixtureA, conveyor);
|
||||||
ApplyConveyorEffect(conveyor, fixtureA, porcentajeCompartido);
|
ApplyConveyorEffect(conveyor, fixtureA, porcentajeCompartido);
|
||||||
|
|
||||||
}
|
}
|
||||||
return true; // No aplicar respuestas físicas
|
return true; // No aplicar respuestas físicas
|
||||||
}
|
}
|
||||||
|
@ -407,6 +414,41 @@ namespace CtrEditor.Simulacion
|
||||||
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;
|
||||||
circleFixture.Body.LinearVelocity += desiredVelocity * porcentajeCompartido;
|
circleFixture.Body.LinearVelocity += desiredVelocity * porcentajeCompartido;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void CenterFixtureOnConveyor(Fixture fixtureA, simTransporte conveyor)
|
||||||
|
{
|
||||||
|
// Obtener el centro del conveyor
|
||||||
|
Vector2 conveyorCenter = conveyor.Body.Position;
|
||||||
|
|
||||||
|
// Calcular el vector de la línea horizontal centrada de conveyor
|
||||||
|
float halfDistance = conveyor.DistanceGuide2Guide / 2;
|
||||||
|
float cos = (float)Math.Cos(conveyor.Body.Rotation);
|
||||||
|
float sin = (float)Math.Sin(conveyor.Body.Rotation);
|
||||||
|
|
||||||
|
Vector2 offset = new Vector2(halfDistance * cos, halfDistance * sin);
|
||||||
|
|
||||||
|
// Línea horizontal centrada de conveyor en el espacio del mundo
|
||||||
|
Vector2 lineStart = conveyorCenter - offset;
|
||||||
|
Vector2 lineEnd = conveyorCenter + offset;
|
||||||
|
|
||||||
|
// Proyectar el centro de fixtureA sobre la línea horizontal
|
||||||
|
Vector2 fixtureCenter = fixtureA.Body.Position;
|
||||||
|
Vector2 closestPoint = ProjectPointOntoLine(fixtureCenter, lineStart, lineEnd);
|
||||||
|
|
||||||
|
// Mover fixtureA al punto más cercano en la línea horizontal
|
||||||
|
fixtureA.Body.Position = closestPoint;
|
||||||
|
}
|
||||||
|
|
||||||
|
private Vector2 ProjectPointOntoLine(Vector2 point, Vector2 lineStart, Vector2 lineEnd)
|
||||||
|
{
|
||||||
|
Vector2 lineDirection = lineEnd - lineStart;
|
||||||
|
lineDirection.Normalize();
|
||||||
|
|
||||||
|
Vector2 pointToLineStart = point - lineStart;
|
||||||
|
float projectionLength = Vector2.Dot(pointToLineStart, lineDirection);
|
||||||
|
|
||||||
|
return lineStart + projectionLength * lineDirection;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public class SimulationManagerFP
|
public class SimulationManagerFP
|
||||||
|
@ -415,7 +457,8 @@ namespace CtrEditor.Simulacion
|
||||||
private Canvas simulationCanvas;
|
private Canvas simulationCanvas;
|
||||||
public List<simBase> Cuerpos;
|
public List<simBase> Cuerpos;
|
||||||
|
|
||||||
public Stopwatch stopwatch;
|
private Stopwatch stopwatch;
|
||||||
|
private double stopwatch_last;
|
||||||
|
|
||||||
public Canvas DebugCanvas { get => simulationCanvas; set => simulationCanvas = value; }
|
public Canvas DebugCanvas { get => simulationCanvas; set => simulationCanvas = value; }
|
||||||
|
|
||||||
|
@ -424,6 +467,7 @@ namespace CtrEditor.Simulacion
|
||||||
world = new World(new Vector2(0, 0)); // Vector2.Zero
|
world = new World(new Vector2(0, 0)); // Vector2.Zero
|
||||||
Cuerpos = new List<simBase>();
|
Cuerpos = new List<simBase>();
|
||||||
stopwatch = new Stopwatch();
|
stopwatch = new Stopwatch();
|
||||||
|
stopwatch.Start();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Clear()
|
public void Clear()
|
||||||
|
@ -437,11 +481,8 @@ namespace CtrEditor.Simulacion
|
||||||
public void Step()
|
public void Step()
|
||||||
{
|
{
|
||||||
// Detener el cronómetro y obtener el tiempo transcurrido en milisegundos
|
// Detener el cronómetro y obtener el tiempo transcurrido en milisegundos
|
||||||
stopwatch.Stop();
|
float elapsedMilliseconds = (float) (stopwatch.Elapsed.TotalMilliseconds - stopwatch_last);
|
||||||
float elapsedMilliseconds = (float)stopwatch.Elapsed.TotalMilliseconds;
|
stopwatch_last = stopwatch.Elapsed.TotalMilliseconds;
|
||||||
|
|
||||||
// Reiniciar el cronómetro para la próxima medición
|
|
||||||
stopwatch.Restart();
|
|
||||||
|
|
||||||
// Pasar el tiempo transcurrido al método Step
|
// Pasar el tiempo transcurrido al método Step
|
||||||
world.Step(elapsedMilliseconds / 1000.0f);
|
world.Step(elapsedMilliseconds / 1000.0f);
|
||||||
|
|
Loading…
Reference in New Issue