#include #include "drawingPanel.h" #include "ui_drawingPanel.h" #include #include #include "designerView.h" #include "graphicsDataModel/fixedPortsModel.h" #include "graphicsItem/graphicsBaseItem.h" #include "util/selectorManager.h" #include "statusBar.h" #include "dataBase.h" #include "powerEntity.h" #include "topologyManager.h" #include "projectDiagramNameInput.h" #include "baseProperty.h" #include "graphicsItem/electricBayItem.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(0,0, g_dGriaphicsScene_Width*4, g_dGriaphicsScene_Height*4); 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 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 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; arr.append(node); } obj["nodes"] = arr; QJsonArray arrConnect; QVector 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 mapBay = _pModel->allBayItem(); for(auto& bayItem:mapBay){ AbstractProperty* pPro = bayItem->getProperty(); BayProperty* pBay = dynamic_cast(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(); 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(); //componentInfo info =DataBase::GetInstance()->getComponentInfoByUuid(uuid); if(_pModel) { _pModel->addNodeItem(QUuid(uuid)/*,info.type*/,QPointF(dX,dY),dWidth,dHeight); } } 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) { _pModel->addConnectLline(id,QUuid(srcItemId),QUuid(destItemId),srcPortId,destPortId); } } else { //todo:提示拓扑结构已改变 } } 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); }