应用程序插件框架的内容包括:主程序App,插件Plugin。

1、实现一个应用程序插架框架关键点有:

一个插件的标准接口,在主程序中存在一个插件的集合。主程序通过循环读取每个插件,将插件对象通过多态的机制转换为插件接口,实现插件的装载。

主程序对象或者主程序接口需要作为参数传递到插件对象中,以方便插件对象调用主程序的内容,如主视图、工具栏、树视图、状态栏等。

2、开源点云处理软件CloudCompare也是一个插件框架,因此也必然包括这些内容。

  插件接口:ccPluginInterface,每个插件对象有在ccPluginInterface基础上定义了一个新的接口类class ccStdPluginInterface : public ccPluginInterface

      具体的插件则继承自ccStdPluginInterface 累,比如这样,class qMyPlugin : public QObject, public ccStdPluginInterface

  主程序对象:class ccMainAppInterface,MainWindow主窗体类实现了ccMainAppInterface接口。

      MainWindow::loadPlugins()方法负责插件的调用。(mainwindow.cpp文件中)

 void MainWindow::loadPlugins()
{
menuPlugins->setEnabled(false);
menuShadersAndFilters->setEnabled(false);
toolBarPluginTools->setVisible(false);
toolBarGLFilters->setVisible(false); //"static" plugins
foreach (QObject *plugin, QPluginLoader::staticInstances())
dispatchPlugin(plugin); ccConsole::Print(QString("Application path: ")+QCoreApplication::applicationDirPath()); #if defined(Q_OS_MAC)
// plugins are in the bundle
QString path = QCoreApplication::applicationDirPath();
path.remove( "MacOS" );
m_pluginsPath = path + "Plugins/ccPlugins";
#else
//plugins are in bin/plugins
m_pluginsPath = QCoreApplication::applicationDirPath()+QString("/plugins");
#endif ccConsole::Print(QString("Plugins lookup dir.: %1").arg(m_pluginsPath)); QStringList filters;
#if defined(Q_OS_WIN)
filters << "*.dll";
#elif defined(Q_OS_LINUX)
filters << "*.so";
#elif defined(Q_OS_MAC)
filters << "*.dylib";
#endif
QDir pluginsDir(m_pluginsPath);
pluginsDir.setNameFilters(filters);
foreach (QString filename, pluginsDir.entryList(filters))
{
QPluginLoader loader(pluginsDir.absoluteFilePath(filename));
QObject* plugin = loader.instance();
if (plugin)
{
ccConsole::Print(QString("Found new plugin: '%1'").arg(filename));
if (dispatchPlugin(plugin))
{
m_pluginFileNames += filename;
}
else
{
delete plugin;
plugin = ;
ccConsole::Warning("\tUnsupported or invalid plugin type");
}
}
else
{
delete plugin;
plugin = ;
ccConsole::Warning(QString("[Plugin] %1")/*.arg(pluginsDir.absoluteFilePath(filename))*/.arg(loader.errorString()));
}
} if (menuPlugins)
{
menuPlugins->setEnabled(!m_stdPlugins.empty());
} if (toolBarPluginTools->isEnabled())
{
actionDisplayPluginTools->setEnabled(true);
actionDisplayPluginTools->setChecked(true);
}
else
{
//DGM: doesn't work :(
//actionDisplayPluginTools->setChecked(false);
} if (toolBarGLFilters->isEnabled())
{
actionDisplayGLFiltersTools->setEnabled(true);
actionDisplayGLFiltersTools->setChecked(true);
}
else
{
//DGM: doesn't work :(
//actionDisplayGLFiltersTools->setChecked(false);
}
}

      主程序在加载插件时会调用插件的setMainAppInterface方法,将主程序参数传入,这样插件就可以获取主程序的内容了。

 //! Sets application entry point
/** Called just after plugin creation by qCC
**/
virtual void setMainAppInterface(ccMainAppInterface* app);

3、获取主窗体中的点云图层

在doAction中的代码:

     const ccHObject::Container& selectedEntities = m_app->getSelectedEntities();
size_t selNum = selectedEntities.size();
if (selNum!=)
{
m_app->dispToConsole("Select only one cloud!",ccMainAppInterface::ERR_CONSOLE_MESSAGE);
return;
} ccHObject* ent = selectedEntities[];
assert(ent);
if (!ent || !ent->isA(CC_TYPES::POINT_CLOUD))
{
m_app->dispToConsole("Select a real point cloud!",ccMainAppInterface::ERR_CONSOLE_MESSAGE);
return;
} ccPointCloud* pc = static_cast<ccPointCloud*>(ent); //input cloud
unsigned count = pc->size();
bool hasNorms = pc->hasNormals();
CCVector3 bbMin, bbMax;
pc->getBoundingBox(bbMin,bbMax);
const CCVector3d& globalShift = pc->getGlobalShift();
double globalScale = pc->getGlobalScale();

