Что использовать вместо булевых операций. Обобщение операций на булеву алгебру. Головка для накидного гаечного ключа

БУЛЕВА ОПЕРАЦИЯ

Булева операция предназначена для создания нового тела на основе двух или нескольких уже существующих тел. В результате выполнения операции создается новое тело, являющееся комбинацией исходных тел. Существуют три способа комбинирования исходных тел: сложение, вычитание и пересечение. Результатом операции “сложение” будет тело, включающее в себя часть, которая есть только у первого тела, часть, которая есть только у второго тела, и часть, которая является общей для обоих тел. Результатом операции “вычитание” будет тело, которое является вычитанием второго тела из первого, и будет состоять из части, которая есть только у первого тела. Результатом операции “пересечение” будет тело, которое является пересечением двух тел, и будет состоять только из части, которая является общей для обоих тел.

Задание булевой операции

Для задания булевой операции используется команда “3B:Создать Булеву операцию” . Вызов команды:

После вызова команды становится возможным выбор одной из двух опций:

Выбрать несколько операций.

Каждая опция, определяет способ создания булевой операции. Существует два способа

- создание булевой операции на основе двух тел (опция )

- создание булевой операции на основе нескольких тел (опция )

При вызове команды всегда активизирована опция “Выбрать первое тело”.

Существует еще один способ вызова команды: Подведите курсор к одной из операций модели и

нажмите , в появившемся меню выберите пункт “Создать”. Появится список возможных команд, которые можно вызвать при выборе операции. Выберите пункт “Создать булеву операцию”, при этом выбранное тело будет являться первым выбранным элементом команды.

Трёхмерное моделирование

В этом случае можно создать операцию только на основе двух тел.

Создание булевой операции на основе двух тел

При выполнении булевой операции на основе двух тел, необходимо выполнить следующие действия:

1. Выбрать первое тело.

2. Выбрать второе тело.

3. Выбрать тип операции (сложение, вычитание, пересечение).

4. Завершить ввод.

Выбор первого тела осуществляется с помощью опции

Выбрать первое тело.

После выбора первого тела становятся доступны следующие опции

Выбрать второе тело.

Отменить выбор второго операнда булевой операции.

Булева операция

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

На нижнем рисунке слева показан результат операции вычитания, а справа – пересечения.

Следует отметить, что при первом выполнении команды булевой операции после запуска программы в автоменю автоматически устанавливается тип булевой операции “Сложение”. При повторном вызове команды создания булевой операции в нажатом состоянии будет кнопка, соответствующая типу булевой операции, выбранной при последнем вызове команды.

Создание копий исходных операций

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

Создать копию исходных операций.

При вызове данной опции появляется окно диалога, где требуется указать, копию какого из выбранных тел мы хотим создать.

Трёхмерное моделирование

Если была вызвана опция "Создать копию", то перед выполнением булевой операции производится выполнение специального действия. В результате этого действия создаются тела - копии исходных тел, которые в дальнейшем можно использовать. Поясним вышесказанное на примере. На рисунке показаны исходные 2D построения и две созданные булевы операции.

Вначале были созданы три тела: два параллелепипеда на основе прямоугольного профиля и цилиндр. Затем была выполнена булева операция вычитания из первого параллелепипеда цилиндра. В результате образовался параллелепипед с отверстием. Но такую же операцию необходимо выполнить и со вторым параллелепипедом. Для этого на этапе выполнения первой булевой операции использовали опцию "Создать копию" для второго тела (цилиндра). Поэтому после первой булевой операции по-прежнему осталось три тела: параллелепипед с отверстием, второй параллелепипед и копия цилиндра. Затем выполнили вторую булеву операцию между параллелепипедом и цилиндром.

Создание булевой операции на основе нескольких тел

После вызова команды в автоменю становится доступной опция

Выбрать несколько операций.

Данная опция устанавливает режим создания булевой операции на основе нескольких тел. А также делает доступной опцию

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

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

Отменить выбор всех операций можно опцией

<К> Отменить выбор операций.

Над телами, как и над другими геометрическими объектами, можно выполнять операции - совокупность действий над одним или несколькими исходными телами, которая приводит к рождению нового тела. Одними из основных операций для двух тел являются булевы операции.

Булевыми операциями называют операции объединения, пересечения и вычитания тел, так как они выполняют одноименные операции над внутренними объемами тел (над множествами точек пространства, находящимися внутри тел). Булеву операцию объединения тел будем обозначать формулой , где - исходные тела, S - результирующее тело. Булеву операцию пересечения тел будем обозначать формулой . Булеву операцию вычитания тел будем обозначать формулой . В порядке следования тел-операндов будем называть их первым телом и вторым телом.

Рис. 6.6.1. Два исходных тела

Рис. 6.6.2. Объединение тел

Результатом операции объединения двух тел является тело, которое содержит точки, принадлежащие внутреннему объему или первого, или второго тела. Результатом операции пересечения двух тел является тело, которое содержит точки, принадлежащие внутреннему объему как первого, так и второго тела.

Результатом операции вычитания двух тел является тело, которое содержит точки, принадлежащие внутреннему объему первого, но не принадлежащие внутреннему объему второго тела.

На рис. 6.6.1 приведены исходные для булевой операции тела. На рис. 6.6.2 приведен результат операции объединения тел, на рис. 6.6.3 приведен результат операции пересечения, на рис. 6.6.4 и 6.6.5 приведены результаты операции вычитания тел.

Операцию вычитания тел можно свести к операции пересечения тел; для этого нужно вывернуть второе тело наизнанку и найти точки его объема, одновременно принадлежащие и объему первого тела. Вывернутое наизнанку тело S будем обозначать

Рис. 6.6.3. Пересечение тел

Рис. 6.6.4. Разность тел

Рис. 6.6.5. Разность тел

При выворачивании тела наизнанку внутренние стороны граней становятся наружными сторонами, а наружные - внутренними и изменяются направления циклов на противоположные, в результате чего внутренним объемом тела становится та часть пространства, которая до этого находилась снаружи тела. Математически операция вычитания сводится к операции пересечения тел Конструктор при проектировании использует операции объединения и вычитания (они могут называться по-другому, например, операции сварки и сверления), а математический аппарат выполняет соответственно операции объединения и пересечения. Все булевы операции содержат много общего и выполняются по единому алгоритму.

Объединение тел.

Рассмотрим булеву операцию объединения тел. Кратко суть операции можно описать следующим образом: нужно найти линии пересечения граней тел, удалить ту часть первого тела, которая попала внутрь второго тела и ту часть второго тела, которая попала внутрь первого тела, а из всего остального построить новое тело. Операцию условно разобьем на три этапа. На первом этапе построим линии пересечения поверхностей граней и на их базе - новые ребра. Построенные новые ребра будем называть ребрами пересечения, а ребра тел будем называть старыми ребрами. На втором этапе определим точки пересечения новых ребер со старыми ребрами и в этих точках разрежем старые ребра на несколько ребер. На третьем этапе операции перестроим циклы пересекшихся граней. После этого добавим к пересекшимся граням тел грани, топологически связанные ними. Рассмотрим этапы построения тела более подробно.

Первый этап операции объединения тел начнем с того, что построим линии пересечения каждой грани первого тела с каждой гранью второго тела, если таковые имеются. Для этого используем алгоритм пересечения поверхностей граней.

Пусть грани первого тела описываются поверхностями

а грани второго тела описываются поверхностями

На базе линий пересечения граней первого и второго тел

(6.6.3)

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

Ребра пересечения должны быть построены так, чтобы они полностью лежали внутри циклов граней исходных тел. Ребра пересечения могут подходить к границам грани только своими концами. В точках А, В и С (рис. 6.6.6) старые ребра граней должны быть разбиты каждое на два ребра, так как в результирующее тело войдет только часть исходной грани.

