前言
工作台(Workbench)是 FreeCAD
重要的组成部分,比如 Part
工作台,FEM
工作台,每个工作台用于处理不同的任务。
工作台定义 https://zh.wikipedia.org/wiki/%E5%B7%A5%E4%BD%9C%E5%8F%B0
FreeCAD 工作台可以使用 Python、C++ 或两者的混合进行编码,但作为外部(第三方)工作台,按官方的说法,仅能使用 Python 来开发,所以需要了解一些 Python 知识。
目前,FreeCAD 工作台开发标准有两个:
新的标准工作台 (https://github.com/FreeCAD/freecad.workbench_starterkit)
这里仅学习新标准的工作台开发。
一、目录构成
/Mod/
└─ MyWorkbench/
├─ freecad/
│ └─ workbench_starterkit/
│ ├─ __init__.py
│ └─ init_gui.py
├─ setup.py
└─ 其他文件
- 文件说明
__init__.py
这个是在FreeCAD
启动时候执行,不与界面交互,后台执行,在工作台开发时,内容可为空。init_gui.py
这个是在工作台被加载时执行,主要用于界面交互,比如添加菜单、工具栏等。setup.py
用于注册工作台。
二、工作台相关概念
- 命令 (command)
- 可由
FreeCAD
调用的指令;一般是一个Python
类,只需要定义一次,使用FreeCADGui.addCommand(name, command)
来向FreeCAD
注册
- 可由
- 菜单项 (menu item)
- 显示在 FreeCAD 菜单栏里的菜单项,可进行分组,一个命令可用在多个菜单
- 工具栏按钮 (toobar button)
- 和菜单项类似,工具栏按钮可以进行分组,也可以用在多个工具栏中
注:
菜单和工具按钮的点击,都可以调用命令
三、简单代码实现
-
要达到的目的:
- 在
FreeCAD
启动时加载一个自定义的工作台; - 切换到当前工作台时,在
FreeCAD
的报告浏览器
中显示一句话:迷宫工作台已加载。 - 同时在工具栏上添加一个功能按钮:
创建迷宫
- 当点击
创建迷宫
,在报告浏览器
中显示一句话:迷宫已创建。
- 在
-
需要准备的资料
- 准备一个
svg
格式的图标文件,命名为maze.svg
; - 将该图标文件放到
./resource/icons
目录下; - 该文件将被用作工作台和功能的图标。
- 准备一个
-
创建以下目录结构
freecad-maze/ ├─ freecad/ │ └─ maze/ │ ├─ resources/ │ │ └─ icons/ │ │ └─ maze.svg │ ├─ __init__.py │ └─ init_gui.py └─ setup.py
init_gui.py
文件代码
# -*- coding: utf-8 -*-
from freecad import app, gui
import os
ROOTPATH = os.path.join(os.path.dirname(__file__))
ICONPATH = os.path.join(ROOTPATH, "resources/icons")
APPICON = os.path.join(ICONPATH, "maze.svg")
class MazeWorkbench(gui.Workbench):
'''
迷宫插件,主要用于生成迷宫的三维模型
'''
# 插件名称
MenuText = "迷宫"
# 插件提示,在参数设置的工作台列表中显示
ToolTip = "这是一个迷宫工作台"
# 插件图标
Icon = APPICON
def GetClassName(self):
return "Gui::PythonWorkbench"
def Initialize(self):
'''
初始化时执行,可以在这里初始化菜单、工具栏
'''
app.Console.PrintMessage("迷宫工作台已加载。\n")
# 向FreeCAD添加指令
gui.addCommand("CreateMaze", CreateMaze())
# 向当前工作台添加一个命令按钮
self.appendToolbar("Maze", ["CreateMaze"])
def Activated(self):
'''
切换到(变为活动)当前工作台时执行
'''
pass
def Deactivated(self):
'''
当前工作台从活动变为不活动时执行
'''
pass
class CreateMaze():
def GetResources(self):
return {"Pixmap" : APPICON,
"MenuText": "创建迷宫",
"ToolTip" : "创建一个3D迷宫"}
def Activated(self):
app.Console.PrintMessage("迷宫已创建完成\n")
return
def IsActive(self):
'''
判断当前命令是否可用
'''
return True
gui.addWorkbench(MazeWorkbench())
-
setup.py
代码
from setuptools import setup
__version__ = '0.0.1'
setup(name='freecad.maze',
version=str(__version__),
packages=['freecad',
'freecad.maze'],
maintainer="作者名称",
maintainer_email="作者邮箱",
url="项目主页",
description="迷宫",
install_requires=[],
include_package_data=True)
四、在 FreeCAD 中进行测试
- 当以上代码都准备完成后,就可以准备进行测试了;
- 可以有两种方式进行测试:
- 将代码直接复制到
FreeCAD
的Mod
目录下; - 使用
软链接
将当前目录链接到Mod
目录下;
- 将代码直接复制到
- 这里采用第二种方式
- 默认情况下,
FreeCAD
的插件安装在Mod
目录下,如PartDesign
工作台:C:\Program Files\FreeCAD 0.21\Mod\PartDesign
- 可使用以下命令创建一个软链接
-
Windows
mklink /J "C:\Program Files\FreeCAD 0.21\Mod\freecad-maze" X:\SourceCode\freecad-maze
-
Mac
sudo ln -s /SourceCode/freecad-maze /Applications/FreeCAD.app/Contents/Resources/Mod/freecad-maze
-
- 创建完成后,启动
FreeCAD
,如果代码无误,可以在工作台列表中看到一个迷宫
工作台
小结
- 本篇内容主要是将
FreeCAD
工作台开发的准备工作,及相关概念理解清楚,为后续开发做准备。 - 完整代码参考:https://github.com/ronggang/study-freecad