MeshLab中插件的添加过程
MeshLab中主要插件类型有 filter plugins, i/o plugins, edit plugins,这些插件实现了MeshLab的大部分功能。新加入的插件命名规则最好也遵循规范,可命名为: edit_something, filter_something, io_something,可以在插件中写入自定义的功能或操作,实现功能的扩展。MeshLab中插件的添加是在Qt Creator中完成的,之后再重新读入Visual Studio 中自己编写想要的功能函数。
假如现在要在edit中加入一个名为edit_pickcontour的插件,并在Edit菜单栏下加入带插件的按钮图标。
使用的是Qt 5.3.1, VS2010,MeshLab1.3.3
1. 在Qt Creator中添加名为edit_pickcontour的工程,完成相关配置
1.1 用 Qt Creator 打开 ...\meshlab\src 目录下的meshlab_full.pro 文件,MeshLab中的所有工程都在里面
1.2 选择文件>>新建文件或项目,弹出对话框中在项目栏中选择其他项目,创建一个空的Qt项目。把新的子工程命名为 edit_pickcontour,路径设置在...\meshlab\src下都可以,但为了方便文件管理,路径设置在 ...\meshlab\src\plugins_experimental 目录下,在该目录下会自动新建文件夹 edit_pickcontour 作为新建插件的创建路径。之后按照默认设置完成工程的创建。
创建好的edit_pickcontour 工程如下:
1.3鼠标右键单击子工程edit_pickcontour >> 添加新文件,选择C++ >> C++ Class,然后在该工程下创建一个EditPickContourPlugin类,继承自QObject,头文件和源文件名分别为:edit_pickcontour.h, edit_pickcontour.cpp, 路径为该工程的路径。
1.4 MeshLab提供了一个公用的shared.pri,里面包含了通用的插件编译配置,只需在edit_pickcontour.pro包含该文件即完成了插件编译的基本配置。在edit_pickcontour.pro中包含该文件:include (../../shared.pri),添加这条语句后会在工程中自动的生成 general 和shared 两个文件夹。
完成后可保存并退出。
2. 在VS2010中写入新插件的功能,并在菜单中加入该插件的按钮
2.1 在VS2010中用Qt5打开文件...\meshlab\src\meshlab_full.pro,之后会重新加载MeshLab中的各个子工程,加载完成后可以看到会出现新添加的插件edit_pickcontour
2.2 插件的接口类介绍
MeshLab中插件的接口主要是由...\meshlab\src\common\interfaces.h 提供,在interface.h中提供了各类插件与主界面的接口,每种类型的插件都定义了相应的类,包括:
io plugin:网格的输入输出。
filter plugin:网格基本算法的插件,包括网格简化、细分、曲率计算等。
render plugin:网格的渲染,包括边界、法向量等各方面的显示。
decorator plugin:主要是对MeshLab界面的设置,如背景颜色、网格的显示方式等。
edit plugin:主要实现对网格的交互操作,如测量距离、选点、选面等操作。
以edit plugin 的类为例,edit插件中主要是对网格曲面的交互操作,所以成员函数主要是鼠标的响应函数,若要添加交互功能,在这些鼠标的响应函数中加入功能代码,以实现期望的功能。
classMeshEditInterface:publicMeshCommonInterface{}; |
而与主界面的连接是通过相应的 factory 类实现的,factory 类的使用是为了使一个工程中可以有若干个功能在各自的文件中实现,并在主界面产生对应的功能按钮。
classMeshEditInterfaceFactory { public: virtual~MeshEditInterfaceFactory(){} //gets a list of actions available from this plugin virtualQList<QAction*>actions()const=0; //get the edit tool for the given action virtualMeshEditInterface*getMeshEditInterface(QAction*)=0; //get the description for the given action virtualQStringgetEditToolDescription(QAction*)=0; }; |
2.3对新加入的插件写入需要的功能
classEditPickContourPlugin:publicQObject, publicMeshEditInterface { }; |
之后定义相关的成员函数与成员变量,在edit_pickcontour.cpp 中实现。
- 添加管理插件功能与主界面连接的 factory 类,命名为:
classEditPickContourFactory:publicQObject, publicMeshEditInterfaceFactory {}; |
该类写在文件 edit_pickcontour_factory.h 中,形式比较固定。
// edit_pickcontour_factory.h #ifndefEditPickContourFactoryPLUGIN_H #defineEditPickContourFactoryPLUGIN_H #include<QObject> #include<common/interfaces.h>
classEditPickContourFactory:publicQObject,publicMeshEditInterfaceFactory { Q_OBJECT MESHLAB_PLUGIN_IID_EXPORTER(MESH_EDIT_INTERFACE_FACTORY_IID) Q_INTERFACES(MeshEditInterfaceFactory) public: EditPickContourFactory(); virtual~EditPickContourFactory(){deleteeditPickContour;} //gets a list of actions available from this plugin virtualQList<QAction*>actions()const; //get the edit tool for the given action virtualMeshEditInterface*getMeshEditInterface(QAction*); //get the description for the given action virtualQStringgetEditToolDescription(QAction*); private: QList<QAction*>actionList; QAction*editPickContour; }; #endif |
对应的是 edit_pickcontour_factory.cpp 中成员函数的实现:
// edit_pickcontour_factory.cpp #include"edit_pickcontour_factory.h" #include"edit_pickcontour.h" EditPickContourFactory::EditPickContourFactory() { editPickContour=newQAction("Pick Contour Tool",this); actionList<<editPickContour; foreach(QAction*editAction,actionList) editAction->setCheckable(true); } QList<QAction*>EditPickContourFactory::actions()const { returnactionList; } MeshEditInterface*EditPickContourFactory::getMeshEditInterface(QAction*action) { if(action==editPickContour) { returnnewEditPickContourPlugin(); }else assert(0);//should never be asked for an action that isnt here } QStringEditPickContourFactory::getEditToolDescription(QAction*) { returnEditPickContourPlugin::Info(); } MESHLAB_PLUGIN_NAME_EXPORTER(EditPickContourFactory); |
之后编译edit_pickcontour 这个工程,再调试运行 MeshLab ,就能在主界面看到这个工程的菜单按钮。
相关参考: