Incluyendo Trasnporte Curve y la biblioteca CommunityToolkit.Mvvm
This commit is contained in:
parent
334b1a2fd8
commit
f090722de0
|
@ -12,13 +12,22 @@
|
|||
<Compile Remove="ObjetosSim\ucBasicExample.xaml.cs" />
|
||||
<Compile Remove="ObjetosSim\ucTransporteCurva.xaml.cs" />
|
||||
<Compile Remove="ObjetosSim\UserControls\ucBasicExample.xaml.cs" />
|
||||
<Compile Remove="ObjetosSim\UserControls\ucTransporteCurva.xaml.cs" />
|
||||
<Compile Remove="Simulacion\GeometrySimulator.cs" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<None Remove="app2.png" />
|
||||
<None Remove="CtrEditorE.png" />
|
||||
<None Remove="Icons\app.256x256.ico" />
|
||||
<None Remove="Icons\app.png" />
|
||||
<None Remove="Icons\app2.128x128.ico" />
|
||||
<None Remove="Icons\app2.256x256.ico" />
|
||||
<None Remove="Icons\app2.png" />
|
||||
<None Remove="Icons\borrar.png" />
|
||||
<None Remove="Icons\connect.png" />
|
||||
<None Remove="Icons\CtrEditorA.png" />
|
||||
<None Remove="Icons\CtrEditorC.png" />
|
||||
<None Remove="Icons\CtrEditorE.png" />
|
||||
<None Remove="Icons\disconnect.png" />
|
||||
<None Remove="Icons\duplicate.png" />
|
||||
<None Remove="Icons\fotocelula.png" />
|
||||
|
@ -36,18 +45,16 @@
|
|||
<Page Remove="ObjetosSim\ucBasicExample.xaml" />
|
||||
<Page Remove="ObjetosSim\ucTransporteCurva.xaml" />
|
||||
<Page Remove="ObjetosSim\UserControls\ucBasicExample.xaml" />
|
||||
<Page Remove="ObjetosSim\UserControls\ucTransporteCurva.xaml" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<None Include="ObjetosSim\UserControls\ucBasicExample.xaml" />
|
||||
<None Include="ObjetosSim\UserControls\ucBasicExample.xaml.cs" />
|
||||
<None Include="ObjetosSim\UserControls\ucTransporteCurva.xaml" />
|
||||
<None Include="ObjetosSim\UserControls\ucTransporteCurva.xaml.cs" />
|
||||
<None Include="Simulacion\GeometrySimulator.cs" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="CommunityToolkit.Mvvm" Version="8.2.2" />
|
||||
<PackageReference Include="FarseerPhysics" Version="3.5.0" />
|
||||
<PackageReference Include="Microsoft.Xaml.Behaviors.Wpf" Version="1.1.77" />
|
||||
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
|
||||
|
@ -62,8 +69,15 @@
|
|||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<Resource Include="app2.png" />
|
||||
<Resource Include="CtrEditorE.png" />
|
||||
<Resource Include="Icons\app.png" />
|
||||
<Resource Include="Icons\app2.png" />
|
||||
<Resource Include="Icons\borrar.png" />
|
||||
<Resource Include="Icons\connect.png" />
|
||||
<Resource Include="Icons\CtrEditorA.png" />
|
||||
<Resource Include="Icons\CtrEditorC.png" />
|
||||
<Resource Include="Icons\CtrEditorE.png" />
|
||||
<Resource Include="Icons\disconnect.png" />
|
||||
<Resource Include="Icons\duplicate.png" />
|
||||
<Resource Include="Icons\fotocelula.png" />
|
||||
|
|
Binary file not shown.
After Width: | Height: | Size: 655 KiB |
Binary file not shown.
After Width: | Height: | Size: 453 KiB |
Binary file not shown.
After Width: | Height: | Size: 298 KiB |
Binary file not shown.
After Width: | Height: | Size: 316 KiB |
Binary file not shown.
After Width: | Height: | Size: 70 KiB |
Binary file not shown.
After Width: | Height: | Size: 75 KiB |
|
@ -348,6 +348,8 @@ namespace CtrEditor
|
|||
if (NuevoObjetoDuplicado != null)
|
||||
{
|
||||
NuevoObjetoDuplicado.Nombre += "_Duplicado";
|
||||
NuevoObjetoDuplicado.Left += 0.5f;
|
||||
NuevoObjetoDuplicado.Top += 0.5f;
|
||||
ObjetosSimulables.Add(NuevoObjetoDuplicado);
|
||||
CrearUserControlDesdeObjetoSimulable(NuevoObjetoDuplicado);
|
||||
}
|
||||
|
|
|
@ -7,7 +7,7 @@
|
|||
xmlns:convert="clr-namespace:CtrEditor.Convertidores"
|
||||
xmlns:ObjetosSim="clr-namespace:CtrEditor.ObjetosSim" x:Class="CtrEditor.MainWindow"
|
||||
Height="900" Width="1600" WindowState="Maximized"
|
||||
ResizeMode="CanResize" Title="{Binding directorioTrabajo}">
|
||||
ResizeMode="CanResize" Title="{Binding directorioTrabajo}" Icon="/app2.png">
|
||||
|
||||
<Window.DataContext>
|
||||
<ctreditor:MainViewModel/>
|
||||
|
|
|
@ -1,19 +1,9 @@
|
|||
using CtrEditor.Convertidores;
|
||||
using CtrEditor.Siemens;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows;
|
||||
using System.Windows.Controls;
|
||||
using System.Windows.Data;
|
||||
using System.Windows.Documents;
|
||||
using System.Windows.Input;
|
||||
using System.Windows.Media;
|
||||
using System.Windows.Media.Imaging;
|
||||
using System.Windows.Navigation;
|
||||
using System.Windows.Shapes;
|
||||
|
||||
namespace CtrEditor.ObjetosSim
|
||||
{
|
||||
|
|
|
@ -40,7 +40,7 @@ namespace CtrEditor.ObjetosSim
|
|||
private float TiempoRestante;
|
||||
private float _leftSalida;
|
||||
private float _topSalida;
|
||||
private List<osBotella> Botellas = new List<osBotella>();
|
||||
private osBotella UltimaBotella;
|
||||
|
||||
public static string NombreClase()
|
||||
{
|
||||
|
@ -210,14 +210,16 @@ namespace CtrEditor.ObjetosSim
|
|||
var X = Left + OffsetLeftSalida;
|
||||
var Y = Top + OffsetTopSalida;
|
||||
|
||||
var UltimaBotella = GetLastElement<osBotella>(Botellas);
|
||||
if (UltimaBotella != null && UltimaBotella.RemoverDesdeSimulacion)
|
||||
UltimaBotella = null;
|
||||
|
||||
if (UltimaBotella == null)
|
||||
{
|
||||
// No hay botellas, se puede crear una nueva directamente
|
||||
var nuevaBotella = _mainViewModel.CrearObjetoSimulable(typeof(osBotella), X, Y);
|
||||
((osBotella)nuevaBotella).Diametro = Diametro_botella;
|
||||
nuevaBotella.AutoCreated = true;
|
||||
Botellas.Add((osBotella)nuevaBotella);
|
||||
UltimaBotella = (osBotella)nuevaBotella;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -230,7 +232,7 @@ namespace CtrEditor.ObjetosSim
|
|||
var nuevaBotella = _mainViewModel.CrearObjetoSimulable(typeof(osBotella), X, Y);
|
||||
((osBotella)nuevaBotella).Diametro = Diametro_botella;
|
||||
nuevaBotella.AutoCreated = true;
|
||||
Botellas.Add((osBotella)nuevaBotella);
|
||||
UltimaBotella = (osBotella)nuevaBotella;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -9,36 +9,42 @@
|
|||
|
||||
<UserControl.Resources>
|
||||
<convert:MeterToPixelConverter x:Key="MeterToPixelConverter"/>
|
||||
<convert:HalfWidthConverter x:Key="HalfWidthConverter"/>
|
||||
</UserControl.Resources>
|
||||
|
||||
<Canvas>
|
||||
<!-- Contenedor para la imagen y el rectángulo que permite rotación conjunta -->
|
||||
<Canvas x:Name="RotatingContainer">
|
||||
<Grid>
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="Auto"/>
|
||||
<!-- Columna para el Label -->
|
||||
<ColumnDefinition Width="*"/>
|
||||
<!-- Columna para la Image -->
|
||||
<ColumnDefinition Width="*"/>
|
||||
<!-- Columna para el Rectangle -->
|
||||
</Grid.ColumnDefinitions>
|
||||
|
||||
<Grid.RenderTransform>
|
||||
<RotateTransform Angle="{Binding Angulo}" CenterX="0" CenterY="0"/>
|
||||
</Grid.RenderTransform>
|
||||
|
||||
<!-- Label en la primera columna -->
|
||||
<Label Content="{Binding Nombre}" VerticalAlignment="Center" HorizontalAlignment="Center" Grid.Column="0"/>
|
||||
|
||||
<Image Source="/Icons/fotocelula.png"
|
||||
Width="{Binding Alto, Converter={StaticResource MeterToPixelConverter}, ConverterParameter=3}"
|
||||
Height="{Binding Alto, Converter={StaticResource MeterToPixelConverter}, ConverterParameter=3}"
|
||||
Canvas.Top="{Binding Alto, Converter={StaticResource MeterToPixelConverter}, ConverterParameter=-1}"
|
||||
Canvas.Left="{Binding Alto, Converter={StaticResource MeterToPixelConverter}, ConverterParameter=-3}"/>
|
||||
VerticalAlignment="Center" HorizontalAlignment="Left" Margin="0,0,0,0" Grid.Column="1"/>
|
||||
|
||||
<Rectangle x:Name="Photocell" Width="{Binding Ancho, Converter={StaticResource MeterToPixelConverter}}" Height="{Binding Alto, Converter={StaticResource MeterToPixelConverter}}">
|
||||
<Rectangle x:Name="Photocell" Grid.Column="2" Width="{Binding Ancho, Converter={StaticResource MeterToPixelConverter}}" Height="{Binding Alto, Converter={StaticResource MeterToPixelConverter}}">
|
||||
<Rectangle.Fill>
|
||||
<VisualBrush x:Name="MovingPattern" TileMode="Tile" Viewport="0,0,3,3" ViewportUnits="Absolute" Viewbox="0,0,3,3" ViewboxUnits="Absolute">
|
||||
<VisualBrush.Visual>
|
||||
<Canvas>
|
||||
<Ellipse Width="2" Height="2" Fill="Green"/>
|
||||
<Ellipse Width="2" Height="2" Fill="{Binding Color}"/>
|
||||
</Canvas>
|
||||
</VisualBrush.Visual>
|
||||
</VisualBrush>
|
||||
</Rectangle.Fill>
|
||||
<!-- No se aplica la transformación aquí -->
|
||||
</Rectangle>
|
||||
</Canvas>
|
||||
|
||||
<!-- Transformación de rotación aplicada al contenedor -->
|
||||
<Canvas.RenderTransform>
|
||||
<RotateTransform Angle="{Binding Angulo}" CenterX="0" CenterY="0"/>
|
||||
</Canvas.RenderTransform>
|
||||
</Canvas>
|
||||
</Grid>
|
||||
|
||||
</UserControl>
|
|
@ -1,20 +1,10 @@
|
|||
using CtrEditor.Convertidores;
|
||||
using CtrEditor.Siemens;
|
||||
using CtrEditor.Simulacion;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using CtrEditor.Siemens;
|
||||
using System.Windows;
|
||||
using System.Windows.Controls;
|
||||
using System.Windows.Data;
|
||||
using System.Windows.Documents;
|
||||
using System.Windows.Input;
|
||||
using System.Windows.Media;
|
||||
using System.Windows.Media.Imaging;
|
||||
using System.Windows.Navigation;
|
||||
using System.Windows.Shapes;
|
||||
|
||||
|
||||
namespace CtrEditor.ObjetosSim.UserControls
|
||||
{
|
||||
|
@ -32,6 +22,7 @@ namespace CtrEditor.ObjetosSim.UserControls
|
|||
private bool _luzCortada;
|
||||
private string _tagPhotocellOUT;
|
||||
private bool _tipoNC;
|
||||
private Brush _color;
|
||||
|
||||
private simBarrera Simulation_Photocell;
|
||||
|
||||
|
@ -40,6 +31,15 @@ namespace CtrEditor.ObjetosSim.UserControls
|
|||
return "Photocell";
|
||||
}
|
||||
|
||||
public Brush Color
|
||||
{
|
||||
get => _color;
|
||||
set
|
||||
{
|
||||
_color = value;
|
||||
OnPropertyChanged(nameof(Color));
|
||||
}
|
||||
}
|
||||
public bool LuzCortada
|
||||
{
|
||||
get => _luzCortada;
|
||||
|
@ -48,6 +48,10 @@ namespace CtrEditor.ObjetosSim.UserControls
|
|||
if (_luzCortada != value)
|
||||
{
|
||||
_luzCortada = value;
|
||||
if (_luzCortada)
|
||||
Color = Brushes.Blue;
|
||||
else
|
||||
Color = Brushes.Green;
|
||||
OnPropertyChanged(nameof(LuzCortada));
|
||||
}
|
||||
}
|
||||
|
@ -236,7 +240,7 @@ namespace CtrEditor.ObjetosSim.UserControls
|
|||
public void Highlight(bool State) { }
|
||||
public int ZIndex()
|
||||
{
|
||||
return 1;
|
||||
return 16;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -10,7 +10,8 @@
|
|||
<convert:MeterToPixelConverter x:Key="MeterToPixelConverter"/>
|
||||
</UserControl.Resources>
|
||||
<Canvas>
|
||||
<localuc:CircularSegment Angle="{Binding Angulo}" OuterRadius="{Binding RadioExterno, Converter={StaticResource MeterToPixelConverter}}" InnerRadius="{Binding RadioInterno, Converter={StaticResource MeterToPixelConverter}}"
|
||||
|
||||
<localuc:CircularSegment x:Name="Transporte" Angle="{Binding Angulo}" OuterRadius="{Binding RadioExterno, Converter={StaticResource MeterToPixelConverter}}" InnerRadius="{Binding RadioInterno, Converter={StaticResource MeterToPixelConverter}}"
|
||||
StartAngle="0" EndAngle="90" />
|
||||
</Canvas>
|
||||
</UserControl>
|
||||
|
|
|
@ -1,106 +1,107 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using System.Configuration;
|
||||
using System.Windows;
|
||||
using System.Windows.Controls;
|
||||
using System.Windows.Data;
|
||||
using System.Windows.Documents;
|
||||
using System.Windows.Input;
|
||||
using System.Windows.Media;
|
||||
using System.Windows.Media.Imaging;
|
||||
using System.Windows.Navigation;
|
||||
using System.Windows.Shapes;
|
||||
using CommunityToolkit.Mvvm.ComponentModel;
|
||||
using CtrEditor.Convertidores;
|
||||
using CtrEditor.Siemens;
|
||||
using CtrEditor.Simulacion;
|
||||
|
||||
|
||||
namespace CtrEditor.ObjetosSim.UserControls
|
||||
namespace CtrEditor.ObjetosSim
|
||||
{
|
||||
/// <summary>
|
||||
/// Interaction logic for ucTransporteCurva.xaml
|
||||
/// </summary>
|
||||
public class osTransporteCurva : osBase, IosBase
|
||||
public partial class osTransporteCurva : osBase, IosBase
|
||||
{
|
||||
private string _nombre = "Transporte Curva";
|
||||
|
||||
private float frictionCoefficient;
|
||||
private float velMax50hz; // en metros por minuto
|
||||
private float tiempoRampa;
|
||||
private bool esMarcha;
|
||||
|
||||
private Rectangle Geometria = new Rectangle();
|
||||
private float _velocidadActual;
|
||||
private osBase _osMotor = null;
|
||||
private string _motor;
|
||||
|
||||
public override float Left
|
||||
private simTransporte Simulation_Transporte;
|
||||
|
||||
public static string NombreClase()
|
||||
{
|
||||
get => Geometria.Left;
|
||||
set
|
||||
{
|
||||
Geometria.Left = value;
|
||||
CanvasSetLeftinMeter(value);
|
||||
OnPropertyChanged(nameof(Left));
|
||||
}
|
||||
}
|
||||
public override float Top
|
||||
{
|
||||
get => Geometria.Top;
|
||||
set
|
||||
{
|
||||
Geometria.Top = value;
|
||||
CanvasSetTopinMeter(value);
|
||||
OnPropertyChanged(nameof(Top));
|
||||
}
|
||||
}
|
||||
|
||||
public float RadioExterno
|
||||
{
|
||||
get => Geometria.Length;
|
||||
set
|
||||
{
|
||||
Geometria.Length = value;
|
||||
OnPropertyChanged(nameof(RadioExterno));
|
||||
}
|
||||
}
|
||||
public float RadioInterno
|
||||
{
|
||||
get => Geometria.Width;
|
||||
set
|
||||
{
|
||||
Geometria.Width = value;
|
||||
OnPropertyChanged(nameof(RadioInterno));
|
||||
}
|
||||
return "Transporte Curva 90";
|
||||
}
|
||||
|
||||
private float angulo;
|
||||
public float Angulo
|
||||
{
|
||||
get => Geometria.Angle;
|
||||
get => angulo;
|
||||
set
|
||||
{
|
||||
Geometria.Angle = value;
|
||||
OnPropertyChanged(nameof(Angulo));
|
||||
ActualizarGeometrias();
|
||||
SetProperty(ref angulo, value);
|
||||
}
|
||||
}
|
||||
|
||||
[ObservableProperty]
|
||||
private float radioExterno;
|
||||
|
||||
[ObservableProperty]
|
||||
private float radioInterno;
|
||||
|
||||
[ObservableProperty]
|
||||
private string motor;
|
||||
|
||||
private float left;
|
||||
public override float Left
|
||||
{
|
||||
get => left;
|
||||
set
|
||||
{
|
||||
CanvasSetLeftinMeter(value);
|
||||
SetProperty(ref left, value);
|
||||
}
|
||||
}
|
||||
private float top;
|
||||
public override float Top
|
||||
{
|
||||
get => top;
|
||||
set
|
||||
{
|
||||
CanvasSetTopinMeter(value);
|
||||
SetProperty(ref top, value);
|
||||
}
|
||||
}
|
||||
|
||||
[ObservableProperty]
|
||||
public float ancho;
|
||||
|
||||
[ObservableProperty]
|
||||
public float alto;
|
||||
|
||||
|
||||
public float VelocidadActual
|
||||
{
|
||||
get => Geometria.Speed;
|
||||
get => _velocidadActual;
|
||||
set
|
||||
{
|
||||
Geometria.Speed = value;
|
||||
_velocidadActual = value;
|
||||
Simulation_Transporte?.SetSpeed(value);
|
||||
OnPropertyChanged(nameof(VelocidadActual));
|
||||
}
|
||||
}
|
||||
|
||||
private string nombre = "Transporte Curva 90";
|
||||
public override string Nombre
|
||||
{
|
||||
get => _nombre;
|
||||
set
|
||||
{
|
||||
if (_nombre != value)
|
||||
{
|
||||
_nombre = value;
|
||||
OnPropertyChanged(nameof(Nombre));
|
||||
get => nombre;
|
||||
set => SetProperty(ref nombre, value);
|
||||
}
|
||||
|
||||
private void ActualizarGeometrias()
|
||||
{
|
||||
if (_visualRepresentation is ucTransporteCurva uc)
|
||||
{
|
||||
//UpdateRectangle(Simulation_Transporte, uc.Transporte, Alto, Ancho, Angulo);
|
||||
Simulation_Transporte.Speed = VelocidadActual;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -111,26 +112,49 @@ namespace CtrEditor.ObjetosSim.UserControls
|
|||
|
||||
public osTransporteCurva()
|
||||
{
|
||||
Ancho = 1;
|
||||
Alto = 0.10f;
|
||||
RadioExterno = 2;
|
||||
RadioInterno = 1;
|
||||
}
|
||||
|
||||
public override void ConnectSimManager(SimulationManager simulationManager)
|
||||
{
|
||||
simulationManager.rectangles.Add(Geometria);
|
||||
}
|
||||
public override void UpdateGeometry()
|
||||
public override void UpdateGeometryStart()
|
||||
{
|
||||
// Se llama antes de la simulacion
|
||||
|
||||
ActualizarGeometrias();
|
||||
}
|
||||
|
||||
public override void UpdateControl()
|
||||
public override void UpdateGeometryStep()
|
||||
{
|
||||
}
|
||||
public override void UpdatePLC(PLCModel plc) { }
|
||||
public override void UpdatePLC(PLCModel plc, int elapsedMilliseconds)
|
||||
{
|
||||
if (_osMotor != null)
|
||||
{
|
||||
if (_osMotor is osVMmotorSim motor)
|
||||
VelocidadActual = motor.Velocidad;
|
||||
}
|
||||
else
|
||||
_osMotor = ObtenerLink(_motor, typeof(osVMmotorSim));
|
||||
}
|
||||
|
||||
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();
|
||||
|
||||
//if (_visualRepresentation is ucTransporteCurva 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);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
@ -141,11 +165,21 @@ namespace CtrEditor.ObjetosSim.UserControls
|
|||
public ucTransporteCurva()
|
||||
{
|
||||
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 osTransporteCurva datos)
|
||||
datos.RadioExterno = PixelToMeter.Instance.calc.PixelsToMeters(width);
|
||||
datos.Ancho = PixelToMeter.Instance.calc.PixelsToMeters(width);
|
||||
}
|
||||
public void Move(float LeftPixels, float TopPixels)
|
||||
{
|
||||
|
@ -167,7 +201,6 @@ namespace CtrEditor.ObjetosSim.UserControls
|
|||
return 1;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -20,6 +20,7 @@ using FarseerPhysics.Dynamics;
|
|||
using Siemens.Simatic.Simulation.Runtime;
|
||||
using System.Windows.Media.Imaging;
|
||||
using System.Windows.Input;
|
||||
using CommunityToolkit.Mvvm.ComponentModel;
|
||||
|
||||
namespace CtrEditor.ObjetosSim
|
||||
{
|
||||
|
@ -64,7 +65,7 @@ namespace CtrEditor.ObjetosSim
|
|||
}
|
||||
|
||||
|
||||
public abstract class osBase : INotifyPropertyChanged
|
||||
public abstract class osBase : ObservableObject
|
||||
{
|
||||
public virtual string Nombre { get; set; } = "osBase";
|
||||
|
||||
|
|
|
@ -12,9 +12,8 @@ using CtrEditor.Convertidores;
|
|||
using FarseerPhysics.Common;
|
||||
using System.Windows;
|
||||
using System.Diagnostics;
|
||||
using System.Windows.Documents;
|
||||
using CtrEditor.ObjetosSim;
|
||||
using static System.Runtime.InteropServices.JavaScript.JSType;
|
||||
|
||||
using FarseerPhysics.Dynamics.Joints;
|
||||
|
||||
namespace CtrEditor.Simulacion
|
||||
{
|
||||
|
@ -37,6 +36,90 @@ namespace CtrEditor.Simulacion
|
|||
|
||||
}
|
||||
|
||||
public class simCurve : simBase
|
||||
{
|
||||
private float _innerRadius;
|
||||
private float _outerRadius;
|
||||
private float _startAngle;
|
||||
private float _endAngle;
|
||||
|
||||
public simCurve(World world, float innerRadius, float outerRadius, float startAngle, float endAngle, Vector2 position)
|
||||
{
|
||||
_world = world;
|
||||
_innerRadius = innerRadius;
|
||||
_outerRadius = outerRadius;
|
||||
_startAngle = MathHelper.ToRadians(startAngle);
|
||||
_endAngle = MathHelper.ToRadians(endAngle);
|
||||
Create(position);
|
||||
}
|
||||
|
||||
private void Create(Vector2 position)
|
||||
{
|
||||
if (Body != null)
|
||||
{
|
||||
_world.RemoveBody(Body);
|
||||
}
|
||||
|
||||
// Crear la geometría del sensor de curva
|
||||
List<Vertices> segments = CreateCurveVertices(_innerRadius, _outerRadius, _startAngle, _endAngle);
|
||||
Body = new Body(_world);
|
||||
foreach (var segment in segments)
|
||||
{
|
||||
var shape = new PolygonShape(segment, 1f);
|
||||
var fixture = Body.CreateFixture(shape);
|
||||
fixture.IsSensor = true;
|
||||
}
|
||||
Body.Position = position;
|
||||
Body.BodyType = BodyType.Static;
|
||||
Body.UserData = this;
|
||||
}
|
||||
|
||||
private List<Vertices> CreateCurveVertices(float innerRadius, float outerRadius, float startAngle, float endAngle)
|
||||
{
|
||||
List<Vertices> verticesList = new List<Vertices>();
|
||||
int segments = 32;
|
||||
float angleStep = (endAngle - startAngle) / segments;
|
||||
|
||||
Vertices innerVertices = new Vertices();
|
||||
Vertices outerVertices = new Vertices();
|
||||
|
||||
for (int i = 0; i <= segments; i++)
|
||||
{
|
||||
float angle = startAngle + i * angleStep;
|
||||
innerVertices.Add(new Vector2(innerRadius * (float)Math.Cos(angle), innerRadius * (float)Math.Sin(angle)));
|
||||
outerVertices.Add(new Vector2(outerRadius * (float)Math.Cos(angle), outerRadius * (float)Math.Sin(angle)));
|
||||
}
|
||||
|
||||
outerVertices.Reverse();
|
||||
innerVertices.AddRange(outerVertices);
|
||||
verticesList.Add(innerVertices);
|
||||
|
||||
return verticesList;
|
||||
}
|
||||
|
||||
public void ApplyCurveEffect(simBotella bottle)
|
||||
{
|
||||
// Crear un joint para mantener la botella en la curva
|
||||
RevoluteJoint joint = new RevoluteJoint(bottle.Body, Body, Body.Position, true)
|
||||
{
|
||||
CollideConnected = false
|
||||
};
|
||||
_world.AddJoint(joint);
|
||||
|
||||
bottle.CurrentJoint = joint;
|
||||
}
|
||||
|
||||
public void RemoveCurveEffect(simBotella bottle)
|
||||
{
|
||||
if (bottle.CurrentJoint != null)
|
||||
{
|
||||
_world.RemoveJoint(bottle.CurrentJoint);
|
||||
bottle.CurrentJoint = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public class simDescarte : simBase
|
||||
{
|
||||
private float _radius;
|
||||
|
@ -178,6 +261,7 @@ namespace CtrEditor.Simulacion
|
|||
private float _radius;
|
||||
private float _mass;
|
||||
public bool Descartar = false;
|
||||
public RevoluteJoint CurrentJoint { get; set; }
|
||||
|
||||
public simBotella(World world, float diameter, Vector2 position, float mass)
|
||||
{
|
||||
|
@ -255,6 +339,11 @@ namespace CtrEditor.Simulacion
|
|||
Sensor.LuzCortada = true;
|
||||
return true;
|
||||
}
|
||||
else if (fixtureB.Body.UserData is simCurve curve)
|
||||
{
|
||||
curve.ApplyCurveEffect(this);
|
||||
return true; // No aplicar respuestas físicas
|
||||
}
|
||||
else if (fixtureB.Body.UserData is simDescarte)
|
||||
{
|
||||
Descartar = true;
|
||||
|
@ -345,10 +434,13 @@ namespace CtrEditor.Simulacion
|
|||
}
|
||||
|
||||
public void Remove(simBase Objeto)
|
||||
{
|
||||
if (Objeto != null)
|
||||
{
|
||||
Objeto.RemoverBody();
|
||||
Cuerpos.Remove(Objeto);
|
||||
}
|
||||
}
|
||||
|
||||
public simBotella AddCircle(float diameter, Vector2 position, float mass)
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue