You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
nmWTAI-Platform/Src/nmNum/nmSubWxs/nmWxDFNLoadFromFile.cpp

791 lines
23 KiB
C++

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#include "nmWxDFNLoadFromFile.h"
#include <QVBoxLayout>
#include <QHBoxLayout>
#include <QHeaderView>
#include <QCoreApplication>
#include <QFileDialog>
#include <QComboBox>
#include <QMessageBox>
#include <QTextStream>
#include "nmDataAnalyzeManager.h"
#include "nmDataFracture.h"
#include "nmGuiPlot.h"
#include "nmObjLineCrack.h"
#include "ZxPlot.h"
#include "ExcelUtils.h"
// 构造函数
nmWxDFNLoadFromFile::nmWxDFNLoadFromFile(QWidget* pParent)
: iDlgBase(pParent)
{
this->setWindowTitle(tr("Load from file..."));
this->setMinimumSize(861, 708);
QString appDir = QCoreApplication::applicationDirPath();
appDir = appDir.section('/', 0, -2); // 获取上一级目录
m_sLastOpenedFilePath = appDir + "/Temp/DFN";
this->initUI();
this->initConnections();
// 初始化Type到Unit的映射
this->initUnitMappings();
this->setupTable();
}
nmWxDFNLoadFromFile::~nmWxDFNLoadFromFile()
{
// 所有Qt对象会自动被父对象删除
}
void nmWxDFNLoadFromFile::initUI()
{
QVBoxLayout* pMainLayout = new QVBoxLayout(this);
// 创建水平布局容器
QHBoxLayout* pTopHorizontalLayout = new QHBoxLayout();
// 1. 数据源部分
m_pSourceGroup = new QGroupBox(tr("Data Source"), this);
m_pSourceGroup->setFixedSize(337, 106);
// 使用垂直布局作为主布局(包含按钮行和文件路径行)
QVBoxLayout* pSourceMainLayout = new QVBoxLayout(m_pSourceGroup);
// 1.1 导入文件按钮部分(水平布局)
QHBoxLayout* pLoadButtonLayout = new QHBoxLayout();
m_pLoadTxtButton = new QPushButton(this);
m_pLoadExcelButton = new QPushButton(this);
m_pCopyButton = new QPushButton(this);
QString appDir = QCoreApplication::applicationDirPath();
appDir = appDir.section('/', 0, -2); // 获取上一级目录
// 设置按钮图标
QIcon loadTXTIcon(appDir + "/Res/Icon/NmDFNLoadTXT.png");
QIcon loadExcelIcon(appDir + "/Res/Icon/NmDFNLoadExcel.png");
QIcon loadCopyIcon(appDir + "/Res/Icon/NmDFNLoadCopy.png");
m_pLoadTxtButton->setIcon(loadTXTIcon);
m_pLoadExcelButton->setIcon(loadExcelIcon);
m_pCopyButton->setIcon(loadCopyIcon);
// 设置图标大小
int iconSize = 32;
m_pLoadTxtButton->setIconSize(QSize(iconSize, iconSize));
m_pLoadExcelButton->setIconSize(QSize(iconSize, iconSize));
m_pCopyButton->setIconSize(QSize(iconSize, iconSize));
int iButtonWidth = 88;
int iButtonHeight = 41;
m_pLoadTxtButton->setFixedSize(iButtonWidth, iButtonHeight);
m_pLoadExcelButton->setFixedSize(iButtonWidth, iButtonHeight);
m_pCopyButton->setFixedSize(iButtonWidth, iButtonHeight);
pLoadButtonLayout->addWidget(m_pLoadTxtButton);
pLoadButtonLayout->addWidget(m_pLoadExcelButton);
pLoadButtonLayout->addWidget(m_pCopyButton);
pLoadButtonLayout->addStretch();
// 1.2 文件路径部分(水平布局)
QHBoxLayout* pFilePathLayout = new QHBoxLayout();
m_pFilePathEdit = new QLineEdit(this);
m_pBrowseButton = new QPushButton("...", this);
m_pBrowseButton->setFixedWidth(30); // 固定宽度
pFilePathLayout->addWidget(m_pFilePathEdit);
pFilePathLayout->addWidget(m_pBrowseButton);
// 将两个水平布局添加到垂直主布局(按钮在上,文件路径在下)
pSourceMainLayout->addLayout(pLoadButtonLayout);
pSourceMainLayout->addLayout(pFilePathLayout);
pTopHorizontalLayout->addWidget(m_pSourceGroup);
// 2. 分隔符部分
m_pSeparatorGroup = new QGroupBox(tr("Separators"), this);
m_pSeparatorGroup->setFixedSize(233,106); // 固定大小
// 使用复选框代替单选按钮
m_pSpaceCheck = new QCheckBox(tr("Space"), this);
m_pTabCheck = new QCheckBox(tr("Tab"), this);
m_pOtherLabel = new QLabel(tr("Others:"),this);
// 默认全部启用
m_pSpaceCheck->setChecked(true);
m_pTabCheck->setChecked(true);
m_pOtherSeparatorEdit = new QLineEdit(this);
m_pOtherSeparatorEdit->setMaximumWidth(50);
m_pOtherSeparatorEdit->setText(";"); // 默认自定义分隔符为分号
QVBoxLayout* pSepLayout = new QVBoxLayout(m_pSeparatorGroup);
pSepLayout->addWidget(m_pSpaceCheck);
pSepLayout->addWidget(m_pTabCheck);
QHBoxLayout* pOtherLayout = new QHBoxLayout();
pOtherLayout->addWidget(m_pOtherLabel);
pOtherLayout->addWidget(m_pOtherSeparatorEdit);
pOtherLayout->addStretch();
pSepLayout->addLayout(pOtherLayout);
pTopHorizontalLayout->addWidget(m_pSeparatorGroup);
// 3. 信息提示 - 现在放在GroupBox中
m_pInfoGroup = new QGroupBox(tr("Info"), this);
m_pInfoGroup->setFixedSize(255,106); // 固定大小
m_pInfoLabel = new QLabel(
tr("You need to assign at least 4 required types: X1, Y1, X2, Y2."),
this);
m_pInfoLabel->setWordWrap(true);
m_pInfoLabel->setAlignment(Qt::AlignLeft | Qt::AlignVCenter);
QVBoxLayout* pInfoLayout = new QVBoxLayout(m_pInfoGroup);
pInfoLayout->addWidget(m_pInfoLabel);
pTopHorizontalLayout->addWidget(m_pInfoGroup);
pTopHorizontalLayout->addStretch();
// 将水平布局添加到主布局
pMainLayout->addLayout(pTopHorizontalLayout);
// 4. 列类型分配表格
QWidget* pTableContainer = new QWidget(this);
QHBoxLayout* pTableLayout = new QHBoxLayout(pTableContainer);
pTableLayout->setContentsMargins(0, 0, 0, 0); // 去掉布局边距
m_pColumnTable = new QTableWidget();
m_pColumnTable->setStyleSheet("border: none;"); // 去掉表格的边框
pTableLayout->addWidget(m_pColumnTable);
//pTableLayout->addStretch();
// 设置容器的边框样式
pTableContainer->setStyleSheet("border: 1px solid #d3d3d3;");
pMainLayout->addWidget(pTableContainer);
// 5. 按钮区域
QHBoxLayout* pButtonLayout = new QHBoxLayout();
m_pOkButton = new QPushButton(tr("OK"), this);
m_pCancelButton = new QPushButton(tr("Cancel"), this);
pButtonLayout->addStretch();
pButtonLayout->addWidget(m_pOkButton);
pButtonLayout->addWidget(m_pCancelButton);
pMainLayout->addLayout(pButtonLayout);
}
void nmWxDFNLoadFromFile::initConnections()
{
connect(m_pOkButton, SIGNAL(clicked()), this, SLOT(onOkClicked()));
connect(m_pCancelButton, SIGNAL(clicked()), this, SLOT(onCancelClicked()));
connect(m_pLoadTxtButton, SIGNAL(clicked()), this, SLOT(onLoadTxtClicked()));
connect(m_pLoadExcelButton, SIGNAL(clicked()), this, SLOT(onLoadExcelClicked()));
connect(m_pBrowseButton, SIGNAL(clicked()), this, SLOT(onBrowseClicked()));
connect(m_pColumnTable, SIGNAL(cellClicked(int, int)), this, SLOT(onTableClicked(int, int)));
connect(m_pColumnTable, SIGNAL(cellChanged(int, int)), this, SLOT(onCellChanged(int, int)));
// 添加分隔符复选框的信号连接
connect(m_pSpaceCheck, SIGNAL(stateChanged(int)), this, SLOT(updateSeparators()));
connect(m_pTabCheck, SIGNAL(stateChanged(int)), this, SLOT(updateSeparators()));
connect(m_pOtherSeparatorEdit, SIGNAL(textChanged(QString)), this, SLOT(updateSeparators()));
}
void nmWxDFNLoadFromFile::initUnitMappings()
{
// 设置Type到单位选项的映射
m_typeToUnitOptions["X1"] = QStringList() << "cm" << "mm" << "m" << "0.1in" << "ft" << "mile";
m_typeToUnitOptions["Y1"] = QStringList() << "cm" << "mm" << "m" << "0.1in" << "ft" << "mile";
m_typeToUnitOptions["X2"] = QStringList() << "cm" << "mm" << "m" << "0.1in" << "ft" << "mile";
m_typeToUnitOptions["Y2"] = QStringList() << "cm" << "mm" << "m" << "0.1in" << "ft" << "mile";
m_typeToUnitOptions["Wf"] = QStringList() << "cm" << "mm" << "m" << "0.1in" << "ft" << "mile";
m_typeToUnitOptions["Fc"] = QStringList() << "md.ft" << "md.m" << "m^3";
m_typeToUnitOptions["o"] = QStringList(); // 空选项
m_typeToUnitOptions["UnDefined"] = QStringList(); // 空选项
// 设置Type到默认单位的映射
m_typeToDefaultUnit["X1"] = "m";
m_typeToDefaultUnit["Y1"] = "m";
m_typeToDefaultUnit["X2"] = "m";
m_typeToDefaultUnit["Y2"] = "m";
m_typeToDefaultUnit["Wf"] = "m";
m_typeToDefaultUnit["Fc"] = "md.m";
m_typeToDefaultUnit["o"] = ""; // 空
m_typeToDefaultUnit["UnDefined"] = ""; // 空
// 按顺序设置所有Type选项
m_allTypeOptions << "X1" << "Y1" << "X2" << "Y2" << "Fc" << "Wf" << "o" << "UnDefined";
}
void nmWxDFNLoadFromFile::setupTable()
{
// 设置表格为3行0列只有表头行没有数据列
m_pColumnTable->setRowCount(3); // Column, Type, Unit
m_pColumnTable->setColumnCount(0); // 初始没有列
// 设置垂直表头
QStringList verticalHeaders;
verticalHeaders << "Column" << "Type" << "Unit";
m_pColumnTable->setVerticalHeaderLabels(verticalHeaders);
// 设置表头样式
QHeaderView* verticalHeader = m_pColumnTable->verticalHeader();
QHeaderView* horizontalHeader = m_pColumnTable->horizontalHeader();
verticalHeader->setVisible(true);
horizontalHeader->setVisible(false);
// 关键修复:确保在设置数据前应用尺寸
verticalHeader->setMinimumSectionSize(20); // 行高
horizontalHeader->setMinimumSectionSize(100); // 列宽
// 锁定尺寸策略
m_pColumnTable->verticalHeader()->setResizeMode(QHeaderView::Fixed);
m_pColumnTable->horizontalHeader()->setResizeMode(QHeaderView::Fixed);
m_pColumnTable->verticalHeader()->setDefaultAlignment(Qt::AlignCenter);
m_pColumnTable->horizontalHeader()->setDefaultAlignment(Qt::AlignCenter);
// 设置默认行高
//m_pColumnTable->verticalHeader()->setDefaultSectionSize(25);
}
void nmWxDFNLoadFromFile::onLoadTxtClicked()
{
QString filePath = QFileDialog::getOpenFileName(
this,
tr("Open Text File"),
m_sLastOpenedFilePath,
tr("Text Files (*.txt);;All Files (*)")
);
if (filePath.isEmpty()) {
return;
}
// 检查文件扩展名
if (!filePath.endsWith(".txt", Qt::CaseInsensitive)) {
QMessageBox::warning(this, tr("Error"),
tr("Please select a text file (.txt)"));
return;
}
m_sLastOpenedFilePath = filePath;
m_pFilePathEdit->setText(filePath);
// 读取文件内容
QStringList lines = readFileContent(filePath);
if (lines.isEmpty()) {
return;
}
// 解析内容
QRegExp separatorRegex = buildSeparatorRegex();
QList<QStringList> parsedData;
for (int i = 0; i < lines.size(); ++i) {
parsedData << lines[i].split(separatorRegex, QString::SkipEmptyParts);
}
// 处理数据
clearDataRows();
setupTableColumns(parsedData.isEmpty() ? 0 : parsedData[0].size());
populateDataRows(parsedData);
}
void nmWxDFNLoadFromFile::onLoadExcelClicked()
{
QString filePath = QFileDialog::getOpenFileName(
this,
tr("Open Excel File"),
m_sLastOpenedFilePath,
tr("Excel Files (*.xls *.xlsx);;All Files (*)")
);
if (filePath.isEmpty()) {
return;
}
// 检查文件扩展名
if (!filePath.endsWith(".xls", Qt::CaseInsensitive) &&
!filePath.endsWith(".xlsx", Qt::CaseInsensitive)) {
QMessageBox::warning(this, tr("Error"),
tr("Please select an Excel file (.xls or .xlsx)"));
return;
}
m_sLastOpenedFilePath = filePath;
m_pFilePathEdit->setText(filePath);
// 解析Excel数据
QList<QStringList> excelData = parseExcelData(filePath);
if (excelData.isEmpty()) {
return;
}
// 处理数据
clearDataRows();
setupTableColumns(excelData.isEmpty() ? 0 : excelData[0].size());
populateDataRows(excelData);
}
void nmWxDFNLoadFromFile::onBrowseClicked()
{
QString filePath = QFileDialog::getOpenFileName(
this,
tr("Open Text File"),
m_sLastOpenedFilePath,
tr("Text Files (*.txt);;All Files (*)")
);
if (filePath.isEmpty()) {
return;
}
// 检查文件扩展名
if (!filePath.endsWith(".txt", Qt::CaseInsensitive)) {
QMessageBox::warning(this, tr("Error"),
tr("Please select a text file (.txt)"));
return;
}
m_sLastOpenedFilePath = filePath;
m_pFilePathEdit->setText(filePath);
// 读取文件内容
QStringList lines = readFileContent(filePath);
if (lines.isEmpty()) {
return;
}
// 解析内容
QRegExp separatorRegex = buildSeparatorRegex();
QList<QStringList> parsedData;
for (int i = 0; i < lines.size(); ++i) {
parsedData << lines[i].split(separatorRegex, QString::SkipEmptyParts);
}
// 处理数据
clearDataRows();
setupTableColumns(parsedData.isEmpty() ? 0 : parsedData[0].size());
populateDataRows(parsedData);
}
void nmWxDFNLoadFromFile::onTableClicked(int row, int col)
{
// 先检查是否有未关闭的下拉框,并保存值
closeOpenComboBox();
// 仅处理Type行(1)和Unit行(2)
if (row != 1 && row != 2) return;
// 获取当前单元格的文本
QTableWidgetItem* item = m_pColumnTable->item(row, col);
if (!item) return;
QString currentText = item->text();
// 移除可能已存在的单元格控件确保是QComboBox类型
QComboBox* existingCombo = qobject_cast<QComboBox*>(m_pColumnTable->cellWidget(row, col));
if (existingCombo) {
disconnect(existingCombo, 0, this, 0); // 断开原有信号连接
delete existingCombo;
}
// 创建下拉框
QComboBox* comboBox = new QComboBox();
// 根据行设置不同的选项
if (row == 1) { // Type行
comboBox->addItems(m_allTypeOptions);
} else { // Unit行 - 根据Type动态生成选项
// 获取当前列的Type值
QTableWidgetItem* typeItem = m_pColumnTable->item(1, col);
QString typeValue = typeItem ? typeItem->text() : "UnDefined";
// 获取对应的单位选项列表
QStringList unitOptions = m_typeToUnitOptions.value(typeValue);
comboBox->addItems(unitOptions);
// 如果Unit为空设置默认值
if (currentText.isEmpty()) {
QString defaultUnit = m_typeToDefaultUnit.value(typeValue);
int defaultIndex = comboBox->findText(defaultUnit);
if (defaultIndex >= 0) {
comboBox->setCurrentIndex(defaultIndex);
// 同时更新表格中的Unit值
item->setText(defaultUnit);
}
}
}
// 设置当前选中项兼容Qt 4
int index = comboBox->findText(currentText);
if (index >= 0) {
comboBox->setCurrentIndex(index);
}
// 设置样式并添加到单元格
comboBox->setStyleSheet("text-align: center;");
m_pColumnTable->setCellWidget(row, col, comboBox);
}
void nmWxDFNLoadFromFile::onCellChanged(int row, int col)
{
// 仅处理Type行(1)的变更
if (row != 1) return;
// 获取新的Type值
QTableWidgetItem* typeItem = m_pColumnTable->item(1, col);
if (!typeItem) return;
QString newType = typeItem->text();
// 获取对应的默认Unit
QString defaultUnit = m_typeToDefaultUnit.value(newType, "");
// 更新Unit行
QTableWidgetItem* unitItem = m_pColumnTable->item(2, col);
if (unitItem) {
unitItem->setText(defaultUnit);
} else {
unitItem = new QTableWidgetItem(defaultUnit);
unitItem->setTextAlignment(Qt::AlignCenter);
m_pColumnTable->setItem(2, col, unitItem);
}
}
void nmWxDFNLoadFromFile::closeOpenComboBox()
{
// 遍历所有单元格,关闭已打开的下拉框
for (int r = 0; r < m_pColumnTable->rowCount(); ++r) {
for (int c = 0; c < m_pColumnTable->columnCount(); ++c) {
QWidget* widget = m_pColumnTable->cellWidget(r, c);
if (widget && qobject_cast<QComboBox*>(widget)) {
QComboBox* comboBox = static_cast<QComboBox*>(widget);
QString selectedText = comboBox->currentText();
// 保存值到表格项
QTableWidgetItem* item = m_pColumnTable->item(r, c);
if (item) {
item->setText(selectedText);
} else {
item = new QTableWidgetItem(selectedText);
item->setTextAlignment(Qt::AlignCenter);
m_pColumnTable->setItem(r, c, item);
}
// 移除下拉框
m_pColumnTable->setCellWidget(r, c, nullptr);
delete comboBox;
}
}
}
}
void nmWxDFNLoadFromFile::updateSeparators()
{
// 检查是否有文件加载
QString filePath = m_pFilePathEdit->text();
if (filePath.isEmpty()) {
return;
}
// 重新加载文件以应用新的分隔符
//loadTextFile(filePath);
// 如果是文本文件,重新加载以应用新的分隔符
if (filePath.endsWith(".txt", Qt::CaseInsensitive)) {
// 读取文件内容
QStringList lines = readFileContent(filePath);
if (lines.isEmpty()) {
return;
}
// 解析内容
QRegExp separatorRegex = buildSeparatorRegex();
QList<QStringList> parsedData;
for (int i = 0; i < lines.size(); ++i) {
parsedData << lines[i].split(separatorRegex, QString::SkipEmptyParts);
}
// 处理数据
clearDataRows();
setupTableColumns(parsedData.isEmpty() ? 0 : parsedData[0].size());
populateDataRows(parsedData);
}
}
void nmWxDFNLoadFromFile::onOkClicked()
{
QVector<DFNData> vecDatas;
// 检查是否有足够的数据行至少4行表头+1行数据
if (m_pColumnTable->rowCount() < 4) {
QMessageBox::warning(this, tr("Error"), tr("No data rows found"));
return;
}
// 检查列数是否足够
if (m_pColumnTable->columnCount() == 0) {
QMessageBox::warning(this, tr("Error"), tr("No columns defined"));
return;
}
// 首先收集每列的类型和单位信息
QVector<QString> columnTypes;
for (int col = 0; col < m_pColumnTable->columnCount(); ++col) {
QTableWidgetItem* typeItem = m_pColumnTable->item(1, col);
QString type = typeItem ? typeItem->text() : "UnDefined";
columnTypes.append(type);
}
// 检查是否设置了必需的列X1, Y1, X2, Y2
bool hasX1 = columnTypes.contains("X1");
bool hasY1 = columnTypes.contains("Y1");
bool hasX2 = columnTypes.contains("X2");
bool hasY2 = columnTypes.contains("Y2");
if (!hasX1 || !hasY1 || !hasX2 || !hasY2) {
QMessageBox::warning(this, tr("Error"),
tr("Required columns (X1, Y1, X2, Y2) are not all defined"));
return;
}
// 从第4行开始读取数据前3行是表头
for (int row = 3; row < m_pColumnTable->rowCount(); ++row) {
DFNData dataRow;
// 检查是否定义了Fc、Wf、o列
bool hasFc = columnTypes.contains("Fc");
bool hasWf = columnTypes.contains("Wf");
bool hasO = columnTypes.contains("o");
// 定义默认值
const double defaultFc = 0.1;
const double defaultWf = 0.00328084;
const double defaultO = 10.0;
// 在循环内部处理
for (int col = 0; col < m_pColumnTable->columnCount(); ++col) {
QTableWidgetItem* item = m_pColumnTable->item(row, col);
QString value = item ? item->text() : "";
QString type = columnTypes[col];
bool ok;
double numValue = value.toDouble(&ok);
if (type == "X1") {
if (ok) dataRow.x1 = numValue;
}
else if (type == "Y1") {
if (ok) dataRow.y1 = numValue;
}
else if (type == "X2") {
if (ok) dataRow.x2 = numValue;
}
else if (type == "Y2") {
if (ok) dataRow.y2 = numValue;
}
else if (type == "Fc") {
if (ok) dataRow.fc = numValue;
}
else if (type == "Wf") {
if (ok) dataRow.wf = numValue;
}
else if (type == "o") {
if (ok) dataRow.o = numValue;
}
}
// 如果用户未分配该列,则填充默认值
if (!hasFc) dataRow.fc = defaultFc;
if (!hasWf) dataRow.wf = defaultWf;
if (!hasO) dataRow.o = defaultO;
vecDatas.append(dataRow);
}
// 清空原来的DFN图元数据
if (!nmDataAnalyzeManager::getCurrentInstance()->getDFNFractureDataList().isEmpty()) {
nmGuiPlot* pCurPlot = nmDataAnalyzeManager::getCurrentInstance()->getPlot();
pCurPlot->deleteAllDFNPlots();
}
// 遍历vecDatas将数据存入数据中心
foreach (const DFNData &data, vecDatas) {
nmDataFracture* pFractrue = nmDataAnalyzeManager::getCurrentInstance()->createFracture();
// 裂缝名称
pFractrue->setFractureName("DFN");
// 裂缝位置信息
QPointF pt1(data.x1,data.y1);
QPointF pt2(data.x2,data.y2);
QVector<QPointF> vecPts;
vecPts.append(pt1);
vecPts.append(pt2);
pFractrue->setFracturePoints(vecPts);
// 裂缝流动类型,默认为无限导流
nmDataAttribute tempAttr = pFractrue->getFractureFlowModel();
tempAttr.setValue(tr("Finite Conductivity"));
pFractrue->setFractureFlowModel(tempAttr);
// 裂缝导流能力
tempAttr = pFractrue->getFractureDfc();
tempAttr.setValue(data.fc);
pFractrue->setFractureDfc(tempAttr);
// TODO:裂缝宽度
// TODO:裂缝孔隙度
// 新增裂缝类型区分普通裂缝和DFN生成的裂缝
tempAttr = pFractrue->getFractureType();
tempAttr.setValue(tr("DFN"));
pFractrue->setFractureType(tempAttr);
nmGuiPlot* pCurPlot = nmDataAnalyzeManager::getCurrentInstance()->getPlot();
if (pCurPlot != nullptr) {
// 添加一条裂缝
QString sName = pFractrue->getFractureName();
QVector<QPointF> vecFracurePts =pFractrue->getFracturePoints();
// 转换坐标
QVector<QPointF> vecConvertPoints = pCurPlot->m_pPlot->getPosForValue(vecFracurePts);
nmObjLineCrack* pFractrePlot = (nmObjLineCrack*)pCurPlot->appendOneObj(NMOT_Line_Fracture, sName,vecConvertPoints);
if(pFractrePlot == nullptr) {
continue;
}
// 绑定边界数据到图元对象上
pFractrePlot->setFractureData(pFractrue);
pFractrePlot->setPen(QPen(QBrush(QColor("#00bfff")), 0.4f, Qt::SolidLine));
pFractrePlot->setLockForDFN();
}
}
// 如果一切正常,接受对话框
this->accept();
}
void nmWxDFNLoadFromFile::onCancelClicked()
{
this->reject();
}
// 清除数据行(保留表头行)
void nmWxDFNLoadFromFile::clearDataRows()
{
while (m_pColumnTable->rowCount() > 3) {
m_pColumnTable->removeRow(3);
}
}
// 构建分隔符正则表达式
QRegExp nmWxDFNLoadFromFile::buildSeparatorRegex() const
{
QStringList separators;
if (m_pSpaceCheck->isChecked()) {
separators << " ";
}
if (m_pTabCheck->isChecked()) {
separators << "\\t";
}
if (!m_pOtherSeparatorEdit->text().isEmpty()) {
separators << QRegExp::escape(m_pOtherSeparatorEdit->text());
}
return QRegExp(QString("[%1]+").arg(separators.join("")));
}
// 设置表格列
void nmWxDFNLoadFromFile::setupTableColumns(int columnCount)
{
m_pColumnTable->setColumnCount(columnCount);
for (int col = 0; col < columnCount; ++col) {
// Column行
QTableWidgetItem* colItem = new QTableWidgetItem(QString("Column %1").arg(col + 1));
colItem->setFlags((colItem->flags() & ~Qt::ItemIsEditable) | Qt::ItemIsSelectable | Qt::ItemIsEnabled);
m_pColumnTable->setItem(0, col, colItem);
// Type行
QString defaultType = (col < m_allTypeOptions.size()) ? m_allTypeOptions[col] : "UnDefined";
m_pColumnTable->setItem(1, col, new QTableWidgetItem(defaultType));
// Unit行
QString defaultUnit = m_typeToDefaultUnit.value(defaultType, "");
m_pColumnTable->setItem(2, col, new QTableWidgetItem(defaultUnit));
}
}
// 填充数据行
void nmWxDFNLoadFromFile::populateDataRows(const QList<QStringList>& dataLines)
{
for (int row = 0; row < dataLines.size(); ++row) {
const QStringList& values = dataLines[row];
m_pColumnTable->insertRow(row + 3);
for (int col = 0; col < values.size(); ++col) {
QTableWidgetItem* item = new QTableWidgetItem(values[col]);
item->setFlags((item->flags() & ~Qt::ItemIsEditable) | Qt::ItemIsSelectable | Qt::ItemIsEnabled);
m_pColumnTable->setItem(row + 3, col, item);
}
}
}
// 读取文本文件内容
QStringList nmWxDFNLoadFromFile::readFileContent(const QString& filePath)
{
QStringList lines;
QFile file(filePath);
if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
QMessageBox::warning(this, tr("Error"), tr("Could not open file"));
return lines;
}
QTextStream in(&file);
while (!in.atEnd()) {
QString line = in.readLine().trimmed();
if (!line.isEmpty()) {
lines << line;
}
}
file.close();
return lines;
}
// 解析Excel数据
QList<QStringList> nmWxDFNLoadFromFile::parseExcelData(QString filePath)
{
QList<QStringList> result;
ExcelUtils excelUtils;
QString log;
VVecVariant data;
if (!excelUtils.loadExcel(data, NULL, filePath, log)) {
QMessageBox::warning(this, tr("Import Error"), tr("Failed to import Excel : \n") + log);
return result;
}
// 转换VVecVariant到QList<QStringList>
for (int i = 0; i < data.size(); ++i) {
QStringList row;
for (int j = 0; j < data[i].size(); ++j) {
row << data[i][j].toString();
}
result << row;
}
return result;
}