cloud compare 学习利用CC代码加快插件开发与总结(三)

news2024/11/14 19:25:46

建议看过前面的文章后,再开始本文的学习

  1. cloud compare二次插件化功能开发详细步骤(一)_cloudcompare插件开发-CSDN博客

  2. cloud compare PCA插件开发详细步骤(二)附代码-CSDN博客

本文完成一个点云变换的插件,同时也是对CC接口的使用做进一步说明,进一步理解CC插件开发流程,学会利用已有CC代码完成插件开发

这个功能是 cc 已有的功能,位于 edit->apply_transformation 这里

文件逻辑组织还和 cloud compare PCA插件开发详细步骤(二)附代码-CSDN博客 中一致,不多赘述

插件全部代码放在 github ,即插即用,欢迎 star

如需帮助,或有问题,欢迎留言、私信或加群【群号:392784757】

ui 层面【从CC搬运并修改】

这里选择从cc搬运修改,还是自行设计再修改,取决于你的插件逻辑 和 CC 已有ui的 相似度

拿到cc源码qCC/ui_templates 下面的 applyTransformationDlg.ui 和对应的qcc下面的 .h .cpp

image-20240823145623247

进行修改,我们只保留第一个使用Matrix 变换的tab,其他删除

image-20240823145137206

也就只保留一个 Matrix 4x4 tab

对应ui的 .h 文件 和 .cpp 进行处理

因为我们删去了3个tab 涉及到的 qt 组件都没了,需要对涉及到的函数进行 删除

删除基于 3个tab 使用的 组件名进行删,最终保留的函数如下

image-20240823145727091

ui逻辑总结

cc插件用到的ui,设计.ui文件,完成 .h .cpp,ui 逻辑函数,在需要用到的时候使用 xxdlg.exec() ,获取用户的各种输入,传回到 插件主逻辑中;cc采用了继承 ui文件编译后ui_xxxDlg.h 中的 Ui::xxxDialog,来封装一层,这种继承方式,使得声明的xxxDlg可以拿到界面上的所有组件,进而可以获取用户设置的组件值(或者使用函数返回)

ui 界面层

QT_BEGIN_NAMESPACE

class Ui_ApplyTransformationDialog // 各种组件
{
	// ...
};

namespace Ui {
    class ApplyTransformationDialog: public Ui_ApplyTransformationDialog {};
} // namespace Ui

ui 逻辑层

class ccApplyTransformationDlg : public QDialog, public Ui::ApplyTransformationDialog
{
	Q_OBJECT

public:

	//! Default constructor
	explicit ccApplyTransformationDlg(QWidget* parent = nullptr);

	//! Returns input matrix
	ccGLMatrixd getTransformation(bool& applyToGlobal) const;

protected:

	void checkMatrixValidityAndAccept();

	void onMatrixTextChange();

	void onRotAngleValueChanged(double);

	void onEulerValueChanged(double);

	void onFromToValueChanged(double);

	void loadFromASCIIFile();
    
	void loadFromClipboard();

	void buttonClicked(QAbstractButton*);


protected:

	void updateAll(const ccGLMatrix& mat, bool textForm = true, bool axisAngleForm = true, bool eulerForm = true, bool fromToForm = true);
};

ui 调用

插件主逻辑中调用,并获取用户的输入值(通过函数方式 ccApplyTransformationDlg.getTransformation() )

ccApplyTransformationDlg ccApplyTransformationDlg(m_app->getMainWindow());
if (!ccApplyTransformationDlg.exec())
{
    return;
}
bool applyToGlobal = false;
ccGLMatrixd transformMatrix =  ccApplyTransformationDlg.getTransformation(applyToGlobal);

用图说话

image-20240823154604852

接口关系说明

mainwindow.h 继承了 ccMainAppInterface ,这也说明了 cc 就是使用的插件化开发范式

image-20240822210601900

插件继承 ccStdPluginInterface

image-20240822210744724

