/// <summary> /// Відбувається при видаленні рядків на вкладці Лінія /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void DataGridViewLine_UserDeletingRow(object sender, DataGridViewRowCancelEventArgs e) { // видаляємо із словника маркери які були виділені в таблиці for (int i = 0; i < dataGridViewLine.SelectedRows.Count; i++) { int numDel = int.Parse(dataGridViewLine.SelectedRows[i].HeaderCell.Value.ToString()); markerLine.LineDict.Remove(numDel); markerLine.LineBool.Remove(numDel); } // сортування (перезаписуємо словник для нормального добавляння елементів в кінець) markerLine.LineDict = markerLine.LineDict.ToDictionary(x => x.Key, y => y.Value); markerLine.LineBool = markerLine.LineBool.ToDictionary(x => x.Key, y => y.Value); // змінна яка вказує чи видалився відмічений рядок bool temp = false; // перевіряємо чи лишилися відмічені, якщо ні то чистимо вкладку Графік і таблиця foreach (bool i in markerLine.LineBool.Values) { temp |= i; } if (!temp) { GraphClear(); } // оновлюємо зображення PictureBoxLine.Refresh(); }
/// <summary> /// Очищення вкладки Лінія /// </summary> private void LineClear() { // Забороняємо малювати лінії markerLine.Dozvil = false; // повертаємося до першого маркера markNumLine = true; // чистимо список ліній і маркера markerLine.LineDict.Clear(); markerLine.LineBool.Clear(); markerLine.MarkerList.Clear(); // чистимо статусний рядок ClearStatusDown(); if (img.imageCorect != null) { // Міняємо курсор на вид очікування this.Cursor = Cursors.AppStarting; // Відображаємо картинку PictureBoxLine.Image = img.imageCorect; // оновлюємо таблицю маркерів TableShowLine(markerLine, img.imageCorect, dataGridViewLine); // Повертаємо курсор назад this.Cursor = Cursors.Default; } // чистимо графік і таблицю GraphClear(); // оновлення області для відобрадення маркера PictureBoxLine.Refresh(); }
/// <summary> /// Відбувається коли нажимається кнопка миши /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void PictureBoxLine_MouseDown(object sender, MouseEventArgs e) { // Керуємо відображенням курсора миші MouseForm(PictureBoxLine); // ліва кнопка миши if ((PictureBoxLine.Cursor == Cursors.Cross) && (e.Button == MouseButtons.Left)) { // проставлення похилої лінії (ctrl) // якщо true - то перший маркер, false - другий if (markNumLine) { // очищення markerLine.MarkerList.Clear(); // зберігаємо дані (тимчасового) розташування для першого маркера markerLine.MarkerList.Add(e.Location); // проставлення нихиленої лінії (перша точка) tempLine.Add(e.Location); // змінюємо на доступ до другого маркера markNumLine = false; // змінюємо дозвіл на додавання лінії markDozvilLine = false; } else { // перевірка точок на збіг if (!markerLine.MarkerList[0].Equals(e.Location)) { // проставлення нихиленої лінії (друга точка) tempLine.Add(e.Location); // очистка маркера markerLine.MarkerList.Clear(); // змінюємо на доступ до першого маркера markNumLine = true; // змінюємо дозвіл на додавання лінії markDozvilLine = true; } } // дозвіл на відображення маркерів markerLine.Dozvil = true; } else if ((PictureBoxLine.Cursor == Cursors.HSplit) && (e.Button == MouseButtons.Left)) { // проставлення горизонтальної лінії (shift) tempLine.Add(new Point[2] { new Point(0, e.Y), new Point(PictureBoxLine.Image.Width - 1, e.Y) }); // очистка маркера markerLine.MarkerList.Clear(); // змінюємо на доступ до першого маркера markNumLine = true; // змінюємо дозвіл на додавання лінії markDozvilLine = true; } else if ((PictureBoxLine.Cursor == Cursors.VSplit) && (e.Button == MouseButtons.Left)) { // проставлення вертикальної лінії (alt) tempLine.Add(new Point[2] { new Point(e.X, 0), new Point(e.X, PictureBoxLine.Image.Height - 1) }); // очистка маркера markerLine.MarkerList.Clear(); // змінюємо на доступ до першого маркера markNumLine = true; // змінюємо дозвіл на додавання лінії markDozvilLine = true; } // додавання лінії if (markDozvilLine) { // перевірка ліній if (markerLine.LineDict.Count > 0) { // в пам'яті наявно більше однієї лінії, перевіряємо чи наступна // не збігається координатами із попередніми foreach (PointSort i in markerLine.LineDict.Values) { if (!i.FirstP.Equals(tempLine.FirstP) && !i.SecondP.Equals(tempLine.SecondP)) { // якщо немає подібних то дозволяємо додавати лінію markDozvilLine = true; } else { // якщо хоч одна є, то забороняємо ставити і виходимо із циклу markDozvilLine = false; break; } } // якщо є дозвіл на збереження лінії, то зберігаємо її if (markDozvilLine) { markerLine.LineDict.Add(markerLine.LineDict.Last().Key + 1, tempLine); markerLine.LineBool.Add(markerLine.LineBool.Last().Key + 1, false); // змінюємо дозвіл на додавання лінії markDozvilLine = false; // виводимо відстань лінії toolStripStatusLabel3.Text = $"Відстань: " + DimentionLine(tempLine.FirstP, tempLine.SecondP).ToString("F2") + " [пікселів]"; } } else { // робоча область чиста, додаємо першу лінію markerLine.LineDict.Add(0, tempLine); markerLine.LineBool.Add(0, false); // змінюємо дозвіл на додавання лінії markDozvilLine = false; // виводимо відстань лінії toolStripStatusLabel3.Text = $"Відстань: " + DimentionLine(tempLine.FirstP, tempLine.SecondP).ToString("F2") + " [пікселів]"; } // дозвіл на відображення маркерів markerLine.Dozvil = true; // оновлюємо таблицю ліній if (img.imageCorect != null) { TableShowLine(markerLine, img.imageCorect, dataGridViewLine); } } // оновлення області для відобрадення маркера PictureBoxLine.Refresh(); // збереження координат мишки MouseSave(e, splitContainerLine.Panel1.AutoScrollPosition); }