Compare commits

..

15 Commits

42 changed files with 4457 additions and 62 deletions

View File

@ -0,0 +1,10 @@
using ProjectAccordionBus.Drawnings;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ProjectAccordionBus;
public delegate void BusDelegate(DrawningBus bus);

View File

@ -0,0 +1,70 @@
using ProjectAccordionBus.Drawnings;
using ProjectAccordionBus.MovementStrategy;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Numerics;
using System.Text;
using System.Threading.Tasks;
namespace ProjectAccordionBus.CollectionGenericObjects;
public abstract class AbstractCompany
{
protected readonly int _placeSizeWidth = 240;
protected readonly int _placeSizeHeight = 60;
protected readonly int _pictureWidth;
protected readonly int _pictureHeight;
protected ICollectionGenericObjects<DrawningBus?> _collection = null;
private int GetMaxCount => _pictureWidth / _placeSizeWidth * (_pictureHeight / _placeSizeHeight / 2 * 3);
public AbstractCompany(int picWidth, int picHeigth, ICollectionGenericObjects<DrawningBus> collection)
{
_pictureWidth = picWidth;
_pictureHeight = picHeigth;
_collection = collection;
_collection.MaxCount = GetMaxCount;
}
public static int operator +(AbstractCompany company, DrawningBus bus)
{
return company._collection.Insert(bus);
}
public static DrawningBus operator -(AbstractCompany company, int position)
{
return company._collection.Remove(position);
}
public DrawningBus? GetRandomObject()
{
Random rnd = new();
return _collection?.Get(rnd.Next(GetMaxCount));
}
public Bitmap? Show()
{
Bitmap bitmap = new(_pictureWidth, _pictureHeight);
Graphics graphics = Graphics.FromImage(bitmap);
DrawBackground(graphics);
for (int i = 0; i < (_collection?.Count ?? 0); i++)
{
DrawningBus? obj = _collection?.Get(i);
SetObjectPosition(i, _collection?.Count ?? 0, obj);
obj?.DrawTransport(graphics);
}
return bitmap;
}
protected abstract void DrawBackground(Graphics g);
protected abstract void SetObjectPosition(int position, int MaxPos, DrawningBus? bus);
}

View File

@ -0,0 +1,56 @@
using ProjectAccordionBus.Drawnings;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ProjectAccordionBus.CollectionGenericObjects;
public class BusSharingService : AbstractCompany
{
public BusSharingService(int picWidth, int picHeight, ICollectionGenericObjects<DrawningBus> collection) : base(picWidth, picHeight, collection)
{
}
protected override void DrawBackground(Graphics g)
{
Pen pen = new(Color.Black, 3);
for (int i = 0; i <= _pictureWidth / _placeSizeWidth; i++)
{
for (int j = 0; j <= _pictureHeight / _placeSizeHeight; j++)
{
g.DrawLine(pen, i * _placeSizeWidth, j * _placeSizeHeight, i * _placeSizeWidth + _placeSizeWidth / 2, j * _placeSizeHeight);
}
g.DrawLine(pen, i * _placeSizeWidth, 0, i * _placeSizeWidth, _pictureHeight / _placeSizeHeight * _placeSizeHeight);
}
}
protected override void SetObjectPosition(int position, int MaxPos, DrawningBus? bus)
{
int n = 0;
int m = 0;
for (int i = 0; i < (_collection?.Count ?? 0); i++)
{
if (_collection?.Get(i) != null)
{
int x = 5 + _placeSizeWidth * n;
int y = (10 + _placeSizeHeight * (_pictureHeight / _placeSizeHeight - 1)) - _placeSizeHeight * m;
_collection?.Get(i)?.SetPictureSize(_pictureWidth, _pictureHeight);
_collection?.Get(i)?.SetPosition(x, y);
}
if (n < _pictureWidth / _placeSizeWidth)
n++;
else
{
n = 0;
m++;
}
}
}
}

View File

@ -0,0 +1,23 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ProjectAccordionBus.CollectionGenericObjects;
public enum CollectionType
{
/// <summary>
/// Неопределено
/// </summary>
None = 0,
/// <summary>
/// Массив
/// </summary>
Massive = 1,
/// <summary>
/// Список
/// </summary>
List = 2
}

View File

@ -0,0 +1,66 @@

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ProjectAccordionBus.CollectionGenericObjects;
/// <summary>
/// Интерфейс описания действий для набора хранимых объектов
/// </summary>
/// <typeparam name="T">Параметр: ограничение - ссылочный тип</typeparam>
public interface ICollectionGenericObjects<T>
where T : class
{
/// <summary>
/// Кол-во объектов в коллекци
/// </summary>
int Count { get; }
/// <summary>
/// Установка максимального кол-ва объектов
/// </summary>
int MaxCount { get; set; }
/// <summary>
/// Добавление объекта в коллецию
/// </summary>
/// <param name="obj"></param>
/// <returns></returns>
int Insert(T obj);
/// <summary>
/// Добавление объекта в коллекцию
/// </summary>
/// <param name="obj">Добавляемый объект</param>
/// <returns>true - вставка прошла удачно, false - вставка не удалась</returns>
int Insert(T obj, int position);
/// <summary>
/// Удаление объекта из коллекции с конкретной позиции
/// </summary>
/// <param name="position">Позиция</param>
/// <returns>true - удаление прошло удачно, false - удаление не удалось</returns>
T? Remove(int position);
/// <summary>
/// Получение объекта из позиции
/// </summary>
/// <param name="position">Позиция</param>
/// <returns>Объект</returns>
T? Get(int position);
/// <summary>
/// Получение типа коллекции
/// </summary>
CollectionType GetCollectionType { get; }
/// <summary>
/// Получение объектов коллекции по одному
/// </summary>
/// <returns>Поэлементый вывод элементов коллекции</returns>
IEnumerable<T?> GetItems();
}

View File

@ -0,0 +1,73 @@
using ProjectAccordionBus.Exceptions;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ProjectAccordionBus.CollectionGenericObjects;
public class ListGenericObjects<T> : ICollectionGenericObjects<T>
where T : class
{
private readonly List<T> _collection;
private int _maxCount;
public int MaxCount {
get => _maxCount;
set
{
if (value > 0)
{
_maxCount = value;
}
}
}
public int Count => _collection.Count;
public CollectionType GetCollectionType => CollectionType.List;
public ListGenericObjects()
{
_collection = new();
}
public T Get(int position)
{
if (position >= Count || position < 0) throw new PositionOutOfCollectionException(position);
return _collection[position];
}
public int Insert(T obj)
{
if (Count == _maxCount) throw new CollectionOverflowException(Count);
_collection.Add(obj);
return Count;
}
public int Insert(T obj, int position)
{
if (Count == _maxCount) throw new CollectionOverflowException(Count);
if (position >= Count || position < 0) throw new PositionOutOfCollectionException(position);
_collection.Insert(position, obj);
return position;
}
public T? Remove(int position)
{
if (position >= Count || position < 0) throw new PositionOutOfCollectionException(position);
T obj = _collection[position];
_collection.RemoveAt(position);
return obj;
}
public IEnumerable<T?> GetItems()
{
for (int i = 0; i < _collection.Count; ++i)
{
yield return _collection[i];
}
}
}

View File

@ -0,0 +1,126 @@
using ProjectAccordionBus.Exceptions;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ProjectAccordionBus.CollectionGenericObjects;
/// <summary>
/// Параметризированный набор объектов
/// </summary>
/// <typeparam name="T">Параметр: ограничение - ссылочный тип</typeparam>
public class MassiveGenericObjects<T> : ICollectionGenericObjects<T>
where T : class
{
/// <summary>
/// Массив объектов которые храним
/// </summary>
private T?[] _collection;
public int Count => _collection.Length;
public int MaxCount
{
get
{
return _collection.Length;
}
set
{
if (value > 0)
{
if (_collection.Length > 0)
{
Array.Resize(ref _collection, value);
}
else
{
_collection = new T?[value];
}
}
}
}
public CollectionType GetCollectionType => CollectionType.Massive;
/// <summary>
/// Конструктор
/// </summary>
public MassiveGenericObjects()
{
_collection = Array.Empty<T?>();
}
public T? Get(int position)
{
if (position < 0 || position >= Count) throw new PositionOutOfCollectionException(position);
return _collection[position];
}
public int Insert(T obj)
{
for (int i = 0; i < Count; i++)
{
if (_collection[i] == null)
{
_collection[i] = obj;
return i;
}
}
throw new CollectionOverflowException(Count);
}
public int Insert(T obj, int position)
{
if (position >= _collection.Length || position < 0) throw new PositionOutOfCollectionException(position);
if (_collection[position] == null)
{
_collection[position] = obj;
return position;
}
int index = position + 1;
while (index < _collection.Length)
{
if (_collection[index] == null)
{
_collection[index] = obj;
return index;
}
++index;
}
index = position - 1;
while (index >= 0)
{
if (_collection[index] == null)
{
_collection[index] = obj;
return index;
}
--index;
}
throw new CollectionOverflowException(Count);
}
public T? Remove(int position)
{
if (position < 0 || position >= Count) throw new PositionOutOfCollectionException(position);
if (_collection[position] == null) throw new ObjectNotFoundException(position);
T? temp = _collection[position];
_collection[position] = null;
return temp;
}
public IEnumerable<T?> GetItems()
{
for (int i = 0; i < _collection.Length; ++i)
{
yield return _collection[i];
}
}
}

View File

@ -0,0 +1,211 @@
using ProjectAccordionBus.Drawnings;
using ProjectAccordionBus.CollectionGenericObjects;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using ProjectAccordionBus.Exceptions;
namespace ProjectAccordionBus.CollectionGenericObjects;
public class StorageCollection<T>
where T : DrawningBus
{
/// <summary>
/// Словарь (хранилище) с коллекциями
/// </summary>
readonly Dictionary<string, ICollectionGenericObjects<T>> _storages;
/// <summary>
/// Возвращение списка названий коллекций
/// </summary>
public List<string> Keys => _storages.Keys.ToList();
/// <summary>
/// Ключевое слово, с которого должен начинаться файл
/// </summary>
private readonly string _collectionKey = "CollectionsStorage";
/// <summary>
/// Разделитель для записи ключа и значения элемента словаря
/// </summary>
private readonly string _separatorForKeyValue = "|";
/// <summary>
/// Разделитель для записей коллекции данных в файл
/// </summary>
private readonly string _separatorItems = ";";
/// <summary>
/// Конструктор
/// </summary>
public StorageCollection()
{
_storages = new Dictionary<string, ICollectionGenericObjects<T>>();
}
/// <summary>
/// Добавление коллекции в хранилище
/// </summary>
/// <param name="name">Название коллекции</param>
/// <param name="collectionType">тип коллекции</param>
public void AddCollection(string name, CollectionType collectionType)
{
if (name == null || _storages.ContainsKey(name))
return;
switch (collectionType)
{
case CollectionType.None:
return;
case CollectionType.Massive:
_storages[name] = new MassiveGenericObjects<T>();
return;
case CollectionType.List:
_storages[name] = new ListGenericObjects<T>();
return;
default: break;
}
}
/// <summary>
/// Удаление коллекции
/// </summary>
/// <param name="name">Название коллекции</param>
public void DelCollection(string name)
{
if (_storages.ContainsKey(name))
_storages.Remove(name);
}
/// <summary>
/// Доступ к коллекции
/// </summary>
/// <param name="name">Название коллекции</param>
/// <returns></returns>
public ICollectionGenericObjects<T>? this[string name]
{
get
{
if (name == "")
{
return null;
}
return _storages[name];
}
}
public void SaveData(string filename)
{
if (_storages.Count == 0)
{
throw new ArgumentException("В хранилище отсутствуют коллекции для сохранения");
}
if (File.Exists(filename))
{
File.Delete(filename);
}
using (StreamWriter writer = new(filename))
{
writer.Write(_collectionKey);
foreach (KeyValuePair<string, ICollectionGenericObjects<T>> value in _storages)
{
writer.Write(Environment.NewLine);
// не сохраняем пустые коллекции
if (value.Value.Count == 0)
{
continue;
}
writer.Write(value.Key);
writer.Write(_separatorForKeyValue);
writer.Write(value.Value.GetCollectionType);
writer.Write(_separatorForKeyValue);
writer.Write(value.Value.MaxCount);
writer.Write(_separatorForKeyValue);
foreach (T? item in value.Value.GetItems())
{
string data = item?.GetDataForSave() ?? string.Empty;
if (string.IsNullOrEmpty(data))
{
continue;
}
writer.Write(data);
writer.Write(_separatorItems);
}
}
}
}
public void LoadData(string filename)
{
if (!File.Exists(filename))
{
throw new FileNotFoundException($"{filename} не существует");
}
using (StreamReader reader = new(filename))
{
string line = reader.ReadLine();
if (line == null || line.Length == 0)
{
throw new IOException("Файл не подходит");
}
if (!line.Equals(_collectionKey))
{
throw new IOException("В файле неверные данные");
}
_storages.Clear();
while ((line = reader.ReadLine()) != null)
{
string[] record = line.Split(_separatorForKeyValue,
StringSplitOptions.RemoveEmptyEntries);
if (record.Length != 4)
{
continue;
}
CollectionType collectionType = (CollectionType)Enum.Parse(typeof(CollectionType), record[1]);
ICollectionGenericObjects<T>? collection = StorageCollection<T>.CreateCollection(collectionType);
if (collection == null)
{
throw new Exception("Не удалось создать коллекцию");
}
collection.MaxCount = Convert.ToInt32(record[2]);
string[] set = record[3].Split(_separatorItems,
StringSplitOptions.RemoveEmptyEntries);
foreach (string elem in set)
{
if (elem?.CreateDrawningBus() is T armoredCar)
{
try
{
if (collection.Insert(armoredCar) == -1)
{
throw new Exception("Объект не удалось добавить в коллекцию: " + record[3]);
}
}
catch (CollectionOverflowException ex)
{
throw new Exception("Коллекция переполнена", ex);
}
}
}
_storages.Add(record[0], collection);
}
}
}
/// <summary>
/// Создание коллекции по типу
/// </summary>
/// <param name="collectionType"></param>
/// <returns></returns>
private static ICollectionGenericObjects<T>?
CreateCollection(CollectionType collectionType)
{
return collectionType switch
{
CollectionType.Massive => new MassiveGenericObjects<T>(),
CollectionType.List => new ListGenericObjects<T>(),
_ => null,
};
}
}

View File

@ -0,0 +1,38 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ProjectAccordionBus.Drawnings;
/// <summary>
/// Направление перемещения
/// </summary>
public enum DirectionType
{
/// <summary>
/// Неизвестное направление
/// </summary>
Unknow = -1,
/// <summary>
/// Вверх
/// </summary>
Up = 1,
/// <summary>
/// Вниз
/// </summary>
Down = 2,
/// <summary>
/// Влево
/// </summary>
Left = 3,
/// <summary>
/// Вправо
/// </summary>
Right = 4
}

View File

@ -0,0 +1,73 @@
using ProjectAccordionBus.Entities;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using static System.Windows.Forms.VisualStyles.VisualStyleElement;
namespace ProjectAccordionBus.Drawnings;
public class DrawningAccordionBus : DrawningBus
{
public DrawningAccordionBus(int speed, double weight, Color bodyColor, Color additionalColor, bool compartment, bool entrance, bool windows) : base(110, 40)
{
EntityBus = new EntityAccordionBus(speed, weight, bodyColor, additionalColor, compartment, entrance, windows);
}
public DrawningAccordionBus(EntityBus? entityBus)
{
if (entityBus != null)
{
EntityBus = entityBus;
}
}
public override void DrawTransport(Graphics g)
{
if (EntityBus == null || EntityBus is not EntityAccordionBus accordionBus || !_startPosX.HasValue || !_startPosY.HasValue)
{
return;
}
Pen pen = new(Color.Black);
Brush additionalBrush = new SolidBrush(accordionBus.AdditionalColor);
base.DrawTransport(g);
Brush brushBlue = new SolidBrush(Color.Blue);
// отсек
if (accordionBus.Compartment)
{
g.FillRectangle(additionalBrush, _startPosX.Value + 60, _startPosY.Value, 50, 30);
g.FillRectangle(additionalBrush, _startPosX.Value + 50, _startPosY.Value + 5, 10, 20);
g.DrawRectangle(pen, _startPosX.Value + 60, _startPosY.Value, 50, 30);
g.DrawRectangle(pen, _startPosX.Value + 50, _startPosY.Value + 5, 10, 20);
// колеса
g.FillEllipse(additionalBrush, _startPosX.Value + 65, _startPosY.Value + 25, 10, 10);
g.FillEllipse(additionalBrush, _startPosX.Value + 95, _startPosY.Value + 25, 10, 10);
g.DrawEllipse(pen, _startPosX.Value + 65, _startPosY.Value + 25, 10, 10);
g.DrawEllipse(pen, _startPosX.Value + 95, _startPosY.Value + 25, 10, 10);
if (accordionBus.Entrance)
{
g.FillRectangle(additionalBrush, _startPosX.Value + 78, _startPosY.Value + 10, 10, 20);
g.DrawRectangle(pen, _startPosX.Value + 78, _startPosY.Value + 10, 10, 20);
}
if (accordionBus.Windows)
{
g.FillEllipse(brushBlue, _startPosX.Value + 65, _startPosY.Value + 5, 5, 10);
g.FillEllipse(brushBlue, _startPosX.Value + 100, _startPosY.Value + 5, 5, 10);
g.FillEllipse(brushBlue, _startPosX.Value + 90, _startPosY.Value + 5, 5, 10);
g.DrawEllipse(pen, _startPosX.Value + 65, _startPosY.Value + 5, 5, 10);
g.DrawEllipse(pen, _startPosX.Value + 100, _startPosY.Value + 5, 5, 10);
g.DrawEllipse(pen, _startPosX.Value + 90, _startPosY.Value + 5, 5, 10);
}
}
}
}

