Компоненты легенды

Главная Форумы Задать вопрос Компоненты легенды

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

    Здравствуйте, уважаемые коллеги! Хочу выразить огромную благодарность создателю форума и его участникам, ведь именно вы сподвигли меня на обучение Dynamo!

    Возникла идея создать скрипт, который автоматически размещает компоненты легенд всех окон, которые используются в проекте. Так как способа создания и размещения компонентов на легенде я не нашел, было принято решение поступать следующим образом: изначально на проекте размещен один компонент легенды, который будет копироваться необходимое количество раз, а его параметр “Тип компонента” будет изменяться. Однако параметр “тип компонента ” с помощью нода Element.SetParameterByName изменить не возможно – выскакивает предупреждение, в котором говорится о том, что параметр не является строкой. В ревитАПИ также не нашел подобного метода.

    Сталкивался ли кто-то с подобной проблемой и как можно решить данную проблему?

    #8386 Score: 0
    Александр
    Участник
    16 pts

    Я не повял суть вопроса,но задам встречный вопрос:если не является строкой, почему нельзя его сделать строкой?

    #8387 Score: 0
    Legantmar
    Хранитель
    475 pts

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

    # Пример. Меняем тип окна Window на другой
    TransactionManager.Instance.EnsureInTransaction(doc)
    UnwrapElement(Window).ChangeTypeId(ElementId(33067)) # Через id как int (т.е. число)
    UnwrapElement(Window).ChangeTypeId(ElemId) # или id как Element ID
    TransactionManager.Instance.TransactionTaskDone()

    #8388 Score: 0
    Serge
    Участник

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

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

    Legantmar, проблема, что именно в компоненте легенды, typeID равен нулю. Это видно на последнем скрине revitlookup.

    #8389 Score: 0
    Александр
    Участник
    16 pts

    Преобразование объекта в строку String from Object.

    Вот здесь просмотрите начальные знания подробно я и регулярно я обновляю информацию:

    Примеры на все действия со списком в Dynamo

     

    #8390 Score: 0
    Serge
    Участник

    Как раз вчера изучал ваши примеры со списком :) очень полезная подборка, спасибо!

    нод string from object возвращает СТРОКУ из объекта, а не наоборот. мне нужно строку превратить в параметр, который не является строкой.

    нод object.type, который возвращает тип объекта, представленного в виде строки выдает: Revit.Elements.UnknownElement

    #8391 Score: 0
    Александр
    Участник
    16 pts

    Пока не знаю.У себя не нашел компоненты легенды,Категория легенды тоже нет.

    Обрати внимание на :, после параметра это означает значение, а у тебя параметр:значение:значение.Я с таким еще не встречался. Есть параметры, которые мы видим, но не можем поменять напрямую в лоб. К примеру длина воздуховода и т.д.

    #8392 Score: 1
    Legantmar
    Хранитель
    475 pts

    Для примера.

    Выбираем первое окно и второе окно

    После запуска скрипта тип первого окна назначается второму

    window1_Id = UnwrapElement(IN[0]).get_Parameter(BuiltInParameter.LEGEND_COMPONENT).AsElementId()
    window2 = IN[1]
    UnwrapElement(IN[1]).get_Parameter(BuiltInParameter.LEGEND_COMPONENT).Set(window1_Id)

    #8393 Score: 1
    Legantmar
    Хранитель
    475 pts

    Пишут, что создание легенды из RevitAPI в 2017 году было недоступно. Сейчас я тоже не нашел подходящего метода.
    Но можно сделать дубликат существующей легенды:

    view = doc.GetElement(ElementId(280422)) # 280422 – это Id существующей легенды, посмотрел через LookUp
    newName = “Новая легенда” # имя для новой легенды
    TransactionManager.Instance.EnsureInTransaction(doc)
    newId=view.Duplicate(ViewDuplicateOption.WithDetailing) # С детализацией или без
    TransactionManager.Instance.TransactionTaskDone()
    newView=doc.GetElement(newId) # Находим нашу созданную легенду
    newView.get_Parameter(BuiltInParameter.VIEW_NAME).Set(newName) # и присваиваем новое имя

    #8394 Score: 0
    Serge
    Участник

    Спасибо, Legantmar! Я видел в документации параметр Legend_components, но не знал как до него добраться. Это то, что нужно!

    Истина где-то близко! А можно ли с помощью  метода get_parameter получить информацию от элемента, какой компонент легенды принадлежит конкретному элементу?

    Я хочу разместить все компоненты легенды в одной легенде вместо создания множества видов под каждое окно, поэтому думаю воспользоваться нодом element.CopyByVector из пакета Clockwork. Но такой вариант тоже подходит, СПАСИБО!

    #8396 Score: 0
    Serge
    Участник

    Нашел в справке LegendComponent среди PostableCommand Enumeration в Autodesk.Revit.UI. Ее описание:
    Adds a graphic representation of a selected model element to a legend view.
    Возможно это как раз то, что мне нужно, но я не знаю, как это применить. больше информации я не нашел

    #8401 Score: 0
    Legantmar
    Хранитель
    475 pts

    # Получаешь все элементы размещенные на разных легендах (в твоем случае это окна)
    windows = FilteredElementCollector(doc).OfCategory(BuiltInCategory.OST_LegendComponents).WhereElementIsNotElementType().ToElements()
    # Выводишь имена легенд на которых размещены твои элементы
    OUT = [doc.GetElement(i.OwnerViewId).Name for i in windows]

    #8402 Score: 0
    Serge
    Участник

    OwnerViewId выдает виды, на которых размещены компоненты легенды. Это не то. Мне нужно узнать ID компонентов_легенды объектов окон, которые используются в проекте.

    Может быть я не правильно объяснял, попробую еще раз: у меня есть проект дома. в доме есть окна. В проекте у меня есть легенда, которая называется “Эскизы окон”, и в нее я хочу автоматически расположить все окна, которые есть в доме. Семейства на легенду вставлять нельзя. На легенду вставляются только компоненты легенды этих семейств, которые могут принимать различные виды: спереди, сбоку, сверху. Вставляются они через Аннотации/Компонент/Компоненты легенды. Каждому типу семейства окон принадлежит конкретный компонент легенды. Вот мне и нужно найти id каждого компонента легенды, которые относятся к типам окон, которые представлены в проекте.

    #8403 Score: 0
    Legantmar
    Хранитель
    475 pts

    Как я себе вижу
    1) Собираешь список всех окон в проекте (через Filtered .. .WhereElementIsNotElementType().ToElements())
    2) Определяешь ID семейств типов этих окон (через doc.GetElement(window.GetTypeId()).Id  (через Set(list) оставляешь уникальные)
    3) Собираешь список всех компонентов легенды с одновременным определением ID типа элемента внутри (см.8392 и (2))  – соединяешь 2 списка через zip
    4) в циклах проходишь по списку из (2) и из (3) при совпадении их Id типов, получаешь компонент легенды (или его Id)

    #8404 Score: 0
    Serge
    Участник

    с одновременным определением ID типа элемента внутри – не совсем понял. как это можно сделать?

    что такое zip? где об этом можно почитать?

    Я только начинаю осваивать питон и динамо, поэтому пока не все понятно

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