6 Commits
Lab04 ... Lab07

23 changed files with 1374 additions and 147 deletions

View File

@@ -1,5 +1,6 @@
using ProjectMonorail.CollectionGenericObject; using ProjectMonorail.CollectionGenericObject;
using ProjectMonorail.Drawings; using ProjectMonorail.Drawings;
using ProjectMonorail.Exceptions;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
@@ -41,7 +42,7 @@ public abstract class AbstractCompany
/// <summary> /// <summary>
/// Вычисление максимального количества элементов, которые можно разместить в окне /// Вычисление максимального количества элементов, которые можно разместить в окне
/// </summary> /// </summary>
private int GetMaxCount => _pictureWidth * _pictureHeight / (_placeSizeWidth * _placeSizeHeight); private int GetMaxCount => (_pictureHeight / _placeSizeHeight) * (_pictureWidth / _placeSizeWidth);
/// <summary> /// <summary>
/// Конструктор /// Конструктор
@@ -54,7 +55,7 @@ public abstract class AbstractCompany
_pictureWidth = picWidth; _pictureWidth = picWidth;
_pictureHeight = picHeight; _pictureHeight = picHeight;
_collection = collection; _collection = collection;
_collection.SetMaxCount = GetMaxCount; _collection.MaxCount = GetMaxCount;
} }
/// <summary> /// <summary>
@@ -106,8 +107,12 @@ public abstract class AbstractCompany
SetObjectsPosition(); SetObjectsPosition();
for (int i = 0; i < (_collection?.Count ?? 0); i++) for (int i = 0; i < (_collection?.Count ?? 0); i++)
{ {
DrawingTrain? obj = _collection?.Get(i); try
obj?.DrawTransport(graphics); {
DrawingTrain? obj = _collection?.Get(i);
obj?.DrawTransport(graphics);
}
catch (ObjectNotFoundException) { }
} }
return bitmap; return bitmap;
} }

View File

@@ -1,4 +1,5 @@
using System; using ProjectMonorail.CollectionGenericObjects;
using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
@@ -21,7 +22,7 @@ public interface ICollectionGenericObjects<T>
/// <summary> /// <summary>
/// Установка максимального количества элементов /// Установка максимального количества элементов
/// </summary> /// </summary>
int SetMaxCount { set; } int MaxCount { get; set; }
/// <summary> /// <summary>
/// Добавление объекта в коллекцию /// Добавление объекта в коллекцию
@@ -51,4 +52,15 @@ public interface ICollectionGenericObjects<T>
/// <param name="position">Позиция</param> /// <param name="position">Позиция</param>
/// <returns>Объект</returns> /// <returns>Объект</returns>
T? Get(int position); T? Get(int position);
/// <summary>
/// Получение типа коллекции
/// </summary>
CollectionType GetCollectionType { get; }
/// <summary>
/// Получение объектов коллекции по одному
/// </summary>
/// <returns>Поэлементный вывод элементов коллекции</returns>
IEnumerable<T?> GetItems();
} }

View File

@@ -1,9 +1,5 @@
using ProjectMonorail.CollectionGenericObject; using ProjectMonorail.CollectionGenericObject;
using System; using ProjectMonorail.Exceptions;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ProjectMonorail.CollectionGenericObjects; namespace ProjectMonorail.CollectionGenericObjects;
@@ -26,7 +22,9 @@ public class ListGenericObjects<T> : ICollectionGenericObjects<T>
public int Count => _collection.Count; public int Count => _collection.Count;
public int SetMaxCount { set { if (value > 0) { _maxCount = value; } } } public int MaxCount { get => _maxCount; set { if (value > 0) { _maxCount = value; } } }
public CollectionType GetCollectionType => CollectionType.List;
/// <summary> /// <summary>
/// Конструктор /// Конструктор
@@ -38,30 +36,38 @@ public class ListGenericObjects<T> : ICollectionGenericObjects<T>
public T? Get(int position) public T? Get(int position)
{ {
if (position < 0 || position >= Count) { return null; } if (position < 0 || position >= Count) { throw new PositionOutOfCollectionException(); }
return _collection[position]; return _collection[position];
} }
public int Insert(T obj) public int Insert(T obj)
{ {
if (obj == null || Count + 1 > _maxCount) { return -1; } if (Count + 1 > _maxCount) { throw new CollectionOverflowException(); }
_collection.Add(obj); _collection.Add(obj);
return Count + 1; return Count + 1;
} }
public int Insert(T obj, int position) public int Insert(T obj, int position)
{ {
if (obj == null || Count + 1 > _maxCount) { return -1; } if (Count + 1 > _maxCount) { throw new CollectionOverflowException(); }
if (position < 0 || position >= Count) { return -1; } if (position < 0 || position >= Count) { throw new PositionOutOfCollectionException(); }
_collection.Insert(position, obj); _collection.Insert(position, obj);
return Count + 1; return Count + 1;
} }
public T Remove(int position) public T Remove(int position)
{ {
if (position < 0 || position >= Count) { return null; } if (position < 0 || position >= Count) { throw new PositionOutOfCollectionException(); }
T tmp = _collection[position]; T tmp = _collection[position];
_collection.RemoveAt(position); _collection.RemoveAt(position);
return tmp; return tmp;
} }
public IEnumerable<T?> GetItems()
{
for (int i = 0; i < Count; i++)
{
yield return _collection[i];
}
}
} }

View File

@@ -1,8 +1,5 @@
using System; using ProjectMonorail.CollectionGenericObjects;
using System.Collections.Generic; using ProjectMonorail.Exceptions;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ProjectMonorail.CollectionGenericObject; namespace ProjectMonorail.CollectionGenericObject;
@@ -20,8 +17,12 @@ public class MassiveGenericObjects<T> : ICollectionGenericObjects<T>
public int Count => _collection.Length; public int Count => _collection.Length;
public int SetMaxCount public int MaxCount
{ {
get
{
return _collection.Length;
}
set set
{ {
if (value > 0) if (value > 0)
@@ -37,6 +38,9 @@ public class MassiveGenericObjects<T> : ICollectionGenericObjects<T>
} }
} }
} }
public CollectionType GetCollectionType => CollectionType.Massive;
/// <summary> /// <summary>
/// Конструктор /// Конструктор
/// </summary> /// </summary>
@@ -47,11 +51,9 @@ public class MassiveGenericObjects<T> : ICollectionGenericObjects<T>
public T? Get(int position) public T? Get(int position)
{ {
if (position >= 0 && position < Count) if (position < 0 || position >= Count) { throw new PositionOutOfCollectionException(); }
{ if (_collection[position] == null) { throw new ObjectNotFoundException(); }
return _collection[position]; return _collection[position];
}
return null;
} }
public int Insert(T obj) public int Insert(T obj)
@@ -64,15 +66,12 @@ public class MassiveGenericObjects<T> : ICollectionGenericObjects<T>
return i; return i;
} }
} }
return -1; throw new CollectionOverflowException();
} }
public int Insert(T obj, int position) public int Insert(T obj, int position)
{ {
if (position < 0 || position >= Count) if (position < 0 || position >= Count) { throw new PositionOutOfCollectionException(); }
{
return -1;
}
for (int i = position; i < Count; i++) for (int i = position; i < Count; i++)
{ {
if (_collection[i] == null) if (_collection[i] == null)
@@ -89,17 +88,23 @@ public class MassiveGenericObjects<T> : ICollectionGenericObjects<T>
return i; return i;
} }
} }
return -1; throw new CollectionOverflowException();
} }
public T Remove(int position) public T Remove(int position)
{ {
if (position < 0 || position >= Count) if (position < 0 || position >= Count) { throw new PositionOutOfCollectionException(); }
{ if (_collection == null) { throw new ObjectNotFoundException(); }
return null;
}
T tmp = _collection[position]; T tmp = _collection[position];
_collection[position] = null; _collection[position] = null;
return tmp; return tmp;
} }
public IEnumerable<T?> GetItems()
{
for (int i = 0; i < _collection.Length; i++)
{
yield return _collection[i];
}
}
} }

View File

