Отверстия в стенах: обозначение на развертке и в плане, отметка низа в марке и спецификации

Отверстия в стенах — известная проблема Revit. Конечно, есть "Проем в стене", но нам, помимо собственно отверстия в 3D, еще нужно:
— обозначение проема на развертке стены;
— спецификация отверстий и марка с указанием размеров и отметки низа отверстия;
— обозначение отверстия на планах.

Да, можно рисовать обозначение проема "Цветовой областью", и табличку составлять вручную, но это не наш метод.

Семь бед — один ответ: проемы нужно делать при помощи семейств. Условное обозначение нарисуем внутри самого семейства, в спецификации и марки будем выводить общие параметры.

Кстати говоря, я не очень люблю все эти планы с обозначениями отверстий — имхо, это всё артефакты эпохи автокада, но есть задача — есть решение.


Конечно, сразу известны проблемы:
— обозначение в плане не будет отображаться, если отверстие находится выше или ниже секущего диапазона;
— параметр "Смещение по высоте" не выводится в марки и спецификации.
Ну ничего, я тут как раз для того, чтобы найти решения. Воспользуемся особенностями аннотативных семейств и Dynamo.
Про один из способов решения я писал на форуме автодеска, но вариант совсем неудобный, тут уже поинтереснее.

Подготавливаем семейство

Семейство для отверстия будем делать "На основе стены" в категории "Обобщенные модели" (можно использовать "Окна" или "Двери", есть плюсы и минусы, но сейчас рассмотрим простой вариант).

Для начала будут нужны общие параметры "Рзм.Ширина" и "Рзм.Высота". Перейдем на фасад "Сторона размещения", добавим плоскости, размеры назначим на опорные плоскости:

И нарисуем проем, привязав границы к плоскостям:

Выберите созданный проем и включите для него прозрачность:

Теперь нужно сделать обозначение проема. Я обычно делаю его вложенным семейством "Элемента узла". Создадим такое семейство, опорные плоскости и параметры для ширины-высоты — всё стандартно. Создаю "цветовую область", для начала две линии, привязываю их:

Привязываю концы линий:

Теперь дорисовываю две линии обозначения и создаю параметр "Смещение обозначения".

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

if(or(Высота > 1000 мм, Ширина > 1000 мм), if(Высота > Ширина, Ширина / 5, Высота / 5), if(or(Высота > 500 мм, Ширина > 500 мм), if(Высота > Ширина, Ширина / 4, Высота / 4), if(Высота > Ширина, Ширина / 3, Высота / 3)))

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

Попробуйте изменить размеры и посмотреть, правильно ли срабатывает обозначение:

Далее нужны еще три общих параметра — "Рзм.ВысотаБазовогоУровня", "Рзм.СмещениеОтУровня", "Рзм.ОтметкаРасположения". Все три параметра добавляем в семейство, ставим их "по экземпляру". Можете взять эти параметра из моего файла общих параметров с Яндекс-диска.
Для "Рзм.ОтметкаРасположения" пишем формулу:

Сохраняем семейство как "231_Отверстие прямоугольное (ОбщМод_Стена)" и загружаем в проект.

Dynamo — передача параметров

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

Сначала выбираю все семейства по индексу 261 — у меня это семейства отверстий в стенах:

SelectFamilyByIndex — простой самодельный python-нод.
Далее использую стандартную связку из нодов "GetParameterValueByName" и "SetParameterValueByName" — значение просто копируется из одного параметра в другой.
Получаю значение из "Смещения" и записываю в "Рзм.СмещениеОтУровня":

Теперь нужно как-то узнать, на каком уровне расположено семейство, и отметку этого уровня. При помощи "GetParameterValueByName" получим из семейства его "Уровень", а затем узнаем "Elevation":

После того, как узнали значение высоты уровня — вписываем это число в параметр "Рзм.ВысотаБазовогоУровня".

Далее уже в семействе эти числа складываются в параметре "ОтмОтверстия", и этот параметр можно вывести куда нужно: в марки и спецификации:

Кстати, в марке можно настроить форматирование параметра:

 

Обозначение в плане

Используем следующую особенность: если в 3D-семейство загружено аннотативное семейство (элемент узла или типовая аннотация), то в проекте мы увидим эту вложенную аннотацию, разрезав семейство в любом месте. Делаем: cоздаем семейство "Элемента узла" с нужным обозначением в плане

В семействе обозначения нужны будут параметры "Толщина стены" и "Ширина отверстия":

Загружаем обозначение в семейство отверстия и устанавливаем на плане. Связываем параметр ширины обозначения с соответствующим параметром отверстия, а для связывания толщины стены используем "Параметр для отчета". Создадим в семействе отверстия параметр "ТолщинаСтеныОтчет", включим опцию "Для отчетов":

Повесим этот параметр на грани условной стены (выбирайте через tab именно грань стены, а не что-то другое, а то работать не будет), параметр "Толщины стены" у обозначения связываем с этим новым параметром:

Теперь при установке семейства оно автоматически определит толщину стену и нужным образом изменит обозначение.
Далее не забываем привязать обозначение к центру отверстия.

Теперь вспоминаем про задачу. Секущий диапазон плана обычно делают на высоте 1-1.5м, а отверстие может располагаться под потолком на высоте 2м. Но мы увидим обозначение, если разрежем семейство отверстия горизонтально в любом месте, значит, надо как-то сделать так, чтобы часть семейства доходила до секущего диапазона.
Сказано — сделано: нарисуем на "Виде спереди" невидимую линию, а удлинение этой линии сделаем равным параметру "СмещениеОтУровня":

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

Скорее всего, после создания такой линии и загрузки семейства в проект произойдет страшное: все отверстия улетят вверх. Неудивительно: по умолчанию Revit определяет границы семейства по максимальным габаритам, и переместит семейство вверх на длину этой добавленной линии.
Для того, чтобы это не происходило, мы принудительно укажем, какую точку хотим считать началом семейства.
Создадим "Опорную плоскость", совпадающую с "Опорным уровнем", привяжем замком к уровню и включим для нее опцию "Задает начало":

Теперь "Смещение по высоте" будет отсчитываться именно от этой плоскости.

Теперь после запуска Dynamo невидимая линия будет удлиняться точно до уровня пола текущего этажа, гарантированно пересекать секущий диапазон и появляться на планах:

Качаем проект с семействами, марками и спецификацией и скрипт Dynamo (выбирайте Макросы/Отметки отверстий).

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

Надо будет немного поколдовать с семейством, но, думаю, ничего сложного. Удачи!