AGR.Checker: что нового в плагине для проверки ЦИМ перед сдачей в АГР

Это продолжение истории про AGR.Checker — плагин для Revit, который мы с Андреем Прохоровым сделали для проверки ЦИМ на соответствие требованиям IDS перед сдачей в составе АГР. В прошлой статье я рассказывала про архитектуру, лицензирование и регистрацию программы в Роспатенте. С тех пор плагин поработал на реальных объектах, и почти всё новое в этой версии выросло из одного вопроса: «а почему вот это приходится проверять руками?»
Ниже — что мы добавили и какие инженерные задачи пришлось решить по дороге.
Экспорт в IFC с постобработкой
В конце прошлой статьи я обещала выгрузку IFC для последующей загрузки на СтроимПросто. Сделали.
Экспорт идёт через стандартное окно Revit: мы сознательно не стали собирать настройки экспорта программно. Недокументированные опции IFC-экспортёра вели себя по-разному в разных версиях Revit, и надёжнее оказалось дать пользователю привычное окно со своей конфигурацией и файлом маппинга.
Самое интересное начинается после экспорта. Плагин подписан на событие Revit о завершении экспорта и сразу же обрабатывает готовый IFC-файл:
удаляет элементы с IfcExportAs = -1. Это наш способ пометить то, что не должно попасть в модель для экспертизы;
удаляет косоуры лестниц. Требованиями они не нужны, а Revit их выгружает;
исправляет код МССК у маршей пандусов. При экспорте Revit копирует код с самого пандуса на его марши, и в файле у них оказывается одинаковый код.
Рядом с IFC сохраняется лог: что удалено, что исправлено и на что стоит посмотреть вручную. Постобработка работает с текстом IFC напрямую, без сторонних библиотек: разбирает сущности, удаляет лишние и вычищает ссылки на них из списков у остальных. Если на удалённый элемент есть одиночная ссылка (не в списке), плагин такую сущность не трогает, а пишет её в лог: молча ломать файл хуже, чем честно предупредить.
Проверка зон, о которой молчит Revit
Зоны оказались источником ошибок, которые нельзя найти, глядя на модель. Два случая мы теперь ловим автоматически.
Сторона контура, разбитая на сегменты. Одна прямая сторона зоны нарисована не одной линией границы, а двумя-тремя встык. В Revit всё выглядит нормально, площадь считается, предупреждений нет. А при выгрузке такая зона ведёт себя некорректно.
Проверка устроена так. Берём фактический контур зоны и сравниваем соседние отрезки: если оба прямые, направлены одинаково и второй продолжает первый — это разбитая сторона. Углы и дуги ошибкой не считаются. Стены, стоящие в одну линию, тоже нет: если контур идёт по стенам, заменить их одной линией всё равно нельзя. И отдельно отсекаем случай, когда Revit сам разбивает одну и ту же линию в месте, где к ней примыкает другая: это не ошибка модели.
Незамкнутая линия границы. Вторую проверку добавили после теста Андрея. Он нарисовал контур с разрывом и «хвостом», и первая версия проверки его не увидела. Причина понятная: проверка смотрела на зону, а если в незамкнутый контур зона не поставлена или Revit замкнул её через соседние границы, смотреть не на что.
Теперь проверяются сами линии границ. У каждой линии проверяем оба конца: конец должен совпадать с концом другой линии границы или лежать на ней (Т-образное примыкание). Свободный конец — это ошибка. Так ловятся и разрыв, и линия, выступающая за угол. Линии разных схем зонирования проверяются отдельно: схемы часто обводят одни и те же стены, и если смешать их линии, одна схема «закроет» ошибку другой.
Отдельная сложность — показать такую ошибку пользователю. Линии границ зон видны только на плане зонирования своей схемы и своего уровня. Если просто выделить их, пока открыт обычный план, выделение формально есть, а на экране ничего нет. Поэтому по двойному клику плагин сам находит нужный план зонирования, делает его активным, выделяет проблемные линии и приближает вид к ним.
Поиск дублей: где геометрия обманывает
Одинаковые элементы, стоящие друг в друге, — классика совместной работы: что-то скопировали дважды, что-то вставили повторно. Поиск дублей теперь входит в общую проверку, а найденные дубли попадают в тот же список ошибок, что и всё остальное.
Сравниваются только элементы одного семейства и типа. Для элементов в точке (двери, окна, колонны) — по точке вставки и повороту, для линейных — по концам линии расположения, для остальных — по габаритам.
Первая же проверка на реальной модели показала, почему «совпадает точка вставки» — недостаточное условие. Две колонны стояли одна над другой, не пересекаясь, а плагин считал их дублями. Дело в том, что точка вставки колонны лежит на отметке базового уровня и не учитывает смещения низа. У двух колонн с общим базовым уровнем точка одна и та же, хотя одна начинается на отметке 0, а другая на 3000. Теперь к точке и линии добавляются габариты элемента: настоящие дубли совпадают и по ним.
Второй урок — вложенные семейства. Дверь с перемычкой — это семейство, внутри которого сидят общие вложенные семейства перемычки и раствора. Если задвоена дверь, задвоены и они, и первая версия честно находила их как отдельные дубли. Но удалить вложенный элемент отдельно от двери Revit не позволяет. Теперь вложенные компоненты в поиск не попадают: дублем считается только дверь, а её части удаляются вместе с ней.
Удаление дублей устроено осторожно:
в каждой группе остаётся элемент с наименьшим ElementId, то есть созданный раньше остальных;
элементы внутри групп Revit не удаляются: удаление члена группы меняет все её экземпляры;
перед удалением плагин проверяет зависимые элементы. Если вместе со стеной-дублем Revit удалит двери и окна, которые сами дублями не являются, такая стена не удаляется, а остаётся в списке с пометкой;
всё удаление — одна транзакция, которая отменяется через Ctrl+Z.
Классификация помещений
Ещё одна рутинная задача — проставить помещениям коды классификатора «Помещения и зоны». На объекте это сотни помещений, и код для каждого ищется глазами по таблице.
Новая вкладка «Классификация» делает это по имени помещения. Правило строгое: код присваивается, только если имя встречается в классификаторе ровно один раз и именно в столбце «Помещение». Если то же название есть среди групп или зон («Гардеробная» — это и помещение, и зона), плагин не угадывает, а оставляет выбор человеку. При сравнении не учитываются регистр, лишние пробелы, «ё/е» и вид тире, в остальном нужно точное совпадение.
Результат показывается в два шага. Сначала таблица помещений, которым код присвоен автоматически, чтобы можно было глазами проверить результат. Затем таблица тех, для кого код определить не удалось, с причиной. Им можно назначить верхнеуровневое значение — группу помещений, — в том числе сразу нескольким выделенным строкам. Помещения с уже заполненным кодом не трогаются вообще.
Классификатор здесь, как и правила IDS в первой версии, — входные данные, а не код. Сначала я перенесла его из PDF прямо в сборку: таблица извлекалась по ячейкам, 639 строк, с исправлением опечаток в кодах. Но быстро стало понятно, что это то же самое, что зашить в код правила IDS: новая редакция классификатора означала бы пересборку плагина. Теперь классификатор — обычный текстовый файл «код — наименование», который подключается так же, как файл общих параметров. Плагин при загрузке проверяет его и показывает ошибки с номерами строк: повтор кода, неверный формат, помещение без вышестоящей группы.
Список ошибок стал читаемее
В первой статье я писала, что проверка идёт по группам, чтобы пользователь получал одну понятную строку вместо сотни одинаковых. На практике выяснилось, что этот принцип нужно довести до конца и в самой таблице результатов. У зоны пять незаполненных базовых атрибутов — пять строк, у двадцати зон того же типа — сто.
Теперь однотипные замечания для одной категории, семейства и типа объединяются в одну строку. В столбце ElementId видны первые три идентификатора и общее количество, а щелчок по ним открывает окно со всеми Id. Их можно скопировать в формате, который принимает команда Revit «Выбрать по коду», или сразу выделить элементы в модели. Все действия — исправление значений, выбор в модели, экспорт в CSV — работают с исходными замечаниями, так что группировка ничего не прячет.
Мелочи, которые на деле не мелочи
Окна результатов стали немодальными. Выделить элементы в Revit из стороннего окна можно только через внешнее событие, а оно не срабатывает, пока открыт модальный диалог. Поэтому все окна, где есть «Выбрать в модели», теперь не блокируют Revit.
Окно плагина следит за документом. Если открыть окно, закрыть проект и открыть его снова, окно продолжало работать со старым, уже недействительным документом, и любая кнопка давала ошибку Revit API. Теперь при повторном запуске плагин проверяет, для какого документа открыто окно, и при необходимости открывает новое.
Ошибка на одном элементе больше не обрывает всю операцию. Например, у части элементов с точкой вставки (помещений, зон) нет поворота, и Revit на запрос поворота отвечает исключением. Такие случаи обрабатываются точечно, а подробности пишутся в журнал, который можно приложить к обращению в поддержку.
Инструкции внутри плагина. Руководство пользователя открывается кнопкой прямо из окна. Отдельная короткая инструкция по получению лицензии открывается на самом первом шаге, когда плагин показывает отпечаток компьютера: что сохранить, кому отправить, как установить.
Что дальше
Плагин продолжает работать на наших объектах, и список идей по-прежнему пополняется из практики.
А какие ошибки в моделях для АГР вы ловите чаще всего — и какие до сих пор приходится искать руками?
KioskNews shows a cleaned-up reading view extracted from the publisher’s page — the original always lives on their site, not ours.