Рассказываю итоги вчерашнего эфираВ общем, скрипт не получился. Сама по себе логическая часть отрабатывает, тут всё получилось, но проблема оказалась в заголовках. Скорее всего, в прошлый раз, когда делал садик, я с ней тоже столкнулся, просто уже забыл.
То есть присвоить код каждому элементу я смог, но вот заголовки всю красоту порушили. Из-за них либо не получается вывести все наименования, либо получается, то заголовки дробят систему на несколько подзаголовков.
Кароч. Я решил не в онлайн покрутить варианты, ведь если не получается провести кодификацию по категориям, то можно спуститься ещё ниже и сделать кодификацию каждого элемента, а уже потом по ней сортировать.
Но для этого недостаточно каждому элементу присвоить свой код, это очень просто, но фактически сработает так же, как работает галочка «Для каждого экземпляра». А мне нужно сгенерировать одинаковый код для каждой позиции с одинаковыми наименованием и маркой. Ну как минимум эти два параметра.
И тут случился затык. В той модели, которую взял для работы, у многих позиций тупо нет параметров или они есть, но не заполнены. Соответственно, я не могу обработать такие элементы. Так что решил бросить эту затею и больше не тратить времени.
Тем не менее, что я вам предлагаю. Я уже выложил для донов первый ролик этой серии. Второй ролик тоже выложу, но нужно понимать, что результата там нет. Разве что посмотреть, как тыкаюсь с Питоном.
При этом вот тут я выложу код Питона. Я его немного доработал, сделал «поумнее». Хе-хе, настоящие программисты назовут это полным говном, но настоящих программистов тут мало, пусть себе говорят. У них всё равно нет того, что есть у меня — приятно булькающий в животе зелёный чай с жасмином и сэндвичем с какой-то невкусной хернёй.
import clr
clr.AddReference('RevitAPI')
from Autodesk.Revit.DB import *
clr.AddReference('RevitServices')
from RevitServices.Persistence import DocumentManager as DM
from RevitServices.Transactions import TransactionManager as TM
doc = DM.Instance.CurrentDBDocument
def subcomponents(element):
all_subs = []
if hasattr(element, "GetSubComponentIds"):
sub_Id_list = element.GetSubComponentIds()
for sub_Id in sub_Id_list:
sub = doc.GetElement(sub_Id)
if sub.GetSubComponentIds():
all_subs.append(sub)
all_subs.append(subcomponents(sub))
else:
all_subs.append(sub)
return all_subs
mep_systems = UnwrapElement(IN[0])
system_label_parameter = IN[1]
elements_from_system = []
for system in mep_systems:
system_element_list = []
if system.Category.Id.IntegerValue == -2008015: # Системы воздуховодов
system_elements = system.DuctNetwork
elif system.Category.Id.IntegerValue == -2008043: # Трубопроводные системы
system_element_list = system.PipingNetwork
pass
for element in system_elements:
system_name = element.get_Parameter(BuiltInParameter.RBS_SYSTEM_NAME_PARAM).AsString()
system_element_list.append(element)
element_subcomponents = subcomponents(element)
TM.Instance.EnsureInTransaction(doc) # Открытие транзакции
element.LookupParameter(system_label_parameter).Set(system_name)
for sub in element_subcomponents:
sub.LookupParameter(system_label_parameter).Set(system_name)
TM.Instance.TransactionTaskDone() # Закрытие транзакции
system_element_list.extend(element_subcomponents)
elements_from_system.append(system_element_list)
OUT = elements_from_system
Что делает этот код. Он получает все элементы из систем вентиляции и трубопроводов. Проверял на вентиляции, там работает. При этом получает не только элементы систем, то и общие вложенные со всех уровней.
Далее копирует имя системы в указанный пользователем параметр и для элементов систем и для их общих вложенных.
На выходе будет список всех элементов из системы, как обычных, так и общих вложенных. И дальше уже делайте с ними, чего хотите. Код можно вставить в обычный Питон-нод и подавать на два входа список