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