Compare commits

...

34 Commits
main ... lab7

Author SHA1 Message Date
repka228
a5d54664c8 победа 2024-06-13 16:15:30 +04:00
repka228
132d748335 кк 2024-06-13 15:15:59 +04:00
repka228
ecdd4af98d end 2024-06-12 21:08:27 +04:00
repka228
a794117141 финалОчка 2024-06-12 20:44:28 +04:00
repka228
d15a731a0b check 2024-06-12 17:54:06 +04:00
repka228
a6214ebf50 конец 2024-05-15 13:40:30 +04:00
repka228
8099071590 конец 7 лабы 2024-05-07 23:01:58 +04:00
repka228
5561fe3211 конец 6 лабы 2024-05-07 21:36:36 +04:00
repka228
d3002e061b мелкий трабл при выборе загрузки файла 2024-05-05 17:12:31 +04:00
repka228
beb3b23a63 конец? 2024-05-05 15:54:23 +04:00
repka228
6bdae3afef 5 лаба 2024-04-13 20:02:57 +04:00
repka228
41443da6cf начало 5 2024-04-12 12:06:52 +04:00
repka228
e160e20a97 4 лаба 2024-04-02 20:45:04 +04:00
repka228
8b72f79d1b меокие изменения 2024-04-02 19:51:09 +04:00
repka228
a4ddd7c407 мелкие изменения 2024-04-02 19:35:06 +04:00
repka228
d61123f404 конец 3 лабы 2024-03-20 12:22:20 +04:00
repka228
f09ac7ed4d мелкие изменения 2024-03-19 23:06:35 +04:00
repka228
f7e90e6ffa Последняя ошибка - добавляет лишние элементы 2024-03-19 18:04:27 +04:00
repka228
df565e4295 Сделал todo, но ловит ошибку в Instert <obj> 2024-03-15 03:16:25 +04:00
Cat-pranks
fc61c617ed 2024-03-06 15:35:23 +04:00
Cat-pranks
4d51d18658 мелкие изменения x2 2024-03-06 15:31:49 +04:00
Cat-pranks
40c301658b зафиксировал меню и шаг вверху-справа 2024-03-06 14:07:40 +04:00
Cat-pranks
373a50c33e убрал лишний предмет 2024-03-06 14:00:59 +04:00
Cat-pranks
1ed3ddbdbd мелкие изменения 2024-03-06 13:00:05 +04:00
Cat-pranks
64fdafe57a снизил кол-во опциональных частей 2024-03-06 12:52:43 +04:00
Cat-pranks
ee25905cc2 Доделан return в функции движения к краю 2024-03-06 12:08:33 +04:00
Cat-pranks
8cbceb87b7 Сделано до движения до границы 2024-03-03 21:07:26 +04:00
Cat-pranks
f8b0e3baa1 1 часть 2 лабы 2024-03-03 19:09:14 +04:00
Cat-pranks
19049b7467 Конец 1 лабы 2024-03-03 03:55:43 +04:00
Cat-pranks
9971ee0609 Установил anchor у кнопок 2024-02-21 12:30:28 +04:00
Cat-pranks
f3f9c1547e Доработал move right&left 2024-02-21 11:51:59 +04:00
Cat-pranks
1e3c260993 Исправил условие в функции 2024-02-14 23:15:53 +08:00
Cat-pranks
2c774e7f39 Закончил логику в SetPosition 2024-02-12 18:48:11 +08:00
Cat-pranks
9bf2ee06c2 Лабораторная работа #1 2024-02-08 18:05:33 +08:00
40 changed files with 3990 additions and 64 deletions

View File

@ -2,10 +2,36 @@
<PropertyGroup>
<OutputType>WinExe</OutputType>
<TargetFramework>net8.0-windows</TargetFramework>
<TargetFramework>net6.0-windows7.0</TargetFramework>
<Nullable>enable</Nullable>
<UseWindowsForms>true</UseWindowsForms>
<ImplicitUsings>enable</ImplicitUsings>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Extensions.Logging" Version="8.0.0" />
<PackageReference Include="NLog.Extensions.Logging" Version="5.3.11" />
</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>
</ItemGroup>
</Project>

View File

@ -0,0 +1,112 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using AccordionBus.Drawnings;
namespace AccordionBus.CollectionGenericObjects;
using ProjectAccordionBus.CollectionGenericObjects;
/// <summary>
/// Абстракция компании, хранящий коллекцию автобусов
/// </summary>
public abstract class AbstractCompany
{
/// <summary>
/// Размер места (ширина)
/// </summary>
protected readonly int _placeSizeWidth = 240;
/// <summary>
/// Размер места (высота)
/// </summary>
protected readonly int _placeSizeHeight = 50;
/// <summary>
/// Ширина окна
/// </summary>
protected readonly int _pictureWidth;
/// <summary>
/// Высота окна
/// </summary>
protected readonly int _pictureHeight;
/// <summary>
/// Коллекция автомобилей
/// </summary>
protected ICollectionGenericObjects<DrawningBus>? _collection = null;
/// <summary>
/// Вычисление максимального количества элементов, который можно разместить в окне
/// </summary>
private int GetMaxCount => _pictureWidth * _pictureHeight / (_placeSizeWidth * _placeSizeHeight);
/// <summary>
/// Конструктор
/// </summary>
/// <param name="picWidth">Ширина окна</param>
/// <param name="picHeight">Высота окна</param>
/// <param name="collection">Коллекция автомобилей</param>
public AbstractCompany(int picWidth, int picHeight, ICollectionGenericObjects<DrawningBus> collection)
{
_pictureWidth = picWidth;
_pictureHeight = picHeight;
_collection = collection;
_collection.MaxCount = GetMaxCount;
}
/// <summary>
/// Перегрузка оператора сложения для класса
/// </summary>
/// <param name="company">Компания</param>
/// <param name="car">Добавляемый объект</param>
/// <returns></returns>
public static bool operator +(AbstractCompany company, DrawningBus bus)
{
return company._collection?.Insert(bus)!=-1? true : false;
}
/// <summary>
/// Перегрузка оператора удаления для класса
/// </summary>
/// <param name="company">Компания</param>
/// <param name="position">Номер удаляемого объекта</param>
/// <returns></returns>
public static DrawningBus operator -(AbstractCompany? company, int position)
{
return company._collection.Remove(position);
}
/// <summary>
/// Получение случайного объекта из коллекции
/// </summary>
/// <returns></returns>
public DrawningBus? GetRandomObject()
{
Random rnd = new();
return _collection?.Get(rnd.Next(GetMaxCount));
}
/// <summary>
/// Вывод всей коллекции
/// </summary>
/// <returns></returns>
public Bitmap? Show()
{
Bitmap bitmap = new(_pictureWidth, _pictureHeight);
Graphics graphics = Graphics.FromImage(bitmap);
DrawBackgound(graphics);
SetObjectsPosition();
for (int i = 0; i < (_collection?.Count ?? 0); ++i)
{
try
{
DrawningBus? obj = _collection?.Get(i);
obj?.DrawTransport(graphics);
}
catch (Exception) { }
}
return bitmap;
}
/// <summary>
/// Вывод заднего фона
/// </summary>
/// <param name="g"></param>
protected abstract void DrawBackgound(Graphics g);
/// <summary>
/// Расстановка объектов
/// </summary>
protected abstract void SetObjectsPosition();
}

View File

@ -0,0 +1,57 @@
using ProjectAccordionBus.CollectionGenericObjects;
using AccordionBus.Drawnings;
using AccordionBus.Exceptions;
namespace AccordionBus.CollectionGenericObjects;
public class BusStation : AbstractCompany
{
/// <summary>
/// Конструктор
/// </summary>
/// <param name="picWidth"></param>
/// <param name="picHeight"></param>
/// <param name="collection"></param>
public BusStation(int picWidth, int picHeight, ICollectionGenericObjects<DrawningBus> collection) : base(picWidth, picHeight, collection){}
protected override void DrawBackgound(Graphics g)
{
Pen pen = new(Color.Black, 3);
int posX = 0;
for (int i = 0; i < _pictureWidth / _placeSizeWidth; i++)
{
int posY = 0;
g.DrawLine(pen, posX, posY, posX, posY + _placeSizeHeight * (_pictureHeight / _placeSizeHeight));
for (int j = 0; j <= _pictureHeight / _placeSizeHeight; j++)
{
g.DrawLine(pen, posX, posY, posX + _placeSizeWidth - 30, posY);
posY += _placeSizeHeight;
}
posX += _placeSizeWidth;
}
}
protected override void SetObjectsPosition()
{
int posX = 0;
int posY = _pictureHeight / _placeSizeHeight-1;
for (int i = 0; i < (_collection?.Count ?? 0); i++)
{
try
{
_collection?.Get(i)?.SetPictureSize(_pictureWidth, _pictureHeight);
_collection?.Get(i)?.SetPosition(posX * _placeSizeWidth + 5, posY * _placeSizeHeight + 5);
}
catch(Exception) {}
if (posY > 0)
{
posY--;
}
else
{
posX++;
posY = _pictureHeight / _placeSizeHeight-1;
}
if (posY < 0) { return; }
}
}
}

