自定义开发CloudCompare插件

选择插件类型

CloudCompare支持三种类型的插件:

  1. 标准插件:添加新的处理工具。
  2. IO插件:增加对新文件格式的读写能力。
  3. GL插件:对OpenGL渲染过程进行操作或改善。

根据希望插件实现的功能,从plugins/example目录中选择一个相应的模板。通常使用标准插件模板即可。

重命名和设置

复制模板后,需要进行一系列重命名操作,包括但不限于插件目录、类名、文件名等。这一步骤是为了避免与现有的插件或CloudCompare的核心代码冲突,并确保插件能够被正确识别和构建。

  • 目录和文件命名:使用小写字母开头的文件名,类名前加cc前缀等。
  • 更新CMakeLists.txt:修改CMake配置,确保您的插件能够被正确编译。
  • 编辑info.json:更新插件的信息文件,包括插件名、版本、描述等。

一个例子:

假设我们的自定义插件命名为qElementPickup,以此为例进行说明:

在plugins/core/Standard/CMakeLists.txt添加如下内容:

add_subdirectory( qElementPickup )

修改文件夹名为qElementPickup

修改ExamplePlugin.h、ExamplePlugin.cpp、为qElementPickup.h、qElementPickup.cpp,删除ActionA.h和ActionA.cpp

其中qElementPickup.h内容修改后如下:

#pragma once

#include "ccStdPluginInterface.h"

class qElementPickup : public QObject, public ccStdPluginInterface
{
	Q_OBJECT
	Q_INTERFACES( ccPluginInterface ccStdPluginInterface )

	// info.json文件向加载系统提供有关插件的信息,并显示在插件信息对话框中。
	Q_PLUGIN_METADATA( IID "cccorp.cloudcompare.plugin.qElementPickup" FILE "../info.json" )

public:
	explicit qElementPickup( QObject *parent = nullptr );
	~qElementPickup() override = default;

	// 继承自ccStdPluginInterface
	void onNewSelection( const ccHObject::Container &selectedEntities ) override;
	QList<QAction *> getActions() override;

protected:
	//! 触发关联操作时调用的插槽
	void doAction();

private:
	/** 可以在插件中添加任意数量的操作。每个动作将对应于专用中的一个图标工具栏和插件菜单中的一个条目。
	**/
	QAction* m_action;
};

内容修改后如下:

#include <QtGui>

#include "qElementPickup.h"


//	- 将Qt资源路径传递到info.json文件(来自qElementPickup.qrc文件)
qElementPickup::qElementPickup( QObject *parent )
	: QObject( parent )
	, ccStdPluginInterface( ":/CC/plugin/qElementPickup/info.json" )
	, m_action( nullptr )
{
}

// 此方法应启用或禁用插件操作
// 取决于当前选定的实体(“选定实体”)。
void qElementPickup::onNewSelection( const ccHObject::Container &selectedEntities )
{
	if ( m_action == nullptr )
	{
		return;
	}
	
	// 例如-仅当选择了某个内容时才启用我们的操作。
	m_action->setEnabled( !selectedEntities.empty() );
}

// 此方法返回插件可以执行的所有“操作”。
// 加载插件时,getActions()将只调用一次。
QList<QAction *> qElementPickup::getActions()
{
	// 默认操作(如果尚未创建,则此时执行)
	if ( !m_action )
	{
		// 这里使用默认的插件名称、描述和图标,
		m_action = new QAction( getName(), this );
		m_action->setToolTip( getDescription() );
		m_action->setIcon( getIcon() );
		
		// 连接信号
		connect( m_action, &QAction::triggered, this, &qElementPickup::doAction );
	}

	return { m_action };
}

/**
 * 在CC的主界面中点击相应的图标或菜单项调用的动作方法。可以通过“m_app”变量访问CC的大部分组件(数据库、三维视图、控制台等)。
 * 此方法将在主线程中调用,因此可以安全地访问CC的所有组件。
 */
