add process of double measurement

This commit is contained in:
baiYue 2026-01-19 18:28:55 +08:00
parent 7c61e7d8e1
commit cccac84f10
9 changed files with 243 additions and 45 deletions

View File

@ -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;
}
};
//属性其他参数与层级关系

View File

@ -155,6 +155,7 @@ private:
QString removeSuffix(const QString& str); //移除最后一个下划线后的内容 (处理各种tag后缀)
ModelProperty* getItemByUid(QList<GraphicsBaseItem*>,QUuid); //返回uid对应的data
void updateMonitor(QMap<QString,QMap<quint64,double>>); //使用当前数据更新运行时
void assignMeasureSymmetry(QMap<QString, MeasurementInfo>& measurementMap); //设置量测中互为double的name
private:
QMap<QUuid,GraphicsProjectModelItem*> _nodeItem; //工程模对象

View File

@ -3,6 +3,7 @@
#include <QDialog>
#include <QButtonGroup>
#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();

View File

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

View File

@ -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<QString,QMap<quint64,double>> data)
}
}
void FixedPortsModel::assignMeasureSymmetry(QMap<QString, MeasurementInfo>& measurementMap)
{
// 用于存储每个键对应的tag
QMap<MeasurementKey, QString> 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<QWidget*>(_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<ElectricConnectLineItem*>(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<ElectricConnectLineItem*>(item);
}
}
//QUuid uid = item->itemId();
//QUuid conId = QUuid(pCon->id());
//if(uid == conId) /************load的拓扑没有uid使用其他方式判断相等
}
}
}

View File

@ -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+"对称");
}
}

View File

@ -41,6 +41,16 @@
</item>
<item>
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="1">
<widget class="QLabel" name="label_12">
<property name="text">
<string>名称</string>
</property>
<property name="alignment">
<set>Qt::AlignmentFlag::AlignCenter</set>
</property>
</widget>
</item>
<item row="0" column="5">
<widget class="QLabel" name="label_14">
<property name="text">
@ -51,7 +61,7 @@
</property>
</widget>
</item>
<item row="0" column="6">
<item row="0" column="8">
<widget class="QPushButton" name="btn_add">
<property name="minimumSize">
<size>
@ -94,10 +104,10 @@ QPushButton:disabled {
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QLabel" name="label_12">
<item row="0" column="2">
<widget class="QLabel" name="label_16">
<property name="text">
<string>名称</string>
<string>设备</string>
</property>
<property name="alignment">
<set>Qt::AlignmentFlag::AlignCenter</set>
@ -114,10 +124,10 @@ QPushButton:disabled {
</property>
</widget>
</item>
<item row="0" column="2">
<widget class="QLabel" name="label_16">
<item row="0" column="4">
<widget class="QLabel" name="label_17">
<property name="text">
<string>设备</string>
<string>类型</string>
</property>
<property name="alignment">
<set>Qt::AlignmentFlag::AlignCenter</set>
@ -134,10 +144,20 @@ QPushButton:disabled {
</property>
</widget>
</item>
<item row="0" column="4">
<widget class="QLabel" name="label_17">
<item row="0" column="6">
<widget class="QLabel" name="label_18">
<property name="text">
<string>类型</string>
<string>事件</string>
</property>
<property name="alignment">
<set>Qt::AlignmentFlag::AlignCenter</set>
</property>
</widget>
</item>
<item row="0" column="7">
<widget class="QLabel" name="label_19">
<property name="text">
<string>对称</string>
</property>
<property name="alignment">
<set>Qt::AlignmentFlag::AlignCenter</set>
@ -187,7 +207,7 @@ QPushButton:disabled {
<item row="1" column="0">
<widget class="QLabel" name="label">
<property name="text">
<string>综设备</string>
<string>继保/综保设备</string>
</property>
<property name="alignment">
<set>Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter</set>
@ -217,7 +237,7 @@ QPushButton:disabled {
<item row="4" column="0">
<widget class="QLabel" name="label_4">
<property name="text">
<string>故障录波设备</string>
<string>安全自动装置</string>
</property>
<property name="alignment">
<set>Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter</set>
@ -296,7 +316,7 @@ QPushButton:disabled {
<item row="5" column="0">
<widget class="QLabel" name="label_5">
<property name="text">
<string>状态测设备</string>
<string>状态测设备</string>
</property>
<property name="alignment">
<set>Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter</set>

View File

@ -224,7 +224,7 @@ QTabBar::tab:selected {
</property>
<widget class="QWidget" name="tab_zongHe">
<attribute name="title">
<string>综合保护</string>
<string>继保/综保设备</string>
</attribute>
<layout class="QVBoxLayout" name="verticalLayout_2">
<item>
@ -266,7 +266,7 @@ QTabBar::tab:selected {
</widget>
<widget class="QWidget" name="tab_guZhang">
<attribute name="title">
<string>故障录波</string>
<string>安全自动装置</string>
</attribute>
<layout class="QVBoxLayout" name="verticalLayout_5">
<item>
@ -280,7 +280,7 @@ QTabBar::tab:selected {
</widget>
<widget class="QWidget" name="tab_zhuangTai">
<attribute name="title">
<string>状态测</string>
<string>状态测</string>
</attribute>
<layout class="QVBoxLayout" name="verticalLayout_6">
<item>

View File

@ -1529,7 +1529,7 @@ QList<MeasurementInfo> 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();