View File

@ -0,0 +1,12 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace AccordionBus.CollectionGenericObjects;
public enum CollectionType
{
None=0, Massive=1, List=2
}

View File

@ -0,0 +1,54 @@
using AccordionBus.CollectionGenericObjects;
namespace ProjectAccordionBus.CollectionGenericObjects;
/// <summary>
/// Интерфейс описания действий для набора хранимых объектов
/// </summary>
/// <typeparam name="T">Параметр: ограничение - ссылочный тип</typeparam>
public interface ICollectionGenericObjects<T>
where T : class
{
/// <summary>
/// Количество объектов в коллекции
/// </summary>
int Count { get; }
///<summary>
/// Установка макс. кол-ва элементов
int MaxCount { get; set; }
///</summary>
/// <summary>
/// Добавление объекта в коллекцию
/// </summary>
/// <param name="obj">Добавляемый объект</param>
/// <returns>true - вставка прошла удачно, false - вставка не удалась</returns>
int Insert(T obj);
/// <summary>
/// Добавление объекта в коллекцию на конкретную позицию
/// </summary>
/// <param name="obj">Добавляемый объект</param>
/// <param name="position">Позиция</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,76 @@
using AccordionBus.Exceptions;
using ProjectAccordionBus.CollectionGenericObjects;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace AccordionBus.CollectionGenericObjects;
public class ListGenericObjects<T>:ICollectionGenericObjects<T> where T : class
{
private readonly List<T?> _collection;
private int _maxCount;
public int Count => _collection.Count;
public CollectionType GetCollectionType => CollectionType.List;
public int MaxCount {
get
{
return _maxCount;
}
set
{
if (value > 0) _maxCount = value;
}
}
/// <summary>
/// Конструктор
/// </summary>
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 (position < 0 || position >= Count)
throw new PositionOutOfCollectionException(position);
if (Count == _maxCount)
throw new CollectionOverflowException(Count);
_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,129 @@
using AccordionBus.Exceptions;
using ProjectAccordionBus.CollectionGenericObjects;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace AccordionBus.CollectionGenericObjects;
public class MassiveGenericObjects<T> : ICollectionGenericObjects<T>
where T : class
{
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-9);
}
else
{
_collection = new T?[value-9];
}
}
}
}
public CollectionType GetCollectionType => CollectionType.Massive;
public MassiveGenericObjects()
{
_collection = Array.Empty<T?>();
}
public T Get(int position)
{
if (position < 0 || position >= _collection.Length)
{
throw new PositionOutOfCollectionException();
}
if (_collection[position] == null)
{
throw new ObjectNotFoundException(position);
}
return _collection[position];
}
public int Insert(T obj)
{
for (int i = 0; i < _collection.Length; i++)
{
if (_collection[i] == null)
{
_collection[i] = obj;
return i;
}
}
throw new CollectionOverflowException(Count);
}
public int Insert(T obj, int position)
{
if (position < 0 || position >= _collection.Length)
{
throw new PositionOutOfCollectionException(position);
}
if (_collection[position] == null)
{
_collection[position] = obj;
return position;
}
else
{
for (int i = position; i < _collection.Length; ++i) //ищем свободное место справа
{
if (_collection[i] == null)
{
_collection[i] = obj;
return i;
}
}
for (int i = 0; i < position; ++i) // иначе слева
{
if (_collection[i] == null)
{
_collection[i] = obj;
return i;
}
}
}
throw new CollectionOverflowException(Count);
}
public T? Remove(int position)
{
if (position < 0 || position >= _collection.Length)
throw new PositionOutOfCollectionException(position);
T? obj = _collection[position];
if (_collection[position] == null)
{
throw new ObjectNotFoundException(position);
}
if (_collection[position] != null)
{
_collection[position] = null;
}
return obj;
}
public IEnumerable<T?> GetItems()
{
for (int i = 0; i < _collection.Length; ++i)
{
yield return _collection[i];
}
}
}

View File