На втором этапе разрежем старые ребра тела, к которым подходят ребра пересечения. Резка старого ребра осуществляется путем рассечения кривой, на которой базируется ребро. Из одной кривой получим две кривые, в совокупности заменяющие исходную кривую ребра. Одна из этих кривых останется геометрическим носителем разрезаемого ребра, а на базе второй построим новое ребро, которое получит от исходного ребра всю необходимую информацию. Как было сказано, каждое ребро строится на базе кривой пересечения поверхностей (6.1.1). Кривую пересечения поверхностей составляют две поверхности и две соответствующие им двухмерных кривые. Рассечению подлежат именно двухмерные кривые на двух разных поверхностях. Как до, так и после рассечения эти кривые должны иметь одинаковые области определения параметров и соответствие точек при всех значениях параметра.

Точки пересечения нового ребра со старым ребром грани ищутся как точки пересечения двухмерных кривых, заданных на общей для них плоскости параметров. От каждого ребра в формуле (4.8.6) точек пересечения линий участвует по одной двухмерной кривой, входящей в линию пересечения.

Параметры точек пересечения ребер и сами координаты кривых, являющиеся параметрами поверхности, должны быть определены с заданной точностью.

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

Так как каждое ребро исходных тел входит в циклы двух смежных граней, то после резки ребер исходных тел необходимо произвести корректировку этих циклов с учетом разрезанных ребер.

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

Третий этап завершает булеву операцию. Для того чтобы каждую из показанных на рис. 6.6.6 граней разрезать на части, нужно перестроить ее циклы и в соответствии с циклами изменить контуры, описывающие область определения параметров поверхности грани. На рис. 6.6.7 показаны две пересекшиеся грани (тонкими линиями со стрелками показано направление циклов граней исходных тел) и ребро пересечения. На рис. 6.6.8 показаны те части граней, которые войдут в объединение тел.

Рис. 6.6.7. Исходные грани тела

Рис. 6.6.8. Обрезанные грани

Стрелками показано направление перестроенных циклов граней тел. Каждый цикл представляет собой список ребер в порядке их следования и список флагов ориентации этих ребер в цикле.

Из рисунка видно, что при принятой ориентации ребер пересечения () в циклы граней первого тела они войдут с отрицательным флагом, а в циклы граней второго тела они войдут с положительным флагом.

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

Рассмотрим одну из двух пересекшихся граней, принадлежащих первому телу. Берем любое ребро пересечения рассматриваемой грани и начинаем с него составлять список ребер цикла. Ребро пересечения должно войти в цикл грани первого тела с отрицательным флагом, следовательно, цикл будет иметь направление, противоположное первому ребру. Для продолжения цикла среди ребер пересечения и среди старых ребер грани ищем все ребра, стыкующиеся с данным ребром в его начальной вершине. Среди найденных ребер выберем то, которое лежит слева от остальных (заворачивает влево на больший угол по сравнению с другими найденными ребрами, если смотреть вдоль цикла с наружной стороны грани). Выбранное ребро ставим в список цикла. Если выбранное ребро является старым, то оно сохраняет свой флаг в цикле. Если выбранное ребро есть ребро пересечения, то оно получит отрицательный флаг. Ребра пересечения обладают преимущественным правом по отношению к старым ребрам быть выбранными. То есть, если левее других оказались два совпадающих ребра, одно из которых является старым, а другое - ребром пересечения, то для продолжения цикла должно быть выбрано ребро пересечения.

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

Поиск стыкующихся ребер и определение угла поворота в точке стыка удобно выполнять по двухмерным кривым ребер грани. При этом можно работать даже с такими ребрами, которые в пространстве стянуты в точку (например, ребро в вершине конуса или полюсе сферы). На рис. 6.6.9 показано, что с новым ребром В А в точке А стыкуются несколько ребер. В данном случае для продолжения цикла, начатого с ребра пересечения В А, следует выбрать ребро АС.

Вновь построенные циклы рассортируем по группам, каждая из которых состоит из внешнего цикла и входящих в него внутренних циклов. У рассматриваемой грани могут остаться нетронутыми один или несколько старых циклов. Нетронутыми мы будем называть старые циклы грани, ни одно ребро которых не вошло в перестроенные циклы. Среди старых нетронутых циклов отберем те, которые необходимо включить в состав описания перестроенной грани. Ими являются старые внутренние циклы грани, лежащие внутри новых внешних циклов. Еще нужно определить, не потребуется ли включить в результат старый внешний цикл грани, если он остался нетронутым. Это необходимо сделать, если для некоторых новых внутренних циклов не найден новый внешний цикл и они лежат внутри старого внешнего цикла. Сортировку циклов удобно выполнять с помощью двухмерных контуров, соответствующих каждому циклу.

Если в результате сортировки внешних циклов получилось больше одного, то это означает, что из исходной грани в результате операции образовалось несколько граней. На рис. 6.6.10 а - 6.6.13 а приведены варианты исходных граней первого тела.

На рис. 6.6.10 б-6.6.13 б. приведены грани с добавлением ребер пересечения (ребра пересечения выделены). На рис. 6.6.10 в-6.6.13 в приведены грани, которые получились в результате операции.

Рис. 6.6.10. Исходная грань (а), грань с. добавлением ребер пересечения (б), результат операции (б)

Рис. 6.6.11. Исходная грань (а), грань с добавлением ребер пересечения (б), результат операции (в)

Рис. 6.6.12. Исходная грань (а), грань с добавлением ребер пересечения (б), результат операции (в)

Рис. 6.6.13. Исходная грань (а), грань с добавлением ребер пересечения (б), результат операции (в)

На рис. 6.6.10 грань с двумя циклами была разрезана и получилась одна грань с одним циклом. На рис. 6.6.11 грань с двумя циклами дала две грани. В примере, приведенном на рис. 6.6.12, потребовалось использовать старый внешний и внутренний циклы. На рис. 6.6.13 из одной грани получено две грани, причем для одной из них потребовалось использовать старый внешний цикл.

Описанное перестроение циклов выполняется для каждой пересекшейся грани первого тела.

С пересекшимися гранями второго тела поступим аналогично тому, как мы поступили с гранями первого тела, но с одной небольшой разницей. Ребра пересечения должны войти в перестроенные циклы граней второго тела с положительным флагом (в перестроенные циклы граней первого тела они вошли с отрицательным флагом). В этом состоит отличие перестроения циклов граней второго тела. Все остальные действия над гранями первого и второго объединяемых тел одинаковы.

Мы перестроили пересекшиеся грани объединяемых тел. Все их включим в оболочку результирующего тела. Для получения результирующего тела остается к этим граням в оболочку тела добавить не пересекшиеся в операции грани, которые топологически связаны с пересекшимися гранями. Для этого будем брать последовательно ребра, входящие в оболочку нового тела, и включать в оболочку смежные грани ребер (если они там отсутствуют). Продолжив эти действия для ребер всех добавленных граней, получим оболочку результирующего тела.

Пересечение тел.

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

Эта операция имеет много общего с операцией объединения тел. Вернемся к рис. 6.6.6. На нем приведены пересекающиеся грани: одна грань первого тела и две грани второго тела. Грани режут друг друга, так что в результирующую оболочку войдут только части этих граней.

В пересечение тел войдет часть грани первого тела, лежащая внутри второго тела, и часть грани второго тела, лежащая внутри первого тела (рис. 6.6.14) (в объединение тел вошла часть грани первого тела, лежащая вне второго тела, и часть грани второго тела, лежащая вне первого тела).

Рис. 6.6.14. Исходные грани

Рис. 6.6.15. Перестроенные грани пересечения тел

В этом и состоит основное отличие операций объединения и пересечения тел.

Операцию разобьем на три этапа. Первый и второй этапы операции пересечения тел полностью совпадают с соответствующими этапами операции объединения тел.

Третий этап операции пересечения тел выполняется аналогично третьему этапу операции объединения тел, но имеет одно отличие в том, с каким флагом входят в циклы ребра пересечения. Ребра пересечения входят в перестроенные циклы граней первого тела с положительным флагом, а в перестроенные циклы граней второго тела - с отрицательным флагом (в объединении тел флаги ребер пересечения в циклах имеют противоположное значение). Все остальные действия над гранями обоих тел в обеих операциях одинаковы.

