Пользователи BIM-решения для архитекторов и конструкторов nanoCAD BIM Строительство, конфигурация «Конструкции» (ранее – nanoCAD BIM Конструкции), сталкиваются с задачами параметризации графики объектов. Многие задачи можно решать, не углубляясь в возможности параметризации, но нередко возникают ситуации, когда необходимо задать сложные геометрические зависимости. И в этих случаях у пользователей возникает множество вопросов.
Пользователи BIM-решения для архитекторов и конструкторов nanoCAD BIM Строительство, конфигурация «Конструкции» (ранее – nanoCAD BIM Конструкции), сталкиваются с задачами параметризации графики объектов. Многие задачи можно решать, не углубляясь в возможности параметризации, но нередко возникают ситуации, когда необходимо задать сложные геометрические зависимости. И в этих случаях у пользователей возникает множество вопросов.
Как правило, имеющиеся учебные и справочные материалы подразумевают базовое знакомство с функционалом параметризации графики объектов. Из имеющихся описаний функционала не всегда очевидно, как можно прийти к тому или иному решению, так как в справочных материалах нет подробного анализа применения функций для решения задач параметризации объектов. Разбор примеров сложной параметризации может позволить пользователю лучше понять, как и в рамках какой логики применяются функции параметризации. Эта статья написана в помощь пользователям, которые сталкиваются с ситуациями, когда к параметризации геометрии объекта предъявляются сложные и нетривиальные требования. Очевидно, что разобрать все возможные варианты в рамках одной статьи не представляется возможным. Однако в этой статье мы раскрываем принципы работы с векторами и точками при параметризации графики.
Базовые навыки по созданию и редактированию параметрической графики объектов можно получить в видеоуроке по ссылке.
Для случаев, когда необходимо:
- параметризировать положение 3D-/2D-примитивов в Редакторе параметрического объекта;
- параметризировать точки контура в операции 3D-выдавливания в Редакторе параметрического объекта;
- задавать положение элементов объекта в пространстве, которое бы учитывало параметризацию поворотов относительно осей XYZ, важно уметь пользоваться функциями по работе с векторным типом данных и понимать, как именно и где задается соответствующая параметризация.
Параметризация положения 3D-/2D-примитивов
Начнем с рассмотрения теории вопроса. Положение параметрического объекта в пространстве модели задается относительно мировой системы координат, а положение геометрических примитивов объекта задается относительно локальной системы координат объекта. Начало локальной системы координат объекта соответствует точке его вставки. Эта система представлена на рис. 1.
По умолчанию у объектов категории параметрического оборудования есть три «ручки», которые позволяют задавать:
- поворот объекта относительно оси Z локальной системы координат. В момент активации «ручки» оси мировой системы координат встают туда же, где находится локальная система координат объекта (рис. 2);
- перемещение вдоль оси Z локальной системы координат объекта. При активации «ручки» ось X мировой системы координат встает вдоль оси Z локальной системы координат объекта (рис. 3);
- точку вставки объекта относительно мировой системы координат. При активации этой «ручки» мировая система координат остается на месте (рис. 4).
Размещение объекта относительно мировой системы координат не ограничивается «ручкой» точки вставки объекта. Для размещения объекта доступны все имеющиеся в Платформе nanoCAD команды: ПЕРЕНЕСТИ, ПОВЕРНУТЬ, 3drotate и т.п. Но задание положения и ориентации элементов графики (примитивов объекта) необходимо параметризировать в Редакторе параметрического объекта. Разбору вариантов такой параметризации и посвящена статья.
Начнем с задания точки положения примитива объекта (рис. 5). Большая часть примитивов, которые можно добавить в Редактор параметрического объекта, обладает группой параметров базовой точки. Эта группа параметров позволяет задать положение примитива относительно локальной системы координат объекта либо относительно системы координат группы.
Система координат группы также может иметь свои собственные координаты положения относительно локальной системы координат (рис. 6). Группы в Редакторе параметрического объекта позволяют задавать параметризацию некоторых параметров сразу для всех элементов, которые входят в группу. Кроме того, группы позволяют выполнять штриховку замкнутых контуров, объединение геометрии 3D-тел, находящихся внутри группы, назначение параметров по цвету и видимости сразу для всех элементов группы. И это далеко не все возможности этого структурного элемента.
Примитивы, которые находятся в группе, определяют свое положение не от начала локальной системы координат объекта, а от начала системы координат группы (рис. 7).
Очевидно, что положение примитивов или групп примитивов задается тремя значениями координат XYZ. Все эти значения можно параметризовать. Для этого необходимо навести курсор на поле значения и нажать на троеточие (рис. 8).
После этого откроется окно Мастера функций, в котором можно написать формулу для расчета значения параметра. Для расчета значения можно использовать пользовательские переменные и параметры объекта. На рис. 9 представлен пример, демонстрирующий использование значения параметра объекта.
Имя параметра подставляет значение последнего. Это значение может участвовать в расчете формулы при использовании различных операций: сложение, вычитание, умножение, деление, округление значения и т.п. На рис. 9 показана формула, которая берет значение параметра [AEC_ELEMENT_POS_X]. Значение параметра задано в окне параметров и равно 250. В формуле Мастера функций из этого значения вычитается 50. Таким образом, значение положения по оси X для примитива BOX становится равным 200. Напротив параметра, для которого задана формула, появляется значок f(x). Этот значок подсказывает пользователю, что значение является не статическим, а рассчитывается с помощью формулы (рис. 10).
При изменении параметра [AEC_ELEMENT_POS_X] в окне параметров объекта соответственно меняется значение параметра положения базовой точки по координате X для примитива BOX. [AEC_ELEMENT_POS_X] = 430.
[AEC_ELEMENT_POS_X] – 50 = 380 (см. рис. 11.)
Таким образом пользователь может менять положение элементов графики параметрического объекта, задавая соответствующие значения и формулы. Но описанный выше способ не очень интерактивен, так как для изменения параметра необходимо открывать окно параметров объекта. Намного удобнее редактировать положение примитивов объекта, используя «ручки».
Рассмотрим параметризацию положения с использованием соответствующих «ручек». В окне Редактора параметрического объекта можно задавать множество «ручек» объекта. Чтобы добавить «ручку», необходимо в контекстном меню выбрать пункт Ручка. А далее указать какую «ручку» вы хотите использовать (рис. 12).
- «Ручка» длины задает длину графических примитивов Редактора параметрического объекта. Ручка передает значение расстояния от своей базовой точки до положения «ручки».
- «Ручка» угла задает угол поворота графических примитивов. «Ручка» передает значение угла.
- «Ручка» перемещения позволяет задавать положение всего объекта аналогично «ручке» вставки объекта. «Ручка» не передает никаких координат в свойства объекта.
- «Ручка» переключателя позволяет интерактивно переключать значение параметров объекта.
- «Ручка» растягивания позволяет задать размер объекта и угол поворота всего объекта. Угол поворота не передается в явном виде в отличие от «ручки» угла поворота.
- «Ручка» смещения задает длину графических примитивов. «Ручка» передает значение расстояния от своей базовой точки до положения «ручки».
- «Ручка» положения передает значения своих координат относительно локальной системы координат объекта.
Наиболее универсальная из всех перечисленных «ручек» – «ручка» положения. При соответствующей параметризации она позволяет заменить все прочие «ручки», кроме «ручки» переключения. Универсальность достигается за счет того, что эта «ручка» передает значения координат своего положения. А зная координаты положения точек в пространстве, можно параметризовать всю необходимую геометрию. Также эта «ручка» позволяет задавать множество параметризации геометрии, которую не позволяют сделать другие «ручки».
Теперь применим на практике эти знания. Рассмотрим использование «ручки» для задания положения примитива объекта.
Создадим «ручку» положения (рис. 13).
В свойствах объекта создадим параметр Координаты ручки позиции. Необязательно использовать именно этот параметр, главное, чтобы у параметра был подходящий тип данных, например, строковый. Но в этом случае заголовок параметра точно отображает назначение параметра (рис. 14).
В Редакторе параметрического объекта в параметре Назначение укажем добавленный параметр Координаты ручки положения (рис. 15).
Изначально «ручка» положения создается в начале локальной системы координат объекта и потому «ручка» перекрывается с «ручкой» точки вставки объекта. В этом случае при активации «ручки» активируется именно «ручка» положения. Активируем «ручку» и переместим ее в какое-то другое место (рис. 16).
После этого в свойствах объекта начнут отображаться координаты «ручки» положения. Значения координат соответствуют положению точки относительно локальной системы координат объекта (рис. 17).
Значение параметра содержит координаты по трем осям (X, Y, Z). Этих трех значений вполне достаточно для параметризации точки положения примитива объекта. Пропишем эти значения в свойствах базовой точки примитива. Для этого снова воспользуемся Мастером функций (рис. 18).
Если просто вставить параметр [DIN_GRIP_POSITION] в Мастер функций, то значение будет приходить в виде тройки значений координат {X, Y, Z}, что не подходит для решения поставленной задачи, так как в этой ситуации параметризуется значение координаты по оси X (рис. 19).
Поэтому из тройки координат {X, Y, Z} необходимо получить значение первой координаты по оси X. Для этого можно воспользоваться функцией vector(), которая позволяет получить значение координаты по ее индексу (рис. 20). Также эта функция позволяет создать векторный тип данных по значению трех числовых аргументов.
Индекс равный:
- 0 соответствует координате X;
- 1 соответствует координате Y;
- 2 соответствует координате Z.
Теперь в значение по X базовой точки примитива будет приходить значение по X «ручки» положения (рис. 21).
Пропишем аналогичные функции для координат базовой точки по Y и Z. Для этого потребуется поменять индексы в квадратных скобках (рис. 22).
Теперь начало системы координат примитива объекта (в данном случае цилиндра) совпадает с координатами «ручки» положения. Активация и перемещение «ручки» положения также будут перемещать и примитив (рис. 23), аналогично тому, как работает «ручка» вставки объекта, с той лишь разницей, что «ручка» вставки объекта перемещает объект относительно мировой системы координат, а «ручка» положения перемещает часть примитива относительно локальной системы координат объекта (точки вставки объекта).
Научившись целиком перемещать графические примитивы объекта, разберемся, как редактировать части графических примитивов. Большая часть графических примитивов имеют заранее заданные параметры, редактирование которых с помощью «ручки» положения является избыточным, так как эти параметры зачастую можно редактировать при помощи «ручек» длины или смещения, что в плане параметризации является более лаконичным решением (рис. 24).
Также большая часть примитивов имеет ограничения в плане геометрии. Например, для примитива BOX нет возможности редактировать положения вершин объекта таким образом, чтобы из прямой призмы получались другие варианты четырехугольных призм. Однако в Редакторе параметрического объекта есть возможность использовать не только примитивы с заранее заданными контурами оснований, но и инструменты 3D-выдавливания по контуру, аналогично тому, как это делается инструментами 3D-моделирования 3D-модуля Платформы nanoCAD (команды: 3dextrude, 3drevolve, 3dsweep).
Параметризация положения точки контура элемента 3D-выдавливания
Рассмотрим процесс создания элемента выдавливания и параметризацию его контура. Чтобы создать элемент выдавливания, необходимо выбрать соответствующий элемент в контекстном меню (рис. 25).
В дереве построения Редактора параметрического объекта появится соответствующий элемент. Тело выдавливания Extrusion имеет параметры, которые позволяют задавать положение примитива относительно локальной системы координат и высоту выдавливания контура. Если развернуть Extrusion, нажав на значок +, можно увидеть контур, по которому формируется элемент выдавливания. По умолчанию создается цилиндр с контуром выдавливания по дуге. Контур выдавливания, в данном случае дуга, также имеет геометрические параметры, меняя которые, можно менять все тело выдавливания (рис. 26).
Давайте поменяем контур с окружности на прямоугольник. Для этого необходимо удалить имеющийся контур (рис. 27) и импортировать новый.
Чтобы импортировать контур, его необходимо предварительно отрисовать в пространстве модели, например, отрезками или полилинией. После этого данный контур нужно выделить, а для операции выдавливания вызвать контекстное меню правой кнопкой мыши. В контекстном меню необходимо выбрать пункт Выбрать 2DПрофиль (рис. 28).
После этого в командной строке появится запрос на указание базовой точки. Укажем в качестве базовой точки одну из вершин полилинии (рис. 29).
Затем необходимо указать направление оси X создаваемой системы координат примитива. Логично направить ее вдоль какой-либо стороны контура (рис. 30).
В результате в теле выдавливания появится новый контур, по которому сформируется новое тело выдавливания – прямая призма. Примечательно, что тело выдавливания в этом случае состоит из четырех отрезков, а не цельной полилинии, и у каждого отрезка есть точка положения, причем только одна. Учитывая эту особенность, правильнее будет воспринимать отрезки как вершины контура (рис. 31).
Очевидно, что точка имеет две координаты по X и Y, которые также можно параметризовать «ручкой» положения. Если параметризация подразумевает, что меняется только одна координата вдоль какой-либо оси, то для параметризации проще будет использовать «ручку» длины или смещения. Но в нашей статье параметризация этих «ручек» не рассматривается, так как по работе с ними уже есть довольно много справочных материалов, ссылка на один из таких материалов дана в начале статьи. А в случае, если необходимо менять положение точки контура по двум координатам, удобно использовать «ручку» положения.
Создадим «ручку» положения и в качестве параметра назначения снова укажем [DIN_GRIP_POSITION], а также передадим координаты «ручки» в соответствующие координаты точки контура (рис. 32).
Попробуем переместить «ручку» положения, чтобы увидеть, как изменится тело при изменении положения точки контура (рис. 33).
Важно отметить, что точки контура подразумевают параметризацию только по осям X и Y, а как можно было видеть ранее, «ручка» положения передает координаты в том числе по оси Z. Поэтому если перемещать «ручку» положения, задавая и значение координаты по оси Z, то «ручка» положения оторвется по оси Z от вершины, которую она параметризует (рис. 34).
Чтобы избежать этого, необходимо ограничить возможность перемещения «ручки» положения по оси Z. Сделать это можно с помощью параметра Выражение. Этот параметр позволяет пересчитать значение, которое «ручка» передает в параметр [DIN_GRIP_POSITION] объекта (рис. 35).
Параметр Выражение также можно параметризовать в окне Мастера функций, если нажать на соответствующее троеточие. По умолчанию в параметре Выражение имеется переменная grip, которая хранит значение, передаваемое «ручкой» (рис. 36).
Ограничивая значения, которые передает переменная grip, можно добиться соответствующих ограничений в перемещении «ручек». Очевидно, что для «ручки» положения переменная grip хранит тройку значений координат положения «ручки» {X, Y, Z}. Координаты по X и Y в этом случае нужны для параметризации точки положения контура элемента выдавливания, а вот координата по Z должна быть равной 0, чтобы «ручка» не отрывалась по оси Z.
Функция vector() имеет два варианта применения:
- один из них уже был рассмотрен. Применение функции vector (X, Y, Z)[i] позволяет получить одно из значений координаты, хранимых внутри тройки координат {X, Y, Z}, где i – индекс считываемой координаты;
- второй вариант применения функции vector (X, Y, Z) позволяет создать тройку значений координат вектора {X, Y, Z}.
Для ограничения перемещения «ручки» положения по координате Z надо использовать оба варианта.
Необходимо передать в [DIN_GRIP_POSITION] положение «ручки» по координатам X и Y, приняв, что Z=0. Непосредственно переписать значения координат в самой переменной grip нет возможности, но значения с grip можно считать и пересчитать при помощи функции vector(X, Y, Z)[i]. И уже новые значения можно собрать с помощью функции vector (X, Y, Z).
Обеспечим передачу в параметр [DIN_GRIP_POSITION] координаты по Z=0. Для этого воспользуемся функцией vector (X, Y, Z). Использование этой функции показано на рис. 37.
Пока что функция не передает никаких значений по осям X и Y. Эти значения возьмем из переменной grip c помощью уже знакомой нам функции vector (X, Y, Z)[i]:
- X – vector(grip)[0];
- Y – vector(grip)[1].
Таким образом, в параметр [DIN_GRIP_POSITION] передаются координаты по осям X и Y от «ручки» положения, а координата по Z=0. Формула показана на рис. 38.
Примечательно, что такая параметризация не просто передает в [DIN_GRIP_POSITION] пересчитанное значение координат «ручки» положения, но и влияет на поведение самой «ручки». В этом случае «ручка» больше не имеет возможности перемещаться по координате Z, независимо от того, как она будет перемещаться в пространстве модели: c режимом ОРТО, полярным отслеживанием по Z, вводом относительных или абсолютных координат. Координата «ручки» по Z всегда будет равна 0 относительно локальной системы координат объекта (рис. 39).
Перемещение 2D-/3D-примитива с сохранением относительного положения
Вернемся к теме параметризации базовой точки примитива с помощью «ручки» положения и разберем случай, когда необходимо, чтобы один примитив перемещался относительно другого с сохранением своего положения. Пример этого можно посмотреть по ссылке, а файл формата*.dwg с уже сделанным объектом размещен по ссылке.
Создадим две «ручки» положения, одну группу и два BOX.
BOX можно создавать сразу в группе, вызывая контекстное меню группы, либо его можно перенести в группу с помощью drug&drop (рис. 40).
Для наглядности и удобства навигации поименуем элементы в окне Редактора параметрического объекта. Для этого воспользуемся параметром Имя (рис. 41). Этот параметр имеется у большинства элементов Редактора параметрического объекта.
«Ручка» положения группы будет задавать положение группы и входящих в нее BOX 1 и BOX 2. Эта часть параметризации аналогична той, которая была рассмотрена ранее на примере параметризации базовой точки цилиндра. При этом начало координат группы и начало системы координат BOX 1 совпадают.
Добавим в список параметров объекта параметр [DIN_GRIP_POSITION]. Затем назначим этот параметр в качестве параметра назначения у «ручки» положения группы. А в базовую точку Положение группы пропишем соответствующие значения с [DIN_GRIP_POSITION] (рис. 42).
Аналогичным образом параметризуем положение BOX 2. Добавим в список параметров объекта параметр [DIN_GRIP_POSITION_2]. Затем назначим этот параметр в качестве параметра назначения у «ручки» положения BOX 2 относительно группы. А базовая точка BOX 2 должна брать соответствующие значения из [DIN_GRIP_POSITION_2] (рис. 43).
Можно было бы предположить, что выполнены все действия, которые необходимы для параметризации. Однако можно заметить, что «ручка» положения BOX 2 относительно группы находится не там, где ее можно было ожидать. Она смещена относительно базовой точки BOX 2 на некоторое расстояние. Это показано в видео по ссылке.
Связано это с тем, что координаты положения BOX 2 присваиваются относительно положения группы, в то время как «ручка» положения BOX 2 относительно группы передает свои координаты не относительно начала системы координат группы, а относительно локальной системы координат объекта. Отсюда возникает смещение «ручки», равное расстоянию от начала локальной системы координат объекта до начала системы координат группы (рис. 44).
Чтобы скорректировать это смещение, необходимо задать базовую точку у самой «ручки» положения BOX 2 так, чтобы базовая точка «ручки» положения BOX 2 по координатам была равна базовой точке группы, то есть брать координаты из параметра [DIN_GRIP_POSITION] (рис. 45).
В этом случае «ручка» положения BOX 2 будет передавать координаты в [DIN_GRIP_POSITION_2] относительно системы координат группы, а не относительно локальной системы координат объекта (рис. 46). «Ручка» положения BOX 2 будет перемещаться при перемещении группы, а смещение будет отсутствовать.
При этом координаты группы и базовая точка «ручки» BOX 2 равны, эти координаты передает «ручка» положения группы (рис. 47).
Посмотреть видео с демонстрацией создания описанной параметризации можно по ссылке.
Во второй части мы продолжим делиться своим опытом и рассматривать решения нестандартных задач графической параметризациии объектов в nanoCAD BIM Строительство.
По всем вопросам:
☎ 8 (800) 201-63-85
✉ cad@maxsoft.ru