2025-05-30 16:28:51 +08:00
|
|
|
|
#include <QVBoxLayout>
|
|
|
|
|
|
#include <QGraphicsWidget>
|
|
|
|
|
|
#include <QGraphicsGridLayout>
|
|
|
|
|
|
#include <QPushButton>
|
2025-08-08 17:47:31 +08:00
|
|
|
|
#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"
|
2025-08-06 20:10:10 +08:00
|
|
|
|
#include "diagramEditor/diagramEditorWizard.h"
|
|
|
|
|
|
#include "diagramEditor/editContainerItem.h"
|
|
|
|
|
|
#include "diagramEditor/diagramEditorStructContainer.h"
|
|
|
|
|
|
#include "diagramEditor/diagramEditorBaseBlock.h"
|
|
|
|
|
|
#include "diagramEditor/editItems.h"
|
2025-08-15 18:21:20 +08:00
|
|
|
|
#include "diagramEditor/diagramEditorBayDetailSettingDlg.h"
|
2025-09-05 17:30:07 +08:00
|
|
|
|
#include "diagramEditor/diagramEditorTransDetailSettingDlg.h"
|
2025-08-25 12:02:15 +08:00
|
|
|
|
#include "graphicsDataModel/diagramEditorModel.h"
|
2025-09-12 17:28:47 +08:00
|
|
|
|
#include "diagramEditor/diagramEditorPreviewDlg.h"
|
2025-09-26 18:50:21 +08:00
|
|
|
|
#include "diagramEditor/confirmEditorDlg.h"
|
2025-10-24 21:11:07 +08:00
|
|
|
|
#include "projectManager.h"
|
2025-09-26 18:50:21 +08:00
|
|
|
|
#include "diagramCavas.h"
|
2025-05-30 16:28:51 +08:00
|
|
|
|
#include "global.h"
|
|
|
|
|
|
#include <QDebug>
|
|
|
|
|
|
|
|
|
|
|
|
EditPanel::EditPanel(QWidget *parent)
|
|
|
|
|
|
: QWidget(parent)
|
2025-10-24 21:11:07 +08:00
|
|
|
|
,_pEditorWizard(nullptr)
|
2025-08-15 18:21:20 +08:00
|
|
|
|
,_bayDetailSetting(nullptr)
|
2025-09-05 17:30:07 +08:00
|
|
|
|
,_transDetailSetting(nullptr)
|
2025-08-25 12:02:15 +08:00
|
|
|
|
,_pModel(nullptr)
|
2025-09-12 17:28:47 +08:00
|
|
|
|
,_pPreview(nullptr)
|
2025-09-26 18:50:21 +08:00
|
|
|
|
,_confirmEditor(nullptr)
|
2025-05-30 16:28:51 +08:00
|
|
|
|
{
|
2025-08-25 12:02:15 +08:00
|
|
|
|
_pModel = new DiagramEditorModel();
|
2025-09-05 17:30:07 +08:00
|
|
|
|
_pModel->setPanel(this);
|
2025-05-30 16:28:51 +08:00
|
|
|
|
_maxWidth = 0;
|
|
|
|
|
|
_maxHeight = 0;
|
|
|
|
|
|
_layout = new QVBoxLayout(this);
|
|
|
|
|
|
m_pEditScene = new EditScene(this);
|
2025-09-12 17:28:47 +08:00
|
|
|
|
m_pEditScene->setModel(_pModel);
|
2025-05-30 16:28:51 +08:00
|
|
|
|
//设置场景大小.前两个参数为scene的坐标远点,设置到view的中心点后,无论view如何缩放,secne的坐标原点都不会动,方便后续的位置计算
|
|
|
|
|
|
//m_pEditScene->setSceneRect(-g_dGriaphicsScene_Width / 2, -g_dGriaphicsScene_Height / 2, g_dGriaphicsScene_Width, g_dGriaphicsScene_Height);
|
2025-09-26 18:50:21 +08:00
|
|
|
|
m_pEditScene->setSceneRect(0, 0, g_dGriaphicsScene_Width*4, g_dGriaphicsScene_Height*4);
|
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-08-25 12:02:15 +08:00
|
|
|
|
if(_pModel)
|
|
|
|
|
|
delete _pModel;
|
2025-05-30 16:28:51 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2025-07-31 19:38:06 +08:00
|
|
|
|
void EditPanel::initByWizardInfo()
|
2025-05-30 16:28:51 +08:00
|
|
|
|
{
|
2025-10-30 17:20:10 +08:00
|
|
|
|
if(!_lstData.empty()){
|
|
|
|
|
|
_pModel->clearItems();
|
|
|
|
|
|
m_pEditScene->clear();
|
|
|
|
|
|
_lstData.clear();
|
|
|
|
|
|
_mainWidget = new EditMainRect;
|
|
|
|
|
|
_widgetLayout = new QGraphicsLinearLayout(Qt::Vertical);
|
|
|
|
|
|
_widgetLayout->setSpacing(40);
|
|
|
|
|
|
_mainWidget->setLayout(_widgetLayout);
|
|
|
|
|
|
m_pEditScene->addItem(_mainWidget);
|
|
|
|
|
|
_mainWidget->setGeometry(m_pEditScene->sceneRect());
|
|
|
|
|
|
}
|
2025-10-24 21:11:07 +08:00
|
|
|
|
auto& mapTotal = _pEditorWizard->getContainerStruct();
|
2025-08-06 20:10:10 +08:00
|
|
|
|
for(auto iter = mapTotal.begin();iter != mapTotal.end();++iter){
|
|
|
|
|
|
if(iter.key() == g_transformerLevel)
|
|
|
|
|
|
continue;
|
|
|
|
|
|
QGraphicsLinearLayout* layoutRowData = new QGraphicsLinearLayout(Qt::Horizontal);
|
|
|
|
|
|
layoutRowData->setSpacing(20);
|
2025-08-08 17:47:31 +08:00
|
|
|
|
layoutRowData->setMaximumHeight(300);
|
2025-08-06 20:10:10 +08:00
|
|
|
|
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){
|
2025-08-15 18:21:20 +08:00
|
|
|
|
connect(pItem,&EditBaseItem::itemDbClicked,this,&EditPanel::onItemDbClicked);
|
2025-08-06 20:10:10 +08:00
|
|
|
|
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);
|
|
|
|
|
|
}
|
2025-08-08 17:47:31 +08:00
|
|
|
|
if(layV->count() == 4){
|
|
|
|
|
|
layV->insertStretch(3);
|
|
|
|
|
|
layV->insertStretch(1);
|
|
|
|
|
|
}
|
|
|
|
|
|
else if(layV->count() == 2)
|
|
|
|
|
|
{
|
|
|
|
|
|
layV->insertStretch(1);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-08-06 20:10:10 +08:00
|
|
|
|
|
|
|
|
|
|
calculateContainerWidth(pContain);
|
2025-08-08 17:47:31 +08:00
|
|
|
|
/*int n = getContainerBusType(mapBlock);
|
2025-08-06 20:10:10 +08:00
|
|
|
|
if(n == 1){
|
|
|
|
|
|
layoutRowData->setMaximumHeight(210);
|
2025-08-08 17:47:31 +08:00
|
|
|
|
}*/
|
2025-08-06 20:10:10 +08:00
|
|
|
|
}
|
|
|
|
|
|
_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();
|
2025-08-08 17:47:31 +08:00
|
|
|
|
pTrans->setType(EditorItemType::trans);
|
2025-08-06 20:10:10 +08:00
|
|
|
|
pTrans->setBoundingRect(QRectF(0,0,g_dEditorItem_Width,g_dEditorItem_Width));
|
|
|
|
|
|
pItem = pTrans;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if(pItem){
|
2025-08-15 18:21:20 +08:00
|
|
|
|
connect(pItem,&EditBaseItem::itemDbClicked,this,&EditPanel::onItemDbClicked);
|
2025-08-06 20:10:10 +08:00
|
|
|
|
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();
|
2025-08-08 17:47:31 +08:00
|
|
|
|
QTimer::singleShot(300, [&]() { // 1000 毫秒 = 1 秒
|
|
|
|
|
|
qDebug() << "一次性定时器触发!";
|
|
|
|
|
|
initBlockConnection();
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void EditPanel::initBlockConnection()
|
|
|
|
|
|
{
|
2025-10-24 21:11:07 +08:00
|
|
|
|
if(_pEditorWizard){
|
|
|
|
|
|
auto mapCon = _pEditorWizard->getConnection();
|
2025-08-08 17:47:31 +08:00
|
|
|
|
//todo:添加过的不再添加
|
|
|
|
|
|
for(auto& con:mapCon){
|
2025-08-15 18:21:20 +08:00
|
|
|
|
int nPara = con.nPara;
|
2025-10-24 21:11:07 +08:00
|
|
|
|
auto item1 = _pEditorWizard->getBlockByName_all(con.con1.sName);
|
|
|
|
|
|
auto item2 = _pEditorWizard->getBlockByName_all(con.con2.sName);
|
2025-10-30 17:20:10 +08:00
|
|
|
|
if(!item1 || !item2)
|
|
|
|
|
|
continue;
|
2025-08-08 17:47:31 +08:00
|
|
|
|
|
2025-10-24 21:11:07 +08:00
|
|
|
|
auto con1 = _pEditorWizard->getContainerByBlock_all(con.con1.sName);
|
|
|
|
|
|
auto con2 = _pEditorWizard->getContainerByBlock_all(con.con2.sName);
|
2025-08-08 17:47:31 +08:00
|
|
|
|
|
|
|
|
|
|
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);
|
|
|
|
|
|
}
|
2025-08-15 18:21:20 +08:00
|
|
|
|
else if(nT2 == 3){ //todo:此分支暂不起作用
|
2025-08-08 17:47:31 +08:00
|
|
|
|
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){ //两绕组
|
2025-10-11 18:51:33 +08:00
|
|
|
|
if(typBay == BayType::outcomingBay){ //进线间隔,在低压侧
|
2025-08-08 17:47:31 +08:00
|
|
|
|
center2 += QPointF(0,pItem2->boundingRect().height());
|
|
|
|
|
|
}
|
2025-10-11 18:51:33 +08:00
|
|
|
|
else if(typBay == BayType::incomingBay){ //出线间隔,在高压侧
|
2025-08-08 17:47:31 +08:00
|
|
|
|
center1 += QPointF(0,pItem1->boundingRect().height());
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2025-08-15 18:21:20 +08:00
|
|
|
|
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());
|
|
|
|
|
|
}
|
2025-08-08 17:47:31 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
pLine->setStartPoint(center1);
|
|
|
|
|
|
pLine->setEndPoint(center2);
|
|
|
|
|
|
pLine->calculatePath(3);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2025-05-30 16:28:51 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2025-09-12 17:28:47 +08:00
|
|
|
|
void EditPanel::showPreview()
|
|
|
|
|
|
{
|
|
|
|
|
|
if(!_pPreview){
|
|
|
|
|
|
_pPreview = new DiagramEditorPreviewDlg(this);
|
|
|
|
|
|
}
|
|
|
|
|
|
_pPreview->showDlg();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-09-26 18:50:21 +08:00
|
|
|
|
void EditPanel::showConfirmDlg()
|
|
|
|
|
|
{
|
|
|
|
|
|
if(!_confirmEditor){
|
|
|
|
|
|
_confirmEditor = new ConfirmEditorDlg(this);
|
|
|
|
|
|
_confirmEditor->setModelDelegate(_pModel);
|
|
|
|
|
|
|
|
|
|
|
|
connect(_confirmEditor,&ConfirmEditorDlg::onConfirmEditor,this,[&](QString sAuthor,QString sTime){
|
2025-10-24 21:11:07 +08:00
|
|
|
|
auto pCavas = getCavas();
|
2025-10-30 17:20:10 +08:00
|
|
|
|
if(pCavas){
|
|
|
|
|
|
QByteArray btWizard = _pModel->getWizardInfo();
|
|
|
|
|
|
setWindowTitle(sTime);
|
|
|
|
|
|
ProjectManager::instance().saveEditorDataToDB(_uid,_projectName,_projectName,btWizard,sAuthor,sTime);
|
2025-09-26 18:50:21 +08:00
|
|
|
|
}
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
2025-10-30 17:20:10 +08:00
|
|
|
|
_confirmEditor->showDlg(_author,_timeStamp);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void EditPanel::generate()
|
|
|
|
|
|
{
|
|
|
|
|
|
auto pCavas = getCavas();
|
2025-11-14 19:31:09 +08:00
|
|
|
|
QList<EditBaseItem*> pBlocks = getBlockItems();
|
|
|
|
|
|
pCavas->onSignal_wizardFinished(_projectName,_pModel->getPreviewItem(),pBlocks);
|
2025-09-26 18:50:21 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2025-10-24 21:11:07 +08:00
|
|
|
|
void EditPanel::showWizard()
|
|
|
|
|
|
{
|
|
|
|
|
|
if(_pEditorWizard)
|
|
|
|
|
|
_pEditorWizard->show();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-09-05 17:30:07 +08:00
|
|
|
|
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;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
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();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-08-06 20:10:10 +08:00
|
|
|
|
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-08-15 18:21:20 +08:00
|
|
|
|
void EditPanel::onItemDbClicked(QPointer<DiagramEditorBaseBlock> pBlock)
|
|
|
|
|
|
{
|
|
|
|
|
|
if(pBlock->getType() == 2){ //间隔
|
|
|
|
|
|
if(_bayDetailSetting == nullptr){
|
|
|
|
|
|
_bayDetailSetting = new DiagramEditorBayDetailSettingDlg(this);
|
2025-08-28 10:59:04 +08:00
|
|
|
|
_bayDetailSetting->setModelDelegate(_pModel);
|
2025-10-24 21:11:07 +08:00
|
|
|
|
_bayDetailSetting->setWizard(_pEditorWizard);
|
2025-08-15 18:21:20 +08:00
|
|
|
|
}
|
|
|
|
|
|
auto pBay = dynamic_cast<DiagramEditorBayBlock*>(pBlock.data());
|
|
|
|
|
|
if(pBay)
|
|
|
|
|
|
_bayDetailSetting->showDlg(pBay);
|
|
|
|
|
|
}
|
|
|
|
|
|
else if(pBlock->getType() == 3){ //变压器
|
2025-09-05 17:30:07 +08:00
|
|
|
|
if(_transDetailSetting == nullptr){
|
|
|
|
|
|
_transDetailSetting = new DiagramEditorTransDetailSettingDlg(this);
|
|
|
|
|
|
_transDetailSetting->setModelDelegate(_pModel);
|
2025-10-24 21:11:07 +08:00
|
|
|
|
_transDetailSetting->setWizard(_pEditorWizard);
|
2025-09-05 17:30:07 +08:00
|
|
|
|
}
|
|
|
|
|
|
auto pTrans = dynamic_cast<DiagramEditorTransformerBlock*>(pBlock.data());
|
|
|
|
|
|
if(pTrans)
|
|
|
|
|
|
_transDetailSetting->showDlg(pTrans);
|
2025-08-15 18:21:20 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-05-30 16:28:51 +08:00
|
|
|
|
void EditPanel::initial()
|
|
|
|
|
|
{
|
|
|
|
|
|
_mainWidget = new EditMainRect;
|
|
|
|
|
|
_widgetLayout = new QGraphicsLinearLayout(Qt::Vertical);
|
2025-08-06 20:10:10 +08:00
|
|
|
|
_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);
|
2025-10-24 21:11:07 +08:00
|
|
|
|
|
|
|
|
|
|
_pEditorWizard = new DiagramEditorWizard(this);
|
|
|
|
|
|
connect(_pEditorWizard,&DiagramEditorWizard::wizardFinish,this,[&](){
|
|
|
|
|
|
initByWizardInfo();
|
|
|
|
|
|
});
|
|
|
|
|
|
_pModel->setWizard(_pEditorWizard);
|
2025-05-30 16:28:51 +08:00
|
|
|
|
}
|
2025-08-06 20:10:10 +08:00
|
|
|
|
|
|
|
|
|
|
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;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2025-08-08 17:47:31 +08:00
|
|
|
|
|
|
|
|
|
|
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;
|
|
|
|
|
|
}
|
2025-10-24 21:11:07 +08:00
|
|
|
|
|
2025-10-30 17:20:10 +08:00
|
|
|
|
void EditPanel::closeEvent(QCloseEvent *closeEvent)
|
|
|
|
|
|
{
|
|
|
|
|
|
emit panelDelete(_tagName,0);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-10-24 21:11:07 +08:00
|
|
|
|
void EditPanel::prepareSaveEditor()
|
|
|
|
|
|
{
|
|
|
|
|
|
if(_pModel){
|
2025-10-30 17:20:10 +08:00
|
|
|
|
showConfirmDlg();
|
2025-10-24 21:11:07 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-10-30 17:20:10 +08:00
|
|
|
|
void EditPanel::loadBaseSetting(QUuid uid)
|
2025-10-24 21:11:07 +08:00
|
|
|
|
{
|
2025-10-30 17:20:10 +08:00
|
|
|
|
auto info = ProjectManager::instance().getBaseSetting(uid);
|
2025-10-24 21:11:07 +08:00
|
|
|
|
if(_pModel){
|
2025-10-30 17:20:10 +08:00
|
|
|
|
_author = info.autor;
|
|
|
|
|
|
_timeStamp = info.ts;
|
|
|
|
|
|
_tagName = _projectName; //将临时名称保存到变量
|
|
|
|
|
|
_projectName = info.projectName;
|
|
|
|
|
|
_pModel->setWizardInfo(info.context);
|
2025-10-24 21:11:07 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|