Разность тел.

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

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

Пересекающиеся ребра.

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

В большинстве случаев новые ребра не пересекают друг друга, но в некоторых частных случаях это возможно. На рис. 6.6.16 показаны два цилиндрических тела одинакового диаметра, оси которых пересекаются - крест из цилиндров. При булевом объединении этих тел возможна ситуация, когда будут построены всего два замкнутых ребра пересечения. Такие ребра имеют две точки пересечения: А и В, по крайней мере, одна из которых не будет совпадать с вершинами ребер, а будет лежать где-то на ребре. Точки пересечения ребер лежат в точках касания цилиндров. Эти ребра должны быть разрезаны в точках А и В и у их частей должна быть уточнена ориентация, так как при прохождении точки касания поверхностей в данном случае векторное произведение нормалей к ним, по которому ориентируются новые ребра, меняет свое направление на противоположное. Обнаружить пересечение новых ребер можно по пересечению кривых на поверхностях, из которых состоит линия пересечения.

Рис. 6.6.16. В точках А и В нормали граней совпадают

Совпадающие ребра.

Описанный алгоритм выполнения булевых операций работает корректно, если ребра пересечения не совпадают с ребрами исходных тел. В противном случае он нуждается в уточнении. Рассмотрим примеры.

В булевых операциях возможен случай, когда какая-либо грань одного тела пересекает другое тело по его ребру. Возможен также случай, когда при построении ребер пересечения граней одного тела с гранями другого тела мы получим два новых ребра, совпадающих в пространстве друг с другом и с ребром одного из тел. Все ребра являются разными, так как в них стыкуются разные грани. На рис. 6.6.17 приведены два тела, при выполнении булевой операции над которыми, ребра пересечения совпадут с ребрами меньшего тела. Следуя общему алгоритму, мы в данном случае получим восемь ребер пересечения, половина из которых должна быть опущена (или не должна быть построена).

Правило для ребер пересечения.

При наличии ребер пересечения, совпадающих с ребрами граней исходных тел, и в некоторых других случаях будем выполнять следующую проверку. Построим в плоскости каждой из двух пересекаемых граней по два вектора, ортогональные ребру пересечения. На рис. 6.6.18 это векторы для грани с нормалью и векторы для грани с нормалью . Векторы поворачивают влево от ребра пересечения в соответствующих плоскостях, а векторы поворачивают вправо от ребра пересечения в соответствующих плоскостях.

Рис. 6.6.17. Совпадение ребер пересечения с ребрами меньшего тела

Рис. 6.6.18. Пересечение граней

Рис. 6.6.19. Пересечение граней по ребру

Если грань не имеет продолже ния за ребро пересечения (ребро пересечения частично или полностью совпадает с ребром тела), то соответствующий вектор положим равным нулю (рис. 6.6.19). Используя векторы и нормали мы можем определить, будет ли данное ребро пересечения использовано в операции или оно должно быть опущено. Обратим внимание на следующее обстоятельство.

В операции объединения тел грань первого тела мы сможем перестроить, еслиона имеет продолжение справа от ребра пересечения вне второго тела, а грань второго тела мы сможем перестроить, если она имеет продолжение слева от ребра пересечения вне первого тела.

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

В противном случае рассматриваемое ребро пересечения в булевой операции объединения тел строить не следует (если оно построено, то должно быть опущено).

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

В противном случае рассматриваемое ребро пересечения в булевой операции пересечения тел строить не следует (если оно построено, то должно быть опущено).

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

То точка принадлежит внутреннему пространству тела. В противном случае - нет.

Перекрывающиеся грани.

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

Рис. 6.6.20. Совпадающие грани тел

Рис. 6.6.21. Объединение тел

В данном случае не все ребра пересечения граней войдут в булев результат; некоторые ребра должны быть опущены (или не должны строиться). Результат объединения тел приведен на рис. 6.6.21.

Аналогичная ситуация возникает при выполнении булевой операции над двумя соосными цилиндрами одинакового радиуса и еще во многих случаях. Грани могут перекрываться полностью, частично или всего лишь по одной линии.. Нормали частично перекрывающихся граней должны быть одинаково направлены в общих точках. Перекрывающимися являются грани, которые можно перенести на одну общую поверхность. Таких граней может быть больше двух. При наличии у тел-операндов перекрывающихся граней все ребра пересечения этих граней должны быть проверены на предмет присутствия их в булевом результате. В операции объединения тел нам потребуются только те ребра пересечения перекрывающихся граней, смежные грани которых имеют продолжение вне одного из тел. В операции пересечения тел нам потребуются только те ребра пересечения перекрывающихся граней, смежные грани которых имеют продолжение внутрь одного из тел.

Циклы перекрывающихся граней тел должны быть перестроены по несколько иному алгоритму, чем для остальных граней. Прежде всего, все ребра этих граней должны быть приведены к одному общему носителю (к поверхности одной из перекрывающихся граней). В операции объединения тел старые ребра перекрывающихся граней первого тела, лежащие внутри второго тела, и старые ребра перекрывающихся граней второго тела, лежащие внутри первого тела, не войдут в результирующее тело. В операции пресечения тел старые ребра перекрывающихся граней первого тела, лежащие вне второго тела, и старые ребра перекрывающихся граней второго тела, лежащие вне первого тела, также не войдут в результирующее тело.

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

Тела с несколькими оболочками.

Если какое-либо из тел-операндов имеет пустоты и, соответственно, описывается несколькими оболочками, то нетронутые операцией внутренние (внешние) оболочки должны быть проверены на вхождение в оболочку булева результата. В общем случае результирующее тело также может иметь несколько оболочек.

Дерево построения тел.

Булевы операции над телами показывают необходимость привлечения топологических понятий для построения тел.

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

Пример дерева приведен на рис. 6.6.22. В узлах дерева находятся тела. Дерево имеет несколько ярусов. Операции между телами обозначены соответствующими знаками. Операции выполняются между телами одного яруса.

Рис. 6.6.22. Дерево построения тела

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

Операции > Булева

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

Основные понятия. Возможности операции

Типы булевой операции

Существует три типа булевой операции:

● Сложение . Результатом выполнения операции является тело, объединяющее в себе все части тел, участвующих в операции.

● Вычитание . Результатом выполнения операции является тело, полученное вычитание одного тела из другого.

● Пересечение . Результатом выполнения операции является тело, полученное пересечением тел, участвующих в операции и состоящее из общих частей этих тел.

Операнды булевой операции

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


Булева операция может также выполняться и между набором тел, часть которых может быть выбрана как первые операнды, а другие тела как вторые. В процессе выполнения такой операции происходит объединение всех первых операндов в одно тело и всех вторых операндов в другое тело. Затем выполняется выбранная булева операция между этими телами. В результате получается одно многокомпонентное тело.

Результаты булевых операций

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

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

Ниже рассмотрим основные комбинации операндов и результаты выполнения операции.

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

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

Интерпретация листового тела

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

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

Операция "Сложение"

Результаты булевой операции "Сложение" при сочетании различных типов операндов:

Твёрдое тело + Твёрдое тело

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

Листовое тело + Твёрдое тело

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

Следует отметить, что листовое тело должно полностью пересекать твёрдое тело.

Твёрдое тело + Листовое тело

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

Листовое тело в этом случае должно быть определено в команде как полупространство.

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

При выборе листового тела следует обратить внимание на направление векторов нормалей. При определённом направлении нормалей может получиться некорректное результирующее тело. В этом случае нужно выбрать другое полупространство в параметре " Интерпретация операнда ".

Листовое тело + Листовое тело

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

Операция "Вычитание"

Результаты булевой операции "Вычитание" при сочетании различных типов операндов:

Твёрдое тело - Твёрдое тело

Результатом выполнения булевой операции "Вычитание" одного твёрдого тела из другого будет тело, переставляющее собой первый операнд, из которого удаляется объём второго операнда.

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