@ -0,0 +1,218 @@
using AccordionBus.Drawnings;
using AccordionBus.Exceptions;
using ProjectAccordionBus.CollectionGenericObjects;
using System.Text;
namespace AccordionBus.CollectionGenericObjects;
/// <summary>
/// Класс-хранилище коллекций
/// </summary>
/// <typeparam name="T"></typeparam>
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>
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 (string.IsNullOrEmpty(name) || _storages.ContainsKey(name))
{
return;
}
switch (collectionType)
{
case CollectionType.Massive:
_storages[name] = new MassiveGenericObjects<T>();
break;
case CollectionType.List:
_storages[name] = new ListGenericObjects<T>();
break;
default:
return;
}
}
/// <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 (_storages.ContainsKey(name))
{
return _storages[name];
}
return null;
}
}
/// <summary>
/// Ключевое слово, с которого должен начинаться файл
/// </summary>
private readonly string _collectionKey = "CollectionsStorage";
/// <summary>
/// Разделитель для записи ключа и значения элемента словаря
/// </summary>
private readonly string _separatorForKeyValue = "|";
/// <summary>
/// Разделитель для записей коллекции данных в файл
/// </summary>
private readonly string _separatorItems = ";";
/// <summary>
/// Сохранение информации по самолетам в хранилище в файл
/// </summary>
/// <param name="filename">Путь и имя файла</param>
/// <returns>true - сохранение прошло успешно, false - ошибка при сохранении данных</returns>
public void SaveData(string filename)
{
if (_storages.Count == 0)
{
throw new Exception("В хранилище отсутствуют коллекции для сохранения");
}
if (File.Exists(filename))
{
File.Delete(filename);
}
StringBuilder sb = new();
sb.Append(_collectionKey);
foreach (KeyValuePair<string, ICollectionGenericObjects<T>> value in
_storages)
{
sb.Append(Environment.NewLine);
// не сохраняем пустые коллекции
if (value.Value.Count == 0)
{
continue;
}
sb.Append(value.Key);
sb.Append(_separatorForKeyValue);
sb.Append(value.Value.GetCollectionType);
sb.Append(_separatorForKeyValue);
sb.Append(value.Value.MaxCount);
sb.Append(_separatorForKeyValue);
foreach (T? item in value.Value.GetItems())
{
string data = item?.GetDataForSave() ?? string.Empty;
if (string.IsNullOrEmpty(data))
{
continue;
}
sb.Append(data);
sb.Append(_separatorItems);
}
}
using FileStream fs = new(filename, FileMode.Create);
byte[] info = new UTF8Encoding(true).GetBytes(sb.ToString());
fs.Write(info, 0, info.Length);
}
/// <summary>
/// Загрузка информации по самолетам в хранилище из файла
/// </summary>
/// <param name="filename">Путь и имя файла</param>
/// <returns>true - загрузка прошла успешно, false - ошибка при загрузке данных</returns>
public void LoadData(string filename)
{
if (!File.Exists(filename))
{
throw new Exception("Файл не существует");
}
using (StreamReader sr = new StreamReader(filename))
{
string? str;
str = sr.ReadLine();
if (str == null || str.Length == 0)
throw new Exception("В файле нет данных");
if (str != _collectionKey.ToString())
throw new Exception("В файле неверные данные");
_storages.Clear();
while ((str = sr.ReadLine()) != null)
{
string[] record = str.Split(_separatorForKeyValue);
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])+9;
string[] set = record[3].Split(_separatorItems, StringSplitOptions.RemoveEmptyEntries);
foreach (string elem in set)
{
if (elem?.CreateDrawningBus() is T bus)
{
try
{
if (collection.Insert(bus) == -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,12 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace AccordionBus.Drawnings;
public enum DirectionType
{
Up = 1, Down = 2, Left = 3, Right = 4, Unknow = -1
}

View File

@ -0,0 +1,85 @@
using System;
using System.Collections.Generic;
using System.Drawing.Drawing2D;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using AccordionBus.Drawnings;
using AccordionBus.Entities;
namespace AccordionBus.Drawnings;
public class DrawningAccordionBus:DrawningBus
{
/// <summary>
/// Конструктор
/// </summary>
/// <param name="speed">Скорость</param>
/// <param name="weight">Вес</param>
/// <param name="bodyColor">Основной цвет</param>
/// <param name="additionalColor">Дополнительный цвет</param>
/// <param name="bodyGlass">Признак наличия стёкол</param>
/// /// <param name="garmoshka">Признак наличия гармошки</param>
public DrawningAccordionBus(EntityAccordionBus bus) : base(200, 40)
{
EntityBus = bus;
}
public DrawningAccordionBus(int speed, double weight, Color bodyColor, Color
additionalColor, bool bodyGlass,bool garmoshka): base(200, 40)
{
EntityBus = new EntityAccordionBus(speed, weight, bodyColor, additionalColor,
bodyGlass, garmoshka);
}
/// <summary>
/// перегрузка для создания автобуса в коллекцию базового типа
/// </summary>
/// <param name="speed">скорость</param>
/// <param name="weight">вес</param>
/// <param name="bodyColor">основной цвет</param>
public DrawningAccordionBus(int speed, double weight, Color bodyColor) : base(220, 50)
{
EntityBus = new EntityAccordionBus(speed, weight, bodyColor);
}
public override void DrawTransport(Graphics g)
{
if(EntityBus == null || EntityBus is not EntityAccordionBus accordionBus || !_startPosX.HasValue || !_startPosY.HasValue)
return;
base.DrawTransport(g);
//гармошка
if (accordionBus.BodyGarmoshka)
{
g.FillRectangle(new HatchBrush(HatchStyle.Vertical, Color.Black, EntityBus.BodyColor), _startPosX.Value + 90, _startPosY.Value, 40, 30);
g.DrawRectangle(new Pen(Color.Black), _startPosX.Value, _startPosY.Value, 90, 30);
g.DrawRectangle(new Pen(Color.Black), _startPosX.Value + 90, _startPosY.Value, 40, 30);
g.FillRectangle(new SolidBrush(accordionBus.BodyColor), _startPosX.Value + 130, _startPosY.Value, 70, 30);
g.DrawRectangle(new Pen(Color.Black), _startPosX.Value + 130, _startPosY.Value, 70, 30);
g.FillRectangle(new SolidBrush(Color.Black), _startPosX.Value + 155, _startPosY.Value + 10, 5, 20);
g.FillRectangle(new SolidBrush(Color.Black), _startPosX.Value + 175, _startPosY.Value + 10, 5, 20);
g.DrawEllipse(new Pen(Color.Black), _startPosX.Value + 130, _startPosY.Value + 25, 20, 15);
g.DrawEllipse(new Pen(Color.Black), _startPosX.Value + 180, _startPosY.Value + 25, 20, 15);
g.FillEllipse(new SolidBrush(Color.Black), _startPosX.Value + 130, _startPosY.Value + 25, 20, 15);
g.FillEllipse(new SolidBrush(Color.Black), _startPosX.Value + 180, _startPosY.Value + 25, 20, 15);
g.FillEllipse(new SolidBrush(Color.Black), _startPosX.Value + 130, _startPosY.Value + 25, 20, 15);
g.FillEllipse(new SolidBrush(Color.Black), _startPosX.Value + 180, _startPosY.Value + 25, 20, 15);
}
//стекла
if (accordionBus.BodyGlass)
{
Brush brBlue = new SolidBrush(accordionBus.AdditionalColor);
g.FillEllipse(brBlue, _startPosX.Value + 10, _startPosY.Value + 5, 10, 15);
g.FillEllipse(brBlue, _startPosX.Value + 65, _startPosY.Value + 5, 10, 15);
Pen penGlass = new Pen(Color.Black);
g.DrawEllipse(penGlass, _startPosX.Value + 10, _startPosY.Value + 5, 10, 15);
g.DrawEllipse(penGlass, _startPosX.Value + 65, _startPosY.Value + 5, 10, 15);
if (accordionBus.BodyGarmoshka)
{
g.FillEllipse(brBlue, _startPosX.Value + 135, _startPosY.Value + 5, 10, 15);
g.FillEllipse(brBlue, _startPosX.Value + 185, _startPosY.Value + 5, 10, 15);
g.DrawEllipse(penGlass, _startPosX.Value + 135, _startPosY.Value + 5, 10, 15);
g.DrawEllipse(penGlass, _startPosX.Value + 185, _startPosY.Value + 5, 10, 15);
}
}
}
}

View File

@ -0,0 +1,201 @@
using AccordionBus.Entities;
using System;
using System.Collections.Generic;
using System.Drawing.Drawing2D;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace AccordionBus.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 = 180;
/// <summary>
/// Высота прорисовки автомобиля
/// </summary>
private readonly int _drawningBusHeight = 40;
/// <summary>
/// Координата X
/// </summary>
public int? GetPosX=>_startPosX;
/// <summary>
/// Координата Y
/// </summary>
public int? GetPosY => _startPosY;
/// <summary>
/// Ширина объекта
/// </summary>
public int GetWidth => _drawningBusWidth;
/// <summary>
/// Высота объекта
/// </summary>
public int GetHeight => _drawningBusHeight;
public DrawningBus(EntityBus bus)
{
EntityBus = bus;
}
/// <summary>
/// Пустой конструктор
/// </summary>
private DrawningBus()
{
_pictureWidth = null;
_pictureHeight = null;
_startPosX = null;
_startPosY = null;
}
/// <summary>
/// Конструктор
/// </summary>
/// <param name="speed">Скорость</param>
/// <param name="weight">Вес</param>
/// <param name="bodyColor">Основной цвет</param>
public DrawningBus(int speed, double weight, Color bodyColor):this()
{
EntityBus = new EntityBus(speed, weight, bodyColor);
}
/// <summary>
/// Конструктор для наследования
/// </summary>
/// <param name="drawningBusWidth">ширина автобуса</param>
/// <param name="drawningBusHeight">высота автобуса</param>
protected DrawningBus(int drawningBusWidth, int drawningBusHeight):this()
{
_drawningBusWidth = drawningBusWidth;
_drawningBusHeight = drawningBusHeight;
}
/// <summary>
/// Установка границ поля
/// </summary>
/// <param name="width">Ширина поля</param>
/// <param name="height">Высота поля</param>
/// <returns>true - границы заданы, false - проверка не пройдена, нельзя
public bool SetPictureSize(int width, int height)
{
if (_drawningBusWidth <= width && _drawningBusHeight <= height)
{
_pictureWidth = width;
_pictureHeight = height;
if (_startPosX.HasValue && _startPosY.HasValue)
{
if (_startPosX + _drawningBusWidth > _pictureWidth)
{
_startPosX = _pictureWidth - _drawningBusWidth;
}
if (_startPosY + _drawningBusHeight > _pictureHeight)
{
_startPosY = _pictureHeight - _drawningBusHeight;
}
}
return true;
}
return false;
}
/// <summary>
/// Установка позиции
/// </summary>
/// <param name="x">Координата X</param>
/// <param name="y">Координата Y</param>
public void SetPosition(int x, int y)
{
if (!_pictureHeight.HasValue || !_pictureWidth.HasValue)
{
return;
}
if (x < 0) x = 0;
else if (x + _drawningBusWidth > _pictureWidth) x = _pictureWidth.Value - _drawningBusWidth;
if (y < 0) y = 0;
else if (y + _drawningBusHeight > _pictureHeight) y = _pictureHeight.Value - _drawningBusHeight;
_startPosX = x;
_startPosY = y;
}
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)
_startPosX += (int)EntityBus.Step;
return true;
//вниз
case DirectionType.Down:
if (_startPosY.Value + _drawningBusHeight + EntityBus.Step < _pictureHeight)
_startPosY += (int)EntityBus.Step;
return true;
default:
return false;
}
}
/// <summary>
/// Прорисовка объекта
/// </summary>
/// <param name="g"></param>
public virtual void DrawTransport(Graphics g)
{
if (EntityBus == null || !_startPosX.HasValue || !_startPosY.HasValue)
return;
//кузов
Brush br = new SolidBrush(EntityBus.BodyColor);
g.FillRectangle(br, _startPosX.Value, _startPosY.Value, 90, 30);
g.DrawRectangle(new Pen(Color.Black), _startPosX.Value, _startPosY.Value, 90, 30);
//диски
Brush brWhite = new SolidBrush(Color.White);
g.FillEllipse(brWhite, _startPosX.Value, _startPosY.Value + 25, 20, 15);
g.FillEllipse(brWhite, _startPosX.Value + 70, _startPosY.Value + 25, 20, 15);
Brush brWheel = new SolidBrush(Color.Black);
g.FillEllipse(brWheel, _startPosX.Value, _startPosY.Value + 25, 20, 15);
g.FillEllipse(brWheel, _startPosX.Value + 70, _startPosY.Value + 25, 20, 15);
Pen penWheel = new Pen(Color.Black);
g.DrawEllipse(penWheel, _startPosX.Value, _startPosY.Value + 25, 20, 15);
g.DrawEllipse(penWheel, _startPosX.Value + 70, _startPosY.Value + 25, 20, 15);
//двери
Brush brDoor = new SolidBrush(Color.Black);
g.FillRectangle(brDoor, _startPosX.Value + 55, _startPosY.Value + 10, 5, 20);
g.FillRectangle(brDoor, _startPosX.Value + 25, _startPosY.Value + 10, 5, 20);
}
}

View File

@ -0,0 +1,50 @@
using AccordionBus.Entities;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace AccordionBus.Drawnings;
public static class ExtentionDrawningBus
{
/// <summary>
/// Разделитель для записи информации по объекту в файл
/// </summary>
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 && bus is EntityAccordionBus bus1)
{
return new DrawningAccordionBus(bus1);
}
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,60 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace AccordionBus.Entities;
public class EntityAccordionBus: EntityBus
{
/// <summary>
/// Дополнительный цвет (для опциональных элементов)
/// </summary>
public Color AdditionalColor { get; private set; }
/// <summary>
/// Признак (опция) наличия стёкол
/// </summary>
public bool BodyGlass { get; private set; }
/// <summary>
/// признак наличия гармошки
/// </summary>
public bool BodyGarmoshka { get; private set; }
/// <summary>
/// Инициализация полей объекта-класса автобуса с гармошкой
/// </summary>
/// <param name="additionalColor">Дополнительный цвет</param>
/// <param name="glass">наличие стекла</param>
/// <param name="garmoshka">наличие гармошки</param>
public EntityAccordionBus(int speed, double weigth, Color bodyColor, Color additionalColor, bool glass, bool garmoshka) : base (speed,weigth,bodyColor)
{
AdditionalColor = additionalColor;
BodyGlass = glass;
BodyGarmoshka = garmoshka;
}
/// <summary>
/// Перегрузка конструктора для создания базового автобуса в коллекцию
/// </summary>
/// <param name="speed">скрость</param>
/// <param name="weigth">вес</param>
/// <param name="bodyColor">основной цвет</param>
public EntityAccordionBus(int speed, double weigth, Color bodyColor) : base(speed, weigth, bodyColor){}
public void SetAdditional(Color color)
{
AdditionalColor = color;
}
public override string[] GetStringRepresentation()
{
return new[] { nameof(EntityAccordionBus), Speed.ToString(), Weight.ToString(), BodyColor.Name,
AdditionalColor.Name, BodyGlass.ToString(), BodyGarmoshka.ToString() };
}
public static EntityAccordionBus? CreateEntityAccordionBus(string[] strs)
{
if (strs.Length != 7 || 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]));
}
}

