首页 > 其他分享 >cloud compare 学习利用CC代码加快插件开发与总结(三)

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

时间:2024-08-23 18:38:49浏览次数:10  
标签:插件 CC app compare cc ui bool void

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

cloud compare 二次插件化功能开发详细步骤(一)

cloud compare PCA 插件开发详细步骤(二)附代码

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

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

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

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

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

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()
  4. ...

但是 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 分离后再处理,然后再放回

标签:插件,CC,app,compare,cc,ui,bool,void
From: https://www.cnblogs.com/caibucai/p/18376833

相关文章

  • zblog免费插件分享前端代码支持一键复制
    zblog默认的代码文件在网页前端是不支持一键复制的,这会让访客复制长代码的时候不太方便,甚至有可能会出错,影响体验,下面分享一个非常简单的免费插件,安装之后,前端代码就能一键复制了。插件使用方法:1、点击最下方链接下载插件2、打开zblog后台,在插件管理里面上传刚下载的插件,安装......
  • ACL 2022 SWCC 论文拆解
    引言本文贡献Wearemotivatedtoaddresstheaboveissueswiththegoalofmakingbetteruseofcooccurrenceinformationofevents.Tothisend,wepresentSWCC:aSimultaneousWeaklysupervisedContrastivelearningandClusteringframeworkforeventreprese......
  • 【开源免费】一款支持多数据库客户端(vs code设计理念,具有丰富的插件)
    AzureDataStudio是一款【开源免费】的数据管理和开发工具,可连接到常用的云和本地数据库。支持Windows、macOS和Linux,浏览扩展库以获取其他数据库支持选项,包括MySQL、PostgreSQL和MongoDB、SQLServer等...它还为SQL、PowerShell、Python、KQL、ApacheSparkTM和PyS......
  • php读取access数据库
    这个代码测试的老的access数据库,使用的php版本是5.4,php7.4的测试不通过测试的文件:链接:https://pan.quark.cn/s/c4cfef0bc484 提取码:N9mF1.引入com_dotnet扩展,下载phpstudy,切换版本为php5.4,然后php.ini中加入extension=php_com_dotnet.dll2.复制下面代码<?php......
  • burpsuite xssValidator插件(xss插件)
    安装1.商城安装插件2.安装环境DownloadPhantomJShttps://phantomjs.org/download.htmlGitHub-NetSPI/xssValidator:ThisisaburpintruderextenderthatisdesignedforautomationandvalidationofXSS......
  • Bootstrap 模态框(Modal)插件
    模态框(Modal)是覆盖在父窗体上的子窗体。通常,目的是显示来自一个单独的源的内容,可以在不离开父窗体的情况下有一些互动。子窗体可提供信息、交互等。如果您想要单独引用该插件的功能,那么您需要引用 modal.js。或者,正如 Bootstrap插件概览 一章中所提到,您可以引用 ......
  • ICCEMDAN+皮尔逊+小波分解降噪+重构
    ICEEMDAN+皮尔逊+小波分解降噪+重构代码获取戳此处ICEEMDAN(改进的CEEMDAN)原理:ICEEMDAN是由Colominas等人提出的信号处理方法,它是在自适应噪声完全集合经验模态分解(CEEMDAN)的基础上发展而来。与CEEMDAN不同,ICEEMDAN在分解过程中不是直接添加高斯白噪声,而是选取白噪声被E......
  • 博客园-awescnb插件-geek皮肤优化--公众号卡片
    简介博客园-awescnb插件-geek皮肤暂不支持配置展示公众号二维码,此文章目的使用手动注入方式自定义实现公众号卡片效果效果展示公众号卡片动态效果鼠标移入前为公众号指引页鼠标移入后显示公众号二维码切换动画为动态反转首页展示实现在博客日历元素blog-......
  • LCC领导力演讲6:是什么让演讲直击人心,感召力爆棚?是1万个故事的力量!
    为什么有的演讲能让听众热泪盈眶,有的却像白开水一样无味?秘诀就在于:故事!是那些能够触动人心、引发共鸣的小故事。想象一下,如果你能用1万个与演讲、感召相关的小故事来武装自己,那会是怎样一番景象?怎么做好一场演讲?你写1000个小故事,讲述那些从紧张到自信,从失败到成功的蜕变瞬间......
  • chrome-网页gif截图插件
    简介本文介绍网页中gif截图工具使用,便于日常对网页中动态效果或元素进行截图软件介绍CapturetoaGif是用来录制屏幕并将其保存为GIF格式文件的chrome插件工具。它允许用户指定捕捉屏幕上的活动,比如应用程序界面、游戏过程或者教程视频等,并将这些活动转换成轻量级的动画GI......