From cccac84f108e5a96888b0130b6af2b8e9ec67817 Mon Sep 17 00:00:00 2001 From: baiYue Date: Mon, 19 Jan 2026 18:28:55 +0800 Subject: [PATCH] add process of double measurement --- common/include/global.h | 30 ++++- .../graphicsDataModel/fixedPortsModel.h | 1 + diagramCavas/include/measureSettingDlg.h | 8 +- diagramCavas/source/bayInfoDlg.cpp | 118 ++++++++++++++++-- .../graphicsDataModel/fixedPortsModel.cpp | 40 +++++- diagramCavas/source/measureSettingDlg.cpp | 37 +++++- diagramCavas/ui/bayInfoDlg.ui | 46 +++++-- diagramCavas/ui/bayManagerContentDlg.ui | 6 +- diagramUtils/source/dataBase.cpp | 2 +- 9 files changed, 243 insertions(+), 45 deletions(-) diff --git a/common/include/global.h b/common/include/global.h index e902d81..c97abdd 100644 --- a/common/include/global.h +++ b/common/include/global.h @@ -928,7 +928,35 @@ struct MeasurementInfo //量测 int nPolarity; //极性 int nIndex; //对应绕组序号 - QString sSymmetry; //对称量测的tag + QString sSymmetry; //对称量测的name +}; + +// 定义比较键的结构 +struct MeasurementKey { + int nSource; + QString sStation; + QString sDevice; + QString sChannel; + int nPacket; + int nOffset; + + MeasurementKey(const MeasurementInfo& info) + : nSource(info.nSource) + , sStation(info.sStation) + , sDevice(info.sDevice) + , sChannel(info.sChannel) + , nPacket(info.nPacket) + , nOffset(info.nOffset) {} + + // 用于QMap排序 + bool operator<(const MeasurementKey& other) const { + if (nSource != other.nSource) return nSource < other.nSource; + if (sStation != other.sStation) return sStation < other.sStation; + if (sDevice != other.sDevice) return sDevice < other.sDevice; + if (sChannel != other.sChannel) return sChannel < other.sChannel; + if (nPacket != other.nPacket) return nPacket < other.nPacket; + return nOffset < other.nOffset; + } }; //属性其他参数与层级关系 diff --git a/diagramCavas/include/graphicsDataModel/fixedPortsModel.h b/diagramCavas/include/graphicsDataModel/fixedPortsModel.h index 04a85f5..31522d9 100644 --- a/diagramCavas/include/graphicsDataModel/fixedPortsModel.h +++ b/diagramCavas/include/graphicsDataModel/fixedPortsModel.h @@ -155,6 +155,7 @@ private: QString removeSuffix(const QString& str); //移除最后一个下划线后的内容 (处理各种tag后缀) ModelProperty* getItemByUid(QList,QUuid); //返回uid对应的data void updateMonitor(QMap>); //使用当前数据更新运行时 + void assignMeasureSymmetry(QMap& measurementMap); //设置量测中互为double的name private: QMap _nodeItem; //工程模对象 diff --git a/diagramCavas/include/measureSettingDlg.h b/diagramCavas/include/measureSettingDlg.h index 9aad399..6915ef2 100644 --- a/diagramCavas/include/measureSettingDlg.h +++ b/diagramCavas/include/measureSettingDlg.h @@ -3,6 +3,7 @@ #include #include +#include "global.h" /******************************************************* 间隔信息 ********************************************************/ @@ -11,11 +12,6 @@ namespace Ui { class measureSettingDlg; } QT_END_NAMESPACE class BayInfoDlg; -struct MeasurementInfo; -struct HttpRecommandInfo; -struct propertyStateInfo; -struct CtExtraInfo; -struct PtExtraInfo; class MeasureSettingDlg : public QDialog { @@ -27,7 +23,7 @@ public: void initial(); void setBay(BayInfoDlg* p) {_pBay = p;} void showDlg(int type,propertyStateInfo,bool isDouble = false); - void showDlg(MeasurementInfo,propertyStateInfo,bool isDouble = false); //修改 + void showDlg(MeasurementInfo,propertyStateInfo,bool isDouble = false,MeasurementInfo symmetryInfo = MeasurementInfo()); //修改 public slots: void onOkClicked(); void onCancelClicked(); diff --git a/diagramCavas/source/bayInfoDlg.cpp b/diagramCavas/source/bayInfoDlg.cpp index e9e0999..f0e0e41 100644 --- a/diagramCavas/source/bayInfoDlg.cpp +++ b/diagramCavas/source/bayInfoDlg.cpp @@ -93,6 +93,7 @@ void BayInfoDlg::setPropertyValue(QVariant var) } auto map = property->getMeasurement(); + for(auto& info:map){ addMeasure(info); } @@ -210,7 +211,7 @@ void BayInfoDlg::setPropertyValue(QVariant var) void BayInfoDlg::setUi() { QStringList headerText; - headerText<<"TAG"<<"名称"<<"设备"<<"端子"<<"类型"<<"SIZE"; + headerText<<"TAG"<<"名称"<<"设备"<<"端子"<<"类型"<<"SIZE"<<"事件"<<"double"; ui->tableWidget_local->setContextMenuPolicy(Qt::CustomContextMenu); ui->tableWidget_local->setSelectionMode(QAbstractItemView::SingleSelection); ui->tableWidget_local->setSelectionBehavior(QAbstractItemView::SelectRows); @@ -284,6 +285,12 @@ void BayInfoDlg::addMeasure(MeasurementInfo info,int mode) QTableWidgetItem* sizeItem = new QTableWidgetItem(QString::number(info.size)); ui->tableWidget_local->setItem(row, 5, sizeItem); + QTableWidgetItem* enableItem = new QTableWidgetItem(info.bEnable?"启用":"关闭"); + ui->tableWidget_local->setItem(row, 6, enableItem); + + QTableWidgetItem* doubleItem = new QTableWidgetItem(info.sSymmetry.isEmpty()?"":"*"); + ui->tableWidget_local->setItem(row, 7, doubleItem); + if(_bayProperty && _itemProperty){ QUuid bayId = _bayProperty->uuid(); QUuid itemId = _itemProperty->uuid(); @@ -293,7 +300,21 @@ void BayInfoDlg::addMeasure(MeasurementInfo info,int mode) } } else if(mode == 1){ //修改 - QModelIndexList selectedIndexes = ui->tableWidget_local->selectionModel()->selectedRows(); + QAbstractItemModel* model = ui->tableWidget_local->model(); + int rowCount = model->rowCount(); + + QModelIndex index; + for (int row = 0; row < rowCount; ++row) { + QModelIndex col1Index = model->index(row, 1); + QVariant data = model->data(col1Index, Qt::DisplayRole); + + if (data.toString() == info.name) { + // 返回本行第0列的QModelIndex + index = model->index(row, 1); + } + } + + /*QModelIndexList selectedIndexes = ui->tableWidget_local->selectionModel()->selectedRows(); if (selectedIndexes.isEmpty()) { return; // 没有选中任何行 } @@ -303,10 +324,21 @@ void BayInfoDlg::addMeasure(MeasurementInfo info,int mode) if (!index.isValid()) { return; } + QModelIndex indexName = index.sibling(index.row(),1);*/ - QModelIndex indexName = index.sibling(index.row(),1); - QString sName = indexName.data().toString(); + QString sName = index.data().toString(); if(_mapMeasure.contains(sName)){ + + auto itemDevice = ui->tableWidget_local->item(index.row(),2); + if(itemDevice){ + itemDevice->setText(info.sDevice); + } + + auto itemChannel = ui->tableWidget_local->item(index.row(),3); + if(itemChannel){ + itemChannel->setText(info.sChannel); + } + auto itemType = ui->tableWidget_local->item(index.row(),4); if(itemType){ QString sType; @@ -333,6 +365,19 @@ void BayInfoDlg::addMeasure(MeasurementInfo info,int mode) if(itemSize){ itemSize->setText(QString::number(info.size)); } + + auto itemEnable = ui->tableWidget_local->item(index.row(),6); + if(itemEnable){ + itemEnable->setText(info.bEnable?"启用":"关闭"); + } + + if(_bayProperty && _itemProperty){ + QUuid bayId = _bayProperty->uuid(); + QUuid itemId = _itemProperty->uuid(); + info.bayUuid = bayId; + info.componentUuid = itemId; + _mapMeasure[info.name] = info; + } } } } @@ -365,17 +410,21 @@ void BayInfoDlg::onAddClicked() if(_curModelController){ int ctCount = 0; auto lstUuid = _bayProperty->getLstComponent(); //获取间隔下的所有设备 + QUuid ctUid; for(auto& uid:lstUuid){ - BaseProperty* pPro = BasePropertyManager::instance().findEntityData(uid); + BaseProperty* pPro = BasePropertyManager::instance().findEntityData(uid); if(pPro){ if(pPro->type() == 4){ //该设备是ct ctCount += 1; + ctUid = pPro->uuid(); } } } - if(ctCount == 1) //只有1个ct时置为double - isDouble = true; + if(ctCount == 1){ //只有1个ct时置为double + if(ctUid == _itemProperty->uuid()) //选择ct时才判断 + isDouble = true; + } } } } @@ -399,11 +448,25 @@ void BayInfoDlg::onDeleteClicked() QModelIndex indexName = index.sibling(index.row(),1); QString sName = indexName.data().toString(); if(_mapMeasure.contains(sName)){ - /*MeasurementInfo info = _mapMeasure.take(sName); - measureAttributeType typ; - typ.name = info.name; - typ.tag = info.tag; - _validType.append(typ);*/ + MeasurementInfo info = _mapMeasure.take(sName); + if(!info.sSymmetry.isEmpty()){ //是double的情况 + if(_mapMeasure.contains(info.sSymmetry)){ + MeasurementInfo dbInfo = _mapMeasure.take(info.sSymmetry); + + QAbstractItemModel* model = ui->tableWidget_local->model(); + int rowCount = model->rowCount(); + + for (int row = 0; row < rowCount; ++row) { //删除double所在行 + QModelIndex col1Index = model->index(row, 1); + QVariant data = model->data(col1Index, Qt::DisplayRole); + + if (data.toString() == info.sSymmetry) { + ui->tableWidget_local->removeRow(col1Index.row()); + break; + } + } + } + } } int currentRow = ui->tableWidget_local->currentRow(); @@ -436,7 +499,36 @@ void BayInfoDlg::onModifyClicked() _measureDlg = new MeasureSettingDlg(this); _measureDlg->setBay(this); } - _measureDlg->showDlg(info,_extendInfo); + bool isDouble = false; + if(_bayProperty){ //判断double + QString sBayType = _bayProperty->getType(); + if(sBayType == "分段间隔" || sBayType == "母联间隔"){ + if(_curModelController){ + int ctCount = 0; + auto lstUuid = _bayProperty->getLstComponent(); //获取间隔下的所有设备 + for(auto& uid:lstUuid){ + BaseProperty* pPro = BasePropertyManager::instance().findEntityData(uid); + if(pPro){ + if(pPro->type() == 4){ //该设备是ct + ctCount += 1; + } + } + } + + if(ctCount == 1) //只有1个ct时置为double + isDouble = true; + } + } + } + + MeasurementInfo symmetryInfo; + if(isDouble){ + QString sDoubleName = info.sSymmetry; + if(_mapMeasure.contains(sDoubleName)) + symmetryInfo = _mapMeasure.value(sDoubleName); + } + + _measureDlg->showDlg(info,_extendInfo,isDouble,symmetryInfo); } } diff --git a/diagramCavas/source/graphicsDataModel/fixedPortsModel.cpp b/diagramCavas/source/graphicsDataModel/fixedPortsModel.cpp index 3442ea8..a8728cc 100644 --- a/diagramCavas/source/graphicsDataModel/fixedPortsModel.cpp +++ b/diagramCavas/source/graphicsDataModel/fixedPortsModel.cpp @@ -732,6 +732,7 @@ void FixedPortsModel::loadNodeDataFromDataBase() info.tag = removeSuffix(info.tag); mapMeasure.insert(info.name,info); } + assignMeasureSymmetry(mapMeasure); pData->setMeasurement(mapMeasure); } @@ -1499,6 +1500,32 @@ void FixedPortsModel::updateMonitor(QMap> data) } } +void FixedPortsModel::assignMeasureSymmetry(QMap& measurementMap) +{ + // 用于存储每个键对应的tag + QMap keyToTagMap; + + for (auto it = measurementMap.begin(); it != measurementMap.end(); ++it) { + MeasurementKey currentKey(it.value()); + QString currentTag = it.key(); + + // 检查是否已经有相同的键 + if (keyToTagMap.contains(currentKey)) { + QString otherTag = keyToTagMap[currentKey]; + + // 找到一对,互相设置sSymmetry + measurementMap[currentTag].sSymmetry = measurementMap[otherTag].name; + measurementMap[otherTag].sSymmetry = measurementMap[currentTag].name; + + // 从map中移除,因为"有且仅有两个item" + keyToTagMap.remove(currentKey); + } else { + // 还没有配对的,添加到map中 + keyToTagMap[currentKey] = currentTag; + } + } +} + QWidget* FixedPortsModel::getTopWidget() { return dynamic_cast(_widget); @@ -1538,8 +1565,17 @@ ElectricConnectLineItem* FixedPortsModel::getLineItemById(const QString& termina PowerConnection* pCon = TopologyManager::instance().getConnectionContainsTerminal(terminalId); if(pCon) { - if(item->itemId().toString() == pCon->id()) - return dynamic_cast(item); + ModelProperty* pPro = item->getProperty(); + if(pPro){ + Connection con = pPro->getConnection(); + if((pCon->fromTerminalId() == con.nSrcPortId.toString() && pCon->toTerminalId() == con.nDestPortId.toString()) + || (pCon->fromTerminalId() == con.nDestPortId.toString() && pCon->toTerminalId() == con.nSrcPortId.toString())){ //port相同为同一条线 + return dynamic_cast(item); + } + } + //QUuid uid = item->itemId(); + //QUuid conId = QUuid(pCon->id()); + //if(uid == conId) /************load的拓扑没有uid,使用其他方式判断相等 } } } diff --git a/diagramCavas/source/measureSettingDlg.cpp b/diagramCavas/source/measureSettingDlg.cpp index 493fe24..008f8a6 100644 --- a/diagramCavas/source/measureSettingDlg.cpp +++ b/diagramCavas/source/measureSettingDlg.cpp @@ -55,6 +55,8 @@ void MeasureSettingDlg::initial() ui->cb_rule->setItemData(0, 1); ui->cb_rule->setItemData(1, 2); + + ui->gb_yx->setVisible(false); } void MeasureSettingDlg::showDlg(int type,propertyStateInfo proInfo,bool isDouble) @@ -162,12 +164,17 @@ void MeasureSettingDlg::showDlg(int type,propertyStateInfo proInfo,bool isDouble } } -void MeasureSettingDlg::showDlg(MeasurementInfo info,propertyStateInfo proInfo,bool isDouble) +void MeasureSettingDlg::showDlg(MeasurementInfo info,propertyStateInfo proInfo,bool isDouble,MeasurementInfo symmetryInfo) { ui->label_wind->setVisible(false); ui->cb_windIndex->setVisible(false); - if(isDouble) + if(isDouble){ setDbTagVisible(true); + ui->le_dbTag->setText(symmetryInfo.tag); + ui->le_dbName->setText(symmetryInfo.name); + ui->le_dbTag->setReadOnly(true); + ui->le_dbName->setReadOnly(true); + } else setDbTagVisible(false); _isDouble = isDouble; @@ -246,6 +253,10 @@ void MeasureSettingDlg::showDlg(MeasurementInfo info,propertyStateInfo proInfo,b show(); _curMode = 1; clearData(); + ui->cb_tag->blockSignals(true); + ui->cb_name->blockSignals(true); + ui->cb_tag->addItem(info.tag); + ui->cb_name->addItem(info.name); ui->cb_tag->setCurrentText(info.tag); ui->cb_name->setCurrentText(info.name); ui->cb_type->setCurrentIndex(info.type); @@ -364,6 +375,8 @@ void MeasureSettingDlg::clearData() void MeasureSettingDlg::setDbTagVisible(bool val) { + ui->le_dbTag->clear(); + ui->le_dbName->clear(); if(val){ ui->label_dbTag->setVisible(true); ui->le_dbTag->setVisible(true); @@ -472,7 +485,7 @@ void MeasureSettingDlg::onOkClicked() } if(_pBay){ if(_isDouble) - info.sSymmetry = ui->le_dbTag->text(); //与double互相记录 + info.sSymmetry = ui->le_dbName->text(); //与double互相记录 _pBay->addMeasure(info,_curMode); } @@ -482,17 +495,23 @@ void MeasureSettingDlg::onOkClicked() dbInfo.tag = ui->le_dbTag->text(); dbInfo.name = ui->le_dbName->text(); dbInfo.nPolarity = -info.nPolarity; - dbInfo.sSymmetry = info.tag; //与source互相记录 + dbInfo.sSymmetry = info.name; //与source互相记录 if(_pBay) _pBay->addMeasure(dbInfo,_curMode); } + ui->cb_tag->blockSignals(false); + ui->cb_name->blockSignals(false); + ui->le_dbTag->setReadOnly(false); + ui->le_dbName->setReadOnly(false); hide(); } void MeasureSettingDlg::onCancelClicked() { + ui->cb_tag->blockSignals(false); + ui->cb_name->blockSignals(false); hide(); } @@ -504,15 +523,18 @@ void MeasureSettingDlg::onTagChanged(const QString& str) auto pItemData = _pBay->getProperty(); curItemName = "_"+pItemData->name(); } + QString name; for(auto& item:lst){ if(item.tag+curItemName == str){ - ui->cb_name->setCurrentText(item.name+curItemName); + name = item.name+curItemName; + ui->cb_name->setCurrentText(name); break; } } if(_isDouble){ ui->le_dbTag->setText(str+"double"); + ui->le_dbName->setText(name+"对称"); } } @@ -524,14 +546,17 @@ void MeasureSettingDlg::onNameChanged(const QString& str) auto pItemData = _pBay->getProperty(); curItemName = "_"+pItemData->name(); } + QString tag; for(auto& item:lst){ if(item.name+curItemName == str){ - ui->cb_tag->setCurrentText(item.tag+curItemName); + tag = item.tag+curItemName; + ui->cb_tag->setCurrentText(tag); break; } } if(_isDouble){ + ui->le_dbTag->setText(tag+"double"); ui->le_dbName->setText(str+"对称"); } } diff --git a/diagramCavas/ui/bayInfoDlg.ui b/diagramCavas/ui/bayInfoDlg.ui index 8faa41f..48cae71 100644 --- a/diagramCavas/ui/bayInfoDlg.ui +++ b/diagramCavas/ui/bayInfoDlg.ui @@ -41,6 +41,16 @@ + + + + 名称 + + + Qt::AlignmentFlag::AlignCenter + + + @@ -51,7 +61,7 @@ - + @@ -94,10 +104,10 @@ QPushButton:disabled { - - + + - 名称 + 设备 Qt::AlignmentFlag::AlignCenter @@ -114,10 +124,10 @@ QPushButton:disabled { - - + + - 设备 + 类型 Qt::AlignmentFlag::AlignCenter @@ -134,10 +144,20 @@ QPushButton:disabled { - - + + - 类型 + 事件 + + + Qt::AlignmentFlag::AlignCenter + + + + + + + 对称 Qt::AlignmentFlag::AlignCenter @@ -187,7 +207,7 @@ QPushButton:disabled { - 综合保护设备 + 继保/综保设备 Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter @@ -217,7 +237,7 @@ QPushButton:disabled { - 故障录波设备 + 安全自动装置 Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter @@ -296,7 +316,7 @@ QPushButton:disabled { - 状态检测设备 + 状态监测设备 Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter diff --git a/diagramCavas/ui/bayManagerContentDlg.ui b/diagramCavas/ui/bayManagerContentDlg.ui index d9a389c..d451db4 100644 --- a/diagramCavas/ui/bayManagerContentDlg.ui +++ b/diagramCavas/ui/bayManagerContentDlg.ui @@ -224,7 +224,7 @@ QTabBar::tab:selected { - 综合保护 + 继保/综保设备 @@ -266,7 +266,7 @@ QTabBar::tab:selected { - 故障录波 + 安全自动装置 @@ -280,7 +280,7 @@ QTabBar::tab:selected { - 状态检测 + 状态监测 diff --git a/diagramUtils/source/dataBase.cpp b/diagramUtils/source/dataBase.cpp index 96c517d..8ed9143 100644 --- a/diagramUtils/source/dataBase.cpp +++ b/diagramUtils/source/dataBase.cpp @@ -1529,7 +1529,7 @@ QList DataBase::getMeasurement(QUuid componentId) info.nSource = objData["type"].toInt(); QJsonObject objIoAddress = objData["io_address"].toObject(); - info.sStation = objData["station"].toString(); + info.sStation = objIoAddress["station"].toString(); info.sDevice = objIoAddress["device"].toString(); info.sChannel = objIoAddress["channel"].toString(); info.nPacket = objIoAddress["packet"].toInt();