View File

@ -0,0 +1,225 @@
using ProjectAccordionBus.Entities;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ProjectAccordionBus.Drawnings;
public class DrawningBus
{
/// <summary>
/// Класс-сущность
/// </summary>
public EntityBus? EntityBus { get; protected set; }
/// <summary>
/// Ширина окна
/// </summary>
private int? _pictureWidth;
/// <summary>
/// Высота окна
/// </summary>
private int? _pictureHeight;
/// <summary>
/// Левая координата прорисовки транспорта
/// </summary>
protected int? _startPosX;
/// <summary>
/// Верхняя координата прорисовки транспорта
/// </summary>
protected int? _startPosY;
/// <summary>
/// Ширина прорисовки транспорта
/// </summary>
private readonly int _drawningBusWidth = 50;
/// <summary>
/// Высота прорисовки транспорта
/// </summary>
private readonly int _drawningBusHeight = 35;
/// <summary>
/// Координата X объекта
/// </summary>
public int? GetPosX => _startPosX;
/// <summary>
/// Координата Y объекта
/// </summary>
public int? GetPosY => _startPosY;
/// <summary>
/// Ширина объекта
/// </summary>
public int GetWidth => _drawningBusWidth;
/// <summary>
/// Высота объекта
/// </summary>
public int GetHight => _drawningBusHeight;
// Пустой конструктор
public DrawningBus()
{
_pictureWidth = null;
_pictureHeight = null;
_startPosX = null;
_startPosY = null;
}
// Конструктор
public DrawningBus(int speed, double weight, Color bodyColor) : this()
{
EntityBus = new EntityBus(speed, weight, bodyColor);
}
// Конструктор
protected DrawningBus(int drawningBusWidth, int drawningBusHeight) : this()
{
_drawningBusWidth = drawningBusWidth;
_drawningBusHeight = drawningBusHeight;
}
public DrawningBus(EntityBus? entityBus)
{
if (entityBus != null)
{
EntityBus = entityBus;
}
}
public bool SetPictureSize(int width, int height)
{
if (_drawningBusWidth <= width && _drawningBusHeight <= height)
{
_pictureWidth = width;
_pictureHeight = height;
if (_startPosX.HasValue && _startPosY.HasValue)
{
if (_startPosX + _drawningBusWidth > width)
{
_startPosX = width - _drawningBusWidth;
}
if (_startPosY + _drawningBusHeight > height)
{
_startPosY = height - _drawningBusHeight;
}
}
return true;
}
return false;
}
public void SetPosition(int x, int y)
{
if (!_pictureHeight.HasValue || !_pictureWidth.HasValue)
{
return;
}
_startPosX = x;
_startPosY = y;
if (x < 0)
{
_startPosX = 0;
}
if (y < 0)
{
_startPosY = 0;
}
if (x + _drawningBusWidth > _pictureWidth)
{
_startPosX = _pictureWidth - _drawningBusWidth;
}
if (y + _drawningBusHeight > _pictureHeight)
{
_startPosY = _pictureHeight - _drawningBusHeight;
}
}
public bool MoveTransport(DirectionType direction)
{
if (EntityBus == null || !_startPosX.HasValue || !_startPosY.HasValue)
{
return false;
}
switch (direction)
{
//влево
case DirectionType.Left:
if (_startPosX.Value - EntityBus.Step > 0)
{
_startPosX -= (int)EntityBus.Step;
}
return true;
//вверх
case DirectionType.Up:
if (_startPosY.Value - EntityBus.Step > 0)
{
_startPosY -= (int)EntityBus.Step;
}
return true;
// вправо
case DirectionType.Right:
if (_startPosX.Value + _drawningBusWidth + EntityBus.Step < _pictureWidth.Value)
{
_startPosX += (int)EntityBus.Step;
}
return true;
//вниз
case DirectionType.Down:
if (_startPosY.Value + _drawningBusHeight + EntityBus.Step < _pictureHeight.Value)
{
_startPosY += (int)EntityBus.Step;
}
return true;
default:
return false;
}
}
public virtual void DrawTransport(Graphics g)
{
if (EntityBus == null || !_startPosX.HasValue || !_startPosY.HasValue)
{
return;
}
Pen pen = new(Color.Black);
Brush bodyBrush = new SolidBrush(EntityBus.BodyColor);
// границы автобуса
g.FillRectangle(bodyBrush, _startPosX.Value, _startPosY.Value, 50, 30);
g.DrawRectangle(pen, _startPosX.Value, _startPosY.Value, 50, 30);
// окна
Brush brushBlue = new SolidBrush(Color.Blue);
g.FillEllipse(brushBlue, _startPosX.Value + 5, _startPosY.Value + 5, 5, 10);
g.FillEllipse(brushBlue, _startPosX.Value + 40, _startPosY.Value + 5, 5, 10);
g.FillEllipse(brushBlue, _startPosX.Value + 30, _startPosY.Value + 5, 5, 10);
g.DrawEllipse(pen, _startPosX.Value + 5, _startPosY.Value + 5, 5, 10);
g.DrawEllipse(pen, _startPosX.Value + 40, _startPosY.Value + 5, 5, 10);
g.DrawEllipse(pen, _startPosX.Value + 30, _startPosY.Value + 5, 5, 10);
// двери
g.FillRectangle(bodyBrush, _startPosX.Value + 18, _startPosY.Value + 10, 10, 20);
g.DrawRectangle(pen, _startPosX.Value + 18, _startPosY.Value + 10, 10, 20);
// колеса
g.FillEllipse(bodyBrush, _startPosX.Value + 5, _startPosY.Value + 25, 10, 10);
g.FillEllipse(bodyBrush, _startPosX.Value + 35, _startPosY.Value + 25, 10, 10);
g.DrawEllipse(pen, _startPosX.Value + 5, _startPosY.Value + 25, 10, 10);
g.DrawEllipse(pen, _startPosX.Value + 35, _startPosY.Value + 25, 10, 10);
}
}

View File

@ -0,0 +1,53 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using ProjectAccordionBus.Entities;
namespace ProjectAccordionBus.Drawnings;
public static class ExtentionDrawningBus
{
private static readonly string _separatorForObject = ":";
/// <summary>
/// Создание объекта из строки
/// </summary>
/// <param name="info">Строка с данными для создания объекта</param>
/// <returns>Объект</returns>
public static DrawningBus? CreateDrawningBus(this string info)
{
string[] strs = info.Split(_separatorForObject);
EntityBus? bus = EntityAccordionBus.CreateEntityAccordionBus(strs);
if (bus != null)
{
return new DrawningAccordionBus(bus);
}
bus = EntityBus.CreateEntityBus(strs);
if (bus != null)
{
return new DrawningBus(bus);
}
return null;
}
/// <summary>
/// Получение данных для сохранения в файл
/// </summary>
/// <param name="drawningBus">Сохраняемый объект</param>
/// <returns>Строка с данными по объекту</returns>
public static string GetDataForSave(this DrawningBus drawningBus)
{
string[]? array = drawningBus?.EntityBus?.GetStringRepresentation();
if (array == null)
{
return string.Empty;
}
return string.Join(_separatorForObject, array);
}
}

View File

@ -0,0 +1,55 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;
using static System.Reflection.Metadata.BlobBuilder;
namespace ProjectAccordionBus.Entities;
public class EntityAccordionBus : EntityBus
{
public Color AdditionalColor { get; private set; }
public void SetAdditionalColor(Color color) => AdditionalColor = color;
public bool Compartment { get; private set; }
public bool Entrance { get; private set; }
public bool Windows { get; private set; }
/// <summary>
/// Инициализация полей объекта-класса accordion bus
/// </summary>
/// <param name="additionalColor">Дополнительный цвет</param>
/// <param name="compartment">Признак наличия доп. отсека с гармошкой</param>
/// <param name="entrance">Признак наличия входа у доп. отсека</param>
/// <param name="windows">Признак наличия окон у доп. отсека</param>
public EntityAccordionBus(int Speed, double Weight, Color bodyColor, Color additionalColor, bool compartment, bool entrance, bool windows) : base(Speed, Weight, bodyColor)
{
AdditionalColor = additionalColor;
Compartment = compartment; // отсек
Entrance = entrance;
Windows = windows;
}
public override string[] GetStringRepresentation()
{
return new[] { nameof(EntityAccordionBus), Speed.ToString(), Weight.ToString(), BodyColor.Name,
AdditionalColor.Name, Compartment.ToString(), Entrance.ToString(), Windows.ToString() };
}
public static EntityAccordionBus? CreateEntityAccordionBus(string[] strs)
{
if (strs.Length != 8 || strs[0] != nameof(EntityAccordionBus))
{
return null;
}
return new EntityAccordionBus(Convert.ToInt32(strs[1]), Convert.ToDouble(strs[2]), Color.FromName(strs[3]), Color.FromName(strs[4]),
Convert.ToBoolean(strs[5]), Convert.ToBoolean(strs[6]), Convert.ToBoolean(strs[7]));
}
}

View File

@ -0,0 +1,55 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using static System.Windows.Forms.VisualStyles.VisualStyleElement;
namespace ProjectAccordionBus.Entities;
public class EntityBus
{
public int Speed { get; private set; }
public double Weight { get; private set; }
public Color BodyColor { get; private set; }
public void SetBodyColor(Color color) => BodyColor = color;
public double Step => Speed * 50 / Weight;
/// <summary>
/// Конструктор сущности
/// </summary>
/// <param name="speed">Скорость</param>
/// <param name="weight">Вес автомобиля</param>
/// <param name="bodyColor">Основной цвет</param>
public EntityBus(int speed, double weight, Color bodyColor)
{
Speed = speed;
Weight = weight;
BodyColor = bodyColor;
}
public virtual string[] GetStringRepresentation()
{
return new[] { nameof(EntityBus), Speed.ToString(), Weight.ToString(), BodyColor.Name};
}
/// <summary>
/// Создание объекта из массива строк
/// </summary>
/// <param name="strs"></param>
/// <returns></returns>
public static EntityBus? CreateEntityBus(string[] strs)
{
if (strs.Length != 4 || strs[0] != nameof(EntityBus))
{
return null;
}
return new EntityBus(Convert.ToInt32(strs[1]), Convert.ToDouble(strs[2]), Color.FromName(strs[3]));
}
}

View File

@ -0,0 +1,21 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.Text;
using System.Threading.Tasks;
namespace ProjectAccordionBus.Exceptions;
[Serializable]
internal class CollectionOverflowException : ApplicationException
{
public CollectionOverflowException(int count) : base("В коллекции превышено допустимое количество: " + count) { }
public CollectionOverflowException() : base() { }
public CollectionOverflowException(string message) : base(message) { }
public CollectionOverflowException(string message, Exception exception) :
base(message, exception)
{ }
protected CollectionOverflowException(SerializationInfo info,
StreamingContext contex) : base(info, contex) { }
}

View File

@ -0,0 +1,18 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.Text;
using System.Threading.Tasks;
namespace ProjectAccordionBus.Exceptions;
[Serializable]
internal class ObjectNotFoundException : ApplicationException
{
public ObjectNotFoundException(int i) : base("Не найден объект по позиции " + i) { }
public ObjectNotFoundException() : base() { }
public ObjectNotFoundException(string message) : base(message) { }
public ObjectNotFoundException(string message, Exception exception) : base(message, exception) { }
protected ObjectNotFoundException(SerializationInfo info, StreamingContext contex) : base(info, contex) { }
}

View File

@ -0,0 +1,18 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.Text;
using System.Threading.Tasks;
namespace ProjectAccordionBus.Exceptions;
[Serializable]
internal class PositionOutOfCollectionException : ApplicationException
{
public PositionOutOfCollectionException(int i) : base("Выход за границы коллекции.Позиция " + i) { }
public PositionOutOfCollectionException() : base() { }
public PositionOutOfCollectionException(string message) : base(message) { }
public PositionOutOfCollectionException(string message, Exception exception) : base(message, exception) { }
protected PositionOutOfCollectionException(SerializationInfo info, StreamingContext contex) : base(info, contex) { }
}

View File

@ -1,39 +0,0 @@
namespace ProjectAccordionBus
{
partial class Form1
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.components = new System.ComponentModel.Container();
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(800, 450);
this.Text = "Form1";
}
#endregion
}
}

View File

@ -1,10 +0,0 @@
namespace ProjectAccordionBus
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
}
}

View File

@ -0,0 +1,153 @@
namespace ProjectAccordionBus
{
partial class FormAccordionBus
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FormAccordionBus));
pictureBoxAccordionBus = new PictureBox();
buttonLeft = new Button();
buttonDown = new Button();
buttonUp = new Button();
buttonRight = new Button();
comboBoxStrategy = new ComboBox();
buttonStrategyStep = new Button();
((System.ComponentModel.ISupportInitialize)pictureBoxAccordionBus).BeginInit();
SuspendLayout();
//
// pictureBoxAccordionBus
//
pictureBoxAccordionBus.Dock = DockStyle.Fill;
pictureBoxAccordionBus.Location = new Point(0, 0);
pictureBoxAccordionBus.Name = "pictureBoxAccordionBus";
pictureBoxAccordionBus.Size = new Size(728, 386);
pictureBoxAccordionBus.TabIndex = 0;
pictureBoxAccordionBus.TabStop = false;
pictureBoxAccordionBus.Click += pictureBoxAccordionBus_Click;
//
// buttonLeft
//
buttonLeft.Anchor = AnchorStyles.Bottom | AnchorStyles.Right;
buttonLeft.BackgroundImage = (Image)resources.GetObject("buttonLeft.BackgroundImage");
buttonLeft.BackgroundImageLayout = ImageLayout.Stretch;
buttonLeft.Location = new Point(597, 339);
buttonLeft.Name = "buttonLeft";
buttonLeft.Size = new Size(35, 35);
buttonLeft.TabIndex = 2;
buttonLeft.UseVisualStyleBackColor = true;
buttonLeft.Click += ButtonMove_Click;
//
// buttonDown
//
buttonDown.Anchor = AnchorStyles.Bottom | AnchorStyles.Right;
buttonDown.BackgroundImage = (Image)resources.GetObject("buttonDown.BackgroundImage");
buttonDown.BackgroundImageLayout = ImageLayout.Stretch;
buttonDown.Location = new Point(638, 339);
buttonDown.Name = "buttonDown";
buttonDown.Size = new Size(35, 35);
buttonDown.TabIndex = 3;
buttonDown.UseVisualStyleBackColor = true;
buttonDown.Click += ButtonMove_Click;
//
// buttonUp
//
buttonUp.Anchor = AnchorStyles.Bottom | AnchorStyles.Right;
buttonUp.BackgroundImage = (Image)resources.GetObject("buttonUp.BackgroundImage");
buttonUp.BackgroundImageLayout = ImageLayout.Stretch;
buttonUp.Location = new Point(638, 298);
buttonUp.Name = "buttonUp";
buttonUp.Size = new Size(35, 35);
buttonUp.TabIndex = 4;
buttonUp.UseVisualStyleBackColor = true;
buttonUp.Click += ButtonMove_Click;
//
// buttonRight
//
buttonRight.Anchor = AnchorStyles.Bottom | AnchorStyles.Right;
buttonRight.BackgroundImage = (Image)resources.GetObject("buttonRight.BackgroundImage");
buttonRight.BackgroundImageLayout = ImageLayout.Stretch;
buttonRight.Location = new Point(679, 339);
buttonRight.Name = "buttonRight";
buttonRight.Size = new Size(35, 35);
buttonRight.TabIndex = 5;
buttonRight.UseVisualStyleBackColor = true;
buttonRight.Click += ButtonMove_Click;
//
// comboBoxStrategy
//
comboBoxStrategy.DropDownStyle = ComboBoxStyle.DropDownList;
comboBoxStrategy.FormattingEnabled = true;
comboBoxStrategy.Items.AddRange(new object[] { "К центру", "К краю" });
comboBoxStrategy.Location = new Point(595, 12);
comboBoxStrategy.Name = "comboBoxStrategy";
comboBoxStrategy.Size = new Size(121, 23);
comboBoxStrategy.TabIndex = 7;
//
// buttonStrategyStep
//
buttonStrategyStep.Location = new Point(641, 41);
buttonStrategyStep.Name = "buttonStrategyStep";
buttonStrategyStep.Size = new Size(75, 23);
buttonStrategyStep.TabIndex = 8;
buttonStrategyStep.Text = "Шаг";
buttonStrategyStep.UseVisualStyleBackColor = true;
buttonStrategyStep.Click += buttonStrategyStep_Click;
//
// FormAccordionBus
//
AutoScaleDimensions = new SizeF(7F, 15F);
AutoScaleMode = AutoScaleMode.Font;
ClientSize = new Size(728, 386);
Controls.Add(buttonStrategyStep);
Controls.Add(comboBoxStrategy);
Controls.Add(buttonRight);
Controls.Add(buttonUp);
Controls.Add(buttonDown);
Controls.Add(buttonLeft);
Controls.Add(pictureBoxAccordionBus);
Name = "FormAccordionBus";
Text = "Сочленённый автобус";
((System.ComponentModel.ISupportInitialize)pictureBoxAccordionBus).EndInit();
ResumeLayout(false);
}
private void pictureBoxAccordionBus_Click(object sender, EventArgs e)
{
return;
}
#endregion
private PictureBox pictureBoxAccordionBus;
private Button buttonLeft;
private Button buttonDown;
private Button buttonUp;
private Button buttonRight;
private ComboBox comboBoxStrategy;
private Button buttonStrategyStep;
}
}

