Esempio n. 1
0
 public void ResetF()
 {
     if (F != null)
     {
         target.eulerAngles = new Vector3(target.eulerAngles.x, F.transform.eulerAngles.y, target.eulerAngles.z);
         F = null;
     }
 }
 private void checkFork(ForkNode fork, ADNodesList.ADNode node)
 {
     for (int i = 0; i < fork.outSize(); i++)
     {
         ElementType elementType = diagramElements.get(((ControlFlow)diagramElements.get(fork.getOutId(i))).getTarget()).getType();
         Console.WriteLine("elementType=" + elementType);
         if (elementType != ElementType.ACTIVITY && elementType != ElementType.DECISION && elementType != ElementType.FORK && elementType != ElementType.MERGE)
         {
             ADMistakeFactory.createMistake(MistakesSeriousness.mistakes[MISTAKES.OUT_NOT_IN_ACT], MistakeAdapter.toString(MISTAKES.OUT_NOT_IN_ACT), node, ALL_MISTAKES.OUT_NOT_IN_ACT);
         }
     }
 }
Esempio n. 3
0
        private void button1_Click(object sender, EventArgs e)
        {
            Workflow sub = new Workflow("sub");

            sub.Add(new CallNode("call sub.1"));
            sub.Add(new CallNode("call sub.2"));
            sub.Add(new CallNode("call sub.3"));
            sub.Add(new CallNode("call sub.4"));
            sub.Add(new CallNode("call sub.5"));
            sub.Add(new CallNode("call sub.6"));

            Workflow workflow = new Workflow("main");
            Compiler compiler = new Compiler();

            workflow.Add(new CallNode("call 1"));
            workflow.Add(new CallNode("call 2"));
            workflow.Add(new LoopNode("x = 0", "x++", "x < 10", new CallNode("call 3.1"), new CallNode("call 3.2")));

            var fork = new ForkNode();

            fork.AddBranch(new CallNode("call 4.1.1"), new CallNode("call 4.1.2"), new CallNode("call 4.1.3"));
            fork.AddBranch(new CallNode("call 4.2"));
            fork.AddBranch(new CallNode("call 4.3"));
            workflow.Add(fork);

            var ifnode = new IfNode();

            ifnode.AddBranch("y < 1", new CallNode("call 5.1.1"), new CallNode("call 5.1.2"), new CallNode("call 5.1.3"));
            ifnode.AddBranch("y > 1", new CallNode("call 5.2"));
            ifnode.AddBranch("else", new CallNode("call 5.3"));
            workflow.Add(ifnode);

            workflow.Add(new CallNode("call 6"));
            workflow.Add(new SubCallNode(sub));
            workflow.Add(new CallNode("call 7"));

            IList <Instruction> instructions = compiler.Compile(workflow);

            int i = 0;

            foreach (var instruction in instructions)
            {
                LogManager.GetLogger("SCRIPT").InfoFormat("{0}:  {1}({2})",
                                                          i++, instruction.OpCode, instruction.Argument);
            }
            LogManager.GetLogger("SCRIPT").Info("====================================================");

            Executor executor = new Executor(instructions);

            executor.Debugger = new TestDebugger();
            executor.Run();
        }
Esempio n. 4
0
        public override void OnControllerUpdate(float deltaTime)
        {
            RaycastHit[]     hits = Physics.RaycastAll(target.position, Vector3.down);
            AbstractPathNode node = null;

            foreach (RaycastHit hit in hits)
            {
                if ((node = hit.transform.GetComponentInParent <AbstractPathNode>()) != null)
                {
                    break;
                }
            }
            if (node != null)
            {
                if (node is ForkNode f)
                {
                    Vector3 dir = target.position - f.transform.position;
                    Vector3 tmp = Vector3.Project(dir, f.transform.forward);
                    if (Vector3.Angle(tmp, f.transform.forward) <= 90 || tmp.magnitude <= f.crossOffset)
                    {
                        if (F == null || F != f)
                        {
                            float v = VirtualInput.GetAxis(turnKey.Value);
                            if (v >= threshold.Value)
                            {
                                target.eulerAngles = new Vector3(target.eulerAngles.x, node.transform.eulerAngles.y + 90f, target.eulerAngles.z);
                                F            = f;
                                isRoad.Value = false;
                                StartCoroutine(a());
                            }
                            else if (v <= -threshold.Value)
                            {
                                target.eulerAngles = new Vector3(target.eulerAngles.x, node.transform.eulerAngles.y - 90f, target.eulerAngles.z);
                                F            = f;
                                isRoad.Value = false;
                                StartCoroutine(a());
                            }
                        }
                    }
                }
                else if (node is PathNode)
                {
                    F = null;
                    target.eulerAngles = new Vector3(target.eulerAngles.x, node.transform.eulerAngles.y, target.eulerAngles.z);
                    isRoad.Value       = true;
                }
            }
        }
