Верстак A2plus

From FreeCAD Documentation
Revision as of 22:29, 18 March 2020 by FuzzyBot (talk | contribs) (Updating to match new version of source page)
A2plus workbench icon

Введение

Верстак A2plus - это внешний верстак для создания сборок деталей в FreeCAD.

Эта документация описывает версию A2plus 0.4.22 или новее.

Установка

Верстак A2plus - это дополнение к FreeCAD. Его легко установить через меню Инструменты → Менеджер дополнений. A2plus находится в стадии активной разработки и будет часто получать новые функции. Поэтому вы должны регулярно обновлять его, используя меню Инструменты → Менеджер дополнений. Код A2plus размещается и разрабатывается на GitHub, а также может быть установлен вручную путем копирования его в каталог MOD FreeCAD.

Начало работы

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

Теперь детали можно добавлять в сборку с помощью кнопки на панели инструментов . Первая добавленная часть получает фиксированную позицию по умолчанию. (Это можно изменить позже через свойство детали Данныефиксированная позиция.)
Детали, уже находящиеся в сборке, можно клонировать с помощью кнопки на панели инструментов .
Чтобы отредактировать деталь из сборки, выберите ее в дереве модели и используйте кнопку на панели инструментов . Это откроет деталь в новой вкладке во FreeCAD или переключится на ее вкладку, если файл уже открыт.
Чтобы импортировать изменения деталей в сборку, нажмите кнопку на панели инструментов [[Image: A2p_ImportPart_Update.svg|24px] ].

To update changed parts in assemblies click on the toolbar button . The toolbar button imports parts too but recursively over possible subassemblies. If you select one or some parts in FreeCAD's the tree view, A2plus will ask you to only update the selected parts.

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

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

Сборка

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

Ограничения между деталями добавляются удерживанием клавиши Ctrl и выбором ребра или грани двух частей. Ограничение будет добавлено в дереве модели к выделенным деталям.

For complex constraints between parts A2plus might fail to solve the constraints. Therefore also have a look at section Troubleshooting for strategies to resolve such cases.

Сохранение обзора

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

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

Ограничения

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

Constraints can be disabled by changing its visibility. This is done by selecting the constraint in the tree view and pressing Space. This toggles the property ДанныеSuppressed. A suppressed contsraint is not taken into account when the assembly is solved.

A2plus поддерживает следующие ограничения:

Точка на точке

Выберите Вершины (точки) в каждой детали. Кнопка на панели инструментов добавляет ограничение pointIdentity. Это сделает точки совпадающими.

Точка на линии

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

Точка на плоскости

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

Сфера на Сфере

Выберите поверхность сфер или вершины (точки) на обеих деталях. Кнопка на панели инструментов добавляет ограничение phereCenterIdent. Это совместит центры сфер, центр сферы и точку, либо вершины.

Круговая кромка на круговой кромке

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

Совпадение по оси

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

Параллельные оси

Выберите поверхность сферы или края линий на обеих частях. Кнопка на панели инструментов добавляет ограничение axisParallel. Диалог ограничений позволяет указать направление оси. Ограничение сделает оси или линии параллельными.

Ось на Плоскости

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

Axis on Plane normal

Select either a cylindrical face or a linear edge on one part and a plane on the other part. The toolbar button adds the constraint axisPlaneNormal. The constraint will make the axis or line normal to the plane.

Axis on Plane angle

Select either a cylindrical face or a linear edge on one part and a plane on the other part. The toolbar button adds the constraint axisPlaneAngle. The constraint will at first make the axis parallel to the plane. Then you can adjust the angle for the axis in the appearing constraint settings dialog.

Плоскости Параллельны

Выберите две плоскости. Кнопка на панели инструментов добавляет ограничение planesParallel. Диалог ограничений позволяет вам указать направление ограничения. Ограничение сделает плоскости параллельными.

Плоскость на Плоскости

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

Плоскость под углом

Выберите две плоскости. Кнопка на панели инструментов добавляет ограничение angledPlanes. Диалог ограничений позволяет указать угол между плоскостями. Ограничение сначала сделает плоскости параллельными и установит из под заданным углом.

Совпадение в Центре масс

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

Узлы сборки

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

Обработка ограничений

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

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

Constraints can be temporarily suppressed by selecting them in the model tree and changing the tree element property ДанныеSuppressed.

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

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

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

Списки деталей

