学写工具台(Workbench)

Chinese forum
johnwang
Posts: 445
Joined: Sun Jan 27, 2019 12:41 am

学写工具台(Workbench)

Post by johnwang » Tue Apr 09, 2019 10:15 am

我是在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列在工具台列表里了。

paullee
Posts: 2661
Joined: Wed May 04, 2016 3:58 pm

Re: 学写工具台(Workbench)

Post by paullee » Mon Apr 15, 2019 5:15 pm

+1

User avatar
leeon
Posts: 45
Joined: Mon Mar 11, 2019 4:37 pm
Contact:

Re: 学写工具台(Workbench)

Post by leeon » Fri Apr 26, 2019 12:14 pm

不错哦。
致力于FreeCAD的推广。

FreeCADweb.cn

johnwang
Posts: 445
Joined: Sun Jan 27, 2019 12:41 am

Re: 学写工具台(Workbench)

Post by johnwang » Fri Nov 15, 2019 10:09 am

leeon wrote:
Fri Apr 26, 2019 12:14 pm
不错哦。
谢谢鼓励。

johnwang
Posts: 445
Joined: Sun Jan 27, 2019 12:41 am

Re: 学写工具台(Workbench)

Post by johnwang » Fri Nov 15, 2019 10:24 am

工具台有了,工具从哪来呢?
在工具台类定义的初始化函数里,有这么几句

Code: Select all

    def Initialize(self):
        # load the module
        import SurfaceGui
        import Surface
其中输入的SurfaceGui和Surface就是工具的界面和实际的工具。搜素了一下,在lib目录下有这两个文件。后缀是pyd. 这个就是动态运行库,是用c语言编译而成的。原来工具台的工具也可以用c语言来写,我还以为只是用python呢。这下要学的就更多了。

开始学习这个
https://freecadweb.org/wiki/Workbench_creation

paullee
Posts: 2661
Joined: Wed May 04, 2016 3:58 pm

Re: 学写工具台(Workbench)

Post by paullee » Fri Nov 15, 2019 5:44 pm

johnwang wrote:
Fri Nov 15, 2019 10:24 am
...
其中输入的SurfaceGui和Surface就是工具的界面和实际的工具。
除了寫一個新的Workbench,也可以幫忙改善現有的如Arch等 :)

johnwang
Posts: 445
Joined: Sun Jan 27, 2019 12:41 am

Re: 学写工具台(Workbench)

Post by johnwang » Fri Nov 15, 2019 10:12 pm

paullee wrote:
Fri Nov 15, 2019 5:44 pm

除了寫一個新的Workbench,也可以幫忙改善現有的如Arch等 :)
我的truss是在建筑师画好房子后加上去的,所以没想过用arch wb. 有个flamigo wb似乎对我有用,还没细看。

paullee
Posts: 2661
Joined: Wed May 04, 2016 3:58 pm

Re: 学写工具台(Workbench)

Post by paullee » Sat Nov 16, 2019 1:50 am

Flamingo 近來演變成 Dodo :)

johnwang
Posts: 445
Joined: Sun Jan 27, 2019 12:41 am

Re: 学写工具台(Workbench)

Post by johnwang » Wed Jun 24, 2020 12:40 pm

可以编译fc了,现在要试试用c写工具台。

从github抓来fc的源码zip包,解压在c:/freecad-master目录下。

先看fc源码里surface工具台的文件结构。
根目录如下:
cbox1.jpg
cbox1.jpg (11.77 KiB) Viewed 1634 times
其中有app和gui两个目录,分别存有关于功能和界面的代码。cmakelists. Txt是用cmake编译需要的文件。dox文件现在不知道是干什么的。

App目录如下:
cbox2.jpg
cbox2.jpg (32.2 KiB) Viewed 1634 times
gui目录如下:
cbox3.jpg
cbox3.jpg (42.87 KiB) Viewed 1634 times
ui是窗口资源,Resources目录下存的是图标。

johnwang
Posts: 445
Joined: Sun Jan 27, 2019 12:41 am

Re: 学写工具台(Workbench)

Post by johnwang » Wed Oct 07, 2020 6:26 am

Mod/Surface/InitGui.py里用import加载了SurfaceGui模块。这个模块是在Mod/Surface/Gui/AppSurfaceGui.cpp里定义的。该cpp里函数PyMOD_INIT_FUNC(SurfaceGui)是这样初始化命令工具的:

Code: Select all

    // instantiating the commands
    CreateSurfaceCommands();

    SurfaceGui::Workbench::init();
先说CreateSurfaceCommands()函数。这个函数在Command.cpp里面定义的。如下:

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());
}
它创建了4个命。我们只看其中一个命令CmdSurfaceGeomFillSurface,它通过如下语句命名了一个名为Surface_GeomFillSurface的命令:

Code: Select all

DEF_STD_CMD_A(CmdSurfaceGeomFillSurface)

CmdSurfaceGeomFillSurface::CmdSurfaceGeomFillSurface()
    : Command("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目录内容如下:
gui.jpg
gui.jpg (45.93 KiB) Viewed 214 times
同理,可以把App目录简化到如下:
app.jpg
app.jpg (29.94 KiB) Viewed 213 times
Last edited by johnwang on Wed Oct 07, 2020 1:38 pm, edited 11 times in total.

Post Reply