public Link AddLink(Output output, Input input, bool writeInDb = true) { Node inputNode = GetInputOwner(input); Node outputNode = GetOutputOwner(output); if (inputNode == null || outputNode == null) { LogEngineError($"Can`t create link from [{output.Id}] to [{input.Id}]. Does not exist."); return(null); } if (inputNode == outputNode) { LogEngineError($"Can`t create link from [{output.Id}] to [{input.Id}]. Input and output belong to the same node."); return(null); } if (inputNode.PanelId != outputNode.PanelId) { LogEngineError($"Can`t create link from {outputNode.GetType().Name} to {inputNode.GetType().Name}. Nodes are on different panels."); return(null); } Link link = new Link(output.Id, input.Id, inputNode.PanelId); //prevent two links to one input Link oldLink = GetLinkForInput(input); if (oldLink != null) { RemoveLink(oldLink, true); } LogEngineInfo($"New link from [{outputNode.GetType().Name}] to [{inputNode.GetType().Name}]"); lock (linksLock) links.Add(link); if (writeInDb) { nodesDb?.AddLink(link); } OnNewLink?.Invoke(link); if (started) { input.Value = output.Value; } return(link); }
public void UpdateNodeInDb(Node node) { Node oldNode = GetNode(node.Id); if (oldNode == null) { LogEngineError($"Can`t update node [{node.GetType().Name}]. Node [{node.Id}] does not exist."); return; } // LogEngineInfo($"Update node in DB [{node.GetType().Name}]"); nodesDb?.UpdateNode(node); }
public void RemoveNode(Node node) { lock (nodesLock) if (!nodes.Contains(node)) { LogEngineError($"Can`t remove node [{node.GetType().Name}]. Node [{node.Id}] does not exist."); return; } List<Node> nodesToRemove = new List<Node>(); nodesToRemove.Add(node); List<Link> linksToRemove = new List<Link>(); List<Link> links = GetLinksForNode(node); linksToRemove.AddRange(links); foreach (var link in links) { RemoveLink(link, false); } node.OnRemove(); if (node is PanelNode) { var nodesOnPanel = GetNodesForPanel(node.Id, true); nodesToRemove.AddRange(nodesOnPanel); foreach (var n in nodesOnPanel) { List<Link> li = GetLinksForNode(n); linksToRemove.AddRange(li); foreach (var link in li) { RemoveLink(link, false); } LogEngineInfo($"Remove node [{n.GetType().Name}]"); OnRemoveNode?.Invoke(n); lock (nodesLock) nodes.Remove(n); } } lock (nodesLock) nodes.Remove(node); nodesDb?.RemoveNodes(nodesToRemove); nodesDb?.RemoveLinks(linksToRemove); LogEngineInfo($"Remove node [{node.GetType().Name}]"); OnRemoveNode?.Invoke(node); }
public bool AddNode(Node node, bool writeInDb = true) { if (node.PanelId != MAIN_PANEL_ID && GetPanelNode(node.PanelId) == null) { LogEngineError($"Can`t create node [{node.GetType().Name}]. Panel [{node.PanelId}] does not exist."); return false; } bool checkNodeCanBeAdded = node.OnAddToEngine(this); if (!checkNodeCanBeAdded) { LogEngineError($"Can`t create node [{node.GetType().Name}]. Aborted by node."); return false; } lock (nodesLock) nodes.Add(node); if (writeInDb) nodesDb?.AddNode(node); LogEngineInfo($"New node [{node.GetType().Name}]"); OnNewNode?.Invoke(node); return true; }