Чтобы создать списки деталей сборок, разные детали сборки должны получить информацию о детали, которая может быть прочитана A2plus. Это делается путем редактирования детали с помощью кнопки на панели инструментов . В открывшейся части нажмите кнопку панели инструментов и электронная таблица с именем #PARTINFO#.

Структура электронной таблицы выглядит следующим образом:

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

В сборке или узле сборки используйте кнопку на панели инструментов . Он спросит вас, хотите ли вы выполнить рекурсивную итерацию по всем узлам сборки. Нажмите «Да». Это создаст новую электронную таблицу с именем #PARTSLIST#. Он содержит информацию из различных электронных таблиц PARSTINFO# деталей в списке в виде:

Положение (POS) автоматически устанавливается в соответствии с внешним видом деталей в дереве модели. Часть верхнего уровня получит POS 1.
Количество (QTY) автоматически рассчитывается из сборки. Если в сборке находится две детали, то QTY будет равно 2.

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

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

Специальные возможности

Структура сборки

Кнопка на панели инструментов создает файл HTML со структурой вашей сборки. Файл по умолчанию будет создан в текущем каталоге вашей сборки. Структура выглядит следующим образом:

Степени свободы

Кнопка помечает каждую часть сборки степенями свободы. Кроме того, он выводит список со всеми деталями и их зависимостями. Список выводится в виджет FreeCAD «Представление отчета». Если этот виджет в настоящее время не отображается, его можно отобразить, щелкнув правой кнопкой мыши пустую часть области панели инструментов FreeCAD и выбрав его в появившемся контекстном меню, или с помощью меню View → Panels → Просмотр отчета.
Метки степеней свободы можно удалить повторно нажав кнопку File:A2p Unlabel DOFs.svg.

Метки деталей

Кнопка присваивает каждой детали сборки в 3D-виде уникальное имя. Метки деталей можно удалить повторно нажав кнопку .

Вид всей сборки

Иногда необходимо объединить всю сборку в одну форму. Затем эту форму можно использовать, например, для 3D-печати в Mesh Workbench или для создания чертежей в TechDraw Workbench. Он создается с помощью кнопки панели инструментов . Форма по умолчанию не отображается. Используйте ту же кнопку на панели инструментов, чтобы обновить форму в случае изменений в сборке.

Convert absolute Paths to relative Ones

With the menu A2plus → Misc → Convert absolute paths of imported parts to relative ones you can convert absolute paths of imported parts to relative ones.

Настройки

Доступ к настройкам a2plus можно получить через меню FreeCAD Edit → Preferences выбрав раздел «A2plus». Вы можете установить следующие параметры:

Метод решения по умолчанию

  • Использовать решения частичных систем
    Решатель начинает с детали, для которой свойство Данныефиксированная позиция установлено в значение true, а часть ограничена этим. Все остальные части не рассчитываются. Если решение может быть найдено, добавляется следующая часть ограничений для расчета и так далее.
  • Использовать «магнитный» решатель, решая все детали одновременно.
    Решатель пытается переместить все детали сразу в направлении к детали, у которой свойство Данные фиксированная позиция установлено в true. Обратите внимание, что в большинстве случаев это займет больше времени для расчета.
  • Принудительно фиксировать положение
    Для всех деталей в сборке свойство Данные фиксированная позиция устанавливается в значение true . Тогда никакие расчеты фактически не выполняются, поскольку все детали всегда будут привязаны к позициям, в которых они были созданы.

Поведение решателя по умолчанию

  • Решить автоматически, если изменено ограничения
    Решатель будет запущен автоматически. Аналогично включению кнопки на панели инструментов .