@@ -1,9 +1,6 @@
using ProjectMonorail.CollectionGenericObject; using ProjectMonorail.CollectionGenericObject;
using System; using ProjectMonorail.Drawings;
using System.Collections.Generic; using ProjectMonorail.Exceptions;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ProjectMonorail.CollectionGenericObjects; namespace ProjectMonorail.CollectionGenericObjects;
@@ -12,7 +9,7 @@ namespace ProjectMonorail.CollectionGenericObjects;
/// </summary> /// </summary>
/// <typeparam name="T"></typeparam> /// <typeparam name="T"></typeparam>
public class StorageCollection<T> public class StorageCollection<T>
where T : class where T : DrawingTrain
{ {
/// <summary> /// <summary>
/// Словарь (хранилище) коллекций /// Словарь (хранилище) коллекций
@@ -24,6 +21,21 @@ public class StorageCollection<T>
/// </summary> /// </summary>
public List<string> Keys => _storages.Keys.ToList(); public List<string> Keys => _storages.Keys.ToList();
/// <summary>
/// Ключевое слово, с которого должен начинаться файл
/// </summary>
private readonly string _collectionKey = "CollectionStorage";
/// <summary>
/// Разделитель для записи ключа и значения элемента словаря
/// </summary>
private readonly string _separatorForKeyValue = "|";
/// <summary>
/// Разделитель для записей коллекции данных в файл
/// </summary>
private readonly string _separatorItems = ";";
/// <summary> /// <summary>
/// Конструктор /// Конструктор
/// </summary> /// </summary>
@@ -76,4 +88,132 @@ public class StorageCollection<T>
return null; return null;
} }
} }
/// <summary>
/// Сохранение информации по поездам в хранилище в файл
/// </summary>
/// <param name="filename">Путь и имя файла</param>
public void SaveData(string filename)
{
if (_storages.Count == 0)
{
throw new ArgumentException("В хранилище отсутствуют коллекции для сохранения");
}
if (File.Exists(filename))
{
File.Delete(filename);
}
using FileStream fs = new(filename, FileMode.Create);
using StreamWriter streamWriter = new StreamWriter(fs);
streamWriter.Write(_collectionKey);
foreach (KeyValuePair<string, ICollectionGenericObjects<T>> value in _storages)
{
streamWriter.Write(Environment.NewLine);
//Не сохраняем пустые коллекции
if (value.Value.Count == 0)
{
continue;
}
streamWriter.Write(value.Key);
streamWriter.Write(_separatorForKeyValue);
streamWriter.Write(value.Value.GetCollectionType);
streamWriter.Write(_separatorForKeyValue);
streamWriter.Write(value.Value.MaxCount);
streamWriter.Write(_separatorForKeyValue);
foreach (T? item in value.Value.GetItems())
{
string data = item?.GetDataForSave() ?? string.Empty;
if (string.IsNullOrEmpty(data))
{
continue;
}
streamWriter.Write(data);
streamWriter.Write(_separatorItems);
}
}
}
/// <summary>
/// Загрузка информации по автомобилям в хранилище из файла
/// </summary>
/// <param name="filename">Путь и имя файла</param>
public void LoadData(string filename)
{
if (!File.Exists(filename))
{
throw new FileNotFoundException("Данный файл не существует");
}
using FileStream fs = new(filename, FileMode.Open);
using StreamReader streamReader = new StreamReader(fs);
string firstString = streamReader.ReadLine();
if (firstString != _collectionKey || firstString.Length == 0)
{
throw new ArgumentException("В файле нет данных");
}
if (!firstString.Equals(_collectionKey))
{
throw new InvalidDataException("В файле неверные данные");
}
_storages.Clear();
while (!streamReader.EndOfStream)
{
string[] record = streamReader.ReadLine().Split(_separatorForKeyValue, StringSplitOptions.RemoveEmptyEntries);
CollectionType collectionType = (CollectionType)Enum.Parse(typeof(CollectionType), record[1]);
if (record.Length != 4)
{
continue;
}
ICollectionGenericObjects<T>? collection = StorageCollection<T>.CreateCollection(collectionType);
if (collection == null)
{
throw new InvalidCastException("Не удалось создать коллекцию");
}
collection.MaxCount = Convert.ToInt32(record[2]);
string[] set = record[3].Split(_separatorItems, StringSplitOptions.RemoveEmptyEntries);
foreach (string elem in set)
{
if (elem?.CreateDrawingTrain() is T train)
{
try
{
if (collection.Insert(train) == -1)
{
throw new InvalidOperationException("Объект не удалось добавить в коллекцию: " + record[3]);
}
}
catch (CollectionOverflowException ex)
{
throw new CollectionOverflowException("Коллекция переполнена", 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

@@ -1,5 +1,6 @@
using ProjectMonorail.CollectionGenericObject; using ProjectMonorail.CollectionGenericObject;
using ProjectMonorail.Drawings; using ProjectMonorail.Drawings;
using ProjectMonorail.Exceptions;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
@@ -45,9 +46,14 @@ public class TrainSharingService : AbstractCompany
{ {
for (int x = 10; x + _placeSizeWidth < _pictureWidth; x += _placeSizeWidth) for (int x = 10; x + _placeSizeWidth < _pictureWidth; x += _placeSizeWidth)
{ {
_collection?.Get(counter)?.SetPictureSize(_pictureWidth, _pictureHeight); try
_collection?.Get(counter)?.SetPosition(x, y); {
counter++; _collection?.Get(counter)?.SetPictureSize(_pictureWidth, _pictureHeight);
_collection?.Get(counter)?.SetPosition(x, y);
counter++;
}
catch (ObjectNotFoundException) { }
catch (PositionOutOfCollectionException) { }
} }
} }
} }

View File

@@ -28,6 +28,13 @@ public class DrawingMonorail : DrawingTrain
EntityTrain = new EntityMonorail(speed, (int)weight, wheels, mainColor, additionalColor, rail, secondCarriage); EntityTrain = new EntityMonorail(speed, (int)weight, wheels, mainColor, additionalColor, rail, secondCarriage);
} }
public DrawingMonorail(EntityTrain? entityTrain)
{
if (entityTrain != null)
{
EntityTrain = entityTrain;
}
}
/// <summary> /// <summary>
/// Прорисовка объекта /// Прорисовка объекта

View File

@@ -70,7 +70,7 @@ public class DrawingTrain
/// <summary> /// <summary>
/// Пустой конструктор /// Пустой конструктор
/// </summary> /// </summary>
private DrawingTrain() public DrawingTrain()
{ {
_pictureHeight = null; _pictureHeight = null;
_pictureWidth = null; _pictureWidth = null;
@@ -89,6 +89,14 @@ public class DrawingTrain
EntityTrain = new EntityTrain(speed, weight, mainColor); EntityTrain = new EntityTrain(speed, weight, mainColor);
} }
public DrawingTrain(EntityTrain? entityTrain)
{
if (entityTrain != null)
{
EntityTrain = entityTrain;
}
}
/// <summary> /// <summary>
/// Конструктор для наследников /// Конструктор для наследников
/// </summary> /// </summary>

View File

@@ -0,0 +1,56 @@
using ProjectMonorail.Entities;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ProjectMonorail.Drawings;
/// <summary>
/// Расширение для класса EntityCar
/// </summary>
public static class ExtentionDrawingTrain
{
/// <summary>
/// Разделитель для записи информации по объекту в файл
/// </summary>
private static readonly string _separatorForObject = ":";
/// <summary>
/// Создание объекта из строки
/// </summary>
/// <param name="info">Строка с данными для создания объекта</param>
/// <returns>Объект</returns>
public static DrawingTrain? CreateDrawingTrain(this string info)
{
string[] strs = info.Split(_separatorForObject);
EntityTrain? train = EntityMonorail.CreateEntityMonorail(strs);
if (train != null)
{
return new DrawingMonorail(train);
}
train = EntityTrain.CreateEntityTrain(strs);
if (train != null)
{
return new DrawingTrain(train);
}
return null;
}
/// <summary>
/// Получение данных для сохранения в файл
/// </summary>
/// <param name="drawingTrain">Сохраняемый объект</param>
/// <returns>Строка с данными по объекту</returns>
public static string GetDataForSave(this DrawingTrain drawingTrain)
{
string[]? array = drawingTrain?.EntityTrain?.GetStringRepresentation();
if (array == null)
{
return string.Empty;
}
return string.Join(_separatorForObject, array);
}
}

View File

@@ -31,6 +31,15 @@ public class EntityMonorail : EntityTrain
/// </summary> /// </summary>
public bool SecondСarriage { get; private set; } public bool SecondСarriage { get; private set; }
/// <summary>
/// Метод для задания дополнительного цвета
/// </summary>
/// <param name="color"></param>
public void SetAdditionalColor(Color color)
{
AdditionalColor = color;
}
/// <summary> /// <summary>
/// Конструктор /// Конструктор
/// </summary> /// </summary>
@@ -38,11 +47,37 @@ public class EntityMonorail : EntityTrain
/// <param name="additionalColor">Дополнительный цвет</param> /// <param name="additionalColor">Дополнительный цвет</param>
/// <param name="rail">Признак наличия магнитного рельса</param> /// <param name="rail">Признак наличия магнитного рельса</param>
/// <param name="secondCarriage">Признак наличия второго вагона</param> /// <param name="secondCarriage">Признак наличия второго вагона</param>
public EntityMonorail(int speed, int weight, int wheels, Color mainColor, Color additionalColor, bool rail, bool secondCarriage) : base(speed, weight, mainColor) public EntityMonorail(int speed, double weight, int wheels, Color mainColor, Color additionalColor, bool rail, bool secondCarriage) : base(speed, weight, mainColor)
{ {
Wheels = wheels; Wheels = wheels;
AdditionalColor = additionalColor; AdditionalColor = additionalColor;
Rail = rail; Rail = rail;
SecondСarriage = secondCarriage; SecondСarriage = secondCarriage;
} }
/// <summary>
/// Получние строк со значениями свойств объекта класса-сущности
/// </summary>
/// <returns></returns>
public override string[] GetStringRepresentation()
{
return new[] { nameof(EntityMonorail), Speed.ToString(), Weight.ToString(), Wheels.ToString(),
MainColor.Name, AdditionalColor.Name, Rail.ToString(), SecondСarriage.ToString() };
}
/// <summary>
/// Создание объекта из массива строк
/// </summary>
/// <param name="strs"></param>
/// <returns></returns>
public static EntityMonorail? CreateEntityMonorail(string[] strs)
{
if (strs.Length != 8 || strs[0] != nameof(EntityMonorail))
{
return null;
}
return new EntityMonorail(Convert.ToInt32(strs[1]), Convert.ToDouble(strs[2]), Convert.ToInt32(strs[3]),
Color.FromName(strs[4]), Color.FromName(strs[5]), Convert.ToBoolean(strs[6]), Convert.ToBoolean(strs[7]));
}
} }

