Здравствуйте коллеги!
Встала одна банальная задача, которая не решается без костыля в Revit. К примеру, есть у нас проект СС, в котором расположены цепи, а в этих цепях элементы (розетки, распределительные коробки и прочие датчики…). По мере работы с проектом что то, как всегда, меняется и приходится тратить драгоценное время перенумеровывая эти элементы вручную открыв спецуху или, того хуже, тыкая поэлементно.
Предположим, что проект большой, сложный и в нем этих самых цепей валом, так что провода торчат из стен как макароны из кастрюли. Вот и хотелось бы эту рутину автоматизировать.
Если говорить конкретно про цепи, то алгоритм очень простой: Отфильтровать цепи, затем найти набор элементов, который содержится в них, а потом итерироваться по этому набору записывая попутно в марку то что нужно и отбрасывая ненужные элементы.
Однако на примере из 10 цепей по 20 элементов алгоритм задумывается (несильно, но все же есть опасения, что в реальных условиях при наложении фильтров может подтормаживать)
В общем буду рад любым советам по улучшению кода.
import clr
clr.AddReference('RevitAPI')
clr.AddReference('RevitAPIUI')
from Autodesk.Revit.DB import *
uidoc = __revit__.ActiveUIDocument
doc = __revit__.ActiveUIDocument.Document
""" Находим все цепи в проекте """
collector = FilteredElementCollector(doc).OfCategory(BuiltInCategory.OST_ElectricalCircuit)
print(collector.GetElementCount())
t = Transaction(doc, 'Combine mark')
t.Start('Set mark')
""" Ищем элементы в цепи """
for circuit in collector:
circuit_mark = circuit.Name # Имя цепи (он же номер)
# print(circuit_mark)
elements = circuit.Elements.ForwardIterator()
element_number = 1 # Стартовый номер элемента
while True:
try:
mark = 'Хреновина ' + str(element_number) + ' в цепи №' + circuit_mark # Компануем марку как нам угодно
elements.next().LookupParameter('ADSK_Позиция').Set(mark) # Находим марку параметр в который будем ее писать
element_number += 1
except StopIteration:
break
# print(a.LookupParameter('ADSK_Позиция'))
t.Commit()
exit()