View File

@ -0,0 +1,124 @@
using ProjectAccordionBus.Drawnings;
using ProjectAccordionBus.Entities;
using ProjectAccordionBus.MovementStrategy;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace ProjectAccordionBus;
public partial class FormAccordionBus : Form
{
private DrawningBus? _drawningBus;
private AbstractStrategy? _strategy;
public DrawningBus SetBus
{
set
{
_drawningBus = value;
_drawningBus.SetPictureSize(pictureBoxAccordionBus.Width, pictureBoxAccordionBus.Height);
comboBoxStrategy.Enabled = true;
_strategy = null;
Draw();
}
}
public FormAccordionBus()
{
InitializeComponent();
_strategy = null;
}
private void Draw()
{
if (_drawningBus == null)
{
return;
}
Bitmap bmp = new(pictureBoxAccordionBus.Width, pictureBoxAccordionBus.Height);
Graphics gr = Graphics.FromImage(bmp);
_drawningBus.DrawTransport(gr);
pictureBoxAccordionBus.Image = bmp;
}
private void ButtonMove_Click(object sender, EventArgs e)
{
if (_drawningBus == null)
{
return;
}
string name = ((Button)sender)?.Name ?? string.Empty;
bool result = false;
switch (name)
{
case "buttonUp":
result = _drawningBus.MoveTransport(DirectionType.Up);
break;
case "buttonDown":
result = _drawningBus.MoveTransport(DirectionType.Down);
break;
case "buttonLeft":
result = _drawningBus.MoveTransport(DirectionType.Left);
break;
case "buttonRight":
result = _drawningBus.MoveTransport(DirectionType.Right);
break;
}
if (result)
{
Draw();
}
}
private void buttonStrategyStep_Click(object sender, EventArgs e)
{
if (_drawningBus == null)
{
return;
}
if (comboBoxStrategy.Enabled)
{
_strategy = comboBoxStrategy.SelectedIndex switch
{
0 => new MoveToCenter(),
1 => new MoveToBorder(),
_ => null,
};
if (_strategy == null)
{
return;
}
_strategy.SetData(new MoveableBus(_drawningBus), pictureBoxAccordionBus.Width, pictureBoxAccordionBus.Height);
}
if (_strategy == null)
{
return;
}
comboBoxStrategy.Enabled = false;
_strategy.MakeStep();
Draw();
if (_strategy.GetStatus() == StrategyStatus.Finish)
{
comboBoxStrategy.Enabled = true;
_strategy = null;
}
}
}

View File

