Найти тему

Пакетная загрузка и обновление семейств

Оглавление

Всем привет. Сегодня расскажу, как с помощью Revit API быстро загрузить семейства в проект. Рассмотрим 2 варианта: загрузить все семейства из папки, и загрузить все семейства из одного проекта в другой. А так же расскажу, как сделать так, чтобы при этом автоматически заменялись версии существующих семейств, заменялись значения параметров, и заменялись общие вложенные семейства.

Интерфейс IFamilyLoadOptions

Начнём сразу с самой интересной части нашей статьи. Этот интерфейс позволяет нам управлять тем, как мы загружаем семейства, и на какие кнопки в каких ситуациях нажимаем. Нажимаем, конечно, условно — вместо нажатия реальных кнопок мы говорим Ревиту, что ему надо делать вот здесь:

И, разумеется, вот здесь:

-2

Напишем реализацию этого интерфейса, чтобы при нахождении семейства оно заменялось, а при нахождении общего — заменялось и оно, при этом в обоих случаях с заменой значений параметров:

-3

Как понимать этот код:

  1. return true в обоих случаях говорит нам: "Да, если семейство (общее семейство) найдено в проекте, мы хотим его заменить".
  2. overwriteParameterValues говорит, что мы хотим заменить с заменой значений параметров.
  3. А FamilySource.Family — что мы берём ту версию общего вложенного, которое есть в основном семействе, которое мы загружаем, а не из проекта.

Загрузка в проект всех семейств из папки

Кстати, вы знали, что в Ревите есть встроенная функция выгрузки всех семейств из проекта по указанному адресу?:

-4

Впрочем, как именно вы получили папку с семействами, тут не особо важно. Попробуем загрузить их все через код. Тут мы будем использовать метод LoadFamily класса Document, вызвав его на текущем документе:

-5

Учтите, что при загрузке семейства не должно быть открытых (начатых) транзакций. Но может быть открыта группа транзакций, чтобы в итоге загрузка всех семейств попала в одну строчку в стеке отмены.

Загрузка в проект семейств из другого проекта

Как вы наверное поняли (особенно если посмотрели на LoadFamily в revitapidocs), мы просто будем использовать другую перегрузку того же метода. Но тут код будет чуть хитрее:

-6
  1. Нам обязательно нужен второй открытый документ (переменная sourceDocument)
  2. В нём мы ищем все семейства.
  3. И открываем их для редактирования (да, Ревит откроет семейство в фоне, но мы не увидим его в UI). Это нужно из-за того, что LoadFamily принимает документ, а не семейство, а чтобы получить его, нужно открыть семейство.
  4. Затем я использую блок try-finally, чтобы при любом исходе операции открытое семейство было бы закрыто.
  5. FamilyLoadOptions обеспечат правильную замену существующих семейств.

Как и в первом случае, транзакция нам не нужна (но можно использовать группу транзакций)

Заключение

На этом на сегодня всё. Несмотря на кажущуюся сложность темы, именно перезагрузка загружаемых (уж простите за тавтологию) семейств в Revit API орагнизована довольно таки удобно, чего не сказать о замене системных семейств.

Не забывайте подписываться на мой телеграм-канал о Revit API и до новых встреч!

-7