Поведение при обновлении импортированных деталей

  • Пересчитать импортированные детали перед их обновлением
    Все детали сборки, включая узлы сборок, будут открыты в FreeCAD для реконструкции с использованием значений из электронных таблиц.
    Эта функция предназначена для полного параметрирования конструкции. Примечание: Эта функция очень экспериментальная и не рекомендуется для важных проектов.
    Известные проблемы:
    • Сборка может быть уничтожена из-за неправильных ссылок на топологические имена в деталях
    • Основные электронные таблицы могут быть повреждены, когда они редактируются, а файл детали уже закрыт. Это может привести к краху FreeCAD.
  • 'Включить рекурсивное обновление импортированных деталей'
    Открывает все узлы сборки рекурсивно для их обновления.
  • Использовать экспериментальное топологическое именование
    При импорте деталей в сборку алгоритм генерирует топологические имена для каждого узла сборки импортируемой фигуры. Топологические имена записываются в Данныеmux Info. Когда импортируемая деталь должна быть обновлена, эти топологические имена используются для обновления подэлементов ограничений. Таким образом, сборки становятся более устойчивыми к изменчивым числам подэлементов в FreeCAD.
    'Примечание:' Это увеличивает размеры файлов и время расчета при импорте деталей. Если необходимо использовать топологическое именование, оно должно быть активировано до создания сборки.
  • Наследовать прозрачность для каждой поверхности из деталей и узлов
    Использовать настройки цвета и прозрачности из импортированных деталей.
    Примечание: Эта функция очень экспериментальная и не рекомендуется для важных проекты.
  • Не импортировать невидимые фигуры
    Это позволит скрыть невидимые базовые / строительные фигуры. Примечание: Никакие ограничения не должны быть связаны с опорными / конструктивными формами в вышестоящих или других сборочных узлах. В противном случае вы можете сломать сборку.
  • Использовать сплошное объединение для импорта деталей и сборочных узлов
    Все импортированные детали будут напрямую объединены в объединение.
    Эта функция полезна для моделирования FEM или 3D-печать, если разрешено только одно тело. Альтернативой является создание позже вида всей сборки.

Настройки интерфейса пользователя

  • Показать ограничения на панели инструментов
    Если эта опция не используется, кнопки панели инструментов для различных ограничений не видны, чтобы сэкономить место на панели инструментов. Новые ограничения по-прежнему можно установить с помощью диалогового окна «Инструменты ограничения» (кнопка на панели инструментов ).

Хранение файлов

  • Использовать относительные пути для импортированных деталей
    Использует относительные пути к файлам деталей.
  • Использовать абсолютные пути для импортированных деталей
    Использует абсолютные пути к файлам деталей.
  • Все файлы находятся в этой папке проекта:
    Все файлы проекта должны находиться в указанной папке. Не имеет значения, находятся ли они в подпапках этой папки. 'Примечание:' Одинаковые файлы не могут присутствовать несколько раз в папке (например, в разных подпапках).
    Эта опция полезна для работы на разных машинах, потому что тогда нужно только скопировать папку проекта.

Устранение неисправностей

Рано или поздно у вас возникнет проблема, что A2plus не может решить установленные вами ограничения. Чтобы преодолеть это, существуют разные стратегии:

Проверка направления ограничения

Иногда кажется, что ограничения определены последовательно, но они, тем не менее, не могут быть решены. Пример: Предположим, у вас есть ограничение planesParallel для двух плоскостей. Теперь вы хотите установить для этих же плоскостей ограничение planeCoincident, и A2plus не может решить эту проблему. Тогда направления ограничений planesParallel и planeCoincident различны. Используйте одно и то же направление для обоих ограничений, чтобы исправить это.

Удаление ограничений

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

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

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

Перемещение деталей

В некоторых случаях решателю нужны только лучшие начальные значения для решения ограничений. Возьмем, к примеру, случай, когда у вас есть осевая часть и колесная часть. Вы добавляете ограничение axisCoincident и не получаете информации о том, что решатель не выполнен, но части не перемещаются соответствующим образом, и в виджете «Представление отчета» FreeCAD вы видите "REACHED POS-ACCURACY: 0.0". Решением для этого является перемещение деталей ближе к той позиции, которую вы хотите получить с помощью ограничения.

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

Настройка свойства Tip

If you miss some features of your part after the import to an A2plus assembly, check the property ДанныеTip.
A2plus imports bodies of parts with all their features up to the tip feature. This is sensible because setting the tip to a certain feature means that all features behind the tip should not appear in the final part. So if you miss a part feature in A2plus, open the part via the toolbar button , then select a body and look at its property ДанныеTip. If the tip is not at the feature where you want it, right-click on the feature where the tip should be and choose Set tip. Finally save the part and reload the assembly using the toolbar button .

Восстановление дерева сборки

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

Migrating old A2plus assemblies

Assemblies created with A2plus older than March 2019 do not show the correct icons for imported parts and have obsolete properties. These assemblies can be migrated to A2plus version 0.4.35 and newer using the menu A2plus → Misc → Migrate proxies of imported parts. After doing this, you must save and reopen your assembly file.

Избегайте символов подчеркивания

This strategy is not necessary for Windows.

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

Фиксированная позиция