@ -0,0 +1,864 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="buttonLeft.BackgroundImage" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
/9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwg
JC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIy
MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCAFoAWgDASIAAhEBAxEB/8QA
HwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIh
MUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVW
V1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXG
x8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQF
BgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAV
YnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOE
hYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq
8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD26iiigAPStGs49K0aACiiigDOHSigdKKAA9K0azj0rRoAKKKK
AM4dKKB0ooAD0rRrOPStGgAooooAzh0ooHSigAPStGs49K0aACiiigDOHSigdKKAA9K0azj0rRoAKKKK
AM4dKKB0ooAD0rRrOPStGgAooooAzh0ooHSigAPStGs49K0aACiiigDOHSigdKKACiiigAyPWjI9a0aK
AM0kY61pUVmgDHSgDSorOwPSkIGOlAACMdaXI9a0aKAM0kY61pUVmgDHSgDSorOwPSkIGOlAACMdaXI9
a0aKAM0kY61pUVmgDHSgDSorOwPSkIGOlAACMdaXI9a0aKAM0kY61pUVmgDHSgDSorOwPSkIGOlAACMd
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
RRRQBnDpRRRQAUUUUAf/2Q==
</value>
</data>
<data name="buttonDown.BackgroundImage" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
/9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwg
JC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIy
MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCAKAAoADASIAAhEBAxEB/8QA
HwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIh
MUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVW
V1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXG
x8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQF
BgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAV
YnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOE
hYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq
8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD3WiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKA
CiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKA
CiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKA
CiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKA
CiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKA
CiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKA
CiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKRn
RThmAJ7E0ALRR2yDkHkGigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKK
ACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoopGdFOGYAnsTQAtFHbIOQeQaKACiiigAooooAKKK
KACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKK
TIDKp6t0FAAWAPLAZ6AnrUS5OVUfvCTvYj7v+RSL+8XAUGRuXYj7tOVEbcCowvyqQeooAWPgsq42KQFP
86koAAGAAAOgFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAB
RRRQAUUUUAFFFFABRRRQAUUUUAFFFJkBlU9W6CgALAHlgM9AT1qJcnKqP3hJ3sR93/IpF/eLgKDI3LsR
92nKiNuBUYX5VIPUUALHwWVcbFICn+dSUAADAAAHQCigAooooAKKKKACiiigAooooAKKKKACiiigAooo
oAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKOMgEgE9BmgBkpXy8MeW4GT0pm0h
trNiQcq57+1LEqvHuZQzEndkdKRcZMTAMmSEJ7YoAcAr/MVZW6MAetPACjaoAA6ClxgYAAA4AooAKKKK
ACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKK
ACiiigAooo4yASAT0GaAGSlfLwx5bgZPSmbSG2s2JByrnv7UsSq8e5lDMSd2R0pFxkxMAyZIQntigBwC
v8xVlbowB608AKNqgADoKXGBgAADgCigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiig
AooooAKKKKACiiigAooooAKKKKACiiigAooooAKiu7u2sLOW8vLiK3toV3STSttVB7k1LXlH7QszxfDy
zVGKrJqaK4H8Q8uQ4NAHQH4xfD4HH/CRpkelpP8A/EVCvxf+HZXL+IlLHkn7JP8A/EV8j0UAfXP/AAt/
4enJbxGC3qLWcZ/8coX4w/D4EZ8RJgdAtnP/APEV8jUUAfXv/C4/h7/0MY/8A5//AIij/hcfw9/6GMf+
Ac//AMRXyFRQB9e/8Lj+Hv8A0MY/8A5//iKP+Fx/D3/oYx/4Bz//ABFfIVFAH17/AMLj+Hv/AEMY/wDA
Of8A+Io/4XH8Pf8AoYx/4Bz/APxFfIVFAH17/wALj+Hv/Qxj/wAA5/8A4ij/AIXH8Pf+hjH/AIBz/wDx
FfIVFAH17/wuP4e/9DGP/AOf/wCIo/4XH8Pf+hjH/gHP/wDEV8hUUAfXv/C4/h7/ANDGP/AOf/4ij/hc
fw9/6GMf+Ak//wARXyFRQB916bqVjrGnRX+m3cV1aS/clhbIOP654x1zVqvEf2bZ5H0jxFbFiYo5oHVf
RmDgn/x0V7dQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFIThc4J74FAC
np2z2BNRIqurFwC+fm9RRGiSR7mUMW5JIoRcncGOVYgH1FAB5eS24HcOjA43U5UOQW2gLwqr2p9FABRR
RQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRR
RQAUUUUAFeS/tE/8k80//sKp/wCipa9aryX9on/knmn/APYVT/0VLQB8yUUUUAFFFFABRRRQAUUUUAFF
FFABRRRQAUUUUAFFFFAH0F+zX/x4+Jv9+2/lJXudeGfs1/8AHj4m/wB+2/lJXudABRRRQAUUUUAFFFFA
BRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUARSJzvXP8AtKDjNSAAKAowB0FLRQAUUUUAFFFF
ABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFF
ABRRRQAV5L+0T/yTzT/+wqn/AKKlr1qvJf2if+Seaf8A9hVP/RUtAHzJRRRQAUUUUAFFFFABRRRQAUUU
UAFFFFABRRRQAUUUUAfQX7Nf/Hj4m/37b+Ule514Z+zX/wAePib/AH7b+Ule50AFFFFABRRRQAUUUUAF
FFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAF
FFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFeS/tE/8AJPNP/wCw
qn/oqWvWq8l/aJ/5J5p//YVT/wBFS0AfMlFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQB9Bfs
1/8AHj4m/wB+2/lJXudeGfs1/wDHj4m/37b+Ule50AFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAB
RRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUANYkDAxljgZpoUtzucDs27r
+FOcErlcblORmmc424k2nqu3+tAD0JYHIAIOCR3/AMg06mqCASxyWOT7f5FOoAKKKKACiiigAooooAKK
KKACiiigAooooAKKKKACiiigAooooAKKKKACvJf2if8Aknmn/wDYVT/0VLXrVeS/tE/8k80//sKp/wCi
paAPmSiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA+gv2a/8Ajx8Tf79t/KSvc68M/Zr/AOPH
xN/v238pK9zoAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKK
KACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKK
KACiiigAooooAK8l/aJ/5J5p/wD2FU/9FS161Xkv7RP/ACTzT/8AsKp/6KloA+ZKKKKACiiigAooooAK
KKKACiiigAooooAKKKKACiiigD6C/Zr/AOPHxN/v238pK9zrwz9mv/jx8Tf79t/KSvc6ACiiigAooooA
KKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA
KKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACvJf2if+Sea
f/2FU/8ARUtetV5L+0T/AMk80/8A7Cqf+ipaAPmSiiigAooooAKKKKACiiigAooooAKKKKACiiigAooo
oA+gv2a/+PHxN/v238pK9zrwz9mv/jx8Tf79t/KSvc6ACiiigAooooAKKKKACiiigAooooAKKKKACiii
gAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiii
gAooooAKKKazhTg5JPIUCgAZsHABZjyAKFcNkAEFeCCOlRF/mZh8ob5dxH3MU5NpZQmSq5y394mgCWii
igAooooAKKKKACiiigAooooAK8l/aJ/5J5p//YVT/wBFS161Xkv7RP8AyTzT/wDsKp/6KloA+ZKKKKAC
iiigAqQRZALMFz0zQIWIzlVz0BPWpsHJdVy/C4x92gCuylG2kcim1LIRtVeCw6kd6ioAKKKKACiiigAo
oooAKKKKAPoL9mv/AI8fE3+/bfykr3OvDP2a/wDjx8Tf79t/KSvc6ACiiigAooooAKKKKACiims4U4OS
TyFAoAGbBwAWY8gChXDZABBXggjpURf5mYfKG+XcR9zFOTaWUJkquct/eJoAlooooAKKKKACiiigAooo
oAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACjtmims4X
gAliMgAdaAGtKoj3ghsjIApGLJIwyFD4w5PTikXgNIoJJ/1iEU6PqwXJj7ZHT2oAEI34QkoowTnqakoo
oAKKKKACiiigAooooAKKKKACiiigAryX9on/AJJ5p/8A2FU/9FS161Xkv7RP/JPNP/7Cqf8AoqWgD5ko
oooAcqljgDJpwjPls54xTo0OVZiF7rk9af8AMWz0kHBB7igBSP8AloilyemB0qKUYIHcDkj1pJMB/kyP
UZqOgAooooAKKKKACiiigAooooAKKKKAPoL9mv8A48fE3+/bfykr3OvDP2a/+PHxN/v238pK9zoAKKKK
ACiiigAo7ZoprOF4AJYjIAHWgBrSqI94IbIyAKRiySMMhQ+MOT04pF4DSKCSf9YhFOj6sFyY+2R09qAB
CN+EJKKME56mpKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKK
ACiiigAooooAKKKKACiiigAooppdVOCSSeQAOaABnVTg5JPOAKYHUOzFhtfG1vXFIrBXZyxKtxuP8Psa
k2Yk3A4B+8uOtAETt8zSochAASD156VPTdnzZLM2DkAnpTqACiiigAooooAKKKKACiiigAooooAKKKKA
CvJf2if+Seaf/wBhVP8A0VLXrVeS/tE/8k80/wD7Cqf+ipaAPmSpBE5GQOvIGetCxNwcDnoCetOkBJ8x
cjHBH92gBZUZ33oCyn0HSlcZjIPLIBk/0qNpAxB2jd396GkLKFACr6CgCOiiigAooooAKKKKACiiigAo
oooAKKKKAPoL9mv/AI8fE3+/bfykr3OvDP2a/wDjx8Tf79t/KSvc6ACiiigAooppdVOCSSeQAOaABnVT
g5JPOAKYHUOzFhtfG1vXFIrBXZyxKtxuP8Psak2Yk3A4B+8uOtAETt8zSochAASD156VPTdnzZLM2DkA
npTqACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA
KKKKACiiigAooooAKiVikjCQgFuQ3rUtIyh12t07e1ADBteViMFdu0n1P/6qk6DAGAOAKRQ23DEEjuB1
paACiiigAooooAKKKKACiiigAooooAKKKKACiiigAryb9oj/AJJ7p3/YWT/0VLXrNeS/tE/8k80//sKp
/wCipaAPmqVGaTcoJU8ggUSswbAJ3bdrYpsb7RtbJU9ajoAKKKKACiiigAooooAKKKKACiiigAooooAK
KKKAPoL9mv8A48fE3+/bfykr3OvDP2a/+PHxN/v238pK9zoAKKKKAColYpIwkIBbkN61LSModdrdO3tQ
AwbXlYjBXbtJ9T/+qpOgwBgDgCkUNtwxBI7gdaWgAooooAKKKKACiiigAooooAKKKKACiiigAooooAKK
KKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKK
KKACiiigAooooAKKKKACiiigAryX9on/AJJ5p/8A2FU/9FS161Xkv7RP/JPNP/7Cqf8AoqWgD5kooooA
KKKKACiiigAooooAKKKKACiiigAooooAKKKKAPoL9mv/AI8fE3+/bfykr3OvDP2a/wDjx8Tf79t/KSvc
6ACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKK
KACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKK
KACvJf2if+Seaf8A9hVP/RUtetV5L+0T/wAk80//ALCqf+ipaAPmSiiigAooooAKKKKACiiigAooooAK
KKKACiiigAooooA+gv2a/wDjx8Tf79t/KSvc68M/Zr/48fE3+/bfykr3OgAooooAKKKKACiiigAooooA
KKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA
KKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAphk54AwDjLHGfpT6ijyAp2k7V2kD+Ej/GgB4b
J2spVhzjPWnVHkmVQeq5JH90HtUlABRRRQAV5L+0T/yTzT/+wqn/AKKlr1qvJf2if+Seaf8A9hVP/RUt
AHzJRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQBIqFhknCg9aUxdQCdwHRhinIcIDzwTn2z0NJGArg
5BIPOOwoA98/Zr/48fE3+/bfykr3OvDP2bP+PHxN/v238pK9zoAKKKKACiiigAooooAKKKKACiiigAoo
ooAKKKKACmGTngDAOMscZ+lPqKPICnaTtXaQP4SP8aAHhsnaylWHOM9adUeSZVB6rkkf3Qe1SUAFFFFA
BRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFA
BRRRQAUUUUAFIUVjkjn1BpaKAEACjCgAegpaKKACiiigAryX9on/AJJ5p/8A2FU/9FS161Xkv7RP/JPN
P/7Cqf8AoqWgD5kooooAKKKKACiiigAooooAKKKKACiiigAooooAVWKnIOD7U5nZhgnj0FMooA+gv2a/
+PHxN/v238pK9zrwz9mv/jx8Tf79t/KSvc6ACiiigAooooAKKKKACiiigAooooAKKKKACiiigApCisck
c+oNLRQAgAUYUAD0FLRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFA
BRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAV5L+0T/wAk80//ALCqf+ipa9ar
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
lvrUCHyLjGA4/uP7fyr5Q1PTL3RtSn0/ULd7e6t32SRyDkH/ADyD3HIr7orhviR8NrLx5p3mx+Xb6zAh
+z3GMBx/cf2/UUAfIdFXdT0y90bUp9P1C3e3urd9kkcg5B/z0PcciqVABRRRQAUUUUAFFFFABRRRQAUU
UUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFPRd7YzgDknHSgARN7egHU46VLH
tz+7BJ7qe4pI9u793uDdgx4NMcLwyd+3pQBIiqDvXc5B4Xb0+tMm6qCcsBgnP1pm4k5JOTUlraz3t1Fa
2sLzTyuEjjjXczsegAoAW1tZ726itbWF5p5nCRxxrlnY8AAV9SfC74W2/g21XU9TRJtclX0ytsp/hX/a
9W/yT4XfC238G2q6nqaJNrsq+mVtlP8ACv8Aterf5PpXOcmgA5zk0UUUAFFFFABRRRQAUUUUAFFFFABR
RSE4XOCe+BQAp6ds9gTUSKrqxcAvn5vUURokke5lDFuSSKEXJ3BjlWIB9RQAeXktuB3DowON1OVDkFto
C8Kq9qfRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAc
N8SPhtZePNO82Py7fWoEP2e4IwHH9x/b9RXyhqemXujalPp+oWz291bvskjccg/55B79RX3RXDfEj4b2
XjzTfNj2W+swJi3uCMBx/cf2/kaAPkOirup6Ze6NqU+n6hbvb3Vu+ySNxyD/AJ5B/EVSoAKKKKACiiig
AooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACpY5NmVPKkYNRUUAT7Viw
+7d3UY61BTtzbSueDUtraz3t1Fa2sLzTysEjjjXczsegAFACWtrPe3UVrawvNPK4SOONdzOx6ACvqX4X
fC2Dwbarqepqk2uSr6ZW2U/wr/terf5K/C74W2/g21XU9TRJtclX6rbKf4V/2vVv8n0nnOTQAc5yaKKK
ACiiigAooooAKKKKACiiigAooooAKKKKAIpE53rn/aUHGakAAUBRgDoKWigAooooAKKKKACiiigAoooo
AKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigDhviR8NrLx5p3mx+Xb6zA
h+z3BGA4/uP7fqK+UNT0y90fUZ9P1C2e3urdtkkcg5B/z0P5V90Vw3xI+G1l4807zY9lvrUCHyLjGA4/
uP7fyoA+Q6Ku6npl7o2pT6fqFu9vdW77JI5ByD/nkHuORVKgAooooAKKKKACiiigAooooAKKKKACiiig
AooooAKKKKACiiigAooooAKKKKACiiigAooqe1tZ726itbWF5p5nCRxxrlnY8AAUAFraz3t1Fa2sLzTz
OEjjjXczseAAK+pfhd8LoPBtqmp6miTa5Mn1W2BH3V/2vVv8lPhd8Lbfwbarqepok2uSr6ZW2U/wr/te
rf5PpXOcmgA5zk0UUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUU
UUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAcN8SPhtZePNO8
2Py7fWYEP2e4xgOP7j+36ivlDU9MvdG1KfT9Qt3t7q3fZJHIOQf89D3HIr7orhviR8NrLx5p3mx+Xb61
Ah+z3BGA4/uP7fqKAPkOirup6Ze6NqU+n6hbPb3Vu+ySNxyD/nkHv1FUqACiiigAooooAKKKKACiiigA
ooooAKKKKACiiigAooooAKKKKACiiigAooqa1tZ726itbWF5p5XCRxxruZ2PQAUAFraz3t1Fa2sLzTyu
EjjjXczsegAr6l+F3wtt/Btqup6miTa7KvplbZT/AAr/ALXq3+SfC74WweDbVdT1NUm1yVfTK2yn+Ff9
r1b/ACfSuc5NABznJooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiig
AooooAKKKKACiiigAooooAaxIGBjLHAzTQpbnc4HZt3X8Kc4JXK43KcjNM5xtxJtPVdv9aAHoSwOQAQc
Ejv/AJBp1NUEAljkscn2/wAinUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAcN8SP
hvZePNN82PZb6zAmLe4IwHH9x/b+Rr5Q1PTL3RtSn0/ULd7e6t32SRuOQf8APIP4ivuiuG+JHw2svHmn
ebH5dvrMCH7PcEYDj+4/t+ooA+Q6Ku6npl7o+oz6fqFs9vdW7bJI5ByD/nofyqlQAUUUUAFFFFABRRRQ
AUUUUAFFFFABRRRQAUUUUAFFFFABRRU9raz3t1Fa2sLzTzOEjjjXczseAAKAC1tZ726itbWF5p5WCRxx
ruZ2PQACvqX4XfC238G2q6nqaJNrkq/VbZT/AAr/ALXq3+SfC74XQeDbVNT1NEm1yZPqtsCPur/terf5
PpPOcmgA5zk0UUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUA
FFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUA
FFFFAHDfEj4bWXjzTvNj2W+tQIfIuMYDj+4/t/KvlDU9MvdG1KfT9Qt3t7q3fZJHIOQf88g9xyK+6K4b
4kfDay8ead5sfl2+swIfs9xjAcf3H9v1FAHyHRV3U9MvdG1KfT9Qt3t7q3fZJHIOQf8APQ9xyKpUAFFF
FABRRRQAUUUUAFFFFABRRRQAUUUUAFFFTWtrPe3UVrawvNPK4SOONdzOx6ACgBbW1nvbqK1tYXmnmcJH
HGuWdjwABX1J8Lvhbb+DbVdT1NEm1yVfTK2yn+Ff9r1b/JPhd8Lbfwbarqepok2uyr6ZW2U/wr/terf5
PpXOcmgA5zk0UUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUA
FFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUA
FFFFABRRRQAUUUUAcN8SPhtZePNO82Py7fWoEP2e4IwHH9x/b9RXyhqemXujalPp+oWz291bvskjccg/
55B79RX3RXDfEj4b2XjzTfNj2W+swJi3uCMBx/cf2/kaAPkOirup6Ze6NqU+n6hbvb3Vu+ySNxyD/nkH
8RVKgAooooAKKKKACiiigAooooAKKKntbWe9uorW1heaeVgkcca7mdj0AAoAS1tZ726itbWF5p5XCRxx
ruZ2PQAV9S/C74WweDbVdT1NUm1yVfTK2yn+Ff8Aa9W/yV+F3wtt/Btqup6miTa5Kv1W2U/wr/terf5P
pPOcmgA5zk0UUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAF
FFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUU1nCnBySeQoFAAzYOACz
HkAUK4bIAIK8EEdKiL/MzD5Q3y7iPuYpybSyhMlVzlv7xNAEtFFFABRRRQAUUUUAFFFFABRRRQAUUUUA
FFFFAHDfEj4bWXjzTvNj8u31mBD9nuCMBx/cf2/UV8oanpl7o+oz6fqFs9vdW7bJI5ByD/nofyr7orhv
iR8NrLx5p3mx7LfWoEPkXGMBx/cf2/lQB8h1IIsgFmC56Zq5qOkX2kalcafqEDW11A22SKTg5/r7Hv1F
Q4OS6rl+Fxj7tAFdlKNtI5FNqWQjaq8Fh1I71FQAUUUUAFFFT2trPe3UVrawvNPM4SOONcs7HgACgAtb
We9uorW1heaeZwkcca7mdjwABX1L8LvhdB4NtU1PU0SbXJk+q2wI+6v+16t/kp8Lvhbb+DbVdT1NEm1y
VfTK2yn+Ff8Aa9W/yfSuc5NABznJooooAKKKKACiiigAooooAKKKKACiims4U4OSTyFAoAGbBwAWY8gC
hXDZABBXggjpURf5mYfKG+XcR9zFOTaWUJkquct/eJoAlooooAKKKKACiiigAooooAKKKKACiiigAooo
oAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACjtmims4XgAliMgAdaAGtKoj3
ghsjIApGLJIwyFD4w5PTikXgNIoJJ/1iEU6PqwXJj7ZHT2oAEI34QkoowTnqakoooAKKKKACiiigAooo
oAKKKKACiiigAooooAKKKKACiiigDh/iP8OLLx1p3nw+Xb61Ah+z3BGA4/uP7fqK+UdW0280fUptO1C3
e3vLdiksb9Qf/wBWOa+5q4b4kfDay8ead5sfl2+tQIfs9wRgOP7j+36igD5Doq7qemXujalPp+oWz291
bvskjccg/wCeQe/UVSoAKKKmtbWe9uorW1heaeVwkcca7mdj0AFABa2s97dRWtrC808rhI4413M7HoAK
+pfhd8Lbfwbarqepok2uyr6ZW2U/wr/terf5J8LvhbB4NtV1PU1SbXJV9MrbKf4V/wBr1b/J9K5zk0AH
OcmiiigAooooAKKKKACiiigAooooAKO2aKazheACWIyAB1oAa0qiPeCGyMgCkYskjDIUPjDk9OKReA0i
gkn/AFiEU6PqwXJj7ZHT2oAEI34QkoowTnqakoooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACi
iigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiml1U4JJJ5AA5oAGdVODkk84ApgdQ7MW
G18bW9cUisFdnLEq3G4/w+xqTZiTcDgH7y460ARO3zNKhyEABIPXnpU9N2fNkszYOQCelOoAKKKKACii
igAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAOG+JHw3svHmm+bHst9ZgTFvcEYDj+4/t/I1
8oanpl7o2pT6fqFu9vdW77JI3HIP+eQfxFfdFcb47+G+j+PIo3une01CEYjvIlDHb/dYfxCgD5DtbWe9
uorW1heaeVgkcca7mdj0AAr6l+F3wtt/Btqup6miTa5Kv1W2U/wr/terf5N3wJ8KdG8DTverM+oaiRtW
5ljCiJT2VecE+td5znJoAOc5NFFFABRRRQAUUUUAFFFFABRRRQAUUU0uqnBJJPIAHNAAzqpwcknnAFMD
qHZiw2vja3rikVgrs5YlW43H+H2NSbMSbgcA/eXHWgCJ2+ZpUOQgAJB689Knpuz5slmbByAT0p1ABRRR
QAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRR
QAUUUUAFRKxSRhIQC3Ib1qWkZQ67W6dvagBg2vKxGCu3aT6n/wDVUnQYAwBwBSKG24YgkdwOtLQAUUUU
AFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUU
AFFFFABRRRQAVErFJGEhALchvWpaRlDrtbp29qAGDa8rEYK7dpPqf/1VJ0GAMAcAUihtuGIJHcDrS0AF
FFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAF
FFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAF
FFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAF
FFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAF
FFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAF
FFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAF
FFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUwyc8A
YBxljjP0p9RR5AU7Sdq7SB/CR/jQA8Nk7WUqw5xnrTqjyTKoPVckj+6D2qSgAooooAKKKKACiiigAooo
oAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAphk
54AwDjLHGfpT6ijyAp2k7V2kD+Ej/GgB4bJ2spVhzjPWnVHkmVQeq5JH90HtUlABRRRQAUUUUAFFFFAB
RRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAB
SFFY5I59QaWigBAAowoAHoKWiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoooo
AKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigApCisckc+oNLRQAgAUYUAD0FLRRQAUUUUAFFF
FABRRRQAUUUUAFFFFABRRRQB/9k=
</value>
</data>
<data name="buttonUp.BackgroundImage" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
/9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwg
JC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIy
MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCAKAAoADASIAAhEBAxEB/8QA
HwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIh
MUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVW
V1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXG
x8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQF
BgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAV
YnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOE
hYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq
8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD3WiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKA
CiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKA
CiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKA
CiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKA
CiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKA
CiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKA
CiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKRn
RThmAJ7E0ALRR2yDkHkGigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKK
ACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoopGdFOGYAnsTQAtFHbIOQeQaKACiiigAooooAKKK
KACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKK
TIDKp6t0FABkAgFgCegJ61EuTlVH7wk72I+7/kUi/vFwFBkbl2I+7TgiNuBUEL8qkHqKAFj4LKuNikBT
/OpKAABgAADoBRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQA
UUUUAFFFFABRRRQAUUUUAFFFFABRRSZAZVPVugoAMgEAsAT0BPWolycqo/eEnexH3f8AIpF/eLgKDI3L
sR92nBEbcCoIX5VIPUUALHwWVcbFICn+dSUAADAAAHQCigAooooAKKKKACiiigAooooAKKKKACiiigAo
oooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKOMgEgE9BmgBkpXy8MeW4GT0pm
0htrNiQcq57+1LEqvHuZQzEndkdKRevlsAyZIQntigBwCv8AMVZW6MAetPAAG1QAB0FAGBgAADgUtABR
RSgE9BQAlFKVI6j9KSgAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACi
iigAooooAKKKKACiiigAooo4yASAT0GaAGSlfLwx5bgZPSmbSG2s2JByrnv7UsSq8e5lDMSd2R0pF6+W
wDJkhCe2KAHAK/zFWVujAHrTwABtUAAdBQBgYAAA4FLQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUU
UAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFIThc4J74FACnp2z2BNRIqurFwC+
fm9RRGiSR7mUMW5JIoRcncGOVYgH1FAB5eS24HcOjA43U5UOQW2gLwqr2p9FABRRXD/Ef4kWXgLTfLj2
XGszpmC3J+4P77+38zQBJ8QPiRp3gOzVWQXeqTDMNoGxgf3nPZa+eNa+L3jfWpmZtbmsoyflisf3IX8R
8x/EmuT1TVL3WdSn1DULl7i6nYvJI55J/wAPQdMcVRoA7XSfix420iYPH4gu7kd0vG89T/31kivffhx8
VrDxyv2G6jSy1lFyYQ3yTAdSmf1U18m1Pa3U9jdRXVrM8NxE4eOSNsMjDoQaAPu7nODRXm3wt+KVv4zt
V0zUmSHXIk5HAW5AH3l/2vUf5HpPOcGgAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiig
AooooAKKKKACiiigAooooAKKKQnC5wT3wKAFPTtnsCaiRVdWLgF8/N6iiNEkj3MoYtySRQi5O4McqxAP
qKADy8ltwO4dGBxupyocgttAXhVXtT6KACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKK
ACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAIpE53rn/aUHGakAAUBRgDoKWigAoorh
viR8SLLwHpvlx7LjWZ1zb25OQg/vv7fzoAX4j/Eiy8B6b5cey41mdT9ntychB/ff2/nXyhqmqXus6nca
hqFy9xdTsXkkc8k/4eg6Y4o1TVL3WdSuNQ1C4e4urhi8kjnkn+g7AenAqjQAUUUUAFFFFAE9rdT2N1Fd
Wszw3ETh45I2wyMOhBr6l+FvxSt/GdqumakyQ65EnI4C3IA+8v8Ateo/yPlOp7W6nsbqK6tZnguImDxy
RthkYdCCKAPu7nODRXm3wt+KVv4ztV0zUmjh1yJOegW5AH3l/wBr1H+R6TznBoAKKKKACiiigAooooAK
KKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAIpE53rn/AGlBxmpAAFAUYA6ClooA
KKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA
KKKKACiiigAooooAKKKKACiiuG+JHxIsvAem+XHsuNZnUm3tychB/ff2/nQAvxI+JFl4D03y49lxrM6k
29uTkIP77+36mvlDVNUvdZ1K41HULl7i6nYvJI55J/w7AdAOKNU1S91nUrjUNQuXuLqd98kjnkn+g9B0
xwKo0AFFFFABRRRQAUUUUAFFFFAE9rdXFjdxXVrM8NxC4eOSNsMjDoQa+pfhb8UrfxnarpmpMkOuQpyO
AtyAPvL/ALXqP8j5Tqe0urixu4bq1mkguIXDxyxttZGHQgigD7u5zg0V5t8LvilB4ztV0zUmSHXIU57C
5UD7y/7XqK9J5zg0AFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUU
AFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUU
AFFFFABRRRQAUUUUAFFFFABRRXD/ABH+JFl4D03y49lxrM6n7Pbk5CD++/t/OgA+I/xIsvAWm+XHsuNZ
nTMFuT9wf339v5mvlDVNUvdZ1KfUNQuXuLqdi8kjnkn/AA9B0xxRqmqXus6ncahqFy9xdTsXkkc8k/4e
g6Y4qjQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQBPa3U9jdRXVrM8NxE4eOSNsMjDoQa+pfhb8Urfxna
rpmpMkOuRJyOAtyAPvL/ALXqP8j5Tqe1up7G6iurWZ4biJw8ckbYZGHQg0Afd3OcGivNvhb8Urfxnarp
mpMkOuRJyOAtyAPvL/teo/yPSec4NABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABR
RRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFADWJAwMZY4GaaFLDO5wOzbuv4U5wSuVxuU5
GaZzjbiTaeq7f60APQlgcgAg4JHf/INOpFBAJY5LHJ9v8iloAKKKKACiiigAooooAKKKKACiiigAoooo
AKKKKACiiigAooooAKKK4f4kfEiy8B6b5cey41mdSbe3JyEH99/b9TQAnxI+JFl4D03y49lxrM65t7cn
IQf339v518o6pql7rOpXGoahcPcXVwxeSRzyT/QdgPTgUapql7rOpXGo6hcvcXU7F5JHPJP+HYDoBxVG
gAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAJ7W6nsbqK6tZnguImDxyRthkYdCCK+pvhb8U
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
gAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiu
G+JHxIsvAem+XHsuNZnXNvbk5CD++/t/OgBfiP8AEiy8B6b5cey41mdT9ntychB/ff2/nXyhqmqXus6n
cahqFy9xdTsXkkc8k/4eg6Y4o1TVL3WdSuNQ1C4e4urhi8kjnkn+g7AenAqjQAUUUUAFFFFABRRRQAUU
UUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUU
UUAFFFFABRRRQAUUUUAWLO8udPvIbyzneC4hcPHLG2GRh0INfU/wv+KFt42s10+/ZINdhT50HC3AH8ae
/qK+UKsWd5c6feQ3lnO8FxC4eOWNsMjDoQaAPu2ivOfhf8ULbxtZrp9+yQa7CnzoOFuAP409/UV6NQAU
UUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFKoywFAHE/
Ej4hWvgLRlZVSfVboEWsDHgf7bf7I/U18m6pql7rOpXGo6hcvcXU7F5JHPJP+HYDoBxXT/FXXJde+I+s
yyEmO2na0hXPASMlePqQW/GuKoAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKA
CiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAsWd5c
6feQ3lnO8FxC4eOWNsMjDoQa+qvhd8TIfHNgbO+2xa3bJmVV4E6/31H8xXybW/4L1yXw54y0rVYnK+Tc
L5mO8ZOHH4qSKAPtainOMORTaACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigA
ooooAKKKKAClU4cemaSigD40+I+mS6T8RdftZVIzeyTJ/uSHev6NXK19T/F34aSeMrSPVdJUf2xax7DG
cD7RH125/vDnFfMF5Z3On3UlreW8tvcRNtkilQqyH0IPSgCvRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAB
RRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAEioWGScKKUxdQCdwHRhinIcIDzwTn2z0N
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
FFFABRRRQAUUUUAFFFFABRRRQAUUUmQGVT1boKADIBALAE9AT1qJcnKqP3hJ3sR93/IpF/eLgKDI3LsR
92nBEbcCoIX5VIPUUALHwWVcbFICn+dSUAADAAAHQCigAooooAKKKKACiiigAooooAKKKKACiiigAooo
oAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACvlT47/8AJVb/AP64Qf8AosV9V18qfHf/AJKrf/8A
XCD/ANFigDzWiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigDuvg5/yVnQf+ukn/
AKKevrs9fxr5E+Dn/JWdB/66Sf8Aop6+uz1/GgAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKK
ACiiigAooooAKKKOMgEgE9BmgBkpXy8MeW4GT0pm0htrNiQcq57+1LEqvHuZQzEndkdKRevlsAyZIQnt
igBwCv8AMVZW6MAetPAAG1QAB0FAGBgAADgUtABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUU
AFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABXyp8d/wDkqt//ANcIP/RYr6rr5U+O/wDyVW//AOuE
H/osUAea0UUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAd18HP8AkrOg/wDXST/0
U9fXZ6/jXyJ8HP8AkrOg/wDXST/0U9fXZ6/jQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFA
BRRRQAUUUhOFzgnvgUAKenbPYE1Eiq6sXAL5+b1FEaJJHuZQxbkkihFydwY5ViAfUUAHl5Lbgdw6MDjd
TlQ5BbaAvCqvan0UAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUU
AFFFFABRRRQAUUUUAFFFFABXyp8d/wDkqt//ANcIP/RYr6rr5U+O/wDyVW//AOuEH/osUAea0UUUAFFF
FABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAd18HP8AkrOg/wDXST/0U9fXZ6/jXyJ8HP8A
krOg/wDXST/0U9fXZ6/jQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUARSJzv
XP8AtKDjNSAAKAowB0FLRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFF
ABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABXyp8d/+Sq3/wD1wg/9FivquvlT47/8lVv/APrhB/6LFAHm
tFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAHdfBz/krOg/9dJP/RT19dnr+NfI
nwc/5KzoP/XST/0U9fXZ6/jQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFF
FFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFF
FFABRRRQAUUUUAFfKnx3/wCSq3//AFwg/wDRYr6rr5U+O/8AyVW//wCuEH/osUAea0UUUAFFFFABRRRQ
AUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAd18HP+Ss6D/wBdJP8A0U9fXZ6/jXyJ8HP+Ss6D/wBd
JP8A0U9fXZ6/jQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAU
UUUAFFFFABRRRQAUUUUAFFFFADWJAwMZY4GaaFLDO5wOzbuv4U5wSuVxuU5GaZzjbiTaeq7f60APQlgc
gAg4JHf/ACDTqRQQCWOSxyfb/IpaACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACvl
T47/APJVb/8A64Qf+ixX1XXyp8d/+Sq3/wD1wg/9FigDzWiiigAooooAKKKKACiiigAooooAKKKKACii
igAooooAKKKKACiiigDuvg5/yVnQf+ukn/op6+uz1/GvkT4Of8lZ0H/rpJ/6Kevrs9fxoAKKKKACiiig
AooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiig
AooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACvlT47/8AJVb/AP64Qf8A
osV9V18qfHf/AJKrf/8AXCD/ANFigDzWiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAC
iiigDuvg5/yVnQf+ukn/AKKevrs9fxr5E+Dn/JWdB/66Sf8Aop6+uz1/GgAooooAKKKKACiiigAooooA
KKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA
KKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAK+VPjv8A8lVv/wDrhB/6LFfVdfKnx3/5
Krf/APXCD/0WKAPNaKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAO6+Dn/JWdB/
66Sf+inr67PX8a+RPg5/yVnQf+ukn/op6+uz1/GgAooooAKKKKACiiigAooooAKKKKACiiigAooooAKK
KKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKK
KazhTg5JPIUCgAZsHABZjyAKFcNkAEFeCCOlRF/mZgdu75SxH3MU5NpZQmSq5y394mgCWiiigAooooAK
KKKACiiigAr5U+O//JVb/wD64Qf+ixX1XXyp8d/+Sq3/AP1wg/8ARYoA81ooooAKKKKACiiigAqQRZAL
MFz0zQIWIzlVz0BPWpsEneq5fhcY+7QBXZSjbWGCKbUshG1VyCwzkjvUVABRRRQAUUUUAFFFFABRRRQA
UUUUAd18HP8AkrOg/wDXST/0U9fXZ6/jXyJ8HP8AkrOg/wDXST/0U9fXZ6/jQAUUUUAFFFFABRRTWcKc
HJJ5CgUADNg4ALMeQBQrhsgAgrwQR0qIv8zMDt3fKWI+5inJtLKEyVXOW/vE0AS0UUUAFFFFABRRRQAU
UUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABR2zRTW
cLwASxGQAOtADWlUR7wQ2RkAUjFkkYZCh8YcnpxSLwGkUEk/6xCKdHwWC58vtkdKABCN+EJKKME56mpK
KKACiiigAooooAKKKKACiiigAr5U+O//ACVW/wD+uEH/AKLFfVdfKnx3/wCSq3//AFwg/wDRYoA81ooo
oAKKKKAHKpY4AyacIz5bOeMdqdGhyrMQvdcnrT/mLZ6SDgg9xQApH/LRFLk9MDpUUowQO4HJHrSSYD/J
keozUdABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAHdfBz/krOg/8AXST/ANFPX12ev418ifBz/krOg/8A
XST/ANFPX12ev40AFFFFABR2zRTWcLwASxGQAOtADWlUR7wQ2RkAUjFkkYZCh8YcnpxSLwGkUEk/6xCK
dHwWC58vtkdKABCN+EJKKME56mpKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAC
iiigAooooAKKKKACiiigAooooAKKKKACiiigAooppdVOCSSeQAKABnVTg5JPPApgdQ7MWG18bW9cUisF
dnLEq3G4/wAPsak2Yk3A4B+8uOtAETt8zSochAASD156VPTdmWyWZgDkAnpTqACiiigAooooAKKKKACi
iigAooooAK+a/wBofSJLXxnZ6qEIt760Vd3/AE0QkMP++SlfSlc/4z8I2Pjbw7NpN6fLbO+3nCgmKQdD
9OxFAHxVRXS+K/BGveDb0watZMsZbEdygLQyf7rf0ODXNUAFSCJyM4HIzjPJpFXPOV+hanSEFhIpx2x6
UAOlRnfegLKfQdKVxmMg8sgGT/So2kDENtG7v6GhpCyhQAq+goAjooooAKKKKACiiigAooooAKKKKACi
iigAoorc8OeE9b8WXotdHsJbhs4eQLiOP3ZugoA7H4FaTLqHxMtLtVJh0+KSeRvqpQD83r6o71yfw+8D
WvgTw/8AY43We+nIe7uAPvsOgH+yueK6ygAooppdVOCSSeQAKABnVTg5JPPApgdQ7MWG18bW9cUisFdn
LEq3G4/w+xqTZiTcDgH7y460ARO3zNKhyEABIPXnpU9N2ZbJZmAOQCelOoAKKKKACiiigAooooAKKKKA
CiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAqJWKSMJCAW
5DetS0jKHXa3Tt7UAMG15WIwV27SfU//AKqk6DAGAOAKRQ23DEEjuB1paACiiigAooooAKKKKACiiigA
ooooAKKKKACiiigBGAkjaORVdGGCrDIP4Vlt4W8NM2W8OaQT6myjP9K1aKAMk+FPDR/5lvR/xsY/8KX/
AIRbw3/0Lmkf+AMf+FatFAGT/wAIp4a/6FvR/wDwBj/wo/4RTw1/0Lej/wDgDH/hWtRQBk/8Ip4a/wCh
b0f/AMAY/wDCj/hFPDX/AELej/8AgDH/AIVrUUAZP/CKeGv+hb0f/wAAY/8ACj/hFPDX/Qt6P/4Ax/4V
rUUAZP8Awinhr/oW9H/8AY/8KP8AhFPDX/Qt6P8A+AMf+Fa1FAGT/wAIp4a/6FvR/wDwBj/wo/4RTw1/
0Lej/wDgDH/hWtRQBk/8Ip4a/wChb0f/AMAY/wDCj/hFPDX/AELej/8AgDH/AIVrUUAZP/CKeGv+hb0f
/wAAY/8ACj/hFPDX/Qt6P/4Ax/4VrUUAZP8Awivhr/oW9Hz/ANeMf+FakSRwQrDBGkUSjCpGoVV/AdKd
RQAUUUUAFRKxSRhIQC3Ib1qWkZQ67W6dvagBg2vKxGCu3aT6n/8AVUnQYAwBwBSKG24YgkdwOtLQAUUU
UAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUU
UAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUU
UAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUU
UAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUU
UAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUU
UAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUU
UAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABTDJzwBgH
GWOM/Sn1FHwFO0nau0gfwkf40APDZO1lKsOcZ606o8kyqD1XJI/ug9qkoAKKKKACiiigAooooAKKKKAC
iiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKYZOeA
MA4yxxn6U+oo+Ap2k7V2kD+Ej/GgB4bJ2spVhzjPWnVHkmVQeq5JH90HtUlABRRRQAUUUUAFFFFABRRR
QAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABSFF
Y5I59QaWigBAAowoAHoKWiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKK
KKACiiigAooooAKKKKACiiigAooooAKKKKACiiigApCisckc+oNLRQAgAUYUAD0FLRRQAUUUUAFFFFAB
RRRQAUUUUAFFFFABRRRQB//Z
</value>
</data>
<data name="buttonRight.BackgroundImage" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
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
AIC5fO97/w8OhQ6IW63aKAAAAABJRU5ErkJggg==
</value>
</data>
</root>