View File

@@ -31,6 +31,15 @@ public class EntityTrain
/// </summary> /// </summary>
public double Step => Speed * 100 / Weight; public double Step => Speed * 100 / Weight;
/// <summary>
/// Метод для задания основного цвета
/// </summary>
/// <param name="color"></param>
public void SetMainColor (Color color)
{
MainColor = color;
}
/// <summary> /// <summary>
/// Конструктор сущности /// Конструктор сущности
/// </summary> /// </summary>
@@ -43,4 +52,28 @@ public class EntityTrain
Weight = weight; Weight = weight;
MainColor = mainColor; MainColor = mainColor;
} }
/// <summary>
/// Получение строк со значениями свойств объекта класса-сущности
/// </summary>
/// <returns></returns>
public virtual string[] GetStringRepresentation()
{
return new[] { nameof(EntityTrain), Speed.ToString(), Weight.ToString(), MainColor.Name };
}
/// <summary>
/// Создание объекта из массива строк
/// </summary>
/// <param name="strs"></param>
/// <returns></returns>
public static EntityTrain? CreateEntityTrain(string[] strs)
{
if (strs.Length != 4 || strs[0] != nameof(EntityTrain))
{
return null;
}
return new EntityTrain(Convert.ToInt32(strs[1]), Convert.ToDouble(strs[2]), Color.FromName(strs[3]));
}
} }

View File

@@ -0,0 +1,25 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.Text;
using System.Threading.Tasks;
namespace ProjectMonorail.Exceptions;
/// <summary>
/// Класс, описывающий ошибку переполнения коллекции
/// </summary>
[Serializable]
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 context) : base(info, context) { }
}

View File

@@ -0,0 +1,25 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.Text;
using System.Threading.Tasks;
namespace ProjectMonorail.Exceptions;
/// <summary>
/// Класс, описывающий ошибку, что по указанной позиции нет элемента
/// </summary>
[Serializable]
internal class ObjectNotFoundException : ApplicationException
{
public ObjectNotFoundException(int i) : base("Не найден объект по позиции " + i) { }
public ObjectNotFoundException() : base() { }
public ObjectNotFoundException(string message) : base(message) { }
public ObjectNotFoundException(string message, Exception exception) : base(message, exception) { }
protected ObjectNotFoundException(SerializationInfo info, StreamingContext context) : base(info, context) { }
}

View File

@@ -0,0 +1,25 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.Text;
using System.Threading.Tasks;
namespace ProjectMonorail.Exceptions;
/// <summary>
/// Класс, описывающий ошибку выхода за границы коллекции
/// </summary>
[Serializable]
internal class PositionOutOfCollectionException : ApplicationException
{
public PositionOutOfCollectionException(int i) : base("Выход за границы коллекции. Позиция " + i) { }
public PositionOutOfCollectionException() : base() { }
public PositionOutOfCollectionException(string message) : base(message) { }
public PositionOutOfCollectionException(string message, Exception exception) : base(message, exception) { }
protected PositionOutOfCollectionException(SerializationInfo info, StreamingContext context) : base(info, context) { }
}

View File

