#include #include "drawingPanel.h" #include #include #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 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 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 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(); QList> 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:提示拓扑结构已改变 } } 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(_pModel){ QList lstFirst; for(auto& pBaseItem:_pModel->getProjectItems()) //首次循环添加母线及独立设备(变压器等),更新列表显示使用 { BaseModelProperty* pBase = dynamic_cast(pBaseItem->getProperty()); if(pBase->type() == 1){ //母线添加子间隔 monitorRelationItem info; info.item.nEquipType = pBase->type(); info.item.nCategory = 0; info.item.sName = pBase->name(); info.item.uid = pBase->uuid(); for(auto& subPair:pBase->getSubList()){ monitorRelationSturctItem subStruct; BayProperty* pTargetBay = nullptr; for(auto& pOtherItem:_pModel->getProjectBayItems()) { BayProperty* pBay = dynamic_cast(pOtherItem->getProperty()); if(pBay){ if(pBay->uuid() == subPair.second){ //从所有间隔中找到sublist中的间隔 pTargetBay = pBay; break; } } } if(pTargetBay){ subStruct.nEquipType = 0; subStruct.nCategory = 1; subStruct.sName = pTargetBay->tag(); subStruct.uid = pTargetBay->uuid(); info.subList.append(subStruct); } } lstFirst.append(info); } else if(pBase->type() == 15 || pBase->type() == 16){ monitorRelationItem info; info.item.nEquipType = pBase->type(); info.item.nCategory = 0; info.item.sName = pBase->name(); info.item.uid = pBase->uuid(); for(auto& subPair:pBase->getSubList()){ monitorRelationSturctItem subStruct; ModelProperty* pPro = nullptr; for(auto& item:_pModel->getProjectItems()){ auto p = item->getProperty(); if(p->uuid() == subPair.second){ pPro = p; } } if(pPro){ subStruct.nEquipType = pPro->type(); subStruct.nCategory = 0; subStruct.sName = pPro->name(); subStruct.uid = pPro->uuid(); info.subList.append(subStruct); } } lstFirst.append(info); } } emit _pModel->updateCurrentItems(lstFirst,true); QList lstSecond; for(auto& pBaseItem:_pModel->getProjectItems()) //二次循环添加间隔内设备(更新列表显示使用) { BaseModelProperty* pBase = dynamic_cast(pBaseItem->getProperty()); if(pBase->type() != 1 && pBase->type() != 15 && pBase->type() != 16){ //设备添加 monitorRelationItem info; info.item.nEquipType = pBase->type(); info.item.nCategory = 0; info.item.sName = pBase->name(); info.item.uid = pBase->uuid(); BayProperty* pTargetBay = nullptr; for(auto& pOtherItem:_pModel->getProjectBayItems()) { BayProperty* pBay = dynamic_cast(pOtherItem->getProperty()); if(pBay){ if(pBay->tag() == pBase->getBay()){ //将bay添加到parent info.parent.nEquipType = 0; info.parent.nCategory = 1; info.parent.sName = pBay->tag(); info.parent.uid = pBay->uuid(); break; } } } lstSecond.append(info); } } emit _pModel->updateCurrentItems(lstSecond,false); } } void DrawingPanel::saveNodes(int pageId) { if(_pModel) _pModel->saveNode(pageId); }