ccStdPluginInterface中 有 ccMainAppInterface的指针 m_app,可以获取到比 ccStdPluginInterface 中更高级的函数

image-20240822210904578

所以 m_app 可以拿到很多有用的方法

  1. 将获取到的点云 从 db_tree 分离 / 放回
  2. zoomOnSelectedEntities()
  3. refreshAll()

但是mainwindow 自定义的方法 确无法直接拿到【但其中也是使用很多基于接口的方法来完成】,需要做本地化修改,对直接使用接口的方法 替换成 用 m_app 调用

所以,理论上 cc 能做的事,我们如果插件逻辑需要用到 都可以拿过来 进行改造后 使用,减少开发,本文便是一个简单示例

插件主逻辑

接下来的插件主逻辑 编写 和

cloud compare PCA插件开发详细步骤(二)附代码-CSDN博客 中 qPCA.cpp 实现部分,实现基本一致,完成

  1. 构造函数
  2. onNewSelection()
  3. getActions()
  4. doAction()

的实现

核心函数【从CC搬运并修改实现】

我们接下来要继续的就是 doAction() 中的核心函数

void applyTransformation(ccMainAppInterface* m_app, const ccGLMatrixd& mat, bool applyToGlobal);

的实现过程

首先我们知道 cc 是已经实现过这个函数的了,在 mainwindow.cpp 中 ,因此先直接搬过来

void MainWindow::applyTransformation(const ccGLMatrixd& mat, bool applyToGlobal)
{
    
}

会发现 很多 报错地方,进行一一解决

void applyTransformation(ccMainAppInterface* m_app, const ccGLMatrixd& mat, bool applyToGlobal)
{
    
}

我们首先删除MainWindow::,增加 插件中使用的接口指针m_app

首先会发现很多 直接调用的函数,报错

包括

getTopLevelSelectedEntities();

haveOneSelection();

putObjectBackIntoDBTree()

zoomOnSelectedEntities();

refreshAll();

我们尝试用 m_app 去调用

m_app->putObjectBackIntoDBTree(entity, objContext);
m_app->zoomOnSelectedEntities();
m_app->refreshAll();

可以调用

然后再去看其他函数,发现他们虽不能用 m_app 调用,但他们的实现中也直接或间接用到了 ccMainAppInterface 的方法,因此我们传入 m_app ,进行本地化 替换修改

比如,getTopLevelSelectedEntities(); 修改后

ccHObject::Container getTopLevelSelectedEntities(ccMainAppInterface* m_app)
{
	 // m_selectedEntities 在 mainwindow 是成员变量可以直接获取到 这里我们使用 m_app 进行获取
    const ccHObject::Container& m_selectedEntities = m_app->getSelectedEntities();
	ccHObject::Container topLevelSelectedEntities;
	for (size_t i = 0; i < m_selectedEntities.size(); ++i)
	{
		ccHObject* entity = m_selectedEntities[i];
		bool hasParentsInselection = false;
		for (size_t j = 0; j < m_selectedEntities.size(); ++j)
		{
			if (i == j)
				continue;

			ccHObject* otherEntity = m_selectedEntities[j];
			if (otherEntity->isAncestorOf(entity))
			{
				hasParentsInselection = true;
				break;
			}
		}

		if (!hasParentsInselection)
		{
			topLevelSelectedEntities.push_back(entity);
		}
	}

	return topLevelSelectedEntities;
}

其他的一些报错,无关乎主要逻辑的删除即可

一些数据结构报错的,找到对应的头文件引入即可

这样我们的核心函数就修改完成了,往往比自己写的更优秀

在修改的过程 也可以进一步学习cc的逻辑,优化我们之前的写插件的处理思路

如,cc在处理点云时,不直接对 db_tree上点云进行处理,而是从 db_tree 分离后再处理,然后再放回

如需帮助,或有问题,欢迎留言、私信或加群【群号:392784757】

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2068638.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

HighConcurrencyCommFramework c++通讯服务器框架 :TCP粘包解决

