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

Пример готовой спецификации для комплектов

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

Довести спецификации до ума мне помогла Анастасия Кравцова, моя коллега из BIM2B, она один из авторов ADSK-шаблонов для разделов КЖ/КМ. У конструкторов спецификации с процентом — обычное дело.

Для начала соберём спецификацию и добавим нужные параметры. Буду использовать свои семейства пожарных шкафов из шаблонов ADSK для 2021 версии Ревита. Добавлю следующие параметры — смотрите на область «Поля в спецификации (по порядку)»:

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

Теперь сделаем так, чтобы всё суммировалось. У пожарных шкафов есть параметр «ADSK_Позиция_Комплект», так как шкафы одинаковые, то поставлю в этот числовой параметр значение 1. Это нужно, чтобы отсортировать их в спецификации в правильном порядке. После в свойствах спецификации сделаю суммирование значений: сниму галочку для каждого экземпляра и включу вычисление итогов для «ADSK_Количество». Также настрою сортировку.

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

Далее нужно получить в отдельном параметре суммарное количество элементов. Сейчас мы видим в «ADSK_Количество» сумму по каждому элементу, но это спецификация, тут Ревит суммирует значения, а в каждом элементе как было значение 1, так и осталось. Нам нужен столбец, в котором мы для каждого элемента получим суммированное значение. Если непонятно — читайте статью про расчётные параметры, ссылка в начале статьи.

Создаю первый расчётный параметр на основе процента. Назову его «%», поставлю точку на «Процент» и выберу «Из: ADSK_Количество» и «По: ADSK_Наименование». Получим везде 100 %, это нормально. У нас на каждое наименование есть единичное значение в «ADSK_Количество», то есть мы по сути делим 1 наименование на 1 → получаем 100 %.

Первый расчётный параметр с процентом

Теперь добавляю ещё один расчётный параметр, на этот раз с простой формулой: 1/%. Таким образом напротив каждой позиции в спецификации получаем суммарное значение для строки. На первый взгляд кажется, будто это то же самое, что в «ADSK_Количество», но если включить отображение каждого экземпляра, то видим, как «ADSK_Количество» принимает значение 1, а вот наш параметр не меняется и по-прежнему показывает сумму для каждой позиции.

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

Теперь нужно отделить сами шкафы от начинки. Так как буду делать это в формуле, то нужно какое-то числовое значение, текст тут не подходит. Создам целочисленный параметр проекта, назову его «Метод подсчета». 0 — для родительских семейств, 1 — для вложенной начинки, которую не нужно суммировать по всем комплектам, а оставить количество внутри одного комплекта.

Добавляю параметр проекта
Заполняю значения прямо в спецификации

Конечно, заполнять вручную — занятие невесёлое, но тут вы можете воспользоваться Динамо, чтобы накидать простенький скрипт и заполнять значения автоматизированно. Как раз в Динамо для Ревита 2021 в стандартных нодах есть пусть и неидеальный нод для получения вложенных семейств. Его минус в том, что он выдаёт ошибку, если в него подали семейства без вложенных, хотя ошибка и не критичная, просто неприятно. Получили вложенные → убрали пустые позиции → записали в оставшиеся 1, остальному вписали 0 через Динамо или руками в спецификации → готово. Можете узнать больше про Динамо из моих статьей в отдельной рубрике блога.

В шаблонах КЖ для аналогичной задачи есть общий параметр «ADSK_Главная модель». Это параметр с типом данных «Да/Нет», по сути то же самое, что 1 или 0. Его можно добавлять в загружаемые семейства и заполнять там. Для системных можно добавить по типу и проставить галочки.

Теперь у нас есть деление на комплекты и вложенные, в данном случае — на шкафы и их начинку. Нужно сделать формулу, которая будет для комплектов выводить сумму, а для вложенных — количество внутри комплекта.

