DiagramDesigner/diagramCavas/source/drawingPanel.cpp

268 lines
7.9 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 <QJsonArray>
#include "drawingPanel.h"
#include "ui_drawingPanel.h"
#include <QMessageBox>
#include <QCloseEvent>
#include "designerView.h"
#include "graphicsDataModel/fixedPortsModel.h"
#include "util/selectorManager.h"
#include "graphicsItem/electricConnectLineItem.h"
#include "statusBar.h"
#include "dataBase.h"
#include "powerEntity.h"
#include "topologyManager.h"
#include "projectDiagramNameInput.h"
DrawingPanel::DrawingPanel(PowerEntity* pEntity,QWidget *parent,DiagramMode mode)
: QWidget(parent)
, ui(new Ui::drawingPanel)
,_pModel(nullptr)
,_mode(mode)
,_pEntity(pEntity)
,m_pDiagramNameInputer(nullptr)
{
ui->setupUi(this);
_pModel = new FixedPortsModel(pEntity);
_pModel->setTopWidget(this);
if(mode == DM_edit || mode == DM_baseModel)
m_pSelectorManager = new SelectorManager(_pModel,this);
m_pGraphicsScene = new DesignerScene(_pModel,this);
//设置场景大小.前两个参数为scene的坐标远点设置到view的中心点后无论view如何缩放secne的坐标原点都不会动方便后续的位置计算
m_pGraphicsScene->setSceneRect(-g_dGriaphicsScene_Width / 2, -g_dGriaphicsScene_Height / 2, g_dGriaphicsScene_Width, g_dGriaphicsScene_Height);
m_pGraphicsScene->setGridVisible(true);
m_pGraphicsView = new DesignerView(this);
m_pGraphicsView->setScene(m_pGraphicsScene);
m_pGraphicsScene->setView(m_pGraphicsView);
ui->mainLayout->addWidget(m_pGraphicsView);
_pModel->setScene(m_pGraphicsScene);
m_pStatusBar = new StatusBar(this);
if(mode == DM_edit)
m_pStatusBar->setButtonVisible(false);
ui->mainLayout->addWidget(m_pStatusBar);
connect(m_pGraphicsView,&DesignerView::onScaleChanged,m_pStatusBar,&StatusBar::onScaleLevelChanged);
connect(m_pStatusBar,&StatusBar::generateDiagram,this,&DrawingPanel::onSignal_Generate);
}
DrawingPanel::~DrawingPanel()
{
delete ui;
if(_pModel)
delete _pModel;
}
QGraphicsScene* DrawingPanel::getQGraphicsScene()
{
return m_pGraphicsView->scene();
}
DesignerScene* DrawingPanel::getDesignerScene()
{
return m_pGraphicsScene;
}
void DrawingPanel::grahpicsViewZoomIn()
{
m_pGraphicsView->zoomIn();
}
void DrawingPanel::grahpicsViewZoomOut()
{
m_pGraphicsView->zoomOut();
}
void DrawingPanel::grahpicsViewZoomFit()
{
m_pGraphicsView->zoomFit();
}
GraphicsItemGroup* DrawingPanel::createItemGroup()
{
return m_pGraphicsScene->createGroup();
}
void DrawingPanel::destroyItemGroup()
{
m_pGraphicsScene->destroyGroup();
}
SelectorManager* DrawingPanel::selectorManager() const
{
if(m_pSelectorManager)
return m_pSelectorManager;
else
return NULL;
}
void DrawingPanel::closeEvent(QCloseEvent *closeEvent)
{
if(getMode() == DM_edit)
{
bool changed = false;
QMap<QUuid,GraphicsProjectModelItem*> map = _pModel->allItems();
if(_pModel)
{
for(auto pItem:map)
{
if(pItem->itemChanged())
{
changed = true;
break;
}
}
}
if(changed)
{
QMessageBox msgBox;
msgBox.setText(QString::fromWCharArray(L"提示"));
msgBox.setInformativeText(QString::fromWCharArray(L"保存修改内容?"));
msgBox.setStandardButtons(QMessageBox::Ok | QMessageBox::Cancel);
msgBox.setDefaultButton(QMessageBox::Cancel);
int ret = msgBox.exec();
switch (ret) {
case QMessageBox::Ok:
{
for(auto pItem:map)
{
if(pItem->itemChanged())
pItem->updateConnectData();
}
if(DataBase::GetInstance()->getPageIdByName(_name) == -1) //不存在,创建
DataBase::GetInstance()->insertPage(_name,_name,QJsonObject(),getDiagramInfo(),QString("page"),1);
else
DataBase::GetInstance()->updatePage(_name,_name,getDiagramInfo());
int pageId = DataBase::GetInstance()->getPageIdByName(_name);
saveNodes(pageId);
//todo:同步图形数据到数据对象,保存到服务器
}
break;
case QMessageBox::Cancel:
{
//todo:取消保存删除panel
}
break;
default:
// should never be reached
break;
}
}
emit panelDelete(_name);
}
else if(getMode() == DM_baseModel)
{
}
}
void DrawingPanel::onSignal_addGraphicsItem(modelStateInfo& info)
{
if(m_pSelectorManager)
{
m_pSelectorManager->setWorkingSelector(ST_cerating);
m_pSelectorManager->setDrawGraphicsItem(info);
}
}
void DrawingPanel::onSignal_Generate()
{
if(m_pDiagramNameInputer == nullptr){
m_pDiagramNameInputer = new ProjectDiagramNameInput(this);
m_pDiagramNameInputer->setModel(_pModel);
connect(m_pDiagramNameInputer,&ProjectDiagramNameInput::onGenerateClicked,_pModel,&FixedPortsModel::onSignal_generateDiagram);
}
m_pDiagramNameInputer->show();
}
QJsonObject DrawingPanel::getDiagramInfo() const
{
QJsonObject obj;
QJsonArray arr;
if(_pModel)
{
QMap<QUuid,QPointF> map = _pModel->allNodePos();
for(auto iter = map.begin();iter != map.end();++iter)
{
QJsonObject node;
node["id"] = iter.key().toString();
node["x"] = iter.value().x();
node["y"] = iter.value().y();
arr.append(node);
}
obj["nodes"] = arr;
QJsonArray arrConnect;
QVector<Connection> vec = _pModel->allConnections();
for(auto iter = vec.begin(); iter != vec.end();++iter)
{
QJsonObject connect;
connect["SrcNodeId"] = iter->nSrcNodeId.toString();
connect["SrcPortId"] = iter->nSrcPortId.toString();
connect["DestNodeId"] = iter->nDestNodeId.toString();
connect["DestPortId"] = iter->nDestPortId.toString();
arrConnect.append(connect);
}
obj["connections"] = arrConnect;
}
return obj;
}
void DrawingPanel::loadNodes(QJsonObject obj)
{
QJsonArray nodesJsonArray = obj["nodes"].toArray();
for (QJsonValueRef nodeJson : nodesJsonArray)
{
QJsonObject node = nodeJson.toObject();
QString uuid = node["id"].toString();
double dX = node["x"].toDouble();
double dY = node["y"].toDouble();
//componentInfo info =DataBase::GetInstance()->getComponentInfoByUuid(uuid);
if(_pModel)
{
_pModel->addNodeItem(QUuid(uuid)/*,info.type*/,QPointF(dX,dY));
}
}
QJsonArray connectArr = obj["connections"].toArray();
for(QJsonValueRef connectJson:connectArr)
{
QJsonObject connect = connectJson.toObject();
QUuid srcId = QUuid(connect["SrcNodeId"].toString());
QUuid srcPortId = QUuid(connect["SrcPortId"].toString());
QUuid destId = QUuid(connect["DestNodeId"].toString());
QUuid destPortId = QUuid(connect["DestPortId"].toString());
PowerConnection* pCon = TopologyManager::instance().connection(srcPortId.toString(),destPortId.toString());
if(pCon)
{
QString srcItemId = pCon->fromComponent();
QString destItemId = pCon->toComponent();
//todo:从拓扑结构中查找port的id
if(_pModel)
{
_pModel->addConnectLline(QUuid(srcItemId),QUuid(destItemId),srcPortId,destPortId);
}
}
else
{
//todo:提示拓扑结构已改变
}
}
if(_mode == DM_run)
{
if(_pModel)
_pModel->startHttpRequest();
}
}
void DrawingPanel::saveNodes(int pageId)
{
if(_pModel)
_pModel->saveNode(pageId);
}