View File

@ -0,0 +1,67 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace AccordionBus.Entities;
/// <summary>
/// Класс-сущность автобус
/// </summary>
public class EntityBus
{
/// <summary>
/// Скорость
/// </summary>
public int Speed { get; private set; }
/// <summary>
/// Вес
/// </summary>
public double Weight { get; private set; }
/// <summary>
/// Основной цвет
/// </summary>
public Color BodyColor { get; private set; }
/// <summary>
/// Шаг перемещения автомобиля
/// </summary>
public double Step => Speed * 100 / 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 void SetBody(Color color)
{
BodyColor = color;
}
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,22 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.Text;
using System.Threading.Tasks;
namespace AccordionBus.Exceptions;
public 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,19 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.Text;
using System.Threading.Tasks;
namespace AccordionBus.Exceptions;
public 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 AccordionBus.Exceptions;
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 AccordionBus
{
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 AccordionBus
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
}
}

View File

@ -0,0 +1,150 @@
namespace AccordionBus
{
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();
buttonUp = new Button();
buttonLeft = new Button();
buttonDown = 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(714, 390);
pictureBoxAccordionBus.SizeMode = PictureBoxSizeMode.AutoSize;
pictureBoxAccordionBus.TabIndex = 5;
pictureBoxAccordionBus.TabStop = false;
//
// buttonUp
//
buttonUp.Anchor = AnchorStyles.Bottom | AnchorStyles.Right;
buttonUp.BackgroundImage = (Image)resources.GetObject("buttonUp.BackgroundImage");
buttonUp.BackgroundImageLayout = ImageLayout.Zoom;
buttonUp.Location = new Point(626, 308);
buttonUp.Name = "buttonUp";
buttonUp.Size = new Size(35, 35);
buttonUp.TabIndex = 7;
buttonUp.Text = " ";
buttonUp.UseVisualStyleBackColor = true;
buttonUp.Click += ButtonMove_Click;
//
// buttonLeft
//
buttonLeft.Anchor = AnchorStyles.Bottom | AnchorStyles.Right;
buttonLeft.BackgroundImage = (Image)resources.GetObject("buttonLeft.BackgroundImage");
buttonLeft.BackgroundImageLayout = ImageLayout.Zoom;
buttonLeft.Location = new Point(585, 349);
buttonLeft.Name = "buttonLeft";
buttonLeft.Size = new Size(35, 35);
buttonLeft.TabIndex = 8;
buttonLeft.Text = " ";
buttonLeft.UseVisualStyleBackColor = true;
buttonLeft.Click += ButtonMove_Click;
//
// buttonDown
//
buttonDown.Anchor = AnchorStyles.Bottom | AnchorStyles.Right;
buttonDown.BackgroundImage = (Image)resources.GetObject("buttonDown.BackgroundImage");
buttonDown.BackgroundImageLayout = ImageLayout.Zoom;
buttonDown.Location = new Point(626, 349);
buttonDown.Name = "buttonDown";
buttonDown.Size = new Size(35, 35);
buttonDown.TabIndex = 9;
buttonDown.Text = " ";
buttonDown.UseVisualStyleBackColor = true;
buttonDown.Click += ButtonMove_Click;
//
// buttonRight
//
buttonRight.Anchor = AnchorStyles.Bottom | AnchorStyles.Right;
buttonRight.BackgroundImage = (Image)resources.GetObject("buttonRight.BackgroundImage");
buttonRight.BackgroundImageLayout = ImageLayout.Zoom;
buttonRight.Location = new Point(667, 349);
buttonRight.Name = "buttonRight";
buttonRight.Size = new Size(35, 35);
buttonRight.TabIndex = 10;
buttonRight.Text = " ";
buttonRight.UseVisualStyleBackColor = true;
buttonRight.Click += ButtonMove_Click;
//
// comboBoxStrategy
//
comboBoxStrategy.Anchor = AnchorStyles.Top | AnchorStyles.Right;
comboBoxStrategy.DropDownStyle = ComboBoxStyle.DropDownList;
comboBoxStrategy.FormattingEnabled = true;
comboBoxStrategy.Items.AddRange(new object[] { "К центру", "К краю" });
comboBoxStrategy.Location = new Point(581, 12);
comboBoxStrategy.Name = "comboBoxStrategy";
comboBoxStrategy.Size = new Size(121, 23);
comboBoxStrategy.TabIndex = 12;
//
// buttonStrategyStep
//
buttonStrategyStep.Anchor = AnchorStyles.Top | AnchorStyles.Right;
buttonStrategyStep.Location = new Point(627, 41);
buttonStrategyStep.Name = "buttonStrategyStep";
buttonStrategyStep.Size = new Size(75, 23);
buttonStrategyStep.TabIndex = 13;
buttonStrategyStep.Text = "Шаг";
buttonStrategyStep.UseVisualStyleBackColor = true;
buttonStrategyStep.Click += ButtonStrategyStep_Click;
//
// FormAccordionBus
//
AutoScaleDimensions = new SizeF(7F, 15F);
AutoScaleMode = AutoScaleMode.Font;
ClientSize = new Size(714, 390);
Controls.Add(buttonStrategyStep);
Controls.Add(comboBoxStrategy);
Controls.Add(buttonRight);
Controls.Add(buttonDown);
Controls.Add(buttonLeft);
Controls.Add(buttonUp);
Controls.Add(pictureBoxAccordionBus);
Name = "FormAccordionBus";
Text = "Автобус с гармошкой";
((System.ComponentModel.ISupportInitialize)pictureBoxAccordionBus).EndInit();
ResumeLayout(false);
PerformLayout();
}
#endregion
private PictureBox pictureBoxAccordionBus;
private Button buttonUp;
private Button buttonLeft;
private Button buttonDown;
private Button buttonRight;
private ComboBox comboBoxStrategy;
private Button buttonStrategyStep;
}
}

View File

@ -0,0 +1,147 @@
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;
using AccordionBus.Drawnings;
using AccordionBus.MovementStrategy;
namespace AccordionBus;
public partial class FormAccordionBus : Form
{
/// <summary>
/// Поле-объект для прорисовки объекта
/// </summary>
private DrawningBus? _drawningBus;
/// <summary>
/// Стратегия перемещения
/// </summary>
private AbstractStrategy? _strategy;
/// <summary>
/// Получение объекта
/// </summary>
public DrawningBus SetBus
{
set
{
_drawningBus = value;
_drawningBus.SetPictureSize(pictureBoxAccordionBus.Width, pictureBoxAccordionBus.Height);
comboBoxStrategy.Enabled = true;
_strategy = null;
Draw();
}
}
/// <summary>
/// Инициализация формы
/// </summary>
public FormAccordionBus()
{
InitializeComponent();
_strategy = null;
}
/// <summary>
/// Метод прорисовки машины
/// </summary>
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;
}
/// <summary>
/// Перемещение объекта по форме (нажатие кнопок навигации)
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
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();
}
}
/// <summary>
/// Обработка нажатия кнопки "Шаг"
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
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,565 @@
<?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="buttonUp.BackgroundImage" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
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
AElFTkSuQmCC
</value>
</data>
<data name="buttonLeft.BackgroundImage" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
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
</value>
</data>
<data name="buttonDown.BackgroundImage" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
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
</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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
QmCC
</value>
</data>
</root>

View File

