Расскажу, какие есть варианты для заполнения параметров у общих вложенных семейств. Рассмотрим способы от ручного до автоматизированного. Покажу на примере пожарных шкафов в Ревите 2025. У шкафов есть куча вложенных для учитывания в спецификации начинки вроде рукавов, клапанов и тому подобных шиберов.

Задача будет такая: вот у нас есть шкафы на двух этажах и небольшая сеть. Надо заполнить значения в параметре «ADSK_Этаж». У шкафов есть общие вложенные.

Статья не о том, как заполнять именно «ADSK_Этаж», статья вообще о любом параметре. Хоть это секция, хоть просто какое-то обозначение системы или что-то подобное.

Предисловие

Прежде, чем заполнять параметры, нужно разобраться с этими самыми параметрами. Показывать буду на примере Ревита 2025, но суть одна и та же в любой версии. В идеале, вам сначала нужно прочитать статью про параметры как таковые: какие они бывают, как их добавлять и так далее.

Если у вас в техзадании есть строка, что нужно у всех элементов заполнить какой-то параметр каким-то значением, то прежде всего надо понять, а есть ли этот параметр у элементов. Если нет, то его нужно добавить, и для этого есть разные варианты. Собственно, поэтому и нужно разбираться в видах параметров и прочитать статью по ссылке выше.

Самый универсальный параметр — это общий параметр, добавленный как параметр проекта к нужным категориям. В итоге он появится у всех элементов, в том числе у общих вложенных. В моём проекте для примере нет параметра «ADSK_Этаж», поэтому добавлю его.

Управление → Параметры проекта → Создать параметр → Общий параметр → по экземпляру добавляю «ADSK_Этаж» к нескольким категориям. Арматуры не будет, но добавил, чтобы было.

Добавляю параметр к элементам в проекте
Параметр добавил
Спецификация на элементы

Я не буду рассматривать вариант, когда мы добавляем в родительское и вложенное один и тот же общий параметр, а потом связываем их между собой. Во-первых, это сложно, когда проект готов. Во-вторых, не факт, что в задании будет именно общий параметр, а не обычный параметр проекта. В-третьих, для системных категорий такое всё равно не сработает и нужно будет добавлять параметр проекта.

Вариант 1. Ручное заполнение

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

Так что тут даже от спецификации толку немного, ведь в ней неясно, к чему относится элемент. Поэтому всё ещё больше усложняется и по сути способ теряет свой смысл из-за этого и большой вероятности ошибиться.

Отбрасываем.

Вариант 2. Ручное заполнение с помощью МодПлюса

Даже если вы всего неделю в Ревите, вам нужно принять неизбежное: вы либо начинаете пользоваться плагинами, либо остаётесь лошарой. Даже если сложно пока ориентироваться в Ревите, даже если ещё не успели изучить базовый функционал для своего раздела, надо потихоньку внедрять плагины в свой рабочий процесс.

Пример такого плагина, который можно рекомендовать всем, — это МодПлюс. Скачали, закрыли Ревиты, поставили как обычную программу. Открыли проект снова, появятся вкладка ModPlus и набор команд. Большинство из них мне не нужны, потому что я блогер, и работать — не блогерское это дело. Но когда вы будете выделять элемент в модели, если у него есть общие вложенные, то на ленте появится кнопка «Выбрать компоненты».

Команда «Выбрать компоненты»

С помощью этой команды вы можете выделить общие вложенные внутри семейства. А значит, сможете их заполнить через окно свойств. Вы также можете выделять несколько элементов за раз, и кнопка будет выделять все-все общие вложенные. В случае с этажом можете выделять элементы на нужном этаже и записывать нужное значение.

Ещё у вас раскрасятся вкладки, это тоже работа МодПлюса, не пугайтесь, всё нормально. Можно отключить или настроить на вкладке МодПлюса, кнопка с шестерёнкой.

Вариант 3. Полуручное заполнение с помощью МодПлюса

Этот способ чуть сложнее, но зато куда более эффективный. В МодПлюсе есть плагин «Параметризация». Не путайте с «Параметры», это разные плагины. Нам нужна «Параметризация».

Скорый поезд к дому мчится, полечу домой, как птица
Полечу, как птица я.

Жизнь начнётся без авралов, сундуков и генералов:
Пара-метри-за-ци-я

//Петь пьяным на дешёвой гитаре

Сначала нужно заполнить данные в родительских семействах. Я выделю шкафы с сетью на каждом этаже отдельно и запишу в параметр «ADSK_Этаж» значения «Х_Этаж 1» и «Х_Этаж 2».

Теперь запускаю «Параметризацию». Ничего поделать с собой не могу, слово это произношу, как в песне Сектора Газа. Плагин платный, но в бесплатной версии что-то там тоже работает. Нажимаем «Добавить стратегию» в окошке слева.

Появится окошко с выбором стратегии. Нам нужна обработка вложенных, это стратегия номер 13: NetedFamilies (Обработка вложенных семейств). Добавляем её, выделяем в списке слева. Справа нужно настроить. Сперва даю имя стратегии, пусть будет «Копирование значений во вложенные».

Справа нажимаю на плюсик, добавляю новое правило. Появляется строка. В столбце «Родительское семейство» выбираем наши категории из проекта. Чтобы что-то выбрать нажмите пару раз на строку, справа появится значок в виде трёх полосок и карандаша. Жмите по нему. Появится список категорий, через строку поиска можно быстро найти нужные категории и по именам. Либо нажмите на кнопку с квадратом, кружком, треугольником и плюсом, тогда плагин сам выберет все категории, что есть на виде. Часть там лишняя будет, например осевые линии и системы. Снимите галочки с них.

