Cloudcompare添加插件详细演示

Cloudcompare添加插件详细演示

前置要求:(我使用的版本如下)
Qt5.9.0
CMake3.19
VS2019
Cloudcompare源码(这里我使用的是v2.11.0)

1.看大佬的视频教程(链接🔗

《10分钟学会CloudCompare二次开发》实际上,我搞了一天😄。
其实李学长讲的很详细了。这篇文档主要手把手教。在这里插入图片描述

2.下载待安装的插件,并摆放到正确位置(如视频中示例的“缺”切割插件或者其他,也可以用示例插件来尝试)

Plugin"缺“
在这里插入图片描述
插件文件夹需要放在Cloudcompare源码目录,plugins->core->Standard中,插件一般都放这里面的。在这里插入图片描述在这里插入图片描述
CloudCompare插件一般都是以下形式:
在这里插入图片描述
这里写了一个简单的,输出”HellowWorld“的插件示例,可以复制下面的代码作为尝试,建立相应的文件(文件名一定要正确)
TestPlugin.png是logo图标,需要新建一个images文件,把该logo文件放进去。
TestPlugin.h

#ifndef TestPlugin_PLUGIN_HEADER
#define TestPlugin_PLUGIN_HEADER

#include "ccStdPluginInterface.h"

class TestPlugin : public QObject, public ccStdPluginInterface
{
	Q_OBJECT
	Q_INTERFACES(ccStdPluginInterface)
	Q_PLUGIN_METADATA(IID "cccorp.cloudcompare.plugin.TestPlugin" FILE "info.json")

public:

	//! Default constructor
	explicit TestPlugin(QObject* parent = nullptr);

	virtual ~TestPlugin() = default;
	
	//inherited from ccStdPluginInterface
	virtual void onNewSelection(const ccHObject::Container& selectedEntities) override;
	virtual QList<QAction *> getActions() override;

protected slots:

	//! Slot called when associated ation is triggered
	void doAction();

protected:

	//! Associated action
	QAction* m_action;
};

#endif //TestPlugin_PLUGIN_HEADER

TestPlugin.cpp

#include "TestPlugin.h"

//qCC_db
#include <ccPointCloud.h>

//Qt
#include <QMainWindow>
#include <QProgressDialog>

//system
#include <assert.h>

TestPlugin::TestPlugin(QObject* parent)
	: QObject(parent)
	, ccStdPluginInterface( ":/CC/plugin/TestPlugin/info.json" )
	, m_action( nullptr )
{
}

void TestPlugin::onNewSelection(const ccHObject::Container& selectedEntities)
{
	//此处设置是否需要有点云时激活插件
	if (m_action)
	{
		for (ccHObject* entity : selectedEntities)
		{
			//if we have found at least one cloud
			if (entity && entity->isA(CC_TYPES::POINT_CLOUD))
			{
				m_action->setEnabled(true);
				return;
			}
		}
		//no cloud?
		m_action->setEnabled(true);// 为True则不需要点云也可以激活插件,为false则需要点云才可以激活插件

	}

}

QList<QAction *> TestPlugin::getActions()
{
	//default action
	if (!m_action)
	{
		m_action = new QAction(getName(),this);
		m_action->setToolTip(getDescription());
		m_action->setIcon(getIcon());
		//connect signal
		connect(m_action, &QAction::triggered, this, &TestPlugin::doAction);
	}

	return QList<QAction *>{ m_action };
}

//persistent settings during a single session
// CoamingMeasurmentDialog::Parameters s_params;

void TestPlugin::doAction()
{
	
	ccLog::LogMessage("hello",1);//这里设置TestPlugin点击一下,日志栏输出hello字样
    m_app->dispToConsole("[TestPlugin] Hello world!", ccMainAppInterface::STD_CONSOLE_MESSAGE);
	//currently selected entities parameters may have changed!
	//m_app->updateUI();
	//currently selected entities appearance may have changed!
	//m_app->refreshAll();
}

TestPlugin.qrc

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

info.json

{
    "type" : "Standard",
	"core" : true,
    "name" : "TestPlugin",
    "icon" : ":/CC/plugin/TestPlugin/images/TestPlugin.png",
    "description": "",
    "authors" : [
        {
            "name" : "",
            "email" : ""
        }
    ],
    "maintainers" : [
        {
            "name" : "",
            "email" : ""
        }
    ],
    "references" : [
        {
            "text": "\" \"<br/>
                Talk by Alexandre Boulch &amp; Renaud Marlet at the Symposium of Geometry Processing, 2016",
            "url" : ""
        },
      {
        "text": "TestPlugin library",
        "url": ""
      },
      {
        "text": "Documentation",
        "url": ""
      }
    ]
}

CMakeLists.txt

cmake_minimum_required(VERSION 3.0)

option( PLUGIN_STANDARD_TestPlugin "Check to install TestPlugin plugin" ON )


if (PLUGIN_STANDARD_TestPlugin)

	project( TestPlugin )
	include( ../../../CMakePluginTpl.cmake )
	target_link_libraries( ${PROJECT_NAME} )
	target_link_libraries( ${PROJECT_NAME} ${OPENGL_LIBRARIES} )
endif()

注意!!!
Standard目录下的这个CMakeLists.txt中要加上插件的名字***(不然CMAKE不出来)***
在这里插入图片描述

2.打开CMake GUI设置源代码和输出文件路径!

在这里插入图片描述
点击Configure,进行配置,会出现上述情况。
(一般来说不会出问题,出问题的话网上找一下)
点开Ungrouped Entries
在这里插入图片描述
把QT5_ROOT_TESTING的mingw53_32路径给加上去。
然后,打开PLUGIN------>勾上要编译的插件
在这里插入图片描述
这里我们勾上了PLUGIN_STANDRAND_TestPlugin和Plugin_IMCOMPLETE和其他,点击生成Generate按钮。
如果遇到缺少CMakePluginTpl.cmake这个的报错,
这里提供了CMakePluginTpl.cmake如下,用txt搞一下,放在该路径下。

### DEFAULT CC "STANDARD" PLUGIN CMAKE SCRIPT ###

include( CMakePolicies NO_POLICY_SCOPE )

include_directories( ${CMAKE_CURRENT_SOURCE_DIR} )
include_directories( ${CMAKE_CURRENT_BINARY_DIR} )
include_directories( ${CloudComparePlugins_SOURCE_DIR} )
include_directories( ${CloudCompare_SOURCE_DIR}/../common )
include_directories( ${CC_CORE_LIB_SOURCE_DIR}/include )
include_directories( ${CC_FBO_LIB_SOURCE_DIR}/include )
include_directories( ${QCC_IO_LIB_SOURCE_DIR} )
include_directories( ${QCC_DB_LIB_SOURCE_DIR} )
if( MSVC )
    include_directories( ${QCC_DB_LIB_SOURCE_DIR}/msvc )
endif()
include_directories( ${QCC_GL_LIB_SOURCE_DIR} )
include_directories( ${EXTERNAL_LIBS_INCLUDE_DIR} )

file( GLOB header_list *.h)
file( GLOB source_list *.cpp)

# force link with interface implementations
list( APPEND source_list ${CloudComparePlugins_SOURCE_DIR}/ccDefaultPluginInterface.cpp )

file( GLOB json_list *.json)
file( GLOB ui_list *.ui )
file( GLOB qrc_list *.qrc )
file( GLOB rc_list *.rc )

if ( CC_PLUGIN_CUSTOM_HEADER_LIST )
    list( APPEND header_list ${CC_PLUGIN_CUSTOM_HEADER_LIST} )
endif()

if ( CC_PLUGIN_CUSTOM_SOURCE_LIST )
    list( APPEND source_list ${CC_PLUGIN_CUSTOM_SOURCE_LIST} )
endif()

if (CC_PLUGIN_CUSTOM_UI_LIST)
    list( APPEND ui_list ${CC_PLUGIN_CUSTOM_UI_LIST} )
endif()


qt5_wrap_ui( generated_ui_list ${ui_list} )
qt5_add_resources( generated_qrc_list ${qrc_list} )

add_library( ${PROJECT_NAME} SHARED ${header_list} ${source_list} ${moc_list} ${generated_ui_list} ${generated_qrc_list} ${json_list} )

# Add custom default preprocessor definitions
if (OPTION_GL_QUAD_BUFFER_SUPPORT)
	target_compile_definitions( ${PROJECT_NAME} PRIVATE CC_GL_WINDOW_USE_QWINDOW )
endif()

# Plugins need the QT_NO_DEBUG preprocessor in release!
if( WIN32 )
	target_compile_definitions( ${PROJECT_NAME} PRIVATE $<$<CONFIG:Release>:QT_NO_DEBUG> )
endif()

target_link_libraries( ${PROJECT_NAME}
	CC_FBO_LIB
	CC_CORE_LIB
	QCC_DB_LIB
	QCC_IO_LIB
	QCC_GL_LIB )

# Qt
target_link_libraries(${PROJECT_NAME} Qt5::Core Qt5::Gui Qt5::Widgets Qt5::OpenGL Qt5::Concurrent)

if( APPLE )
    # put all the plugins we build into one directory
    set( PLUGINS_OUTPUT_DIR "${CMAKE_BINARY_DIR}/ccPlugins" )

    file( MAKE_DIRECTORY "${PLUGINS_OUTPUT_DIR}" )

    set_target_properties( ${PROJECT_NAME}
        PROPERTIES
        LIBRARY_OUTPUT_DIRECTORY "${PLUGINS_OUTPUT_DIR}"
    )

    install( TARGETS ${PROJECT_NAME} LIBRARY DESTINATION ${CLOUDCOMPARE_MAC_PLUGIN_DIR} COMPONENT Runtime )
    set( CLOUDCOMPARE_PLUGINS ${CLOUDCOMPARE_PLUGINS} ${CLOUDCOMPARE_MAC_PLUGIN_DIR}/lib${PROJECT_NAME}${CMAKE_SHARED_LIBRARY_SUFFIX} CACHE INTERNAL "CloudCompare plugin list")
  elseif( UNIX )
    install_shared( ${PROJECT_NAME} ${CMAKE_INSTALL_LIBDIR}/cloudcompare/plugins 0 )
  else()
    install_shared( ${PROJECT_NAME} ${CLOUDCOMPARE_DEST_FOLDER} 1 /plugins )
endif()

#GL filters and IO plugins also go the the ccViewer 'plugins' sub-folder
if( ${OPTION_BUILD_CCVIEWER} )
    if( CC_SHADER_FOLDER OR CC_IS_IO_PLUGIN )
        if( APPLE )
            install( TARGETS ${PROJECT_NAME} LIBRARY DESTINATION ${CCVIEWER_MAC_PLUGIN_DIR} COMPONENT Runtime )
            set( CCVIEWER_PLUGINS ${CCVIEWER_PLUGINS} ${CCVIEWER_MAC_PLUGIN_DIR}/lib${PROJECT_NAME}${CMAKE_SHARED_LIBRARY_SUFFIX} CACHE INTERNAL "ccViewer plugin list")
        elseif( UNIX )
          install_shared( ${PROJECT_NAME} ${CMAKE_INSTALL_LIBDIR}/cloudcompare/plugins 0 )
        else()
          install_shared( ${PROJECT_NAME} ${CCVIEWER_DEST_FOLDER} 1 /plugins )
        endif()
    endif()
endif()

#'GL filter' plugins specifics
if( CC_SHADER_FOLDER )
	# copy shader dirs into our shadow build directory
	file( COPY shaders DESTINATION "${CMAKE_BINARY_DIR}" )

	# install the shader files
    file( GLOB shaderFiles shaders/${CC_SHADER_FOLDER}/*.frag shaders/${CC_SHADER_FOLDER}/*.vert )
    foreach( filename ${shaderFiles} )
        if( APPLE )
            install( FILES ${filename} DESTINATION ${CLOUDCOMPARE_MAC_BASE_DIR}/Contents/Shaders/${CC_SHADER_FOLDER} )
            if( ${OPTION_BUILD_CCVIEWER} )
                install( FILES ${filename} DESTINATION ${CCVIEWER_MAC_BASE_DIR}/Contents/Shaders/${CC_SHADER_FOLDER} )
            endif()
        elseif ( UNIX )
          install( FILES ${filename} DESTINATION share/cloudcompare/shaders/${CC_SHADER_FOLDER} )
        else()
            install_ext( FILES ${filename} ${CLOUDCOMPARE_DEST_FOLDER} /shaders/${CC_SHADER_FOLDER} )
            if( ${OPTION_BUILD_CCVIEWER} )
                install_ext( FILES ${filename} ${CCVIEWER_DEST_FOLDER} /shaders/${CC_SHADER_FOLDER} )
            endif()
        endif()
    endforeach()
endif()

### END OF DEFAULT CC PLUGIN CMAKE SCRIPT ###

正常来说不会有其他问题了,有的话网上查一下。

Generate后,打开生成目录中的CloudCompareProjects.sln。

在这里插入图片描述
在这里插入图片描述
Cloudcompare右键设置为启动项项,用Release/x64生成一下,然后右键再生成一下qlmcompareTestPlugin两个插件。
比较慢,需要耐心等待。
生成完毕后…/qCC/Release下会生成Cloudcompare.exe,双击运行,会报错,缺少一些.dll文件:QCC_IO_LIB.dll,QCC_DB_LIB.dll,CC_CORE_LIB.dll等,应该就是这三个,在上qcc目录中进行搜索,然后复制到与Cloudcompare.exe的同级目录。
然后,再运行试试,我这里报了Qt相关的错误,Cloudn’t find Qt ”Windows“Platform等,在网上搜索知:
在这个目录下,按住Shift+右键,打开Powershell:
输入windeployqt.exe CloudCompare.exe,qt的依赖会自己找到依赖放进来,挺神奇的。
然后在打开CloudCompare.exe,应该就正常了,此时进去Plugin是灰色的。
**

添加插件

在cloudcompare.exe目录下,新建文件夹plugins,放进去插件中Release下的.dll文件。例如我的:F:\CloudCompare-2.11.0\BIN\plugins\core\Standard\qImcomplete\Release
在这里插入图片描述
放进去以后,如下:
在这里插入图片描述
然后,再打开cloudcompare.exe,发现插件已经可以用了!!!!
在这里插入图片描述
qlcomplete效果
Hellow world!!
至此,完成了我们的工作,其他插件也是如此,一定要记得再vs里编译cloudcompare,不然,安装了插件以后,也用不了!!!!
会安装了,下一步学习如何二次开发吧😃
鸣谢:李学长的直播分享以及代码!!!!!!!
参考:
[1]: https://blog.csdn.net/ermzdy2/article/details/98726482

评论 20
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值