DiagramDesigner/diagramCavas/source/ptExtraInfoDlg.cpp

313 lines
9.9 KiB
C++
Raw Normal View History

2025-05-23 10:30:52 +08:00
#include "ptExtraInfoDlg.h"
#include "ui_ptExtraInfoDlg.h"
#include "baseProperty.h"
#include "basePropertyManager.h"
#include <QButtonGroup>
#include <QJsonArray>
#include <QJsonDocument>
2026-01-16 18:40:46 +08:00
#include <QMenu>
2025-05-23 10:30:52 +08:00
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);
2026-01-16 18:40:46 +08:00
ui->tb_pt->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
_count = 1;
ui->tb_pt->setContextMenuPolicy(Qt::CustomContextMenu);
connect(ui->tb_pt, &QTableWidget::customContextMenuRequested, this, &PtExtraInfoDlg::onTableCustomContextMenuRequested);
2025-05-23 10:30:52 +08:00
}
PtExtraInfoDlg::~PtExtraInfoDlg()
{
delete ui;
}
void PtExtraInfoDlg::createGroupView(groupStateInfo infos)
{
for(auto& info:infos.info) {
propertyContentInfo inf;
2026-01-09 17:43:58 +08:00
inf.proTag = info.tagName;
2025-05-23 10:30:52 +08:00
inf.proName = info.name;
inf.proType = info.type;
2026-01-09 17:43:58 +08:00
_mapPro.insert(info.tagName,inf);
2025-05-23 10:30:52 +08:00
}
}
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;
2026-01-09 17:43:58 +08:00
info.tagName = pro.proTag;
if(info.name == "额定电压(V)" || info.tagName == "un_v")
2025-05-23 10:30:52 +08:00
{
info.defaultValue = ui->le_ratedVol->text();
}
2026-01-09 17:43:58 +08:00
else if(info.name == "工频耐压(V/1min)" || info.tagName == "uac_v_1min")
2025-05-23 10:30:52 +08:00
{
info.defaultValue = ui->le_pfwv_pt->text();
}
2026-01-09 17:43:58 +08:00
else if(info.name == "冲击耐压(V)" || info.tagName == "uimp_v")
2025-05-23 10:30:52 +08:00
{
info.defaultValue = ui->le_iwv_pt->text();
}
2026-01-09 17:43:58 +08:00
else if(info.name == "额定电压因数" || info.tagName == "rvf")
2025-05-23 10:30:52 +08:00
{
info.defaultValue = ui->le_ratedVolFactor->text();
}
2026-01-09 17:43:58 +08:00
else if(info.name == "一次绕组接线接地方式" || info.tagName == "pwcc")
2025-05-23 10:30:52 +08:00
{
info.defaultValue = ui->le_pwwgm->text();
}
2026-01-09 17:43:58 +08:00
else if(info.name == "额定频率(Hz)" || info.tagName == "fn_hz")
2025-05-23 10:30:52 +08:00
{
info.defaultValue = ui->le_rf_pt->text();
}
2026-01-09 17:43:58 +08:00
else if(info.name == "相数" || info.tagName == "phase_num")
2025-05-23 10:30:52 +08:00
{
if(ui->rb_tpt_pt->isChecked())
info.defaultValue = 1;
else
info.defaultValue = 0;
}
2026-01-09 17:43:58 +08:00
else if(info.name == "PT二次绕组" || info.tagName == "pt_sec_winding")
2025-05-23 10:30:52 +08:00
{
QJsonObject object;
QJsonArray arr;
2026-01-16 18:40:46 +08:00
for(auto &info:_mapPT)
2025-05-23 10:30:52 +08:00
{
QJsonObject obj;
2026-01-16 18:40:46 +08:00
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;
2025-05-23 10:30:52 +08:00
arr.push_back(obj);
}
object["winding"] = arr;
info.defaultValue = object;
}
2026-01-09 17:43:58 +08:00
map.insert(pro.proTag,info);
2025-05-23 10:30:52 +08:00
}
2025-07-22 20:00:46 +08:00
pPro->setDataChanged(true);
2025-05-23 10:30:52 +08:00
return map;
}
void PtExtraInfoDlg::setPropertyValue(QVariant var)
{
QMap<QString,propertyStateInfo> map = var.value<QMap<QString,propertyStateInfo>>();
for(auto &info:map)
{
2026-01-09 17:43:58 +08:00
if(info.name == "额定电压(V)" || info.tagName == "un_v")
2025-05-23 10:30:52 +08:00
{
ui->le_ratedVol->setText(QString::number(info.defaultValue.toDouble()));
}
2026-01-09 17:43:58 +08:00
else if(info.name == "工频耐压(V/1min)" || info.tagName == "uac_v_1min")
2025-05-23 10:30:52 +08:00
{
ui->le_pfwv_pt->setText(QString::number(info.defaultValue.toDouble()));
}
2026-01-09 17:43:58 +08:00
else if(info.name == "冲击耐压(V)" || info.tagName == "uimp_v")
2025-05-23 10:30:52 +08:00
{
ui->le_iwv_pt->setText(QString::number(info.defaultValue.toDouble()));
}
2026-01-09 17:43:58 +08:00
else if(info.name == "额定电压因数" || info.tagName == "rvf")
2025-05-23 10:30:52 +08:00
{
ui->le_ratedVolFactor->setText(QString::number(info.defaultValue.toDouble()));
}
2026-01-09 17:43:58 +08:00
else if(info.name == "一次绕组接线接地方式" || info.tagName == "pwcc")
2025-05-23 10:30:52 +08:00
{
2026-01-16 18:40:46 +08:00
int nIndex = 0;
if(info.defaultValue.toString() != "null")
nIndex = info.defaultValue.toInt();
ui->le_pwwgm->setText(QString::number(nIndex));
2025-05-23 10:30:52 +08:00
}
2026-01-09 17:43:58 +08:00
else if(info.name == "额定频率(Hz)" || info.tagName == "fn_hz")
2025-05-23 10:30:52 +08:00
{
ui->le_rf_pt->setText(QString::number(info.defaultValue.toDouble()));
}
2026-01-09 17:43:58 +08:00
else if(info.name == "相数" || info.tagName == "phase_num")
2025-05-23 10:30:52 +08:00
{
if(info.defaultValue.toInt() == 1)
ui->rb_tpt_pt->setChecked(true);
else
ui->rb_spt_pt->setChecked(true);
}
2026-01-09 17:43:58 +08:00
else if(info.name == "PT二次绕组" || info.tagName == "pt_sec_winding")
2025-05-23 10:30:52 +08:00
{
QString jsonString = info.defaultValue.toString();
QJsonDocument jsonDocument = QJsonDocument::fromJson(jsonString.toUtf8().data());
QJsonObject jsonObject = jsonDocument.object();
QJsonObject object = jsonObject;
2025-05-23 10:30:52 +08:00
QJsonArray arr = object["winding"].toArray();
for (QJsonValueRef jsonObj : arr)
{
QJsonObject node = jsonObj.toObject();
2026-01-16 18:40:46 +08:00
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);
2025-05-23 10:30:52 +08:00
}
}
}
}
void PtExtraInfoDlg::onAddClicked()
{
2026-01-16 18:40:46 +08:00
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);
2025-05-23 10:30:52 +08:00
}
2026-01-16 18:40:46 +08:00
void PtExtraInfoDlg::onTableCustomContextMenuRequested(const QPoint &pos) {
QModelIndex index = ui->tb_pt->indexAt(pos);
if (!index.isValid()) {
return;
2025-05-23 10:30:52 +08:00
}
2026-01-16 18:40:46 +08:00
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));
2025-05-23 10:30:52 +08:00
}
2026-01-16 18:40:46 +08:00
void PtExtraInfoDlg::addTableRow(QString sRatioRange,QString sAccuracy,QString sVolume,QString sStar,double dRatio,bool bPolarity,int index)
2025-05-23 10:30:52 +08:00
{
2026-01-16 18:40:46 +08:00
if(_mapPT.contains(QString::number(index)))
2025-05-23 10:30:52 +08:00
{
return;
}
PtExtraInfo info;
2026-01-16 18:40:46 +08:00
if(index == -1){ //缺省id时新建否则加载
info.index = _count;
2025-05-23 10:30:52 +08:00
_count += 1;
}
else{
2026-01-16 18:40:46 +08:00
info.index = index;
2025-05-23 10:30:52 +08:00
}
int row = ui->tb_pt->rowCount();
ui->tb_pt->insertRow(row);
2026-01-16 18:40:46 +08:00
// index
QTableWidgetItem *item = new QTableWidgetItem(QString::number(info.index));
item->setData(Qt::UserRole,info.index);
2025-05-23 10:30:52 +08:00
ui->tb_pt->setItem(row, 0, item);
2026-01-16 18:40:46 +08:00
//变比范围
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));
2026-01-16 18:40:46 +08:00
// 变比
ui->tb_pt->setItem(row, 4, new QTableWidgetItem(QString::number(dRatio)));
2026-01-16 18:40:46 +08:00
// 极性
ui->tb_pt->setItem(row, 5, new QTableWidgetItem(QString::number(bPolarity? 1 : -1)));
//接线
ui->tb_pt->setItem(row, 6, new QTableWidgetItem(sStar));
info.scope = sRatioRange;
info.accuracy = sAccuracy;
info.volume = sVolume;
info.star = sStar;
info.ratio = dRatio;
info.polarity = bPolarity? 1 : -1;
_mapPT.insert(QString::number(info.index),info);
}
2025-05-23 10:30:52 +08:00
2026-01-16 18:40:46 +08:00
void PtExtraInfoDlg::deleteRowWithReindex(int row) {
// 1. 获取要删除的ID
QTableWidgetItem* pFirstItem = ui->tb_pt->item(row, 0);
if (!pFirstItem) return;
2025-05-23 10:30:52 +08:00
2026-01-16 18:40:46 +08:00
int deletedId = pFirstItem->data(Qt::UserRole).toInt();
QString deletedKey = QString::number(deletedId);
2025-05-23 10:30:52 +08:00
2026-01-16 18:40:46 +08:00
// 2. 从表格中删除行
ui->tb_pt->removeRow(row);
2025-05-23 10:30:52 +08:00
2026-01-16 18:40:46 +08:00
// 3. 从_mapCT中删除对应项
if (_mapPT.contains(deletedKey)) {
_mapPT.remove(deletedKey);
}
// 4. 重新排序和更新index
reorderMapAndUpdateIndices(row);
}
void PtExtraInfoDlg::reorderMapAndUpdateIndices(int startRow) {
int totalRows = ui->tb_pt->rowCount();
// 遍历从startRow开始的所有行
for (int row = startRow; row < totalRows; ++row) {
QTableWidgetItem* idItem = ui->tb_pt->item(row, 0);
if (!idItem) continue;
int currentId = idItem->data(Qt::UserRole).toInt();
QString currentKey = QString::number(currentId);
// 计算新的ID和索引
int newId = row + 1; // 新的ID
int newIndex = row + 1; // 新的索引
if (_mapPT.contains(currentKey)) {
// 获取并更新数据
PtExtraInfo info = _mapPT[currentKey];
info.index = newIndex;
// 从旧位置移除
_mapPT.remove(currentKey);
// 添加到新位置
QString newKey = QString::number(newId);
_mapPT[newKey] = info;
// 更新表格显示
idItem->setText(QString::number(newId));
idItem->setData(Qt::UserRole, newId);
}
}
2025-05-23 10:30:52 +08:00
}