点云处理,有一个出名的处理软件,cloud compare,简称 cc,将自己实现的功能以插件形式集成到 CC 里,方便使用

前提

环境:cc 2.13,qt 5.15,cmake 3.18,vs2019【其他组合也可,本文基于此展开】

能力要求:能够使用 cmake 成功编译 cc 并安装

有问题,欢迎留言、进群讨论或私聊:【群号:392784757】

CC 插件概述

CC 提供了一种插件化的二次开发方式,以插件的形式,避免了核心代码的修改,利用提供的接口,完成我们需要功能的二次开发

组织结构

cc 中的插件全都放在 源码 plugins 文件夹下

core 是 cc 已经实现的插件功能

example 是 cc 提供给我们的示例,本文也基于其中的示例进行开发我们的插件

其中 core 文件夹下,又对插件进行了划分

  • GL,基于 gl 可视化插件
  • IO ,涉及 IO 处理的插件
  • Standard ,大部分插件都属于这种

example 文件夹下也对应提供了 相应的示例插件

  • ExampleGLPlugin
  • ExampleIOPlugin
  • ExamplePlugin

本文基于其中的 ExamplePlugin 插件,也就是标准插件类型,实现一个 PCA 功能,并可视化

ExamplePlugin

images 中放置的是 icon.png

include 涉及的头文件,自己的功能头文件和用到的其他第三方的头文件

src 功能代码

ExamplePlugin.qrc,qt 组织资源的方式,提供资源的路径给代码使用

info. json,插件的描述,涉及的相关资源路径,以及开发者信息、相关资料

{
"type": "Standard",
"name": "MyTest (Standard Plugin)",
"icon": ":/CC/plugin/MyTestPlugin/images/icon.png",
"description": "This is a description of the marvelous Example plugin. It does nothing.",
"authors": [
{
"name": "xxx",
"email": "xxx"
}
],
"maintainers": [
{
"name": "yyy,
"email": "yyy@gmail.com"
},
{
"name": "zzz"
}
],
"references": [
{
"text": "xx references",
"url": "http://www.bmj.com/content/333/7582/1285"
},
{
"text": "a test plugin"
}
]
}

cmake 组织

基础的结构讲完,cc 是如何通过某种方式将插件组织起来的,答案就是 cmake

从高到低涉及的 cmakelists.txt 完成了这一任务【下面或区分两条不同路径情况,一个是放在 core\standard ,另一个是放在 example】

D:\06-source_code\CloudCompare-2.13\CMakeLists.txt

# ...

# Plugins
add_subdirectory( plugins ) # ...

D:\06-source_code\CloudCompare-2.13\plugins\CMakeLists.txt

# ...

add_subdirectory( core )
add_subdirectory( example ) # ...

D:\06-source_code\CloudCompare-2.13\plugins\core\CMakeLists.txt 【D:\06-source_code\CloudCompare-2.13\plugins\example\CMakeLists.txt】

add_subdirectory( GL )
add_subdirectory( IO )
add_subdirectory( Standard )

add_subdirectory( ${CMAKE_CURRENT_SOURCE_DIR}/ExampleGLPlugin )
add_subdirectory( ${CMAKE_CURRENT_SOURCE_DIR}/ExampleIOPlugin )
add_subdirectory( ${CMAKE_CURRENT_SOURCE_DIR}/ExamplePlugin )

D:\06-source_code\CloudCompare-2.13\plugins\core\Standard\CMakeLists.txt

add_subdirectory( qAnimation )
add_subdirectory( qBroom )
add_subdirectory( qCanupo )
add_subdirectory( qCloudLayers )
add_subdirectory( qCompass )
add_subdirectory( qCork )
add_subdirectory( qCSF )
add_subdirectory( qFacets )
add_subdirectory( qHoughNormals )
add_subdirectory( qHPR )
add_subdirectory( qM3C2 )
add_subdirectory( qPCL )
add_subdirectory( qPCV )
add_subdirectory( qPoissonRecon )
add_subdirectory( qRANSAC_SD )
add_subdirectory( qSRA )
add_subdirectory( qMeshBoolean ) #plugins integrated as submodules
set( submod_plugins
${CMAKE_CURRENT_SOURCE_DIR}/qColorimetricSegmenter
${CMAKE_CURRENT_SOURCE_DIR}/qMasonry
${CMAKE_CURRENT_SOURCE_DIR}/qMPlane
${CMAKE_CURRENT_SOURCE_DIR}/qJSonRPCPlugin
${CMAKE_CURRENT_SOURCE_DIR}/qTreeIso
${CMAKE_CURRENT_SOURCE_DIR}/q3DMASC
) foreach( dir ${submod_plugins} )
if( IS_DIRECTORY ${dir} AND EXISTS ${dir}/CMakeLists.txt )
message( STATUS "Found submodule plugin: " ${dir} )
add_subdirectory( ${dir} )
endif()
endforeach()

