add diagram wizard bus setting ui

This commit is contained in:
baiYue 2025-07-25 19:07:14 +08:00
parent 42735dc4d8
commit 54694f6425
11 changed files with 433 additions and 9 deletions

View File

@ -34,6 +34,9 @@ set(DIAGRAMCAVAS_HEADER_FILES
include/diagramEditor/editBaseStruct.h include/diagramEditor/editBaseStruct.h
include/diagramEditor/diagramEditorWizard.h include/diagramEditor/diagramEditorWizard.h
include/diagramEditor/wizardBusTableDelegate.h include/diagramEditor/wizardBusTableDelegate.h
include/diagramEditor/wizardBayContentDlg.h
include/diagramEditor/diagramEditorBaseBlock.h
include/diagramEditor/diagramEditorStructContainer.h
include/graphicsDataModel/baseModel.h include/graphicsDataModel/baseModel.h
include/graphicsDataModel/fixedPortsModel.h include/graphicsDataModel/fixedPortsModel.h
include/graphicsItem/electricConnectLineItem.h include/graphicsItem/electricConnectLineItem.h
@ -105,6 +108,9 @@ set(DIAGRAMCAVAS_SOURCE_FILES
source/diagramEditor/editBaseStruct.cpp source/diagramEditor/editBaseStruct.cpp
source/diagramEditor/diagramEditorWizard.cpp source/diagramEditor/diagramEditorWizard.cpp
source/diagramEditor/wizardBusTableDelegate.cpp source/diagramEditor/wizardBusTableDelegate.cpp
source/diagramEditor/wizardBayContentDlg.cpp
source/diagramEditor/diagramEditorBaseBlock.cpp
source/diagramEditor/diagramEditorStructContainer.cpp
source/graphicsDataModel/baseModel.cpp source/graphicsDataModel/baseModel.cpp
source/graphicsDataModel/fixedPortsModel.cpp source/graphicsDataModel/fixedPortsModel.cpp
source/graphicsItem/electricConnectLineItem.cpp source/graphicsItem/electricConnectLineItem.cpp

View File

@ -0,0 +1,68 @@
#ifndef DIAGRAMEDITORBASEBLOCK_H
#define DIAGRAMEDITORBASEBLOCK_H
//组态编辑基础块(分段母线、间隔等)
#include <QObject>
#include "global.h"
class DiagramEditorStructContainer;
class DiagramEditorBaseBlock: public QObject
{
Q_OBJECT
public:
DiagramEditorBaseBlock(QObject *parent = 0);
virtual ~DiagramEditorBaseBlock() = 0;
virtual void setName(const QString& str) {sName = str;}
virtual QString getName() {return sName;}
virtual void setType(int n) {nType = n;}
virtual int getType() {return nType;}
virtual void addConnect(const QString&,int nType); //与目标建立连接
virtual void addConnect(DiagramEditorBriefConnect); //直接添加连接
virtual void removeConnect(const QString&);
virtual void removeConnect(DiagramEditorBriefConnect);
virtual QList<DiagramEditorBriefConnect> getConnect() {return lstCon;}
virtual void clearConnect() {lstCon.clear();}
virtual void setCurContainer(DiagramEditorStructContainer* p) {_curContainer = p;}
virtual DiagramEditorStructContainer* getCurContainer() {return _curContainer;}
protected:
QString sName;
int nType; //1母线,2间隔
QList<DiagramEditorBriefConnect> lstCon; //连接信息
DiagramEditorStructContainer* _curContainer; //当前所处的容器
};
/***************************划分后的分段bus单元****************************/
class DiagramEditorBusBlock:public DiagramEditorBaseBlock
{
Q_OBJECT
public:
DiagramEditorBusBlock(QObject *parent = 0);
virtual ~DiagramEditorBusBlock();
virtual void setVoltage(float f) { fVoltage = f;}
virtual float getVoltage() {return fVoltage;}
virtual void setBusType(int n) {nBusType = n;}
virtual int getBusType() {return nBusType;}
virtual void setIndex(int n) {nIndex = n;}
virtual int getIndex() {return nIndex;}
virtual void setBusPro(QString sNa,int nTp,float fVol,int nBT,int nIdx) {sName = sNa;nType = nTp;fVoltage = fVol;nBusType = nBT;nIndex = nIdx;}
protected:
float fVoltage; //母线电压
int nBusType; //0无前缀,1:Ⅰ母,2Ⅱ母
int nIndex; //第几段,1A,2B,3C,4D,5E,6F,7G,8H
};
/***************************bay单元****************************/
class DiagramEditorBayBlock:public DiagramEditorBaseBlock
{
Q_OBJECT
public:
DiagramEditorBayBlock(QObject *parent = 0);
virtual ~DiagramEditorBayBlock();
virtual void setBayType(BayType typ) {nBayType = typ;}
virtual BayType getBayType() {return nBayType;}
protected:
BayType nBayType;
};
#endif

View File

@ -0,0 +1,24 @@
#ifndef DIAGRAMEDITORSTRUCTCONTAINER_H
#define DIAGRAMEDITORSTRUCTCONTAINER_H
//组态划分后结构的容器,可包含分段母线及间隔、独立间隔、变压器等,以确定组态图空间结构
#include <QObject>
#include <QVector2D>
#include "global.h"
class DiagramEditorBaseBlock;
class DiagramEditorStructContainer : public QObject
{
Q_OBJECT
public:
DiagramEditorStructContainer(QObject *parent = 0);
virtual ~DiagramEditorStructContainer();
public:
bool insertBlock(int,DiagramEditorBaseBlock*);
auto& getBlockMap() {return _mapBlocks;}
private:
QMap<int,QList<DiagramEditorBaseBlock*>> _mapBlocks; //容器中包含的对象列表,<pos,listBlocks> pos当前容器中的位置:0上,1中上,2中下3下
};
#endif

View File

@ -8,6 +8,9 @@ QT_BEGIN_NAMESPACE
namespace Ui { class diagramEditorWizard; } namespace Ui { class diagramEditorWizard; }
QT_END_NAMESPACE QT_END_NAMESPACE
class WizardBayContentDlg;
class DiagramEditorBaseBlock;
class DiagramEditorStructContainer;
class DiagramEditorWizard : public QDialog class DiagramEditorWizard : public QDialog
{ {
@ -38,7 +41,11 @@ private:
template <typename T> void reindexQMap(QMap<int, T> &map); //重新排序函数 template <typename T> void reindexQMap(QMap<int, T> &map); //重新排序函数
private: private:
Ui::diagramEditorWizard *ui; Ui::diagramEditorWizard *ui;
QMap<int,DiagramEditorBusInfo> _mapBus; //母线信息 BiDirectionalMap<int,QString> _divideType; //划分段数名对照
WizardBayContentDlg* _bayContentDlg;
QMap<int,DiagramEditorWizardBusInfo> _mapBus; //母线信息
QMap<int,QMap<int,DiagramEditorStructContainer*>> _mapSturctContainer; //划分后的区块
bool _busPageChanged; //母线页改变 bool _busPageChanged; //母线页改变
}; };

View File

@ -0,0 +1,22 @@
#ifndef WIZARDBAYCONTENTDLG_H
#define WIZARDBAYCONTENTDLG_H
//向导bay设置右侧table
#include <QTableWidget>
#include "global.h"
class WizardBayContentDlg: public QTableWidget
{
Q_OBJECT
public:
WizardBayContentDlg(QWidget *parent = 0);
virtual ~WizardBayContentDlg();
public:
void initial();
void addBay(DiagramEditorWizardBayInfo);
void clearData();
private:
int _curPageIndex;
};
#endif

View File

@ -467,7 +467,7 @@ public:
virtual ~GraphicsBaseModelItem(); virtual ~GraphicsBaseModelItem();
virtual void paint(QPainter*, const QStyleOptionGraphicsItem*, QWidget*) override; virtual void paint(QPainter*, const QStyleOptionGraphicsItem*, QWidget*) override;
protected: protected:
virtual QVariant itemChange(QGraphicsItem::GraphicsItemChange, const QVariant&); virtual QVariant itemChange(QGraphicsItem::GraphicsItemChange, const QVariant&) override;
}; };
class GraphicsProjectModelItem : public GraphicsBaseItem //工程模item class GraphicsProjectModelItem : public GraphicsBaseItem //工程模item