@@ -34,7 +34,6 @@
buttonGoToCheck = new Button(); buttonGoToCheck = new Button();
buttonRemoveTrain = new Button(); buttonRemoveTrain = new Button();
maskedTextBoxPosition = new MaskedTextBox(); maskedTextBoxPosition = new MaskedTextBox();
buttonAddMonorail = new Button();
buttonAddTrain = new Button(); buttonAddTrain = new Button();
buttonCreateCompany = new Button(); buttonCreateCompany = new Button();
panelStorage = new Panel(); panelStorage = new Panel();
@@ -47,10 +46,17 @@
label1 = new Label(); label1 = new Label();
comboBoxSelectorCompany = new ComboBox(); comboBoxSelectorCompany = new ComboBox();
pictureBox = new PictureBox(); pictureBox = new PictureBox();
menuStrip = new MenuStrip();
файлToolStripMenuItem = new ToolStripMenuItem();
saveToolStripMenuItem = new ToolStripMenuItem();
loadToolStripMenuItem = new ToolStripMenuItem();
saveFileDialog = new SaveFileDialog();
openFileDialog = new OpenFileDialog();
groupBoxTools.SuspendLayout(); groupBoxTools.SuspendLayout();
panelCompanyTools.SuspendLayout(); panelCompanyTools.SuspendLayout();
panelStorage.SuspendLayout(); panelStorage.SuspendLayout();
((System.ComponentModel.ISupportInitialize)pictureBox).BeginInit(); ((System.ComponentModel.ISupportInitialize)pictureBox).BeginInit();
menuStrip.SuspendLayout();
SuspendLayout(); SuspendLayout();
// //
// groupBoxTools // groupBoxTools
@@ -60,11 +66,11 @@
groupBoxTools.Controls.Add(panelStorage); groupBoxTools.Controls.Add(panelStorage);
groupBoxTools.Controls.Add(comboBoxSelectorCompany); groupBoxTools.Controls.Add(comboBoxSelectorCompany);
groupBoxTools.Dock = DockStyle.Right; groupBoxTools.Dock = DockStyle.Right;
groupBoxTools.Location = new Point(1006, 0); groupBoxTools.Location = new Point(1006, 24);
groupBoxTools.Margin = new Padding(3, 2, 3, 2); groupBoxTools.Margin = new Padding(3, 2, 3, 2);
groupBoxTools.Name = "groupBoxTools"; groupBoxTools.Name = "groupBoxTools";
groupBoxTools.Padding = new Padding(3, 2, 3, 2); groupBoxTools.Padding = new Padding(3, 2, 3, 2);
groupBoxTools.Size = new Size(200, 616); groupBoxTools.Size = new Size(200, 592);
groupBoxTools.TabIndex = 0; groupBoxTools.TabIndex = 0;
groupBoxTools.TabStop = false; groupBoxTools.TabStop = false;
groupBoxTools.Text = "Инструменты"; groupBoxTools.Text = "Инструменты";
@@ -75,19 +81,18 @@
panelCompanyTools.Controls.Add(buttonGoToCheck); panelCompanyTools.Controls.Add(buttonGoToCheck);
panelCompanyTools.Controls.Add(buttonRemoveTrain); panelCompanyTools.Controls.Add(buttonRemoveTrain);
panelCompanyTools.Controls.Add(maskedTextBoxPosition); panelCompanyTools.Controls.Add(maskedTextBoxPosition);
panelCompanyTools.Controls.Add(buttonAddMonorail);
panelCompanyTools.Controls.Add(buttonAddTrain); panelCompanyTools.Controls.Add(buttonAddTrain);
panelCompanyTools.Dock = DockStyle.Bottom; panelCompanyTools.Dock = DockStyle.Bottom;
panelCompanyTools.Enabled = false; panelCompanyTools.Enabled = false;
panelCompanyTools.Location = new Point(3, 383); panelCompanyTools.Location = new Point(3, 383);
panelCompanyTools.Name = "panelCompanyTools"; panelCompanyTools.Name = "panelCompanyTools";
panelCompanyTools.Size = new Size(194, 231); panelCompanyTools.Size = new Size(194, 207);
panelCompanyTools.TabIndex = 8; panelCompanyTools.TabIndex = 8;
// //
// buttonRefresh // buttonRefresh
// //
buttonRefresh.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right; buttonRefresh.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right;
buttonRefresh.Location = new Point(5, 188); buttonRefresh.Location = new Point(3, 153);
buttonRefresh.Margin = new Padding(3, 2, 3, 2); buttonRefresh.Margin = new Padding(3, 2, 3, 2);
buttonRefresh.Name = "buttonRefresh"; buttonRefresh.Name = "buttonRefresh";
buttonRefresh.Size = new Size(185, 34); buttonRefresh.Size = new Size(185, 34);
@@ -99,7 +104,7 @@
// buttonGoToCheck // buttonGoToCheck
// //
buttonGoToCheck.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right; buttonGoToCheck.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right;
buttonGoToCheck.Location = new Point(5, 150); buttonGoToCheck.Location = new Point(3, 115);
buttonGoToCheck.Margin = new Padding(3, 2, 3, 2); buttonGoToCheck.Margin = new Padding(3, 2, 3, 2);
buttonGoToCheck.Name = "buttonGoToCheck"; buttonGoToCheck.Name = "buttonGoToCheck";
buttonGoToCheck.Size = new Size(185, 34); buttonGoToCheck.Size = new Size(185, 34);
@@ -111,7 +116,7 @@
// buttonRemoveTrain // buttonRemoveTrain
// //
buttonRemoveTrain.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right; buttonRemoveTrain.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right;
buttonRemoveTrain.Location = new Point(5, 112); buttonRemoveTrain.Location = new Point(3, 77);
buttonRemoveTrain.Margin = new Padding(3, 2, 3, 2); buttonRemoveTrain.Margin = new Padding(3, 2, 3, 2);
buttonRemoveTrain.Name = "buttonRemoveTrain"; buttonRemoveTrain.Name = "buttonRemoveTrain";
buttonRemoveTrain.Size = new Size(185, 34); buttonRemoveTrain.Size = new Size(185, 34);
@@ -122,7 +127,7 @@
// //
// maskedTextBoxPosition // maskedTextBoxPosition
// //
maskedTextBoxPosition.Location = new Point(5, 85); maskedTextBoxPosition.Location = new Point(5, 50);
maskedTextBoxPosition.Margin = new Padding(3, 2, 3, 2); maskedTextBoxPosition.Margin = new Padding(3, 2, 3, 2);
maskedTextBoxPosition.Mask = "00"; maskedTextBoxPosition.Mask = "00";
maskedTextBoxPosition.Name = "maskedTextBoxPosition"; maskedTextBoxPosition.Name = "maskedTextBoxPosition";
@@ -130,22 +135,10 @@
maskedTextBoxPosition.TabIndex = 9; maskedTextBoxPosition.TabIndex = 9;
maskedTextBoxPosition.ValidatingType = typeof(int); maskedTextBoxPosition.ValidatingType = typeof(int);
// //
// buttonAddMonorail
//
buttonAddMonorail.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right;
buttonAddMonorail.Location = new Point(5, 47);
buttonAddMonorail.Margin = new Padding(3, 2, 3, 2);
buttonAddMonorail.Name = "buttonAddMonorail";
buttonAddMonorail.Size = new Size(185, 34);
buttonAddMonorail.TabIndex = 8;
buttonAddMonorail.Text = "Добавление монорельса";
buttonAddMonorail.UseVisualStyleBackColor = true;
buttonAddMonorail.Click += ButtonAddMonorail_Click;
//
// buttonAddTrain // buttonAddTrain
// //
buttonAddTrain.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right; buttonAddTrain.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right;
buttonAddTrain.Location = new Point(5, 9); buttonAddTrain.Location = new Point(5, 12);
buttonAddTrain.Margin = new Padding(3, 2, 3, 2); buttonAddTrain.Margin = new Padding(3, 2, 3, 2);
buttonAddTrain.Name = "buttonAddTrain"; buttonAddTrain.Name = "buttonAddTrain";
buttonAddTrain.Size = new Size(185, 34); buttonAddTrain.Size = new Size(185, 34);
@@ -264,13 +257,54 @@
// pictureBox // pictureBox
// //
pictureBox.Dock = DockStyle.Fill; pictureBox.Dock = DockStyle.Fill;
pictureBox.Location = new Point(0, 0); pictureBox.Location = new Point(0, 24);
pictureBox.Margin = new Padding(3, 2, 3, 2); pictureBox.Margin = new Padding(3, 2, 3, 2);
pictureBox.Name = "pictureBox"; pictureBox.Name = "pictureBox";
pictureBox.Size = new Size(1006, 616); pictureBox.Size = new Size(1006, 592);
pictureBox.TabIndex = 1; pictureBox.TabIndex = 1;
pictureBox.TabStop = false; pictureBox.TabStop = false;
// //
// menuStrip
//
menuStrip.Items.AddRange(new ToolStripItem[] { файлToolStripMenuItem });
menuStrip.Location = new Point(0, 0);
menuStrip.Name = "menuStrip";
menuStrip.Size = new Size(1206, 24);
menuStrip.TabIndex = 2;
menuStrip.Text = "menuStrip";
//
// файлToolStripMenuItem
//
файлToolStripMenuItem.DropDownItems.AddRange(new ToolStripItem[] { saveToolStripMenuItem, loadToolStripMenuItem });
файлToolStripMenuItem.Name = айлToolStripMenuItem";
файлToolStripMenuItem.Size = new Size(48, 20);
файлToolStripMenuItem.Text = "Файл";
//
// saveToolStripMenuItem
//
saveToolStripMenuItem.Name = "saveToolStripMenuItem";
saveToolStripMenuItem.ShortcutKeys = Keys.Control | Keys.S;
saveToolStripMenuItem.Size = new Size(181, 22);
saveToolStripMenuItem.Text = "Сохранение";
saveToolStripMenuItem.Click += SaveToolStripMenuItem_Click;
//
// loadToolStripMenuItem
//
loadToolStripMenuItem.Name = "loadToolStripMenuItem";
loadToolStripMenuItem.ShortcutKeys = Keys.Control | Keys.L;
loadToolStripMenuItem.Size = new Size(181, 22);
loadToolStripMenuItem.Text = "Загрузка";
loadToolStripMenuItem.Click += LoadToolStripMenuItem_Click;
//
// saveFileDialog
//
saveFileDialog.Filter = "txt file | *.txt";
//
// openFileDialog
//
openFileDialog.FileName = "openFileDialog1";
openFileDialog.Filter = "txt file | *.txt";
//
// FormTrainCollection // FormTrainCollection
// //
AutoScaleDimensions = new SizeF(7F, 15F); AutoScaleDimensions = new SizeF(7F, 15F);
@@ -278,6 +312,8 @@
ClientSize = new Size(1206, 616); ClientSize = new Size(1206, 616);
Controls.Add(pictureBox); Controls.Add(pictureBox);
Controls.Add(groupBoxTools); Controls.Add(groupBoxTools);
Controls.Add(menuStrip);
MainMenuStrip = menuStrip;
Margin = new Padding(3, 2, 3, 2); Margin = new Padding(3, 2, 3, 2);
Name = "FormTrainCollection"; Name = "FormTrainCollection";
Text = "Коллекция поездов"; Text = "Коллекция поездов";
@@ -287,7 +323,10 @@
panelStorage.ResumeLayout(false); panelStorage.ResumeLayout(false);
panelStorage.PerformLayout(); panelStorage.PerformLayout();
((System.ComponentModel.ISupportInitialize)pictureBox).EndInit(); ((System.ComponentModel.ISupportInitialize)pictureBox).EndInit();
menuStrip.ResumeLayout(false);
menuStrip.PerformLayout();
ResumeLayout(false); ResumeLayout(false);
PerformLayout();
} }
#endregion #endregion
@@ -309,7 +348,12 @@
private Button buttonGoToCheck; private Button buttonGoToCheck;
private Button buttonRemoveTrain; private Button buttonRemoveTrain;
private MaskedTextBox maskedTextBoxPosition; private MaskedTextBox maskedTextBoxPosition;
private Button buttonAddMonorail;
private Button buttonAddTrain; private Button buttonAddTrain;
private MenuStrip menuStrip;
private ToolStripMenuItem файлToolStripMenuItem;
private ToolStripMenuItem saveToolStripMenuItem;
private ToolStripMenuItem loadToolStripMenuItem;
private SaveFileDialog saveFileDialog;
private OpenFileDialog openFileDialog;
} }
} }

