GrabBag/Tools/CloudView/Inc/CloudViewMainWindow.h

200 lines
4.3 KiB
C
Raw Normal View History

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>
#include <QCheckBox>
#include <QDialog>
2026-01-16 01:04:43 +08:00
#include <memory>
#include "PointCloudGLWidget.h"
#include "PointCloudConverter.h"
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);
/**
* @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();
/**
* @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;
// 选点测距控件
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;
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;
// 线上点对话框
QDialog* m_linePointsDialog;
QTableWidget* m_linePointsTable;
QVector<QVector3D> m_currentLinePoints; // 当前线的原始点坐标
2026-01-16 01:04:43 +08:00
};
#endif // CLOUD_VIEW_MAIN_WINDOW_H