View File

@ -0,0 +1,85 @@
#include "diagramEditor/diagramEditorBaseBlock.h"
DiagramEditorBaseBlock::DiagramEditorBaseBlock(QObject *parent)
: QObject(parent)
,_curContainer(nullptr)
{
nType = 0;
}
DiagramEditorBaseBlock::~DiagramEditorBaseBlock()
{
}
void DiagramEditorBaseBlock::addConnect(const QString& str,int n)
{
if(str == sName)
return;
for(auto& con:lstCon){
if(con.con1.sName == str || con.con2.sName == str){ //已存在不插入
return;
}
}
DiagramEditorBriefConnect con;
con.con1.sName = sName; //首参数为自己名
con.con1.nType = nType;
con.con2.sName = str;
con.con2.nType = n;
lstCon.append(con);
}
void DiagramEditorBaseBlock::addConnect(DiagramEditorBriefConnect obj)
{
for(auto& con:lstCon){
if(con == obj){ //已存在不插入
return;
}
}
lstCon.append(obj);
}
void DiagramEditorBaseBlock::removeConnect(const QString& str)
{
for(int i = 0;i < lstCon.size();++i){
if(lstCon[i].con1.sName == str || lstCon[i].con2.sName == str){
lstCon.removeAt(i);
return;
}
}
}
void DiagramEditorBaseBlock::removeConnect(DiagramEditorBriefConnect obj)
{
for(int i = 0;i < lstCon.size();++i){
if(lstCon[i] == obj){
lstCon.removeAt(i);
return;
}
}
}
/***************************划分后的分段bus单元****************************/
DiagramEditorBusBlock::DiagramEditorBusBlock(QObject *parent)
:DiagramEditorBaseBlock(parent)
{
fVoltage = 0.0;
nBusType = 0;
nIndex = 0;
}
DiagramEditorBusBlock::~DiagramEditorBusBlock()
{
}
/***************************bay单元****************************/
DiagramEditorBayBlock::DiagramEditorBayBlock(QObject *parent)
:DiagramEditorBaseBlock(parent)
{
nBayType = BayType::busSectionBay;
}
DiagramEditorBayBlock::~DiagramEditorBayBlock()
{
}