void qElementPickup::doAction()
{
	if ( m_app == nullptr )
	{
		// 加载插件时,应用程序接口应该已经初始化
		Q_ASSERT( false );

		return;
	}

	/*** 这里开始具体处理 ***/

	// TODO: Put your code here
	// --> 比如获取参数(使用自定义对话框等)

	// 输出消息的方式
	// 在控制台中显示标准消息
	m_app->dispToConsole( "[qElementPickup] Hello world!", ccMainAppInterface::STD_CONSOLE_MESSAGE );

	// 在控制台中显示警告消息
	m_app->dispToConsole( "[qElementPickup] Warning: qElementPickup plugin shouldn't be used as is", ccMainAppInterface::WRN_CONSOLE_MESSAGE );

	// 在控制台中显示错误消息并弹出错误框
	m_app->dispToConsole( "qElementPickup plugin shouldn't be used - it doesn't do anything!", ccMainAppInterface::ERR_CONSOLE_MESSAGE );

	/*** 结束处理 ***/
}

修改plugins/core/Standard/qElementPickup/CMakeLists.txt为如下内容:

# Add an option to CMake to control whether we build this plugin or not
option( PLUGIN_STANDARD_ELEMENTPICKUP "Check to install qElementPickup plugin" OFF )

if ( PLUGIN_STANDARD_ELEMENTPICKUP )
	project( QELEMENTPICKUP_PLUGIN )
	 
	AddPlugin( NAME ${PROJECT_NAME} )
		
	add_subdirectory( include )
	add_subdirectory( src )
	
	# set dependencies to necessary libraries
	# target_link_libraries( ${PROJECT_NAME} LIB1 )
endif()

修改plugins/core/Standard/qElementPickup/include/CMakeLists.txt为如下内容:

target_sources( ${PROJECT_NAME}
	PRIVATE
        ${CMAKE_CURRENT_LIST_DIR}/qElementPickup.h
)

target_include_directories( ${PROJECT_NAME}
	PRIVATE
		${CMAKE_CURRENT_SOURCE_DIR}
)

修改plugins/core/Standard/qElementPickup/src/CMakeLists.txt为如下内容:


target_sources( ${PROJECT_NAME}
	PRIVATE
		${CMAKE_CURRENT_LIST_DIR}/qElementPickup.cpp
)

修改plugins/core/Standard/qElementPickup/info.json为如下内容:

{
	"type" : "Standard",
	"name" : "element pickup (Standard Plugin)",
	"icon" : ":/CC/plugin/qElementPickup/images/icon.png",
	"description": "element pickup plugin.",
	"authors" : [
		{
			"name" : "karmueo",
			"email" : "karmueo@163.com"
		}
	],
	"maintainers" : [
		{
			"name" : "karmueo",
			"email" : "karmueo@163.com"
		}
	]
}

修改 ExamplePlugin.qrc为qElementPickup.qrc,并修改其中的内容如下:

<RCC>
  <qresource prefix="/CC/plugin/qElementPickup" >
    <file>images/icon.png</file>
    <file>info.json</file>
  </qresource>
</RCC>

编译,记得编译时勾选我们自定义插件选项,安装运行后可以看到添加的插件出现在菜单Plugins中:

点击插件出现对话框:

在控制台可以看到我们输出的信息:

  • 16
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
您好!对于CloudCompare的二次开发,您可以使用CloudCompare提供的插件和扩展机制来扩展其功能。CloudCompare是一个功能强大的开源点云和三维几何处理软件,它提供了一些开发接口和文档供开发者使用。 首先,您可以通过使用CloudCompare的Python接口来进行二次开发CloudCompare提供了一组Python库,您可以使用这些库来访问和处理点云数据,执行各种操作,甚至创建自定义插件。您可以查阅CloudCompare的Python文档以了解更多关于使用Python进行二次开发的信息。 此外,CloudCompare还提供了一些C++开发接口,您可以使用这些接口来创建自定义插件。通过编写C++代码,您可以访问和操作点云数据,并将您的功能集成到CloudCompare的界面中。您可以参考CloudCompareC++编程指南以及示例代码来学习如何使用这些接口进行开发。 除了Python和C++接口之外,CloudCompare还支持使用脚本语言(如JavaScript和Lua)进行二次开发。您可以编写脚本来执行各种任务,例如数据处理、可视化等。这些脚本可以直接在CloudCompare中运行,或者作为插件的一部分进行加载和执行。 总结来说,CloudCompare提供了多种方式来进行二次开发,包括Python、C++和脚本语言。您可以根据自己的需求和熟悉程度选择合适的开发方式,并利用CloudCompare的功能丰富的API和文档来实现您的定制化需求。希望这些信息对您有所帮助!如有更多问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值