GrabBag/Tools/CalibView/Src/CalibResultWidget.cpp
2026-03-17 22:27:58 +08:00

174 lines
5.1 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "CalibResultWidget.h"
#include <QVBoxLayout>
#include <QHBoxLayout>
#include <QHeaderView>
CalibResultWidget::CalibResultWidget(QWidget* parent)
: QWidget(parent)
, m_tableRotation(nullptr)
, m_lblError(nullptr)
, m_lblMaxError(nullptr)
, m_lblMinError(nullptr)
, m_hasResult(false)
{
setupUI();
}
CalibResultWidget::~CalibResultWidget()
{
}
void CalibResultWidget::setupUI()
{
QVBoxLayout* mainLayout = new QVBoxLayout(this);
mainLayout->addStretch();
// 旋转矩阵
mainLayout->addWidget(createRotationGroup());
// 误差
mainLayout->addWidget(createErrorGroup());
}
QGroupBox* CalibResultWidget::createRotationGroup()
{
QGroupBox* group = new QGroupBox("变换矩阵 [R | T]", this);
QVBoxLayout* layout = new QVBoxLayout(group);
m_tableRotation = new QTableWidget(3, 4, this);
m_tableRotation->setHorizontalHeaderLabels({"Col 0", "Col 1", "Col 2", "T"});
m_tableRotation->setVerticalHeaderLabels({"Row 0", "Row 1", "Row 2"});
m_tableRotation->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
m_tableRotation->verticalHeader()->setSectionResizeMode(QHeaderView::Stretch);
m_tableRotation->setEditTriggers(QAbstractItemView::NoEditTriggers);
m_tableRotation->setMaximumHeight(120);
// 初始化为单位矩阵 + 零平移
for (int i = 0; i < 3; ++i) {
for (int j = 0; j < 3; ++j) {
QTableWidgetItem* item = new QTableWidgetItem(i == j ? "1.000000" : "0.000000");
item->setTextAlignment(Qt::AlignCenter);
m_tableRotation->setItem(i, j, item);
}
// 第4列T 向量,初始为 0
QTableWidgetItem* tItem = new QTableWidgetItem("0.000000");
tItem->setTextAlignment(Qt::AlignCenter);
m_tableRotation->setItem(i, 3, tItem);
}
layout->addWidget(m_tableRotation);
return group;
}
QGroupBox* CalibResultWidget::createErrorGroup()
{
QGroupBox* group = new QGroupBox("标定信息", this);
QHBoxLayout* layout = new QHBoxLayout(group);
layout->addWidget(new QLabel("平均误差:", this));
m_lblError = new QLabel("0.0000 mm", this);
m_lblError->setStyleSheet("font-weight: bold; color: red;");
layout->addWidget(m_lblError);
layout->addSpacing(20);
layout->addWidget(new QLabel("最大误差:", this));
m_lblMaxError = new QLabel("0.0000 mm", this);
layout->addWidget(m_lblMaxError);
layout->addSpacing(20);
layout->addWidget(new QLabel("最小误差:", this));
m_lblMinError = new QLabel("0.0000 mm", this);
layout->addWidget(m_lblMinError);
layout->addStretch();
return group;
}
void CalibResultWidget::updateRotationDisplay(const HECRotationMatrix& R)
{
for (int i = 0; i < 3; ++i) {
for (int j = 0; j < 3; ++j) {
QTableWidgetItem* item = m_tableRotation->item(i, j);
if (item) {
item->setText(QString::number(R.at(i, j), 'f', 6));
}
}
}
}
void CalibResultWidget::updateTranslationDisplay(const HECTranslationVector& T)
{
for (int i = 0; i < 3; ++i) {
QTableWidgetItem* item = m_tableRotation->item(i, 3);
if (item) {
item->setText(QString::number(T.at(i), 'f', 6));
}
}
}
void CalibResultWidget::showCalibResult(const HECCalibResult& result)
{
m_currentResult = result;
m_hasResult = true;
// 更新旋转矩阵
updateRotationDisplay(result.R);
// 更新平移向量
updateTranslationDisplay(result.T);
// 更新误差
m_lblError->setText(QString::number(result.error, 'f', 4) + " mm");
m_lblMaxError->setText(QString::number(result.maxError, 'f', 4) + " mm");
m_lblMinError->setText(QString::number(result.minError, 'f', 4) + " mm");
}
void CalibResultWidget::clearAll()
{
// 重置旋转矩阵为单位矩阵
HECRotationMatrix identity;
updateRotationDisplay(identity);
// 重置平移向量
HECTranslationVector zero;
updateTranslationDisplay(zero);
// 重置误差
m_lblError->setText("0.0000 mm");
m_lblMaxError->setText("0.0000 mm");
m_lblMinError->setText("0.0000 mm");
m_hasResult = false;
}
void CalibResultWidget::showTCPCalibResult(const HECTCPCalibResult& result)
{
// 平移向量写入表格第4列
if (m_tableRotation->item(0, 3))
m_tableRotation->item(0, 3)->setText(QString::number(result.tx, 'f', 6));
if (m_tableRotation->item(1, 3))
m_tableRotation->item(1, 3)->setText(QString::number(result.ty, 'f', 6));
if (m_tableRotation->item(2, 3))
m_tableRotation->item(2, 3)->setText(QString::number(result.tz, 'f', 6));
// 仅位置模式时旋转矩阵标识为 N/A
if (result.rx == 0 && result.ry == 0 && result.rz == 0) {
for (int i = 0; i < 3; ++i) {
for (int j = 0; j < 3; ++j) {
QTableWidgetItem* item = m_tableRotation->item(i, j);
if (item) {
item->setText("N/A");
}
}
}
}
// 误差显示
m_lblError->setText(QString::number(result.residualError, 'f', 4) + " mm");
}