View File

@ -0,0 +1,22 @@
#include "diagramEditor/diagramEditorStructContainer.h"
#include "diagramEditor/diagramEditorBaseBlock.h"
DiagramEditorStructContainer::DiagramEditorStructContainer(QObject *parent)
: QObject(parent)
{
}
DiagramEditorStructContainer::~DiagramEditorStructContainer()
{
}
bool DiagramEditorStructContainer::insertBlock(int nPos,DiagramEditorBaseBlock* p)
{
for(auto& pBlock:_mapBlocks[nPos]){
if(pBlock == p)
return false;
}
p->setCurContainer(this); //目标block所属container
_mapBlocks[nPos].append(p);
return true;
}

View File

@ -3,6 +3,9 @@
#include "diagramEditor/diagramEditorWizard.h" #include "diagramEditor/diagramEditorWizard.h"
#include "diagramEditor/wizardBusTableDelegate.h" #include "diagramEditor/wizardBusTableDelegate.h"
#include "ui_diagramEditorWizard.h" #include "ui_diagramEditorWizard.h"
#include "diagramEditor/wizardBayContentDlg.h"
#include "diagramEditor/diagramEditorBaseBlock.h"
#include "diagramEditor/diagramEditorStructContainer.h"
DiagramEditorWizard::DiagramEditorWizard(QWidget *parent) DiagramEditorWizard::DiagramEditorWizard(QWidget *parent)
: QDialog(parent) : QDialog(parent)
@ -21,6 +24,8 @@ DiagramEditorWizard::~DiagramEditorWizard()
void DiagramEditorWizard::initial() void DiagramEditorWizard::initial()
{ {
_bayContentDlg = new WizardBayContentDlg(this);
ui->stackedWidget->addWidget(_bayContentDlg);
ui->tabWidget->tabBar()->setEnabled(false); ui->tabWidget->tabBar()->setEnabled(false);
connect(ui->btn_ok,&QPushButton::clicked,this,&DiagramEditorWizard::onOkClicked); connect(ui->btn_ok,&QPushButton::clicked,this,&DiagramEditorWizard::onOkClicked);
connect(ui->btn_cancel,&QPushButton::clicked,this,&DiagramEditorWizard::onCancelClicked); connect(ui->btn_cancel,&QPushButton::clicked,this,&DiagramEditorWizard::onCancelClicked);
@ -44,6 +49,15 @@ void DiagramEditorWizard::initial()
connect(delegate,&WizardBusTableDelegate::editingFinished,this,&DiagramEditorWizard::onDelegateFinishEdit); connect(delegate,&WizardBusTableDelegate::editingFinished,this,&DiagramEditorWizard::onDelegateFinishEdit);
connect(ui->tableWidget_bus, &QTableWidget::customContextMenuRequested, this, &DiagramEditorWizard::onBusIndexRbtnClicked); connect(ui->tableWidget_bus, &QTableWidget::customContextMenuRequested, this, &DiagramEditorWizard::onBusIndexRbtnClicked);
_divideType.insert(1,"A段");
_divideType.insert(2,"B段");
_divideType.insert(3,"C段");
_divideType.insert(4,"D段");
_divideType.insert(5,"E段");
_divideType.insert(6,"F段");
_divideType.insert(7,"G段");
_divideType.insert(8,"H段");
} }
void DiagramEditorWizard::reOrderBus() void DiagramEditorWizard::reOrderBus()
@ -60,12 +74,114 @@ void DiagramEditorWizard::reOrderBus()
void DiagramEditorWizard::generateBayPage() void DiagramEditorWizard::generateBayPage()
{ {
for(auto& busInfo:_mapBus) for(auto iter = _mapBus.begin();iter != _mapBus.end();++iter)
{ {
QListWidgetItem* item = new QListWidgetItem(""+QString::number(busInfo.nIndex+1)+""); QListWidgetItem* item = new QListWidgetItem(""+QString::number(iter->nIndex+1)+"");
item->setData(Qt::UserRole,busInfo.nIndex); item->setData(Qt::UserRole,iter->nIndex);
ui->listWidget_bay->addItem(item); ui->listWidget_bay->addItem(item);
QString sVoltage; //电压前缀
sVoltage = QString::number(iter->dVoltage)+"kV";
if(iter->nLineType == 1){ //单母
int nDivide = iter->mapDivide.value(0);
for(int i = 0;i < nDivide;++i){
QString sDivPre; //分段前缀
if(nDivide == 1){//不划分
}
else{
sDivPre = _divideType.value(i+1);
}
auto pContainer = new DiagramEditorStructContainer(this);
auto pBus = new DiagramEditorBusBlock(this);
pBus->setBusPro(sVoltage+"母线"+sDivPre,1,iter->dVoltage,0,i+1);
pContainer->insertBlock(1,pBus);
_mapSturctContainer[iter.key()].insert(i,pContainer);
}
}
else{ //双母
int nDivide1 = iter->mapDivide.value(0); // Ⅰ母
int nDivide2 = iter->mapDivide.value(1); // Ⅱ母
if(nDivide1 == nDivide2){ //双母线划分相同
for(int i = 0;i < nDivide1;++i){
QString sDivPre; //分段前缀
if(nDivide1 == 1){//不划分
}
else{
sDivPre = _divideType.value(i+1);
}
auto pContainer = new DiagramEditorStructContainer(this);
auto pBus1 = new DiagramEditorBusBlock(this);
pBus1->setBusPro(sVoltage+"Ⅰ母"+sDivPre,1,iter->dVoltage,1,i+1);
pContainer->insertBlock(1,pBus1);
auto pBus2 = new DiagramEditorBusBlock(this);
pBus2->setBusPro(sVoltage+"Ⅱ母"+sDivPre,1,iter->dVoltage,2,i+1);
pContainer->insertBlock(2,pBus2);
_mapSturctContainer[iter.key()].insert(i,pContainer);
}
}
else{ //双母线划分不同
if(nDivide1 > nDivide2){ //2母段数少于1母
for(int i = 0;i < nDivide1;++i){
QString sDivPre1 = _divideType.value(i+1); //分段前缀
auto pContainer = new DiagramEditorStructContainer(this);
auto pBus1 = new DiagramEditorBusBlock(this);
pBus1->setBusPro(sVoltage+"Ⅰ母"+sDivPre1,1,iter->dVoltage,1,i+1);
pContainer->insertBlock(1,pBus1);
if(i < nDivide2){
QString sDivPre2;
if(nDivide2 == 1){//不划分
}
else{
sDivPre2 = _divideType.value(i+1);
}
auto pBus2 = new DiagramEditorBusBlock(this);
pBus2->setBusPro(sVoltage+"Ⅱ母"+sDivPre2,1,iter->dVoltage,2,i+1);
pContainer->insertBlock(2,pBus2);
}
_mapSturctContainer[iter.key()].insert(i,pContainer);
}
}
else{
for(int i = 0;i < nDivide2;++i){ //1母段数少于2母
QString sDivPre2 = _divideType.value(i+1); //分段前缀
auto pContainer = new DiagramEditorStructContainer(this);
auto pBus2 = new DiagramEditorBusBlock(this);
pBus2->setBusPro(sVoltage+"Ⅱ母"+sDivPre2,1,iter->dVoltage,2,i+1);
pContainer->insertBlock(2,pBus2);
if(i < nDivide1){
QString sDivPre1;
if(nDivide1 == 1){//不划分
}
else{
sDivPre1 = _divideType.value(i+1);
}
auto pBus1 = new DiagramEditorBusBlock(this);
pBus1->setBusPro(sVoltage+"Ⅰ母"+sDivPre1,1,iter->dVoltage,1,i+1);
pContainer->insertBlock(1,pBus1);
}
_mapSturctContainer[iter.key()].insert(i,pContainer);
}
}
}
}
} }
} }
@ -156,7 +272,7 @@ void DiagramEditorWizard::onAddBusClicked()
QTableWidgetItem* connectItem = new QTableWidgetItem("未选择"); QTableWidgetItem* connectItem = new QTableWidgetItem("未选择");
ui->tableWidget_bus->setItem(row, 4, connectItem); ui->tableWidget_bus->setItem(row, 4, connectItem);
DiagramEditorBusInfo info; DiagramEditorWizardBusInfo info;
info.nIndex = row; info.nIndex = row;
_mapBus.insert(row,info); _mapBus.insert(row,info);
} }
@ -231,7 +347,7 @@ void DiagramEditorWizard::onBusDeleteClicked()
QModelIndex indexName = index.sibling(index.row(),0); QModelIndex indexName = index.sibling(index.row(),0);
int nIndex = indexName.data(Qt::UserRole).toInt(); int nIndex = indexName.data(Qt::UserRole).toInt();
if(_mapBus.contains(nIndex)){ if(_mapBus.contains(nIndex)){
DiagramEditorBusInfo info = _mapBus.take(nIndex); DiagramEditorWizardBusInfo info = _mapBus.take(nIndex);
} }
int currentRow = ui->tableWidget_bus->currentRow(); int currentRow = ui->tableWidget_bus->currentRow();