Esempio n. 5
0
        public void Visit(ForkNode node)
        {
            foreach (var branch in node.Branches)
            {
                var fk = AddInstruction(OpCode.FORK, 1);

                foreach (var child in branch)
                {
                    child.Accept(this);
                }

                AddInstruction(OpCode.RET, 0);

                fk.Argument = NextLoc;
            }
            AddInstruction(OpCode.JOIN, 0);
        }
        /// <summary>
        /// Распарсить XMI файл и создать объекты соответствующих классов
        /// </summary>
        /// <param name="diagram">Исходная диаграмма</param>
        /// <param name="hasJoinOrFork">Имеется ли join\fork</param>
        /// <returns></returns>
        public bool Parse(Diagram diagram, ref bool hasJoinOrFork)
        {
            xmlFile = diagram.doc;
            XmlNodeList xPackagedList;

            try {
                xPackagedList = xmlFile.GetElementsByTagName("packagedElement");
            } catch (NullReferenceException) {
                //Console.WriteLine("[x] Тег packagedElement не найден");
                return(false);
            }


            // получим корневой элемент
            XmlNode xRoot = FindActivePackageEl(xPackagedList);

            if (xRoot == null)
            {
                //Console.WriteLine("[x] Вид диаграммы не AD");
                return(false);
            }

            var attr = xRoot.Attributes["xsi:type"];

            if (attr == null)
            {
                //Console.WriteLine("[x] Не удалось распарсить xmi файл");
                return(false);
            }
            if (!attr.Value.Equals("uml:Activity"))
            {
                //Console.WriteLine("[x] Вид диаграммы не AD");
                return(false);
            }

            // пройтись по всем тегам и создать объекты
            foreach (XmlNode node in xRoot.ChildNodes)
            {
                var elAttr = node.Attributes["xsi:type"];
                if (elAttr == null)
                {
                    continue;
                }

                if (elAttr.Value == "uml:OpaqueAction" || elAttr.Value == "uml:InitialNode" || elAttr.Value == "uml:ActivityFinalNode" ||
                    elAttr.Value == "uml:FlowFinalNode" || elAttr.Value == "uml:DecisionNode" || elAttr.Value == "uml:MergeNode" ||
                    elAttr.Value == "uml:ForkNode" || elAttr.Value == "uml:JoinNode")
                {
                    DiagramElement nodeFromXMI = null;
                    switch (elAttr.Value)
                    {
                    // активность
                    case "uml:OpaqueAction":
                        nodeFromXMI = new ActivityNode(node.Attributes["xmi:id"].Value,
                                                       AttrAdapter(node.Attributes["inPartition"]), AttrAdapter(node.Attributes["name"]));
                        nodeFromXMI.setType(ElementType.ACTIVITY);
                        adNodesList.addLast(nodeFromXMI);
                        break;

                    // узел инициализации
                    case "uml:InitialNode":
                        nodeFromXMI = new InitialNode(node.Attributes["xmi:id"].Value, AttrAdapter(node.Attributes["inPartition"]));
                        nodeFromXMI.setType(ElementType.INITIAL_NODE);
                        adNodesList.addLast(nodeFromXMI);
                        break;

                    // конечное состояние
                    case "uml:ActivityFinalNode":
                    case "uml:FlowFinalNode":
                        nodeFromXMI = new FinalNode(node.Attributes["xmi:id"].Value, AttrAdapter(node.Attributes["inPartition"]));
                        nodeFromXMI.setType(ElementType.FINAL_NODE);
                        adNodesList.addLast(nodeFromXMI);
                        break;

                    // условный переход
                    case "uml:DecisionNode":
                        nodeFromXMI = new DecisionNode(node.Attributes["xmi:id"].Value, AttrAdapter(node.Attributes["inPartition"]), AttrAdapter(node.Attributes["question"]));
                        nodeFromXMI.setType(ElementType.DECISION);
                        adNodesList.addLast(nodeFromXMI);
                        break;

                    // узел слияния
                    case "uml:MergeNode":
                        nodeFromXMI = new MergeNode(node.Attributes["xmi:id"].Value, AttrAdapter(node.Attributes["inPartition"]));
                        nodeFromXMI.setType(ElementType.MERGE);
                        adNodesList.addLast(nodeFromXMI);
                        break;

                    // разветвитель
                    case "uml:ForkNode":
                        nodeFromXMI = new ForkNode(node.Attributes["xmi:id"].Value, AttrAdapter(node.Attributes["inPartition"]));
                        nodeFromXMI.setType(ElementType.FORK);
                        adNodesList.addLast(nodeFromXMI);
                        hasJoinOrFork = true;
                        break;

                    // синхронизатор
                    case "uml:JoinNode":
                        nodeFromXMI = new JoinNode(node.Attributes["xmi:id"].Value, AttrAdapter(node.Attributes["inPartition"]));
                        nodeFromXMI.setType(ElementType.JOIN);
                        adNodesList.addLast(nodeFromXMI);
                        hasJoinOrFork = true;
                        break;
                    }
                    // добавляем ид входящих и выходящих переходов
                    if (nodeFromXMI != null)
                    {
                        string idsIn  = node.Attributes["incoming"]?.Value;
                        string idsOut = node.Attributes["outgoing"]?.Value;
                        nodeFromXMI.addIn(idsIn ?? "");
                        nodeFromXMI.addOut(idsOut ?? "");
                    }
                }
                // создаем переход
                else if (node.Attributes["xsi:type"].Value.Equals("uml:ControlFlow"))
                {
                    // находим подпись перехода
                    var    markNode = node.ChildNodes[1];
                    string mark     = markNode.Attributes["value"].Value.Trim();    // если подпись является "yes", значит это подпись по умолчанию

                    ControlFlow temp = new ControlFlow(node.Attributes["xmi:id"].Value, mark.Equals("true") ? "" : mark);
                    temp.setType(ElementType.FLOW);
                    temp.setSrc(AttrAdapter(node.Attributes["source"]));
                    temp.setTarget(AttrAdapter(node.Attributes["target"]));
                    adNodesList.addLast(temp);
                }
                // создаем дорожку
                else if (node.Attributes["xsi:type"].Value.Equals("uml:ActivityPartition"))
                {
                    Swimlane temp = new Swimlane(node.Attributes["xmi:id"].Value, AttrAdapter(node.Attributes["name"]))
                    {
                        ChildCount = node.Attributes["node"] == null ? 0 : node.Attributes["node"].Value.Split().Length
                    };
                    temp.setType(ElementType.SWIMLANE);
                    if (temp.Name != "")
                    {
                        diagram.Actors.Add(temp);
                    }
                    adNodesList.addLast(temp);
                }
                // неизвестный элемент
                else
                {
                    var unknownNode = new UnknownNode(node.Attributes["xmi:id"].Value);
                    unknownNode.setType(ElementType.UNKNOWN);
                    unknownNodes.Add(unknownNode);
                }
            }

            XmlNode coordRoot = null;

            try {
                coordRoot = xmlFile.GetElementsByTagName("plane")[0];
            } catch (NullReferenceException) {
                //Console.WriteLine("[x] Тег packagedElement не найден");
            }

            if (coordRoot != null)
            {
                FindCoordinates(coordRoot, diagram);
            }
            for (int i = 0; i < adNodesList.size(); i++)
            {
                var node = adNodesList.get(i);
                if (node is DiagramElement)
                {
                    var nodeFromXMI = (DiagramElement)node;
                    switch (nodeFromXMI.getType())
                    {
                    case ElementType.FINAL_NODE:
                        if (nodeFromXMI.inSize() == 0)
                        {
                            // ошибка
                            ADMistakeFactory.createMistake(MistakesSeriousness.mistakes[MISTAKES.NO_IN], MistakeAdapter.toString(MISTAKES.NO_IN), new ADNodesList.ADNode(nodeFromXMI), ALL_MISTAKES.NO_IN);
                        }
                        break;

                    case ElementType.INITIAL_NODE:
                        if (nodeFromXMI.outSize() == 0)
                        {
                            // ошибка
                            ADMistakeFactory.createMistake(MistakesSeriousness.mistakes[MISTAKES.NO_OUT], MistakeAdapter.toString(MISTAKES.NO_OUT), new ADNodesList.ADNode(nodeFromXMI), ALL_MISTAKES.NO_OUT);
                        }
                        break;

                    default:
                        if (nodeFromXMI.inSize() == 0 || nodeFromXMI.outSize() == 0)
                        {
                            // ошибка
                            if (nodeFromXMI.inSize() == 0)
                            {
                                ADMistakeFactory.createMistake(MistakesSeriousness.mistakes[MISTAKES.NO_IN], MistakeAdapter.toString(MISTAKES.NO_IN), new ADNodesList.ADNode(nodeFromXMI), ALL_MISTAKES.NO_IN);
                            }
                            if (nodeFromXMI.outSize() == 0)
                            {
                                ADMistakeFactory.createMistake(MistakesSeriousness.mistakes[MISTAKES.NO_OUT], MistakeAdapter.toString(MISTAKES.NO_OUT), new ADNodesList.ADNode(nodeFromXMI), ALL_MISTAKES.NO_OUT);
                            }
                        }
                        break;
                    }
                }
            }
            // ошибка - тип элемента не принадлежит AD
            foreach (var node in unknownNodes)
            {
                ADMistakeFactory.createMistake(MistakesSeriousness.mistakes[MISTAKES.FORBIDDEN_ELEMENT], MistakeAdapter.toString(MISTAKES.FORBIDDEN_ELEMENT), node, ALL_MISTAKES.FORBIDDEN_ELEMENT);
            }

            return(true);
        }