View File

@@ -1,14 +1,7 @@
using ProjectMonorail.CollectionGenericObject; using Microsoft.Extensions.Logging;
using ProjectMonorail.CollectionGenericObjects; using ProjectMonorail.CollectionGenericObjects;
using ProjectMonorail.Drawings; using ProjectMonorail.Drawings;
using System; using ProjectMonorail.Exceptions;
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 System.Windows.Forms;
namespace ProjectMonorail; namespace ProjectMonorail;
@@ -28,13 +21,19 @@ public partial class FormTrainCollection : Form
/// </summary> /// </summary>
private AbstractCompany? _company = null; private AbstractCompany? _company = null;
/// <summary>
/// Логер
/// </summary>
private readonly ILogger _logger;
/// <summary> /// <summary>
/// Конструктор /// Конструктор
/// </summary> /// </summary>
public FormTrainCollection() public FormTrainCollection(ILogger<FormTrainCollection> logger)
{ {
InitializeComponent(); InitializeComponent();
_storageCollection = new(); _storageCollection = new();
_logger = logger;
} }
/// <summary> /// <summary>
@@ -52,67 +51,38 @@ public partial class FormTrainCollection : Form
/// </summary> /// </summary>
/// <param name="sender"></param> /// <param name="sender"></param>
/// <param name="e"></param> /// <param name="e"></param>
private void ButtonAddTrain_Click(object sender, EventArgs e) => CreateObject(nameof(DrawingTrain)); private void ButtonAddTrain_Click(object sender, EventArgs e)
/// <summary>
/// Добавление монорельса
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void ButtonAddMonorail_Click(object sender, EventArgs e) => CreateObject(nameof(DrawingMonorail));
/// <summary>
/// Создание объекта класа - перемещение
/// </summary>
/// <param name="type"></param>
private void CreateObject(string type)
{ {
if (_company == null) FormTrainConfig form = new();
form.AddEvent(SetTrain);
form.Show();
}
/// <summary>
/// Добавление поезда в коллекцию
/// </summary>
/// <param name="train"></param>
private void SetTrain(DrawingTrain train)
{
if (_company == null || train == null)
{ {
return; return;
} }
Random random = new(); try
DrawingTrain drawingTrain;
switch (type)
{
case nameof(DrawingTrain):
drawingTrain = new DrawingTrain(random.Next(100, 300), random.Next(1000, 3000), GetColor(random));
break;
case nameof(DrawingMonorail):
drawingTrain = new DrawingMonorail(random.Next(100, 300), random.Next(1000, 3000), random.Next(2, 5),
GetColor(random), GetColor(random), Convert.ToBoolean(random.Next(0, 2)), Convert.ToBoolean(random.Next(0, 2)));
break;
default: return;
}
if (_company + drawingTrain != -1)
{ {
var set = _company + train;
MessageBox.Show("Объект добавлен"); MessageBox.Show("Объект добавлен");
_logger.LogInformation($"Добавлен объект: {train.GetDataForSave()}");
pictureBox.Image = _company.Show(); pictureBox.Image = _company.Show();
} }
else catch (CollectionOverflowException ex)
{ {
MessageBox.Show("Не удалось добавить объект"); MessageBox.Show("Коллекция переполнена");
_logger.LogWarning($"Не удалось добавить объект в коллекцию: {ex.Message}");
} }
} }
/// <summary>
/// Получение цвета
/// </summary>
/// <param name="random">Генератор случайных чисел</param>
/// <returns></returns>
private static Color GetColor(Random random)
{
Color color = Color.FromArgb(random.Next(0, 256), random.Next(0, 256), random.Next(0, 256));
ColorDialog dialog = new();
if (dialog.ShowDialog() == DialogResult.OK)
{
color = dialog.Color;
}
return color;
}
/// <summary> /// <summary>
/// Удаление объекта /// Удаление объекта
/// </summary> /// </summary>
@@ -122,6 +92,7 @@ public partial class FormTrainCollection : Form
{ {
if (string.IsNullOrEmpty(maskedTextBoxPosition.Text) || _company == null) if (string.IsNullOrEmpty(maskedTextBoxPosition.Text) || _company == null)
{ {
_logger.LogWarning("Удаление объекта из несуществующей коллекции");
return; return;
} }
@@ -130,15 +101,30 @@ public partial class FormTrainCollection : Form
return; return;
} }
int pos = Convert.ToInt32(maskedTextBoxPosition.Text); try
if (_company - pos != null)
{ {
MessageBox.Show("Объект удален"); int pos = Convert.ToInt32(maskedTextBoxPosition.Text);
pictureBox.Image = _company.Show(); if (_company - pos != null)
{
MessageBox.Show("Объект удален");
pictureBox.Image = _company.Show();
_logger.LogInformation("Удаление объекта по индексу {pos}", pos);
}
else
{
MessageBox.Show("Не удалось удалить объект");
_logger.LogWarning("Не удалось удалить объект из коллекции по индексу {pos}", pos);
}
} }
else catch (ObjectNotFoundException ex)
{ {
MessageBox.Show("Не удалось удалить объект"); MessageBox.Show("Ошибка: отсутствует объект");
_logger.LogError("Ошибка: {Message}", ex.Message);
}
catch (PositionOutOfCollectionException ex)
{
MessageBox.Show("Ошибка: неправильная позиция");
_logger.LogError("Ошибка: {Message}", ex.Message);
} }
} }
@@ -158,11 +144,17 @@ public partial class FormTrainCollection : Form
int counter = 100; int counter = 100;
while (train == null) while (train == null)
{ {
train = _company.GetRandomObject(); try
counter--;
if (counter <= 0)
{ {
break; train = _company.GetRandomObject();
}
catch (ObjectNotFoundException)
{
counter--;
if (counter <= 0)
{
break;
}
} }
} }
@@ -203,6 +195,7 @@ public partial class FormTrainCollection : Form
if (string.IsNullOrEmpty(textBoxCollectionName.Text) || (!radioButtonList.Checked && !radioButtonMassive.Checked)) if (string.IsNullOrEmpty(textBoxCollectionName.Text) || (!radioButtonList.Checked && !radioButtonMassive.Checked))
{ {
MessageBox.Show("Не все данные заполнены", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); MessageBox.Show("Не все данные заполнены", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
_logger.LogWarning("Создание компании без данных");
return; return;
} }
@@ -217,6 +210,7 @@ public partial class FormTrainCollection : Form
} }
_storageCollection.AddCollection(textBoxCollectionName.Text, collectionType); _storageCollection.AddCollection(textBoxCollectionName.Text, collectionType);
_logger.LogInformation($"Добавлена коллекция {textBoxCollectionName.Text}");
RefreshListBoxItems(); RefreshListBoxItems();
} }
@@ -230,13 +224,16 @@ public partial class FormTrainCollection : Form
if (listBoxCollection.SelectedIndex < 0 || listBoxCollection.SelectedItem == null) if (listBoxCollection.SelectedIndex < 0 || listBoxCollection.SelectedItem == null)
{ {
MessageBox.Show("Коллекция не выбрана"); MessageBox.Show("Коллекция не выбрана");
_logger.LogWarning("Удаление компании, не выбрав коллекцию");
return; return;
} }
string name = listBoxCollection.SelectedItem.ToString() ?? string.Empty;
if (MessageBox.Show("Удалить коллекцию?", "Удаление", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No) if (MessageBox.Show("Удалить коллекцию?", "Удаление", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No)
{ {
return; return;
} }
_storageCollection.DelCollection(listBoxCollection.SelectedItem.ToString()); _storageCollection.DelCollection(listBoxCollection.SelectedItem.ToString());
_logger.LogInformation($"Удалена коллекция {name}");
RefreshListBoxItems(); RefreshListBoxItems();
} }
@@ -266,13 +263,15 @@ public partial class FormTrainCollection : Form
if (listBoxCollection.SelectedIndex < 0 || listBoxCollection.SelectedItem == null) if (listBoxCollection.SelectedIndex < 0 || listBoxCollection.SelectedItem == null)
{ {
MessageBox.Show("Коллекция не выбрана"); MessageBox.Show("Коллекция не выбрана");
_logger.LogWarning("Создание компании, не выбрав коллекцию");
return; return;
} }
ICollectionGenericObjects<DrawingTrain>? collection = _storageCollection[listBoxCollection.SelectedItem.ToString() ?? string.Empty]; CollectionGenericObject.ICollectionGenericObjects<DrawingTrain>? collection = _storageCollection[listBoxCollection.SelectedItem.ToString() ?? string.Empty];
if (collection == null) if (collection == null)
{ {
MessageBox.Show("Коллекция не проинициализирована"); MessageBox.Show("Коллекция не проинициализирована");
_logger.LogWarning("Не далось иницализировать коллекцию");
return; return;
} }
@@ -280,10 +279,58 @@ public partial class FormTrainCollection : Form
{ {
case "Хранилище": case "Хранилище":
_company = new TrainSharingService(pictureBox.Width, pictureBox.Height, collection); _company = new TrainSharingService(pictureBox.Width, pictureBox.Height, collection);
_logger.LogInformation("Компания создана");
break; break;
} }
panelCompanyTools.Enabled = true; panelCompanyTools.Enabled = true;
RefreshListBoxItems(); RefreshListBoxItems();
} }
/// <summary>
/// Обработка нажатия "Сохранение"
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
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);
}
}
}
/// <summary>
/// Обработка нажатия "Загрузка"
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void LoadToolStripMenuItem_Click(object sender, EventArgs e)
{
if (openFileDialog.ShowDialog() == DialogResult.OK)
{
try
{
_storageCollection.LoadData(openFileDialog.FileName);
MessageBox.Show("Загрузка прошла успешно", "Результат", MessageBoxButtons.OK, MessageBoxIcon.Information);
_logger.LogInformation("Загрузка из файла: {filename}", saveFileDialog.FileName);
RefreshListBoxItems();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Результат", MessageBoxButtons.OK, MessageBoxIcon.Error);
_logger.LogError("Ошибка: {Message}", ex.Message);
}
}
}
} }

