Компоненты легенды
Главная › Форумы › Задать вопрос › Компоненты легенды
Помечено: компонент легенды, начальные скрипты, списки, строки
- В этой теме 19 ответов, 4 участника, последнее обновление 6 лет, 2 месяца назад сделано Анатолий.
-
АвторСообщения
-
SergeУчастник
Здравствуйте, уважаемые коллеги! Хочу выразить огромную благодарность создателю форума и его участникам, ведь именно вы сподвигли меня на обучение Dynamo!
Возникла идея создать скрипт, который автоматически размещает компоненты легенд всех окон, которые используются в проекте. Так как способа создания и размещения компонентов на легенде я не нашел, было принято решение поступать следующим образом: изначально на проекте размещен один компонент легенды, который будет копироваться необходимое количество раз, а его параметр “Тип компонента” будет изменяться. Однако параметр “тип компонента ” с помощью нода Element.SetParameterByName изменить не возможно – выскакивает предупреждение, в котором говорится о том, что параметр не является строкой. В ревитАПИ также не нашел подобного метода.
Сталкивался ли кто-то с подобной проблемой и как можно решить данную проблему?
Я не повял суть вопроса,но задам встречный вопрос:если не является строкой, почему нельзя его сделать строкой?
жирный текстом выделены произвольные имена и значения переменных, для примера, то, что ты получаешь из скрипта выше:
# Пример. Меняем тип окна Window на другой
TransactionManager.Instance.EnsureInTransaction(doc)
UnwrapElement(Window).ChangeTypeId(ElementId(33067)) # Через id как int (т.е. число)
UnwrapElement(Window).ChangeTypeId(ElemId) # или id как Element ID
TransactionManager.Instance.TransactionTaskDone()SergeУчастникАлександр, я еще только в начале пути изучения динамо и питона, не могли бы вы подсказать ,как возможно данный параметр сделать строкой?
Для того, чтобы было понятнее, что я хочу сделать и в чем проблема, сделала несколько скринов.
Legantmar, проблема, что именно в компоненте легенды, typeID равен нулю. Это видно на последнем скрине revitlookup.
Преобразование объекта в строку String from Object.
Вот здесь просмотрите начальные знания подробно я и регулярно я обновляю информацию:
SergeУчастникКак раз вчера изучал ваши примеры со списком :) очень полезная подборка, спасибо!
нод string from object возвращает СТРОКУ из объекта, а не наоборот. мне нужно строку превратить в параметр, который не является строкой.
нод object.type, который возвращает тип объекта, представленного в виде строки выдает: Revit.Elements.UnknownElement
Пока не знаю.У себя не нашел компоненты легенды,Категория легенды тоже нет.
Обрати внимание на :, после параметра это означает значение, а у тебя параметр:значение:значение.Я с таким еще не встречался. Есть параметры, которые мы видим, но не можем поменять напрямую в лоб. К примеру длина воздуховода и т.д.
Для примера.
Выбираем первое окно и второе окно
После запуска скрипта тип первого окна назначается второму
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)Пишут, что создание легенды из 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) # и присваиваем новое имяSergeУчастникСпасибо, Legantmar! Я видел в документации параметр Legend_components, но не знал как до него добраться. Это то, что нужно!
Истина где-то близко! А можно ли с помощью метода get_parameter получить информацию от элемента, какой компонент легенды принадлежит конкретному элементу?
Я хочу разместить все компоненты легенды в одной легенде вместо создания множества видов под каждое окно, поэтому думаю воспользоваться нодом element.CopyByVector из пакета Clockwork. Но такой вариант тоже подходит, СПАСИБО!
SergeУчастникНашел в справке LegendComponent среди PostableCommand Enumeration в Autodesk.Revit.UI. Ее описание:
Adds a graphic representation of a selected model element to a legend view.
Возможно это как раз то, что мне нужно, но я не знаю, как это применить. больше информации я не нашел# Получаешь все элементы размещенные на разных легендах (в твоем случае это окна)
windows = FilteredElementCollector(doc).OfCategory(BuiltInCategory.OST_LegendComponents).WhereElementIsNotElementType().ToElements()
# Выводишь имена легенд на которых размещены твои элементы
OUT = [doc.GetElement(i.OwnerViewId).Name for i in windows]SergeУчастникOwnerViewId выдает виды, на которых размещены компоненты легенды. Это не то. Мне нужно узнать ID компонентов_легенды объектов окон, которые используются в проекте.
Может быть я не правильно объяснял, попробую еще раз: у меня есть проект дома. в доме есть окна. В проекте у меня есть легенда, которая называется “Эскизы окон”, и в нее я хочу автоматически расположить все окна, которые есть в доме. Семейства на легенду вставлять нельзя. На легенду вставляются только компоненты легенды этих семейств, которые могут принимать различные виды: спереди, сбоку, сверху. Вставляются они через Аннотации/Компонент/Компоненты легенды. Каждому типу семейства окон принадлежит конкретный компонент легенды. Вот мне и нужно найти id каждого компонента легенды, которые относятся к типам окон, которые представлены в проекте.
Как я себе вижу
1) Собираешь список всех окон в проекте (через Filtered .. .WhereElementIsNotElementType().ToElements())
2) Определяешь ID семейств типов этих окон (через doc.GetElement(window.GetTypeId()).Id (через Set(list) оставляешь уникальные)
3) Собираешь список всех компонентов легенды с одновременным определением ID типа элемента внутри (см.8392 и (2)) – соединяешь 2 списка через zip
4) в циклах проходишь по списку из (2) и из (3) при совпадении их Id типов, получаешь компонент легенды (или его Id)SergeУчастникс одновременным определением ID типа элемента внутри – не совсем понял. как это можно сделать?
что такое zip? где об этом можно почитать?
Я только начинаю осваивать питон и динамо, поэтому пока не все понятно
-
АвторСообщения
- Для ответа в этой теме необходимо авторизоваться.