@ -0,0 +1,345 @@
namespace AccordionBus
{
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();
buttonAddBus = new Button();
maskedTextBoxPosition = new MaskedTextBox();
buttonRefresh = new Button();
buttonDelBus = new Button();
buttonGoToCheck = new Button();
buttonCreateCompany = new Button();
panelStorage = new Panel();
buttonCollectionDel = new Button();
listBoxCollection = new ListBox();
buttonCollectionAdd = new Button();
radioButtonList = new RadioButton();
radioButtonMassive = new RadioButton();
textBoxCollectionName = new TextBox();
labelCollectionName = new Label();
comboBoxSelectorCompany = new ComboBox();
pictureBox = new PictureBox();
colorDialog1 = new ColorDialog();
menuStrip = new MenuStrip();
файлToolStripMenuItem = new ToolStripMenuItem();
saveToolStripMenuItem = new ToolStripMenuItem();
loadToolStripMenuItem = new ToolStripMenuItem();
saveFileDialog = new SaveFileDialog();
loadFileDialog = new OpenFileDialog();
groupBoxTools.SuspendLayout();
panelCompanyTools.SuspendLayout();
panelStorage.SuspendLayout();
((System.ComponentModel.ISupportInitialize)pictureBox).BeginInit();
menuStrip.SuspendLayout();
SuspendLayout();
//
// groupBoxTools
//
groupBoxTools.Controls.Add(panelCompanyTools);
groupBoxTools.Controls.Add(buttonCreateCompany);
groupBoxTools.Controls.Add(panelStorage);
groupBoxTools.Controls.Add(comboBoxSelectorCompany);
groupBoxTools.Dock = DockStyle.Right;
groupBoxTools.Location = new Point(906, 24);
groupBoxTools.Name = "groupBoxTools";
groupBoxTools.Size = new Size(231, 448);
groupBoxTools.TabIndex = 0;
groupBoxTools.TabStop = false;
groupBoxTools.Text = "Инструменты";
//
// panelCompanyTools
//
panelCompanyTools.Controls.Add(buttonAddBus);
panelCompanyTools.Controls.Add(maskedTextBoxPosition);
panelCompanyTools.Controls.Add(buttonRefresh);
panelCompanyTools.Controls.Add(buttonDelBus);
panelCompanyTools.Controls.Add(buttonGoToCheck);
panelCompanyTools.Dock = DockStyle.Bottom;
panelCompanyTools.Enabled = false;
panelCompanyTools.Location = new Point(3, 290);
panelCompanyTools.Name = "panelCompanyTools";
panelCompanyTools.Size = new Size(225, 155);
panelCompanyTools.TabIndex = 10;
//
// buttonAddBus
//
buttonAddBus.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right;
buttonAddBus.Location = new Point(4, 3);
buttonAddBus.Name = "buttonAddBus";
buttonAddBus.Size = new Size(209, 29);
buttonAddBus.TabIndex = 1;
buttonAddBus.Text = "Добавление автобуса";
buttonAddBus.UseVisualStyleBackColor = true;
buttonAddBus.Click += ButtonAddBus_Click;
//
// maskedTextBoxPosition
//
maskedTextBoxPosition.Location = new Point(4, 38);
maskedTextBoxPosition.Mask = "00";
maskedTextBoxPosition.Name = "maskedTextBoxPosition";
maskedTextBoxPosition.Size = new Size(212, 23);
maskedTextBoxPosition.TabIndex = 4;
maskedTextBoxPosition.ValidatingType = typeof(int);
//
// buttonRefresh
//
buttonRefresh.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right;
buttonRefresh.Location = new Point(4, 125);
buttonRefresh.Name = "buttonRefresh";
buttonRefresh.Size = new Size(209, 22);
buttonRefresh.TabIndex = 7;
buttonRefresh.Text = "Обновить";
buttonRefresh.UseVisualStyleBackColor = true;
buttonRefresh.Click += ButtonRefresh_Click;
//
// buttonDelBus
//
buttonDelBus.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right;
buttonDelBus.Location = new Point(4, 67);
buttonDelBus.Name = "buttonDelBus";
buttonDelBus.Size = new Size(209, 23);
buttonDelBus.TabIndex = 5;
buttonDelBus.Text = "Удалить автомобиль";
buttonDelBus.UseVisualStyleBackColor = true;
buttonDelBus.Click += ButtonRemoveBus_Click;
//
// buttonGoToCheck
//
buttonGoToCheck.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right;
buttonGoToCheck.Location = new Point(4, 96);
buttonGoToCheck.Name = "buttonGoToCheck";
buttonGoToCheck.Size = new Size(209, 23);
buttonGoToCheck.TabIndex = 6;
buttonGoToCheck.Text = "Передать на тесты";
buttonGoToCheck.UseVisualStyleBackColor = true;
buttonGoToCheck.Click += ButtonGoToCheck_Click;
//
// buttonCreateCompany
//
buttonCreateCompany.Location = new Point(6, 264);
buttonCreateCompany.Name = "buttonCreateCompany";
buttonCreateCompany.Size = new Size(213, 23);
buttonCreateCompany.TabIndex = 9;
buttonCreateCompany.Text = "Создать компанию";
buttonCreateCompany.UseVisualStyleBackColor = true;
buttonCreateCompany.Click += buttonCreateCompany_Click;
//
// panelStorage
//
panelStorage.Controls.Add(buttonCollectionDel);
panelStorage.Controls.Add(listBoxCollection);
panelStorage.Controls.Add(buttonCollectionAdd);
panelStorage.Controls.Add(radioButtonList);
panelStorage.Controls.Add(radioButtonMassive);
panelStorage.Controls.Add(textBoxCollectionName);
panelStorage.Controls.Add(labelCollectionName);
panelStorage.Dock = DockStyle.Top;
panelStorage.Location = new Point(3, 19);
panelStorage.Name = "panelStorage";
panelStorage.Size = new Size(225, 210);
panelStorage.TabIndex = 8;
//
// buttonCollectionDel
//
buttonCollectionDel.Location = new Point(3, 184);
buttonCollectionDel.Name = "buttonCollectionDel";
buttonCollectionDel.Size = new Size(210, 23);
buttonCollectionDel.TabIndex = 6;
buttonCollectionDel.Text = "Удалить коллекцию";
buttonCollectionDel.UseVisualStyleBackColor = true;
buttonCollectionDel.Click += buttonCollectionDel_Click;
//
// listBoxCollection
//
listBoxCollection.FormattingEnabled = true;
listBoxCollection.ItemHeight = 15;
listBoxCollection.Location = new Point(3, 101);
listBoxCollection.Name = "listBoxCollection";
listBoxCollection.Size = new Size(213, 79);
listBoxCollection.TabIndex = 5;
//
// buttonCollectionAdd
//
buttonCollectionAdd.Location = new Point(3, 72);
buttonCollectionAdd.Name = "buttonCollectionAdd";
buttonCollectionAdd.Size = new Size(213, 23);
buttonCollectionAdd.TabIndex = 4;
buttonCollectionAdd.Text = "Добавить коллекцию";
buttonCollectionAdd.UseVisualStyleBackColor = true;
buttonCollectionAdd.Click += buttonCollectionAdd_Click;
//
// radioButtonList
//
radioButtonList.AutoSize = true;
radioButtonList.Location = new Point(150, 47);
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(4, 47);
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(3, 18);
textBoxCollectionName.Name = "textBoxCollectionName";
textBoxCollectionName.Size = new Size(213, 23);
textBoxCollectionName.TabIndex = 1;
//
// labelCollectionName
//
labelCollectionName.AutoSize = true;
labelCollectionName.Location = new Point(3, 0);
labelCollectionName.Name = "labelCollectionName";
labelCollectionName.Size = new Size(125, 15);
labelCollectionName.TabIndex = 0;
labelCollectionName.Text = "Название коллекции:";
//
// 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, 235);
comboBoxSelectorCompany.Name = "comboBoxSelectorCompany";
comboBoxSelectorCompany.Size = new Size(213, 23);
comboBoxSelectorCompany.TabIndex = 0;
//
// pictureBox
//
pictureBox.Dock = DockStyle.Fill;
pictureBox.Location = new Point(0, 24);
pictureBox.Name = "pictureBox";
pictureBox.Size = new Size(906, 448);
pictureBox.TabIndex = 3;
pictureBox.TabStop = false;
//
// menuStrip
//
menuStrip.Items.AddRange(new ToolStripItem[] { файлToolStripMenuItem });
menuStrip.Location = new Point(0, 0);
menuStrip.Name = "menuStrip";
menuStrip.Size = new Size(1137, 24);
menuStrip.TabIndex = 4;
menuStrip.Text = "menuStrip1";
//
// файлToolStripMenuItem
//
файлToolStripMenuItem.DropDownItems.AddRange(new ToolStripItem[] { saveToolStripMenuItem, loadToolStripMenuItem });
файлToolStripMenuItem.Name = айлToolStripMenuItem";
файлToolStripMenuItem.Size = new Size(48, 20);
файлToolStripMenuItem.Text = "Файл";
//
// saveToolStripMenuItem
//
saveToolStripMenuItem.Name = "saveToolStripMenuItem";
saveToolStripMenuItem.Size = new Size(141, 22);
saveToolStripMenuItem.Text = "Сохранение";
saveToolStripMenuItem.Click += SaveToolStripMenuItem_Click;
//
// loadToolStripMenuItem
//
loadToolStripMenuItem.Name = "loadToolStripMenuItem";
loadToolStripMenuItem.Size = new Size(141, 22);
loadToolStripMenuItem.Text = "Загрузка";
loadToolStripMenuItem.Click += LoadToolStripMenuItem_Click;
//
// saveFileDialog
//
saveFileDialog.Filter = "txt file|*.txt";
//
// loadFileDialog
//
loadFileDialog.FileName = "openFileDialog1";
//
// FormBusCollection
//
AutoScaleDimensions = new SizeF(7F, 15F);
AutoScaleMode = AutoScaleMode.Font;
ClientSize = new Size(1137, 472);
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 buttonDelBus;
private MaskedTextBox maskedTextBoxPosition;
private Button buttonAddBus;
private PictureBox pictureBox;
private Button buttonRefresh;
private Button buttonGoToCheck;
private ColorDialog colorDialog1;
private Panel panelStorage;
private TextBox textBoxCollectionName;
private Label labelCollectionName;
private RadioButton radioButtonList;
private RadioButton radioButtonMassive;
private Button buttonCollectionDel;
private ListBox listBoxCollection;
private Button buttonCollectionAdd;
private Button buttonCreateCompany;
private Panel panelCompanyTools;
private MenuStrip menuStrip;
private ToolStripMenuItem файлToolStripMenuItem;
private ToolStripMenuItem saveToolStripMenuItem;
private ToolStripMenuItem loadToolStripMenuItem;
private SaveFileDialog saveFileDialog;
private OpenFileDialog loadFileDialog;
}
}

