2 Star 1 Fork 1

liuzhongtu/HelloQocct

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
document.cpp 6.90 KB
一键复制 编辑 原始数据 按行查看 历史
Monss 提交于 2024-03-11 19:57 . 以MVC模式构建点云运行框架;
#include "document.h"
#include "util.h"
#include "Viewer.h"
#include <AIS_InteractiveContext.hxx>
#include <Graphic3d_ArrayOfPoints.hxx>
/**
* @brief 从文件加载点云数据
*
* @param read: 读取文件相关配置
* @param id[结果参数]: 点云标识
*
* @return 0: 加载成功
* @return -1: 文件不存在
* @return -2: 参数输入错误
*/
int Document::loadPntCloud(const ReadFileData& read, std::string& id)
{
// 确定标识
std::string pntCloudId = util::extractFileName(read.filepath);
calcPntCloudId(pntCloudId);
// 加载数据
// 根据点类型加载对应的数据
switch (read.format)
{
case XYZ:
{
std::shared_ptr<pmt::PointCloud<pcl::PointXYZ> > pntCloud = make_shared<pmt::PointCloud<pcl::PointXYZ> >();
int res = pntCloud->setData(read.filepath); // 读取文件数据
switch (res)
{
case 0: // 加载成功
{
pntCloudXYZ_[pntCloudId] = pntCloud; // 添加到数据map
PntCloudCtrl pntCloudCtrl; // 单个点云控制
pntCloudCtrl.id = pntCloudId;
pntCloudCtrl.modelFormat = XYZ;
pntCloudCtrl.view = nullptr;
pntCloudCtrl.pntCloudPCL = nullptr;
pntCloudCtrls_.push_back(pntCloudCtrl); // 添加到点云总控
break;
}
case -1: // 文件不存在
return -1; // 直接返回 -1
}
break;
}
case XYZNormal:
{
std::shared_ptr<pmt::PointCloud<pcl::PointNormal> > pntCloud = make_shared<pmt::PointCloud<pcl::PointNormal> >();
int res = pntCloud->setData(read.filepath); // 读取文件数据
switch (res)
{
case 0: // 加载成功
{
pntCloudXYZNormal_[pntCloudId] = pntCloud; // 添加到数据map
PntCloudCtrl pntCloudCtrl; // 单个点云控制
pntCloudCtrl.id = pntCloudId;
pntCloudCtrl.modelFormat = XYZNormal;
pntCloudCtrl.view = nullptr;
pntCloudCtrl.pntCloudPCL = nullptr;
pntCloudCtrls_.push_back(pntCloudCtrl); // 添加到点云总控
break;
}
case -1: // 文件不存在
return -1; // 直接返回 -1
}
break;
}
default:
return -2;
}
// 返回点云标识
id = pntCloudId;
return 0;
}
/**
* @brief 指定点云绑定视图
*
* @param id: 点云标识
* @param view: 待绑定的视图
*
* @return 0: 绑定成功
* @return -1: 参数输入错误
*/
int Document::bindPCLView(const std::string& id, const OcctView* view)
{
// 按标识查找点云控制
PntCloudCtrl* pntCloudCtrl = findPntCloudCtrl(id);
if (pntCloudCtrl == nullptr) // 点云控制不存在
return -1;
// 清空原视图的点云
if (pntCloudCtrl->view && &*pntCloudCtrl->pntCloudPCL)
pntCloudCtrl->view->viewer()->context()->Remove(pntCloudCtrl->pntCloudPCL, true);
// 切换绑定
pntCloudCtrl->view = view;
pntCloudCtrl->pntCloudPCL = nullptr;
}
/**
* @brief 指定点云降采样
*/
/**
* @brief 显示指定点云
*
* @param id: 点云标识
*
* @return 0: 显示成功
* @return -1: 参数输入错误
* @return -2: 未绑定视图
*/
int Document::showPntCloud(const std::string& id)
{
// 按标识查找点云控制
PntCloudCtrl* pntCloudCtrl = findPntCloudCtrl(id);
if (pntCloudCtrl == nullptr) // 点云控制不存在
return -1;
// 显示点云
if (pntCloudCtrl->view) {
// 若尚未添加点云视图数据
if (&*pntCloudCtrl->pntCloudPCL == nullptr) {
// 根据点类型分类处理
switch (pntCloudCtrl->modelFormat)
{
case XYZ:
{
const pcl::PointCloud<pcl::PointXYZ>& pntCloud = pntCloudXYZ_[pntCloudCtrl->id]->getData(); // 获取已存储的pcl点云数据
Handle(Graphic3d_ArrayOfPoints) occPoints = new Graphic3d_ArrayOfPoints(pntCloud.size(), Standard_True); // 初始化occt点数据
addVertexPCL(*occPoints, pntCloud); // 填充occt点数据
pntCloudCtrl->pntCloudPCL = new AIS_PointCloud(); // 添加点云视图数据
pntCloudCtrl->pntCloudPCL->SetPoints(occPoints); // occt点云对象设置点数据
break;
}
case XYZNormal:
{
const pcl::PointCloud<pcl::PointNormal>& pntCloud = pntCloudXYZNormal_[pntCloudCtrl->id]->getData(); // 获取已存储的pcl点云数据
Handle(Graphic3d_ArrayOfPoints) occPoints = new Graphic3d_ArrayOfPoints(pntCloud.size(), Standard_True); // 初始化occt点数据
addVertexPCL(*occPoints, pntCloud); // 填充occt点数据
pntCloudCtrl->pntCloudPCL = new AIS_PointCloud(); // 添加点云视图数据
pntCloudCtrl->pntCloudPCL->SetPoints(occPoints); // occt点云对象设置点数据
break;
}
}
}
// 显示
pntCloudCtrl->view->showPntCloud(pntCloudCtrl->pntCloudPCL);
}
else
return -2; // 未绑定视图
return 0;
}
/**
* @brief 隐藏指定点云
*
* @param id: 点云标识
*
* @return 0: 隐藏成功
* @return -1: 参数输入错误
* @return -2: 未绑定视图
*/
int Document::hidePntCloud(const std::string& id)
{
// 按标识查找点云控制
PntCloudCtrl* pntCloudCtrl = findPntCloudCtrl(id);
if (pntCloudCtrl == nullptr) // 点云控制不存在
return -1;
// 隐藏点云
if (pntCloudCtrl->view) {
// 直接隐藏
pntCloudCtrl->view->hidePntCloud(pntCloudCtrl->pntCloudPCL);
}
else
return -2; // 未绑定视图
return 0;
}
/**
* @brief 删除指定点云
*
* @param id: 点云标识
*
* @return 0: 删除成功
* @return -1: 参数输入错误
*/
int Document::delPntCloud(const std::string& id)
{
// 按标识查找点云控制
PntCloudCtrl* pntCloudCtrl = findPntCloudCtrl(id);
if (pntCloudCtrl == nullptr) // 点云控制不存在
return -1;
// 删除视图中 属于点云控制下的点云显示数据
if (pntCloudCtrl->view)
pntCloudCtrl->view->delPntCloud(pntCloudCtrl->pntCloudPCL);
pntCloudCtrl->view = nullptr;
// 释放occt数据资源
pntCloudCtrl->pntCloudPCL = nullptr;
// 释放pcl数据资源
switch (pntCloudCtrl->modelFormat)
{
case XYZ:
pntCloudXYZ_[pntCloudCtrl->id] = nullptr;
break;
case XYZNormal:
pntCloudXYZNormal_[pntCloudCtrl->id] = nullptr;
break;
default:
break;
}
// 删除点云控制
delPntCloudCtrl(id);
return 0;
}
/**
* @brief 获取所有点云标识
*
* @param result[结果参数]: 所有点云标识
*/
int Document::getPntCloudIDs(std::list<std::string>& result)
{
result.clear(); // 清空容器
for (const auto& pntCloudCtrl : pntCloudCtrls_)
result.push_back(pntCloudCtrl.id);
return 0;
}
/**
* @brief 查找可用的标识
*
* @param id[结果参数]: 待比较的点云标识
*
* @return 0: 查找成功
*/
int Document::calcPntCloudId(std::string& id)
{
unsigned int idx = 0; // 若有重名,则名称后加一
std::string duplicateId = id; // 重名标识
// 检查可用标识
while (true) {
bool exist = false; // 标识是否已存在
// 遍历 检查标识是否已存在
for (auto& pntCloudCtrlItem : pntCloudCtrls_) {
if (duplicateId == pntCloudCtrlItem.id) {
exist = true;
break;
}
}
if (!exist) // 名称可用
break;
else
duplicateId = id + "(" + std::to_string(++idx) + ")"; // 标识自增 暂不设上限
}
id = duplicateId; // 返回可用标识
return 0;
}
/**
* @brief 按标识查找单个点云控制
*
* @param id: 点云标识
*
* @return 只读 单个点云控制
* @return nullptr 标识不存在
*/
Document::PntCloudCtrl* Document::findPntCloudCtrl(const std::string& id)
{
// 迭代
for (auto& pntCloudCtrl : pntCloudCtrls_) {
if (id == pntCloudCtrl.id) // 比对
return &pntCloudCtrl;
}
return nullptr;
}
/**
* @brief 按标识删除单个点云控制
*
* @param id: 点云标识
*
* @return 0: 删除成功
* @return -1: 标识不存在
*/
int Document::delPntCloudCtrl(const std::string& id)
{
// 迭代
for (auto it = pntCloudCtrls_.cbegin(); it != pntCloudCtrls_.cend(); it++) {
if (id == it->id) { // 比对
pntCloudCtrls_.erase(it);
return 0;
}
}
return -1;
}
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
C++
1
https://gitee.com/liuzhongtu/hello-qocct.git
git@gitee.com:liuzhongtu/hello-qocct.git
liuzhongtu
hello-qocct
HelloQocct
master

搜索帮助

23e8dbc6 1850385 7e0993f3 1850385