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

Главная Форумы Задать вопрос Редактирование и загрузка семейств в проект.

Просмотр 1 сообщения - с 1 по 1 (всего 1)
  • Автор
    Сообщения
  • #8768 Score: 5
    Евгений
    Участник
    11 pts

    Коллеги, здравствуйте. На днях столкнулся с следующей проблемой.
    Во всех аннотациях проекта потребовалось заменить стиль текста.
    Решил поделиться основными методами по редактированию вложенных в семейство элементов, так как очень много времени потратил на поиск и понимание ключевого метода загрузки семейства. Вдруг кому то будет полезно.

    Ниже с код и описание. Я понимаю что некоторые моменты реализованы довольно криво, но переписывать не хочется.

    #Подгрузка библиотек:

    import clr
    clr.AddReference(‘RevitAPI’)
    import Autodesk
    from Autodesk.Revit.DB import *

    clr.AddReference(‘ProtoGeometry’)
    from Autodesk.DesignScript.Geometry import *

    clr.AddReference(“RevitServices”)
    import RevitServices
    from RevitServices.Persistence import DocumentManager
    from RevitServices.Transactions import TransactionManager

    # Далее следует самая важная часть которую я так до конца и не понял. В двух словах здесь создается класс с наследованием от интерфейса загрузки семейства с описанием методов загрузки. В общем этот класс нужно использовать в любом случае, так как через обычное обращение к методам OnFamilyFound и OnSharedFamilyFound почему то не работает. Этот класс нужно просто закопипастить к себе в код и обращаться к нему при загрузке семейства обратно в проект.

    class FamilyOption(IFamilyLoadOptions):
    def OnFamilyFound(self, familyInUse, overwriteParameterValues):
    overwriteParameterValues = True
    return True

    def OnSharedFamilyFound(self, sharedFamily, familyInUse, source, overwriteParameterValues):
    source = FamilySource.Family
    overwriteParameterValues = True
    return True

    # Это просто моя функция для разворачивания элемента. Здесь не используется

    def U(elem):
    a = UnwrapElement(elem)
    return a

    # Далее мы получаем текущий документ

    doc = DocumentManager.Instance.CurrentDBDocument

    # Создание списков

    test = []
    test2 = []
    AnnIds = []
    Anns = []
    ts = []

    # Далее я получаю все семейства и отфильтровываю аннотации
    Annotation = FilteredElementCollector(doc).OfClass(Autodesk.Revit.DB.FamilySymbol).ToElements()
    for i in Annotation:
    if str(i.Category.CategoryType) == “Annotation”:
    if i.Family.Id not in AnnIds:
    AnnIds.append(i.Family.Id)
    Anns.append(i.Family)

    # Получив нужные для редактирования семейства создаю цикл для их обработки. Прошу прощения что поленился нормально все назвать.
    Далее начинаются основные моменты .

    for family in Anns:
    famDoc = doc.EditFamily(family)  # открываем семейство и получаем документ семейства.
    ELS = FilteredElementCollector(famDoc).OfClass(TextElement).ToElements()  # собираем все текстовые аннотации внутри открытого семейства

    for i in ELS: # далее перебираем аннотации
    if i.Symbol.Id.ToString() not in ts: # отфильтровываем повторяющиеся
    t = Transaction(famDoc)  # открываем транзакцию для семейства. Транзакция через TransactionManager почему то не всегда срабатывает, а эта норм.
    t.Start
    i.Symbol.LookupParameter(“Шрифт текста”).Set(“Arial”) # находим параметр по его имени через LookupParameter и устанавливаем значение через Set.
    ts.append(i.Symbol.Id.ToString())

    t.Commit  # Закрываем транзакцию
    famDoc.LoadFamily(doc, FamilyOption()) # И ключевая строка в этом коде, которая загружает семейство в основную модель используя созданный в самом начале класс FamilyOption() .
    famDoc.Close(False)  # Закрываем семейство без сохранения

    OUT = Anns

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