View File

@ -0,0 +1,293 @@
using AccordionBus.CollectionGenericObjects;
using AccordionBus.Drawnings;
using AccordionBus.Exceptions;
using AccordionBus.MovementStrategy;
using Microsoft.Extensions.Logging;
using ProjectAccordionBus.CollectionGenericObjects;
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 AccordionBus;
public partial class FormBusCollection : Form
{
private readonly StorageCollection<DrawningBus> _storageCollection;
/// <summary>
/// Компания
/// </summary>
private AbstractCompany? _company = null;
/// <summary>
/// Логер
/// </summary>
private readonly ILogger _logger;
/// <summary>
/// Конструктор
/// </summary>
public FormBusCollection(ILogger<FormBusCollection> logger)
{
InitializeComponent();
_storageCollection = new();
_logger = logger;
}
private void SetBus(DrawningBus bus)
{
try
{
if (_company == null || bus == null) return;
if (_company + bus)
{
MessageBox.Show("Объект добавлен");
pictureBox.Image = _company.Show();
}
}
catch(Exception ex)
{
if (ex is CollectionOverflowException)
{
MessageBox.Show("Не удалось добавить объект");
_logger.LogError("Ошибка: {Message}", ex.Message);
}
else if (ex is PositionOutOfCollectionException)
{
MessageBox.Show("Выход за пределы коллекции");
_logger.LogError("Ошибка: {Message}", ex.Message);
}
}
}
/// <summary>
/// Выбор компании
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void comboBoxSelectorCompany_SelectedIndexChanged(object sender, EventArgs e)
{
panelCompanyTools.Enabled = false;
}
/// <summary>
/// Добавление обычного автомобиля
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void ButtonAddBus_Click(object sender, EventArgs e)
{
FormBusConfig form = new();
form.Show();
form.AddEvent(SetBus);
}
/// <summary>
/// Удаление объекта
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void ButtonRemoveBus_Click(object sender, EventArgs e)
{
if (string.IsNullOrEmpty(maskedTextBoxPosition.Text) || _company == null)
{
return;
}
if (MessageBox.Show("Удалить объект?", "Удаление", MessageBoxButtons.YesNo, MessageBoxIcon.Question) != DialogResult.Yes)
{
return;
}
int pos = Convert.ToInt32(maskedTextBoxPosition.Text);
try
{
if (_company - pos != null)
{
MessageBox.Show("Объект удален");
_logger.LogInformation("Удален объект - " + pos);
pictureBox.Image = _company.Show();
}
}
catch (Exception ex) {
MessageBox.Show("Не удалось удалить объект");
_logger.LogError("Ошибка: {Message}", ex.Message);
}
}
/// <summary>
/// Передача объекта в другую форму
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void ButtonGoToCheck_Click(object sender, EventArgs e)
{
if (_company == null)
{
return;
}
DrawningBus? bus = null;
int counter = 100;
try
{
while (bus == null)
{
bus = _company.GetRandomObject();
counter--;
if (counter <= 0)
{
break;
}
}
if (bus == null)
{
return;
}
FormAccordionBus form = new()
{
SetBus = bus
};
form.ShowDialog();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Результат", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
/// <summary>
/// Перерисовка коллекции
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void ButtonRefresh_Click(object sender, EventArgs e)
{
if (_company == null)
{
return;
}
pictureBox.Image = _company.Show();
}
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 buttonCollectionAdd_Click(object sender, EventArgs e)
{
if (string.IsNullOrEmpty(textBoxCollectionName.Text) || (!radioButtonList.Checked && !radioButtonMassive.Checked))
{
MessageBox.Show("Не все данные заполнены", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
try
{
CollectionType collectionType = CollectionType.None;
if (radioButtonMassive.Checked)
{
collectionType = CollectionType.Massive;
}
else if (radioButtonList.Checked)
{
collectionType = CollectionType.List;
}
_storageCollection.AddCollection(textBoxCollectionName.Text, collectionType);
RefreshListBoxItems();
_logger.LogInformation("Коллекция добавлена " + textBoxCollectionName.Text);
}
catch (Exception ex) {
_logger.LogError("Ошибка: {Message}", ex.Message);
}
}
private void buttonCollectionDel_Click(object sender, EventArgs e)
{
if (listBoxCollection.SelectedIndex < 0 || listBoxCollection.SelectedItems == null)
{
MessageBox.Show("Коллекция не выбрана");
return;
}
try
{
if (MessageBox.Show("Удалить коллекцию?", "Удаление", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No)
{
return;
}
_storageCollection.DelCollection(listBoxCollection.SelectedItem.ToString());
RefreshListBoxItems();
_logger.LogInformation("Коллекция " + listBoxCollection.SelectedItem.ToString() + " удалена");
}
catch(Exception ex)
{
_logger.LogError("Ошибка: {Message}", ex.Message);
}
}
private void buttonCreateCompany_Click(object sender, EventArgs e)
{
if (listBoxCollection.SelectedIndex < 0 || listBoxCollection.SelectedItem == null)
{
MessageBox.Show("Коллекция не выбрана");
return;
}
ICollectionGenericObjects<DrawningBus>? collection = _storageCollection[listBoxCollection.SelectedItem.ToString() ?? string.Empty];
if (collection == null)
{
MessageBox.Show("Коллекция не проинициализирована");
return;
}
switch (comboBoxSelectorCompany.Text)
{
case "Автовокзал":
_company = new BusStation(pictureBox.Width, pictureBox.Height, collection);
break;
}
panelCompanyTools.Enabled = true;
RefreshListBoxItems();
}
private void LoadToolStripMenuItem_Click(object sender, EventArgs e)
{
if (loadFileDialog.ShowDialog() == DialogResult.OK)
{
try
{
_storageCollection.LoadData(loadFileDialog.FileName);
RefreshListBoxItems();
MessageBox.Show("Загрузка прошла успешно", "Результат", MessageBoxButtons.OK, MessageBoxIcon.Information);
_logger.LogInformation("Загрузка из файла: {filename}",
loadFileDialog.FileName);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Результат",
MessageBoxButtons.OK, MessageBoxIcon.Error);
_logger.LogError("Ошибка: {Message}", ex.Message);
}
}
}
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);
}
}
}
}

View File

@ -0,0 +1,132 @@
<?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="colorDialog1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>17, 17</value>
</metadata>
<metadata name="menuStrip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>138, 17</value>
</metadata>
<metadata name="saveFileDialog.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>247, 17</value>
</metadata>
<metadata name="loadFileDialog.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>376, 17</value>
</metadata>
</root>

View File

