From 219fd8b30d1b1cd17b696d23f9debfed9e1666ff Mon Sep 17 00:00:00 2001 From: asoc1al Date: Sat, 30 Dec 2023 12:17:18 +0400 Subject: [PATCH] lab4 --- DumpTruck/DumpTruck/DrawningDumpTruck.cs | 1 - DumpTruck/DumpTruck/FormDumpTruck.Designer.cs | 12 +- .../DumpTruck/FormTruckCollection.Designer.cs | 73 ++++++++++- DumpTruck/DumpTruck/FormTruckCollection.cs | 113 ++++++++++++++++-- ...pTruck.csproj => Project_DumpTruck.csproj} | 0 DumpTruck/DumpTruck/SetGeneric.cs | 86 +++++++------ .../DumpTruck/TrucksGenericCollection.cs | 6 +- DumpTruck/DumpTruck/TrucksGenericStorage.cs | 76 ++++++++++++ 8 files changed, 305 insertions(+), 62 deletions(-) rename DumpTruck/DumpTruck/{DumpTruck.csproj => Project_DumpTruck.csproj} (100%) create mode 100644 DumpTruck/DumpTruck/TrucksGenericStorage.cs diff --git a/DumpTruck/DumpTruck/DrawningDumpTruck.cs b/DumpTruck/DumpTruck/DrawningDumpTruck.cs index 64e5158..1c071ab 100644 --- a/DumpTruck/DumpTruck/DrawningDumpTruck.cs +++ b/DumpTruck/DumpTruck/DrawningDumpTruck.cs @@ -3,7 +3,6 @@ using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; -using DumpTruck.DrawningObjects; using DumpTruck.Entities; namespace DumpTruck.DrawningObjects diff --git a/DumpTruck/DumpTruck/FormDumpTruck.Designer.cs b/DumpTruck/DumpTruck/FormDumpTruck.Designer.cs index 95ed775..e7ee6ab 100644 --- a/DumpTruck/DumpTruck/FormDumpTruck.Designer.cs +++ b/DumpTruck/DumpTruck/FormDumpTruck.Designer.cs @@ -65,7 +65,7 @@ // buttonLeft // buttonLeft.Anchor = AnchorStyles.Bottom | AnchorStyles.Right; - buttonLeft.BackgroundImage = Properties.Resources.arrowLeft; + //buttonLeft.BackgroundImage = Properties.Resources.arrowLeft; buttonLeft.BackgroundImageLayout = ImageLayout.Zoom; buttonLeft.Location = new Point(770, 426); buttonLeft.Name = "buttonLeft"; @@ -77,7 +77,7 @@ // buttonUp // buttonUp.Anchor = AnchorStyles.Bottom | AnchorStyles.Right; - buttonUp.BackgroundImage = Properties.Resources.arrowUp; + //buttonUp.BackgroundImage = Properties.Resources.arrowUp; buttonUp.BackgroundImageLayout = ImageLayout.Zoom; buttonUp.Location = new Point(806, 390); buttonUp.Name = "buttonUp"; @@ -89,7 +89,7 @@ // buttonDown // buttonDown.Anchor = AnchorStyles.Bottom | AnchorStyles.Right; - buttonDown.BackgroundImage = Properties.Resources.arrowDown; + //buttonDown.BackgroundImage = Properties.Resources.arrowDown; buttonDown.BackgroundImageLayout = ImageLayout.Zoom; buttonDown.Location = new Point(806, 426); buttonDown.Name = "buttonDown"; @@ -101,7 +101,7 @@ // buttonRight // buttonRight.Anchor = AnchorStyles.Bottom | AnchorStyles.Right; - buttonRight.BackgroundImage = Properties.Resources.arrowRight; + //buttonRight.BackgroundImage = Properties.Resources.arrowRight; buttonRight.BackgroundImageLayout = ImageLayout.Zoom; buttonRight.Location = new Point(842, 426); buttonRight.Name = "buttonRight"; @@ -145,9 +145,9 @@ // // buttonSelectTruck // - buttonSelectTruck.Location = new Point(12, 357); + buttonSelectTruck.Location = new Point(249, 406); buttonSelectTruck.Name = "buttonSelectTruck"; - buttonSelectTruck.Size = new Size(231, 43); + buttonSelectTruck.Size = new Size(110, 43); buttonSelectTruck.TabIndex = 9; buttonSelectTruck.Text = "Выбрать"; buttonSelectTruck.UseVisualStyleBackColor = true; diff --git a/DumpTruck/DumpTruck/FormTruckCollection.Designer.cs b/DumpTruck/DumpTruck/FormTruckCollection.Designer.cs index a41becd..e52c84f 100644 --- a/DumpTruck/DumpTruck/FormTruckCollection.Designer.cs +++ b/DumpTruck/DumpTruck/FormTruckCollection.Designer.cs @@ -29,17 +29,24 @@ private void InitializeComponent() { groupBox1 = new GroupBox(); + groupBoxStorage = new GroupBox(); + textBoxStorageName = new TextBox(); + buttonDelObject = new Button(); + listBoxStorages = new ListBox(); + buttonAddObject = new Button(); maskedTextBoxNumber = new MaskedTextBox(); buttonRefreshCollection = new Button(); buttonRemoveTruck = new Button(); buttonAddTruck = new Button(); pictureBoxCollection = new PictureBox(); groupBox1.SuspendLayout(); + groupBoxStorage.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)pictureBoxCollection).BeginInit(); SuspendLayout(); // // groupBox1 // + groupBox1.Controls.Add(groupBoxStorage); groupBox1.Controls.Add(maskedTextBoxNumber); groupBox1.Controls.Add(buttonRefreshCollection); groupBox1.Controls.Add(buttonRemoveTruck); @@ -50,18 +57,67 @@ groupBox1.TabIndex = 0; groupBox1.TabStop = false; groupBox1.Text = "Инструменты"; - groupBox1.Enter += groupBox1_Enter; + // + // groupBoxStorage + // + groupBoxStorage.Controls.Add(textBoxStorageName); + groupBoxStorage.Controls.Add(buttonDelObject); + groupBoxStorage.Controls.Add(listBoxStorages); + groupBoxStorage.Controls.Add(buttonAddObject); + groupBoxStorage.Location = new Point(6, 22); + groupBoxStorage.Name = "groupBoxStorage"; + groupBoxStorage.Size = new Size(188, 219); + groupBoxStorage.TabIndex = 5; + groupBoxStorage.TabStop = false; + groupBoxStorage.Text = "Наборы"; + // + // textBoxStorageName + // + textBoxStorageName.Location = new Point(6, 22); + textBoxStorageName.Name = "textBoxStorageName"; + textBoxStorageName.Size = new Size(176, 23); + textBoxStorageName.TabIndex = 5; + // + // buttonDelObject + // + buttonDelObject.Location = new Point(6, 190); + buttonDelObject.Name = "buttonDelObject"; + buttonDelObject.Size = new Size(176, 23); + buttonDelObject.TabIndex = 4; + buttonDelObject.Text = "Удалить набор"; + buttonDelObject.UseVisualStyleBackColor = true; + buttonDelObject.Click += buttonDelObject_Click; + // + // listBoxStorages + // + listBoxStorages.FormattingEnabled = true; + listBoxStorages.ItemHeight = 15; + listBoxStorages.Location = new Point(6, 80); + listBoxStorages.Name = "listBoxStorages"; + listBoxStorages.Size = new Size(176, 94); + listBoxStorages.TabIndex = 3; + listBoxStorages.SelectedIndexChanged += listBoxStorages_SelectedIndexChanged; + // + // buttonAddObject + // + buttonAddObject.Location = new Point(6, 51); + buttonAddObject.Name = "buttonAddObject"; + buttonAddObject.Size = new Size(176, 23); + buttonAddObject.TabIndex = 2; + buttonAddObject.Text = "Добавить набор"; + buttonAddObject.UseVisualStyleBackColor = true; + buttonAddObject.Click += buttonAddObject_Click; // // maskedTextBoxNumber // - maskedTextBoxNumber.Location = new Point(52, 166); + maskedTextBoxNumber.Location = new Point(52, 284); maskedTextBoxNumber.Name = "maskedTextBoxNumber"; maskedTextBoxNumber.Size = new Size(100, 23); maskedTextBoxNumber.TabIndex = 4; // // buttonRefreshCollection // - buttonRefreshCollection.Location = new Point(6, 382); + buttonRefreshCollection.Location = new Point(6, 387); buttonRefreshCollection.Name = "buttonRefreshCollection"; buttonRefreshCollection.Size = new Size(188, 33); buttonRefreshCollection.TabIndex = 3; @@ -71,7 +127,7 @@ // // buttonRemoveTruck // - buttonRemoveTruck.Location = new Point(6, 195); + buttonRemoveTruck.Location = new Point(6, 313); buttonRemoveTruck.Name = "buttonRemoveTruck"; buttonRemoveTruck.Size = new Size(188, 34); buttonRemoveTruck.TabIndex = 2; @@ -81,7 +137,7 @@ // // buttonAddTruck // - buttonAddTruck.Location = new Point(6, 22); + buttonAddTruck.Location = new Point(6, 247); buttonAddTruck.Name = "buttonAddTruck"; buttonAddTruck.Size = new Size(188, 31); buttonAddTruck.TabIndex = 1; @@ -108,6 +164,8 @@ Text = "Набор грузовиков"; groupBox1.ResumeLayout(false); groupBox1.PerformLayout(); + groupBoxStorage.ResumeLayout(false); + groupBoxStorage.PerformLayout(); ((System.ComponentModel.ISupportInitialize)pictureBoxCollection).EndInit(); ResumeLayout(false); } @@ -120,5 +178,10 @@ private Button buttonRefreshCollection; private PictureBox pictureBoxCollection; private MaskedTextBox maskedTextBoxNumber; + private GroupBox groupBoxStorage; + private Button buttonDelObject; + private ListBox listBoxStorages; + private Button buttonAddObject; + private TextBox textBoxStorageName; } } \ No newline at end of file diff --git a/DumpTruck/DumpTruck/FormTruckCollection.cs b/DumpTruck/DumpTruck/FormTruckCollection.cs index 918e530..ff7aa65 100644 --- a/DumpTruck/DumpTruck/FormTruckCollection.cs +++ b/DumpTruck/DumpTruck/FormTruckCollection.cs @@ -19,43 +19,88 @@ namespace DumpTruck /// /// Набор объектов /// - private readonly TrucksGenericCollection _trucks; + private readonly TrucksGenericStorage _storage; + public FormTruckCollection() { InitializeComponent(); - _trucks = new TrucksGenericCollection(pictureBoxCollection.Width, pictureBoxCollection.Height); + _storage = new TrucksGenericStorage(pictureBoxCollection.Width, pictureBoxCollection.Height); } + /// + /// Заполнение listBoxObjects + /// + private void ReloadObjects() + { + int index = listBoxStorages.SelectedIndex; + listBoxStorages.Items.Clear(); + for (int i = 0; i < _storage.Keys.Count; i++) + { + listBoxStorages.Items.Add(_storage.Keys[i]); + } + if (listBoxStorages.Items.Count > 0 && (index == -1 || index + >= listBoxStorages.Items.Count)) + { + listBoxStorages.SelectedIndex = 0; + } + else if (listBoxStorages.Items.Count > 0 && index > -1 && + index < listBoxStorages.Items.Count) + { + listBoxStorages.SelectedIndex = index; + } + } + + private void buttonAddTruck_Click(object sender, EventArgs e) { + if (listBoxStorages.SelectedIndex == -1) + { + return; + } + var obj = _storage[listBoxStorages.SelectedItem.ToString() ?? + string.Empty]; + if (obj == null) + { + return; + } FormDumpTruck form = new(); if (form.ShowDialog() == DialogResult.OK) { - if (_trucks + form.selectedTruck != -1) + if (obj + form.selectedTruck != -1) { MessageBox.Show("Объект добавлен"); - pictureBoxCollection.Image = _trucks.ShowTrucks(); + pictureBoxCollection.Image = obj.ShowTrucks(); } else { MessageBox.Show("Не удалось добавить объект"); } } - } private void buttonRemoveTruck_Click(object sender, EventArgs e) { - if (MessageBox.Show("Удалить объект?", "Удаление", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No) + if (listBoxStorages.SelectedIndex == -1) + { + return; + } + var obj = _storage[listBoxStorages.SelectedItem.ToString() ?? + string.Empty]; + if (obj == null) + { + return; + } + if (MessageBox.Show("Удалить объект?", "Удаление", + MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No) { return; } int pos = Convert.ToInt32(maskedTextBoxNumber.Text); - if (_trucks - pos) + if (obj - pos) { MessageBox.Show("Объект удален"); - pictureBoxCollection.Image = _trucks.ShowTrucks(); + pictureBoxCollection.Image = obj.ShowTrucks(); } else { @@ -66,12 +111,60 @@ namespace DumpTruck private void buttonRefreshCollection_Click(object sender, EventArgs e) { - pictureBoxCollection.Image = _trucks.ShowTrucks(); + if (listBoxStorages.SelectedIndex == -1) + { + return; + } + var obj = _storage[listBoxStorages.SelectedItem.ToString() ?? + string.Empty]; + if (obj == null) + { + return; + } + pictureBoxCollection.Image = obj.ShowTrucks(); } - private void groupBox1_Enter(object sender, EventArgs e) + private void buttonAddObject_Click(object sender, EventArgs e) { + if (string.IsNullOrEmpty(textBoxStorageName.Text)) + { + MessageBox.Show("Не все данные заполнены", "Ошибка", + MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + _storage.AddSet(textBoxStorageName.Text); + ReloadObjects(); + } + /// + /// Выбор набора + /// + /// + /// + private void listBoxStorages_SelectedIndexChanged(object sender, + EventArgs e) + { + pictureBoxCollection.Image = + _storage[listBoxStorages.SelectedItem?.ToString() ?? string.Empty]?.ShowTrucks(); + } + /// + /// Удаление набора + /// + /// + /// + private void buttonDelObject_Click(object sender, EventArgs e) + { + if (listBoxStorages.SelectedIndex == -1) + { + return; + } + if (MessageBox.Show($"Удалить объект {listBoxStorages.SelectedItem}?", "Удаление", MessageBoxButtons.YesNo, + MessageBoxIcon.Question) == DialogResult.Yes) + { + _storage.DelSet(listBoxStorages.SelectedItem.ToString() + ?? string.Empty); + ReloadObjects(); + } } } } diff --git a/DumpTruck/DumpTruck/DumpTruck.csproj b/DumpTruck/DumpTruck/Project_DumpTruck.csproj similarity index 100% rename from DumpTruck/DumpTruck/DumpTruck.csproj rename to DumpTruck/DumpTruck/Project_DumpTruck.csproj diff --git a/DumpTruck/DumpTruck/SetGeneric.cs b/DumpTruck/DumpTruck/SetGeneric.cs index cdfe2c4..a4388f9 100644 --- a/DumpTruck/DumpTruck/SetGeneric.cs +++ b/DumpTruck/DumpTruck/SetGeneric.cs @@ -17,18 +17,23 @@ namespace DumpTruck.Generics /// /// Массив объектов, которые храним /// - private readonly T?[] _places; + private readonly List _places; /// /// Количество объектов в массиве /// - public int Count => _places.Length; + public int Count => _places.Count; + /// + /// Максимальное количество объектов в списке + /// + private readonly int _maxCount; /// /// Конструктор /// /// public SetGeneric(int count) { - _places = new T?[count]; + _maxCount = count; + _places = new List(count); } /// /// Добавление объекта в набор @@ -47,39 +52,13 @@ namespace DumpTruck.Generics /// public int Insert(T truck, int position) { - // TODO проверка позиции - if (position < 0 || position > Count) + // Проверка позиции + if (position < 0 || position >= _maxCount) { return -1; } - // TODO проверка, что элемент массива по этой позиции пустой, если нет, то - if (_places[position] != null) - { - // проверка, что после вставляемого элемента в массиве есть пустой элемент - int nullIndex = -1; - for (int i = position + 1; i < Count; i++) - { - if (_places[i] == null) - { - nullIndex = i; - break; - } - } - // Если пустого элемента нет, то выходим - if (nullIndex < 0) - { - return -1; - } - // сдвиг всех объектов, находящихся справа от позиции до первого пустого элемента - int j = nullIndex - 1; - while (j >= position) - { - _places[j + 1] = _places[j]; - j--; - } - } - // TODO вставка по позиции - _places[position] = truck; + // Вставка по позиции + _places.Insert(position, truck); return position; } /// @@ -100,11 +79,44 @@ namespace DumpTruck.Generics /// /// /// - public T? Get(int position) + public T? this[int position] { - // TODO проверка позиции - if ((position < 0) || (position > Count)) return null; - return _places[position]; + get + { + // Проверка позиции + if (position < 0 || position >= Count) + { + return null; + } + return _places[position]; + } + set + { + // Проверка позиции + // Проверка свободных мест в списке + if (position < 0 || position >= _maxCount || Count == _maxCount) + { + return; + } + // Вставка в список по позиции + _places.Insert(position, value); + } } + /// + /// Проход по списку + /// + /// + public IEnumerable GetTrucks(int? maxTrucks = null) + { + for (int i = 0; i < _places.Count; ++i) + { + yield return _places[i]; + if (maxTrucks.HasValue && i == maxTrucks.Value) + { + yield break; + } + } + } + } } diff --git a/DumpTruck/DumpTruck/TrucksGenericCollection.cs b/DumpTruck/DumpTruck/TrucksGenericCollection.cs index 5ed60fe..4ad65bf 100644 --- a/DumpTruck/DumpTruck/TrucksGenericCollection.cs +++ b/DumpTruck/DumpTruck/TrucksGenericCollection.cs @@ -68,7 +68,7 @@ namespace DumpTruck.Generics /// public static bool operator -(TrucksGenericCollection collect, int pos) { - T? obj = collect._collection.Get(pos); + T? obj = collect._collection[pos]; if (obj != null) { return collect._collection.Remove(pos); @@ -82,7 +82,7 @@ namespace DumpTruck.Generics /// public U? GetU(int pos) { - return (U?)_collection.Get(pos)?.GetMoveableObject; + return (U?)_collection[pos]?.GetMoveableObject; } /// /// Вывод всего набора объектов @@ -129,7 +129,7 @@ namespace DumpTruck.Generics // TODO получение объекта // TODO установка позиции // TODO прорисовка объекта - DrawningTruck? truck = _collection.Get(i); + DrawningTruck? truck = _collection[i]; if (truck == null) continue; truck.SetPosition(i % width * _placeSizeWidth, i / width * _placeSizeHeight); diff --git a/DumpTruck/DumpTruck/TrucksGenericStorage.cs b/DumpTruck/DumpTruck/TrucksGenericStorage.cs new file mode 100644 index 0000000..2c43a2c --- /dev/null +++ b/DumpTruck/DumpTruck/TrucksGenericStorage.cs @@ -0,0 +1,76 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using DumpTruck.DrawningObjects; +using DumpTruck.MovementStrategy; + +namespace DumpTruck.Generics +{ + internal class TrucksGenericStorage + { + /// + /// Словарь (хранилище) + /// + readonly Dictionary> _truckStorages; + /// + /// Возвращение списка названий наборов + /// + public List Keys => _truckStorages.Keys.ToList(); + /// + /// Ширина окна отрисовки + /// + private readonly int _pictureWidth; + /// + /// Высота окна отрисовки + /// + private readonly int _pictureHeight; + /// + /// Конструктор + /// + /// + /// /// + public TrucksGenericStorage(int pictureWidth, int pictureHeight) + { + _truckStorages = new Dictionary>(); + _pictureWidth = pictureWidth; + _pictureHeight = pictureHeight; + } + /// + /// Добавление набора + /// + /// Название набора + public void AddSet(string name) + { + // TODO Прописать логику для добавления + _truckStorages.Add(name, new TrucksGenericCollection(_pictureWidth, _pictureHeight)); + } + /// + /// Удаление набора + /// + /// Название набора + public void DelSet(string name) + { + // TODO Прописать логику для удаления + if (_truckStorages.ContainsKey(name)) + _truckStorages.Remove(name); + } + /// + /// Доступ к набору + /// + /// + /// + public TrucksGenericCollection? this[string ind] + { + get + { + // TODO Продумать логику получения набора + if (_truckStorages.ContainsKey(ind)) + return _truckStorages[ind]; + return null; + } + } + + } +}