博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[CC]CC插件初探
阅读量:5798 次
发布时间:2019-06-18

本文共 4376 字,大约阅读时间需要 14 分钟。

应用程序插件框架的内容包括:主程序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文件中)

1 void MainWindow::loadPlugins() 2 { 3     menuPlugins->setEnabled(false); 4     menuShadersAndFilters->setEnabled(false); 5     toolBarPluginTools->setVisible(false); 6     toolBarGLFilters->setVisible(false); 7  8     //"static" plugins 9     foreach (QObject *plugin, QPluginLoader::staticInstances())10         dispatchPlugin(plugin);11 12     ccConsole::Print(QString("Application path: ")+QCoreApplication::applicationDirPath());13 14 #if defined(Q_OS_MAC)15     // plugins are in the bundle16     QString path = QCoreApplication::applicationDirPath();17     path.remove( "MacOS" );18     m_pluginsPath = path + "Plugins/ccPlugins";19 #else20     //plugins are in bin/plugins21     m_pluginsPath = QCoreApplication::applicationDirPath()+QString("/plugins");22 #endif23 24     ccConsole::Print(QString("Plugins lookup dir.: %1").arg(m_pluginsPath));25 26     QStringList filters;27 #if defined(Q_OS_WIN)28     filters << "*.dll";29 #elif defined(Q_OS_LINUX)30     filters << "*.so";31 #elif defined(Q_OS_MAC)32     filters << "*.dylib";33 #endif34     QDir pluginsDir(m_pluginsPath);35     pluginsDir.setNameFilters(filters);36     foreach (QString filename, pluginsDir.entryList(filters))37     {38         QPluginLoader loader(pluginsDir.absoluteFilePath(filename));39         QObject* plugin = loader.instance();40         if (plugin)41         {42             ccConsole::Print(QString("Found new plugin: '%1'").arg(filename));43             if (dispatchPlugin(plugin))44             {45                 m_pluginFileNames += filename;46             }47             else48             {49                 delete plugin;50                 plugin = 0;51                 ccConsole::Warning("\tUnsupported or invalid plugin type");52             }53         }54         else55         {56             delete plugin;57             plugin = 0;58             ccConsole::Warning(QString("[Plugin] %1")/*.arg(pluginsDir.absoluteFilePath(filename))*/.arg(loader.errorString()));59         }60     }61 62     if (menuPlugins)63     {64         menuPlugins->setEnabled(!m_stdPlugins.empty());65     }66 67     if (toolBarPluginTools->isEnabled())68     {69         actionDisplayPluginTools->setEnabled(true);70         actionDisplayPluginTools->setChecked(true);71     }72     else73     {74         //DGM: doesn't work :(75         //actionDisplayPluginTools->setChecked(false);76     }77 78     if (toolBarGLFilters->isEnabled())79     {80         actionDisplayGLFiltersTools->setEnabled(true);81         actionDisplayGLFiltersTools->setChecked(true);82     }83     else84     {85         //DGM: doesn't work :(86         //actionDisplayGLFiltersTools->setChecked(false);87     }88 }

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

1 //! Sets application entry point2 /** Called just after plugin creation by qCC3 **/4 virtual void setMainAppInterface(ccMainAppInterface* app);

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

在doAction中的代码:

1     const ccHObject::Container& selectedEntities = m_app->getSelectedEntities(); 2     size_t selNum = selectedEntities.size(); 3     if (selNum!=1) 4     { 5         m_app->dispToConsole("Select only one cloud!",ccMainAppInterface::ERR_CONSOLE_MESSAGE); 6         return; 7     } 8  9     ccHObject* ent = selectedEntities[0];10     assert(ent);11     if (!ent || !ent->isA(CC_TYPES::POINT_CLOUD))12     {13         m_app->dispToConsole("Select a real point cloud!",ccMainAppInterface::ERR_CONSOLE_MESSAGE);14         return;15     }16 17     ccPointCloud* pc = static_cast
(ent);18 19 //input cloud20 unsigned count = pc->size();21 bool hasNorms = pc->hasNormals();22 CCVector3 bbMin, bbMax;23 pc->getBoundingBox(bbMin,bbMax);24 const CCVector3d& globalShift = pc->getGlobalShift();25 double globalScale = pc->getGlobalScale();

 

转载地址:http://ltifx.baihongyu.com/

你可能感兴趣的文章
第一次作业
查看>>
ssh连接提示问题
查看>>
CentOS 7 装vim遇到的问题和解决方法
查看>>
JavaScript基础教程1-20160612
查看>>
使用第三方类、库需要注意的正则类RegexKitLite的使用
查看>>
iOS \U7ea2 乱码 转换
查看>>
FCN图像分割
查看>>
ios xmpp demo
查看>>
设计模式之-工厂模式、构造函数模式
查看>>
python matplotlib 中文显示参数设置
查看>>
数据库事务隔离级别
查看>>
os模块大全详情
查看>>
【ros】Create a ROS package:package dependencies报错
查看>>
从内积的观点来看线性方程组
查看>>
kali linux 更新问题
查看>>
HDU1576 A/B【扩展欧几里得算法】
查看>>
廖雪峰javascript教程学习记录
查看>>
WebApi系列~目录
查看>>
限制CheckBoxList控件只能单选
查看>>
Java访问文件夹中文件的递归遍历代码Demo
查看>>