View File

@@ -117,4 +117,16 @@
<resheader name="writer"> <resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader> </resheader>
<metadata name="menuStrip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>17, 17</value>
</metadata>
<metadata name="saveFileDialog.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>126, 17</value>
</metadata>
<metadata name="openFileDialog.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>261, 17</value>
</metadata>
<metadata name="$this.TrayHeight" type="System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>44</value>
</metadata>
</root> </root>

View File

@@ -0,0 +1,384 @@
namespace ProjectMonorail
{
partial class FormTrainConfig
{
/// <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();
panelYellow = new Panel();
panelBlack = new Panel();
panelBlue = new Panel();
panelGray = new Panel();
panelGreen = new Panel();
panelWhite = new Panel();
panelRed = new Panel();
numericUpDownWheels = new NumericUpDown();
labelWheels = new Label();
checkBoxSecondСarriage = new CheckBox();
checkBoxRail = new CheckBox();
numericUpDownWeight = new NumericUpDown();
labelWeight = new Label();
numericUpDownSpeed = new NumericUpDown();
labelSpeed = new Label();
labelModifiedObject = new Label();
labelSimpleObject = new Label();
pictureBoxObject = new PictureBox();
buttonAdd = new Button();
buttonCancel = new Button();
panelObject = new Panel();
labelAdditionalColor = new Label();
labelMainColor = new Label();
groupBoxConfig.SuspendLayout();
groupBoxColors.SuspendLayout();
((System.ComponentModel.ISupportInitialize)numericUpDownWheels).BeginInit();
((System.ComponentModel.ISupportInitialize)numericUpDownWeight).BeginInit();
((System.ComponentModel.ISupportInitialize)numericUpDownSpeed).BeginInit();
((System.ComponentModel.ISupportInitialize)pictureBoxObject).BeginInit();
panelObject.SuspendLayout();
SuspendLayout();
//
// groupBoxConfig
//
groupBoxConfig.Controls.Add(groupBoxColors);
groupBoxConfig.Controls.Add(numericUpDownWheels);
groupBoxConfig.Controls.Add(labelWheels);
groupBoxConfig.Controls.Add(checkBoxSecondСarriage);
groupBoxConfig.Controls.Add(checkBoxRail);
groupBoxConfig.Controls.Add(numericUpDownWeight);
groupBoxConfig.Controls.Add(labelWeight);
groupBoxConfig.Controls.Add(numericUpDownSpeed);
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(599, 272);
groupBoxConfig.TabIndex = 0;
groupBoxConfig.TabStop = false;
groupBoxConfig.Text = "Параметры";
//
// groupBoxColors
//
groupBoxColors.Controls.Add(panelPurple);
groupBoxColors.Controls.Add(panelYellow);
groupBoxColors.Controls.Add(panelBlack);
groupBoxColors.Controls.Add(panelBlue);
groupBoxColors.Controls.Add(panelGray);
groupBoxColors.Controls.Add(panelGreen);
groupBoxColors.Controls.Add(panelWhite);
groupBoxColors.Controls.Add(panelRed);
groupBoxColors.Location = new Point(298, 30);
groupBoxColors.Name = "groupBoxColors";
groupBoxColors.Size = new Size(274, 137);
groupBoxColors.TabIndex = 11;
groupBoxColors.TabStop = false;
groupBoxColors.Text = "Цвета";
//
// panelPurple
//
panelPurple.BackColor = Color.Purple;
panelPurple.Location = new Point(215, 80);
panelPurple.Name = "panelPurple";
panelPurple.Size = new Size(42, 42);
panelPurple.TabIndex = 7;
//
// panelYellow
//
panelYellow.BackColor = Color.Yellow;
panelYellow.Location = new Point(215, 22);
panelYellow.Name = "panelYellow";
panelYellow.Size = new Size(42, 42);
panelYellow.TabIndex = 3;
//
// panelBlack
//
panelBlack.BackColor = Color.Black;
panelBlack.Location = new Point(149, 80);
panelBlack.Name = "panelBlack";
panelBlack.Size = new Size(42, 42);
panelBlack.TabIndex = 6;
//
// panelBlue
//
panelBlue.BackColor = Color.Blue;
panelBlue.Location = new Point(149, 22);
panelBlue.Name = "panelBlue";
panelBlue.Size = new Size(42, 42);
panelBlue.TabIndex = 2;
//
// panelGray
//
panelGray.BackColor = Color.Gray;
panelGray.Location = new Point(83, 80);
panelGray.Name = "panelGray";
panelGray.Size = new Size(42, 42);
panelGray.TabIndex = 5;
//
// panelGreen
//
panelGreen.BackColor = Color.Green;
panelGreen.Location = new Point(83, 22);
panelGreen.Name = "panelGreen";
panelGreen.Size = new Size(42, 42);
panelGreen.TabIndex = 1;
//
// panelWhite
//
panelWhite.BackColor = Color.White;
panelWhite.Location = new Point(23, 80);
panelWhite.Name = "panelWhite";
panelWhite.Size = new Size(42, 42);
panelWhite.TabIndex = 4;
//
// panelRed
//
panelRed.BackColor = Color.Red;
panelRed.Location = new Point(23, 22);
panelRed.Name = "panelRed";
panelRed.Size = new Size(42, 42);
panelRed.TabIndex = 0;
//
// numericUpDownWheels
//
numericUpDownWheels.Location = new Point(128, 110);
numericUpDownWheels.Maximum = new decimal(new int[] { 4, 0, 0, 0 });
numericUpDownWheels.Minimum = new decimal(new int[] { 2, 0, 0, 0 });
numericUpDownWheels.Name = "numericUpDownWheels";
numericUpDownWheels.Size = new Size(87, 23);
numericUpDownWheels.TabIndex = 10;
numericUpDownWheels.Value = new decimal(new int[] { 2, 0, 0, 0 });
//
// labelWheels
//
labelWheels.AutoSize = true;
labelWheels.Location = new Point(12, 118);
labelWheels.Name = "labelWheels";
labelWheels.Size = new Size(110, 15);
labelWheels.TabIndex = 9;
labelWheels.Text = "Количество колёс:";
//
// checkBoxSecondСarriage
//
checkBoxSecondСarriage.AutoSize = true;
checkBoxSecondСarriage.Location = new Point(12, 201);
checkBoxSecondСarriage.Name = "checkBoxSecondСarriage";
checkBoxSecondСarriage.Size = new Size(213, 19);
checkBoxSecondСarriage.TabIndex = 8;
checkBoxSecondСarriage.Text = "Признак наличия второго вагона ";
checkBoxSecondСarriage.UseVisualStyleBackColor = true;
//
// checkBoxRail
//
checkBoxRail.AutoSize = true;
checkBoxRail.Location = new Point(12, 159);
checkBoxRail.Name = "checkBoxRail";
checkBoxRail.Size = new Size(232, 19);
checkBoxRail.TabIndex = 7;
checkBoxRail.Text = "Признак наличия магнитного рельса";
checkBoxRail.UseVisualStyleBackColor = true;
//
// numericUpDownWeight
//
numericUpDownWeight.Location = new Point(128, 70);
numericUpDownWeight.Maximum = new decimal(new int[] { 1000, 0, 0, 0 });
numericUpDownWeight.Minimum = new decimal(new int[] { 100, 0, 0, 0 });
numericUpDownWeight.Name = "numericUpDownWeight";
numericUpDownWeight.Size = new Size(87, 23);
numericUpDownWeight.TabIndex = 5;
numericUpDownWeight.Value = new decimal(new int[] { 100, 0, 0, 0 });
//
// labelWeight
//
labelWeight.AutoSize = true;
labelWeight.Location = new Point(12, 78);
labelWeight.Name = "labelWeight";
labelWeight.Size = new Size(29, 15);
labelWeight.TabIndex = 4;
labelWeight.Text = "Вес:";
//
// numericUpDownSpeed
//
numericUpDownSpeed.Location = new Point(128, 30);
numericUpDownSpeed.Maximum = new decimal(new int[] { 1000, 0, 0, 0 });
numericUpDownSpeed.Minimum = new decimal(new int[] { 100, 0, 0, 0 });
numericUpDownSpeed.Name = "numericUpDownSpeed";
numericUpDownSpeed.Size = new Size(87, 23);
numericUpDownSpeed.TabIndex = 3;
numericUpDownSpeed.Value = new decimal(new int[] { 100, 0, 0, 0 });
//
// labelSpeed
//
labelSpeed.AutoSize = true;
labelSpeed.Location = new Point(12, 38);
labelSpeed.Name = "labelSpeed";
labelSpeed.Size = new Size(65, 15);
labelSpeed.TabIndex = 2;
labelSpeed.Text = "Скорость: ";
//
// labelModifiedObject
//
labelModifiedObject.BorderStyle = BorderStyle.FixedSingle;
labelModifiedObject.Location = new Point(298, 192);
labelModifiedObject.Name = "labelModifiedObject";
labelModifiedObject.Size = new Size(125, 40);
labelModifiedObject.TabIndex = 1;
labelModifiedObject.Text = "Продвинутый";
labelModifiedObject.TextAlign = ContentAlignment.MiddleCenter;
labelModifiedObject.MouseDown += LabelObject_MouseDown;
//
// labelSimpleObject
//
labelSimpleObject.BorderStyle = BorderStyle.FixedSingle;
labelSimpleObject.Location = new Point(447, 192);
labelSimpleObject.Name = "labelSimpleObject";
labelSimpleObject.Size = new Size(125, 40);
labelSimpleObject.TabIndex = 0;
labelSimpleObject.Text = "Простой";
labelSimpleObject.TextAlign = ContentAlignment.MiddleCenter;
labelSimpleObject.MouseDown += LabelObject_MouseDown;
//
// pictureBoxObject
//
pictureBoxObject.Location = new Point(3, 52);
pictureBoxObject.Name = "pictureBoxObject";
pictureBoxObject.Size = new Size(250, 150);
pictureBoxObject.TabIndex = 1;
pictureBoxObject.TabStop = false;
//
// buttonAdd
//
buttonAdd.Location = new Point(605, 226);
buttonAdd.Name = "buttonAdd";
buttonAdd.Size = new Size(100, 30);
buttonAdd.TabIndex = 2;
buttonAdd.Text = "Добавить";
buttonAdd.UseVisualStyleBackColor = true;
buttonAdd.Click += ButtonAdd_Click;
//
// buttonCancel
//
buttonCancel.Location = new Point(761, 226);
buttonCancel.Name = "buttonCancel";
buttonCancel.Size = new Size(100, 30);
buttonCancel.TabIndex = 3;
buttonCancel.Text = "Отмена";
buttonCancel.UseVisualStyleBackColor = true;
//
// panelObject
//
panelObject.AllowDrop = true;
panelObject.Controls.Add(labelAdditionalColor);
panelObject.Controls.Add(labelMainColor);
panelObject.Controls.Add(pictureBoxObject);
panelObject.Location = new Point(605, 0);
panelObject.Name = "panelObject";
panelObject.Size = new Size(256, 220);
panelObject.TabIndex = 4;
panelObject.DragDrop += PanelObject_DragDrop;
panelObject.DragEnter += PanelObject_DragEnter;
//
// labelAdditionalColor
//
labelAdditionalColor.AllowDrop = true;
labelAdditionalColor.BorderStyle = BorderStyle.FixedSingle;
labelAdditionalColor.Location = new Point(153, 9);
labelAdditionalColor.Name = "labelAdditionalColor";
labelAdditionalColor.Size = new Size(100, 30);
labelAdditionalColor.TabIndex = 12;
labelAdditionalColor.Text = "Доп. Цвет";
labelAdditionalColor.TextAlign = ContentAlignment.MiddleCenter;
labelAdditionalColor.DragDrop += LabelColor_DragDrop;
labelAdditionalColor.DragEnter += LabelColor_DragEnter;
//
// labelMainColor
//
labelMainColor.AllowDrop = true;
labelMainColor.BorderStyle = BorderStyle.FixedSingle;
labelMainColor.Location = new Point(3, 9);
labelMainColor.Name = "labelMainColor";
labelMainColor.Size = new Size(100, 30);
labelMainColor.TabIndex = 13;
labelMainColor.Text = "Цвет";
labelMainColor.TextAlign = ContentAlignment.MiddleCenter;
labelMainColor.DragDrop += LabelColor_DragDrop;
labelMainColor.DragEnter += LabelColor_DragEnter;
//
// FormTrainConfig
//
AutoScaleDimensions = new SizeF(7F, 15F);
AutoScaleMode = AutoScaleMode.Font;
ClientSize = new Size(873, 272);
Controls.Add(panelObject);
Controls.Add(buttonCancel);
Controls.Add(buttonAdd);
Controls.Add(groupBoxConfig);
Name = "FormTrainConfig";
Text = "Создание объекта";
groupBoxConfig.ResumeLayout(false);
groupBoxConfig.PerformLayout();
groupBoxColors.ResumeLayout(false);
((System.ComponentModel.ISupportInitialize)numericUpDownWheels).EndInit();
((System.ComponentModel.ISupportInitialize)numericUpDownWeight).EndInit();
((System.ComponentModel.ISupportInitialize)numericUpDownSpeed).EndInit();
((System.ComponentModel.ISupportInitialize)pictureBoxObject).EndInit();
panelObject.ResumeLayout(false);
ResumeLayout(false);
}
#endregion
private GroupBox groupBoxConfig;
private Label labelModifiedObject;
private Label labelSimpleObject;
private NumericUpDown numericUpDownWeight;
private Label labelWeight;
private NumericUpDown numericUpDownSpeed;
private Label labelSpeed;
private CheckBox checkBoxSecondСarriage;
private CheckBox checkBoxRail;
private NumericUpDown numericUpDownWheels;
private Label labelWheels;
private GroupBox groupBoxColors;
private Panel panelYellow;
private Panel panelBlue;
private Panel panelGreen;
private Panel panelRed;
private Panel panelPurple;
private Panel panelBlack;
private Panel panelGray;
private Panel panelWhite;
private PictureBox pictureBoxObject;
private Button buttonAdd;
private Button buttonCancel;
private Panel panelObject;
private Label labelMainColor;
private Label labelAdditionalColor;
}
}

