#include "AddSurfaceFileDlg.h" #include "ui_AddSurfaceFileDlg.h" #include "workspace/WorkSpaceManager.h" #include "workspace/WorkSpace.h" #include "common/SpdLogger.h" #include #include #include #include #include #include #include AddSurfaceFileDlg::AddSurfaceFileDlg(QWidget *parent) : BaseAddFileDlg(FileEntryType::Surface, parent) , ui(new Ui::AddSurfaceFileDlg) , currentSurfaceIndex_(-1) , selectedColor_(Qt::blue) { SetupUI(ui); SetTitle(getDialogTitle()); setupConnections(); // Initialize chart properties with default values chartProperties_.xCount = 7; chartProperties_.yCount = 0; chartProperties_.zCount = 7; chartProperties_.xMin = 0.0; chartProperties_.xMax = 14000; chartProperties_.yMin = 0.0; chartProperties_.yMax = 0.0; chartProperties_.zMin = 0.0; chartProperties_.zMax = 70; chartProperties_.timeParam = 0.0; chartProperties_.xTitle = "Y Axis"; chartProperties_.yTitle = "Z Axis"; chartProperties_.zTitle = "X Axis"; // Set default UI values ui->xCountSpinBox->setValue(chartProperties_.xCount); ui->yCountSpinBox->setValue(chartProperties_.yCount); ui->zCountSpinBox->setValue(chartProperties_.zCount); ui->xMinSpinBox->setValue(chartProperties_.xMin); ui->xMaxSpinBox->setValue(chartProperties_.xMax); ui->yMinSpinBox->setValue(chartProperties_.yMin); ui->yMaxSpinBox->setValue(chartProperties_.yMax); ui->zMinSpinBox->setValue(chartProperties_.zMin); ui->zMaxSpinBox->setValue(chartProperties_.zMax); ui->timeParamSpinBox->setValue(chartProperties_.timeParam); ui->xTitleLineEdit->setText(chartProperties_.xTitle); ui->yTitleLineEdit->setText(chartProperties_.yTitle); ui->zTitleLineEdit->setText(chartProperties_.zTitle); // Initialize color preview updateColorPreview(ui->surfaceColorButton, selectedColor_); // Clear surface properties initially clearSurfaceProperties(); ui->dataFormatGroupBox->setVisible(false); ui->comboBox_x->setCurrentText("y"); ui->comboBox_y->setCurrentText("z"); ui->comboBox_z->setCurrentText("x"); } AddSurfaceFileDlg::~AddSurfaceFileDlg() { delete ui; } void AddSurfaceFileDlg::setupConnections() { // File selection connections connect(ui->browseButton, &QPushButton::clicked, this, &AddSurfaceFileDlg::onSelectFile); connect(ui->filePathLineEdit, &QLineEdit::textChanged, this, &AddSurfaceFileDlg::onFilePathChanged); // Surface management connections connect(ui->surfaceColorButton, &QPushButton::clicked, this, &AddSurfaceFileDlg::onSurfaceColorButtonClicked); connect(ui->addSurfaceButton, &QPushButton::clicked, this, &AddSurfaceFileDlg::onAddSurfaceClicked); connect(ui->removeSurfaceButton, &QPushButton::clicked, this, &AddSurfaceFileDlg::onRemoveSurfaceClicked); connect(ui->surfaceListWidget, &QListWidget::itemClicked, this, &AddSurfaceFileDlg::onSurfaceListItemClicked); connect(ui->surfaceListWidget, &QListWidget::itemSelectionChanged, this, &AddSurfaceFileDlg::onSurfaceSelectionChanged); // Surface properties connections connect(ui->surfaceNameLineEdit, &QLineEdit::textChanged, this, &AddSurfaceFileDlg::onSurfaceNameChanged); connect(ui->surfaceStartSpinBox, QOverload::of(&QSpinBox::valueChanged), this, &AddSurfaceFileDlg::onSurfaceDataChanged); connect(ui->surfaceStopSpinBox, QOverload::of(&QSpinBox::valueChanged), this, &AddSurfaceFileDlg::onSurfaceDataChanged); connect(ui->comboBox_x, QOverload::of(&QComboBox::currentTextChanged), this, &AddSurfaceFileDlg::onSurfaceDataChanged); connect(ui->comboBox_y, QOverload::of(&QComboBox::currentTextChanged), this, &AddSurfaceFileDlg::onSurfaceDataChanged); connect(ui->comboBox_z, QOverload::of(&QComboBox::currentTextChanged), this, &AddSurfaceFileDlg::onSurfaceDataChanged); // Chart properties connections (save to member variables when changed) connect(ui->xCountSpinBox, QOverload::of(&QSpinBox::valueChanged), [this](int value) { chartProperties_.xCount = value; }); connect(ui->yCountSpinBox, QOverload::of(&QSpinBox::valueChanged), [this](int value) { chartProperties_.yCount = value; }); connect(ui->zCountSpinBox, QOverload::of(&QSpinBox::valueChanged), [this](int value) { chartProperties_.zCount = value; }); connect(ui->xMinSpinBox, QOverload::of(&QDoubleSpinBox::valueChanged), [this](double value) { chartProperties_.xMin = value; }); connect(ui->xMaxSpinBox, QOverload::of(&QDoubleSpinBox::valueChanged), [this](double value) { chartProperties_.xMax = value; }); connect(ui->yMinSpinBox, QOverload::of(&QDoubleSpinBox::valueChanged), [this](double value) { chartProperties_.yMin = value; }); connect(ui->yMaxSpinBox, QOverload::of(&QDoubleSpinBox::valueChanged), [this](double value) { chartProperties_.yMax = value; }); connect(ui->zMinSpinBox, QOverload::of(&QDoubleSpinBox::valueChanged), [this](double value) { chartProperties_.zMin = value; }); connect(ui->zMaxSpinBox, QOverload::of(&QDoubleSpinBox::valueChanged), [this](double value) { chartProperties_.zMax = value; }); connect(ui->timeParamSpinBox, QOverload::of(&QSpinBox::valueChanged), [this](int value) { chartProperties_.timeParam = value; }); connect(ui->xTitleLineEdit, &QLineEdit::textChanged, [this](const QString& text) { chartProperties_.xTitle = text; }); connect(ui->yTitleLineEdit, &QLineEdit::textChanged, [this](const QString& text) { chartProperties_.yTitle = text; }); connect(ui->zTitleLineEdit, &QLineEdit::textChanged, [this](const QString& text) { chartProperties_.zTitle = text; }); // Dialog button connections connect(ui->buttonBox, &QDialogButtonBox::accepted, this, &AddSurfaceFileDlg::accept); connect(ui->buttonBox, &QDialogButtonBox::rejected, this, &AddSurfaceFileDlg::reject); } QString AddSurfaceFileDlg::getFileFilter() const { return tr("Surface Data Files (*.txt *.dat *.csv);;All Files (*.*)"); } QString AddSurfaceFileDlg::getDialogTitle() const { return tr("Add Surface Dialog"); } bool AddSurfaceFileDlg::validateSpecificParams() { if (surfaces_.isEmpty()) { QMessageBox::warning(this, tr("Warning"), tr("Please add at least one surface.")); return false; } // Validate chart properties if (chartProperties_.xTitle.isEmpty() || chartProperties_.yTitle.isEmpty() || chartProperties_.zTitle.isEmpty()) { QMessageBox::warning(this, tr("Warning"), tr("Please fill in all axis titles.")); return false; } return true; } void AddSurfaceFileDlg::updateFileInfo(const QString& filePath) { ui->filePathLineEdit->setText(filePath); } void AddSurfaceFileDlg::onSelectFile() { QString documentsPath = QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation); QString fileName = QFileDialog::getOpenFileName(this, getDialogTitle(), documentsPath, getFileFilter()); if (!fileName.isEmpty()) { updateFileInfo(fileName); } } void AddSurfaceFileDlg::onFilePathChanged() { // File path changed, could update preview or validation here } void AddSurfaceFileDlg::onSurfaceColorButtonClicked() { QColor color = QColorDialog::getColor(selectedColor_, this, tr("Select Surface Color")); if (color.isValid()) { selectedColor_ = color; updateColorPreview(ui->surfaceColorButton, selectedColor_); // Update current surface color if one is selected if (currentSurfaceIndex_ >= 0 && currentSurfaceIndex_ < surfaces_.size()) { surfaces_[currentSurfaceIndex_].color = selectedColor_; // Update list item color QListWidgetItem* item = ui->surfaceListWidget->item(currentSurfaceIndex_); if (item) { QPixmap pixmap(16, 16); pixmap.fill(selectedColor_); item->setIcon(QIcon(pixmap)); } } } } void AddSurfaceFileDlg::onAddSurfaceClicked() { FileEntrySurface::SurfaceProperty surface; surface.name = generateSurfaceName(); surface.color = generateSurfaceColor(); surface.start = 0; surface.stop = 0; surface.x = ui->comboBox_x->currentText(); surface.y = ui->comboBox_y->currentText(); surface.z = ui->comboBox_z->currentText(); surfaces_.append(surface); addSurfaceToList(surface); // Select the newly added surface ui->surfaceListWidget->setCurrentRow(surfaces_.size() - 1); } void AddSurfaceFileDlg::onRemoveSurfaceClicked() { int currentRow = ui->surfaceListWidget->currentRow(); if (currentRow >= 0 && currentRow < surfaces_.size()) { surfaces_.removeAt(currentRow); delete ui->surfaceListWidget->takeItem(currentRow); // Update current surface index if (currentRow < surfaces_.size()) { ui->surfaceListWidget->setCurrentRow(currentRow); } else if (surfaces_.size() > 0) { ui->surfaceListWidget->setCurrentRow(surfaces_.size() - 1); } else { currentSurfaceIndex_ = -1; clearSurfaceProperties(); } } } void AddSurfaceFileDlg::onSurfaceListItemClicked(QListWidgetItem* item) { int row = ui->surfaceListWidget->row(item); if (row >= 0 && row < surfaces_.size()) { saveSurfaceProperties(); // Save current surface properties currentSurfaceIndex_ = row; updateSurfaceProperties(); // Load new surface properties } } void AddSurfaceFileDlg::onSurfaceSelectionChanged() { int currentRow = ui->surfaceListWidget->currentRow(); if (currentRow >= 0 && currentRow < surfaces_.size()) { saveSurfaceProperties(); // Save current surface properties currentSurfaceIndex_ = currentRow; updateSurfaceProperties(); // Load new surface properties } else { currentSurfaceIndex_ = -1; clearSurfaceProperties(); } } void AddSurfaceFileDlg::onSurfaceNameChanged() { if (currentSurfaceIndex_ >= 0 && currentSurfaceIndex_ < surfaces_.size()) { QString newName = ui->surfaceNameLineEdit->text(); surfaces_[currentSurfaceIndex_].name = newName; // Update list item text QListWidgetItem* item = ui->surfaceListWidget->item(currentSurfaceIndex_); if (item) { item->setText(newName); } } } void AddSurfaceFileDlg::onSurfaceDataChanged() { if (currentSurfaceIndex_ >= 0 && currentSurfaceIndex_ < surfaces_.size()) { surfaces_[currentSurfaceIndex_].start = ui->surfaceStartSpinBox->value(); surfaces_[currentSurfaceIndex_].stop = ui->surfaceStopSpinBox->value(); surfaces_[currentSurfaceIndex_].x = ui->comboBox_x->currentText(); surfaces_[currentSurfaceIndex_].y = ui->comboBox_y->currentText(); surfaces_[currentSurfaceIndex_].z = ui->comboBox_z->currentText(); } } void AddSurfaceFileDlg::updateColorPreview(QPushButton* button, const QColor& color) { if (button && color.isValid()) { QString styleSheet = QString("QPushButton { background-color: %1; }").arg(color.name()); button->setStyleSheet(styleSheet); } } void AddSurfaceFileDlg::addSurfaceToList(const FileEntrySurface::SurfaceProperty& surface) { QListWidgetItem* item = new QListWidgetItem(surface.name); // Set color icon QPixmap pixmap(16, 16); pixmap.fill(surface.color); item->setIcon(QIcon(pixmap)); ui->surfaceListWidget->addItem(item); } void AddSurfaceFileDlg::updateSurfaceProperties() { if (currentSurfaceIndex_ >= 0 && currentSurfaceIndex_ < surfaces_.size()) { const auto& surface = surfaces_[currentSurfaceIndex_]; ui->surfaceNameLineEdit->blockSignals(true); ui->surfaceNameLineEdit->setText(surface.name); ui->surfaceNameLineEdit->blockSignals(false); ui->surfaceStartSpinBox->blockSignals(true); ui->surfaceStartSpinBox->setValue(surface.start); ui->surfaceStartSpinBox->blockSignals(false); ui->surfaceStopSpinBox->blockSignals(true); ui->surfaceStopSpinBox->setValue(surface.stop); ui->surfaceStopSpinBox->blockSignals(false); ui->comboBox_x->blockSignals(true); ui->comboBox_x->setCurrentText(surface.x); ui->comboBox_x->blockSignals(false); ui->comboBox_y->blockSignals(true); ui->comboBox_y->setCurrentText(surface.y); ui->comboBox_y->blockSignals(false); ui->comboBox_z->blockSignals(true); ui->comboBox_z->setCurrentText(surface.z); ui->comboBox_z->blockSignals(false); selectedColor_ = surface.color; updateColorPreview(ui->surfaceColorButton, selectedColor_); ui->surfacePropertiesGroupBox->setEnabled(true); } else { clearSurfaceProperties(); } } void AddSurfaceFileDlg::saveSurfaceProperties() { if (currentSurfaceIndex_ >= 0 && currentSurfaceIndex_ < surfaces_.size()) { surfaces_[currentSurfaceIndex_].name = ui->surfaceNameLineEdit->text(); surfaces_[currentSurfaceIndex_].start = ui->surfaceStartSpinBox->value(); surfaces_[currentSurfaceIndex_].stop = ui->surfaceStopSpinBox->value(); surfaces_[currentSurfaceIndex_].color = selectedColor_; } } void AddSurfaceFileDlg::clearSurfaceProperties() { ui->surfaceNameLineEdit->clear(); ui->surfaceStartSpinBox->setValue(0); ui->surfaceStopSpinBox->setValue(0); selectedColor_ = QColor(61, 38, 168); updateColorPreview(ui->surfaceColorButton, selectedColor_); ui->surfacePropertiesGroupBox->setEnabled(false); } QString AddSurfaceFileDlg::generateSurfaceName() const { return QString("Surface %1").arg(surfaces_.size() + 1); } QColor AddSurfaceFileDlg::generateSurfaceColor() const { // Generate different colors for each surface static const QColor colors[] = { QColor(61, 38, 168), Qt::blue, Qt::red, Qt::green, Qt::magenta, Qt::cyan, Qt::yellow, Qt::darkBlue, Qt::darkRed, Qt::darkGreen, Qt::darkMagenta, Qt::darkCyan, Qt::darkYellow }; int colorIndex = surfaces_.size() % (sizeof(colors) / sizeof(colors[0])); return colors[colorIndex]; } AddSurfaceFileDlg::SurfaceParams AddSurfaceFileDlg::GetSurfaceParams() const { SurfaceParams params; params.xColumn = ui->xColumnSpinBox->value(); params.yColumn = ui->yColumnSpinBox->value(); params.zColumn = ui->zColumnSpinBox->value(); params.separator = ui->separatorLineEdit->text(); params.xGridSize = ui->xGridSizeSpinBox->value(); params.yGridSize = ui->yGridSizeSpinBox->value(); params.hasHeader = ui->hasHeaderCheckBox->isChecked(); return params; } QString AddSurfaceFileDlg::GetSelectedFilePath() const { return ui->filePathLineEdit->text(); } QString AddSurfaceFileDlg::GetDescription() const { return getDescription(); // 使用基类的getDescription方法 } void AddSurfaceFileDlg::accept() { QString sName = ui->NameLineEdit->text(); // Validate table-specific parameters if (sName.isEmpty()) { QMessageBox::warning(this, tr("Warning"), tr("Please enter a Surface name.")); return; } if (!validateSpecificParams()) { return; } // Save current surface properties before creating FileEntry saveSurfaceProperties(); // Create FileEntrySurface auto fileEntry = std::dynamic_pointer_cast(CreateFileEntrySurface(GetSelectedFilePath())); if (!fileEntry) { QMessageBox::critical(this, tr("Error"), tr("Failed to create surface file entry.")); return; } fileEntry->SetName(sName); // Set chart properties fileEntry->SetChartProperties(chartProperties_); // Set surface properties for (const auto& surface : surfaces_) { fileEntry->AddSurfaceProperty(surface); } // Set description //fileEntry->SetDescription(GetDescription()); // Add to workspace WorkSpace* workspace = WorkSpaceManager::Get().GetCurrent(); if (!workspace) { QMessageBox::critical(this, tr("Error"), tr("Unable to get current workspace")); return; } // Add FileEntrySurface to workspace using SetFileEntry method auto result = workspace->SetFileEntry(fileEntry); if (result != WorkSpace::FileEntryResult::Ok) { QString errorMsg; switch (result) { case WorkSpace::FileEntryResult::LimitExceeded: errorMsg = tr("Surface file count has reached the limit (9 files)"); break; case WorkSpace::FileEntryResult::Duplicate: errorMsg = tr("File already exists"); break; case WorkSpace::FileEntryResult::CopyFailed: errorMsg = tr("File copy failed"); break; case WorkSpace::FileEntryResult::InvalidFile: errorMsg = tr("Invalid file"); break; default: errorMsg = tr("Failed to add file"); break; } QMessageBox::warning(this, tr("Error"), errorMsg); return; } LOG_INFO("Added surface file to workspace: {}", GetSelectedFilePath().toUtf8().constData()); QDialog::accept(); }