Эта стратегия больше не нужна для сборок, созданных с использованием A2plus 0.3.11 или новее, поскольку A2plus теперь выдает предупреждение о пропущенных фиксированных позициях.

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

Затем A2plus выводит информацию о неудачном решении, но иногда вы видите только то, что детали не перемещаются соответствующим образом, и в виджете «Представление отчета» FreeCAD вы видите «REACHED POS-ACCURACY: 0.0». Это означает, что решатель завершил работу без ошибок, но на самом деле он не смог решить ограничения.

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

Вращение деталей

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

Решатель часто не выполняется для ограничения angledPlanes, если две выбранные плоскости в настоящее время имеют угол 0 ° или 180 °. (Части не перемещаются соответственно, и в виджете «Просмотр отчета» FreeCAD вы видите «REACHED POS-ACCURACY: 0.0».) Решение этой проблемы - повернуть одну часть на несколько градусов с помощью FreeCAD функция преобразования (щелкните правой кнопкой мыши деталь в дереве модели и выберите в контекстном меню Transform).

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

A2plus offers animations via dragging and via Python scripts.

Dragging

Dragging animations are interactive since you trigger it by dragging a part of the assembly. To get these kind of animations:

  1. Fully constrain the part whose movement or rotation should be animated
  2. Click on the toolbar button . This enables the dragging mode.
  3. Click on the desired part in the assembly.
  4. Now you can move the mouse and the part will follow the movement of the mouse within the defined constraints.
  5. To end the dragging mode, left click in the assembly or press ESC.

Here is an example assembly to try out the dragging animation: A2p_example-for-dragging-animation.FCStd

This is the dragging animation using the example assembly:

Scripting

Despite the dragging mode offers nice interactive animations, they are sometimes not precise enough for screencasts or videos. Scripted animations have the advantage that they animate movements and rotations in a defined way. You can for example rotate a part by exactly 10° back and forth. The following examples use an assembly where a part should be rotated. If you try to animate this using the dragging mode, you will see how hard it is to get a back and forth rotation that you can e.g. show your boss in a presentation. With the interactive example script, however, this is an easy task.

A scripted animation works usually this way:

  1. The assembly is fully constrained
  2. The script changes a parameter, for example the position or rotation angle of a part
  3. After the parameter change, the assembly constraints are solved
  4. Step 2. and 3. are repeated to get the animation

It is also possible to change instead of a placement parameter a constraint, for example the distance between 2 planes.

Simple Script Example

The simplest way to script an animation is a non-interactive animation that follows a defined movement. Here is an example: First download this assembly file: A2p_animated-example.FCStd and also this Python script: A2p_animation-example-script.py.

This is the content of the script and the lines beginning with a '#' describe what the different script lines do:

# import libraries
import time, math, PySide
import A2plus.a2p_solversystem as a2p_solver

# we use steps of 1 degree
step = 1
# wait 1 ms between every step
timeout = 0.001
# initial angle is 0 degree
angle = 0
# we take the currently opened document
document = FreeCAD.activeDocument()
# we want later change the rotation angle of the part "star_wheel_001"
starWheel = document.getObject("star_wheel_001")
# define a progress dialog running from 0 to 360
progressDialog = PySide.QtGui.QProgressDialog(u"Animation progress", u"Stop", 0, 360)

# the while block is the main loop to change the angle and solve
# the assembly constraints subsequently
while angle < 360: # run this loop until we have one full turn (360 degrees)
    # increase the rotation angle
    angle += step
    # set the new angle to the progress dialog
    progressDialog.setValue(angle)
    # change the rotation angle of the part "star_wheel_001"
    starWheel.Placement.Rotation.Angle = math.radians(angle)
    # solve the constraints 
    a2p_solver.solveConstraints(document, useTransaction=True)
    # update the view after the solving ('Gui' stands for 'graphical user interface')
    FreeCADGui.updateGui()
    # bring the progress dialog to front
    PySide.QtGui.QWidget.raise_(progressDialog)
    # if 'Stop' was pressed in the dialog, exit the loop
    if progressDialog.wasCanceled():
        angle = 360
    # wait some time before performing the next step
    time.sleep(timeout)

To use the script to perform the animation, we must

  1. Open the assembly file in FreeCAD.
  2. Open the script file in FreeCAD.
  3. Click on the toolbar button to execute the script (also called macro).
  4. Change to the tab of the assembly to see the rotation.