View File

@@ -0,0 +1,171 @@
using ProjectMonorail.Drawings;
using ProjectMonorail.Entities;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace ProjectMonorail;
/// <summary>
/// Форма конфигурации объекта
/// </summary>
public partial class FormTrainConfig : Form
{
/// <summary>
/// Объект - прорисовка поезда
/// </summary>
private DrawingTrain? _train;
/// <summary>
/// Событие для передачи объекта
/// </summary>
private event Action<DrawingTrain>? TrainDelegate;
/// <summary>
/// Конструктор
/// </summary>
public FormTrainConfig()
{
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();
}
/// <summary>
/// Привязка внешнего метода к событию
/// </summary>
/// <param name="trainDelegate"></param>
public void AddEvent(Action<DrawingTrain> trainDelegate)
{
TrainDelegate += trainDelegate;
}
/// <summary>
/// Прорисовка объекта
/// </summary>
private void DrawObject()
{
Bitmap bmp = new(pictureBoxObject.Width, pictureBoxObject.Height);
Graphics gr = Graphics.FromImage(bmp);
_train?.SetPictureSize(pictureBoxObject.Width, pictureBoxObject.Height);
_train?.SetPosition(20, 50);
_train?.DrawTransport(gr);
pictureBoxObject.Image = bmp;
}
/// <summary>
/// Передаем информацию при нажатии на label
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void LabelObject_MouseDown(object? sender, MouseEventArgs e)
{
(sender as Label)?.DoDragDrop((sender as Label)?.Name ?? string.Empty, DragDropEffects.Move | DragDropEffects.Copy);
}
/// <summary>
/// Проверка получаемой информации (ее типа на соответствие требуемому)
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void PanelObject_DragEnter(object? sender, DragEventArgs e)
{
e.Effect = e.Data?.GetDataPresent(DataFormats.Text) ?? false ? DragDropEffects.Copy : DragDropEffects.None;
}
/// <summary>
/// Действия при приеме перетаскиваемой информации
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void PanelObject_DragDrop(object? sender, DragEventArgs e)
{
switch (e.Data?.GetData(DataFormats.Text)?.ToString())
{
case "labelSimpleObject":
_train = new DrawingTrain((int)numericUpDownSpeed.Value, (double)numericUpDownWeight.Value, Color.White);
break;
case "labelModifiedObject":
_train = new DrawingMonorail((int)numericUpDownSpeed.Value, (double)numericUpDownWeight.Value, (int)numericUpDownWheels.Value, Color.White,
Color.Black, checkBoxRail.Checked, checkBoxSecondСarriage.Checked);
break;
}
DrawObject();
}
/// <summary>
/// Передаем информацию при нажатии на Panel
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Panel_MouseDown(object? sender, MouseEventArgs e)
{
(sender as Panel)?.DoDragDrop((sender as Panel)?.BackColor, DragDropEffects.Move | DragDropEffects.Copy);
}
/// <summary>
/// Проверка получаемой информации (ее типа на соответствие требуемому)
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void LabelColor_DragEnter(object? sender, DragEventArgs e)
{
e.Effect = e.Data?.GetDataPresent(typeof(Color)) ?? false ? DragDropEffects.Copy : DragDropEffects.None;
}
/// <summary>
/// Действия при приеме перетаскиваемой информации
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void LabelColor_DragDrop(object? sender, DragEventArgs e)
{
if (_train == null || sender == null) { return; }
Label colorof = (Label)sender;
Color color = (Color)e.Data?.GetData(typeof(Color));
switch (colorof?.Name)
{
case "labelMainColor":
_train.EntityTrain?.SetMainColor(color);
DrawObject();
break;
case "labelAdditionalColor":
if (_train is DrawingMonorail)
{
(_train.EntityTrain as EntityMonorail).SetAdditionalColor(color);
DrawObject();
}
break;
}
}
/// <summary>
/// Передача объекта
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void ButtonAdd_Click(object? sender, EventArgs e)
{
if (_train != null)
{
TrainDelegate?.Invoke(_train);
Close();
}
}
}

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

