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); } } }
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(); }
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; } } }
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); }
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); }