Пример #1
0
        /// <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);
        }
Пример #2
0
        public void SetNodePort(string nodeName, NodePort port)
        {
            IFSMNodal node = this[nodeName];

            if (node == null)
            {
                return;
            }
            node.nodePort = port;
        }
Пример #3
0
 public Transition GetTransition(IFSMNodal fromNode, IFSMNodal toNode)
 {
     foreach (Transition t in transitions)
     {
         if (t.fromNode == fromNode && t.toNode == toNode)
         {
             return(t);
         }
     }
     return(null);
 }
Пример #4
0
        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();
        }
Пример #5
0
 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);
     }
 }
Пример #6
0
        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);
        }
Пример #7
0
        /// <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;
 }
Пример #9
0
 public Diagram GetDiagram(IFSMNodal node)
 {
     return((Diagram)node);
 }
Пример #10
0
 public State GetState(IFSMNodal node)
 {
     return((State)node);
 }