2026-01-16 01:04:43 +08:00
|
|
|
|
#ifndef CLOUD_VIEW_MAIN_WINDOW_H
|
|
|
|
|
|
#define CLOUD_VIEW_MAIN_WINDOW_H
|
|
|
|
|
|
|
|
|
|
|
|
#include <QMainWindow>
|
|
|
|
|
|
#include <QWidget>
|
|
|
|
|
|
#include <QPushButton>
|
|
|
|
|
|
#include <QLabel>
|
|
|
|
|
|
#include <QListWidget>
|
|
|
|
|
|
#include <QGroupBox>
|
|
|
|
|
|
#include <QVBoxLayout>
|
|
|
|
|
|
#include <QHBoxLayout>
|
|
|
|
|
|
#include <QSplitter>
|
|
|
|
|
|
#include <QFileDialog>
|
|
|
|
|
|
#include <QMessageBox>
|
|
|
|
|
|
#include <QStatusBar>
|
|
|
|
|
|
#include <QLineEdit>
|
|
|
|
|
|
#include <QRadioButton>
|
2026-01-17 12:29:57 +08:00
|
|
|
|
#include <QCheckBox>
|
|
|
|
|
|
#include <QDialog>
|
2026-01-16 01:04:43 +08:00
|
|
|
|
#include <memory>
|
|
|
|
|
|
|
|
|
|
|
|
#include "PointCloudGLWidget.h"
|
|
|
|
|
|
#include "PointCloudConverter.h"
|
|
|
|
|
|
|
2026-01-17 12:29:57 +08:00
|
|
|
|
class QTextEdit;
|
|
|
|
|
|
class QTableWidget;
|
|
|
|
|
|
|
2026-01-16 01:04:43 +08:00
|
|
|
|
/**
|
|
|
|
|
|
* @brief 点云查看器主窗口
|
|
|
|
|
|
* 左侧显示点云,右侧为操作区域
|
|
|
|
|
|
*/
|
|
|
|
|
|
class CloudViewMainWindow : public QMainWindow
|
|
|
|
|
|
{
|
|
|
|
|
|
Q_OBJECT
|
|
|
|
|
|
|
|
|
|
|
|
public:
|
|
|
|
|
|
explicit CloudViewMainWindow(QWidget* parent = nullptr);
|
|
|
|
|
|
~CloudViewMainWindow() override;
|
|
|
|
|
|
|
|
|
|
|
|
private slots:
|
|
|
|
|
|
/**
|
|
|
|
|
|
* @brief 打开文件
|
|
|
|
|
|
*/
|
|
|
|
|
|
void onOpenFile();
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* @brief 清除所有点云
|
|
|
|
|
|
*/
|
|
|
|
|
|
void onClearAll();
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* @brief 重置视图
|
|
|
|
|
|
*/
|
|
|
|
|
|
void onResetView();
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* @brief 清除选中的点
|
|
|
|
|
|
*/
|
|
|
|
|
|
void onClearSelectedPoints();
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* @brief 清除选线
|
|
|
|
|
|
*/
|
|
|
|
|
|
void onClearLinePoints();
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* @brief 处理点选中事件
|
|
|
|
|
|
*/
|
|
|
|
|
|
void onPointSelected(const SelectedPointInfo& point);
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* @brief 处理两点选中事件(测距)
|
|
|
|
|
|
*/
|
|
|
|
|
|
void onTwoPointsSelected(const SelectedPointInfo& p1, const SelectedPointInfo& p2, float distance);
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* @brief 处理线选中事件
|
|
|
|
|
|
*/
|
|
|
|
|
|
void onLineSelected(const SelectedLineInfo& line);
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* @brief 通过输入线号选择线
|
|
|
|
|
|
*/
|
|
|
|
|
|
void onSelectLineByNumber();
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* @brief 选线模式切换(纵向/横向)
|
|
|
|
|
|
*/
|
|
|
|
|
|
void onLineSelectModeChanged(bool checked);
|
|
|
|
|
|
|
2026-01-17 12:29:57 +08:00
|
|
|
|
/**
|
|
|
|
|
|
* @brief 显示选中线上的所有点坐标
|
|
|
|
|
|
*/
|
|
|
|
|
|
void onShowLinePoints();
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* @brief 线上点列表项被点击
|
|
|
|
|
|
*/
|
|
|
|
|
|
void onLinePointTableClicked(int row, int column);
|
|
|
|
|
|
|
2026-01-16 01:04:43 +08:00
|
|
|
|
private:
|
|
|
|
|
|
/**
|
|
|
|
|
|
* @brief 初始化界面
|
|
|
|
|
|
*/
|
|
|
|
|
|
void setupUI();
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* @brief 创建左侧点云显示区域
|
|
|
|
|
|
*/
|
|
|
|
|
|
QWidget* createViewerArea();
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* @brief 创建右侧操作区域
|
|
|
|
|
|
*/
|
|
|
|
|
|
QWidget* createControlPanel();
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* @brief 创建文件操作组
|
|
|
|
|
|
*/
|
|
|
|
|
|
QGroupBox* createFileGroup();
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* @brief 创建选点测距组
|
|
|
|
|
|
*/
|
|
|
|
|
|
QGroupBox* createMeasureGroup();
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* @brief 创建选线拟合组
|
|
|
|
|
|
*/
|
|
|
|
|
|
QGroupBox* createLineGroup();
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* @brief 创建点云列表组
|
|
|
|
|
|
*/
|
|
|
|
|
|
QGroupBox* createCloudListGroup();
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* @brief 更新选点信息显示
|
|
|
|
|
|
*/
|
|
|
|
|
|
void updateSelectedPointsDisplay();
|
|
|
|
|
|
|
2026-01-17 12:29:57 +08:00
|
|
|
|
/**
|
|
|
|
|
|
* @brief 从原始数据获取线上点(包含0,0,0)
|
|
|
|
|
|
*/
|
|
|
|
|
|
QVector<QVector3D> getOriginalLinePoints(const SelectedLineInfo& lineInfo);
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* @brief 更新线上点对话框内容
|
|
|
|
|
|
*/
|
|
|
|
|
|
void updateLinePointsDialog();
|
|
|
|
|
|
|
2026-01-16 01:04:43 +08:00
|
|
|
|
// 点云显示控件
|
|
|
|
|
|
PointCloudGLWidget* m_glWidget;
|
|
|
|
|
|
|
|
|
|
|
|
// 点云转换器
|
|
|
|
|
|
std::unique_ptr<PointCloudConverter> m_converter;
|
|
|
|
|
|
|
|
|
|
|
|
// 文件操作控件
|
|
|
|
|
|
QPushButton* m_btnOpenFile;
|
|
|
|
|
|
QPushButton* m_btnClearAll;
|
|
|
|
|
|
QPushButton* m_btnResetView;
|
|
|
|
|
|
|
|
|
|
|
|
// 选点测距控件
|
2026-01-17 12:29:57 +08:00
|
|
|
|
QCheckBox* m_cbMeasureDistance;
|
2026-01-16 01:04:43 +08:00
|
|
|
|
QPushButton* m_btnClearPoints;
|
|
|
|
|
|
QLabel* m_lblPoint1;
|
|
|
|
|
|
QLabel* m_lblPoint2;
|
|
|
|
|
|
QLabel* m_lblDistance;
|
|
|
|
|
|
|
|
|
|
|
|
// 选线拟合控件
|
|
|
|
|
|
QPushButton* m_btnClearLine;
|
2026-01-17 12:29:57 +08:00
|
|
|
|
QPushButton* m_btnShowLinePoints;
|
2026-01-16 01:04:43 +08:00
|
|
|
|
QLineEdit* m_lineNumberInput;
|
|
|
|
|
|
QPushButton* m_btnSelectByNumber;
|
|
|
|
|
|
QRadioButton* m_rbVertical;
|
|
|
|
|
|
QRadioButton* m_rbHorizontal;
|
|
|
|
|
|
QLabel* m_lblLineIndex;
|
|
|
|
|
|
QLabel* m_lblLinePointCount;
|
|
|
|
|
|
|
|
|
|
|
|
// 点云列表
|
|
|
|
|
|
QListWidget* m_cloudList;
|
|
|
|
|
|
|
|
|
|
|
|
// 已加载的点云数量
|
|
|
|
|
|
int m_cloudCount;
|
|
|
|
|
|
|
|
|
|
|
|
// 当前点云的线信息(用于旋转)
|
|
|
|
|
|
int m_currentLineNum;
|
|
|
|
|
|
int m_currentLinePtNum;
|
|
|
|
|
|
|
|
|
|
|
|
// 原始完整点云数据(包含0,0,0点,用于旋转)
|
|
|
|
|
|
PointCloudXYZ m_originalCloud;
|
2026-01-17 12:29:57 +08:00
|
|
|
|
|
|
|
|
|
|
// 线上点对话框
|
|
|
|
|
|
QDialog* m_linePointsDialog;
|
|
|
|
|
|
QTableWidget* m_linePointsTable;
|
|
|
|
|
|
QVector<QVector3D> m_currentLinePoints; // 当前线的原始点坐标
|
2026-01-16 01:04:43 +08:00
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
#endif // CLOUD_VIEW_MAIN_WINDOW_H
|