Листовое тело - Твёрдое тело

При вычитании твёрдого тела из листового, в листовом теле будет создано отверстие по форме второго операнда – твёрдого тела.

В результате вычитания листового тела из твёрдого остаётся часть твёрдого тела, отсечённая листовым телом. При этом листовое тело должно быть определено как полупространство. В зависимости от выбранного полупространства остается либо верхняя, либо нижняя часть твёрдого тела. Этот тип булевой операции является аналогом операции "Отсечение ".

Операция "Пересечение"

Результаты булевой операции "Пересечение" при сочетании различных типов операндов:

Твёрдое тело - Твёрдое тело

Результатом пересечения твёрдых тел является тело, представляющее собой общую часть всех операндов.

Листовое тело (полупространство) - Листовое тело (полупространство)

Если листовые тела совпадают на определённом участке, то в результате выполнения булевой операции "Пересечение" остается общая их часть.

Листовое тело - Твёрдое тело

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

Твёрдое тело - Листовое тело (полупространство)

В результате выполнения булевой операции "Пересечение" листового тела, интерпретированного как полупространство, и твёрдого тела останется часть твёрдого тела, отсечённая листовым телом. Результат выполнения этой операции похож на результат выполнения булевой операции "Вычитания" листового тела (полупространства) из твёрдого тела. Отличие в том, что в результате выполнения операции "Пересечение" остаётся другая часть твёрдого тела. При этом порядок выбора операндов не влияет на результат.

Булевы операции между листовыми телами (полупространствами)

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

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

Глобальные и локальные булевы операции

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

Помимо "Глобальной" булевой операцией в T-FLEX есть понятие " Локальной " булевой операции. В отличие от "Глобальной" булевой операции, где в качестве операндов выбираются только тела, в "Локальной" булевой операции помимо тел выбираются грани операндов. Выбрать грани операндов можно в параметрах операции на закладке "Грани". В некоторых случаях использование "Локальной" булевой операции дает значительный выигрыш во времени регенерации модели по сравнению с "Глобальной" булевой операцией, т.к. в результате выполнения операции будут искаться пересечения только указанных граней. Например, если нужно проделать отверстие в достаточно сложном теле и известно, что отверстие пересекает небольшое количество граней, то имеет смысл указать эти грани в параметрах операции.

Следует заметить, что нужно внимательно выбирать грани для "Локальной" булевой операции. В случае неправильно выбранных граней может сформироваться некорректное тело.

Выбор отдельных граней операндов в " Локальной " булевой операции с включенным параметром " " позволяет формировать такие тела, как показано на рисунке ниже. При этом сначала будут определены линии пересечения граней операндов, а затем по этим линиям пересечения и границам граней первых операндов будут сформированы замкнутые циклы для формирования булевой операции.

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

Выборочные булевы операции

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

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

В некоторых ситуациях выбранный топологический элемент явно не определяет нужную часть. Например, как показано на картинке ниже, выбранная грань принадлежит нескольким наружным частям операнда. Для того чтобы однозначно определить нужную часть надо построить 3D узел на этой грани и при помощи опции " Выбор точки " выбрать этот 3D узел. При этом грань выбирать не нужно.

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

Эта возможность позволяет:

1. Ускорить процесс пересчета булевой операции за счет того, что указан конкретный тип контакта.

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

В команде предусмотрены четыре типа соответствия:

Полное совпадение – границы топологических элементов совпадают с заданной точностью.

● Включение – границы второго элемента лежат в пределах границ первого элемента.

Частичное совпадение – границы одного элемента частично совпадают с границами другого элемента.

● Проецирование – совпадение отпечатков границ топологических элементов.

В таблице ниже представлено описание типов соответствия для различной топологии операндов:

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

На рисунке ниже показано задание соответствия в булевой операции "Сложение" между полусферой и конусом, имеющими совпадающие основания. Если будет задано соответствие по совпадению граней основания и выбран точный метод, то в этом случае невозможно будет получить результат булевой операции, т.к. при пересечении операндов есть еще одно общее ребро, не описанное в соответствиях. В этом случае единственно возможным будет приближенный метод, при реализации которого будет найдено это пересечение.

Сглаживание новых рёбер

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

Отсутствие одного из операндов

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

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

Создание булевой операции

Для работы в команде используются совместно автоменю и окно свойств. Они работают синхронно и дополняют друг друга. Состояние автоменю зависит от стадии задания операции, от назначения и типа выбираемых объектов.

Для создания операции нужно выполнить следующие действия:

1. Выбрать булевы операнды.

2. Выбрать тип булевой операции.

3. Выбрать части операндов для формирования выборочной булевой операции (не обязательно).

4. Задать соответствия элементов (не обязательно).

5. Задать дополнительные параметры (при необходимости).

6. Задать параметры сглаживания (не обязательно).

7. Подтвердить создание операции.

Основные параметры операции

Выбор операндов

Выбор операндов для глобальной булевой операции

Для выбора операндов глобальной булевой операции используется следующая опция:

<1> Выбрать булевы операнды

При этом в автоменю становятся доступными опции:

Выбрать первое тело

Выбрать второе тело

При активизации одной из этих опций фокус ввода перемещаемся в соответствующее окно выбора первых или вторых операндов в окне свойств. И на оборот, переключаясь между окнами выбора операндов в окне свойств, в автоменю активизируется соответствующая опция. Выбрать тела в качестве первых или вторых операндов можно непосредственно в 3D сцене или в окне дерева 3D модели. Тела первых операндов подсвечиваются в сцене зеленым цветом, тела вторых операндов – желтым. Выбранный в окне свойств операнд подсвечивается в сцене синим цветом.

Для удаления любого операнда из списка нужно после его выбора в окне " Свойства " нажать кнопку [ Удалить ].

Для отмены выбора всех операндов служит опция:

Отменить выбор всех операндов

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

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

Выбор операндов для локальной булевой операции

Для перехода в режим выбора граней для создания локальной булевой операции можно воспользоваться опцией автоменю:

<3> Выбрать локальные грани

Грани " в окне " Свойства ".

При этом в автоменю становятся доступными следующие опции:

Выбрать локальные грани первого операнда

Выбрать локальные грани второго операнда

После выбора операндов можно, при помощи указанных опций автоменю или перевода фокуса ввода в окна закладки " Грани ", выбирать грани тел в сцене для создания локальной булевой операции. Во время создания булевой операции можно не выбирать операнды, а сразу переключиться в режим выбора граней. При этом тела, грани которых выбраны, будут автоматически добавлены как операнды на соответствующую закладку в параметрах операции. Маркировка граней первых и вторых операндов аналогична выбору операндов-тел. Для удаления грани нужно выбрать её в списке на закладе " Грани " и нажать кнопку [ Удалить ]. В некоторых случаях необходимо включить параметр " Обрезать по граням первых операндов " для формирования правильного результата операции.

Для отмены выбора всех локальных граней служит опция:

Отменить выбор локальных граней

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

Выбор типа булевой операции

Выбор типа операции осуществляется либо с помощью параметра " Тип операции " в окне " Свойства ", либо с помощью следующих опций автоменю:

<+> Сложение

<-> Вычитание

<*> Пересечение

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

Выбор частей операндов

Для создания выборочной булевой операции служит следующая опция:

<2> Выбрать части операндов

Также для активизации этого режима можно переключиться на закладку "

Выбрать элемент, определяющий часть операнда

Выбрать точку, определяющую часть операнда

При помощи этих опций можно выбрать элементы, определяющие части операндов. Имена выбранных элементов будут добавлены в список на закладке " Части операндов " в окне " Свойства ". На этой же закладке можно выбрать действие для выбранных частей операндов: оставлять их в результирующем теле или исключать. Это действие устанавливается для всех выбранных частей операндов.

Для отмены выбора частей операндов служит опция:

Отменить выбор элементов, определяющих части операндов

Для задания соответствия элементов служит опция:

<4> Задание соответствий элементов