Esempio n. 7
0
            private StatusKind ForkThreadNode(ForkNode forkNode, bool main)
            {
                var forkPredicateResult = (IForkPredicateResult)forkNode.PredicateResult;
                var startNode           = (PredicateNode)forkNode.ExecutionPath.Nodes[forkNode.NodeIndex];
                var threadParent        = ForkThreadParent();

                for (var i = 1; i >= 0; i--)
                {
                    var predicateEntry         = i == 0 ? forkPredicateResult.First : forkPredicateResult.Second;
                    var predicateNode          = _processResources.ForkPredicateNodePool.Get().Mount(predicateEntry);
                    var predicateExecutionPath = _processResources.ForkExecutionPathPool.Get().Mount(startNode, predicateNode);

                    predicateNode.CopyLookup(forkNode);

                    if (startNode.ForkPathIndex == -1)
                    {
                        lock (startNode)
                        {
                            if (startNode.ForkPathIndex == -1)
                            {
                                _automata.RegisterExecutionPath(predicateExecutionPath);
                                startNode.ForkPathIndex = predicateExecutionPath.Id;
                            }
                            else
                            {
                                predicateExecutionPath.Id = startNode.ForkPathIndex;
                            }
                        }
                    }
                    else
                    {
                        predicateExecutionPath.Id = startNode.ForkPathIndex;
                    }

                    predicateNode.ForkPathIndex = startNode.ForkPathIndex;

                    var contextState = _currentThread.ContextState != null?Context.CloneContextStateInternal(_currentThread.ContextState) : null;

                    var thread = new Thread(threadParent, forkNode, _currentThread.InstructionStream, _currentThread.InstructionPointer, contextState);

                    thread.EnsureStartExecutionQueue();
                    thread.EnqueueStartPath(predicateExecutionPath);

                    // ReSharper disable once ForCanBeConvertedToForeach
                    for (var j = 0; j < forkNode.ForkExecutionPaths.Count; j++)
                    {
                        thread.EnqueueStartPath(forkNode.ForkExecutionPaths[j]);
                    }

                    _parallelThreads.PushRef(ref thread);
                }

                if (main)
                {
                    _mainThread = _currentThread;
                }
                else
                {
                    _currentThread.Dispose(this);
                }

                forkNode.Release();

                return(StatusKind.Fork);
            }