服务器设计&#xff1a;原则综述&#xff1a; 通用服务器框架&#xff1a;游戏&#xff0c;网络交易&#xff0c;通讯框架&#xff0c;聚焦在业务逻辑上&#xff1b; 收发包&#xff1a;格式问题提出&#xff1b; 例子&#xff1a;第一条命令出拳【1abc2】&#xff0c;第二条…

Linux高性能服务器编程 总结索引 | 第1章:TCP/IP协议族

现在 Internet&#xff08;因特网&#xff09;使用的主流协议族是 TCP/IP 协议族&#xff0c;它是一个分层、多协议的通信体系。本章简要讨论 TCP/IP 协议族各层 包含的主要协议&#xff0c;以及它们之间是 如何协作完成网络通信的 1、TCP/IP 协议族体系结构 以及主要协议 1.1…

区块链变革:Web3时代的数字化前沿

随着科技的飞速发展&#xff0c;数字化正在深刻影响着我们生活的方方面面。区块链技术作为一种新兴的去中心化技术&#xff0c;正成为推动这一变革的重要力量。特别是在Web3时代&#xff0c;区块链的作用不仅仅局限于加密货币&#xff0c;而是延伸到了各个领域&#xff0c;成为…

代码随想录训练营 Day37打卡 动态规划 part05 完全背包理论基础 518. 零钱兑换II 377. 组合总和 Ⅳ 卡码70. 爬楼梯(进阶版)

代码随想录训练营 Day37打卡 动态规划 part05 一、完全背包理论基础 有N件物品和一个最多能背重量为W的背包。第i件物品的重量是weight[i]&#xff0c;得到的价值是value[i] 。每件物品都有无限个&#xff08;也就是可以放入背包多次&#xff09;&#xff0c;求解将哪些物品装…

Postman【使用总结】--SpringBoot的Controller规范【重修】

【企业规范&#xff01;&#xff01;&#xff01;】 【响应数据】

提升学术论文质量的智能助手:ChatGPT

提升学术论文质量的智能助手&#xff1a;ChatGPT 前言ChatGPT的核心功能ChatGPT的优势具体应用案例局限性与最佳实践结语 前言 在这个知识爆炸的时代&#xff0c;学术研究已成为推动社会进步和科技发展的重要力量。每一篇论文的撰写&#xff0c;都是对人类知识边界的一次探索和…

攻防世界-web题型-2星难度汇总-个人wp

command_execution 典型的SSRF&#xff0c;先用命令找一下flag在哪里 xff_referer 修改一下xff和refere就可以了 php_rce 经典的thinkphp框架&#xff0c;闭着眼睛拿工具梭 这款工具无法直接getshell换一个 拿蚁剑直接连 Web_php_include 先分析代码 while (strstr($page,…

搜索二叉树进阶之AVL树

前言 二叉搜索树&#xff08;BST&#xff09;是一种基础的数据结构&#xff0c;能够高效地进行搜索、插入和删除操作。然而&#xff0c;在最坏的情况下&#xff0c;普通的BST可能会退化成一条链表&#xff0c;导致操作效率降低。为了避免这种情况&#xff0c;出现了自平衡二叉…

C语言-输出菱形

题目要求&#xff1a; 输出以下图形 程序&#xff1a; #define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> int main() {int i, j;for (i 0; i < 4; i){for (j i 1; j < 4; j)printf(" ");for (j 0; j < 2 * i 1; j)printf("*");…

虽迟但到:Midjourney推出网页端并限时免费!

大家好&#xff0c;我是木易&#xff0c;一个持续关注AI领域的互联网技术产品经理&#xff0c;国内Top2本科&#xff0c;美国Top10 CS研究生&#xff0c;MBA。我坚信AI是普通人变强的“外挂”&#xff0c;专注于分享AI全维度知识&#xff0c;包括但不限于AI科普&#xff0c;AI工…

【最长公共子序列】

