学写工具台(Workbench)
Moderator: paullee
Forum rules
论坛规矩 / 論壇規矩 , 有用的资讯 / 有用的資訊
论坛规矩 / 論壇規矩 , 有用的资讯 / 有用的資訊
学写工具台(Workbench)
我是在win 10下用FreeCAD0.17。FreeCAD安装在E:\Program Files\FreeCAD 0.17目录下。FreeCAD本身带的Workbench都装在其中的Mod子目录下。比如Mod\Surface就是Surface工具台。进入Mod\Surface目录,可以看到里面有Init.py和InitGui.py两个Python源文件。
下面以一个画box的工具为例子做一个工具台。我把它叫做hpBox工具台。hp代表什么呢?hp可以是你名字的缩写。比如你叫Harry Porter,缩写正好是hp. 这样可以和别人写的box工具台区分开来。因为别人写box工具台时取名hpBox的几率小。
首先在Mod目录里建一个hpBox子目录,然后把Mod\Surface子目录下的两个py文件拷过来。为了实现我们自己的功能,就得修改原来的代码。
Init.py是用于FreeCAD在终端命令行下运行时工具台的初始化。用一个文本编辑器打开该文件,会看里面只有两条注释语句。FreeCAD如何在终端命令行下运行,我没研究过,目前也不会在终端里运行,所以,这个文件保持原样,不做任何修改。
InitGui.py是用于FreeCAD在窗口下运行时工具台的初始化。这也是我们通常的运行方式。用一个文本编辑器打开该文件,可以看到里面有一个类(class)。类名就是工具台的名字。我们把类名SurfaceWorkbench改成hpBoxWorkbench。将最后一句把新工具台添加到FreeCAD工具台列表上的语句也改成添加hpBoxWorkbench。如果这时你运行FreeCAD,你在工具台列表里将看到两个Surface工具台。我们把MenuText = "Surface"一句改成MenuText = "hpBox",再次运行,就可以看到hpBox列在工具台列表里了。
下面以一个画box的工具为例子做一个工具台。我把它叫做hpBox工具台。hp代表什么呢?hp可以是你名字的缩写。比如你叫Harry Porter,缩写正好是hp. 这样可以和别人写的box工具台区分开来。因为别人写box工具台时取名hpBox的几率小。
首先在Mod目录里建一个hpBox子目录,然后把Mod\Surface子目录下的两个py文件拷过来。为了实现我们自己的功能,就得修改原来的代码。
Init.py是用于FreeCAD在终端命令行下运行时工具台的初始化。用一个文本编辑器打开该文件,会看里面只有两条注释语句。FreeCAD如何在终端命令行下运行,我没研究过,目前也不会在终端里运行,所以,这个文件保持原样,不做任何修改。
InitGui.py是用于FreeCAD在窗口下运行时工具台的初始化。这也是我们通常的运行方式。用一个文本编辑器打开该文件,可以看到里面有一个类(class)。类名就是工具台的名字。我们把类名SurfaceWorkbench改成hpBoxWorkbench。将最后一句把新工具台添加到FreeCAD工具台列表上的语句也改成添加hpBoxWorkbench。如果这时你运行FreeCAD,你在工具台列表里将看到两个Surface工具台。我们把MenuText = "Surface"一句改成MenuText = "hpBox",再次运行,就可以看到hpBox列在工具台列表里了。
Re: 学写工具台(Workbench)
工具台有了,工具从哪来呢?
在工具台类定义的初始化函数里,有这么几句
其中输入的SurfaceGui和Surface就是工具的界面和实际的工具。搜素了一下,在lib目录下有这两个文件。后缀是pyd. 这个就是动态运行库,是用c语言编译而成的。原来工具台的工具也可以用c语言来写,我还以为只是用python呢。这下要学的就更多了。
开始学习这个
https://freecadweb.org/wiki/Workbench_creation
在工具台类定义的初始化函数里,有这么几句
Code: Select all
def Initialize(self):
# load the module
import SurfaceGui
import Surface
开始学习这个
https://freecadweb.org/wiki/Workbench_creation
Re: 学写工具台(Workbench)
我的truss是在建筑师画好房子后加上去的,所以没想过用arch wb. 有个flamigo wb似乎对我有用,还没细看。
Re: 学写工具台(Workbench)
Flamingo 近來演變成 Dodo
Re: 学写工具台(Workbench)
可以编译fc了,现在要试试用c写工具台。
从github抓来fc的源码zip包,解压在c:/freecad-master目录下。
先看fc源码里surface工具台的文件结构。
根目录如下: 其中有app和gui两个目录,分别存有关于功能和界面的代码。cmakelists. Txt是用cmake编译需要的文件。dox文件现在不知道是干什么的。
App目录如下: gui目录如下: ui是窗口资源,Resources目录下存的是图标。
从github抓来fc的源码zip包,解压在c:/freecad-master目录下。
先看fc源码里surface工具台的文件结构。
根目录如下: 其中有app和gui两个目录,分别存有关于功能和界面的代码。cmakelists. Txt是用cmake编译需要的文件。dox文件现在不知道是干什么的。
App目录如下: gui目录如下: ui是窗口资源,Resources目录下存的是图标。
Re: 学写工具台(Workbench)
Mod/Surface/InitGui.py里用import加载了SurfaceGui模块。这个模块是在Mod/Surface/Gui/AppSurfaceGui.cpp里定义的。该cpp里函数PyMOD_INIT_FUNC(SurfaceGui)是这样初始化命令工具的:
先说CreateSurfaceCommands()函数。这个函数在Command.cpp里面定义的。如下:
它创建了4个命。我们只看其中一个命令CmdSurfaceGeomFillSurface,它通过如下语句命名了一个名为Surface_GeomFillSurface的命令:
它在被激活时,是执行Surface::GeomFillSurface。GeomFillSurface类在是在Gui/TaskGeomFillSurface.cpp里定义的,是和GUI操作有关的部分。同时在App/TaskGeomFillSurface.cpp里还有其功能性的定义。GeomFillSurface是在AppSurface.cpp里被初始化的。这就把GUI和APP这两部分给连起来了。
再看Workbench的初始化,对应Gui/Workbench.cpp. 里面有创建菜单setupMenuBar和工具条setupToolBars的语句。我们看到Surface_GeomFillSurface命令被加到菜单和工具条上了。
为了理解程序,我们把程序简化,去掉其他的3个命令,同时删除对应文件。这样简化后Gui目录内容如下: 同理,可以把App目录简化到如下:
Code: Select all
// instantiating the commands
CreateSurfaceCommands();
SurfaceGui::Workbench::init();
Code: Select all
void CreateSurfaceCommands(void)
{
Gui::CommandManager &rcCmdMgr = Gui::Application::Instance->commandManager();
rcCmdMgr.addCommand(new CmdSurfaceFilling());
rcCmdMgr.addCommand(new CmdSurfaceGeomFillSurface());
rcCmdMgr.addCommand(new CmdSurfaceCurveOnMesh());
rcCmdMgr.addCommand(new CmdSurfaceExtendFace());
}
Code: Select all
DEF_STD_CMD_A(CmdSurfaceGeomFillSurface)
CmdSurfaceGeomFillSurface::CmdSurfaceGeomFillSurface()
: Command("Surface_GeomFillSurface")
再看Workbench的初始化,对应Gui/Workbench.cpp. 里面有创建菜单setupMenuBar和工具条setupToolBars的语句。我们看到Surface_GeomFillSurface命令被加到菜单和工具条上了。
为了理解程序,我们把程序简化,去掉其他的3个命令,同时删除对应文件。这样简化后Gui目录内容如下: 同理,可以把App目录简化到如下:
Last edited by johnwang on Wed Oct 07, 2020 1:38 pm, edited 11 times in total.