@ -0,0 +1,357 @@
namespace AccordionBus
{
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();
panelGray = new Panel();
panelWhite = new Panel();
panelYellow = new Panel();
panelBlue = new Panel();
panelGreen = new Panel();
panelRed = new Panel();
checkBoxGarmoshka = new CheckBox();
checkBoxGlass = new CheckBox();
numericUpDownSpeed = new NumericUpDown();
numericUpDownWeight = new NumericUpDown();
labelWeight = new Label();
labelSpeed = new Label();
labelModifiedObject = new Label();
labelSimpleObject = new Label();
pictureBoxObject = new PictureBox();
buttonAdd = new Button();
buttonCancel = new Button();
panelObject = new Panel();
labelAdditionalColor = new Label();
labelBaseColor = new Label();
groupBoxConfig.SuspendLayout();
groupBoxColors.SuspendLayout();
((System.ComponentModel.ISupportInitialize)numericUpDownSpeed).BeginInit();
((System.ComponentModel.ISupportInitialize)numericUpDownWeight).BeginInit();
((System.ComponentModel.ISupportInitialize)pictureBoxObject).BeginInit();
panelObject.SuspendLayout();
SuspendLayout();
//
// groupBoxConfig
//
groupBoxConfig.Controls.Add(groupBoxColors);
groupBoxConfig.Controls.Add(checkBoxGarmoshka);
groupBoxConfig.Controls.Add(checkBoxGlass);
groupBoxConfig.Controls.Add(numericUpDownSpeed);
groupBoxConfig.Controls.Add(numericUpDownWeight);
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(549, 341);
groupBoxConfig.TabIndex = 0;
groupBoxConfig.TabStop = false;
groupBoxConfig.Text = "Параметры";
//
// groupBoxColors
//
groupBoxColors.Controls.Add(panelPurple);
groupBoxColors.Controls.Add(panelBlack);
groupBoxColors.Controls.Add(panelGray);
groupBoxColors.Controls.Add(panelWhite);
groupBoxColors.Controls.Add(panelYellow);
groupBoxColors.Controls.Add(panelBlue);
groupBoxColors.Controls.Add(panelGreen);
groupBoxColors.Controls.Add(panelRed);
groupBoxColors.Location = new Point(370, 12);
groupBoxColors.Name = "groupBoxColors";
groupBoxColors.Size = new Size(140, 84);
groupBoxColors.TabIndex = 1;
groupBoxColors.TabStop = false;
groupBoxColors.Text = "Цвета";
//
// panelPurple
//
panelPurple.BackColor = Color.Purple;
panelPurple.Location = new Point(105, 56);
panelPurple.Name = "panelPurple";
panelPurple.Size = new Size(27, 25);
panelPurple.TabIndex = 1;
//
// panelBlack
//
panelBlack.BackColor = Color.Black;
panelBlack.Location = new Point(73, 56);
panelBlack.Name = "panelBlack";
panelBlack.Size = new Size(27, 25);
panelBlack.TabIndex = 1;
//
// panelGray
//
panelGray.BackColor = Color.Gray;
panelGray.Location = new Point(39, 56);
panelGray.Name = "panelGray";
panelGray.Size = new Size(27, 25);
panelGray.TabIndex = 1;
//
// panelWhite
//
panelWhite.BackColor = Color.White;
panelWhite.Location = new Point(6, 56);
panelWhite.Name = "panelWhite";
panelWhite.Size = new Size(27, 25);
panelWhite.TabIndex = 1;
//
// panelYellow
//
panelYellow.BackColor = Color.Yellow;
panelYellow.Location = new Point(105, 22);
panelYellow.Name = "panelYellow";
panelYellow.Size = new Size(27, 25);
panelYellow.TabIndex = 1;
//
// panelBlue
//
panelBlue.BackColor = Color.Blue;
panelBlue.Location = new Point(72, 22);
panelBlue.Name = "panelBlue";
panelBlue.Size = new Size(27, 25);
panelBlue.TabIndex = 1;
//
// panelGreen
//
panelGreen.BackColor = Color.Green;
panelGreen.Location = new Point(39, 22);
panelGreen.Name = "panelGreen";
panelGreen.Size = new Size(27, 25);
panelGreen.TabIndex = 1;
//
// panelRed
//
panelRed.BackColor = Color.Red;
panelRed.Location = new Point(6, 22);
panelRed.Name = "panelRed";
panelRed.Size = new Size(27, 25);
panelRed.TabIndex = 0;
//
// checkBoxGarmoshka
//
checkBoxGarmoshka.AutoSize = true;
checkBoxGarmoshka.Location = new Point(12, 74);
checkBoxGarmoshka.Name = "checkBoxGarmoshka";
checkBoxGarmoshka.Size = new Size(99, 19);
checkBoxGarmoshka.TabIndex = 7;
checkBoxGarmoshka.Text = "Второй отсек";
checkBoxGarmoshka.UseVisualStyleBackColor = true;
//
// checkBoxGlass
//
checkBoxGlass.AutoSize = true;
checkBoxGlass.Location = new Point(12, 99);
checkBoxGlass.Name = "checkBoxGlass";
checkBoxGlass.Size = new Size(64, 19);
checkBoxGlass.TabIndex = 6;
checkBoxGlass.Text = "Стекла";
checkBoxGlass.UseVisualStyleBackColor = true;
//
// numericUpDownSpeed
//
numericUpDownSpeed.Location = new Point(82, 17);
numericUpDownSpeed.Maximum = new decimal(new int[] { 1000, 0, 0, 0 });
numericUpDownSpeed.Minimum = new decimal(new int[] { 10, 0, 0, 0 });
numericUpDownSpeed.Name = "numericUpDownSpeed";
numericUpDownSpeed.Size = new Size(88, 23);
numericUpDownSpeed.TabIndex = 5;
numericUpDownSpeed.Value = new decimal(new int[] { 10, 0, 0, 0 });
//
// numericUpDownWeight
//
numericUpDownWeight.Location = new Point(82, 45);
numericUpDownWeight.Maximum = new decimal(new int[] { 120, 0, 0, 0 });
numericUpDownWeight.Minimum = new decimal(new int[] { 30, 0, 0, 0 });
numericUpDownWeight.Name = "numericUpDownWeight";
numericUpDownWeight.Size = new Size(88, 23);
numericUpDownWeight.TabIndex = 4;
numericUpDownWeight.Value = new decimal(new int[] { 30, 0, 0, 0 });
//
// labelWeight
//
labelWeight.AutoSize = true;
labelWeight.Location = new Point(12, 47);
labelWeight.Name = "labelWeight";
labelWeight.Size = new Size(32, 15);
labelWeight.TabIndex = 3;
labelWeight.Text = "Вес: ";
//
// labelSpeed
//
labelSpeed.AutoSize = true;
labelSpeed.Location = new Point(12, 19);
labelSpeed.Name = "labelSpeed";
labelSpeed.Size = new Size(65, 15);
labelSpeed.TabIndex = 2;
labelSpeed.Text = "Скорость: ";
//
// labelModifiedObject
//
labelModifiedObject.BorderStyle = BorderStyle.FixedSingle;
labelModifiedObject.Location = new Point(442, 99);
labelModifiedObject.Name = "labelModifiedObject";
labelModifiedObject.Size = new Size(100, 23);
labelModifiedObject.TabIndex = 1;
labelModifiedObject.Text = "Продвинутый";
labelModifiedObject.TextAlign = ContentAlignment.MiddleCenter;
labelModifiedObject.MouseDown += LabelObject_MouseDown;
//
// labelSimpleObject
//
labelSimpleObject.BorderStyle = BorderStyle.FixedSingle;
labelSimpleObject.Location = new Point(336, 99);
labelSimpleObject.Name = "labelSimpleObject";
labelSimpleObject.Size = new Size(100, 23);
labelSimpleObject.TabIndex = 0;
labelSimpleObject.Text = "Простой ";
labelSimpleObject.TextAlign = ContentAlignment.MiddleCenter;
labelSimpleObject.MouseDown += LabelObject_MouseDown;
//
// pictureBoxObject
//
pictureBoxObject.Location = new Point(7, 74);
pictureBoxObject.Name = "pictureBoxObject";
pictureBoxObject.Size = new Size(256, 156);
pictureBoxObject.TabIndex = 8;
pictureBoxObject.TabStop = false;
//
// buttonAdd
//
buttonAdd.Location = new Point(554, 270);
buttonAdd.Name = "buttonAdd";
buttonAdd.Size = new Size(75, 23);
buttonAdd.TabIndex = 9;
buttonAdd.Text = "Добавить";
buttonAdd.UseVisualStyleBackColor = true;
buttonAdd.Click += ButtonAdd_Click;
//
// buttonCancel
//
buttonCancel.Location = new Point(736, 270);
buttonCancel.Name = "buttonCancel";
buttonCancel.Size = new Size(75, 23);
buttonCancel.TabIndex = 10;
buttonCancel.Text = "Отмена";
buttonCancel.UseVisualStyleBackColor = true;
//
// panelObject
//
panelObject.AllowDrop = true;
panelObject.Controls.Add(labelAdditionalColor);
panelObject.Controls.Add(labelBaseColor);
panelObject.Controls.Add(pictureBoxObject);
panelObject.Location = new Point(548, 0);
panelObject.Name = "panelObject";
panelObject.Size = new Size(275, 264);
panelObject.TabIndex = 11;
panelObject.DragDrop += PanelObject_DragDrop;
panelObject.DragEnter += PanelObject_DragEnter;
//
// labelAdditionalColor
//
labelAdditionalColor.AllowDrop = true;
labelAdditionalColor.BorderStyle = BorderStyle.FixedSingle;
labelAdditionalColor.Location = new Point(193, 34);
labelAdditionalColor.Name = "labelAdditionalColor";
labelAdditionalColor.Size = new Size(70, 20);
labelAdditionalColor.TabIndex = 9;
labelAdditionalColor.Text = "Доп. цвет";
labelAdditionalColor.TextAlign = ContentAlignment.MiddleCenter;
labelAdditionalColor.DragDrop += labelAdditionalColor_DragDrop;
labelAdditionalColor.DragEnter += labelAdditionalColor_DragEnter;
//
// labelBaseColor
//
labelBaseColor.AllowDrop = true;
labelBaseColor.BorderStyle = BorderStyle.FixedSingle;
labelBaseColor.Location = new Point(7, 34);
labelBaseColor.Name = "labelBaseColor";
labelBaseColor.Size = new Size(57, 20);
labelBaseColor.TabIndex = 8;
labelBaseColor.Text = "Цвет";
labelBaseColor.TextAlign = ContentAlignment.MiddleCenter;
labelBaseColor.DragDrop += labelBodyColor_DragDrop;
labelBaseColor.DragEnter += labelBodyColor_DragEnter;
//
// FormBusConfig
//
AutoScaleDimensions = new SizeF(7F, 15F);
AutoScaleMode = AutoScaleMode.Font;
ClientSize = new Size(823, 341);
Controls.Add(panelObject);
Controls.Add(buttonCancel);
Controls.Add(buttonAdd);
Controls.Add(groupBoxConfig);
Name = "FormBusConfig";
Text = "Создание объекта";
groupBoxConfig.ResumeLayout(false);
groupBoxConfig.PerformLayout();
groupBoxColors.ResumeLayout(false);
((System.ComponentModel.ISupportInitialize)numericUpDownSpeed).EndInit();
((System.ComponentModel.ISupportInitialize)numericUpDownWeight).EndInit();
((System.ComponentModel.ISupportInitialize)pictureBoxObject).EndInit();
panelObject.ResumeLayout(false);
ResumeLayout(false);
}
#endregion
private GroupBox groupBoxConfig;
private Label labelWeight;
private Label labelSpeed;
private Label labelModifiedObject;
private Label labelSimpleObject;
private CheckBox checkBoxGlass;
private NumericUpDown numericUpDownSpeed;
private NumericUpDown numericUpDownWeight;
private CheckBox checkBoxGarmoshka;
private GroupBox groupBoxColors;
private Panel panelPurple;
private Panel panelBlack;
private Panel panelGray;
private Panel panelWhite;
private Panel panelYellow;
private Panel panelBlue;
private Panel panelGreen;
private Panel panelRed;
private PictureBox pictureBoxObject;
private Button buttonAdd;
private Button buttonCancel;
private Panel panelObject;
private Label labelAdditionalColor;
private Label labelBaseColor;
}
}