[CC]CC插件初探的更多相关文章

  1. PHOTOSHOP CC 2015插件安装方法

    收到很多评论说不能安装.抱歉,这里解释一下,不是所有插件都能用这个方法,安装不了的只能等插件更新了,这里只是给大家一个尝试的方法,有一些插件可以用这个方法安装. 试试嘛,如果懒得试,可以忽略这篇文章. ...

  2. GCC/gcc/g++/CC/cc区别

    平常在Linux上经常会用到gcc或者g++来编译程序,但对这两者的理解也就停留在一个是用来编译C程序,另一个是用来编译C++程序的(请注意:这种说法是有问题的,待会改进). 1. GCC GCC,是 ...

  3. zTree和SweetAlert插件初探

    1.zTree插件简介 zTree是一个依靠 jQuery实现的多功能“树插件”.优异的性能.灵活的配置.多种功能的组合是zTree最大优点.专门适合项目开发,尤其是树状菜单.树状数据的Web显示.权 ...

  4. VSCODE 插件初探

    写在前面 分享一个vscode插件background(用于改变背景).点击直接跳到vscode插件开发步骤 做vscode的插件,很久就有这个想法了,但是一直因为这样,那样的事情耽误,放弃了N次.不 ...

  5. jQuery 图片剪裁插件初探之 Jcrop

    主页:http://deepliquid.com/content/Jcrop.html 官方下载地址:http://deepliquid.com/content/Jcrop_Download.html ...

  6. MAC下pyenv和pyenv-virtualenv插件初探

    为什么会使用pyenv和pyenv-virtualenv插件 一般mac自带一个python版本,称为系统版本.对于开发者而言,肯定不够用啦.所以需要在同一个mac上组建不同的开发环境并且不会冲突. ...

  7. Lua编写wireshark插件初探——解析Websocket上的MQTT协议

    一.背景 最近在做物联网流量分析时发现, App在使用MQTT协议时往往通过SSL+WebSocket+MQTT这种方式与服务器通信,在使用SSL中间人截获数据后,Wireshark不能自动解析出MQ ...

  8. highcharts图表插件初探

    转载请注明出处:http://www.cnblogs.com/liubei/p/highchartsOption.html HighCharts简介 Highcharts 是一个用纯JavaScrip ...

  9. 解剖Nginx·自动脚本篇(6)编译器名称变量脚本 auto/cc/name

    回顾变量 CC 最初是在auto/options脚本中初始化的: CC=${CC:-gcc} 1 C Compiler 的 feature Windows 平台的编译器叫做MSVC,其他平台的都统称为 ...

随机推荐

  1. 如何用JavaScript在页面上显示一个时间钟表

    <html><head><script type="text/javascript">function myTime(){var today=n ...

  2. emacs tutorial笔记

    emacs tutorial笔记---基本控制 C-字母 表示一起按下Ctrl和字母/ 表示“或者”的意思 C - ctrlM - alt C-p C-b   C-f   C-n C-l 当前行放中央 ...

  3. vim vi 及其相关插件的使用

    GIMP->linux下16位图查看工具 实用手册:130+ 提高开发效率的 vim 常用命令 http://www.cnblogs.com/lhb25/p/130-essential-vim- ...

  4. 【转载】wireshark:no interface can be used for capturing in this system with the current configuration

    转自:wireshark:no interface can be used for capturing in this system with the current configuration 通过 ...

  5. Yii源码阅读笔记(八)

    前面阅读了Yii2的两个基本类Object和Component,了解了Yii的三个重要概念属性.事件.行为,下面开始阅读Event类,Event类是所有事件类的基类: <?php /** * @ ...

  6. 20145317彭垚《Java程序设计》第3周学习总结

    20145317彭垚<Java程序设计>第3周学习总结 教材学习内容总结 第四章 4.1类与对象 4.1.1定义类: new clothes():新建一个对象. class clothes ...

  7. 来到这里,我放弃了多少- UI基础-疯狂猜图,我们都疯狂了-

    小问题也要问 学习最重要的是 自律 我昨天晚上3点睡的, 这两天一点也没睡 0.99*0.99  每天差一点 日积月累就很多了 关键字,在字典里查一下,在类里面查查 瑞详博客下载器 跑步后精神多了,白 ...

  8. von Neumann architecture

    COMPUTER ORGANIZATION AND ARCHITECTURE DESIGNING FOR PERFORMANCE NINTH EDITION 3.1 COMPUTER COMPONEN ...

  9. cascading rollback 级联回滚

    Computer Science An Overview _J. Glenn Brookshear _11th Edition To emphasize the delicate nature of ...

  10. Qt from Linux to Windows target

    45down voteaccepted Just use M cross environment (MXE). It takes the pain out of the whole process: ...