CloudCompare:Plugins插件功能的调用

1、引言

CloudCompare作为一款强大的点云与网格处理系统,提供了很多插件功能。

2、问题

在CMake时勾选了很多插件功能,但是生成后的Plugins是灰色无法使用的。

3、思考

这个问题也是CloudCompare机制的亮点之一。在此引用某大佬的话:“1)cmake只是生成可以供各种ide编译的工程文件 并不是生成插件dll; 2)生成了插件dll 要查看输出目录是否正确 vs的工程默认输出的插件dll exe是找不到的 要放到同一目录下 把dll放到plugins目录下 这个目录是exe默认搜索dll的位置。”

4、发现

(1)首先查看CloudCompare安装目录下有plugins文件夹,里面存在很多插件功能的dll;

(2)然后查看源码mainwindow.cpp中的函数:ccPluginInterface* MainWindow::getValidPlugin(QObject* plugin)、
void MainWindow::loadPlugins()、bool MainWindow::dispatchPlugin(QObject *plugin)。

其中很重要的是一句话:m_pluginsPath = QCoreApplication::applicationDirPath()+QString("/plugins");

也就是说需要读取CloudCompare生成目录下的plugins目录里面的dll,获取插件功能。

//部分代码已删除
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());

	//plugins are in bin/plugins
	m_pluginsPath = QCoreApplication::applicationDirPath()+QString("/plugins");

	ccConsole::Print(QString("Plugins lookup dir.: %1").arg(m_pluginsPath));

	QStringList filters;
	filters << "*.dll";

	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 = 0;
				ccConsole::Warning("\tUnsupported or invalid plugin type");
			}
		}
		else
		{
			delete plugin;
			plugin = 0;
			ccConsole::Warning(QString("[Plugin] %1")/*.arg(pluginsDir.absoluteFilePath(filename))*/.arg(loader.errorString()));
		}
	}
}

5、解决

以qRANSAC_SD为例

在CloudCompare的build位置\qCC\Release目录下新建文件夹plugins

将CC的build位置\plugins\qRANSAC_SD\Release\QRANSAC_SD_PLUGIN.dll

复制到CC的build位置\qCC\Release\plugins目录下

发布了63 篇原创文章 · 获赞 58 · 访问量 8万+

猜你喜欢

转载自blog.csdn.net/xinjiang666/article/details/101396664