2025-02-06 16:36:50 +08:00
|
|
|
|
#include <QJsonArray>
|
|
|
|
|
|
#include "drawingPanel.h"
|
|
|
|
|
|
#include <QMessageBox>
|
2025-04-30 16:29:17 +08:00
|
|
|
|
#include <QCloseEvent>
|
2025-02-06 16:36:50 +08:00
|
|
|
|
#include "graphicsDataModel/fixedPortsModel.h"
|
2025-07-11 18:13:54 +08:00
|
|
|
|
#include "graphicsItem/graphicsBaseItem.h"
|
2025-02-06 16:36:50 +08:00
|
|
|
|
#include "util/selectorManager.h"
|
|
|
|
|
|
#include "dataBase.h"
|
2025-04-30 16:29:17 +08:00
|
|
|
|
#include "powerEntity.h"
|
2025-05-16 19:20:46 +08:00
|
|
|
|
#include "topologyManager.h"
|
2025-06-27 19:17:04 +08:00
|
|
|
|
#include "projectDiagramNameInput.h"
|
2025-07-11 18:13:54 +08:00
|
|
|
|
#include "baseProperty.h"
|
2025-07-18 18:26:13 +08:00
|
|
|
|
#include "graphicsItem/electricBayItem.h"
|
2025-11-14 19:31:09 +08:00
|
|
|
|
#include "statusBar.h"
|
2025-02-06 16:36:50 +08:00
|
|
|
|
|
2025-04-30 16:29:17 +08:00
|
|
|
|
DrawingPanel::DrawingPanel(PowerEntity* pEntity,QWidget *parent,DiagramMode mode)
|
2025-11-14 19:31:09 +08:00
|
|
|
|
: BaseDrawingPanel(pEntity,parent,mode)
|
2025-06-27 19:17:04 +08:00
|
|
|
|
,m_pDiagramNameInputer(nullptr)
|
2025-02-06 16:36:50 +08:00
|
|
|
|
{
|
2025-06-27 19:17:04 +08:00
|
|
|
|
if(mode == DM_edit)
|
|
|
|
|
|
m_pStatusBar->setButtonVisible(false);
|
|
|
|
|
|
connect(m_pStatusBar,&StatusBar::generateDiagram,this,&DrawingPanel::onSignal_Generate);
|
2025-02-06 16:36:50 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
DrawingPanel::~DrawingPanel()
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void DrawingPanel::closeEvent(QCloseEvent *closeEvent)
|
|
|
|
|
|
{
|
2025-06-13 19:00:05 +08:00
|
|
|
|
if(getMode() == DM_edit)
|
2025-02-06 16:36:50 +08:00
|
|
|
|
{
|
2025-06-13 19:00:05 +08:00
|
|
|
|
bool changed = false;
|
|
|
|
|
|
QMap<QUuid,GraphicsProjectModelItem*> map = _pModel->allItems();
|
|
|
|
|
|
if(_pModel)
|
2025-02-06 16:36:50 +08:00
|
|
|
|
{
|
2025-06-13 19:00:05 +08:00
|
|
|
|
for(auto pItem:map)
|
2025-02-06 16:36:50 +08:00
|
|
|
|
{
|
2025-06-13 19:00:05 +08:00
|
|
|
|
if(pItem->itemChanged())
|
|
|
|
|
|
{
|
|
|
|
|
|
changed = true;
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
2025-02-06 16:36:50 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-06-13 19:00:05 +08:00
|
|
|
|
if(changed)
|
2025-02-06 16:36:50 +08:00
|
|
|
|
{
|
2025-06-13 19:00:05 +08:00
|
|
|
|
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:
|
2025-02-06 16:36:50 +08:00
|
|
|
|
{
|
2025-06-13 19:00:05 +08:00
|
|
|
|
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
|
2025-02-06 16:36:50 +08:00
|
|
|
|
}
|
|
|
|
|
|
break;
|
2025-06-13 19:00:05 +08:00
|
|
|
|
default:
|
|
|
|
|
|
// should never be reached
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
2025-02-06 16:36:50 +08:00
|
|
|
|
}
|
2025-10-30 17:20:10 +08:00
|
|
|
|
emit panelDelete(_name,1);
|
2025-02-06 16:36:50 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-03-28 18:08:21 +08:00
|
|
|
|
void DrawingPanel::onSignal_addGraphicsItem(modelStateInfo& info)
|
2025-02-06 16:36:50 +08:00
|
|
|
|
{
|
|
|
|
|
|
if(m_pSelectorManager)
|
|
|
|
|
|
{
|
|
|
|
|
|
m_pSelectorManager->setWorkingSelector(ST_cerating);
|
2025-03-28 18:08:21 +08:00
|
|
|
|
m_pSelectorManager->setDrawGraphicsItem(info);
|
2025-02-06 16:36:50 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-06-27 19:17:04 +08:00
|
|
|
|
void DrawingPanel::onSignal_Generate()
|
|
|
|
|
|
{
|
|
|
|
|
|
if(m_pDiagramNameInputer == nullptr){
|
|
|
|
|
|
m_pDiagramNameInputer = new ProjectDiagramNameInput(this);
|
|
|
|
|
|
m_pDiagramNameInputer->setModel(_pModel);
|
2025-07-04 18:47:49 +08:00
|
|
|
|
connect(m_pDiagramNameInputer,&ProjectDiagramNameInput::onGenerateClicked,_pModel,&FixedPortsModel::onSignal_generateDiagram);
|
2025-06-27 19:17:04 +08:00
|
|
|
|
}
|
|
|
|
|
|
m_pDiagramNameInputer->show();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-02-06 16:36:50 +08:00
|
|
|
|
QJsonObject DrawingPanel::getDiagramInfo() const
|
|
|
|
|
|
{
|
|
|
|
|
|
QJsonObject obj;
|
|
|
|
|
|
QJsonArray arr;
|
|
|
|
|
|
if(_pModel)
|
|
|
|
|
|
{
|
2025-10-11 18:51:33 +08:00
|
|
|
|
QMap<QUuid,itemPageInfo> map = _pModel->allNodePos();
|
2025-02-06 16:36:50 +08:00
|
|
|
|
for(auto iter = map.begin();iter != map.end();++iter)
|
|
|
|
|
|
{
|
|
|
|
|
|
QJsonObject node;
|
|
|
|
|
|
node["id"] = iter.key().toString();
|
2025-10-11 18:51:33 +08:00
|
|
|
|
node["x"] = iter.value().pos.x();
|
|
|
|
|
|
node["y"] = iter.value().pos.y();
|
|
|
|
|
|
node["width"] = iter.value().dWidth;
|
|
|
|
|
|
node["height"] = iter.value().dHeight;
|
2025-10-21 18:46:51 +08:00
|
|
|
|
node["rotate"] = iter.value().dRotate;
|
2025-02-06 16:36:50 +08:00
|
|
|
|
arr.append(node);
|
|
|
|
|
|
}
|
|
|
|
|
|
obj["nodes"] = arr;
|
|
|
|
|
|
|
|
|
|
|
|
QJsonArray arrConnect;
|
2025-07-11 18:13:54 +08:00
|
|
|
|
QVector<ModelProperty*> vec = _pModel->allConnectionProperty();
|
|
|
|
|
|
for(auto& pPro:vec){
|
|
|
|
|
|
Connection con = pPro->getConnection();
|
2025-02-06 16:36:50 +08:00
|
|
|
|
QJsonObject connect;
|
2025-07-11 18:13:54 +08:00
|
|
|
|
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();
|
2025-02-06 16:36:50 +08:00
|
|
|
|
arrConnect.append(connect);
|
|
|
|
|
|
}
|
|
|
|
|
|
obj["connections"] = arrConnect;
|
2025-07-18 18:26:13 +08:00
|
|
|
|
|
|
|
|
|
|
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;
|
2025-02-06 16:36:50 +08:00
|
|
|
|
}
|
|
|
|
|
|
return obj;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void DrawingPanel::loadNodes(QJsonObject obj)
|
|
|
|
|
|
{
|
|
|
|
|
|
QJsonArray nodesJsonArray = obj["nodes"].toArray();
|
|
|
|
|
|
|
2025-11-14 19:31:09 +08:00
|
|
|
|
QList<QPair<QString,QUuid>> lst;
|
2025-02-06 16:36:50 +08:00
|
|
|
|
for (QJsonValueRef nodeJson : nodesJsonArray)
|
|
|
|
|
|
{
|
|
|
|
|
|
QJsonObject node = nodeJson.toObject();
|
|
|
|
|
|
QString uuid = node["id"].toString();
|
|
|
|
|
|
double dX = node["x"].toDouble();
|
|
|
|
|
|
double dY = node["y"].toDouble();
|
2025-10-11 18:51:33 +08:00
|
|
|
|
double dWidth = node["width"].toDouble();
|
|
|
|
|
|
double dHeight = node["height"].toDouble();
|
2025-10-21 18:46:51 +08:00
|
|
|
|
double dRotate = node["rotate"].toDouble();
|
2025-02-06 16:36:50 +08:00
|
|
|
|
|
|
|
|
|
|
//componentInfo info =DataBase::GetInstance()->getComponentInfoByUuid(uuid);
|
|
|
|
|
|
if(_pModel)
|
|
|
|
|
|
{
|
2025-11-14 19:31:09 +08:00
|
|
|
|
QString sName = _pModel->addNodeItem(QUuid(uuid)/*,info.type*/,QPointF(dX,dY),dWidth,dHeight,dRotate);
|
|
|
|
|
|
if(sName != "err"){
|
|
|
|
|
|
lst.append(qMakePair(sName,QUuid(uuid)));
|
|
|
|
|
|
}
|
2025-02-06 16:36:50 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
QJsonArray connectArr = obj["connections"].toArray();
|
|
|
|
|
|
for(QJsonValueRef connectJson:connectArr)
|
|
|
|
|
|
{
|
|
|
|
|
|
QJsonObject connect = connectJson.toObject();
|
2025-07-11 18:13:54 +08:00
|
|
|
|
QUuid id = QUuid(connect["id"].toString()); //电缆线id,关联component中的电缆
|
2025-02-06 16:36:50 +08:00
|
|
|
|
QUuid srcId = QUuid(connect["SrcNodeId"].toString());
|
2025-05-16 19:20:46 +08:00
|
|
|
|
QUuid srcPortId = QUuid(connect["SrcPortId"].toString());
|
2025-02-06 16:36:50 +08:00
|
|
|
|
QUuid destId = QUuid(connect["DestNodeId"].toString());
|
2025-05-16 19:20:46 +08:00
|
|
|
|
QUuid destPortId = QUuid(connect["DestPortId"].toString());
|
2025-02-06 16:36:50 +08:00
|
|
|
|
|
2025-05-16 19:20:46 +08:00
|
|
|
|
PowerConnection* pCon = TopologyManager::instance().connection(srcPortId.toString(),destPortId.toString());
|
|
|
|
|
|
if(pCon)
|
|
|
|
|
|
{
|
|
|
|
|
|
QString srcItemId = pCon->fromComponent();
|
|
|
|
|
|
QString destItemId = pCon->toComponent();
|
|
|
|
|
|
//todo:从拓扑结构中查找port的id
|
|
|
|
|
|
if(_pModel)
|
|
|
|
|
|
{
|
2025-11-14 19:31:09 +08:00
|
|
|
|
QString sName = _pModel->addConnectLline(id,QUuid(srcItemId),QUuid(destItemId),srcPortId,destPortId);
|
|
|
|
|
|
if(sName != "err"){
|
|
|
|
|
|
lst.append(qMakePair(sName,QUuid(id)));
|
|
|
|
|
|
}
|
2025-05-16 19:20:46 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
2025-02-06 16:36:50 +08:00
|
|
|
|
{
|
2025-05-16 19:20:46 +08:00
|
|
|
|
//todo:提示拓扑结构已改变
|
2025-02-06 16:36:50 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-07-18 18:26:13 +08:00
|
|
|
|
QJsonArray bayArr = obj["bays"].toArray();
|
|
|
|
|
|
for(QJsonValueRef bayJson:bayArr)
|
|
|
|
|
|
{
|
|
|
|
|
|
QJsonObject bay = bayJson.toObject();
|
|
|
|
|
|
QUuid id = QUuid(bay["id"].toString());
|
|
|
|
|
|
if(_pModel)
|
|
|
|
|
|
{
|
|
|
|
|
|
_pModel->addBayItem(id);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-11-21 19:22:41 +08:00
|
|
|
|
if(_pModel){
|
|
|
|
|
|
QList<monitorRelationItem> lstFirst;
|
|
|
|
|
|
for(auto& pBaseItem:_pModel->getProjectItems()) //首次循环添加母线及独立设备(变压器等),更新列表显示使用
|
|
|
|
|
|
{
|
|
|
|
|
|
BaseModelProperty* pBase = dynamic_cast<BaseModelProperty*>(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<BayProperty*>(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<monitorRelationItem> lstSecond;
|
|
|
|
|
|
for(auto& pBaseItem:_pModel->getProjectItems()) //二次循环添加间隔内设备(更新列表显示使用)
|
|
|
|
|
|
{
|
|
|
|
|
|
BaseModelProperty* pBase = dynamic_cast<BaseModelProperty*>(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<BayProperty*>(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);
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-02-06 16:36:50 +08:00
|
|
|
|
if(_mode == DM_run)
|
|
|
|
|
|
{
|
2025-11-21 19:22:41 +08:00
|
|
|
|
//if(_pModel)
|
|
|
|
|
|
//_pModel->startHttpRequest();
|
2025-02-06 16:36:50 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void DrawingPanel::saveNodes(int pageId)
|
|
|
|
|
|
{
|
|
|
|
|
|
if(_pModel)
|
|
|
|
|
|
_pModel->saveNode(pageId);
|
|
|
|
|
|
}
|