View File

@ -0,0 +1,74 @@
#include "diagramEditor/wizardBayContentDlg.h"
#include <QHeaderView>
WizardBayContentDlg::WizardBayContentDlg(QWidget *parent)
: QTableWidget(parent)
{
initial();
}
WizardBayContentDlg::~WizardBayContentDlg()
{
}
void WizardBayContentDlg::initial()
{
_curPageIndex = 0;
QStringList headerText;
headerText<<"间隔名称"<<"间隔类型"<<"连接对象";
setContextMenuPolicy(Qt::CustomContextMenu);
setSelectionMode(QAbstractItemView::SingleSelection);
setSelectionBehavior(QAbstractItemView::SelectRows);
setColumnCount(headerText.count());
setHorizontalHeaderLabels(headerText);
horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
}
void WizardBayContentDlg::addBay(DiagramEditorWizardBayInfo obj)
{
int row = rowCount();
insertRow(row);
//名称
QTableWidgetItem* nameItem = new QTableWidgetItem(obj.sName);
setItem(row, 0, nameItem);
QString sType;
switch (obj.nType) {//0分段间隔1母联间隔2pt间隔3进线间隔4出线间隔5无功补偿间隔6旁路间隔
case BayType::busSectionBay:
sType = "分段间隔";
break;
case BayType::busCouplerBay:
sType = "母联间隔";
break;
case BayType::ptBay:
sType = "pt间隔";
break;
case BayType::incomingBay:
sType = "进线间隔";
break;
case BayType::outcomingBay:
sType = "出线间隔";
break;
case BayType::compensationBay:
sType = "无功补偿间隔";
break;
case BayType::bypassBay:
sType = "旁路间隔";
break;
default:
break;
}
//类型
QTableWidgetItem* typeItem = new QTableWidgetItem(sType);
setItem(row, 1, typeItem);
// 主接线
QTableWidgetItem* connectItem = new QTableWidgetItem(obj.lstBindObj.join(""));
setItem(row, 2, connectItem);
}
void WizardBayContentDlg::clearData()
{
clear();
}

