[CC]CC插件初探
应用程序插件框架的内容包括:主程序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插件初探的更多相关文章
- PHOTOSHOP CC 2015插件安装方法
收到很多评论说不能安装.抱歉,这里解释一下,不是所有插件都能用这个方法,安装不了的只能等插件更新了,这里只是给大家一个尝试的方法,有一些插件可以用这个方法安装. 试试嘛,如果懒得试,可以忽略这篇文章. ...
- GCC/gcc/g++/CC/cc区别
平常在Linux上经常会用到gcc或者g++来编译程序,但对这两者的理解也就停留在一个是用来编译C程序,另一个是用来编译C++程序的(请注意:这种说法是有问题的,待会改进). 1. GCC GCC,是 ...
- zTree和SweetAlert插件初探
1.zTree插件简介 zTree是一个依靠 jQuery实现的多功能“树插件”.优异的性能.灵活的配置.多种功能的组合是zTree最大优点.专门适合项目开发,尤其是树状菜单.树状数据的Web显示.权 ...
- VSCODE 插件初探
写在前面 分享一个vscode插件background(用于改变背景).点击直接跳到vscode插件开发步骤 做vscode的插件,很久就有这个想法了,但是一直因为这样,那样的事情耽误,放弃了N次.不 ...
- jQuery 图片剪裁插件初探之 Jcrop
主页:http://deepliquid.com/content/Jcrop.html 官方下载地址:http://deepliquid.com/content/Jcrop_Download.html ...
- MAC下pyenv和pyenv-virtualenv插件初探
为什么会使用pyenv和pyenv-virtualenv插件 一般mac自带一个python版本,称为系统版本.对于开发者而言,肯定不够用啦.所以需要在同一个mac上组建不同的开发环境并且不会冲突. ...
- Lua编写wireshark插件初探——解析Websocket上的MQTT协议
一.背景 最近在做物联网流量分析时发现, App在使用MQTT协议时往往通过SSL+WebSocket+MQTT这种方式与服务器通信,在使用SSL中间人截获数据后,Wireshark不能自动解析出MQ ...
- highcharts图表插件初探
转载请注明出处:http://www.cnblogs.com/liubei/p/highchartsOption.html HighCharts简介 Highcharts 是一个用纯JavaScrip ...
- 解剖Nginx·自动脚本篇(6)编译器名称变量脚本 auto/cc/name
回顾变量 CC 最初是在auto/options脚本中初始化的: CC=${CC:-gcc} 1 C Compiler 的 feature Windows 平台的编译器叫做MSVC,其他平台的都统称为 ...
随机推荐
- windows 下安装Yii2 高级版本
1. 首先安装 Composer 2. 执行 composer global require "fxp/composer-asset-plugin:~1.1.1" 3. 执行 ...
- SVN 树冲突的解决方法(Ubuntu 环境)
今天在 服务器上(Ubuntu) svn up 更新的时候,出现了 SVN 树冲突 root@futongdai:~# cd /home/wwwroot/newcrm.ofim.com/ root@f ...
- css修改,类似elememt.style样式修改
使用!important 语法优先权. .yui-b { margin-left:0px ! important; }
- Win2008R2 zip格式mysql 安装与配置
一.百度mysql5.6 ZIP 64位免安装版 下载好后 解压到D盘下 二.可以考虑修改my.ini里面的配置 character-set-server=utf8 这句是编码格式设定 ...
- he time that it takes to bring a block from disk into main memory
DATABASE SYSTEM CONCEPTS, SIXTH EDITION There is a trade-off that the system designer must make betw ...
- 02/07/2106 @ 6:28am (UTC)
<?php echo pow(2,32); 4294967296 http://www.unixtimestamp.com/index.php 4294967296 Is equivalent ...
- Off-heap Memory in Apache Flink and the curious JIT compiler
https://flink.apache.org/news/2015/09/16/off-heap-memory.html Running data-intensive code in the J ...
- Lazarus for Raspbian安装
春节前看到树莓派 2代开始销售,第一时间在淘宝下单购买,无奈春节期间放假,要到3月份才可能收到,只能用QEMU模拟器先熟悉树莓系统.对从turbo Pascal开始的人来讲,如果能在树莓系统使用Pas ...
- DevExpress的所有功能介绍
https://www.devexpress.com/Subscriptions/New-2016-2.xml?utm_source=AnnounceTry&utm_medium=WhatsN ...
- Asp.Net MVC 路由
原文链接:http://www.asp.net/learn/mvc/ 在这篇教程中,我将为你介绍每个ASP.NET MVC应用程序都具有的一个重要功能,称作ASP.NET路由(ASP.NET Rout ...