View File

@ -0,0 +1,351 @@
namespace ProjectAccordionBus
{
partial class FormBusCollection
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
groupBoxTools = new GroupBox();
panelCompanyTools = new Panel();
buttonDeleteBus = new Button();
maskedTextBox = new MaskedTextBox();
buttonRefresh = new Button();
buttonGoToCheck = new Button();
buttonAddBus = new Button();
panelStorage = new Panel();
buttonCollectionDel = new Button();
listBoxCollection = new ListBox();
buttonCollectionAdd = new Button();
buttonCreateCompany = new Button();
radioButtonList = new RadioButton();
radioButtonMassive = new RadioButton();
textBoxCollectionName = new TextBox();
comboBoxSelectorCompany = new ComboBox();
labelCollectionName = new Label();
pictureBox = new PictureBox();
menuStrip = new MenuStrip();
файлToolStripMenuItem = new ToolStripMenuItem();
saveToolStripMenuItem = new ToolStripMenuItem();
loadToolStripMenuItem = new ToolStripMenuItem();
saveFileDialog = new SaveFileDialog();
openFileDialog = new OpenFileDialog();
groupBoxTools.SuspendLayout();
panelCompanyTools.SuspendLayout();
panelStorage.SuspendLayout();
((System.ComponentModel.ISupportInitialize)pictureBox).BeginInit();
menuStrip.SuspendLayout();
SuspendLayout();
//
// groupBoxTools
//
groupBoxTools.Controls.Add(panelCompanyTools);
groupBoxTools.Controls.Add(panelStorage);
groupBoxTools.Dock = DockStyle.Right;
groupBoxTools.Location = new Point(625, 24);
groupBoxTools.Name = "groupBoxTools";
groupBoxTools.Size = new Size(175, 511);
groupBoxTools.TabIndex = 0;
groupBoxTools.TabStop = false;
groupBoxTools.Text = "Инструменты";
//
// panelCompanyTools
//
panelCompanyTools.Controls.Add(buttonDeleteBus);
panelCompanyTools.Controls.Add(maskedTextBox);
panelCompanyTools.Controls.Add(buttonRefresh);
panelCompanyTools.Controls.Add(buttonGoToCheck);
panelCompanyTools.Controls.Add(buttonAddBus);
panelCompanyTools.Dock = DockStyle.Bottom;
panelCompanyTools.Enabled = false;
panelCompanyTools.Location = new Point(3, 317);
panelCompanyTools.Name = "panelCompanyTools";
panelCompanyTools.Size = new Size(169, 191);
panelCompanyTools.TabIndex = 10;
//
// buttonDeleteBus
//
buttonDeleteBus.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right;
buttonDeleteBus.Location = new Point(6, 109);
buttonDeleteBus.Name = "buttonDeleteBus";
buttonDeleteBus.Size = new Size(160, 23);
buttonDeleteBus.TabIndex = 5;
buttonDeleteBus.Text = "Удаление автобуса";
buttonDeleteBus.UseVisualStyleBackColor = true;
buttonDeleteBus.Click += buttonDeleteBus_Click;
//
// maskedTextBox
//
maskedTextBox.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right;
maskedTextBox.Location = new Point(6, 80);
maskedTextBox.Mask = "00";
maskedTextBox.Name = "maskedTextBox";
maskedTextBox.Size = new Size(160, 23);
maskedTextBox.TabIndex = 5;
maskedTextBox.ValidatingType = typeof(int);
maskedTextBox.MaskInputRejected += maskedTextBox_MaskInputRejected;
//
// buttonRefresh
//
buttonRefresh.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right;
buttonRefresh.Location = new Point(6, 167);
buttonRefresh.Name = "buttonRefresh";
buttonRefresh.Size = new Size(160, 21);
buttonRefresh.TabIndex = 7;
buttonRefresh.Text = "Обновить";
buttonRefresh.UseVisualStyleBackColor = true;
buttonRefresh.Click += buttonRefresh_Click;
//
// buttonGoToCheck
//
buttonGoToCheck.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right;
buttonGoToCheck.Location = new Point(6, 138);
buttonGoToCheck.Name = "buttonGoToCheck";
buttonGoToCheck.Size = new Size(160, 23);
buttonGoToCheck.TabIndex = 6;
buttonGoToCheck.Text = "Передать на тесты";
buttonGoToCheck.UseVisualStyleBackColor = true;
buttonGoToCheck.Click += buttonGoToCheck_Click;
//
// buttonAddBus
//
buttonAddBus.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right;
buttonAddBus.Location = new Point(6, 17);
buttonAddBus.Name = "buttonAddBus";
buttonAddBus.Size = new Size(160, 37);
buttonAddBus.TabIndex = 2;
buttonAddBus.Text = "Добавление автобуса";
buttonAddBus.UseVisualStyleBackColor = true;
buttonAddBus.Click += buttonAddBus_Click;
//
// panelStorage
//
panelStorage.Controls.Add(buttonCollectionDel);
panelStorage.Controls.Add(listBoxCollection);
panelStorage.Controls.Add(buttonCollectionAdd);
panelStorage.Controls.Add(buttonCreateCompany);
panelStorage.Controls.Add(radioButtonList);
panelStorage.Controls.Add(radioButtonMassive);
panelStorage.Controls.Add(textBoxCollectionName);
panelStorage.Controls.Add(comboBoxSelectorCompany);
panelStorage.Controls.Add(labelCollectionName);
panelStorage.Dock = DockStyle.Top;
panelStorage.Location = new Point(3, 19);
panelStorage.Name = "panelStorage";
panelStorage.Size = new Size(169, 291);
panelStorage.TabIndex = 8;
//
// buttonCollectionDel
//
buttonCollectionDel.Location = new Point(6, 198);
buttonCollectionDel.Name = "buttonCollectionDel";
buttonCollectionDel.Size = new Size(160, 23);
buttonCollectionDel.TabIndex = 6;
buttonCollectionDel.Text = "Удалить коллекцию";
buttonCollectionDel.UseVisualStyleBackColor = true;
buttonCollectionDel.Click += buttonCollectionDel_Click;
//
// listBoxCollection
//
listBoxCollection.FormattingEnabled = true;
listBoxCollection.ItemHeight = 15;
listBoxCollection.Location = new Point(6, 113);
listBoxCollection.Name = "listBoxCollection";
listBoxCollection.Size = new Size(160, 79);
listBoxCollection.TabIndex = 5;
//
// buttonCollectionAdd
//
buttonCollectionAdd.Location = new Point(3, 81);
buttonCollectionAdd.Name = "buttonCollectionAdd";
buttonCollectionAdd.Size = new Size(163, 23);
buttonCollectionAdd.TabIndex = 4;
buttonCollectionAdd.Text = "Добавить коллекцию";
buttonCollectionAdd.UseVisualStyleBackColor = true;
buttonCollectionAdd.Click += buttonCollectionAdd_Click;
//
// buttonCreateCompany
//
buttonCreateCompany.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right;
buttonCreateCompany.Location = new Point(6, 256);
buttonCreateCompany.Name = "buttonCreateCompany";
buttonCreateCompany.Size = new Size(160, 23);
buttonCreateCompany.TabIndex = 9;
buttonCreateCompany.Text = "Создать компанию";
buttonCreateCompany.UseVisualStyleBackColor = true;
buttonCreateCompany.Click += buttonCreateCompany_Click;
//
// radioButtonList
//
radioButtonList.AutoSize = true;
radioButtonList.Location = new Point(93, 56);
radioButtonList.Name = "radioButtonList";
radioButtonList.Size = new Size(66, 19);
radioButtonList.TabIndex = 3;
radioButtonList.TabStop = true;
radioButtonList.Text = "Список";
radioButtonList.UseVisualStyleBackColor = true;
//
// radioButtonMassive
//
radioButtonMassive.AutoSize = true;
radioButtonMassive.Location = new Point(6, 56);
radioButtonMassive.Name = "radioButtonMassive";
radioButtonMassive.Size = new Size(67, 19);
radioButtonMassive.TabIndex = 2;
radioButtonMassive.TabStop = true;
radioButtonMassive.Text = "Массив";
radioButtonMassive.UseVisualStyleBackColor = true;
//
// textBoxCollectionName
//
textBoxCollectionName.Location = new Point(6, 27);
textBoxCollectionName.Name = "textBoxCollectionName";
textBoxCollectionName.Size = new Size(160, 23);
textBoxCollectionName.TabIndex = 1;
//
// comboBoxSelectorCompany
//
comboBoxSelectorCompany.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right;
comboBoxSelectorCompany.DropDownStyle = ComboBoxStyle.DropDownList;
comboBoxSelectorCompany.FormattingEnabled = true;
comboBoxSelectorCompany.Items.AddRange(new object[] { "Хранилище" });
comboBoxSelectorCompany.Location = new Point(6, 227);
comboBoxSelectorCompany.Name = "comboBoxSelectorCompany";
comboBoxSelectorCompany.Size = new Size(160, 23);
comboBoxSelectorCompany.TabIndex = 1;
comboBoxSelectorCompany.SelectedIndexChanged += comboBoxSelectorCompany_SelectedIndexChanged;
//
// labelCollectionName
//
labelCollectionName.AutoSize = true;
labelCollectionName.Location = new Point(24, 9);
labelCollectionName.Name = "labelCollectionName";
labelCollectionName.Size = new Size(122, 15);
labelCollectionName.TabIndex = 0;
labelCollectionName.Text = "Название коллекции";
labelCollectionName.Click += labelCollectionName_Click;
//
// pictureBox
//
pictureBox.Dock = DockStyle.Fill;
pictureBox.Location = new Point(0, 24);
pictureBox.Name = "pictureBox";
pictureBox.Size = new Size(625, 511);
pictureBox.TabIndex = 4;
pictureBox.TabStop = false;
//
// menuStrip
//
menuStrip.Items.AddRange(new ToolStripItem[] { файлToolStripMenuItem });
menuStrip.Location = new Point(0, 0);
menuStrip.Name = "menuStrip";
menuStrip.Size = new Size(800, 24);
menuStrip.TabIndex = 5;
menuStrip.Text = "menuStrip";
//
// файлToolStripMenuItem
//
файлToolStripMenuItem.DropDownItems.AddRange(new ToolStripItem[] { saveToolStripMenuItem, loadToolStripMenuItem });
файлToolStripMenuItem.Name = айлToolStripMenuItem";
файлToolStripMenuItem.Size = new Size(48, 20);
файлToolStripMenuItem.Text = "Файл";
//
// saveToolStripMenuItem
//
saveToolStripMenuItem.Name = "saveToolStripMenuItem";
saveToolStripMenuItem.ShortcutKeys = Keys.Control | Keys.S;
saveToolStripMenuItem.Size = new Size(181, 22);
saveToolStripMenuItem.Text = "Сохранение";
saveToolStripMenuItem.Click += saveToolStripMenuItem_Click;
//
// loadToolStripMenuItem
//
loadToolStripMenuItem.Name = "loadToolStripMenuItem";
loadToolStripMenuItem.ShortcutKeys = Keys.Control | Keys.L;
loadToolStripMenuItem.Size = new Size(181, 22);
loadToolStripMenuItem.Text = "Загрузка";
loadToolStripMenuItem.Click += loadToolStripMenuItem_Click;
//
// saveFileDialog
//
saveFileDialog.Filter = "txt file | *.txt";
//
// openFileDialog
//
openFileDialog.FileName = "openFileDialog";
openFileDialog.Filter = "txt file | *.txt";
//
// FormBusCollection
//
AutoScaleDimensions = new SizeF(7F, 15F);
AutoScaleMode = AutoScaleMode.Font;
ClientSize = new Size(800, 535);
Controls.Add(pictureBox);
Controls.Add(groupBoxTools);
Controls.Add(menuStrip);
MainMenuStrip = menuStrip;
Name = "FormBusCollection";
Text = "Коллекция автобусов";
groupBoxTools.ResumeLayout(false);
panelCompanyTools.ResumeLayout(false);
panelCompanyTools.PerformLayout();
panelStorage.ResumeLayout(false);
panelStorage.PerformLayout();
((System.ComponentModel.ISupportInitialize)pictureBox).EndInit();
menuStrip.ResumeLayout(false);
menuStrip.PerformLayout();
ResumeLayout(false);
PerformLayout();
}
#endregion
private GroupBox groupBoxTools;
private ComboBox comboBoxSelectorCompany;
private Button buttonAddBus;
private PictureBox pictureBox;
private Button buttonRefresh;
private Button buttonGoToCheck;
private Button buttonDeleteBus;
private MaskedTextBox maskedTextBox;
private Panel panelStorage;
private TextBox textBoxCollectionName;
private Label labelCollectionName;
private Button buttonCollectionAdd;
private RadioButton radioButtonList;
private RadioButton radioButtonMassive;
private ListBox listBoxCollection;
private Button buttonCollectionDel;
private Button buttonCreateCompany;
private Panel panelCompanyTools;
private MenuStrip menuStrip;
private ToolStripMenuItem файлToolStripMenuItem;
private ToolStripMenuItem saveToolStripMenuItem;
private ToolStripMenuItem loadToolStripMenuItem;
private SaveFileDialog saveFileDialog;
private OpenFileDialog openFileDialog;
}
}