View File

@ -515,7 +515,7 @@ void FixedPortsModel::saveNode(int nPageId)
QJsonObject objIns= turnListToJson(pBay->getLstInstruct(),"id","ids"); QJsonObject objIns= turnListToJson(pBay->getLstInstruct(),"id","ids");
QJsonObject objEtc= turnListToJson(pBay->getLstEtc(),"id","ids"); QJsonObject objEtc= turnListToJson(pBay->getLstEtc(),"id","ids");
DataBase::GetInstance()->insertBay(pBay->uuid(),pBay->name(),pBay->getType(),pBay->getVoltage(),pBay->getFla(),pBay->getCapacity(),"1",pBay->getInService(),0,"1","1","1",QJsonObject(),objFrom,objTo,objProtec,objFalRec,objStatus,objDynSen,objIns,objEtc,pBay->getLstComponent()); DataBase::GetInstance()->insertBay(pBay->uuid(),pBay->name(),pBay->getType(),pBay->getVoltage(),pBay->getFla(),pBay->getCapacity(),"1",pBay->getInService(),0,"1","1","1",QJsonObject(),objFrom,objTo,objProtec,objFalRec,objStatus,objDynSen,objIns,objEtc,pBay->getLstComponent(),QJsonObject());
} }
else{ else{
QJsonObject objFrom = turnListToJson(pBay->getLstFrom(),"id","ids"); QJsonObject objFrom = turnListToJson(pBay->getLstFrom(),"id","ids");
@ -527,7 +527,7 @@ void FixedPortsModel::saveNode(int nPageId)
QJsonObject objIns= turnListToJson(pBay->getLstInstruct(),"id","ids"); QJsonObject objIns= turnListToJson(pBay->getLstInstruct(),"id","ids");
QJsonObject objEtc= turnListToJson(pBay->getLstEtc(),"id","ids"); QJsonObject objEtc= turnListToJson(pBay->getLstEtc(),"id","ids");
DataBase::GetInstance()->updateBay(pBay->uuid(),pBay->name(),pBay->getVoltage(),pBay->getFla(),pBay->getCapacity(),"",pBay->getInService(),0,QJsonObject(),objFrom,objTo,objProtec,objFalRec,objStatus,objDynSen,objIns,objEtc,pBay->getLstComponent()); DataBase::GetInstance()->updateBay(pBay->uuid(),pBay->name(),pBay->getVoltage(),pBay->getFla(),pBay->getCapacity(),"",pBay->getInService(),0,QJsonObject(),objFrom,objTo,objProtec,objFalRec,objStatus,objDynSen,objIns,objEtc,pBay->getLstComponent(),QJsonObject());
} }
} }
} }