Всем привет! Сегодня расскажу, как через API посмотреть список предупреждений документа, а так же покажу, как можно избавиться от некоторых из них. Поехали!
Предупреждения документа
Это предупреждения, которые сами по себе не мешают работе, но могут замедлять работу файла при большом их количестве. Кроме того, некоторые из них предупреждают о грубых ошибках модели: например, "В одном и том же месте имеются идентичные экземпляры".
Вот так выглядит окно с предупреждениями в интерфейсе Ревит:
Давайте попробуем найти эту таблицу через Revit Lookup. Выберем Snoop Document — GetWarnings:
Отсюда мы можем получить FailingElements и описание предупреждения.
Исправление дубликатов марок
Что ж, давайте смоделируем первую ситуацию: я назначу одинаковое значение параметра Марка для нескольких элементов, а затем устраню предупреждение через макрос:
Получился довольно простой макрос:
Тоже самое в редактируемом формате:
public void FixDuplicateMarks()
{
var document = this.ActiveUIDocument.Document;
var warnings = document.GetWarnings();
using (var transaction = new Transaction(document, "Исправление ошибок"))
{
transaction.Start();
foreach (var warning in warnings)
{
if (warning.GetDescriptionText() == "Элементы имеют повторяющиеся значения «Марка».")
{
var ids = warning.GetFailingElements();
foreach (var id in ids)
{
var element = document.GetElement(id);
element.get_Parameter(BuiltInParameter.ALL_MODEL_MARK).Set("");
}
}
}
transaction.Commit();
}
}
Тут всё просто: открываем транзакцию, проходимся по всем элементам и сбрасываем им значение марки. У вас может быть другая логика исправления этой ошибки — тогда вам надо реализовать её самостоятельно.
После запуска макроса предупреждение исчезло.
Исправление дубликатов элементов
Разберу ещё одну ситуацию: В одном и том же месте имеются идентичные экземпляры. Это приведет к дублированию позиций в спецификациях.
Тут будет похожий макрос, но мы будем удалять все элементы, кроме имеющего наименьший Id:
Я сортирую список по IntegerValue и убираю из него элемент с наименьшим Id (самый старый). Все остальные удаляются из документа.
Тоже самое в редактируемом формате для копирования:
public void FixDuplicates()
{
var document = this.ActiveUIDocument.Document;
var warnings = document.GetWarnings();
using (var transaction = new Transaction(document, "Исправление ошибок"))
{
transaction.Start();
foreach (var warning in warnings)
{
if (warning.GetDescriptionText() == "В одном и том же месте имеются идентичные экземпляры. " +
"Это приведет к дублированию позиций в спецификациях.")
{
var ids = warning.GetFailingElements().OrderBy(id => id.IntegerValue).ToList();
ids.RemoveAt(0);
document.Delete(ids);
}
}
transaction.Commit();
}
}
Заключение
На этом всё. Как обычно, не забывайте подписываться на мой телеграм-канал о Revit API, ставить лайки статье и звёздочки моим репозиториям на GitHub и до новых встреч!