#include #include #include #include #include #include "diagramEditor/editPanel.h" #include "diagramEditor/editScene.h" #include "diagramEditor/editView.h" #include "diagramEditor/editRowData.h" #include "diagramEditor/editMainRect.h" #include "diagramEditor/editBlock.h" #include "diagramEditor/diagramEditorWizard.h" #include "diagramEditor/editContainerItem.h" #include "diagramEditor/diagramEditorStructContainer.h" #include "diagramEditor/diagramEditorBaseBlock.h" #include "diagramEditor/editItems.h" #include "global.h" #include EditPanel::EditPanel(QWidget *parent) : QWidget(parent) ,_curWizard(nullptr) { _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); m_pEditView = new EditView(this); m_pEditView->setScene(m_pEditScene); _layout->addWidget(m_pEditView); initial(); setStyleSheet("backGround-color:rgb(112,128,144);"); } EditPanel::~EditPanel() { } void EditPanel::initByWizardInfo() { 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->setMinimumHeight(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); } layV->insertStretch(3); 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); } } } _widgetLayout->addStretch(); } 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()<sceneRect(); } } void EditPanel::onContainerSizeChanged(EditContainerItem* pItem) { if(pItem){ auto lst = pItem->childItems(); for(auto p:lst){ auto pBase = dynamic_cast(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)); } } } } } void EditPanel::initial() { _mainWidget = new EditMainRect; _widgetLayout = new QGraphicsLinearLayout(Qt::Vertical); _widgetLayout->setSpacing(40); _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(p); if(pBase){ QString sName = pBase->getName(); EditorItemType tpe = pBase->getType(); if(tpe == EditorItemType::bay){ auto pBay = dynamic_cast(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> map) { if(!map.value(1).isEmpty() && !map.value(2).isEmpty()){ //两条母线数据 return 2; } else{ return 1; } }