DiagramDesigner/diagramCavas/source/diagramEditor/editPanel.cpp

543 lines
22 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include <QVBoxLayout>
#include <QGraphicsWidget>
#include <QGraphicsGridLayout>
#include <QPushButton>
#include <QTimer>
#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 "diagramEditor/diagramEditorBayDetailSettingDlg.h"
#include "diagramEditor/diagramEditorTransDetailSettingDlg.h"
#include "graphicsDataModel/diagramEditorModel.h"
#include "diagramEditor/diagramEditorPreviewDlg.h"
#include "diagramEditor/confirmEditorDlg.h"
#include "diagramCavas.h"
#include "global.h"
#include <QDebug>
EditPanel::EditPanel(QWidget *parent)
: QWidget(parent)
,_curWizard(nullptr)
,_bayDetailSetting(nullptr)
,_transDetailSetting(nullptr)
,_pModel(nullptr)
,_pPreview(nullptr)
,_confirmEditor(nullptr)
{
_pModel = new DiagramEditorModel();
_pModel->setPanel(this);
_maxWidth = 0;
_maxHeight = 0;
_layout = new QVBoxLayout(this);
m_pEditScene = new EditScene(this);
m_pEditScene->setModel(_pModel);
//设置场景大小.前两个参数为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*4, g_dGriaphicsScene_Height*4);
m_pEditView = new EditView(this);
m_pEditView->setScene(m_pEditScene);
_layout->addWidget(m_pEditView);
initial();
setStyleSheet("backGround-color:rgb(112,128,144);");
}
EditPanel::~EditPanel()
{
if(_pModel)
delete _pModel;
}
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->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){
connect(pItem,&EditBaseItem::itemDbClicked,this,&EditPanel::onItemDbClicked);
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){
connect(pItem,&EditBaseItem::itemDbClicked,this,&EditPanel::onItemDbClicked);
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();
QTimer::singleShot(300, [&]() { // 1000 毫秒 = 1 秒
qDebug() << "一次性定时器触发!";
initBlockConnection();
});
}
void EditPanel::initBlockConnection()
{
if(_curWizard){
auto mapCon = _curWizard->getConnection();
//todo:添加过的不再添加
for(auto& con:mapCon){
int nPara = con.nPara;
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){ //todo:此分支暂不起作用
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{ //三绕组
if(nPara == 0){ //高压侧
center2 += QPointF(0,pItem2->boundingRect().height());
}
else if(nPara == 1){ //中压
if(center1.x() < center2.x()){ //变压器在左
center1 += QPointF(pItem1->boundingRect().width()*0.5,pItem1->boundingRect().height()*0.5);
}
else{
center1 -= QPointF(pItem1->boundingRect().width()*0.5,0);
center1 += QPointF(0,pItem1->boundingRect().height()*0.5);
}
pLine->setStartPoint(center1);
pLine->setEndPoint(center2);
pLine->calculatePath();
continue;
}
else if(nPara == 2){ //低压
center1 += QPointF(0,pItem1->boundingRect().height());
}
}
}
pLine->setStartPoint(center1);
pLine->setEndPoint(center2);
pLine->calculatePath(3);
}
}
}
}
}
}
void EditPanel::showPreview()
{
if(!_pPreview){
_pPreview = new DiagramEditorPreviewDlg(this);
}
_pPreview->showDlg();
}
void EditPanel::showConfirmDlg()
{
if(!_confirmEditor){
_confirmEditor = new ConfirmEditorDlg(this);
_confirmEditor->setModelDelegate(_pModel);
connect(_confirmEditor,&ConfirmEditorDlg::onConfirmEditor,this,[&](QString sAuthor,QString sTime){
auto pCavas = _pModel->getCavas();
if(pCavas){
pCavas->onSignal_wizardFinished(_projectName,_pModel->getPreviewItem());
}
});
}
_confirmEditor->show();
}
QList<EditBaseItem*> EditPanel::getBlockItems(EditorItemType typ)
{
QList<EditBaseItem*> lst;
auto allItems = m_pEditScene->items();
for(auto item:allItems){
auto p = dynamic_cast<EditBaseItem*>(item);
if(p){
EditorItemType eType = p->getType();
if(typ == EditorItemType::none){ //返回所有block item
if(eType == EditorItemType::bay || eType == EditorItemType::bus || eType == EditorItemType::trans){
lst.push_back(p);
}
}
else{
if(eType == typ){
lst.push_back(p);
}
}
}
}
return lst;
}
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::onItemDbClicked(QPointer<DiagramEditorBaseBlock> pBlock)
{
if(pBlock->getType() == 2){ //间隔
if(_bayDetailSetting == nullptr){
_bayDetailSetting = new DiagramEditorBayDetailSettingDlg(this);
_bayDetailSetting->setModelDelegate(_pModel);
_bayDetailSetting->setWizard(_curWizard);
}
auto pBay = dynamic_cast<DiagramEditorBayBlock*>(pBlock.data());
if(pBay)
_bayDetailSetting->showDlg(pBay);
}
else if(pBlock->getType() == 3){ //变压器
if(_transDetailSetting == nullptr){
_transDetailSetting = new DiagramEditorTransDetailSettingDlg(this);
_transDetailSetting->setModelDelegate(_pModel);
_transDetailSetting->setWizard(_curWizard);
}
auto pTrans = dynamic_cast<DiagramEditorTransformerBlock*>(pBlock.data());
if(pTrans)
_transDetailSetting->showDlg(pTrans);
}
}
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;
}
}
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;
}