#include #include "selectPanel.h" #include #include #include "graphicsDataModel/fixedPortsModel.h" #include "graphicsItem/graphicsBaseItem.h" #include "util/selectorManager.h" #include "powerEntity.h" #include "topologyManager.h" #include "baseProperty.h" #include "graphicsItem/electricBayItem.h" #include "statusBar.h" #include "graphicsItem/functionModelItem/graphicsFunctionModelItem.h" SelectPanel::SelectPanel(PowerEntity* pEntity,QWidget *parent,DiagramMode mode) : BaseDrawingPanel(pEntity,parent,mode) { m_pStatusBar->setButtonVisible(false); _pModel->setPanelMode(1); //设置为预览模式 } SelectPanel::~SelectPanel() { } QJsonObject SelectPanel::getDiagramInfo() { 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 SelectPanel::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(); if(_pModel) { auto pItem = _pModel->addNodeItem(QUuid(uuid),QPointF(dX,dY),dWidth,dHeight,dRotate); if(pItem){ lst.append(qMakePair(pItem->getName(),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) { pCon->setId(id.toString()); 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){ QString sG; QString sZ; QString sS; for(auto& pBaseItem:_pModel->allItems()) //取grid_zone_station(间隔不含这些内容) { BaseProperty* pBase = dynamic_cast(pBaseItem->getProperty()); if(sG.isEmpty()) sG = pBase->grid(); if(sZ.isEmpty()) sZ = pBase->zone(); if(sS.isEmpty()) sS = pBase->station(); break; } QList lstFirst; for(auto& pOtherItem:_pModel->getProjectBayItems()) { BayProperty* pBay = dynamic_cast(pOtherItem->getProperty()); if(pBay){ // 创建间隔项 HierarchyItem bayInfo; bayInfo.item.nEquipType = 0; // 间隔的设备类型为0 bayInfo.item.nCategory = 1; // 类别为1表示间隔 bayInfo.item.sName = pBay->tag(); bayInfo.item.uid = pBay->uuid(); bayInfo.item.sVoltageLevel = QString::number(pBay->getVoltage()); bayInfo.item.grid = sG; bayInfo.item.zone = sZ; bayInfo.item.station = sS; lstFirst.append(bayInfo); } } emit _pModel->updateCurrentItems(lstFirst, true); emit _pModel->updateTopologyItems(lstFirst, true,true); // 第二阶段:处理所有设备 QList lstSecond; // 建立间隔UUID到间隔标签的映射,提高查找效率 QHash bayUuidToTag; for(auto& pOtherItem:_pModel->getProjectBayItems()) { BayProperty* pBay = dynamic_cast(pOtherItem->getProperty()); if(pBay){ bayUuidToTag[pBay->uuid().toString()] = pBay->tag(); } } for(auto& pBaseItem:_pModel->allItems()) { BaseProperty* pBase = dynamic_cast(pBaseItem->getProperty()); HierarchyItem info; info.item.nEquipType = pBase->type(); info.item.nCategory = 0; // 类别为0表示设备 info.item.sName = pBase->name(); info.item.uid = pBase->uuid(); // 查找设备所属的间隔 QString bayTag; QString bayUuid; QString sVoltage; // 通过间隔标签直接查找 bayTag = pBase->getBay(); // 如果需要间隔UUID,可以反向查找 if(!bayTag.isEmpty()){ for(auto& pOtherItem:_pModel->getProjectBayItems()){ BayProperty* pBay = dynamic_cast(pOtherItem->getProperty()); if(pBay && pBay->tag() == bayTag){ bayUuid = pBay->uuid().toString(); sVoltage = QString::number(pBay->getVoltage()); break; } } } if(!bayTag.isEmpty()){ // 设置父间隔信息 info.parent.nEquipType = 0; info.parent.nCategory = 1; info.parent.sName = bayTag; info.parent.uid = QUuid(bayUuid); info.parent.sVoltageLevel = sVoltage; info.parent.grid = sG; info.parent.zone = sZ; info.parent.station = sS; } lstSecond.append(info); } emit _pModel->updateCurrentItems(lstSecond, false); emit _pModel->updateTopologyItems(lstSecond, false,true); } } void SelectPanel::clearItems() { if(_pModel){ _pModel->getScene()->clear(); _pModel->allItems().clear(); _pModel->getProjectBayItems().clear(); } }