Всем привет.
Мой плагин проходит по всем листам в проекте и получает данные из параметров штампов (TitleBlock). При этом нигде не участвует транзакций. Да и запускается это все из контекста модального окна.
Однако при работе плагина происходит регенерация графики на листах и работа происходит оооочень долго!
В основном методе я сначала получаю коллекцию листов
FilteredElementCollector collector = new FilteredElementCollector(doc);
viewElems.AddRange(collector.OfClass(typeof(ViewSheet)).ToElements());
Затем делаю по ним итерацию с вызовом метода чтения из штампов
for (var i = 0; i < viewElems.Count; i++)
{
    // Progress
    // ReSharper disable once PossibleLossOfFraction
    CurrentProgress = (i + 1) * 100 / viewElems.Count;
    OnPropertyChanged(nameof(CurrentProgress));
    System.Windows.Forms.Application.DoEvents();
    //------------------------------------------------
    var element = viewElems[i];
    ViewSheet view = (ViewSheet)element;
    if (!view.IsTemplate && view.ViewType == ViewType.DrawingSheet)
    {
        GetDataFromTitleBlock(view, allowedParamsInStamp, allowedSignParams);
        GetDataFromView(view, allowedParamsInStamp);
        // Добавляем в глобальный список, чтобы в других действиях не получать его опять
        _currentDocViewSheets.Add(view);
        // Добавляем в список вывода
        Sheets.Add(new SheetViewListItem
        {
            SheetNumber = view.SheetNumber,
            Name = view.Name,
            Id = view.Id,
            Blocked = false,
            BlockedBy = String.Empty
        });
    }
}
Ну и сам метод:
private void GetDataFromTitleBlock(ViewSheet viewSheet, List<string> allowedParameters, List<string> allowedSignParams)
{
    var doc = Revit_ProjectCardCommand.RevitApp.ActiveUIDocument.Document;
    FilteredElementCollector collector = new FilteredElementCollector(doc, viewSheet.Id).OfCategory(BuiltInCategory.OST_TitleBlocks);
    foreach (Element element in collector)
    {
        if (element is FamilyInstance familyInstance)
        {
            if(_readedTitleBlocks.Contains(familyInstance.Name)) continue;
            _readedTitleBlocks.Add(familyInstance.Name);
            // get nested families
            GetNestedFamiliesInstances(familyInstance, allowedSignParams, doc);
 
            foreach (Parameter parameter in element.Parameters)
            {
                if (!HasStampDataItem(parameter.Definition.Name) &&
                    allowedParameters.Contains(parameter.Definition.Name))
                {
                    StampDataItems.Add(CreateStampDataItemFromParameter(parameter));
                }
            }
        }
    }
}
Сейчас вот добавил сохранение имен прочитанных штампов - в коде видно:
if(_readedTitleBlocks.Contains(familyInstance.Name)) continue;
_readedTitleBlocks.Add(familyInstance.Name);
Однако это не повлияло на скорость вообще никак. Предполагаю, что регенерация вызывается при получении коллекции штампов:
FilteredElementCollector collector = new FilteredElementCollector(doc, viewSheet.Id).OfCategory(BuiltInCategory.OST_TitleBlocks);
Как бы мне этого избежать? Получается, что Ревит перерисовывает весь лист (все виды), а мне нужен только один элемент