具体插件的 CMakeLists.txt

【D:\06-source_code\CloudCompare-2.13\plugins\core\Standard\qPCA\CMakeLists.txt】或【D:\06-source_code\CloudCompare-2.13\plugins\example\ExamplePlugin\CMakeLists.txt】

# ...

# CloudCompare example for standard plugins

# REPLACE ALL 'ExamplePlugin' OCCURENCES BY YOUR PLUGIN NAME
# AND ADAPT THE CODE BELOW TO YOUR OWN NEEDS! # Add an option to CMake to control whether we build this plugin or not
option( PLUGIN_EXAMPLE_STANDARD "Install example plugin" OFF ) if ( PLUGIN_EXAMPLE_STANDARD )
project( ExamplePlugin ) AddPlugin( NAME ${PROJECT_NAME} ) add_subdirectory( include )
add_subdirectory( src ) # set dependencies to necessary libraries
# target_link_libraries( ${PROJECT_NAME} LIB1 )
endif()

具体开发前修改

info.json

{
"type": "Standard",
"name": "PCA (Standard Plugin)",
"icon": ":/CC/plugin/qPCA/images/icon.png",
"description": "This is a description of the PCA plugin. It does nothing.",
"authors": [
{
"name": "xxx",
"email": "xxx"
}
],
"maintainers": [
{
"name": "yyy,
"email": "yyy@gmail.com"
},
{
"name": "zzz"
}
],
"references": [
{
"text": "xx references",
"url": "http://www.bmj.com/content/333/7582/1285"
},
{
"text": "a PCA plugin"
}
]
}

具体插件上一级的 CMakeLists.txt,这里是 Standard\CMakeLists.txt

add_subdirectory( qAnimation )
add_subdirectory( qBroom )
add_subdirectory( qCanupo )
add_subdirectory( qCloudLayers )
add_subdirectory( qCompass )
add_subdirectory( qCork )
add_subdirectory( qCSF )
add_subdirectory( qFacets )
add_subdirectory( qHoughNormals )
add_subdirectory( qHPR )
add_subdirectory( qM3C2 )
add_subdirectory( qPCL )
add_subdirectory( qPCV )
add_subdirectory( qPoissonRecon )
add_subdirectory( qRANSAC_SD )
add_subdirectory( qSRA )
add_subdirectory( qMeshBoolean ) # --------------------
add_subdirectory( qPCA )
# -------------------- #plugins integrated as submodules
set( submod_plugins
${CMAKE_CURRENT_SOURCE_DIR}/qColorimetricSegmenter
${CMAKE_CURRENT_SOURCE_DIR}/qMasonry
${CMAKE_CURRENT_SOURCE_DIR}/qMPlane
${CMAKE_CURRENT_SOURCE_DIR}/qJSonRPCPlugin
${CMAKE_CURRENT_SOURCE_DIR}/qTreeIso
${CMAKE_CURRENT_SOURCE_DIR}/q3DMASC
) foreach( dir ${submod_plugins} )
if( IS_DIRECTORY ${dir} AND EXISTS ${dir}/CMakeLists.txt )
message( STATUS "Found submodule plugin: " ${dir} )
add_subdirectory( ${dir} )
endif()
endforeach()

具体插件的 CMakeLists.txt, qPCA/CMakeLists.txt

# CloudCompare example for standard plugins

