255 lines
8.4 KiB
C++
255 lines
8.4 KiB
C++
|
|
#include <QJsonArray>
|
|||
|
|
#include "selectPanel.h"
|
|||
|
|
#include <QMessageBox>
|
|||
|
|
#include <QCloseEvent>
|
|||
|
|
#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<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 SelectPanel::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();
|
|||
|
|
|
|||
|
|
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<BaseProperty*>(pBaseItem->getProperty());
|
|||
|
|
if(sG.isEmpty())
|
|||
|
|
sG = pBase->grid();
|
|||
|
|
if(sZ.isEmpty())
|
|||
|
|
sZ = pBase->zone();
|
|||
|
|
if(sS.isEmpty())
|
|||
|
|
sS = pBase->station();
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
QList<HierarchyItem> lstFirst;
|
|||
|
|
|
|||
|
|
for(auto& pOtherItem:_pModel->getProjectBayItems())
|
|||
|
|
{
|
|||
|
|
BayProperty* pBay = dynamic_cast<BayProperty*>(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<HierarchyItem> lstSecond;
|
|||
|
|
|
|||
|
|
// 建立间隔UUID到间隔标签的映射,提高查找效率
|
|||
|
|
QHash<QString, QString> bayUuidToTag;
|
|||
|
|
for(auto& pOtherItem:_pModel->getProjectBayItems())
|
|||
|
|
{
|
|||
|
|
BayProperty* pBay = dynamic_cast<BayProperty*>(pOtherItem->getProperty());
|
|||
|
|
if(pBay){
|
|||
|
|
bayUuidToTag[pBay->uuid().toString()] = pBay->tag();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
for(auto& pBaseItem:_pModel->allItems())
|
|||
|
|
{
|
|||
|
|
BaseProperty* pBase = dynamic_cast<BaseProperty*>(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<BayProperty*>(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();
|
|||
|
|
}
|
|||
|
|
}
|