public override void Update(long elapsedMilliseconds) { var waterPump = MapObjects.Get <WaterPump>()[0]; var treatmentFacilities = MapObjects.Get <TreatmentFacilities>()[0]; var reservoir = MapObjects.Get <Reservoir>()[0]; var conduit = MapObjects.GetAll <Conduit>(); var users = MapObjects.GetAll <User>(); var riverWater = MapObjects.GetAll <RiverWater>(); var cleanWater = MapObjects.GetAll <CleanWater>(); // Проверяем не сломан ли насос if (!waterPump.CheckFailure()) { if (reservoir._volumeOfWaterInTheReservoir < reservoir._minVolumeOfWater && waterFromRiver < reservoir._size - reservoir._volumeOfWaterInTheReservoir - 1000) { var water = new RiverWater(new Coordinate(waterIntakeCoord), MoveValue(waterIntakeCoord, waterPumpCoord, 50)); MapObjects.Add(water); waterFromRiver += rnd.Next(800, 1000); Console.WriteLine($"Перемещение {waterFromRiver} литров воды в резервуары"); } if (riverWater != null) { if (errFlag) { Console.WriteLine("Насос в норме!"); errFlag = false; } foreach (var water in riverWater) { water.Move(); if (water.InPlace(waterPump)) { Console.WriteLine("Насос пройден"); (water._moveX, water._moveY) = MoveValue(waterPumpCoord, treatmentFacilitiesCoord, 200); } if (water.InPlace(treatmentFacilities)) { Console.WriteLine("Система очистки пройдена"); (water._moveX, water._moveY) = MoveValue(treatmentFacilitiesCoord, reservoirCoord, 50); } if (water.InPlace(reservoir)) { reservoir.GetWater(waterFromRiver); waterFromRiver = 0; MapObjects.Remove(water); Console.WriteLine($"В резервуаре {reservoir._volumeOfWaterInTheReservoir} тонн воды"); } } } if (users == null) { return; } { foreach (var user in users) { if (user.flag) { continue; } var waterToUserCoord = user.GetNearestPoint(conduit); var waterToUser = new CleanWater(waterToUserCoord, MoveValue(waterToUserCoord, user.Coordinate, rnd.Next(50, 150))); MapObjects.Add(waterToUser); user.flag = true; } if (cleanWater == null) { return; } foreach (var water in cleanWater) { foreach (var user in users.Where(user => water.InPlace(user))) { reservoir.ToGiveWaterOfUser(rnd.Next(5, 25)); MapObjects.Remove(water); MapObjects.Remove(user); var newUserCoord = GenerateCoordinatesUsers(1); MapObjects.Add(new User(newUserCoord.ElementAt(0))); } water.Move(); } } } else { Console.WriteLine("Насос сломался!"); errFlag = true; waterFromRiver = 0; foreach (var river_water in riverWater) { MapObjects.Remove(river_water); } foreach (var clean_water in cleanWater) { MapObjects.Remove(clean_water); } foreach (var user in users) { user.flag = false; } } }
public override void Update(long elapsedMilliseconds) { Generator generator = MapObjects.Get <Generator>()[0]; DispatherStation dispatherStation = MapObjects.Get <DispatherStation>()[0]; List <Wire> wires = MapObjects.GetAll <Wire>(); List <Consumer> consumers = MapObjects.GetAll <Consumer>(); List <Electritian> electritians = MapObjects.GetAll <Electritian>(); List <Electritian> freeElectritians = electritians.Where(x => x.target == null).ToList(); foreach (var consumer in consumers) { bool consumedSuccessfully = consumer.Consume(elapsedMilliseconds); bool consumerIsPending = dispatherStation.consumersBeingProcessed.ContainsKey(consumer) && dispatherStation.consumersBeingProcessed[consumer]; if (!consumedSuccessfully && !consumerIsPending) { Console.WriteLine(String.Format("Потребитель {0} отправил запрос", consumer.getName())); dispatherStation.consumersBeingProcessed[consumer] = true; dispatherStation.pendingRequests.Add(consumer); } } while (freeElectritians.Count > 0 && dispatherStation.pendingRequests.Count > 0) { freeElectritians[0].setConsumerProcessed(dispatherStation.pendingRequests[0]); Console.WriteLine(String.Format("Электрик отправился выполнять запрос {0}", dispatherStation.pendingRequests[0].getName())); freeElectritians.RemoveAt(0); dispatherStation.pendingRequests.RemoveAt(0); } foreach (Electritian e in electritians) { e.MovePath(); } foreach (Electritian e in electritians.Where(x => x.target != null).ToList()) { if (e.Distance(e.target.getCoordinate()) < 1) { bool isFixed = false; if (e.target.isBroken()) { e.target.getFixed(); isFixed = true; Console.WriteLine(String.Format("Провод {0} починен", e.target.getName())); } else { var source = e.target.getElectriticySource(); if (source == null) { isFixed = true; } else { e.setTarget(source); } } if (isFixed) { dispatherStation.consumersBeingProcessed[e.consumerBeingProcessed] = false; e.clearConsumerProcessed(); } } } }
protected override void Initialize() { #region создание базовых объектов // (Следует обратить внимание, что все координаты у всех геометрических объектов задаются в сферической проекции Меркатора (EPSG:3857).) // Создание координаты точки в начале координат. var pointCoordinate = new Coordinate(0, 0); // Создание стандартной точки в созданных ранее координатах. point = new Point(pointCoordinate); // Создание координат для линии. var lineCoordinates = new Coordinate[] { point.Coordinate, new Coordinate(0, -2000000), new Coordinate(-3000000, -1500000) }; // Создание стандартной кривой линии по ранее созданным координатам. line = new LineString(lineCoordinates); // Создание координат полигона. var polygonCoordinates = new Coordinate[] { new Coordinate(4000000, 5000000), new Coordinate(6000000, 0), new Coordinate(6000000, 6000000), new Coordinate(4000000, 5000000) }; // Создание стандартного полигона по ранее созданным координатам. polygon = new Polygon(new LinearRing(polygonCoordinates)); #endregion #region создание базовых объектов // Добавление созданных объектов в общий список, доступный всем модулям. Объекты из данного списка отображаются на карте. MapObjects.Add(point); MapObjects.Add(line); MapObjects.Add(polygon); #endregion #region создание кастомного объекта и добавление на карту, модификация полигона заменой точки // Координаты самолёта, сконвертированные из Lat/Lon координат. Примерно в аэропорту "Internacional de Carrasco". var airplaneCoordinate = MathExtensions.LatLonToSpherMerc(-34.831747, -56.020034); // Скорость самолета, опять же, в сферической проекции Меркатора. var airplaneSpeed = 1000; // Создание объекта класса "самолет", реализованного в рамках данного модуля. airplane = new Airplane(airplaneCoordinate, airplaneSpeed); // Добавление самолета в список объектов. MapObjects.Add(airplane); // Заменим одну из точек ранее созданного полигона только что созданным самолетом. polygonCoordinates[2] = airplaneCoordinate; #endregion #region демонстрация получения данных из коллекции MapObjects // Коллекция MapObjects нужна не только для хранения и отображения объектов, но ещё и для удобного доступа к ним. // Попробуем получить все объекты, являющиеся строго точками. var onlyPoints = MapObjects.Get <Point>(); // Будет возвращена точка, созданная в самом начале. // А теперь получим все объекты, являющиеся точками и наследующиеся от точек (а также наследников наследников). var allPoints = MapObjects.GetAll <Point>(); // Будет возвращена точка, созданная в самом начале и самолет. // А теперь получим ВСЕ объекты на карте. var allMapObjects = MapObjects.GetAll <Geometry>(); // Будут возвращены все 4 созданных нами объекта. #endregion }