public static int GetTaskIndex(CyPhy.TaskBase task, Dictionary <CyPhy.TaskBase, int> tasks) { int index; if (tasks.TryGetValue(task, out index)) { if (index == -1) { throw new ApplicationException("Workflow loop involving " + task.Name); } return(index); } index = 0; tasks.Add(task, -1); foreach (CyPhy.Flow connection in task.SrcConnections.FlowCollection) { index = Math.Max(index, GetTaskIndex(connection.SrcEnds.TaskBase, tasks) + 1); } tasks[task] = index; return(index); }
public void AddAllTasks( CyPhy.TestBenchType testBenchType, IEnumerable <global::META.ComComponent> interpreters, string relativePathToProjectDir) { Contract.Requires(testBenchType != null); Contract.Requires(interpreters != null); var workflowRef = testBenchType.Children .WorkflowRefCollection .ToList(); if (workflowRef.Count == 1 && workflowRef[0].AllReferred != null) { var workflow = workflowRef[0].Referred.Workflow; var allTasks = workflow.Children.TaskBaseCollection; var startTask = allTasks .Where(x => x.AllSrcConnections.Count() == 0) .FirstOrDefault(); CyPhy.TaskBase nextTask = startTask; int regularTaskIndex = 0; int regularTaskCount = interpreters.Count(); var processed = new List <CyPhy.TaskBase>(); while (nextTask != null && processed.Contains(nextTask) == false) { processed.Add(nextTask); if (nextTask.Impl.MetaBase.Name == (typeof(CyPhy.Task).Name)) { if (regularTaskIndex < regularTaskCount) { var currTask = interpreters.ElementAt(regularTaskIndex++); if (currTask.result != null && currTask.result.RunCommand != null) { var step = new Step(); step.Invocation = currTask.result.RunCommand; this.Steps.Add(step); } } } else if (nextTask.Impl.MetaBase.Name == (typeof(CyPhy.ExecutionTask).Name)) { CyPhy.ExecutionTask executionTask = ISIS.GME.Dsml.CyPhyML.Classes.ExecutionTask.Cast(nextTask.Impl); var step = new Step(); step.Description = executionTask.Attributes.Description; // %project_dir% is relative path to MgaExtensions.MgaExtensions.GetProjectDirectoryPath(testBenchType.Impl.Project) step.Invocation = Regex.Replace(executionTask.Attributes.Invocation, "%project_dir%", relativePathToProjectDir, RegexOptions.CultureInvariant | RegexOptions.IgnoreCase); step.PreProcess = executionTask.Attributes.PreProcess; step.PostProcess = executionTask.Attributes.PostProcess; var splitStrings = new string[] { Environment.NewLine, "\n" }; foreach (var parameterValue in executionTask.Attributes.Parameters.Split(splitStrings, StringSplitOptions.RemoveEmptyEntries)) { Parameter parameter = new Parameter(); parameter.Name = parameterValue; step.Parameters.Add(parameter); } this.Steps.Add(step); } var flow = nextTask.DstConnections.FlowCollection.FirstOrDefault(); if (flow == null) { nextTask = null; } else { nextTask = flow.DstEnds.TaskBase; } } } }
public void AddAllTasks( CyPhy.TestBenchType testBenchType, IEnumerable <global::META.ComComponent> interpreters, string relativePathToProjectDir) { Contract.Requires(testBenchType != null); Contract.Requires(interpreters != null); var workflowRef = testBenchType.Children .WorkflowRefCollection .ToList(); if (workflowRef.Count == 1 && workflowRef[0].AllReferred != null) { var workflow = workflowRef[0].Referred.Workflow; var allTasks = workflow.Children.TaskBaseCollection; var startTask = allTasks .Where(x => x.AllSrcConnections.Count() == 0) .FirstOrDefault(); CyPhy.TaskBase nextTask = startTask; int regularTaskIndex = 0; int regularTaskCount = interpreters.Count(); var processed = new List <CyPhy.TaskBase>(); while (nextTask != null && processed.Contains(nextTask) == false) { processed.Add(nextTask); if (nextTask.Impl.MetaBase.Name == (typeof(CyPhy.Task).Name)) { if (regularTaskIndex < regularTaskCount) { var currTask = interpreters.ElementAt(regularTaskIndex++); if (currTask.result != null && currTask.result.RunCommand != null) { var step = new Step(); step.Invocation = currTask.result.RunCommand; this.Steps.Add(step); } } } else if (nextTask.Impl.MetaBase.Name == (typeof(CyPhy.ExecutionTask).Name)) { CyPhy.ExecutionTask executionTask = ISIS.GME.Dsml.CyPhyML.Classes.ExecutionTask.Cast(nextTask.Impl); Step step = CreateManifestStepForExecutionTask(relativePathToProjectDir, executionTask); this.Steps.Add(step); } var flow = nextTask.DstConnections.FlowCollection.FirstOrDefault(); if (flow == null) { nextTask = null; } else { nextTask = flow.DstEnds.TaskBase; } } } else if (testBenchType.Impl.MetaBase.Name == typeof(CyPhy.CADTestBench).Name) { // CADTestBench aka Structural FEA Test Bench is assumed to run with only CyPhy2CAD var step = new Step(); step.Invocation = interpreters.Single().result.RunCommand; this.Steps.Add(step); } }