0.前言
本文将分析和模仿FreeCAD的官方模块ReverseEngineering来开发PersonalReverse模块
该仿造仅为学习FreeCAD,请遵守FreeCAD的开发许可证规定:FreeCAD/LICENSE
参考链接:
FreeCAD_modular_design
1.PersonalReverse初始化
-
进入源码的
src/Tools
目录下,打开终端,运行python fcbt.py
,使用CM
命令,创建PersonalReverse模块,如图所示:
此时,进入到src/Mod
目录下,将会发现新增了一个PersonalReverse目录 -
修改
src/Mod
目录下的CmakeLists.txt,将我们的新模块添加到整个解决方案中
option(BUILD_PERREVERSE "Build PersonalReverse" ON)
if(BUILD_PERREVERSE)
add_subdirectory(PersonalReverse)
endif(BUILD_PERREVERSE)
这里添加option命令是为了方便在cmake-gui中编译。wiki教程中使用cmake -DBUILD_FEM=OFF -DBUILD_MESH=OFF ../freecad-source
命令,可以将某些不需要的模块移除,这样可以简化程序,加快编译。当然,你也可以在cmake-gui中将对应模块的BUILD命令反勾选。
2.初始化文件分析+Workbench图标
进入PersonalReverse目录,终端中输入tree /F
打印如下(注释为作者键入):
PersonalReverse:
│ CMakeLists.txt #该目录的编译规则
│ Init.py #定义输入输出文件类型
│ InitGui.py #定义workbench图标等信息,需要在Gui/CMakeLists.txt中添加资源
│ PersonalReverse.dox #定义了加载Workbench的规范,必不可少
│
├─App
│ AppPersonalReverse.cpp
│ CMakeLists.txt
│ PreCompiled.cpp
│ PreCompiled.h
│
└─Gui
│ AppPersonalReverseGui.cpp
│ CMakeLists.txt
│ Command.cpp
│ PreCompiled.cpp
│ PreCompiled.h
│ Workbench.cpp
│ Workbench.h
│
└─Resources
│ PersonalReverse.qrc #资源文件
│
└─icons #该文件夹为手动创建,用于存储svg图标及翻译文件
模板模块的组织方式与FreeCAD源代码文件夹中的其他官方模板类似。Gui相关的c++代码放在
Gui
文件夹中,非Gui代码放在App
子文件夹中。生成模块将处于最小的可运行/可编译状态。
注意到,本文在PersonalReverse/Gui/Resources
中添加了icons
文件夹,现在我们来修改一下该模块的图标。
- 在
icons
文件夹下添加PersonalReverseWorkbench.svg
(可以从其他Mod中复制一个图标改名,也可以去网上下载) - 在InitGui.py中添加
Icon=...
【请注意,python文件对缩进很敏感,可以使用vscode等专业的代码编辑器以保证代码为统一缩进】
class PersonalReverseWorkbench ( Workbench ):
"PersonalReverse workbench object"
Icon = FreeCAD.getResourceDir() + "Mod/PersonalReverse/Resources/icons/PersonalReverseWorkbench.svg"
MenuText = "PersonalReverse"
ToolTip = "PersonalReverse workbench"
def Initialize(self):
# load the module
import PersonalReverseGui
def GetClassName(self):
return "PersonalReverseGui::Workbench"
Gui.addWorkbench(PersonalReverseWorkbench())
至此,我们已经可以使用cmake和visual studio来编译整个FreeCAD项目,请参考FreeCAD编译教程
不幸的是,编译运行后,我们会发现workbench的图标出现了问题,这是因为Qt的资源文件没有被编译,FreeCAD无法加载我们设置的图标。
- Workbench图标编译
- 打开
Gui/CMakeLists.txt
文件,设置PersonalReverseGui_SVG
路径变量
SET(PersonalReverseGui_SVG
Resources/icons/PersonalReverseWorkbench.svg
)
- 将
PersonalReverseGui_SVG
添加到PersonalReverseGui库中:
add_library(PersonalReverseGui SHARED ${PersonalReverseGui_SRCS} ${PersonalReverseGui_SVG})
- 接下来两行命令将资源拷贝到build目录中:
fc_copy_sources(PersonalReverseGui "${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_DATADIR}/Mod/PersonalReverse" ${PersonalReverseGui_SVG})
install(FILES ${PersonalReverseGui_SVG} DESTINATION "${CMAKE_INSTALL_DATADIR}/Mod/PersonalReverse/Resources/icons")
- 修改并保存
Gui/CMakeLists.txt
后,右键PersonalReverseGui
项目下的CMakeLists.txt
,点击编译。提示外部环境变化,则点击全部重新加载。此时,我们会发现该项目目录下多了一个PersonalReverseWorkbench.svg文件
此时运行FreeCAD,发现我们的模块已经有了正确的图标。fcbt.py创建模板模块时,为我们提供了一个Test的测试命令,我们会发现切换到PersonalReverse工作台后,有一个×号的按钮,且控制台提示Cannot find icon: Test1
。下面来解决一下Workbench内部命令的图标问题。
- Command图标
Gui/Resources/icons
文件夹下新建actions
文件夹,里面添加一个SVG文件- 打开
PersonalReverseGui
项目下的PersonalReverse.qrc
,添加该图标资源并保存【你需要有Qt Vs Tools,相关问题见第5点】 - 右键
PersonalReverse.qrc
,编译 - Command.cpp文件中有一个测试命令:CmdPersonalReverseTest,修改
sPixmap
为在qrc文件中添加过的图标:e.g.: sPixmap="actions/FitSurface";
(qrc中已经添加编译了actions文件夹下的FitSurface.svg文件) - 右键
PersonalReverseGui
项目,生成(注意,点击生成而不是重新生成,我们只需要编译该项目即可,重新生成会浪费大量时间)
至此,我们有了一个自己的模块PersonalReverse。打开FreeCAD,切换到该模块,会发现有一个测试图标,点击该图标会在FreeCAD的控制台中打印Hello World!\n
。接下来我们将结合ReverseEngineering模块中的代码来进一步完善我们的PersonalReverse模块,深入了解App和Gui的开发。