Введение
Давно меня не было, занимался чем-то координаторским. Одна из таких координаторских задач была: "подружить IFC и RVT"
Кто разбирается скажет: "И что тут сложного, добавляй IFC в модель Revit как связь и все тут", но только вот их ~40 и общих координат не существует, начало координат не совпадает, а если и удастся их с позиционировать, то через неделю пришлют новые, и все сначала.
Может возникнуть пару вопрос:
- Почему IFC?
Среды разработки разные - Rhino и, прости господи, Archicad - Почему координаты не бьются?
Упустили этот момент в самом начале
Другими словами - работает с тем что есть.
Изначальная идея была такая:
- Перегоняем IFC в RVT путем открытия Revitом IFC файлов (Это оказалось таким долгим и нудным процессом, что заняло неделю)
- Расставляем новые RVT в модели и передаем им общую площадку (заняло 8 часов)
И всю эту долгую работу можно выкинуть как только получим новую выгрузку.
Идем автоматизировать!
КОД
Открытие IFC файла
Напишем вот такую функцию:
Нам потребуется метод OpenIFCDocument()
У метода две перегрузки, с заделом на будущее, я решил использовать вторую, но по итогу, так IFCImportOption и не пригодилось. Можете смело брать первый вариант.
OpenIFCDocument() вызывается от app, не забывает определить эту переменную:
app = `__revit__`.`Application`
В случае удачной работы метода, мы получим модель RVT открытую в фоном режиме, то есть мы не сможем с ней взаимодействовать через интерфейс. Сам
же метод вернет её Document.
Так же поместил открытие в try, except на случай ошибок.
Сохранение
Как я сказал ранее, модель хоть и открылась, но в фоне, а значит мы не можем ее сохранить через интерфейс - пишем сохранялку.
Тут нам поможет метод SaveAs() вызываем у Document.
У него аж 3 перегрузки:
Так же я решил настроить как она будет сохранятся.
Для этого создается экземпляр класса SaveAsOptions
и задаю ему некоторые свойства:
В случае удачи возвращаю True
В случае Ошибки - печатаю текст и возвращаю False
Имя площадки (не обязательно)
Еще мне захотелось поменять имя площадки в новой RVT модели.
Тут все просто, открываем транзакцию, получаем имя площадки и присваиваем ей другое имя, закрываем транзакцию
Логирование (не обязательно)
Захотел еще создавать файл csv с фиксацией работы скрипта
Тут ничего не обычного:
logger=[] - пустой список который будет набираться по мере выполнения кода. А после сразу весь запишется через вызов функции save_log
Один момент на который хочется акцентировать внимание это импорт библиотеки codecs.
Это нужно для изменения кодировки. Если бы это был чистый python, достаточно было бы в метод open, указать аргумент encoding, но так как это ironpython, необходимо использовать codecs.
Пользовательский интерфейс (не обязательно)
Тут большой кусок кода и все ради такого вот интерфейса
Его я в этой статье описывать не буду. Когда-нибудь я доберусь до flexform модуля rpw и напишу статью, но не сегодня
Вот ссылка для самостоятельно изучения
MAIN
Тут много всякого и написано криво, мне прямо не нравится, возможно исправлю потом.
А вообще все что мы тут делаем это:
1. Получаем список путей к IFC файлам
2. Указываем папку для сохранения RVT
3. Открываем модели (конвертируем)
4. Меняем имя площадки
5. Сохраняем
6. Закрываем
Обращу внимание лишь на то, что я сделал сортировку по размеру IFC
Как показала практика, ошибки конвертации происходят только на больших моделях и не всегда.
Весь код здесь:
Заключение
Спасибо за внимание.
Подписывайтесь пожалуйста на этот дзен и тг:
На дзен можно и не подписываться, он кривой, главное тг.