Загрузка(выгрузка) связанных файлов через Dynamo
Главная › Форумы › Задать вопрос › Загрузка(выгрузка) связанных файлов через Dynamo
- В этой теме 4 ответа, 4 участника, последнее обновление 2 года, 5 месяцев назад сделано
Dmitry.
-
АвторСообщения
-
anchim678
УчастникЗдравствуйте. Необходимо автоматически подгрузить связанный файл в проект через Dynamo, скопировать определенные параметры данного связанного файла в проект и удалить связанный файл. Реально ли сделать это в Dynamo?не нашел инфы в гугле.
Интересный вопрос.
Немного поискал, поигрался и что-то получилось, но без python как мне думается не обойтись.
Далее много кода и пояснения.
Небольшое предисловие – у меня есть некий файлик со стенками. будем считать, что его делают архитекторы и мне предоставляют линк.
Моя задача (для примера) – загрузить этот линк, получить некоторые параметры (линии стен, базовые зависимости и смещения сверху) и воссоздать у себя эти стенки, далее удалить линк.Весь код строится по следующему плану:
1) Для работы нужно подключить некоторые библиотеки
2) Загрузить линк файл rvt
3) Найти в линк файле все стенки (в твоем примере может быть что-то свое)
4) Получить от них некоторые параметры
5) Построить новые стенки по этим параметрам
6) Удалить линк-файл (или выгрузить)Подключаем необходимые библиотеки (без которых ничего не получится)
import clr, System clr.AddReference('RevitAPI') import Autodesk from Autodesk.Revit.DB import * clr.AddReference("RevitServices") import RevitServices from RevitServices.Persistence import DocumentManager from RevitServices.Transactions import TransactionManager doc = DocumentManager.Instance.CurrentDBDocument
Загружаем линк файл
testFile = r"D:\Test_room.rvt" # абсолютный путь к моему ревит файлу (можно подать на вход нода, тогда testFile = IN[0]) # пример нашел на форуме Autodesk linkpath = ModelPathUtils.ConvertUserVisiblePathToModelPath(testFile) options = RevitLinkOptions(False) TransactionManager.Instance.EnsureInTransaction(doc) result = RevitLinkType.Create(doc, linkpath, options) RevitLinkInstance.Create(doc, result.ElementId) TransactionManager.Instance.TransactionTaskDone()
Найдем линки
collector = FilteredElementCollector(doc) # создали коллектор filter = ElementCategoryFilter(BuiltInCategory.OST_RvtLinks) # создали фильтр по категории RvtLinks linkinst=collector.WherePasses(filter).WhereElementIsNotElementType().ToElements() # link instance linkdoc = [] for i in linkinst: linkdoc.append(i.GetLinkDocument()) # link documents
Найдем все стенки в линк файле (файлах)
# Получаем все стены из линк файлаfor i in linkdoc: walls = FilteredElementCollector(i).OfCategory(BuiltInCategory.OST_Walls).WhereElementIsNotElementType().ToElements()
Строим свои новые стенки по референс стенкам из линка
level = UnwrapElement(IN[0]) # Из стен достаем location curve и строим новые стены newWalls = [] for i in walls: TransactionManager.Instance.EnsureInTransaction(doc) curve = i.Location.Curve wall = Autodesk.Revit.DB.Wall.Create(doc, curve, level.Id, 0) baseLevel = i.LookupParameter("Базовая зависимость").AsElementId() topLevel = i.LookupParameter("Зависимость сверху").AsElementId() z = i.LookupParameter("Смещение сверху").AsDouble() wall.LookupParameter("Базовая зависимость").Set(baseLevel) wall.LookupParameter("Зависимость сверху").Set(topLevel) wall.LookupParameter("Смещение сверху").Set(z) newWalls.append(wall) TransactionManager.Instance.TransactionTaskDone()
Удаляем ранее созданный RevitLinkType с именем result
TransactionManager.Instance.EnsureInTransaction(doc) doc.Delete(result.ElementId) # удалить Link TransactionManager.Instance.TransactionTaskDone()
Поехала вся табуляция, поэтому прилагаю оригинал кода (достаточно скопировать в питон нод)
anchim678
УчастникДа, получилось, спасибо огромное. Странно, тоже искал на форуме автодеск, видимо плохо.
Аноним
НеактивированныйА можно ли подобным образом скопировать стандарты проекта (например параметры печати) из связанного файла?
Dmitry
УчастникСпасибо за скрипт, очень помогло в моей задаче.
А не подскажете, если элементы из текущего файла копируются в др. файл, как открыть для него транзакцию?
на IN[3] – документ, куда хочется скопировать элементы
TransactionManager.Instance.EnsureInTransaction(IN[3]) # пытался открыть транзакцию так, но не работает.
ElementTransformUtils.CopyElements(doc,copy_elements,IN[3], None, Opt) # из текущего файла в текущий файл работает нормально.
-
АвторСообщения
- Для ответа в этой теме необходимо авторизоваться.