Также для активизации этого режима можно переключиться на закладку " ". При этом в автоменю становятся доступными следующие опции:

Выбрать первый элемент

Выбрать второй элемент

Отмена выбора всех элементов

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

Следует отметить, что набор типов соответствия в этом списке может быть разным в зависимости от сочетания топологических элементов в паре (см. таблицу в параграфе " Задание соответствия элементов ").

На этой закладке может быть установлена точность соответствия.

Предварительный просмотр результатов булевых операций

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

Предварительный просмотр результата операции

Предварительный просмотр изменений, вносимых операцией

Дополнительные параметры операции

Продолжение рёбер операндов

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

Выбор типа результирующего тела

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

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

Копирование по образцу

Если в качестве одного из операндов используется 3D массив, то, включив параметр " Копирование по образцу ", можно значительно сократить время выполнения булевой операции.

Возможность отсутствия одного из операндов

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

Сглаживание новых ребер

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

Материал новых граней

Может быть выбрано одно из трех значений:

● “ Материал 1-го операнда ”. В этом случае для новых граней будет назначен основной материал, либо материал покрытия, если он задан, в соответствии с этими параметрами первого операнда. Если первых операндов несколько и они с разными материалами, то на новых гранях будет сохранён материал того операнда, который участвовал в формировании этих граней.

● “ Материал 2-го операнда ”. При этом значении материал граней второго операнда, которые участвовали в формировании новых граней, перенесется на эти новые грани. Это может быть и основной материал, и материал покрытия, если он задан, и даже материал операции назначения материала. Например, в результате булевой операции "Вычитание"между первым операндом с материалом сталь и вторым операндом с материалом черный пластик на созданных гранях результирующего тела будет наложен материал черный пластик. Если вторых операндов несколько и они с разными материалами, то на новых гранях будет сохранён материал того операнда, который участвовал в формировании этих граней.

● “ Основной материал 1-го операнда ”. Действие этого параметра аналогично первому параметру (“ Материал 1-го операнда ”), за исключением случая, когда задан материал покрытия, материал покрытия на новых гранях не применяется. Например, если в детали с основным материалом "Сталь" и с покрытием "Медь" с помощью булевой операции проделать отверстие, то внутри оно будет выглядеть стальным в соответствии с основным материалом.

Особенности работы с булевыми операциями

Отображение булевой операции в окне "3D Модель"

После создания булевой операции она помещается в папку "Булевы" в окне " 3D модель ". Слева от каждой булевой операции отображается пиктограмма, обозначающая тип операции ( Сложение, Вычитание, Пересечение). Особым образом булевы операции отображаются в дереве 3D модели. При раскрытии структуры Тела булева операция показывается в виде пиктограммы слева от второго операнда. На рисунке справа показана "Булева операция_2": пересечение первого операнда "Вращение_1" со вторым операндом "Выталкивание_2".

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


Создание булевой операции в дереве 3D модели

В дереве 3D модели можно создать булеву операцию без явного вызова команды создания.

Используя метод Drag&Drop , можно выбрать одно тело в дереве 3D модели и удерживая левую кнопку мыши перетащить его на другое тело. В этом случае будет автоматически создана булева операция "Сложение". Если при этом удерживать нажатым Вычитание ". Если вместо удерживать нажатым будет создана булева операция " Пересечение ". Перетаскиваемое тело будет вторым операндом, а тело, на которое перетаскивают – первым операндом.

Автоматическое создание булевых операций при создании других операций

При создании многих операций T-FLEX CAD возможно автоматическое создание булевой операции. Создаваемое тело при этом всегда является вторым операндом булевой операции. В качестве первого операнда выбирается любое из уже существующих тел 3D модели.

Для создания булевой операции необходимо:

1. Включить режим создания булевой операции с помощью опции автоменю:

Булева операция создаётся при нажатой пиктограмме.

2. Выбрать тип создаваемой операции с помощью опции автоменю, содержащей выпадающий список:

Интеллектуальный

Принцип действия интеллектуального режима:

Если создаваемое тело и выбранное тело (явно или неявно) имеют пересечение объемами - тип булевой операции: вычитание .

Если создаваемое тело полностью лежит внутри выбранного тела - тип булевой операции: вычитание .

Если создаваемое тело касается выбранного тела – тип булевой операции: сложение .

Если условия, указанные в пунктах 1, 2, 3, не выполнены, или выбранное тело лежит внутри создаваемого, или при определении типа проникновения тел возникла ошибка – тип булевой не определен, булева операция не будет создана .

3. Выбрать первый операнд булевой операции (в некоторых случаях – необязательное действие) с помощью опции автоменю:

Если в сцене присутствует всего одно тело, то оно выбирается автоматически. Создаваемое в операции новое тело является вторым операндом булевой операции.

После подтверждения создания операции сначала создается тело, а затем выполняется булева операция заданного типа.


Следует отметить, что предварительный просмотр при создании таких операций отображает результат автоматической булевой только при создании операции. При редактировании предварительный результат не отображается. Если автоматически создаваемая булева операция не имеет результата, то на предварительном просмотре будет видна только создаваемая операция.

Удаление булевой операции

Если булева операция находится на верхнем уровне дерева, то при её удалении в дереве модели останутся Тела операндов этой булевой операции. Если же у булевой операции есть потомки, то при её удалении будет выдан диалог " Удаление элементов ".

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

На рисунке ниже показана структура Тела_1. Сначала была создана булева операция “Вычитание” операции “Круговой массив_1” из операции “Вращение_1”, а затем на грань результирующего тела булевой операции была нанесена “Резьба_1”. Если теперь удалить операцию “Булева_1” с попыткой исключения элемента из дерева модели и в диалоге “Выбор операции для переназначения потомков” выбрать операцию “Вращение_1”, то операция “Резьба _1” станет потомком операции “Вращение_1.

При удалении одного из операндов с исключением элемента из дерева модели будет удалена и сама булева операция.

Булевы операции с 3D фрагментами

Использование 3D фрагментов в качестве операндов является уникальной возможностью T-FLEX CAD. Благодаря этому значительно расширяются возможности создания параметрических 3D моделей и сборок. При вставке 3D фрагмента в сборку есть возможность автоматически создавать булеву операцию с телами сборки. Более подробно о возможностях использования 3D фрагмента в качестве операнда можно посмотреть в описании команды "3D Фрагмент " в разделе " Создание булевой операции на основе 3D фрагмента " и в описании команды ST: Параметры документа в разделе " Закладка 3D ".

При создании 3D фрагментов с заданной автоматической булевой операцией предварительный просмотр отображает не только вставляемый фрагмент, но и результат этой булевой операции.


Нанесение резьбы при помощи булевой операции

Если на грани одного из операндов нанесена косметическая резьба и эта грань контактирует с гранями другого операнда, то в этом случае есть возможность автоматически создать косметическую резьбу на грани результирующего тела. Например, как показано на рисунке ниже, из тела корпуса вычитается тело с косметической резьбой на грани. При этом на созданной грани результирующего тела автоматически создается косметическая резьба.

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

В диалоге параметров операции, вызываемом опцией , можно задать общие параметры операции .

Для редактирования созданной операции используется команда 3EB.

Цель работы : Изучение основных приемов размножения объектов с помощью функции «массив»; изучение технологии создания объектов с помощью булевых операций.

Булевы операции

Булевы операции (часто их называют логическими) пришли в 3D графику из математики, точнее, из булевой алгебры (названной в честь ее создателя - Джорджа Буля) и основаны на понятиях объединения, пересечения и исключения. В 3D Studio Max существует три основных булевых операции, результаты применения которых показаны на рисунке 1:
  1. Объединение (соединение объектов в один).
  2. Пересечение (в булевый объект входят только общие части исходных объектов).
  3. Исключение (вырезание).
Рисунок 1. Результаты применения булевых операций.
Объединение . Результирующий объект, полученный объединением двух объектов, содержит все точки двух исходных объектов-операндов, за исключением дубликатов общих точек.