View File

@ -0,0 +1,352 @@
using Microsoft.Extensions.Logging;
using ProjectAccordionBus.CollectionGenericObjects;
using ProjectAccordionBus.Drawnings;
using ProjectAccordionBus.Exceptions;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace ProjectAccordionBus;
/// <summary>
///
/// </summary>
public partial class FormBusCollection : Form
{
/// <summary>
/// Хранилише коллекций
/// </summary>
private readonly StorageCollection<DrawningBus> _storageCollection;
/// <summary>
///
/// </summary>
private AbstractCompany? _company = null;
private readonly ILogger _logger;
/// <summary>
/// Конструктор
/// </summary>
public FormBusCollection(ILogger<FormBusCollection> logger)
{
InitializeComponent();
_storageCollection = new();
_logger = logger;
}
/// <summary>
/// Добавление улучшенного троллейбуса
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void ButtonAddAccordionBus_Click(object sender, EventArgs e)
{
FormBusConfig form = new FormBusConfig();
form.Show();
form.AddEvent(SetBus);
}
/// <summary>
/// Создание объекта класса-перемещения
/// </summary>
/// <param name="type">Тип создания объекта</param>
private void CreateObject(string type)
{
if (_company == null)
{
return;
}
Random random = new();
DrawningBus drawningBus;
switch (type)
{
case nameof(DrawningBus):
drawningBus = new DrawningBus(random.Next(100, 300), random.Next(1000, 3000), GetColor(random));
break;
case nameof(DrawningAccordionBus):
drawningBus = new DrawningAccordionBus(random.Next(100, 300), random.Next(1000, 3000), GetColor(random), GetColor(random),
Convert.ToBoolean(random.Next(0, 2)), Convert.ToBoolean(random.Next(0, 2)), Convert.ToBoolean(random.Next(0, 2)));
break;
default:
return;
}
if (_company + drawningBus != -1)
{
MessageBox.Show("Объект добавлен");
pictureBox.Image = _company.Show();
}
else
{
MessageBox.Show("Не удалось добавить объект");
}
}
/// <summary>
/// Выбор цвета
/// </summary>
/// <param name="random"></param>
/// <returns></returns>
private static Color GetColor(Random random)
{
Color color = Color.FromArgb(random.Next(0, 255), random.Next(0, 255), random.Next(0, 255));
ColorDialog dialog = new();
if (dialog.ShowDialog() == DialogResult.OK)
{
color = dialog.Color;
}
return color;
}
private void buttonAddBus_Click(object sender, EventArgs e)
{
FormBusConfig form = new();
form.Show();
form.AddEvent(SetBus);
}
private void SetBus(DrawningBus bus)
{
try
{
if (_company == null || bus == null)
{
return;
}
if (_company + bus != -1)
{
MessageBox.Show("Объект добавлен");
pictureBox.Image = _company.Show();
_logger.LogInformation("Добавлен объект: {0}", bus.GetDataForSave());
}
}
catch (CollectionOverflowException ex)
{
MessageBox.Show(ex.Message);
_logger.LogError($"Ошибка: {ex.Message}");
}
}
private void buttonDeleteBus_Click(object sender, EventArgs e)
{
if (string.IsNullOrEmpty(maskedTextBox.Text) || _company == null)
{
return;
}
if (MessageBox.Show("Удалить объект?", "Удаление", MessageBoxButtons.YesNo, MessageBoxIcon.Question) != DialogResult.Yes)
{
return;
}
int pos = Convert.ToInt32(maskedTextBox.Text);
try
{
if (_company - pos != null)
{
MessageBox.Show("Объект удален");
pictureBox.Image = _company.Show();
_logger.LogInformation("Удален объект по позиции " + pos);
}
else
{
MessageBox.Show($"Не удалось удалить объект");
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
_logger.LogError("Ошибка: {Message}", ex.Message);
}
}
private void buttonGoToCheck_Click(object sender, EventArgs e)
{
if (_company == null)
{
return;
}
DrawningBus? bus = null;
int counter = 100;
while (bus == null)
{
try
{
bus = _company.GetRandomObject();
}
catch (ObjectNotFoundException)
{
counter--;
if (counter <= 0)
{
break;
}
}
}
if (bus == null)
{
return;
}
FormAccordionBus form = new()
{
SetBus = bus
};
form.ShowDialog();
}
private void buttonRefresh_Click(object sender, EventArgs e)
{
if (_company == null)
{
return;
}
pictureBox.Image = _company.Show();
}
private void comboBoxSelectorCompany_SelectedIndexChanged(object sender, EventArgs e)
{
panelCompanyTools.Enabled = false;
}
private void maskedTextBox_MaskInputRejected(object sender, MaskInputRejectedEventArgs e)
{
}
private void labelCollectionName_Click(object sender, EventArgs e)
{
}
private void buttonCollectionAdd_Click(object sender, EventArgs e)
{
if (string.IsNullOrEmpty(textBoxCollectionName.Text) ||
(!radioButtonList.Checked && !radioButtonMassive.Checked))
{
MessageBox.Show("Не все данные заполнены", "Ошибка",
MessageBoxButtons.OK, MessageBoxIcon.Error);
_logger.LogWarning("Не заполненная коллекция");
return;
}
CollectionType collectionType = CollectionType.None;
if (radioButtonMassive.Checked)
{
collectionType = CollectionType.Massive;
}
else if (radioButtonList.Checked)
{
collectionType = CollectionType.List;
}
_storageCollection.AddCollection(textBoxCollectionName.Text, collectionType);
_logger.LogInformation($"Добавлена коллекция: {textBoxCollectionName.Text}");
RefreshListBoxItems();
}
private void RefreshListBoxItems()
{
listBoxCollection.Items.Clear();
for (int i = 0; i < _storageCollection.Keys?.Count; ++i)
{
string? colName = _storageCollection.Keys?[i];
if (!string.IsNullOrEmpty(colName))
{
listBoxCollection.Items.Add(colName);
}
}
}
private void buttonCollectionDel_Click(object sender, EventArgs e)
{
if (listBoxCollection.SelectedIndex < 0 || listBoxCollection.SelectedItem == null)
{
MessageBox.Show("Коллекция не выбрана");
_logger.LogWarning("Удаление невыбранной коллекции");
return;
}
string name = listBoxCollection.SelectedItem.ToString() ?? string.Empty;
if (MessageBox.Show("Удалить коллекцию?", "Удаление", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No)
{
return;
}
_storageCollection.DelCollection(listBoxCollection.SelectedItem.ToString());
_logger.LogInformation($"Удалена коллекция: {name}");
RefreshListBoxItems();
}
private void buttonCreateCompany_Click(object sender, EventArgs e)
{
if (listBoxCollection.SelectedIndex < 0 || listBoxCollection.SelectedItem == null)
{
MessageBox.Show("Коллекция не выбрана");
_logger.LogWarning("Создание компании невыбранной коллекции");
return;
}
ICollectionGenericObjects<DrawningBus>? collection =
_storageCollection[listBoxCollection.SelectedItem.ToString() ?? string.Empty];
if (collection == null)
{
MessageBox.Show("Коллекция не проинициализирована");
_logger.LogWarning("Не удалось инициализировать коллекцию");
return;
}
switch (comboBoxSelectorCompany.Text)
{
case "Хранилище":
_company = new BusSharingService(pictureBox.Width,
pictureBox.Height, collection);
break;
}
panelCompanyTools.Enabled = true;
RefreshListBoxItems();
}
private void saveToolStripMenuItem_Click(object sender, EventArgs e)
{
if (saveFileDialog.ShowDialog() == DialogResult.OK)
{
try
{
_storageCollection.SaveData(saveFileDialog.FileName);
MessageBox.Show("Сохранение прошло успешно", "Результат", MessageBoxButtons.OK, MessageBoxIcon.Information);
_logger.LogInformation("Сохранение в файл: {filename}", saveFileDialog.FileName);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Результат", MessageBoxButtons.OK, MessageBoxIcon.Error);
_logger.LogError("Ошибка: {Message}", ex.Message);
}
}
}
private void loadToolStripMenuItem_Click(object sender, EventArgs e)
{
if (openFileDialog.ShowDialog() == DialogResult.OK)
{
try
{
_storageCollection.LoadData(openFileDialog.FileName);
MessageBox.Show("Загрузка прошла успешно", "Результат", MessageBoxButtons.OK, MessageBoxIcon.Information);
_logger.LogInformation("Загрузка из файла: {filename}", saveFileDialog.FileName);
RefreshListBoxItems();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Результат", MessageBoxButtons.OK, MessageBoxIcon.Error);
_logger.LogError("Ошибка: {Message}", ex.Message);
}
}
}
}

View File

@ -0,0 +1,129 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<metadata name="menuStrip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>17, 17</value>
</metadata>
<metadata name="saveFileDialog.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>126, 17</value>
</metadata>
<metadata name="openFileDialog.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>261, 17</value>
</metadata>
</root>

View File

@ -0,0 +1,383 @@
namespace ProjectAccordionBus
{
partial class FormBusConfig
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
groupBoxConfig = new GroupBox();
groupBoxColors = new GroupBox();
panelPurple = new Panel();
panelBlack = new Panel();
panelYellow = new Panel();
panelBlue = new Panel();
panelGreen = new Panel();
panelWhite = new Panel();
panelGray = new Panel();
panelRed = new Panel();
checkBoxWindows = new CheckBox();
checkBoxEntrance = new CheckBox();
checkBoxCompartment = new CheckBox();
numericUpDownWeight = new NumericUpDown();
numericUpDownSpeed = new NumericUpDown();
labelWeight = new Label();
labelSpeed = new Label();
labelModifiedObject = new Label();
labelSimpleObject = new Label();
pictureBoxObject = new PictureBox();
buttonAdd = new Button();
buttonCancel = new Button();
panelObjects = new Panel();
labelAdditionalColor = new Label();
labelBodyColor = new Label();
groupBoxConfig.SuspendLayout();
groupBoxColors.SuspendLayout();
((System.ComponentModel.ISupportInitialize)numericUpDownWeight).BeginInit();
((System.ComponentModel.ISupportInitialize)numericUpDownSpeed).BeginInit();
((System.ComponentModel.ISupportInitialize)pictureBoxObject).BeginInit();
panelObjects.SuspendLayout();
SuspendLayout();
//
// groupBoxConfig
//
groupBoxConfig.Controls.Add(groupBoxColors);
groupBoxConfig.Controls.Add(checkBoxWindows);
groupBoxConfig.Controls.Add(checkBoxEntrance);
groupBoxConfig.Controls.Add(checkBoxCompartment);
groupBoxConfig.Controls.Add(numericUpDownWeight);
groupBoxConfig.Controls.Add(numericUpDownSpeed);
groupBoxConfig.Controls.Add(labelWeight);
groupBoxConfig.Controls.Add(labelSpeed);
groupBoxConfig.Controls.Add(labelModifiedObject);
groupBoxConfig.Controls.Add(labelSimpleObject);
groupBoxConfig.Dock = DockStyle.Left;
groupBoxConfig.Location = new Point(0, 0);
groupBoxConfig.Name = "groupBoxConfig";
groupBoxConfig.Size = new Size(479, 208);
groupBoxConfig.TabIndex = 0;
groupBoxConfig.TabStop = false;
groupBoxConfig.Text = "Параметры";
//
// groupBoxColors
//
groupBoxColors.Controls.Add(panelPurple);
groupBoxColors.Controls.Add(panelBlack);
groupBoxColors.Controls.Add(panelYellow);
groupBoxColors.Controls.Add(panelBlue);
groupBoxColors.Controls.Add(panelGreen);
groupBoxColors.Controls.Add(panelWhite);
groupBoxColors.Controls.Add(panelGray);
groupBoxColors.Controls.Add(panelRed);
groupBoxColors.Location = new Point(211, 22);
groupBoxColors.Name = "groupBoxColors";
groupBoxColors.Size = new Size(239, 130);
groupBoxColors.TabIndex = 9;
groupBoxColors.TabStop = false;
groupBoxColors.Text = "Цвета";
//
// panelPurple
//
panelPurple.BackColor = Color.Purple;
panelPurple.Location = new Point(180, 73);
panelPurple.Name = "panelPurple";
panelPurple.Size = new Size(38, 38);
panelPurple.TabIndex = 1;
//
// panelBlack
//
panelBlack.BackColor = Color.Black;
panelBlack.Location = new Point(123, 73);
panelBlack.Name = "panelBlack";
panelBlack.Size = new Size(38, 38);
panelBlack.TabIndex = 1;
//
// panelYellow
//
panelYellow.BackColor = Color.Yellow;
panelYellow.Location = new Point(180, 22);
panelYellow.Name = "panelYellow";
panelYellow.Size = new Size(38, 38);
panelYellow.TabIndex = 1;
//
// panelBlue
//
panelBlue.BackColor = Color.Blue;
panelBlue.Location = new Point(123, 22);
panelBlue.Name = "panelBlue";
panelBlue.Size = new Size(38, 38);
panelBlue.TabIndex = 1;
//
// panelGreen
//
panelGreen.BackColor = Color.Green;
panelGreen.Location = new Point(69, 22);
panelGreen.Name = "panelGreen";
panelGreen.Size = new Size(38, 38);
panelGreen.TabIndex = 1;
//
// panelWhite
//
panelWhite.BackColor = Color.White;
panelWhite.Location = new Point(13, 73);
panelWhite.Name = "panelWhite";
panelWhite.Size = new Size(38, 38);
panelWhite.TabIndex = 1;
//
// panelGray
//
panelGray.BackColor = Color.Gray;
panelGray.Location = new Point(69, 73);
panelGray.Name = "panelGray";
panelGray.Size = new Size(38, 38);
panelGray.TabIndex = 1;
//
// panelRed
//
panelRed.BackColor = Color.Red;
panelRed.Location = new Point(13, 22);
panelRed.Name = "panelRed";
panelRed.Size = new Size(38, 38);
panelRed.TabIndex = 0;
//
// checkBoxWindows
//
checkBoxWindows.AutoSize = true;
checkBoxWindows.Location = new Point(6, 155);
checkBoxWindows.Name = "checkBoxWindows";
checkBoxWindows.Size = new Size(153, 19);
checkBoxWindows.TabIndex = 8;
checkBoxWindows.Text = "Признак наличие окон";
checkBoxWindows.UseVisualStyleBackColor = true;
//
// checkBoxEntrance
//
checkBoxEntrance.AutoSize = true;
checkBoxEntrance.Location = new Point(6, 120);
checkBoxEntrance.Name = "checkBoxEntrance";
checkBoxEntrance.Size = new Size(158, 19);
checkBoxEntrance.TabIndex = 7;
checkBoxEntrance.Text = "Признак наличие двери";
checkBoxEntrance.UseVisualStyleBackColor = true;
//
// checkBoxCompartment
//
checkBoxCompartment.AutoSize = true;
checkBoxCompartment.Location = new Point(6, 86);
checkBoxCompartment.Name = "checkBoxCompartment";
checkBoxCompartment.Size = new Size(188, 19);
checkBoxCompartment.TabIndex = 6;
checkBoxCompartment.Text = "Признак наличие доп. отсека";
checkBoxCompartment.UseVisualStyleBackColor = true;
//
// numericUpDownWeight
//
numericUpDownWeight.Location = new Point(74, 46);
numericUpDownWeight.Maximum = new decimal(new int[] { 1000, 0, 0, 0 });
numericUpDownWeight.Minimum = new decimal(new int[] { 100, 0, 0, 0 });
numericUpDownWeight.Name = "numericUpDownWeight";
numericUpDownWeight.Size = new Size(120, 23);
numericUpDownWeight.TabIndex = 5;
numericUpDownWeight.Value = new decimal(new int[] { 100, 0, 0, 0 });
//
// numericUpDownSpeed
//
numericUpDownSpeed.Location = new Point(74, 17);
numericUpDownSpeed.Maximum = new decimal(new int[] { 1000, 0, 0, 0 });
numericUpDownSpeed.Minimum = new decimal(new int[] { 100, 0, 0, 0 });
numericUpDownSpeed.Name = "numericUpDownSpeed";
numericUpDownSpeed.Size = new Size(120, 23);
numericUpDownSpeed.TabIndex = 4;
numericUpDownSpeed.Value = new decimal(new int[] { 100, 0, 0, 0 });
//
// labelWeight
//
labelWeight.AutoSize = true;
labelWeight.Location = new Point(6, 48);
labelWeight.Name = "labelWeight";
labelWeight.Size = new Size(29, 15);
labelWeight.TabIndex = 3;
labelWeight.Text = "Вес:";
//
// labelSpeed
//
labelSpeed.AutoSize = true;
labelSpeed.Location = new Point(6, 19);
labelSpeed.Name = "labelSpeed";
labelSpeed.Size = new Size(62, 15);
labelSpeed.TabIndex = 2;
labelSpeed.Text = "Скорость:";
//
// labelModifiedObject
//
labelModifiedObject.AllowDrop = true;
labelModifiedObject.BorderStyle = BorderStyle.FixedSingle;
labelModifiedObject.Location = new Point(350, 165);
labelModifiedObject.Name = "labelModifiedObject";
labelModifiedObject.Size = new Size(100, 31);
labelModifiedObject.TabIndex = 1;
labelModifiedObject.Text = "Продвинутый";
labelModifiedObject.TextAlign = ContentAlignment.MiddleCenter;
labelModifiedObject.Click += buttonAdd_Click;
labelModifiedObject.DragDrop += panelObject_DragDrop;
labelModifiedObject.DragEnter += panelObjects_DragEnter;
labelModifiedObject.MouseDown += labelObject_MouseDown;
//
// labelSimpleObject
//
labelSimpleObject.AllowDrop = true;
labelSimpleObject.BorderStyle = BorderStyle.FixedSingle;
labelSimpleObject.Location = new Point(224, 164);
labelSimpleObject.Name = "labelSimpleObject";
labelSimpleObject.Size = new Size(100, 32);
labelSimpleObject.TabIndex = 0;
labelSimpleObject.Text = "Простой";
labelSimpleObject.TextAlign = ContentAlignment.MiddleCenter;
labelSimpleObject.Click += buttonAdd_Click;
labelSimpleObject.DragDrop += panelObject_DragDrop;
labelSimpleObject.DragEnter += panelObjects_DragEnter;
labelSimpleObject.MouseDown += labelObject_MouseDown;
//
// pictureBoxObject
//
pictureBoxObject.Location = new Point(19, 57);
pictureBoxObject.Name = "pictureBoxObject";
pictureBoxObject.Size = new Size(173, 95);
pictureBoxObject.TabIndex = 1;
pictureBoxObject.TabStop = false;
pictureBoxObject.DragDrop += panelObject_DragDrop;
pictureBoxObject.DragEnter += panelObjects_DragEnter;
pictureBoxObject.MouseDown += panel_MouseDown;
//
// buttonAdd
//
buttonAdd.Location = new Point(504, 173);
buttonAdd.Name = "buttonAdd";
buttonAdd.Size = new Size(75, 23);
buttonAdd.TabIndex = 2;
buttonAdd.Text = "Добавить";
buttonAdd.UseVisualStyleBackColor = true;
buttonAdd.Click += buttonAdd_Click;
//
// buttonCancel
//
buttonCancel.Location = new Point(602, 173);
buttonCancel.Name = "buttonCancel";
buttonCancel.Size = new Size(75, 23);
buttonCancel.TabIndex = 3;
buttonCancel.Text = "Отмена";
buttonCancel.UseVisualStyleBackColor = true;
//
// panelObjects
//
panelObjects.AllowDrop = true;
panelObjects.Controls.Add(labelAdditionalColor);
panelObjects.Controls.Add(labelBodyColor);
panelObjects.Controls.Add(pictureBoxObject);
panelObjects.Location = new Point(485, 0);
panelObjects.Name = "panelObjects";
panelObjects.Size = new Size(204, 167);
panelObjects.TabIndex = 4;
panelObjects.DragDrop += panelObject_DragDrop;
panelObjects.DragEnter += panelObjects_DragEnter;
panelObjects.MouseDown += panel_MouseDown;
//
// labelAdditionalColor
//
labelAdditionalColor.AllowDrop = true;
labelAdditionalColor.BorderStyle = BorderStyle.FixedSingle;
labelAdditionalColor.Location = new Point(117, 10);
labelAdditionalColor.Name = "labelAdditionalColor";
labelAdditionalColor.Size = new Size(75, 32);
labelAdditionalColor.TabIndex = 3;
labelAdditionalColor.Text = "Доп. цвет";
labelAdditionalColor.TextAlign = ContentAlignment.MiddleCenter;
labelAdditionalColor.DragDrop += labelAdditionalColor_DragDrop;
labelAdditionalColor.DragEnter += labelAdditionalColor_DragEnter;
//
// labelBodyColor
//
labelBodyColor.AllowDrop = true;
labelBodyColor.BorderStyle = BorderStyle.FixedSingle;
labelBodyColor.Location = new Point(19, 10);
labelBodyColor.Name = "labelBodyColor";
labelBodyColor.Size = new Size(75, 32);
labelBodyColor.TabIndex = 2;
labelBodyColor.Text = "Цвет";
labelBodyColor.TextAlign = ContentAlignment.MiddleCenter;
labelBodyColor.Click += labelBodyColor_Click;
labelBodyColor.DragDrop += labelBodyColor_DragDrop;
labelBodyColor.DragEnter += labelBodyColor_DragEnter;
//
// FormBusConfig
//
AutoScaleDimensions = new SizeF(7F, 15F);
AutoScaleMode = AutoScaleMode.Font;
ClientSize = new Size(689, 208);
Controls.Add(panelObjects);
Controls.Add(buttonAdd);
Controls.Add(buttonCancel);
Controls.Add(groupBoxConfig);
Name = "FormBusConfig";
Text = "Создание объекта";
groupBoxConfig.ResumeLayout(false);
groupBoxConfig.PerformLayout();
groupBoxColors.ResumeLayout(false);
((System.ComponentModel.ISupportInitialize)numericUpDownWeight).EndInit();
((System.ComponentModel.ISupportInitialize)numericUpDownSpeed).EndInit();
((System.ComponentModel.ISupportInitialize)pictureBoxObject).EndInit();
panelObjects.ResumeLayout(false);
ResumeLayout(false);
}
#endregion
private GroupBox groupBoxConfig;
private Label labelModifiedObject;
private Label labelSimpleObject;
private NumericUpDown numericUpDownWeight;
private NumericUpDown numericUpDownSpeed;
private Label labelWeight;
private Label labelSpeed;
private CheckBox checkBoxCompartment;
private CheckBox checkBoxEntrance;
private CheckBox checkBoxWindows;
private GroupBox groupBoxColors;
private Panel panelPurple;
private Panel panelBlack;
private Panel panelYellow;
private Panel panelBlue;
private Panel panelGreen;
private Panel panelWhite;
private Panel panelGray;
private Panel panelRed;
private PictureBox pictureBoxObject;
private Button buttonAdd;
private Button buttonCancel;
private Panel panelObjects;
private Label labelAdditionalColor;
private Label labelBodyColor;
}
}

