/* Сортирует объекты оснастки в дереве вывода в соответствии с порядком, указанном в параметрах формирователя. tree - дерево вывода.*/ var toolsSortOrder = ReportBuilder.Configuration.ToolsSortOrder.SelectMany(i => i.Value).ToList(); foreach (var obj in tree.Root.Children) { var operations = obj.Children.FindInstancesOf("operations"); foreach (var oper in operations) { SortChildTools(oper); var steps = oper.Children.FindInstancesOf("steps"); foreach (var step in steps) SortChildTools(step); var placements = oper.Children.FindInstancesOf("placements"); foreach (var placement in placements) { var plSteps = placement.Children.FindInstancesOf("steps"); foreach (var step in plSteps) SortChildTools(step); } } } void SortChildTools(ProcessableObject parent) { var toolFilters = ReportBuilder.Configuration.ToolsFilter.Split(new[] { ';' }, System.StringSplitOptions.RemoveEmptyEntries); var sortedTools = parent.Children.Find(toolFilters); var originalOrder = parent.Children.ToArray(); if (sortedTools.Count == 0) return; var lastToolIndex = parent.Children.IndexOf(sortedTools.LastOrDefault()); sortedTools.Sort(CompareObjectsBySortOrder); foreach (var tool in sortedTools) { parent.Children.Remove(tool); parent.Children.Insert(lastToolIndex, tool); if (tool.IsInstanceOf("assembly_tool")) SortChildTools(tool); } int CompareObjectsBySortOrder(ProcessableObject obj1, ProcessableObject obj2) { if (obj1 == obj2) return 0; var obj1Index = int.MaxValue; var obj2Index = int.MaxValue; for (var i = 0; i < toolsSortOrder.Count; i++) { if (obj1.IsInstanceOf(toolsSortOrder[i])) obj1Index = i; if (obj2.IsInstanceOf(toolsSortOrder[i])) obj2Index = i; } var result = obj1Index.CompareTo(obj2Index); if (result == 0) { result = originalOrder.IndexOf(obj1).CompareTo(originalOrder.IndexOf(obj2)); } return result; } }