private void LoadExperimentGraph(XElement root, LoopControl loop = null) { if (loop == null) NewExperiment(); else { loop.LoopBody = new ExperimentGraph(); loop.Canvas.Children.Clear(); } foreach (XElement node in root.Element("nodes").Elements("node")) { BaseNodeControl nodeControl; switch (node.Attribute("type").Value) { case "init": nodeControl = new InitNodeControl() { CornerRadius = new CornerRadius(10) }; (nodeControl as InitNodeControl).InitPath = node.Element("initpath").Value; (nodeControl as NodeControl).NodeName = "Инициализация"; (nodeControl as NodeControl).SettingsButtonClick += initNode_SettingsButtonClick; break; case "runprocess": nodeControl = new RunProcessNodeControl() { CornerRadius = new CornerRadius(10) }; (nodeControl as RunProcessNodeControl).ProcessName = node.Element("processname").Value; (nodeControl as NodeControl).NodeName = "Запуск приложения"; (nodeControl as NodeControl).SettingsButtonClick += exportNode_SettingsButtonClick; break; case "algorithm": nodeControl = new AlgorithmNodeControl(); (nodeControl as AlgorithmNodeControl).InitPath = node.Element("initpath").Value; (nodeControl as AlgorithmNodeControl).AlgorithmType = HydrologyCore.AlgorithmTypes[node.Element("algorithmtype").Value]; (nodeControl as AlgorithmNodeControl).VarLoop = new Dictionary<string, LoopControl>(); var varNames = new Dictionary<string, LoopControl>(); LoopControl p = loop; while (p != null) { varNames.Add(p.VarName, p); p = p.PreviousLoop; } DataTable paramTable = new DataTable(); paramTable.Columns.Add("Name"); paramTable.Columns.Add("Value"); foreach (XElement param in node.Element("params").Elements("param")) { DataRow row = paramTable.NewRow(); row["Name"] = param.Attribute("name").Value; row["Value"] = param.Attribute("value").Value; paramTable.Rows.Add(row); if (row["Value"].ToString()[0] == '{') { string varName = row["Value"].ToString(); varName = varName.Trim(' ', '{', '}'); if (varNames.Keys.Contains(varName)) { (nodeControl as AlgorithmNodeControl).VarLoop.Add(row["Name"].ToString(), varNames[varName]); } } } (nodeControl as AlgorithmNodeControl).ParamsTable = paramTable; var attr = (nodeControl as AlgorithmNodeControl).AlgorithmType.GetCustomAttribute(typeof(NameAttribute)) as NameAttribute; (nodeControl as NodeControl).NodeName = attr.Name; (nodeControl as NodeControl).SettingsButtonClick += node_SettingsClicked; break; case "loopstart": nodeControl = new StartLoopNodeControl() { Width = 30, Height = 30 }; break; case "loop": nodeControl = new LoopControl(this) { PreviousLoop = loop }; (nodeControl as LoopControl).VarName = node.Element("loopparams").Attribute("varname").Value; (nodeControl as LoopControl).StartValue = double.Parse(node.Element("loopparams").Attribute("start").Value, CultureInfo.InvariantCulture); (nodeControl as LoopControl).EndValue = double.Parse(node.Element("loopparams").Attribute("end").Value, CultureInfo.InvariantCulture); (nodeControl as LoopControl).Step = double.Parse(node.Element("loopparams").Attribute("step").Value, CultureInfo.InvariantCulture); LoadExperimentGraph(node.Element("loopbody"), nodeControl as LoopControl); break; default: nodeControl = new NodeControl(); break; } if (!(nodeControl is StartLoopNodeControl)) nodeControl.Style = (Style)this.FindResource("NodeStyle"); nodeControl.MouseLeftButtonDown += node_MouseLeftButtonDown; nodeControl.MouseLeftButtonUp += node_MouseLeftButtonUp; nodeControl.MouseMove += node_MouseMove; nodeControl.LostMouseCapture += node_LostMouseCapture; Canvas.SetLeft(nodeControl, double.Parse(node.Attribute("x").Value, CultureInfo.InvariantCulture)); Canvas.SetTop(nodeControl, double.Parse(node.Attribute("y").Value, CultureInfo.InvariantCulture)); if (loop == null) { Canvas.Children.Add(nodeControl); experimentGraph.Nodes.Add(nodeControl); } else { loop.Canvas.Children.Add(nodeControl); loop.LoopBody.Nodes.Add(nodeControl); } } if (loop == null) { Canvas.UpdateLayout(); } else { loop.Canvas.UpdateLayout(); } foreach (XElement arrow in root.Element("arrows").Elements("arrow")) { Arrow arr; if (loop == null) { arr = new Arrow( experimentGraph.Nodes[int.Parse(arrow.Element("from").Attribute("id").Value)], new Point(double.Parse(arrow.Element("from").Attribute("x").Value, CultureInfo.InvariantCulture), double.Parse(arrow.Element("from").Attribute("y").Value, CultureInfo.InvariantCulture)), experimentGraph.Nodes[int.Parse(arrow.Element("to").Attribute("id").Value)], new Point(double.Parse(arrow.Element("to").Attribute("x").Value, CultureInfo.InvariantCulture), double.Parse(arrow.Element("to").Attribute("y").Value, CultureInfo.InvariantCulture)) ); arr.MouseDown += Arrow_MouseDown; arr.MouseMove += Arrow_MouseMove; arr.MouseUp += Arrow_MouseUp; Canvas.Children.Add(arr); experimentGraph.Arrows.Add(arr); Canvas.UpdateLayout(); } else { arr = new Arrow( loop.LoopBody.Nodes[int.Parse(arrow.Element("from").Attribute("id").Value)], new Point(double.Parse(arrow.Element("from").Attribute("x").Value, CultureInfo.InvariantCulture), double.Parse(arrow.Element("from").Attribute("y").Value, CultureInfo.InvariantCulture)), loop.LoopBody.Nodes[int.Parse(arrow.Element("to").Attribute("id").Value)], new Point(double.Parse(arrow.Element("to").Attribute("x").Value, CultureInfo.InvariantCulture), double.Parse(arrow.Element("to").Attribute("y").Value, CultureInfo.InvariantCulture)) ); arr.MouseDown += Arrow_MouseDown; arr.MouseMove += loop.Arrow_MouseMove; arr.MouseUp += loop.Arrow_MouseUp; loop.Canvas.Children.Add(arr); loop.LoopBody.Arrows.Add(arr); loop.Canvas.UpdateLayout(); } arr.Draw(); } }
private void Canvas_MouseUp(object sender, MouseButtonEventArgs e) { if (mode == EditorMode.Arrow && editingArrow != null) { Point pos = e.GetPosition(Canvas); bool found = false; for (int i = Canvas.Children.Count - 1; i >= 0 && !found; i--) { UIElement child = Canvas.Children[i]; if (child is BaseNodeControl) { BaseNodeControl node = child as BaseNodeControl; double x = Canvas.GetLeft(node), y = Canvas.GetTop(node); if (experimentGraph.Arrows.FirstOrDefault((a) => { return a.From == editingArrow.From && a.To == node; }) == null) { if (pos.X >= x - 4 && pos.X <= x + node.ActualWidth + 4 && pos.Y >= y - 4 && pos.Y <= y + node.ActualHeight + 4) { editingArrow.To = node; if (node.AttachEllipse != null) { Point p = node.AttachPoint; p.X = p.X / node.ActualWidth; p.Y = p.Y / node.ActualHeight; editingArrow.EndRelative = p; } else { Point p = node.FindAttachPoint(e.GetPosition(node)); p.X = p.X / node.ActualWidth; p.Y = p.Y / node.ActualHeight; editingArrow.EndRelative = p; } editingArrow.MouseDown += Arrow_MouseDown; editingArrow.MouseMove += Arrow_MouseMove; editingArrow.MouseUp += Arrow_MouseUp; experimentGraph.Arrows.Add(editingArrow); editingArrow = null; found = true; } } } } if (!found) { Canvas.Children.Remove(editingArrow); editingArrow = null; } } }
public void node_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) { switch (mode) { case EditorMode.Pointer: if (moveControl == null && sender is BaseNodeControl) { BaseNodeControl node = sender as BaseNodeControl; isMove = true; Point pos = e.GetPosition(ViewedLoop == null ? Canvas : ViewedLoop.Canvas); delta = new Vector(pos.X - Canvas.GetLeft(node), pos.Y - Canvas.GetTop(node)); node.CaptureMouse(); moveControl = node; } break; case EditorMode.Arrow: if (sender is BaseNodeControl && editingArrow == null) { BaseNodeControl node = sender as BaseNodeControl; Point p = node.FindAttachPoint(e.GetPosition(node)); p.X = p.X * 1.0 / node.ActualWidth; p.Y = p.Y * 1.0 / node.ActualHeight; if (ViewedLoop == null) { editingArrow = new Arrow(node, p, e.GetPosition(Canvas)); Canvas.Children.Add(editingArrow); } else { editingArrow = new Arrow(node, p, e.GetPosition(ViewedLoop.Canvas)); ViewedLoop.Canvas.Children.Add(editingArrow); } } break; } }
private void Arrow_MouseUp(object sender, MouseButtonEventArgs e) { Arrow arrow = sender as Arrow; Point p = e.GetPosition(Canvas); if (arrow.MoveEllipse != null && editingArrow == arrow) { foreach (UIElement element in Canvas.Children) { if (element is BaseNodeControl) { BaseNodeControl node = element as BaseNodeControl; double x = Canvas.GetLeft(node); double y = Canvas.GetTop(node); if (p.X >= x && p.X <= x + node.ActualWidth && p.Y >= y && p.Y <= y + node.ActualHeight) { Point relative = node.FindAttachPoint(e.GetPosition(node)); relative.X = relative.X * 1.0 / node.ActualWidth; relative.Y = relative.Y * 1.0 / node.ActualHeight; if (arrow.MoveEllipse == arrow.pointFrom) { arrow.From = node; arrow.StartRelative = relative; } else if (arrow.MoveEllipse == arrow.pointTo) { arrow.To = node; arrow.EndRelative = relative; } arrow.Draw(); arrow.MoveEllipse = null; break; } } } editingArrow = null; arrow.pointTo.ReleaseMouseCapture(); arrow.pointFrom.ReleaseMouseCapture(); } }
public void Arrow_MouseDown(object sender, MouseButtonEventArgs e) { Arrow arrow = sender as Arrow; if (arrow.AttachEllipse != null) { arrow.MoveEllipse = arrow.AttachEllipse; editingArrow = arrow; arrow.AttachEllipse.CaptureMouse(); } }