using System; using System.Collections.Generic; using System.Linq; using TNode.TNodeCore.Runtime.Models; using TNode.TNodeCore.Runtime.Tools; using TNodeCore.Runtime.Models; namespace TNodeCore.Runtime.RuntimeModels{ public class StaticGraph:IRuntimeNodeGraph{ private Dictionary _nodes; private GraphTool _graphTool; private IEnumerator BreathFirstEnumerator; private void ModifyLinks(NodeLink linkData){ var outNodeId = linkData.outPort.nodeDataId; var outNode = _nodes[outNodeId]; outNode.OutputLinks.Add(linkData); var inNodeId = linkData.inPort.nodeDataId; var inNode = _nodes[inNodeId]; inNode.InputLinks.Add(linkData); } public StaticGraph(List nodes,List links){ _nodes = new Dictionary(); foreach (var nodeData in nodes){ if(_nodes.ContainsKey(nodeData.id)) continue; if (nodeData is ConditionalNode conditionalNode){ ConditionalRuntimeNode conditionalRuntimeNode = new ConditionalRuntimeNode(conditionalNode); _nodes.Add(conditionalNode.id,conditionalRuntimeNode); } else{ _nodes.Add(nodeData.id,new RuntimeNode(nodeData)); } RuntimeNode currentNode = _nodes[nodeData.id]; currentNode.InputLinks = new List(); currentNode.OutputLinks = new List(); } foreach (var link in links){ ModifyLinks(link); } _graphTool = new GraphTool(this); BreathFirstEnumerator = _graphTool.BreathFirstSearch(); } public void ResetState(){ BreathFirstEnumerator = _graphTool.BreathFirstSearch(); } public RuntimeNode GetRuntimeNode(NodeData nodeData){ return _nodes[nodeData.id]; } public RuntimeNode GetRuntimeNode(string id){ return _nodes[id]; } public List GetRuntimeNodes(){ return _nodes.Values.ToList(); } public Dictionary GetRuntimeNodesDictionary(){ return _nodes; } public NodeData GetNode(string id){ return _nodes[id].NodeData; } public List GetRuntimeNodesOfType(Type type){ return _nodes.Where(x=>x.Value.NodeType == type).Select(x=>x.Value).ToList(); } public List GetRuntimeNodesOfType(){ return _nodes.Where(x=>x.Value.NodeType == typeof(T)).Select(x=>x.Value).ToList(); } public NodeData CurrentNode(){ return CurrentRuntimeNode().NodeData; } public RuntimeNode MoveNext(){ BreathFirstEnumerator.MoveNext(); return BreathFirstEnumerator.Current; } public RuntimeNode CurrentRuntimeNode(){ if (BreathFirstEnumerator.Current == null){ BreathFirstEnumerator.MoveNext(); } return BreathFirstEnumerator.Current; } } }