Ejemplo n.º 1
0
        /// <summary>
        /// Генерирует список карточек
        /// </summary>
        /// <param name="map">На карточке встречается только </param>
        /// <param name="uniqueEntry">Все квартиры на карточке из разных домов</param>
        /// <param name="isFlatsSorted">Сортируем квартиры на карточке</param>
        /// <returns></returns>
        private CardWorker GenerateCards(HomeMap map, bool uniqueEntry, bool isFlatsSorted)
        {
            // смапили дома и доступные квартиры
            var mappedDoors = new DoorsMap();

            foreach (var full in map)
            {
                mappedDoors.Add(full, GetHomeDoors(full, map).ToList());
            }

            // ограничиваем кол-во карточек
            CardWorker cards;

            if (uniqueEntry)
            {
                cards = new CardWorker(mappedDoors.BiggestDoorsContainer);
            }
            else
            {
                cards = new CardWorker(GetMaxCardsCount(mappedDoors.DoorsCount, _settings.MaxDoors));
            }

            cards.SetCardCapacity(_settings.MaxDoors);

            // перемешиваю дома для лучшего распределения
            mappedDoors.ShuffleHomes();

            var random = new Random();

            while (!mappedDoors.IsEmpty)
            {
                var pair  = mappedDoors.GetRandom(random);
                var full  = pair.Key;
                var doors = pair.Value;

                while (doors.Any())
                {
                    var door = doors.GetRandom(random);
                    cards.Add(door);
                    doors.Remove(door);
                }

                mappedDoors.Remove(full);
            }

            if (isFlatsSorted)
            {
                // рассортировал квартиры в карточках
                cards.SortCardRecords();
            }
            else
            {
                // перемешал записи в каждой карточке
                cards.ShuffleCardRecords();
            }

            return(cards);
        }
Ejemplo n.º 2
0
        ///// <summary>
        /////     сгенерировать карточки согласно домам, правилам доступа и кодам.
        ///// </summary>
        //public void Generate()
        //{
        //    var allHomes = LoadingWork.LoadSortedHomes().Values.SelectMany(x => x).ToList();
        //    var allRules = LoadingWork.LoadRules().Values.ToList().SelectMany(x => x).ToList();
        //    var allCodes = LoadingWork.LoadCodes().Values.ToList().SelectMany(x => x).ToList();

        //    var allDoors = GetAllDoors(allHomes, allRules, allCodes);
        //    var cards = GenerateCards(allHomes, allRules, allCodes, allDoors);
        //    Write(cards);
        //}

        /// <summary>
        /// Генерирует карточки
        /// </summary>
        /// <param name="uniqueEntry"></param>
        /// <param name="isSorted"></param>
        public void Generate(bool uniqueEntry, bool isSorted)
        {
            var allHomes = LoadingWork.LoadSortedHomes().Values.SelectMany(x => x).ToList();
            var allRules = LoadingWork.LoadRules().Values.ToList().SelectMany(x => x).ToList();
            var allCodes = LoadingWork.LoadCodes().Values.ToList().SelectMany(x => x).ToList();

            var map   = new HomeMap(allHomes, allCodes, allRules);
            var cards = GenerateCards(map, uniqueEntry, isSorted);

            Write(cards);
            //var doors = GetAllDoors(map);
        }
Ejemplo n.º 3
0
        private List <Door> GetAllDoors(HomeMap map)
        {
            var result = new List <Door>();

            if (!map.Any())
            {
                return(result);
            }

            foreach (var full in map)
            {
                result.AddRange(GetHomeDoors(full, map));
            }

            return(result);
        }
Ejemplo n.º 4
0
        /// <summary>
        /// Переносит старую инфу. Не создает дома!!!
        /// </summary>
        public void MigrateHomes()
        {
            var allHomes = _oldParser.LoadSortedHomes().Values.SelectMany(x => x).ToList();
            var allRules = _oldParser.LoadRules().Values.ToList().SelectMany(x => x).ToList();
            var allCodes = _oldParser.LoadCodes().Values.ToList().SelectMany(x => x).ToList();

            // смапировали
            var map = new HomeMap(allHomes, allCodes, allRules);

            var homes = _newParser.LoadHomes();

            var comparer = new HouseNumberComparerFromString();

            foreach (var full in map)
            {
                var home = homes.FirstOrDefault(x => string.Equals(x.Street, full.Building.Street) &&
                                                0 == comparer.Compare(x.ToString(), full.Building.HouseNumber));
                if (home == null)
                {
                    continue;
                }

                homes.Remove(home);

                var doors = home
                            .Doors
                            .Select(x => ToDoor(x, full));

                var copy = new Home(home, doors.ToList(),
                                    full.Building.HasConcierge,
                                    full.HomeInfo.Begin,
                                    full.Building.Floors,
                                    full.Building.Entrances);

                homes.Add(home);
            }

            _newParser.SaveHomes(homes);
        }
Ejemplo n.º 5
0
        private IEnumerable <Door> GetHomeDoors(FullHomeInfo fullInfo,
                                                HomeMap source)
        {
            // объявляем переменные для краткости
            var home     = fullInfo.Building;
            var homeInfo = fullInfo.HomeInfo;
            var rule     = fullInfo.ForbiddenElement;
            var start    = homeInfo.Begin;

            var all = new HashSet <int>(Enumerable.Range(start, home.Doors));

            var forbidden = new HashSet <int>();

            forbidden.UnionWith(rule.Aggressive);
            forbidden.UnionWith(rule.NoVisit);
            forbidden.UnionWith(rule.NoWorried);

            all.ExceptWith(forbidden);

            foreach (var i in all)
            {
                var temp = new Door(home)
                {
                    Number   = i,
                    Entrance = GetEntrance(i - start, home.Doors, home.Entrances)
                };

                var contains = homeInfo.AllCodes.ContainsKey(temp.Entrance);
                if (contains)
                {
                    temp.Codes.AddRange(homeInfo.AllCodes[temp.Entrance]);
                }

                yield return(temp);
            }
        }
