diff --git a/src/DataProcessWorkPool.cpp b/src/DataProcessWorkPool.cpp index cdeadd9..50faab5 100644 --- a/src/DataProcessWorkPool.cpp +++ b/src/DataProcessWorkPool.cpp @@ -121,7 +121,7 @@ bool EveryChannelParticleDataSeparateTask::processEveryChannelParticleData() // 板卡和通道号计算,通道号 = 板卡号 * 4 + 通道号 int channel_num = (board_id) * 4 + (channel_id + 1); - QString particle_data_filename = result_data_output_dir.filePath(QString("ParticleData_ch_%1.csv").arg(channel_num)); + QString particle_data_filename = result_data_output_dir.filePath(QStringLiteral(u"通道%1粒子数据.csv").arg(channel_num)); if (!particle_data_filename_list.contains(channel_num)) { particle_data_filename_list.insert(channel_num, particle_data_filename); } @@ -201,7 +201,7 @@ bool EveryChannelParticleCountDataTask::processEveryChannelParticleData() const QString& all_channel_particle_data_filename = GetAllChannelParticleDataFilename(); QMap particle_count_filename_list; - QString all_channel_total_count_filename; + // QString all_channel_total_count_filename; try { // 统计每个通道的粒子计数(相同板卡号通道号相同道址) @@ -248,7 +248,7 @@ bool EveryChannelParticleCountDataTask::processEveryChannelParticleData() // 预创建所有通道的文件流 for (auto channel_it = channel_address_counts.begin(); channel_it != channel_address_counts.end(); ++channel_it) { uint channel_num = channel_it.key(); - QString count_data_filename = every_ch_count_output_dir.filePath(QString("ParticleCountData_ch_%1.csv").arg(channel_num)); + QString count_data_filename = every_ch_count_output_dir.filePath(QStringLiteral(u"通道%1粒子计数.csv").arg(channel_num)); particle_count_filename_list.insert(channel_num, count_data_filename); // 创建文件流 @@ -492,7 +492,7 @@ bool ParticleDataSortTask::processEveryChannelParticleData() sorted_result_output_dir.mkpath(sorted_result_dir); const QString& all_channel_particle_data_filename = GetAllChannelParticleDataFilename(); - QString sorted_output_filename = sorted_result_output_dir.filePath("SortedParticleData.csv"); + QString sorted_output_filename = sorted_result_output_dir.filePath(QStringLiteral(u"粒子数据[已排序].csv")); try { const size_t CHUNK_SIZE = 100 * 1024 * 1024; // 100MB chunks diff --git a/src/MainWindow.cpp b/src/MainWindow.cpp index 80ba8da..19367d1 100644 --- a/src/MainWindow.cpp +++ b/src/MainWindow.cpp @@ -9,13 +9,13 @@ #include #include #include - +#include +#include #include "DockAreaWidget.h" #include "DockComponentsFactory.h" #include "DockManager.h" #include "DockWidget.h" #include "FloatingDockContainer.h" - #include "AboutDlg.h" #include "DataProcessWorkPool.h" #include "EneryScaleForm.h" @@ -25,6 +25,7 @@ #include "NewMeasureAnalysisDlg.h" #include "MeasureAnalysisView.h" #include "MeasureAnalysisTreeView.h" +#include "GlobalDefine.h" using namespace ads; @@ -170,8 +171,42 @@ void MainWindow::initAction() } } }; - connect(ui->action_new_measurement_analysis, &QAction::triggered, this, new_measurement_analysis_handler); + connect(ui->action_open_measurement_analysis, &QAction::triggered, this, [this](){ + const QString& filename = QFileDialog::getOpenFileName(this, QStringLiteral(u"选择测量分析项目文件"), QString(), QStringLiteral(u"测量分析项目 (*.msproject)")); + if (filename.isEmpty()) { + return; + } + QFileInfo file_info(filename); + if (file_info.size() == 0) { + QMessageBox::warning(this, QStringLiteral(u"警告"), QStringLiteral(u"选择的测量分析项目文件为空文件!")); + return; + } + MeasureAnalysisProjectModel* model = new MeasureAnalysisProjectModel; + if (model->LoadProjectModel(filename)) { + ProjectList::Instance()->AddProjectModel(model); + } + + }); + connect(ui->action_save_measurement_analysis, &QAction::triggered, this, [](){ + MeasureAnalysisProjectModel* project_model = ProjectList::Instance()->GetCurrentProjectModel(); + if (project_model) { + const QString& project_name = project_model->GetProjectName(); + if ( project_model->SaveProjectModel() ){ + const QString& info_text = QStringLiteral(u"保存测量分析项目\"%1\"完成.").arg(project_name); + LOG_INFO(info_text); + } else { + const QString& warn_text = QStringLiteral(u"保存测量分析项目\"%1\"失败!").arg(project_name); + LOG_WARN(warn_text); + } + } + }); + connect(ui->action_close_measurement_analysis, &QAction::triggered, this, [](){ + MeasureAnalysisProjectModel* project_model = ProjectList::Instance()->GetCurrentProjectModel(); + if (project_model) { + + } + }); connect(ui->action_manage_measurement_analysis, &QAction::triggered, this->_action_central_dock_widget, &QAction::triggered); connect(ui->action_device_config_mrg, &QAction::triggered, this, []() { QDialog device_cfg_mrg_dlg; diff --git a/src/MeasureAnalysisProjectModel.cpp b/src/MeasureAnalysisProjectModel.cpp index dbe5828..8cad2e0 100644 --- a/src/MeasureAnalysisProjectModel.cpp +++ b/src/MeasureAnalysisProjectModel.cpp @@ -1,6 +1,11 @@ #include "MeasureAnalysisProjectModel.h" #include "AnalysisTypeDefine.h" #include "GlobalDefine.h" +#include +#include +#include +#include + void MeasureAnalysisProjectModel::SetProjectDir(const QString& project_dir) { @@ -84,7 +89,7 @@ void MeasureAnalysisProjectModel::SetChannelAddressCountDataFilename(uint channe void MeasureAnalysisProjectModel::SetChannelEneryCountDataFilename(uint channel, const QString& filename) { - this->_channel_every_count_data_filename_list[channel] = filename; + this->_channel_enery_count_data_filename_list[channel] = filename; } void MeasureAnalysisProjectModel::SetAllChannelEneryTotalCountDataFilename(const QString& filename) @@ -193,14 +198,14 @@ const QString& MeasureAnalysisProjectModel::GetChannelAddressCountDataFilename(u const QMap& MeasureAnalysisProjectModel::GetChannelEneryCountDataFilenameList() const { - return this->_channel_every_count_data_filename_list; + return this->_channel_enery_count_data_filename_list; } const QString& MeasureAnalysisProjectModel::GetChannelEneryCountDataFilename(uint channel) const { QString file_name; - if ( this->_channel_every_count_data_filename_list.contains(channel) ) { - file_name = this->_channel_every_count_data_filename_list[channel]; + if ( this->_channel_enery_count_data_filename_list.contains(channel) ) { + file_name = this->_channel_enery_count_data_filename_list[channel]; } return file_name; } @@ -219,6 +224,189 @@ const QMap& MeasureAnalysisProjectModel::GetTimeWinConformParticl return conform_particle_data; } +bool MeasureAnalysisProjectModel::LoadProjectModel(const QString& project_filename) +{ + this->_project_filename = project_filename; + // 从json文件加载项目模型 + QFile json_file(this->_project_filename); + if (!json_file.open(QIODevice::ReadOnly | QIODevice::Text)) + { + return false; + } + QJsonDocument json_doc = QJsonDocument::fromJson(json_file.readAll()); + json_file.close(); + if (json_doc.isNull()) + { + return false; + } + if (!json_doc.isObject()) + { + return false; + } + QJsonObject json_obj = json_doc.object(); + if (!json_obj.contains("ProjectName")) + { + return false; + } + this->_project_name = json_obj["ProjectName"].toString(); + if (!json_obj.contains("SpectrumType")) + { + return false; + } + this->_spec_type = (SpectrumType)json_obj["SpectrumType"].toInt(); + if (!json_obj.contains("IsStandardSource")) + { + return false; + } + this->_is_std_source = json_obj["IsStandardSource"].toBool(); + if (!json_obj.contains("DescriptionInfo")) + { + return false; + } + this->_description_info = json_obj["DescriptionInfo"].toString(); + if (!json_obj.contains("MeasurePresetTime")) + { + return false; + } + this->_measure_preset_time = json_obj["MeasurePresetTime"].toInt(); + if (!json_obj.contains("IsMeasureComplete")) + { + return false; + } + this->_is_measure_complete = json_obj["IsMeasureComplete"].toBool(); + if (!json_obj.contains("ConformTimeWin")) + { + return false; + } + this->_conform_time_win = json_obj["ConformTimeWin"].toInt(); + + QFileInfo project_fileinfo(project_filename); + this->_project_dir = project_fileinfo.absoluteDir().absolutePath(); + + auto ProjectAbsFilename = [this](const QString& project_relative_filename){ + QString project_abs_filename; + if ( !project_relative_filename.isEmpty() ) { + QDir project_dir(this->_project_dir); + project_abs_filename = project_dir.filePath(project_relative_filename); + QFileInfo file_info(project_abs_filename); + if ( !file_info.exists() ) { + project_abs_filename.clear(); + } + } + return project_abs_filename; + }; + + this->_measure_device_params_cfg_filename = ProjectAbsFilename(json_obj["MeasureDeviceParamsCfgFilename"].toString()); + this->_enery_scale_filename = ProjectAbsFilename(json_obj["EneryScaleFilename"].toString()); + this->_efficiency_scale_filename = ProjectAbsFilename(json_obj["EfficiencyScaleFilename"].toString()); + + this->_all_channel_particle_data_filename = ProjectAbsFilename(json_obj["AllChannelParticleDataFilename"].toString()); + this->_sorted_particle_data_filename = ProjectAbsFilename(json_obj["SortedParticleDataFilename"].toString()); + + const auto& address_count_data_filename_list = json_obj["ChannelAddressCountDataFilenameList"].toObject().toVariantMap(); + for (auto it = address_count_data_filename_list.constBegin(); it!=address_count_data_filename_list.constEnd(); ++it) { + uint channel_num = it.key().toUInt(); + this->_channel_address_count_data_filename_list[channel_num] = ProjectAbsFilename(it.value().toString()); + } + + const auto& enery_count_data_filename_list = json_obj["ChannelEneryCountDataFilenameList"].toObject().toVariantMap(); + for (auto it = enery_count_data_filename_list.constBegin(); it!=enery_count_data_filename_list.constEnd(); ++it) { + uint channel_num = it.key().toUInt(); + this->_channel_enery_count_data_filename_list[channel_num] = ProjectAbsFilename(it.value().toString()); + } + + this->_all_channel_enery_total_count_data_filename = ProjectAbsFilename(json_obj["AllChannelEneryTotalCountDataFilename"].toString()); + + const auto& time_win_conform_particle_data = json_obj["TimeWinConformParticleData"].toObject().toVariantMap(); + for (auto it = time_win_conform_particle_data.constBegin(); it!=time_win_conform_particle_data.constEnd(); ++it) { + uint time_win = it.key().toUInt(); + QMap conform_particle_data; + // const auto& conform_particle_data_list = it.value().toObject().toVariantMap(); + // for (auto it2 = conform_particle_data_list.constBegin(); it2!=conform_particle_data_list.constEnd(); ++it2) { + // uint particle_count = it2.key().toUInt(); + // conform_particle_data[particle_count] = ProjectAbsFilename(it2.value().toString()); + // } + this->_time_win_conform_particle_data[time_win] = conform_particle_data; + } + + return true; +} + +bool MeasureAnalysisProjectModel::SaveProjectModel() +{ + auto ProjectRelativeFilename = [this](const QString& abs_filename){ + QString project_relative_filename; + if ( !abs_filename.isEmpty() ) { + QFileInfo file_info(abs_filename); + if ( file_info.exists() ) { + QDir project_dir(_project_dir); + QString project_dir_path = project_dir.absolutePath() + "/"; + QString project_abs_filename = file_info.absoluteFilePath(); + project_relative_filename = project_abs_filename.remove(project_dir_path); + } + } + return project_relative_filename; + }; + + if (this->_project_filename.isEmpty()) + { + this->_project_filename = QDir(this->_project_dir).filePath(this->_project_name + QString(".msproject"));; + } + // 将项目模型转换为json对象 + QVariantMap project_json_obj_map; + project_json_obj_map["ProjectName"] = this->_project_name; + project_json_obj_map["SpectrumType"] = this->_spec_type; + project_json_obj_map["IsStandardSource"] = this->_is_std_source; + project_json_obj_map["DescriptionInfo"] = this->_description_info; + project_json_obj_map["MeasurePresetTime"] = int(this->_measure_preset_time); + project_json_obj_map["IsMeasureComplete"] = this->_is_measure_complete; + project_json_obj_map["ConformTimeWin"] = this->_conform_time_win; + + project_json_obj_map["MeasureDeviceParamsCfgFilename"] = ProjectRelativeFilename(this->_measure_device_params_cfg_filename); + project_json_obj_map["EneryScaleFilename"] = ProjectRelativeFilename(this->_enery_scale_filename); + project_json_obj_map["EfficiencyScaleFilename"] = ProjectRelativeFilename(this->_efficiency_scale_filename); + + project_json_obj_map["AllChannelParticleDataFilename"] = ProjectRelativeFilename(this->_all_channel_particle_data_filename); + project_json_obj_map["SortedParticleDataFilename"] = ProjectRelativeFilename(this->_sorted_particle_data_filename); + + QVariantMap channel_address_count_data_filename_list; + for (auto it = this->_channel_address_count_data_filename_list.constBegin(); it != this->_channel_address_count_data_filename_list.constEnd(); ++it) { + channel_address_count_data_filename_list[QString::number(it.key())] = ProjectRelativeFilename(it.value()); + } + project_json_obj_map["ChannelAddressCountDataFilenameList"] = channel_address_count_data_filename_list; + + QVariantMap channel_enery_count_data_filename_list; + for (auto it = this->_channel_enery_count_data_filename_list.constBegin(); it != this->_channel_enery_count_data_filename_list.constEnd(); ++it) { + channel_enery_count_data_filename_list[QString::number(it.key())] = ProjectRelativeFilename(it.value()); + } + project_json_obj_map["ChannelEneryCountDataFilenameList"] = channel_enery_count_data_filename_list; + + project_json_obj_map["AllChannelEneryTotalCountDataFilename"] = ProjectRelativeFilename(this->_all_channel_enery_total_count_data_filename); + + QVariantMap time_win_conform_particle_data; + for (auto it = this->_time_win_conform_particle_data.constBegin(); it != this->_time_win_conform_particle_data.constEnd(); ++it) { + QVariantMap conform_particle_data; + for (auto it2 = it.value().constBegin(); it2 != it.value().constEnd(); ++it2) { + conform_particle_data[QString::number(it2.key())] = ProjectRelativeFilename(it2.value()); + } + time_win_conform_particle_data[QString::number(it.key())] = conform_particle_data; + } + project_json_obj_map["TimeWinConformParticleData"] = time_win_conform_particle_data; + + // 将项目模型保存到json文件 + QJsonDocument json_doc = QJsonDocument::fromVariant(project_json_obj_map); + QFile json_file(this->_project_filename); + if (!json_file.open(QIODevice::WriteOnly | QIODevice::Text)) + { + return false; + } + json_file.write(json_doc.toJson()); + json_file.close(); + return true; +} + + + ////////////////////////////////////////////////////////////////////////////////////////// /* MeasureAnalysisProjectModelList */ ////////////////////////////////////////////////////////////////////////////////////////// @@ -271,6 +459,17 @@ void MeasureAnalysisProjectModelList::SetCurrentProjectModel(const QString& proj { if (_project_models.contains(project_name)) { _current_project_model = _project_models[project_name]; + + for (auto it = _project_node_items.constBegin(); it!=_project_node_items.constEnd(); ++it) { + QStandardItem* project_item = it.value(); + QFont font = project_item->font(); + if ( it.key() == project_name ) { + font.setBold(true); + } else { + font.setBold(false); + } + project_item->setFont(font); + } } } @@ -422,6 +621,7 @@ void MeasureAnalysisProjectModelList::intiProjectNodeStruce() QVariant analys_type = QVariant::fromValue(AnalysisType::Project); QStandardItem* project_item = AddChildNode(root_item, project_name, status, analys_type, false); project_item->setData(project_name, ProjectName); + node_map[project_name] = project_item; // 测量控制 QString item_name = QStringLiteral(u"测量控制"); @@ -467,10 +667,21 @@ void MeasureAnalysisProjectModelList::intiProjectNodeStruce() node_map[item_name] = node_item; item_name = QStringLiteral(u"道址计数"); - status = cur_pro_model->GetChannelAddressCountDataFilenameList().isEmpty() ? QStringLiteral(u"无效") : QStringLiteral(u"有效"); + const auto& ch_addr_count_data_filename_list = cur_pro_model->GetChannelAddressCountDataFilenameList(); + status = ch_addr_count_data_filename_list.isEmpty() ? QStringLiteral(u"无效") : QStringLiteral(u"有效"); node_item = AddChildNode(analysis_data_item, item_name, status, QVariant(), true); node_item->setData(project_name, ProjectName); node_map[item_name] = node_item; + QStandardItem* adrr_count_item = node_item; + for (auto it = ch_addr_count_data_filename_list.begin(); it != ch_addr_count_data_filename_list.end(); ++it) { + uint ch_num = it.key(); + QString item_name = QStringLiteral(u"通道%1道址计数").arg(ch_num); + const QVariant& analys_type = QVariant::fromValue(AnalysisType::AddressCountData); + QStandardItem* node_item = AddChildNode(adrr_count_item, item_name, status, analys_type, true); + node_item->setData(project_name, ProjectName); + node_item->setData(ch_num, ChannelNum); + node_map[item_name] = node_item; + } item_name = QStringLiteral(u"能量计数"); status = cur_pro_model->GetAllChannelEneryTotalCountDataFilename().isEmpty() ? QStringLiteral(u"无效") : QStringLiteral(u"有效"); @@ -478,6 +689,17 @@ void MeasureAnalysisProjectModelList::intiProjectNodeStruce() node_item = AddChildNode(analysis_data_item, item_name, status, analys_type, true); node_item->setData(project_name, ProjectName); node_map[item_name] = node_item; + QStandardItem* enery_count_item = node_item; + const auto& ch_enery_count_data_filename_list = cur_pro_model->GetChannelEneryCountDataFilenameList(); + for (auto it = ch_enery_count_data_filename_list.begin(); it != ch_enery_count_data_filename_list.end(); ++it) { + uint ch_num = it.key(); + QString item_name = QStringLiteral(u"通道%1能量计数").arg(ch_num); + const QVariant& analys_type = QVariant::fromValue(AnalysisType::EnergyCountData); + QStandardItem* node_item = AddChildNode(enery_count_item, item_name, status, analys_type, true); + node_item->setData(project_name, ProjectName); + node_item->setData(ch_num, ChannelNum); + node_map[item_name] = node_item; + } uint conform_time_win = cur_pro_model->GetConformTimeWin(); status = cur_pro_model->GetTimeWinConformParticleDataFilenameList(conform_time_win).isEmpty() ? QStringLiteral(u"无效") : QStringLiteral(u"有效"); diff --git a/src/MeasureAnalysisProjectModel.h b/src/MeasureAnalysisProjectModel.h index 1dd1d4d..bb85f09 100644 --- a/src/MeasureAnalysisProjectModel.h +++ b/src/MeasureAnalysisProjectModel.h @@ -8,7 +8,7 @@ class MeasureAnalysisProjectModel { public: - enum class SpectrumType { + enum SpectrumType { None, Sample, // 样品谱 Background, // 本底谱 @@ -90,11 +90,17 @@ private: QMap _channel_address_count_data_filename_list; // QString _all_channel_particle_total_count_data_filename; - QMap _channel_every_count_data_filename_list; + QMap _channel_enery_count_data_filename_list; QString _all_channel_enery_total_count_data_filename; QMap > _time_win_conform_particle_data; +public: + bool LoadProjectModel(const QString& project_filename); + bool SaveProjectModel(); +private: + QString _project_filename; + }; diff --git a/src/NewMeasureAnalysisDlg.cpp b/src/NewMeasureAnalysisDlg.cpp index 0fbc960..b60e3d6 100644 --- a/src/NewMeasureAnalysisDlg.cpp +++ b/src/NewMeasureAnalysisDlg.cpp @@ -47,7 +47,7 @@ void NewMeasureAnalysisDlg::initialization() }); connect(ui->btn_filename, &QPushButton::clicked, this, [this](){ - const QString& filename = QFileDialog::getOpenFileName(this, QStringLiteral(u"选择粒子数据文件"), QString(), QStringLiteral(u"粒子数据文件 (*.csv)")); + const QString& filename = QFileDialog::getOpenFileName(this, QStringLiteral(u"选择粒子数据文件"), QString(), QStringLiteral(u"CSV (*.csv);;GVF (*.gvf)")); if (filename.isEmpty()) { return; }