Пересечение . Объект, полученный в результате операции пересечения, содержит только те точки, которые являются общими для двух исходных объектов.

Вычитание . Объект, который получается в результате выполнения этой логической операции, содержит только точки первого объекта за исключением тех точек, которые являются общими для двух объектов. Операция логического вычитания одного объекта из другого является некоммутативной. Другими словами, разность А - В – это не то же самое, что разность В - А .

Использование булевых операций

Булевы операции в 3D Studio Max можно выполнять только над двумя объектами. Эти объекты должны пересекаться, т.е. содержать общие точки. Булевы операции позволяют создавать составные объекты, выполняя операции объединения, вычитания и пересечения частей двух объектов. К булевым операциям можно получить доступ следующим образом (рис. 2).
Рисунок 1. Получение доступа к булевым операциям.

Вначале требуется выделить объект, который будет участвовать в операции первым, т.е. будет объектом А в одном из окон проекций. Затем необходимо щелкнуть на вкладке Create (Создать) панели команд и на кнопке Geometry (Геометрия). В раскрывающемся списке под этой кнопкой выберите режим Compound Objects (Составные объекты). В ветви Object Type (Тип объекта) щелкните на кнопке Boolean (Булевы операции). В панели команд появится свиток с операциями, которые можно выполнять применительно к объектам. Булевы операции упоминают в сочетании с еще одним термином – операндом. Операнд – это переменная, присвоенная выбранным объектам во время выполнения операции. Операнд во многом подобен переменным, используемым в алгебре при составлении уравнений. Например, переменные А и В можно использовать для представления двух объектов, к которым будет применена булева операция.

  • Union (Объединение). Эта функция объединяет два объекта в один и удаляет перекрывающиеся или накладывающиеся области.
  • Intersection (Пересечение). Эта функция создает объект, который содержит только перекрывающиеся области обоих объектов.
  • Substraction (Вычитание [А-В]) и Substraction (Вычитание [В-А]). Эта операция позволяет удалить один из объектов и любые перекрывающиеся области объектов. При операции данного типа выбор А-В приводит к вычитанию объекта В из объекта А, а В-А – к вычитанию объекта А из В.
  • (Добавлена в старших версиях программы) Cut (Разрез). Эта функция рассекает операнд А операндом В. Она работает аналогично модификатору Slice (Сечение), который позволяет рассечь каркас. Обратите внимание на наличие четырех вариантов вырезания: Refine (Уточнение), Split (Расщепление), Remove Inside (Удаление внутри), Remove Outside (Удаление снаружи).
  • Операция Refine добавит в операнд А новые вершины и ребра в местах его пересечения с операндом В. Операция Split рассечет объект на два куска. Операции Remove Inside и Remove Outside удалят из операнда А все грани, которые находятся, соответственно, внутри и снаружи операнда В.
Создание булевых объектов

Объекты типа Boolean (Булевы) создаются за счет применения к оболочкам двух трехмерных тел операций булевой алгебры. Оболочки исходных тел, участвующих в булевой операции – операнды (operands ), обязательно должны пересекаться. Из двух объектов, участвующих в булевой операции, один должен быть выделен до ее начала (операнд А), а другой (операнд В) указывается в ходе операции. После выделения одного из объектов, необходимо выбрать переключатель той операции, которую нужно выполнить. После того, как эти элементы выбраны, следует выбрать переключатель одного из типов копирования:

  • Move (Переместить) – в этом случае в логической операции участвует сам объект. Он пропадет после выполнения операции.
  • Сору (Копия) – в операции участвует копия второго объекта. Сам объект остается при этом без изменения.
  • Reference (Ссылка) – в операции принимает участие ссылка на второй объект.
  • Instance (Экземпляр) – в операции принимает участие экземпляр второго объекта.
Затем потребуется щелкнуть на кнопке Pick Operand В (Выбрать операнд В) и, как только она будет выделена, в окне проекции необходимо выбрать второй объект, применительно к которому нужно выполнить булеву операцию. Приступая к созданию булевых объектов, следует помнить, что иногда они нестабильны и в определенных ситуациях могут приводить к нежелательным результатам. Поэтому, прежде чем применять булевы операции, рекомендуем создать резервную копию текущего проекта, чтобы в случае повреждения объектов их можно было восстановить. В процессе работы с булевыми функциями обнаруживается, что иногда булевы объекты ведут себя крайне нестабильно в случае применения нескольких булевых операций в отношении одних и тех же объектов. Один из возможных методов разрешения этой проблемы – преобразование объекта в редактируемый каркас перед выполнением каждой булевой операции. Это может уменьшить вероятность получения нежелательных результатов.

Настало время познакомиться с логическими операциями и новым типом данных – Булево.

Самая простая логическая операция – это операция Равно. Она выясняет, равны между собой два значения или нет.

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

Логическая операция Равно обозначается знаком «=». В подавляющем большинстве случаев логические операции используются в инструкциях Если и Цикл. Но эти инструкции вам пока незнакомы.

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

Рис. 3.79. Заготовка для операции «Равно»

Теперь внутри скобок напишите операцию Равно. Например, 5 = 5.

Затем напишите еще одну инструкцию присваивания, но так, чтобы в операции Равно участвовали разные числа. Например, 5 и 2.

Запустите «1С:Предприятие» в режиме отладки и посмотрите, чему равны переменные в этих инструкциях (рис. 3.80).

Рис. 3.80. Значение «Истина» и значение «Ложь»

Вы увидите, что там, где сравниваются два одинаковых числа, результатом является значение Истина. А там, где сравниваются разные числа, результатом является значение Ложь. К тому же оба этих значения имеют тип Булево (ударение на букву «у»).

Логических операций во встроенном языке, как и в жизни, довольно много. Все они интуитивно понятны, и нет особой надобности в том, чтобы тренироваться в их использовании. Единственное, что может вызвать трудность, – это то, какими символами они обозначаются. Но в этом вам поможет таблица 3.1.

Таблица 3.1. Операции сравнения

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



А вот оставшиеся четыре операции (больше/меньше) можно применять только к двум числам, двум строкам или к двум датам.

В этом разделе вы не будете выполнять примеры с операциями сравнения. Но когда вы познакомитесь с инструкцией Если, у вас будет возможность как следует поупражняться в написании разных операций сравнения.

Булевы операции

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

Если операции сравнения можно было выполнять (в основном) над числами, строками и датами, то булевы операции выполняются только со значениями типа Булево. То есть со значениями Истина и Ложь.

Пока что вам трудно представить, зачем это может понадобиться. Но сейчас на нескольких примерах вы сразу все поймете.

Для этих примеров вам понадобится записывать булевы значения прямо в тексте программы, то есть использовать литералы. Так вот, литералы типа Булево выглядят очень просто. Значение Истина обозначается Истина, а значение Ложь обозначается Ложь.

Например, если вы хотите создать переменную, которая будет описывать погоду за окном, вы можете написать так (рис. 3.81).

Рис. 3.81. Литерал значения «Истина»

А если в другой переменной вы хотите уточнить, есть на улице дождь или нет, вы можете написать так (рис. 3.82). Попробуйте и посмотрите, чему равны переменные.

Рис. 3.82. Литерал значения «Ложь»

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

Чтобы познакомиться с первой булевой операцией, создайте две переменные: ЯУмеюПлавать и РядомЕстьМоре. Задайте им те значения, которые есть на самом деле. А в книге, для примера, я присвою им значение Истина (рис. 3.83).



Рис. 3.83. Переменные «ЯУмеюПлавать» и «РядомЕстьМоре»

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

Сначала попробуйте сказать это обычными словами. Наверное, получится что-то вроде «если я умею плавать и если рядом есть море, то тогда я буду плавать в море».

А теперь посмотрите (рис. 3.84), как эта же фраза выглядит на встроенном языке.

Рис. 3.84. Операция «И»

Чтобы сказать то же самое на встроенном языке, используется операция И. Как она работает, вы можете проверить сами на этом примере, изменив значения переменных.

