Всем привет.
Мой плагин проходит по всем листам в проекте и получает данные из параметров штампов (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);
Как бы мне этого избежать? Получается, что Ревит перерисовывает весь лист (все виды), а мне нужен только один элемент