/// <summary> /// Quickly create nodes and bidirectional transition /// </summary> /// <param name="fromName"></param> /// <param name="toName"></param> public void QuickCreateBidirection(string fromName, string toName) { IFSMNodal fromNode = this[fromName]; if (fromNode == null) { fromNode = CreateNode(fromName); } IFSMNodal toNode = this[toName]; if (toNode == null) { toNode = CreateNode(toName); } if (ContainTransitionName(fromName, toName)) { return; } Transition transition = new Transition(fromNode, toNode); transitions.Add(transition); if (ContainTransitionName(toName, fromName)) { return; } Transition transition_reverse = new Transition(toNode, fromNode); transitions.Add(transition_reverse); }
public void SetNodePort(string nodeName, NodePort port) { IFSMNodal node = this[nodeName]; if (node == null) { return; } node.nodePort = port; }
public Transition GetTransition(IFSMNodal fromNode, IFSMNodal toNode) { foreach (Transition t in transitions) { if (t.fromNode == fromNode && t.toNode == toNode) { return(t); } } return(null); }
public void GoTo(string nodeName) { // Does the target node exist ? IFSMNodal tar_node = this[nodeName]; if (tar_node == null) { return; } // Does the transition between current and target exist ? Transition transition = GetTransition(currentNode, tar_node); if (transition == null) { return; } // If diagram, is its current node a exitus ? if (currentNode.nodeType == NodeType.Diagram) { Diagram diagram = GetDiagram(currentNode); if (diagram.currentNode.nodePort != NodePort.Exitus && diagram.currentNode.nodePort != NodePort.Both) { return; } } // If state, deactivate substates which aren't supported by target state if (currentNode.nodeType == NodeType.Unit) { State tar_state = GetState(tar_node); State cur_state = GetState(currentNode); foreach (string ssn in cur_state.substateNames) { if (!tar_state.substateNames.Contains(ssn)) { GetSubstate(ssn).SetActive(false); } } } transition.fromNode.OnExit(); transition.OnBegin(); currentNode = tar_node; transition.OnEnd(); transition.toNode.OnEnter(); }
public void Connect(IFSMNodal fromNode, IFSMNodal toNode, bool bidirectional = false) { if (!ContainNodeName(fromNode.name)) { nodes.Add(fromNode); } if (!ContainNodeName(toNode.name)) { nodes.Add(toNode); } if (bidirectional) { QuickCreateBidirection(fromNode.name, toNode.name); } else { QuickCreate(fromNode.name, toNode.name); } }
public IFSMNodal CreateNode(string nameArg, NodeType typeArg = NodeType.Unit, NodePort portArg = NodePort.None) { if (ContainNodeName(nameArg)) { return(null); } IFSMNodal node = null; switch (typeArg) { case NodeType.Unit: node = new State(nameArg, portArg); break; case NodeType.Diagram: node = new Diagram(nameArg, portArg); break; } nodes.Add(node); return(node); }
/// <summary> /// Quickly create nodes and transition /// </summary> /// <param name="fromName"></param> /// <param name="toName"></param> /// <returns></returns> public Transition QuickCreate(string fromName, string toName) { IFSMNodal fromNode = this[fromName]; if (fromNode == null) { fromNode = CreateNode(fromName); } IFSMNodal toNode = this[toName]; if (toNode == null) { toNode = CreateNode(toName); } if (ContainTransitionName(fromName, toName)) { return(null); } Transition transition = new Transition(fromNode, toNode); transitions.Add(transition); return(transition); }
public Transition(IFSMNodal fromArg, IFSMNodal toArg) { fromNode = fromArg; toNode = toArg; }
public Diagram GetDiagram(IFSMNodal node) { return((Diagram)node); }
public State GetState(IFSMNodal node) { return((State)node); }