/// <summary> /// Нумерация элементов в спецификации /// </summary> /// <param name="numerateData">Данные для нумерации</param> public void NumerateInSchedule(InScheduleNumerateData numerateData) { if (_doc.ActiveView is ViewSchedule viewSchedule) { var newNumbers = CollectElementsInSchedule(numerateData, viewSchedule, out var canByTypeParameter); if (newNumbers.Any()) { ProceedNumeration(numerateData, newNumbers, canByTypeParameter); } } }
private IDictionary <Element, int> CollectElementsInSchedule( InScheduleNumerateData numerateData, ViewSchedule viewSchedule, out bool canBeTypeParameter) { var newNumbers = new Dictionary <Element, int>(); // Если стоит галочка "Для каждого экземпляра", то получаем сортированный список и нумерация // происходит далее. Иначе получаем сортированный список по строкам и сразу нумеруем if (viewSchedule.Definition.IsItemized) { canBeTypeParameter = false; var elements = new FilteredElementCollector(_doc, viewSchedule.Id) .Where(e => e.IsValidObject && numerateData.GetParameter(e, false, out _) != null) .ToList(); List <Element> sortElements; using (var transaction = new Transaction(_doc)) { transaction.Start("Find in itemized table"); sortElements = GetSortedElementsFromItemizedSchedule(viewSchedule, elements); transaction.RollBack(); } for (var i = 0; i < sortElements.Count; i++) { var e = sortElements[i]; var markValue = numerateData.OrderDirection == OrderDirection.Ascending ? numerateData.StartValueInt + i : sortElements.Count + numerateData.StartValueInt - i - 2; newNumbers.Add(e, markValue); } } else { canBeTypeParameter = true; List <RowData <int> > sortedElementsByRows; if (numerateData.InScheduleNotItemizedAlgorithm == InScheduleNotItemizedAlgorithm.ByDeleteRows) { using (var transaction = new Transaction(_doc)) { transaction.Start("Find in rows"); sortedElementsByRows = GetSortedElementsFromNotItemizedScheduleByDeleteRows(viewSchedule) .Where(e => e.Items.Count > 0) .ToList(); transaction.RollBack(); } } else { var elements = new FilteredElementCollector(_doc, viewSchedule.Id) .Where(e => numerateData.GetParameter(e, true, out _) != null) .ToList(); using (var transaction = new Transaction(_doc)) { transaction.Start("Find in rows"); sortedElementsByRows = GetSortedElementsFromNotItemizedScheduleBySignalValue(viewSchedule, elements) .Where(e => e.Items.Count > 0) .ToList(); transaction.RollBack(); } } if (sortedElementsByRows.Any()) { for (var i = 0; i < sortedElementsByRows.Count; i++) { foreach (var id in sortedElementsByRows[i].Items) { var markValue = numerateData.OrderDirection == OrderDirection.Ascending ? numerateData.StartValueInt + i : sortedElementsByRows.Count + numerateData.StartValueInt - i - 1; newNumbers.Add( _doc.GetElement(new ElementId(id)), markValue); } } } } return(newNumbers); }