View File

@ -0,0 +1,126 @@
using AccordionBus.Drawnings;
using AccordionBus.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;
using static System.Windows.Forms.VisualStyles.VisualStyleElement.TrackBar;
namespace AccordionBus;
public partial class FormBusConfig : Form
{
private DrawningBus? _bus;
private event Action<DrawningBus>? _busDelegate;
public FormBusConfig()
{
InitializeComponent();
panelRed.MouseDown += Panel_MouseDown;
panelGreen.MouseDown += Panel_MouseDown;
panelBlue.MouseDown += Panel_MouseDown;
panelYellow.MouseDown += Panel_MouseDown;
panelWhite.MouseDown += Panel_MouseDown;
panelGray.MouseDown += Panel_MouseDown;
panelBlack.MouseDown += Panel_MouseDown;
panelPurple.MouseDown += Panel_MouseDown;
buttonCancel.Click += (sender, e) => Close();
}
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;
}
public void AddEvent(Action<DrawningBus> busDelegate)
{
_busDelegate += busDelegate;
}
private void LabelObject_MouseDown(object sender, MouseEventArgs e)
{
(sender as Label)?.DoDragDrop((sender as Label)?.Name, DragDropEffects.Move | DragDropEffects.Copy);
}
private void PanelObject_DragEnter(object sender, DragEventArgs e)
{
e.Effect = e.Data?.GetDataPresent(DataFormats.Text) ?? false ? e.Effect = DragDropEffects.Copy : e.Effect = DragDropEffects.None;
}
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, checkBoxGlass.Checked,
checkBoxGarmoshka.Checked);
break;
}
DrawObject();
}
private void Panel_MouseDown(object? sender, MouseEventArgs e)
{
(sender as Control)?.DoDragDrop((sender as Control)?.BackColor!, DragDropEffects.Move | DragDropEffects.Copy);
}
private void ButtonAdd_Click(object sender, EventArgs e)
{
if (_bus != null) {
_busDelegate?.Invoke(_bus);
Close();
}
}
private void labelBodyColor_DragDrop(object sender, DragEventArgs? e)
{
if (_bus == null) return;
_bus.EntityBus?.SetBody((Color)e.Data.GetData(typeof(Color)));
DrawObject();
}
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 labelAdditionalColor_DragEnter(object sender, DragEventArgs e)
{
if (_bus is DrawningAccordionBus)
{
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.SetAdditional((Color)e.Data.GetData(typeof(Color)));
}
DrawObject();
}
}

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,123 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace AccordionBus.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>
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;
}
/// <summary>
/// Шаг перемещения
/// </summary>
public void MakeStep()
{
if (_state != StrategyStatus.InProgress)
{
return;
}
if (IsTargetDestinaion())
{
_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;
/// <summary>
/// Шаг объекта
/// </summary>
/// <returns></returns>
protected int? GetStep()
{
if (_state != StrategyStatus.InProgress)
{
return null;
}
return _moveableObject?.GetStep;
}
/// <summary>
/// Перемещение к цели
/// </summary>
protected abstract void MoveToTarget();
/// <summary>
/// Достигнута ли цель
/// </summary>
/// <returns></returns>
protected abstract bool IsTargetDestinaion();
/// <summary>
/// Попытка перемещения в требуемом направлении
/// </summary>
/// <param name="movementDirection">Направление</param>
/// <returns>Результат попытки (true - удалось переместиться, false - неудача)</returns>
private bool MoveTo(MovementDirection movementDirection)
{
if (_state != StrategyStatus.InProgress)
{
return false;
}
return _moveableObject?.TryMoveObject(movementDirection) ?? false;
}
}

View File

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

View File

@ -0,0 +1,54 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace AccordionBus.MovementStrategy;
public class MoveToBorder : AbstractStrategy
{
protected override bool IsTargetDestinaion()
{
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.ObjectMiddleHorizontal - FieldWidth;
if (Math.Abs(diffX) > GetStep())
{
if (diffX > 0)
{
MoveLeft();
}
else
{
MoveRight();
}
}
int diffY = objParams.ObjectMiddleVertical - 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 AccordionBus.MovementStrategy;
public class MoveToCenter : AbstractStrategy
{
protected override bool IsTargetDestinaion()
{
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,62 @@
using AccordionBus.Drawnings;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace AccordionBus.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.GetHeight);
}
}
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));
}
/// <summary>
/// Конвертация из MovementDirection в DirectionType
/// </summary>
/// <param name="direction">MovementDirection</param>
/// <returns>DirectionType</returns>
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,12 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace AccordionBus.MovementStrategy;
public enum MovementDirection
{
Up = 1, Down = 2, Left = 3, Right = 4
}

View File

@ -0,0 +1,66 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace AccordionBus.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;
/// <summary>
/// Конструктор
/// </summary>
/// <param name="x">Координата X</param>
/// <param name="y">Координата Y</param>
/// <param name="width">Ширина объекта</param>
/// <param name="height">Высота объекта</param>
public ObjectParameters(int x, int y, int width, int height)
{
_x = x;
_y = y;
_width = width;
_height = height;
}
}

View File

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

View File

@ -1,17 +1,39 @@
namespace AccordionBus
using AccordionBus;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using NLog.Extensions.Logging;
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();
ServiceCollection services = new();
ConfigureServices(services);
using ServiceProvider serviceProvider =
services.BuildServiceProvider();
Application.Run(serviceProvider.GetRequiredService<FormBusCollection>());
}
/// <summary>
/// Êîíôèãóðàöèÿ ñåðâèñà DI
/// </summary>
/// <param name="services"></param>
private static void ConfigureServices(ServiceCollection services)
{
services.AddSingleton<FormBusCollection>()
.AddLogging(option =>
{
// To customize application configuration such as set high DPI settings or default font,
// see https://aka.ms/applicationconfiguration.
ApplicationConfiguration.Initialize();
Application.Run(new Form1());
}
option.SetMinimumLevel(LogLevel.Information);
option.AddNLog("nlog.config");
});
}
}

View File

@ -0,0 +1,63 @@
//------------------------------------------------------------------------------
// <auto-generated>
// Этот код создан программой.
// Исполняемая версия:4.0.30319.42000
//
// Изменения в этом файле могут привести к неправильной работе и будут потеряны в случае
// повторной генерации кода.
// </auto-generated>
//------------------------------------------------------------------------------
namespace AccordionBus.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("AccordionBus.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

@ -18,11 +18,11 @@
<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="Color1" type="System.Dradoor.Color, System.Dradoor">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">
<data name="Icon1" type="System.Dradoor.Icon, System.Dradoor" 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>

View File

@ -0,0 +1,14 @@
<?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>