Можно скачать и изучить SDK для ревита (но все примеры на C# и понадобится Visual Studio)
Мой примерный порядок действия в новой ситуации:
смотрю через RevitLookUp
смотрю Revit.DB (через dotPeek), ищу нужный элемент или метод и пр.
смотрю какие команды есть
применяю, смотрю результат, экспериментирую
иногда подходит dir(element), чтобы понять какие у него есть доступные команды
что конкретно требуется ? чтобы регистр букв либо игнорировался , либо нет ? или что ?
По индексам …
Вы задаете все что вам необходимо на выходе:
list_contain=[i for x in IN[1] for i in IN[0] if x in i]
list_not_contain=set(IN[0])-set(list_contain)
index_contain=[IN[0].index(i) for x in IN[1] for i in IN[0] if x in i]
а на выход OUT подаете все что вам нужно:
например если так:
OUT=list_contain, list_not_contain, index_contain
то будет список из 3 подсписков на выходе (далее в код блоке вы можете выбрать нужный , записав индекс этого подсписка , например a[0] – выдаст после код-блока list_contain и т.д.)
Может я ошибаюсь, но полагаю, что в конечном счете вам нужен список, содержащий определенные текстовые вхождения ? Если это так , то , при условии уникальности двух списков, как вариант :
(на выходе получаем: 1 список- список содержит … 2 список- не содержит…)
Код в питоне:
list_contain=[i for x in IN[1] for i in IN[0] if x in i]
list_not_contain=set(IN[0])-set(list_contain)
OUT=list_contain, list_not_contain
p.s. бывает, что нужно получить не сами элементы с вхождениями , а их индексы: index_contain=[IN[0].index(i) for x in IN[1] for i in IN[0] if x in i]
вроде все норм – в файле одно помещение с двумя окнами, в остальных помещениях окон нет, поэтому они и не попадают в список после нода GetSurraund, списки разные по длине ? но те помещения в которых окон нет они и не попадут в список. Вы же работаете только с элементами после нода List Deconstruct, так попробуйте (красным выделено подключение и не забудьте перед запуском удалить все площади из помещений)
@JON73, нужно отсеять элементы пространств из списка (например, через List.Deconstruct). Тогда Element.GetParameterValueByName не будет создавать пустых значений:
Ссылка на исправленный dyn файл: https://goo.gl/ZAVdW2
ок, а как в except прописать условие , чтобы при возникновении ошибки питон просто игнорировал ее и выполнял цикл дальше?
Пример , я делаю так: list=[стол, ракета, книга] - у "ракеты" есть параметр "скорость", у стола и книги нет.
my_list=[]
list_errors=[]
for i i in list:
Я конечно могу ошибаться , но для того чтобы как бы не хранить в памяти список , т.е. не создавать заполнение списка lits=[] , потом list.append
а хранить как бы виртуально этот список….
именно хранить тут: sorted(rooms(), key=…)
Поправьте , если не так…
p.s. мне очень нравится как построен код в ответе #5583 и я хочу научиться делать также)
Недавно возникла задача:
Найти трубы находящиеся рядом с определенной трубой (точнее трубами)
Если рассматривать одну такую трубу , то задача решается определением ее BoundingBox и расширением ее границ , нашел такой метод: def bb(x):
return x.BoundingBox
for i in IN[0]: #определенные трубы
outline = Outline(bb(i).MinPoint.ToXyz(), bb(i).MaxPoint.ToXyz())
offset=IN[1] #задаем смещение BoundingBox в [мм]
filter = BoundingBoxIntersectsFilter(outline, offset/304.8) #перевод единиц: [мм]=[футы]/304.8
collector = FilteredElementCollector(doc, doc.ActiveView.Id).WherePasses(filter)
to_els = [i.ToDSType(True) for i in collector]
list_all.append(to_els)
list_all – это список ВСЕХ элементов которые пересекает расширенный по габаритам BoundingBox (ну далее отфильтровать нужные элементы дело нехитрое);
вместо BoundingBoxIntersectsFilter(outline) можно использовать метод: BoundingBoxIsInsideFilter(outline) я не пробовал, но МНЕ КАЖЕТСЯ что это все элементы попадающие ЦЕЛИКОМ в BoundingBox …
Вместо труб конечно можно использовать другие элементы, так что может кому и пригодится ,
Может еще кто чего дополнит по этой теме…