пятница, 5 февраля 2016 г.

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

Отверстия в стенах - известная проблема 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 (выбирайте Макросы/Отметки отверстий).

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

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

19 комментариев:

  1. Саш только есть один трабл существенный , обычно все отверстия идут ниже нуля , а Revit не хочет их ставить сразу ниже нуля , у меня бывает по 200+ отв. на здание и это адовая работа. И тут похоже решения нормального вообще не существует , только обманывать систему с глобальной отметкой и тд. и тп.

    ОтветитьУдалить
  2. А если невидимую линию провести не от низа отверстия, а от его верха к примеру. Для длинны отрезка ввести доп параметр равный "СмещениеОтУровня+Рзм.Высота". После такой модификации насколько я понимаю семейство можно будет посадить на уровень пола.

    ОтветитьУдалить
  3. Посадка на нулевое смещение от уровня пола работает даже без доп параметра. Просто привязываем верх отрезка к плоскости верха проема и все

    ОтветитьУдалить
    Ответы
    1. Я через дополнительные параметр делал, без него линия почему-то ломалась. ну, это была простая задача, подумайте над второй.
      И еще над тем, что Михаил написал, а то я что-то не очень понял (для отверстий ниже уровня пола я просто делал "перевернутое вверх ногами" семейство отверстия, но тут видимо что-то другое)

      Удалить
    2. Александр,А почему нужно именно выводить отметки относительно первого этажа, почему не использовать отметки относительно тех этажей на которых они расположены?

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

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

      Удалить
    2. Да, вероятней всего так и есть - в спецификацию попадают пластины из закладных (но это легко фильтруется).
      https://www.dropbox.com/s/0ul0338dvpdodl9/%D0%A1%D0%BA%D1%80%D0%B8%D0%BD%D1%88%D0%BE%D1%82%202016-02-13%2009.59.07.png?dl=0

      Удалить
  5. Александр! Огромное спасибо за Ваши уроки.

    Я не могу сделать тип семейства как у Вас. То есть нод Family.Types мое семейство отображает как Тип1 Family:, а Ваше семейство он же отображает как 261_Отверстие прямоугольное.
    Что мне нужно подпилить в моем семействе?

    ОтветитьУдалить
    Ответы
    1. Видимо, вы все-таки про "Family.Symbols".
      На самом деле, он просто выбирает все типоразмеры данного семейства, так что не имеет значения, что он отображает.
      Вам же, видимо, можно переименовать типоразмер семейства так, чтобы имя типа совпадало с именем семейства.

      Удалить
  6. Ведомость отверстий предлагаю модифицировать, до более развернутого состояния: отметка низа относительно этажа, отметка верха относительно этажа, отметка этажа, отметка низа, отметка верха.
    -
    Плюс разбить отверстия на тип системы и тип стены в которой эта система проходит.
    -
    https://youtu.be/BdDedP4UgkI

    ОтветитьУдалить
    Ответы
    1. Ну, мы обычно такого вида спецификации делаем, кому надо - доработают, а мне лень

      Удалить
  7. Что касается "колдовства" - такие вещи решаю всегда добавлением условия
    в Вашем случае что-то типа if(Высота=0,100,Высота) при этом делаю промежуточную опорную плоскость относительно которой уже и привязываю низ проёма с привязкой (Высота=0,100,0)
    -
    Это самый чистый метод

    ОтветитьУдалить
    Ответы
    1. Дим, не рассказывай, пусть лучше народ подумает)

      Удалить
  8. Народ старается думать... Александр, Вы хоть подскажите, где думать - в скрипте или в самом семействе? Мне кажется, что никакие условия в параметрах семейства не помогут...

    ОтветитьУдалить
  9. Я конечно могу ошибаться, но условное обозначение в плане неправильное, так обозначают газопроводные трубы см ГОСТ 21.201-2011

    ОтветитьУдалить