public bool MoverAscensorAbajo(Pisos piso)
        {
            PictureBox PisoParada = NivelEdificio(piso);

            if (AscensorPictureBox.Location.Y >= PisoParada.Location.Y)
            {
                ImagenPersona ImagenInterna = Lista.Find(x => x.PisoDireccion == piso) ?? new ImagenPersona();
                PointAscensor.Y             = PisoParada.Location.Y;
                AscensorPictureBox.Location = PointAscensor;
                MoverAscensor = false;

                if (ImagenInterna.Id > 0)
                {
                    StateTextBox.AppendText($"Salieron {ListaSalida.Where(x => x.PisoDireccion == piso).ToList().Count() } personas del elevador{Environment.NewLine}");
                    EliminarControles(ListaSalida.Where(x => x.PisoDireccion == piso).ToList());
                }

                Lista.Remove(Lista.Find(x => x.PisoDireccion == piso));
                PisoActual = piso;
                ListaSalida.RemoveAll(x => x.PisoDireccion == piso);
                ListaSalida.RemoveAll(x => x.PisoDireccion == Pisos.SinPiso);
                CambiarLabel("Esperando que seleccione un piso", Color.White, Color.Green);

                CantidadPersonasLabel.Text = ListaSalida.Count(x => x.Peso > 0).ToString();
                PesoElevadorLabel.Text     = ListaSalida.Sum(x => x.Peso).ToString();
                return(true);
            }
            return(false);
        }
 public void EliminarControles(List <ImagenPersona> Lista)
 {
     foreach (var item in Lista)
     {
         ImagenPersona imagenPersona = Lista.Find(x => x.Id == item.Id);
         Controls.RemoveByKey(imagenPersona.PictureBox.Name);
     }
 }
        public MainForm()
        {
            InitializeComponent();
            OnTimer.Stop();
            PointPersona  = PrimeraPersonaPictureBox.Location;
            PointAscensor = AscensorPictureBox.Location;

            AgregarImagenes(PrimeraPersonaPictureBox, "Piso1", 9);
            AgregarImagenes(SegundaPersonaPictureBox, "Piso2", 4);
            AgregarImagenes(TerceraPersonaPictureBox, "Piso3", 4);
            AgregarImagenes(CuartaPersonaPictureBox, "Piso4", 4);

            ImagenPersona imagenPersona = new ImagenPersona
            {
                PictureBox = PrimeraPersonaPictureBox,
                PisoOrigen = Pisos.PrimerPiso,
                Id         = Lista.Count() + 1,
                Peso       = ObtenerPesoRandom()
            };

            Lista.Add(imagenPersona);

            imagenPersona = new ImagenPersona
            {
                PictureBox = SegundaPersonaPictureBox,
                PisoOrigen = Pisos.SegundoPiso,
                Id         = Lista.Count() + 1,
                Peso       = ObtenerPesoRandom()
            };
            Lista.Add(imagenPersona);

            imagenPersona = new ImagenPersona
            {
                PictureBox = TerceraPersonaPictureBox,
                PisoOrigen = Pisos.TercerPiso,
                Id         = Lista.Count() + 1,
                Peso       = ObtenerPesoRandom()
            };
            Lista.Add(imagenPersona);

            imagenPersona = new ImagenPersona
            {
                PictureBox = CuartaPersonaPictureBox,
                PisoOrigen = Pisos.CuartoPiso,
                Id         = Lista.Count() + 1,
                Peso       = ObtenerPesoRandom()
            };
            Lista.Add(imagenPersona);
            ListaBotones.Add(PrimerPisoButton);
            ListaBotones.Add(SegundoPisoButton);
            ListaBotones.Add(TercerPisoButton);
            ListaBotones.Add(CuartoPisoButton);
        }
        public void AgregarImagenes(PictureBox picture, string Piso, int CantidadImagenes)
        {
            ImagenPersona ImagenPerson;
            Point         PisoLocation = picture.Location;

            for (int i = 1; i <= CantidadImagenes; i++)
            {
                Id++;
                ImagenPerson    = new ImagenPersona();
                PisoLocation.X += picture.Size.Width;
                ImagenPerson.PictureBox.SizeMode = PictureBoxSizeMode.StretchImage;
                ImagenPerson.PictureBox.Size     = picture.Size;
                ImagenPerson.PictureBox.Image    = picture.Image;
                ImagenPerson.PictureBox.Location = PisoLocation;
                ImagenPerson.PisoOrigen          = ObtenerPiso(Piso.Last().ToInt());
                ImagenPerson.PictureBox.Name     = $"Persona{Piso}{i}";
                ImagenPerson.Id   = Id;
                ImagenPerson.Peso = ObtenerPesoRandom();
                Lista.Add(ImagenPerson);
                Controls.Add(ImagenPerson.PictureBox);
            }
            this.Refresh();
        }
 public void CapturarPersona(Pisos piso)
 {
     PersonaGlobal = ObtenerImagenPorPisoControles(piso);
 }
        private void OnTimer_Tick(object sender, EventArgs e)
        {
            if (Lista.Sum(x => x.Peso) <= 0)
            {
                OnTimer.Stop();
            }

            if (CapturarGente)
            {
                PesoTotalAcumulado = ListaSalida.Sum(x => x.Peso);
                PersonaGlobal      = ObtenerImagenPorPisoControles(PisoActual) ?? new ImagenPersona();
                if (PesoTotalAcumulado + PersonaGlobal.Peso >= PesoTotal)
                {
                    StateTextBox.AppendText($"La persona que intento ingresar tenia {PersonaGlobal.Peso} sobrepasando el limite con {(PesoTotalAcumulado + PersonaGlobal.Peso) - PesoTotal} {Environment.NewLine}");
                    CambiarLabel("Ascensor Lleno.", Color.White, Color.Red);
                    CapturarGente = false;
                    MoverAscensor = true;
                    ListaBotones.ForEach(x => x.Enabled = true);
                    ObtenerButton(PisoActual).Enabled   = false;
                }
                else
                {
                    PersonaGlobal.PisoDireccion = AquePiso;
                    if (PersonaGlobal.Id != 0)
                    {
                        if (!ListaSalida.Exists(x => x.Id == PersonaGlobal.Id))
                        {
                            ListaSalida.Add(PersonaGlobal);
                        }
                    }
                    else
                    {
                        ListaSalida.Add(new ImagenPersona()
                        {
                            PisoDireccion = AquePiso, Peso = 0
                        });
                    }

                    StateTextBox.AppendText($"Peso Agregado {PersonaGlobal.Peso} {Environment.NewLine}");
                    CantidadPersonasLabel.Text = ListaSalida.Count(x => x.Peso > 0).ToString();
                    PesoElevadorLabel.Text     = ListaSalida.Sum(x => x.Peso).ToString();
                    CapturarGente = false;
                    MoverPersonas = true;
                    MoverAscensor = false;
                    CambiarLabel("Esperando que seleccione un piso", Color.White, Color.Green);
                }
            }
            if (MoverPersonas)
            {
                AnimarImagen(PersonaGlobal.PictureBox);
                if (MoverPersonaHorizontal(PersonaGlobal.PictureBox, 25))
                {
                    AsignarPosicionPersona(PersonaGlobal.PictureBox);
                    if (PesoTotalAcumulado <= PesoTotal)
                    {
                        CapturarGente = false;
                        MoverPersonas = false;

                        if (ListaSalida.Count(x => x.PisoOrigen == PisoActual) == Lista.Count(x => x.PisoOrigen == PisoActual))
                        {
                            MoverPersonas = false;
                            MoverAscensor = true;
                        }
                        else
                        {
                            ListaBotones.ForEach(x => x.Enabled = true);
                            ObtenerButton(PisoActual).Enabled   = false;
                        }
                        CambiarLabel("Esperando que seleccione un piso", Color.White, Color.Green);
                    }
                    else
                    {
                        MoverPersonas = false;
                        MoverAscensor = true;
                    }
                }
                else
                {
                    CambiarLabel("Persona en movimiento", Color.Black, Color.Yellow);
                }
            }
            if (MoverAscensor)
            {
                if ((int)PisoActual <= (int)AquePiso)
                {
                    Pisos ppp;
                    if (ListaSalida.Count == 0)
                    {
                        ppp = AquePiso;
                    }
                    else
                    {
                        ppp = ListaSalida.FirstOrDefault().PisoDireccion;
                    }
                    if (!MoverAscensorArriba(ppp))
                    {
                        MoverPersonaVertical(ListaSalida, DecrementoEnY);
                        MoverAscensorVertical(DecrementoEnY);
                        CambiarLabel("Ascensor en movimiento, no presione nada", Color.White, Color.Red);
                    }
                    else
                    {
                        ListaBotones.ForEach(x => x.Enabled = true);
                        ObtenerButton(PisoActual).Enabled   = false;
                        CambiarLabel("Esperando que seleccione un piso", Color.White, Color.Green);
                    }
                }
                else
                {
                    Pisos ppp;
                    if (ListaSalida.Count == 0)
                    {
                        ppp = AquePiso;
                    }
                    else
                    {
                        ppp = ListaSalida.FirstOrDefault().PisoDireccion;
                    }

                    if (!MoverAscensorAbajo(ppp))
                    {
                        MoverPersonaVertical(ListaSalida, DecrementoEnY);
                        MoverAscensorVertical(DecrementoEnY);
                        CambiarLabel("Ascensor en movimiento, no presione nada", Color.White, Color.Red);
                    }
                    else
                    {
                        ListaBotones.ForEach(x => x.Enabled = true);
                        ObtenerButton(PisoActual).Enabled   = false;
                        CambiarLabel("Esperando que seleccione un piso", Color.White, Color.Green);
                    }
                }
            }

            Invalidate();
        }