Придётся сделать ещё расчётных параметров. Нам нужно выделить общее количество комплектов, потому что вложенных может быть не по одной штуке внутри комплекта. В моём примере головок ГР-50 по две в каждом шкафу. Пять комплектов дают 10 головок, а нам нужно оставить 2. Логично, что это можно получить через деление 10 штук на 5 комплектов, то есть общее количество головок на общее количество комплектов. Вот это настоящее шаманство, с которым помогла Настя Кравцова.

Подход такой: у нас есть параметр с методом подсчёта. По нему мы можем определить общее количество элементов и общее количество только вложенных. Разница между этими значениями и есть общее количество комплектов. У меня тут 35 элементов, 30 вложенных, разница — наши 5 комплектов.

Смотрим, как такое сделать. Снова создаю параметр через процент, беру «ADSK_Количество» по «ADSK_Позиция_Комплект». Потом вновь делю 1 на этот процент — получаю общее количество элементов в спецификации. Это именно количество всех элементов в рамках одинаковых комплектов.

Получаю общее количество элементов внутри одинаковых комплектов

Теперь нужно определить долю вложенных и их общее количество. У нас есть «Метод подсчета», для шкафов значение нулевое, для начинки — единицы. Можно взять процент по «Методу подсчета» внутри комплектов. Потом снова делим 1 на этот процент и получим пустую ячейку для шкафов, а для вложенных — их общее количество. Так работает деление на процент — если значение невозможно получить, то Ревит даст не ошибку, а пустую ячейку.

Определяю количество вложенных

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

Если у элемента в параметре «Метод подсчета» стоит 0, то это — комплект. Если 1 — то это вложенное. Количество комплектов мы узнали ещё в самом начале в параметре «Всего». Оттуда и берём значение. Количество вложенных в каждый комплект получаем как отношение «Всего» к разнице между общими количествами всех элементов и вложенных.

if(Метод подсчета = 0, Всего, Всего / (Всего элементов - Всего вложенных))

В последнем столбце — наше итоговое количество

Далее нам остаётся привести спецификацию в порядок — скрыть промежуточные расчёты, добавить остальные столбцы и наслаждаться красотой. Самое приятное, что работать такая спецификация будет как с комплектными семействами, так и с обычными.

Спецификация со скрытыми столбцами промежуточных расчётов

Добавлю в модель больше элементов: несколько вентиляторов, трубы и фитинги. Заполню у всех элементов параметр «Метод подсчета» и вижу, что не всё так гладко. У трубопроводов получаем пустые значения в количестве. Значит, какая-то из формул отработала неверно. Включу все столбцы и отображение каждого экземпляра. Метод подсчёта для трубы — 0, а значит её количество должно равняться сумме в «ADSK_Количество». Для этого в параметре «Всего» должна быть сумма по каждой одинаковой трубе, а у нас там разные значения.

Добавил элементы в модель
Со штучными изделиями всё в порядке, а с трубой не вышло
Раскрываю каждый экземпляр — вижу, что значение определяются неправильно

Проблема связана с тем, что до этого мы разбирали штучные элементы, а количество трубы не равняется штукам, тут у нас длина. В столбце «Всего» у нас формула "1 / %". То есть одну штуку делить на её долю в комплекте. А у нас труба не в штуках, поэтому нужно эту формулу немного усложнить. Я нашёл такой вариант: если «ADSK_Количество» не равно единице, то, скорее всего, это не штучная позиция. Значит, нужно делить не единицу, а это самое «ADSK_Количество».

if(ADSK_Количество = 1, 1 / %, ADSK_Количество / %)

В итоге всё корректно работает, даже если длина самой трубы равна строго одному метру. Если добавить остальные столбцы и скрыть параметры для комплекта и сортировки, то получим стандартную девятиграфку с нужными единицами в количестве.

Итоговая спецификация на несколько категорий

Итоги

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

С общим параметром проще, это можно хотя бы автоматизировать плагинами. Но всё равно придётся возиться, ведь нужно ещё выудить и обновить вложенные и обратно загрузить в родительские.

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

В общем, работать можно, но есть трудности.