Загрузка(выгрузка) связанных файлов через Dynamo

Главная Форумы Задать вопрос Загрузка(выгрузка) связанных файлов через Dynamo

Просмотр 5 сообщений - с 1 по 5 (из 5 всего)
  • Автор
    Сообщения
  • #7984 Score: 0
    anchim678
    Участник

    Здравствуйте. Необходимо автоматически подгрузить связанный файл в проект через Dynamo, скопировать определенные параметры данного связанного файла в проект и удалить связанный файл. Реально ли сделать это в Dynamo?не нашел инфы в гугле.

    #7992 Score: 3
    Legantmar
    Хранитель
    474 pts

    Интересный вопрос.
    Немного поискал, поигрался и что-то получилось, но без 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()

    Поехала вся табуляция, поэтому прилагаю оригинал кода (достаточно скопировать в питон нод)

    #7995 Score: 0
    anchim678
    Участник

    Да, получилось, спасибо огромное. Странно, тоже искал на форуме автодеск, видимо плохо.

    #7997 Score: 0
    Аноним
    Неактивированный

    А можно ли подобным образом скопировать стандарты проекта (например параметры печати) из связанного файла?

    #10758 Score: 0
    Dmitry
    Участник

    Спасибо за скрипт, очень помогло в моей задаче.

    А не подскажете, если элементы из текущего файла копируются в др. файл, как открыть для него транзакцию?

    на IN[3] – документ, куда хочется скопировать элементы

    TransactionManager.Instance.EnsureInTransaction(IN[3]) # пытался открыть транзакцию так, но не работает.

    ElementTransformUtils.CopyElements(doc,copy_elements,IN[3], None, Opt) # из текущего файла в текущий файл работает нормально.

Просмотр 5 сообщений - с 1 по 5 (из 5 всего)
  • Для ответа в этой теме необходимо авторизоваться.