296 lines
12 KiB
C++
296 lines
12 KiB
C++
#include <QVBoxLayout>
|
||
#include <QGraphicsWidget>
|
||
#include <QGraphicsGridLayout>
|
||
#include <QPushButton>
|
||
#include <QGraphicsProxyWidget>
|
||
#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 <QDebug>
|
||
|
||
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()<<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));
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
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<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;
|
||
}
|
||
}
|