При создании адаптивных фрагментов (команда Деталь > Создать с вариантом Создать адаптивный фрагмент) может возникнуть рекурсия если «вытягиваемые» из сборки построения зависят друг от друга. Поясним это на простом примере.
Пусть у нас есть два параллелепипеда. На одной из граней каждого параллелепипеда построим профили, представляющие собой окружность. Получается, что один профиль является потомком первого параллелепипеда, а второй – второго.
Сделаем выталкивание данных профилей, а далее при помощи булевой операции вычтем полученные цилиндры из параллелепипедов. Цилиндр, построенный выталкиванием профиля, который принадлежит первому параллелепипеду – вычтем из второго параллелепипеда и, наоборот, цилиндр, построенный по профилю второго параллелепипеда – вычтем из первого. В итоге получается, что каждый из параллелепипедов имеет и своим родителем и свои потомком другой параллелепипед.
Вызовем контекстное меню для первого параллелепипеда и выберем команду Деталь > Создать. В диалоге команды укажем Создать адаптивный фрагмент.
Нажимаем «ОК», после чего появляется диалоговое окно с сообщением о рекурсии.
Предлагается четыре варианта устранения рекурсии.
1) Не создавать адаптивные параметры. Т.е. предлагается не помещать ссылочные элементы в геометрические параметры. Ссылочные элементы, в отличие от геометрических параметров, сами по себе являются защитой от рекурсии. Пересчёт фрагмента начинается с обновления заимствованной геометрии, далее пересчитывается всё остальное дерево построений фрагмента. После пересчёта фрагмента изменения приходят в сборку. В сборке изменение геометрии фрагмента вызывает изменение геометрии-источника ссылочного элемента фрагмента. Но это изменение будет передано во фрагмент только при его следующем пересчёте. Таким образом устраняется зацикливание пересчётов самих на себя.
В этом случае фрагмент будет неадаптивным.
2) Разрывать рекурсию со стороны сборки. В этом случае внутри файла сборки будет создана внутренняя ссылка на профиль, родительский элемент которого – тело в сборке (второй параллелепипед). Поэтому для ссылочного элемента фрагмента, геометрия-источник будет не профиль в сборке, а внутренняя ссылка на этот профиль в сборке. Т.к. геометрия-источник, для внутренней ссылки, которая является геометрией-источником для ссылочного элемента фрагмента, находится в сборке, то сам способ называется «Разрывать рекурсию со стороны сборки». Внутренняя ссылка, которая обновляется только вручную, разрывает рекурсию. Т.к. ссылка при пересчёте не обновляется, то геометрия ссылочного элемента зафиксирована, и не зависит от изменения родительского элемента, и при пересчёте геометрии адаптивного фрагментов не возникает рекурсия. Для тела второго параллелепипеда также создаётся ссылочный элемент, геометрия-источник которого – профиль первого параллелепипеда, поднятого из фрагмента (для первого параллелепипеда такой элемент называется поднятым).
В этом случае фрагмент будет адаптивным: в его геометрических параметрах будет ссылочный элемент.
Внутренняя ссылка, разрывающая рекурсию, обновляется только вручную. Из окна Структура сборки её обновить нельзя.
Что внутренняя ссылка зафиксирована и автоматически не обновляется – можно понять по её пиктограмме с изображением канцелярской кнопки. Чтобы обновить ссылку нужно вызвать её контекстное меню и выбрать команду Обновить геометрию.
3) Разрывать рекурсию со стороны детали. В этом случае внутри файла сборки будет создана внутренняя ссылка на ссылочный элемент, геометрия-источник которого профиль фрагмента первого параллелепипеда (для фрагмента такой элемент называется поднятым). Т.к. геометрия-источник ссылочного элемента, на который создана внутренняя ссылка, находится во фрагменте, то сам способ называется Разрывать рекурсию со стороны детали. Внутренняя ссылка, которая обновляется только вручную, разрывает рекурсию. При этом у самого фрагмента, также есть ссылочный элемент, для которого геометрией-источником является профиль, родительский элемент которого – второй параллелепипед, тело которого находится в сборке.
Как и в предыдущем варианте разрыва рекурсии, созданный фрагмент будет адаптивным: в его геометрических параметрах будет ссылочный элемент.
4) Захватить зависимые объекты в деталь. В этом случае создаваемый фрагмент будет содержать оба тела и будет неадаптивным.
Пользователь сам может устранять возможные рекурсии при помощи внутренних ссылочных элементов. Для создания внутреннего ссылочного элемента нужно находясь в редактируемом файле (не в контексте какой-либо сборки) вызвать команду создания ссылочного элемента Ссылочный элемент и выбрать элемент модели из 3D сцены или дерева модели в окне 3D Модель.