@@ -1,4 +1,10 @@
namespace ProjectMonorail using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using ProjectMonorail;
using Serilog;
namespace ProjectAirFighter
{ {
internal static class Program internal static class Program
{ {
@@ -10,8 +16,30 @@ namespace ProjectMonorail
{ {
// To customize application configuration such as set high DPI settings or default font, // To customize application configuration such as set high DPI settings or default font,
// see https://aka.ms/applicationconfiguration. // see https://aka.ms/applicationconfiguration.
ServiceCollection serviceCollection = new();
ConfigureService(serviceCollection);
ApplicationConfiguration.Initialize(); ApplicationConfiguration.Initialize();
Application.Run(new FormTrainCollection()); using ServiceProvider serviceProvider = serviceCollection.BuildServiceProvider();
Application.Run(serviceProvider.GetRequiredService<FormTrainCollection>());
}
private static void ConfigureService(ServiceCollection services)
{
services.AddSingleton<FormTrainCollection>()
.AddLogging(option =>
{
var configuration = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile(path: "appSettings.json", optional: false, reloadOnChange: true)
.Build();
var logger = new LoggerConfiguration()
.ReadFrom.Configuration(configuration)
.CreateLogger();
option.SetMinimumLevel(LogLevel.Information);
option.AddSerilog(logger);
});
} }
} }
} }

View File

@@ -8,4 +8,17 @@
<ImplicitUsings>enable</ImplicitUsings> <ImplicitUsings>enable</ImplicitUsings>
</PropertyGroup> </PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Extensions.Configuration" Version="8.0.0" />
<PackageReference Include="Microsoft.Extensions.Configuration.FileExtensions" Version="8.0.0" />
<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="8.0.0" />
<PackageReference Include="Microsoft.Extensions.Logging" Version="8.0.0" />
<PackageReference Include="Microsoft.Extensions.Logging.Configuration" Version="8.0.0" />
<PackageReference Include="Serilog" Version="3.1.1" />
<PackageReference Include="Serilog.Extensions.Logging" Version="8.0.0" />
<PackageReference Include="Serilog.Settings.AppSettings" Version="2.2.2" />
<PackageReference Include="Serilog.Settings.Configuration" Version="8.0.0" />
<PackageReference Include="Serilog.Sinks.File" Version="5.0.0" />
</ItemGroup>
</Project> </Project>

View File

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