Ejemplo n.º 6
0
        public void Repair(bool isSorted)
        {
            //
            // Загрузили из файлов всю инфу
            //
            var allHomes = LoadingWork.LoadSortedHomes().Values.SelectMany(x => x).ToList();
            var allRules = LoadingWork.LoadRules().Values.ToList().SelectMany(x => x).ToList();
            var allCodes = LoadingWork.LoadCodes().Values.ToList().SelectMany(x => x).ToList();
            var allCards = LoadingWork.LoadCards();
            // смапировали
            var map = new HomeMap(allHomes, allCodes, allRules);
            // сгенерили все двери
            var allDoors = GetAllDoors(map);

            //
            // Пока что не планируется поддержка заполнения новых квартир,
            // сопряжено с трудностями сортировки.
            // Пока что просто логгируем то, что есть ещё квартиры для заполнения
            //

            // список квартир, которых нет в домах, информация о которых
            // была скачана
            var notExisting = new List <Door>();

            foreach (var pair in allCards)
            {
                Card card = pair.Value;

                for (int i = 0; i < card.Doors.Count; i++)
                {
                    var find = allDoors.FirstOrDefault(x => x.IsTheSameObject(card.Doors[i]));
                    if (find == null)
                    {
                        notExisting.Add(card.Doors[i]);
                        continue;
                    }

                    // заменяем на новую
                    card.Doors[i] = find;
                }

                if (isSorted)
                {
                    card.Doors = card
                                 .Doors
                                 .OrderBy(x => x.Street)
                                 .ThenBy(x => x.HouseNumber, new HouseNumberComparerFromString())
                                 .ToList();
                }
                else
                {
                    card.Doors = card.Doors.Shuffle().ToList();
                }
            }

            if (notExisting.Any())
            {
                var all = notExisting.Aggregate("", (main, door) => main += door.ToString() + "\n");
                Tracer.Tracer.Instance.Write("Следующих квартир не существует в выбранных домах: \n\n" + all);
            }

            var cardDoors = allCards.SelectMany(x => x.Value.Doors).ToList();
            var needToAdd = allDoors.Except(cardDoors, new BaseFindableObjectComparer()).ToList();

            if (needToAdd.Any())
            {
                //var all = needToAdd.Aggregate("", (main, door) => main += door.ToString() + "\n");
                Tracer.Tracer.Instance.Write("Данных квартир нет в участках: \n\n" + string.Join("\n", needToAdd));
            }

            foreach (var pair in allCards)
            {
                // записали карточку
                var toWrite = JsonConvert.SerializeObject(pair.Value, Formatting.Indented);
                File.WriteAllText(pair.Key, toWrite);
            }
        }
Ejemplo n.º 7
0
        void AddPins(object sender, EventArgs e)                                 //function adds all the pins to the map
        {
            Dictionary <string, Pin> pickerplaces = new Dictionary <string, Pin> //treating pins as a Dictionary of strings in order to access pin locations for picker
            {
                { "Winco", new Pin                                               //declaring pins , relevant bc this is where I go to get food
                  {
                      Type     = PinType.Place,
                      Address  = "555 Grand Ave, San Marcos, CA 92078, United States",
                      Label    = "Winco Foods",
                      Position = new Position(33.135040, -117.176830)
                  }
                  //HomeMap.Pins.Add(Pin)
                },
                { "24 Hour Fitness", new Pin //declaring pins, relevant bc I (used to) love going to the gym
                  {
                      Type     = PinType.Place,
                      Address  = "641 S Rancho Santa Fe Rd, San Marcos, CA 92069, United States",
                      Label    = "24 Hour Fitness",
                      Position = new Position(33.133180, -117.206660)
                  } },

                //HomeMap.Pins.Add(pin2);

                { "Mom's House", new Pin //declaring pins, relevant bc my dog is there and so are my parents
                  {
                      Type     = PinType.Place,
                      Address  = "1943 C Ave, National City, CA 91950, United States",
                      Label    = "Mom's House",
                      Position = new Position(32.666570, -117.099840)
                  } },

                //HomeMap.Pins.Add(pin3);

                { "Self Quarantine aka home", new Pin //declaring pin, relevant bc it's my house
                  {
                      Type     = PinType.Place,
                      Address  = "353 W San Marcos Blvd, San Marcos, CA 92069, United States",
                      Label    = "Self Quarantine aka home",
                      Position = new Position(33.138550, -117.168890)
                  } },

                { "Discovery Lake", new Pin //declaring pin, relevant to me bc I (used to) go hiking there a lot
                  {
                      Type     = PinType.Place,
                      Address  = "3650 Foxhall Dr, San Marcos, CA 92078, United States",
                      Label    = "Discovery Lake",
                      Position = new Position(33.126600, -117.177300)
                  } },
            };

            foreach (Pin pin in pickerplaces.Values) //adding all pins to the map
            {
                HomeMap.Pins.Add(pin);
            }
            ;
            // HomeMap.Pins.Add(pin4)

            Picker.SelectedIndexChanged += (button, args) =>                                             //if the selected instance of the picker is changed
            {
                string location    = Picker.Items[Picker.SelectedIndex];                                 //location is based off of the picker index selected
                var    NewLocation = pickerplaces[location].Position;                                    //the new location of the map will be based on the pin position of the picker index selected
                HomeMap.MoveToRegion(MapSpan.FromCenterAndRadius(NewLocation, Distance.FromMiles(.50))); //moves to region based on picker
            };
        }