To practice, just change something in the script and execute it afterwards. For example increase step to 5.

This is the result of the example animation:

Interactive Script Example

The first script example demonstrated how to create an animation without any user feedback. For most applications you need to interact with the animation. For example the interesting issue in the example is to see how the driving pins cross the center groove of the wheel. To have a closer look you might present this detail to your colleagues or boss. Therefore you need an interactive solution.

This can be done by using a custom animation dialog with a slider. By moving the slider you can set the rotation angle and therefore rotate back and forth at interesting position.

We use the same assembly file: A2p_animated-example.FCStd and this Python script: A2p_animation-example-script.py.

This is the content of the script to get the interactive animation dialog:

# import libraries
import time, math, PySide, sys
import FreeCAD.A2plus.a2p_solversystem as a2p_solver
from FreeCAD import Units
from PySide import QtCore, QtGui

# wait 1 ms after every calculation
timeout = 0.001
# we take the currently opened document
document = FreeCAD.activeDocument()
# we want later change the rotation angle of the part "star_wheel_001"
starWheel = document.getObject("star_wheel_001")

class AnimationDlg(QtGui.QWidget): # the animation dialog

    def __init__(self): # to initialize the dialog
        super(AnimationDlg, self).__init__()
        self.initUI()

    def initUI(self): # the definition of the dialog components
        self.setMinimumSize(self.minimumSizeHint()) # set the minimal dialog size to minimum
        self.setWindowTitle('Animation Dialog')
        # use a grid layout for the whole form
        self.mainLayout = QtGui.QGridLayout()
        self.lineNo = 0 # first dialog grid line
        # add description label
        DescriptionLabel = QtGui.QLabel(self)
        DescriptionLabel.setText("Change slider to change rotation angle")
        self.mainLayout.addWidget(DescriptionLabel,self.lineNo,0,1,4)
         # next dialog grid line
        self.lineNo += 1
        # add a label; there is no need for the "self." prefix because we don't want to change the label later
        LabelMin = QtGui.QLabel(self)
        LabelMin.setText("Min")
        LabelMin.setFixedHeight(32)
        self.mainLayout.addWidget(LabelMin,self.lineNo,0)
        # add a spin edit to define the slider minimum
        self.MinEdit = QtGui.QSpinBox(self)
        # get the angle unit as string
        self.MinEdit.setSuffix(" " + str(FreeCAD.Units.Quantity(1, FreeCAD.Units.Angle))[2:])
        self.MinEdit.setMaximum(999)
        self.MinEdit.setMinimum(0)
        self.MinEdit.setSingleStep(10)
        self.MinEdit.setValue(0)
        self.MinEdit.setFixedHeight(32)
        self.MinEdit.setToolTip("Minimal angle for the slider")
        QtCore.QObject.connect(self.MinEdit, QtCore.SIGNAL("valueChanged(int)"), self.setMinEdit)
        self.mainLayout.addWidget(self.MinEdit,self.lineNo,1)
        # add the slider
        self.slider = QtGui.QSlider(QtCore.Qt.Horizontal, self)
        self.slider.setRange(0, 360)
        self.slider.setValue(0)
        self.slider.setFixedHeight(32)
        self.slider.setToolTip("Move the slider to change the rotation angle")
        QtCore.QObject.connect(self.slider, QtCore.SIGNAL("sliderMoved(int)"), self.handleSliderValue)
        self.mainLayout.addWidget(self.slider,self.lineNo,2)
        # add a label
        LabelMax = QtGui.QLabel(self)
        LabelMax.setText("Max")
        LabelMax.setFixedHeight(32)
        self.mainLayout.addWidget(LabelMax,self.lineNo,3)
        # add a spin edit to define the slider maximum
        self.MaxEdit = QtGui.QSpinBox(self)
        # get the angle unit as string
        self.MaxEdit.setSuffix(" " + str(FreeCAD.Units.Quantity(1, FreeCAD.Units.Angle))[2:])
        self.MaxEdit.setMaximum(999)
        self.MaxEdit.setMinimum(1)
        self.MaxEdit.setSingleStep(10)
        self.MaxEdit.setValue(360)
        self.MaxEdit.setFixedHeight(32)
        self.MaxEdit.setToolTip("Maximal angle for the slider")
        QtCore.QObject.connect(self.MaxEdit, QtCore.SIGNAL("valueChanged(int)"), self.setMaxEdit)
        self.mainLayout.addWidget(self.MaxEdit,self.lineNo,4)
         # next dialog grid line
        self.lineNo += 1
        # add a spacer
        self.mainLayout.addItem(QtGui.QSpacerItem(10,10), 0, 0)
        # add a label
        LabelCurrent = QtGui.QLabel(self)
        LabelCurrent.setText("Current angle:")
        LabelCurrent.setFixedHeight(32)
        self.mainLayout.addWidget(LabelCurrent,self.lineNo,1)
        # output the current angle
        self.CurrentAngle = QtGui.QLineEdit(self)
        self.CurrentAngle.setText(str(0))
        self.CurrentAngle.setFixedHeight(32)
        self.CurrentAngle.setToolTip("Current rotation angle")
        self.CurrentAngle.isReadOnly()
        self.mainLayout.addWidget(self.CurrentAngle,self.lineNo,2)
        # add label for the unit
        LabelUnit = QtGui.QLabel(self)
        LabelUnit.setText("deg")
        LabelUnit.setFixedHeight(32)
        self.mainLayout.addWidget(LabelUnit,self.lineNo,3)
        # button to close the dialog
        self.Close = QtGui.QPushButton(self)
        self.Close.setText("Close")
        self.Close.setFixedHeight(32)
        self.Close.setToolTip("Closes the dialog")
        QtCore.QObject.connect(self.Close, QtCore.SIGNAL("clicked()"), self.CloseClicked)
        self.mainLayout.addWidget(self.Close,self.lineNo,4)
        # place the defined grid layout to the dialog
        self.setLayout(self.mainLayout)
        self.update()

    def handleSliderValue(self):
        # set slider value as angle
        starWheel.Placement.Rotation.Angle = math.radians(self.slider.value())
        # output current angle
        self.CurrentAngle.setText(str(self.slider.value()))
        # solve the constraints 
        a2p_solver.solveConstraints(document)
        # update the view after the solving ('Gui' stands for 'graphical user interface')
        FreeCADGui.updateGui()
        # wait some time, important to give time to perform calculations
        time.sleep(timeout)

    def setMinEdit(self):
        # assure that the minimum is samller than the maximum
        if self.MinEdit.value() >=  self.MaxEdit.value():
            self.MaxEdit.setValue(self.MinEdit.value() + 1)
        self.slider.setRange(self.MinEdit.value(), self.MaxEdit.value())

    def setMaxEdit(self):
        # assure that the minimum is samller than the maximum
        if self.MinEdit.value() >=  self.MaxEdit.value():
            self.MinEdit.setValue(self.MaxEdit.value() - 1)
        self.slider.setRange(self.MinEdit.value(), self.MaxEdit.value())

    def CloseClicked(self):
        AnimationDialog.close()

