Manual/ru

From FreeCAD Documentation

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


150
150

Добро пожаловать на страницу помощи FreeCAD

Этот документ был создан автоматически из содержимого официальной вики документации FreeCAD, которую можно прочитать в Интернете по адресу онлайн. Так как вики активно поддерживается и постоянно развивается сообществом FreeCAD разработчиков и пользователей, Вы можете обнаружить, что онлайн-версия содержит больше количество более актуальной информации, чем этот документ. Здесь так же можно найти текущий перевод документации на несколько языков. Но всё же, мы надеемся, что здесь Вы найдете всю необходимую информацию. В случае, если у Вас есть вопросы, на которые вы не можете найти ответы в данном документе, просмотрите форум FreeCAD. Возможно, там Вы сможете найти ответ, на свой вопрос или кто-то сможет Вам помочь.

Как пользоваться

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

Many pages of this wiki are also grouped into an easier to read Manual. If you are new to FreeCAD, we suggest you start reading the manual.

Содействие

Как, возможно, Вы заметили, программисты действительно плохие писатели справочной информации для изучения программ! Для них всё совершенно ясно, потому что они сами это так сделали. Поэтому очень важно, чтобы опытные пользователи помогали нам писать и исправлять документацию. Да, мы имеем в виду Вас! Как, спросите Вы? Просто зайдите в раздел пользователя Wiki. Вам нужна учётная запись на Wiki FreeCADа, чтобы войти. Спросите на форуме или на канале IRC права на редактирование wiki (wiki защищена от записи из-за опасности спама) и мы сделаем учётную запись для Вас. В настоящее время учётная запись wiki и форума раздельны, но имя учётной записи на wiki будет такой же, как и на форуме. После этого Вы сможете начать редактирование! Так же посмотрите эту страницу, чтобы узнать, как ещё Вы можете помочь FreeCAD.

Введение

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

Во FreeCAD имеются инструменты аналогичные CATIA, SolidWorks или Solid Edge, и, следовательно, он также попадает в категорию САПР, PLM, CAx и CAE. Это параметрический моделлер с модульной программной архитектурой, которая позволяет предоставлять дополнительные функциональные возможности без изменения базовой системы.

Как и во многих пакетах САПР, в нем много 2D-компонентов для создания плоских фигур или создания рабочих чертежей. Однако прямое 2D-рисование (как например в Inkscape или AutoCAD LT) не является основным, так же как анимация или редактирование сеток (например Blender, Maya, 3ds Max, или Cinema 4D). Тем не менее, благодаря своей широкой адаптивности, FreeCAD может оказаться полезным в гораздо более широкой области, чем его текущая сфера деятельности.

FreeCAD интенсивно использует библиотеки с открытым исходным кодом, существующие в области научных вычислений. Среди них Open Cascade Technology (OCCT), мощное ядро САПР; Coin3D, инструментарий для разработки 3D-графики, совместимый с Open Inventor; Qt, всемирно известный пользовательский интерфейс; и Python, современный язык сценариев. Сам FreeCAD также может быть использован в качестве библиотеки другими программами.

FreeCAD также является мультиплатформенным и в настоящее время работает в операционных системах Linux/Unix, Windows и macOS с одинаковым внешним видом и функциональностью на всех платформах.

Более подробнее о возможностях FreeCADа, можно узнать в разделах: "Список функций", "Информация о версиях", "Начало работы". Так же вы можете посмотреть скриншоты.

О проекте FreeCAD

Проект FreeCAD начался в далёком 2001 году, как описано на странице его истории.

FreeCAD поддерживается и проектируется сообществом энтузиастов, проектировщиков и пользователей (смотри страницу contributors). Они работают на FreeCAD добровольно, в свободное время. Они не могут гарантировать, что FreeCAD содержит всё, что Вы можете пожелать, но они делают всё, что могут! Сообщество зовёт на форум FreeCAD, где обсуждается большая часть идей и пожеланий. Смело присоединяйтесь к нам здесь!

About the FPA

The FreeCAD project is also supported by a non-profit organization, the FreeCAD project association (FPA). The FPA is an independent body created by some FreeCAD veterans in 2021 to collect donations and other resources to support the project and its community, to help protect that community and allow it to continue developing in the best conditions, and to represent the project against other bodies such as companies and institutions.


Это обширный, но неполный список функций, реализованных во FreeCAD.

Информация о версиях

Основные функции

  • Полное геометрическое ядро, основанное на OpenCasCade, позволяет производить сложные трёхмерные операции над сложными типами форм, со встроенной поддержкой таких понятий, как: Граничное представление (boundary representation, BREP), Кривые и поверхности неоднородных рациональных B-сплайнов (Non-uniform rational basis spline, NURBS), широкий спектр геометрических объектов, булевы операции над фигурами или сопряжения и встроенную поддержку форматов STEP и IGES
  • Полностью параметрическая модель данных. Объекты FreeCAD параметрические в основе, то есть их форма может полностью зависеть от параметров или даже зависеть от других объектов, все изменения пересчитываются по запросу, и записываются в стеке отмен-возвратов. Легко могут быть добавлены новые объекты, которые могут быть даже написаны на python
  • Модульная архитектура, позволяющая добавлять функциональность через плагины (модули). Эти расширения могут быть комплексными и программироваться на C++, или простыми как скрипты Python или записываемые самостоятельно макросы. У Вас есть полный доступ из встроенного интерпретатора Python, макросов или внешних сценариев к практически любой части FreeCAD, позволяя создавать и изменять геометрию, двумерное и объёмное представление этой геометрии (scenegraph) или даже интерфейс FreeCAD
  • Импорт/экспорт в стандартные форматы, такие как: STEP, IGES, OBJ, файла) STL, DXF, SVG,U3D, DAE, IFC, OFF, NASTRAN, VRML, кроме собственного формата FreeCAD Fcstd. Уровень совместимости между FreeCAD и данными форматами может различаться, поскольку зависит от поддерживающего их модуля.
  • Модуль эскизирования со встроенным вычислителем ограничений, позволяющий создавать эскизы с геометрически ограниченными двухмерными формами. Создаваемые с помощью Sketcher двумерные геометрические фигуры с ограничениями могут использоваться как база для построения других объектов FreeCAD.
  • Модуль робототехники, позволяющий изучать движение роботов в графическом интерфейсе.
  • Удобный новый модуль для создания традиционных чертежей с опциями вроде видов детализации, сечений, образмеривания и других, которые позволяют создать двумерный вид вашей трёхмерной модели. Эти модули создают листы, готовые к экспорту в SVG или PDF. Так же есть более старый модуль черчения с его небогатыми возможностями графического интерфейса, но мощной функциональностью через Python.
  • Модуль рендеринга может экспортировать 3D объекты для рендеринга во внешние программы. Пока что он поддерживает только POV-Ray и LuxRender
  • Модуль архитектуры позволяет работать по процессу информационного моделирования здания (Building Information Modeling, BIM), при совместимости со спецификацией IFC.
  • Модуль Path посвящён автоматизации механической обработки (Computer-aided manufacturing, CAM), например, фрезерования, и может выводить, показывать и настраивать G-код.
  • Интегрированный обработчик электронных таблиц и выражений, который может использоваться для управления моделями через формулы и централизованной организации данных моделей.

Общие функции

  • кроссплатформенность. FreeCAD запускается и ведёт себя точно также на Windows, Linux, macOS и других платформах.
  • полностью графическое приложение. FreeCAD обладает законченным Графическим Интерфейсом Пользователя, основанном на инструментарии Qt, с 3D просмотрщиком, основанным на Open Inventor, позволяющим быстро отрисовывать 3D сцены c весьма доступным представлением SceneGraf.
  • может работать, как консольное приложение из командной строки. В режиме командной строки FreeCAD запускается без графического интерфейса, но со всеми инструментами геометрии. В этом режиме он требует относительно мало памяти и может быть использован, например, в качестве сервера для создания содержимого другим приложениям.
  • может быть импортирован как модуль Python. FreeCAD может импортироваться в любое приложение, способное запускать сценарии Python. В консольном режиме интерфейсная часть FreeCAD отсутствует, но все геометрические инструменты доступны.
  • концепция верстаков. В интерфейсе FreeCAD инструменты сгруппированы по верстакам. Это позволяет отображать только инструменты, используемые для выполнения конкретной задачи, сохраняя рабочее пространство незагромождённым и отзывчивым, а также позволяет приложению быстро загружаться.
  • фреймворк плагинов/модулей для последующей загрузки типов данных/функциональностей. FreeCAD разделён на основное приложение с модулями, которые загружаются при необходимости. Почти все инструменты и типы геометрии хранятся в модулях. Модули ведут себя как плагины, кроме отложенной загрузки, отдельные модули могут быть добавлены или удалены из существующей установленной версии FreeCAD.
  • параметрически связанные объекты документа. Все объекты в документе FreeCAD могут быть заданы параметрами. Эти параметры могут быть изменены и пересчитаны в любое время. Поскольку связи между объектами сохраняются, изменение одного объекта автоматически распространяется на все зависимые объекты.
  • создание параметрических примитивов. Примитивы вроде куба, сферы, цилиндра и т.д. могут создаваться определением их геометрических ограничений.
  • операции по графическому изменению. FreeCAD может выполнять перемещение, вращение, масштабирование, отражение, смещение (простое или описанное в Jung/Shin/Choi) или изменение формы в любой плоскости трёхмерного пространства.
  • создание планарной геометрии. Отрезки, ломаные, прямоугольники, сплайны, дуги и окружности могут создаваться через графический интерфейс на любой плоскости трехмерного пространства.
  • моделирование с прямым или круговым выдавливанием, сечением и скруглением сопряжений.
  • топологические компоненты вроде вершин, ребер, ломаных и плоскостей.
  • тестирование и восстановление. В FreeCAD есть инструменты для тестирования сеток (тест на твёрдотельность, тест non-two-manifolds, тест на самопересечение) и для их починки (заполнение пустот и исправление ориентации сегментов).
  • аннотации. В FreeCAD можно вставлять аннотации (пояснения) к надписям или размерам.
  • инфраструктура отмены/возврата. В FreeCADе всё отменяемо/возвращаемо, с пользовательским доступом к стэку выполненных действий. Множество шагов может быть отменено единовременно.
  • ориентация на транзакции. Стек отмен/возвратов хранит транзакции документа, а не одиночные действия, что позволяет каждому инструменту точно определить, что должно быть отменено или переделано.
  • встроенная инфраструктура сценариев. FreeCAD обладает встроенными Python интерпретатором, с API, которые охватывают практически любую часть предложения, интерфейса, геометрии и представления этой геометрии в 3D просмотрщике. Интерпретатор может запускать как сложные сценарии, так и одиночные команды, целые модули могут быть полностью запрограммированы на Python.
  • встроенная консоль Python. Интерпретатор Python включает консоль с подсвечиванием синтаксиса, автодополнением и просмотром классов. Команды Python могут быть выполнены прямо в FreeCAD и напрямую возвращать результаты, позволяя программистам тестировать работу на ходу, раскрывая содержимое модулей FreeCAD'а и легко изучая его внутренности.
  • отражение действий пользователя в Python консоли. Всё, что пользователь делает в интерфейсе FreeCAD, выполняется в виде кода Python, который может быть выведен в консоль и записан в макрос.
  • полная запись и редактирование макросов. Команды Python, которые вызываются при манипулировании пользовательским интерфейсом, могут быть записаны, отредактированы и сохранены для дальнейшего использования.
  • составной (основанный на ZIP) формат хранения документов. Документы FreeCAD сохраняются с расширением .FCStd. Он может содержать множество различных типов информации, таких как геометрия, сценарии или иконки миниатюр. Файл .FCStd представляет собой архив zip, так что сохранённый файл FreeCAD уже сжат по умолчанию.
  • полностью настраиваемый/сценарируемый Графический Интерфейс Пользователя. Основанный на Qt интерфейс FreeCAD полностью доступен из интерпретатора Python. Помимо простых функций самого FreeCAD предоставляются инструментарии, а также полный доступ к структуре Qt. Пользователь может выполнять любые операции с ГИП, такие как создание, документирование, изменение и удаление виджетов и панелей инструментов.
  • миниатюры. (пока только в Linux системах) Значки документа FreeCAD, показывающие содержимое файла в большинстве файловых менеджеров таких как Nautilus в Gnome.
  • модульный установщик MSI. Установщик FreeCAD производит гибкую установку в системе Windows. Также поддерживаются пакеты системы Ubuntu.

Внешние верстаки

Опытные пользователи создали различные пользовательские внешние верстаки.


Загрузка

Текущая стабильная версия

Релиз FreeCAD версии 0.21.2 был опубликован 14.11.2023. Чтобы узнать о нововведениях, ознакомьтесь с примечаниями к выпуску.

Контрольные суммы SHA256 для проверки целостности вашей загрузки вы можете найти на странице релиза 0.21.2.

Предыдущие версии можно загрузить со страницы релизов.

Install instructions

64-bit installer

64-bit portable version (.7z)

Install instructions

ARM (M1/M2) disk image

Intel disk image

Install instructions

x86_64 AppImage

aarch64 AppImage

Примечания для пользователей Windows

  • Поддерживаются следующие версии Windows: 64-разрядные версии 7/8/10/11. 32-разрядная версия Windows не поддерживается.
  • Пакет также можно установить из менеджера пакетов Chocolatey. Пакет из Chocolatey пока не в новейшей версии.

Примечания для пользователей macOS

  • macOS 10.12 Sierra — минимальная поддерживаемая версия.
  • Для macOS 12 и более ранних версий следует использовать «Неподписанный образ диска Intel», подписанная версия в этих системах не работает.

Примечания для GNU/Linux пользователей

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

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

Портативную версию, не требующую установки, можно создать, запустив FreeCAD с следующими командами:

cd path/to/directory_containing_AppImage/
chmod +x ./name_of_AppImage_file.AppImage
HOME="$PWD/Settings" FREECAD_USER_HOME="$PWD/Settings" ./name_of_AppImage_file.AppImage

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

Разрабатываемые версии

FreeCAD активно развивается.

  • Для получения информации о сборках и исходном коде разработки, смотрите страницу weekly builds.
  • Чтобы скомпилировать новейший исходный код, смотри страницу Компиляция.

Дополнительные модули и макросы

Сообщество FreeCAD предлагает множество различных модулей и макросов. Начиная с версии 0.17 они могут быть легко установлены напрямую из FreeCAD через Менеджер дополнений.


Установка

Установка на Windows


Стандартная установка

Самый простой способ установить последнюю стабильную версию FreeCAD - использовать программу установки:

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

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

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

Installation for all users of the Windows system

By default FreeCAD will be installed for the user that executes the installer. If this user only has user permissions, the default installation path is:

C:\Users\<username>\AppData\Local\Programs\FreeCAD X.YY

If the installer is executed by an admin user, or you execute it as admin, you can choose if FreeCAD should be installed for all users of the system or just for you. The default is for all users.

If installed for all users, the default installation path is:

C:\Program Files\FreeCAD X.YY

Тихая (автоматическая) установка

To install FreeCAD silently, you can execute the installer from the command line:

FreeCAD-~.exe /S

Default settings will be used for all options. A custom installation path can be specified in this manner:

FreeCAD-~.exe /S /D=A path to FreeCAD with spaces

By default, even with silent installations, there will be a short popup when the installer is checked for corruption. This so-called cyclic redundancy check only takes a few seconds at most. To disable this corruption check:

FreeCAD-~.exe /S /NCRC

Note that this /NCRC flag is not recommended since the corruption check assures that the installer was e.g. completely downloaded.

Chocolatey

Using the Chocolatey package manager is currently not recommended as that repository is no longer kept up-to-date.

Удаление

To uninstall FreeCAD it is preferable to use the Windows tools for uninstalling software. Alternatively you can execute the uninstaller directly. This is the file:

Uninstall-FreeCAD.exe

You can find it in the folder where FreeCAD is installed.

The uninstaller can also be executed silently using the command line:

Uninstall-FreeCAD.exe /S

Note that (silent) uninstallation will fail if there is a running instance of FreeCAD, even if that instance is not the version being uninstalled.


Установка на Unix/Linux


Обзор

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

Ubuntu и Ubuntu подобные системы

Многие дистрибутивы Linux базируются на Ubuntu и используют их репозитории. Кроме официальных вариантов (Kubuntu, Lubuntu и Xubuntu), существуют неофициальные дистрибутивы, такие как Mint, Voyager и другие. Приведенные ниже опции установки должны быть совместимыми с этими системами.

Официальная версия

FreeCAD доступен в репозиториях Ubuntu Universe и может быть установлен через Центр управления программным обеспечением или через терминал:

sudo apt install freecad

Примечание: пакет Ubuntu Universe может быть устаревшим, так как упаковка может отставать от последнего стабильного исходного кода. В этом случае рекомендуется установить пакет из PPA -stable ниже. Кроме того, для тестирования ветки разработки можно установить пакет -daily.

Стабильная PPA версия

Предупреждение: FreeCAD PPA в настоящее время не поддерживается и ищет добровольцев. Пожалуйста, используйте альтернативу (snap, appimage), пока проблема не будет устранена!

Персанальный Архив Пакетов (Personal Package Archive (PPA)) для стабильной версии FreeCAD поддерживается сообществом FreeCAD на Launchpad community. Launchpad репозиторий называется как FreeCAD Stable Releases .

С помощью графического интерфеса

Установка стабильного PPA с помощью графического интерфейса (GUI):

1. Перейдите на Ubuntu Software → Software & Updates → Software Sources → Other Software
2. Кликните на Add, затем скопируйте и вставьте следующую строку
ppa:freecad-maintainers/freecad-stable
3. Добавьте источник, закройте диалоговое окно, и перезагрузите свои источники софта, если нужно.

Теперь вы можете найти и установить последнюю стабильную версию FreeCAD из Ubuntu Software Center.

Через командную строку

Установите стабильный PPA через коммандную строку:

1. Добавьте PPA в свои источники программного обеспечения:
sudo add-apt-repository ppa:freecad-maintainers/freecad-stable
2. Извлеките обновленные списки пакетов:
sudo apt update
3. Затем установите FreeCAD вместе с комплектом оффлайн документации:
sudo apt install freecad freecad-doc

Note: из-за проблем с упаковкой в некоторых версиях Ubuntu у пакета freecad-doc возникают коллизии с пакетом самого FreeCAD или одной из его зависимостей; в этом случае удалите пакет freecad-doc и установите только пакет freecad. Если пакет freecad-doc не существует, проигнорируйте его установку.

Проверка Установки

4. Как только вы добавите стабильный PPA в свои исходные файлы одним из вышеперечисленных методов, пакет freecad установит эту версию PPA поверх версии, предоставленной репозиторием Ubuntu Universe. Вы можете просмотреть доступные версии с помощью следующей команды apt-cache :
apt-cache policy freecad
Результат должен выглядеть примерно так (конечно, информация о версии будет отличаться):
freecad:
  Installed: (none)
  Candidate: 2:0.18.4+dfsg1~201911060029~ubuntu18.04.1
  Version table:
     2:0.18.4+dfsg1~201911060029~ubuntu18.04.1 500
        500 http://ppa.launchpad.net/freecad-maintainers/freecad-stable/ubuntu bionic/main amd64 Packages
     0.16.6712+dfsg1-1ubuntu2 500
        500 http://archive.ubuntu.com/ubuntu bionic/universe amd64 Packages
ubuntu@ubuntu:~$ apt-cache policy freecad-doc
5. Вызовите стабильную (PPA) версию FreeCAD через графический интерфейс или через командную строку. Последний метод заключается в следующем:
./freecad

Development PPA (Daily)

Поскольку FreeCAD находится в постоянном развитии, вы можете установить пакет daily, чтобы быть в курсе последних улучшений и исправлений ошибок. Репозиторий также размещен на Launchpad и называется freecad-daily.

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

Добавьте PPA типа "daily" к вашим источникам программного обеспечения, обновите списки пакетов и установите ежедневный пакет:

sudo add-apt-repository ppa:freecad-maintainers/freecad-daily
sudo apt-get update
sudo apt-get install freecad-daily

Каждый день вы можете обновлять до последней ежедневной:

sudo apt-get update
sudo apt-get install freecad-daily

Примечание: в некоторых случаях новый код или зависимости, добавленные в FreeCAD, вызывают ошибки упаковки; в этом случае пакет "daily" может не создаваться до тех пор, пока майнтайнеры не исправят проблемы вручную.

Запустите ежедневную (PPA) версию FreeCAD:

freecad-daily

Примечание: в одной системе можно установить как пакеты -stable, так и -daily.Это полезно, если вы хотите работать со стабильной версией и при этом иметь возможность тестировать новейшие функции в разработке. Обратите внимание, что исполняемый файл для ежедневной версии - это freecad-daily, а для стабильной версии это просто freecad.

Debian и прочие базирующиеся на нём системы

Начиная с Debian Lenny, FreeCAD доступен прямо из программных репозиториев Debian и может быть установлен через synaptic или просто через:

sudo apt-get install freecad

OpenSUSE

FreeCAD обычно устанавливается через YAST (сокр. Yet another Setup Tool, Еще один инструмент установки), инструмент установки и настройки операционной системы Linux, или в терминале/консоли (нужны права root) с помощью:

zypper install FreeCAD

Примечание: Эта процедура распространяется только на установку официально выпущенных стабильных версий программы FreeCAD, в зависимости от установленных ссылок на репозитории программных пакетов вашей версии ОС. Пакет openSUSE «может быть устаревшим», так как упаковка может отставать от последнего стабильного исходного кода.В этом случае рекомендуется установить пакет вручную из отмеченных (Expand) репозиториев исходников.

Предлагается обширная программа выпуска для сборок пакетов FreeCAD. Посетите для обзора:

[1]

Обычно для выбора правильного дистрибутива openSUSE необходимо щелкнуть по особой кнопке View.

Стабильная версия

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

Примечание: openSUSE имеет несколько вариантов на выбор при загрузке FreeCAD. Чтобы просмотреть эти варианты, посетите Обзор стабильных репозиториев на openSUSE.

В разработке

Последние выпуски разработчика unstable: Списки нестабильных репозиториев в openSUSE

Рекомендуется загружать бинарные пакеты напрямую. Затем выберите правильный дистрибутив для установленной вами ОС openSUSE.

Gentoo

FreeCAD может быть скомпилирован/установлен просто вызовом:

emerge freecad

Fedora

FreeCAD выл включён в официальные пакеты начиная с Fedora 20. Он может быть установлен из командной строки:

sudo dnf install freecad

Для предыдущих выпусков Fedora:

sudo yum install freecad

Также может быть использован менеджер пакетов с графическим интерфейсом. Задайте поиск "freecad". Версия пакета официального релиза как правило сильно отстает от релизов FreeCAD. Package: freecad показывает версии, включенные в репозитории Fedora с течением времени и версии.

Более свежие версии можно получить, загрузив один из .AppImageрелизов из репозитория github. Они отлично работают на Fedora.

Если вы хотите быть в курсе самых последних ежедневных сборок, FreeCAD также доступен на coprЧтобы установить сборку оттуда введите в терминале:

sudo dnf copr enable @freecad/nightly
sudo dnf install freecad

Это оставляет copr хранилище активным, так что

sudo dnf upgrade

или эквивалентной, обновится до последней сборки FreeCAD вместе с обновлениями из любых других активных репозиториев. Если вы хотите что-то более стабильное, вы можете отключить @freecad/nightly снова после первоначальной установки. Репозиторий copr сохраняет только сборки за последние 2 недели. Это не подходит, если вы хотите выбрать более старую конкретную версию.

Инструкции также доступны на компиляция FreeCAD самостоятельно, включая сценарий специально для Fedora. С небольшим изменением, чтобы проверить конкретную фиксацию из git, любая версия начиная примерно с FreeCAD 0.15 может быть построена на любом дистрибутиве начиная с Fedora 21.

Arch

Установка FreeCAD в Arch Linux и производных (например, Manjaro):

pacman -S freecad

Прочие

Если Вы обнаружите, что Ваша система использует FreeCAD, но не описана на этой странице, пожалуйста сообщите нам на форум!

В сети доступны многие альтернативные, неофициальные пакеты FreeCAD, например для систем вроде slackware или fedora. Поиск в сети быстро даст Вам какие-нибудь результаты.

Установка в других Linux/Unix системах

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

apt-get install freecad
dnf install freecad
emerge freecad
slackpkg install freecad
yum install freecad
zypper install freecad
pacman -Sy freecad

Имя пакета чувствительно к регистру, поэтому попробуйте `FreeCAD`, а также `freecad`. Если это не работает для вас, либо из-за того, что у вашего менеджера пакетов нет предварительно скомпилированной версии FreeCAD, либо из-за того, что доступная версия устарела для ваших нужд, вы можете попробовать загрузить один из .AppImage релизов из репозитория github. Они работают на большинстве 64-битных дистрибутивов Linux без какой-либо специальной установки. Просто убедитесь, что загруженный файл помечен как исполняемый, а затем запустите его.

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

Следующий Шаг

После того, как вы установили FreeCAD, пора приступить к работе!


Установка на Mac OS


FreeCAD можно установить на macOS из пакета .dmg, который вы можете просто перетащить в вашу папку приложений:

If you would like to download a development version, which may be unstable, see the Weekly builds download page.

Для обновления программного обеспечения, Вы также можете использовать менеджер пакетов, например такой как HomeBrew. Инструкции по установке HomeBrew можно посмотреть здесь. После установки HomeBrew вы можете просто установить FreeCAD 0.18.4 через свой bash терминал

brew install --cask freecad

и чтобы использовать последнюю доступную версию (0.19 pre) на HomeBrew, вы должны запустить

brew install freecad

Если у вас есть какие-либо проблемы с HomeBrew Cask или Formula, вы можете сообщить о них здесь.

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

Простая установка

Установщик FreeCAD предоставляется в виде пакета приложения (.app), помещенного в файл образа.

Установщик FreeCAD предоставляется в виде пакета приложений (.app), заключенного в файл образа диска.

Вы можете загрузить последнюю версию установщика со страницы Download. После загрузки файла просто смонтируйте образ диска, затем перетащите его в папку «Приложение» или в папку по вашему выбору.

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

Удаление

В настоящее время для FreeCAD нет деинсталятора. Чтобы полностью удалить FreeCAD и все установленные компоненты, перетащите следующие файлы и папки в корзину:

  • В /Приложения:
    • FreeCAD

Если вы установили FreeCAD вместе с homebrew, просто используйте команду brew uninstall freecad. Это все, что требуется.


Обзор FreeCAD


Предисловие

FreeCAD - это система параметрического 3D моделирования, разработанная в первую очередь, для решения задач в области машиностроения, однако это далеко не единственные направление. FreeCAD также поддерживает и иные варианты применения в случаях, когда нужно моделировать объемные объекты с заданной точностью и контролем над историей моделирования.

FreeCAD находится в стадии разработки c 2002 года и предлагает большой список функций. Возможностей по-прежнему не хватает, но он достаточно мощен для использования в хобби или малых мастерских. Имеется быстрорастущее сообщество увлеченных пользователей, участвующих в форуме FreeCAD, и вы можете найти здесь множество примеров качественных проектов, разработанных с использованием FreeCAD. Смотрите так же использование FreeCAD в производстве.

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

Смотри так же:

Установка

Чтобы приступить к работе скачайте и установите FreeCAD. Информацию о текущей версии и последних обновлениях можно получить на странице загрузки. Инструкции по установке под определенные операционные системы изложены на следующих страницах: (Windows, Linux, Mac). Так же имеются готовые пакеты установки для Windows (.msi), Ubuntu и Debian (.deb), openSUSE (.rpm) и Mac OSX. FreeCAD доступен в менеджерах пакетов множества других дистрибутивов Linux. Существует исполняемый файл формата AppImage, который пригоден для запуска на большинстве современных 64-битных Linux систем. FreeCAD является программным обеспечением с открытым исходным кодом, что дает возможность, любому пользователю скачать исходный код и скомпилировать его самостоятельно.

Обзор интерфейса

Стандартный интерфейс FreeCAD

Более подробное описание находится на странице интерфейс.

1. Главный вид - может содержать различные окна с вкладками, в данном случае открыта вкладка трёхмерного вида.
2. Вкладки главного вида - список всех открытых объектов и документов в виде вкладок.
3. Древо проекта (часть комбинированной панели) - показывающее иерархию и историю проектирования объектов в документе, может так же отображать панель задач активных команд.
4. Редактор свойств (часть комбинированной панели) - позволяет просматривать и изменять свойства выделенных объектов.
5. Вид выделения - отображает объекты или под элементы выбранных объектов (вершины, ребра, грани).
6. Отчёт (или окно вывода Python) - в данной панели отображаются сообщения, предупреждения и ошибки в работе FreeCAD.
7. Консоль Python - консоль для ввода Python кода и просмотра результатов его исполнения.
8. Cтрока состояния - отображает некоторые сообщения и подсказки.
9. Раздел панелей инструментов - область в которой расположены панели инструментов.
10. Переключатель верстаков - позволяет переключить верстак.
11. Стандартное меню - содержит базовые операции программы.

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

Когда вы впервые запускаете FreeCAD, открывается Стартовая страница. Вот как это выглядит для версии 0.19:

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

Навигация в трехмерном пространстве

В FreeCAD есть несколько режимов навигации, которые меняют способ использования мыши для взаимодействия с объектами в трёхмерном окне и сам вид. Один из них сделан под тачпады, где средняя кнопка не используется. Нижеследующая таблица показывает режим по умолчанию, называемый CAD' (Можно быстро сменить текущий режим навигации правым кликом на пустом месте трёхмерного вида):

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

Первые шаги в FreeCAD

FreeCAD ориентирован на создание высокоточных трёхмерных моделей, сохранение четкого контроля над этими моделями (сохранение возможности вернуться назад по истории модели и изменить параметры), и при необходимости изготовить эти модели (через трёхзмерную печать, станками с ЧПУ или на заводе). Поэтому он отличается от некоторых других трёхмерных приложений, сделанных для других целей, таких как создание анимации или игр. Его кривая обучения может быть сложной для освоения, особенно если это ваш первый контакт с 3D-моделированием. Если Вы застряли на каком-то месте, не забудьте, что дружественное сообщество пользователей на форуме FreeCAD способно быстро подсказать Вам решение.

Верстак, с которого Вы начнёте использование FreeCAD, зависит от типа работы, которую Вам надо выполнить: если Вам нужно работать над механической моделью, или вообще над любым небольшим объектом, Вам возможно подойдёт верстак PartDesign. Если Вы работаете на плоскости, то переключитесь на верстак Draft, или верстак Sketcher, который позволяет работу с ограничениями. Если Вам требуется разработка здания по BIM, переключитесь на Arch_Workbench. А если Вы привыкли к OpenSCAD, попробуйте верстак OpenSCAD. Также доступно множество внешних верстаков, разработанных сообществом.

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

Работа с верстаками PartDesign и Sketcher

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

Верстак PartDesign широко использует другой верстак, Sketcher. Он позволяет рисовать плоские эскизы, которые определяются установкой ограничений (Constraints) к двумерной форме. Например, Вы можете нарисовать прямоугольник и установить размер стороны применением ограничений к одной из сторон. Размеры этой стороны теперь могут быть изменены лишь при изменении ограничений.

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

  1. Создать новый эскиз
  2. Нарисовать замкнутую фигуру (необходимо убедиться, что все точки соединены)
  3. Закрыть эскиз
  4. Растянуть эскиз в твердое тело с помощью pad tool
  5. Выбрать одну грань твердого тела
  6. Создать второй эскиз (на этот раз он будет нарисован на выбранной грани)
  7. Нарисовать замкнутую фигуру
  8. Закрыть эскиз
  9. Создать карман из второго эскиза на первом объекте

Что создаст объект вроде этого:

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

Работа с верстаками Draft и Arch

Верстаки Draft и Arch действуют немного по-разному, хотя они следуют общим правилам для FreeCAD. Если коротко, Sketcher и PartDesign созданы в первую очередь для проектирования единых деталей, а Draft и Arch для работы с несколькими простыми объектами.

Верстак Draft предоставляет двумерные инструменты вроде тех, что можно найти в традиционных двумерных САПР вроде AutoCAD. Тем не менее двумерное черчение находится вне задач FreeCAD, и не ожидайте найти здесь полное множество инструментов, которые предлагают эти специализированные инструменты. Большинство инструментов верстака Draft работают не только на плоскости, но и в объёме, и получают пользу от специальных вспомогательных систем вроде выбора плоскости и привязки к объектам.

Верстак Arch добавляет FreeCAD инструмент BIM, позволяя создавать архитектурные модели через параметрические объекты. Верстак Arch зависит от других модулей, таких как Draft и Sketcher. Все инструменты Draft так же имеются в верстаке Arch, и большинство инструментов Arch используют вспомогательные системы Draft.

Типичный рабочий процесс с верстаками Arch и Draft может быть таким:

  1. Нарисовать набор лилий с помощью инструментаDraft Line
  2. Выбрать каждую линию и использовать инструмент Wall, чтобы создать стену на каждом из них
  3. Соединить стены, выбрав их и нажав на инструмент Arch Add
  4. Создать объект floor (пол), и поместить Ваши стены на него из древа проекта
  5. Создать объект building, и переместить ваш пол и в него из древа проекта
  6. Создать окно, нажав на инструмент Window, выбрать предустановки в его панели, затем нажать на поверхность стены
  7. Добавить размеры, сначала установив рабочую плоскость если необходимо, затем испольжуя инструмент Draft Dimension

В результате получится следующее:

Дальнейшее на странице Учебники (то же на английском).

Дополнения, макросы и сторонние верстаки

Принцип дополнений основан на разработке дополнений верстаков. Любой пользователь может разработать функцию, которая, по его или её мнению, отсутствует для нужд его/её, или даже сообщества. На форуме пользователь может запросить оценку, помощь форума. Он может поделиться, или нет, объектом его разработки, в соответствии с установленным им копирайтом. Это его выбор. Для разработки пользователю доступны функции для скриптов.

Есть два типа расширений:

  1. Макросы: небольшие отрезки кода Python, дающие дополнительные инструменты или функциональность. макросы обычно начинаются как способ упростить или автоматизировать задачи рисования или редактирования отдельных объектов. Если многие из этих макросов собраны в каталоге, весь каталог может распространяться как новый верстак.
  2. Сторонние верстаки: собрание инструментов, запрограммированных на Python или C++, которые существенно расширяют FreeCAD. Если верстак успешно разработан и хорошо документирован, он может быть включён одним из верстаков FreeCAD. На странице External workbenches можно найти принципы и список существующих библиотек.

Программирование

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

Что нового?


Работа в FreeCAD

Структура документа FreeCAD


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

В документе объекты могут быть помещены в группы и им можно присвоить уникальные имена. Управлять группами, объектами и именами объектов осуществляется главным образом с помощью древовидного списка. примечание: Также это можно сделать, как и всё в FreeCAD, с помощью интерпретатора Python. В древовидном списке вы можете создавать группы, перемещать объекты в группы, удалять объекты или группы, кликнув правой клавишей на объект в древовидном списке, переименуйте объекты. Также можно переименовать объект выделив его в древовидном списке и нажав F2, также возможны другие комбинации в зависимости от текущего инструментария.

Объекты входящие в FreeCAD документ могут быть различных типов. Каждый инструментарий может создать свои собственные типы объектов, для примера Верстак полигонального моделирования создаёт объекты состоящие из полигонов, Верстак Деталей создает детали, Чертежный Верстак также создаёт детали, и т.д.

Если есть по крайней мере один документ открытый в FreeCAD, всегда есть один и только один активный документ. Этот документ отображается в текущем окне 3D просмотра, это документ над которым вы сейчас работаете.

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

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

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

Еще в части документа Вид содержатся объёмные виды. Один документ может иметь несколько открытых видов, так что вы можете просматривать ваш документ одновременно с нескольких точек зрения. Может быть вы хотели бы одновременно смотреть на ваш объект спереди и сверху? Тогда в вашем документе будет две части Вид документа. Создать новые виды или закрыть старые виды можно с помощью меню Вид или кликнув правой кнопкой мыши по закладке вида.

Программирование

Документы легко могут быть созданы и изменены с помощью интерпретатора Python. Например:

FreeCAD.ActiveDocument

Вернет текущий (активный) документ

FreeCAD.ActiveDocument.Blob

Даст доступ к объекту с именем "Blob" внутри вашего документа

FreeCADGui.ActiveDocument

Вернет вид-документ связаный с текущим документом

FreeCADGui.ActiveDocument.Blob

Получить доступ к графическому представлению (виду) объекта с именем Blob

FreeCADGui.ActiveDocument.ActiveView

Вернет текущий активный вид.


Настройка пользовательских предпочтений


Введение

Чтобы запустить Редактор настроек выберите пункт меню Правка → Настройки.... В Mac OS пункт Настройки... может находиться в меню FreeCAD (это типичное расположение для большинства приложений Mac).

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

To preserve resources, FreeCAD does not automatically load all available workbenches. See Workbenches for more information. For a list of workbench related preferences see Workbench related preferences.

Изначально в Редакторе настроек доступны четыре секции (даже если ни один верстак не был загружен). Это секции: Основные, Отображение, Рабочее окружение и Импорт/Экспорт. Верстаки которые могут быть загружены в процессе работы, имеют свою вкладку настроек и будут рассмотрены далее.

Обратите внимание, что нажатие кнопки Reset в левом нижнем углу диалога Настроек сбросит все настройки FreeCAD к значениям по умолчанию.

Некоторые дополнительные настройки можно изменить только в Редакторе параметров. На странице Точных настроек перечислены некоторые из них.

Основные

Этот раздел настроек имеет 9 вкладок: Основные, Документ, Выделение, Кэш, Редактор кода, Консоль Python, Просмотр отчёта, Макрос, Единицы измерения. И 10 вкладка "Помощь", будет добавлена если дополнение Помощь включено. Это дополнение может быть установлено через Менеджер дополнений.

In version 0.21 and below the seventh tab, Help, is only available if the Help Addon has been installed.

Основные

Вкладка Основные позволяет настроить следующие параметры:

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

Optionally, imported files can be excluded from this list, and exported files can be included. See Fine-tuning.

Enable tiled background If checked, the background of FreeCAD's main window will by default consist of tiles of this image:

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

Изображение можно изменить, добавив папки Gui/Images в папку:

%APPDATA%/FreeCAD (в Windows),

$HOME/.FreeCAD (в Linux) или

$HOME/Library/Preferences/FreeCAD (в MacOS).

Поместите туда файл с именем background.png и включите/отключите этот параметр, чтобы увидеть измененный файл.

Enable cursor blinking If checked the text cursor in the Python console and the Macro editor will blink.
Стиль интерфейса Выбор стиля оформления. Стиль оформления определяют внешний вид пользовательского интерфейса FreeCAD.
Размер значков на панелях инструментов Выбор размера значков панели инструментов:
  • Small (16px)
  • Medium (24px)
  • Large (32px)
  • Extra large (48px)
Режим отображения древовидного представления документа Настройка отображения панели древовидного представления документа. Для того, чтобы настройки вступили в силу, требуется перезапуск FreeCAD. Возможны следующие варианты представления:
  • Одна комбопанель: древовидное представление и раздел свойств скомбинированы в одну панель.
  • TreeView и PropertyView: древовидное представление и раздел свойств разделены на две панели.
  • Оба: древовидное представление и раздел свойств скомбинированы в одну панель и дополнительно еще есть одна панель свойств.
При запуске автоматически загружать верстак Выбор того, какой верстак будет использоваться сразу после запуска FeeCAD
Включение экрана-заставки при запуске Если пункт выбран, при запуске отображается заставка FreeCAD.

Изображение экрана-заставки можно изменить, поместив файл с именем splash_image.png в папку Images, уже упомянутую в разделе Включить фон из повторяющегося узора.

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

Документ

Вкладка Документ позволяет настроить следующие параметры:

Название Описание
Создавать новый документ при запуске Если отмечено, FreeCAD создаст новый документ при запуске
Уровень сжатия сохраняемого документа Спецификация уровня сжатия для файлов FCStd. Файлы FCStd являются сжатыми файлами ZIP. Поэтому вы можете переименовать их суффикс .FCStd в .zip и открыть их с помощью программы ZIP-архива.
Отмены/Повторы Если пункт выбран, все изменения в документах сохраняются, чтобы их можно было отменить/повторить.
Максимум шагов отмен/повторов Укажите, сколько шагов Отмена/Повтор нужно записать
Разрешить отмену перерасчета Allow to aborting the document recomputation by pressing Esc. This may slightly increase the recomputation time.
Запуск автоматического восстановления при запуске Если файл восстановления доступен, FreeCAD автоматически запустит восстановление файла при запуске. Таким образом, файлы могут быть восстановлены в случае сбоя.
Автосохранение каждые Определяет, как часто будет записывается файл автосохранния.
Сохранить миниатюру в файл проекта при сохранении документа Если пункт выбран, то при сохранении документа также будет сохранена его миниатюра. Например, миниатюра будет отображаться в списке последних файлов в Верстаке Start. It is possible to select a Size between 128×128 and 512×512 pixels for the thumbnail. Common sizes are the powers of two: 128, 256, 512.
Добавить логотип программы в генерируемую миниатюру Если пункт выбран, логотип программы FreeCAD будет добавлен к миниатюре. Этот параметр действует только в том случае, если используется Сохранить миниатюру в файл проекта при сохранении документа.
Максимальное количество файлов резервных копий, при пересохранении документа Если пункт выбран, файлы резервных копий будут сохраняться при сохранении документа. Вы можете указать количество сохраняемых файлов резервных копий. Они содержат ранее сохраненную версию документа. Первый файл резервной копии будет иметь суффикс файла .FCStd1, второй .FCStd2 и т.д.
Use date and FCBak extension If checked, backup files will get the extension .FCbak and their file names get a date suffix according to the specified date format. For a description of the date format see this site.

With the default settings the backup file will get for example this name TD-Cube.20200315-215654.FCBak (original filename is TD-Cube.FCStd).

Разрешить идентичные метки объектов в одном документе Если пункт выбран, объекты могут иметь одинаковую метку/имя. Например, разные части или элементы могут иметь одинаковое имя в одном и том же документе.
Disable partial loading of external linked objects Enable partial loading of external linked document. When enabled, only the referenced objects and their dependencies will be loaded when a linked document is auto opened together with the main document. A partially loaded document cannot be edited. Double click the document icon in the tree view to reload it in full. A more detailed explanation of the feature can be found on the Assembly3 documentation page
Имя автора Все документы, которые будут созданы, получат указанное имя автора. Оставьте поле автора пустым для анонимного автора. Если опция Устанавливать при сохранении отмечена, поле Last updated by будет установлено для указанного автора при сохранении файла. Это поле можно просмотреть с помощью меню Файл → Информация о проекте.
Компания Все документы, которые будут созданы, получат указанное название компании
Лицензия по умолчанию Выбор лицензии по умолчанию для новых документов. Для предопределенной лицензии URL-адрес лицензии будет автоматически установлен соответствующим образом. Выберите «Другое» для собственной или специальной лицензии.
URL адрес лицензии Указание URL-адреса, описывающего лицензию, выбранного в Лицензия по умолчанию

Выделение

Вкладка Выделение (представлено в версии 0.19) позволяет настроить следующие параметры:

Название Описание
Автопереключение в 3D вид, содержащий выбранный элемент Включает/выключает опцию Синхронизировать вид
Автоматический разворачивать элемент дерева при выделении соответствующего объекта в 3D виде Включает/выключает опцию Синхронизировать выделение
Выделить объект в режиме 3D при наведении курсора на элемент дерева Включает/выключает опцию Предвыборка
Записывать выделение в древе для перехода назад/вперед с помощью кнопки навигации Включает/выключает опцию Записать выделение
Добавить флажки для выделения в древе документов Если пункт выбран, то каждый элемент древа документа получает флажок. Это к примеру может быть удобно для выбора нескольких элементов при работе на сенсорном экране.

Кэш

These preferences are related to the cache directory where FreeCAD stores temporary files.

On the Cache tab (introduced in version 0.20) you can specify the following:

Name Description
Location Specifies the path of the cache directory.
Check periodically at program start Controls the frequency with which the directory size is checked. The options are:
  • Always
  • Daily
  • Weekly
  • Monthly
  • Yearly
  • Never
Cache size limit Specifies the maximum size of the directory. You will be notified if a check is performed and the size exceeds this value. The options are:
  • 100 MB
  • 300 MB
  • 500 MB
  • 1 GB
  • 2 GB
  • 3 GB
Current cache size Shows the current size of the directory, if available. Press the Check now... button to update the value.

Notification Area

These preferences control the Notification Area and its notifications.

On the Notification Area tab (introduced in version 0.21) you can specify the following:

Name Description
Enable Notification Area If checked, the Notification Area will appear in the status bar.
Enable non-intrusive notifications If checked, non-intrusive notifications will appear next to the Notification Area in the status bar.
Errors If checked, errors will appear in the Notification Area.
Warnings If checked, warnings will appear in the Notification Area.
Maximum Duration Maximum duration during which notifications are shown (unless mouse buttons are clicked).
Minimum Duration Minimum duration (idem).
Maximum Number of Notifications Maximum number of notifications shown simultaneously.
Notification width Width of the Notification Area in pixels.
Hide when other window is activated If checked, open notifications will disappear when another window is activated.
Do not show when inactive If checked, notifications will not appear if the FreeCAD window is not the active window.
Maximum Messages (0 = no limit) The maximum number of messages kept in the list. Set to 0 for no limit.
Auto-remove User Notifications If checked, notifications will be removed from the message list when the Maximum Duration has elapsed.

Report view

Параметры вывода влияют на поведение Представление отчета. Эта панель отображается с помощью меню Вид → Панели → Отчет.

Вкладка Просмотр отчёта позволяет настроить следующие параметры:

Название Описание
Выводить обычные сообщения (normal) Если пункт выбран, обычные сообщения будут записываться в отчёт. Они будут выделены в отчёте цветом указанным в пункте Выделение сообщений → Обычные сообщения.
Выводить информационные сообщения (log) Если пункт выбран, то также будут отображаться информационные сообщения. Они будут выведены на панель Отчет цветом, установленным в Журнал (logs). Эта панель активируется с помощью меню Вид → Панели → Отчет.
Выводить предупреждения (warnings) Если пункт выбран, то предупреждения будут отображаться. Они будут выведены на панель Отчет цветом, установленным в Предупреждения (warnings).
Выводить сообщения об ошибках (errors) Если пункт выбран, то будут отображаться сообщения об ошибках. Они будут выведены на панель Отчет цветом, установленным в Ошибки (errors)
Показать отчёт в случае ошибки Если пункт выбран, то the Report view will be shown automatically when an error is recorded
Показать отчёт в случае предупреждения Если пункт выбран, то the Report view will be shown automatically when a warning is recorded
Показать отчет при выводе обычного сообщения Если пункт выбран, то the Report view will be shown automatically when a normal message is recorded
Показать отчёт в журнале Если пункт выбран, то the Report view will be shown automatically when a log message is recorded
Включить код времени для каждой записи Если пункт выбран, то each message and warning will receive a timecode
Обычные сообщения (normal) Задание цвета шрифта для обычных сообщений на панели Отчет.
Информационные сообщения (log) Задание цвета шрифта для сообщений журнала на панели Отчет.
Предупреждения (warnings) Задание цвета шрифта для предупреждающих сообщений на панели Отчет.
Сообщения об Ошибках (errors) Задание цвета шрифта для сообщений об ошибках на панели Отчет.
Перенаправлять внутренний вывод Python в отчёт Если пункт выбран, то внутренний вывод Python будет перенаправляться из консоли Python в отчёт
Перенаправлять внутренние сообщения об ошибках Python в отчёт Если пункт выбран, то внутренние сообщения об ошибках Python будут перенаправляться из консоли Python в отчёт

Справка

On the Help tab you can specify the following:

Name Description
Help location Specifies the location of the Help files. The options are:
  • Online: Enter the URL or leave blank to use the automatic GitHub URL.
Translation suffix: If https://wiki.freecad.org/ is used, a language suffix can be specified. Use for example fr for the French translation. Must be blank for the GitHub URL.
  • From disk location: Enter the path where the downloaded FreeCAD documentation can be found. To download the documentation select the offline-documentation addon from the Workbenches list in the Addon Manager.
Display Specifies where the documentation should be displayed. The options are:
  • In a new FreeCAD tab: The documentation is displayed on a new tab in the Main view area.
  • In your default web browser: The documentation is displayed in the default web browser.
  • In a separate, embeddable, dialog: The documentation is displayed in a separate dialog. This dialog can be docked on top of the Combo view for example.
Custom stylesheet Specifies an optional custom stylesheet. Not used for the Wiki URL.

Отображение

Этот раздел настроек имеет три стандартные вкладки: 3D Вид, Навигация и Цвета. Четвертая вкладка, Отображение Mesh, добавляется, если верстак Mesh был загружен.

3D Вид

Вкладка 3D Вид позволяет настроить следующие параметры:

Название Описание
Показывать систему координат в углу Если пункт выбран, то основная система координат всегда будет отображаться в правом нижнем углу в открытых файлах
Показывать перекрестие осей по умолчанию представлено в версии 0.19 Если пункт выбран, то пересечение осей будет показано по умолчанию при создании или открытии файла
Показывать счетчик кадров в секунду Если пункт выбран, то время, необходимое для последней операции, и полученная частота кадров [2] всегда будут отображаться в нижнем левом углу в открытых файлах.
Запомнить активный верстак вкладкой представлено в версии 0.19 Если пункт выбран, то приложение запомнит текущий активный верстак для независимо каждой вкладки в Main view area. При переключении на вкладку этот верстак будет автоматически восстановлен.
Использовать програмное обеспечение OpenGL представлено в версии 0.19 Если пункт выбран, то OpenGL will use the CPU instead of the GPU. This option is useful for troubleshooting graphics card and driver problems. Changing this option requires a restart of the application.
Использовать OpenGL VBO (объекты буфера вершин) Если пункт выбран, то будут использоваться объекты буфера вершин (VBO). VBO - это функция OpenGL, которая предоставляет методы для загрузки данных вершин (положение, вектор нормали, цвет и т.д.) на видеокарту. VBO обеспечивает существенный выигрыш в производительности, потому что данные находятся в графической памяти, а не в системной памяти, и поэтому они могут отображаться непосредственно графическим процессором. Для получения дополнительной информации см. эту веб-страницу.
Кэш рендера представлено в версии 0.19 "Кэш рендера" или "Render Acceleration" is explained in more detail in Link#render-caching. There are 3 options:
  • Авто (default), let Coin3D decide where to cache.
  • Распределенный, manually turn on cache for all view provider root nodes.
  • Централизованный, manually turn off cache in all nodes of all view providers, and only cache at the scene graph root node. This offers the fastest rendering speed, but slower response to any scene changes.
Сглаживание Выбор используемого типа Multisample сглаживания
Прозрачные объекты представлено в версии 0.19 Render type of transparent objects. The types are:
  • Один проход (default), rendering is done in one pass. For non-solid objects like faces or meshes this can lead to artifacts. This image shows such an artifact (black triangle) and that the type Проход фона avoids this.
  • Проход фона, has only an effect for non-solid objects. They are then rendered in two passes: Back-facing polygons are rendered in the first pass and the front-facing in the second pass.
Размер метки Выбор размера вершины (точки) в верстаке Sketcher. The clickable area of points can be additionally enlarged by increasing Pick radius (on Colors tab).
Расстояние между глаз для стерео режима Спецификация расстояния между глазами, используемого для стереопроекции. Указанное значение является коэффициентом, который будет умножен на размер ограничивающего прямоугольника трехмерного объекта, который отображается в данный момент.
Цвет подсветки Если пункт выбран, то подсветка включена с заданным цветом. Backlight is used for rendering back sides of faces (usually, you don't see them in solids, unless you slice one with a clipping plane, or if the faces aren't oriented correctly). It is only active for objects whose Lighting property (on View tab) is set to "One side". If disabled, back sides of faces of objects in "One side" lighting mode will be black.

The related Intensity setting specifies the intensity of the backlight.

Тип камеры Выбор типа проекции камеры.

Навигация

Вкладка Навигация позволяет настроить следующие параметры:

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

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

Если Поворачивать к ближайшему включенно, the 3D view is rotated to the nearest most logical state when a cube face is clicked. When it is off, clicking to a cube face will and up always to the same position, no matter in what cube state you were when you clicked the face. представлено в версии 0.20

Размер куба Определяет размер навигационного куба. представлено в версии 0.20

Трехмерная навигация Selection of a navigation settings set. To see what each set defines, select it and then press the Mouse... button.
Стиль вращения Selection of the rotation orbit style. When viewing a part in the x-y plane and being in the rotation mode of the 3D navigation, the difference is: If Trackball is selected, moving the mouse horizontally will rotate the part around the y-axis, if Turntable is selected the part will be rotated around the z-axis.
Режим вращения Определяет центр вращения. Можно выбрать Центр окна, Перенести к курсору или Центр объекта.
Ориентация камеры по умолчанию Selection of the camera orientation for new documents. This setting is also used by the Std ViewHome command.
Масштаб нового документа Affects the initial camera zoom level for new documents. The value you set is the diameter of a sphere that fits in 3D view. Default is 100 mm. It also sets the initial size of origin features (base planes in new PartDesign Bodies).
Включить анимацию If checked, rotations can be animated. If for example the 3D Navigation set CAD is used and the mouse is moved while the scroll wheel and the right mouse button are pressed, parts are rotated. If one keeps the mouse moving while releasing e.g. the right mouse button, the rotation will continue as animation. To end the animation left-click with the mouse.
Зум туда, где мышь If checked, zoom operations will be performed at the position of the mouse pointer. Otherwise zoom operations will be performed at the center of the current view. The Zoom step defines how much will be zoomed. A zoom step of 1 means a factor of 7.5 for every zoom step.
Инвертировать зум If checked, the direction of zoom operations will be inverted
Отключить жест наклона для сенсорного экрана If checked, the tilting gesture will be disabled for pinch-zooming (two-finger zooming). This only affects the 3D Navigation set Gesture.

Color sets the base color for all elements. introduced in version 0.21

Угол Определяет место положение Навигационного куба на экране.

Font name specifies the font used for the cube's texts. introduced in version 0.21

Font size sets the size of the font used for the cube's texts. introduced in version 0.21

|- | 3D Navigation | Specifies a mouse navigation style. To see the details of each style, select it and then press the Mouse... button. |- | Orbit style | Specifies the rotation orbit style used when in rotation mode. The options are:

  • Turntable: Moving the mouse will divide the rotation in steps, rotations around the different axes are performed sequentially.
  • Trackball: Rotations around the different axes are performed simultaneously.
  • Free Turntable: Like Trackball, but if possible the rotation axis is kept collinear with the global 3D view axis. introduced in version 0.21

|- | Rotation mode | Defines the rotation center. The options are:

  • Window center
  • Drag at cursor
  • Object center

|- | Default camera orientation | Specifies the camera orientation for new documents. This setting is also used by the Std ViewHome command. |- | Camera zoom | Affects the initial camera zoom level for new documents. The value you set is the diameter of a sphere that fits in 3D view. The default is 100 mm. It also sets the initial size of origin features (base planes in new PartDesign Bodies and Std Parts). |- | Enable animation | If checked, and 3D Navigation is set to CAD, rotations can be animated. If the mouse is moved while the scroll wheel and the right mouse button are pressed, the view is rotated. If one keeps the mouse moving while releasing the right mouse button, the rotation will continue. To end this animation left-click with the mouse. |- | Zoom at cursor | If checked, zoom operations will be performed at the position of the mouse pointer. Otherwise zoom operations will be performed at the center of the current view. The Zoom step defines how much will be zoomed. A zoom step of 1 means a factor of 7.5 for every zoom step. |- | Invert zoom | If checked, the direction of zoom operations will be inverted. |- | Disable touchscreen tilt gesture | If checked, and 3D Navigation is set to Gesture, the tilting gesture will be disabled for pinch-zooming (two-finger zooming). |- | Enable rotation center indication | If checked, the rotation center of the view is shown when dragging. introduced in version 0.22 |}

Цвета

Вкладка Цвета позволяет настроить следующие параметры:

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

Просмотр в виде полигональной сетки

Данная вкладка становится доступной, только после загрузки Верстака Mesh.

Вкладка Просмотр в виде полигональной сетки позволяет настроить следующие параметры:

Название Описание
Цвет полигональной сетки по умолчанию Определяет цвет полигонов полигональной сетки по умолчанию
Цвет линии по умолчанию Определяет цвет линий полигональной сетки по умолчанию
Прозрачность полигональной сетки Определяет прозрачность полигонов полигональной сетки по умолчанию
Прозрачность линии Определяет прозрачность линий полигонов полигональной сетки по умолчанию
Двустороннее отображение Если пункт выбран, цвет внутренних сторон граней будет таким же, как и на внешней стороне. Иначе внутренние стороны граней будут подсвечены цветом подсветки или будут отображены просто черным цветом если подсветка будет отключена.
Отображать границы габаритных размеров для подсвеченных или выбранных полигональных сеток Если пункт выбран, тогда будет отображаться желтый прямоугольный каркас отображающий границы габаритных размеров для подсвеченных или выбранных полигональных сеток.
Задавать нормаль для каждой вершины Если пункт выбран, тогда вместо плоского затенения будет применяться затенение по Фонгу. Тип затенения определяет внешний вид поверхностей. При плоском затенении нормали поверхности не определяются для каждой вершины. Это приводит к нереалистичному внешнему виду криволинейных поверхностей. В то время, как затенение по Фонгу приводит к более реалистичному внешнему виду.
Угол сгиба Угол сгиба-это пороговый угол между двумя гранями. Он может быть установлен только в том случае, если включена опция: задавать нормаль доля каждой вершины.
Если угол грани ≥ угла сгиба, применяется затенение без размытия
Если угол грани < угла сгиба, применяется плавное затенение

Рабочее окружение

В этом разделе настроек есть одна вкладка: Доступные верстаки.

Доступные Верстаки

These preferences control workbench loading.

On the Available Workbenches tab you can specify the following:

Name Description
Workbench list The list displays all installed workbenches. The list can be reordered by drag and drop (introduced in version 0.21) and sorted by right-clicking the list and selecting Sort alphabetically (introduced in version 0.22). The order of the list also determines the order of the Workbench selector.
  • introduced in version 0.21: First checkbox in each row: If checked, the workbench will be available in the Workbench selector in the next FreeCAD session. The start up workbench cannot be unchecked. Unchecked workbenches are moved to the bottom of the list.
  • Auto-load: If checked, the workbench will auto-load when FreeCAD starts. Loading more workbenches will make the start up slower, but switching between workbenches that have already been loaded is faster.
  • Load: Press this button to load the workbench in the current FreeCAD session.
Start up workbench The workbench that is activated when FreeCAD starts.
Workbench selector position introduced in version 0.21 Defines where the Workbench selector appears. The options are:
  • Toolbar: In a dedicated toolbar.
  • Left corner: In the left corner of the menubar.
  • Right corner: In the right corner of the menubar.
Remember active workbench by tab If checked, FreeCAD will remember and restore the workbench that was active for each tab in the Main view area.

Python

This preferences section (introduced in version 0.21) has three tabs: Macro, Python console and Editor.

Макрос

Вкладка Макрос позволяет настроить следующие параметры:

Название Описание
Запуск макросов в локальном окружении Если параметр включен, переменные, определенные макросами, создаются как локальные переменные, в противном случае они создаются как глобальные переменные Python
Куда записывать макросы Путь к папке в которой находятся макросы
Записать команды интерфейса Если параметр включен, записанные макросы также будет содержать команды интерфейса пользователя
Записывать как комментарий Если параметр включен, записанные макросы также будет содержать команды интерфейса пользователя, но в виде комментариев. Это полезно, если вы не хотите выполнять видимые действия при запуске макроса, а видеть, что можно сделать визуально.
Показать команды скрипта в консоли Python Если параметр включен, команды, выполняемые макросами, отображаются в консоли Python. Эта консоль отображается с помощью меню Вид → Панели → Консоль Python.
Размер списка недавних макросов Значение определяет длину списка недавно открытых макросов.
Количество ярлыков Значение определяет длину списка недавно открытых макросов которые можно запустить с помощью комбинации клавиш
Комбинация клавиш Определяет, какая комбинация клавиш клавиатуры используются для запуска макросов, например если значение равно Ctrl+Shift+ это означает что маеросы можно запустить с помощью комбинаций клавиш Ctrl+Shift+1, Ctrl+Shift+2 и так далее.

Консоль Python

These preferences control the behavior of the Python console. This console can be opened using the View → Panels → Python console menu option.

Note that the color and font settings for the console are defined on the Editor tab.

On the Python console tab (introduced in version 0.20) you can specify the following:

Name Description
Enable word wrap If checked, words will be wrapped if they exceed the available horizontal space in the console.
Enable block cursor If checked, the cursor will have a block shape.
Save history If checked, Python history is saved across sessions.

Редактор кода

Настройки предпочтений редактора влияют на поведение редактора макросов. Этот редактор можно открыть с помощью меню Макрос → Макросы... → Редактировать/Создать.

Настройки цвета и шрифта также оказывают влияние на консоль Python. Эта консоль отображается с помощью меню Вид → Панели → Консоль Python.

Вкладка Редактор кода позволяет настроить следующие параметры:

Название Описание
Показывать номера строк Если пункт выбран, то строки кода будут пронумерованы
Шаг табуляции Определение шага табулятора (количество пробелов). Если, например, установлено значение «6», при нажатии Tab будет выполнен переход к символу 7, 13, 19 и т.д., в зависимости от текущей позиции курсора. Этот параметр используется только в том случае, если выбран Символы табуляции.
Размер отступа Указывает, сколько пробелов будет вставлено при нажатии Tab. Этот параметр используется только в том случае, если выбран Заменять на пробелы.
Символы табуляции Если пункт выбран, то нажатие Tab вставит табулятор с растром, определяемым Шаг табуляции
Заменять на пробелы Если пункт выбран, то нажатие Tab вставит количество пробелов, определяемых Размер отступа
Показать пункты Выбор типа кода. Настройки цвета и шрифта будут применены к выбранному типу. Результат можно проверить в окне "Предпросмотр".
Шрифт Выбор типа шрифта, который должен использоваться для выбранного типа кода
Размер Выбор размера шрифта, который должен использоваться для выбранного типа кода
Цвет Определение цвета, который должен использоваться для выбранного типа кода

Менеджер Дополнений

This preferences section has a single tab: Addon manager options.

Настройки менеджера дополнений

These preferences control the behavior of the Addon manager.

On the Addon manager options tab (introduced in version 0.20) you can specify the following:

Name Description
Automatically check for updates at start (requires git) If checked, the Addon manager will check for updates when it is launched. Git must be installed for this to work.
Download Macro metadata (approximately 10MB) If checked, macro metadata is downloaded for display in the Addon manager's main addon listing. This data is cached locally.
Cache update frequency Controls the frequency with which the locally cached addon availability and metadata information is updated. The options are:
  • Manual (no automatic updates)
  • Daily
  • Weekly
Hide Addons marked Python 2 Only If checked, addons marked as "Python 2 Only" are not included in the listing. These addons are unlikely to work in the current FreeCAD version.
Hide Addons marked Obsolete If checked, addons marked as "Obsolete" are not included in the listing.
Hide Addons that require a newer version of FreeCAD If checked, addons that require a newer FreeCAD version are not included in the listing.
Custom repositories Custom repositories can be specified here.

To add a repository press the button. Both the Repository URL and the Branch, typically master or main, must be specifies in the dialog that opens. introduced in version 0.21

To remove a repository select it in the list and press the button. introduced in version 0.21

Proxy The Addon manager includes experimental support for proxies requiring authentication, set up as user-defined proxies.
Python executable (optional) The Addon manager attempts to determine the Python executable that should be used for the automatic pip-based installation of Python dependencies. To override this selection, the path to the executable can be set here.
git executable (optional) The Addon manager attempts to determine the git executable. To override this selection, the path to the executable can be set here. introduced in version 0.21
Show option to change branches (requires git) If checked, the Addon manager provides an interface on the addon's details screen that allows switching which git branch is currently checked out. This is intended for advanced users only, as it is possible that a non-primary-branch version of an addon may result in instability and compatibility issues. Git must be installed for this to work. Use with caution.
Disable git (fall back to ZIP downloads only) If checked, git downloads are disabled. introduced in version 0.21
Addon developer mode If checked, Addon manager options intended for developers of addons are activated. introduced in version 0.21

Импорт/Экспорт

The Import-Export preferences affect how files are imported and exported. They are described on the Import Export Preferences page.

Настройки верстаков

Настройки для более распространенных верстаков приведены ниже. У некоторых верстаков нет настроек. Другие дополнительные верстаки могут быть не перечислены. Эти ссылки так же перечислены в Category:Preferences

Программирование

См. так же: Основы составления скриптов в FreeCAD.

For a scripting example see Std DlgParameter.

Сопутствующая информация


Настройка интерфейса


Введение

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

introduced in version 0.21: The Workbenches tab is no longer available. Its functionality has been moved to the Available Workbenches tab in the Workbenches section of the Preferences Editor.

Диалоговое окно настройки

Применение

  1. The commands available in the Customize dialog box depend on the workbenches that have been loaded in the current FreeCAD session. So you should first load all workbenches whose commands you want to have access to.
  2. There are several ways to invoke the Std DlgCustomize command:
    • Select the Tools → Customize... option from the menu.
    • Right-click a toolbar area and choose Customize... from the context menu.
  3. The Customize dialog box opens. For more information see Options.
  4. The Help button starts the Std WhatsThis command.
  5. Press the Close button to close the dialog box.

Опции

In the Customize dialog box the following tabs are available:

Клавиатура

Вкладка "Клавиатура"

On this tab custom keyboard shortcuts can be defined. Shortcuts for macro commands can be defined on the Macros tab.

Search

You can search for commands by entering at least 3 characters of their menu text or name in the search field. The search is case-insensitive.

It is also possible to search for shortcuts:

  • In the search field special keys in shortcuts must be entered as strings. For example to search for commands that use Ctrl in their shortcut enter ctrl (4 letters).
  • Add parenthesis to search for single character shortcuts, for example: (c).
  • Add a comma and space between the characters of multi-character shortcuts, for example: g, b, b.

Добавление пользовательской комбинации клавиш

  1. Select a command category from the Category dropdown list.
  2. Select a command from the Commands panel.
    • Optionally click the Command, Shortcut or Default column headings to reorder the list.
    • Optionally drag the splitter to the right of the panel to resize it.
  3. The Current shortcut box displays the current short cut, if available.
  4. Enter a new shortcut in the New shortcut input box. Shortcuts can be up to 4 inputs long. Each input is either a single character, a combination of one or more special keys or a combination of one or more special keys and a character. Use Backspace to correct mistakes.
  5. Other active commands (see Notes) that already use the shortcut will be listed in the Shortcut priority list.
  6. Press the Assign button to assign the new shortcut.
  7. If the Shortcut priority list contains more than one command: optionally change its order by selecting individual commands and pressing the Up button or the Down button. If active commands share the same shortcut, the shortcut will trigger the one that is highest in the list.

Remove a shortcut

  1. Select a command category from the Category dropdown list.
  2. Select a command from the Commands panel.
  3. Press the Clear button.

Restore a default shortcut

  1. Select a command category from the Category dropdown list.
  2. Select a command from the Commands panel.
  3. Press the Reset button.

Restore all default shortcuts

  1. Нажмите на кнопку Reset All.

Notes

  • Shortcuts only work for active commands. Active commands are commands that appear in the standard menu, or in the menu of the active workbench, or commands that appear in a visible toolbar.

наверх

Панели инструментов

Вкладка "Панели инструментов"

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

Search

See Keyboard.

Выбор верстака

  1. In the dropdown list on the right select the workbench whose custom toolbars you want to modify. The Global option is there for custom toolbars that should be available in all workbenches.

Создание панели инструментов

  1. Press the New... button.
  2. Enter a name in the dialog box that opens.
  3. Press the OK button.
  4. The new toolbar will appear in the panel on the right.

Переименование панели инструментов

  1. Select a toolbar in the panel on the right.
  2. Press the Rename... button.
  3. Enter a new name in the dialog box that opens.
  4. Press the OK button.

Удаление панели инструментов

  1. Select a toolbar in the panel on the right.
  2. Press the Delete button.

Disable a toolbar

  1. Uncheck the checkbox in front of the toolbar name in the panel on the right.
  2. A disabled toolbar will be invisible in the FreeCAD interface.

Добавление команды

  1. At least one custom toolbar is required. See Create a toolbar.
  2. Select the correct toolbar in the panel on the right. If no toolbar is selected, the command will be added to the first toolbar in the list.
  3. Select a command category from the Category dropdown list. Macro commands that have been set up on the Macros tab appear in the Macros category.
  4. Select a command from the Commands panel, or select <Separator> to add a separator (a line between two toolbar buttons).
    • Optionally drag the splitter to the right of the panel to resize it.
  5. Press button.

Переименовывание команды

  1. If required, expand the toolbar in the panel on the right.
  2. Select a command.
  3. Press button.

Изменение расположения команд на панели инструментов

  1. If required, expand the toolbar in the panel on the right.
  2. Select a command.
  3. Press the button or the button.
  4. Optionally repeat this until the command is in the correct position.

Notes

  • Toolbars belonging to the current workbench are updated immediately, but after disabling/re-enabling a toolbar a workbench change is required (switch to a different workbench and then switch back).
  • To update global toolbars a workbench change (if commands have been added or removed) or a restart (if the order of a toolbar has changed or a toolbar was renamed) is required.

наверх

Макросы

Вкладка "Макросы"

On this tab macro commands can be set up. Once set up, they can be added to custom toolbars. Macros installed with the Addon Manager are set up automatically, and added to a Global toolbar (see Toolbars), if you confirm the Add button popup during the installation process.

If you want to use a macro downloaded from a different source you will have to install it manually. See How to install macros for more information. Note that FreeCAD uses a dedicated folder for macros and only macros in that folder can be set up. Use the Std DlgMacroExecute command to find this folder on your system.

Добавление макро команды

  1. In the Macro dropdown list select a macro.
  2. Enter a Menu text. This will be the name used to identify the macro command and will also appear in the toolbar if there is no icon.
  3. Optionally enter a Tool tip. This text will appear near the location of the mouse when you hover the toolbar icon.
  4. Optionally enter a Status text. This text will appear in the status bar when you hover the toolbar icon.
  5. Optionally enter the wiki page for the macro, if available, in the What's this input box. Enter the page name, not the full URL.
  6. Optionally enter a shortcut in the Accelerator input box. See Keyboard for more information.
  7. To add an icon:
    1. Press the Pixmap ... button.
    2. The Choose Icon dialog box opens.
    3. If required press the Icon folders... button to add an icon folder.
    4. Select an icon from the panel. The Choose Icon dialog box closes automatically.
  8. Press the Add button.
  9. The macro command appears in the panel on the left.
  10. The macro command can now be selected on the Toolbars tab.

Переименовывание макро команды

  1. Select the macro command in the panel on the left.
  2. Press the Remove button.

Изменение макро команды

  1. Double-click the macro command in the panel on the left.
  2. Make the required changes. Note that you cannot remove the icon, you can only replace it.
  3. Press the Replace button.

наверх

Spaceball Motion

This tab is blank if no Spaceball is detected. See: 3Dconnexion input devices.

наверх

Spaceball Buttons

This tab is blank if no Spaceball is detected. See: 3Dconnexion input devices.

наверх

Темы

FreeCAD supports complete theming of the interface, via .qss stylesheets. The qss format is very similar to the css format used in web pages, it basically adds methods to reference the different widgets and elements of the Qt interface. You can change the default theme (which simply takes the style defined by your desktop system) by selecting a style sheet in the FreeCAD preferences.

You can also create your own theme if you are not satisfied with the themes that are bundled with FreeCAD, for example by editing an existing style sheet. Your new style must be placed in a specific folder for it to be found by FreeCAD:

  • %APPDATA%/FreeCAD/Gui/Stylesheets (on Windows). The %APPDATA% folder can be retrieved by entering App.getUserAppDataDir() in the Python console.
  • $HOME/.FreeCAD/Gui/Stylesheets (on Linux).
  • $HOME/Library/Application Support/FreeCAD/Gui/Stylesheets (on macOS).

наверх

Дополнения

Addons from the Addon Manager offer yet another way to customize the user interface. Several Preference Packs to change the theme are available.

In the Workbenches category of the Addon Manager some addons by user triplus can be found:

наверх

Свойства объекта


Introduction

Свойство - это доля информации вроде числа или строки текста, прилагаемая к документу FreeCAD или объекту в нём. Свойства могут быть просмотрены и - если это разрешено - изменены с помощью редактора свойств.

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

Пользовательские параметрические объекты в FreeCAD могут обладать свойствами следующих типов:

 Boolean
Float
FloatList
FloatConstraint
Angle
Distance
Integer
IntegerConstraint
Percent
Enumeration
IntegerList
String
StringList
Link
LinkList
Matrix
Vector
VectorList
Placement
PlacementLink
Color
ColorList
Material
Path
File
FileIncluded
PartShape
FilletContour
Circle

Properties play a very important role in FreeCAD. As objects in FreeCAD are "parametric", this means that their behavior is defined by their properties, and how these properties are used as input for their class methods. See also FeaturePython Custom Properties and PropertyLink: InList and OutList

All property types

Custom scripted objects can use any of the property types defined in the base system:

Name Unit (if any) Remark
Acceleration m/s^2
AmountOfSubstance mol
Angle °
Area m^2
Bool
BoolList
Color
ColorList
CurrentDensity A/m^2 introduced in version 0.21
Density kg/m^3
Direction
DissipationRate m^2/s^3 introduced in version 0.21
Distance m
DynamicViscosity Pa*s introduced in version 0.21
ElectricalCapacitance F introduced in version 0.21
ElectricalConductance S introduced in version 0.21
ElectricalConductivity S/m introduced in version 0.21
ElectricalInductance H introduced in version 0.21
ElectricalResistance Ohm introduced in version 0.21
ElectricCharge C introduced in version 0.21
ElectricCurrent A introduced in version 0.21
ElectricPotential V introduced in version 0.20
Enumeration
ExpressionEngine
File
FileIncluded
Float
FloatConstraint
FloatList
Font
Force N
Frequency Hz
HeatFlux W/m^2 introduced in version 0.21
Integer
IntegerConstraint
IntegerList
IntegerSet
InverseArea 1/m^2 introduced in version 0.21
InverseLength 1/m introduced in version 0.21
InverseVolume 1/m^3 introduced in version 0.21
KinematicViscosity m^2/s introduced in version 0.21
Length m
Link
LinkChild
LinkGlobal
LinkHidden
LinkList
LinkListChild
LinkListGlobal
LinkListHidden
LinkSub
LinkSubChild
LinkSubGlobal
LinkSubHidden
LinkSubList
LinkSubListChild
LinkSubListGlobal
LinkSubListHidden
LuminousIntensity cd introduced in version 0.21
MagneticFieldStrength A/m introduced in version 0.21
MagneticFlux Wb or V*s introduced in version 0.21
MagneticFluxDensity T introduced in version 0.21
Magnetization A/m introduced in version 0.21
Map
Mass kg introduced in version 0.21
Material
MaterialList
Matrix
PartShape a Part property, is accessed as
Part::PropertyPartShape
Path
Percent
PersistentObject
Placement
PlacementLink
PlacementList
Position
Power W introduced in version 0.21
Precision
Pressure Pa
PythonObject
Quantity
QuantityConstraint
Rotation
ShearModulus Pa introduced in version 0.21
SpecificEnergy m^2/s^2 or J/kg introduced in version 0.21
SpecificHeat J/kg/K introduced in version 0.21
Speed m/s
Stiffness m/s^2
Stress Pa introduced in version 0.21
String
StringList
Temperature K introduced in version 0.21
ThermalConductivity W/m/K introduced in version 0.21
ThermalExpansionCoefficient 1/K introduced in version 0.21
ThermalTransferCoefficient W/m^2/K introduced in version 0.21
Time s introduced in version 0.21
UltimateTensileStrength Pa introduced in version 0.21
UUID
VacuumPermittivity s^4*A^2 / (m^3*kg)
Vector
VectorDistance
VectorList
Velocity m/s introduced in version 0.21
Volume l or m^3
VolumeFlowRate l/s or m^3/s introduced in version 0.21
VolumetricThermalExpansionCoefficient 1/K introduced in version 0.21
Work J introduced in version 0.21
XLink
XLinkList
XLinkSub
XLinkSubList
YieldStrength Pa introduced in version 0.21
YoungsModulus Pa introduced in version 0.21

Internally, the property name is prefixed with App::Property:

App::PropertyBool
App::PropertyFloat
App::PropertyFloatList
...

Remember that these are property types. A single object may have many properties of the same type, but with different names.

For example:

obj.addProperty("App::PropertyFloat", "Length")
obj.addProperty("App::PropertyFloat", "Width")
obj.addProperty("App::PropertyFloat", "Height")

This indicates an object with three properties of type "Float", named "Length", "Width", and "Height", respectively.

Scripting

See also: FreeCAD scripting basics

A scripted object is created first, and then properties are assigned.

obj = App.ActiveDocument.addObject("Part::Feature", "CustomObject")

obj.addProperty("App::PropertyFloat", "Velocity", "Parameter", "Body speed")
obj.addProperty("App::PropertyBool", "VelocityEnabled", "Parameter", "Enable body speed")

In general, Data properties are assigned by using the object's addProperty() method. On the other hand, View properties are normally provided automatically by the parent object from which the scripted object is derived.

For example:

  • Deriving from App::FeaturePython provides only 4 View properties: "Display Mode", "On Top When Selected", "Show In Tree", and "Visibility".
  • Deriving from Part::Feature provides 17 View properties: the previous four, plus "Angular Deflection", "Bounding Box", "Deviation", "Draw Style", "Lighting", "Line Color", "Line Width", "Point Color", "Point Size", "Selectable", "Selection Style", "Shape Color", and "Transparency".

Nevertheless, View properties can also be assigned using the view provider object's addProperty() method.

obj.ViewObject.addProperty("App::PropertyBool", "SuperVisibility", "Base", "Make the object glow")

Source code

In the source code, properties are located in various src/App/Property* files.

They are imported and initialized in src/App/Application.cpp.

#include "Property.h"
#include "PropertyContainer.h"
#include "PropertyUnits.h"
#include "PropertyFile.h"
#include "PropertyLinks.h"
#include "PropertyPythonObject.h"
#include "PropertyExpressionEngine.h"


Работа с инструментариями


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

Тоже самое относится и к FreeCAD. Инструменты сгруппированы в верстаки в соответствии с задачами, к которым они относятся.

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

Следует отметить, что иногда верстаки называют модулями. Однако, стоит отметить, что верстаки и модули это разные понятия. Модуль - это любое расширение FreeCAD, в то время как Верстак - это специальный тип модуля со своей собственной конфигурацией графического интерфейса (панели инструментов и меню).

Встроенные верстаки

Current

Следующие верстаки идут в комплекте с каждой установкой FreeCAD:

  • Стандартные инструменты. На самом деле это не верстак, а скорее категория 'стандартных' команд и инструментов, которые можно использовать на всех верстаках.
  • The CAM Workbench is used to produce G-Code instructions. This workbench was called "Path Workbench" in version 0.21 and below.
  • Верстак Draft содержит 2D-инструменты и основные операции 2D и 3D CAD.
  • Верстак FEM обеспечивает рабочий процесс анализа Методом Конечных Элементов (МКЭ).
  • Верстак Inspection сделан для того, чтобы дать вам специфические инструменты для осмотра форм. Он всё ещё находится в стадии разработки.
  • Верстак Mesh для работы с триангулярными (разбитыми на треугольники) сетками.
  • Верстак Reverse Engineering предназначен для предоставления специальных инструментов для преобразования форм/тел/сеток в параметрические элементы, совместимые с FreeCAD. Он все ещё находится в стадии разработки.
  • Верстак Sketcher для работы с геометрически ограниченными эскизами.
  • Верстак Start Center позволяет быстро перейти к одному из наиболее распространённых верстаков.

Obsolete

The following workbenches are no longer included after version 0.20:

  • Верстак Drawing использовался для изготовления технических чертежей, но в настоящее время устарел. По-прежнему необходимо читать старые файлы FreeCAD, содержащие объекты, созданные с помощью этого верстака. Верстак TechDraw является его более продвинутой заменой. obsolete in version 0.17

Внешние верстаки

Верстаки FreeCAD легко программируются в Python, поэтому многие разрабатывают дополнительные верстаки вне кодовой базы FreeCAD.

Страница внешние верстаки перечисляет все известные сообществу. Большинство из них легко устанавливается из FreeCAD, используя Addon Manager через меню Инструменты → Addon manager.


Инструментарий Сетка (Mesh)


Логотип верстака Mesh

Введение

Верстак Mesh оперирует с треугольными сетками. Сетки (Meshes) - это особый тип 3D объектов, составленный из треугольных граней, соединенных по ребрам и вершинам.

Многие из 3D приложений, такие, как sketchup, blender, maya или 3d studio max используют сетки (meshes) в качестве основного типа 3D объекта. Сетки это очень простые объекты, содержащие только вершины (точки), ребра и (треугольные) грани, их очень легко создать, модифицировать, разбивать, растягивать, и можно легко передаваться из одного приложения в другое без потерь в деталях. Кроме того, поскольку сетки определяются очень простыми данными, 3D приложения обычно могут управляться с очень большими их количеством без использования чрезмерных ресурсов. По этим причинам сетки как 3D объекты часто выбирают для приложений, работающих с кино, анимацией и созданием изображений.

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

Инструменты

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

Анализ

Анализ кривизны, граней и проверка может ли сетка безопасно преобразована в твердое тело
  • Close hole: Fills selected holes in mesh objects.
  • Add triangle: Adds faces along a boundary of an open mesh object.

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

  • Merge: Creates a mesh object by combining the meshes of two or more mesh objects.
  • Unwrap mesh: Creates a flat representation of a mesh object.
  • Unwrap face: Creates a flat representation of a face of a shape object.

Preferences

There are some export preferences related to Mesh Formats but these are not used by commands belonging to this workbench. They are used by the Std Export command.

Mesh Workbench preferences can be found in the following categories of the Preferences Editor:

Ссылки


Инструмент Детали (Part)


Иконка верстака Part

Введение

Возможности твердотельного моделирования FreeCAD основаны на ядре Технологии OpenCASCADE (OCCT), CAD-системе профессионального уровня, в которой реализованы расширенные возможности создания и обработки трехмерной геометрии. Верстак Part - это слой, расположенный поверх библиотек OCCT, который даёт пользователю доступ к геометрическим примитивам и функциям OCCT. Практически все функции 2D- и 3D-проектирования в каждом верстаке (Draft, Sketcher, PartDesign и т.д.), основаны на этих функциях, предоставляемых Верстаком Part. Поэтому Верстак Part считается центральным компонентом возможностей моделирования FreeCAD.

Более подробное обсуждение сравнения Верстака Part с Верстаком Part Design можно найти здесь: Part и PartDesign

Объекты, создаваемые верстаком Part относительно просты, они предназначены для использования в булевых операциях (объединения и вырезания) для построения более сложных фигур. Эта парадигма моделирования известна как процесс конструктивной блочной геометрии (CSG, КБГ), и это традиционная методология, используемая в ранних системах САПР. С другой стороны, верстак PartDesign предлагает более современный процесс создания фигур: он использует параметрически заданные эскизы, которые выдавливаются для формирования базовых твёрдых тел, которые потом модифицируются параметрическими трансформациями (функциями редактирования) до получения конечного объекта.

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

Верстак Part Workbench это базовый слой, предоставляющий чертёжные функции OCCT всем верстакам FreeCAD.

Инструменты

Инструменты модуля расположены в меню Деталь или в меню Measure.

Примитивы

Эти инструменты создают примитивные объекты.

  • Куб: Создаёт твердотельный куб.
  • Цилиндр: Создаёт твердотельный цилиндр.
  • Сфера: Создаёт твердотельную сферу.
  • Конус: Создаёт твердотельный конус.
  • Тор: Создаёт твердотельный тор (кольцо).

Создание и изменение

Эти инструменты служат для создания новых и изменения существующих объектов.

  • Выдавить: Выдавливает (вытягивает) плоские грани.
  • Вращать:Создаёт твёрдое тело, вращая объект (не твёрдое тело) вокруг оси.
  • Фаска: Делает фаску на рёбрах объекта.
  • Лофт: Построение профиля методом перехода от одного эскиза к другому.
  • Развёртка: Переносит (проецирует) один или несколько профилей вдоль траектории.
  • Разделить: Обрезает объект по поверхности пересечения секущего объекта.
  • Инструменты смещения:
    • 3D смещение: Строит поверхность, равноудалённую на заданном расстоянии, от поверхности оригинального объекта.
    • 2D смещение: Строит контур, равноудалённый на заданное расстояние, от оригинала или увеличивает/сжимает плоскую грань.
  • Толщина: Делает твёрдое тело пустотелым.
  • Прикрепить (Attachment): Прикрепляет/фиксирует расположение одного объекта относительно другого.

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

Следующие инструменты выполняют логические (Булевы) операции.

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

Измерение

Прочие инструменты

  • Импорт CAD...: Импорт в текущий документ файлов типа *.IGES, *.STEP или *.BREP.

Элементы контекстного меню

  • Внешний вид...: Определяет внешний вид всего объекта (цвет, прозрачность и т.д.).

Настройки

  • Preferences: Настройки, доступные для Инструментов Part (верстака Part) также используются в настройках PartDesign.
  • Import Export Preferences: Настройки, доступные для импорта и экспорта в различные форматы файлов.
  • Fine-tuning: Некоторые дополнительные параметры для тонкой настройки поведения модуля Part.

Программирование

Смотри Создание сценариев (скриптов) модуля Part

Учебники


Инструментарий проецирования


The Drawing Workbench is no longer included after version 0.20.
The TechDraw Workbench is its more advanced replacement.
Drawing workbench icon

Введение

Модуль Черчения позволяет поместить ваши 3D наработки на бумагу. То есть, поместить проекции ваших моделей в 2D окно и вставить это окно в рисунок, например на лист с рамкой, вашим заголовком и логотипом и наконец распечатать всё это.

Инструменты

Это инструменты для создания, настройки и экспортирования 2D чертежных листов

  • Открыть SVG: Открывает чертеж, ранее сохранённый в формате SVG
  • Аннотация: Добавляет аннотацию на текущий чертёжный лист
  • Клип: Добавляет группу клипов на текущий чертёжный лист
  • Открыть в браузере: Открывает предварительный просмотр текущего чертёжного листа в браузере
  • Символ: Добавляет содержимое файла SVG как символ на текущий чертёжный лист
  • Draft View: Вставляет специальный вид выбранного объекта на текущий чертёжный лист
  • Spreadsheet View: Вставляет вид выбранного листа электронной таблицы на текущий чертёжный лист
  • Проекция фигуры: Создаёт проекцию выбранного объекта (источинка) в трёхмерном виде.
  • Примечание: Инструмент Draft Drawing главным образом используется с объектами Draft. Он имеет некоторые дополнительных возможностей кроме стандартных инструментов верстака Drawing, и поддерживает специфические объекты вроде размеров Draft.

Workflow

Документ содержит трёхмерный объект-форму (Schenkel), по которому мы хотим сделать чертёж. Поэтому создается "Лист". Лист автоматически получает шаблон, в данном случае шаблон "A3_Landscape". Этот шаблон представляет собой документ SVG и может содержать обычную чертежную рамку, ваш логотип или другие элементы.

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

Написание сценариев

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

See the Drawing API example page for a description of the functions used to create drawing pages and views.

Шаблоны

FreeCAD поставляется вместе с набором стандартных шаблонов, но вы также можете найти больше на странице Чертежных шаблонов .

Расширение модуля Drawing

Некоторые примечания по программной стороне модуля были добавлены на страницу Drawing Documentation. Это для быстрого понимания, как работает модуль Drawing, позволяя программистам быстро начать программирование для него.

Macros

  • Macro Automatic drawing: Allows the user to get the view of his object in a drawing with 4 different position (front,top,iso,right). Needs some modification to be perfectly effective.
  • Macro CartoucheFC: This GUI macro to fill simply all fields of the cartridge of the plan implementation worksheet FreeCAD, the format of the date and the symbol of the projection mode adapt to the EU region or US selected.
  • Macro CartoucheFC 2: This GUI macro to fill simply all fields of the cartridge model 2 of the plan implementation worksheet FreeCAD.
  • Macro CartoucheFC Full: This GUI macro to fill simply all fields of the cartridge Misc templates Full of the plan implementation worksheet FreeCAD, the format of the date and the symbol of the projection mode adapt to the EU region or US selected.
  • Macro Corner shapes wizard/update: Pops up a dialog asking for the dimensions of your corner piece, then creates the object in the document and creates a page view with top, front and lateral views of the piece.

External links


Инструментарий трассировки лучей


The Raytracing Workbench is no longer included after version 0.20.
The external Render Workbench should be used instead.
Логотип верстака Raytracing

Введение

Верстак Raytracing предназначен для создания фотореалистичной изображения ваших моделей с помощью внешних программ рендеринга.

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

В настоящее время поддерживаются два визуализатора: POV-Ray и LuxRender. Чтобы иметь возможность визуализации из FreeCAD, нужна хотя бы одна из этих программ, установленная и сконфигурированная в Вашей системе. Но даже если ни одного визуализатора не установлено, Вы можете экспортировать файл проекта для визуализации впоследствии.

Верстак Raytracing по сути устарел. Ведётся новая разработка верстака Render, который предназначен для его замены. Этот верстак полностью запрограммирован на Python, поэтому его гораздо проще расширить, чем текущий верстак, который запрограммирован на C ++. Тем не менее, информация на этой странице в целом полезна для нового верстака, так как оба модуля работают в основном одинаково.

Типивой рабочий процесс

  1. Создайте или откройте прокет FreeCAD, добавьте некоторые твердотельные объекты модулей (Part или PartDesign); сетки пока не поддерживаются.
  2. Создайте проект трассировки лучей (для povray или luxrender).
  3. Выделите объекты, которые Вы хотите добавить в проект трассировки лучей и добавьте их.
  4. Экспортируйте файл проекта или визуализируйте его напрямую.



Работа верстака Raytracing; верстак готовит файл проекта из данного шаблона, затем вызывает внешнюю программу для визуализации сцены. Внешний визуализатор может использоваться независимо от FreeCAD.

Инструменты

Инструменты проекта

Это главные инструменты для экспорта Вашей трёхмерной работы во внешние визуализаторы.

Утилиты

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

Настройки

  • Preferences: Доступные настройки для инструментов Raytracing.

Учебники

Ручное создание файла povray

Описанные выше вспомогательные инструменты позволяют экспортировать текущий трёхмерный вид и его содержимое в файл Povray. Сначала вы должны загрузить или создать данные САПР и расположить ориентацию трёхмерного вида по своему желанию. Затем выберите из меню трассировки "Вспомогательные → Экспорт вида...".

У Вас уточнят положение для сохранения итогового файла *.pov. После этого Вы можете открыть его в Povray и визуализировать:

Как обычно, в визуализаторе Вы сможете сделать большие и красивые картинки:

Программирование

Смотрите Примеры программного интерфейса Raytracing для информации о создании сцен через программирование.

Ссылки

POV-Ray

LuxRender

Рендеры, которые могут быть реализованы в будущем

Exporting to Kerkythea

Although direct export to the Kerkythea XML-File-Format is not supported yet, you can export your Objects as Mesh-Files (.obj) and then import them in Kerkythea.

  • if using Kerkythea for Linux, remember to install the WINE-Package (needed by Kerkythea for Linux to run)
  • you can convert your models with the help of the mesh workbench to meshes and then export these meshes as .obj-files
  • If your mesh-export resulted in errors (flip of normals, holes ...) you may try your luck with netfabb studio basic
Free for personal use, available for Windows, Linux and Mac OSX.
It has standard repair tools which will repair you model in most cases.
  • another good program for mesh analysing/repairing is Meshlab
Open Source, available for Windows, Linux and Mac OSX.
It has standard repair tools which will repair you model in most cases (fill holes, re-orient normals, etc.)
  • you can use "make compound" and then "make single copy" or you can fuse solids to group them before converting to meshes
  • remember to set in Kerkythea an import-factor of 0.001 for obj-modeler, since Kerkythea expects the obj-file to be in m (but standard units-scheme in FreeCAD is mm)
Within WIndows 7 64-bit Kerkythea does not seem to be able to save these settings.
So remember to do that each time you start Kerkythea
  • if importing multiple objects in Kerkythea you can use the "File → Merge" command in Kerkythea

Разработка

Эти страницы ссылаются на новую рабочую среду, запрограммированную на Python, предназначенную для замены текущей Raytracing Workbench.


Инструментарий изображений


The Image Workbench is no longer included after version 0.20.
Its functionality has been integrated in Std Base. See Std Import and Std ViewLoadImage.
Логотип верстака Image

Введение

Верстак Image обрабатывает различные типы растровых изображений, и позволяет открыть их в FreeCAD.

Инструменты

  • Open: открыть изображение в новой точке зрения.
  • Import to plane: импортировать изображение на плоскость в окне трёхмерного вида.
  • Scaling: масштабировать изображение, импортированное на плоскость.

Особенности

  • Подобно Sketch, импортированное изображение может быть присоединено к одной из главных плоскостей XY, XZ или YZ, и иметь положительное или отрицательное смещение.
  • Изображение импортируется в соотношении 1 мм на пиксель.
  • Рекомендуется импортировать изображение в разумном разрешении.

Workflow

Работа

Основное применение этого верстака в трассировке поверх изображения с помощью инструментов Draft или Sketcher, для генерации твёрдого тела на основе контуров изображения.

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

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


Инструмент 2D черчения

2d Drafting Module/ru

Сценарии и макросы

Макросы


Введение

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

Хотя сценарии Python обычно имеют расширение .py, макросы FreeCAD должны иметь расширение .FCMacro. Коллекция макросов, написанных опытными пользователями, находится на странице рецепты макросов.

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

Как это работает

Включите вывод в консоль через меню Правка → Настройки → Основные → Макрос → Показывать команды скриптов в консоли Python. Вы увидите, что в FreeCAD, каждое действие что вы совершаете, например, при нажатии кнопки, выводится как команда Python. Эти команды могут быть записаны в макрос. Основным инструментом для создания макросов является панель инструментов макросы: . На ней есть 4 кнопки: запись(record), остановка записи(stop), редактирования и воспроизведения текущего макроса(edit and play the current macro).

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

Диалог Macro, перечисляющий макросы, доступные в системе

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

Пример

Нажмите кнопку записи(record), дайте имя, скажем, "cylinder 10x10", а затем, в верстаке Part, создайте цилиндр с радиусом = 10 и высотой = 10. Затем нажмите "Остановить запись(stop)" кнопку. В диалоге редактирования макросов, вы можете увидеть Python код, который был записан, и, если вы хотите, произведите изменения в нем. Чтобы выполнить макрос, просто нажмите кнопку execute на панели инструментов, пока ваш макрос в редакторе. Ваш макрос всегда сохраняется на диске, поэтому любые изменения которые вы делаете, или каких-либо новые созданные макросы, всегда будут доступны при следующем запуске FreeCAD.

Настройка

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

Таким образом вы можете сделать ваш макрос реальным инструментом, как и любой стандартный инструмент FreeCAD. Это, приумножает власть Python сценариев в FreeCAD, позволяет с легкостью добавлять ваши собственные инструменты для интерфейса. Читайте дальше, Написание сценариев , если вы хотите знать больше о сценарияхPython.

Смотрите Настройка панелей инструментов для более подробного описания.

Создание макросов без записи

Вы также можете непосредственно копировать/вставлять Python код в макрос, без записи GUI действий. Просто создайте новый макрос, редактируйте его и вставьте код. Затем можно сохранить макрос так же, как вы сохраняете документ FreeCAD. При следующем запуске FreeCAD, макрос появится в пункте меню "Installed Macros".

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

Хранилище макросов

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

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

Учебники

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


Введение в Python

Introduction to python/ru


Написание сценариев Python в FreeCAD

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

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

Интерпретатор

В интерпретаторе вы можете получить доступ к установленным в вашей системе модулям Python, а также встроенным модулям FreeCAD, и всем дополнительным модулям FreeCAD что вы установите позже. Скриншот ниже показывает интерпретатор Python:

The FreeCAD Python interpreter

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

The FreeCAD class browser

Таким образом, сначало наберите App. или Gui. посмотрите, что происходит. Другой, более общий Python метод изучения содержимого модулей и классов является использование команды print(dir()). Например, ввод print(dir()) выведет список всех модулей, загруженных в FreeCAD. print(dir(App)) покажет вам все, что содержит App модуль и т.д.

Еще одна полезная особенность интерпритатора возможность вернуться назад по истории команд и извлечь строки кода, которые вы уже набрали ранее. Для перемещения по истории команд, просто используйте Up arrow или Down arrow.

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

наверх

Python Help

В меню Справка, вы найдете раздел Автоматически сгенерированная документация python, при открытии которого откроется окно браузера, содержащего полную, создаваемую в реальном времени, документацию всех модулей Python, доступных в интерпретаторе FreeCAD, встроенных модулях Python и FreeCAD, установленных в систему модулей и дополнительные модулей FreeCAD. Доступна ли документация зависит от того, сколько усилий разработчик каждого модуля приложил к документированию своего кода, но, как правило Python модули имеют репутацию хорошо задокументированных. Ваше окно FreeCAD должно оставаться открытым для того чтобы система документации работала. В разделе Документация по созданию скриптов на Python находится ссылка на этот вики-раздел Power users hub.

наверх

Встроеные модули

Поскольку FreeCAD спроектирован с возможностью запуска без графического интерфейса пользователя (Graphical User Interface, GUI), почти все функциональные возможности разделены на две группы: Базовая функциональности, названные App, и функциональность интерфейса, названный Gui. Эти два модуля можно также подключить из сценариев, вне интерпретатора, под названиями FreeCAD и FreeCADGui соответственно.

  • В модуле App вы найдете все, связанное с самим приложением, такие методы как открытия или закрытия файлов, а также документов, как настройка активного документа или объявление его содержания.
  • В модуле Gui вы найдете инструменты для доступа и управления элементами графического интерфейса, такими как инструментарии и и их панели инструментов, и, что более интересно, графическое представление всего содержимого FreeCAD.

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

наверх

Объекты модулей App и Gui

Как мы уже говорили, в FreeCAD, всё разделенные между основным и представлением. Это подразумевает и 3D-объекты. Вы можете получить доступ определяющим свойствам объектов (одна из особенностей FreeCAD) с помощью модуля App, и изменить то, как они представлены на экране с помощью модуля Gui. Например, куб имеет свойства, которые определяют его, такие как ширина, длина, высота, они хранятся в объекте App, а свойства представления, такие как цвета граней, режим отрисовки, хранятся в соответствующем объекте Gui.

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

Для каждого объекта App в вашем документе существует соответствующий объект Gui. Фактически и сам документ содержит объекты App и Gui. Это, конечно, действует только при запуске FreeCAD с полным интерфейсом. В режиме командной строки графического интерфейса нет, так что доступны только объекты App. Обратите внимание, что часть объектов Gui создается снова каждый раз когда объект App отмечен как "подлежащий пересчёту" (например, когда один из его параметров изменился), поэтому изменения, которые вы могли сделать непосредственно на объекте Gui могут быть потеряны.

чтобы получить доступ к части App чего-либо, введите:

myObject = App.ActiveDocument.getObject("ObjectName")

где "ObjectName" это имя вашего объекта. Вы также можете ввести:

myObject = App.ActiveDocument.ObjectName

чтобы получить доступ к части Gui того же объекта, введите:

myViewObject = Gui.ActiveDocument.getObject("ObjectName")

где "ObjectName" - имя вашего объекта. Вы также можете ввести:

myViewObject = App.ActiveDocument.ObjectName.ViewObject

Если мы находимся в режиме командной строки и графического интерфейса нет, последняя строка вернет None.

наверх

Объекты документа

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

Чтобы получить доступ к части App текущего открытого (активного) документа, введите:

myDocument = App.ActiveDocument

Чтобы создать новый документ, введите:

myDocument = App.newDocument("Document Name")

Чтобы получить доступ к части Gui текущего открытого (активного) документа, введите:

myGuiDocument = Gui.ActiveDocument

чтобы получить доступ к текущему виду, введите:

myView = Gui.ActiveDocument.ActiveView

наверх

Использование дополнительных модулей

Модули FreeCAD и FreeCADGui отвечают за создание и управление объектами в документе FreeCAD. Они не занимаются созданием или изменением геометрии. Это потому, что эта геометрия может быть нескольких типов, и поэтому она управляется дополнительными модулями, каждый из которых отвечает за управление определенным типом геометрии. Например, Модуль Part использует ядро OpenCascade и поэтому может создавать и манипулировать геометрией типа B-rep. В то же время Модуль Mesh может создавать и модифицировать объекты типа сетка. Таким образом, FreeCAD может обрабатывать самые разные типы объектов, которые могут сосуществовать в одном документе, и новые типы могут быть легко добавлены в будущем.

наверх

Создание объектов

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

FreeCAD.ActiveDocument.supportedTypes()

перечислит все возможные объекты, которые вы можете создать. Например, давайте создадим сетку (поддерживаемую модулем Mesh) и деталь (поддерживаемую модулем Part):

myMesh = FreeCAD.ActiveDocument.addObject("Mesh::Feature", "myMeshName")
myPart = FreeCAD.ActiveDocument.addObject("Part::Feature", "myPartName")

Первый аргумент - это тип объекта, второй - имя объекта. Наши два объекта выглядят почти одинаково: они еще не содержат никакой геометрии, и большинство их свойств одинаковы, когда вы проверяете их с помощью dir(myMesh) и dir(myPart). За исключением одного, myMesh имеет свойство Mesh, а myPart - свойство Shape. Здесь хранятся данные Mesh и Part. Например, давайте создадим куб Part и сохраним его в нашем объекте myPart:

import Part
cube = Part.makeBox(2, 2, 2)
myPart.Shape = cube

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

import Part
cube = Part.makeBox(2, 2, 2)
Part.show(cube)

наверх

Изменение объектов

Модификация объекта выполняется так же:

import Part
cube = Part.makeBox(2, 2, 2)
myPart.Shape = cube

Теперь давайте изменим форму на большую:

biggercube = Part.makeBox(5, 5, 5)
myPart.Shape = biggercube

наверх

Запрос объектов

Вы всегда можете посмотреть на тип объекта следующим образом:

myObj = FreeCAD.ActiveDocument.getObject("myObjectName")
print(myObj.TypeId)

или проверить, является ли объект производным от одного из базовых объектов (элемент детали, элемент сетки и т.д.):

print(myObj.isDerivedFrom("Part::Feature"))

Теперь вы действительно можете начать играть с FreeCAD! Насчёт полного списка всех доступных модулей и доступных инструментов смотрите в разделе Category:API.

наверх


Введение

Чтобы получить доступ к модулю Mesh, вы должны сначала импортировать его:

import Mesh

Создание

Чтобы создать пустой объект сетки, просто используйте стандартный конструктор:

mesh = Mesh.Mesh()

Вы также можете создать объект из файла:

mesh = Mesh.Mesh("D:/temp/Something.stl")

Или создайте его из множества треугольников, задав их вершины:

triangles = [
# triangle 1
[-0.5000, -0.5000, 0.0000], [0.5000, 0.5000, 0.0000], [-0.5000, 0.5000, 0.0000],
#triangle 2
[-0.5000, -0.5000, 0.0000], [0.5000, -0.5000, 0.0000], [0.5000, 0.5000, 0.0000],
]
meshObject = Mesh.Mesh(triangles)
Mesh.show(meshObject)

Ядро Mesh заботится о создании топологического правильной структуры данных, сортируя совпадающие точки и края.

наверх

Моделирование

Для создания правильной геометрии вы можете использовать один из методов create*(). Например, тор можно создать следующим образом:

m = Mesh.createTorus(8.0, 2.0, 50)
Mesh.show(m)

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

Модуль Mesh также предоставляет три булевых метода: union(), intersection() и difference():

m1, m2              # are the input mesh objects
m3 = Mesh.Mesh(m1)  # create a copy of m1
m3.unite(m2)        # union of m1 and m2, the result is stored in m3
m4 = Mesh.Mesh(m1)
m4.intersect(m2)    # intersection of m1 and m2
m5 = Mesh.Mesh(m1)
m5.difference(m2)   # the difference of m1 and m2
m6 = Mesh.Mesh(m2)
m6.difference(m1)   # the difference of m2 and m1, usually the result is different to m5

Вот пример, который создает трубку, используя метод difference():

import FreeCAD, Mesh
cylA = Mesh.createCylinder(2.0, 10.0, True, 1.0, 36)
cylB = Mesh.createCylinder(1.0, 12.0, True, 1.0, 36)
cylB.Placement.Base = (FreeCAD.Vector(-1, 0, 0)) # move cylB to avoid co-planar faces
pipe = cylA
pipe = pipe.difference(cylB)
pipe.flipNormals() # somehow required
doc = FreeCAD.ActiveDocument
obj = d.addObject("Mesh::Feature", "Pipe")
obj.Mesh = pipe
doc.recompute()

наверх

Примечания

Широко применяемый, хотя и трудный в использовании, источник скриптов обработки полигональных сеток - это тестовые скрипты в модуле Mesh. В этих тестах модуля буквально все методы вызываются и все свойства/атрибуты перебираются. Так что если вы достаточно смелы, взгляните на Unit Test module.

Смотрите так же: Mesh API.

наверх


Введение

Здесь мы объясним вам, как управлять верстаком Part непосредственно из интерпретатора Python FreeCAD или из любого внешнего сценария. Основы создания сценариев топологических данных описаны в объяснение концепции модуля Part. Обязательно просмотрите раздел Scripting и страницы Основы скриптинга FreeCAD, если вам нужна дополнительная информация о том, как работает python-скриптинг во FreeCAD .

Смотрите также

Диаграмма классов

Это обзор наиболее важных классов модуля Part через Unified Modeling Language (UML):

Классы Python, содержащиеся в модуле Part
Классы Python, содержащиеся в модуле Part

наверх

Геометрия

Геометрические объекты являются строительными блоками для всех топологических объектов:

  • Geom Базовый класс геометрических объектов.
  • Line Прямая линия в 3D, задается начальной и конечной точкой.
  • Circle Окружность или дуга задается центром, начальной и конечной точкой.
  • и так далее...

наверх

Топология

Доступны нижеследующие топологические типы данных:

  • COMPOUND Группа из топологических объектов любого типа.
  • COMPSOLID Составное твердое тело, как набор твердых тел соединенными гранями. Он расширяет понятие Ломаной кривой(WIRE) и оболочки(SHELL) для твердых тел.
  • SOLID Часть пространства ограниченная оболочкой. Она трехмерная.
  • SHELL Набор граней соединенных между собой через ребра. Оболочки могут быть открытыми или закрытыми.
  • FACE В 2D это часть плоскости; в 3D это часть поверхности. Это геометрия ограничена (обрезана) по контурам. Она двухмерная.
  • WIRE Набор ребер соединенных через вершины. Он может быть как открытым, так и закрытым в зависимости от того связаны ли крайние ребра или нет.
  • EDGE Топологический элемент соответствующий ограниченной кривой. Ребро как правило ограничивается вершинами. Оно одномерное.
  • VERTEX Топологический элемент соответствующий точке. Обладает нулевой размерность.
  • SHAPE общий термин охватывающий все выше сказанное.

наверх

Примеры: Создание простейшей топологии

Wire

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

наверх

Создание геометрии

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

Итак, сначала мы создаем точки:

import FreeCAD as App
import Part
V1 = App.Vector(0, 10, 0)
V2 = App.Vector(30, 10, 0)
V3 = App.Vector(30, -10, 0)
V4 = App.Vector(0, -10, 0)

наверх

Дуга

Circle


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

VC1 = App.Vector(-10, 0, 0)
C1 = Part.Arc(V1, VC1, V4)
VC2 = App.Vector(40, 0, 0)
C2 = Part.Arc(V2, VC2, V3)

наверх

Линия

Line


Сегменты линии могут быть созданы из двух точек:

L1 = Part.LineSegment(V1, V2)
L2 = Part.LineSegment(V3, V4)

наверх

Соединяем все вместе

Последний шаг - собираем все основные геометрические элементы вместе и получаем форму:

S1 = Part.Shape([C1, L1, C2, L2])

наверх

Создание призмы

Теперь вытягиваем ломанную по направлению и фактически получаем 3D форму:

W = Part.Wire(S1.Edges)
P = W.extrude(App.Vector(0, 0, 10))

наверх

Показать всё

Part.show(P)

наверх

Создание простых фигур

Вы легко можете создавать простые топологические объекты с помощью методов make...() содержащихся в модуле Part:

b = Part.makeBox(100, 100, 100)
Part.show(b)

Доступные make...() методы:

  • makeBox(l,w,h,[p,d]) : создает прямоугольник, с началом в точке p и вытянутый в направлении d с размерами (l,w,h) По умолчанию p установлен как Vector(0,0,0) и d установлен как Vector(0,0,1)
  • makeCircle(radius,[p,d,angle1,angle2]) -- Создает окружность с заданным радиусом. По умолчанию p=Vector(0,0,0), d=Vector(0,0,1), angle1=0 и angle2=360
  • makeCone(radius1,radius2,height,[p,d,angle]) -- Создает конус с заданным радиусами и высотой. По умолчанию p=Vector(0,0,0), d=Vector(0,0,1) и angle=360
  • makeCylinder(radius,height,[p,d,angle]) -- Создает цилиндр с заданным радиусом и высотой. По умолчанию p=Vector(0,0,0), d=Vector(0,0,1) и angle=360
  • makeLine((x1,y1,z1),(x2,y2,z2)) -- Создает линию проходящую через две точки
  • makePlane(length,width,[p,d]) -- Создает плоскость с заданной длинной и шириной. По умолчанию p=Vector(0,0,0) и d=Vector(0,0,1)
  • makePolygon(list) -- Создает многоугольник из списка точек
  • makeSphere(radius,[p,d,angle1,angle2,angle3]) -- Создает сферу с заданным радиусом. По умолчанию p=Vector(0,0,0), d=Vector(0,0,1), angle1=0, angle2=90 и angle3=360
  • makeTorus(radius1,radius2,[p,d,angle1,angle2,angle3]) -- Создает тор по заданными радиусам.По умолчанию p=Vector(0,0,0), d=Vector(0,0,1), angle1=0, angle2=360 и angle3=360

На странице Part API приведен полный список доступных методов модуля Part.

наверх

Импорт необходимых модулей

В начале нам нужно импортировать модуль Part, чтобы мы могли использовать его содержимое в Python. Также импортируем модуль Base из модуля FreeCAD:

import FreeCAD as App
import Part

наверх

Создание вектора

Векторы являются одними из самых важных частей информации при построении фигур. Они обычно содержат три числа (но не всегда): декартовы координаты x, y и z. Для создания вектора введите:

myVector = App.Vector(3, 2, 0)

Мы только что создали вектор с координатами x = 3, y = 2, z = 0. В модуле Part векторы используются повсеместно. Формы детали также используют другой тип представления точек, называемый Vertex, который является просто контейнером для вектора. Вы можете получить доступ к вектору вершины следующим образом:

myVertex = myShape.Vertexes[0]
print(myVertex.Point)
> Vector (3, 2, 0)

наверх

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

Ребра это не что иное, как линия с двумя вершинами:

edge = Part.makeLine((0, 0, 0), (10, 0, 0))
edge.Vertexes
> [<Vertex object at 01877430>, <Vertex object at 014888E0>]

Примечание: Вы можете создать ребро передав два вектора.

vec1 = App.Vector(0, 0, 0)
vec2 = App.Vector(10, 0, 0)
line = Part.LineSegment(vec1, vec2)
edge = line.toShape()

Вы можете узнать длину и центр ребра, вот так:

edge.Length
> 10.0
edge.CenterOfMass
> Vector (5, 0, 0)

наверх

Вывод фигуры на экран

До сих пор мы создали объект ребро, но не увидели его на экране. Это связано с тем, что 3D-сцена FreeCAD отображает только то, что указано для отображения. Для этого мы используем этот простой метод:

Part.show(edge)

Функция show создает объект "shape" в нашем FreeCAD документе. Используйте это всякий раз, когда пришло время показать свое творение на экране.

наверх

Создание ломанной кривой

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

edge1 = Part.makeLine((0, 0, 0), (10, 0, 0))
edge2 = Part.makeLine((10, 0, 0), (10, 10, 0))
wire1 = Part.Wire([edge1, edge2]) 
edge3 = Part.makeLine((10, 10, 0), (0, 10, 0))
edge4 = Part.makeLine((0, 10, 0), (0, 0, 0))
wire2 = Part.Wire([edge3, edge4])
wire3 = Part.Wire([wire1, wire2])
wire3.Edges
> [<Edge object at 016695F8>, <Edge object at 0197AED8>, <Edge object at 01828B20>, <Edge object at 0190A788>]
Part.show(wire3)

Part.show(wire3) пакажет 4 ребра, из которых состоит наша ломаная линяи. Другая полезная информация может быть легко найдена:

wire3.Length
> 40.0
wire3.CenterOfMass
> Vector (5, 5, 0)
wire3.isClosed()
> True
wire2.isClosed()
> False

наверх

Создание грани

Только грани, созданные из замкнутых ломаных, будут действительными. В этом примере wire3 является замкнутой ломаной, но wire2 не является замкнутым (см. выше)

face = Part.Face(wire3)
face.Area
> 99.99999999999999
face.CenterOfMass
> Vector (5, 5, 0)
face.Length
> 40.0
face.isValid()
> True
sface = Part.Face(wire2)
sface.isValid()
> False

Только грани имеют поверхность, а ломанные и ребра нет.

наверх

Создание окружности

Окружность может быть создана, например так:

circle = Part.makeCircle(10)
circle.Curve
> Circle (Radius : 10, Position : (0, 0, 0), Direction : (0, 0, 1))

Если вы хотите создать её с определенным положением и в определенном направлении

ccircle = Part.makeCircle(10, App.Vector(10, 0, 0), App.Vector(1, 0, 0))
ccircle.Curve
> Circle (Radius : 10, Position : (10, 0, 0), Direction : (1, 0, 0))

ccircle будет создана на расстоянии 10 от начала координат x и будет направлена вдоль оси x. Примечание: makeCircle принимает только тип Base.Vector() в качестве позиции и нормали. Вы также можете создать часть окружности, задав начальный и конечный угол:

from math import pi
arc1 = Part.makeCircle(10, App.Vector(0, 0, 0), App.Vector(0, 0, 1), 0, 180)
arc2 = Part.makeCircle(10, App.Vector(0, 0, 0), App.Vector(0, 0, 1), 180, 360)

Обе arc1 и arc2 вместе составляют окружность. Углы задаются в градусах, если вы хотите задать радианами, просто преобразуйте используя формулу: degrees = radians * 180/PI или используя math модуль python-а (прежде, конечно, выполнив import math): degrees = math.degrees(radians)

import math
degrees = math.degrees(radians)

наверх

Создать дугу по точкам

К сожалению нет функции makeArc, но у нас есть функция Part.Arc для создания дуги через три точки. Она создает объект дуги, соединяющий начальную точку с конечной точкой через среднюю точку. Функция .toShape() объекта дуги должна вызываться для получения объекта ребра, так же, как при использовании Part.LineSegment вместо Part.makeLine.

arc = Part.Arc(App.Vector(0, 0, 0), App.Vector(0, 5, 0), App.Vector(5, 5, 0))
arc
> <Arc object>
arc_edge = arc.toShape()
Part.show(arc_edge)

Arc принимает только Base.Vector() для точек. arc_edge - это то, что нам нужно, и мы можем отобразить его с помощью Part.show(arc_edge). Вы также можете получить дугу, используя часть круга:

from math import pi
circle = Part.Circle(App.Vector(0, 0, 0), App.Vector(0, 0, 1), 10)
arc = Part.Arc(circle,0,pi)

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

наверх

Создать многоугольник (полигон)

Линия по нескольким точкам, не что иное как создание ломаной с множеством ребер. функция makePolygon берет список точек и создает ломанную по этим точкам:

lshape_wire = Part.makePolygon([App.Vector(0, 5, 0), App.Vector(0, 0, 0), App.Vector(5, 0, 0)])

наверх

Создание кривой Безье

Кривые Безье используются для моделирования гладких кривых с использованием ряда полюсов (точек) и необязательных весов. Функция ниже делает Part.BezierCurve из ряда точек FreeCAD.Vector. (Примечание: при «получении» и «установке» одного полюса или веса индексы начинаются с 1, а не с 0.)

def makeBCurveEdge(Points):
   geomCurve = Part.BezierCurve()
   geomCurve.setPoles(Points)
   edge = Part.Edge(geomCurve)
   return(edge)

наверх

Создание плоскости

Плоскость это ровная поверхность, в смысле 2D грань. Метод создания её это makePlane(length,width,[start_pnt,dir_normal]). По умолчанию start_pnt=Vector(0,0,0) и dir_normal=Vector(0,0,1). Используя dir_normal = Vector(0,0,1) создаёт плоскость, обращённую к положительному направлению оси z, в то время как dir_normal=Vector(1,0,0) создаёт плоскость обращённую к положительному направлению оси х:

plane = Part.makePlane(2, 2)
plane
> <Face object at 028AF990>
plane = Part.makePlane(2, 2, App.Vector(3, 0, 0), App.Vector(0, 1, 0))
plane.BoundBox
> BoundBox (3, 0, 0, 5, 0, 2)

BoundBox является параллелепипед вмещающих плоскость с диагональю, начиная с (3,0,0) и концом в (5,0,2). Здесь толщина BoundBoxпо оси y равна нулю, поскольку его форма полностью плоская.

Примечание: makePlane доступны только Base.Vector() для задания start_pnt и dir_normal а не кортежи

наверх

Создание эллипса

Эллипс можно создать несколькими способами:

Part.Ellipse()

Создает эллипс с большой полуосью 2 и малой полуосью 1 с центром в (0,0,0)

Part.Ellipse(Ellipse)

Создает копию данного эллипса.

Part.Ellipse(S1, S2, Center)

Создаст эллипс с центров точке Center, где плоскость эллипса определяет Center, S1 и S2, это большая ось ззаданная Center и S1, это больший радиус расстояние между Center и S1, и меньший радиус это расстояние между S2 и юольшей осью.

Part.Ellipse(Center, MajorRadius, MinorRadius)

Создает эллипс с большим и меньшим радиусом MajorRadius и MinorRadius, расположенными в плоскости заданной точкой Center и нормалью (0,0,1)

eli = Part.Ellipse(App.Vector(10, 0, 0), App.Vector(0, 5, 0), App.Vector(0, 0, 0))
Part.show(eli.toShape())

В приведенном выше коде мы ввели S1, S2 и center. Аналогично Дуге, Эллипс также создает объект, а не ребро, так что мы должны превратить его в ребро используя toShape() для отображения

Примечание: Дуга допускает только Base.Vector() для задания точек, а не кортеж.

eli = Part.Ellipse(App.Vector(0, 0, 0), 10, 5)
Part.show(eli.toShape())

для вышеуказанного конструктора Ellipse мы передали center, MajorRadius и MinorRadius.

наверх

Создание тора

Используя makeTorus(radius1,radius2,[pnt,dir,angle1,angle2,angle]). По умолчанию pnt=Vector(0,0,0), dir=Vector(0,0,1), angle1=0,angle2=360 и angle=360

Рассмотрим тор как маленький круг, вытянутый вдоль большого круга. Radius1 это радиус большого круга, radius2 это радиус малого круга, pnt это центр тора и dir это направление нормали. angle1 и angle2 углы в радианах для малого круга, последний параметр angle для создания секцию (части) тора:

torus = Part.makeTorus(10, 2)

В коде выше, был создан тор с диаметром 20 (радиус 10) и толщиной 4 (малая окружность радиусом 2)

tor=Part.makeTorus(10, 5, App.Vector(0, 0, 0), App.Vector(0, 0, 1), 0, 180)

В приведенном выше коде, создан кусочек тора.

tor=Part.makeTorus(10, 5, App.Vector(0, 0, 0), App.Vector(0, 0, 1), 0, 360, 180)

В приведенном выше коде, создан полу-тор, изменен только последний параметр. Т.е. angle а остальные углы установлены по умолчанию. Подстановка угла 180 создаст тор от 0 до 180, т.е. половину тора.

наверх

Создание параллелепипеда или кубоида

Используя makeBox(length,width,height,[pnt,dir]), создаем блок расположенный в pnt с размерами (length,width,height). По умолчанию pnt=Vector(0,0,0) и dir=Vector(0,0,1).

box = Part.makeBox(10, 10, 10)
len(box.Vertexes)
> 8

наверх

Создание сферы

Используя makeSphere(radius,[pnt, dir, angle1,angle2,angle3]). По умолчанию pnt=Vector(0,0,0), dir=Vector(0,0,1), angle1=-90, angle2=90 и angle3=360. angle1 и angle2 это вертикальный минимум и максимум сферы (срезает часть сферы снизу или сверху), angle3 is the sphere diameter (определяет замкнутое ли это тело вращения или его секция).

sphere = Part.makeSphere(10)
hemisphere = Part.makeSphere(10, App.Vector(0, 0, 0), App.Vector(0, 0, 1), -90, 90, 180)

наверх

Создание цилиндра

Используя makeCylinder(radius,height,[pnt,dir,angle]), создается цилиндр с указанным радиусом и высотой. По умолчанию pnt=Vector(0,0,0),dir=Vector(0,0,1) и angle=360.
cylinder = Part.makeCylinder(5, 20)
partCylinder = Part.makeCylinder(5, 20, App.Vector(20, 0, 0), App.Vector(0, 0, 1), 180)

наверх

Cоздание конуса

Используя makeCone(radius1,radius2,height,[pnt,dir,angle]), создаем конус с указанными радиусами и высотой. По умолчанию pnt=Vector(0,0,0), dir=Vector(0,0,1) и angle=360.

cone = Part.makeCone(10, 0, 20)
semicone = Part.makeCone(10, 0, 20, App.Vector(20, 0, 0), App.Vector(0, 0, 1), 180)

наверх

Modify shapes

There are several ways to modify shapes. Some are simple transformation operations such as moving or rotating shapes, others are more complex, such as unioning and subtracting one shape from another.

наверх

Transform operations

Translate a shape

Translating is the act of moving a shape from one place to another. Any shape (edge, face, cube, etc...) can be translated the same way:

myShape = Part.makeBox(2, 2, 2)
myShape.translate(App.Vector(2, 0, 0))

This will move our shape "myShape" 2 units in the X direction.

наверх

Rotate a shape

To rotate a shape, you need to specify the rotation center, the axis, and the rotation angle:

myShape.rotate(App.Vector(0, 0, 0),App.Vector(0, 0, 1), 180)

The above code will rotate the shape 180 degrees around the Z Axis.

наверх

Matrix transformations

A matrix is a very convenient way to store transformations in the 3D world. In a single matrix, you can set translation, rotation and scaling values to be applied to an object. For example:

myMat = App.Matrix()
myMat.move(App.Vector(2, 0, 0))
myMat.rotateZ(math.pi/2)

Note: FreeCAD matrixes work in radians. Also, almost all matrix operations that take a vector can also take three numbers, so these two lines do the same thing:

myMat.move(2, 0, 0)
myMat.move(App.Vector(2, 0, 0))

Once our matrix is set, we can apply it to our shape. FreeCAD provides two methods for doing that: transformShape() and transformGeometry(). The difference is that with the first one, you are sure that no deformations will occur (see Scaling a shape below). We can apply our transformation like this:

myShape.transformShape(myMat)

или

myShape.transformGeometry(myMat)

наверх

Scale a shape

Scaling a shape is a more dangerous operation because, unlike translation or rotation, scaling non-uniformly (with different values for X, Y and Z) can modify the structure of the shape. For example, scaling a circle with a higher value horizontally than vertically will transform it into an ellipse, which behaves mathematically very differently. For scaling, we cannot use the transformShape(), we must use transformGeometry():

myMat = App.Matrix()
myMat.scale(2, 1, 1)
myShape=myShape.transformGeometry(myMat)

наверх

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

Как вырезать одну форму из других?

cut(...) - Вычисление различий задано в топологическом классе shape.

Subtracting a shape from another one is called "cut" in FreeCAD and is done like this:

cylinder = Part.makeCylinder(3, 10, App.Vector(0, 0, 0), App.Vector(1, 0, 0))
sphere = Part.makeSphere(5, App.Vector(5, 0, 0))
diff = cylinder.cut(sphere)

наверх

Как получить пересечение двух форм?

Тем же способом, пересечение между двумя фигурами называется "common(...)" (пересечение задано в топологическом классе shape) и делается так:

The same way, the intersection between two shapes is called "common" and is done this way:

cylinder1 = Part.makeCylinder(3, 10, App.Vector(0, 0, 0), App.Vector(1, 0, 0))
cylinder2 = Part.makeCylinder(3, 10, App.Vector(5, 0, -5), App.Vector(0, 0, 1))
common = cylinder1.common(cylinder2)

наверх

Как объединить две формы?

fuse(...) - Объединение задано в топологическом классе shape

Union is called "fuse" and works the same way:

cylinder1 = Part.makeCylinder(3, 10, App.Vector(0, 0, 0), App.Vector(1, 0, 0))
cylinder2 = Part.makeCylinder(3, 10, App.Vector(5, 0, -5), App.Vector(0, 0, 1))
fuse = cylinder1.fuse(cylinder2)

наверх

Как получить сечение тела и заданной формы?

Section это пересечение твердого тела и плоской фигуры (сечение задано в топологическом классе shape). Вернет секущую кривую, составную кривую, состоящую из ребер.

A "section" is the intersection between a solid shape and a plane shape. It will return an intersection curve, a compound curve composed of edges.

cylinder1 = Part.makeCylinder(3, 10, App.Vector(0, 0, 0), App.Vector(1, 0, 0))
cylinder2 = Part.makeCylinder(3, 10, App.Vector(5, 0, -5), App.Vector(0, 0, 1))
section = cylinder1.section(cylinder2)
section.Wires
> []
section.Edges
> [<Edge object at 0D87CFE8>, <Edge object at 019564F8>, <Edge object at 0D998458>, 
 <Edge  object at 0D86DE18>, <Edge object at 0D9B8E80>, <Edge object at 012A3640>, 
 <Edge object at 0D8F4BB0>]

наверх

Выдавливание

Выдавливание - это процесс «выпячивания» плоской фигуры в определенном направлении, становящейся твердым телом. Представьте, как «выпячивание» круга сделало его трубой:

Extrusion is the act of "pushing" a flat shape in a certain direction, resulting in a solid body. Think of a circle becoming a tube by "pushing it out":

circle = Part.makeCircle(10)
tube = circle.extrude(App.Vector(0, 0, 2))

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

wire = Part.Wire(circle)
disc = Part.Face(wire)
cylinder = disc.extrude(App.Vector(0, 0, 2))

наверх

Исследование Форм

Вы легко можете исследовать структуру топологических данных:

You can easily explore the topological data structure:

import Part
b = Part.makeBox(100, 100, 100)
b.Wires
w = b.Wires[0]
w
w.Wires
w.Vertexes
Part.show(w)
w.Edges
e = w.Edges[0]
e.Vertexes
v = e.Vertexes[0]
v.Point

Если ввести строчку выше в интерпретатор python , вы получите хорошее представление об устройстве объектов Part. Здесь наша команда makeBox() создает твердое тело. Это тело, как и все тела Part, содержит грани. Грани всегда содержат ломанные, которые являются набором ребер ограничивающих грань. Каждая грань обладает минимум одной замкнутой ломаной (может больше, если есть отверстие). В ломанной мы можем посмотреть на каждое ребро отдельно, и по краям каждого ребра мы можем увидеть вершины. Прямые ребра обладают только двумя вершинами, разумеется. Вершины модуля Part являются формами OCC(OpenCascade), но они обладают атрибутом Point, который возвращает вектор FreeCAD.

наверх

Исследование Рёбер

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

In case of an edge, which is an arbitrary curve, it's most likely you want to do a discretization. In FreeCAD the edges are parametrized by their lengths. That means you can walk an edge/curve by its length:

import Part
box = Part.makeBox(100, 100, 100)
anEdge = box.Edges[0]
print(anEdge.Length)

Теперь вы получить доступ ко всем свойствам ребра, с помощью длинны или позиции. Это означает, что у ребра в 100mm длинной, начальная позиция это 0 а конечная это 100.

anEdge.tangentAt(0.0)          # tangent direction at the beginning
anEdge.valueAt(0.0)            # Point at the beginning
anEdge.valueAt(100.0)          # Point at the end of the edge
anEdge.derivative1At(50.0)     # first derivative of the curve in the middle
anEdge.derivative2At(50.0)     # second derivative of the curve in the middle
anEdge.derivative3At(50.0)     # third derivative of the curve in the middle
anEdge.centerOfCurvatureAt(50) # center of the curvature for that position
anEdge.curvatureAt(50.0)       # the curvature
anEdge.normalAt(50)            # normal vector at that position (if defined)

наверх

Использование выделения(выбора)

Здесь мы увидим как можно использовать "выделение", которое пользователь сделал в программе просмотра. прежде всего мы создадим блок и отобразим его в окне просмотра.

Here we see now how we can use a selection the user did in the viewer. First of all we create a box and show it in the viewer.

import Part
Part.show(Part.makeBox(100, 100, 100))
Gui.SendMsgToActiveView("ViewFit")

Теперь выберем грани или ребра. С помощью этого сценария вы можете повторить по всем выделенным объектам и их субэлементам:

for o in Gui.Selection.getSelectionEx():
    print(o.ObjectName)
    for s in o.SubElementNames:
        print("name: ", s)
        for s in o.SubObjects:
            print("object: ", s)

Выделим несколько ребер и этот сценарий подсчитает их сумарную длину:

length = 0.0
for o in Gui.Selection.getSelectionEx():
    for s in o.SubObjects:
        length += s.Length

print("Length of the selected edges: ", length)

наверх

Полный пример: бутыль OCC

Типовой пример, взятый на OpenCasCade Technology Tutorial - это как построить бутыль. Это отличный пример и для FreeCAD. В самом деле, если последуете нашему примеру изложенному ниже и странице OCC одновременно, вы лучше поймете как структуры OCC реализованы в FreeCAD. Готовый сценарий описанный ниже, также включен в установленный FreeCAD (в папке Mod/Part) и может быть вызван интерпретатором python, вводом:

A typical example found on the OpenCasCade Technology website is how to build a bottle. This is a good exercise for FreeCAD too. In fact, if you follow our example below and the OCC page simultaneously, you will see how well OCC structures are implemented in FreeCAD. The script is included in the FreeCAD installation (inside the Mod/Part folder) and can be called from the Python interpreter by typing:

import Part
import MakeBottle
bottle = MakeBottle.makeBottle()
Part.show(bottle)

наверх

Готовый сценарий

Здесь представлен готовый сценарий MakeBottle:

For the purpose of this tutorial we will consider a reduced version of the script. In this version the bottle will not be hollowed out, and the neck of the bottle will not be threaded.

import FreeCAD as App
import Part, math

def makeBottleTut(myWidth = 50.0, myHeight = 70.0, myThickness = 30.0):
    aPnt1=App.Vector(-myWidth / 2., 0, 0)
    aPnt2=App.Vector(-myWidth / 2., -myThickness / 4., 0)
    aPnt3=App.Vector(0, -myThickness / 2., 0)
    aPnt4=App.Vector(myWidth / 2., -myThickness / 4., 0)
    aPnt5=App.Vector(myWidth / 2., 0, 0)

    aArcOfCircle = Part.Arc(aPnt2, aPnt3, aPnt4)
    aSegment1=Part.LineSegment(aPnt1, aPnt2)
    aSegment2=Part.LineSegment(aPnt4, aPnt5)

    aEdge1=aSegment1.toShape()
    aEdge2=aArcOfCircle.toShape()
    aEdge3=aSegment2.toShape()
    aWire=Part.Wire([aEdge1, aEdge2, aEdge3])

    aTrsf=App.Matrix()
    aTrsf.rotateZ(math.pi) # rotate around the z-axis

    aMirroredWire=aWire.copy()
    aMirroredWire.transformShape(aTrsf)
    myWireProfile=Part.Wire([aWire, aMirroredWire])

    myFaceProfile=Part.Face(myWireProfile)
    aPrismVec=App.Vector(0, 0, myHeight)
    myBody=myFaceProfile.extrude(aPrismVec)

    myBody=myBody.makeFillet(myThickness / 12.0, myBody.Edges)

    neckLocation=App.Vector(0, 0, myHeight)
    neckNormal=App.Vector(0, 0, 1)

    myNeckRadius = myThickness / 4.
    myNeckHeight = myHeight / 10.
    myNeck = Part.makeCylinder(myNeckRadius, myNeckHeight, neckLocation, neckNormal)
    myBody = myBody.fuse(myNeck)

    return myBody

el = makeBottleTut()
Part.show(el)

наверх

Подробные объяснения

import FreeCAD as App
import Part, math

Нам, конечно, необходимы модуль Part, а также модуль FreeCAD.Base, который содержит основные структуры FreeCAD, такие как векторы и матрицы.

def makeBottleTut(myWidth = 50.0, myHeight = 70.0, myThickness = 30.0):
    aPnt1=App.Vector(-myWidth / 2., 0, 0)
    aPnt2=App.Vector(-myWidth / 2., -myThickness / 4., 0)
    aPnt3=App.Vector(0, -myThickness / 2., 0)
    aPnt4=App.Vector(myWidth / 2., -myThickness / 4., 0)
    aPnt5=App.Vector(myWidth / 2., 0, 0)

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

...
    aArcOfCircle = Part.Arc(aPnt2, aPnt3, aPnt4)
    aSegment1=Part.LineSegment(aPnt1, aPnt2)
    aSegment2=Part.LineSegment(aPnt4, aPnt5)

Здесь мы задаём геометрию: дугу, созданую по 3 точкам, и два линейных сегмента, созданные по 2 точкам.

...
    aEdge1=aSegment1.toShape()
    aEdge2=aArcOfCircle.toShape()
    aEdge3=aSegment2.toShape()
    aWire=Part.Wire([aEdge1, aEdge2, aEdge3])

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

...
    aTrsf=App.Matrix()
    aTrsf.rotateZ(math.pi) # rotate around the z-axis

    aMirroredWire=aWire.copy()
    aMirroredWire.transformShape(aTrsf)
    myWireProfile=Part.Wire([aWire, aMirroredWire])

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

...
    myFaceProfile=Part.Face(myWireProfile)
    aPrismVec=App.Vector(0, 0, myHeight)
    myBody=myFaceProfile.extrude(aPrismVec)

    myBody=myBody.makeFillet(myThickness / 12.0, myBody.Edges)

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

...
    neckLocation=App.Vector(0, 0, myHeight)
    neckNormal=App.Vector(0, 0, 1)

    myNeckRadius = myThickness / 4.
    myNeckHeight = myHeight / 10.
    myNeck = Part.makeCylinder(myNeckRadius, myNeckHeight, neckLocation, neckNormal)

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

...
    myBody = myBody.fuse(myNeck)

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

...
    return myBody

Теперь мы получаем нашу твёрдое тело модуля Part как результат нашей функции.

el = makeBottleTut()
Part.show(el)

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

наверх

Example: Pierced box

Here is a complete example of building a pierced box.

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

import FreeCAD as App
import Part, math

size = 10
poly = Part.makePolygon([(0, 0, 0), (size, 0, 0), (size, 0, size), (0, 0, size), (0, 0, 0)])

face1 = Part.Face(poly)
face2 = Part.Face(poly)
face3 = Part.Face(poly)
face4 = Part.Face(poly)
face5 = Part.Face(poly)
face6 = Part.Face(poly)
     
myMat = App.Matrix()

myMat.rotateZ(math.pi / 2)
face2.transformShape(myMat)
face2.translate(App.Vector(size, 0, 0))

myMat.rotateZ(math.pi / 2)
face3.transformShape(myMat)
face3.translate(App.Vector(size, size, 0))

myMat.rotateZ(math.pi / 2)
face4.transformShape(myMat)
face4.translate(App.Vector(0, size, 0))

myMat = App.Matrix()

myMat.rotateX(-math.pi / 2)
face5.transformShape(myMat)

face6.transformShape(myMat)               
face6.translate(App.Vector(0, 0, size))

myShell = Part.makeShell([face1, face2, face3, face4, face5, face6])   
mySolid = Part.makeSolid(myShell)

myCyl = Part.makeCylinder(2, 20)
myCyl.translate(App.Vector(size / 2, size / 2, 0))

cut_part = mySolid.cut(myCyl)

Part.show(cut_part)

наверх

Загрузка и Сохранение

Существует несколько способов сохранить вашу работу. Вы конечно можете сохранить ваш FreeCAD документ, а также вы можете сохранить Part(Деталь) объект напрямую в обычные CAD форматы, такие как BREP, IGS, STEP и STL.

Сохранить форму в файл легко. Есть доступные для всех форм методы exportBrep(), exportIges(), exportStep() и exportStl(). Таким образом:

import Part
s = Part.makeBox(10, 10, 10)
s.exportStep("test.stp")

это сохранит наш блок в файл формата STEP. Для загрузки BREP, IGES или STEP файлов:

import Part
s = Part.Shape()
s.read("test.stp")

Для преобразования файла STEP в файл IGS:

import Part
 s = Part.Shape()
 s.read("file.stp")       # incoming file igs, stp, stl, brep
 s.exportIges("file.igs") # outbound file igs

наверх


Преобразование объектов Part в полигональную сетку

Конвертация высокоуровневых объектов, таких как формы Part(Деталей), в простые объекты, такие как полигональные сетки, это довольно прямолинейная операция, когда все грани Part разбиваются на треугольники. Результат этой триангуляции затем используется для построения сетки:

import Mesh

obj = FreeCADGui.Selection.getSelection()[0] # a Part object must be preselected
shp = obj.Shape
faces = []

triangles = shp.tessellate(1) # the number represents the precision of the tessellation
for tri in triangles[1]:
    face = []
    for i in tri:
        face.append(triangles[0][i])
    faces.append(face)

m = Mesh.Mesh(faces)
Mesh.show(m)

Альтернативный пример:

import Mesh
import MeshPart

obj = FreeCADGui.Selection.getSelection()[0] # a Part object must be preselected
shp = obj.Shape

mesh = FreeCAD.ActiveDocument.addObject("Mesh::Feature", "Mesh")
mesh.Mesh = MeshPart.meshFromShape(
        Shape=shp,
        LinearDeflection=0.01,
        AngularDeflection=0.025,
        Relative=False)

Преобразование полигональных сеток в объекты Part

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

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

В настоящее время FreeCAD предлагает два метода для преобразования полигональных сеток в объект Part. Первый метод прост, это прямое преобразование, без какой либо оптимизации:

import Mesh
import Part

mesh = Mesh.createTorus()
shape = Part.Shape()
shape.makeShapeFromMesh(mesh.Topology, 0.05) # the second arg is the tolerance for sewing
solid = Part.makeSolid(shape)
Part.show(solid)

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

import Mesh
import Part
import MeshPart

obj = FreeCADGui.Selection.getSelection()[0] # a Mesh object must be preselected
mesh = obj.Mesh
segments = mesh.getPlanarSegments(0.00001) # use rather strict tolerance here
faces = []

for i in segments:
    if len(i) > 0:
        # a segment can have inner holes
        wires = MeshPart.wireFromSegment(mesh, i)
        # we assume that the exterior boundary is that one with the biggest bounding box
        if len(wires) > 0:
            ext = None
            max_length=0
            for i in wires:
                if i.BoundBox.DiagonalLength > max_length:
                    max_length = i.BoundBox.DiagonalLength
                    ext = i

            wires.remove(ext)
            # all interior wires mark a hole and must reverse their orientation, otherwise Part.Face fails
            for i in wires:
                i.reverse()

            # make sure that the exterior wires comes as first in the list
            wires.insert(0, ext)
            faces.append(Part.Face(wires))

solid = Part.Solid(Part.Shell(faces))
Part.show(solid)



Введение

Геометрия которая появляется в трёхмерных видах FreeCAD, получается с помощью библиотек Coin3d. Coin3D это реализация стандарта OpenInventor. OpenCASCADE тоже поддерживает схожую функциональность, но при создании FreeCAD было решено не использовать встроенный в OpenCASCADE просмотрщик, а скорее перейти на более производительный Coin3D. Для изучения этой библиотеки рекомендуется книга Open Inventor Mentor.

Описание

OpenInventor это язык описания трёхмерной сцены. Сцена, описанная в OpenInventor, затем отрисовывается OpenGL на вашем экране. Об этом заботится Coin3D, поэтому программисту не надо иметь дело со сложными вызовами OpenGL, он может просто предоставить корректный (работающий) код OpenInventor. Большим преимуществом является то, что OpenInventor это широко известный и хорошо задокументированный стандарт.

Одну из главных работ, которую FreeCAD делает за вас, это перевод информации о геометрии OpenCASCADE в формат языка OpenInventor.

OpenInventor записывает трехмерную сцену в форме древа сцен, как показано ниже:

Рисунок, взятый с сайта Inventor mentor

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

#Inventor V2.0 ascii
 
Separator { 
    RotationXYZ {	
       axis Z
       angle 0
    }
    Transform {
       translation 0 0 0.5
    }
    Separator {	
       Material {
          diffuseColor 0.05 0.05 0.05
       }
       Transform {
          rotation 1 0 0 1.5708
          scaleFactor 0.2 0.5 0.2
       }
       Cylinder {
       }
    }
}

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

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

Если вы заинтересованы в получении дополнительной информации о openInventor, отправляйтесь напрямую к самому известному руководству: Inventor mentor.

В FreeCAD, как правило. не нужно напрямую взаимодействовать с древом сцен openInventor. Каждый объект в документе FreeCAD, будь то полигональная модель (mesh), форма детали, или что-нибудь ещё, автоматически преобразуется в код OpenInventor и вставляется в основное дерево сцен, которое вы видите в окне трёхмерного просмотра. Это древо сцен непрерывно обновляется, когда вы модифицируете, добавляете или удаляете объекты. В самом деле каждый объект (в пространстве App) обладает поставщиком визуального отображения (соответствующий объект в пространстве Gui), ответственного за выдачу кода OpenInventor.

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

FreeCAD обладает несколькими инструментами для просмотра и изменения openInventor кода. На пример, нижеследующий код на python отобразит openInventor представление выбранного объекта:

obj = FreeCAD.ActiveDocument.ActiveObject
viewprovider = obj.ViewObject
print viewprovider.toString()

А также мы обладаем модулем python открывает полный доступ к управлению чем угодно в Coin3D, такому как ваше дерево сцен в FreeCAD. Также читайте об этом на странице Pivy.

Coding examples

See Coin3d snippets courtesy of MariwanJ's research for the Design456 Workbench. The code repository can be found at https://github.com/MariwanJ/COIN3D_Snippet.

наверх


Введение

Pivy - это библиотека привязок Python для Coin3D, библиотеки 3D-рендеринга, используемой в FreeCAD для отображения вещей в трёхмерный вид. При импорте в работающий интерпретатор Python Pivy позволяет напрямую взаимодействовать с любым работающим графом сцен Coin, таким, как трёхмерный вид FreeCAD, или даже создавать новые. Pivy не требуется для компиляции FreeCAD, но требуется во время выполнения при запуске основанных на Python верстаков, которые создают фигуры на экране, такие как Draft и Arch. Из-за этого Pivy обычно устанавливается при установке дистрибутива FreeCAD.

When imported in a running Python interpreter, Pivy allows us to communicate directly with any running Coin scenegraph, such as the 3D view, or even to create new ones. Pivy is not required to compile FreeCAD, but it is required at runtime when running Python-based workbenches that create shapes on screen, like Draft and Arch. Because of this, Pivy is normally installed when installing a distribution of FreeCAD.

Библиотека Coin разделена на несколько частей, собственно Coin, для управления графами сцен и привязки к различным GUI системам, таким как Windows или Qt. Если эти модули присутствуют в системе, они также доступны для Pivy. Модуль Coin всегда присутствует, и это то что мы будем использовать в любом случае, поэтому мы не должны заботится о привязках нашего трёхмерного отображения к различным интерфейсам, что уже сделано в FreeCAD. Все что вам нужно, так это сделать это:

from pivy import coin

Древо сцены

Мы видели на странице Scenegraph, как организована типичная сцена Coin. Все что появляется в трехмерный вид - это граф сцен Coin, организованный так же. У нас есть один корневой узел, и все объекты на экране его потомки.

FreeCAD обладает простым способом получит доступ к корневому узлу(вершине) древа сцена 3D вида:

sg = FreeCADGui.ActiveDocument.ActiveView.getSceneGraph()
print(sg)

Это вернет корневой узел:

<pivy.coin.SoSelection; proxy of <Swig Object of type 'SoSelection *' at 0x360cb60> >

Мы сразу же можем просмотреть потомков, нашей сцены:

for node in sg.getChildren():
    print(node)

Некоторые из этих узлов, такие как ноды SoSeparator или SoGroup, также могут обладать потомками. Полный список доступных объектов Сoin можно найти в официальной документации Сoin.

Давайте, сейчас, попробуем добавить что-нибудь в наше древо сцены. Мы добавим милейший красный куб:

col = coin.SoBaseColor()
col.rgb = (1, 0, 0)
cub = coin.SoCube()
myCustomNode = coin.SoSeparator()
myCustomNode.addChild(col)
myCustomNode.addChild(cub)
sg.addChild(myCustomNode)

Теперь попробуем следующее:

col.rgb = (1, 1, 0)

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

Как уже упоминалось, в графе сцен openInventor важен порядок. Каждый узел влияет на то, что будет дальше. Например, если мы хотим иметь возможность переместить наш куб, нам нужно добавить узел SoTranslation перед кубом:

col = coin.SoBaseColor()
col.rgb = (1, 0, 0)
trans = coin.SoTranslation()
trans.translation.setValue([0, 0, 0])
cub = coin.SoCube()
myCustomNode = coin.SoSeparator()
myCustomNode.addChild(col)
myCustomNode.addChild(trans)
myCustomNode.addChild(cub)
sg.addChild(myCustomNode)

Чтобы переместить наш куб, мы можем теперь сделать:

trans.translation.setValue([2, 0, 0])

Наконец удалим что-нибудь, введя:

sg.removeChild(myCustomNode)

наверх

Обратные вызовы

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

FreeCAD способен легко использовать такие функции обратного вызова:

from pivy import coin

class ButtonTest:
    def __init__(self):
        self.view = FreeCADGui.ActiveDocument.ActiveView
        self.callback = self.view.addEventCallbackPivy(coin.SoMouseButtonEvent.getClassTypeId(), self.getMouseClick) 

    def getMouseClick(self, event_cb):
        event = event_cb.getEvent()
        if event.getState() == coin.SoMouseButtonEvent.DOWN:
            print("Alert!!! A mouse button has been improperly clicked!!!")
            self.view.removeEventCallbackPivy(coin.SoMouseButtonEvent.getClassTypeId(), self.callback)

ButtonTest()

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

наверх

Документация

К сожалению, Pivy не обладает собственной документацией. Однако, так как это оболочка библиотекиCoin, вы можете читать справку по C++. В этом случает Вам нужно лишь переводить стиль наименования классов C++ в стиль Python.

В C++:

SoFile::getClassTypeId()

В Pivy:

SoFile.getClassId()

Older

These links provide reference documentation for Coin v3.x. The differences with v4.x are minimal, so they may still be useful.

наверх

PyQt/ru


Введение

Кроме стандартных типов объектов, таких как аннотации, полигональные сетки и детали, FreeCAD также предлагает удивительную возможность создавать параметрические объекты, 100% написанные на Python, такие объекты называются (Python Features). Они ведут себя точно так же, как любой другой объект FreeCAD, автоматически сохраняются и восстанавливаются при сохранении или загрузке файла.

Должна быть понята одна особенность, эти объекты сохраняются в файлах FreeCAD FcStd вместе с модулем pythonа json. Этот модуль превращает объект pythonа в строку, позволяя его добавление в сохраняемый файл. При загрузке, модуль json использует эту строку для пересоздания оригинального объекта, обеспечивает его доступ к исходному коду, создавшему объект. Это значит, что если Вы сохранили этот пользовательский объект и открыли его на машине, где код python, который сгенерировал объект, отсутствует, объект не может быть восстановлен. Если Вы распространяете эти объекты среди других друзей, Вам нужно передавать вместе с ними скрипт pythonа, который его создал.

Примечание: Имеется возможность упаковки python кода внутрь FreeCAD файла, используя json сериализацию с помощью App::PropertyPythonObject, но этот код в конечном счете нельзя будет запустить напрямую, поэтому это мало подходит для наших целей.

Python Features следуют тому же правилу что и все остальные FreeCAD features: они разделены на App и GUI части. App часть, Объект Документ (Document Object), определяет геометрию нашего объекта, тогда как его GUI часть, Объект Визуального Представления (View Provider Object) определяет, как объект будет отображаться на экране. Объект View Provider, как и любая другая FreeCAD feature, доступен только при запуске FreeCAD в его собственном графическом интерфейсе. Существует несколько свойств и методов, доступных для создания вашего объекта. Свойства должны принадлежать к любому из предопределенных типов свойств, предлагаемых FreeCAD, и отображаться в окне просмотра свойств, чтобы пользователь мог их редактировать. Таким образом, объекты Feature Python полностью параметричны. Вы можете задать свойства как Данных, так и свойства Вида.

Простой пример

Следующий пример можно найти в файле src/Mod/TemplatePyMod/FeaturePython.py вместе с несколькими другими примерами:

'''Examples for a feature class and its view provider.'''

import FreeCAD, FreeCADGui
from pivy import coin

class Box:
    def __init__(self, obj):
        '''Add some custom properties to our box feature'''
        obj.addProperty("App::PropertyLength", "Length", "Box", "Length of the box").Length = 1.0
        obj.addProperty("App::PropertyLength", "Width", "Box", "Width of the box").Width = 1.0
        obj.addProperty("App::PropertyLength", "Height", "Box", "Height of the box").Height = 1.0
        obj.Proxy = self

    def onChanged(self, fp, prop):
        '''Do something when a property has changed'''
        FreeCAD.Console.PrintMessage("Change property: " + str(prop) + "\n")

    def execute(self, fp):
        '''Do something when doing a recomputation, this method is mandatory'''
        FreeCAD.Console.PrintMessage("Recompute Python Box feature\n")

class ViewProviderBox:
    def __init__(self, obj):
        '''Set this object to the proxy object of the actual view provider'''
        obj.addProperty("App::PropertyColor","Color", "Box", "Color of the box").Color = (1.0, 0.0, 0.0)
        obj.Proxy = self

    def attach(self, obj):
        '''Setup the scene sub-graph of the view provider, this method is mandatory'''
        self.shaded = coin.SoGroup()
        self.wireframe = coin.SoGroup()
        self.scale = coin.SoScale()
        self.color = coin.SoBaseColor()

        data=coin.SoCube()
        self.shaded.addChild(self.scale)
        self.shaded.addChild(self.color)
        self.shaded.addChild(data)
        obj.addDisplayMode(self.shaded, "Shaded");
        style=coin.SoDrawStyle()
        style.style = coin.SoDrawStyle.LINES
        self.wireframe.addChild(style)
        self.wireframe.addChild(self.scale)
        self.wireframe.addChild(self.color)
        self.wireframe.addChild(data)
        obj.addDisplayMode(self.wireframe, "Wireframe");
        self.onChanged(obj,"Color")

    def updateData(self, fp, prop):
        '''If a property of the handled feature has changed we have the chance to handle this here'''
        # fp is the handled feature, prop is the name of the property that has changed
        l = fp.getPropertyByName("Length")
        w = fp.getPropertyByName("Width")
        h = fp.getPropertyByName("Height")
        self.scale.scaleFactor.setValue(float(l), float(w), float(h))
        pass

    def getDisplayModes(self,obj):
        '''Return a list of display modes.'''
        modes=[]
        modes.append("Shaded")
        modes.append("Wireframe")
        return modes

    def getDefaultDisplayMode(self):
        '''Return the name of the default display mode. It must be defined in getDisplayModes.'''
        return "Shaded"

    def setDisplayMode(self,mode):
        '''Map the display mode defined in attach with those defined in getDisplayModes.\
                Since they have the same names nothing needs to be done. This method is optional'''
        return mode

    def onChanged(self, vp, prop):
        '''Here we can do something when a single property got changed'''
        FreeCAD.Console.PrintMessage("Change property: " + str(prop) + "\n")
        if prop == "Color":
            c = vp.getPropertyByName("Color")
            self.color.rgb.setValue(c[0], c[1], c[2])

    def getIcon(self):
        '''Return the icon in XPM format which will appear in the tree view. This method is\
                optional and if not defined a default icon is shown.'''
        return """
            /* XPM */
            static const char * ViewProviderBox_xpm[] = {
            "16 16 6 1",
            "   c None",
            ".  c #141010",
            "+  c #615BD2",
            "@  c #C39D55",
            "#  c #000000",
            "$  c #57C355",
            "        ........",
            "   ......++..+..",
            "   .@@@@.++..++.",
            "   .@@@@.++..++.",
            "   .@@  .++++++.",
            "  ..@@  .++..++.",
            "###@@@@ .++..++.",
            "##$.@@$#.++++++.",
            "#$#$.$$$........",
            "#$$#######      ",
            "#$$#$$$$$#      ",
            "#$$#$$$$$#      ",
            "#$$#$$$$$#      ",
            " #$#$$$$$#      ",
            "  ##$$$$$#      ",
            "   #######      "};
            """

    def dumps(self):
        '''When saving the document this object gets stored using Python's json module.\
                Since we have some un-serializable parts here -- the Coin stuff -- we must define this method\
                to return a tuple of all serializable objects or None.'''
        return None

    def loads(self,state):
        '''When restoring the serialized object from document we have the chance to set some internals here.\
                Since no data were serialized nothing needs to be done here.'''
        return None

def makeBox():
    FreeCAD.newDocument()
    a=FreeCAD.ActiveDocument.addObject("App::FeaturePython", "Box")
    Box(a)
    ViewProviderBox(a.ViewObject)

makeBox()

Что необходимо отметить

Если Ваш объект полагается на то, что будет пересчитан во время создания, Вы должны сделать это вручную в функции __init__, поскольку пересчёт не вызывается автоматически. Этот пример не требует этого поскольку метод onChanged класса Box имеет тот же эффект, что и функция execute, но пример ниже полагается на то, что будет пересчитан перед тем как будет показан в окне трёхмерного просмотра. В этих примерах это делается вручную с помощью ActiveDocument.recompute(), но в более сложных сценариях Вы должны решить, где пересчитать либо весь документ, или объект FeaturePython.

Этот пример создаёт несколько исключений трасс стека в окне отчётов. Это поскольку метод onChanged класса Box вызывается каждый раз как свойство добавляется в __init__. Когда первое было добавлено, параметры Width и Height и потому попытки доступа к ним безуспешны.

Описание __getstate__ и __setstate__ находится в теме форума obj.Proxy.Type is a dict, not a string.

obj.addProperty(...) returns obj, so that the value of the property can be set on the same line:

obj.addProperty("App::PropertyLength", "Length", "Box", "Length of the box").Length = 1.0

Which is equivalent to:

obj.addProperty("App::PropertyLength", "Length", "Box", "Length of the box")
obj.Length = 1.0

Другой более сложный пример

Данный пример использует верстак Part для создания октаэдра, затем создает собственное Coin представление с помощью Pivy.

Сначала сам Документированный Объект:

import FreeCAD, FreeCADGui, Part
import pivy
from pivy import coin

class Octahedron:
  def __init__(self, obj):
     "Add some custom properties to our box feature"
     obj.addProperty("App::PropertyLength","Length","Octahedron","Length of the octahedron").Length=1.0
     obj.addProperty("App::PropertyLength","Width","Octahedron","Width of the octahedron").Width=1.0
     obj.addProperty("App::PropertyLength","Height","Octahedron", "Height of the octahedron").Height=1.0
     obj.addProperty("Part::PropertyPartShape","Shape","Octahedron", "Shape of the octahedron")
     obj.Proxy = self

  def execute(self, fp):
     # Define six vetices for the shape
     v1 = FreeCAD.Vector(0,0,0)
     v2 = FreeCAD.Vector(fp.Length,0,0)
     v3 = FreeCAD.Vector(0,fp.Width,0)
     v4 = FreeCAD.Vector(fp.Length,fp.Width,0)
     v5 = FreeCAD.Vector(fp.Length/2,fp.Width/2,fp.Height/2)
     v6 = FreeCAD.Vector(fp.Length/2,fp.Width/2,-fp.Height/2)

     # Make the wires/faces
     f1 = self.make_face(v1,v2,v5)
     f2 = self.make_face(v2,v4,v5)
     f3 = self.make_face(v4,v3,v5)
     f4 = self.make_face(v3,v1,v5)
     f5 = self.make_face(v2,v1,v6)
     f6 = self.make_face(v4,v2,v6)
     f7 = self.make_face(v3,v4,v6)
     f8 = self.make_face(v1,v3,v6)
     shell=Part.makeShell([f1,f2,f3,f4,f5,f6,f7,f8])
     solid=Part.makeSolid(shell)
     fp.Shape = solid

  # helper mehod to create the faces
  def make_face(self,v1,v2,v3):
     wire = Part.makePolygon([v1,v2,v3,v1])
     face = Part.Face(wire)
     return face

Теперь , мы обладаем визуальным представлением объекта, ответственного за отображение объекта в 3D сцене:

class ViewProviderOctahedron:
  def __init__(self, obj):
     "Set this object to the proxy object of the actual view provider"
     obj.addProperty("App::PropertyColor","Color","Octahedron","Color of the octahedron").Color=(1.0,0.0,0.0)
     obj.Proxy = self

  def attach(self, obj):
     "Setup the scene sub-graph of the view provider, this method is mandatory"
     self.shaded = coin.SoGroup()
     self.wireframe = coin.SoGroup()
     self.scale = coin.SoScale()
     self.color = coin.SoBaseColor()

     self.data=coin.SoCoordinate3()
     self.face=coin.SoIndexedFaceSet()

     self.shaded.addChild(self.scale)
     self.shaded.addChild(self.color)
     self.shaded.addChild(self.data)
     self.shaded.addChild(self.face)
     obj.addDisplayMode(self.shaded,"Shaded");
     style=coin.SoDrawStyle()
     style.style = coin.SoDrawStyle.LINES
     self.wireframe.addChild(style)
     self.wireframe.addChild(self.scale)
     self.wireframe.addChild(self.color)
     self.wireframe.addChild(self.data)
     self.wireframe.addChild(self.face)
     obj.addDisplayMode(self.wireframe,"Wireframe");
     self.onChanged(obj,"Color")

  def updateData(self, fp, prop):
     "If a property of the handled feature has changed we have the chance to handle this here"
     # fp is the handled feature, prop is the name of the property that has changed
     if prop == "Shape":
        s = fp.getPropertyByName("Shape")
        self.data.point.setNum(6)
        cnt=0
        for i in s.Vertexes:
           self.data.point.set1Value(cnt,i.X,i.Y,i.Z)
           cnt=cnt+1

        self.face.coordIndex.set1Value(0,0)
        self.face.coordIndex.set1Value(1,1)
        self.face.coordIndex.set1Value(2,2)
        self.face.coordIndex.set1Value(3,-1)

        self.face.coordIndex.set1Value(4,1)
        self.face.coordIndex.set1Value(5,3)
        self.face.coordIndex.set1Value(6,2)
        self.face.coordIndex.set1Value(7,-1)

        self.face.coordIndex.set1Value(8,3)
        self.face.coordIndex.set1Value(9,4)
        self.face.coordIndex.set1Value(10,2)
        self.face.coordIndex.set1Value(11,-1)

        self.face.coordIndex.set1Value(12,4)
        self.face.coordIndex.set1Value(13,0)
        self.face.coordIndex.set1Value(14,2)
        self.face.coordIndex.set1Value(15,-1)

        self.face.coordIndex.set1Value(16,1)
        self.face.coordIndex.set1Value(17,0)
        self.face.coordIndex.set1Value(18,5)
        self.face.coordIndex.set1Value(19,-1)

        self.face.coordIndex.set1Value(20,3)
        self.face.coordIndex.set1Value(21,1)
        self.face.coordIndex.set1Value(22,5)
        self.face.coordIndex.set1Value(23,-1)

        self.face.coordIndex.set1Value(24,4)
        self.face.coordIndex.set1Value(25,3)
        self.face.coordIndex.set1Value(26,5)
        self.face.coordIndex.set1Value(27,-1)

        self.face.coordIndex.set1Value(28,0)
        self.face.coordIndex.set1Value(29,4)
        self.face.coordIndex.set1Value(30,5)
        self.face.coordIndex.set1Value(31,-1)

  def getDisplayModes(self,obj):
     "Return a list of display modes."
     modes=[]
     modes.append("Shaded")
     modes.append("Wireframe")
     return modes

  def getDefaultDisplayMode(self):
     "Return the name of the default display mode. It must be defined in getDisplayModes."
     return "Shaded"

  def setDisplayMode(self,mode):
     return mode

  def onChanged(self, vp, prop):
     "Here we can do something when a single property got changed"
     FreeCAD.Console.PrintMessage("Change property: " + str(prop) + "\n")
     if prop == "Color":
        c = vp.getPropertyByName("Color")
        self.color.rgb.setValue(c[0],c[1],c[2])

  def getIcon(self):
     return """
        /* XPM */
        static const char * ViewProviderBox_xpm[] = {
        "16 16 6 1",
        "    c None",
        ".   c #141010",
        "+   c #615BD2",
        "@   c #C39D55",
        "#   c #000000",
        "$   c #57C355",
        "        ........",
        "   ......++..+..",
        "   .@@@@.++..++.",
        "   .@@@@.++..++.",
        "   .@@  .++++++.",
        "  ..@@  .++..++.",
        "###@@@@ .++..++.",
        "##$.@@$#.++++++.",
        "#$#$.$$$........",
        "#$$#######      ",
        "#$$#$$$$$#      ",
        "#$$#$$$$$#      ",
        "#$$#$$$$$#      ",
        " #$#$$$$$#      ",
        "  ##$$$$$#      ",
        "   #######      "};
        """

  def dumps(self):
     return None

  def loads(self,state):
     return None

Наконец, когда определен наш объект и его визуальный объект, нам просто нужно вызвать их:

FreeCAD.newDocument()
a=FreeCAD.ActiveDocument.addObject("App::FeaturePython","Octahedron")
Octahedron(a)
ViewProviderOctahedron(a.ViewObject)

Создание выделяемых объектов

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

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

Вот вышеприведённый пример с молекулой, адаптированный для выбора элементов молекулы:

class Molecule:
    def __init__(self, obj):
        ''' Add two point properties '''
        obj.addProperty("App::PropertyVector","p1","Line","Start point")
        obj.addProperty("App::PropertyVector","p2","Line","End point").p2=FreeCAD.Vector(5,0,0)

        obj.Proxy = self

    def onChanged(self, fp, prop):
        if prop == "p1" or prop == "p2":
            ''' Print the name of the property that has changed '''
            fp.Shape = Part.makeLine(fp.p1,fp.p2)

    def execute(self, fp):
        ''' Print a short message when doing a recomputation, this method is mandatory '''
        fp.Shape = Part.makeLine(fp.p1,fp.p2)

class ViewProviderMolecule:
    def __init__(self, obj):
        ''' Set this object to the proxy object of the actual view provider '''
        obj.Proxy = self
        self.ViewObject = obj
        sep1=coin.SoSeparator()
        sel1 = coin.SoType.fromName('SoFCSelection').createInstance()
        # sel1.policy.setValue(coin.SoSelection.SHIFT)
        sel1.ref()
        sep1.addChild(sel1)
        self.trl1=coin.SoTranslation()
        sel1.addChild(self.trl1)
        sel1.addChild(coin.SoSphere())
        sep2=coin.SoSeparator()
        sel2 = coin.SoType.fromName('SoFCSelection').createInstance()
        sel2.ref()
        sep2.addChild(sel2)
        self.trl2=coin.SoTranslation()
        sel2.addChild(self.trl2)
        sel2.addChild(coin.SoSphere())
        obj.RootNode.addChild(sep1)
        obj.RootNode.addChild(sep2)
        self.updateData(obj.Object, 'p2')
        self.sel1 = sel1
        self.sel2 = sel2

    def getDetailPath(self, subname, path, append):
        vobj = self.ViewObject
        if append:
            path.append(vobj.RootNode)
            path.append(vobj.SwitchNode)

            mode = vobj.SwitchNode.whichChild.getValue()
            if mode >= 0:
                mode = vobj.SwitchNode.getChild(mode)
                path.append(mode)
                sub = Part.splitSubname(subname)[-1]
                if sub == 'Atom1':
                    path.append(self.sel1)
                elif sub == 'Atom2':
                    path.append(self.sel2)
                else:
                    path.append(mode.getChild(0))
        return True

    def getElementPicked(self, pp):
        path = pp.getPath()
        if path.findNode(self.sel1) >= 0:
            return 'Atom1'
        if path.findNode(self.sel2) >= 0:
            return 'Atom2'
        raise NotImplementedError

    def updateData(self, fp, prop):
        "If a property of the handled feature has changed we have the chance to handle this here"
        # fp is the handled feature, prop is the name of the property that has changed
        if prop == "p1":
            p = fp.getPropertyByName("p1")
            self.trl1.translation=(p.x,p.y,p.z)
        elif prop == "p2":
            p = fp.getPropertyByName("p2")
            self.trl2.translation=(p.x,p.y,p.z)

    def dumps(self):
        return None

    def loads(self,state):
        return None

def makeMolecule():
    FreeCAD.newDocument()
    a=FreeCAD.ActiveDocument.addObject("Part::FeaturePython","Molecule")
    Molecule(a)
    ViewProviderMolecule(a.ViewObject)
    FreeCAD.ActiveDocument.recompute()

Работа с простыми формами

Если ваш параметрический объект - это просто геометрическая форма, то вам не нужно использовать view provider объект. Форма будет отображаться стандартными способами представления форм FreeCAD:

import FreeCAD as App
import FreeCADGui
import FreeCAD
import Part
class Line:
    def __init__(self, obj):
        '''"App two point properties" '''
        obj.addProperty("App::PropertyVector","p1","Line","Start point")
        obj.addProperty("App::PropertyVector","p2","Line","End point").p2=FreeCAD.Vector(1,0,0)
        obj.Proxy = self

    def execute(self, fp):
        '''"Print a short message when doing a recomputation, this method is mandatory" '''
        fp.Shape = Part.makeLine(fp.p1,fp.p2)

a=FreeCAD.ActiveDocument.addObject("Part::FeaturePython","Line")
Line(a)
a.ViewObject.Proxy=0 # just set it to something different from None (this assignment is needed to run an internal notification)
FreeCAD.ActiveDocument.recompute()

Тот же код с применением ViewProviderLine

import FreeCAD as App
import FreeCADGui
import FreeCAD
import Part

class Line:
    def __init__(self, obj):
         '''"App two point properties" '''
         obj.addProperty("App::PropertyVector","p1","Line","Start point")
         obj.addProperty("App::PropertyVector","p2","Line","End point").p2=FreeCAD.Vector(100,0,0)
         obj.Proxy = self

    def execute(self, fp):
        '''"Print a short message when doing a recomputation, this method is mandatory" '''
        fp.Shape = Part.makeLine(fp.p1,fp.p2)

class ViewProviderLine:
   def __init__(self, obj):
      ''' Set this object to the proxy object of the actual view provider '''
      obj.Proxy = self

   def getDefaultDisplayMode(self):
      ''' Return the name of the default display mode. It must be defined in getDisplayModes. '''
      return "Flat Lines"

a=FreeCAD.ActiveDocument.addObject("Part::FeaturePython","Line")
Line(a)
ViewProviderLine(a.ViewObject)
App.ActiveDocument.recompute()

Структура графа сцены

You may have noticed that the examples above construct their scenegraphs in slightly different ways. Some use obj.addDisplayMode(node, "modename") while others use obj.SwitchNode.getChild(x).addChild(y).

Each feature in a FreeCAD document is based the following scenegraph structure:

RootNode
 \- SwitchNode
     \- Shaded
      - Wireframe
      - etc

The SwitchNode displays only one of its children, depending on which display mode is selection in FreeCAD.

The examples which use addDisplayMode are constructing their scenegraphs solely out of coin3d scenegraph elements. Under the covers, addDisplayMode adds a new child to the SwitchNode; the name of that node will match the display mode it was passed.

The examples which use SwitchNode.getChild(x).addChild also construct part of their geometry using functions from the Part workbench, such as fp.Shape = Part.makeLine(fp.p1,fp.p2). This constructs the different display mode scenegraphs under the SwitchNode; when we later come to add coin3d elements to the scenegraph, we need to add them to the existing display mode scenegraphs using addChild rather than creating a new child of the SwitchNode.

When using addDisplayMode() to add geometry to the scenegraph, each display mode should have its own node which is passed to addDisplayMode(); don't reuse the same node for this. Doing so will confuse the selection mechanism. It's okay if each display mode's node has the same geometry nodes added below it, just the root of each display mode needs to be distinct.

Here is the above molecule example, adapted to be drawn only with Coin3D scenegraph objects instead of using objects from the Part workbench:

import Part
from pivy import coin

class Molecule:
    def __init__(self, obj):
        ''' Add two point properties '''
        obj.addProperty("App::PropertyVector","p1","Line","Start point")
        obj.addProperty("App::PropertyVector","p2","Line","End point").p2=FreeCAD.Vector(5,0,0)

        obj.Proxy = self

    def onChanged(self, fp, prop):
        pass

    def execute(self, fp):
        ''' Print a short message when doing a recomputation, this method is mandatory '''
        pass

class ViewProviderMolecule:
    def __init__(self, obj):
        ''' Set this object to the proxy object of the actual view provider '''
        self.constructed = False
        obj.Proxy = self
        self.ViewObject = obj

    def attach(self, obj):
        material = coin.SoMaterial()
        material.diffuseColor = (1.0, 0.0, 0.0)
        material.emissiveColor = (1.0, 0.0, 0.0)
        drawStyle = coin.SoDrawStyle()
        drawStyle.pointSize.setValue(10)
        drawStyle.style = coin.SoDrawStyle.LINES
        wireframe = coin.SoGroup()
        shaded = coin.SoGroup()
        self.wireframe = wireframe
        self.shaded = shaded

        self.coords = coin.SoCoordinate3()
        self.coords.point.setValues(0, 2, [FreeCAD.Vector(0, 0, 0), FreeCAD.Vector(1, 0, 0)])
        wireframe += self.coords
        wireframe += drawStyle
        wireframe += material
        shaded += self.coords
        shaded += drawStyle
        shaded += material

        g = coin.SoGroup()
        sel1 = coin.SoType.fromName('SoFCSelection').createInstance()
        sel1.style = 'EMISSIVE_DIFFUSE'
        p1 = coin.SoType.fromName('SoIndexedPointSet').createInstance()
        p1.coordIndex.set1Value(0, 0)
        sel1 += p1
        g += sel1
        wireframe += g
        shaded += g

        g = coin.SoGroup()
        sel2 = coin.SoType.fromName('SoFCSelection').createInstance()
        sel2.style = 'EMISSIVE_DIFFUSE'
        p2 = coin.SoType.fromName('SoIndexedPointSet').createInstance()
        p2.coordIndex.set1Value(0, 1)
        sel2 += p2
        g += sel2
        wireframe += g
        shaded += g

        g = coin.SoGroup()
        sel3 = coin.SoType.fromName('SoFCSelection').createInstance()
        sel3.style = 'EMISSIVE_DIFFUSE'
        p3 = coin.SoType.fromName('SoIndexedLineSet').createInstance()
        p3.coordIndex.setValues(0, 2, [0, 1])
        sel3 += p3
        g += sel3
        wireframe += g
        shaded += g

        obj.addDisplayMode(wireframe, 'Wireframe')
        obj.addDisplayMode(shaded, 'Shaded')

        self.sel1 = sel1
        self.sel2 = sel2
        self.sel3 = sel3
        self.constructed = True
        self.updateData(obj.Object, 'p2')

    def getDetailPath(self, subname, path, append):
        vobj = self.ViewObject
        if append:
            path.append(vobj.RootNode)
            path.append(vobj.SwitchNode)

            mode = vobj.SwitchNode.whichChild.getValue()
            FreeCAD.Console.PrintWarning("getDetailPath: mode {} is active\n".format(mode))
            if mode >= 0:
                mode = vobj.SwitchNode.getChild(mode)
                path.append(mode)
                sub = Part.splitSubname(subname)[-1]
                print(sub)
                if sub == 'Atom1':
                    path.append(self.sel1)
                elif sub == 'Atom2':
                    path.append(self.sel2)
                elif sub == 'Line':
                    path.append(self.sel3)
                else:
                    path.append(mode.getChild(0))
        return True

    def getElementPicked(self, pp):
        path = pp.getPath()
        if path.findNode(self.sel1) >= 0:
            return 'Atom1'
        if path.findNode(self.sel2) >= 0:
            return 'Atom2'
        if path.findNode(self.sel3) >= 0:
            return 'Line'
        raise NotImplementedError

    def updateData(self, fp, prop):
        "If a property of the handled feature has changed we have the chance to handle this here"
        # fp is the handled feature, prop is the name of the property that has changed
        if not self.constructed:
            return
        if prop == "p1":
            p = fp.getPropertyByName("p1")
            self.coords.point.set1Value(0, p)
        elif prop == "p2":
            p = fp.getPropertyByName("p2")
            self.coords.point.set1Value(1, p)

    def getDisplayModes(self, obj):
        return ['Wireframe', 'Shaded']

    def getDefaultDisplayMode(self):
        return 'Shaded'

    def setDisplayMode(self, mode):
        return mode

    def dumps(self):
        return None

    def loads(self,state):
        return None

def makeMolecule():
    FreeCAD.newDocument()
    a=FreeCAD.ActiveDocument.addObject("App::FeaturePython","Molecule")
    Molecule(a)
    b=ViewProviderMolecule(a.ViewObject)
    a.touch()
    FreeCAD.ActiveDocument.recompute()
    return a,b

a,b = makeMolecule()

Программируемый объект Part Design

When making scripted objects in Part Design the process is similar to the scripted objects discussed above, but with a few additional considerations. We must handle 2 shape properties, one for the shape we see in the 3D view and another for the shape used by the pattern tools, such as polar pattern features. The object shapes also needs to be fused to any existing material already in the Body (or cut from it in the case of Subtractive features). And we must account for the placement and attachment of our objects a little bit differently.

Part Design scripted solid object features should be based on either PartDesign::FeaturePython, PartDesign::FeatureAdditivePython, or PartDesign::FeatureSubtractivePython rather than Part::FeaturePython. Only the Additive and Subtractive variants can be used in pattern features, and if based on Part::FeaturePython when the user drops the object into a Part Design Body it becomes a BaseFeature rather than being treated by the Body as a native Part Design object. Note: all of these are expected to be solids, so if you are making a non-solid feature it should be based on Part::FeaturePython or else the next feature in the tree will attempt to fuse to as a solid and it will fail.

Here is a simple example of making a Tube primitive, similar to the Tube primitive in Part Workbench except this one will be a Part Design solid feature object. For this we will 2 separate files: pdtube.FCMacro and pdtube.py. The .FCMacro file will be executed by the user to create the object. The .py file will hold the class definitions, imported by the .FCMacro. The reason for doing it this way is to maintain the parametric nature of the object after restarting FreeCAD and opening a document containing one of our Tubes.

First, the class definition file:

# -*- coding: utf-8 -*-
#classes should go in pdtube.py
import FreeCAD, FreeCADGui, Part
class PDTube:
    def __init__(self,obj):
        obj.addProperty("App::PropertyLength","Radius1","Tube","Radius1").Radius1 = 5
        obj.addProperty("App::PropertyLength","Radius2","Tube","Radius2").Radius2 = 10
        obj.addProperty("App::PropertyLength","Height","Tube","Height of tube").Height = 10
        self.makeAttachable(obj)
        obj.Proxy = self

    def makeAttachable(self, obj):

        if int(FreeCAD.Version()[1]) >= 19:
            obj.addExtension('Part::AttachExtensionPython')
        else:
            obj.addExtension('Part::AttachExtensionPython', obj)

        obj.setEditorMode('Placement', 0) #non-readonly non-hidden

    def execute(self,fp):
        outer_cylinder = Part.makeCylinder(fp.Radius2, fp.Height)
        inner_cylinder = Part.makeCylinder(fp.Radius1, fp.Height)
        if fp.Radius1 == fp.Radius2: #just make cylinder
            tube_shape = outer_cylinder
        elif fp.Radius1 < fp.Radius2:
            tube_shape = outer_cylinder.cut(inner_cylinder)
        else: #invert rather than error out
            tube_shape = inner_cylinder.cut(outer_cylinder)

        if not hasattr(fp, "positionBySupport"):
            self.makeAttachable(fp)
        fp.positionBySupport()
        tube_shape.Placement = fp.Placement

        #BaseFeature (shape property of type Part::PropertyPartShape) is provided for us
        #with the PartDesign::FeaturePython and related classes, but it might be empty
        #if our object is the first object in the tree.  it's a good idea to check
        #for its existence in case we want to make type Part::FeaturePython, which won't have it

        if hasattr(fp, "BaseFeature") and fp.BaseFeature != None:
            if "Subtractive" in fp.TypeId:
                full_shape = fp.BaseFeature.Shape.cut(tube_shape)
            else:
                full_shape = fp.BaseFeature.Shape.fuse(tube_shape)
            full_shape.transformShape(fp.Placement.inverse().toMatrix(), True) #borrowed from gears workbench
            fp.Shape = full_shape
        else:
            fp.Shape = tube_shape
        if hasattr(fp,"AddSubShape"): #PartDesign::FeatureAdditivePython and
                                      #PartDesign::FeatureSubtractivePython have this
                                      #property but PartDesign::FeaturePython does not
                                      #It is the shape used for copying in pattern features
                                      #for example in making a polar pattern
            tube_shape.transformShape(fp.Placement.inverse().toMatrix(), True)
            fp.AddSubShape = tube_shape

class PDTubeVP:
    def __init__(self, obj):
        '''Set this object to the proxy object of the actual view provider'''
        obj.Proxy = self

    def attach(self,vobj):
        self.vobj = vobj

    def updateData(self, fp, prop):
        '''If a property of the handled feature has changed we have the chance to handle this here'''
        pass

    def getDisplayModes(self,obj):
        '''Return a list of display modes.'''
        modes=[]
        modes.append("Flat Lines")
        modes.append("Shaded")
        modes.append("Wireframe")
        return modes

    def getDefaultDisplayMode(self):
        '''Return the name of the default display mode. It must be defined in getDisplayModes.'''
        return "Flat Lines"

    def setDisplayMode(self,mode):
        '''Map the display mode defined in attach with those defined in getDisplayModes.\
                Since they have the same names nothing needs to be done. This method is optional'''
        return mode

    def onChanged(self, vp, prop):
        '''Here we can do something when a single property got changed'''
        #FreeCAD.Console.PrintMessage("Change property: " + str(prop) + "\n")
        pass

    def getIcon(self):
        '''Return the icon in XPM format which will appear in the tree view. This method is\
                optional and if not defined a default icon is shown.'''
        return """
            /* XPM */
            static const char * ViewProviderBox_xpm[] = {
            "16 16 6 1",
            "   c None",
            ".  c #141010",
            "+  c #615BD2",
            "@  c #C39D55",
            "#  c #000000",
            "$  c #57C355",
            "        ........",
            "   ......++..+..",
            "   .@@@@.++..++.",
            "   .@@@@.++..++.",
            "   .@@  .++++++.",
            "  ..@@  .++..++.",
            "###@@@@ .++..++.",
            "##$.@@$#.++++++.",
            "#$#$.$$$........",
            "#$$#######      ",
            "#$$#$$$$$#      ",
            "#$$#$$$$$#      ",
            "#$$#$$$$$#      ",
            " #$#$$$$$#      ",
            "  ##$$$$$#      ",
            "   #######      "};
            """

    def dumps(self):
        '''When saving the document this object gets stored using Python's json module.\
                Since we have some un-serializable parts here -- the Coin stuff -- we must define this method\
                to return a tuple of all serializable objects or None.'''
        return None

    def loads(self,state):
        '''When restoring the serialized object from document we have the chance to set some internals here.\
                Since no data were serialized nothing needs to be done here.'''
        return None

And now the macro file to create the object:

# -*- coding: utf-8 -*-

#pdtube.FCMacro
import pdtube
#above line needed if the class definitions above are place in another file: PDTube.py
#this is needed if the tube object is to remain parametric after restarting FreeCAD and loading
#a document containing the object

body = FreeCADGui.ActiveDocument.ActiveView.getActiveObject("pdbody")
if not body:
    FreeCAD.Console.PrintError("No active body.\n")
else:
    from PySide import QtGui
    window = FreeCADGui.getMainWindow()
    items = ["Additive","Subtractive","Neither additive nor subtractive"]
    item,ok =QtGui.QInputDialog.getItem(window,"Select tube type","Select whether you want additive, subtractive, or neither:",items,0,False)
    if ok:
        if item == items[0]:
            className = "PartDesign::FeatureAdditivePython"
        elif item == items[1]:
            className = "PartDesign::FeatureSubtractivePython"
        else:
            className = "PartDesign::FeaturePython" #not usable in pattern features, such as polar pattern

        tube = FreeCAD.ActiveDocument.addObject(className,"Tube")
        pdtube.PDTube(tube)
        pdtube.PDTubeVP(tube.ViewObject)
        body.addObject(tube) #optionally we can also use body.insertObject() for placing at particular place in tree

Available object types

The list of all object types you can create with FreeCAD.ActiveDocument.addObject() can be obtained with FreeCAD.ActiveDocument.supportedTypes(). Only object types with a name ending in Python can be used for scripted objects. These are listed here (for FreeCAD v0.21):

  • App::DocumentObjectGroupPython
  • App::FeaturePython
  • App::GeometryPython
  • App::LinkElementPython
  • App::LinkGroupPython
  • App::LinkPython
  • App::MaterialObjectPython
  • App::PlacementPython
  • Part::CustomFeaturePython
  • Part::FeaturePython
  • Part::Part2DObjectPython
  • Path::FeatureAreaPython
  • Path::FeatureAreaViewPython
  • Path::FeatureCompoundPython
  • Path::FeaturePython
  • Path::FeatureShapePython
  • Sketcher::SketchObjectPython
  • TechDraw::DrawComplexSectionPython
  • TechDraw::DrawLeaderLinePython
  • TechDraw::DrawPagePython
  • TechDraw::DrawRichAnnoPython
  • TechDraw::DrawTemplatePython
  • TechDraw::DrawTilePython
  • TechDraw::DrawTileWeldPython
  • TechDraw::DrawViewPartPython
  • TechDraw::DrawViewPython
  • TechDraw::DrawViewSectionPython
  • TechDraw::DrawViewSymbolPython
  • TechDraw::DrawWeldSymbolPython

Доступные методы

Полное описание доступно на странице методы FeaturePython.

Доступные свойства

Свойства - это "строительные блоки" объекта FeaturePython. Через них пользователь может взаимодействовать с объектом и вносить изменения в него. После создания нового FeaturePython объекта в вашем документе ( a=FreeCAD.ActiveDocument.addObject("App::FeaturePython","Box") ),вы можете получить список доступных свойств, с помощью:

obj = FreeCAD.ActiveDocument.addObject("App::FeaturePython", "Box")
obj.supportedProperties()

Вы получите список доступных свойств, которые более подробно описаны на странице пользовательских свойств объекта FeaturePython:

При добавлении новых свойств к пользовательским объектам, позаботьтесь об этом:

  • Не используйте символы "<" или ">" в описании свойств (это вызовет поломку xml части .fcstd файла)
  • Свойства хранятся в .fcstd файле в алфавитном порядке. Если у вас есть форма(shape) в ваших свойствах, любое свойство имя которого идет, в алфавитном порядке, после "Shape" , будет загружено ПОСЛЕ формы, что может привести к странному поведению.

The properties are defined in the PropertyStandard C++ header file.

Типы свойств

По умолчанию свойства могут быть обновлены. Имеется возможность сделать свойство только для чтения (read-only), например, в случае если требуется отображать только результат выполнения метода. Также возможно создать скрытое (hidden) свойство. Сам же тип свойства можно задать с помощью:

obj.setEditorMode("MyPropertyName", mode)

где переменная mode (short int типа) - может иметь следующие значения:

 0 -- значение по умолчанию, допускает как чтение, так и запись
 1 -- свойство только для чтения (read-only)
 2 -- скрытое свойство (hidden)

The mode can also be set using a list of strings, e.g. obj.setEditorMode("Placement", ["ReadOnly", "Hidden"]).

The EditorModes are not set at FreeCAD file reload. This could to be done by the loads function. See http://forum.freecadweb.org/viewtopic.php?f=18&t=13460&start=10#p108072. By using the setEditorMode the properties are only read-only in the Property editor. They can still be changed from Python. To really make them read-only the setting has to be passed directly inside the addProperty function. See http://forum.freecadweb.org/viewtopic.php?f=18&t=13460&start=20#p109709 for an example.

Using the direct setting in the addProperty function, you also have more possibilities. In particular, an interesting one is mark a property as an output property. This way FreeCAD won't mark the feature as touched when changing it (so no need to recompute).

Example of output property (see also https://forum.freecadweb.org/viewtopic.php?t=24928):

obj.addProperty("App::PropertyString", "MyCustomProperty", "", "", 8)

The property types that can be set at last parameter of the addProperty function are:

  0 -- Prop_None, No special property type
  1 -- Prop_ReadOnly, Property is read-only in the editor
  2 -- Prop_Transient, Property won't be saved to file
  4 -- Prop_Hidden, Property won't appear in the editor
  8 -- Prop_Output, Modified property doesn't touch its parent container
 16 -- Prop_NoRecompute, Modified property doesn't touch its container for recompute
 32 -- Prop_NoPersist, Property won't be saved to file at all

Вы можете найти эти различные типы свойств, определённые в заголовочном файле PropertyContainer исходного кода C++.

Available extensions

The list of available extensions can be obtained with grep -RI EXTENSION_PROPERTY_SOURCE_TEMPLATE in the repository of the source code and is given here (for FreeCAD v0.21).

For objects:

  • App::GeoFeatureGroupExtensionPython
  • App::GroupExtensionPython
  • App::LinkBaseExtensionPython
  • App::LinkExtensionPython
  • App::OriginGroupExtensionPython
  • Part::AttachExtensionPython
  • TechDraw::CosmeticExtensionPython

For view objects:

  • Gui::ViewProviderExtensionPython
  • Gui::ViewProviderGeoFeatureGroupExtensionPython
  • Gui::ViewProviderGroupExtensionPython
  • Gui::ViewProviderOriginGroupExtensionPython
  • PartGui::ViewProviderAttachExtensionPython
  • PartGui::ViewProviderSplineExtensionPython

There exist other extensions but they do not work as-is:

  • App::ExtensionPython
  • TechDrawGui::ViewProviderCosmeticExtensionPython
  • TechDrawGui::ViewProviderDrawingViewExtensionPython
  • TechDrawGui::ViewProviderPageExtensionPython
  • TechDrawGui::ViewProviderTemplateExtensionPython

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

Дополнительные страницы Вики FreeCADа:

Интересные темы форума про создание объектов с помощью скриптов:

В дополнение к представленным примерам, посмотрите FreeCAD src/Mod/TemplatePyMod/FeaturePython.py, находящийся в папке с исходными кодами FreeCAD.



Introduction

FreeCAD может импортироваться как модуль Python в другие программы или в автономную консоль python, вместе со всеми модулями и компонентами. Можно даже импортировать пользовательский интерфейс FreeCAD как модуль python, но с некоторыми ограничениями.

Использование FreeCAD без GUI

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

FREECADPATH = '/usr/lib/freecad-python3/lib/' # path to your FreeCAD.so or FreeCAD.pyd file,
# for Windows you must either use \\ or / in the path, using a single \ is problematic
# FREECADPATH = 'C:\\FreeCAD\\bin'
import Blender, sys
sys.path.append(FREECADPATH)
 
def import_fcstd(filename):
   try:
       import FreeCAD
   except ValueError:
       Blender.Draw.PupMenu('Error%t|FreeCAD library not found. Please check the FREECADPATH variable in the import script is correct')
   else:
       scene = Blender.Scene.GetCurrent()
       import Part
       doc = FreeCAD.open(filename)
       objects = doc.Objects
       for ob in objects:
           if ob.Type[:4] == 'Part':
               shape = ob.Shape
               if shape.Faces:
                   mesh = Blender.Mesh.New()
                   rawdata = shape.tessellate(1)
                   for v in rawdata[0]:
                       mesh.verts.append((v.x,v.y,v.z))
                   for f in rawdata[1]:
                       mesh.faces.append.append(f)
                   scene.objects.new(mesh,ob.Name)
       Blender.Redraw()

def main():
   Blender.Window.FileSelector(import_fcstd, 'IMPORT FCSTD', 
                        Blender.sys.makename(ext='.fcstd'))    
 
# This lets you import the script without running it
if __name__=='__main__':
   main()

Сперва, вожно убедится что python найдет ваши FreeCAD библиотеки. как только он их найдет, все модули FreeCAD такие как Part, которые мы также будем использовать, будут доступны автоматически. Так что мы просто берес значение переменной sys.path, где описано где python ищет модули, и мы добавляем буть к библиотекам FreeCAD. Это изменение носит временный характер, и будет потеряно когдв мы закроем наш python интепритатор. Другой способ которым вы можете создать ссылку на вашу FreeCAD библиотеку в одном посковых путей python. Я держал путь в константе (FREECADPATH) так что бы было легче другому пользователю сценария настроить его под свою систему.

FREECADPATH = 'C:\\FreeCAD\\bin' # path to your FreeCAD.so or FreeCAD.pyd file
import sys
sys.path.append(FREECADPATH)

После того как мы проверили что библиотеки загружены (повторите/исключите последовательность), теперь мы можем работать с FreeCAD, так же как если бы мы были внутри FreeCADовского python интерпритатора. Мы открываем FreeCAD документ который передается нам с помощью функции main() , и мы создаем список список своих объектов. Затем, так как мы решаем заботиться только о геометрии детали «Part», мы проверяем, содержит ли свойство Type каждого объекта «Part», и затем тесселяем ее.

import Part
       doc = FreeCAD.open(filename)
       objects = doc.Objects
       for ob in objects:
           if ob.Type[:4] == 'Part':

Трансляция(tesselation- преобразование в сетку) произвела список вершин и список граней, заданных индексами вершин.Это идеальный вариант, так как он точно аналогично блендеру задает сетки. Таким образом, наша задача до смешного проста, мы просто добавим оба списка содержащих вершины и грани в блендере сетку. Когда все будет сделано, мы просто перерисуем экран, и вот оно!

if ob.Type[:4] == 'Part':
               shape = ob.Shape
               if shape.Faces:
                   mesh = Blender.Mesh.New()
                   rawdata = shape.tessellate(1)
                   for v in rawdata[0]:
                       mesh.verts.append((v.x,v.y,v.z))
                   for f in rawdata[1]:
                       mesh.faces.append.append(f)
                   scene.objects.new(mesh,ob.Name)
       Blender.Redraw()

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

Note: checkout Headless FreeCAD for running FreeCAD without the GUI.

Использование FreeCAD с GUI

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

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

Весь python код , для достижения этого, укладывается всего в две строчки

import FreeCADGui 
FreeCADGui.showMainWindow()

Если головное приложение основывается на Qt, то это решение должно работать на всех платформах поддерживаемых Qt. Однако, головное приложение должно ссылаться на туже версию Qt что и FreeCAD потому что иначе мы може столкнуться с неожиданными ошибками во время выполнения.

Однако,Для не-Qt преложений, имеется несколько ограничений , вы должны знать об этом. Это решение , вероятно не сработает вместе с остальными инструментальными средствами. Для Windows это работает до тех пор пока головное приложение напрямую основано на Win32 или любом другом инструментальном средстве который внутренне использует Win32 API такие как wxWidgets, MFC или WinForms. Для того чтобы заставить его работать под X11, головное предложение необходимо связать с библиотекой "glib".

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

Caveats

Although it is possible to import FreeCAD to an external Python interpreter, this is not a common usage scenario and requires some care. Generally, it is better to use the Python included with FreeCAD, run FreeCAD via command line, or as a subprocess. See Start up and Configuration for more on the last two options.

Since the FreeCAD Python module is compiled from C++ (rather than being a pure Python module), it can only be imported from a compatible Python interpreter. Generally this means that the Python interpreter must be compiled with the same C compiler as was used to build FreeCAD. Information about the compiler used to build a Python interpreter (including the one built with FreeCAD) can be found as follows:

>>> import sys
>>> sys.version
'2.7.13 (default, Dec 17 2016, 23:03:43) \n[GCC 4.2.1 Compatible Apple LLVM 8.0.0 (clang-800.0.42.1)]'

Related



Введение

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

Snippets

Обычный файл InitGui.py

Каждый модуль должен содержать, помимо основного файла модуля, файл InitGui.py, ответственный за вставку модуля в главное Gui. Это простой пример.

class ScriptWorkbench (Workbench): 
    MenuText = "Scripts"
    def Initialize(self):
        import Scripts # assuming Scripts.py is your module
        list = ["Script_Cmd"] # That list must contain command names, that can be defined in Scripts.py
        self.appendToolbar("My Scripts",list) 
        
Gui.addWorkbench(ScriptWorkbench())

наверх

Обычный файл модуля

Это пример главного файла модуля, содержащего всё что ваш модуль делает. Это Scripts.py файл, вызываемый в предыдущем примере. Вы можете установить здесь все ваши пользовательские команды.

import FreeCAD, FreeCADGui 
 
class ScriptCmd: 
   def Activated(self): 
       # Here your write what your ScriptCmd does...
       FreeCAD.Console.PrintMessage('Hello, World!')
   def GetResources(self): 
       return {'Pixmap' : 'path_to_an_icon/myicon.png', 'MenuText': 'Short text', 'ToolTip': 'More detailed text'} 
       
FreeCADGui.addCommand('Script_Cmd', ScriptCmd())

наверх

Импорт нового типа файлов

Создание ипортировщика в нового типа файлов в FreeCAD просто. FreeCAD не считает, что вы импортируете данные в открытый документ, а скорее что вы просто можете непосредственно открыть новый тип файла. Так что все что вам нужно сделать, это добавить новое расширение файла в список известных расширений FreeCAD, и написать код, который будет читать файл и создавать объекты FreeCAD:

Это строка должна быть добавлена в InitGui.py файл для добавления нового расширения файлов в список:

# Assumes Import_Ext.py is the file that has the code for opening and reading .ext files
FreeCAD.addImportType("Your new File Type (*.ext)","Import_Ext")

Тогда в файле Import_Ext.py:

def open(filename): 
   doc=App.newDocument()
   # here you do all what is needed with filename, read, classify data, create corresponding FreeCAD objects
   doc.recompute()

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

FreeCAD.addExportType("Your new File Type (*.ext)","Export_Ext")

наверх

Добавление линии

Простейшая линия через две точки.

import Part,PartGui 
doc=App.activeDocument() 
# add a line element to the document and set its points 
l=Part.LineSegment()
l.StartPoint=(0.0,0.0,0.0)
l.EndPoint=(1.0,1.0,1.0)
doc.addObject("Part::Feature","Line").Shape=l.toShape() 
doc.recompute()

наверх

Добавление многоугольника

Многоугольник это просто набор соединенных отрезков (polyline в AutoCAD). Он необязательно должен быть замкнутым.

import Part, PartGui 
doc = App.activeDocument()
n = list() 

# create a 3D vector, set its coordinates and add it to the list 
v = App.Vector(0,0,0) 
n.append(v) 
v = App.Vector(10,0,0) 
n.append(v) 
#... repeat for all nodes 

# Create a polygon object and set its nodes 
p = doc.addObject("Part::Polygon","Polygon") 
p.Nodes = n 
doc.recompute()

наверх

Добавление и удаление объекта из группы

doc=App.activeDocument() 
grp=doc.addObject("App::DocumentObjectGroup", "Group") 
lin=doc.addObject("Part::Feature", "Line")
grp.addObject(lin) # adds the lin object to the group grp
grp.removeObject(lin) # removes the lin object from the group grp

Примечание: Вы также можете добавлять другие группы в группу...

наверх

Добавление полигональной сетки

import Mesh
doc=App.activeDocument()
# create a new empty mesh
m = Mesh.Mesh()
# build up box out of 12 facets
m.addFacet(0.0,0.0,0.0, 0.0,0.0,1.0, 0.0,1.0,1.0)
m.addFacet(0.0,0.0,0.0, 0.0,1.0,1.0, 0.0,1.0,0.0)
m.addFacet(0.0,0.0,0.0, 1.0,0.0,0.0, 1.0,0.0,1.0)
m.addFacet(0.0,0.0,0.0, 1.0,0.0,1.0, 0.0,0.0,1.0)
m.addFacet(0.0,0.0,0.0, 0.0,1.0,0.0, 1.0,1.0,0.0)
m.addFacet(0.0,0.0,0.0, 1.0,1.0,0.0, 1.0,0.0,0.0)
m.addFacet(0.0,1.0,0.0, 0.0,1.0,1.0, 1.0,1.0,1.0)
m.addFacet(0.0,1.0,0.0, 1.0,1.0,1.0, 1.0,1.0,0.0)
m.addFacet(0.0,1.0,1.0, 0.0,0.0,1.0, 1.0,0.0,1.0)
m.addFacet(0.0,1.0,1.0, 1.0,0.0,1.0, 1.0,1.0,1.0)
m.addFacet(1.0,1.0,0.0, 1.0,1.0,1.0, 1.0,0.0,1.0)
m.addFacet(1.0,1.0,0.0, 1.0,0.0,1.0, 1.0,0.0,0.0)
# scale to a edge langth of 100
m.scale(100.0)
# add the mesh to the active document
me=doc.addObject("Mesh::Feature","Cube")
me.Mesh=m

наверх

Добавление дуги или окружности

import Part
doc = App.activeDocument()
c = Part.Circle() 
c.Radius=10.0  
f = doc.addObject("Part::Feature", "Circle") # create a document with a circle feature 
f.Shape = c.toShape() # Assign the circle shape to the shape property 
doc.recompute()

наверх

Получение доступа и изменение представления объекта

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

gad = Gui.activeDocument() # access the active document containing all 
                           # view representations of the features in the
                           # corresponding App document 

v = gad.getObject("Cube")  # access the view representation to the Mesh feature 'Cube' 
v.ShapeColor               # prints the color to the console 
v.ShapeColor=(1.0,1.0,1.0) # sets the shape color to white

наверх

Replace the form of mouse with one image

import PySide2
from PySide2 import QtCore, QtGui, QtWidgets
from PySide2.QtWidgets import QApplication
from PySide2.QtGui import QColor, QPixmap, QImage, QPainter, QCursor
from PySide2.QtCore import Qt

myImage = QtGui.QPixmap("Complete_Path_to_image.bmp")
cursor = QtGui.QCursor(myImage)
QtWidgets.QApplication.setOverrideCursor(QtGui.QCursor(cursor))

наверх

Replace the form of mouse with one image (cross) include

The image is created by Gimp exported in a .XPM file. Copy and use the code between the bracket "{" code to copy "}"

import PySide2
from PySide2 import QtCore, QtGui, QtWidgets
from PySide2.QtWidgets import QApplication
from PySide2.QtGui import QColor, QPixmap, QImage, QPainter, QCursor
from PySide2.QtCore import Qt

cross32x32Icon = [
"32 32 2 1",
" 	c None",
".	c #FF0000",
"                .               ",
"                .               ",
"                .               ",
"                .               ",
"                .               ",
"                .               ",
"                .               ",
"                .               ",
"                .               ",
"                .               ",
"                .               ",
"                .               ",
"                .               ",
"                .               ",
"                .               ",
"                                ",
"............... . ..............",
"                                ",
"                .               ",
"                .               ",
"                .               ",
"                .               ",
"                .               ",
"                .               ",
"                .               ",
"                .               ",
"                .               ",
"                .               ",
"                .               ",
"                .               ",
"                .               ",
"                .               "
]

myImage = QtGui.QPixmap(cross32x32Icon)
cursor = QtGui.QCursor(myImage)
QtWidgets.QApplication.setOverrideCursor(QtGui.QCursor(cursor))

наверх

Observe camera change in the 3D viewer via Python

This can be done adding a Node sensor to the camera:

from pivy import coin
def callback(*args):
    cam, sensor = args
    print()
    print("Cam position : {}".format(cam.position.getValue().getValue()))
    print("Cam rotation : {}".format(cam.orientation.getValue().getValue()))

camera_node = Gui.ActiveDocument.ActiveView.getCameraNode()
node_sensor = coin.SoNodeSensor(callback, camera_node)
node_sensor.attach(camera_node)

наверх

Наблюдение за поведением мыши в трёхмерном окне через Python

Оболочка Inventor позволяет добавить один и более узлов обратного вызова (callback) в дерево сцен просмотрщика. По умолчанию, в FreeCAD на каждый просмотрщик установлен один узел обратного вызова, который позволяет добавить глобальные или статические функции C++. В соответствующих привязках Python предоставляются некоторые методы, позволяющие использовать эту технику из кода Python.

App.newDocument()
v=Gui.activeDocument().activeView()
 
#This class logs any mouse button events. As the registered callback function fires twice for 'down' and
#'up' events we need a boolean flag to handle this.
class ViewObserver:
   def logPosition(self, info):
       down = (info["State"] == "DOWN")
       pos = info["Position"]
       if (down):
           FreeCAD.Console.PrintMessage("Clicked on position: ("+str(pos[0])+", "+str(pos[1])+")\n")
       
o = ViewObserver()
c = v.addEventCallback("SoMouseButtonEvent",o.logPosition)


Теперь, выберите какую нибудь область в окне 3D-просмотра и наблюдайте сообщения в окне вывода. Для завершения наблюдения просто вызовите

v.removeEventCallback("SoMouseButtonEvent",c)

Поддерживаются следующие типы событий

  • SoEvent -- Все события
  • SoButtonEvent -- Все события клавиш клавиатуры и мыши
  • SoLocation2Event -- события 2D перемещений (обычно движение мыши)
  • SoMotion3Event -- события 3D перемещений (обычно spaceball)
  • SoKeyboradEvent -- события нажатие и отпускание клавиш клавиатуры
  • SoMouseButtonEvent -- события нажатия и отпускания клавиш мыши
  • SoSpaceballButtonEvent -- события нажатия и отпускания клавиш spaceball

Python функции которые могут быть зарегистрированы в addEventCallback() предлагающем словарь(dictionary). В зависимости от наблюдателя события словарь может содержать различные ключи.

Для всех событий существуют ключи:

  • Type -- Имя типа события т.е. SoMouseEvent, SoLocation2Event, ...
  • Time -- текущие время в виде строки
  • Position -- набор из двух целых чисел как позиция курсорa мыши
  • ShiftDown -- логическая(boolean) переменная, true если Shift нажат, в противном случае false
  • CtrlDown -- логическая(boolean) переменная, true если Ctrl нажат, в противном случае false
  • AltDown -- логическая(boolean) переменная, true если Alt нажат, в противном случае false

Для всех клавишных событий, т.e. для событий клавиатуры, мыши или spaceball

  • State -- Строка 'UP' если кнопка была вверху, 'DOWN' если кнопка была внизу или 'UNKNOWN' во всех остальных случаях

Для событий связанных с клавиатурой:

  • Key -- значение нажатоой клаывиши

Для событий связанных с мышью

  • Button -- Нажаты клавиши, могут быть BUTTON1, ..., BUTTON5 или ANY

Для событий spaceball:

  • Button -- Нажатые клавиши, могут быть BUTTON1, ..., BUTTON7 или ANY

и наконец события движения:

  • Translation -- набор из трех переменных floats
  • Rotation -- кватернион поворота, т.е. набор из четырех переменных floats

наверх

Показать нажатые клавиши и команды Событий

Этот макрос отображает в отчете нажатия клавиш и команды всех событий

App.newDocument()
v=Gui.activeDocument().activeView()
class ViewObserver:
   def logPosition(self, info):
       try:
           down = (info["Key"])
           FreeCAD.Console.PrintMessage(str(down)+"\n") # here the character pressed
           FreeCAD.Console.PrintMessage(str(info)+"\n") # list all events command
           FreeCAD.Console.PrintMessage("_______________________________________"+"\n")
       except Exception:
           None
 
o = ViewObserver()
c = v.addEventCallback("SoEvent",o.logPosition)

#v.removeEventCallback("SoEvent",c) # remove ViewObserver

наверх

Манипулирование графом сцен в Python

Возможно так же получить и изменить в Python граф сцен с помощью модуля 'pivy' - привязки Python для Coin.

from pivy.coin import *                # load the pivy module
view = Gui.ActiveDocument.ActiveView   # get the active viewer
root = view.getSceneGraph()            # the root is an SoSeparator node
root.addChild(SoCube())
view.fitAll()

API Python для pivy создано используя инструмент SWIG. Так как мы используем в FreeCAD некоторые самонаписанные узлы, вы не можете создавать их напрямую через Python. Но можно создать узел по его внутреннему имени. Экземпляр типа 'SoFCSelection' можно создать с помощью

type = SoType.fromName("SoFCSelection")
node = type.createInstance()

наверх

Добавление и удаление объектов в/из графа сцены

Добавление новых узлов в граф сцены (scenegraph) может сделать таким образом. Позаботьтесь всегда добавлять SoSeparator, чтобы иметь информацию о геометрии, координатах и материалах объекта. Следующий пример добавляет красную линию из (0,0,0) в (10,0,0):

from pivy import coin
sg = Gui.ActiveDocument.ActiveView.getSceneGraph()
co = coin.SoCoordinate3()
pts = [[0,0,0],[10,0,0]]
co.point.setValues(0,len(pts),pts)
ma = coin.SoBaseColor()
ma.rgb = (1,0,0)
li = coin.SoLineSet()
li.numVertices.setValue(2)
no = coin.SoSeparator()
no.addChild(co)
no.addChild(ma)
no.addChild(li)
sg.addChild(no)

Чтобы удалить её, просто введите:

sg.removeChild(no)

наверх

Сохранить sceneGraph в 3 сериях из 36 файлов

Просмотрите фрагмент кода, развернув этот раздел.

import math
import time
from FreeCAD import Base
from pivy import coin

size=(1000,1000)
dirname = "C:/Temp/animation/"
steps=36
angle=2*math.pi/steps

matX=Base.Matrix()
matX.rotateX(angle)
stepsX=Base.Placement(matX).Rotation

matY=Base.Matrix()
matY.rotateY(angle)
stepsY=Base.Placement(matY).Rotation

matZ=Base.Matrix()
matZ.rotateZ(angle)
stepsZ=Base.Placement(matZ).Rotation

view=Gui.ActiveDocument.ActiveView
cam=view.getCameraNode()
rotCamera=Base.Rotation(*cam.orientation.getValue().getValue())

# this sets the lookat point to the center of circumsphere of the global bounding box
view.fitAll()

# the camera's position, i.e. the user's eye point
position=Base.Vector(*cam.position.getValue().getValue())
distance=cam.focalDistance.getValue()

# view direction
vec=rotCamera.multVec(Base.Vector(0,0,-1))

# this is the point on the screen the camera looks at
# when rotating the camera we should make this point fix
lookat=position+vec*distance

# around x axis
for i in range(steps):
    rotCamera=stepsX.multiply(rotCamera)
    cam.orientation.setValue(*rotCamera.Q)
    vec=rotCamera.multVec(Base.Vector(0,0,-1))
    pos=lookat-vec*distance
    cam.position.setValue(pos.x,pos.y,pos.z)
    Gui.updateGui()
    time.sleep(0.3)
    view.saveImage(dirname+"x-%d.png" % i,*size)

# around y axis
for i in range(steps):
    rotCamera=stepsY.multiply(rotCamera)
    cam.orientation.setValue(*rotCamera.Q)
    vec=rotCamera.multVec(Base.Vector(0,0,-1))
    pos=lookat-vec*distance
    cam.position.setValue(pos.x,pos.y,pos.z)
    Gui.updateGui()
    time.sleep(0.3)
    view.saveImage(dirname+"y-%d.png" % i,*size)

# around z axis
for i in range(steps):
    rotCamera=stepsZ.multiply(rotCamera)
    cam.orientation.setValue(*rotCamera.Q)
    vec=rotCamera.multVec(Base.Vector(0,0,-1))
    pos=lookat-vec*distance
    cam.position.setValue(pos.x,pos.y,pos.z)
    Gui.updateGui()
    time.sleep(0.3)
    view.saveImage(dirname+"z-%d.png" % i,*size)

наверх

Добавление к интерфейсу пользовательских виджетов

Вы можете создать собственные виджеты с помощью Qt designerа, превратив их в сценарии на Python, и загрузив их в интерфейс FreeCAD с помощью PySide.

Python код созданный с помощью Ui python compiler (это инструмент для конвертирования файлов ui. созданных qt-designer в python код) в основном выглядит так (это простой пример, вы также может писать этот код напряму с помощью python):

class myWidget_Ui(object):
    def setupUi(self, myWidget):
        myWidget.setObjectName("my Nice New Widget")
        myWidget.resize(QtCore.QSize(QtCore.QRect(0,0,300,100).size()).expandedTo(myWidget.minimumSizeHint())) # sets size of the widget
 
        self.label = QtGui.QLabel(myWidget) # creates a label
        self.label.setGeometry(QtCore.QRect(50,50,200,24)) # sets its size
        self.label.setObjectName("label") # sets its name, so it can be found by name

    def retranslateUi(self, draftToolbar): # built-in QT function that manages translations of widgets
        myWidget.setWindowTitle(QtGui.QApplication.translate("myWidget", "My Widget", None, QtGui.QApplication.UnicodeUTF8))
        self.label.setText(QtGui.QApplication.translate("myWidget", "Welcome to my new widget!", None, QtGui.QApplication.UnicodeUTF8))

Тогда все что вам нужно сделать, это создать ссылку на FreeCAD Qt окно, вставить виджет в него, и "преобразовать" этот виджет в ваш с Ui кодом который мы только что сделали:

app = QtGui.qApp
FCmw = app.activeWindow() # the active qt window, = the freecad window since we are inside it
# FCmw = FreeCADGui.getMainWindow() # use this line if the 'addDockWidget' error is declared
myNewFreeCADWidget = QtGui.QDockWidget() # create a new dckwidget
myNewFreeCADWidget.ui = myWidget_Ui() # load the Ui script
myNewFreeCADWidget.ui.setupUi(myNewFreeCADWidget) # setup the ui
FCmw.addDockWidget(QtCore.Qt.RightDockWidgetArea,myNewFreeCADWidget) # add the widget to the main window

наверх

Добавить вкладку в Combo View

Следующий код позволяет добавить вкладку к Combo view отдельно от уже существующих вкладок «Модель» и «Задачи». Он также использует модуль uic для загрузки файла пользовательского интерфейса прямо на этой вкладке.

# create new Tab in ComboView
from PySide import QtGui,QtCore
#from PySide import uic

def getMainWindow():
   "returns the main window"
   # using QtGui.qApp.activeWindow() isn't very reliable because if another
   # widget than the mainwindow is active (e.g. a dialog) the wrong widget is
   # returned
   toplevel = QtGui.qApp.topLevelWidgets()
   for i in toplevel:
       if i.metaObject().className() == "Gui::MainWindow":
           return i
   raise Exception("No main window found")

def getComboView(mw):
   dw=mw.findChildren(QtGui.QDockWidget)
   for i in dw:
       if str(i.objectName()) == "Combo View":
           return i.findChild(QtGui.QTabWidget)
       elif str(i.objectName()) == "Python Console":
           return i.findChild(QtGui.QTabWidget)
   raise Exception ("No tab widget found")

mw = getMainWindow()
tab = getComboView(getMainWindow())
tab2=QtGui.QDialog()
tab.addTab(tab2,"A Special Tab")

#uic.loadUi("/myTaskPanelforTabs.ui",tab2)
tab2.show()
#tab.removeTab(2)

наверх

Enable or disable a window

This script give the ability to manipulate the UI from the Python console to show/hide different components in the FreeCAD interface such as:

from PySide import QtGui
mw = FreeCADGui.getMainWindow()
dws = mw.findChildren(QtGui.QDockWidget)

# objectName may be :
# "Report view"
# "Tree view"
# "Property view"
# "Selection view"
# "Combo View"
# "Python console"
# "draftToolbar"

for i in dws:
  if i.objectName() == "Report view":
    dw = i
    break

va = dw.toggleViewAction()
va.setChecked(True)        # True or False
dw.setVisible(True)        # True or False

наверх

Open a custom webpage

import WebGui
WebGui.openBrowser("http://www.example.com")

наверх

Get the HTML contents of an opened webpage

from PySide import QtGui,QtWebKit
a = QtGui.qApp
mw = a.activeWindow()
v = mw.findChild(QtWebKit.QWebFrame)
html = unicode(v.toHtml())
print( html)

наверх

Retrieve the coordinates of 3 selected points or objects

# -*- coding: utf-8 -*-
# the line above to put the accentuated in the remarks
# If this line is missing, an error will be returned
# extract and use the coordinates of 3 objects selected
import Part, FreeCAD, math, PartGui, FreeCADGui
from FreeCAD import Base, Console
sel = FreeCADGui.Selection.getSelection() # " sel " contains the items selected
if len(sel)!=3 :
  # If there are no 3 objects selected, an error is displayed in the report view
  # The \r and \n at the end of line mean return and the newline CR + LF.
  Console.PrintError("Select 3 points exactly\r\n")
else :
  points=[]
  for obj in sel:
    points.append(obj.Shape.BoundBox.Center)

  for pt in points:
    # display of the coordinates in the report view
    Console.PrintMessage(str(pt.x)+"\r\n")
    Console.PrintMessage(str(pt.y)+"\r\n")
    Console.PrintMessage(str(pt.z)+"\r\n")

  Console.PrintMessage(str(pt[1]) + "\r\n")

наверх

List all objects

# -*- coding: utf-8 -*-
import FreeCAD,Draft
# List all objects of the document
doc = FreeCAD.ActiveDocument
objs = FreeCAD.ActiveDocument.Objects
#App.Console.PrintMessage(str(objs) + "\n")
#App.Console.PrintMessage(str(len(FreeCAD.ActiveDocument.Objects)) + " Objects"  + "\n")

for obj in objs:
    a = obj.Name                                             # list the Name  of the object  (not modifiable)
    b = obj.Label                                            # list the Label of the object  (modifiable)
    try:
        c = obj.LabelText                                    # list the LabeText of the text (modifiable)
        App.Console.PrintMessage(str(a) +" "+ str(b) +" "+ str(c) + "\n") # Displays the Name the Label and the text
    except:
        App.Console.PrintMessage(str(a) +" "+ str(b) + "\n") # Displays the Name and the Label of the object

#doc.removeObject("Box") # Clears the designated object

наверх

List the dimensions of an object, given its name

for edge in FreeCAD.ActiveDocument.MyObjectName.Shape.Edges: # replace "MyObjectName" for list
    print( edge.Length)

наверх

Function resident with the mouse click action

Here with SelObserver on a object select

# -*- coding: utf-8 -*-
# causes an action to the mouse click on an object
# This function remains resident (in memory) with the function "addObserver(s)"
# "removeObserver(s) # Uninstalls the resident function
class SelObserver:
    def setPreselection(self,doc,obj,sub):                # Preselection object
        App.Console.PrintMessage(str(sub)+ "\n")          # The part of the object name

    def addSelection(self,doc,obj,sub,pnt):               # Selection object
        App.Console.PrintMessage("addSelection"+ "\n")
        App.Console.PrintMessage(str(doc)+ "\n")          # Name of the document
        App.Console.PrintMessage(str(obj)+ "\n")          # Name of the object
        App.Console.PrintMessage(str(sub)+ "\n")          # The part of the object name
        App.Console.PrintMessage(str(pnt)+ "\n")          # Coordinates of the object
        App.Console.PrintMessage("______"+ "\n")

    def removeSelection(self,doc,obj,sub):                # Remove the selection
        App.Console.PrintMessage("removeSelection"+ "\n")

    def setSelection(self,doc):                           # Set selection
        App.Console.PrintMessage("setSelection"+ "\n")

    def clearSelection(self,doc):                         # If click on the screen, clear the selection
        App.Console.PrintMessage("clearSelection"+ "\n")  # If click on another object, clear the previous object
s =SelObserver()
FreeCADGui.Selection.addObserver(s)                       # install the function mode resident
#FreeCADGui.Selection.removeObserver(s)                   # Uninstall the resident function

Other example with ViewObserver on a object select or view

App.newDocument()
v=Gui.activeDocument().activeView()
 
#This class logs any mouse button events. As the registered callback function fires twice for 'down' and
#'up' events we need a boolean flag to handle this.
class ViewObserver:
   def __init__(self, view):
       self.view = view
   
   def logPosition(self, info):
       down = (info["State"] == "DOWN")
       pos = info["Position"]
       if (down):
           FreeCAD.Console.PrintMessage("Clicked on position: ("+str(pos[0])+", "+str(pos[1])+")\n")
           pnt = self.view.getPoint(pos)
           FreeCAD.Console.PrintMessage("World coordinates: " + str(pnt) + "\n")
           info = self.view.getObjectInfo(pos)
           FreeCAD.Console.PrintMessage("Object info: " + str(info) + "\n")

o = ViewObserver(v)
c = v.addEventCallback("SoMouseButtonEvent",o.logPosition)

наверх

Display the active document

class DocObserver:                      # document Observer
    def slotActivateDocument(self,doc):
        print(doc.Name)

obs=DocObserver()
App.addDocumentObserver(obs)
#App.removeDocumentObserver(obs)                 # desinstalle la fonction residente

To remove the observer call:

App.removeDocumentObserver(obs)                 # desinstalle la fonction residente

наверх

Find/select all elements below the cursor

from pivy import coin
import FreeCADGui

def mouse_over_cb( event_callback):
    event = event_callback.getEvent()
    pos = event.getPosition().getValue()
    listObjects = FreeCADGui.ActiveDocument.ActiveView.getObjectsInfo((int(pos[0]),int(pos[1])))
    obj = []
    if listObjects:
        FreeCAD.Console.PrintMessage("\n *** Objects under mouse pointer ***")
        for o in listObjects:
            label = str(o["Object"])
            if not label in obj:
                obj.append(label)
        FreeCAD.Console.PrintMessage("\n"+str(obj))


view = FreeCADGui.ActiveDocument.ActiveView

mouse_over = view.addEventCallbackPivy( coin.SoLocation2Event.getClassTypeId(), mouse_over_cb )

# to remove Callback :
#view.removeEventCallbackPivy( coin.SoLocation2Event.getClassTypeId(), mouse_over)

####
#The easy way is probably to use FreeCAD's selection.
#FreeCADGui.ActiveDocument.ActiveView.getObjectsInfo(mouse_coords)

####
#you get that kind of result :
#'Document': 'Unnamed', 'Object': 'Box', 'Component': 'Face2', 'y': 8.604081153869629, 'x': 21.0, 'z': 8.553047180175781

####
#You can use this data to add your element to FreeCAD's selection :
#FreeCADGui.Selection.addSelection(FreeCAD.ActiveDocument.Box,'Face2',21.0,8.604081153869629,8.553047180175781)

наверх

Перечисление компонентов объекта

This function list the components of an object and extracts:

  • this object its XYZ coordinates,
  • its edges and their lengths center of mass and coordinates
  • its faces and their center of mass
  • its faces and their surfaces and coordinates
# -*- coding: utf-8 -*-
# This function list the components of an object
# and extract this object its XYZ coordinates,
# its edges and their lengths center of mass and coordinates
# its faces and their center of mass
# its faces and their surfaces and coordinates
# 8/05/2014

import Draft,Part
def detail():
    sel = FreeCADGui.Selection.getSelection()   # Select an object
    if len(sel) != 0:                           # If there is a selection then
        Vertx=[]
        Edges=[]
        Faces=[]
        compt_V=0
        compt_E=0
        compt_F=0
        pas    =0
        perimetre = 0.0   
        EdgesLong = []

        # Displays the "Name" and the "Label" of the selection
        App.Console.PrintMessage("Selection > " + str(sel[0].Name) + "  " + str(sel[0].Label) +"\n"+"\n")

        for j in enumerate(sel[0].Shape.Edges):                                     # Search the "Edges" and their lengths
            compt_E+=1
            Edges.append("Edge%d" % (j[0]+1))
            EdgesLong.append(str(sel[0].Shape.Edges[compt_E-1].Length))
            perimetre += (sel[0].Shape.Edges[compt_E-1].Length)                     # calculates the perimeter

            # Displays the "Edge" and its length
            App.Console.PrintMessage("Edge"+str(compt_E)+" Length > "+str(sel[0].Shape.Edges[compt_E-1].Length)+"\n")

            # Displays the "Edge" and its center mass
            App.Console.PrintMessage("Edge"+str(compt_E)+" Center > "+str(sel[0].Shape.Edges[compt_E-1].CenterOfMass)+"\n")

            num = sel[0].Shape.Edges[compt_E-1].Vertexes[0]
            Vertx.append("X1: "+str(num.Point.x))
            Vertx.append("Y1: "+str(num.Point.y))
            Vertx.append("Z1: "+str(num.Point.z))
            # Displays the coordinates 1
            App.Console.PrintMessage("X1: "+str(num.Point[0])+" Y1: "+str(num.Point[1])+" Z1: "+str(num.Point[2])+"\n")

            try:
                num = sel[0].Shape.Edges[compt_E-1].Vertexes[1]
                Vertx.append("X2: "+str(num.Point.x))
                Vertx.append("Y2: "+str(num.Point.y))
                Vertx.append("Z2: "+str(num.Point.z))
            except:
                Vertx.append("-")
                Vertx.append("-")
                Vertx.append("-")
            # Displays the coordinates 2
            App.Console.PrintMessage("X2: "+str(num.Point[0])+" Y2: "+str(num.Point[1])+" Z2: "+str(num.Point[2])+"\n")

            App.Console.PrintMessage("\n")
        App.Console.PrintMessage("Perimeter of the form  : "+str(perimetre)+"\n") 

        App.Console.PrintMessage("\n")
        FacesSurf = []
        for j in enumerate(sel[0].Shape.Faces):                                      # Search the "Faces" and their surface
            compt_F+=1
            Faces.append("Face%d" % (j[0]+1))
            FacesSurf.append(str(sel[0].Shape.Faces[compt_F-1].Area))

            # Displays 'Face' and its surface
            App.Console.PrintMessage("Face"+str(compt_F)+" >  Surface "+str(sel[0].Shape.Faces[compt_F-1].Area)+"\n")

            # Displays 'Face' and its CenterOfMass
            App.Console.PrintMessage("Face"+str(compt_F)+" >  Center  "+str(sel[0].Shape.Faces[compt_F-1].CenterOfMass)+"\n")

            # Displays 'Face' and its Coordinates
            FacesCoor = []
            fco = 0
            for f0 in sel[0].Shape.Faces[compt_F-1].Vertexes:                        # Search the Vertexes of the face
                fco += 1
                FacesCoor.append("X"+str(fco)+": "+str(f0.Point.x))
                FacesCoor.append("Y"+str(fco)+": "+str(f0.Point.y))
                FacesCoor.append("Z"+str(fco)+": "+str(f0.Point.z))

            # Displays 'Face' and its Coordinates
            App.Console.PrintMessage("Face"+str(compt_F)+" >  Coordinate"+str(FacesCoor)+"\n")

            # Displays 'Face' and its Volume
            App.Console.PrintMessage("Face"+str(compt_F)+" >  Volume  "+str(sel[0].Shape.Faces[compt_F-1].Volume)+"\n")
            App.Console.PrintMessage("\n")

        # Displays the total surface of the form
        App.Console.PrintMessage("Surface of the form    : "+str(sel[0].Shape.Area)+"\n")

        # Displays the total Volume of the form
        App.Console.PrintMessage("Volume  of the form    : "+str(sel[0].Shape.Volume)+"\n")

detail()

наверх

List the PropertiesList

import FreeCADGui
from FreeCAD import Console
o = App.ActiveDocument.ActiveObject
op = o.PropertiesList
for p in op:
    Console.PrintMessage("Property: "+ str(p)+ " Value: " + str(o.getPropertyByName(p))+"\r\n")

наверх

Add a single Property Comment

import Draft
obj = FreeCADGui.Selection.getSelection()[0]
obj.addProperty("App::PropertyString","GComment","Draft","Font name").GComment = "Comment here"
App.activeDocument().recompute()

наверх

Search and data extraction

Examples of research and decoding information on an object.

Each section is independently and is separated by "############" can be copied directly into the Python console, or in a macro or use this macro. The description of the macro in the commentary.

Displaying it in the "Report View" window (View > Views > Report view)

# -*- coding: utf-8 -*-
from __future__ import unicode_literals
 
# Exemples de recherche et de decodage d'informations sur un objet
# Chaque section peut etre copiee directement dans la console Python ou dans une macro ou utilisez la macro tel quel
# Certaines commandes se repetent seul l'approche est differente
# L'affichage se fait dans la Vue rapport : Menu Affichage > Vues > Vue rapport
#
# Examples of research and decoding information on an object
# Each section can be copied directly into the Python console, or in a macro or uses this macro
# Certain commands as repeat alone approach is different
# Displayed in Report view: View > Views > report view
#
# rev:30/08/2014:29/09/2014:17/09/2015 22/11/2019 30/12/2022
 
from FreeCAD import Base
import DraftVecUtils, Draft, Part

##################################################################################
# info in the object

box = App.ActiveDocument.getObject('Box')                                 # object 
####
print(dir(box))                                                           # all options disponible in the object
####
print(box.Name)                                                           # object name
####
print(box.Content)                                                        # content of the object in XML format
##################################################################################
#
# example of using the information listed
#
# search the name of the active document 
mydoc = FreeCAD.activeDocument().Name                                     # Name of active Document
App.Console.PrintMessage("Active docu    : "+(mydoc)+"\n")
##################################################################################

# search the document name and the name of the object selected
sel = FreeCADGui.Selection.getSelection()                                 # select object with getSelection()
object_FullName = sel[0].FullName                                         # file Name and Name of the object selected
App.Console.PrintMessage("object_FullName: "+(object_FullName)+"\n")
##################################################################################

# search the label of the object selected
sel = FreeCADGui.Selection.getSelection()                                 # select object with getSelection()
object_Label = sel[0].Label                                               # Label of the object (modifiable)
App.Console.PrintMessage("object_Label   : "+(object_Label)+"\n")
##################################################################################

#TypeID object FreeCAD selected
sel = FreeCADGui.Selection.getSelection()                                 # select object with getSelection()
App.Console.PrintMessage("sel            : "+str(sel[0])+"\n\n")          # sel[0] first object selected
##################################################################################

# search the Name of the object selected
sel = FreeCADGui.Selection.getSelection()                                 # select object with getSelection()
object_Name  = sel[0].Name                                                # Name of the object (not modifiable)
App.Console.PrintMessage("object_Name    : "+str(object_Name)+"\n\n")
##################################################################################

# search the Sub Element Name of the sub object selected
try:
    SubElement = FreeCADGui.Selection.getSelectionEx()                    # sub element name with getSelectionEx()
    element_ = SubElement[0].SubElementNames[0]                           # name of 1 element selected
    App.Console.PrintMessage("elementSelec   : "+str(element_)+"\n\n")            
except:
    App.Console.PrintMessage("Oups"+"\n\n")            
##################################################################################

# give the length of the subObject selected
SubElementLength = Gui.Selection.getSelectionEx()[0].SubObjects[0].Length # sub element or element name with getSelectionEx()
App.Console.PrintMessage("SubElement length: "+str(SubElementLength)+"\n")# length
##################################################################################

# list the edges and the coordinates of the object[0] selected
sel = FreeCADGui.Selection.getSelection()                                 # select object with getSelection()
i = 0
for j in enumerate(sel[0].Shape.Edges):                                   # list all Edges
    i += 1
    App.Console.PrintMessage("Edges n : "+str(i)+"\n")
    a = sel[0].Shape.Edges[j[0]].Vertexes[0]
    App.Console.PrintMessage("X1             : "+str(a.Point.x)+"\n")     # coordinate XYZ first point
    App.Console.PrintMessage("Y1             : "+str(a.Point.y)+"\n")     #
    App.Console.PrintMessage("Z1             : "+str(a.Point.z)+"\n")     #
    try:
        a = sel[0].Shape.Edges[j[0]].Vertexes[1]
        App.Console.PrintMessage("X2             : "+str(a.Point.x)+"\n") # coordinate XYZ second point
        App.Console.PrintMessage("Y2             : "+str(a.Point.y)+"\n") #
        App.Console.PrintMessage("Z2             : "+str(a.Point.z)+"\n") #
    except:
        App.Console.PrintMessage("Oups"+"\n")    
App.Console.PrintMessage("\n")    
##################################################################################

# give the sub element name, length, coordinates, BoundBox, BoundBox.Center, Area of the SubObjects selected
try:
    SubElement = FreeCADGui.Selection.getSelectionEx()                                        # sub element name with getSelectionEx()
    subElementName = Gui.Selection.getSelectionEx()[0].SubElementNames[0]                     # sub element name with getSelectionEx()
    App.Console.PrintMessage("subElementName : "+str(subElementName)+"\n")
    
    subObjectLength = Gui.Selection.getSelectionEx()[0].SubObjects[0].Length                  # sub element Length
    App.Console.PrintMessage("subObjectLength: "+str(subObjectLength)+"\n\n")
    
    subObjectX1 = Gui.Selection.getSelectionEx()[0].SubObjects[0].Vertexes[0].Point.x         # sub element coordinate X1
    App.Console.PrintMessage("subObject_X1   : "+str(subObjectX1)+"\n")
    subObjectY1 = Gui.Selection.getSelectionEx()[0].SubObjects[0].Vertexes[0].Point.y         # sub element coordinate Y1
    App.Console.PrintMessage("subObject_Y1   : "+str(subObjectY1)+"\n")
    subObjectZ1 = Gui.Selection.getSelectionEx()[0].SubObjects[0].Vertexes[0].Point.z         # sub element coordinate Z1
    App.Console.PrintMessage("subObject_Z1   : "+str(subObjectZ1)+"\n\n")

    try:
        subObjectX2 = Gui.Selection.getSelectionEx()[0].SubObjects[0].Vertexes[1].Point.x     # sub element coordinate X2
        App.Console.PrintMessage("subObject_X2   : "+str(subObjectX2)+"\n")
        subObjectY2 = Gui.Selection.getSelectionEx()[0].SubObjects[0].Vertexes[1].Point.y     # sub element coordinate Y2
        App.Console.PrintMessage("subObject_Y2   : "+str(subObjectY2)+"\n")
        subObjectZ2 = Gui.Selection.getSelectionEx()[0].SubObjects[0].Vertexes[1].Point.z     # sub element coordinate Z2
        App.Console.PrintMessage("subObject_Z2   : "+str(subObjectZ2)+"\n\n")
    except:
        App.Console.PrintMessage("Oups"+"\n\n")            

    subObjectBoundBox = Gui.Selection.getSelectionEx()[0].SubObjects[0].BoundBox              # sub element BoundBox coordinates
    App.Console.PrintMessage("subObjectBBox  : "+str(subObjectBoundBox)+"\n")
    
    subObjectBoundBoxCenter = Gui.Selection.getSelectionEx()[0].SubObjects[0].BoundBox.Center # sub element BoundBoxCenter
    App.Console.PrintMessage("subObjectBBoxCe: "+str(subObjectBoundBoxCenter)+"\n")
    
    surfaceFace = Gui.Selection.getSelectionEx()[0].SubObjects[0].Area                        # Area of the face selected
    App.Console.PrintMessage("surfaceFace    : "+str(surfaceFace)+"\n\n")
except:
    App.Console.PrintMessage("Oups"+"\n\n")            
##################################################################################

# give the area of the object
sel = FreeCADGui.Selection.getSelection()                                 # select object with getSelection()
surface = sel[0].Shape.Area                                               # Area object complete
App.Console.PrintMessage("surfaceObjet   : "+str(surface)+"\n\n")
##################################################################################

# give the Center Of Mass and coordinates of the object
sel = FreeCADGui.Selection.getSelection()                                 # select object with getSelection()
CenterOfMass = sel[0].Shape.CenterOfMass                                  # Center of Mass of the object
App.Console.PrintMessage("CenterOfMass   : "+str(CenterOfMass)+"\n")
App.Console.PrintMessage("CenterOfMassX  : "+str(CenterOfMass[0])+"\n")   # coordinates [0]=X [1]=Y [2]=Z
App.Console.PrintMessage("CenterOfMassY  : "+str(CenterOfMass[1])+"\n")   # or CenterOfMass.x, CenterOfMass.y, CenterOfMass.z
App.Console.PrintMessage("CenterOfMassZ  : "+str(CenterOfMass[2])+"\n\n")
##################################################################################

# list the all faces of the object selected
sel = FreeCADGui.Selection.getSelection()                                 # select object with getSelection()
for j in enumerate(sel[0].Shape.Faces):                                   # List alles faces of the object
    App.Console.PrintMessage("Face           : "+str("Face%d" % (j[0]+1))+"\n")
App.Console.PrintMessage("\n\n")
##################################################################################

# give the volume of the object selected
sel = FreeCADGui.Selection.getSelection()                                 # select object with getSelection()
volume_ = sel[0].Shape.Volume                                             # Volume of the object
App.Console.PrintMessage("volume_        : "+str(volume_)+"\n\n")
##################################################################################
 
# give the BoundBox of the oject selected all type
objs = FreeCADGui.Selection.getSelection()                                 # select object with getSelection()
if len(objs) >= 1:                                                         # serch the object type
    if hasattr(objs[0], "Shape"):
        s = objs[0].Shape
    elif hasattr(objs[0], "Mesh"):      # upgrade with wmayer thanks #http://forum.freecadweb.org/viewtopic.php?f=13&t=22331
        s = objs[0].Mesh
    elif hasattr(objs[0], "Points"):
        s = objs[0].Points

boundBox_= s.BoundBox                                                     # BoundBox of the object
App.Console.PrintMessage("boundBox_      : "+str(boundBox_)+"\n")         # 
 
boundBoxLX   = boundBox_.XLength                                          # Length x boundBox rectangle
boundBoxLY   = boundBox_.YLength                                          # Length y boundBox rectangle
boundBoxLZ   = boundBox_.ZLength                                          # Length z boundBox rectangle

boundBoxXMin = boundBox_.XMin                                             # coordonate XMin
boundBoxYMin = boundBox_.YMin                                             # coordonate YMin
boundBoxZMin = boundBox_.ZMin                                             # coordonate ZMin
boundBoxXMax = boundBox_.XMax                                             # coordonate XMax
boundBoxYMax = boundBox_.YMax                                             # coordonate YMax
boundBoxZMax = boundBox_.ZMax                                             # coordonate ZMax

boundBoxDiag= boundBox_.DiagonalLength                                    # Diagonal Length boundBox rectangle
boundBoxCenter = boundBox_.Center                                         # BoundBox Center
boundBoxCenterOfGravity = boundBox_.CenterOfGravity                       # BoundBox CenterOfGravity

App.Console.PrintMessage("boundBoxLX     : "+str(boundBoxLX)+"\n")
App.Console.PrintMessage("boundBoxLY     : "+str(boundBoxLY)+"\n")
App.Console.PrintMessage("boundBoxLZ     : "+str(boundBoxLZ)+"\n\n")

App.Console.PrintMessage("boundBoxXMin   : "+str(boundBoxXMin)+"\n")
App.Console.PrintMessage("boundBoxYMin   : "+str(boundBoxYMin)+"\n")
App.Console.PrintMessage("boundBoxZMin   : "+str(boundBoxZMin)+"\n")
App.Console.PrintMessage("boundBoxXMax   : "+str(boundBoxXMax)+"\n")
App.Console.PrintMessage("boundBoxYMax   : "+str(boundBoxYMax)+"\n")
App.Console.PrintMessage("boundBoxZMax   : "+str(boundBoxZMax)+"\n\n")

App.Console.PrintMessage("boundBoxDiag   : "+str(boundBoxDiag)+"\n")
App.Console.PrintMessage("boundBoxCenter : "+str(boundBoxCenter)+"\n")

App.Console.PrintMessage("boundBox Center of Gravity : "+str(boundBoxCenterOfGravity )+"\n\n")

##################################################################################

# give the complete placement of the object selected
sel = FreeCADGui.Selection.getSelection()                                 # select object with getSelection()
pl = sel[0].Shape.Placement                                               # Placement Vector XYZ and Yaw-Pitch-Roll
App.Console.PrintMessage("Placement      : "+str(pl)+"\n")
##################################################################################

# give the placement Base (xyz) of the object selected
sel = FreeCADGui.Selection.getSelection()                                 # select object with getSelection()
pl = sel[0].Shape.Placement.Base                                          # Placement Vector XYZ
App.Console.PrintMessage("PlacementBase  : "+str(pl)+"\n\n")
##################################################################################
 
# give the placement Base (xyz) of the object selected
sel = FreeCADGui.Selection.getSelection()                                 # select object with getSelection()
oripl_X = sel[0].Placement.Base[0]                                        # decode Placement X
oripl_Y = sel[0].Placement.Base[1]                                        # decode Placement Y
oripl_Z = sel[0].Placement.Base[2]                                        # decode Placement Z

# same 
#oripl_X = sel[0].Placement.Base.x                                        # decode Placement X
#oripl_Y = sel[0].Placement.Base.y                                        # decode Placement Y
#oripl_Z = sel[0].Placement.Base.z                                        # decode Placement Z
 
App.Console.PrintMessage("oripl_X        : "+str(oripl_X)+"\n")
App.Console.PrintMessage("oripl_Y        : "+str(oripl_Y)+"\n")
App.Console.PrintMessage("oripl_Z        : "+str(oripl_Z)+"\n\n")
##################################################################################

# give the placement rotation of the object selected (x, y, z, angle rotation)
sel = FreeCADGui.Selection.getSelection()                                 # select object with getSelection()
rotation = sel[0].Placement.Rotation                                      # decode Placement Rotation
App.Console.PrintMessage("rotation              : "+str(rotation)+"\n\n")
##################################################################################

# give the placement rotation of the object selected (x, y, z, angle rotation)
sel = FreeCADGui.Selection.getSelection()                                 # select object with getSelection()
pl = sel[0].Shape.Placement.Rotation                                      # decode Placement Rotation other method
App.Console.PrintMessage("Placement Rot         : "+str(pl)+"\n\n")
##################################################################################

# give the rotation of the object selected (angle rotation)
sel = FreeCADGui.Selection.getSelection()                                 # select object with getSelection()
pl = sel[0].Shape.Placement.Rotation.Angle                                # decode Placement Rotation Angle
App.Console.PrintMessage("Placement Rot Angle   : "+str(pl)+"\n\n")
##################################################################################

# give the rotation.Q of the object selected (angle rotation in Radian) for convert: math.degrees(angleInRadian)
sel = FreeCADGui.Selection.getSelection()                                 # select object with getSelection()
Rot   = sel[0].Placement.Rotation.Q                                       # Placement Rotation Q
App.Console.PrintMessage("Rot           : "+str(Rot)+ "\n")
 
Rot_0 = sel[0].Placement.Rotation.Q[0]                                    # decode Placement Rotation Q
App.Console.PrintMessage("Rot_0         : "+str(Rot_0)+ " rad ,  "+str(180 * Rot_0 / 3.1416)+" deg "+"\n") # or math.degrees(angle)
 
Rot_1 = sel[0].Placement.Rotation.Q[1]                                    # decode Placement Rotation 1
App.Console.PrintMessage("Rot_1         : "+str(Rot_1)+ " rad ,  "+str(180 * Rot_1 / 3.1416)+" deg "+"\n") # or math.degrees(angle)
 
Rot_2 = sel[0].Placement.Rotation.Q[2]                                    # decode Placement Rotation 2
App.Console.PrintMessage("Rot_2         : "+str(Rot_2)+ " rad ,  "+str(180 * Rot_2 / 3.1416)+" deg "+"\n") # or math.degrees(angle)

Rot_3 = sel[0].Placement.Rotation.Q[3]                                    # decode Placement Rotation 3
App.Console.PrintMessage("Rot_3         : "+str(Rot_3)+"\n\n")

Rot_Axis = sel[0].Placement.Rotation.Axis                                 # Placement Rotation .Axis
App.Console.PrintMessage("Rot_Axis      : "+str(Rot_Axis)+ "\n")
 
Rot_Angle = sel[0].Placement.Rotation.Angle                               # Placement Rotation .Angle
App.Console.PrintMessage("Rot_Angle     : "+str(Rot_Angle)+ "\n\n")
##################################################################################

# give the rotation of the object selected toEuler (angle rotation in degrees)
sel = FreeCADGui.Selection.getSelection()                             # select object with getSelection()
angle   = sel[0].Shape.Placement.Rotation.toEuler()                   # angle Euler
App.Console.PrintMessage("Angle          : "+str(angle)+"\n")
Yaw   = sel[0].Shape.Placement.Rotation.toEuler()[0]                  # decode angle Euler Yaw (Z) lacet (alpha)
App.Console.PrintMessage("Yaw            : "+str(Yaw)+"\n")
Pitch = sel[0].Shape.Placement.Rotation.toEuler()[1]                  # decode angle Euler Pitch (Y) tangage (beta)
App.Console.PrintMessage("Pitch          : "+str(Pitch)+"\n")
Roll  = sel[0].Shape.Placement.Rotation.toEuler()[2]                  # decode angle Euler Roll (X) roulis (gamma)
App.Console.PrintMessage("Roll           : "+str(Roll)+"\n\n")

rot = App.Rotation()
rot.setYawPitchRoll(45,45,0)
print("Angle: ", rot.Angle)
print("Axis: ", rot.Axis)
print("RawAxis: ", rot.RawAxis)
print("YawPitchRoll: ", rot.getYawPitchRoll())
print("Rotation: ", rot)
print("Quaternion: ", rot.Q)

##################################################################################

# find Midpoint of the selected line
import Draft, DraftGeomUtils
sel = FreeCADGui.Selection.getSelection()
vecteur = DraftGeomUtils.findMidpoint(sel[0].Shape.Edges[0])              # find Midpoint
App.Console.PrintMessage(vecteur)
Draft.makePoint(vecteur)
##################################################################################

наверх

Manual search of an element with label

# Extract the coordinate X,Y,Z and Angle giving the label (here "Cylindre")
App.Console.PrintMessage("Base.x       : "+str(FreeCAD.ActiveDocument.getObjectsByLabel("Cylindre")[0].Placement.Base.x)+"\n")
App.Console.PrintMessage("Base.y       : "+str(FreeCAD.ActiveDocument.getObjectsByLabel("Cylindre")[0].Placement.Base.y)+"\n")
App.Console.PrintMessage("Base.z       : "+str(FreeCAD.ActiveDocument.getObjectsByLabel("Cylindre")[0].Placement.Base.z)+"\n")
App.Console.PrintMessage("Base.Angle   : "+str(FreeCAD.ActiveDocument.getObjectsByLabel("Cylindre")[0].Placement.Rotation.Angle)+"\n\n")
##################################################################################

Note: Usually the angles are given in Radian. To convert them:

  1. angle in Degrees to Radians :
    • Angle in radian = pi * (angle in degree) / 180
    • Angle in radian = math.radians(angle in degree)
  2. angle in Radians to Degrees :
    • Angle in degree = 180 * (angle in radian) / pi
    • Angle in degree = math.degrees(angle in radian)

наверх

Cartesian coordinates

This code displays the Cartesian coordinates of the selected item.

Change the value of "numberOfPoints" if you want a different number of points (precision)

numberOfPoints = 100                                                         # Decomposition number (or precision you can change)
selectedEdge = FreeCADGui.Selection.getSelectionEx()[0].SubObjects[0].copy() # select one element
points  = selectedEdge.discretize(numberOfPoints)                            # discretize the element
i=0
for p in points:                                                             # list and display the coordinates
    i+=1
    print( i, " X", p.x, " Y", p.y, " Z", p.z)

Other method display on "Int" and "Float"

import Part
from FreeCAD import Base

c=Part.makeCylinder(2,10)        # create the circle
Part.show(c)                     # display the shape

# slice accepts two arguments:
#+ the normal of the cross section plane
#+ the distance from the origin to the cross section plane. Here you have to find a value so that the plane intersects your object
s=c.slice(Base.Vector(0,1,0),0)  # 

# here the result is a single wire
# depending on the source object this can be several wires
s=s[0]

# if you only need the vertexes of the shape you can use
v=[]
for i in s.Vertexes:
    v.append(i.Point)

# but you can also sub-sample the section to have a certain number of points (int) ...
p1=s.discretize(20)
ii=0
for i in p1:
    ii+=1
    print( i )                                             # Vector()
    print( ii, ": X:", i.x, " Y:", i.y, " Z:", i.z )       # Vector decode
Draft.makeWire(p1,closed=False,face=False,support=None)    # to see the difference accuracy (20)

## uncomment to use
#import Draft
#Draft.downgrade(App.ActiveDocument.ActiveObject,delete=True)  # first transform the DWire in Wire         "downgrade"
#Draft.downgrade(App.ActiveDocument.ActiveObject,delete=True)  # second split the Wire in single objects   "downgrade"
#
##Draft.upgrade(FreeCADGui.Selection.getSelection(),delete=True) # to attach lines contiguous SELECTED use "upgrade"


# ... or define a sampling distance (float)
p2=s.discretize(0.5)
ii=0
for i in p2:
    ii+=1
    print( i )                                             # Vector()
    print( ii, ": X:", i.x, " Y:", i.y, " Z:", i.z )       # Vector decode 
Draft.makeWire(p2,closed=False,face=False,support=None)  # to see the difference accuracy (0.5)

## uncomment to use
#import Draft
#Draft.downgrade(App.ActiveDocument.ActiveObject,delete=True)  # first transform the DWire in Wire         "downgrade"
#Draft.downgrade(App.ActiveDocument.ActiveObject,delete=True)  # second split the Wire in single objects   "downgrade"
#
##Draft.upgrade(FreeCADGui.Selection.getSelection(),delete=True) # to attach lines contiguous SELECTED use "upgrade"

наверх

Select all objects in the document

import FreeCAD
for obj in FreeCAD.ActiveDocument.Objects:
    print( obj.Name )                               # display the object Name
    objName = obj.Name
    obj = App.ActiveDocument.getObject(objName)
    Gui.Selection.addSelection(obj)                 # select the object

наверх

Select a face of an object by Name object and Face number

# select one face of the object
import FreeCAD, Draft
App=FreeCAD
nameObject = "Box"                             # objet
faceSelect = "Face3"                           # face to selection
loch=App.ActiveDocument.getObject(nameObject)  # objet
Gui.Selection.clearSelection()                 # clear all selection
Gui.Selection.addSelection(loch,faceSelect)    # select the face specified
s = Gui.Selection.getSelectionEx()
#Draft.makeFacebinder(s)                       #

наверх

Get the normal vector of a face of an object by Name object and number Face (r.Q)

## normal of a face by giving the number of the face and the name of the object (rotation Q with yL, uV) = (App.Vector (x, y, z), angle))
## normal d'une face en donnant le numero de la face et le nom de l'objet (rotation Q avec yL, uV) = (App.Vector(x, y, z),angle))
from FreeCAD import Vector

numero_Face = 2      # number of the face searched (begin 0, 1, 2, 3 .....)
nomObjet    = "Box"  # object name
yL = Gui.ActiveDocument.getObject(nomObjet).Object.Shape.Faces[numero_Face].CenterOfMass
uv = Gui.ActiveDocument.getObject(nomObjet).Object.Shape.Faces[numero_Face].Surface.parameter(yL)

nv = Gui.ActiveDocument.getObject(nomObjet).Object.Shape.Faces[numero_Face].normalAt(uv[0], uv[1])
direction = yL.sub(nv + yL)
print("Direction  : ",direction)

r = App.Rotation(App.Vector(0,0,1),direction)
print("Rotation   : ", r)
print("Rotation Q : ", r.Q)

наверх

Get the normal vector of a face of an object by Name object and number of Face

numero_Face = 2       # number of the face searched (begin 0, 1, 2, 3 .....)
nomObjet    = "Box"   # object name
normal      = Gui.ActiveDocument.getObject(nomObjet).Object.Shape.Faces[numero_Face].normalAt(0,0)
print("Face"+str(numero_Face), " : ", normal)

наверх

Get the normal vector of an object selected and number of Face

## normal of a face by giving the number of the face of the selected object
selectionObjects = FreeCADGui.Selection.getSelection()     
numero_Face = 3    # numero de la face recherchee
normal = selectionObjects[0].Shape.Faces[numero_Face].normalAt(0,0)
print(normal)
# selectionne la face numerotee
Gui.Selection.clearSelection()
Gui.Selection.addSelection(selectionObjects[0],"Face"+str(numero_Face))

наверх

Get the normal vector on the surface

This example show how to find normal vector on the surface by find the u,v parameters of one point on the surface and use u,v parameters to find normal vector

def normal(self):
   ss=FreeCADGui.Selection.getSelectionEx()[0].SubObjects[0].copy()#SubObjects[0] is the edge list
   points  = ss.discretize(3.0)#points on the surface edge, 
             #this example just use points on the edge for example. 
             #However point is not necessary on the edge, it can be anywhere on the surface. 
   face=FreeCADGui.Selection.getSelectionEx()[0].SubObjects[1]
   for pp in points:
      pt=FreeCAD.Base.Vector(pp.x,pp.y,pp.z)#a point on the surface edge
      uv=face.Surface.parameter(pt)# find the surface u,v parameter of a point on the surface edge
      u=uv[0]
      v=uv[1]
      normal=face.normalAt(u,v)#use u,v to find normal vector
      print( normal)
      line=Part.makeLine((pp.x,pp.y,pp.z), (normal.x,normal.y,normal.z))
      Part.show(line)

наверх

Get the normal vector of the face and create a line at the point mouse clicked

import PySide2
import Draft, Part, FreeCAD, FreeCADGui
import FreeCADGui as Gui
from FreeCAD import Base

FreeCAD.ActiveDocument.openTransaction("Tyty")    # memorise les actions (avec annuler restore)
selectedFace = FreeCADGui.Selection.getSelectionEx()[0].SubObjects[0]
pointClick = FreeCADGui.Selection.getSelectionEx()[0].PickedPoints[0]

########## section direction
plr = FreeCAD.Placement()
yL = pointClick
uv = selectedFace.Surface.parameter(yL)
nv = direction = selectedFace.normalAt(uv[0], uv[1])
r = App.Rotation(App.Vector(0,0,1),nv)
plr.Rotation.Q = r.Q
plr.Base = pointClick
########## section direction

line = Draft.make_wire([App.Vector(0.0,0.0,0.0), App.Vector(0.0,0.0,20.0)] )    # create line
line.Placement=plr
FreeCAD.ActiveDocument.recompute()
print( "Direction (radian) : ",direction )    # direction in radian

наверх

Get the normal vector of a surface from a STL file

def getNormal(cb):
    if cb.getEvent().getState() == coin.SoButtonEvent.UP:
        pp = cb.getPickedPoint()
        if pp:
            vec = pp.getNormal().getValue()
            index = coin.cast(pp.getDetail(), "SoFaceDetail").getFaceIndex()
            print("Normal: {}, Face index: {}".format(str(vec), index))

from pivy import coin
meth=Gui.ActiveDocument.ActiveView.addEventCallbackPivy(coin.SoMouseButtonEvent.getClassTypeId(), getNormal)

you are done then run for quit:

Gui.ActiveDocument.ActiveView.removeEventCallbackPivy(coin.SoMouseButtonEvent.getClassTypeId(), meth)

наверх

Create one object to the position of the Camera

# create one object of the position to camera with "getCameraOrientation()"
# the object is still facing the screen
import Draft

plan = FreeCADGui.ActiveDocument.ActiveView.getCameraOrientation()
plan = str(plan)
###### extract data
a    = ""
for i in plan:
    if i in ("0123456789e.- "):
        a+=i
a = a.strip(" ")
a = a.split(" ")
####### extract data

#print( a)
#print( a[0])
#print( a[1])
#print( a[2])
#print( a[3])

xP = float(a[0])
yP = float(a[1])
zP = float(a[2])
qP = float(a[3])

pl = FreeCAD.Placement()
pl.Rotation.Q = (xP,yP,zP,qP)         # rotation of object
pl.Base = FreeCAD.Vector(0.0,0.0,0.0) # here coordinates XYZ of Object
rec = Draft.makeRectangle(length=10.0,height=10.0,placement=pl,face=False,support=None) # create rectangle
#rec = Draft.makeCircle(radius=5,placement=pl,face=False,support=None)                   # create circle
print( rec.Name)

here same code simplified

import Draft
pl = FreeCAD.Placement()
pl.Rotation = FreeCADGui.ActiveDocument.ActiveView.getCameraOrientation()
pl.Base = FreeCAD.Vector(0.0,0.0,0.0)
rec = Draft.makeRectangle(length=10.0,height=10.0,placement=pl,face=False,support=None)

наверх

Read And write one Expression

import Draft
doc = FreeCAD.ActiveDocument

pl=FreeCAD.Placement()
pl.Rotation.Q=(0.0,-0.0,-0.0,1.0)
pl.Base=FreeCAD.Vector(0.0,0.0,0.0)
obj = Draft.makeCircle(radius=1.0,placement=pl,face=False,support=None)    # create circle

print( obj.PropertiesList )                                                  # properties disponible in the obj

doc.getObject(obj.Name).setExpression('Radius', u'2mm')                    # modify the radius
doc.getObject(obj.Name).setExpression('Placement.Base.x', u'10mm')         # modify the placement 
doc.getObject(obj.Name).setExpression('FirstAngle', u'90')                 # modify the first angle
doc.recompute()

expressions = obj.ExpressionEngine                                         # read the expression list
print( expressions)

for i in expressions:                                                      # list and separate the data expression
    print( i[0]," = ",i[1])

наверх

Create a Sketch on a Surface in PartDesign

This snippet can be useful, if you want to create a sketch on a surface in PartDesign from inside a macro. Note, that body might be None, if no active body is selected and that the Selection might be empty.

body = Gui.ActiveDocument.ActiveView.getActiveObject('pdbody')
first_selection = Gui.Selection.getSelectionEx()[0]

feature = first_selection.Object
face_name = first_selection.SubElementNames[0]

sketch = App.ActiveDocument.addObject('Sketcher::SketchObject','MySketch')
body.addObject(sketch)
sketch.MapMode = 'FlatFace'
sketch.Support = (feature, face_name)

App.ActiveDocument.recompute()

наверх

How to Simulate a Mouse Click at a given Coordinate

The position is relative to the GL widget. See forum thread.

from PySide2 import QtCore
from PySide2 import QtGui
from PySide2 import QtWidgets

mw = Gui.getMainWindow()
gl = mw.findChild(QtWidgets.QOpenGLWidget)
me = QtGui.QMouseEvent(QtCore.QEvent.MouseButtonRelease, QtCore.QPoint(800,300), QtCore.Qt.LeftButton, QtCore.Qt.LeftButton, QtCore.Qt.NoModifier)

app = QtWidgets.QApplication.instance()
app.sendEvent(gl, me)

If you have a 3d point and want to get the 2d point on the opengl widget then use this:

from PySide2 import QtCore
from PySide2 import QtGui
from PySide2 import QtWidgets
from FreeCAD import Base

x, y, z, = 10,10,10
v = Gui.ActiveDocument.ActiveView
point3d = Base.Vector(x, y, z)
point2d = v.getPointOnScreen(point3d)
size = v.getSize()
coordX = point2d[0]
coordY = size[1] - point2d[1]

me = QtGui.QMouseEvent(QtCore.QEvent.MouseButtonRelease, QtCore.QPoint(coordX,coordY), QtCore.Qt.LeftButton, QtCore.Qt.LeftButton, QtCore.Qt.NoModifier)

наверх

How to create a face with holes using Python API

This snippet demonstrates how to create a face with internal holes through the Python API. See forum thread.

import FreeCAD, Part

# Create poles that will define the Face
pts = [(-2, 2, 0),
       (0, 2, 1),
       (2, 2, 0),
       (2, -2, 0),
       (0, -2, 1),
       (-2, -2, 0)]

bs = Part.BSplineCurve()
bs.buildFromPoles(pts, True)  # True makes this periodic/closed

# Make the Face from the curve
myFace = Part.makeFilledFace([bs.toShape()])

# Create geometry for holes that will be cut in the surface
hole0 = Part.Geom2d.Circle2d(FreeCAD.Base.Vector2d(0,0), 1.0)
hole1 = Part.Geom2d.Circle2d(FreeCAD.Base.Vector2d(0,1.5), 0.1)

edge0 = hole0.toShape(myFace)
edge1 = hole1.toShape(myFace)
wireb = Part.Wire(bs.toShape())
wire0 = Part.Wire(edge0)
wire1 = Part.Wire(edge1)

# Cut holes in the face
myFace.cutHoles([wire0])
myFace.validate()  # This is required
myFace.cutHoles([wire1])
myFace.validate()

Part.show(myFace)

наверх

Close and restart FreeCAD

import PySide2 
from PySide2 import QtWidgets, QtCore, QtGui

def restart_freecad():
    """Shuts down and restarts FreeCAD"""

    args = QtWidgets.QApplication.arguments()[1:]
    if FreeCADGui.getMainWindow().close():
        QtCore.QProcess.startDetached(
            QtWidgets.QApplication.applicationFilePath(), args
        )

наверх

Coin3D

See Coin3d snippets

наверх

Сопутствующая информация

наверх


Введение

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

Основной скрипт

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

import FreeCADGui, Part
from pivy.coin import *

class line:

    """This class will create a line after the user clicked 2 points on the screen"""

    def __init__(self):
        self.view = FreeCADGui.ActiveDocument.ActiveView
        self.stack = []
        self.callback = self.view.addEventCallbackPivy(SoMouseButtonEvent.getClassTypeId(), self.getpoint)

    def getpoint(self, event_cb):
        event = event_cb.getEvent()
        if event.getState() == SoMouseButtonEvent.DOWN:
            pos = event.getPosition()
            point = self.view.getPoint(pos[0], pos[1])
            self.stack.append(point)
            if len(self.stack) == 2:
                l = Part.LineSegment(self.stack[0], self.stack[1])
                shape = l.toShape()
                Part.show(shape)
                self.view.removeEventCallbackPivy(SoMouseButtonEvent.getClassTypeId(), self.callback)

наверх

Подробное описание

import Part, FreeCADGui
from pivy.coin import *

В Python, когда вам требуется использовать функции из другого модуля, вам нужно импортировать его. В нашем случае, нам нужны функции из Модуля Деталей, для создания линии, и из Gui модуля (FreeCADGui), для доступа к 3D виду. Нам также нужно полное содержание библиотеки coin, так мы сможем напрямую использовать все coin объекта такие как SoMouseButtonEvent, и.т.д...

class line:

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

"""This class will create a line after the user clicked 2 points on the screen"""

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

def __init__(self):

Python класс всегда может содержать __init__ функцию, которая выполняется когда класс вызывается для создания объекта. Таким образом, мы положим сюда всё что мы хотим чтобы случилось, когда запустится наш инструмент "линия".

self.view = FreeCADGui.ActiveDocument.ActiveView

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

self.stack = []

Здесь мы создаем простой список содержащий 3D точки, переданные функцией getpoint.

self.callback = self.view.addEventCallbackPivy(SoMouseButtonEvent.getClassTypeId(), self.getpoint)

Это важная часть: Посколько это фактически coin3D сцена(в смысле окно отображения), FreeCAD использует механизм обратного вызова coin, что позваляет вызывать функцию каждый раз когда на сцене что-то происходит. В нашем случае, мы создаем обратный вызов для события SoMouseButtonEvent , и мы привязываем его getpoint функции. Теперь, каждый раз когда клавиша мыши будет нажата или отпущена, будет выполнятся функция getpoint.

Замети также что существует альтернативна addEventCallbackPivy(), зовется addEventCallback() которая обходится без использование pivy. Но так как pivy это очень эффективный и естественный способ получить доступ к любой части coin сцены, он гораздо лучше для использования так как вы можете!

наверх

def getpoint(self, event_cb):

Теперь вы задали getpoint функцию, которая выполняется когда клавиша мыши щелкает по окну 3D вида. Эта функция будет получать аргумент, который мы назовем event_cb. В время обратного вызова мы можем получить доступ к объекту события, который содержит некоторую информацию (информационный режим описан здесь).

if event.getState() == SoMouseButtonEvent.DOWN:

Getpoint функция будет вызыватся когда клавиши мыши будет нажата или отжата. Но мы хотим фиксировать 3D точку только когда нажимаем (в противном случае мы мы можем получить две 3D точки очень близко друг от друга). Так что мы проверяем это.

pos = event.getPosition()

Здесь мы получаем координаты курсора мыши

point = self.view.getPoint(pos[0], pos[1])

Эта функция дает нам FreeCAD вектор (x,y,z) содержащий точку лежащую в фокальной плоскости, т.е. под вашим курсором. Если вы находитесь в режиме камеры, изображается луч идущий из камеры проходящий через курсор мыши, и достигающий фокальной плоскости. Это наша 3D точка. Если мы находимся в режиме ортогонального отображения, луч паралелен направлению вида.

self.stack.append(point)

Мы добавляем новую точку в stack

if len(self.stack) == 2:

Если у вас, уже достаточное количество точек? если да, тогда давайте рисовать линию!

l = Part.LineSegment(self.stack[0], self.stack[1])

Здесь мы используем Line() функцию из Модуля Деталей которая создает линию по двум FreeCAD векторам. Все что мы создаем и модифицируем внутри модуля Деталей, остается в модуле(Part module). Так что, до сих пор, когда мы создавали Line Part. Она не была привязана к какому либо объекту в нашем документе, поэтому ничего и не отображалось на экране.

shape = l.toShape()

FreeCAD документ может принимать только формы(shapes) из модуля Деталей. Формы являются наиболее универсальным типом из модуля Деталей. Таким образом, мы должны преобразовать нашу линию в форму и добавить её в документ.

Part.show(shape)

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

self.view.removeEventCallbackPivy(SoMouseButtonEvent.getClassTypeId(), self.callback)

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

наверх

Тестирвание сценария

Теперь, давайте сохраним наш сценарий где нибудь где FreeCAD python интепритатор сможет его найти. Когда импортируются модули, интепритатор просматривает следующие места: директорию куда установлен python,FreeCAD bin директорию, и все папки FreeCAD модулей. Так что, лучшим решением будет создать новую папку в одной из FreeCAD Mod папках, и сохранит наш сценарий в ней. Например, давайте создадим папку "MyScripts" , и сохраним наш сценарий как "exercise.py".

Теперь, когда все готово, давайте запустим FreeCAD, создадим новый документ, и введем в python интерпритатор:

import exercise

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

dir(exercise)

Команда dir() встроенная python которая выдает список содержащегося в модуле. Мы можем видеть здесь нас ждет, наш класс line(). Теперь давайте протестируем его:

'line' in dir(exercise)

Приступим к тестированию:

exercise.line()

Затем, щелкнем два раза на 3D виде, и бинго, вот наша линия! Чтобы сделать это снова , просто опять введите exercise.line(), и ещё раз, и ещё раз... Чувствуете себе прекрасно, не так ли?

наверх

Регистрация сценария

Теперь, для нашего нового инструмента "линия" будет здорово, если он будет обладать кнопкой в интерфейсе, так чтобы нам не нужно было его каждый раз вводить. Простейший путь это преобразовать наш новый каталог MyScripts в полноценнный FreeCAD инструментарий(workbench). Это просто, все что нужно это поместить в файл зовущийся InitGui.py внутрь вашей MyScripts папки. InitGui.py будет содержать инструкции создания нового инструментария, м добавлять наш новый инструмент в него. Кроме того мы должны трансформировать код нашего примера, так чтобы инструмент line() был признан как официальная FreeCAD команда. Начнем с создания InitGui.py файла, и запишем в него следующий код:

class MyWorkbench (Workbench):

    MenuText = "MyScripts"

    def Initialize(self):
        import exercise
        commandslist = ["line"]
        self.appendToolbar("My Scripts", commandslist)

Gui.addWorkbench(MyWorkbench())

К этому моменту , я думаю, вы должны понимать сценарий выше: Мы создали новый класс назвали его MyWorkbench, мы задаем заглавие(MenuText), и задаем Initialize() функцию, которая будет выполняться когда инструментарий будт загружен в FreeCAD. В этой функции, мы загружаем вск что содержится в нашем exercise файле, и добавляем в FreeCAD команды найденные внутри списка команд(commandlist). Затем, мы создаем панель инструментов названую "My Scripts" и сопоставляем наш список команд с ней. Конечно, сейчас у нас есть только один инструмент, так как наш список команд содержит один элемент. Затем, когда наш инструментарий готов, мы добавляем его в основной(главный) интерфейс.

Но это пока не будет работать, потому что FreeCAD команда для работы должна быть отформатирована определенным образом. Так что нам нужно преобразовать(доработать) наш line() инструмент. Наш новый exercise.py сценарий будет выглядеть следующим образом:

import FreeCADGui, Part
from pivy.coin import *

class line:

    """This class will create a line after the user clicked 2 points on the screen"""

    def Activated(self):
        self.view = FreeCADGui.ActiveDocument.ActiveView
        self.stack = []
        self.callback = self.view.addEventCallbackPivy(SoMouseButtonEvent.getClassTypeId(), self.getpoint)

    def getpoint(self, event_cb):
        event = event_cb.getEvent()
        if event.getState() == SoMouseButtonEvent.DOWN:
            pos = event.getPosition()
            point = self.view.getPoint(pos[0], pos[1])
            self.stack.append(point)
            if len(self.stack) == 2:
                l = Part.LineSegment(self.stack[0], self.stack[1])
                shape = l.toShape()
                Part.show(shape)
                self.view.removeEventCallbackPivy(SoMouseButtonEvent.getClassTypeId(), self.callback)

    def GetResources(self):
        return {'Pixmap': 'path_to_an_icon/line_icon.png', 'MenuText': 'Line', 'ToolTip': 'Creates a line by clicking 2 points on the screen'}

FreeCADGui.addCommand('line', line())

То, что мы сделали здесь является преобразованием нашей __init__() функции в Activated() функцию, потому что, когда FreeCAD команды выполняются, они автоматически выполняют Activated() функцию. Мы также добавили функцию GetResources(), которая сообщает FreeCAD, где он может найти значок инструмента, и каким будет название и подсказка нашего инструмента. Любой JPG, PNG или SVG изображения будут работать, как иконка, они могут быть любого размера, но лучше использовать размер, близкий к последним аспектам, как 16x16, 24x24 или 32x32. Затем, мы добавили line() класс в качестве официального команды FreeCAD с AddCommand() методом.

Это всё, теперь вам нужно перезапустить FreeCAD и вы получите новый хороший инструментарий с нашим новым инструментом линии!

наверх

Вы хотите большего?

Если вам понравился этот пример, почему не попытаться улучшить этот маленький инструмент? Существует множесво вещей которые нужно сделать, как например:

  • Добавить обратную связь с пользователем: до сих пор мы делали очень голый инструмент, пользователь может потерятся при его использовании. Таким образом мы могли бы добавить обратную связь, сообщающую ему что делать дальше. Например, мы можем выводит сообщения в FreeCAD консоль. Загляните в FreeCAD.Console модуль
  • Добавить возможность вводить координаты 3D точек вручную. Посмотрите, на пример, python input() функцию
  • Добавить способность добавлять более двух точек
  • Добавить события для других вещей: сейчас мы только проверяем события кнопок мыши, что если мы хотели бы также сделать что-то когда мышь перемещается, например отображать текущие координаты?
  • Давать имя созданному объекту

Не стесняйтесь писать ваши вопросы или идеи на forum!

Don't hesitate to ask questions or share ideas on the forum!

наверх


Введение

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

In this example, the entire interface is defined in Python. Although this is possible for small interfaces, for larger interfaces the recommendation is to load the created .ui files directly into the program.

Two general methods to create interfaces, by including the interface in the Python file, or by using .ui files.

Проектирование диалога

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

Известно несколько понятий, от том как проектировать интерфейс:

  • Modal/non-modal dialogs: Модальное окно появляется поверх всех окон, останавливая действия происходящие в главном окне приложения, заставляя пользователя отвечать в диалоговом окне, тогда как не модальный диалог не останавливает вас от работы в главном окне. В некоторых случаях лучше первое, в других нет.
  • Определение того, что требуется и что считается дополнительны: Убедитесь что пользователь знает что он должен делать. Ставте на все метки с описанием, используйте подсказки, и.т.д.
  • Отделяйте команды от параметров: Это обычно делается с помощью кнопок и полей текстовых ввода. Пользователь знает что нажатие кнопки будет производить действие тогда как изменение значения внутри текстового поля где-то будет изменять параметр. В настоящие время, однако, пользователи обычно отлично знают что есть кнопка, а что есть поле ввода, и.т.д. В качестве графического инструментария используется, Qt, это современный инструментарий, и мы не должны больш беспокоится о создании ясности, так как он уже сам по себе очень ясный/понятный интерфейс.

Таким образом, теперь когда мы четко определили что должны делать, откройте qt designer. Давайте спроектируем очень простой диалог, как здесь:

Мы будем использовать этот диалог в FreeCAD для создания хороших прямоугольных плоскосте. Вам может показаться что это не очень удобно для создания прямоугольных плоскосте, но его легко можно изменить позже, чтобы делать более сложные вещи. Когда вы откроете Qt Designer, он выглядит следующим образом:

Создание диалога

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

  1. Выберете "Диалог без кнопок", так как мы не хотим кнопки по умолчанию OK/Cancel.
  2. Нам нужны 'Labels. Labels (этикетки) - это просто тексты которые появляются на вашем виджете, чтобы проинформировать пользователя. Если вы выбираете этикетку, на правой стороне появляются свойства которые вы можете поменять, если вы хотите, такие как стиль шрифта, высота и.т.д. Так что перетащите на ваш виджет 3 этикетки:
    • Одна для заголовка,
    • Одно для надписи "Height"
    • Одна для записи "Width".
  3. Теперь нам нужны LineEdits. Перетащите два из них на виджет. LineEdits это текстовые поля, которые конечный пользователь может заполнить. Нам нужен один LineEdit для Height и один для Width. Здесь мы тоже можем редактировать свойства. Например, почему бы не установить значения по умолчанию, например: 1.00 для каждого. Таким образом, пользователь увидит диалог, где оба значения уже заполнены. Если он удовлетворён, он может прямо нажать кнопку, сохраняя время.
  4. Далее добавим PushButton. Это кнопка, которую конечному пользователю следует нажать после заполнения обоих полей.

Заметьте: мы выбрали очень просто управление. В Qt гораздо больше функций, например, например вы можете использовать Spinboxes вместо LineEdits, и.т.д... Обратите внимание на то что доступно, у вас несомнено появятся другие идеи.

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

Конвертация нашего диалога в python

Теперь сохраните ваш виджет где-нибудь. Он будет сохранен как .ui файл, который мы легко преобразуем в python сценарий с помощью pyuic. В windows, программа pyuic связанна с pyqt (должно быть проверено), на linux вам вероятно нужно будет установить его отдельно в вашем пакетном менеджере (для debian-based систем, это часть пакета pyqt4-dev-tools). Для преобразования, вам необходимо открыть окно терминала (или окно командной строки в windows), переместитесь туда где вы сохранили ваш .ui файл и введите:

pyuic mywidget.ui > mywidget.py

In Windows pyuic.py is located in "C:\Python27\Lib\site-packages\PyQt4\uic\pyuic.py" For conversion create a batch file called "compQt4.bat:

@"C:\Python27\python" "C:\Python27\Lib\site-packages\PyQt4\uic\pyuic.py" -x %1.ui > %1.py

In the DOS console type without extension

compQt4 myUiFile

In macOS, you can retrieve the appropriate version (the same that is used internally in FreeCAD 0.19) of QT and Pyside with these commands (pip required)

python3 -m pip install pyqt5
python3 -m pip install pySide2

This will install uic in the folder "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/PySide2/uic", and Designer in "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/PySide2/Designer.app". For convenience you can create a link of uic in /usr/local/bin to be able to call it simply with uic -g python ... instead of typing the whole path of the program, and a link to Designer to retrieve it in the mac's Applications folder with

sudo ln -s /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/PySide2/uic /usr/local/bin
ln -s /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/PySide2/Designer.app /Applications

Into Linux : to do

Since FreeCAD progressively moved away from PyQt after version 0.13, in favour of PySide (Choose your PySide install building PySide), to make the file based on PySide now you have to use:

pyside-uic mywidget.ui -o mywidget.py

In Windows uic.py are located in "C:\Python27\Lib\site-packages\PySide\scripts\uic.py" For create batch file "compSide.bat":

@"C:\Python27\python" "C:\Python27\Lib\site-packages\PySide\scripts\uic.py" %1.ui > %1.py

In the DOS console type without extension

compSide myUiFile

Into Linux : to do

На некоторых системах программа называется pyuic4 вместо pyuic. Это просто сконвертирует файл .ui файл в сценарий python. Если мы откроем файл mywidget.py, его содержание очень легко понять:

from PySide import QtCore, QtGui

class Ui_Dialog(object):
    def setupUi(self, Dialog):
        Dialog.setObjectName("Dialog")
        Dialog.resize(187, 178)
        self.title = QtGui.QLabel(Dialog)
        self.title.setGeometry(QtCore.QRect(10, 10, 271, 16))
        self.title.setObjectName("title")
        self.label_width = QtGui.QLabel(Dialog)
        ...

        self.retranslateUi(Dialog)
        QtCore.QMetaObject.connectSlotsByName(Dialog)

   def retranslateUi(self, Dialog):
        Dialog.setWindowTitle(QtGui.QApplication.translate("Dialog", "Dialog", None, QtGui.QApplication.UnicodeUTF8))
        self.title.setText(QtGui.QApplication.translate("Dialog", "Plane-O-Matic", None, QtGui.QApplication.UnicodeUTF8))
        ...

Как вы видете, он обладает очень простым устройством: созданный класс называемый Ui_Dialog, он содержит все элементы интерфейса нашего виджета. Этот класс обладает двумя методами, один для создания виджета, и одни для перевода его содержания, которая является частью механизма Qt для перевода элементов интерфейса. Метод установки(setup method) просто создает один за другим, виджетв так как мы задали их в Qt Designer, и задает их настройки так как мы определили ранее. Затем, весь инструмент будет переведен, и наконец, подключаются слоты (мы поговорим об этом позже).

Теперь мы можем создать новый виджет и использовать этот класс для созданияего интерфейса. Мы уже можем увидеть наш виджет в действии, поместив наш файл mywidget.py в место где FreeCAD сможет найти его (в FreeCAD в паку bin, или в любую Mod поддиректорию), и ввести в интерпретаторе FreeCAD python:

from PySide import QtGui
import mywidget
d = QtGui.QWidget()
d.ui = mywidget.Ui_Dialog()
d.ui.setupUi(d)
d.show()

И наш диалог появится! Заметим, что наш интерпретатор по прежнему работает, т.е у нас не модальный диалог. Так что, закроем его, мы можем (конечно, помимо того как щелкнуть на иконке закрытия) ввести:

d.hide()

Делаем так чтобы наш диалог делал что-нибудь

Теперь когда мы можем показать или скрыть наш диалог, на осталось добавить последнюю часть:Чтобы оно что-то делало! Если вы немного поиграетесь с Qt designer, вы быстро обнаружите целый раздел под название "сигналы и слоты". В основном, это работает следующим образом: элемент на вашем виджете (в Qt терминалогии, эти элементы сами по себе являются виджетами) может отправить сигнал. Этот сигнал отличаются в зависимости от типа виджета. Например, кнопка может подать сигнал при нажатии, и когда она будет отпущена. Этот сигнал может быть соединен со слотами, которые могут быть специальными функциями других виджетов(например диалог обладающий слотом "закрыть" который можно подключить к сигналу от кнопки закрытия), или это могут быть пользовательские функции. PyQt Reference Documentation список всех qt виджетов, что они делают, какие сигналы могут отправлять и.т.д...

Что мы будем делать здесь, создадим новую функцию , которая создает плоскость основываясь на её длине и ширине, и подключим эту функцию к сигналу нажатия испускаемому нашей кнопкой "Create!" . Так что , давайте начнем с импорта наших модулейr FreeCAD, палагая следующую строку введенной в начале нашего сценария, где мы уже импортировали QtCore и QtGui:

import FreeCAD, Part

Затем , давайте добавим новую функцию в наш класс Ui_Dialog:

def createPlane(self):
    try:
        # first we check if valid numbers have been entered
        w = float(self.width.text())
        h = float(self.height.text())
    except ValueError:
        print("Error! Width and Height values must be valid numbers!")
    else:
        # create a face from 4 points
        p1 = FreeCAD.Vector(0,0,0)
        p2 = FreeCAD.Vector(w,0,0)
        p3 = FreeCAD.Vector(w,h,0)
        p4 = FreeCAD.Vector(0,h,0)
        pointslist = [p1,p2,p3,p4,p1]
        mywire = Part.makePolygon(pointslist)
        myface = Part.Face(mywire)
        Part.show(myface)
        self.hide()

Потом, нам нужно сообщить Qt о подключении функции к кнопке, разместив следующую строчку перед QtCore.QMetaObject.connectSlotsByName(Dialog):

QtCore.QObject.connect(self.create,QtCore.SIGNAL("pressed()"),self.createPlane)

как вы видете, подключение сигнала pressed() от нашего созданного объекта (кнопка "Create!"), к слоту названому createPlane, который мы только что определили. И это всё!!Теперь,финальный штрих, мы можем добавить маленькую функцию в создание диалога, его легче будет вызвать. Вне класса Ui_Dialog, давайте добавим этот код:

class plane():
   def __init__(self):
       self.d = QtGui.QWidget()
       self.ui = Ui_Dialog()
       self.ui.setupUi(self.d)
       self.d.show()

(Python reminder: the __init__ method of a class is automatically executed whenever a new object is created!)

Затем , в FreeCAD, нам необходимо сделать только:

import mywidget
myDialog = mywidget.plane()

"Это все ребята"... Теперь вы можете попробовать разные вещи, например как вставить ваш виджет в FreeCAD интерфейс (смотри страницу Отрывки кода ), или создать более продвинутый пользовательский инструмент, используя другие элементы в вашем виджете.

Готовый сценарий

Это полный сценарий, для справки:

# Form implementation generated from reading ui file 'mywidget.ui'
#
# Created: Mon Jun  1 19:09:10 2009
#      by: PyQt4 UI code generator 4.4.4
# Modified for PySide 16:02:2015 
# WARNING! All changes made in this file will be lost!

from PySide import QtCore, QtGui
import FreeCAD, Part 

class Ui_Dialog(object):
   def setupUi(self, Dialog):
       Dialog.setObjectName("Dialog")
       Dialog.resize(187, 178)
       self.title = QtGui.QLabel(Dialog)
       self.title.setGeometry(QtCore.QRect(10, 10, 271, 16))
       self.title.setObjectName("title")
       self.label_width = QtGui.QLabel(Dialog)
       self.label_width.setGeometry(QtCore.QRect(10, 50, 57, 16))
       self.label_width.setObjectName("label_width")
       self.label_height = QtGui.QLabel(Dialog)
       self.label_height.setGeometry(QtCore.QRect(10, 90, 57, 16))
       self.label_height.setObjectName("label_height")
       self.width = QtGui.QLineEdit(Dialog)
       self.width.setGeometry(QtCore.QRect(60, 40, 111, 26))
       self.width.setObjectName("width")
       self.height = QtGui.QLineEdit(Dialog)
       self.height.setGeometry(QtCore.QRect(60, 80, 111, 26))
       self.height.setObjectName("height")
       self.create = QtGui.QPushButton(Dialog)
       self.create.setGeometry(QtCore.QRect(50, 140, 83, 26))
       self.create.setObjectName("create")

       self.retranslateUi(Dialog)
       QtCore.QObject.connect(self.create,QtCore.SIGNAL("pressed()"),self.createPlane)
       QtCore.QMetaObject.connectSlotsByName(Dialog)

   def retranslateUi(self, Dialog):
       Dialog.setWindowTitle("Dialog")
       self.title.setText("Plane-O-Matic")
       self.label_width.setText("Width")
       self.label_height.setText("Height")
       self.create.setText("Create!")
       print("tyty")
   def createPlane(self):
       try:
           # first we check if valid numbers have been entered
           w = float(self.width.text())
           h = float(self.height.text())
       except ValueError:
           print("Error! Width and Height values must be valid numbers!")
       else:
           # create a face from 4 points
           p1 = FreeCAD.Vector(0,0,0)
           p2 = FreeCAD.Vector(w,0,0)
           p3 = FreeCAD.Vector(w,h,0)
           p4 = FreeCAD.Vector(0,h,0)
           pointslist = [p1,p2,p3,p4,p1]
           mywire = Part.makePolygon(pointslist)
           myface = Part.Face(mywire)
           Part.show(myface)

class plane():
  def __init__(self):
      self.d = QtGui.QWidget()
      self.ui = Ui_Dialog()
      self.ui.setupUi(self.d)
      self.d.show()

More examples

Relevant links


Разработка приложений для FreeCAD

License/ru


In February 2022 FreeCAD bug tracking was migrated to GitHub Issues. The Mantis bug tracker described below is now in read-only mode.
link=https://freecadweb.org/tracker/MantisBT is the bugtracker framework FreeCAD uses
link=https://freecadweb.org/tracker/MantisBT is the bugtracker framework FreeCAD uses

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


Рекомендуемая последовательность действий

Как показано на приведенной выше блок-схеме, перед созданием заявок всегда сначала ищите на форумах и в багтрекере, чтобы выяснить, является ли ваша проблема известной. Это экономит много времени / работы для разработчиков и волонтеров, которые могут потратить указанное время, делая FreeCAD еще более потрясающим.

Как сообщить об ошибке

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

  • Убедитесь, что вы используете самую последнюю версию FreeCAD. ПРИМЕЧАНИЕː ваша ошибка может быть исправлена в разрабатываемой (нестабильной) версии. Средний пользователь использует стабильную версию FreeCAD.
  • Убедитесь что ваша ошибка, это действительно ошибка, то есть то, то что должно работать, но не работает. Убедитесь, что о той же ошибке не сообщалось ранее, выполнив сначала поиск в багтрекере и на форуме.
    • Помните: если вы не уверены, не постесняйтесь сообщить о вашей проблеме на форуме и спросить что делать.
    • Примечание: перед сообщением прочитайте правила форума.
  • Опишите как можно более четко проблему, и как она может быть воспроизведена. Если мы не можем воспроизвести ошибку, мы не могли бы это исправить.
    • Это означает отчет в ясной, хорошо форматированной, пошаговой форме, чтобы даже пользователь-любитель мог воспроизвести.
    • Рекомендация: также очень полезно включать скриншоты ошибки. Пользователи Windows: пожалуйста, не прикрепляйте снимки экрана в формате Word или PDF. Используйте инструмент Windows Snipping, чтобы сохранить снимок в формате PNG.
    • Рекомендация: Еще лучше - Анимированный GIF-файл или скринкаст, это также повысит вероятность воспроизведения проблемы.
  • Добавьте пример файла FreeCAD (файл .FCStd), чтобы разработчики/тестировщики могли быстро воспроизвести ошибку.
    • Не архивируйте файл * .FCStd, он уже заархивирован.
    • Размер прикрепленных файлов ограничен. Если ваш файл * .FCStd слишком велик для прикрепления, вы можете использовать онлайн-хранилище (многие из них бесплатны, например, Google Диск, Microsoft OneDrive, Dropbox).
  • Включите всю информацию из кнопки «Копировать в буфер обмена» в диалоге 'Help (меню) -> About FreeCAD' . Убедитесь, что ваши данные включают версию OCC или OCE.
  • Пожалуйста, отправляйте отдельный отчет по каждой ошибке.
  • Если ваша ошибка вызывает сбой в FreeCAD, и вы используете систему, которая ее поддерживает, вы можете попробовать запустить 'обратную трассировку отладки' и прикрепить указанную трассировку к заявке. Это может сэкономить разработчикам много времени на выявление источника сбоя. Смотрите Отладку для получения более подробной информации.

Запрос о новой возможности

Если вы хотите чтобы в FreeCAD что-то, что пока не реализовано: то это не баг, а запрос новой функциональности (feature request).

  1. IMPORTANTː Before requesting a potential Feature Request please be certain that you are the first one doing so by searching the forums and the bugtracker. If you have concluded that there are no pre-existing tickets/discussions the next step is toː
  2. Start a forum thread to discuss your feature request with the community via the Open Discussion forum.
  3. Once the community agrees that this is a valid Feature, you then can open a ticket on the tracker (file it under feature request instead of bug).
  • NOTE #1 To keep things organized please remember to link the forum thread URL into the ticket and the ticket number (as a link) in to the forum thread.
  • NOTE #2 Keep in mind there are no guarantees that your wish will be fulfilled.
FreeCAD Bugtracker report page - use the dropdown to correctly designate what the ticket is

Отправка патчей

В случае если вы програмно исправили ошибку, расширение или что нибудь другое, что может быть общего использования в FreeCAD, создайте патч используя Subversion diff инструмент и сообщив, его нам на трэкер (файл как патч).

Запрос на слияние (merge)

(Same guidelines as Submiting patches)

If you have created a git branch containing changes that you would like to see merged into the FreeCAD code, you can ask there to have your branch reviewed and merged if the FreeCAD developers are OK with it. You must first publish your branch to a public git repository (github, gitlab, bitbucket, sourceforge etc...) and then give the URL of your branch in your merge request.

MantisBT Tips and Tricks

MantisBT Markup

MantisBT (Mantis Bug Tracker) has it's own unique markup.

  • @mention - works just like on GitHub where if you prepend '@' to someone's username they will receive an email that they have been 'mentioned' in a ticket thread
  • #1234 - By adding a hash tag in front of a number a shortcut to link to another ticket within MantisBT will present.
    Note: if you hover over a ticket it will show you the summary + if the ticket is closed, it will be struck-through like #1234.
  • ~5678 - a shortcut that links to a bug note within a ticket. This can be used to reference someone's response within the thread. Each person that posts will show a unique ~#### number next to their username. If you look at the image in the example, you see that the shortcut is referencing the ticket number:comment number of said ticket
  • <del></del> - Using these tags will strikeout text.
  • <code></code> - To present a line or block of code, use this tag and it will colorize and differentiate it elegantly.

MantisBT BBCode

In addition to the above MantisBT Markup one also has the possibility to use BBCode format. For a comprehensive list see the BBCode plus plugin page. Here is a list of supported BBCode tagsː
[img][/img] - Images
[url][/url] - Links
[email][/email] - Email addresses
[color=red][/color] - Colored text
[highlight=yellow][/highlight] - Highlighted text
[size][/size] - Font size
[list][/list] - Lists
[list=1][/list] - Numbered lists (number is starting number)
[*] - List items
[b][/b] - Bold
[u][/u] - underline
[i][/i] - Italic
[s][/s] - Strikethrough
[left][/left] - Left align
[center][/center] - Center
[right][/right] - Right align
[justify][/justify] - Justify
[hr] - Horizontal rule
[sub][/sub] - Subscript
[sup][/sup] - Superscript
[table][/table] - Table
[table=1][/table] - Table with border of specified width
[tr][/tr] - Table row
[td][/td] - Table column
[code][/code] - Code block
[code=sql][/code] - Code block with language definition
[code start=3][/code] - Code block with line numbers starting at number
[quote][/quote] - Quote by *someone* (no name)
[quote=name][/quote] - Quote by *name*

MantisBT <=> GitHub Markup

Below are special MantisBT Source-Integration plugin keywords which will link to the FreeCAD GitHub repo. See GitHub and MantisBT.

  • c:FreeCAD:git commit hash: - c stands for 'commit'. FreeCAD stands for the FreeCAD GitHub repo. 'git commit hash' is the specific git commit hash to reference. Note: the trailing colon is necessary. Exampleː cːFreeCADː709d2f325db0490016807b8fa6f49d1c867b6bd8ː
  • d:FreeCAD:git commit hash: - similar to the above, d stands for 'diff' which will provide a Diff view of the commit. Exampleː dːFreeCADː709d2f325db0490016807b8fa6f49d1c867b6bd8ː
  • p:FreeCAD:pullrequest: - similar to the above, p stands for Pull Request. Exampleː pːFreeCADː498ː

GitHub and MantisBT

The FreeCAD bugtracker has a plug-in called Source Integration which essentially ties both the FreeCAD GitHub repo to our MantisBT tracker. It makes it easier to track and associate git commits with their respective MantisBT tickets. The Source Integration plugin scans the git commit messages for specific keywords in order to execute the following actions:

Note The below keywords need to be added in the git commit message and not the PR subject

Remotely referencing a ticket

Using this pattern will automagically associate a git commit to a ticket (Note: this will not close the ticket.) The format MantisBT will recognize:

  • bug #1234
  • bugs #1234, #5678
  • issue #1234
  • issues #1234, #5678
  • report #1234
  • reports #1234, #5678

For the inquisitive here is the regex MantisBT uses for this operation:
/(?:bugs?|issues?|reports?)+\s*:?\s+(?:#(?:\d+)[,\.\s]*)+/i

Remotely resolving a ticket

The format MantisBT will recognize:

  • fix #1234
  • fixed #1234
  • fixes #1234
  • fixed #1234, #5678
  • fixes #1234, #5678
  • resolve #1234
  • resolved #1234
  • resolves #1234
  • resolved #1234, #5678
  • resolves #1234, #5678

For the inquisitive here is the regex MantisBT uses for this operation:
/(?:fixe?d?s?|resolved?s?)+\s*:?\s+(?:#(?:\d+)[,\.\s]*)+/i



На этой странице шаг за шагом объясняется "как скомпилировать FreeCAD 0.19 или новее в Windows"". Для других платформ см.Compiling.

Требования

Для компиляции FreeCAD в Windows требуется несколько инструментов и библиотек.

Требования

  • Компилятор. FreeCAD тестируется с помощью Visual Studio (MSVC)—другие компиляторы могут работать, но инструкции по использованию здесь не включены. Более подробная информация в #Compiler, находится ниже.
  • Git (Для Git также доступны графические интерфейсы, см. Следующий раздел.)
  • CMake версия 3.11.x или более новая.
    "Подсказка:" Выбор опции Add CMake to the system PATH for all users при установке CMake сделает CMake доступным из командной строки Windows, что может быть полезно.
  • LibPack (так называемый FreeCADLibs). Это единый пакет, содержащий все библиотеки, необходимые для компиляции FreeCAD в Windows. Загрузите версию LibPack, соответствующую версии FreeCAD, которую вы хотите скомпилировать. Чтобы скомпилировать FreeCAD 0.19 или последнюю версию разработки 0.20, загрузите LibPack для 0.19/0.20 (только 64-разрядная версия). Извлеките пакет LibPack в удобное место. (Если ваш компьютер не распознает расширение .7z, вам следует установить программу 7-zip.)
    "Примечание": Настоятельно рекомендуется компилировать FreeCAD с версией компилятора, для которой предназначен LibPack. Например, вы можете столкнуться с проблемами при компиляции FreeCAD 0.19 с использованием MSVC 15, поскольку LibPack для 0.19 предназначен для сборки с MSVC 17.

Опционные программы

  • Графический интерфейс для Git. Существует несколько доступных интерфейсов, см. this list. Основное преимущество интерфейса заключается в том, что вам не нужно изучать команды Git, чтобы получить исходный код FreeCAD или отправлять исправления в репозиторий FreeCAD на GitHub.

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

  • NSIS используется для создания установщика Windows FreeCAD.

Исходный код

Теперь вы можете получить исходный код FreeCAD:

Использование интерфейса

При использовании TortoiseGit Интерфейс Git:

  1. Создайте новую папку, в которую будет загружен исходный код.
  2. Щелкните правой кнопкой мыши на этой папке в проводнике файлов Windows и выберите "'Git Clone" в контекстном меню.
  3. Появится диалоговое окно. В нем введите URL-адрес репозитория FreeCAD Git

https://github.com/FreeCAD/FreeCAD.git

и нажмите "ОК".

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

Использование командной строки

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

git clone https://github.com/FreeCAD/FreeCAD.git

Компилятор

По умолчанию (recommended) используется компилятор MS Visual Studio (MSVC). Хотя, возможно, можно использовать другие компиляторы, например gcc через Cygwin или MinGW, это не тестируется и не рассматривается здесь.

Вы можете получить бесплатную версию MSVC (для индивидуального использования), загрузив Community edition of MS Visual Studio.

Для тех, кто хочет избежать установки огромного MSVC только для того, чтобы иметь компилятор, см. CompileOnWindows - Reducing Disk Footprint.

"Примечание:" Несмотря на то, что "Community" выпуск MSVC является бесплатным, для использования среды IDE в течение более чем 30-дневного пробного периода необходимо создать учетную запись Майкрософт. Если вы будете компилировать только с помощью командной строки, вам не понадобится среда разработки и, следовательно, учетная запись Microsoft.

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

Дополнительная конфигурация системного пути

При необходимости вы можете включить пути к некоторым папкам в переменную системного ПУТИ. Это полезно, если вы хотите получить доступ к программам в этих папках из командной строки/powershell или если вы хотите, чтобы компилятор или CMake находили специальные программы. Кроме того, добавление папок в ПУТЬ может потребоваться, если вы не использовали соответствующие параметры при установке программы.

  • Вы можете включить папку вашего LibPack в переменную системного ПУТИ. Это полезно, если вы планируете создавать несколько конфигураций/версий FreeCAD.
  • Если вы не использовали опцию добавления CMake в ПУТЬ при его установке, добавьте папку его установки

"C:\Program Files\CMake\bin" по ПУТИ.

  • Если вы не использовали опцию добавления TortoiseGit в ПУТЬ при его установке, добавьте папку его установки

C:\Program Files\TortoiseGit\bin по ПУТИ.

Чтобы добавить пути к папкам в переменную PATH:

  1. В меню "Start" Windows щелкните правой кнопкой мыши на "Computer" и выберите "Properties".
  2. В появившемся диалоговом окне нажмите "Advanced system settings".
  3. Откроется другое диалоговое окно. Нажмите там на вкладке "Advanced" в разделе "Environment Variables".
  4. Снова откроется другое диалоговое окно. Затем выберите переменную "Path" и нажмите "Edit".
  5. И снова откроется другое диалоговое окно. Нажмите там на "New" и добавьте в путь к папке Git или LibPack.
  6. Наконец, нажмите "ОК" и закройте все диалоговые окна, также нажав "ОК".

Конфигурация

Как только у вас будут все необходимые инструменты, библиотеки и исходный код FreeCAD, вы будете готовы приступить к процессу настройки и компиляции. Этот процесс будет проходить в пять этапов:

  1. Запустите CMake один раз, чтобы проверить вашу систему и начать процесс настройки (это сообщит о том, что она не удалась).
  2. Настройте необходимые параметры CMake, чтобы установить расположение пакета LibPack и включить Qt5.
  3. Повторно запустите CMake, чтобы завершить настройку (на этот раз она должна завершиться успешно).
  4. Используйте CMake для создания системы сборки Visual Studio.
  5. Используйте Visual Studio для создания FreeCAD.

CMake

Во-первых, настройте среду сборки с помощью CMake:

  1. Откройте графический интерфейс CMake
  2. Укажите исходную папку FreeCAD.
  3. Укажите папку сборки (не используйте исходную папку-CMake создаст эту папку, если она не существует).
  4. Нажмите кнопку "Configure".
  5. В появившемся диалоговом окне укажите генератор, который вы хотите использовать: в большинстве случаев вы будете использовать значения по умолчанию в этом диалоговом окне. Для стандартной MS Visual Studio используйте "Visual Studio xx 2yyy", где xx-версия компилятора, а 2yyy-год его выпуска. Рекомендуется использовать опцию по умолчанию "Use default native compilers".

Примечание: Важно указать правильный вариант разрядности. Если у вас есть 64-разрядный вариант LibPack, вы также должны использовать компилятор x64.

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

Если произойдет сбой с сообщением о том, что Visual Studio не найдена, поддержка CMake в MSVC еще не установлена. Для этого:

  1. Откройте среду разработки MSVC
  2. Используйте меню Tools → Get Tools и Features
  3. На вкладке "Workloads" включите "Desktop development with C++".
  4. На правой стороне теперь вы должны видеть, что будет установлен компонент "Visual C++ tools for CMake".
  5. Установите его.

Если он завершится ошибкой с сообщением о неверной версии Python или отсутствующем Python, то:

  1. Используйте поле "Search:" в CMake для поиска строки "Python".
  2. Если вы видите там путь, подобный "C:/Program Files/Python38/python.exe", CMake распознал Python, который уже установлен на вашем компьютере, но эта версия несовместима с LibPack. Поскольку LibPack включает совместимую версию Python, измените следующие параметры Python в CMake в соответствии с его путями (при условии, что LibPack находится в папке "D:\FreeCAD-build\FreeCADLibs_12.5.2_x64_VC17"):

Если нет ошибки в Visual Studio или Python, все в порядке, но CMake еще не знает всех необходимых настроек. Поэтому сейчас:

  1. Найдите в CMake переменную "FREECAD_LIBPACK_DIR" и укажите местоположение папки LibPack, которую вы загрузили ранее.
  2. Только если сборка FreeCAD 0.19, найдите переменную "'BUILD_QT5" и включите эту опцию.
  3. Нажмите "Configure" еще раз.

Теперь ошибок быть не должно. Если вы по-прежнему сталкиваетесь с ошибками, которые не можете диагностировать, посетите Install/Compile forum на веб-сайте форума FreeCAD. Если CMake прошел правильно, нажмите на кнопку "Generate". После этого вы можете закрыть CMake и начать компиляцию FreeCAD с помощью Visual Studio. Однако для первой компиляции держите его открытым на случай, если вам захочется или потребуется изменить некоторые параметры процесса сборки.

Параметры процесса сборки

Система сборки CMake дает вам контроль над некоторыми аспектами процесса сборки. В частности, вы можете включать и выключать некоторые функции или модули с помощью переменных CMake.

Вот описание некоторых из этих переменных:

Variable name Description Default
BUILD_XXX Создайте FreeCAD с компонентом XXX. Если вы не хотите/не нуждаетесь в компиляции, например, рабочего стола "OpenSCAD", отключите переменную "BUILD_OPENSCAD". Тогда у FreeCAD не будет этого верстака.

""Примечание: "" Некоторые компоненты требуются для других компонентов. Если вы, например, снимите флажок "BUILD_ROBOT", CMake сообщит вам, что компонент "Путь" не может быть правильно скомпилирован. Поэтому проверьте вывод CMake после изменения параметра BUILD_XXX!

depends
BUILD_ENABLE_CXX_STD Версия стандарта языка C++. "C++14" является максимально возможным для FreeCAD 0.19, в то время как для FreeCAC 0.20 требуется как минимум "C++17". См. Также примечание в разделе Building with Visual Studio 15 (2017) and 16 (2019) depends
CMAKE_INSTALL_PREFIX Выходная папка при создании целевой "INSTALL" см. также раздел Running and installing FreeCAD Windows' default program installation folder
FREECAD_COPY_DEPEND_DIRS_TO_BUILD Копии библиотек, необходимых для выполнения FreeCAD.exe в папку сборки. См. также раздел Running and installing FreeCAD.
"Примечание:" параметры FREECAD_COPY_XXX отображаются только в том случае, если библиотеки еще не были скопированы. Поэтому при переходе на другую версию LibPack важно удалить все папки в папке сборки, кроме папки LibPack. В CMake удалите кэш и начните так, как будто вы компилируете в первый раз, и вы получите параметры FREECAD_COPY_XXX options.
OFF
FREECAD_COPY_PLUGINS_BIN_TO_BUILD Copies Qt's plugin files needed to execute the FreeCAD.exe to the build folder. См. также раздел Running and installing FreeCAD. OFF
FREECAD_LIBPACK_USE Switch the usage of the FreeCAD LibPack on or off ON
FREECAD_LIBPACK_DIR Directory where the LibPack is FreeCAD's source code folder
FREECAD_RELEASE_PDB Create debug libraries also for release builds ON

Сборка FreeCAD

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

Сборка в Visual Studio 15 (2017) и 16 (2019)

Сборка релиза

  1. Запустите среду разработки Visual Studio. Это можно сделать либо нажатием кнопки "Open Project" в графическом интерфейсе CMake, либо двойным щелчком по файлу "FreeCAD.sln", который вы найдете в папке сборки.
  2. На панели инструментов среды разработки MSVC убедитесь, что вы используете для первой компиляции "Release".
  3. Есть окно под названием "Solution Explorer". В нем перечислены все возможные цели компиляции. Чтобы начать полную компиляцию, щелкните правой кнопкой мыши на целевом объекте "ALL_BUILD", а затем выберите "Build".

Теперь это займет довольно много времени.

Чтобы скомпилировать готовый к использованию FreeCAD, скомпилируйте целевую "INSTALL", см. раздел Running and installing FreeCAD.

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

"Примечание:" Для FreeCAD 0.20 требуется, по крайней мере, стандартная версия языка C++ 17, но сторонний компонент "flann" из LibPack еще не готов для этого. Поэтому вы получите ошибки компиляции для целевого "обратного проектирования". Чтобы исправить это, щелкните правой кнопкой мыши на этом целевом объекте в обозревателе решений MSVC и выберите в контекстном меню последнюю запись "Properties". В появившемся диалоговом окне измените "C++ Language Standard" на "ISO C++14". Наконец, снова создайте цель "ALL_BUILD".

Отладочная сборка

Для отладочной сборки необходимо использовать Python, который входит в пакет LibPack. Чтобы гарантировать это:

  1. Поиск в графическом интерфейсе CMake "Python"
  2. Если вы видите там путь, подобный "C:/Program Files/Python38/python.exe", CMake распознал Python, установленный на вашем компьютере, а не тот, который входит в LibPack. В этом случае адаптируйте эти различные настройки Python в CMake к этому (при условии, что LibPack находится в папке "D:\FreeCAD-build\FreeCADLibs_12.5.2_x64_VC17"):

As prerequisite for the debug build, you need to do this:

  1. Copy the content of the LibPack folder bind to the bin folder of the FreeCAD build folder (overwrite the existing files).
  2. Copy the content of the LibPack folder libd to the lib folder of the FreeCAD build folder.

Теперь

  1. Запустите среду разработки Visual Studio. Это можно сделать либо нажатием кнопки "Open Project" в графическом интерфейсе CMake, либо двойным щелчком по файлу "FreeCAD.sln", который вы найдете в папке сборки.
  2. На панели инструментов среды разработки MSVC убедитесь, что вы используете для первой компиляции "Debug".
  3. Есть окно под названием "Solution Explorer". В нем перечислены все возможные цели компиляции. Чтобы начать полную компиляцию, щелкните правой кнопкой мыши на целевом объекте "ALL_BUILD", а затем выберите "Build" в контекстном меню.

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

  1. Щелкните правой кнопкой мыши на целевой "FreeCADMain", а затем выберите "Set as Startup Project" в контекстном меню.
  2. Наконец, нажмите на панели инструментов на кнопку с зеленым треугольником под названием "Local Windows Debugger".

If there were no compilation errors, and if the FREECAD_COPY_* options mentioned in the CMake Configuration step above were enabled, you can start the debug build:

  1. Right-click on the target FreeCADMain and then choose Set as Startup Project in the context menu.
  2. Finally click in the toolbar on the button with the green triangle named Local Windows Debugger.

Это запустит отладочную сборку FreeCAD, и вы сможете использовать среду разработки MSVC для ее отладки.

Видеоресурс

Учебник по английскому языку, который начинается с настройки в графическом интерфейсе CMake и продолжается командой "Build" в Visual Studio 16 2019, доступен без списка на YouTube по адресу Tutorial: Build FreeCAD from source on Windows 10.

Сборка с помощью Qt Creator (устарело)

Инсталяция и настройка Qt Creator

  • Загрузите и установите Qt Creator
  • Tools → Options → Text Editor → Behavior tab:
    • File Encodings → Default Encodings:
    • Установите значение: "'ISO-8859-1 /...csISOLatin1"' (Некоторые символы создают ошибки/предупреждения с помощью Qt Creator, если оставить значение UTF-8. Это, кажется, все исправляет.)
  • Tools → Options → Build & Run:
    • CMake tab
      • Заполните поле Исполняемый файл путем к cmake.exe
    • Kits tab
      • Name: MSVC 2008
      • Compiler: Microsoft Visual C++ Compiler 9.0 (x86)
      • Debugger: Auto detected...
      • Версия Qt: Отсутствует
    • General tab
      • Снимите флажок: Всегда создавайте проект перед его развертыванием
      • Снимите флажок: Всегда развертывайте проект перед его запуском

Импорт проекта и здания

  • File → Open File or Project
  • Открыть "'CMakeLists.txt"' который находится на верхнем уровне источника
  • Это запустит CMake
  • Выберите каталог сборки и нажмите кнопку Далее
  • Установите для генератора значение "NMake Generator (MSVC 2008)"'
  • Нажмите кнопку Запустить CMake. Следуйте инструкциям, приведенным выше, чтобы настроить CMake по своему вкусу.

Теперь FreeCAD можно построить

  • Build → Build All
  • Это займет много времени...

После завершения его можно запустить: В левом нижнем углу есть 2 зеленых треугольника. Один из них-отладка. Другой "run". Выбери, что тебе больше нравится.

Сборка из командной строки

Шаги по компиляции из командной строки зависят от компилятора. Для MSVC 2017 следующие шаги:

  1. В меню "Пуск" Windows перейдите в Visual Studio 2017 → Visual Studio Tools и выберите ""Командная строка разработчика для VS 2017""
  2. Перейдите в папку сборки.
  3. Выполните команду
msbuild ALL_BUILD.vcxproj /p:Configuration=Release

или

msbuild INSTALL.vcxproj /p:Configuration=Release

Эти шаги также могут быть автоматизированы. Вот, например, решение для MSVC 2017:

  1. Скачать скрипт compile-FC.txt.
  2. Переименуйте его в "compile-FC.bat".
  3. В проводнике файлов Windows Shift+Right-click на папке сборки и используйте из контекстного меню "Command prompt here".
  4. Выполните команду
compile-FC install

Вместо вызова compile-FC с опцией install вы также можете использовать debug или release.:

debug   - компиляция FreeCAD в конфигурации отладки

release - компиляция FreeCAD в конфигурации выпуска

install    - скомпилируйте FreeCAD в конфигурации выпуска и создайте установку установки

Запуск и установка FreeCAD

Существует 2 метода для запуска скомпилированного FreeCAD:

"Метод 1": Вы выполняете FreeCAD.exe которые вы найдете в своей папке сборки во вложенной папке "bin"

"Метод 2": Вы создаете целевую "УСТАНОВКУ"

Метод 2 является более простым, поскольку он автоматически гарантирует, что все библиотеки, необходимые для запуска FreeCAD.exe находятся в нужной папке. В FreeCAD.exe и библиотеки будут выведены в папку, указанную вами в переменной CMake "CMAKE_INSTALL_PREFIX".

Для метода 1 вам нужно поместить библиотеки в папку "bin" вашей папки сборки (где FreeCAD.exe есть). Это можно легко сделать:

  1. Откройте графический интерфейс CMake.
  2. Найдите там параметр переменной "FREECAD_COPY_DEPEND_DIRS_TO_BUILD" и проверьте его. Если такой опции нет, библиотеки уже были скопированы, см. description of the options.
  3. Найдите там параметр переменной "FREECAD_COPY_LIBPACK_BIN_TO_BUILD" и проверьте его.
  4. Найдите там параметр переменной "FREECAD_COPY_PLUGINS_BIN_TO_BUILD" и проверьте его.
  5. Нажмите на кнопку "Configure". В конце настройки CMake автоматически скопирует необходимые библиотеки из папки LibPack.

Troubleshooting

When running FreeCAD you may encounter missing DLLs when using certain workbenches or features of workbenches. The error message in FreeCAD's console will not tell you what DLL is missing. To find this out you must use an external tool:

import os
os.system(r"~\DependenciesGui.exe")

Note: Instead of the ~ you must specify the full path to the DependenciesGui.exe on your system.

  • Now drag in the *.pyd file of the workbench with which you get missing DLLs reported.

Обновление сборки

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

  1. Обновление исходного кода
  2. Перекомпиляция

Обновление исходного кода

Использование интерфейса

При использовании Git frontend TortoiseGit:

  1. Щелкните правой кнопкой мыши папку с исходным кодом FreeCAD в проводнике файлов Windows и выберите в контекстном меню ""Pull"".
  2. Появится диалоговое окно. Выберите там, какую ветвь разработки вы хотите получить. "master" - это основная ветвь. Поэтому используйте это, если вы не хотите скомпилировать специальную новую функцию из ветви, которая еще не была объединена в "master". (Для получения дополнительной информации о ветвях Git см. Git development process.)

Наконец, нажмите "ОК".

Использование командной строки

Откройте терминал (командная строка) и переключитесь там в свой исходный каталог. Затем введите:

git pull https://github.com/FreeCAD/FreeCAD.git master

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

Сборник

  1. Откройте среду разработки MSVC, дважды щелкнув файл "FreeCAD.sln" или файл "ALL_BUILD.vcxproj" в папке сборки.
  2. Перейдите к шагу 2 из раздела Building with Visual Studio 15 2017.

Updating the LibPack

If a new major version of a third-party dependency like Open Cascade is released, or if a third-party dependency has important bug fixes, a new LibPack is released. You can find the latest version here.

To update your LibPack the following recipe is best practice:

  1. Delete the bin folder in your build folder.
  2. Switch to your local LibPack folder and delete everything there.
  3. Extract the content of the new LibPack ZIP file into the existing, but now empty, local LibPack folder.
  4. Open CMake and there press the button Configure and then the button Generate. This recreates the bin folder you just deleted and also copies the new LibPack files into it.
  5. In CMake click the button Open Project and the MSVC IDE will open.
  6. In the MSVC IDE build the target INSTALL.

Инструменты

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

Плагин Qt designer

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

Сборник

DLL не может быть загружена как плагин, если она была скомпилирована с использованием другой версии Qt, чем тот, на котором основан ваш Qt Designer/Qt Creator. В этом случае вы должны скомпилировать DLL самостоятельно. Это делается следующим образом:

  • In the CMake options (see this section above) enable the option BUILD_DESIGNER_PLUGIN and reconfigure.
  • open MSVC and build the target FreeCAD_widgets

As result you will get the plugin file 'FreeCAD_widgets.dll in the folder
~\src\Tools\plugins\widget\Release

Установка

  1. Скачать this ZIP файл. (Скомпилирован с использованием Qt 5.12, см. below.)
  2. Извлеките DLL-файл в ZIP-файле и скопируйте его
  • Если вы используете LibPack: в папку
    "~\FreeCADLibs_12.5.2_x64_VC17\bin\designer"
    , так как там будет только папка "bin", и вы должны сначала создать подпапку "конструктор".
  • Если у вас полная установка Qt: вы можете выбрать между folder
    "C:\Qt\5.15.2\msvc2019_64\plugins\designer"
    or
    "C:\Qt\5.15.2\msvc2019_64\bin\designer" (сначала вы должны создать подпапку "конструктор".)
    (адаптируйте пути к вашей установке!).

(Повторно)Запустите Qt Designer и проверьте его меню Help → Plugins. Если плагин "' FreeCAD_widgets.dll"' указана как загружаемая, теперь вы можете создавать и изменять файлы .ui FreeCAD. Если нет, вы должны compile создать библиотеку DLL самостоятельно.

Если вы предпочитаете использовать Qt Creator вместо Qt Designer библиотека DLL должна быть помещена в эту папку:
"C:\Qt\Qt5.15.2\Tools\QtCreator\bin\plugins\designer"
(Повторно)Запустите Qt Creator, переключитесь в режим "Design", а затем проверьте меню Tools → Form Editor → About Qt Designer Plugins. Если плагин "' FreeCAD_widgets.dll"' указана как загружаемая, теперь вы можете создавать и изменять файлы .ui FreeCAD. Если нет, вы должны compile создать библиотеку DLL самостоятельно.

Поставщик миниатюр

FreeCAD имеет функцию предварительного просмотра миниатюр для файлов *.FCStd. Это означает, что в проводнике файлов Windows *.FCStd файлы отображаются со снимком экрана модели, которую он содержит. Чтобы предоставить эту функцию, FreeCAD должен иметь файл "'FCStdThumbnail.dll"" где установлено в Windows.

Установка

Библиотека DLL устанавливается таким образом:

  1. Скачать this ZIP file и извлеките его.
  2. Откройте командную строку Windows с правами администратора (эти права являются обязательным требованием).
  3. Перейдите в папку, в которой находится библиотека DLL.
  4. Выполните эту команду
    regsvr32 FCStdThumbnail.dll

Поэтому проверьте, работает ли это, убедитесь, что в FreeCAD включена опция настроек "Save thumbnail into project file when saving document"" и сохраните модель. Затем просмотрите в проводнике Windows папку сохраненной модели, используя представление символов. Теперь вы должны увидеть снимок экрана модели в представлении папок.

Сборник

Для компиляции FCStdThumbnail.dll

  1. Перейдите в исходную папку FreeCAD
    "~\src\Tools\thumbs\ThumbnailProvider"
  2. Откройте графический интерфейс CMake
  3. Укажите там в качестве исходной папки ту, в которой вы находитесь в данный момент.
  4. Используйте ту же папку, что и папка сборки.
  5. Нажмите "Configure".
  6. В появившемся диалоговом окне укажите генератор в соответствии с тем, который вы хотите использовать. Для стандартной MS Visual Studio используйте "Visual Studio xx 2yyy", где xx-версия компилятора, а 2yyy-год его выпуска. Рекомендуется использовать опцию по умолчанию "Использовать собственные компиляторы по умолчанию".
    "Примечание:" Важно указать правильный вариант бита. Если у вас 64-битный вариант LibPack, вы также должны использовать компилятор x64.
  7. Нажмите на кнопку "Generate".
  8. Теперь у вас должен быть файл "ALL_BUILD.vcxproj" в папке "~\src\Tools\thumbs\ThumbnailProvider". Дважды щелкните по нему, и откроется среда разработки MSVC.
  9. На панели инструментов среды разработки MSVC убедитесь, что вы используете целевой объект компиляции "Release".
  10. Есть окно под названием "Solution Explorer". Щелкните правой кнопкой мыши на "ALL_BUILD", а затем выберите "Build".
  11. В результате у вас теперь должно быть "'FCStdThumbnail.dll"' в папке "~\src\Tools\thumbs\ThumbnailProvider\release", который вы можете установить, как описано выше.

Компиляция OpenCascade

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

When compiling Open Cascade for FreeCAD note that there is no guarantee that FreeCAD will work with all versions of Open Cascade. Note also that when you are using the Netgen library, you must use the a NetGen version that it approved to compile with the Open Cascade version you like to compile.

Сначала получите исходный код OpenCascade либо непосредственно со страницы выпуска по адресу OpenCASCADE.org, через git, или путем клонирования чужой вилки, например вилка "blobfish" поддерживается участником форума FreeCAD tanderson69.

Затем используйте CMake для настройки системы сборки аналогично созданию FreeCAD. Примечательными вариантами CMake для OpenCascade являются:

  • 3RDPARTY_DIR - Место расположения ваших сторонних библиотек, обычно заданное в каталоге FreeCAD Libpack
  • INSTALL_DIR - Где устанавливают готовые библиотеки. Рекомендуется использовать изолированный каталог в вашей системе, а не устанавливать его глобально или перезаписывать версию Libpack.
  • Open the project in Visual Studio and first build the ALL_BUILD and then INSTALL targets in the Release mode.
  • Repeat building the two targets in the Debug mode.

To build FreeCAD using the self-compiled Open Cascade, you must do the following:

  • Copy all folders from the INSTALL_DIR to your LibPack folder (overwrite the existing files)
  • Switch to the LibPack folder and go there to the subfolder cmake
  • Open there the file OpenCASCADEDrawTargets.cmake with a text editor
  • Search there for absolute paths to your LibPack folder and remove them. So e.g. the absolute path
    D:/FreeCADLibs_12.5.4_x64_VC17/lib/freetype.lib
    becomes just
    freetype.lib
  • Do the same for the file OpenCASCADEVisualizationTargets.cmake

Compiling Netgen

The LibPack comes with a version of Netgen that will was tested to be build with the Open Cascade version of the LibPack. The problem is that every new release of Netgen changes the API. Also every new release of Open Cascade does the same. Therefore one cannot just easily change the Netgen version.

However, you might build Netgen nevertheless. This is an easy task:

  • First obtain the Netgen source code, either directly from Netgen 's git repository.
  • Then open the CMake GUI to configure the build system in a similar manner to building FreeCAD. These CMake options have to be set:
Variable name Description Default
CMAKE_INSTALL_PREFIX The output folder when building the target INSTALL. If the build was successful, take the files from this folder to update your LibPack. C:/netgen
OpenCasCade_DIR The path to the CMake files of Open Cascade. If you built Open Cascade as described in the section Compiling Open Cascade you can use the subfolder cmake of there folder you used as INSTALL_DIR. If not, use the subfolder cmake of your LibPack. Note hereby that the LibPack must then already contain a proper Open Cascade build. Independent what folder you use, you must now also create there a subfolder lib and copy in the files freetype.lib and freetyped.lib from your LibPack. empty
USE_GUI set it to OFF ON
USE_NATIVE_ARCH set it to OFF; this is only necessary important to support older CPU that don't have the AVX2 instruction set ON
USE_OCC set it to ON OFF
USE_PYTHON set it to OFF ON
USE_SUPERBUILD set it to OFF ON
ZLIB_INCLUDE_DIR The path to the necessary 3rdparty component zlib. It is recommended to use the folder as input where your used LibPack is. empty
ZLIB_LIBRARY_DEBUG The path to the ZLib file zlibd.lib. It is located in the subfolder lib of your LibPack folder. empty
ZLIB_LIBRARY_RELEASE The path to the ZLib file zlib.lib. It is located in the subfolder lib of your LibPack folder. empty
  • Additionally you need to add a new CMake entry:

name: CMAKE_DEBUG_POSTFIX, type: string, content: _d
This assures that he file names of the debug libraries get another name than the release libraries and can later not be accidentally exchanged.

  • Press the Configure button in CMake to generate the *.cmake files.
  • Only necessary if older CPU should be supported that don't have the AVX2 instruction set:
    • Search your Netgen build folder for the file netgen-targets.cmake and open it with a text editor. Remove the setting ;/arch:AVX2 in the Option INTERFACE_COMPILE_OPTIONS.
    • Press the Configure button in CMake again.
  • Press the Generate button in CMake.
  • Open the project in Visual Studio and first build the ALL_BUILD and then INSTALL targets in the Release mode.
  • Repeat building the two targets in the Debug mode.

To build FreeCAD using the self-compiled Netgen, you must do the following:

  • Copy all folders from the CMAKE_INSTALL_PREFIX to your LibPack folder (overwrite the existing files)

Ссылки на литературу

Смотрите также



Существует экспериментальный контейнер FreeCAD Docker, который протестирован для разработки FreeCAD. Подробнее на странице Компиляция в Docker

Обзор

В последних дистрибутивах Linux, FreeCAD, как правило, собирается легко, поскольку все зависимости обычно предоставляются менеджером пакетов. В основном сборка включает 3 этапа:

  1. Получение исходного кода FreeCAD.
  2. Получение зависимостей, или пакетов, от которых зависит FreeCAD
  3. Настройка с помощью cmake и компиляция с помощью make.

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

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

Получение исходных кодов

Git

Лучший способ получить код это клонировать Git репозиторий Git только-для-чтения. Для этого вам потребуется программа git, которую легко установить в большинство дистрибутивов Linux. Скачать её можно на официальном веб-сайте.

Git может быть установлен, следующей командой:

sudo apt install git

Следующая команда, копирует последнюю версию исходного кода FreeCAD в папку freecad-source.

git clone --recurse-submodules https://github.com/FreeCAD/FreeCAD.git freecad-source

Дополнительная информация о применении Git и внесении кода в проект изложена на странице управление исходным кодом.

Архив с исходным кодом

Кроме того, вы можете загрузить исходники непосредственно с GitHub, в качестве .zip или .tar.gz архива, и распаковать его в заданный каталог.

Установка зависимостей (Dependencies)

Для компиляции FreeCAD необходимо установить требуемые зависимости (dependencies), упомянутые в сторонних библиотеках; пакеты, содержащие эти зависимости для различных дистрибутивов Linux, перечислены ниже. Обратите внимание, что имена и доступность библиотек будут зависеть от вашего конкретного дистрибутива; если ваш дистрибутив устарел, некоторые пакеты могут быть недоступны или иметь другое имя. В этом случае посмотрите раздел ↓ старые и нестандартные дистрибутивы расположенный ниже.

Как только у вас будут установлены все зависимости, приступайте к сборке FreeCAD.

Обратите внимание, что размер исходного кода FreeCAD составляет около 500 МБ; он может быть в три раза больше, если вы клонируете репозиторий Git со всей историей его изменений. Для получения всех зависимостей может потребоваться загрузка 500 МБ или более новых файлов; при распаковке этих файлов может потребоваться 1500 МБ или более места. Также имейте в виду, что в процессе компиляции может быть создано до 1500 МБ дополнительных файлов, поскольку система копирует и изменяет весь исходный код. Поэтому при попытке компиляции убедитесь, что на вашем жестком диске достаточно свободного места, по крайней мере, не менее 4 ГБ.

Debian и Ubuntu

В системах основанных на Debian (Debian, Ubuntu, Mint, и т.п.) довольно легко установить все необходимые зависимости. Большинство библиотек доступны через apt или менеджер пакетов Synaptic.

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

sudo apt build-dep freecad

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

Эти пакеты необходимы для успешной компиляции в целом:

  • build-essential, устанавливает компиляторы C и C++ , библиотеки разработки C и make утилиту.
  • cmake, необходимый инструмент для настройки исходников FreeCAD. Вы также можете установить cmake-gui и cmake-curses-gui чтобы иметь графический интерфейс для данной утилиты.
  • libtool, необходимые инструменты для создания shared библиотек.
  • lsb-release, стандартная утилита базовой отчетности обычно уже установлена в системе Debian и позволяет программно различать чистую установку Debian или ее вариант, такой как Ubuntu или Linux Mint. Не удаляйте этот пакет, так как от него могут зависеть многие другие системные пакеты.

При компиляции FreeCAD используется язык Python, и он также используется в runtime в качестве языка сценариев. Если вы используете дистрибутив на основе Debian, интерпретатор Python как правило уже установлен в нем.

  • python3
  • swig, это инструмент, который создает интерфейсы между кодом C++ и Python.

Пожалуйста, убедитесь, что у вас установлен Python 3. Python 2 устарел в 2019 году, свежая разработка FreeCAD не тестируется с этой версией языка.

Boost библиотеки должны быть обязательно установлены:

  • libboost-dev
  • libboost-date-time-dev
  • libboost-filesystem-dev
  • libboost-graph-dev
  • libboost-iostreams-dev
  • libboost-program-options-dev
  • libboost-python-dev
  • libboost-regex-dev
  • libboost-serialization-dev
  • libboost-thread-dev

Должны быть установлены Coin библиотеки:

  • libcoin80-dev, для Debian Jessie, Stretch, Ubuntu с 16.04 до 18.10, или
  • libcoin-dev, для Debian Buster, Ubuntu 19.04 и выше, а так же Ubuntu 18.04/18.10 вместе с freecad-stable/freecad-daily PPAs должны быть добавлены в иходники.

Несколько библиотек, которые занимаются вычислениями, триангулированными поверхностями, сортировкой, мешами (meshes), компьютерным зрением, картографическими проекциями, 3D-визуализацией, оконной системой X11, парсингом XML и чтением Zip-файлов:

  • libeigen3-dev
  • libgts-bin
  • libgts-dev
  • libkdtree++-dev
  • libmedc-dev
  • libopencv-dev or libcv-dev
  • libproj-dev
  • libvtk7-dev or libvtk6-dev
  • libx11-dev
  • libxerces-c-dev
  • libyaml-cpp-dev
  • libzipios++-dev

Python 2 и Qt4

Python 2 и Qt4 уже устарели и не рекомендуются к применению. Начиная с версии 0.20, в FreeCAD они больше не поддерживаются.

При компиляции FreeCAD в Debian Jessie, Stretch, Ubuntu 16.04, используйте Python 2 и Qt4, установив следующие зависимости:

  • qt4-dev-tools
  • libqt4-dev
  • libqt4-opengl-dev
  • libqtwebkit-dev
  • libshiboken-dev
  • libpyside-dev
  • pyside-tools
  • python-dev
  • python-matplotlib
  • python-pivy
  • python-ply
  • python-pyside

Python 3 и Qt5

При компиляции FreeCAD в Debian Buster, Ubuntu 19.04 и выше, а также Ubuntu 18.04/18.10 с freecad-stable/freecad-daily PPAs добавленным в ваш исходный код, установите следующие зависимости.

  • qtbase5-dev
  • qttools5-dev
  • qt5-default (if compiling 0.20 on a machine that still has Qt4)
  • libqt5opengl5-dev
  • libqt5svg5-dev
  • qtwebengine5-dev
  • libqt5xmlpatterns5-dev
  • libqt5x11extras5-dev
  • libpyside2-dev
  • libshiboken2-dev
  • pyside2-tools
  • pyqt5-dev-tools
  • python3-dev
  • python3-matplotlib
  • python3-packaging
  • python3-pivy
  • python3-ply
  • python3-pyside2.qtcore
  • python3-pyside2.qtgui
  • python3-pyside2.qtsvg
  • python3-pyside2.qtwidgets
  • python3-pyside2.qtnetwork
  • python3-pyside2.qtwebengine
  • python3-pyside2.qtwebenginecore
  • python3-pyside2.qtwebenginewidgets
  • python3-pyside2.qtwebchannel
  • python3-pyside2uic

Ядро OpenCascade

Ядро OpenCascade - это основная графическая библиотека для создания 3D-фигур. Она существует в виде официальной версии OCCT и виде версии для сообщества OCE. Версия для сообщества к применению больше не рекомендуется, так как она устарела.

Для Debian Buster и Ubuntu 18.10 и выше, а так же для Ubuntu 18.04 с freecad-stable/freecad-daily PPAs добавлеными в ваши исходники, установите официальные пакеты.

  • libocct*-dev
    • libocct-data-exchange-dev
    • libocct-draw-dev
    • libocct-foundation-dev
    • libocct-modeling-algorithms-dev
    • libocct-modeling-data-dev
    • libocct-ocaf-dev
    • libocct-visualization-dev
  • occt-draw

Для Debian Jessie, Stretch, Ubuntu 16.04 и выше, установите community edition пакеты.

  • liboce*-dev
    • liboce-foundation-dev
    • liboce-modeling-dev
    • liboce-ocaf-dev
    • liboce-ocaf-lite-dev
    • liboce-visualization-dev
  • oce-draw

Вы можете установить библиотеки по отдельности или сразу несколько с похожим именами используя символ звездочку '*'. Замените occ на oce если вы хотите установить community редакцию библиотек.

sudo apt install libocct*-dev

Необязательные к установке пакеты

При желании вы также можете установить эти дополнительные пакеты:

  • libsimage-dev, чтобы Coin поддерживал дополнительные форматы файлов изображений.
  • doxygen и libcoin-doc (или libcoin80-doc для старых систем), если вы хотите автоматический генерировать документацию к исходному коду.
  • libspnav-dev, для поддержки устройств 3D ввода, таких как 3Dconnexion "Space Navigator" или "Space Pilot".
  • checkinstall, если вы хотите зарегистрировать установленные файлы в диспетчере пакетов вашей системы, чтобы вы могли удалить их позже.

Устаовка Python 3 и Qt5 одной командой

Требуется, чтобы Pyside2 был доступен в Debian buster и freecad-stable/freecad-daily PPAs.

sudo apt install cmake cmake-gui libboost-date-time-dev libboost-dev libboost-filesystem-dev libboost-graph-dev libboost-iostreams-dev libboost-program-options-dev libboost-python-dev libboost-regex-dev libboost-serialization-dev libboost-thread-dev libcoin-dev libeigen3-dev libgts-bin libgts-dev libkdtree++-dev libmedc-dev libocct-data-exchange-dev libocct-ocaf-dev libocct-visualization-dev libopencv-dev libproj-dev libpyside2-dev libqt5opengl5-dev libqt5svg5-dev qtwebengine5-dev libqt5x11extras5-dev libqt5xmlpatterns5-dev libshiboken2-dev libspnav-dev libvtk7-dev libx11-dev libxerces-c-dev libzipios++-dev occt-draw pyside2-tools python3-dev python3-matplotlib python3-packaging python3-pivy python3-ply python3-pyside2.qtcore python3-pyside2.qtgui python3-pyside2.qtsvg python3-pyside2.qtwidgets python3-pyside2.qtnetwork python3-pyside2.qtwebengine python3-pyside2.qtwebenginecore python3-pyside2.qtwebenginewidgets python3-pyside2.qtwebchannel python3-markdown python3-git python3-pyside2uic qtbase5-dev qttools5-dev swig libyaml-cpp-dev

ПРИМЕЧАНИЕ: В некоторых версиях Ubuntu и некоторых версиях Qt вы получите сообщение об ошибке, что python3-pyside2uic не может быть найден-в этих системах вы можете безопасно опустить его. В Ubuntu 20.04 вам нужно будет добавить pyqt5-dev-tools. Более подробную информацию можно найти в это обсуждение на форуме.

Установка Python 2 и Qt4 одной коммандой

Это не рекомендуется для более новых установок, поскольку и Python 2 и Qt4 являются устаревшими.

sudo apt install cmake debhelper dh-exec dh-python libboost-date-time-dev libboost-dev libboost-filesystem-dev libboost-graph-dev libboost-iostreams-dev libboost-program-options-dev libboost-python-dev libboost-regex-dev libboost-serialization-dev libboost-thread-dev libcoin80-dev libeigen3-dev libgts-bin libgts-dev libkdtree++-dev libmedc-dev libocct-data-exchange-dev libocct-ocaf-dev libocct-visualization-dev libopencv-dev libproj-dev libpyside-dev libqt4-dev libqt4-opengl-dev libqtwebkit-dev libshiboken-dev libspnav-dev libvtk6-dev libx11-dev libxerces-c-dev libzipios++-dev lsb-release occt-draw pyside-tools python-dev python-matplotlib python-pivy python-ply swig

Пользователи Ubuntu 16.04, пожалуйста, ознакомьтесь также с обсуждением компиляции на форуме: Компиляция в Linux (Kubuntu): CMake не может найти VTK.

Raspberry Pi

Выполните те же действия, что и в Debian и Ubuntu.

Сообщалось о проблемах при попытке компиляции в Raspbian с Python 3 и Qt5, но комбинация Python 3 и Qt4, похоже, работает для более старых версий FreeCAD.

Для более новых версий FreeCAD компиляция с Py3/Qt5 проходит успешно, если установлена операционная система Ubuntu 20.04.

Из-за различных проблем с Qt в этой версии обычные PySide tools не будут найдены.

E: Unable to locate package python3-pyside2uic

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

sudo apt-get install pyqt5-dev
sudo apt-get install pyqt5-dev-tools
cd /usr/bin/
ln -s pyrcc5 pyside2-rcc
ln -s pyuic5 pyside2-uic

Теперь компиляция может быть продолжена.

cd freecad-build/
cmake ../freecad-source -DBUILD_QT5=ON -DPYTHON_EXECUTABLE=/usr/bin/python3 -DUSE_PYBIND11=ON
make -j2

Параметр -j для make не должен превышать 3, поскольку Raspberry Pi имеет ограниченную память. На компиляцию уйдет несколько часов, поэтому лучше сделать это за ночь.

Дополнительная информация, FreeCAD и Raspberry Pi 4.

Fedora

There is a bug in cmake distributed by Fedora 34/35 which results in cmake failing to find the opencascade libraries. This can easily be fixed by making one minor change to the top level cmake file of opencascade installed on Fedora. Details here: https://bugzilla.redhat.com/show_bug.cgi?id=2083568.

Near the top of the file OpenCASCADEConfig.cmake, change the following line to use REAL_PATH(). This fixes a bug introduced by the use of a symlink from /lib to /usr/lib of Fedora, which causes cmake to fail.

This file is usually installed in /usr/lib64/cmake/opencascade/OpenCASCADEConfig.cmake.

get_filename_component (OpenCASCADE_INSTALL_PREFIX "${OpenCASCADE_INSTALL_PREFIX}" PATH)

change this to:

file (REAL_PATH ${OpenCASCADE_INSTALL_PREFIX} OpenCASCADE_INSTALL_PREFIX)

This trivial change needs to be made inside the build directory once cmake has been run and failed. Re-running cmake will then correctly detect the OCCT libraries in the normal way.

Fedora38/39

Now install Python 3.11. This includes a notable change in how Python initializes when running a program. As a result FreeCAD fails to find OpenCamLib, meaning 3D Surface and Waterline are not available in the CAM Workbench. This was fixed in the master branch on 20th Mar 2024 (Pull request #13059).

Вам нужны следующие пакеты :

  • gcc-c++ (or possibly another C++ compiler?)
  • cmake
  • doxygen
  • swig
  • gettext
  • dos2unix
  • desktop-file-utils
  • libXmu-devel
  • freeimage-devel
  • mesa-libGLU-devel
  • opencascade-devel
  • openmpi-devel
  • python3
  • python3-devel
  • python3-pyside2
  • python3-pyside2-devel
  • pyside2-tools
  • boost-devel
  • tbb-devel
  • eigen3-devel
  • qt-devel
  • qt5-qtwebengine-devel
  • qt5-qtxmlpatterns
  • qt5-qtxmlpatterns-devel
  • qt5-qtsvg-devel
  • qt5-qttools-static
  • ode-devel
  • xerces-c
  • xerces-c-devel
  • opencv-devel
  • smesh-devel
  • Coin3
  • Coin3-devel
  • yaml-cpp

(Не перепутайте "Coin" с "coin" - тот что с маленькой буквы это финансовый пакет. Апрельские Coin4 и Coin4-devel 2021 уже доступны) (если coin2 является последней доступной версией для вашей версии Fedora, используйте пакеты из http://www.zultron.com/rpm-repo/)

  • SoQt-devel
  • freetype
  • freetype-devel
  • vtk
  • vtk-devel
  • med
  • med-devel

Можете добавить, если требуется:

  • libspnav-devel (для поддержки устройств 3Dconnexion, вроде Space Navigator или Space Pilot)
  • pivy ( https://bugzilla.redhat.com/show_bug.cgi?id=458975 Pivy не обязателен, но нужен для верстака Draft)

To install all dependencies at once (tested on fedora 36 and 37):

sudo dnf install gcc-c++ cmake doxygen swig gettext dos2unix desktop-file-utils libXmu-devel freeimage-devel mesa-libGLU-devel opencascade-devel openmpi-devel python3 python3-devel python3-pyside2 python3-pyside2-devel pyside2-tools boost-devel tbb-devel eigen3-devel qt-devel qt5-qtwebengine-devel qt5-qtxmlpatterns qt5-qtxmlpatterns-devel qt5-qtsvg-devel qt5-qttools-static ode-devel xerces-c xerces-c-devel opencv-devel smesh-devel Coin3 Coin3-devel SoQt-devel freetype freetype-devel vtk vtk-devel med med-devel libspnav-devel python3-pivy python3-markdown python3-GitPython yaml-cpp

Gentoo

Простейший путь проверить, какие пакеты нужны для компиляции FreeCAD это проверить через portage:

emerge -pv freecad

Вы получите список дополнительных пакетов, которые следует установить на Вашей системе.

Если FreeCAD недоступен в portage, он доступен в оверлее waebbl. Система отслеживания ошибок на оверлее waebbl Github может помочь решить некоторые проблемы, с которыми вы можете столкнуться. Оверлей предоставляет freecad-9999, который вы можете выбрать для компиляции или просто использовать для получения зависимостей.

layman -a waebbl

openSUSE

Tumbleweed

Следующие команды установят пакеты, необходимые для создания FreeCAD с Qt5 и Python 3.

zypper in --no-recommends -t pattern devel_C_C++ devel_qt5

zypper in libqt5-qtbase-devel libqt5-qtsvg-devel libqt5-qttools-devel boost-devel swig libboost_program_options-devel libboost_mpi_python3-devel libboost_system-devel libboost_program_options-devel libboost_regex-devel libboost_python3-devel libboost_thread-devel libboost_system-devel libboost_headers-devel libboost_graph-devel python3 python3-devel python3-matplotlib python3-matplotlib-qt5 python3-pyside2 python3-pyside2-devel python3-pivy gcc gcc-fortran cmake occt-devel libXi-devel opencv-devel libxerces-c-devel Coin-devel SoQt-devel freetype2-devel eigen3-devel libode6 vtk-devel libmed-devel hdf5-openmpi-devel openmpi2-devel netgen-devel freeglut-devel libspnav-devel f2c doxygen dos2unix glew-devel yaml-cpp

Следующая команда установит Qt Creator и отладчик проекта GNU.

zypper in libqt5-creator gdb

Если какие-либо пакеты отсутствуют, вы можете проверить Tumbleweed [3] "FreeCAD.spec" файл на [4] Откройте Службу сборки.

Также, проверьте, есть ли какие-либо исправления, которые вам необходимо использовать (например 0001-find-openmpi2-include-files.patch).

Leap

Если есть разница между доступными пакетами на Tumbleweed и Leap, то вы можете прочитать Leap [5] файл "FreeCAD.spec" на [6] Откройте службу сборки, чтобы определить необходимые пакеты.

Смотрите piano_jonas unofficial "Compile On openSUSE" guide.

Arch Linux

Вам понадобятся следующие библиотеки из официальных архивов:

  • boost
  • cmake
  • coin
  • curl
  • desktop-file-utils
  • eigen
  • gcc-fortran
  • git
  • glew
  • hicolor-icon-theme
  • jsoncpp
  • libspnav
  • med
  • nlohmann-json
  • opencascade
  • pyside2-tools
  • pyside2
  • python-matplotlib
  • python-netcdf4
  • python-packaging
  • python-pivy
  • qt5-svg
  • qt5-tools
  • qt5-webengine
  • shared-mime-info
  • shiboken2
  • swig
  • utf8cpp
  • verdict
  • xerces-c
  • yaml-cpp
sudo pacman -S --needed boost cmake coin curl desktop-file-utils eigen gcc-fortran git glew hicolor-icon-theme jsoncpp libspnav med nlohmann-json opencascade pyside2-tools pyside2 python-matplotlib python-netcdf4 python-packaging python-pivy qt5-svg qt5-tools qt5-webengine shared-mime-info shiboken2 swig utf8cpp xerces-c yaml-cpp

Note: Since version 5.0.1 of the openmpi package the binary libmpi_cxx.so stopped being shipped, this breaks the compilation with the current CMake process. To fix this you need to downgrade the package, see this forum post.

Более старые и нетрадиционные дистрибутивы

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

Сначала попробуйте найти необходимые библиотеки, упомянутые в сторонние библиотеки в диспетчере пакетов. Остерегайтесь, что у некоторых из них может быть немного другое имя пакета; ищите name, но также libname, name-dev, name-devel и аналогичные. Если это невозможно, попробуйте скомпилировать эти библиотеки самостоятельно.

Для FreeCAD требуется версия компилятора GNU g++, равная или выше 3.0.0, так как FreeCAD в основном написан на C++. Во время компиляции выполняются некоторые сценарии Python, поэтому интерпретатор Python должен работать должным образом. Чтобы избежать каких-либо проблем с компоновщиком, также рекомендуется иметь пути к библиотеке в переменной LD_LIBRARY_PATH или в файле ld.so.conf. Это уже сделано в современных дистрибутивах Linux, но, возможно, потребуется установить в более старых.

Pivy

Pivy (обертки Python для Coin3d) не требуется для сборки FreeCAD или его запуска, но необходимы в качестве зависимости от среды выполнения для Draft Workbench. Если вы не собираетесь использовать эти инструментальные средства, вам не понадобится Pivy. Однако обратите внимание, что верстак Draft используется внутри других рабочих столов, таких как Arch и BIM, поэтому для использования этих инструментальных средств также необходимо установить Pivy.

К ноябрю 2015 года устаревшая версия Pivy, включенная в исходный код FreeCAD, больше не будет компилироваться во многих системах. Это не большая проблема, так как обычно вы должны получить Pivy от менеджера пакетов вашего дистрибутива; если вы не можете найти Pivy, вам, возможно, придется скомпилировать его самостоятельно, см. Инструкции по компиляции Pivy.

Отладочные символы

Для устранения неполадок в FreeCAD полезно иметь отладочные символы важных библиотек зависимостей, таких как Qt. Для этого попробуйте установить пакеты зависимостей, которые заканчиваются на -dbg, -dbgsym, -debuginfo или аналогичные, в зависимости от вашего дистрибутива Linux.

Для Ubuntu вам, возможно, потребуется включить специальные репозитории, чтобы иметь возможность просматривать и устанавливать эти отладочные пакеты с помощью диспетчера пакетов. См.Debug Symbol Packages для получения дополнительной информации.

Сборка FreeCAD

Python 2 и Qt4 при сборке больше не поддерживается, а в версии 0.20 больше не поддерживается вообще. Допускается компиляция с Python 3 и Qt5. А для версии 0.20 требуется как минимум Python3.6 и Qt 5.9.

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

  1. CMake проверяет наличие в вашей системе всех необходимых программ и библиотек и создает Makefile, настроенный для второго шага. FreeCAD имеет несколько вариантов конфигурации на выбор, но он поставляется с разумными настройками по умолчанию. Некоторые альтернативы подробно описаны ниже.
  2. Сама компиляция, которая выполняется с помощью программы make, которая генерирует исполняемые файлы FreeCAD.

Поскольку FreeCAD - это крупное приложение, компиляция всего исходного кода может занять от 10 минут до одного часа, в зависимости от вашего процессора и количества ядер процессора, используемых для компиляции.

Сборка вне папки исходников

Для сборки из исходного кода просто создайте каталог сборки freecad-build, отличный от вашей исходной папки FreeCAD, freecad-source; затем из этой точки каталога сборки cmake в нужную исходную папку. Вы также можете использовать cmake-gui или ccmake вместо cmake в приведенных ниже инструкциях. Как только cmake завершит конфигурацию среды, используйте make для запуска актуальной компиляции.

# from your freecad source folder:
mkdir build
cd build
cmake ../
make -j$(nproc --ignore=2)

Опция -j make определяет, сколько задач (файлов) компилируется параллельно. Программа nproc выводит количество ядер процессора в вашей системе; используя ее вместе с опцией -j, вы можете обработать столько файлов, сколько у вас ядер, чтобы ускорить общую компиляцию программы. В приведенном выше примере он будет использовать все ядра вашей системы, кроме двух; это позволит вашему компьютеру реагировать на другие виды использования, пока компиляция выполняется в фоновом режиме. Исполняемый файл FreeCAD в конечном итоге появится в каталоге freecad-build/bin. См. также Compiling (speeding up) для повышения скорости компиляции.

Resolving cmake issues

If you have done a build before and get stuck on a dependency that is not recognized or can't seem to be resolved, try the following:

  • Delete the contents of the build directory before running cmake again. FreeCAD is a rapidly moving target, you may be tripping over cached cmake information that points at an older version than the new repository head can use. Clearing the cache may allow cmake to recover and recognize the version you actually need.
  • If cmake complains about missing a specific file, use a tool such as "apt-file search", or its equivalent in other package systems, to discover what package that file belongs to and install it. Bear in mind that you are likely to need the -dev version of the package that carries header or config files files required for FreeCAD to use the package.

Compiling against GNU libc 2.34 and later

GNU libc 2.34 introduces a change to the library that can cause builds on some Linux systems to fail with an error like:

No rule to make target '/usr/lib/x86_64-linux-gnu/libdl.so

To resolve this, a symbolic link must be manually created from the (now empty) system-installed libdl.so.* to the location your compiler says it is looking for the file. For example (if the actual installed copy of libdl.so on your system is /usr/lib/x86_64-linux-gnu/libdl.so.2):

sudo ln -s /usr/lib/x86_64-linux-gnu/libdl.so.2 /usr/lib/x86_64-linux-gnu/libdl.so

Adapt the command for the structure of your system by searching for libdl.so* and linking it to the appropriate location.

Как восстановить папку с исходными кодами

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

> .gitignore
git clean -df
git reset --hard HEAD

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

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

Конфигурирование

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

cmake -D <var>:<type>=<value> $SOURCE_DIR

Где $SOURCE_DIR - каталог, содержащий исходный код. <type> в большинстве случаев может быть опущен. Пробел после параметра -D также может быть опущен.

Например, чтобы избежать создания FEM Workbench:

cmake -D BUILD_FEM:BOOL=OFF ../freecad-source
cmake -DBUILD_FEM=OFF ../freecad-source

Все возможные переменные перечислены в файле InitializeFreeCADBuildOptions.cmake, расположенном в каталоге CMake/FreeCAD_Helpers. В этом файле найдёте слово option, чтобы перейти к переменным, которые можно задать, и просмотреть их значения по умолчанию.

# ==============================================================================
# =================   All the options for the build process    =================
# ==============================================================================

option(BUILD_FORCE_DIRECTORY "The build directory must be different to the source directory." OFF)
option(BUILD_GUI "Build FreeCAD Gui. Otherwise you have only the command line and the Python import module." ON)
option(FREECAD_USE_EXTERNAL_ZIPIOS "Use system installed zipios++ instead of the bundled." OFF)
option(FREECAD_USE_EXTERNAL_SMESH "Use system installed smesh instead of the bundled." OFF)
...

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

Для Debug сборки

Создайте сборку Debug для устранения неполадок в FreeCAD. Имейте в виду, что при такой сборке Sketcher становится очень медленным при работе со сложными эскизами.

cmake -DPYTHON_EXECUTABLE=/usr/bin/python3 -DCMAKE_BUILD_TYPE=Debug ../freecad-source

Для Release сборки

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

cmake -DPYTHON_EXECUTABLE=/usr/bin/python3 -DCMAKE_BUILD_TYPE=Release ../freecad-source

Сборка на основе Python 3 и Qt5

По умолчанию FreeCAD 0.19 и более ранние версии созданы для Python 2 и Qt4. Поскольку эти два пакета устарели, лучше создавать для Python 3 и Qt5. Поддержка Python 2 и Qt4 была удалена в FreeCAD 0.20, и нет необходимости явно включать Qt5 и Python 3 при компиляции последних версий разработки.

Для 0.20_dev:

cmake ../freecad-source

Обратите внимание, что при переключении между сборками 0.19 и 0.20 может потребоваться удалить CMakeCache.txt до запуска cmake.

Сборка с применением особых версий Python

Если по умолчанию исполняемый файл python в вашей системе является символической ссылкой на Python 2, cmake попытается настроить FreeCAD для этой версии. Вы можете выбрать другую версию Python, указав путь к определенному исполняемому файлу:

cmake -DPYTHON_EXECUTABLE=/usr/bin/python3 ../freecad-source

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

cmake -DPYTHON_EXECUTABLE=/usr/bin/python3.6 \
    -DPYTHON_INCLUDE_DIR=/usr/include/python3.6m \
    -DPYTHON_LIBRARY=/usr/lib/x86_64-linux-gnu/libpython3.6m.so \
    -DPYTHON_PACKAGES_PATH=/usr/lib/python3.6/site-packages/ \
    ../freecad-source

В одной системе, возможно, имеет несколько независимых версий Python, поэтому расположение и номера версий ваших файлов Python будут зависеть от вашего конкретного дистрибутива Linux. Используйте python3-V для отображения версии Python, которую вы используете в настоящее время; необходимы только первые два числа; например, если результатом является Python 3.6.8, вам необходимо указать каталоги, относящиеся к версии 3.6. Если вы не знаете нужных каталогов, попробуйте выполнить их поиск с помощью команды locate.

locate python3.6

Вы можете использовать python3 -m site в терминале для определения каталога site-packages или dist-packages для систем Debian.

Some components of FreeCAD, such as PySide, try to autodetect the most recent Python version installed on your system, which might fail if it is different from what you entered above. Adding the following cMake option might solve the issue:

-DPython3_FIND_STRATEGY=LOCATION

Сборка в Qt Creator на основе Python 3 и Qt5

1. Запустите Qt Creator.

2. Кликните на Open Project.

3. Перейдите в каталог, в котором находится исходный код, freecad-source/, и выберите самый верхний файл CMakeLists.txt.

4. Выбрав файл, он автоматически запустит cmake на нем, но может выйти из строя, если соответствующие параметры установлены неправильно.

5. Перейдите в Projects → Build & Run → Imported Kit → Build → Build Settings → CMake. Установите соответствующий каталог сборки, freecad-build/.

6. Установите соответствующие переменные в диалоговом окне Key-Value типов String и Bool.

PYTHON_EXECUTABLE=/usr/bin/python3

7. Если переменные загружают проект неправильно, возможно, вам придется перейти к Projects → Manage Kits → Kits → Default (or Imported Kit or similar) → CMake Configuration. Затем нажмите Change, и добавьте соответствующую конфигурацию, как описано выше. Возможно, вам придется добавить дополнительные переменные о путях Python, если системный Python не найден.

PYTHON_EXECUTABLE:STRING=/usr/bin/python3.7
PYTHON_INCLUDE_DIR:STRING=/usr/include/python3.7m
PYTHON_LIBRARY:STRING=/usr/lib/x86_64-linux-gnu/libpython3.7m.so
PYTHON_PACKAGES_PATH:STRING=/usr/lib/python3.7/site-packages

7.1. Нажмите Apply, затем OK.

7.2. Убедитесь, что остальные параметры заданы правильно, например, Qt version должна быть текущей версией, установленной в системе, как Qt 5.9.5 in PATH (qt5).

Нажмите Apply, затем OK, чтобы закрыть конфигурацию.

Программа cmake должна снова запуститься автоматически, и она должна заполнить весь диалог Key-Value всеми переменными, которые можно настроить.

8. Перейдите в Projects → Build & Run → Imported Kit → Run → Run Settings → Run → Run Configuration и выберите FreeCADMain для компиляции графической версии FreeCAD или FreeCADMainCMD для компиляции только версии командной строки.

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

Плагин Qt designer

Если Вы хотите разрабатывать Qt-код для FreeCAD, Вам понадобится плагин к Qt Designer, который обеспечивает все пользовательские виджеты FreeCAD.

Перейдите в дополнительный каталог исходного кода, запустите qmake с указанным файлом проекта для создания Makefile; затем запустите make для компиляции плагина.

cd freecad-source/src/Tools/plugins/widget
qmake plugin.pro
make

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

cd freecad-source/src/Tools/plugins/widget
$QT_DIR/bin/qmake plugin.pro
make

где $QT_DIR - это каталог, в котором хранятся двоичные библиотеки Qt, например, /usr/lib/x86_64-linux-gnu/qt5.

Созданная библиотека libFreeCAD_widgets.so, которую необходимо скопировать в $QT_DIR/плагины/конструктор.

sudo cp libFreeCAD_widgets.so $QT_DIR/plugins/designer

Внешний или встроенный Pivy

В прошлом, версия Pivy была включена в исходный код FreeCAD (internal). Если вы хотели использовать системную копию Pivy (external), вам нужно было использовать -DFREECAD_USE_EXTERNAL_PIVY=1.

Использование внешнего Pivy стало по умолчанию во время разработки FreeCAD 0.16, поэтому эту опцию больше не нужно устанавливать вручную.

Документирование посредством Doxygen

Если у вас установлен Doxygen, вы можете создать документацию по исходному коду. См. инструкции в source documentation.

Дополнительная документация

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

от Kitware.

(блог), предварительно изучив программирование.

(блог) , предварительно изучив программирование.

Создание пакета debian

Если Вы планируете собрать пакет Debian вне исходников, вам следует сначала установить следующие пакеты:

sudo apt install dh-make devscripts lintian

Перейдите в папку FreeCAD и выполните

debuild

Когда пакет построен, Вы можете использовать lintian для проверки, содержит ли пакет ошибки

lintian freecad-package.deb

*.deb package with checkinstall

The Debian script checkinstall allows to create a *.deb package that can be installed and removed with the standard dpkg commands. It may need to be installed first (on Ubuntu use sudo apt install checkinstall). It's interactive and asks for the required information providing helpful defaults. During the process the package is installed and a *.deb file and a backup archive are created.

It's a good idea to define a name and a short description for the package. The name must be entered to uninstall it again and the desription will be listed by dpkg -l. The default name "build" is not very informative.

Example:

cd freecad-source/build
cmake ..
make
sudo checkinstall                                  # e.g. name=freecad-test1

The result is a *.deb file in the build folder. checkinstall will install the build by default. This is how you can install or uninstall it:

cd freecad-source/build
ls | grep freecad
        freecad-test1_20220814-1_amd64.deb
sudo dpkg -i freecad-test1_20220814-1_amd64.deb   # install
dkpg -l | grep freecad                            # find by name
sudo dpkg -r freecad-test1                        # uninstall by name

Обновление исходного кода

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

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

cd freecad-source
git pull

Затем перейдите в каталог сборки, в котором код был скомпилирован изначально, и запустите cmake, указав текущий каталог (denoted by a dot); затем запустите повторную компиляцию с помощью make.

cd ../freecad-build
cmake .
make -j$(nproc --ignore=2)

Uninstalling the source code

In case the compiled source code was installed with sudo make install (for Debian) the files were copied to the /usr/local folder into several subfolders. For uninstallation the file install_manifest.txt can be used. It has been created into the build folder during compilation and contains all installed files. As long as this file exists, the installation can be uninstalled.

cd freecad-source/freecad-build
xargs sudo rm < install_manifest.txt

Разрешение проблем

Примечание для 64-битных систем

При компиляции FreeCAD на 64-бит известна проблема с 64-битным пакетом OpenCASCADE. Чтобы FreeCAD правильно заработал, Вам нужно запустить скрипт configure и установить дополнительно CXXFLAGS:

./configure CXXFLAGS="-D_OCC64"

Для систем на базе Debian эта опция не требуется при использовании готовых пакетов OpenCASCADE, поскольку эти пакеты устанавливают правильно CXXFLAGS внутри.

Скрипты автоматической компиляции

Это всё, что Вам нужно для полной компиляции FreeCAD. Это односкриптовое решение, работающее на свежеустановленном дистрибутиве. Команда запросит пароль root для установки пакетов новых онлайновых репозиториев. Эти скрипты должны запускаться на 32- и 64-битных версиях. Они написаны для разных версий, но, скорее всего, будут работать для позднейший версий с небольшими изменениями или без них.

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

Ubuntu

Эти скрипты обеспечивают надёжный путь для установки верного набора зависимостей, требуемых для сборки и запуска FreeCAD в Ubuntu. Они используют репозитории PPA Ubuntu FreeCAD, и должны работать на любой версии Ubuntu, для которой есть целевой PPA. PPA на freecad-daily нацелен на последнюю версию Ubuntu, а 'стабильный' PPA нацелен на официально поддерживаемые версии Ubuntu.

Этот скрипт устанавливает дневной скомпилированный снимок FreeCAD и его зависимостей. Он добавляет дневной репозиторий, получает зависимости для создания этой версии и устанавливает необходимые пакеты. Затем он продолжает извлекать исходный код в определенный каталог, создает каталог сборки и вносит в него изменения, настраивает среду компиляции с помощью cmake и, наконец, создает всю программу с помощью make. Сохраните сценарий в файл, сделайте его исполняемым и запустите его, но не используйте sudo; привилегии суперпользователя будут запрашиваться только для выбранных команд.

#!/bin/sh
sudo add-apt-repository --enable-source ppa:freecad-maintainers/freecad-daily && sudo apt-get update
sudo apt-get build-dep freecad-daily
sudo apt-get install freecad-daily

git clone --recurse-submodules https://github.com/FreeCAD/FreeCAD.git freecad-source
mkdir freecad-build
cd freecad-build
cmake -DPYTHON_EXECUTABLE=/usr/bin/python3 -DFREECAD_USE_PYBIND11=ON ../freecad-source
make -j$(nproc --ignore=2)

При желании вы можете удалить предварительно скомпилированную версию FreeCAD (freecad-daily), оставив зависимости на месте, однако, если этот пакет будет установлен, менеджер пакетов также сможет обновлять свои зависимости; это наиболее полезно, если вы намерены следить за развитием FreeCAD, а также постоянно обновлять и компилировать исходные тексты из репозитория Git.

Предыдущий скрипт предполагает, что вы хотите скомпилировать последнюю версию FreeCAD, поэтому вы используете репозиторий "daily" для получения зависимостей. Однако вместо этого вы можете получить зависимости сборки "стабильной" версии для вашего текущего выпуска Ubuntu. Если это так, замените верхнюю часть предыдущего сценария следующими инструкциями. Для Ubuntu 12.04 опустите --enable-source в команде.

#!/bin/sh
sudo add-apt-repository --enable-source ppa:freecad-maintainers/freecad-stable && sudo apt-get update
sudo apt-get build-dep freecad
sudo apt-get install libqt5xmlpatterns5-dev   # Needed for 0.20; should go away on next packaging update 
sudo apt-get install freecad

Как только вы установите пакет freecad из репозитория freecad-stable, он заменит исполняемый файл FreeCAD, доступный из репозитория Ubuntu Universe. Исполняемый файл будет называться просто freecad, а не freecad-stable.

openSUSE

Никаких внешних репозиториев не требуется для компиляции FreeCAD. Однако существует несовместимость с python3-devel, которую необходимо удалить. FreeCAD может быть скомпилирован из GIT

# install needed packages for development
sudo zypper install gcc cmake OpenCASCADE-devel libXerces-c-devel \
python-devel libqt4-devel python-qt4 Coin-devel SoQt-devel boost-devel \
libode-devel libQtWebKit-devel libeigen3-devel gcc-fortran git swig
 
# create new dir, and go into it
mkdir FreeCAD-Compiled 
cd FreeCAD-Compiled
 
# get the source
git clone --recurse-submodules https://github.com/FreeCAD/FreeCAD.git free-cad
 
# Now you will have a subfolder in this location called free-cad. It contains the source
 
# make another dir for compilation, and go into it
mkdir FreeCAD-Build1
cd FreeCAD-Build1 
 
# build configuration 
cmake ../free-cad
 
# build FreeCAD
make
 
# test FreeCAD
cd bin
./FreeCAD -t 0

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

# go into free-cad dir created earlier
cd free-cad
 
# pull
git pull
 
# get back to previous dir
cd ..
 
# Now repeat last few steps from before.
 
# make another dir for compilation, and go into it
mkdir FreeCAD-Build2
cd FreeCAD-Build2
 
# build configuration 
cmake ../free-cad
 
# build FreeCAD
# Note: to speed up build use all CPU cores: make -j$(nproc)
make
 
# test FreeCAD
cd bin
./FreeCAD -t 0

Debian Squeeze

# get the needed tools and libs
sudo apt-get install build-essential python libcoin60-dev libsoqt4-dev \
libxerces-c2-dev libboost-dev libboost-date-time-dev libboost-filesystem-dev \
libboost-graph-dev libboost-iostreams-dev libboost-program-options-dev \
libboost-serialization-dev libboost-signals-dev libboost-regex-dev \
libqt4-dev qt4-dev-tools python2.5-dev \
libsimage-dev libopencascade-dev \
libsoqt4-dev libode-dev subversion cmake libeigen2-dev python-pivy \
libtool autotools-dev automake gfortran
 
# checkout the latest source
git clone --recurse-submodules https://github.com/FreeCAD/FreeCAD.git freecad
 
# go to source dir
cd freecad
 
# build configuration 
cmake .
 
# build FreeCAD
# Note: to speed up build use all CPU cores: make -j$(nproc)
make
 
# test FreeCAD
cd bin
./FreeCAD -t 0

Fedora 27/28/29

Опубликовано пользователем [PrzemoF] на форуме.

#!/bin/bash

ARCH=$(arch)

MAIN_DIR=FreeCAD
BUILD_DIR=build

#FEDORA_VERSION=27
#FEDORA_VERSION=28
FEDORA_VERSION=29

PACKAGES="gcc cmake gcc-c++ boost-devel zlib-devel swig eigen3 qt-devel \
shiboken shiboken-devel pyside-tools python-pyside python-pyside-devel xerces-c \
xerces-c-devel OCE-devel smesh graphviz python-pivy python-matplotlib tbb-devel \
 freeimage-devel Coin3 Coin3-devel med-devel vtk-devel"

FEDORA_29_PACKAGES="boost-python2 boost-python3 boost-python2-devel boost-python3-devel"

if [ "$FEDORA_VERSION" = "29" ]; then
    PACKAGES="$PACKAGES $FEDORA_29_PACKAGES"
fi

echo "Installing packages required to build FreeCAD"
sudo dnf -y install $PACKAGES
cd ~
mkdir $MAIN_DIR || { echo "~/$MAIN_DIR already exist. Quitting.."; exit; }
cd $MAIN_DIR
git clone --recurse-submodules https://github.com/FreeCAD/FreeCAD.git
mkdir $BUILD_DIR || { echo "~/$BUILD_DIR already exist. Quitting.."; exit; }
cd $BUILD_DIR
cmake ../FreeCAD 
make -j$(nproc)

Arch с использованием AUR

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

Обязательное требование : git

Шаги :

  1. Откройте терминал. При необходимости создайте каталог, например. mkdir git. При необходимости измените каталог, например. cd git.
  2. Клонировать репозиторий AUR : git clone http://aur.archlinux.org/packages/freecad-git
  3. Войдите в папку репозитория AUR : cd freecad-git
  4. Компиляция с использованием Arch makepkg : makepkg -s. Флаг -s или --syncdeps также установит необходимые зависимости.
  5. Установите созданный пакет : makepkg --install или дважды щелкните имя файла pkgname-pkgver.pkg.tar.xz в вашем браузере файлов.

Чтобы обновить FreeCAD до последней версии, просто повторите шаг 3. Обновите репозиторий, когда в рецепте произойдет какое-либо изменение или появятся новые функции, используя git checkout-f внутри каталога.



There is an experimental FreeCAD Docker container that is being tested for FreeCAD development. Read more about it at Compile on Docker

Обзор

This page describes how to compile the FreeCAD source code on macOS. For other platforms, see Compiling.

These instructions have been tested on macOS Catalina with standard XCode 11.6. It is known to work on macOS BigSur Beta with XCode 12.0 beta. If you plan to use XCode Beta, please be sure to download Command Line Tools add on through a dmg package to workaround some libz dependency issues.

This page serves as a quick start, and is not intended to be comprehensive with regard to describing all the available build options.

If you just want to evaluate the latest pre-release build of FreeCAD, you can download pre-built binaries from here.

Install Prerequisites

The following software must be installed to support the build process.

Homebrew Package Manager

Homebrew is a command line based package manager for macOS. The Homebrew main page provides an installation command line that you simply paste into a terminal window.

CMake

CMake is a build tool that generates a build configuration based on variables you specify. You then issue the 'make' command to actually build that configuration. The command-line version of CMake is automatically installed as part of the Homebrew installation, above. If you prefer to use a GUI version of CMake, you can download it from here.

Install Dependencies

FreeCAD maintains a Homebrew 'cask' which installs the required formulas and dependencies. Issue the following brew commands in your terminal.

brew tap freecad/freecad
brew install eigen
brew install --only-dependencies freecad

brew install may take quite a while, so you may want go grab a beverage. :-).

Alternately, you can install the individual dependencies manually by installing the following packages using brew install ...:

  • cmake
  • swig
  • boost
  • boost-python3
  • eigen
  • gts
  • vtk
  • xerces-c
  • qt@5 - Only Qt5 is currently supported, support for Qt6 is a work-in-progress
  • opencascade
  • doxygen
  • pkgconfig
  • coin3d - Note that as of this writing (Nov. 2022) this will install an unusable version of pyside@2 as a dependency.

There are several packages that are only available when you have tapped the freecad cask: you must do that (brew tap freecad/freecad). Due to some historical bug workarounds, at the time of this writing (Nov. 2022) the versions of PySide2 and Shiboken2 installed by Homebrew are not usable because they force the use of Py_Limited_API, which FreeCAD does not support. It is expected that this workaround will be removed in the coming months, but in the meantime you must use the FreeCAD cask versions of PySide and Shiboken. Use brew install ..., install the following packages:

  • freecad/freecad/pyside2@5.15.5
  • freecad/freecad/shiboken2@5.15.5
  • freecad/freecad/med-file
  • freecad/freecad/netgen

You will also need to "link" PySide and Shiboken:

brew link freecad/freecad/pyside2@5.15.5 freecad/freecad/shiboken2@5.15.5

In some cases the packages installed by Homebrew do not use the same Python version: for example, at the time of this writing PySide2 uses Python 3.10, but boost-python3 uses Python 3.11. While it is possible to "roll back" the more advanced version (so that in this case boost-python3 uses Python 3.10) this is an advanced operation, and in many cases it is best to wait for an update to the other package. If you want to pursue that path anyway, look at the "brew extract" command, which you can use to extract a formula into a new cask (typically freecad/freecad). You can then edit that formula as needed.

You will need to set the path to Qt: Qt5 is currently supported, while support for Qt6 is a work-in-progress. Set FREECAD_QT_VERSION to "Auto" or "5" to select Qt5 (the default). On the command line, use something like:

cmake \
  -DCMAKE_BUILD_TYPE="Release" \
  -DPYTHON_EXECUTABLE="/usr/local/bin/python3" \
  -DQt5_DIR="/usr/local/Cellar/qt@5/5.15.7/lib/cmake/Qt5" \
  -DPySide2_DIR="/usr/local/Cellar/pyside2@5.15.5/5.15.5/lib/cmake/PySide2-5.15.5" \
  -DShiboken2_DIR="/usr/local/Cellar/shiboken2@5.15.5/5.15.5_1/lib/cmake/Shiboken2-5.15.5" \
  ../freecad-source

Get the source

In the following instructions, the source and build folders are created side-by-side under

/Users/username/FreeCAD

but you can use whatever folders you want.

mkdir ~/FreeCAD
cd ~/FreeCAD

The following command will clone the FreeCAD git repository into a directory called FreeCAD-git.

git clone https://github.com/FreeCAD/FreeCAD FreeCAD-git

Create the build folder.

mkdir ~/FreeCAD/build

Запуск CMake

Next, we will run CMake to generate the build configuration. Several options must be passed to CMake. The following table describes the options and gives some background.

CMake Options

Name Value Notes
CMAKE_BUILD_TYPE Release (STRING) Release or Debug. Debug is generally used for developer-level testing but may also be required for user-level testing and troubleshooting.
CMAKE_PREFIX_PATH "/usr/local/opt/qt5152;" ... (PATH) Required to build with Qt5. See note below. You also need to add path to VTK libraries and NGLIB libraries cmake configuration file.
FREECAD_CREATE_MAC_APP 1 (BOOL) Create a FreeCAD.app bundle at the location specified in CMAKE_INSTALL_PREFIX, when the 'make install' command issued.
CMAKE_INSTALL_PREFIX "./.." (PATH) Path where you want to generate the FreeCAD.app bundle.
FREECAD_USE_EXTERNAL_KDL 1 (BOOL) Required.
BUILD_FEM_NETGEN 1 (BOOL) Required if choosing to build the FEM tools.

Note: Command line to generate CMAKE_PREFIX_PATH:

ls -d $(brew list -1 | grep qt | tail -1 | xargs brew --cellar)/*/lib/cmake

CMake GUI

Open the CMake app, and fill in the source and build folder fields. In this example, it would be /Users/username/FreeCAD/FreeCAD-git for the source, and /Users/username/FreeCAD/build for the build folder.

Next, click the Configure button to populate the list of configuration options. This will display a dialog asking you to specify what generator to use. Leave it at the default Unix Makefiles. Configuring will fail the first time because there are some options that need to be changed. Note: You will need to check the Advanced checkbox to get all of the options.

Set options from the table above, then click Configure again and then Generate.

Коммандная строка CMake

Enter the following in the terminal.

export PREFIX_PATH="/usr/local/opt/qt5152;\
/usr/local/Cellar/nglib/v6.2.2007/Contents/Resources;\
/usr/local/Cellar/vtk@8.2/8.2.0_1/lib/cmake;"
$cd ~/FreeCAD/build
$cmake \
  -DCMAKE_BUILD_TYPE="Release"   \
  -DBUILD_QT5=1                  \
  -DWITH_PYTHON3=1               \
  -DCMAKE_PREFIX_PATH="$PREFIX_PATH" \
  -DPYTHON_EXECUTABLE="/usr/local/bin/python3" \
  -DFREECAD_USE_EXTERNAL_KDL=1   \
  -DCMAKE_CXX_FLAGS='-std=c++14' \
  -DBUILD_FEM_NETGEN=1           \
  -DFREECAD_CREATE_MAC_APP=1     \
  -DCMAKE_INSTALL_PREFIX="./.."  \
  ../FreeCAD-git/

Run make

Finally, from a terminal run make to compile and link FreeCAD, and generate the app bundle.

cd ~/FreeCAD/build
make -j5 install

The -j option specifies how many make processes to run at once. One plus the number of CPU cores is usually a good number to use. However, if compiling fails for some reason, it is useful to rerun make without the -j option, so that you can see exactly where the error occurred.

See also Compiling - Speeding up.

If make finishes without any errors, you can now launch FreeCAD by double clicking the executable in the Finder.

Updating from Github

FreeCAD development happens fast; every day or so there are bug fixes or new features. To get the latest changes, use git to update the source directory (see Source code management), then re-run the CMake and make steps above. It is not usually necessary to start with a clean build directory in this case, and subsequent compiles will generally go much faster than the first one.

Building with Qt4 and Python 2.7

FreeCAD has transitioned from Qt 4 to Qt 5 as well as homebrew. Qt 4 is no longer available as an option for new build on macOS following Qt 5 transition. Python 2.7 has been deprecated within homebrew and upcoming macOS and we do not support it anymore for macOS build either.

Устранение неполадок

Segfault on Qt5 launch

If Qt4 was previously installed via brew, and you then build with Qt5, you may get a EXC_BAD_ACCESS (SEGSEGV) exception when launching the new Qt5 build. The fix for this is to manually uninstall Qt4.

brew uninstall --ignore-dependencies --force cartr/qt4/shiboken@1.2 cartr/qt4/pyside@1.2 cartr/qt4/pyside-tools@1.2 cartr/qt4/qt-legacy-formula

Fortran

"No CMAKE_Fortran_COMPILER could be found." during configuration - Older versions of FreeCAD will need a fortran compiler installed. With Homebrew, do "brew install gcc" and try configuring again, giving cmake the path to Fortran ie -DCMAKE_Fortran_COMPILER=/opt/local/bin/gfortran-mp-4.9 . Or, preferably use a more current version of FreeCAD source!

FreeType

When using CMake versions older than 3.1.0, it's necessary to set CMake variable FREETYPE_INCLUDE_DIR_freetype2 manually, eg /usr/local/include/freetype2

Additional Build Instructions

FreeCAD can be built against the latest git master hosted on github, and launched from a CLI using libraries provided by the homebrew-freecad tap. For a complete list of build instructions see here.


Обзор

Это библиотеки, которые FreeCAD использует в качестве сторонних зависимостей во время компиляции. Обычно они dynamically linked libraries и имеют расширение .so в Linux/macOS и .dll в Windows и сопровождаются их заголовочными файлами .h или .hpp или аналогичными. Если необходима измененная библиотека или необходим класс-оболочка, код измененной библиотеки или оболочки должен стать частью исходного кода FreeCAD и быть скомпилирован вместе с ним.

Перед компиляцией в системе должны быть установлены зависимости; см. компиляция в Linux, компиляция в Windows и компиляция в macOS для получения большей информации.

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

Ссылки

Название библиотеки Требуемая версия Ссылка для загрузки
Python >= 3.6 http://www.python.org/
Boost >= 1.33 http://www.boost.org/
OpenCASCADE >= 7.3 http://www.opencascade.org
Qt >= 5.4 https://www.qt.io/
Shiboken2 такая же, как и в Qt https://wiki.qt.io/Qt_for_Python/Shiboken
PySide2 такая же, как и в Qt https://wiki.qt.io/Qt_for_Python/Shiboken
Coin3D >= 3.x https://github.com/coin3d/coin
SoQt (deprecated) >= 1.2 https://github.com/coin3d/soqt
Quarter >= 1.0 https://github.com/coin3d/quarter
Pivy >= 0.6.5 https://github.com/coin3d/pivy/
FreeType >= XXX XXX
PyCXX >= XXX XXX
KDL >= XXX https://orocos.org/wiki/orocos/kdl-wiki.html
Point Cloud Library >= XXX XXX
Salome SMESH >= XXX XXX
VTK >= 6.0 XXX
Ply >= 3.11 https://www.dabeaz.com/ply/
Xerces-C++ >= 3.0 https://xerces.apache.org/xerces-c/
Eigen3 >= 3.0 http://eigen.tuxfamily.org/index.php?title=Main_Page
Zipios++ >= 0.1.5 https://snapwebsites.org/project/zipios, https://github.com/Zipios/Zipios
Zlib >= 1.0 http://www.zlib.net/, https://github.com/madler/zlib
libarea >= 0.0.20140514-1 https://github.com/danielfalck/libarea

Подробности

Python

Версия: 3.3 или выше

Лицензия: Python 3.3 license

Python 2 стал устаревшим в 2019 году. Дальнейшая разработка FreeCAD будет использовать исключительно Python 3; совместимость с Python 2 проверяться не будет, поэтому старые инструментальные средства и макросы, использующие эту версию, придется обновить, иначе они могут перестать работать. Пожалуйста, разместите сообщение на FreeCAD forum если у вас возникнут проблемы с Python 3.

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

  • для написания тестовых сценариев, для тестирования на различные условия, такие как утечка памяти, для обеспечения функциональности программного обеспечения после изменений, для проверок после сборки и тестов покрытия,
  • для написания макросов, а так же для записи макросов,
  • для реализации логики приложений стандартных пакетов,
  • для реализации вспомогательных инструментов, таких как менеджер дополнений,
  • для реализации целых рабочих столов, таких как Draft и Arch,
  • для динамической загрузки пакетов,
  • для реализации правил проектирования (knowledge engineering),
  • для создания необычных интернет-взаимодействий, таких как рабочие группы и PDM

В Linux Python обычно уже установлен в вашем дистрибутиве. Для Windows вы можете получить предварительно скомпилированный двоичный файл из Python.org или использовать ActiveState Python, однако получить отладочные библиотеки из последнего сложнее.

Python был выбран в качестве языка сценариев для FreeCAD по разным причинам:

  • Он более объектно-ориентирован, чем Perl и Tcl.
  • Код более понятен, чем Perl и Visual Basic.
  • Его проще внедрить в другое приложение, в отличие, скажем, от Java.

Таким образом, Python хорошо документирован, и его легко встраивать и расширять в приложение на C++. Он также хорошо протестирован и пользуется сильной поддержкой сообщества с открытым исходным кодом. Узнайте больше о Python и просмотрите официальную документацию по адресу Python.org.

Boost

Версия: 1.33 или выше

Лицензия: Boost Software License - Версия 1.0

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

Из-за их популярности и стабильности многие библиотеки Boost были приняты для включения в стандарт C++11, и еще больше планируется включить в последующие стандарты C++.

Для обеспечения эффективности и гибкости Boost широко использует шаблоны. Boost был источником широкой работы и исследований в области общего программирования и метапрограммирования на C++. Узнайте больше о Boost, посетив Boost homepage.

Технология OpenCascade

Версия: 6.7 и выше

Лицензия: версия 6.7.0 и более поздние версии регулируются GNU Lesser General Public License (LGPL) version 2.1 with additional exception. В более ранних версиях используется Open CASCADE Technology Public License.

Технология OpenCascade (OCCT) - это полнофункциональное ядро CAD профессионального уровня. Он был разработан в 1993 году и первоначально назывался CAS.CADE компанией Matra Datavision во Франции для квантовых приложений Strim (Styler) и Евклида. В 1999 году он был выпущен как программное обеспечение с открытым исходным кодом, и с тех пор он называется OpenCascade.

OCCT - это большой и сложный набор библиотек C++, которые обеспечивают функциональность, необходимую для приложения CAD:

  • Полное ядро геометрии, совместимое с STEP.
  • Топологическая модель данных и необходимые функции для работы с фигурами (вырезание, плавление, выдавливание и многие другие).
  • Стандартные процессоры импорта и экспорта для таких файлов, как STEP, IGES, VRML.
  • Просмотрщик 2D и 3D с поддержкой выбора.
  • Структура данных документа и проекта с поддержкой сохранения и восстановления, внешнего связывания документов, пересчета истории проектирования (параметрическое моделирование) и возможностью динамической загрузки новых типов данных в виде пакета расширений.

В разных дистрибутивах Linux существуют две основные версии OpenCascade. Один из них распространяется оригинальными разработчиками; он известен как OCCT и упакован под именами occ или occt. Другая версия - "издание сообщества", сокращенное OCE, и обычно встречается с именем oce. FreeCAD может компилироваться с любой версией, однако с 2016 года FreeCAD рекомендует компилироваться с официальными библиотеками OCCT, а не с официальными библиотеками OCE. Причина в том, что в издании сообщества отсутствуют важные исправления ошибок и функции, которые улучшают использование FreeCAD.

Чтобы узнать больше, посетите OpenCASCADE website.

Qt

Версия: 4.1 или выше

Лицензия: GPL v2.0/v3.0 или коммерческая; с версии 4.5, также LPGL v2.1.

Qt-один из самых популярных наборов инструментов графического пользовательского интерфейса (GUI), доступных в мире с открытым исходным кодом. FreeCAD использует этот инструментарий для рисования интерфейса программы. Для этого приложение Qt Designer очень полезно, так как оно позволяет разработчикам быстро рисовать диалоговые окна, экспортировать их в виде файловых ресурсов XML, а затем загружать эти интерфейсы во время выполнения.

Дополнительная информация о библиотеках Qt и их программной документации доступна по адресу Qt Documentation.

Shiboken2 и Pyside2

Shiboken-это генератор привязки Python, который Qt для Python использует для создания модуля PySide, другими словами, это система, используемая для предоставления API Qt C++ языку Python.

Оригинальные пакеты Shiboken и PySide предназначены для использования с Python 2 и Qt4; поскольку эти две версии считаются устаревшими в 2019 году, пожалуйста, используйте Shiboken2 и PySide2, которые работают с Python 3 и Qt5. Новая разработка FreeCAD выполняется с Python 3 и Qt5, поэтому совместимость с Python 2 и Qt4 не гарантируется после FreeCAD 0.18.

Подробнее о Shiboken и Pyside читайте на Qt для Python.

Coin3D

Версия: 3.0 и выше

Лицензия: 3-пунктовая BSD лицензия

Coin3D-это высокоуровневая библиотека 3D-графики с интерфейсом прикладного программирования на C++. Он использует структуры данных scenegraph для визуализации графики в реальном времени, подходящей для всех видов научных и инженерных приложений визуализации.

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

Coin3D совместим с API SGI Open Inventor 2.1. Этот API стал фактически стандартным графическим интерфейсом для 3D-визуализации в научном и инженерном сообществе. Он доказал свою ценность с 2000 года в качестве основного строительного блока в тысячах инженерных приложений по всему миру.

Coin3D (Open Inventor) используется в качестве 3D-средства просмотра в FreeCAD, поскольку средство просмотра OpenCascade (AIS и Graphics3D) имеет ограничения и узкие места в производительности, особенно при крупномасштабной инженерной визуализации; другие вещи, такие как текстуры или объемный рендеринг, не полностью поддерживаются средством просмотра OpenCascade.

Coin3D переносим на широкий спектр платформ: операционные системы UNIX, Linux, BSD, macOS X и Microsoft Windows. Чтобы узнать больше об этой библиотеке, посетите домашнюю страницу Coin3D.

SoQt (устарело)

Версия: 1.2.0 или выше

Лицензия: 3-пунктовая BSD лицензия

SoQt-это привязка Coin3D (Open Inventor) к инструментарию Qt GUI.

SoQt больше не используется в FreeCAD, он был заменен на Quarter, который является более поздней привязкой Qt.

Quarter

Версия: 1.0 или выше

Лицензия: 3-пунктовая BSD лицензия

Quarter-это более новая привязка Coin3D к инструментарию Qt. Его версия включена в исходный код FreeCAD, поэтому она компилируется вместе с ним.

Pivy

Версия: 0.6.3 или выше

Лицензия: 3-пунктовая BSD лицензия

Pivy - это библиотека, является оберткой для библиотеки Coin3d при использовании её в Python. Она не нужна при сборке FreeCAD или для его запуска, но она необходима в качестве runtime зависимости верстака Draft и других верстаков, которые используют его внутри, например Arch и BIM.

Если вы не собираетесь использовать эти верстаки, вам не понадобится Pivy.

Ply

Версия: 3.11 или выше

Лицензия: 3-пунктовая BSD лицензия

Ply-это синтаксический анализатор Python-Lex-Yacc. Он используется в качестве runtime зависимости верстака OpenSCAD. Если вы не используете данный верстак, вам может не понадобиться этот пакет.

Для подробной информации см. Ply homepage

Xerces-C++

Версия: 3.0 или выше

Лицензия: Apache Software License Версия 2.0

Xerces-C++ - это проверяющий синтаксический анализатор XML, написанный на переносимом подмножестве C++. Xerces-C++ позволяет легко предоставить вашему приложению возможность чтения и записи XML-данных. Общая библиотека предназначена для анализа, создания, обработки и проверки XML - документов. Xerces-C++ соответствует рекомендациям XML 1.0 и соответствующим стандартам.

Анализатор используется для сохранения и восстановления параметров в FreeCAD. Для получения дополнительной информации см. Xerces-C++ homepage.

Eigen3

Версия: 3.0 или выше

Лицензия: Начиная с версии 3.1.1, она лицензируется в соответствии с Mozilla Public License 2.0. Более ранние версии были лицензированы в соответствии с GNU Lesser General Public License 3.

Eigen-это библиотека моделей C++ для линейной алгебры: матрицы, векторы, численные решатели и связанные с ними алгоритмы.

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

Eigen используется в FreeCAD для многих векторных операций в 3D-пространстве. Чтобы узнать больше, посетите Eigen homepage.

Zipios++

Версия: 0.1.5 или выше

Лицензия: GNU Lesser General Public License 2.1

Zipios++ - это библиотека C++ для чтения и записи файлов .zip. Доступ к отдельным записям обеспечивается с помощью стандартных потоков ввода-вывода C++. Простая виртуальная файловая система, доступная только для чтения, которая монтирует обычные каталоги и .zip файлы также предоставляются. Структура и общедоступный интерфейс Zipios++ в значительной степени основаны на пакете Java java.util.zip.

Собственный формат файла FreeCAD .FCstd на самом деле является .zip файл, в котором хранятся и сжимаются другие типы данных внутри него, такие как файлы BREP и XML. Поэтому Zipios++ используется для сохранения и открытия сжатых архивов, включая файлы FreeCAD.

Копия Zipios++ включена в исходный код FreeCAD, поэтому она компилируется вместе с ним. Если вы хотите использовать внешнюю библиотеку Zipios++, предоставляемую вашей операционной системой, вы можете установить -DFREECAD_USE_EXTERNAL_ZIPIOS=ON с помощью cmake.

Zipios++ использует библиотеку Zlib для выполнения фактической распаковки файлов.

Zlib

Версия: 1.0 или выше

Лицензия: zlib лицензия

Zlib разработан как бесплатная универсальная библиотека сжатия данных без потерь для использования на любом компьютерном оборудовании и операционной системе. Он реализует алгоритм сжатия DEFLATE , обычно используемый в .zip и .gzip файлы.

Копия этой библиотеки включена в исходный код FreeCAD, поэтому она компилируется вместе с ней.

libarea

Версия: 0.0.20140514-1 или выше

Лицензия: 3-пунктовая BSD лицензия

Libarea-это библиотека программного обеспечения для вычисления профилей и карманных операций, которые используются в программном обеспечении для автоматизированного производства (CAM). Он был создан Дэном Хиксом для его проекта HeeksCNC.

Копия библиотеки включена в исходный код верстака Path, поэтому она компилируется вместе с ним.

LibPack

LibPack - это удобный пакет с собранными вместе зависимостями сборки FreeCAD. Это необходимо только в том случае, если вы компилируете FreeCAD в Windows с Visual Studio 2015 и выше. Вы можете найти последнюю версию LibPack на releases page.

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

FreeCAD 12.1.2

Смотрите на форуме: Новые libpacks для Windows с Qt5.12, OCC7.3 и Python 3.6 от apeltauer

Он включает, среди прочего: Boost 1.67, Coin3D 4.0.0 a, Eigen3, Open CASCADE Technology 7.3.0, Python 3.6.8, PySide2, Qt 5.12.1, Salome SMESH, Shiboken2, vtk7, Xerces-C, Zipios++, zlib 1.2.11



Tool Page

Страница Инструментов

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

Platform independent tools

Qt-Toolkit

Платформо независимые инструменты

Qt-Toolkit

Инструментарий Qt настоящее произведение искуссва, платформа независомый инструмент для проектирования пользовательского интерфейса. Он содержится в LibPack FreeCAD, а также его можно скачать с Qt project.

Inkscape

InkScape

Отличная программа для работы с векторной графикой. Соответствует стандарту SVG и используется для создания Иконок и Изображений. Установить можно с сайта www.inkscape.org.

Doxygen

Doxygen

Отличный и стабильный инструмент для создания документации к исходному коду из .h и .cpp файлов.

Gimp

Gimp

Не могу много сказать о GNU программе управления изображениями (Gnu Image Manipulation Program). Кроме того что он может работать с .xpm файлами, являющихся очень удобным способом для обработки иконок в QT программах. XPM основывается на C-коде, который может быть скомпилирован в программе.

Получить GIMP можно здесь: www.gimp.org

Gitkraken

This is a proprietary git GUI that is very helpful to learn how git works if you're interested in wanting to contribute to FreeCAD. Relevant pages to research:

OBS Studio

Free and open source software for video recording and live streaming. More details on official website: obsproject.com

OpenCamLib

OpenCamLib (OCL) is an open source library aiming to provide computer aided manufacturing (CAM) algorithms. FreeCAD uses OCL in the experimental 3D surface path operations and other experimental features.

StarUML

StarUML

полнофункциональная Open Source UML программа. Она обладает множеством особенностей , главная из них, включенный механизм обратной разработки C++ исходного кода....

скачать можно здесь: staruml.sourceforge.net

Инструменты для Windows

Visual Studio Community

Visual Studio 8 Express

Хотя VC8 C++ для разработки не тог чтобы шаг вперед, поскольку VisualStudio 6 (ИМХО большой шаг назад), это бесплатная система разработки на Windows. Для родных Win32 приложений вам надо скачать PlatformSDK от M$.

Так как Express версию, найти трудно. Но вы можете попытаться поискать по этой ссылке

CamStudio

CamStudio

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

Смотри camstudio.org для подробностей.

Инструменты для Linux

В разработке



In FreeCAD version 0.20 the default location of the program's configuration, data and cache files was changed for Linux.
See Release notes 0.20 for more information. This page has not yet been updated accordingly.

Overview

Обзор

На этой странице показаны различные способы запуска FreeCAD и наиболее важные особенности конфигурации.

Запуск FreeCAD из командной строки

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

Using command line options without a command line shell

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

  • В Ubuntu Вы можете создать иконку на десктопе (это будет файл формата XDG с расширением .desktop) и редактировать её параметры. Добавьте опции командной строки, разделённые пробелами, после имени программы в поле "Command".
  • В Windows создайте ссылку и редактируйте её параметры. Добавьте разделённые пробелами опции командной строки в поле "Target".

Параметры командной строки

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

FreeCAD --help

Из появившегося ответа вы можете прочесть назначение параметров:

 Usage: FreeCAD [options] File1 File2 ...
 
 Allowed options:
 
 Generic options:
   -v [ --version ]          Prints version string
   -h [ --help ]             Prints help message
   -c [ --console ]          Starts in console mode
   --response-file arg       Can be specified with '@name', too
   --dump-config             Dumps configuration
   --get-config arg          Prints the value of the requested configuration key
 
 Configuration:
   -l [ --write-log ]        Writes a log file to:
                             /home/username/.FreeCAD/FreeCAD.log
   --log-file arg            Unlike --write-log this allows logging to an 
                             arbitrary file
   -u [ --user-cfg ] arg     User config file to load/save user settings
   -s [ --system-cfg ] arg   System config file to load/save system settings
   -t [ --run-test ] arg     Test case - or 0 for all
   -M [ --module-path ] arg  Additional module paths
   -P [ --python-path ] arg  Additional python paths
   --single-instance         Allow to run a single instance of the application

In the following table, selected options are described in more detail:

Long option Corresponding config var name Synopsis
--user-cfg <filename> UserParameter Filename or relative path that ends with a filename. Defaults to user.cfg.
--module-path <dir> Prepends to AdditionalModulePaths Directory that contains modules. This option can be given repeatedly to specify multiple directories.
--get-config <config-var-name> most Outputs the requested value in a popup dialog. Exits upon confirmation with OK. Cannot be used repeatedly. If an unknown/illegal variable name is used, the response is empty. The --console flag is not honored.

Options can written in two forms: --long-option arg and --long-option=arg.

Файлы конфигурации и ответов(response)

FreeCAD может считать некоторые параметры из конфигурационного файла. Этот файл должен находится в пути bin и должен называться FreeCAD.cfg. Помните, у параметров командной строки приоритет над конфигурационным файлом!

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

FreeCAD @ResponseFile.txt 

или:

FreeCAD --response-file=ResponseFile.txt

или:

FreeCAD --response-file ResponseFile.txt

Скрытые опции

Существует несколько параметров не видных пользователю. Эти параметры такие как X-Window параметры, анализируются оконной системой:

  • -display display, устанавливает значение X дисплея (по умолчанию это $DISPLAY).
  • -geometry geometry, устанавливает клиент геометрии первое окно что отображается.
  • -fn или -font font, определяет шрифт приложения. Шрифт должен быть указан используя X логическо описание шрифта.
  • -bg или -background color, устанавливает цвет фона по умолчанию и палитру приложения (рассчитываются темные и светлые оттенки).
  • -fg или -foreground color, устанавливает цвет по умолчанию переднего плана.
  • -btn или -button color, устанавливает цвет по умолчанию для кнопок.
  • -name name, устанавливает имя приложения.
  • -title title, устанавливает заголовок приложения.
  • -visual TrueColor, заставляет приложение использовать TrueColor визуальное отображение на 8-битном дисплее.
  • -ncols count, граничивает число цветов выделенных в цветовой куб на 8-битном дисплее, если приложение использует QApplication::ManyColor цветовую спецификацию. Если количество 216 то используется цветовой куб 6x6x6 (т.е. 6 уровней красного, 6 зеленого, и 6 синего); для остальных значений, используется куб пропорциональный 2x3x1.
  • -cmap, вызывает приложение для установки вашей карты цветов на 8-битном дисплее.

Запуск FreeCAD без Графического Интерфейса

FreeCAD обычно компилируется в два исполняемых файла: с графическим интерфейсом, FreeCAD, и только с командной строкой, FreeCADCmd. FreeCAD может запускаться в консольном режиме с помощью ключа "-c", для FreeCADCmd это поведение по умолчанию:

FreeCAD --console

в командной строке. В консольном режиме, не будет отображаться пользовательский интерфейс, а вам будет предоставлена строка интерпретатора python. С помощью командной строки python, вы обладаете той же функциональностью, что и интерпретатором python, запущенном внутри FreeCAD GUI, и обладаете доступом ко всем модулям и плагинам FreeCAD, исключая модуль FreeCADGui. Имейте в виду, что модули, зависящие от FreeCADGui, также могут быть недоступны.

To read more about console or headless mode, refer to Headless FreeCAD.

Пример выполнения файла

Конфигурация командной строки для выполнения файла
Выполнить файл Система Конфигурация командной строки
Module, cfg Windows "C:\Program Files\FreeCAD\bin\FreeCAD.exe" -M "C:\FreeCAD\Mod\Draft" -u "C:\FreeCAD\Config\user.cfg" -s "C:\FreeCAD\Config\system.cfg"
Linux todo
.FCMacro or .py Windows "C:\Program Files\FreeCAD\bin\FreeCAD.exe" "C:\Users\userName\AppData\Roaming\FreeCAD\Mod\WorkFeature\start_WF.FCMacro"
Linux todo
Как установить макрос для автоматического запуска при старте FreeCAD Windows / Linux / Mac Смотри как установить макрос для автоматического запуская во время старта FreeCAD, на странице Макрос при старте.

See Macro at Startup on how to set up a macro to automatically run at FreeCAD startup.

Переменные Среды Окружения

FreeCAD supports the following environment variables, which can be used to configure directories: introduced in version 0.19

Environment variable Corresponding config var name Synopsis
FREECAD_USER_HOME UserHomePath FreeCAD's "base" directory for keeping local user data.
FREECAD_USER_DATA UserAppData If not set, defaults to FREECAD_USER_HOME/.FreeCAD, but only if FREECAD_USER_HOME is set.
FREECAD_USER_TEMP AppTempPath If not set, defaults to FREECAD_USER_HOME/temp, but only if FREECAD_USER_HOME is set.

If the specified path does not exist, the setting is ignored!

The above environment variables are meant to be used to realize a portable FreeCAD environment. For an example how environment variables can be used from the command line on Linux refer to the notes for Linux users on the downloads page.

HOME

FreeCAD uses Qt, which does honor the HOME environmental variable. Thus, setting HOME can be used to specify the base directory of Qt-related configuration files (.config/FreeCAD/FreeCAD.conf).

FreeCad itself does not honor the HOME environmental variable (because it determines the user's home directory from a lower-level system API). Use FREECAD_USER_HOME for this pupose.

TMPDIR

The default temporary directory is /tmp/. The TMPDIR environmental variable can be used to override the default. (Editor: precedence?).

Libraries

Некоторые библиотеки нуждаются в вызове системных переменных. Иногда когда возникают проблемы с установкой FreeCAD , потому что некоторые переменные отсутствуют или установлены неправильно. Таким образом, некоторые важные переменные дублируются в Config и сохраняются в журнале(log file).

Python

  • PYTHONPATH
  • PYTHONHOME
  • TCL_LIBRARY
  • TCLLIBPATH

OpenCascade

  • CSF_MDTVFontDirectory
  • CSF_MDTVTexturesDirectory
  • CSF_UnitsDefinition
  • CSF_UnitsLexicon
  • CSF_StandardDefaults
  • CSF_PluginDefaults
  • CSF_LANGUAGE
  • CSF_SHMessage
  • CSF_XCAFDefaults
  • CSF_GraphicShr
  • CSF_IGESDefaults
  • CSF_STEPDefaults

Конфигурационные параметры

При каждом запуске FreeCAD проверяет своё окружение и параметры командной строки. Он выстраивает конфигурационный набор который хранит суть о процессе выполнения программы (runtime information). Эта информация позже используется для определения места где сохранены пользовательские данные или файлы логов. Это также важно для анализа после крушения программы. Поэтому она сохраняется в лог файле (журнале).

Пользовательская информация

Записи пользовательской конфигурации
Имя конф. переменной Краткий обзор Пример для M$ Пример для Posix (Linux)
UserAppData Путь где FreeCAD хранит пользовательские данные программы. C:\Documents and Settings\username\AppData\FreeCAD
Short path : %APPDATA%\FreeCAD
/home/username/.FreeCAD
Short path : ~/.FreeCAD
UserParameter Файл где FreeCAD хранит пользовательские данные программы. C:\Documents and Settings\username\AppData\FreeCAD\user.cfg
Short path : %APPDATA%\FreeCAD\user.cfg
/home/username/.FreeCAD/user.cfg
Short path : ~/.FreeCAD/user.cfg
SystemParameter Файл где FreeCAD хранит данные программы. C:\Documents and Settings\username\AppData\FreeCAD\system.cfg
Short path : %APPDATA%\FreeCAD\system.cfg
/home/username/.FreeCAD/system.cfg
Short path : ~/.FreeCAD/system.cfg
UserHomePath Домашняя папка текущего пользователя. C:\Documents and Settings\username
Short path : %USERPROFILE%
/home/username
Short path : ~

Note: For Linux distributions, an additional configuration file that relates to Qt may exist at path /home/username/.config/FreeCAD/FreeCAD.conf.

Аргументы командной строки

Записи пользовательской конфигурации
Имя конф. переменной Краткий обзор Пример
LoggingFile 1 если ведение журнала включено 1
LoggingFileName Имя файла куда помещен журнал C:\Documents and Settings\username\AppData\FreeCAD\FreeCAD.log
RunMode Это показывает, как будет работать основной цикл. "Script" означает что данный сценарий вызывается, а затем выходит. "Cmd" запускает командную строку интепритатора. "Internal" запускает внутренний сценарий. "Gui" входит в цикл Gui событий. "Module" загружается как python модуль. "Cmd"
FileName Значение зависит от RunMode
ScriptFileName Значение зависит от RunMode
Verbose Уровень детализации сообщений в FreeCAD "" or "strict"
OpenFileCount Содержит количество файлов, открытых через аргументы командной строки "12"
AdditionalModulePaths Содержит дополнительные Пути к модулям заданных в командной строке "extraModules/"

Связанные с системой

Записи пользовательской конфигурации
Имя конф. переменной Краткий обзор Пример для M$ Пример для Posix (Linux)
AppHomePath Путь куда установлен FreeCAD c:/Progam Files/FreeCAD_0.7 /user/local/FreeCAD_0.7
PythonSearchPath Содержит список путей для поиска модулей python. Начальная конфигурация может изменятся во время выполнения программы

Информация связанная со Сборкой

Приведенная ниже таблица показывает доступную информацию о версии сборки. Большая часть её взята из хранилища Subversion. Этот материал нужен, чтобы точно восстановить версию!

Записи пользовательской конфигурации
Имя конф. переменной Краткий обзор Пример
BuildVersionMajor Основной номер версии Сборки. Задан в src/Build/Version.h.in 0
BuildVersionMinor Малый номер версии Сборки. Задан в src/Build/Version.h.in 7
BuildRevision Номер ревизии исходных кодов в хранилище SVN в Build. Генерируется SVN 356
BuildRevisionRange Диапазон различных изменений 123-356
BuildRepositoryURL URL Хранилища https://free-cad.svn.sourceforge.net/svnroot/free-cad/trunk/src
BuildRevisionDate Дата упомянутой ревизии 2007/02/03 22:21:18
BuildScrClean Показывает, были ли исходные коды изменены после синхронизации Src modified
BuildScrMixed Src not mixed

Связанная с Брендированием

Это конфигурационные записи связанные с механизмом брендинга FreeCAD. Смотри Брендинг для более подробной информации.

Записи пользовательской конфигурации
Имя конф. переменной Краткий обзор Пример
ExeName Название собранного исполняемого файла. Может запускаться из FreeCAD если используются различные main.cpp. FreeCAD.exe
ExeVersion Переопределённая версия, показываемая во время запуска V0.7
AppIcon Иконка исполняемого файла, показывается в главном окне приложения. "FCIcon"
ConsoleBanner Баннер, выводимый в консольном режиме
SplashPicture Название изображения используемого в качестве заставки "FreeCADSplasher"
SplashAlignment Alignment of the Text in the Splash dialog "Bottom" or "Left"
SplashTextColor Выравнивание текста в окне заставки "#000000"
StartWorkbench Название верстака, автоматически открывающегося при запуске приложения "Part design"
HiddenDockWindow Список панелей (разделенный запятой), которые будут отключены "Property editor"

Querying the configuration

From FreeCAD's Python console

Entries of the configuration set can be queried with the config var name (see tables above) from the Python console. For example:

 >>> FreeCAD.ConfigGet("ExeVersion")
 '0.19'

If the name is not found, an empty string is returned.

Из командной строки

Use the --get-config <config-var-name> option to query a single name. Not all names are supported. For example:

 FreeCAD --get-config ExeVersion

Use the --dump-config option to get a list of names and their values. Not all names are supported.

Из консоли FreeCAD

Start FreeCAD in console mode with --console and query with Python code. For example:

 $ FreeCAD --console
 [FreeCAD Console mode <Use Ctrl-D (i.e. EOF) to exit.>]
 >>> FreeCAD.ConfigGet("ExeVersion")
 '0.19'
 >>> exit()

For Linux (bash shell) you can modify the following command line to suit your needs:

 $ FreeCAD --console <<EOF
 print( "FREECAD_USER_HOME: " + ( "not set" if ( os.environ.get('FREECAD_USER_HOME') is None ) else os.environ.get('FREECAD_USER_HOME') ) )
 print( "UserHomePath: " + FreeCAD.ConfigGet("UserHomePath") )
 exit()
 EOF

Starting FreeCAD from the desktop

Linux: Creating an additional start option

The following assumes that your desktop is configured such that you can launch FreeCAD from it. Depending on your Linux distribution and desktop environment, you may have to adapt the following steps:

  1. Copy the freedesktop entry file for FreeCAD from /usr/share/applications/freecad.desktop to ~/.local/share/applications.
  2. Change the name from freecad.desktop to something else (e.g. MyFreeCADConfig.desktop).
  3. Open the file with a text editor and change how FreeCAD is invoked by modifying the line starting with Exec.
  4. As a result, an additional entry in your start menu/application launcher is available. This way, you can have multiple FreeCAD entries with various launch options.

Starting FreeCAD from a portable USB medium

Windows

Put the FreeCAD executable, FreeCAD.exe, on the USB medium. Create a batch file, FreeCAD.bat, and put it into the same directory as FreeCAD.exe. Inside the batch file write:

set CURRENTDIR=%cd%
set FREECAD_USER_HOME=%CURRENTDIR%
start FreeCAD.exe -u FreeCAD/user.cfg -s FreeCAD/system.cfg --write-log

Or with FREECAD_USER_DATA (see):

set CURRENTDIR="%cd%"
set FREECAD_USER_DATA=%CURRENTDIR%/..
start FreeCAD.exe -u %FREECAD_USER_DATA%/user.cfg -s %FREECAD_USER_DATA%/system.cfg

With the batch in the root of the USB medium:

set CURRENTDIR=%cd%
set FREECAD_USER_DATA=%CURRENTDIR%FreeCAD\
start %cd%FreeCAD\bin\FreeCAD.exe -u %FREECAD_USER_DATA%user.cfg -s %FREECAD_USER_DATA%system.cfg

Now double-click the batch file to start FreeCAD. (see)


Build Support Tools/ru


Введение

Инструмент сборки FreeCAD или fcbt это python сценарий расположеный в

trunc/src/Tools/fcbt.py

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

Использование

В корректно установленом Python интепретаторе , может быть вызвана команда fcbt

python fbct.py

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

FreeCAD Build Tool
 Usage:
    fcbt <command name> [command parameter]
 possible commands are:
  - DistSrc         (DS)   Build a source Distr. of the current source tree
  - DistBin         (DB)   Build a binary Distr. of the current source tree
  - DistSetup       (DI)   Build a Setup Distr. of the current source tree
  - DistSetup       (DUI)  Build a User Setup Distr. of the current source tree
  - DistAll         (DA)   Run all three above modules
  - NextBuildNumber (NBN)  Increase the Build Number of this Version
  - CreateModule    (CM)   Insert a new FreeCAD Module (Workbench) in the module directory
 
 For help on the modules type:
   fcbt <command name> ?

В ответ на запрос, введите абревеатуру той команды которую вы хотите вызвать. Например введите "CM" для создания модуля.

DistSrc

Команда "DS" создать пакет исходников текущего дерева исходных текстов.

DistBin

Команда "DB" создать бинарный пакет текущего дерева исходных текстов.

DistSetup

Команда "DI" создать самораспаковывающийся пакет текущего дерева исходных текстов.

DistSetup

Команда "DUI" создает пакет с пользовательскими настроками текущего дерева исходных текстов.

DistAll

Команда "DA" выполняет последовательно "DS", "DB" и "DI" .

NextBuildNumber

"NBN" команда увеличивает номер сборки создает новую версию FreeCAD.

Создать Модуль

"CM" команда создает модуль приложение.



Вступление

В данном материале изложена информация о том, как создать новый верстак для FreeCAD и добавить его в интерфейс. Верстаки являются контейнерами для команд FreeCAD. Они могут быть написаны на Python или на C++ или в сочетании того и другого, что имеет преимущество в сочетании скорости C++ и гибкости Python. Однако во всех случаях ваш верстак будет запущен через два специальных Python файла. Это касается, как "внутренних" верстаков, входящих в дистрибутив FreeCAD, так и "внешних", распространяемых через менеджер дополнений или устанавливаемыми вручную путем загрузки из какого-либо онлайн-репозитория. Внутренние верстаки могут быть написаны либо на C++, либо на Python, либо на их комбинации, в то время как внешние верстаки могут быть написаны, только на Python.

Структура Верстака

You need a folder, with any name you like, placed in the user Mod directory, with an Init.py file, and, optionally an InitGui.py file. The Init file is executed when FreeCAD starts, and the InitGui.py file is executed immediately after, but only when FreeCAD starts in GUI mode. That's all it needs for FreeCAD to find your workbench at startup and add it to its interface.

The user Mod directory is a sub-directory of the user application data directory (you can find the latter by typing App.getUserAppDataDir() in the Python console):

  • On Linux it is usually /home/<username>/.local/share/FreeCAD/Mod/ (version 0.20 and above) or /home/<username>/.FreeCAD/Mod/ (version 0.19 and below).
  • On Windows it is %APPDATA%\FreeCAD\Mod\, which is usually C:\Users\<username>\Appdata\Roaming\FreeCAD\Mod\.
  • On macOS it is usually /Users/<username>/Library/Application Support/FreeCAD/Mod/.

Mod папка должна выглядеть так:

/Mod/
 +-- MyWorkbench/
     +-- Init.py
     +-- InitGui.py

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

  • В файл Init.py вы прописываете некоторые вещи, который используются даже тогда, когда FreeCAD работает в консольном режиме, например такие как: импортеры и экспортеры файлов.
  • В файле InitGui.py вы инициализируете Верстак, который содержит имя, значок и ряд команд FreeCAD (см. Ниже). Этот python файл также должен иметь определенные функции: первая выполняется при загрузке FreeCAD (стараетесь сделать ее как можно меньше, чтобы не замедлять запуск FreeCAD), еще одну, которая выполняется при активации верстака (именно там выполняется большая часть работы), и третью, когда верстак деактивирован (чтобы при необходимости можно было освободить ненужные ресурсы).

The structure and file content for a workbench described here is the classic way of creating a new workbench. One can use a slight variation in the structure of files when making a new Python workbench, that alternative way is best described as a "namespaced workbench", opening up the possibility to use pip to install the workbench. Both structures work, so it is more a question of preference when creating a new workbench. The style and structure for workbenches presented here are available in the global namespace of FreeCAD, whereas for the alternative style and structure the workbench resides in a dedicated namespace. For further readings on the topic see Related.

Структура верстака на языке C++

Если вы собираетесь создать Верстак на python, вам не нужно проявлять особую осторожность, и вы можете просто разместить другие файлы python в папке с Init.py и InitGui.py. Однако при работе с C++ вам следует проявлять большую осторожность и начинать соблюдать одно фундаментальное правило FreeCAD: Разделение вашего рабочего стола между частью приложения (которая может работать в режиме консоли, без какого-либо элемента графического интерфейса) и частью графического интерфейса, которая будет загружена только при запуске FreeCAD с полной графической средой. Поэтому при создании верстака на C++ вы, скорее всего, будете использовать два модуля: модуль самого приложения и модуль графического интерфейса. Эти два модуля, конечно, должны быть вызываемы из python. Любой модуль FreeCAD (приложение или графический интерфейс) состоит, по крайней мере, из файла инициализации модуля. Это типичный AppMyModuleGui.cpp файл:

extern "C" {
    void MyModuleGuiExport initMyModuleGui()  
    {
         if (!Gui::Application::Instance) {
            PyErr_SetString(PyExc_ImportError, "Cannot load Gui module in console application.");
            return;
        }
        try {
            // import other modules this one depends on
            Base::Interpreter().runString("import PartGui");
            // run some python code in the console
            Base::Interpreter().runString("print('welcome to my module!')");
        }
        catch(const Base::Exception& e) {
            PyErr_SetString(PyExc_ImportError, e.what());
            return;
        }
        (void) Py_InitModule("MyModuleGui", MyModuleGui_Import_methods);   /* mod name, table ptr */
        Base::Console().Log("Loading GUI of MyModule... done\n");
    
        // initializes the FreeCAD commands (in another cpp file)
        CreateMyModuleCommands();
    
        // initializes workbench and object definitions
        MyModuleGui::Workbench::init();
        MyModuleGui::ViewProviderSomeCustomObject::init();
    
         // add resources and reloads the translators
        loadMyModuleResource();
    }
}

Файл Init.py

"""FreeCAD init script of XXX module"""

# ***************************************************************************
# *   Copyright (c) 2015 John Doe john@doe.com                              *   
# *                                                                         *
# *   This file is part of the FreeCAD CAx development system.              *
# *                                                                         *
# *   This program is free software; you can redistribute it and/or modify  *
# *   it under the terms of the GNU Lesser General Public License (LGPL)    *
# *   as published by the Free Software Foundation; either version 2 of     *
# *   the License, or (at your option) any later version.                   *
# *   for detail see the LICENCE text file.                                 *
# *                                                                         *
# *   FreeCAD is distributed in the hope that it will be useful,            *
# *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
# *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
# *   GNU Lesser General Public License for more details.                   *
# *                                                                         *
# *   You should have received a copy of the GNU Library General Public     *
# *   License along with FreeCAD; if not, write to the Free Software        *
# *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  *
# *   USA                                                                   *
# *                                                                         *
# ***************************************************************************/

FreeCAD.addImportType("My own format (*.own)", "importOwn")
FreeCAD.addExportType("My own format (*.own)", "exportOwn")
print("I am executing some stuff here when FreeCAD starts!")

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

The FreeCAD.addImportType() and addEXportType() functions allow you to give the name and extension of a file type, and a Python module responsible for its import. In the example above, an importOwn.py module will handle .own files. See Code snippets for more examples.

Python верстаки

InitGui.py файл:

class MyWorkbench (Workbench):

    MenuText = "My Workbench"
    ToolTip = "A description of my workbench"
    Icon = """paste here the contents of a 16x16 xpm icon"""

    def Initialize(self):
        """This function is executed when the workbench is first activated.
        It is executed once in a FreeCAD session followed by the Activated function.
        """
        import MyModuleA, MyModuleB # import here all the needed files that create your FreeCAD commands
        self.list = ["MyCommand1", "MyCommand2"] # a list of command names created in the line above
        self.appendToolbar("My Commands", self.list) # creates a new toolbar with your commands
        self.appendMenu("My New Menu", self.list) # creates a new menu
        self.appendMenu(["An existing Menu", "My submenu"], self.list) # appends a submenu to an existing menu

    def Activated(self):
        """This function is executed whenever the workbench is activated"""
        return

    def Deactivated(self):
        """This function is executed whenever the workbench is deactivated"""
        return

    def ContextMenu(self, recipient):
        """This function is executed whenever the user right-clicks on screen"""
        # "recipient" will be either "view" or "tree"
        self.appendContextMenu("My commands", self.list) # add commands to the context menu

    def GetClassName(self): 
        # This function is mandatory if this is a full Python workbench
        # This is not a template, the returned string should be exactly "Gui::PythonWorkbench"
        return "Gui::PythonWorkbench"
       
Gui.addWorkbench(MyWorkbench())

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

Раздел настроек верстака

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

Добавление значка для вашего верстака:

  • значок настроек должен иметь название "preferences-" + "modulename" + ".svg" (все в нижнем регистре)
  • создайте файл qrc, содержащий все названия значков
  • в главном каталоге *.py запустите pyside-rcc -o myResources.py myqrc.qrc
  • в InitGui.py, добавьте импорт MyResource(.py)
  • обновите свой репозиторий (git) с помощью myResources.py и myqrc.qrc

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

@kbwbe has created a nice script to compile resources for the A2Plus workbench. See below.

Adding your preference page(s):

  • You need to compile the Qt designer plugin that allows you to add preference settings with Qt Designer
  • Create a blank widget in Qt Designer (no buttons or anything)
  • Design your preference page, any setting that must be saved (preferences) must be one of the Gui::Pref* widgets that were added by the plugin)
  • In any of those, make sure you fill the PrefName (the name of your preference value) and PrefPath (ex: Mod/MyWorkbenchName), which will save your value under BaseApp/Preferences/Mod/MyWorkbenchName
  • Save the ui file in your workbench, make sure it's handled by cmake
  • In your workbench, for ex. inside the InitGui file, inside the Initialize method (but any other place works too), add: FreeCADGui.addPreferencePage("/path/to/myUiFile.ui","MyGroup"), "MyGroup" being one of the preferences groups on the left. FreeCAD will automatically look for a "preferences-mygroup.svg" file in its known locations (which you can extend with FreeCADGui.addIconPath())
  • Make sure the addPreferencePage() method is called only once, otherwise your pref page will be added several times

Публикация и распространение

To distribute your Python workbench, you may either simply host the files in some location and instruct your users to download them and place them in their Mod directory manually, or you may host them in an online git repository (GitHub, GitLab, Framagit, and Debian Salsa are currently supported locations) and configure them for the Addon Manager to install. Instructions for inclusion on FreeCAD's official Addons list can be found on the FreeCAD Addons GitHub repository. To use the Addon Manager, a package.xml metadata file should be included, which instructs the Addon Manager how to find your workbench's icon, and allows display of a description, version number, etc. It can also be used to specify other workbenches or Python packages that your Workbench either depends on, is blocked by, or is intended to replace.

For a quick guide on how to create a basic package.xml file and add a workbench to the Addon Manager see: Add Workbench to Addon Manager.

Optionally, you can include a separate metadata file describing your Python dependencies. This may be either a file called metadata.txt describing your workbench's external dependencies (on either other Addons, Workbenches, or Python modules), or a requirements.txt describing your Python dependencies. Note that if using a requirements.txt file, only the names of the specified packages are used for dependency resolution: pip command options, include options and version information are not supported by the Addon Manager. Users may manually run the requirements file using pip if those features are required.

Формат metadata.txt файла представляет собой обычный текст с тремя опциональными строками:

workbenches=
pylibs=
optionalpylibs=

Each line should consist of a comma-separated list of items your Workbench depends on. Workbenches may be either an internal FreeCAD Workbench, e.g. "FEM", or an external Addon, for example "Curves". The required and optional Python libraries should be specified with their canonical Python names, such as you would use with pip install. For example:

workbenches=FEM,Curves
pylibs=ezdxf
optionalpylibs=metadata,git

You may also include a script that is run when your package is uninstalled. This is a file called "uninstall.py" located at the top level of your Addon. It is executed when a user uninstalls your Addon using the Addon Manager. Use it to clean up anything your Addon may have done to the users system that should not persist when the Addon is gone (e.g. removing cache files, etc.).

To ensure that your addon is being read correctly by the Addon Manager, you can enable a "developer mode" in which the Addon Manager examines all available addons and ensures their metadata contains the required elements. To enable this mode select: Edit → Preferences... → Addon Manager → Addon manager options → Addon developer mode, see Preferences Editor.

C++ верстаки

If you are going to code your workbench in C++, you will probably want to code the workbench definition itself in C++ too (although it is not necessary: you could also code only the tools in C++, and leave the workbench definition in Python). In that case, the InitGui.py file becomes very simple: It might contain just one line:

import MyModuleGui

where MyModule is your complete C++ workbench, including the commands and workbench definition.

Coding C++ workbenches works in a pretty similar way. This is a typical Workbench.cpp file to include in the Gui part of your module:

namespace MyModuleGui {
    class MyModuleGuiExport Workbench : public Gui::StdWorkbench
    {
        TYPESYSTEM_HEADER();

    public:
        Workbench();
        virtual ~Workbench();

        virtual void activated();
        virtual void deactivated();

    protected:
        Gui::ToolBarItem* setupToolBars() const;
        Gui::MenuItem*    setupMenuBar() const;
    };
}

Раздел настроек верстака

Вы также можете добавить страницу настроек для верстаков C++. Шаги аналогичны тем, что выполняются в Python.

Публикация и распространение

There are two options to distribute a C++ workbench, you can either host precompiled versions for the different operating systems yourself, or you can request for your code to be merged into the FreeCAD source code. As mentioned above this requires a LGPL2+ license, and you must first present your workbench to the community in the FreeCAD forum for review.

команды FreeCAD

FreeCAD commands are the basic building block of the FreeCAD interface. They can appear as a button on toolbars, and as a menu entry in menus. But it is the same command. A command is a simple Python class, that must contain a couple of predefined attributes and functions, that define the name of the command, its icon, and what to do when the command is activated.

Определение команд в Python

class My_Command_Class():
    """My new command"""

    def GetResources(self):
        return {"Pixmap"  : "My_Command_Icon", # the name of a svg file available in the resources
                "Accel"   : "Shift+S", # a default shortcut (optional)
                "MenuText": "My New Command",
                "ToolTip" : "What my new command does"}

    def Activated(self):
        """Do something here"""
        return

    def IsActive(self):
        """Here you can define if the command must be active or not (greyed) if certain conditions
        are met or not. This function is optional."""
        return True

FreeCADGui.addCommand("My_Command", My_Command_Class())

Определение команд в С++

Similarly, you can code your commands in C++, typically in a Commands.cpp file in your Gui module. This is a typical Commands.cpp file:

DEF_STD_CMD_A(CmdMyCommand);

CmdMyCommand::CmdMyCommand()
  :Command("My_Command")
{
  sAppModule    = "MyModule";
  sGroup        = QT_TR_NOOP("MyModule");
  sMenuText     = QT_TR_NOOP("Runs my command...");
  sToolTipText  = QT_TR_NOOP("Describes what my command does");
  sWhatsThis    = QT_TR_NOOP("Describes what my command does");
  sStatusTip    = QT_TR_NOOP("Describes what my command does");
  sPixmap       = "some_svg_icon_from_my_resource";
}

void CmdMyCommand::activated(int iMsg)
{
    openCommand("My Command");
    doCommand(Doc,"print('Hello, world!')");
    commitCommand();
    updateActive();
}

bool CmdMyCommand::isActive(void)
{
  if( getActiveGuiDocument() )
    return true;
  else
    return false;
}

void CreateMyModuleCommands(void)
{
    Gui::CommandManager &rcCmdMgr = Gui::Application::Instance->commandManager();
    rcCmdMgr.addCommand(new CmdMyCommand());
}

"Компиляция" файлов ресурсов

compileA2pResources.py из верстака A2Plus:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
#***************************************************************************
#*                                                                         *
#*   Copyright (c) 2019 kbwbe                                              *
#*                                                                         *
#*   Portions of code based on hamish's assembly 2                         *
#*                                                                         *
#*   This program is free software; you can redistribute it and/or modify  *
#*   it under the terms of the GNU Lesser General Public License (LGPL)    *
#*   as published by the Free Software Foundation; either version 2 of     *
#*   the License, or (at your option) any later version.                   *
#*   for detail see the LICENCE text file.                                 *
#*                                                                         *
#*   This program is distributed in the hope that it will be useful,       *
#*   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
#*   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
#*   GNU Library General Public License for more details.                  *
#*                                                                         *
#*   You should have received a copy of the GNU Library General Public     *
#*   License along with this program; if not, write to the Free Software   *
#*   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  *
#*   USA                                                                   *
#*                                                                         *
#***************************************************************************

# This script compiles the A2plus icons for py2 and py3
# For Linux only
# Start this file in A2plus main directory
# Make sure pyside-rcc is installed

import os, glob

qrc_filename = 'temp.qrc'
if os.path.exists(qrc_filename):
    os.remove(qrc_filename)

qrc = '''<RCC>
\t<qresource prefix="/">'''
for fn in glob.glob('./icons/*.svg'):
    qrc = qrc + '\n\t\t<file>%s</file>' % fn
qrc = qrc + '''\n\t</qresource>
</RCC>'''

print(qrc)

f = open(qrc_filename,'w')
f.write(qrc)
f.close()

os.system(
    'pyside-rcc -o a2p_Resources2.py {}'.format(qrc_filename))
os.system(
    'pyside-rcc -py3 -o a2p_Resources3.py {}'.format(qrc_filename))

os.remove(qrc_filename)

Сопутствующая информация



Певые испытания

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

Командная Строка

Отладка FreeCAD поддерживает несколько внутренних механизмов. Версия FreeCAD без графического режима предоставляет варианты поддержки отладки:

-v
С "v" опцией FreeCAD дает более подробный вывод
-l
С "l" опцией FreeCAD записывает дополнительную информацию в лог-файл.

These are the currently recognized options in FreeCAD 0.19:

Generic options:

 -v [ --version ]          Prints version string
 -h [ --help ]             Prints help message
 -c [ --console ]          Starts in console mode
 --response-file arg       Can be specified with '@name', too
 --dump-config             Dumps configuration
 --get-config arg          Prints the value of the requested configuration key

Configuration:

 -l [ --write-log ]        Writes a log file to:
                           $HOME/.local/share/FreeCAD/FreeCAD.log (Linux)
                           $HOME/Library/Application\ Support/FreeCAD/FreeCAD.log (macOS)
                           %APPDATA%\FreeCAD\FreeCAD.log (Windows)
 --log-file arg            Unlike to --write-log this allows to log to an 
                           arbitrary file
 -u [ --user-cfg ] arg     User config file to load/save user settings
 -s [ --system-cfg ] arg   System config file to load/save system settings
 -t [ --run-test ] arg     Test case - or 0 for all
 -M [ --module-path ] arg  Additional module paths
 -P [ --python-path ] arg  Additional Python paths
 --single-instance         Allow to run a single instance of the application

Generating a Backtrace

If you are running a version of FreeCAD from the bleeding edge of the development curve, it may "crash". You can help solve such problems by providing the developers with a "backtrace". To do this, you need to be running a "debug build" of the software. "Debug build" is a parameter that is set at compile time, so you'll either need to compile FreeCAD yourself, or obtain a pre-compiled "debug" version.

Для Linux

Linux Отладка →

Необходимые условия:

  • установлен программный пакет gdb
  • отладочная сборка FreeCAD (в настоящее время доступна только сборка из исходного кода)
  • модель FreeCAD, которая вызывает сбой

Steps: Enter the following in your terminal window:

Find FreeCAD binary on your system:

$ whereis freecad
freecad: /usr/local/freecad <--- for example

$ cd /usr/local/freecad/bin
$ gdb FreeCAD

GNUdebugger will output some initializing information. The (gdb) shows GNUDebugger is running in the terminal, now input:

(gdb) handle SIG33 noprint nostop
(gdb) run

FreeCAD will now start up. Perform the steps that cause FreeCAD to crash or freeze, then enter in the terminal window:

(gdb) bt

This will generate a lengthy listing of exactly what the program was doing when it crashed or froze. Include this with your problem report.

(gdb) bt full

Print the values of the local variables also. This can be combined with a number to limit the number of frames shown.

Для MacOS

macOS Debugging →

Prerequisites:

  • software package lldb installed
  • a debug build of FreeCAD
  • a FreeCAD model that causes a crash

Steps: Enter the following in your terminal window:

$ cd FreeCAD/bin
$ lldb FreeCAD

LLDB will output some initializing information. The (lldb) shows the debugger is running in the terminal, now input:

(lldb) run

FreeCAD will now start up. Perform the steps that cause FreeCAD to crash or freeze, then enter in the terminal window:

(lldb) bt

This will generate a lengthy listing of exactly what the program was doing when it crashed or froze. Include this with your problem report.

List Libraries Loaded by FreeCAD

(Applicable to Linux and macOS)

Sometimes it's helpful to understand what libraries FreeCAD is loading, specifically if there are multiple libraries being loaded of the same name but different versions (version collision). In order to see which libraries are loaded by FreeCAD when it crashes you should open a terminal and run it in the debugger. In a second terminal window, find out the process id of FreeCAD:

ps -A | grep FreeCAD

Use the returned id and pass it to lsof:

lsof -p process_id

This prints a long list of loaded resources. So for example, if trying to ascertain if more than one Coin3d library versions is loaded, scroll through the list or search directly for Coin in the output:

lsof -p process_id | grep Coin

Python Debugging

For a more modern approach to debugging Python, see these posts:

winpdb

winpdb Debugging →

Here is an example of using Winpdb inside FreeCAD:

We need the Python debugger: Winpdb. If you do not have it installed, on Ubuntu/Debian install it with:

sudo apt-get install winpdb

Now lets setup the debugger.

  1. Start Winpdb.
  2. Set the debugger password to "test": Go to menu FilePassword" and set the password.

Now we will run a test Python script in FreeCAD step by step.

  1. Run winpdb and set the password (e.g. test)
  2. Create a Python file with this content
import rpdb2
rpdb2.start_embedded_debugger("test")
import FreeCAD
import Part
import Draft
print "hello"
print "hello"
import Draft
points=[FreeCAD.Vector(-3.0,-1.0,0.0),FreeCAD.Vector(-2.0,0.0,0.0)]
Draft.makeWire(points,closed=False,face=False,support=None)
  1. Start FreeCAD and load the above file into FreeCAD
  2. Press F6 to execute it
  3. Now FreeCAD will become unresponsive because the Python debugger is waiting
  4. Switch to the Windpdb GUI and click on "Attach". After a few seconds an item "<Input>" appears where you have to double-click
  5. Now the currently executed script appears in Winpdb.
  6. Set a break at the last line and press F5
  7. Now press F7 to step into the Python code of Draft.makeWire

Visual Studio Code (VS Code)

VS Code Debugging →

Prerequisites:

  • The ptvsd package needs to be installed in a Python 3 outside of FreeCAD, then the module must be copied to FreeCAD's Python library folder.
# In a cmd window that has a path to you local Python 3:
pip install ptvsd
# Then if your Python is installed in C:\Users\<userid>\AppData\Local\Programs\Python\Python37
# and your FreeCAD is installed in C:\freecad\bin
xcopy "C:\Users\<userid>\AppData\Local\Programs\Python\Python37\Lib\site-packages\ptvsd" "C:\freecad\bin\Lib\site-packages\ptvsd"

pypi page

Visual Studio Code documentation for remote debugging

Steps:

  • Add following code at the beginning of your script
import ptvsd
print("Waiting for debugger attach")
# 5678 is the default attach port in the VS Code debug configurations
ptvsd.enable_attach(address=('localhost', 5678), redirect_output=True)
ptvsd.wait_for_attach()
  • Add a debug configuration in Visual Studio Code Debug → Add Configurations….
  • The config should look like this:
    "configurations": [
        {
            "name": "Python: Attacher",
            "type": "python",
            "request": "attach",
            "port": 5678,
            "host": "localhost",
            "pathMappings": [
                {
                    "localRoot": "${workspaceFolder}",
                    "remoteRoot": "."
                }
            ]
        },
  • In VS Code add a breakpoint anywhere you want.
  • Launch the script in FreeCAD. FreeCAD freeze waiting for attachment.
  • In VS Code start debugging using created configuration. You should see variables in debugger area.
  • When setting breakpoints, VS Code will complain about not finding the .py file opened in the VS Code editor.
    • Change "remoteRoot": "." to "remoteRoot": "<directory of file>"
      • For example, if the Python file resides in /home/FC_myscripts/myscript.py
      • Change to: "remoteRoot": "/home/FC_myscripts"
    • If you're just debugging FreeCAD macros from the FreeCAD macro folder, and that folder is "C:/Users/<userid>/AppData/Roaming/FreeCAD/Macro", then use:
      • "localRoot": "C:/Users/<userid>/AppData/Roaming/FreeCAD/Macro",
      • "remoteRoot": "C:/Users/<userid>/AppData/Roaming/FreeCAD/Macro"
  • If your macro can't find ptvsd despite having installed it somewhere precede 'import ptvsd' with
from sys import path
sys.path.append('/path/to/site-packages')

Where the path is to the directory where ptvsd was installed.

  • On the left bottom edge of VSCode you can choose the Python executable - it's best to make this the version packaged with FreeCAD.

In the Mac package it is /Applications/FreeCAD.App/Contents/Resources/bin/python.

You can locate it on your system by typing

import sys
print(sys.executable)

into FreeCAD's Python console.

With LiClipse and AppImage

LiClipse Debugging →

  • Extract AppImage.
> ./your location/FreeCAD_xxx.AppImage --appimage-extract
> cd squashfs-root/
  • The sqashfs-root location is where the debugger later on is hooked up to.
  • Make sure you can start a FreeCAD session from within the squashfs-root location.
squashfs-root> ./usr/bin/freecadcmd
  • Should start up a FreeCAD commandline session.
  • Install LiClipse.
    • Comes ready with pydev and has installers for all platforms.
    • For linux it is just to extract (to any location) and run.
  • Configure liclipse for debugging.
    • Right-click pydev icon (upper right corner) and choose customize.
      • Activate "PyDev Debug" (through checkbox, or it might be needed to go to tab "Action Set Availability" and activate there first).
      • In the pydev menu you can now choose "start debug server".
    • Use menu window/open perspective/other > debug.
      • Right-click debug icon (upper right corner) and choose customize.
      • Checking "Debug" brings the debugging navigation tools to the toolbar.
    • Open preferences through menu window/preferences.
      • In PyDev/Interpreters add "new Interpreter by browsing".
      • The added interpreter should be: your loc/squashfs-root/usr/bin/python.
      • If you are only using this for fc, you can add AddOn workbench folders as well, or do that in a pydev-project later on.
  • Find path to pydevd.py in your liclipse installation.
    • Something along the lines of: your location/liclipse/plugins/org.python.pydev.xx/pysrc.
  • Create a regular pydev-project in liclipse.
    • Import external sources, for example a macro that you want to debug, or an external workbench.
    • In that macro (or workbench .py file) add the code lines:
import sys; sys.path.append("path ending with /pysrc")
import pydevd; pydevd.settrace()
  • This is where the execution will halt when the macro is run.
  • Start the liclipse debug server (menu pydev).
  • Start FreeCAD.
squashfs-root> ./usr/bin/freecad
  • Run the macro (or any other file with a pydevd.settrace() trigger) from within freecad, as you would normally do.
  • Happy debugging.
  • The use of LiClipse for remote debugging, and the steps described here related to liclipse, should work on any platform. The parts related to AppImage is for linux only.

Pyzo

See the main article about Pyzo.

Отладка OpenCasCade

For developers needing to dig deeper in to the OpenCasCade kernel, user @abdullah has created a thread orientation discussing how to do so.



Логотип верстака Test Framework

Введение

Верстак Test Framework на самом деле не является верстаком для моделирования, но он содержит набор скриптов Python для выполнения различных тестов на основных компонентах FreeCAD с целью отладки проблем. Смотри также Отладку.

Вы можете запустить тесты из командной строки, используя параметры -t или --run-test.

Запустите все тесты:

freecad --run-test 0

Запустите только один из указанных тестов модулей, например:

freecad -t TestDraft

If a test does not need the GUI, it can also be executed in console mode by setting the -c or --console option in addition. This usually results in much faster startup time as the GUI is not loaded. For example:

freecad -c -t TestPartDesignApp

Меню тестирования

Each top level directory in FreeCAD should have a file with the tests that can be run for that particular workbench or module. The file usually starts with the word Test.

To run a test from within FreeCAD, switch to the Test Workbench, then Test commands → TestToolsGui → Self test → Select test name, then enter the name of the Python file with the tests; for example, for the Draft Workbench, this would be TestDraft, then press Start.

Функции тестирования

Это список тестовых приложений по состоянию: версия 0.15 git 4207:

TestAPP.All

Add test function

BaseTests

Add test function

UnitTests

Add test function

Document

Add test function

UnicodeTests

Add test function

MeshTestsApp

Add test function

TestDraft

Add test function

TestSketcherApp

Add test function

TestPartApp

Add test function

TestPartDesignApp

Add test function

TestPathApp

Path workbench test cases:

  • depthTestCases:
  • PathTestUtils:
  • TestDressupDogbone: Test functionality of Dogbone dressup.
  • TestHoldingTags: Test functionality of Holding Tags dressup.
  • TestPathAdaptive: Test selection capability of Adaptive operation.
  • TestPathCore: Test core functionality of Path workbench.
  • TestPathDeburr: Test general functionality of Deburr operation.
  • TestPathGeom: Test various functions available in the PathGeom module.
  • TestPathHelix: Test general functionality of Helix operation.
  • TestPathLog: Test various functions available in the PathLog debugging and feedback module.
  • TestPathOpTools:
  • TestPathPreferences: Test various functions available in the PathPreferences module.
  • TestPathPropertyBag:
  • TestPathSetupSheet:
  • TestPathStock:
  • TestPathThreadMilling:
  • TestPathTool:
  • TestPathToolBit:
  • TestPathToolController:
  • TestPathTooltable:
  • TestPathUtil: Test various functions available in the PathUtil module.
  • TestPathVcarve: Test general functionality of Vcarve operation.
  • TestPathVoronoi:

Workbench

Add test function

Menu

Add test function

Menu.MenuDeleteCases

Add test function

Menu.MenuCreateCases

Add test function

Scripting

See also: FreeCAD Scripting Basics.

Get a list of all top-level test modules

FreeCAD.__unit_test__

Note that the test modules returned here depend on whether a GUI available or not. I.e. when executed in console mode, various tests ending in "Gui" are missing.

Run specific tests

There are various ways of running tests using Python's unittest library. FreeCAD's test framework removes some of the boiler plate for the most common cases.

Run all tests defined in a Python module:

import Test, TestFemApp
Test.runTestsFromModule(TestFemApp)

Run all tests defined in a Python class:

import Test, femtest.app.test_solver_calculix
Test.runTestsFromClass(femtest.app.test_solver_calculix.TestSolverCalculix)

Example 1

Within the Python Console of FreeCAD, the following code format may be used to run built-in tests. Replace the red "TestFem" text in the code below with the desired module test name.

  • For example, use "TestPathApp" to run all unit tests for the Path workbench unit test framework.
  • Submodules are available using dot notation, like "TestPathApp.TestPathAdaptive" to only run the Adaptive unit tests within the greater Path workbench test framework.
  • Multiple test modules or submodules may be combined by adding another `suite.addTest(...)` method call just like the one in the code below, but with a different module or submodule reference.
  • Output for the code below will be in the Report View panel within the FreeCAD GUI.
  • Code source is copied from post by FreeCAD forum user, sgrogan, in the unit tests per python topic, with credit there given to forum user, wmayer.
import unittest
suite = unittest.TestSuite()
suite.addTest(unittest.defaultTestLoader.loadTestsFromName("TestFem"))
r = unittest.TextTestRunner()
r.run(suite)

Additional Resources

Forum Topics



Overview

Обзор

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

Warning

Although FreeCAD is offered to you free of charge, and the FreeCAD community is happy to see other applications emerging, that are based on FreeCAD, we have on the other hand seen a lot of unfair use of the information contained on this page by people who simply rebranded FreeCAD into a closed-source application to make profit from it.

Although the LGPL license allows to use the FreeCAD source code in closed-source applications, it also gives strict rules to do so, and does not allow simply taking FreeCAD, renaming it and stripping it of its license.

Would you be interested in using FreeCAD in a closed-source application, be sure to check thoroughly the implications of the LGPL license, and, even better, contact any FreeCAD developer, administrator or moderator before doing so.

General

Главное

Большая часть брендинга делается в MainCmd.cpp или MainGui.cpp. Эти Проекты генерируют исполняемые файлы FreeCAD. Чтобы сделать ваш собственный Бренд просто скопируйте Main или MainGui проекты и дайте исполняемым файлам собственное имя, например FooApp.exe. Наиболее важные настройки для нового облика можно сделать в одном месте в функции main(). Вот участок кода, который управляет брендингом:

int main( int argc, char ** argv )
{
    // Name and Version of the Application
    App::Application::Config()["ExeName"] = "FooApp";
    App::Application::Config()["ExeVersion"] = "0.7";

    // set the banner (for loging and console)
    App::Application::Config()["CopyrightInfo"] = sBanner;
    App::Application::Config()["AppIcon"] = "FooAppIcon";
    App::Application::Config()["SplashScreen"] = "FooAppSplasher";
    App::Application::Config()["StartWorkbench"] = "Part design";
    App::Application::Config()["HiddenDockWindow"] = "Property editor";
    App::Application::Config()["SplashAlignment" ] = "Bottom|Left";
    App::Application::Config()["SplashTextColor" ] = "#000000"; // black

    // Inits the Application 
    App::Application::Config()["RunMode"] = "Gui";
    App::Application::init(argc,argv);

    Gui::BitmapFactory().addXPM("FooAppSplasher", ( const char** ) splash_screen);

    Gui::Application::initApplication();
    Gui::Application::runApplication();
    App::Application::destruct();

    return 0;
}

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

Следующие строки определяют Config записи вашего FooApp Приложения. Описание Config и его элементов вы можете найти в запуске и конфигурации.

Images

Image resources are compiled into FreeCAD using Qt's resource system. Therefore you have to write a .qrc file, an XML-based file format that lists image files on the disk but also any other kind of resource files. To load the compiled resources inside the application you have to add a line

Q_INIT_RESOURCE(FooApp);

into the main() function. Alternatively, if you have an image in XPM format you can directly include it into your main.cpp and add the following line to register it:

Gui::BitmapFactory().addXPM("FooAppSplasher", ( const char** ) splash_screen);

Branding XML

In FreeCAD there is also a method supported without writing a customized main() function. For this method you must write a file name called branding.xml and put it into the installation directory of FreeCAD. Here is an example with all supported tags:

<?xml version="1.0" encoding="utf-8"?>
<Branding>
    <Application>FooApp</Application>
    <WindowTitle>Foo App in title bar</WindowTitle>
    <BuildVersionMajor>1</BuildVersionMajor>
    <BuildVersionMinor>0</BuildVersionMinor>
    <BuildRevision>1234</BuildRevision>
    <BuildRevisionDate>2014/1/1</BuildRevisionDate>
    <CopyrightInfo>(c) My copyright</CopyrightInfo>
    <MaintainerUrl>Foo App URL</MaintainerUrl>
    <ProgramLogo>Path to logo (appears in bottom right corner)</ProgramLogo>
    <WindowIcon>Path to icon file</WindowIcon>
    <ProgramIcons>Path to program icons</ProgramIcons>
    <SplashScreen>splashscreen.png</SplashScreen>
    <SplashAlignment>Bottom|Left</SplashAlignment>
    <SplashTextColor>#ffffff</SplashTextColor>
    <SplashInfoColor>#c8c8c8</SplashInfoColor>
    <StartWorkbench>PartDesignWorkbench</StartWorkbench>
</Branding>

All listed tags are optional.



Обзор

Локализация в целом, это процесс создания многоязыкового пользовательского интерфейса для программного обеспечения. В FreeCAD вы можете установить язык пользовательского интерфейса в Правка → Настройки → Основные. FreeCAD использует Qt чтобы поддерживать несколько языков. По умолчанию в Unix/Linux системах, FreeCAD использует текущие языковые настройки вашей системы для выбора языка интерфейса FreeCAD.

Помощь с переводом FreeCAD

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

Перевод программного обеспечения FreeCAD

FreeCAD использует стороннюю систему коллективных онлайн-переводов, называемую Crowdin.

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

  • Отправляйтесь на страницу проекта перевода FreeCAD на Crowdin;
  • Войдите, создав новый профиль, или воспользовавшись сторонними аккаунтами (GitHub, GitLab, GMail итд...);
  • Щелкните иконку языка на котоый хотите перевести;
  • Начните переводить , щелкнув на Translate рядом с одним из файлов. Например, FreeCAD.ts содержит текстовые строки для главного окна FreeCAD.
  • Вы можете голосовать за существующие переводы, или вы можете создавать свой собственный.
Если вы активно принимаете участие в переводе FreeCAD и хотите быть в курсе когда будет готов к запуску следующий релиз, так чтобы было время рассмотреть ваш перевод, пожалуйста подпишитесь на одну из команд перевода FreeCAD в Crowdin.


Note: Details on how to use crowdin can be found on the Crowdin Administration page.

Перевод внешних верстаков

Подробности на странице перевод внешних верстаков.

FreeCAD Preferences for Translators

Starting with FreeCAD 0.20, the following variables can be manually added to the BaseApp/Preferences/General section of the user.cfg file to assist with the development of new translations:

AdditionalLanguageDomainEntries - to add entirely new languages to FreeCAD that are not currently supported by the source code, you can use this user preference to add to the list of available languages. The format of the languages is "Language Name"="code"; for example:

<FCText Name="AdditionalLanguageDomainEntries">"Esperanto"="eo";"French"="fr";</FCText>

AdditionalTranslationsDirectory - add an additional directory for FreeCAD to search for *.qm files. This location will take precedence over $userAppDataDir/translations and $resourceDir/translations. For example:

<FCText Name="AdditionalTranslationsDirectory">C:/Users/FreeCADUser/TestTranslations</FCText>

Перевод FreeCAD wiki

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

Примечание: чтобы иметь возможность перевести вики, вам нужно иметь права редактирования, насчёт их получения смотрите Как я могу полчить права для редактирования wiki?.

У Вас должны быть достаточные знания о языке форматировании вики, и следовать общими стилевым правилам, описанным на странице WikiPages

Расширение перевода Mediawiki

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

Инструмент описан в Help:Extension:Translate и является частью MediaWiki Language Extension Bundle.

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

<translate> ... </translate>

окружающих всю страницу, для активации системы перевода, и страница должна будет промаркирована для перевода.

Чтобы увидеть пример того, как работает инструмент перевода, один раз плагин перевод активируется на странице, вы можете посетить Стартовую страницу. Вы увидите новую языковую строку меню внизу. Она была сгенерирована автоматически. Нажмите, например, на немецкую ссылку, это преместит Вас на стартовую страницу на немецком языке. Прямо под названием, вы можете прочитать "Эта страница представляет собой 'переведенную версию' страницы Стартовая страница и перевод завершен на хх%." (Хх - это текущий фактический процент перевода). Нажмите на ссылку "translated version", чтобы начать перевод, либо обновить или исправить существующий перевод.

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

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

Если вы не уверены, что делать с переводом, не стесняйтесь обратится за помощью на Development → Wiki subforum или на особый языковой субфорум на форуме FreeCAD.

Важные замечания

Каждый пользователь вики, имеющий права "Редактора", может запустить утилиту для перевода, записывать, сохранять и просматривать переводы.

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

Боковая панель расположенная слева также подлежит переведу, но только Администраторы могут изменить этот эллемент сайта. Пожалуйста, следуйте инструкциям на странице Боковая панель Локализации.

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

Translate the FreeCAD documentation

As per general consensus, the reference page in the wiki is the English page, which should be created first. If you want to change or add content to a page, you should do it to the English page first, and only once the update is completed, port the modification to the translated page.

Старые инструкции по переводу

These instructions are for historical background only. Translations should use the new system with the #Mediawiki Translation Extension described above.

So the first step is to check if the manual translation has already been started for your language (look in the left sidebar, under "manual").
If not, head to the forum and say that you want to start a new translation, we'll create the basic setup for the language you want to work on.
You must then gain wiki edit permission.
If your language is already listed, see what pages are still missing a translation (they will be listed in red). The technique is simple: go into a red page, and copy/paste the contents of the corresponding English page, and start translating.
Do not forget to include all the tags and templates from the original English page. Some of those templates will have an equivalent in your language (for example, there is a French Docnav template called Docnav/fr). You should use a slash and your language code in almost all the links. Look at other already translated pages to see how they did it.
Add a slash and your language code in the categories, like [[Category:Developer Documentation/fr]]
And if you are unsure, head to the forums and ask people to check what you did and tell you if it's right or not.
Four templates are commonly used in manual pages. These 4 templates have localized versions (Template:Docnav/fr, Template:fr, etc...)

  • Template:GuiCommand : is the Gui Command information block in upper-right of command documentation.
  • Template:Docnav : it is the navigation bar at the bottom of the pages, showing previous and next pages.
  • Template:Userdocnavi : gives direct links to the main base pages

Page Naming Convention
Please take note that, due to limitations in the Sourceforge implementation of the MediaWiki engine, we require that your pages all keep their original English counterpart's name, appending a slash and your language code. For example, the translated page for About FreeCAD should be About Freecad/es for Spanish, About FreeCAD/pl for polish, etc. The reason is simple: so that if translators go away, the wiki's administrators, who do not speak all languages, will know what these pages are for. This will facilitate maintenance and avoid lost pages.
If you want the Docnav template to show linked pages in your language, you can use redirect pages. They are basically shortcut links to the actual page. Here is an example with the French page for About FreeCAD.

  • The page About FreeCAD/fr is the page with content
  • The page À propos de FreeCAD contains this code:
#REDIRECT [[About_FreeCAD/fr]]
  • In the About FreeCAD/fr page, the Docnav code will look like this:
{{docnav/fr|[[Online_Help_Startpage/fr|Bienvenue dans l'aide en ligne de FreeCAD]]|[[Feature_list/fr|Fonctionnalités]]}}

The page "Bienvenue dans l'aide en ligne de FreeCAD" redirects to Online_Help_Startpage/fr, and the page "Fonctionnalités" redirects to Feature_list/fr.

Перевод веб сайта FreeCAD

Translation of the FreeCAD website is now done through Crowdin. The file is named homepage.po.

Разработка - Как добавить локализацию

Этот раздел для разработчиков, которые хотят добавить окализацию в свой код.

Подготовка ваших FreeCAD/master модулей для перевода

These are the parts to the FreeCAD translation process:

  • extract text strings from source code into *.ts files
  • load *.ts files into FreeCAD Crowdin.
  • translation of strings within Crowdin
  • extract modified/new *.ts files from Crowdin
  • convert *.ts files into *.qm files and update each module's *.qrc file
  • update FreeCAD master

All of the above steps are performed by the "translation scripts" which are run by an administrator periodically.

Preparing your module for translation is quite easy. First, you need to ensure that you have a "translations" directory in myModule/Gui/Resources. Then open a terminal window (or Windows/OSX equivalent) in your "translations" directory and enter the following command:

lupdate -ts myModule.ts

This creates an empty translation file. Once this is done, you need to ensure that the translation scripts are updated as in this pull request.

Everything after this is automatic as far as a developer is concerned. The administrator will extract the text strings, the translators will translate them, then the administrator will extract the translations and update FreeCAD/master.

Подготовка вашего стороннего модуля или макроса для перевода

3rd party modules or macros are translated in much the same fashion, except that you must do some of the work yourself. This forum discussion describes the details.

Update: see Translating an external workbench

Older module translation techniques

Localization Older Methods describes the use of translation tools such as Qt Linguist, lupdate, lrelease, pylupdate4, etc in detail. Most of this is no longer required for FreeCAD/master modules, but may be helpful preparing and updating 3rd party modules.

Автоматическое обновление переводов Crowdin

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

Связанные страницы

Программирование

См. так же: Основы составления скриптов FreeCAD.

Чтобы получить список всех поддерживаемых языков интерфейса FreeCAD используйте supportedLocales метод FreeCADGui.

locales = FreeCADGui.supportedLocales()

После выполнения locales будет содержать в себе словарь с следующими значениями:

{'English': 'en', 'Afrikaans': 'af', 'Arabic': 'ar', 'Basque': 'eu', 'Catalan': 'ca', 'Chinese Simplified': 'zh-CN', 'Chinese Traditional': 'zh-TW', 'Croatian': 'hr', 'Czech': 'cs', 'Dutch': 'nl', 'Filipino': 'fil', 'Finnish': 'fi', 'French': 'fr', 'Galician': 'gl', 'German': 'de', 'Hungarian': 'hu', 'Indonesian': 'id', 'Italian': 'it', 'Japanese': 'ja', 'Kabyle': 'kab', 'Korean': 'ko', 'Lithuanian': 'lt', 'Norwegian': 'no', 'Polish': 'pl', 'Portuguese': 'pt-PT', 'Portuguese, Brazilian': 'pt-BR', 'Romanian': 'ro', 'Russian': 'ru', 'Slovak': 'sk', 'Slovenian': 'sl', 'Spanish': 'es-ES', 'Swedish': 'sv-SE', 'Turkish': 'tr', 'Ukrainian': 'uk', 'Valencian': 'val-ES', 'Vietnamese': 'vi'}

Чтобы определить текущий язык интерфейса FreeCAD, используйте getLocale метод FreeCADGui.

locale = FreeCADGui.getLocale()

Если текущий язык английский, тогда locale будет содержать:

'English'

Чтобы преобразовать данное значение в языковой код, используйте простой прием:

locale = FreeCADGui.supportedLocales()[Gui.getLocale()]

Если текущий язык английский результат будет равен:

'en'

Чтобы установить язык интерфейса FreeCAD, используйте setLocale метод FreeCADGui. Вы так же можете указать язык в виде языкового кода:

FreeCADGui.setLocale('Russian')
FreeCADGui.setLocale('ru')



Overview

This page lists several additional Python modules or other pieces of software that can be downloaded freely from the internet, and add functionality to your FreeCAD installation.

PySide (previously PyQt)

PySide (previously PyQt) is required by several modules of FreeCAD to access FreeCAD's Qt interface. It is already bundled in the windows verison of FreeCAD, and is usually installed automatically by FreeCAD on Linux, when installing from official repositories. If those modules (Draft, Arch, etc) are enabled after FreeCAD is installed, it means PySide (previously PyQt) is already there, and you don't need to do anything more.

Note: FreeCAD progressively moved away from PyQt after version 0.13, in favour of PySide, which does exactly the same job but has a license (LGPL) more compatible with FreeCAD.

Installation

Linux

The simplest way to install PySide is through your distribution's package manager. On Debian/Ubuntu systems, the package name is generally python-PySide, while on RPM-based systems it is named pyside. The necessary dependencies (Qt and SIP) will be taken care of automatically.

Windows

The program can be downloaded from http://qt-project.org/wiki/Category:LanguageBindings::PySide::Downloads . You'll need to install the Qt and SIP libraries before installing PySide (to be documented).

MacOS

PySide on Mac can be installed via homebrew or port. See Install dependencies for more information.

Usage

Once it is installed, you can check that everything is working by typing in FreeCAD Python console:

import PySide

To access the FreeCAD interface, type:

from PySide import QtCore,QtGui
FreeCADWindow = FreeCADGui.getMainWindow()

Now you can start to explore the interface with the dir() command. You can add new elements, like a custom widget, with commands like:

FreeCADWindow.addDockWidget(QtCore.Qt.RghtDockWidgetArea,my_custom_widget)

Working with Unicode:

text = text.encode('utf-8')

Working with QFileDialog and OpenFileName:

path = FreeCAD.ConfigGet("AppHomePath")
#path = FreeCAD.ConfigGet("UserAppData")
OpenName, Filter = PySide.QtGui.QFileDialog.getOpenFileName(None, "Read a txt file", path, "*.txt")

Working with QFileDialog and SaveFileName:

path = FreeCAD.ConfigGet("AppHomePath")
#path = FreeCAD.ConfigGet("UserAppData")
SaveName, Filter = PySide.QtGui.QFileDialog.getSaveFileName(None, "Save a file txt", path, "*.txt")

Example of transition from PyQt4 and PySide

PS: these examples of errors were found in the transition from PyQt4 to PySide and these corrections were made, other solutions are certainly available with the examples above

try:
    import PyQt4                                        # PyQt4
    from PyQt4 import QtGui ,QtCore                     # PyQt4
    from PyQt4.QtGui import QComboBox                   # PyQt4
    from PyQt4.QtGui import QMessageBox                 # PyQt4
    from PyQt4.QtGui import QTableWidget, QApplication  # PyQt4
    from PyQt4.QtGui import *                           # PyQt4
    from PyQt4.QtCore import *                          # PyQt4
except Exception:
    import PySide                                       # PySide
    from PySide import QtGui ,QtCore                    # PySide
    from PySide.QtGui import QComboBox                  # PySide
    from PySide.QtGui import QMessageBox                # PySide
    from PySide.QtGui import QTableWidget, QApplication # PySide
    from PySide.QtGui import *                          # PySide
    from PySide.QtCore import *                         # PySide

To access the FreeCAD interface, type: You can add new elements, like a custom widget, with commands like:

myNewFreeCADWidget = QtGui.QDockWidget()          # create a new dockwidget
myNewFreeCADWidget.ui = Ui_MainWindow()           # myWidget_Ui()             # load the Ui script
myNewFreeCADWidget.ui.setupUi(myNewFreeCADWidget) # setup the ui
try:
    app = QtGui.qApp                              # PyQt4 # the active qt window, = the freecad window since we are inside it
    FCmw = app.activeWindow()                     # PyQt4 # the active qt window, = the freecad window since we are inside it
    FCmw.addDockWidget(QtCore.Qt.RightDockWidgetArea,myNewFreeCADWidget) # add the widget to the main window
except Exception:
    FCmw = FreeCADGui.getMainWindow()             # PySide # the active qt window, = the freecad window since we are inside it
    FCmw.addDockWidget(QtCore.Qt.RightDockWidgetArea,myNewFreeCADWidget) # add the widget to the main window

Working with Unicode:

try:
    text = unicode(text, 'ISO-8859-1').encode('UTF-8')  # PyQt4
except Exception:
    text = text.encode('utf-8')                         # PySide

Working with QFileDialog and OpenFileName:

OpenName = ""
try:
    OpenName = QFileDialog.getOpenFileName(None,QString.fromLocal8Bit("Lire un fichier FCInfo ou txt"),path,"*.FCInfo *.txt") # PyQt4
except Exception:
    OpenName, Filter = PySide.QtGui.QFileDialog.getOpenFileName(None, "Lire un fichier FCInfo ou txt", path, "*.FCInfo *.txt")#PySide

Working with QFileDialog and SaveFileName:

SaveName = ""
try:
    SaveName = QFileDialog.getSaveFileName(None,QString.fromLocal8Bit("Sauver un fichier FCInfo"),path,"*.FCInfo") # PyQt4
except Exception:
    SaveName, Filter = PySide.QtGui.QFileDialog.getSaveFileName(None, "Sauver un fichier FCInfo", path, "*.FCInfo")# PySide

The MessageBox:

def errorDialog(msg):
    diag = QtGui.QMessageBox(QtGui.QMessageBox.Critical,u"Error Message",msg )
    try:
        diag.setWindowFlags(PyQt4.QtCore.Qt.WindowStaysOnTopHint) # PyQt4 # this function sets the window before
    except Exception:
        diag.setWindowFlags(PySide.QtCore.Qt.WindowStaysOnTopHint)# PySide # this function sets the window before
#    diag.setWindowModality(QtCore.Qt.ApplicationModal)       # function has been disabled to promote "WindowStaysOnTopHint"
    diag.exec_()

Working with setProperty (PyQt4) and setValue (PySide)

self.doubleSpinBox.setProperty("value", 10.0) # PyQt4

replace with:

self.doubleSpinBox.setValue(10.0) # PySide

Working with setToolTip

self.doubleSpinBox.setToolTip(_translate("MainWindow", "Coordinate placement Axis Y", None)) # PyQt4

replace with:

self.doubleSpinBox.setToolTip(_fromUtf8("Coordinate placement Axis Y")) # PySide

or:

self.doubleSpinBox.setToolTip(u"Coordinate placement Axis Y.")# PySide

Additional documentation

Pivy

Pivy is a needed by several modules to access the 3D view of FreeCAD. On windows, Pivy is already bundled inside the FreeCAD installer, and on Linux it is usually automatically installed when you install FreeCAD from an official repository. On macOS, unfortunately, you will need to compile pivy yourself.

Установка

Prerequisites

I believe before compiling Pivy you will want to have Coin and SoQt installed.

I found for building on Mac it was sufficient to install the Coin3 binary package. Attempting to install coin from MacPorts was problematic: tried to add a lot of X Windows packages and ultimately crashed with a script error.

For Fedora I found an RPM with Coin3.

SoQt compiled from source fine on Mac and Linux.

Debian & Ubuntu

Debian & Ubuntu

Начиная с Debian Squeeze и Ubuntu Lucid, pivy стал доступен напрямую через официальные репозитории, экономя ваше время. В то же время вы можете скачать один из пакетов что мы сделали (для debian и ubuntu karmic) доступных на странице Загрузок , или скомпилировать их самостоятельно.

Лучший способ скомпилировать pivy просто вытянуть debian пакет с исходными кодами для pivy и сделать пакет с помощью debuild. Это тот же исходный код что и на оффициальном сайте pivy , но люди debian исправили несколько ошибок. Он также хорошо компилируется в ubuntu karmic из: http://packages.debian.org/squeeze/python-pivy (скачайте .orig.gz и .diff.gz файл, распокуйте оба, добавте .diff к исходному коду: перейдите к каталогу с распакованными кодами pivy , и примените .diff патч:

patch -p1 < ../pivy_0.5.0~svn765-2.diff

затем

debuild

теперь у вас есть правильно собраный pivy в оффициально устанавливаемых пакетах. Теперь, просто установите пакет с помощью gdebi.

Other linux distributions

Другие linux дистрибутивы

Сперва получите код из официального репозитория проекта:

hg clone http://hg.sim.no/Pivy/default Pivy

As of March 2012, the latest version is Pivy-0.5.

Затем вам понадобится инструмент называемыйd SWIG для создания C++ кода для Python привязок. Рекомендуется использовать версию SWIG 1.3.25 , не последнюю версию, потому как на данный момент pivy корректно работает только с 1.3.25. Скачайте 1.3.25 tarball с исходными кодамииз http://www.swig.org. Распакуйте и в командной строке (под root-ом):

./configure
make
make install (or checkinstall if you use it)

Сборка занимает всего несколько секунд.

Alternatively, you can try building with a more recent SWIG. As of March 2012, a typical repository version is 2.0.4. Pivy has a minor compile problem with SWIG 2.0.4 on macOS (see below) but seems to build fine on Fedora Core 15.

After that go to the pivy sources and call

python setup.py build

which creates the source files. Note that build can produce thousands of warnings, but hopefully there will be no errors.

This is probably obsolete, but you may run into a compiler error where a 'const char*' cannot be converted in a 'char*'. To fix that you just need to write a 'const' before in the appropriate lines. There are six lines to fix.

After that, install by issuing (as root):

python setup.py install (or checkinstall python setup.py install)

That's it, pivy is installed.

MacOS

These instructions may not be complete. Something close to this worked for OS 10.7 as of March 2012. I use MacPorts for repositories, but other options should also work.

As for linux, get the latest source:

hg clone http://hg.sim.no/Pivy/default Pivy

If you don't have hg, you can get it from MacPorts:

port install mercurial

Then, as above you need SWIG. It should be a matter of:

port install swig

I found I needed also:

port install swig-python

As of March 2012, MacPorts SWIG is version 2.0.4. As noted above for linux, you might be better off downloading an older version. SWIG 2.0.4 seems to have a bug that stops Pivy building. See first message in this digest

This can be corrected by editing the 2 source locations to add dereferences: *arg4, *arg5 in place of arg4, arg5. Now Pivy should build:

python setup.py build
sudo python setup.py install

Windows

Windows

Предполагается использование Visual Studio 2005 или позднии версии вы предется открыть командную строку 'Visual Studio 2005 Command prompt' из меню Tools. Если Python интерпритатор ещё не прописан в системном пути, сделайте это

set PATH=path_to_python_2.5;%PATH%

Чтобы получить работающий pivy вы должны получить последнюю версию исходников из репозитория проекта:

svn co https://svn.coin3d.org/repos/Pivy/trunk Pivy

Затем вам понадобится инструмент называемыйd SWIG для создания C++ кода для Python привязок. Рекомендуется использовать версию SWIG 1.3.25 , не последнюю версию, потому как на данный момент pivy корректно работает только с 1.3.25. Скачайте 1.3.25 tarball с исходными кодамииз http://www.swig.org. Затем распакуйте его и в командной строке добавте к системному пути

set PATH=path_to_swig_1.3.25;%PATH%

и установите COINDIR на соответсвующий путь

set COINDIR=path_to_coin

В Windows pivy конфигурационный файл нахотится в SoWin вместо SoQt по умолчанию. Мне не удалось найти очевидный способ собрать с SoQt, поэтому я изменил файл непосредственно setup.py. В 200 строке удалите часть 'sowin' : ('gui._sowin', 'sowin-config', 'pivy.gui.') (не удалйте закрывающиеся скобки).

После чего отправляйтесь к исходным кодам pivy и введите команду

python setup.py build

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

set INCLUDE=%INCLUDE%;path_to_coin_include_dir

если нет заголовочных файлов SoQt на месте , также с заголовками Coin

set INCLUDE=%INCLUDE%;path_to_soqt_include_dir

и в конце Qt заголовочные файлы

set INCLUDE=%INCLUDE%;path_to_qt4\include\Qt

Если вы используете Express Edition версию Visual Studio вы можете получить исключение python keyerror. В этом случае Вам необходимо изменить кое-что в msvccompiler.py расположенный в месте кужа вы установили Python.

шагом марш на 122 строку и замените строку

vsbase = r"Software\Microsoft\VisualStudio\%0.1f" % version

на

vsbase = r"Software\Microsoft\VCExpress\%0.1f" % version

Повторите сборку снова. Если вы получили вторую ошибку, вроде

error: Python was built with Visual Studio 2003;...

вы должны поменять 128 строку

self.set_macro("FrameworkSDKDir", net, "sdkinstallrootv1.1")

на

self.set_macro("FrameworkSDKDir", net, "sdkinstallrootv2.0")

Повторите сборку снова. Если вы опять получили ошибку

error: Python was built with Visual Studio version 8.0, and extensions need to be built with the same version of the compiler, but it isn't installed.

проверте пересеменные окружения DISTUTILS_USE_SDK и MSSDK с помощью

echo %DISTUTILS_USE_SDK%
echo %MSSDK%

Если они еще не установлены, то просто установите например, до 1

set DISTUTILS_USE_SDK=1
set MSSDK=1

Вы можете столкнуться при компиляции с ошибкой 'const char*' cannot be converted in a 'char*'. Чтобы исправить это вам необходимо написать 'const' перед следующей строкой(char*). Исправте ещё шесть строк. После чего, скопируйте созданный pivy каталог, в место где python интрепритатор FreeCAD сможет найти его.

Usage

To check if Pivy is correctly installed:

import pivy

Чтобы Pivy получил доступ FreeCAD древу сцен сделайте следующие:

from pivy import coin
App.newDocument() # Open a document and a view
view = Gui.ActiveDocument.ActiveView
FCSceneGraph = view.getSceneGraph() # returns a pivy Python object that holds a SoSeparator, the main "container" of the Coin scenegraph
FCSceneGraph.addChild(coin.SoCube()) # add a box to scene

Теперь вы можете изучать FCSceneGraph с помощью команды dir().

Additonal Documentation

Unfortunately documentation about pivy is still almost nonexistant on the net. But you might find Coin documentation useful, since pivy simply translate Coin functions, nodes and methods in Python, everything keeps the same name and properties, keeping in mind the difference of syntax between C and Python:

Вы также можете просмотреть в Draft.py файл в папке FreeCAD Mod/Draft , так как там часто используется pivy.

pyCollada

pyCollada is a Python library that allow programs to read and write Collada (*.DAE) files. When pyCollada is installed on your system, FreeCAD will be able to handle importing and exporting in the Collada file format.

Installation

Linux

sudo apt-get install python3-collada

You can check if pycollada was correctly installed by issuing in a Python console:

import collada

If it returns nothing (no error message), then all is OK

Windows

On Windows since 0.15 pycollada is included in both the FreeCAD release and developer builds so no additional steps are necessary.

MacOS

If you are using the Homebrew build of FreeCAD you can install pycollada into your system Python using pip.

If you need to install pip:

$ sudo easy_install pip

Install pycollada:

$ sudo pip install pycollada

If you are using a binary version of FreeCAD, you can tell pip to install pycollada into the site-packages inside FreeCAD.app:

$ pip install --target="/Applications/FreeCAD.app/Contents/lib/python2.7/site-packages" pycollada

or after downloading the pycollada code

$ export PYTHONPATH=/Applications/FreeCAD\ 0.16.6706.app/Contents/lib/python2.7/site-packages:$PYTHONPATH
$ python setup.py install --prefix=/Applications/FreeCAD\ 0.16.6706.app/Contents

IfcOpenShell

IFCOpenShell is a library currently in development, that allows to import (and soon export) Industry foundation Classes (*.IFC) files. IFC is an extension to the STEP format, and is becoming the standard in BIM workflows. When ifcopenshell is correctly installed on your system, the FreeCAD Arch Workbench will detect it and use it to import IFC files, instead of its built-in rudimentary importer. Since ifcopenshell is based on OpenCasCade, like FreeCAD, the quality of the import is very high, producing high-quality solid geometry.

Installation

Since ifcopenshell is pretty new, you'll likely need to compile it yourself.

Linux

You will need a couple of development packages installed on your system in order to compile ifcopenshell:

liboce-*-dev
python-dev
swig

but since FreeCAD requires all of them too, if you can compile FreeCAD, you won't need any extra dependency to compile IfcOpenShell.

Grab the latest source code from here:

git clone https://github.com/IfcOpenShell/IfcOpenShell.git

The build process is very easy:

mkdir ifcopenshell-build
cd ifcopenshell-build
cmake ../IfcOpenShell/cmake

or, if you are using oce instead of opencascade:

cmake -DOCC_INCLUDE_DIR=/usr/include/oce ../ifcopenshell/cmake

Since ifcopenshell is made primarily for Blender, it uses Python3 by default. To use it inside FreeCAD, you need to compile it against the same version of Python that is used by FreeCAD. So you might need to force the Python version with additional cmake parameters (adjust the Python version to yours):

cmake -DOCC_INCLUDE_DIR=/usr/include/oce -DPYTHON_INCLUDE_DIR=/usr/include/python2.7 -DPYTHON_LIBRARY=/usr/lib/python2.7.so ../ifcopenshell/cmake

Then:

make
sudo make install

You can check that ifcopenshell was correctly installed by issuing in a Python console:

import ifcopenshell

If it returns nothing (no error message), then all is OK

Windows

Note: Official FreeCAD installers obtained from the FreeCAD website/github page now contain ifcopenshell already.

Copied from the IfcOpenShell README file

Users are advised to use the Visual Studio .sln file in the win/ folder. For Windows users a prebuilt Open CASCADE version is available from the opencascade website. Download and install this version and provide the paths to the Open CASCADE header and library files to MS Visual Studio C++.

For building the IfcPython wrapper, SWIG needs to be installed. Please download the latest swigwin version from swig website. After extracting the .zip file, please add the extracted folder to the PATH environment variable. Python needs to be installed, please provide the include and library paths to Visual Studio.

Links

Tutorial Import/Export IFC - compiling IfcOpenShell

LazyLoader

LazyLoader is a Python module that allows deferred loading, while still importing at the top of the script. This is useful if you are importing another module that is slow, and it is used several times throughout the script. Using LazyLoader can improve workbench startup times, but the module will still need to be loaded on first use.

Installation

LazyLoader is included with FreeCAD v0.19

Usage

You will need to import LazyLoader, then change the import of whatever module you want to be deferred.

from lazy_loader.lazy_loader import LazyLoader
Part = LazyLoader('Part', globals(), 'Part')

The variable Part is how the module is named in your script. You can replicate "import Part as P" by changing the variable.

P = LazyLoader('Part', globals(), 'Part')

You can also import a module from a package.

utils = LazyLoader('PathScripts', globals(), 'PathScripts.PathUtils')

You can't import individual functions, just entire modules.

Links


Авторы


FreeCAD would not be what it is without the generous contributions of many people. Here's an overview of the people and companies who contributed to FreeCAD over time. For credits for the third party libraries see the Third Party Libraries page.

Разработка

Project managers

Lead developers of the FreeCAD project:

Main developers

People who work regularly on the FreeCAD code (retrieved from https://github.com/FreeCAD/FreeCAD/graphs/contributors):

Other coders

Other people who contributed code to the FreeCAD project:

  • Barleyman
  • Berthold Grupp
  • dbtayl
  • Dmitry Chigrin
  • ezzieyguywuf
  • fandaL
  • Georg Wiora
  • Graeme van der Vlugt
  • itain
  • j-dowsett
  • Jacques-Antoine Gaudin
  • jcc242
  • jmaustpc
  • Joachim Zettler
  • jobermayr
  • Johan3DV
  • jonnor
  • keithsloan52
  • Ken Cline
  • Mandeep Singh
  • marktaff
  • Martin Burbaum
  • maurerpe
  • ovginkel
  • peterl94
  • plaes
  • poutine70
  • TheMarkster
  • qingfengxia
  • Remigiusz Fiedler (DXF-parser)
  • SebKuzminsky
  • tomate44
  • triplus
  • usakhelo

Companies

Companies which donated code, assets or developer time:

Forum moderators

People in charge of the FreeCAD forum (retrieved from http://forum.freecadweb.org/memberlist.php?mode=team):

Community

People from the community who put a lot of efforts in helping the FreeCAD project either by being active on the forum, keeping a blog about FreeCAD, making video tutorials, packaging FreeCAD for Windows/Linux/macOS, writing a FreeCAD book... (listed by alphabetical order) (retrieved from http://forum.freecadweb.org/memberlist.php?mode=&sk=d&sd=d#memberlist).

Documentation writers

People who wrote the documentation on this wiki:

Translators

People who helped to translate the FreeCAD application (retrieved from https://crowdin.com/project/freecad):

Addons developers

Developers of FreeCAD addons (retrieved from https://github.com/FreeCAD/FreeCAD-addons):