添加测量分析项目保存和打开加载

This commit is contained in:
徐海 2026-03-09 13:07:22 +08:00
parent 017d77ed84
commit 324c29cbbc
5 changed files with 278 additions and 15 deletions

View File

@ -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<uint, QString> 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

View File

@ -9,13 +9,13 @@
#include <QMenu>
#include <QPlainTextEdit>
#include <QScrollBar>
#include <QFileDialog>
#include <QMessageBox>
#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;

View File

@ -1,6 +1,11 @@
#include "MeasureAnalysisProjectModel.h"
#include "AnalysisTypeDefine.h"
#include "GlobalDefine.h"
#include <QFile>
#include <QDir>
#include <QJsonDocument>
#include <QJsonObject>
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<uint, QString>& 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<uint, QString>& 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<uint, QString> 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"有效");

View File

@ -8,7 +8,7 @@
class MeasureAnalysisProjectModel
{
public:
enum class SpectrumType {
enum SpectrumType {
None,
Sample, // 样品谱
Background, // 本底谱
@ -90,11 +90,17 @@ private:
QMap<uint, QString> _channel_address_count_data_filename_list;
// QString _all_channel_particle_total_count_data_filename;
QMap<uint, QString> _channel_every_count_data_filename_list;
QMap<uint, QString> _channel_enery_count_data_filename_list;
QString _all_channel_enery_total_count_data_filename;
QMap<uint, QMap<uint, QString> > _time_win_conform_particle_data;
public:
bool LoadProjectModel(const QString& project_filename);
bool SaveProjectModel();
private:
QString _project_filename;
};

View File

@ -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;
}