# REPLACE ALL 'ExamplePlugin' OCCURENCES BY YOUR PLUGIN NAME
# AND ADAPT THE CODE BELOW TO YOUR OWN NEEDS! # Add an option to CMake to control whether we build this plugin or not
# option( PLUGIN_EXAMPLE_STANDARD "Install example plugin" OFF )
option( PLUGIN_qPCA "Install example plugin" OFF ) # if ( PLUGIN_EXAMPLE_STANDARD )
if ( PLUGIN_qPCA )
# project( ExamplePlugin )
project( QPCA_PLUGIN ) # 全部大写 AddPlugin( NAME ${PROJECT_NAME} ) add_subdirectory( include )
add_subdirectory( src ) # 添加其他需要的库 set dependencies to necessary libraries
# target_link_libraries( ${PROJECT_NAME} LIB1 )
endif()

更新 ExamplePlugin 中的文件名为新插件对应的名称

ExamplePlugin.qrc ---> qPCA.qrc

ExamplePlugin.h ---> qPCA.h

ExamplePlugin.cpp ---> qPCA.cpp

src include 下的 CMakeLists.txt 更新文件名

src/CMakeLists.txt

target_sources( ${PROJECT_NAME}
PRIVATE
${CMAKE_CURRENT_LIST_DIR}/ActionA.cpp
# ${CMAKE_CURRENT_LIST_DIR}/ExamplePlugin.cpp
${CMAKE_CURRENT_LIST_DIR}/qPCA.cpp
# 其他新加文件
)

include/CMakeLists.txt

target_sources( ${PROJECT_NAME}
PRIVATE
${CMAKE_CURRENT_LIST_DIR}/ActionA.h
# ${CMAKE_CURRENT_LIST_DIR}/ExamplePlugin.h
${CMAKE_CURRENT_LIST_DIR}/qPCA.h
# 候选其他头文件也要在这添加
) target_include_directories( ${PROJECT_NAME}
PRIVATE
${CMAKE_CURRENT_SOURCE_DIR}
)

更新 ExamplePlugin.qrc,更新资源路径

直接用 vscode 打开 修改

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

修改后

此图片为后面生成 project 后在 vs 中修改

主文件修改

修改 qPCA.cpp

# #include "ExamplePlugin.h" 改为
#include "qPCA.h" # ,ccStdPluginInterface( ":/CC/plugin/ExamplePlugin/info.json" ) ,ccStdPluginInterface( ":/CC/plugin/qPCA/info.json" )

修改 qPCA.h

# Q_PLUGIN_METADATA( IID "cccorp.cloudcompare.plugin.Example" FILE "../info.json" )
Q_PLUGIN_METADATA( IID "cccorp.cloudcompare.plugin.qPCA" FILE "../info.json" )

cmake 构建

可以看到我们的 qPCA 插件选项,选中

然后生成 project

运行

下一篇,我们来实现具体的 PCA 逻辑和可视化效果

有问题,欢迎留言、进群讨论或私聊:【群号:392784757】

