public MyExecutionBlock CreateNodeExecutionPlan(MyWorkingNode node, bool initPhase) { List<IMyExecutable> defaultPlanContent = new List<IMyExecutable>(); if (!initPhase && PlanSignalTasks) { defaultPlanContent.Add(new MyIncomingSignalTask(node)); } foreach (string taskName in node.GetInfo().KnownTasks.Keys) { MyTask task = node.GetTaskByPropertyName(taskName); if (task != null && !task.DesignTime && (initPhase && task.OneShot || !initPhase && !task.OneShot)) { defaultPlanContent.Add(task); } } MyNodeGroup nodeGroup = node as MyNodeGroup; if (nodeGroup != null) { IEnumerable<MyNode> children = nodeGroup.Children.OrderBy(x => x.TopologicalOrder); foreach (MyNode childNode in children) { MyWorkingNode childWorkingNode = childNode as MyWorkingNode; if (childWorkingNode != null) { defaultPlanContent.Add(CreateNodeExecutionPlan(childWorkingNode, initPhase)); } } } if (!initPhase && PlanSignalTasks) { defaultPlanContent.Add(new MyOutgoingSignalTask(node)); } MyExecutionBlock defaultPlan = new MyExecutionBlock(defaultPlanContent.ToArray()); defaultPlan.Name = node.Name; MyExecutionBlock resultPlan = defaultPlan; IMyCustomExecutionPlanner executionPlannerNode = node as IMyCustomExecutionPlanner; if (executionPlannerNode != null) { if (initPhase) { resultPlan = executionPlannerNode.CreateCustomInitPhasePlan(defaultPlan); } else { resultPlan = executionPlannerNode.CreateCustomExecutionPlan(defaultPlan); } resultPlan.Name = defaultPlan.Name; } if (resultPlan.Name == null) resultPlan.Name = node.GetType().Name; if (node is MyNodeGroup) { resultPlan.Name += " (group)"; } // TODO(HonzaS): Rethink this. It's only used in profiling results. node.ExecutionBlock = resultPlan; return resultPlan; }
public MyExecutionBlock CreateNodeExecutionPlan(MyWorkingNode node, bool initPhase) { List <IMyExecutable> defaultPlanContent = new List <IMyExecutable>(); if (!initPhase && PlanSignalTasks) { defaultPlanContent.Add(new MyIncomingSignalTask(node)); } foreach (var taskPropertyInfo in node.GetInfo().OrderedTasks) { MyTask task = node.GetTaskByPropertyName(taskPropertyInfo.Name); if ((task != null) && !task.DesignTime && (initPhase && task.OneShot || !initPhase && !task.OneShot)) { defaultPlanContent.Add(task); } } MyNodeGroup nodeGroup = node as MyNodeGroup; if (nodeGroup != null) { foreach (MyNode childNode in nodeGroup.Children.OrderBy(x => x.TopologicalOrder)) { MyWorkingNode childWorkingNode = childNode as MyWorkingNode; if (childWorkingNode != null) { defaultPlanContent.Add(CreateNodeExecutionPlan(childWorkingNode, initPhase)); } } } if (!initPhase && PlanSignalTasks) { defaultPlanContent.Add(new MyOutgoingSignalTask(node)); } var defaultPlan = new MyExecutionBlock(defaultPlanContent.ToArray()) { Name = node.Name }; MyExecutionBlock resultPlan = defaultPlan; IMyCustomExecutionPlanner executionPlannerNode = node as IMyCustomExecutionPlanner; if (executionPlannerNode != null) { resultPlan = initPhase ? executionPlannerNode.CreateCustomInitPhasePlan(defaultPlan) : executionPlannerNode.CreateCustomExecutionPlan(defaultPlan); resultPlan.Name = defaultPlan.Name; } if (resultPlan.Name == null) { resultPlan.Name = node.GetType().Name; } if (node is MyNodeGroup) { resultPlan.Name += " (group)"; } // TODO(HonzaS): Rethink this. It's only used in profiling results. node.ExecutionBlock = resultPlan; return(resultPlan); }