# create and show the defined dialog
AnimationDialog = AnimationDlg()
AnimationDialog.show()

# run this loop when the dialog is visible
while AnimationDialog.isVisible():
    # update the view; important to give the OS feedback the dialog is alive
    FreeCADGui.updateGui()
    # bring the dialog to front, so that the dialog is always visible
    QtGui.QWidget.raise_(AnimationDialog)
    # output slider value here too because during the calculation the slider might have been moved
    AnimationDialog.CurrentAngle.setText(str(AnimationDialog.slider.value()))

The dialog defined in the script looks like this:

Script Commands

To understand the script syntax better, here is some command info:

The command

starWheel.Placement.Rotation.Angle = math.radians(angle)

means, we change the placement property Rotation.Angle of the part get got previously as "starWheel". This property gets the angle as radian. The function radians() from the library math converts the angle from degree to radian.


The property Rotation.Angle uses the current placement axis of the part (in our example the x-axis). To rotate the part e.g. around the z-axis one can set the rotation axis (before calling the rotation command) using the command

starWheel.Placement.Rotation.Axis = FreeCAD.Vector(0,0,1)

Instead of rotating, parts can also be moved. To change for example the placement in y-direction of the wheel, the command would be

starWheel.Placement.Base.y = PositionShift

In this case we would not define the variable angle but PositionShift that we change on every loop run.
There are different ways to set the placement of a part. Some are documented here. Unfortunately there is no list with all possible placement commands.


The command

a2p_solver.solveConstraints(document, useTransaction=False/True)

is a A2plus-specific command. It solves the assembly constraints of the assembly we previously got as "document". The option useTransaction specifies if FreeCAD should store every change in the undo/redo stack. For large animations you might therefore set it to False.