Exemple #1
0
        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();
            }
        }
Exemple #2
0
        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;
                }
            }
        }
Exemple #3
0
 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;
     }
 }
Exemple #4
0
        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();
            }
        }
Exemple #5
0
 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();
     }
 }