View File

@ -0,0 +1,171 @@
using ProjectAccordionBus.Drawnings;
using ProjectAccordionBus.Entities;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace ProjectAccordionBus;
public partial class FormBusConfig : Form
{
/// <summary>
/// Объект прорисовки класса
/// </summary>
private DrawningBus? _bus;
private event BusDelegate? _busDelegate;
/// <summary>
/// Конструктор
/// </summary>
public FormBusConfig()
{
InitializeComponent();
panelRed.MouseDown += panel_MouseDown;
panelGreen.MouseDown += panel_MouseDown;
panelBlue.MouseDown += panel_MouseDown;
panelWhite.MouseDown += panel_MouseDown;
panelBlack.MouseDown += panel_MouseDown;
panelGray.MouseDown += panel_MouseDown;
panelPurple.MouseDown += panel_MouseDown;
panelYellow.MouseDown += panel_MouseDown;
buttonCancel.Click += (sender, e) => Close();
}
public void AddEvent(BusDelegate busDelegate)
{
_busDelegate += busDelegate;
}
// <summary>
/// Прорисовка объекта
/// </summary>
private void DrawObject()
{
Bitmap bmp = new(pictureBoxObject.Width, pictureBoxObject.Height);
Graphics gr = Graphics.FromImage(bmp);
_bus?.SetPictureSize(pictureBoxObject.Width, pictureBoxObject.Height);
_bus?.SetPosition(15, 15);
_bus?.DrawTransport(gr);
pictureBoxObject.Image = bmp;
}
/// <summary>
/// Передаем информацию при нажатии на Label
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void labelObject_MouseDown(object sender, MouseEventArgs e)
{
(sender as Label)?.DoDragDrop((sender as Label)?.Name ?? string.Empty, DragDropEffects.Move | DragDropEffects.Copy);
}
/// <summary>
/// Проверка получаемой информации (ее типа на соответствие требуемому)
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void panelObjects_DragEnter(object sender, DragEventArgs e)
{
e.Effect = e.Data?.GetDataPresent(DataFormats.Text) ?? false ? DragDropEffects.Copy : DragDropEffects.None;
}
/// <summary>
/// Действия при приеме перетаскиваемой информации
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void panelObject_DragDrop(object sender, DragEventArgs e)
{
switch (e.Data?.GetData(DataFormats.Text)?.ToString())
{
case "labelSimpleObject":
_bus = new DrawningBus((int)numericUpDownSpeed.Value,
(double)numericUpDownWeight.Value, Color.White);
break;
case "labelModifiedObject":
_bus = new
DrawningAccordionBus((int)numericUpDownSpeed.Value, (double)numericUpDownWeight.Value,
Color.White,
Color.Black, checkBoxCompartment.Checked,
checkBoxEntrance.Checked, checkBoxWindows.Checked);
break;
}
labelBodyColor.BackColor = Color.Empty;
labelAdditionalColor.BackColor = Color.Empty;
DrawObject();
}
private void panel_MouseDown(object sender, MouseEventArgs e)
{
(sender as Control)?.DoDragDrop((sender as Control)?.BackColor ?? Color.Black, DragDropEffects.Move | DragDropEffects.Copy);
}
private void buttonAdd_Click(object sender, EventArgs e)
{
if (_bus != null)
{
_busDelegate?.Invoke(_bus);
Close();
}
}
private void labelBodyColor_DragEnter(object sender, DragEventArgs e)
{
if (e.Data.GetDataPresent(typeof(Color)))
{
e.Effect = DragDropEffects.Copy;
}
else
{
e.Effect = DragDropEffects.None;
}
}
private void labelBodyColor_DragDrop(object sender, DragEventArgs e)
{
if (_bus != null)
{
_bus.EntityBus.SetBodyColor((Color)e.Data.GetData(typeof(Color)));
DrawObject();
}
}
private void labelAdditionalColor_DragEnter(object sender, DragEventArgs e)
{
if (_bus is DrawningBus)
{
if (e.Data.GetDataPresent(typeof(Color)))
{
e.Effect = DragDropEffects.Copy;
}
else
{
e.Effect = DragDropEffects.None;
}
}
}
private void labelAdditionalColor_DragDrop(object sender, DragEventArgs e)
{
if (_bus?.EntityBus is EntityAccordionBus _accordionBus)
{
_accordionBus.SetAdditionalColor((Color)e.Data.GetData(typeof(Color)));
}
DrawObject();
}
private void labelBodyColor_Click(object sender, EventArgs e)
{
}
}