cloud compare二次插件化功能开发详细步骤(一)的更多相关文章

  1. 使用Android-studio开发移动app与weex结合开发详细步骤

    详细步骤如下:   首先,确保机器已经安装了node.js,并且把npm更新到最新版本 下载完毕后,我们可以看到全局目录下的node_modules下面多出一个weex-toolkit 同时,我们留意 ...

  2. Java支付宝PC网站支付功能开发(详细教程)

    一.前言 本案例使用的是Java实现的.使用支付宝的沙盒环境示例.发布需要换成正式环境.这里就不作详细说明了 本代码适合用来做参考,不要直接复制去使用. 没有账号的需要去平台注册一个: 登录支付宝开发 ...

  3. 微信公众平台开发详细步骤与java代码

    1.微信公众平台设置 首先在https://mp.weixin.qq.com/注册一个公众平台账号(服务号.订阅号.企业号的区别) 微信公众平台地址:https://mp.weixin.qq.com ...

  4. 用grunt搭建自动化的web前端开发环境实战教程(详细步骤)

    用grunt搭建自动化的web前端开发环境实战教程(详细步骤) jQuery在使用grunt,bootstrap在使用grunt,百度UEditor在使用grunt,你没有理由不学.不用!前端自动化, ...

  5. 安装SVN并进行汉化的详细步骤

    安装SVN并进行汉化的详细步骤 SAE提供了不同的代码部署方式,可以分为两类:一是通过SVN客户端部署,这是SAE推荐的代码部署方法.另一个是通过非SVN客户端部署,即在线代码在线编辑器和推荐应用安装 ...

  6. unity3d开发的android应用中增加AD系统的详细步骤

    unity3d开发的android应用中增加AD系统的详细步骤 博客分类: Unity3d unity3d  Unity3d已经支持android,怎样在程序里增加admob?  试了一下,确实能够, ...

  7. Delphi 编写ActiveForm窗体工程知识和样例(开发浏览器客户端应用程序)(有详细步骤)

    一.基础知识介绍: 1.ActiveForm的基础知识介绍: 在Delphi中,ActiveForm是封装了Delphi Form的一种ActiveX控件.ActiveForm其实是一种标准的Delp ...

  8. 组件化网页开发 / 步骤一 · 4-4 匹配HTML标签

    组件化网页开发 / 步骤一 · 4-4 匹配HTML标签

  9. 【Linux开发】【Qt开发】ARM QT移植详细步骤教程

    ARM QT移植详细步骤教程 米尔SAM9X5和A5D3X上默认的Qt版本是4.5.3,当这个版本的Qt库不能满足实际开发需求时,可通过此方法制定Qt开发.运行环境. 移植的步骤如下: 1.下载新版q ...

  10. [转帖]龙芯服务器部署WEB服务的体验和详细步骤

    龙芯服务器部署WEB服务的体验和详细步骤 2019年01月02日 18:40:34 weixin_40065369 阅读数 1733   版权声明:本文为博主原创文章,遵循CC 4.0 by-sa版权 ...

随机推荐

  1. 安装PHP5.6.20

    安装php的前提是安装了数据库和httpd!!!!!!!! 1 因为yum缺省安装的是PHP5.4,所以先要添加yum库 [root@svnhost ~]# rpm -Uvh https://mirr ...

  2. 加速鸿蒙生态共建,蚂蚁mPaaS助力鸿蒙原生应用开发创新

    6月21日-23日,2024华为开发者大会(HDC 2024)如期举行.在22日的[鸿蒙生态伙伴SDK]分论坛中,正式发布了[鸿蒙生态伙伴SDK市场],其中蚂蚁数科旗下移动开发平台mPaaS(以下简称 ...

  3. Linux gpio子系统:gpio_direction_output 与 gpio_set_value的区别

    Linux gpio子系统:gpio_direction_output 与 gpio_set_value的区别 背景 最近改驱动程序,看到驱动代码中既有gpio_direction_output也有g ...

  4. Android 8.0 开机时间优化

    Android 8.0 开机时间优化 背景 在嵌入式行业中,有些搭载 了Android系统的设备由于 开机时间 过长而导致无法被接受. 介绍 启动时间是系统性能的重要组成部分,因为用户必须等待启动完成 ...

  5. Spring Reactor基本介绍和案例

    1. Reactor 对比 1.1 Reactor 线程模型 Reactor 线程模型就是通过 单个线程 使用 Java NIO 包中的 Selector 的 select()方法,进行监听.当获取到 ...

  6. 全国DNS服务器IP大全

  7. 格式输出函数printf()详解_C语言

    printf函数称为格式输出函数,其关键字最末一个字母f即为"格式"(format)之意.其功能是按用户指定的格式,把指定的数据显示到显示器屏幕上. printf函数调用的一般形式 ...

  8. [春秋云镜] Initial

    [春秋云镜] Initial **整套网络环境拓扑:** ​​ 一.打进内网 开局一个ip:39.101.184.25,fscan扫一下 ​​ 存在thinkphp5.0.23的漏洞,可以rce,我们 ...

  9. 百度翻译network里没有sug(文章发布时间2022年10月)

    百度翻译已经更新,现在的百度翻译分为两个阶段翻译,第一个阶段识别你的翻译字符是什么类型语言 第二阶段生成随机sign加携带token以post表单方式上传数据,返回json数据 尚硅谷在B站发布的的爬 ...

  10. Excel函数-相对引用和绝对引用

    1.相对引用 公式填充时引用的相对位置不变,行和列.序号都相对递增 2.绝对引用 公式填充时应用的单元格绝对位置不变,行和列.序号都不变.绝对引用的符号是"$",也可以快捷键按F4 ...