// обработчик события при клике на размер void Controller_ClickOnDimension(UI_Dimension dim) { if (!isCreatingDimension) { UnPickIfChosed(); dim.Pick(); pickedDimensionList.Add(dim); chosedDimension = dim; switch (chosedDimension.tp) { case type.tech: dim.UC = TUC; TUC.SetUI_TD(dim as UI_TechDimension); break; case type.konstr: dim.UC = CUC; CUC.SetUI_CD(dim as UI_ConstrDimension); break; case type.pripusk: dim.UC = PUC; PUC.SetUI_PD(dim as UI_PripuskDimension); break; } rightStackPanel.Children.Add(dim.UC); foreach (Dimension d in dicDim_L[dicUI_Dim[dim]]) { dicDim_UI[d].Pick(); pickedDimensionList.Add(dicDim_UI[d]); } } }
// обработка события нажатия кнопки *Delete* по окну приложения void MainWindow_DelPressed() { if (chosedDimension != null) { rightStackPanel.Children.Clear(); chosedDimension.RemoveFromCanv(); graph.DeleteDimension(dicUI_Dim[chosedDimension]); dicDim_L.Remove(dicUI_Dim[chosedDimension]); // а в ReBuildAll() пересчитываются так же все зависимые размеры dicDim_UI.Remove(dicUI_Dim[chosedDimension]); dicUI_Dim.Remove(chosedDimension); listOfDimensions.Remove(chosedDimension); ReBuildAll(); // пересчитываем все замыкающие звенья if (chosedDimension.tp == type.tech) // перепроверяем на наличие цикла { if (graph.isCicle) { window.lblStateCicle.Content = "Размерная цепь замкнута!"; } else { window.lblStateCicle.Content = ""; } } chosedDimension = null; UnPickIfChosed(); } }
public UI_Dimension_Save(UI_Dimension dim) { firstElX = dim.firstElX; firstElY = dim.firstElY; secondElX = dim.secondElX; secondElY = dim.secondElY; mainLineY = dim.mainLine.Y1; }
// отмена выбора размера private void UnPickIfChosed() { foreach (UI_Dimension UId in pickedDimensionList) { UId.Unpick(); } pickedDimensionList.Clear(); if (chosedDimension != null) { rightStackPanel.Children.Clear(); chosedDimension.Unchoose(); chosedDimension = null; } }
//------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ /// <summary> /// Создание технологического размера /// </summary> public void NewTechDimension() { if (!isCreatingDimension) { foreach (UIElement UI in leftStackPanel.Children) { UI.IsEnabled = false; } isCreatingDimension = true; UnPickIfChosed(); UI_Dimension newDim = new UI_TechDimension(TUC); creatingDimAtThisMoment = newDim; (newDim as UI_TechDimension).TechDimensionApdatedEvent += new UI_TechDimension.TechDimensionApdatedEventHandler(Controller_TechDimensionApdated); // подписываемся на событие изменения нового размера } }
/// <summary> /// Создание конструкторского размера /// </summary> public void NewConstr() { if (!isCreatingDimension) { foreach (UIElement UI in leftStackPanel.Children) { UI.IsEnabled = false; } isCreatingDimension = true; UnPickIfChosed(); UI_Dimension newDim = new UI_ConstrDimension(CUC); creatingDimAtThisMoment = newDim; (newDim as UI_ConstrDimension).ConstrApdatedEvent += new UI_ConstrDimension.ConstrApdatedEventHandler(Controller_ConstrApdated); // подписываем новый размер на событие изменения } }
// размещение размерной линии - окончательный выбор точки размещения - нажатие ЛКМ private void canv_MouseLeftButtonDownMainLine(object sender, MouseButtonEventArgs e) { ArrowsAdjustment(); waitMainLine = false; firstEllipse.Fill = Brushes.Black; secondEllipse.Fill = Brushes.Black; firstEllipse.MouseMove += new MouseEventHandler(Ellipse_MouseMove); secondEllipse.MouseMove += new MouseEventHandler(Ellipse_MouseMove); SetUpDownLbls(); temporaryUI = null; lblNominal.MouseLeftButtonDown += new MouseButtonEventHandler(lblNominal_MouseLeftButtonDown); // подписываемся на событие нажатия ЛКМ по метке с номиналом - выбор размера lblClickedOtherPodpiska(); // подписка на событие нажатия ЛКМ по остальным лейблам в наследованых классах Unchoose(); // отменяем выбор размера DimensionCreated(this); // вызываем событие: размер создан }
/// <summary> /// Обработка события при изменении конструкторского размера пользователем (желаемого пользователем максимума или минимума) /// </summary> /// <param name="dim"></param> void Controller_ConstrApdated(UI_Dimension dim) { if (dim.lblNominal.Content.ToString() != "?") { double _max = Double.Parse(dim.lblNominal.Content.ToString()) + Double.Parse(dim.lblUp.Content.ToString()); double _min = Double.Parse(dim.lblNominal.Content.ToString()) + Double.Parse(dim.lblDown.Content.ToString()); if (_max > (dim as UI_ConstrDimension).max || _min < (dim as UI_ConstrDimension).min) { (dim as UI_ConstrDimension).Alarm(); } else { (dim as UI_ConstrDimension).NotAlarm(); } } }
// создание нового проекта - удаление всего с канваса и обнуление void MainWindow_NewProj() { MainWindow_EscPressed(); // если вдруг в этот момент создаётся размер canv.Children.Clear(); //canv.Children.Add(new Line()); rightStackPanel.Children.Clear(); graph = new Graph(); listOfDimensions.Clear(); // список всех размеров dicUI_Dim.Clear(); // словарь: визуальный размер -> размер dicDim_UI.Clear(); // словарь: размер -> визуальный размер isCreatingDimension = false; chosedDimension = null; window.SetSaveEnable(false); window.Title = "Автоматический рассчёт размерных цепей"; }
// обработка события нажатия кнопки ESC - отмена создания размера void MainWindow_EscPressed() { if (creatingDimAtThisMoment != null) { rightStackPanel.Children.Clear(); creatingDimAtThisMoment.OtpiskaWhenCreate(); creatingDimAtThisMoment.RemoveFromCanv(); foreach (UIElement UI in leftStackPanel.Children) { UI.IsEnabled = true; } creatingDimAtThisMoment = null; isCreatingDimension = false; UI_Dimension.temporaryUI = null; } }
// создаём первую точку размера в момент первого нажатия ЛКМ по канвасу protected void canv_MouseLeftButtonDownFirstEllipse(object sender, MouseButtonEventArgs e) { //MainWindow.testTB.AppendText(Controller.n.ToString()+".1 "); firstElX = e.MouseDevice.GetPosition(canv).X; firstElY = e.MouseDevice.GetPosition(canv).Y; // проверка привязки к существующим размерам foreach (UI_Dimension d in listOfDimensions) { if (Distance(firstElX, firstElY, d.firstElX, d.firstElY) < minDistToSnap) { firstElX = d.firstElX; firstElY = d.firstElY; break; } if (Distance(firstElX, firstElY, d.secondElX, d.secondElY) < minDistToSnap) { firstElX = d.secondElX; firstElY = d.secondElY; break; } } Canvas.SetTop(firstEllipse, firstElY - radius); Canvas.SetLeft(firstEllipse, firstElX - radius); canv.Children.Add(firstEllipse); canv.Children.Add(secondEllipse); canv.Children.Add(mainLine); canv.Children.Add(firstLine); canv.Children.Add(secondLine); canv.Children.Add(firstArrowUp); canv.Children.Add(firstArrowDown); canv.Children.Add(secondArrowUp); canv.Children.Add(secondArrowDown); canv.Children.Add(lblNominal); canv.Children.Add(lblUp); canv.Children.Add(lblDown); temporaryUI = this; canv.MouseMove += MouseMoveSecondEllipse; canv.MouseLeftButtonDown += MouseLeftButtonDownSecondEllipse; canv.MouseLeftButtonDown -= MouseLeftButtonDownFirstEllipse; }
void MainWindow_OpenSaved() { OpenFileDialog OFD = new OpenFileDialog(); OFD.Filter = "*.dch|*.dch"; OFD.ShowDialog(); fileName = OFD.FileName; if (fileName == "") { MessageBox.Show("Файл не выбран!"); return; } try { FileStream fs = new FileStream(fileName, FileMode.Open); BinaryFormatter bf = new BinaryFormatter(); Save save = (Save)bf.Deserialize(fs); fs.Close(); MainWindow_EscPressed(); // если вдруг в этот момент создаётся размер window.SetSaveEnable(true); window.Title = "Автоматический рассчёт размерных цепей - " + fileName; canv.Children.Clear(); rightStackPanel.Children.Clear(); this.graph = save.graph; listOfDimensions.Clear(); // список всех размеров dicUI_Dim.Clear(); // словарь: визуальный размер -> размер dicDim_UI.Clear(); // словарь: размер -> визуальный размер isCreatingDimension = false; chosedDimension = null; creatingDimAtThisMoment = null; foreach (UI_Dimension_Save UIDSaved in save.dic_UISave_Dim.Keys) { UI_Dimension newUIDim = null; switch (UIDSaved.typ) { case type.tech: newUIDim = new UI_TechDimension(UIDSaved); (newUIDim as UI_TechDimension).TechDimensionApdatedEvent += new UI_TechDimension.TechDimensionApdatedEventHandler(Controller_TechDimensionApdated); break; case type.pripusk: newUIDim = new UI_PripuskDimension(UIDSaved); (newUIDim as UI_PripuskDimension).PripuskApdatedEvent += new UI_PripuskDimension.PripuskApdatedEventHandler(Controller_PripuskApdated); break; case type.konstr: newUIDim = new UI_ConstrDimension(UIDSaved); (newUIDim as UI_ConstrDimension).ConstrApdatedEvent += new UI_ConstrDimension.ConstrApdatedEventHandler(Controller_ConstrApdated); break; } newUIDim.dimensionClicked += new UI_Dimension.dimensionClickedEventHandler(Controller_ClickOnDimension); newUIDim.lblClickedOtherPodpiska(); listOfDimensions.Add(newUIDim); dicUI_Dim.Add(newUIDim, save.dic_UISave_Dim[UIDSaved]); dicDim_UI.Add(save.dic_UISave_Dim[UIDSaved], newUIDim); } ReBuildAll(); if (graph.isCicle) { window.lblStateCicle.Content = "Размерная цепь замкнута!"; } else { window.lblStateCicle.Content = ""; } } catch (Exception ex) { MessageBox.Show(ex.Message); } }
/// <summary> /// обработчик события при завершении создании размера /// </summary> /// <param name="dim">созданный размер</param> private void newDim_DimensionCreated(UI_Dimension dim) { rightStackPanel.Children.Clear(); // удаление юзерконтрола, привязанного к размеру с правой панели creatingDimAtThisMoment = null; // в настоящий момент ничего не создаётся dim.dimensionClicked += new UI_Dimension.dimensionClickedEventHandler(Controller_ClickOnDimension); // подписываемся на событие клика по размеру Vertex v1 = graph.CreateVertex(); Vertex v2 = graph.CreateVertex(); // смотрим, совпадают ли концы размерной линии с имеющимися размерами, если да - создаём нулевую связку размеров foreach (UI_Dimension UI_Dim in listOfDimensions) { if (dim.firstElX == UI_Dim.firstElX) { graph.CreateNul(v1, dicUI_Dim[UI_Dim].firstVertex); } if (dim.firstElX == UI_Dim.secondElX) { graph.CreateNul(v1, dicUI_Dim[UI_Dim].secondVertex); } if (dim.secondElX == UI_Dim.firstElX) { graph.CreateNul(v2, dicUI_Dim[UI_Dim].firstVertex); } if (dim.secondElX == UI_Dim.secondElX) { graph.CreateNul(v2, dicUI_Dim[UI_Dim].secondVertex); } } /*Vertex v1 = null; * Vertex v2 = null; * // смотрим, совпадают ли концы размерной линии с имеющимися размерами, если да - создаём нулевую связку размеров * if (listOfDimensions.Count == 0) * { * v1 = graph.CreateVertex(); * v2 = graph.CreateVertex(); * } * else * { * foreach (UI_Dimension UI_Dim in listOfDimensions) * { * if (dim.firstElX == UI_Dim.firstElX) * v1 = dicUI_Dim[UI_Dim].firstVertex; * else * { * if (dim.firstElX == UI_Dim.secondElX) * v1 = dicUI_Dim[UI_Dim].secondVertex; * else * v1 = graph.CreateVertex(); * } * if (dim.secondElX == UI_Dim.firstElX) * v2 = dicUI_Dim[UI_Dim].firstVertex; * else * { * if (dim.secondElX == UI_Dim.secondElX) * v2 = dicUI_Dim[UI_Dim].secondVertex; * else * v2 = graph.CreateVertex(); * } * } * }*/ // создаём сам размер в модели и список его размерной цепи, если это конструкторский р-р или припуск Dimension dimension = null; switch (dim.tp) { case type.tech: dimension = graph.CreateTechDimension(v1, v2, new Value(dim.nominal, dim.up, dim.down)); break; case type.pripusk: dimension = graph.CreateClosingLink(v1, v2, type.pripusk); break; case type.konstr: dimension = graph.CreateClosingLink(v1, v2, type.konstr); break; } dicDim_L.Add(dimension, new List <Dimension>()); listOfDimensions.Add(dim); dicUI_Dim.Add(dim, dimension); dicDim_UI.Add(dimension, dim); ReBuildAll(); // пересчитываем все замыкающие звенья foreach (UIElement UI in leftStackPanel.Children) // открываем все кнопки на левой панели { UI.IsEnabled = true; } isCreatingDimension = false; // размер больше не создаётся // проверяем на наличие цикла if (dim.tp == type.tech) { if (graph.isCicle) { window.lblStateCicle.Content = "Размерная цепь замкнута!"; } else { window.lblStateCicle.Content = ""; } } }