DiagramDesigner/diagramCavas/source/diagramEditor/editPanel.cpp

436 lines
18 KiB
C++
Raw Normal View History

2025-05-30 16:28:51 +08:00
#include <QVBoxLayout>
#include <QGraphicsWidget>
#include <QGraphicsGridLayout>
#include <QPushButton>
#include <QTimer>
2025-05-30 16:28:51 +08:00
#include <QGraphicsProxyWidget>
#include "diagramEditor/editPanel.h"
#include "diagramEditor/editScene.h"
#include "diagramEditor/editView.h"
#include "diagramEditor/editRowData.h"
#include "diagramEditor/editMainRect.h"
2025-07-31 19:38:06 +08:00
#include "diagramEditor/editBlock.h"
#include "diagramEditor/diagramEditorWizard.h"
#include "diagramEditor/editContainerItem.h"
#include "diagramEditor/diagramEditorStructContainer.h"
#include "diagramEditor/diagramEditorBaseBlock.h"
#include "diagramEditor/editItems.h"
2025-05-30 16:28:51 +08:00
#include "global.h"
#include <QDebug>
EditPanel::EditPanel(QWidget *parent)
: QWidget(parent)
,_curWizard(nullptr)
2025-05-30 16:28:51 +08:00
{
_maxWidth = 0;
_maxHeight = 0;
_layout = new QVBoxLayout(this);
m_pEditScene = new EditScene(this);
//设置场景大小.前两个参数为scene的坐标远点设置到view的中心点后无论view如何缩放secne的坐标原点都不会动方便后续的位置计算
//m_pEditScene->setSceneRect(-g_dGriaphicsScene_Width / 2, -g_dGriaphicsScene_Height / 2, g_dGriaphicsScene_Width, g_dGriaphicsScene_Height);
m_pEditScene->setSceneRect(0, 0, g_dGriaphicsScene_Width*2, g_dGriaphicsScene_Height*2);
2025-05-30 16:28:51 +08:00
m_pEditView = new EditView(this);
m_pEditView->setScene(m_pEditScene);
_layout->addWidget(m_pEditView);
initial();
setStyleSheet("backGround-color:rgb(112,128,144);");
}
EditPanel::~EditPanel()
{
}
2025-07-31 19:38:06 +08:00
void EditPanel::initByWizardInfo()
2025-05-30 16:28:51 +08:00
{
auto& mapTotal = _curWizard->getContainerStruct();
for(auto iter = mapTotal.begin();iter != mapTotal.end();++iter){
if(iter.key() == g_transformerLevel)
continue;
QGraphicsLinearLayout* layoutRowData = new QGraphicsLinearLayout(Qt::Horizontal);
layoutRowData->setSpacing(20);
layoutRowData->setMaximumHeight(300);
EditRowData* pRow = new EditRowData();
pRow->setId(QString::number(iter.key()));
auto& mapCon = iter.value();
for(int i = 0;i < mapCon.size();++i){
EditContainerItem* pContain = new EditContainerItem();
connect(pContain,&EditContainerItem::containerSizeChange,this,&EditPanel::onContainerSizeChanged);
pContain->setMinimumWidth(g_dEditorItem_Width+40);
layoutRowData->addItem(pContain);
pContain->setId(QUuid::createUuid().toString());
QGraphicsLinearLayout* layV = new QGraphicsLinearLayout(Qt::Vertical); //container中分层布局
layV->setSpacing(10);
layV->setMinimumHeight(260);
pContain->setLayout(layV);
auto pConData = mapCon[i];
auto mapBlock = pConData->getBlockMap();
for(auto ite = mapBlock.begin();ite != mapBlock.end();++ite){
QGraphicsLinearLayout* layH = new QGraphicsLinearLayout(Qt::Horizontal); //container中每一层的布局
layV->addItem(layH);
if(ite.value().size() > 0){
for(auto pBlock:ite.value()){
int nType = pBlock->getType();
EditBaseItem* pItem = nullptr;
if(nType == 1){ //母线
auto pBus = new EditBusItem();
pBus->setType(EditorItemType::bus);
pItem = pBus;
layH->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Maximum);
layH->setPreferredHeight(10); // 固定高度
}
else if(nType == 2){ //间隔
auto pBay = new EditBayItem();
pBay->setType(EditorItemType::bay);
pBay->setBoundingRect(QRectF(0,0,g_dEditorItem_Width,g_dEditorItem_Height));
pItem = pBay;
}
/*else if(nType == 3){ //变压器
auto pTrans = new EditTransItem();
pTrans->setType(EditorItemType::Trans);
pItem = pTrans;
}*/
if(pItem){
pItem->setName(pBlock->getName());
pItem->setBlockData(pBlock);
layH->addItem(pItem);
}
}
}
}
if(mapBlock.value(0).isEmpty()){ //为空则添加间距
//layV->insertStretch(0);
QGraphicsLinearLayout* layH = new QGraphicsLinearLayout(Qt::Horizontal); //container中每一层的布局
layV->insertItem(0,layH);
auto pSpace = new EditBaseItem();
pSpace->setType(EditorItemType::none);
pSpace->setBoundingRect(QRectF(0,0,g_dEditorItem_Width,g_dEditorItem_Height));
layH->addItem(pSpace);
}
if(mapBlock.value(3).isEmpty()){ //为空则添加间距
//layV->addStretch();
QGraphicsLinearLayout* layH = new QGraphicsLinearLayout(Qt::Horizontal); //container中每一层的布局
layV->insertItem(3,layH);
auto pSpace = new EditBaseItem();
pSpace->setType(EditorItemType::none);
pSpace->setBoundingRect(QRectF(0,0,g_dEditorItem_Width,g_dEditorItem_Height));
layH->addItem(pSpace);
}
if(layV->count() == 4){
layV->insertStretch(3);
layV->insertStretch(1);
}
else if(layV->count() == 2)
{
layV->insertStretch(1);
}
calculateContainerWidth(pContain);
/*int n = getContainerBusType(mapBlock);
if(n == 1){
layoutRowData->setMaximumHeight(210);
}*/
}
_lstData.append(pRow);
//layoutRowData->addStretch();
_widgetLayout->addItem(layoutRowData);
if(iter.key() == 0){ //若设置了变压器,直接插入到第一行下方
if(!mapTotal.value(g_transformerLevel).empty()){
QGraphicsLinearLayout* layoutRowData = new QGraphicsLinearLayout(Qt::Horizontal);
layoutRowData->setSpacing(20);
EditRowData* pRow = new EditRowData();
pRow->setId(QString::number(g_transformerLevel));
auto& mapCon = mapTotal[g_transformerLevel];
for(int i = 0;i < mapCon.size();++i){
EditContainerItem* pContain = new EditContainerItem();
connect(pContain,&EditContainerItem::containerSizeChange,this,&EditPanel::onContainerSizeChanged);
pContain->setMinimumWidth(g_dEditorItem_Width+40);
layoutRowData->addItem(pContain);
pContain->setId(QUuid::createUuid().toString());
QGraphicsLinearLayout* layV = new QGraphicsLinearLayout(Qt::Vertical); //container中分层布局
layV->setSpacing(10);
layV->setMinimumHeight(260);
pContain->setLayout(layV);
auto pConData = mapCon[i];
auto mapBlock = pConData->getBlockMap();
for(auto ite = mapBlock.begin();ite != mapBlock.end();++ite){
QGraphicsLinearLayout* layH = new QGraphicsLinearLayout(Qt::Horizontal); //container中每一层的布局
layV->addItem(layH);
if(ite.value().size() > 0){
for(auto pBlock:ite.value()){
int nType = pBlock->getType();
EditBaseItem* pItem = nullptr;
if(nType == 3){ //变压器
auto pTrans = new EditTransItem();
pTrans->setType(EditorItemType::trans);
pTrans->setBoundingRect(QRectF(0,0,g_dEditorItem_Width,g_dEditorItem_Width));
pItem = pTrans;
}
if(pItem){
pItem->setName(pBlock->getName());
pItem->setBlockData(pBlock);
layH->addItem(pItem);
}
}
}
}
layV->insertStretch(3);
layV->insertStretch(0);
layoutRowData->addStretch();
}
layoutRowData->insertStretch(0);
_lstData.append(pRow);
_widgetLayout->addItem(layoutRowData);
}
}
}
2025-07-31 19:38:06 +08:00
_widgetLayout->addStretch();
QTimer::singleShot(300, [&]() { // 1000 毫秒 = 1 秒
qDebug() << "一次性定时器触发!";
initBlockConnection();
});
}
void EditPanel::initBlockConnection()
{
if(_curWizard){
auto mapCon = _curWizard->getConnection();
//todo:添加过的不再添加
for(auto& con:mapCon){
auto item1 = _curWizard->getBlockByName_all(con.con1.sName);
auto item2 = _curWizard->getBlockByName_all(con.con2.sName);
auto con1 = _curWizard->getContainerByBlock_all(con.con1.sName);
auto con2 = _curWizard->getContainerByBlock_all(con.con2.sName);
auto pItem1 = getItemByName(item1->getName());
auto pItem2 = getItemByName(item2->getName());
/*QRectF rect1 = pItem1->geometry();
QRectF rect2 = pItem2->geometry();
QPointF center1 = pItem1->mapToScene(rect1.center());
QPointF center2 = pItem2->mapToScene(rect2.center());*/
EditLineItem* pLine = new EditLineItem();
pLine->setName(con.uid.toString());
pLine->setType(EditorItemType::line);
m_pEditScene->addItem(pLine);
if(con1 && con2){
int nT1 = item1->getType();
int nT2 = item2->getType();
QPointF center1 = pItem1->scenePos();
QPointF center2 = pItem2->scenePos();
if(con1 == con2){ //两个block在同一个容器中(上下连接)
center1 += QPointF(pItem1->boundingRect().width()*0.5,0);
center2 += QPointF(pItem2->boundingRect().width()*0.5,0);
if((nT1 == 1 && nT2 == 2) || (nT2 == 1 && nT1 == 2)){ //对象是母线段母线横坐标与同容器Block相同
if(nT1 == 1){ //pItem1是母线
center1.setX(center2.x());
}
else{ //pItem2是母线
center2.setX(center1.x());
}
if(center1.y() < center2.y()){ //item1在item2上 2的上边连接1下边
center1 += QPointF(0,pItem1->boundingRect().height()); //将1的点移动到下边
}
else{ //2在1上
center2 += QPointF(0,pItem2->boundingRect().height()); //将2的点移动到下边
}
pLine->setStartPoint(center1);
pLine->setEndPoint(center2);
pLine->calculatePath();
}
}
else{
if((nT1 == 1 && nT2 == 2) || (nT2 == 1 && nT1 == 2)){ //分段连接(左右连接)
center1 += QPointF(0,pItem1->boundingRect().height()*0.5);
center2 += QPointF(0,pItem2->boundingRect().height()*0.5);
if(center1.x() < center2.x()){ //item1在item2左边 1右连2左
center1 += QPointF(pItem1->boundingRect().width(),0);
}
else{ //1在2右 2右连1左
center2 += QPointF(pItem2->boundingRect().width(),0);
}
pLine->setStartPoint(center1);
pLine->setEndPoint(center2);
pLine->calculatePath();
}
else if((nT1 == 3 && nT2 == 2) || (nT2 == 2 && nT1 == 3)){ //变压器连间隔
center1 += QPointF(pItem1->boundingRect().width()*0.5,0);
center2 += QPointF(pItem2->boundingRect().width()*0.5,0);
DiagramEditorTransformerBlock* pTrans = nullptr;
DiagramEditorBayBlock* pBay = nullptr;
if(nT1 == 3){
pTrans = dynamic_cast<DiagramEditorTransformerBlock*>(item1);
pBay = dynamic_cast<DiagramEditorBayBlock*>(item2);
}
else if(nT2 == 3){
pTrans = dynamic_cast<DiagramEditorTransformerBlock*>(item2);
pBay = dynamic_cast<DiagramEditorBayBlock*>(item1);
}
if(pTrans && pBay){
TransformerType typTrans = pTrans->getTransType();
BayType typBay = pBay->getBayType();
if(typTrans == TransformerType::twoWinding){ //两绕组
if(typBay == BayType::incomingBay){ //进线间隔,在高压侧
center2 += QPointF(0,pItem2->boundingRect().height());
}
else if(typBay == BayType::outcomingBay){ //出线间隔,在低压侧
center1 += QPointF(0,pItem1->boundingRect().height());
}
}
else{ //三绕组 //todo:手动区分三绕组
}
}
pLine->setStartPoint(center1);
pLine->setEndPoint(center2);
pLine->calculatePath(3);
}
}
}
}
}
2025-05-30 16:28:51 +08:00
}
void EditPanel::onWidthChanged(int width)
{
if(_maxWidth < width)
{
_maxWidth = width;
int x = _mainWidget->geometry().width();
int y = _mainWidget->geometry().y();
_mainWidget->setGeometry(x,y,_maxWidth,_maxHeight);
m_pEditScene->setSceneRect(x,y,_maxWidth,_maxHeight);
m_pEditView->viewport()->update();
//qDebug()<<m_pEditScene->sceneRect();
}
}
void EditPanel::onContainerSizeChanged(EditContainerItem* pItem)
{
if(pItem){
auto lst = pItem->childItems();
for(auto p:lst){
auto pBase = dynamic_cast<EditBaseItem*>(p);
if(pBase){
QString sName = pBase->getName();
EditorItemType tpe = pBase->getType();
if(tpe == EditorItemType::bus){
pBase->setBoundingRect(QRectF(0,0,pItem->boundingRect().width()-20,g_nEditorBus_Height));
}
}
}
}
}
2025-05-30 16:28:51 +08:00
void EditPanel::initial()
{
_mainWidget = new EditMainRect;
_widgetLayout = new QGraphicsLinearLayout(Qt::Vertical);
_widgetLayout->setSpacing(40);
2025-05-30 16:28:51 +08:00
_mainWidget->setLayout(_widgetLayout);
m_pEditScene->addItem(_mainWidget);
_mainWidget->setGeometry(m_pEditScene->sceneRect());
_maxWidth = _mainWidget->rect().width();
_maxHeight = _mainWidget->rect().height();
m_pEditView->centerOn(0,0);
}
void EditPanel::calculateContainerWidth(EditContainerItem* pItem)
{
if(pItem){
auto lst = pItem->childItems();
int nWidth = 0;
int nTop = 0; //container上层item数
int nBottom = 0; //下层
bool isSection = false; //是否分段
for(auto p:lst){
auto pBase = dynamic_cast<EditBaseItem*>(p);
if(pBase){
QString sName = pBase->getName();
EditorItemType tpe = pBase->getType();
if(tpe == EditorItemType::bay){
auto pBay = dynamic_cast<DiagramEditorBayBlock*>(pBase->getBlockData().data());
if(pBay){ //分段连接的container固定大小
BayType typ = pBay->getBayType();
if(typ == BayType::busSectionBay){
isSection = true;
}
}
auto pData = pBase->getBlockData();
if(pData){
int n = pData->getContainerLevel();
if(n == 0){
nTop += 1;
}
else if(n == 3){
nBottom += 1;
}
}
//nWidth += g_dEditorItem_Width+20;
}
}
}
if(nTop || nBottom){
nWidth = (nTop > nBottom ? nTop : nBottom)*(g_dEditorItem_Width+20);
pItem->setMinimumWidth(nWidth);
if(isSection){ //分段连接的container固定大小
pItem->setMaximumWidth(nWidth);
}
}
}
}
int EditPanel::getContainerBusType(QMap<int,QList<DiagramEditorBaseBlock*>> map)
{
if(!map.value(1).isEmpty() && !map.value(2).isEmpty()){ //两条母线数据
return 2;
}
else{
return 1;
}
}
EditBaseItem* EditPanel::getItemByName(const QString& sName)
{
auto lstItems = m_pEditScene->items();
for(auto& item:lstItems){
auto pBase = dynamic_cast<EditBaseItem*>(item);
if(pBase){
if(pBase->getName() == sName){
return pBase;
}
}
}
return nullptr;
}