Найти тему

REVIT API. PyRevit. Конвертация IFC в RVT

Оглавление

Введение

Давно меня не было, занимался чем-то координаторским. Одна из таких координаторских задач была: "подружить IFC и RVT"

Кто разбирается скажет: "И что тут сложного, добавляй IFC в модель Revit как связь и все тут", но только вот их ~40 и общих координат не существует, начало координат не совпадает, а если и удастся их с позиционировать, то через неделю пришлют новые, и все сначала.

Может возникнуть пару вопрос:

  • Почему IFC?
    Среды разработки разные - Rhino и, прости господи, Archicad
  • Почему координаты не бьются?
    Упустили этот момент в самом начале

Другими словами - работает с тем что есть.
Изначальная идея была такая:

  • Перегоняем IFC в RVT путем открытия Revitом IFC файлов (Это оказалось таким долгим и нудным процессом, что заняло неделю)
  • Расставляем новые RVT в модели и передаем им общую площадку (заняло 8 часов)

И всю эту долгую работу можно выкинуть как только получим новую выгрузку.

Идем автоматизировать!

КОД

Открытие IFC файла

Напишем вот такую функцию:

-2

Нам потребуется метод OpenIFCDocument()

OpenIFCDocument Method (String, IFCImportOptions)
-3

У метода две перегрузки, с заделом на будущее, я решил использовать вторую, но по итогу, так IFCImportOption и не пригодилось. Можете смело брать первый вариант.

OpenIFCDocument() вызывается от app, не забывает определить эту переменную:

app = `__revit__`.`Application`

В случае удачной работы метода, мы получим модель RVT открытую в фоном режиме, то есть мы не сможем с ней взаимодействовать через интерфейс. Сам
же метод вернет её Document.

Так же поместил открытие в try, except на случай ошибок.

Сохранение

Как я сказал ранее, модель хоть и открылась, но в фоне, а значит мы не можем ее сохранить через интерфейс - пишем сохранялку.

-4

Тут нам поможет метод SaveAs() вызываем у Document.

SaveAs Method (ModelPath, SaveAsOptions)

У него аж 3 перегрузки:

-5

Так же я решил настроить как она будет сохранятся.
Для этого создается экземпляр класса
SaveAsOptions

SaveAsOptions Class

и задаю ему некоторые свойства:

-6

В случае удачи возвращаю True
В случае Ошибки - печатаю текст и возвращаю False

Имя площадки (не обязательно)

Еще мне захотелось поменять имя площадки в новой RVT модели.

-7

Тут все просто, открываем транзакцию, получаем имя площадки и присваиваем ей другое имя, закрываем транзакцию

Логирование (не обязательно)

Захотел еще создавать файл csv с фиксацией работы скрипта

-8

Тут ничего не обычного:

logger=[] - пустой список который будет набираться по мере выполнения кода. А после сразу весь запишется через вызов функции save_log

Один момент на который хочется акцентировать внимание это импорт библиотеки codecs.

Это нужно для изменения кодировки. Если бы это был чистый python, достаточно было бы в метод open, указать аргумент encoding, но так как это ironpython, необходимо использовать codecs.

Пользовательский интерфейс (не обязательно)

-9

Тут большой кусок кода и все ради такого вот интерфейса

-10

Его я в этой статье описывать не буду. Когда-нибудь я доберусь до flexform модуля rpw и напишу статью, но не сегодня

Вот ссылка для самостоятельно изучения

rpw.ui — Revit Python Wrapper 1.7.4 documentation

MAIN

Тут много всякого и написано криво, мне прямо не нравится, возможно исправлю потом.

Так как Дзен не умеет в увелечнеия размера смотрите код в
Так как Дзен не умеет в увелечнеия размера смотрите код в

А вообще все что мы тут делаем это:
1. Получаем список путей к IFC файлам
2. Указываем папку для сохранения RVT
3. Открываем модели (конвертируем)
4. Меняем имя площадки
5. Сохраняем
6. Закрываем

Обращу внимание лишь на то, что я сделал сортировку по размеру IFC

-12

Как показала практика, ошибки конвертации происходят только на больших моделях и не всегда.

Весь код здесь:

Revit. IFC to RVT

Заключение

Спасибо за внимание.

Подписывайтесь пожалуйста на этот дзен и тг:

pyRevit | BIM. Илья Нистратов

На дзен можно и не подписываться, он кривой, главное тг.