public static void SetEndSocket(this Path path, NodeSocket socket) { if (path.Tag == null) { path.Tag = new NodeSocket[2]; } (path.Tag as NodeSocket[])[1] = socket; }
//Удаление связей между нодами из контекстного меню public void NodeConnectorClearCurves(NodeSocket initnode) { foreach (var curve in initnode.ConnectedCurves) { var endnode = initnode.SocketType == NodeSocket.SocketTypes.Input ? curve.GetOutputSocket() : curve.GetInputSocket(); cbWindow.MainPanel.Children.Remove(curve); endnode.ConnectedCurves.Remove(curve); } initnode.ConnectedCurves.Clear(); cbWindow.UpdateProcess(initnode.ParentNode); }
public void LoadSocketEvents(NodeSocket nc) { nc.MouseLeftButtonDown += NodeConnector_MouseDown; nc.MouseLeftButtonUp += NodeConnector_MouseUp; nc.MouseEnter += NodeConnector_MouseEnter; nc.MouseLeave += NodeConnector_MouseLeave; nc.ContextMenu = MainWindow.DeleteContextMenu; var nc1 = nc; (nc.ContextMenu.Items[0] as MenuItem).Click += (x, y) => { NodeConnectorClearCurves(nc1); }; }
private void NodeConnector_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) { initNode = sender as NodeSocket; if (initNode.Passive) { NConnDrag = true; } else { initNode = null; } }
public void DrawPoint(Point point, Brush color) { NodeSocket nc = new NodeSocket(null, typeof(int)); nc.SetColorStroke(color); MainPanel.Children.Add(nc); nc.Loaded += (a, b) => { var margin = nc.Margin; margin.Left = point.X - nc.ActualWidth / 2; margin.Top = point.Y - nc.ActualHeight / 2; nc.Margin = margin; nc.RenderTransform = new ScaleTransform(0.5, 0.5, nc.ActualWidth / 2, nc.ActualHeight / 2); }; }
//Сброс состояний активации создания соединения и перетаскивания\динамическое создание нода по типу исходящего private void Window_MouseLeftButtonUp(object sender, MouseButtonEventArgs e) { if (NConnDrag && Drawed != null) { var dcm = new ContextMenu(); var brush = new SolidColorBrush(new Color() { R = 30, G = 30, B = 30, A = 255 }); dcm.Background = brush; List <NodeControl> list = new List <NodeControl>(); foreach (var node in NodeLibrary.Nodes) { if (initNode.SocketType == NodeSocket.SocketTypes.Input) { var outpTyped = node.GetOutputConnectorList().Where(x => (x.DataType == initNode.DataType || (x.DataType.IsIConvertible() && initNode.DataType.IsIConvertible())) && x.Passive); if (outpTyped.Count() == 0) { continue; } list.Add(node); } else { var inpTyped = node.GetInputConnectorList().Where(x => (((x.DataType == initNode.DataType) && x.Passive) || (x.DataType.IsIConvertible() && initNode.DataType.IsIConvertible())) && x.Passive); if (inpTyped.Count() == 0) { continue; } list.Add(node); } } var CheckList = new Queue <TreeViewItem>(); var FList = new List <MenuItem>(); var AList = new List <MenuItem>(); foreach (var node in NodesPanel.Items.OfType <TreeViewItem>()) { CheckList.Enqueue(node); var mi = new MenuItem() { Background = brush, Foreground = Brushes.White, Margin = new Thickness(-3, 0, 0, 0), Header = node.Header, Tag = node.Tag }; AList.Add(mi); FList.Add(mi); } while (CheckList.Count != 0) { var node = CheckList.Dequeue(); if (node.HasItems) { foreach (var inNode in node.Items.OfType <TreeViewItem>()) { CheckList.Enqueue(inNode); var mi = new MenuItem() { Background = brush, Foreground = Brushes.White, Margin = new Thickness(-3, 0, 0, 0), Header = inNode.Header, Tag = inNode.Tag }; var res = AList.Find(x => x.Header == node.Header); res.Items.Add(mi); AList.Add(mi); } foreach (var lb in node.Items.OfType <Label>()) { var mi = new MenuItem() { Background = brush, Foreground = Brushes.White, Margin = new Thickness(-3, 0, 0, 0), Header = lb.Content, Tag = lb.Tag }; var res = AList.Find(x => x.Header == node.Header); res.Items.Add(mi); AList.Add(mi); } } } //foreach (var i in FList) dcm.Items.Add(i); foreach (var nc in list) { var mi = new MenuItem() { Background = brush, Foreground = Brushes.White, Margin = new Thickness(-3, 0, 0, 0), Header = nc.NCName, Tag = nc }; mi.Click += (x, y) => { var nconn = nc.GetConnectorList().Where(a => a.SocketType != initNode.SocketType && (a.DataType == initNode.DataType || a.DataType.IsIConvertible() && initNode.DataType.IsIConvertible())).First(); if (nconn.SocketType == NodeSocket.SocketTypes.Input && nconn.ConnectedCurves.Count > 0) { MessageBox.Show("There are existing connections left"); Window_MouseLeftButtonDown(sender, e); return; } if (initNode.SocketType == NodeSocket.SocketTypes.Input && initNode.ConnectedCurves.Count > 0) { MessageBox.Show("There are existing connections left"); Window_MouseLeftButtonDown(sender, e); return; } var created = AddNC(mi.Header.ToString()); var margin = created.Margin; var mx = Mouse.GetPosition(MainPanel).X; var my = Mouse.GetPosition(MainPanel).Y; margin.Top = my; margin.Left = mx; created.Margin = margin; created.Loaded += (q, w) => { var readyConn = created.GetConnectorList().First(a => a.SocketType != initNode.SocketType && (a.DataType == initNode.DataType || a.DataType.IsIConvertible() && initNode.DataType.IsIConvertible())); NodeConnector_MouseLeftButtonUp(readyConn, e); var red = readyConn.GetCenter(MainPanel); var gr = new Vector(margin.Left, margin.Top); var diff = red - gr; margin = created.Margin; margin.Top -= diff.Y; margin.Left -= diff.X; created.Margin = margin; UpdateCurves(created, diff); }; }; dcm.Items.Add(mi); } Drawed.ContextMenu = dcm; dcm.IsOpen = true; return; } NConnDrag = false; NNodeDrag = false; DraggingNC = null; if (initNode != null) { initNode.SetBaseColor(); } initNode = null; if (Drawed == null) { return; } MainPanel.Children.Remove(Drawed); Drawed = null; }
public static void SetSockets(this Path path, NodeSocket init, NodeSocket end) { path.Tag = new NodeSocket[] { init, end }; }
public NodeControl(MethodInfo m) : this() { NFuncAttribute att = m.GetCustomAttribute <NFuncAttribute>(); ParameterInfo[] param = m.GetParameters(); NCName = att.Name; Category = att.Category; Input = param.Select(x => x.ParameterType).ToArray(); if (att.OutputTypes == null) { Output = m.ReturnType == typeof(void) ? new Type[] { } : new Type[] { m.ReturnType }; } else { Output = att.OutputTypes; } Method = m; foreach (var t in param) { bool isOut = t.IsOut; if (!isOut) { NodeSocket nc = new NodeSocket(this, t); LeftPanel.Children.Add(nc); continue; } if (isOut) { if (t.ParameterType.GetElementType() == typeof(string)) { var lb = new Label() { MinWidth = 25, MinHeight = 25, Foreground = Brushes.White }; MiddlePanel.Children.Add(lb); continue; } if (t.ParameterType.GetElementType() == typeof(BitmapImage)) { var img = new Image() { Stretch = Stretch.Fill, MaxHeight = 500, MaxWidth = 800 }; MiddlePanel.Children.Add(img); var dcm = new ContextMenu(); var brush = new SolidColorBrush(new Color() { R = 30, G = 30, B = 30, A = 255 }); dcm.Background = brush; var mi = new MenuItem() { Header = "Open full size", Background = brush, Foreground = Brushes.White, Margin = new Thickness(-3, 0, 0, 0) }; mi.Click += (x, y) => { if (img.Source != null) { var bmp = NodeLibrary.BI2B(img.Source as BitmapImage); Emgu.CV.Image <Emgu.CV.Structure.Bgr, byte> imge = new Emgu.CV.Image <Emgu.CV.Structure.Bgr, byte>(bmp); imge.Save("temp.png"); Process.Start("temp.png"); } }; dcm.Items.Add(mi); img.ContextMenu = dcm; continue; } var aasdqw = t.ParameterType.GetElementType(); if (t.ParameterType.GetElementType().BaseType == typeof(Array) || t.ParameterType.GetElementType() == typeof(Array)) { var arr = new TableControl(); MiddlePanel.Children.Add(arr); continue; } } } if (att.OutputTypes == null && Output.Length != 0) { NodeSocket ndc = new NodeSocket(this, Output[0]); RightPanel.Children.Add(ndc); } else { foreach (var t in Output) { NodeSocket ndc = new NodeSocket(this, t); RightPanel.Children.Add(ndc); } } InputSockets = LeftPanel.Children.OfType <NodeSocket>().ToList(); OutputSockets = RightPanel.Children.OfType <NodeSocket>().ToList(); if (RightPanel.Children.Count == 0) { RPBorder.Visibility = System.Windows.Visibility.Hidden; } }
public void AddConnection(NodeSocket thisNc, NodeSocket extNc) { }