View File

@ -0,0 +1,120 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

View File

@ -0,0 +1,126 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ProjectAccordionBus.MovementStrategy;
public abstract class AbstractStrategy
{
/// <summary>
/// Перемещаемый объект
/// </summary>
private IMoveableObject? _moveableObject;
/// <summary>
/// Статус перемещения
/// </summary>
private StrategyStatus _state = StrategyStatus.NotInit;
/// <summary>
/// Ширина поля
/// </summary>
protected int FieldWidth { get; private set; }
/// <summary>
/// Высота поля
/// </summary>
protected int FieldHeight { get; private set; }
/// <summary>
/// Статус перемещения
/// </summary>
/// <returns></returns>
public StrategyStatus GetStatus() { return _state; }
/// <summary>
/// Установка данных
/// </summary>
/// <param name="moveableObject"></param>
/// <param name="width"></param>
/// <param name="height"></param>
public void SetData(IMoveableObject moveableObject, int width, int height)
{
if (moveableObject == null)
{
_state = StrategyStatus.NotInit;
return;
}
_state = StrategyStatus.InProgress;
_moveableObject = moveableObject;
FieldWidth = width;
FieldHeight = height;
}
public void MakeStep()
{
if (_state != StrategyStatus.InProgress)
{
return;
}
if (IsTargetDestination())
{
_state = StrategyStatus.Finish;
return;
}
MoveToTarget();
}
/// <summary>
/// Перемещение влево
/// </summary>
/// <returns>Результат перемещения (true - удалось переместится, false - неудача)</returns>
protected bool MoveLeft() => MoveTo(MovementDirection.Left);
/// <summary>
/// Перемещение вправо
/// </summary>
/// <returns>Результат перемещения (true - удалось переместится, false - неудача)</returns>
protected bool MoveRight() => MoveTo(MovementDirection.Right);
/// <summary>
/// Перемещение вверх
/// </summary>
/// <returns>Результат перемещения (true - удалось переместится, false - неудача)</returns>
protected bool MoveUp() => MoveTo(MovementDirection.Up);
/// <summary>
/// Перемещение вниз
/// </summary>
/// <returns>Результат перемещения (true - удалось переместится, false - неудача)</returns>
protected bool MoveDown() => MoveTo(MovementDirection.Down);
/// <summary>
/// Параметры объекта
/// </summary>
protected ObjectParameters? GetObjectParameters => _moveableObject?.GetObjectPosition;
protected int? GetStep()
{
if (_state != StrategyStatus.InProgress)
{
return null;
}
return _moveableObject?.GetStep;
}
/// <summary>
/// Перемещение к цели
/// </summary>
protected abstract void MoveToTarget();
protected abstract bool IsTargetDestination();
protected bool MoveTo(MovementDirection movementDirection)
{
if (_state != StrategyStatus.InProgress)
{
return false;
}
return _moveableObject?.TryMoveObject(movementDirection) ?? false;
}
}

View File

@ -0,0 +1,26 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ProjectAccordionBus.MovementStrategy;
public interface IMoveableObject
{
/// <summary>
/// Получение координаты объекта
/// </summary>
ObjectParameters? GetObjectPosition { get; }
/// <summary>
/// Шаг объекта
/// </summary>
int GetStep { get; }
/// <summary>
/// Попытка переместить объект в указанном направлении
/// </summary>
/// <param name="direction"></param>
/// <returns></returns>
bool TryMoveObject(MovementDirection direction);
}

View File

@ -0,0 +1,58 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ProjectAccordionBus.MovementStrategy;
public class MoveToBorder : AbstractStrategy
{
protected override bool IsTargetDestination()
{
ObjectParameters? objParams = GetObjectParameters;
if (objParams == null)
{
return false;
}
return objParams.RightBorder <= FieldWidth && objParams.RightBorder + GetStep() >= FieldWidth &&
objParams.DownBorder <= FieldHeight &&
objParams.DownBorder + GetStep() >= FieldHeight;
}
protected override void MoveToTarget()
{
ObjectParameters? objParams = GetObjectParameters;
if (objParams == null)
{
return;
}
int diffX = objParams.RightBorder - FieldWidth;
if (Math.Abs(diffX) > GetStep())
{
if (diffX > 0)
{
MoveLeft();
}
else
{
MoveRight();
}
}
int diffY = objParams.DownBorder - FieldHeight;
if (Math.Abs(diffY) > GetStep())
{
if (diffY > 0)
{
MoveUp();
}
else
{
MoveDown();
}
}
}
}

View File

@ -0,0 +1,56 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ProjectAccordionBus.MovementStrategy;
public class MoveToCenter : AbstractStrategy
{
protected override bool IsTargetDestination()
{
ObjectParameters? objParams = GetObjectParameters;
if (objParams == null)
{
return false;
}
return objParams.ObjectMiddleHorizontal - GetStep() <= FieldWidth / 2 && objParams.ObjectMiddleHorizontal + GetStep() >= FieldWidth / 2 &&
objParams.ObjectMiddleVertical - GetStep() <= FieldHeight / 2 && objParams.ObjectMiddleVertical + GetStep() >= FieldHeight / 2;
}
protected override void MoveToTarget()
{
ObjectParameters? objParams = GetObjectParameters;
if (objParams == null)
{
return;
}
int diffX = objParams.ObjectMiddleHorizontal - FieldWidth / 2;
if (Math.Abs(diffX) > GetStep())
{
if (diffX > 0)
{
MoveLeft();
}
else
{
MoveRight();
}
}
int diffY = objParams.ObjectMiddleVertical - FieldHeight / 2;
if (Math.Abs(diffY) > GetStep())
{
if (diffY > 0)
{
MoveUp();
}
else
{
MoveDown();
}
}
}
}

View File

@ -0,0 +1,61 @@
using ProjectAccordionBus.Drawnings;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ProjectAccordionBus.MovementStrategy;
public class MoveableBus : IMoveableObject
{
/// <summary>
/// Поле-объект класса DrawningBus или его наследника
/// </summary>
private readonly DrawningBus? _bus = null;
/// <summary>
/// Конструктор
/// </summary>
/// <param name="bus">Объект класса DrawningBus</param>
public MoveableBus(DrawningBus bus)
{
_bus = bus;
}
public ObjectParameters? GetObjectPosition
{
get
{
if (_bus == null || _bus.EntityBus == null || !_bus.GetPosX.HasValue || !_bus.GetPosY.HasValue)
{
return null;
}
return new ObjectParameters(_bus.GetPosX.Value, _bus.GetPosY.Value, _bus.GetWidth, _bus.GetHight);
}
}
public int GetStep => (int)(_bus?.EntityBus?.Step ?? 0);
public bool TryMoveObject(MovementDirection direction)
{
if (_bus == null || _bus.EntityBus == null)
{
return false;
}
return _bus.MoveTransport(GetDirectionType(direction));
}
private static DirectionType GetDirectionType(MovementDirection direction)
{
return direction switch
{
MovementDirection.Left => DirectionType.Left,
MovementDirection.Right => DirectionType.Right,
MovementDirection.Up => DirectionType.Up,
MovementDirection.Down => DirectionType.Down,
_ => DirectionType.Unknow,
};
}
}

View File

@ -0,0 +1,29 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ProjectAccordionBus.MovementStrategy;
public enum MovementDirection
{
/// <summary>
/// Вверх
/// </summary>
Up = 1,
/// <summary>
/// Вниз
/// </summary>
Down = 2,
/// <summary>
/// Влево
/// </summary>
Left = 3,
/// <summary>
/// Вправо
/// </summary>
Right = 4
}

View File

@ -0,0 +1,67 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ProjectAccordionBus.MovementStrategy;
public class ObjectParameters
{
/// <summary>
/// Координата x
/// </summary>
private readonly int _x;
/// <summary>
/// Координата y
/// </summary>
private readonly int _y;
/// <summary>
/// Ширина объекта
/// </summary>
private readonly int _width;
/// <summary>
/// Высота объекта
/// </summary>
private readonly int _height;
/// <summary>
/// Левая граница
/// </summary>
public int LeftBorder => _x;
/// <summary>
/// Верхняя граница
/// </summary>
public int TopBorder => _y;
/// <summary>
/// Правая граница
/// </summary>
public int RightBorder => _x + _width;
/// <summary>
/// Нижняя граница
/// </summary>
public int DownBorder => _y + _height;
/// <summary>
/// Середина объекта
/// </summary>
public int ObjectMiddleHorizontal => _x + _width / 2;
/// <summary>
/// Середина объекта
/// </summary>
public int ObjectMiddleVertical => _y + _height / 2;
public ObjectParameters(int x, int y, int width, int height)
{
_x = x;
_y = y;
_width = width;
_height = height;
}
}

View File

@ -0,0 +1,24 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ProjectAccordionBus.MovementStrategy;
public enum StrategyStatus
{
/// <summary>
/// Все готово к началу
NotInit,
/// <summary>
/// Выполняется
/// </summary>
InProgress,
/// <summary>
/// Завершено
/// </summary>
Finish
}

View File

@ -1,17 +1,40 @@
namespace ProjectAccordionBus
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Serilog;
namespace ProjectAccordionBus;
internal static class Program
{
internal static class Program
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
// To customize application configuration such as set high DPI settings or default font,
// see https://aka.ms/applicationconfiguration.
ApplicationConfiguration.Initialize();
Application.Run(new Form1());
}
// To customize application configuration such as set high DPI settings or default font,
// see https://aka.ms/applicationconfiguration.
ApplicationConfiguration.Initialize();
ServiceCollection services = new();
ConfigureServices(services);
using ServiceProvider serviceProvider = services.BuildServiceProvider();
Application.Run(serviceProvider.GetRequiredService<FormBusCollection>());
}
private static void ConfigureServices(ServiceCollection services)
{
services
.AddSingleton<FormBusCollection>()
.AddLogging(option =>
{
option.SetMinimumLevel(LogLevel.Information);
var config = new ConfigurationBuilder()
.AddJsonFile("serilogConfig.json", optional: false, reloadOnChange: true)
.Build();
option.AddSerilog(Log.Logger = new LoggerConfiguration()
.ReadFrom.Configuration(config)
.CreateLogger());
});
}
}

View File

@ -8,4 +8,42 @@
<ImplicitUsings>enable</ImplicitUsings>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Extensions.Configuration" Version="8.0.0" />
<PackageReference Include="Microsoft.Extensions.Configuration.FileExtensions" Version="8.0.0" />
<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="8.0.0" />
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="8.0.0" />
<PackageReference Include="Microsoft.Extensions.Logging" Version="8.0.0" />
<PackageReference Include="NLog.Extensions.Logging" Version="5.3.11" />
<PackageReference Include="Serilog" Version="3.1.1" />
<PackageReference Include="Serilog.Enrichers.Thread" Version="3.1.0" />
<PackageReference Include="Serilog.Extensions.Logging" Version="8.0.0" />
<PackageReference Include="Serilog.Settings.Configuration" Version="8.0.0" />
<PackageReference Include="Serilog.Sinks.File" Version="5.0.0" />
</ItemGroup>
<ItemGroup>
<Compile Update="Properties\Resources.Designer.cs">
<DesignTime>True</DesignTime>
<AutoGen>True</AutoGen>
<DependentUpon>Resources.resx</DependentUpon>
</Compile>
</ItemGroup>
<ItemGroup>
<EmbeddedResource Update="Properties\Resources.resx">
<Generator>ResXFileCodeGenerator</Generator>
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
</EmbeddedResource>
</ItemGroup>
<ItemGroup>
<None Update="nlog.config">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="serilogConfig.json">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
</ItemGroup>
</Project>

View File

@ -0,0 +1,63 @@
//------------------------------------------------------------------------------
// <auto-generated>
// Этот код создан программой.
// Исполняемая версия:4.0.30319.42000
//
// Изменения в этом файле могут привести к неправильной работе и будут потеряны в случае
// повторной генерации кода.
// </auto-generated>
//------------------------------------------------------------------------------
namespace ProjectAccordionBus.Properties {
using System;
/// <summary>
/// Класс ресурса со строгой типизацией для поиска локализованных строк и т.д.
/// </summary>
// Этот класс создан автоматически классом StronglyTypedResourceBuilder
// с помощью такого средства, как ResGen или Visual Studio.
// Чтобы добавить или удалить член, измените файл .ResX и снова запустите ResGen
// с параметром /str или перестройте свой проект VS.
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
internal class Resources {
private static global::System.Resources.ResourceManager resourceMan;
private static global::System.Globalization.CultureInfo resourceCulture;
[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
internal Resources() {
}
/// <summary>
/// Возвращает кэшированный экземпляр ResourceManager, использованный этим классом.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Resources.ResourceManager ResourceManager {
get {
if (object.ReferenceEquals(resourceMan, null)) {
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("ProjectAccordionBus.Properties.Resources", typeof(Resources).Assembly);
resourceMan = temp;
}
return resourceMan;
}
}
/// <summary>
/// Перезаписывает свойство CurrentUICulture текущего потока для всех
/// обращений к ресурсу с помощью этого класса ресурса со строгой типизацией.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Globalization.CultureInfo Culture {
get {
return resourceCulture;
}
set {
resourceCulture = value;
}
}
}
}

View File

@ -0,0 +1,15 @@
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
autoReload="true" internalLogLevel="Info">
<targets>
<target xsi:type="File" name="tofile" fileName="carlog-${shortdate}.log" />
</targets>
<rules>
<logger name="*" minlevel="Debug" writeTo="tofile" />
</rules>
</nlog>
</configuration>

View File

@ -0,0 +1,20 @@
{
"Serilog": {
"Using": [ "Serilog.Sinks.File" ],
"MinimumLevel": "Information",
"WriteTo": [
{
"Name": "File",
"Args": {
"path": "Logs/log_.log",
"rollingInterval": "Day",
"outputTemplate": "[{Timestamp:HH:mm:ss.fff}]{Level:u4}: {Message:lj}{NewLine}{Exception}"
}
}
],
"Enrich": [ "FromLogContext", "WithMachineName", "WithThreadId" ],
"Properties": {
"Application": "Linkor"
}
}
}