题目 代码 #include <bits/stdc.h> using namespace std;const int N 1010; int f[N][N]; char A[N], B[N]; int main() {int n, m;cin >> n >> m;cin >> A1 >> B1;for(int i 1; i < n; i){for(int j 1; j < m; j){if(A[i] B[j]) f[…

Linux三剑客-sedawk

一、三剑客-sed命令 1、格式 sed 找谁干啥 文件 找谁:条件&#xff0c;匹配哪一行&#xff0c;哪些行. 干啥:动作&#xff0c;增删改查. #显示文件的第3行 sed -n 3p /etc/passwd选项说明-n取消默认输出-p查找-rsed支持扩展正则-i修改文件内容&#xff0c;这个选项放在最后…

VS2017编译osg3.6.0和osgearth2.10

osg3.6.0正常编译即可&#xff0c;osgearth2.10编译过程中会出现如下错误 1.osgEarth出错 1>HTTPClient.obj : error LNK2019: 无法解析的外部符号 curl_global_init&#xff0c;该符号在函数 "public: static void __cdecl osgEarth::HTTPClient::globalInit(void)&…

【日常记录-Docker】基于Alibaba Cloud Linux3安装nodejs18

Author&#xff1a;赵志乾 Date&#xff1a;2024-08-23 Declaration&#xff1a;All Right Reserved&#xff01;&#xff01;&#xff01; 1. 问题 Alibaba Cloud Linux3基础镜像中携带的nodejs安装包版本为v14&#xff0c;与项目开发中使用的v18版本不同&#xff0c;需要更新…

数据库 —>数据库编程

数据库&#xff0c;用来保存信息&#xff0c;和文件有同样的作用&#xff0c;但是却有别于文件&#xff1b; 文件掉电不会消失&#xff0c;一般用来存储软件配置&#xff0c;想要保存的东西&#xff0c;他在查找的时候是一行一行的去查找&#xff0c;效率不高&#xff1b; 数据…

虚谷数据库连接断开-常见问题的排查及解决方法

在日常的数据库管理工作中。虚谷数据库连接断开是一个常见的问题&#xff0c;这不仅会影响数据库的性能&#xff0c;还可能导致应用程序无法正常运行&#xff0c;本文将探讨Xugu数据库连接断开的原因&#xff0c;并提供相应的解决方法。 E50022 与服务器间的连接已经断开,可能…

如何用ACME.SH实现SSL证书自动化管理?

在上篇《免费SSL证书有效期缩短至90天&#xff0c;该如何应对&#xff1f;》中&#xff0c;想必大家都已经get到了——建站必备四件套之SSL证书的有效期不断缩短已成不可逆的趋势。 这一趋势下&#xff0c;如何有效管理SSL证书成了一道难题。有机智的小伙伴反馈&#xff0c;使用…

golang(go语言)打包成带图标的 exe 可执行文件

目录 1、准备 ico 图标 2、生成 syso 文件 3、打包 4、效果 1、准备 ico 图标 2、生成 syso 文件 创建 main.rc 文件&#xff0c;rc文件的名称main 与项目根目录下 main.go的 main 同名 IDI_ICON1 ICON "favicon.ico" cmd 窗口运行命令 windres -o main.syso main…

从零开始编程:Go语言真的适合新手吗?

Go语言自诞生以来&#xff0c;一直以其简洁、高效和面向工程的特性受到开发者的青睐&#xff0c;尤其是在后端开发和并发编程方面&#xff0c;Go表现出了独特的优势。然而&#xff0c;作为一门以简单著称的语言&#xff0c;它是否适合作为编程初学者的第一门语言呢&#xff1f;…

电脑换硬盘怎么全盘克隆?轻松实现数据迁移

随着科技的不断发展&#xff0c;电脑硬盘的存储容量和读写速度也在不断提升。为了获得更好的电脑使用体验&#xff0c;许多用户会选择更换更大容量、更高效的硬盘。然而&#xff0c;在更换硬盘的过程中&#xff0c;一个关键的问题摆在了我们面前&#xff1a;如何将旧硬盘中的所…