Плавать в море вы будете только в том случае, когда оно есть рядом и вы умеете плавать. Если моря рядом нет, то плавать просто негде. А если вы не умеете плавать, то у вас тоже ничего не получится. Это очень опасно, вы можете утонуть. Ну, а если и моря нет, и плавать вы не умеете, то тем более поплавать в море вам не удастся.

Теперь решите другую задачу. Создайте две переменные УМеняЕстьЛодка и УМеняЕстьПлот. Можете задать им любые значения. А в книге, для примера, я присвою им значение Истина (рис. 3.85).

Рис. 3.85. Переменные «УМеняЕстьЛодка» и «УМеняЕстьПлот»

Теперь вам нужно с помощью логической операции узнать, сможете вы переплыть через озеро или нет.

Сначала попробуйте сказать это обычными словами. Наверное, получится что-то вроде «если у меня есть плот или лодка, то я могу переплыть через озеро».

А теперь посмотрите (рис. 3.86), как эта же фраза выглядит на встроенном языке.

Рис. 3.86. Операция «ИЛИ»

Чтобы сказать то же самое на встроенном языке, используется операция ИЛИ. Как она работает, вы можете проверить сами на этом примере, изменив значения переменных.

Если у вас есть лодка, вы можете переплыть через озеро? Да.

А если у вас не лодка, а плот – тогда сможете? Да, сможете.

А если у вас есть и лодка, и плот? Конечно! Даже два раза! Один раз на лодке, а другой – на плоту (шутка)!

А в каком случае вам не удастся переплыть через озеро? Правильно. Когда у вас нет ни лодки, ни плота.

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

Создайте три переменные: ЯУмеюПлавать, РядомЕстьМоре и РядомЕстьБассейн. Задайте им те значения, которые есть на самом деле. А в книге я снова не буду усложнять и присвою им значение Истина (рис. 3.87).

Рис. 3.87. Переменные «ЯУмеюПлавать», «РядомЕстьМоре» и «РядомЕстьБассейн»

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

Если вы будете отвечать словами, то скажете: «Я буду плавать, если я умею плавать и рядом есть море или бассейн». Попробуйте записать это на встроенном языке (рис. 3.88).

Рис. 3.88. Переменная «ЯБудуПлавать»

На первый взгляд кажется, что все хорошо. Но нужно проверить.

Например, вы не умеете плавать. В этом случае не важно, есть рядом бассейн или нет: плавать вы не должны. Но что говорит вам программа? Попробуйте (рис. 3.89).

Рис. 3.89. «ЯБудуПлавать = Истина»

Программа говорит вам, что плавать вы будете. Получается какое-то «опасное» программирование. С таким программированием и утонуть недолго!

В чем же дело? Может быть, вы написали неправильные операции? Нет, правильные.

Просто вы не учли, что если несколько булевых операций встречаются в одном выражении, у них есть определенный порядок выполнения. Точно так же, как было с арифметическими операциями +, -, * и /.

Сначала выполняется операция И, а затем уже выполняется операция ИЛИ. А если подряд встречаются несколько одинаковых операций, то они выполняются в той последовательности, в которой написаны.

Поэтому в примере выражение было посчитано таким образом (рис. 3.90).

Рис. 3.90. Порядок вычисления выражения

Сначала была выполнена операция И, которая дала Ложь. А затем операция ИЛИ, результатом которой явилась Истина.

На самом же деле для вас в этом выражении важны две вещи. Что вы умеете плавать и что есть, где плавать. А море это или бассейн – не так важно.

Поэтому правильным решением будет РядомЕстьМоре ИЛИ РядомЕстьБассейн заключить в скобки (рис. 3.91). Попробуйте.

Рис. 3.91. «ЯБудуПлавать = Ложь»

Тогда платформа сначала вычислит то выражение, которое в скобках. То есть узнает, есть, где плавать, или плавать негде. А потом уже поинтересуется вашим умением плавать (рис. 3.92).

Рис. 3.92. Порядок вычисления выражения

Чтобы закрепить этот пример, немного измените его условие. Создайте три переменные: ЯУмеюПлавать, РядомЕстьМоре и РядомЕстьВанна. Задайте им те значения, которые были в последнем примере: Ложь, Истина и Истина (рис. 3.93).

Рис. 3.93. Переменные «ЯУмеюПлавать», «РядомЕстьМоре» и «РядомЕстьВанна»

А вычислить нужно будет переменную, которая называется ЯБудуКупаться. Будьте внимательны: имя переменной изменилось не просто так.

Попробуйте записать выражение на встроенном языке и потом сравните с тем, что на рисунке 3.94.

Рис. 3.94. «ЯБудуКупаться = Истина»

Запустите «1С:Предприятие» в режиме отладки и посмотрите, какой получается результат, если изменить значения переменных.

Почему в этом случае скобки не понадобились, хотя пример внешне очень похож на предыдущий? Скобки не понадобились потому, что «естественный» порядок выполнения логических операций в этом выражении вполне вас устраивает (рис. 3.95).

Рис. 3.95. Порядок вычисления выражения

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

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

В заключение нужно сказать еще об одной булевой операции – операции НЕ. Она очень простая. Она возвращает булево значение, противоположное тому, которое имеется.

Чтобы посмотреть, как она работает, вы можете использовать пример, показанный на рисунке 3.96.

Рис. 3.96. Операция «НЕ»

Обычно с использованием этой операции никаких трудностей не возникает. Единственное, что может вам понадобиться, это порядок выполнения булевых операций. Полностью он выглядит так:

  • сначала выполняется то, что в скобках;
  • затем операция НЕ;
  • затем операция И;
  • затем операция ИЛИ.

Инструкция «Если»

Наконец настало время познакомиться с еще одной инструкцией, которая используется во встроенном языке.

Если бы вы использовали только инструкцию присваивания, то ваша программа выглядела бы как прямая дорога из пункта «А» в пункт «Б». От начала к завершению (рис. 3.97).

Потому что инструкции присваивания выполняются одна за другой в том порядке, в котором они написаны.

Но на самом деле большинство программ выглядят по-другому. Между началом программы и ее завершением существует много разных путей, по которым может пойти исполнение программы (рис. 3.98).

Рис. 3.98. Много путей из пункта «А» в пункт «Б»

Для этого есть много разных причин. Например, это зависит от того, какие данные уже есть в программе. Если есть все необходимые данные, то исполнение пойдет по одному пути. Если каких-то данных не хватает, то по другому пути.

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

Именно для того, чтобы направить исполнение программы по одному или по другому пути, существует инструкция Если. Выглядит она очень просто (рис. 3.99).

Рис. 3.99. Инструкция «Если»

Она позволяет выделить несколько инструкций, которые будут выполняться не всегда, а только тогда, когда в результате вычисления логического выражения получается Истина.

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

Чтобы посмотреть, как это работает, сделайте небольшой пример. Создайте переменную и запишите в нее свой возраст. А затем создайте другую переменную, ЯИдуВДетскийСад, и присвойте ей значение Истина. Но эту переменную создайте только в том случае, если вы еще не достигли школьного возраста. Чтобы не запутаться, будем считать, что школьный возраст начинается с 7 лет.

Когда вы сделаете свой пример, сравните его с тем, что на рисунке 3.100.

Рис. 3.100. Пример

Установите точку останова на строке Если …, запустите «1С:Предприятие» в режиме отладки и посмотрите значение выражения МойВозраст < 7 (Shift + F9) (рис. 3.101).

Рис. 3.101. Значение выражения «МойВозраст < 7»

Вы увидите, что оно равно Ложь. И это правильно. Ваш возраст больше, чем 7 лет.

Раз выражение ложно, значит, платформа должна пропустить все инструкции, которые написаны внутри инструкции Если. Проверьте это с помощью пошагового исполнения (F11). Сделайте один шаг (рис. 3.102).

Рис. 3.102. Один шаг исполнения

