diff --git a/Excavator/Excavator/CollectionGenericObjects/AbstractCompany.cs b/Excavator/Excavator/CollectionGenericObjects/AbstractCompany.cs new file mode 100644 index 0000000..c7596e8 --- /dev/null +++ b/Excavator/Excavator/CollectionGenericObjects/AbstractCompany.cs @@ -0,0 +1,124 @@ +using Excavator.Drawnings; + +namespace Excavator.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 int operator +(AbstractCompany company, DrawningTrackedVehicle car) + { + if (car == null) + { + return -1; + } + return company._collection.Insert(car); + } + /// + /// Перегрузка оператора удаления для класса + /// + /// Компания + /// Номер удаляемого объекта + /// + public static bool operator -(AbstractCompany company, int pos) + { + DrawningTrackedVehicle? obj = company._collection.Get(pos); + if (obj != null) + { + company._collection.Remove(pos); + } + return false; + } + /// + /// Получение случайного объекта из коллекции + /// + /// + public DrawningTrackedVehicle? 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) + { + DrawningTrackedVehicle? obj = _collection?.Get(i); + obj?.DrawTransport(graphics); + } + + return bitmap; + } + + /// + /// Вывод заднего фона + /// + /// + protected abstract void DrawBackgound(Graphics g); + + /// + /// Расстановка объектов + /// + protected abstract void SetObjectsPosition(); +} \ No newline at end of file diff --git a/Excavator/Excavator/CollectionGenericObjects/ExcavatorService.cs b/Excavator/Excavator/CollectionGenericObjects/ExcavatorService.cs new file mode 100644 index 0000000..b1288b0 --- /dev/null +++ b/Excavator/Excavator/CollectionGenericObjects/ExcavatorService.cs @@ -0,0 +1,51 @@ +using Excavator.Drawnings; + +namespace Excavator.CollectionGenericObjects; + +/// +/// Реализация абстрактной компании - каршеринг +/// +/// +/// Конструктор +/// +/// +/// +/// +public class ExcavatorService(int picWidth, int picHeight, ICollectionGenericObjects collection) : AbstractCompany(picWidth, picHeight, collection) +{ + Graphics g; + + protected override void DrawBackgound(Graphics g) + { + Pen pen = new(Color.Black, 3); + for (int i = 0; i < _pictureWidth / _placeSizeWidth; i++) + { + for (int j = 0; j < _pictureHeight / _placeSizeHeight + + 1; ++j) + {//линия разметки места + g.DrawLine(pen, i * _placeSizeWidth, j * + _placeSizeHeight * 2 , i * _placeSizeWidth + _placeSizeWidth / 2, j * + _placeSizeHeight * 2); + } + this.g = g; + g.DrawLine(pen, i * _placeSizeWidth, 0, i * _placeSizeWidth, _pictureHeight / _placeSizeHeight * _placeSizeHeight * 2); + } + } + + protected override void SetObjectsPosition() + { + int width = _pictureWidth / _placeSizeWidth; + int height = _pictureHeight / _placeSizeHeight; + for (int i = 0; i < _collection.Count; i++) + { + DrawningTrackedVehicle? excavator = _collection.Get(i); + if (excavator == null) + continue; + int r = i / width; + int s = width - 1 - (i % width); + excavator.SetPictureSize(_pictureWidth, _pictureHeight); + excavator.SetPosition(s * _placeSizeWidth, (r * _placeSizeHeight * 2)+ 5); + excavator.DrawTransport(g); + } + } +} diff --git a/Excavator/Excavator/CollectionGenericObjects/ICollectionGenericObjects.cs b/Excavator/Excavator/CollectionGenericObjects/ICollectionGenericObjects.cs index 28a07eb..49a632d 100644 --- a/Excavator/Excavator/CollectionGenericObjects/ICollectionGenericObjects.cs +++ b/Excavator/Excavator/CollectionGenericObjects/ICollectionGenericObjects.cs @@ -22,7 +22,7 @@ public interface ICollectionGenericObjects /// /// Добавляемый объект /// true - вставка прошла удачно, false - вставка не удалась - bool Insert(T obj); + int Insert(T obj); /// /// Добавление объекта в коллекцию на конкретную позицию @@ -30,7 +30,7 @@ public interface ICollectionGenericObjects /// Добавляемый объект /// Позиция /// true - вставка прошла удачно, false - вставка не удалась - bool Insert(T obj, int position); + int Insert(T obj, int position); /// /// Удаление объекта из коллекции с конкретной позиции diff --git a/Excavator/Excavator/CollectionGenericObjects/MassiveGenericObjects.cs b/Excavator/Excavator/CollectionGenericObjects/MassiveGenericObjects.cs index 940ece1..e11b4ed 100644 --- a/Excavator/Excavator/CollectionGenericObjects/MassiveGenericObjects.cs +++ b/Excavator/Excavator/CollectionGenericObjects/MassiveGenericObjects.cs @@ -49,37 +49,33 @@ public class MassiveGenericObjects : ICollectionGenericObjects return _collection[position]; } - public bool Insert(T obj) + public int Insert(T excavator) { - - return false; + return Insert(excavator, 0); } - - public bool Insert(T obj, int position) + public int Insert(T excavator, int position) { - if (position < 0 || position > Count) + int nullIndex = -1, i; + if (!(position >= 0 && position < Count)) + return -1; + for (i = position; i < Count; i++) { - return false; - } - if (_collection[Count] != null) - { - int pos = Count; - for (int i = Count; i > 0; --i) + if (_collection[i] == null) { - - if (_collection[i] == null) - { - pos = i; - break; - } - } - for (int i = Count; i >= pos; --i) - { - _collection[i - 1] = _collection[i]; + nullIndex = i; + break; } } - _collection[Count] = obj; - return true; + if (nullIndex < 0) + { + return -1; + } + for (i = nullIndex; i > position; i--) + { + _collection[i] = _collection[i - 1]; + } + _collection[position] = excavator; + return position; } public bool Remove(int position) diff --git a/Excavator/Excavator/FormExcavator.Designer.cs b/Excavator/Excavator/FormExcavator.Designer.cs index f4bcc9d..582d445 100644 --- a/Excavator/Excavator/FormExcavator.Designer.cs +++ b/Excavator/Excavator/FormExcavator.Designer.cs @@ -48,7 +48,6 @@ pictureBoxExcavator.Size = new Size(824, 407); pictureBoxExcavator.TabIndex = 0; pictureBoxExcavator.TabStop = false; - // // buttonCreateExcavator // diff --git a/Excavator/Excavator/FormExcavator.cs b/Excavator/Excavator/FormExcavator.cs index 9631d6b..4b8afc8 100644 --- a/Excavator/Excavator/FormExcavator.cs +++ b/Excavator/Excavator/FormExcavator.cs @@ -17,6 +17,18 @@ public partial class FormExcavator : Form /// private AbstractStrategy? _strategy; + public DrawningTrackedVehicle SetTrackedVehicle + { + set + { + _drawningTrackedVehicle = value; + _drawningTrackedVehicle.SetPictureSize(pictureBoxExcavator.Width, pictureBoxExcavator.Height); + ComboBoxStrategy.Enabled = true; + _strategy = null; + Draw(); + } + } + /// /// Конструктор формы /// @@ -127,7 +139,7 @@ public partial class FormExcavator : Form } } - + /// diff --git a/Excavator/Excavator/FormTrackedVehicleCollection.Designer.cs b/Excavator/Excavator/FormTrackedVehicleCollection.Designer.cs new file mode 100644 index 0000000..86f7770 --- /dev/null +++ b/Excavator/Excavator/FormTrackedVehicleCollection.Designer.cs @@ -0,0 +1,173 @@ +namespace Excavator +{ + partial class FormTrackedVehicleCollection + { + /// + /// 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() + { + groupBox1 = new GroupBox(); + buttonRefresh = new Button(); + buttonGoToCheck = new Button(); + buttonDelExcavator = new Button(); + maskedTextBox = new MaskedTextBox(); + buttonAddExcavator = new Button(); + buttonAddTrackedVehicle = new Button(); + comboBoxSelectorCompany = new ComboBox(); + pictureBox = new PictureBox(); + groupBox1.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)pictureBox).BeginInit(); + SuspendLayout(); + // + // groupBox1 + // + groupBox1.Controls.Add(buttonRefresh); + groupBox1.Controls.Add(buttonGoToCheck); + groupBox1.Controls.Add(buttonDelExcavator); + groupBox1.Controls.Add(maskedTextBox); + groupBox1.Controls.Add(buttonAddExcavator); + groupBox1.Controls.Add(buttonAddTrackedVehicle); + groupBox1.Controls.Add(comboBoxSelectorCompany); + groupBox1.Dock = DockStyle.Right; + groupBox1.Location = new Point(939, 0); + groupBox1.Name = "groupBox1"; + groupBox1.Size = new Size(221, 806); + groupBox1.TabIndex = 0; + groupBox1.TabStop = false; + groupBox1.Text = "Инструменты"; + // + // buttonRefresh + // + buttonRefresh.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right; + buttonRefresh.Location = new Point(18, 487); + buttonRefresh.Name = "buttonRefresh"; + buttonRefresh.Size = new Size(191, 45); + buttonRefresh.TabIndex = 6; + buttonRefresh.Text = "Обновить"; + buttonRefresh.UseVisualStyleBackColor = true; + buttonRefresh.Click += ButtonRefresh_Click; + // + // buttonGoToCheck + // + buttonGoToCheck.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right; + buttonGoToCheck.Location = new Point(18, 406); + buttonGoToCheck.Name = "buttonGoToCheck"; + buttonGoToCheck.Size = new Size(191, 45); + buttonGoToCheck.TabIndex = 5; + buttonGoToCheck.Text = "Передать на тесты"; + buttonGoToCheck.UseVisualStyleBackColor = true; + buttonGoToCheck.Click += ButtonGoToCheck_Click; + // + // buttonDelExcavator + // + buttonDelExcavator.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right; + buttonDelExcavator.Location = new Point(18, 327); + buttonDelExcavator.Name = "buttonDelExcavator"; + buttonDelExcavator.Size = new Size(191, 45); + buttonDelExcavator.TabIndex = 4; + buttonDelExcavator.Text = "Удалить машину"; + buttonDelExcavator.UseVisualStyleBackColor = true; + buttonDelExcavator.Click += ButtonDelExcavator_Click; + // + // maskedTextBox + // + maskedTextBox.Location = new Point(18, 257); + maskedTextBox.Mask = "00"; + maskedTextBox.Name = "maskedTextBox"; + maskedTextBox.Size = new Size(191, 27); + maskedTextBox.TabIndex = 3; + maskedTextBox.ValidatingType = typeof(int); + // + // buttonAddExcavator + // + buttonAddExcavator.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right; + buttonAddExcavator.Location = new Point(18, 162); + buttonAddExcavator.Name = "buttonAddExcavator"; + buttonAddExcavator.Size = new Size(191, 45); + buttonAddExcavator.TabIndex = 2; + buttonAddExcavator.Text = "Добавить экскаватор"; + buttonAddExcavator.UseVisualStyleBackColor = true; + buttonAddExcavator.Click += buttonAddExcavator_Click; + // + // buttonAddTrackedVehicle + // + buttonAddTrackedVehicle.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right; + buttonAddTrackedVehicle.Location = new Point(18, 83); + buttonAddTrackedVehicle.Name = "buttonAddTrackedVehicle"; + buttonAddTrackedVehicle.Size = new Size(191, 60); + buttonAddTrackedVehicle.TabIndex = 1; + buttonAddTrackedVehicle.Text = "Добавить гусеничную машину"; + buttonAddTrackedVehicle.UseVisualStyleBackColor = true; + buttonAddTrackedVehicle.Click += ButtonAddCar_Click; + // + // 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(18, 34); + comboBoxSelectorCompany.Name = "comboBoxSelectorCompany"; + comboBoxSelectorCompany.Size = new Size(191, 28); + comboBoxSelectorCompany.TabIndex = 0; + comboBoxSelectorCompany.SelectedIndexChanged += ComboBoxSelectorCompany_SelectedIndexChanged; + // + // pictureBox + // + pictureBox.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right; + pictureBox.Location = new Point(0, 0); + pictureBox.Name = "pictureBox"; + pictureBox.Size = new Size(939, 800); + pictureBox.TabIndex = 1; + pictureBox.TabStop = false; + // + // FormTrackedVehicleCollection + // + AutoScaleDimensions = new SizeF(8F, 20F); + AutoScaleMode = AutoScaleMode.Font; + ClientSize = new Size(1160, 806); + Controls.Add(pictureBox); + Controls.Add(groupBox1); + Name = "FormTrackedVehicleCollection"; + Text = "Коллекция экскаваторов"; + groupBox1.ResumeLayout(false); + groupBox1.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)pictureBox).EndInit(); + ResumeLayout(false); + } + + #endregion + + private GroupBox groupBox1; + private ComboBox comboBoxSelectorCompany; + private Button buttonAddTrackedVehicle; + private Button buttonDelExcavator; + private MaskedTextBox maskedTextBox; + private Button buttonAddExcavator; + private PictureBox pictureBox; + private Button buttonRefresh; + private Button buttonGoToCheck; + } +} \ No newline at end of file diff --git a/Excavator/Excavator/FormTrackedVehicleCollection.cs b/Excavator/Excavator/FormTrackedVehicleCollection.cs new file mode 100644 index 0000000..550be4e --- /dev/null +++ b/Excavator/Excavator/FormTrackedVehicleCollection.cs @@ -0,0 +1,185 @@ +using Excavator.CollectionGenericObjects; +using Excavator.Drawnings; +using System.Windows.Forms; + +namespace Excavator; + +/// +/// Форма работы с компанией и ее коллекцией +/// +public partial class FormTrackedVehicleCollection : Form +{ + /// + /// Компания + /// + private AbstractCompany? _company = null; + + /// + /// Конструктор + /// + public FormTrackedVehicleCollection() + { + InitializeComponent(); + } + + /// + /// Выбор компании + /// + /// + /// + private void ComboBoxSelectorCompany_SelectedIndexChanged(object sender, EventArgs e) + { + switch (comboBoxSelectorCompany.Text) + { + case "Хранилище": + _company = new ExcavatorService(pictureBox.Width, pictureBox.Height, new MassiveGenericObjects()); + break; + } + } + + /// + /// Добавление обычного автомобиля + /// + /// + /// + private void ButtonAddCar_Click(object sender, EventArgs e) => CreateObject(nameof(DrawningTrackedVehicle)); + private void buttonAddExcavator_Click(object sender, EventArgs e) => CreateObject(nameof(DrawningExcavator)); + + /// + /// Создание объекта класса-перемещения + /// + /// Тип создаваемого объекта + private void CreateObject(string type) + { + if (_company == null) + { + return; + } + + Random random = new(); + DrawningTrackedVehicle drawningTrackedVehicle; + switch (type) + { + case nameof(DrawningTrackedVehicle): + drawningTrackedVehicle = new DrawningTrackedVehicle(random.Next(100, 300), random.Next(1000, 3000), GetColor(random)); + break; + case nameof(DrawningExcavator): + drawningTrackedVehicle = new DrawningExcavator(random.Next(100, 300), random.Next(1000, 3000), + GetColor(random), + GetColor(random), + Convert.ToBoolean(random.Next(0, 2)), Convert.ToBoolean(random.Next(0, 2))); + break; + default: + return; + } + + int result = _company + drawningTrackedVehicle; + if (result != -2) + { + MessageBox.Show("Объект добавлен"); + pictureBox.Image = _company.Show(); + } + else + { + MessageBox.Show("Не удалось добавить объект"); + } + } + + /// + /// Получение цвета + /// + /// Генератор случайных чисел + /// + 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; + } + + /// + /// Удаление объекта + /// + /// + /// + private void ButtonDelExcavator_Click(object sender, EventArgs e) + { + if (string.IsNullOrEmpty(maskedTextBox.Text) || _company == null) + { + return; + } + + if (MessageBox.Show("Удалить объект?", "Удаление", MessageBoxButtons.YesNo, MessageBoxIcon.Question) != DialogResult.Yes) + { + return; + } + + int pos = Convert.ToInt32(maskedTextBox.Text); + if (_company - pos != null) + { + MessageBox.Show("Объект удален"); + pictureBox.Image = _company.Show(); + } + else + { + MessageBox.Show("Не удалось удалить объект"); + } + } + + /// + /// Передача объекта в другую форму + /// + /// + /// + private void ButtonGoToCheck_Click(object sender, EventArgs e) + { + if (_company == null) + { + return; + } + + DrawningTrackedVehicle? trackedVehicle = null; + int counter = 100; + while (trackedVehicle == null) + { + trackedVehicle = _company.GetRandomObject(); + counter--; + if (counter <= 0) + { + break; + } + } + + if (trackedVehicle == null) + { + return; + } + + FormExcavator form = new() + { + SetTrackedVehicle = trackedVehicle + }; + form.ShowDialog(); + } + + /// + /// Перерисовка коллекции + /// + /// + /// + private void ButtonRefresh_Click(object sender, EventArgs e) + { + if (_company == null) + { + return; + } + + pictureBox.Image = _company.Show(); + } + +} \ No newline at end of file diff --git a/Excavator/Excavator/FormTrackedVehicleCollection.resx b/Excavator/Excavator/FormTrackedVehicleCollection.resx new file mode 100644 index 0000000..af32865 --- /dev/null +++ b/Excavator/Excavator/FormTrackedVehicleCollection.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 diff --git a/Excavator/Excavator/Program.cs b/Excavator/Excavator/Program.cs index 4f04208..f33af9d 100644 --- a/Excavator/Excavator/Program.cs +++ b/Excavator/Excavator/Program.cs @@ -11,7 +11,7 @@ namespace Excavator // To customize application configuration such as set high DPI settings or default font, // see https://aka.ms/applicationconfiguration. ApplicationConfiguration.Initialize(); - Application.Run(new FormExcavator()); + Application.Run(new FormTrackedVehicleCollection()); } } } \ No newline at end of file