DiagramDesigner/diagramCavas/source/selectPanel.cpp

255 lines
8.4 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 "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();
}
}