Всем привет. Сегодня расскажу, как с помощью Revit API быстро загрузить семейства в проект. Рассмотрим 2 варианта: загрузить все семейства из папки, и загрузить все семейства из одного проекта в другой. А так же расскажу, как сделать так, чтобы при этом автоматически заменялись версии существующих семейств, заменялись значения параметров, и заменялись общие вложенные семейства.
Интерфейс IFamilyLoadOptions
Начнём сразу с самой интересной части нашей статьи. Этот интерфейс позволяет нам управлять тем, как мы загружаем семейства, и на какие кнопки в каких ситуациях нажимаем. Нажимаем, конечно, условно — вместо нажатия реальных кнопок мы говорим Ревиту, что ему надо делать вот здесь:
И, разумеется, вот здесь:
Напишем реализацию этого интерфейса, чтобы при нахождении семейства оно заменялось, а при нахождении общего — заменялось и оно, при этом в обоих случаях с заменой значений параметров:
Как понимать этот код:
- return true в обоих случаях говорит нам: "Да, если семейство (общее семейство) найдено в проекте, мы хотим его заменить".
- overwriteParameterValues говорит, что мы хотим заменить с заменой значений параметров.
- А FamilySource.Family — что мы берём ту версию общего вложенного, которое есть в основном семействе, которое мы загружаем, а не из проекта.
Загрузка в проект всех семейств из папки
Кстати, вы знали, что в Ревите есть встроенная функция выгрузки всех семейств из проекта по указанному адресу?:
Впрочем, как именно вы получили папку с семействами, тут не особо важно. Попробуем загрузить их все через код. Тут мы будем использовать метод LoadFamily класса Document, вызвав его на текущем документе:
Учтите, что при загрузке семейства не должно быть открытых (начатых) транзакций. Но может быть открыта группа транзакций, чтобы в итоге загрузка всех семейств попала в одну строчку в стеке отмены.
Загрузка в проект семейств из другого проекта
Как вы наверное поняли (особенно если посмотрели на LoadFamily в revitapidocs), мы просто будем использовать другую перегрузку того же метода. Но тут код будет чуть хитрее:
- Нам обязательно нужен второй открытый документ (переменная sourceDocument)
- В нём мы ищем все семейства.
- И открываем их для редактирования (да, Ревит откроет семейство в фоне, но мы не увидим его в UI). Это нужно из-за того, что LoadFamily принимает документ, а не семейство, а чтобы получить его, нужно открыть семейство.
- Затем я использую блок try-finally, чтобы при любом исходе операции открытое семейство было бы закрыто.
- FamilyLoadOptions обеспечат правильную замену существующих семейств.
Как и в первом случае, транзакция нам не нужна (но можно использовать группу транзакций)
Заключение
На этом на сегодня всё. Несмотря на кажущуюся сложность темы, именно перезагрузка загружаемых (уж простите за тавтологию) семейств в Revit API орагнизована довольно таки удобно, чего не сказать о замене системных семейств.
Не забывайте подписываться на мой телеграм-канал о Revit API и до новых встреч!