DiagramDesigner/diagramCavas/source/drawingPanel.cpp

238 lines
7.5 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 <QMessageBox>
#include <QCloseEvent>
#include "graphicsDataModel/fixedPortsModel.h"
#include "graphicsItem/graphicsBaseItem.h"
#include "util/selectorManager.h"
#include "dataBase.h"
#include "powerEntity.h"
#include "topologyManager.h"
#include "projectDiagramNameInput.h"
#include "baseProperty.h"
#include "graphicsItem/electricBayItem.h"
#include "statusBar.h"
DrawingPanel::DrawingPanel(PowerEntity* pEntity,QWidget *parent,DiagramMode mode)
: BaseDrawingPanel(pEntity,parent,mode)
,m_pDiagramNameInputer(nullptr)
{
if(mode == DM_edit)
m_pStatusBar->setButtonVisible(false);
connect(m_pStatusBar,&StatusBar::generateDiagram,this,&DrawingPanel::onSignal_Generate);
}
DrawingPanel::~DrawingPanel()
{
}
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,1);
}
}
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,itemPageInfo> map = _pModel->allNodePos();
for(auto iter = map.begin();iter != map.end();++iter)
{
QJsonObject node;
node["id"] = iter.key().toString();
node["x"] = iter.value().pos.x();
node["y"] = iter.value().pos.y();
node["width"] = iter.value().dWidth;
node["height"] = iter.value().dHeight;
node["rotate"] = iter.value().dRotate;
arr.append(node);
}
obj["nodes"] = arr;
QJsonArray arrConnect;
QVector<ModelProperty*> vec = _pModel->allConnectionProperty();
for(auto& pPro:vec){
Connection con = pPro->getConnection();
QJsonObject connect;
connect["id"] = pPro->uuid().toString();
connect["SrcNodeId"] = con.nSrcNodeId.toString();
connect["SrcPortId"] = con.nSrcPortId.toString();
connect["DestNodeId"] = con.nDestNodeId.toString();
connect["DestPortId"] = con.nDestPortId.toString();
arrConnect.append(connect);
}
obj["connections"] = arrConnect;
QJsonArray arrBay;
QMap<QUuid,ElectricBayItem*> mapBay = _pModel->allBayItem();
for(auto& bayItem:mapBay){
AbstractProperty* pPro = bayItem->getProperty();
BayProperty* pBay = dynamic_cast<BayProperty*>(pPro);
if(pBay)
{
QJsonObject bay;
bay["id"] = pBay->uuid().toString();
arrBay.append(bay);
}
}
obj["bays"] = arrBay;
}
return obj;
}
void DrawingPanel::loadNodes(QJsonObject obj)
{
QJsonArray nodesJsonArray = obj["nodes"].toArray();
QList<QPair<QString,QUuid>> lst;
for (QJsonValueRef nodeJson : nodesJsonArray)
{
QJsonObject node = nodeJson.toObject();
QString uuid = node["id"].toString();
double dX = node["x"].toDouble();
double dY = node["y"].toDouble();
double dWidth = node["width"].toDouble();
double dHeight = node["height"].toDouble();
double dRotate = node["rotate"].toDouble();
//componentInfo info =DataBase::GetInstance()->getComponentInfoByUuid(uuid);
if(_pModel)
{
QString sName = _pModel->addNodeItem(QUuid(uuid)/*,info.type*/,QPointF(dX,dY),dWidth,dHeight,dRotate);
if(sName != "err"){
lst.append(qMakePair(sName,QUuid(uuid)));
}
}
}
QJsonArray connectArr = obj["connections"].toArray();
for(QJsonValueRef connectJson:connectArr)
{
QJsonObject connect = connectJson.toObject();
QUuid id = QUuid(connect["id"].toString()); //电缆线id关联component中的电缆
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)
{
QString sName = _pModel->addConnectLline(id,QUuid(srcItemId),QUuid(destItemId),srcPortId,destPortId);
if(sName != "err"){
lst.append(qMakePair(sName,QUuid(id)));
}
}
}
else
{
//todo:提示拓扑结构已改变
}
}
//if(_pModel)
//emit _pModel->updateCurrentItems(lst);
QJsonArray bayArr = obj["bays"].toArray();
for(QJsonValueRef bayJson:bayArr)
{
QJsonObject bay = bayJson.toObject();
QUuid id = QUuid(bay["id"].toString());
if(_pModel)
{
_pModel->addBayItem(id);
}
}
if(_mode == DM_run)
{
if(_pModel)
_pModel->startHttpRequest();
}
}
void DrawingPanel::saveNodes(int pageId)
{
if(_pModel)
_pModel->saveNode(pageId);
}