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对新加入的插件写入需要的功能

  1. 在 edit_pickcontour 这个工程中首先需要改写 EditPickContourPlugin 这个类,这个类需要继承 edit 的插件接口类 MeshEditInterface 。

classEditPickContourPlugin:publicQObject,

publicMeshEditInterface { };

之后定义相关的成员函数与成员变量,在edit_pickcontour.cpp 中实现。

  1. 添加管理插件功能与主界面连接的 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 ,就能在主界面看到这个工程的菜单按钮。

相关参考:

http://blog.csdn.net/fightingbull/article/details/8103463

MeshLab中插件的添加过程的更多相关文章

  1. eclipse安装activiti5.18.0工作流插件 以及安装过程中activiti插件出现的问题及解决

    转: eclipse安装activiti5.18.0工作流插件 以及安装过程中activiti插件出现的问题及解决 2017年05月04日 18:44:21 JJ_nan 阅读数:2773   版权声 ...

  2. 通过源码了解ASP.NET MVC 几种Filter的执行过程 在Winform中菜单动态添加“最近使用文件”

    通过源码了解ASP.NET MVC 几种Filter的执行过程   一.前言 之前也阅读过MVC的源码,并了解过各个模块的运行原理和执行过程,但都没有形成文章(所以也忘得特别快),总感觉分析源码是大神 ...

  3. MyEclipse6.0中使用aptana插件,添加jquery提示功能

    MyEclipse6.0中使用aptana插件,添加jquery提示功能 第一:查看当前MyEclipse集成的eclipse的版本,, 查看路径    D:/MyEclipse 6.0/eclips ...

  4. Android studio中为项目添加模块依赖的过程

    https://blog.csdn.net/cheng__lu/article/details/74574582 Android studio中为项目添加模块依赖的过程 1.点击菜单file>p ...

  5. 【Java基础】Java中new对象的过程

    序言 联系我上次写的关于Java内存的文章,对象访问在 Java 语言中无处不在,是最普通的程序行为,但即使是最简单的访问,也会却涉及 Java 栈.Java 堆.方法区这三个最重要内存区域之间的关联 ...

  6. elasticsearch5.0.0 安装插件及配置过程

    elasticsearch5.0.0 安装插件及配置过程 由于es5.0是里程碑式的更新,所以很多变化的地方,暂时我就插件安装遇到的问题记录一下. 插件安装命令 2.3版本的安装命令 安装Marvel ...

  7. viewpager中彻底性动态添加、删除Fragment

    为了解决彻底删除fragment,我们要做的是:1.将FragmentPagerAdapter 替换成FragmentStatePagerAdapter,因为前者只要加载过,fragment中的视图就 ...

  8. netbeans中给jpanl添加背景图片制定代码的理解——匿名内部类继承父类

    此测试是为了仿照在netbeans中给jpanl添加背景图片的制定代码的执行过程 在JpDemo中定义了个Car类的数据类型,但在给其赋值对象时使用了匿名内部类,继承了Car类,是其子类,并重写了父类 ...

  9. MeshLab中进行点云配准

    MeshLab是一个开源.可移植和可扩展的三维几何处理系统,主要用于交互处理和非结构化编辑三维三角形网格.它支持多种文件格式: import:PLY, STL, OFF, OBJ, 3DS, COLL ...

随机推荐

  1. SuperSocket框架中BinaryRequestInfo协议的使用

    一.开发环境 1.Windows 10 企业版 64位 2.Microsoft Visual Studio 2017 企业版 二.项目开始 1.新建控制台程序,项目名称“BinarySuperSock ...

  2. Go:定时执行任务time.sleep和time.tick的优劣

    golang 写循环执行的定时任务,常见的有以下三种实现方式:1.time.Sleep方法: for { time.Sleep(time.Second) fmt.Println("我在定时执 ...

  3. Educational Codeforces Round 52F(树形DP,VECTOR)

    #include<bits/stdc++.h>using namespace std;int n,k;vector<int>son[1000007];int dp[100000 ...

  4. 洛谷P1034 矩形覆盖

    P1034 矩形覆盖 题目描述 在平面上有 n 个点(n <= 50),每个点用一对整数坐标表示.例如:当 n=4 时,4个点的坐标分另为:p1(1,1),p2(2,2),p3(3,6),P4( ...

  5. this a sao

    我就是来doubi的,顺便分享一下笔记,欢迎( ̄ε(# ̄)

  6. [SCOI2007]修车 费用流 BZOJ 1070

    题目描述 同一时刻有N位车主带着他们的爱车来到了汽车维修中心.维修中心共有M位技术人员,不同的技术人员对不同的车进行维修所用的时间是不同的.现在需要安排这M位技术人员所维修的车及顺序,使得顾客平均等待 ...

  7. POJ1016 Numbers That Count

    题目来源:http://poj.org/problem?id=1016 题目大意: 对一个非负整数定义一种运算(inventory):数这个数中各个数字出现的次数,然后按顺序记录下来.比如“55531 ...

  8. 关于JSON可能出现的错误,待更/todo

    今天写到webAppService.js的时候,用fs模块调用json,发现单引号的json被警告了. json就是一段有格式的字符串,如果数据的封装与解析都是我们自己做的时候,单引号和双引号是没啥关 ...

  9. 【ACM】最少乘法次数 - 树

    最少乘法次数 时间限制:1000 ms  |  内存限制:65535 KB 难度:3   描述 给你一个非零整数,让你求这个数的n次方,每次相乘的结果可以在后面使用,求至少需要多少次乘.如24:2*2 ...

  10. 【转】grunt动态生成文件名

    动态生成文件名 expand 设置为true打开以下选项 cwd 所有src指定的文件相对于这个属性指定的路径 src 要匹配的路径,相对与cwd dest 生成的目标路径前缀 ext 替换所有生成的 ...