diff --git a/WinFormsLabRad1/WinFormsLabRad1/CollectionGenericObjects/AbstractCompany.cs b/WinFormsLabRad1/WinFormsLabRad1/CollectionGenericObjects/AbstractCompany.cs new file mode 100644 index 0000000..267e0ff --- /dev/null +++ b/WinFormsLabRad1/WinFormsLabRad1/CollectionGenericObjects/AbstractCompany.cs @@ -0,0 +1,108 @@ +using WinFormsLabRad1.Drawnings; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace WinFormsLabRad1.CollectionGenericObjects +{ + /// + /// Абстракция компании, хранящий коллекцию автомобилей + /// + public abstract class AbstractCompany + { + /// + /// Размер места (ширина) + /// + protected readonly int _placeSizeWidth = 210; + /// + /// Размер места (высота) + /// + protected readonly int _placeSizeHeight = 80; + /// + /// Ширина окна + /// + protected readonly int _pictureWidth; + /// + /// Высота окна + /// + protected readonly int _pictureHeight; + /// + /// Коллекция автомобилей + /// + protected ICollectionGenericObjects? _collection = null; + /// + /// Вычисление максимального количества элементов, который можно разместить в окне + /// + private int GetMaxCount => _pictureWidth * _pictureHeight / (_placeSizeWidth * _placeSizeHeight); + /// + /// Конструктор + /// + /// Ширина окна + /// Высота окна + /// Коллекция автомобилей + public AbstractCompany(int picWidth, int picHeight, ICollectionGenericObjects collection) + { + _pictureWidth = picWidth; + _pictureHeight = picHeight; + _collection = collection; + _collection.SetMaxCount = GetMaxCount; + } + /// + /// Перегрузка оператора сложения для класса + /// + /// Компания + /// Добавляемый объект + /// + public static bool operator +(AbstractCompany company, DrawningPlatforma car) + { + return company._collection?.Insert(car) ?? false; + } + /// + /// Перегрузка оператора удаления для класса + /// + /// Компания + /// Номер удаляемого объекта + /// + public static bool operator -(AbstractCompany company, int position) + { + return company._collection?.Remove(position) ?? false; + } + /// + /// Получение случайного объекта из коллекции + /// + /// + public DrawningPlatforma? GetRandomObject() + { + Random rnd = new(); + return _collection?.Get(rnd.Next(GetMaxCount)); + } + /// + /// Вывод всей коллекции + /// + /// + 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) + { + DrawningPlatforma? obj = _collection?.Get(i); + obj?.DrawTransport(graphics); + } + return bitmap; + } + /// + /// Вывод заднего фона + /// + /// + protected abstract void DrawBackgound(Graphics g); + /// + /// Расстановка объектов + /// + protected abstract void SetObjectsPosition(); + } +} diff --git a/WinFormsLabRad1/WinFormsLabRad1/CollectionGenericObjects/Base.cs b/WinFormsLabRad1/WinFormsLabRad1/CollectionGenericObjects/Base.cs new file mode 100644 index 0000000..5dd1021 --- /dev/null +++ b/WinFormsLabRad1/WinFormsLabRad1/CollectionGenericObjects/Base.cs @@ -0,0 +1,33 @@ +using WinFormsLabRad1.Drawnings; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace WinFormsLabRad1.CollectionGenericObjects +{ + /// + /// Реализация абстрактной компании - каршеринг + /// + public class Base : AbstractCompany + { + /// + /// Конструктор + /// + /// + /// + /// + public Base(int picWidth, int picHeight, ICollectionGenericObjects collection) : base(picWidth, picHeight, collection) + { + } + protected override void DrawBackgound(Graphics g) + { + throw new NotImplementedException(); + } + protected override void SetObjectsPosition() + { + throw new NotImplementedException(); + } + } +} diff --git a/WinFormsLabRad1/WinFormsLabRad1/CollectionGenericObjects/ICollectionGenericObjects.cs b/WinFormsLabRad1/WinFormsLabRad1/CollectionGenericObjects/ICollectionGenericObjects.cs new file mode 100644 index 0000000..d839289 --- /dev/null +++ b/WinFormsLabRad1/WinFormsLabRad1/CollectionGenericObjects/ICollectionGenericObjects.cs @@ -0,0 +1,50 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace WinFormsLabRad1.CollectionGenericObjects +{ + /// + /// Интерфейс описания действий для набора хранимых объектов + /// + /// Параметр: ограничение - ссылочный тип + public interface ICollectionGenericObjects + where T : class + { + /// + /// Количество объектов в коллекции + /// + int Count { get; } + /// + /// Установка максимального количества элементов + /// + int SetMaxCount { set; } + /// + /// Добавление объекта в коллекцию + /// + /// Добавляемый объект + /// /// true - вставка прошла удачно, false - вставка не удалась + bool Insert(T obj); + /// + /// Добавление объекта в коллекцию на конкретную позицию + /// + /// Добавляемый объект + /// Позиция + /// true - вставка прошла удачно, false - вставка не удалась + bool Insert(T obj, int position); + /// + /// Удаление объекта из коллекции с конкретной позиции + /// + /// Позиция + /// true - удаление прошло удачно, false - удаление не удалось + bool Remove(int position); + /// + /// Получение объекта по позиции + /// + /// Позиция + /// Объект + T? Get(int position); + } +} diff --git a/WinFormsLabRad1/WinFormsLabRad1/CollectionGenericObjects/MassiveGenericObjects.cs b/WinFormsLabRad1/WinFormsLabRad1/CollectionGenericObjects/MassiveGenericObjects.cs new file mode 100644 index 0000000..4d945cc --- /dev/null +++ b/WinFormsLabRad1/WinFormsLabRad1/CollectionGenericObjects/MassiveGenericObjects.cs @@ -0,0 +1,72 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace WinFormsLabRad1.CollectionGenericObjects +{ + /// + /// Параметризованный набор объектов + /// + /// Параметр: ограничение - ссылочный тип + public class MassiveGenericObjects : ICollectionGenericObjects + where T : class + { + /// + /// Массив объектов, которые храним + /// + private T?[] _collection; + public int Count => _collection.Length; + public int SetMaxCount + { + set + { + if (value > 0) + { + if (_collection.Length > 0) + { + Array.Resize(ref _collection, value); + } + else + { + _collection = new T?[value]; + } + } + } + } + /// + /// Конструктор + /// + public MassiveGenericObjects() + { + _collection = Array.Empty(); + } + public T? Get(int position) + { + // TODO проверка позиции + return _collection[position]; + } + public bool Insert(T obj) + { + // TODO вставка в свободное место набора + return false; + } + public bool Insert(T obj, int position) + { + // TODO проверка позиции + // TODO проверка, что элемент массива по этой позиции пустой, если нет, то + // ищется свободное место после этой позиции и идет вставка туда + // если нет после, ищем до + // TODO вставка + return false; + } + public bool Remove(int position) + { + // TODO проверка позиции + // TODO удаление объекта из массива, присвоив элементу массива значение null + return true; + } + } + +} diff --git a/WinFormsLabRad1/WinFormsLabRad1/FormTanksCollection.Designer.cs b/WinFormsLabRad1/WinFormsLabRad1/FormTanksCollection.Designer.cs new file mode 100644 index 0000000..1084afd --- /dev/null +++ b/WinFormsLabRad1/WinFormsLabRad1/FormTanksCollection.Designer.cs @@ -0,0 +1,169 @@ +namespace WinFormsLabRad1 +{ + partial class FormTanksCollection + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + groupBoxTools = new GroupBox(); + buttonRefresh = new Button(); + buttonGoToCheck = new Button(); + buttonRemoveMachine = new Button(); + maskedTextBox1 = new MaskedTextBox(); + buttonAddTankZU = new Button(); + buttonAddMachine = new Button(); + comboBoxSelectorCompany = new ComboBox(); + pictureBox = new PictureBox(); + groupBoxTools.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)pictureBox).BeginInit(); + SuspendLayout(); + // + // groupBoxTools + // + groupBoxTools.Controls.Add(buttonRefresh); + groupBoxTools.Controls.Add(buttonGoToCheck); + groupBoxTools.Controls.Add(buttonRemoveMachine); + groupBoxTools.Controls.Add(maskedTextBox1); + groupBoxTools.Controls.Add(buttonAddTankZU); + groupBoxTools.Controls.Add(buttonAddMachine); + groupBoxTools.Controls.Add(comboBoxSelectorCompany); + groupBoxTools.Dock = DockStyle.Right; + groupBoxTools.Location = new Point(759, 0); + groupBoxTools.Name = "groupBoxTools"; + groupBoxTools.Size = new Size(183, 488); + groupBoxTools.TabIndex = 0; + groupBoxTools.TabStop = false; + groupBoxTools.Text = "Инструменты"; + // + // buttonRefresh + // + buttonRefresh.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right; + buttonRefresh.Location = new Point(6, 409); + buttonRefresh.Name = "buttonRefresh"; + buttonRefresh.Size = new Size(171, 40); + buttonRefresh.TabIndex = 6; + buttonRefresh.Text = "Обновить"; + buttonRefresh.UseVisualStyleBackColor = true; + // + // buttonGoToCheck + // + buttonGoToCheck.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right; + buttonGoToCheck.Location = new Point(6, 320); + buttonGoToCheck.Name = "buttonGoToCheck"; + buttonGoToCheck.Size = new Size(171, 40); + buttonGoToCheck.TabIndex = 5; + buttonGoToCheck.Text = "Передать на тесты"; + buttonGoToCheck.UseVisualStyleBackColor = true; + // + // buttonRemoveMachine + // + buttonRemoveMachine.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right; + buttonRemoveMachine.Location = new Point(6, 219); + buttonRemoveMachine.Name = "buttonRemoveMachine"; + buttonRemoveMachine.Size = new Size(171, 40); + buttonRemoveMachine.TabIndex = 4; + buttonRemoveMachine.Text = "Удалить машину"; + buttonRemoveMachine.UseVisualStyleBackColor = true; + // + // maskedTextBox1 + // + maskedTextBox1.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right; + maskedTextBox1.Location = new Point(6, 177); + maskedTextBox1.Mask = "00"; + maskedTextBox1.Name = "maskedTextBox1"; + maskedTextBox1.Size = new Size(171, 23); + maskedTextBox1.TabIndex = 3; + maskedTextBox1.ValidatingType = typeof(int); + // + // buttonAddTankZU + // + buttonAddTankZU.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right; + buttonAddTankZU.Location = new Point(6, 119); + buttonAddTankZU.Name = "buttonAddTankZU"; + buttonAddTankZU.Size = new Size(171, 40); + buttonAddTankZU.TabIndex = 2; + buttonAddTankZU.Text = "Добавить ЗУ"; + buttonAddTankZU.UseVisualStyleBackColor = true; + // + // buttonAddMachine + // + buttonAddMachine.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right; + buttonAddMachine.Location = new Point(6, 62); + buttonAddMachine.Name = "buttonAddMachine"; + buttonAddMachine.Size = new Size(171, 40); + buttonAddMachine.TabIndex = 1; + buttonAddMachine.Text = "Добавить машину"; + buttonAddMachine.UseVisualStyleBackColor = true; + // + // 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, 22); + comboBoxSelectorCompany.Name = "comboBoxSelectorCompany"; + comboBoxSelectorCompany.Size = new Size(171, 23); + comboBoxSelectorCompany.TabIndex = 0; + comboBoxSelectorCompany.SelectedIndexChanged += comboBoxSelectorCompany_SelectedIndexChanged; + // + // pictureBox + // + pictureBox.Dock = DockStyle.Fill; + pictureBox.Location = new Point(0, 0); + pictureBox.Name = "pictureBox"; + pictureBox.Size = new Size(759, 488); + pictureBox.TabIndex = 1; + pictureBox.TabStop = false; + // + // FormTanksCollection + // + AutoScaleDimensions = new SizeF(7F, 15F); + AutoScaleMode = AutoScaleMode.Font; + ClientSize = new Size(942, 488); + Controls.Add(pictureBox); + Controls.Add(groupBoxTools); + Name = "FormTanksCollection"; + Text = "Коллекция БМ"; + groupBoxTools.ResumeLayout(false); + groupBoxTools.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)pictureBox).EndInit(); + ResumeLayout(false); + } + + #endregion + + private GroupBox groupBoxTools; + private ComboBox comboBoxSelectorCompany; + private Button buttonAddMachine; + private MaskedTextBox maskedTextBox1; + private Button buttonAddTankZU; + private PictureBox pictureBox; + private Button buttonRefresh; + private Button buttonGoToCheck; + private Button buttonRemoveMachine; + } +} \ No newline at end of file diff --git a/WinFormsLabRad1/WinFormsLabRad1/FormTanksCollection.cs b/WinFormsLabRad1/WinFormsLabRad1/FormTanksCollection.cs new file mode 100644 index 0000000..d92aa37 --- /dev/null +++ b/WinFormsLabRad1/WinFormsLabRad1/FormTanksCollection.cs @@ -0,0 +1,48 @@ +using WinFormsLabRad1.CollectionGenericObjects; +using WinFormsLabRad1.Drawnings; +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 WinFormsLabRad1 +/// +/// Форма работы с компанией и ее коллекцией +/// +{ + public partial class FormTanksCollection : Form + { + /// + /// Компания + /// + private AbstractCompany? _company = null; + + /// + /// Конструктор + /// + public FormTanksCollection() + { + InitializeComponent(); + } + + /// + /// Выбор компании + /// + /// + /// + private void comboBoxSelectorCompany_SelectedIndexChanged(object sender, EventArgs e) + { + switch (comboBoxSelectorCompany.Text) + { + case "Хранилище": + _company = new Base(pictureBox.Width, pictureBox.Height, new MassiveGenericObjects()); + break; + } + } + } +} diff --git a/WinFormsLabRad1/WinFormsLabRad1/FormTanksCollection.resx b/WinFormsLabRad1/WinFormsLabRad1/FormTanksCollection.resx new file mode 100644 index 0000000..af32865 --- /dev/null +++ b/WinFormsLabRad1/WinFormsLabRad1/FormTanksCollection.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file