Действительно, платформа перейдет на строку КонецЕсли. А если вы шагнете еще раз, то она остановится на строке КонецПроцедуры. При этом значение переменной ЯИдуВДетскийСад будет Неопределено, потому что эта инструкция не выполнялась и такая переменная даже не создавалась.

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

Чтобы это сделать, вам потребуется сначала перезапустить отладку. Для этого выполните команду Отладка – Перезапустить (рис. 3.103).

Рис. 3.103. Перезапустить отладку

После того как отладка перезапустится, исполнение снова остановится на строке Если… Откройте локальные переменные (если это окно у вас закрыто).

Дважды щелкните мышью по ячейке со значением 25 (рис. 3.104).

Рис. 3.104. Изменение значения переменной

Она перейдет в режим редактирования. Введите 6 и нажмите Enter.

С этого момента значение переменной МойВозраст будет равно 6. А вы можете продолжать отладку так же, как и раньше.

Посмотрите значение выражения МойВозраст < 7. Теперь оно будет равно Истина (рис. 3.105).

Рис. 3.105. Значение выражения «МойВозраст < 7»

Сделайте один шаг. Исполнение зайдет «внутрь» инструкции Если (рис. 3.106).

Рис. 3.106. Один шаг исполнения

Теперь, если вы сделаете еще пару шагов, вы дойдете до конца процедуры. А значение переменной ЯИдуВДетскийСад будет равно Истина.

До сих пор вы рассматривали самую простую форму инструкции Если. На самом деле она может быть более сложной. Смотрите.

В вашем примере «особенные» действия выполняются только в том случае, когда ваш возраст меньше 7 лет. Но представьте, что вам нужно принять решение из двух вариантов. Если меньше 7 лет, вы идете в детский сад. А во всех других случаях вы идете в школу. Как это записать на встроенном языке?

Оказывается, очень просто. Для этого используется ключевое слово Иначе (рис. 3.107).

Рис. 3.107. Ключевое слово «Иначе»

Доработайте пример так, чтобы в результате его работы у вас создавались две переменные: ЯИдуВДетскийСад и ЯИдуВШколу. И чтобы они принимали правильные значения (Истина или Ложь) в зависимости от возраста, указанного в переменной МойВозраст.

Сравните свой результат с тем, что показано на рис. 3.108.

Рис. 3.108. Доработанный пример

Запустите «1С:Предприятие» в режиме отладки и проверьте по шагам правильность работы примера для разных значений возраста. Изменяйте возраст прямо в процессе отладки.

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

Зато вам известны правила. До 7 лет нужно идти в детский сад. После детского сада нужно идти в школу. Учиться в школе заканчивают в 18 лет. А в 19 лет поступают в институт.

Чтобы записать этот алгоритм на встроенном языке, вам понадобится еще одно ключевое слово – ИначеЕсли (рис. 3.109).

Рис. 3.109. Ключевое слово «ИначеЕсли»

В вашем примере его нужно будет написать вместо ключевого слова Иначе. А затем написать условие, при котором вам нужно идти в школу.

А в конце примера вы снова добавите слово Иначе и укажете, что во всех остальных случаях вы идете в институт. Попробуйте сделать пример самостоятельно.

Чтобы проверить свой результат, сравните его с рисунком 3.110.

Рис. 3.110. Пример «Я иду в институт»

В режиме отладки пройдите по разным веткам инструкции Если и посмотрите, как она работает.

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

В этом заключается особенность инструкции Если, о которой нужно помнить и которую нужно учитывать. Если вы откроете локальные переменные, то увидите, что после выполнения примера переменная ЯИдуВИнститут может оказаться не определена. Например, если ваш возраст равен 15 (рис. 3.111).

Рис. 3.111. Переменная «ЯИдуВИнститут» не определена

А если возраст равен 20, то не определены окажутся переменные ЯИдуВДетскийСад и ЯИдуВШколу (рис. 3.112).

Рис. 3.112. Не определены переменные «ЯИдуВДетскийСад» и «ЯИдуВШколу»

А ведь в «живой» программе вы наверняка будете создавать подобные переменные не просто так, а для того чтобы использовать их в дальнейшем. И если какой-то из этих переменных не окажется, ваша программа работать не сможет.

Какой выход из этой ситуации? Нудно и дотошно в каждой ветке инструкции Если прописывать создание всех переменных, которые вам могут понадобиться? Нет.

Есть гораздо более простое и удобное решение. Прямо перед инструкцией Если вы создаете все переменные, которые вам понадобятся. И присваиваете им некоторое стандартное значение – значение «по умолчанию». Например, Ложь.

Рис. 3.113. Другой вариант примера

Сделайте этот пример в своей конфигурации и посмотрите, как он работает.

При любых значениях возраста будут существовать все переменные. И они будут иметь правильные значения (рис. 3.114).

Рис. 3.114. Все переменные определены

Красивая программа

Я уже говорил раньше, что ваша конфигурация должна быть красивой. Говорил о том, что имена переменных должны быть удобными, понятными. Говорил, что выражения должны быть записаны понятно и «читабельно». Теперь настал удобный случай рассказать о том, как должен выглядеть текст вашей программы.

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

Если вы этого не заметили, то поставьте маленький эксперимент. В модуле напишите Если а = 2 Тогда. И нажмите клавишу Enter (рис. 3.115).

Рис. 3.115. Синтаксический отступ

Вы увидите, что на новой строке курсор встанет не под буквой Е, а с некоторым сдвигом вправо. Этот сдвиг называется синтаксический отступ. Он помогает вам лучше и легче читать текст программы. Потому что «подчиненные» инструкции, расположенные внутри одной ветки, оказываются выделены визуально (рис. 3.116).

Рис. 3.116. Есть синтаксический отступ

Посмотрите, какая «каша» получилась бы, если бы синтаксического отступа не было (рис. 3.117).

Рис. 3.117. Нет синтаксического отступа

Поэтому синтаксический отступ – это важная, обязательная часть программы. Именно поэтому платформа делает его автоматически, когда вы набираете текст инструкции последовательно.

Но далеко не всегда вы работаете именно так. Даже при выполнении ваших простых примеров вы видите, что приходится изменять то, что уже написано. Вставлять новые строки. Копировать из одного места в другое. В этих случаях платформа не может автоматически сделать синтаксический отступ. В результате у вас вполне может получиться такой текст (рис. 3.118).

Рис. 3.118. Текст с нарушенным форматированием

Как с ним быть? Двигать каждую строку вручную, чтобы было «красиво»? Это скучно, долго и неинтересно.

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

Для этого нажмите правой кнопкой мыши на пустом месте справа в верхней командной панели (рис. 3.119).

Рис. 3.119. Настройка панелей конфигуратора

В появившемся меню щелкните по строке Текст. В нижней части окна появится новая командная панель (рис. 3.120).

Рис. 3.120. Командная панель «Текст» и команда «Форматировать»

В этой панели находится команда Форматировать, которая вам и нужна.

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

Рис. 3.121. Начало выделения текста

Затем, не отпуская кнопку мыши, ведете ее до последней строки, которая вам нужна (рис. 3.122).

Рис. 3.122. Выделен текст, который нужно форматировать

И нажимаете кнопку Форматировать. Текст сразу становится красивым и отформатированным (рис. 3.123).

Рис. 3.123. Отформатированный текст

Помимо синтаксического отступа есть и другие способы сделать текст более понятным. Например, один из хороших способов – это добавление пустых строк в текст программы. Они позволяют разделить текст на несколько отдельных смысловых блоков.

Если взять пример с инструкцией Если, то такие смысловые блоки напрашиваются сами собой. Каждая ветка этой инструкции является отдельным смысловым блоком. Поэтому, если перед началом ветки вы добавите пустую строку, это только улучшит читаемость вашей программы (рис. 3.124).

Рис. 3.124. Использование пустых строк

Другой хороший и очень часто используемый прием – создание комментариев. Комментарий – это пояснение к программе, которое находится прямо в тексте программы (рис. 3.125).

Рис. 3.125. Комментарий