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

Модель, над которой буду проводить эксперименты

Проект пока небольшой, но нам для скрипта сильно большой будет даже вреден, так как каждый тестовый запуск был бы слишком долгим. А так элементов не так мало, но и немного:

Посмотреть, как эту модель я поднимаю в Ревите и даже считаю аэродинамику на пару систем, можете в отдельном плейлисте на моём Ютуб-канале.

Если вы не знаете, что такое Динамо, то сначала прочитайте статью для полных новичков. Если уже имеете представление об этом инструменте и понимаете, как устроен интерфейс, то можете читать дальше. Я не буду применять Питон, только стандартные ноды из Динамо для Ревита 2021.

Шаг 0. Алгоритм работы скрипта

Как это ни удивительно, но прежде чем что-то делать, надо сначала подумать, как это делать. Займёмся этим. Вот пошаговый алгоритм того, что должен сделать скрипт:

  1. Получить все воздуховоды и фитинги из проекта.
  2. Узнать площадь воздуховодов и фитингов. Это буду разные параметры, так как у воздуховодов площадь считается самим Ревитом, её будет нужно просто получить из системного параметра. У фитингов же есть общий параметр, в котором формулой в каждом семействе считается приблизительная площадь.
  3. Записать эту площадь в одинаковый общий параметр для воздуховодов и фитингов.

Важно! Формулы в семейства фитингов писал я сам. Скорее всего, они корректные, но ошибки тоже возможны. Поэтому доверяйте, но проверяйте, не нужно слепо надеяться, что там всё супер точно.

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

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

Если не знаете, как всё это делается, читайте статью про параметры в Ревите.

Шаг 1. Выборка воздуховодов и фитингов

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

Чтобы получить все воздуховоды, двойным кликом создаю Код Блок и пишу туда текст:

Category.ByName("OST_DuctCurves");

Далее этот Код Блок подключаю к ноду All Elements of Category. В итоге получу все воздуховоды поштучно.

Если вам всё же нужно получать фитинги, то тут всё аналогично, но имя категории будет «OST_DuctFitting». С префикса «OST» начинаются внутренние имена категорий в Ревите.

Получили элементы, дальше нужно взять с них площадь.

Шаг 2. Получаем площадь

Далее буду работать только с воздуховодами. У них есть встроенный параметр — «Площадь». Ревит корректно считает эту площадь, ну хоть что-то считается корректно, возрадуемся. Следовательно, нужно получить эту площадь и её же записать в параметр «ADSK_Размер_Площадь». Делается это очень просто.

Нам нужен нод Element.GetParameterValueByName. Это стандартный нод, есть во всех версиях Динамо. Главное, не перепутайте, особенно, если у вас стоят всякие пакеты от сторонних разработчиков.

В красном прямоугольнике правильный нод

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

Шаг 3. Записываем площадь в общий параметр

Я добавил общий параметр «ADSK_Размер_Площадь» через параметры проекта ко всем воздуховодам по экземпляру. Теперь в него записываю данные. Динамо будет в каждый воздуховод индивидуально записывать данные о его площади.

Для этог воспользуюсь ещё одним нодом — Element.SetParameterByName.

Во вход element подаю воздуховоды, в parameterName через Код Блок подам "ADSK_Размер_Площадь", а в value — площадь.

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

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

У меня скрипт отработал корректно

Шаг 4. Прокачаем скрипт

Можем немного улучшить скрипт — подготовить его к запуску на любых шаблонах через Проигрыватель Динамо. Для этого нужно не так много: просто позволить пользователю самому указывать нужный ему параметр, в который Динамо запишет площадь воздуховодов. Но тогда учтите, что в скрипт нужно будет добавить ветку и для фитингов, если планируете писать данные в какой-то третий параметр.

Что делаем: заменяем Код Блок с именем параметра для площади на нод String, то есть строковый тип данных. В него пишем наше значение по умолчанию, а потом правой кнопкой мыши жмём на него и делаем нодом для ввода значения. Формируем заголовок через двойной клик по заголовку «String», он будет отображаться в Проигрывателе.

В нод String текст пишем без кавычек, программа и так понимает, что это текст
Жму правой кнопкой мыши по ноду и выбираю «Является вводом»
Два раза жму левой кнопкой мыши по заголовку нода и ввожу своё значение

Теперь наш скрипт выглядит вот так:

Если запустите его в Проигрывателе Динамо и нажмёте на редактирование настроек, то там будет поле для ввода имени параметра. Таким образом можете использовать скрипт в любых шаблонах. Сами попробуйте, мне лень запускать Проигрыватель ради скриншота. Кидайте в комменты скрины.

Шаг 5. Собираем спецификацию на воздуховоды

Мы не можем записать информацию в один параметр «ADSK_Количество» в виде L / S, где L — длина воздуховода или количество фитингов, а S — площадь. Но мы можем добавить в спецификацию ещё один параметр, наш «ADSK_Размер_Площадь», скрыть между ними границу и добавить расчётный параметр, в котором будет только наклонная черта. У этого столбца с / тоже скрываем боковые границы.

Как такое сделать, рассказывал в полном гиде по спецификациям и в статье про расчётные параметры. Ищите их в рубрике «Спецификации».

Сделаю это в спецификации для воздуховодов. Для фитингов всё аналогично. Получаю следующую картину.

Вывел в количество длину и площадь воздуховодов.

Чтобы числа были поближе к наклонной черте, можете сделать выравнивание у метров или штук по правому краю, а у площади — по левому.

Шаг 6. Собираем сводную спецификацию с количеством и площадью

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

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

Можете не писать "м²" в формуле, просто пишите ">0", Ревит сам подставит единицы

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

Поэтому делаем так: добавляем в проект по типу к категориям воздуховодов и фитингов воздуховодов параметр с типом данных Да/Нет. По умолчанию галочка включена. Это нужно, чтобы мы могли определить, где у нас воздуховоды и фитинги, а где всё остальное. Я назвал его «Метка», но это плохое имя параметра, придумайте имя получше, если будете такое применять.

Важно! В сводной спецификации обязательно нужно включить сортировку по параметре «Метка».

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

Объясните мне, как это говно работает

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

1 / Процент * ADSK_Размер_Площадь

Не нужно писать доллар и метры квадратные, это уже Ревит сам добавит сокращение единиц.

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

Буду рад, если это пригодится вам в работе. Если не пригодится, то порадуюсь чему-нибудь другому, чего унывать-то, надо жить эту жизнь. Ауф!