选择插件类型
CloudCompare支持三种类型的插件:
- 标准插件:添加新的处理工具。
- IO插件:增加对新文件格式的读写能力。
- 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中:
点击插件出现对话框:
在控制台可以看到我们输出的信息: