Как расширить FreeCAD для импорта нового формата данных

Создаем простейший плагин для импорта пользовательских данных в FreeCAD

2 мин на чтение

Определение формата данных

Для примера определим импровизированный формат данных .box, описывающий параметры модели параллелепипеда. За основу формата возьмем JSON и объявим три параметра параллелепипеда: ширину, высоту и толщину. Тогда файл модели model.box будет содержать:

{
  "width": 100,
  "height": 200,
  "depth": 300
}

Структура расширения FreeCad

Расширение FreeCad (или аддон) реализуется на Python и в простоте своей имеет структуру как показано на схеме ниже. Файлы Init.py и InitGui.py являются обязательными. Файл Init.py используется FreeCad в консольном режиме, но вызывается и в режиме GUI. Файл InitGui.py содержит функциональность для расширения пользовательского интерфейса.

/Mod/
 +-- FreecadMod/
     +-- Init.py
     +-- InitGui.py

Для загрузки расширения в FreeCad достаточно разместить папку с расширением в Mod-директорию. В Windows эта директория обычно находится здесь: C:\Users\<username>\Appdata\Roaming\FreeCAD\Mod.

Реализация расширения

Создадим модуль FreecadImportMode.py в папке расширения и разместим в нем реализацию импорта файлов формата .box. Определим две функции: addExtension() и insert().

Функция addExtension() добавляет новый импортируемый формат данных в систему FreeCad.

def addExtension():
    FreeCAD.addImportType("Box file type (*.box)", "FreecadImportMod")

Функция insert() будет вызываться системой FreeCad автоматически при открытии файла формата .box. Первый аргумент функции - имя импортируемого файла, а второй - название документа, в который происходит импорт.

Внутри функции необходимо открыть входящий файл и прочитать параметры модели параллелепипеда:

def insert(file_name, document_name):
    with open(file_name) as box_file:
        data = json.load(box_file)
        width = data["width"]
        height = data["height"]
        depth = data["depth"]

Далее получаем объект документа и создаем эскиз с прямоугольником:

doc = FreeCAD.getDocument(document_name)

doc.addObject('Sketcher::SketchObject', 'Sketch')
doc.Sketch.Placement = FreeCAD.Placement(FreeCAD.Vector(0.0, 0.0, 0.0), 
                                         FreeCAD.Rotation(0.0, 0.0, 0.0, 1.0))
line1 = Part.LineSegment()
line1.StartPoint = (0.0, 0.0, 0.0)
line1.EndPoint = (width, 0.0, 0.0)
doc.Sketch.addGeometry(line1, False)

line2 = Part.LineSegment()
line2.StartPoint = (width, 0.0, 0.0)
line2.EndPoint = (width, height, 0.0)
doc.Sketch.addGeometry(line2, False)

line3 = Part.LineSegment()
line3.StartPoint = (width, height, 0.0)
line3.EndPoint = (0.0, height, 0.0)
doc.Sketch.addGeometry(line3, False)

line4 = Part.LineSegment()
line4.StartPoint = (0.0, height, 0.0)
line4.EndPoint = (0.0, 0.0, 0.0)
doc.Sketch.addGeometry(line4, False)

После создания эскиза выполняем операцию “выдавливания” на заданную величину “depth” и обновляем документ:

doc.addObject('Part::Extrusion','Extrude')
doc.Extrude.Base = doc.Sketch
doc.Extrude.DirMode = "Normal"
doc.Extrude.DirLink = None
doc.Extrude.LengthFwd = depth
doc.Extrude.LengthRev = 0.0
doc.Extrude.Solid = True
doc.Extrude.Reversed = False
doc.Extrude.Symmetric = False
doc.Extrude.TaperAngle = 0.0
doc.Extrude.TaperAngleRev = 0.0

doc.recompute()

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

import FreecadImportMod
FreecadImportMod.addExtension()

Получается такая структура файлов расширения:

/Mod/
 +-- FreecadImportMod/
     +-- Init.py
     +-- InitGui.py
     +-- FreecadImportMod.py

Размещаем папку с расширением в директории Mod (C:\Users\<username>\Appdata\Roaming\FreeCAD\Mod).

Результат

Запускаем FreeCad, создаем новый документ и переходим в меню “Файл -> Импортировать…”, где выбираем файл нашей модели model.box.

По нажатию кнопки “Открыть” выполняется сценарий функции insert() расширения FreecadImportMode и в результате строится модель параллелепипеда с заданными в файле параметрами.

Исходный код рассмотренного примера доступен на GitHub.


Обсудить в Телеграм


Свежие записи

Как разбить проект CMake на подпроекты

Как разбить проект CMake на подпроекты

Разделяем на подпроекты существующий проект C++ на CMake

1 мин на чтение

Как создать оконное приложение на Qt в среде QtCreator

Как создать оконное приложение на Qt в среде QtCreator

Учимся создавать свое первое оконное приложение на Qt с использованием QMainWindow в среде QtCreator

6 мин на чтение

Как создать 3D модель с помощью OpenCASCADE на C++ в среде QtCreator

Как создать 3D модель с помощью OpenCASCADE на C++ в среде QtCreator

Учимся создавать свою первую 3D модель тора в OpenCASCADE

3 мин на чтение

Как работать с пул-реквестами в личном репозитории GitHub

Как работать с пул-реквестами в личном репозитории GitHub

Учимся работать с пул-реквестами на GitHub в личных репозиториях

3 мин на чтение

Как исследовать exe-файлы с Cutter. Практика обратной разработки

Как исследовать exe-файлы с Cutter. Практика обратной разработки

Простейший пример исследования и патчинга исполняемого файла с помощью Cutter

2 мин на чтение