2026-03-23 11:11:55 +08:00
|
|
|
#include "ptExtraInfoDlg.h"
|
|
|
|
|
#include "ui_ptExtraInfoDlg.h"
|
|
|
|
|
#include "baseProperty.h"
|
|
|
|
|
#include "basePropertyManager.h"
|
|
|
|
|
#include <QButtonGroup>
|
|
|
|
|
#include <QJsonArray>
|
|
|
|
|
#include <QJsonDocument>
|
|
|
|
|
#include <QMenu>
|
|
|
|
|
|
|
|
|
|
PtExtraInfoDlg::PtExtraInfoDlg(QWidget *parent)
|
|
|
|
|
: BaseContentDlg(parent)
|
|
|
|
|
, ui(new Ui::ptExtraInfoDlg)
|
|
|
|
|
{
|
|
|
|
|
ui->setupUi(this);
|
|
|
|
|
_stateGroup_pt = new QButtonGroup(this);
|
|
|
|
|
_stateGroup_pt->addButton(ui->rb_tpt_pt,1);
|
|
|
|
|
_stateGroup_pt->addButton(ui->rb_spt_pt,0);
|
|
|
|
|
|
|
|
|
|
connect(ui->btn_add_pt,&QPushButton::clicked,this,&PtExtraInfoDlg::onAddClicked);
|
|
|
|
|
ui->tb_pt->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
|
|
|
|
|
_count = 1;
|
|
|
|
|
|
|
|
|
|
ui->tb_pt->setContextMenuPolicy(Qt::CustomContextMenu);
|
|
|
|
|
connect(ui->tb_pt, &QTableWidget::customContextMenuRequested, this, &PtExtraInfoDlg::onTableCustomContextMenuRequested);
|
2026-06-11 14:05:41 +08:00
|
|
|
connect(ui->tb_pt,
|
|
|
|
|
&QTableWidget::cellChanged,
|
|
|
|
|
this,
|
|
|
|
|
&PtExtraInfoDlg::onTableCellChanged);
|
2026-03-23 11:11:55 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
PtExtraInfoDlg::~PtExtraInfoDlg()
|
|
|
|
|
{
|
|
|
|
|
delete ui;
|
|
|
|
|
}
|
|
|
|
|
|
2026-06-11 14:05:41 +08:00
|
|
|
void PtExtraInfoDlg::clearData()
|
|
|
|
|
{
|
|
|
|
|
ui->le_ratedVol->clear();
|
|
|
|
|
ui->le_pfwv_pt->clear();
|
|
|
|
|
ui->le_iwv_pt->clear();
|
|
|
|
|
ui->le_ratedVolFactor->clear();
|
|
|
|
|
ui->le_pwwgm->setText(0);
|
|
|
|
|
ui->le_rf_pt->clear();
|
|
|
|
|
ui->rb_tpt_pt->setChecked(true);
|
|
|
|
|
|
|
|
|
|
ui->tb_pt->clearContents();
|
|
|
|
|
ui->tb_pt->setRowCount(0);
|
|
|
|
|
_mapPT.clear();
|
|
|
|
|
}
|
|
|
|
|
|
2026-03-23 11:11:55 +08:00
|
|
|
void PtExtraInfoDlg::createGroupView(GroupStateInfo infos)
|
|
|
|
|
{
|
|
|
|
|
for(auto& info:infos.info) {
|
|
|
|
|
PropertyContentInfo inf;
|
|
|
|
|
inf.proTag = info.tagName;
|
|
|
|
|
inf.proName = info.name;
|
|
|
|
|
inf.proType = info.type;
|
|
|
|
|
_mapPro.insert(info.tagName,inf);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
QMap<QString,PropertyStateInfo> PtExtraInfoDlg::getPropertyValue(BaseProperty* pPro)
|
|
|
|
|
{
|
|
|
|
|
QMap<QString,PropertyStateInfo> map;
|
|
|
|
|
|
|
|
|
|
for(auto &pro:_mapPro)
|
|
|
|
|
{
|
|
|
|
|
PropertyStateInfo info;
|
|
|
|
|
info.type = pro.proType;
|
|
|
|
|
info.name = pro.proName;
|
|
|
|
|
info.tagName = pro.proTag;
|
|
|
|
|
if(info.name == "额定电压(V)" || info.tagName == "un_v")
|
|
|
|
|
{
|
|
|
|
|
info.defaultValue = ui->le_ratedVol->text();
|
|
|
|
|
}
|
|
|
|
|
else if(info.name == "工频耐压(V/1min)" || info.tagName == "uac_v_1min")
|
|
|
|
|
{
|
|
|
|
|
info.defaultValue = ui->le_pfwv_pt->text();
|
|
|
|
|
}
|
|
|
|
|
else if(info.name == "冲击耐压(V)" || info.tagName == "uimp_v")
|
|
|
|
|
{
|
|
|
|
|
info.defaultValue = ui->le_iwv_pt->text();
|
|
|
|
|
}
|
|
|
|
|
else if(info.name == "额定电压因数" || info.tagName == "rvf")
|
|
|
|
|
{
|
|
|
|
|
info.defaultValue = ui->le_ratedVolFactor->text();
|
|
|
|
|
}
|
|
|
|
|
else if(info.name == "一次绕组接线接地方式" || info.tagName == "pwcc")
|
|
|
|
|
{
|
|
|
|
|
info.defaultValue = ui->le_pwwgm->text();
|
|
|
|
|
}
|
|
|
|
|
else if(info.name == "额定频率(Hz)" || info.tagName == "fn_hz")
|
|
|
|
|
{
|
|
|
|
|
info.defaultValue = ui->le_rf_pt->text();
|
|
|
|
|
}
|
|
|
|
|
else if(info.name == "相数" || info.tagName == "phase_num")
|
|
|
|
|
{
|
|
|
|
|
if(ui->rb_tpt_pt->isChecked())
|
|
|
|
|
info.defaultValue = 1;
|
|
|
|
|
else
|
|
|
|
|
info.defaultValue = 0;
|
|
|
|
|
}
|
|
|
|
|
else if(info.name == "PT二次绕组" || info.tagName == "pt_sec_winding")
|
|
|
|
|
{
|
|
|
|
|
QJsonObject object;
|
|
|
|
|
QJsonArray arr;
|
|
|
|
|
for(auto &info:_mapPT)
|
|
|
|
|
{
|
|
|
|
|
QJsonObject obj;
|
|
|
|
|
obj["index"] = info.index;
|
|
|
|
|
obj["scope"] = info.scope;
|
|
|
|
|
obj["accuracy"] = info.accuracy;
|
|
|
|
|
obj["volume"] = info.volume;
|
|
|
|
|
obj["star"] = info.star;
|
|
|
|
|
obj["ratio"] = info.ratio;
|
|
|
|
|
obj["polarity"] = info.polarity;
|
|
|
|
|
arr.push_back(obj);
|
|
|
|
|
}
|
|
|
|
|
object["winding"] = arr;
|
|
|
|
|
info.defaultValue = object;
|
|
|
|
|
}
|
|
|
|
|
map.insert(pro.proTag,info);
|
|
|
|
|
}
|
|
|
|
|
pPro->setDataChanged(true);
|
|
|
|
|
return map;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void PtExtraInfoDlg::setPropertyValue(QVariant var)
|
|
|
|
|
{
|
2026-06-11 14:05:41 +08:00
|
|
|
clearData();
|
2026-03-23 11:11:55 +08:00
|
|
|
QMap<QString,PropertyStateInfo> map = var.value<QMap<QString,PropertyStateInfo>>();
|
|
|
|
|
for(auto &info:map)
|
|
|
|
|
{
|
|
|
|
|
if(info.name == "额定电压(V)" || info.tagName == "un_v")
|
|
|
|
|
{
|
|
|
|
|
ui->le_ratedVol->setText(QString::number(info.defaultValue.toDouble()));
|
|
|
|
|
}
|
|
|
|
|
else if(info.name == "工频耐压(V/1min)" || info.tagName == "uac_v_1min")
|
|
|
|
|
{
|
|
|
|
|
ui->le_pfwv_pt->setText(QString::number(info.defaultValue.toDouble()));
|
|
|
|
|
}
|
|
|
|
|
else if(info.name == "冲击耐压(V)" || info.tagName == "uimp_v")
|
|
|
|
|
{
|
|
|
|
|
ui->le_iwv_pt->setText(QString::number(info.defaultValue.toDouble()));
|
|
|
|
|
}
|
|
|
|
|
else if(info.name == "额定电压因数" || info.tagName == "rvf")
|
|
|
|
|
{
|
|
|
|
|
ui->le_ratedVolFactor->setText(QString::number(info.defaultValue.toDouble()));
|
|
|
|
|
}
|
|
|
|
|
else if(info.name == "一次绕组接线接地方式" || info.tagName == "pwcc")
|
|
|
|
|
{
|
|
|
|
|
int nIndex = 0;
|
|
|
|
|
if(info.defaultValue.toString() != "null")
|
|
|
|
|
nIndex = info.defaultValue.toInt();
|
|
|
|
|
ui->le_pwwgm->setText(QString::number(nIndex));
|
|
|
|
|
}
|
|
|
|
|
else if(info.name == "额定频率(Hz)" || info.tagName == "fn_hz")
|
|
|
|
|
{
|
|
|
|
|
ui->le_rf_pt->setText(QString::number(info.defaultValue.toDouble()));
|
|
|
|
|
}
|
|
|
|
|
else if(info.name == "相数" || info.tagName == "phase_num")
|
|
|
|
|
{
|
|
|
|
|
if(info.defaultValue.toInt() == 1)
|
|
|
|
|
ui->rb_tpt_pt->setChecked(true);
|
|
|
|
|
else
|
|
|
|
|
ui->rb_spt_pt->setChecked(true);
|
|
|
|
|
}
|
|
|
|
|
else if(info.name == "PT二次绕组" || info.tagName == "pt_sec_winding")
|
|
|
|
|
{
|
2026-06-11 14:05:41 +08:00
|
|
|
QJsonObject root = parseCTWindingDefaultValue(info.defaultValue);
|
|
|
|
|
if (root.isEmpty())
|
|
|
|
|
return;
|
2026-03-23 11:11:55 +08:00
|
|
|
|
2026-06-11 14:05:41 +08:00
|
|
|
QJsonArray arr = root.value("winding").toArray();
|
2026-03-23 11:11:55 +08:00
|
|
|
for (QJsonValueRef jsonObj : arr)
|
|
|
|
|
{
|
|
|
|
|
QJsonObject node = jsonObj.toObject();
|
|
|
|
|
int index = node["index"].toInt();
|
|
|
|
|
QString scope = node["scope"].toString();
|
|
|
|
|
QString accuracy = node["accuracy"].toString();
|
|
|
|
|
QString volume = node["volume"].toString();
|
|
|
|
|
QString star = node["star"].toString();
|
|
|
|
|
double ratio = node["ratio"].toDouble();
|
|
|
|
|
int polarity = node["polarity"].toInt();
|
|
|
|
|
|
|
|
|
|
addTableRow(scope,accuracy,volume,star,ratio,polarity,index);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void PtExtraInfoDlg::onAddClicked()
|
|
|
|
|
{
|
|
|
|
|
QString sRatioRange = ui->le_tr_range_pt->text();
|
|
|
|
|
QString sAccuracy= ui->le_ac_pt->text();
|
|
|
|
|
QString sVolume = ui->le_slc_pt->text();
|
|
|
|
|
QString sStar = ui->cb_wcm->currentText();
|
|
|
|
|
double dRatio = ui->le_tr_pt->text().toDouble();
|
|
|
|
|
bool bPolarity = ui->cB_polarity->checkState();
|
|
|
|
|
int index = -1;
|
|
|
|
|
if(ui->rb_spt_pt->isChecked())
|
|
|
|
|
index = 0;
|
|
|
|
|
addTableRow(sRatioRange,sAccuracy,sVolume,sStar,dRatio,bPolarity,index);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void PtExtraInfoDlg::onTableCustomContextMenuRequested(const QPoint &pos) {
|
|
|
|
|
QModelIndex index = ui->tb_pt->indexAt(pos);
|
|
|
|
|
if (!index.isValid()) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int row = index.row();
|
|
|
|
|
|
|
|
|
|
// 创建右键菜单
|
|
|
|
|
QMenu menu(this);
|
|
|
|
|
QAction *deleteAction = menu.addAction("删除此行");
|
|
|
|
|
|
|
|
|
|
// 连接删除操作
|
|
|
|
|
connect(deleteAction, &QAction::triggered, this, [this, row]() {
|
|
|
|
|
deleteRowWithReindex(row);
|
|
|
|
|
//updateLables();
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
menu.exec(ui->tb_pt->viewport()->mapToGlobal(pos));
|
|
|
|
|
}
|
|
|
|
|
|
2026-06-11 14:05:41 +08:00
|
|
|
void PtExtraInfoDlg::onTableCellChanged(int row, int column)
|
2026-03-23 11:11:55 +08:00
|
|
|
{
|
2026-06-11 14:05:41 +08:00
|
|
|
Q_UNUSED(column);
|
2026-03-23 11:11:55 +08:00
|
|
|
|
2026-06-11 14:05:41 +08:00
|
|
|
if (m_bUpdating)
|
|
|
|
|
return;
|
2026-03-23 11:11:55 +08:00
|
|
|
|
2026-06-11 14:05:41 +08:00
|
|
|
auto* idItem = ui->tb_pt->item(row, 0);
|
|
|
|
|
if (!idItem)
|
|
|
|
|
return;
|
2026-03-23 11:11:55 +08:00
|
|
|
|
2026-06-11 14:05:41 +08:00
|
|
|
int index = idItem->data(Qt::UserRole).toInt();
|
|
|
|
|
QString key = QString::number(index);
|
2026-03-23 11:11:55 +08:00
|
|
|
|
2026-06-11 14:05:41 +08:00
|
|
|
if (!_mapPT.contains(key))
|
|
|
|
|
return;
|
2026-03-23 11:11:55 +08:00
|
|
|
|
2026-06-11 14:05:41 +08:00
|
|
|
PtExtraInfo& info = _mapPT[key];
|
2026-03-23 11:11:55 +08:00
|
|
|
|
2026-06-11 14:05:41 +08:00
|
|
|
info.scope = ui->tb_pt->item(row, 1)->text();
|
|
|
|
|
info.accuracy = ui->tb_pt->item(row, 2)->text();
|
|
|
|
|
info.volume = ui->tb_pt->item(row, 3)->text();
|
|
|
|
|
info.ratio = ui->tb_pt->item(row, 4)->text().toDouble();
|
|
|
|
|
info.polarity = (ui->tb_pt->item(row, 5)->text().toInt() > 0) ? 1 : -1;
|
|
|
|
|
info.star = ui->tb_pt->item(row, 6)->text();
|
|
|
|
|
}
|
2026-03-23 11:11:55 +08:00
|
|
|
|
2026-06-11 14:05:41 +08:00
|
|
|
void PtExtraInfoDlg::addTableRow(QString sRatioRange,QString sAccuracy,QString sVolume,QString sStar,double dRatio,bool bPolarity,int index)
|
|
|
|
|
{
|
2026-06-10 20:04:51 +08:00
|
|
|
if (index != -1) {
|
|
|
|
|
if (_mapPT.contains(QString::number(index)))
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int row = ui->tb_pt->rowCount();
|
|
|
|
|
ui->tb_pt->insertRow(row);
|
|
|
|
|
|
|
|
|
|
int newIndex = row + 1;
|
|
|
|
|
|
|
|
|
|
PtExtraInfo info;
|
|
|
|
|
info.index = newIndex;
|
|
|
|
|
info.scope = sRatioRange;
|
|
|
|
|
info.accuracy = sAccuracy;
|
|
|
|
|
info.volume = sVolume;
|
|
|
|
|
info.star = sStar;
|
|
|
|
|
info.ratio = dRatio;
|
|
|
|
|
info.polarity = bPolarity ? 1 : -1;
|
|
|
|
|
|
2026-06-11 14:05:41 +08:00
|
|
|
m_bUpdating = true; // ✅ 防止触发 cellChanged
|
|
|
|
|
|
2026-06-10 20:04:51 +08:00
|
|
|
// index 列
|
|
|
|
|
auto* idItem = new QTableWidgetItem(QString::number(newIndex));
|
|
|
|
|
idItem->setData(Qt::UserRole, newIndex);
|
|
|
|
|
ui->tb_pt->setItem(row, 0, idItem);
|
|
|
|
|
|
|
|
|
|
ui->tb_pt->setItem(row, 1, new QTableWidgetItem(sRatioRange));
|
|
|
|
|
ui->tb_pt->setItem(row, 2, new QTableWidgetItem(sAccuracy));
|
|
|
|
|
ui->tb_pt->setItem(row, 3, new QTableWidgetItem(sVolume));
|
|
|
|
|
ui->tb_pt->setItem(row, 4, new QTableWidgetItem(QString::number(dRatio)));
|
|
|
|
|
ui->tb_pt->setItem(row, 5, new QTableWidgetItem(QString::number(info.polarity)));
|
|
|
|
|
ui->tb_pt->setItem(row, 6, new QTableWidgetItem(sStar));
|
|
|
|
|
|
2026-06-11 14:05:41 +08:00
|
|
|
m_bUpdating = false; // ✅ 恢复
|
|
|
|
|
|
2026-06-10 20:04:51 +08:00
|
|
|
_mapPT.insert(QString::number(newIndex), info);
|
2026-03-23 11:11:55 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void PtExtraInfoDlg::deleteRowWithReindex(int row) {
|
2026-06-10 20:04:51 +08:00
|
|
|
if (row < 0 || row >= ui->tb_pt->rowCount())
|
|
|
|
|
return;
|
2026-03-23 11:11:55 +08:00
|
|
|
|
2026-06-10 20:04:51 +08:00
|
|
|
// 1. 删除行
|
|
|
|
|
ui->tb_pt->removeRow(row);
|
2026-03-23 11:11:55 +08:00
|
|
|
|
2026-06-10 20:04:51 +08:00
|
|
|
// 2. 清空旧 map
|
|
|
|
|
_mapPT.clear();
|
2026-03-23 11:11:55 +08:00
|
|
|
|
2026-06-10 20:04:51 +08:00
|
|
|
// 3. 按表格顺序重建
|
|
|
|
|
int totalRows = ui->tb_pt->rowCount();
|
|
|
|
|
for (int r = 0; r < totalRows; ++r)
|
|
|
|
|
{
|
|
|
|
|
int newIndex = r + 1;
|
|
|
|
|
|
|
|
|
|
PtExtraInfo info;
|
|
|
|
|
info.index = newIndex;
|
|
|
|
|
info.scope = ui->tb_pt->item(r, 1)->text();
|
|
|
|
|
info.accuracy = ui->tb_pt->item(r, 2)->text();
|
|
|
|
|
info.volume = ui->tb_pt->item(r, 3)->text();
|
|
|
|
|
info.ratio = ui->tb_pt->item(r, 4)->text().toDouble();
|
|
|
|
|
info.polarity = (ui->tb_pt->item(r, 5)->text().toInt() > 0);
|
|
|
|
|
info.star = ui->tb_pt->item(r, 6)->text();
|
|
|
|
|
|
|
|
|
|
QString key = QString::number(newIndex);
|
|
|
|
|
_mapPT[key] = info;
|
|
|
|
|
|
|
|
|
|
// 更新显示
|
|
|
|
|
auto* idItem = ui->tb_pt->item(r, 0);
|
|
|
|
|
if (idItem) {
|
|
|
|
|
idItem->setText(key);
|
|
|
|
|
idItem->setData(Qt::UserRole, newIndex);
|
2026-03-23 11:11:55 +08:00
|
|
|
}
|
|
|
|
|
}
|
2026-06-10 20:04:51 +08:00
|
|
|
|
2026-03-23 11:11:55 +08:00
|
|
|
}
|