Кроме выбора категорий, есть ещё строка «Параметры». В ней ничего не указываем, это нужно для фильтрации выбранных объектов. Нам нужно обработать всё, поэтому тут ничего не трогаем. В столбце «Вложенное семейство» точно так же выбираем категории.

Далее столбец «Формула». Сюда жму два раза, открывается окошко. Здесь надо написать формулу следующего смысла: берём параметр во вложенном, в который пишем данные, и приравниванием его к параметру родительского, откуда берём данные. Делается это несложно: нажимаем на значок «пустого» ярлыка, он в середине окошка, появится список, выбираем нужный параметр, выберу «ADSK_Этаж».

Автоматически появится знак равно, поэтому сразу нажимаю по значку «закрашенного ярлыка», тоже выберу «ADSK_Этаж». Готово, принять.

Выбираю параметр во вложенных семействах
Выбираю параметр из родительских семейств, откуда буду копировать данные

Формулу задал. Осталось внизу выбрать, какие элементы обрабатываем. Можно выбирать либо то, что выбрали в интерфейсе, либо на текущем виде, либо во всём документе, то есть во всём проекте.

Выбираю «Элементы на текущем виде», это непринципиальный момент, тут ориентируйтесь на вашу ситуацию. Всё, жму «Выполнить», плагин подумает и выдаст окошко с отчётом. Там будут айдишники обработанных элементов.

Варианты обработки

Ну вот и готово, можете проверить через окно свойства или спецификацию. Покажу на примере спецификации шкафов, там хорошо видно родительские и вложенные.

Шкафы с позицией 3 — со второго этажа, позиции 1 и 2 — с первого

Таким образом способ не полностью автоматический, но это и логично: откуда Ревиту знать, что именно и как нужно заполнять. Для этого надо писать уже свою автоматизацию, более прицельную. Тем не менее, способ достаточно хороший, пусть и включает в себя ручную обработку. В плагине можно делать сложные формулы, но в это погружаться не буду, читайте справку к плагину, там свой синтаксис.

Вариант 4. Написать скрипт Динамо

Вариант хороший, но для новичков будет сложно. Поэтому давайте это подробно расписывать не буду.

Если не новичок и интересно, то вам нужно вот что: возможность выделять элементы в интерфейсе и потом получать их список вместе с вложенными общими. Можно решать это разными способами: либо с помощью нода Select Model Elements выбирать рамкой элементы в окне Ревита, потом уже получать с них общие вложенные, либо сделать так, чтобы выбранные в Ревите элементы сами приходили в скрипт.

Минус первого варианта: выбор рамкой очень неудобен, ведь нельзя ни выбрать Табом систему, либо добавить или исключить что-то из выбора соответственно контрлом или шифтом. Минус второго варианта: это надо делать через Питон и Ревит АПИ, это сложно.

Но вам повезло, ниже код для Питона, я натырил его в англоязычном интернете и добавил свою функцию для сбора общих вложенных. Стопроцентную работоспособность гарантировать не могу, но как-то работать должно.

import clr

clr.AddReference('RevitAPI')
import Autodesk
from Autodesk.Revit.DB import *

clr.AddReference('RevitServices')
import RevitServices
from RevitServices.Persistence import DocumentManager

doc = DocumentManager.Instance.CurrentDBDocument
uiapp = DocumentManager.Instance.CurrentUIApplication
app = uiapp.Application
uidoc = uiapp.ActiveUIDocument

clr.AddReference('RevitNodes')
import Revit
clr.ImportExtensions(Revit.Elements)

# Эта функция возвращает все вложенные со всех уровней вложенности

def subcomponents(element):
    all_subs = []
    if not hasattr(element, "GetSubComponentIds"):
        return all_subs
    
    if 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

ueWrapper = None
wrappers = clr.GetClrType(Revit.Elements.ElementWrapper).GetMethods()
for w in wrappers:
    if w.ToString().startswith("Revit.Elements.UnknownElement"):
        ueWrapper = w
        break
        
out = []
selectElemId = uidoc.Selection.GetElementIds()
selectElem = [doc.GetElement(xId) for xId in selectElemId]

for i in selectElem:
    try:
        check = Revit.Elements.ElementWrapper.Wrap(i, True)
    except: check = None

    if check is None:
        out.append(ueWrapper.Invoke(None, (i, False)))
    else:
        out.append(i) 

all_elements_in_selection = []

for selected_element in out:
    if subcomponents(selected_element):
        subs = subcomponents(selected_element)
        all_elements_in_selection.append(selected_element)
        all_elements_in_selection.extend(subs)
    else: all_elements_in_selection.append(selected_element)
    
OUT = all_elements_in_selection

Создайте нод с Питон-скриптом, вставьте туда этот код. Далее выбираете элементы в Ревите, запускаете скрипт, на выходе из Питон-скрипта будут все выбранные элементы и всех их общие вложенные. Ну и дальше банальная пара нодов для записи значения. Это ноды String и Element.SetParameterByName. Как с ними работать, читайте в статье про перенос значений через Динамо.

Примерно вот так будет выглядеть скрипт

Запускать лучше через Проигрыватель Динамо.

Вариант 5. Создать свой плагин для решение задачи

Если это ваш вариант, то эта статья вам не нужна, вы и так всё понимаете. Зачем вы её читаете? Вам заняться нечем? Идите работайте.