DiagramDesigner/diagramCavas/source/graphicsDataModel/fixedPortsModel.cpp

2807 lines
109 KiB
C++
Raw Normal View History

2025-02-06 16:36:50 +08:00
#include "graphicsDataModel/fixedPortsModel.h"
#include "graphicsItem/graphicsBaseItem.h"
#include "graphicsItem/electricSvgItemBus.h"
#include "graphicsItem/electricSvgItemRect.h"
#include "graphicsItem/electricConnectLineItem.h"
2025-10-11 18:51:33 +08:00
#include "graphicsItem/electricPortItem.h"
#include "graphicsItem/electricSvgGroupCT.h"
2025-10-17 18:14:44 +08:00
#include "graphicsItem/electricSvgGroupPT.h"
2025-10-11 18:51:33 +08:00
#include "graphicsItem/electricSvgItemDS.h"
#include "graphicsItem/electricSvgItemES.h"
#include "graphicsItem/electricSvgItemFES.h"
#include "graphicsItem/electricSvgItemDTEDS.h"
#include "graphicsItem/electricSvgItemPI.h"
#include "graphicsItem/electricSvgItemLA.h"
#include "graphicsItem/electricSvgItemCableTer.h"
#include "graphicsItem/electricSvgItemCableEnd.h"
#include "graphicsItem/electricSvgItem2wTransformer.h"
#include "graphicsItem/electricSvgItem3wTransformer.h"
#include "baseModelItem/electricBaseModelLineItem.h"
2025-06-20 18:09:41 +08:00
#include "baseModelItem/electricBaseModelSvgItem.h"
#include "baseModelItem/electricBaseModelSvgBus.h"
#include "baseModelItem/electricBaseModelLineItem.h"
2025-07-11 18:13:54 +08:00
#include "graphicsItem/electricBayItem.h"
2025-10-21 18:46:51 +08:00
#include "diagramEditor/diagramEditorBaseBlock.h"
#include "graphicsItem/electricBayItem.h"
#include "diagramEditor/editItems.h"
2025-02-06 16:36:50 +08:00
#include "graphicsItem/itemPort.h"
#include "designerScene.h"
#include "dataBase.h"
#include "httpInterface.h"
#include "drawingPanel.h"
#include "itemPropertyDlg.h"
#include "dataManager.h"
2025-04-30 16:29:17 +08:00
#include "powerEntity.h"
#include "topologyManager.h"
2025-05-23 10:30:52 +08:00
#include "basePropertyManager.h"
2025-06-20 18:09:41 +08:00
#include "diagramCavas.h"
2025-02-06 16:36:50 +08:00
#include <QJsonArray>
#include <QMessageBox>
2025-07-11 18:13:54 +08:00
#include <QRandomGenerator>
#include <QJsonDocument>
2025-11-14 19:31:09 +08:00
#include <QMdiSubWindow>
2025-05-23 10:30:52 +08:00
#include "baseProperty.h"
2025-06-20 18:09:41 +08:00
#include "projectModelSetting.h"
2025-07-11 18:13:54 +08:00
#include "bayManagerDlg.h"
#include "projectModelManager.h"
2025-10-17 18:14:44 +08:00
#include "projectIconSetting.h"
2025-11-14 19:31:09 +08:00
#include "monitorPanel.h"
#include "designerView.h"
2025-07-11 18:13:54 +08:00
#include "global.h"
2025-02-06 16:36:50 +08:00
bool FixedPortsModel::_dataInitialised = false;
2025-04-30 16:29:17 +08:00
FixedPortsModel::FixedPortsModel(PowerEntity* pEntity)
2025-02-06 16:36:50 +08:00
:_scene(nullptr)
,_widget(nullptr)
,_Interface(nullptr)
2025-04-30 16:29:17 +08:00
,_pEntity(pEntity)
2025-06-20 18:09:41 +08:00
,m_proModelSettingDlg(nullptr)
2025-10-17 18:14:44 +08:00
,m_projectIconSettingDlg(nullptr)
2025-07-11 18:13:54 +08:00
,m_pBayManager(nullptr)
2025-02-06 16:36:50 +08:00
{
2025-06-20 18:09:41 +08:00
_cavas = nullptr;
2025-02-06 16:36:50 +08:00
loadNodeDataFromDataBase();
_Interface = new HttpInterface(this);
_timer = new QTimer(this);
_modelStateInfo = DataManager::instance().modelState();
2025-04-09 16:20:34 +08:00
_modelDataInfo = DataManager::instance().modelData();
initialPropertyDlg();
2025-02-06 16:36:50 +08:00
connect(_timer,SIGNAL(timeout()),this,SLOT(onTimeOut()));
connect(_Interface,&HttpInterface::sendPointData,this,&FixedPortsModel::onSignal_GetPointData);
}
FixedPortsModel::~FixedPortsModel()
{
}
2025-10-11 18:51:33 +08:00
QMap<QUuid,itemPageInfo> FixedPortsModel::allNodePos() const
2025-02-06 16:36:50 +08:00
{
2025-10-11 18:51:33 +08:00
QMap<QUuid,itemPageInfo> map;
2025-02-06 16:36:50 +08:00
for(auto pItem:_nodeItem)
{
2025-10-11 18:51:33 +08:00
if(pItem->getItemType() != GIT_link){
itemPageInfo info;
double dWidth = pItem->boundingRect().width();
double dHeight = pItem->boundingRect().height();
info.pos = pItem->scenePos()/*+QPointF(dWidth*0.5,dHeight*0.5)*/;
info.dWidth = dWidth;
info.dHeight = dHeight;
2025-10-21 18:46:51 +08:00
info.dRotate = pItem->rotation();
2025-10-11 18:51:33 +08:00
map.insert(pItem->itemId(),info);
}
2025-02-06 16:36:50 +08:00
}
return map;
}
2025-07-11 18:13:54 +08:00
QVector<ModelProperty*> FixedPortsModel::allConnectionProperty()
2025-02-06 16:36:50 +08:00
{
2025-07-11 18:13:54 +08:00
QVector<ModelProperty*> vec;
2025-02-06 16:36:50 +08:00
for(auto pItem:_nodeItem)
{
if(pItem->getItemType() == GIT_link)
{
auto pLine = dynamic_cast<ElectricConnectLineItem*>(pItem);
if(pLine)
{
2025-07-11 18:13:54 +08:00
ModelProperty* pPro = pLine->getProperty();
if(pPro){
vec.push_back(pPro);
}
2025-02-06 16:36:50 +08:00
}
}
}
return vec;
}
QMap<QUuid,GraphicsProjectModelItem*>& FixedPortsModel::allItems()
2025-02-06 16:36:50 +08:00
{
return _nodeItem;
}
2025-07-04 18:47:49 +08:00
GraphicsProjectModelItem* FixedPortsModel::nodeItem(QUuid uuid)
{
return _nodeItem.value(uuid,nullptr);
}
bool FixedPortsModel::addNodeItem(QUuid uuid,GraphicsProjectModelItem* pItem)
2025-02-06 16:36:50 +08:00
{
if(_nodeItem.contains(uuid))
return false;
else
{
_nodeItem.insert(uuid,pItem);
connect(pItem,&GraphicsProjectModelItem::ifExist,this,&FixedPortsModel::onSignal_ifExits);
2025-02-06 16:36:50 +08:00
return true;
}
}
2025-11-14 19:31:09 +08:00
QString FixedPortsModel::addNodeItem(QUuid id/*,int type*/,QPointF pos,double width,double height,double rotate)
2025-02-06 16:36:50 +08:00
{
2025-05-16 19:20:46 +08:00
//todo:load图形时必有拓扑实体关联到对应的entity
2025-02-06 16:36:50 +08:00
BaseProperty* pro = nullptr;
GraphicsProjectModelItem* item = nullptr;
2025-05-23 10:30:52 +08:00
QMap<QUuid,BaseProperty*> mapData = BasePropertyManager::instance().getEntityData(); //加载的图形必定关联component(todo:完善判断条件,如判断拓扑节点)
2025-05-09 19:36:32 +08:00
if(mapData.contains(id))
2025-02-06 16:36:50 +08:00
{
2025-07-18 18:26:13 +08:00
pro = mapData.value(id);
2025-02-06 16:36:50 +08:00
if(pro)
{
2025-06-27 19:17:04 +08:00
int type = pro->graphicsType();
2025-07-11 18:13:54 +08:00
if(type == GIT_link) //连线对象外部处理
2025-11-14 19:31:09 +08:00
return QString("err");
2025-07-11 18:13:54 +08:00
QString sMeta = pro->metaModelName();
QString sProModel = pro->modelName();
2025-10-11 18:51:33 +08:00
modelDataInfo mapValue = DataManager::instance().modelData()[sProModel];
PropertyValueInfo valueInfo; //属性组设置的数据 (ct,pt二次绕组)
if(mapValue.groupInfo.contains("base_extend"))
{
valueInfo = mapValue.groupInfo["base_extend"].mapInfo[id];
}
2025-10-11 18:51:33 +08:00
double dX = 0.0;
double dY = 0.0;
if(type == GIT_itemRect)
2025-02-06 16:36:50 +08:00
{
2025-07-11 18:13:54 +08:00
PropertyModel model = ProjectModelManager::instance().getData()[sMeta][sProModel];
QByteArray svg;
if(model.modelSetting.mapSvg.isEmpty()){
svg = DataBase::GetInstance()->ModelType()[3].icon;
}
else{
2025-10-17 18:14:44 +08:00
svg = ProjectModelManager::instance().getData()[sMeta][sProModel].modelSetting.mapUsedSvg["cb"];
2025-07-11 18:13:54 +08:00
}
2025-10-11 18:51:33 +08:00
if(width == 0 && height == 0){
dX = 30;
dY = 30;
}
else{
dX = width;
dY = height;
}
2025-10-17 18:14:44 +08:00
auto pCb = new ElectricSvgItemRect(QRect(-dX*0.5, -dY*0.5, dX, dY),false);
2025-07-11 18:13:54 +08:00
pCb->setItemType(GIT_itemRect);
pCb->loadSvg(svg);
item = pCb;
2025-05-16 19:20:46 +08:00
QJsonArray portArr = pro->context()["port"].toArray();
2025-10-11 18:51:33 +08:00
addPortsToItem_json(P_const,portArr,item);
}
else if(type == GIT_node)
{
auto pNode = new ElectricPortItem();
pNode->setItemType(GIT_node);
item = pNode;
QJsonArray portArr = pro->context()["port"].toArray();
addPortsToItem_json(p_movable,portArr,item);
2025-02-06 16:36:50 +08:00
}
else if(type == GIT_bus)
{
2025-07-11 18:13:54 +08:00
PropertyModel model = ProjectModelManager::instance().getData()[sMeta][sProModel];
QByteArray svg;
if(model.modelSetting.mapSvg.isEmpty()){
svg = DataBase::GetInstance()->ModelType()[1].icon;
}
else{
2025-10-17 18:14:44 +08:00
svg = ProjectModelManager::instance().getData()[sMeta][sProModel].modelSetting.mapUsedSvg["bus"];
2025-07-11 18:13:54 +08:00
}
2025-10-11 18:51:33 +08:00
if(width == 0 && height == 0){
dX = 200;
dY = 6;
}
else{
dX = width;
dY = height;
}
auto pBus = new ElectricSvgItemBus(QRect(0, 0, dX, dY));
2025-07-11 18:13:54 +08:00
pBus->setItemType(GIT_bus);
pBus->loadSvg(svg);
item = pBus;
2025-02-06 16:36:50 +08:00
QJsonArray portArr = pro->context()["port"].toArray();
2025-10-11 18:51:33 +08:00
/*for(QJsonValueRef portJson:portArr)
2025-02-06 16:36:50 +08:00
{
QJsonObject portObj = portJson.toObject();
2025-05-16 19:20:46 +08:00
QString portId = portObj["portId"].toString();
2025-02-06 16:36:50 +08:00
int x = portObj["x"].toInt();
int y = portObj["y"].toInt();
2025-05-16 19:20:46 +08:00
item->addPort(p_movable,QPointF(x,y),portId);
2025-10-11 18:51:33 +08:00
}*/
addPortsToItem_json(p_movable,portArr,item);
}
else if(type == GIT_ctGroup)
{
PropertyModel model = ProjectModelManager::instance().getData()[sMeta][sProModel];
QByteArray svg;
if(model.modelSetting.mapSvg.isEmpty()){
svg = DataBase::GetInstance()->ModelType()[5].icon;
}
else{
svg = model.modelSetting.mapSvg.first();
}
if(width == 0 && height == 0){
dX = 20;
dY = 20;
}
else{
dX = width;
dY = height;
}
2025-10-17 18:14:44 +08:00
auto pCt = new ElectricSvgGroupCT(QRect(-dX*0.5, -dY*0.5, dX, dY));
pCt->updateMapSvg(ProjectModelManager::instance().getData()[sMeta][sProModel].modelSetting.mapUsedSvg);
2025-10-11 18:51:33 +08:00
pCt->setItemType(GIT_ctGroup);
item = pCt;
QJsonArray portArr = pro->context()["port"].toArray();
addPortsToItem_json(P_const,portArr,item);
if(!valueInfo.isEmpty()){ //使用设置的绕组数更新自己
int nCtSize = 0; //ct设置的个数
int nCtType = 0; //ct类型 1三相0零相
if(valueInfo.contains("ct_winding")){
propertyStateInfo val = valueInfo.value("ct_winding");
QJsonDocument jsonDocument = QJsonDocument::fromJson(val.defaultValue.toString().toUtf8().data());
if(!jsonDocument.isNull()){
QJsonObject obj = jsonDocument.object();
if(obj.contains("winding")){
QJsonArray arr = obj["winding"].toArray();
nCtSize = arr.size();
}
}
}
if(valueInfo.contains("phase_num")){
propertyStateInfo val = valueInfo.value("phase_num");
nCtType = val.defaultValue.toInt();
}
QPair<int,int> pair(nCtType,nCtSize);
QVariant var = QVariant::fromValue(pair);
pCt->setupFinish(var);
}
}
else if(type == GIT_ptGroup)
{
PropertyModel model = ProjectModelManager::instance().getData()[sMeta][sProModel];
QByteArray svg;
if(model.modelSetting.mapSvg.isEmpty()){
svg = DataBase::GetInstance()->ModelType()[6].icon;
}
else{
svg = model.modelSetting.mapSvg.first();
}
if(width == 0 && height == 0){
dX = 50;
dY = 50;
}
else{
dX = width;
dY = height;
}
auto pPt = new ElectricSvgGroupPT(QRect(-dX*0.5, -dY*0.5, dX, dY));
pPt->updateMapSvg(ProjectModelManager::instance().getData()[sMeta][sProModel].modelSetting.mapUsedSvg);
pPt->setItemType(GIT_ptGroup);
item = pPt;
QJsonArray portArr = pro->context()["port"].toArray();
addPortsToItem_json(P_const,portArr,item);
if(!valueInfo.isEmpty()){ //使用设置的绕组数更新自己
QList<int> lst; //二次绕组接法
if(valueInfo.contains("pt_sec_winding")){
propertyStateInfo val = valueInfo.value("pt_sec_winding");
QJsonDocument jsonDocument = QJsonDocument::fromJson(val.defaultValue.toString().toUtf8().data());
if(!jsonDocument.isNull()){
QJsonObject obj = jsonDocument.object();
QJsonArray arr = obj["winding"].toArray();
for (QJsonValueRef jsonObj : arr)
{
QJsonObject node = jsonObj.toObject();
QString sWinding = node["windingConnectionMethod"].toString();
if(sWinding == "Y"){
lst.append(1);
}
else{
lst.append(0);
}
}
}
QVariant var = QVariant::fromValue(lst);
pPt->setupFinish(var);
}
}
2025-10-11 18:51:33 +08:00
}
else if(type == GIT_DS)
{
PropertyModel model = ProjectModelManager::instance().getData()[sMeta][sProModel];
QByteArray svg;
if(model.modelSetting.mapSvg.isEmpty()){
svg = DataBase::GetInstance()->ModelType()[7].icon;
}
else{
2025-10-17 18:14:44 +08:00
svg = ProjectModelManager::instance().getData()[sMeta][sProModel].modelSetting.mapUsedSvg["ds"];
2025-10-11 18:51:33 +08:00
}
if(width == 0 && height == 0){
dX = 30;
dY = 30;
}
else{
dX = width;
dY = height;
}
2025-10-17 18:14:44 +08:00
auto pDs = new ElectricSvgItemDS(QRect(-dX*0.5, -dY*0.5, dX, dY));
2025-10-11 18:51:33 +08:00
pDs->setItemType(GIT_DS);
pDs->loadSvg(svg);
item = pDs;
QJsonArray portArr = pro->context()["port"].toArray();
addPortsToItem_json(P_const,portArr,item);
}
else if(type == GIT_ES)
{
PropertyModel model = ProjectModelManager::instance().getData()[sMeta][sProModel];
QByteArray svg;
if(model.modelSetting.mapSvg.isEmpty()){
svg = DataBase::GetInstance()->ModelType()[8].icon;
}
else{
2025-10-17 18:14:44 +08:00
svg = ProjectModelManager::instance().getData()[sMeta][sProModel].modelSetting.mapUsedSvg["es"];
2025-10-11 18:51:33 +08:00
}
if(width == 0 && height == 0){
dX = 30;
dY = 60;
}
else{
dX = width;
dY = height;
}
2025-10-17 18:14:44 +08:00
auto pEs = new ElectricSvgItemES(QRect(-dX*0.5, -dY*0.5, dX, dY));
2025-10-11 18:51:33 +08:00
pEs->setItemType(GIT_ES);
pEs->loadSvg(svg);
item = pEs;
QJsonArray portArr = pro->context()["port"].toArray();
addPortsToItem_json(P_const,portArr,item);
}
else if(type == GIT_FES)
{
PropertyModel model = ProjectModelManager::instance().getData()[sMeta][sProModel];
QByteArray svg;
if(model.modelSetting.mapSvg.isEmpty()){
svg = DataBase::GetInstance()->ModelType()[9].icon;
}
else{
2025-10-17 18:14:44 +08:00
svg = ProjectModelManager::instance().getData()[sMeta][sProModel].modelSetting.mapUsedSvg["fes"];
2025-10-11 18:51:33 +08:00
}
if(width == 0 && height == 0){
dX = 30;
dY = 60;
}
else{
dX = width;
dY = height;
}
2025-10-17 18:14:44 +08:00
auto pFes = new ElectricSvgItemFES(QRect(-dX*0.5, -dY*0.5, dX, dY));
2025-10-11 18:51:33 +08:00
pFes->setItemType(GIT_FES);
pFes->loadSvg(svg);
item = pFes;
QJsonArray portArr = pro->context()["port"].toArray();
addPortsToItem_json(P_const,portArr,item);
}
else if(type == GIT_DTEDS)
{
PropertyModel model = ProjectModelManager::instance().getData()[sMeta][sProModel];
QByteArray svg;
if(model.modelSetting.mapSvg.isEmpty()){
svg = DataBase::GetInstance()->ModelType()[10].icon;
}
else{
2025-10-17 18:14:44 +08:00
svg = ProjectModelManager::instance().getData()[sMeta][sProModel].modelSetting.mapUsedSvg["dteds"];
2025-10-11 18:51:33 +08:00
}
if(width == 0 && height == 0){
dX = 60;
dY = 30;
}
else{
dX = width;
dY = height;
}
2025-10-17 18:14:44 +08:00
auto pDteds = new ElectricSvgItemDTEDS(QRect(-dX*0.5, -dY*0.5, dX, dY));
2025-10-11 18:51:33 +08:00
pDteds->setItemType(GIT_DTEDS);
pDteds->loadSvg(svg);
item = pDteds;
QJsonArray portArr = pro->context()["port"].toArray();
addPortsToItem_json(P_const,portArr,item);
}
else if(type == GIT_PI)
{
PropertyModel model = ProjectModelManager::instance().getData()[sMeta][sProModel];
QByteArray svg;
if(model.modelSetting.mapSvg.isEmpty()){
svg = DataBase::GetInstance()->ModelType()[11].icon;
}
else{
2025-10-17 18:14:44 +08:00
svg = ProjectModelManager::instance().getData()[sMeta][sProModel].modelSetting.mapUsedSvg["potential_indicator"];
2025-10-11 18:51:33 +08:00
}
if(width == 0 && height == 0){
dX = 30;
dY = 60;
}
else{
dX = width;
dY = height;
}
2025-10-17 18:14:44 +08:00
auto pPi = new ElectricSvgItemPI(QRect(-dX*0.5, -dY*0.5, dX, dY));
2025-10-11 18:51:33 +08:00
pPi->setItemType(GIT_PI);
pPi->loadSvg(svg);
item = pPi;
QJsonArray portArr = pro->context()["port"].toArray();
addPortsToItem_json(P_const,portArr,item);
}
else if(type == GIT_LA)
{
PropertyModel model = ProjectModelManager::instance().getData()[sMeta][sProModel];
QByteArray svg;
if(model.modelSetting.mapSvg.isEmpty()){
svg = DataBase::GetInstance()->ModelType()[12].icon;
}
else{
2025-10-17 18:14:44 +08:00
svg = ProjectModelManager::instance().getData()[sMeta][sProModel].modelSetting.mapUsedSvg["lightning_arrester"];
2025-10-11 18:51:33 +08:00
}
if(width == 0 && height == 0){
dX = 30;
dY = 60;
}
else{
dX = width;
dY = height;
}
2025-10-17 18:14:44 +08:00
auto pLa = new ElectricSvgItemLA(QRect(-dX*0.5, -dY*0.5, dX, dY));
2025-10-11 18:51:33 +08:00
pLa->setItemType(GIT_LA);
pLa->loadSvg(svg);
item = pLa;
QJsonArray portArr = pro->context()["port"].toArray();
addPortsToItem_json(P_const,portArr,item);
}
else if(type == GIT_cableTer)
{
PropertyModel model = ProjectModelManager::instance().getData()[sMeta][sProModel];
QByteArray svg;
if(model.modelSetting.mapSvg.isEmpty()){
svg = DataBase::GetInstance()->ModelType()[13].icon;
}
else{
2025-10-17 18:14:44 +08:00
svg = ProjectModelManager::instance().getData()[sMeta][sProModel].modelSetting.mapUsedSvg["cable_termination"];
2025-10-11 18:51:33 +08:00
}
if(width == 0 && height == 0){
dX = 20;
dY = 20;
}
else{
dX = width;
dY = height;
2025-02-06 16:36:50 +08:00
}
2025-10-11 18:51:33 +08:00
2025-10-17 18:14:44 +08:00
auto pCt = new ElectricSvgItemCableTer(QRect(-dX*0.5, -dY*0.5, dX, dY));
2025-10-11 18:51:33 +08:00
pCt->setItemType(GIT_cableTer);
pCt->loadSvg(svg);
item = pCt;
QJsonArray portArr = pro->context()["port"].toArray();
addPortsToItem_json(P_const,portArr,item);
2025-02-06 16:36:50 +08:00
}
2025-10-11 18:51:33 +08:00
else if(type == GIT_cableEnd)
{
PropertyModel model = ProjectModelManager::instance().getData()[sMeta][sProModel];
QByteArray svg;
if(model.modelSetting.mapSvg.isEmpty()){
svg = DataBase::GetInstance()->ModelType()[14].icon;
}
else{
2025-10-17 18:14:44 +08:00
svg = ProjectModelManager::instance().getData()[sMeta][sProModel].modelSetting.mapUsedSvg["cable_end"];
2025-10-11 18:51:33 +08:00
}
if(width == 0 && height == 0){
dX = 20;
dY = 20;
}
else{
dX = width;
dY = height;
}
2025-10-17 18:14:44 +08:00
auto pCe = new ElectricSvgItemCableEnd(QRect(-dX*0.5, -dY*0.5, dX, dY));
2025-10-11 18:51:33 +08:00
pCe->setItemType(GIT_cableEnd);
pCe->loadSvg(svg);
item = pCe;
QJsonArray portArr = pro->context()["port"].toArray();
addPortsToItem_json(P_const,portArr,item);
}
2025-10-17 18:14:44 +08:00
else if(type == GIT_2wTransformer)
{
PropertyModel model = ProjectModelManager::instance().getData()[sMeta][sProModel];
QByteArray svg;
if(model.modelSetting.mapSvg.isEmpty()){
svg = DataBase::GetInstance()->ModelType()[15].icon;
}
else{
svg = ProjectModelManager::instance().getData()[sMeta][sProModel].modelSetting.mapUsedSvg["transformer_2w"];
}
if(width == 0 && height == 0){
dX = 100;
dY = 100;
}
else{
dX = width;
dY = height;
}
auto p2w = new ElectricSvgItem2wTransformer(QRect(-dX*0.5, -dY*0.5, dX, dY));
p2w->setItemType(GIT_2wTransformer);
p2w->loadSvg(svg);
item = p2w;
QJsonArray portArr = pro->context()["port"].toArray();
addPortsToItem_json(P_const,portArr,item);
}
else if(type == GIT_3wTransformer)
{
PropertyModel model = ProjectModelManager::instance().getData()[sMeta][sProModel];
QByteArray svg;
if(model.modelSetting.mapSvg.isEmpty()){
svg = DataBase::GetInstance()->ModelType()[15].icon;
}
else{
svg = ProjectModelManager::instance().getData()[sMeta][sProModel].modelSetting.mapUsedSvg["transformer_3w"];
}
if(width == 0 && height == 0){
dX = 100;
dY = 100;
}
else{
dX = width;
dY = height;
}
auto p3w = new ElectricSvgItem3wTransformer(QRect(-dX*0.5, -dY*0.5, dX, dY));
p3w->setItemType(GIT_3wTransformer);
p3w->loadSvg(svg);
item = p3w;
QJsonArray portArr = pro->context()["port"].toArray();
2025-10-11 18:51:33 +08:00
2025-10-17 18:14:44 +08:00
addPortsToItem_json(P_const,portArr,item);
}
2025-02-06 16:36:50 +08:00
if(item)
{
item->setItemId(id);
item->editShape(0, pos);
item->setPos(pos);
2025-10-21 18:46:51 +08:00
item->setRotation(rotate);
2025-02-06 16:36:50 +08:00
_scene->addItem(item);
item->addPoint(pos);
item->setProperty(pro); //绑定模型
item->updateByProperty(); //使用模型更新自身
2025-11-14 19:31:09 +08:00
//QString sModel = _projectModelName.value(id.toString());
//item->setModelName(sModel);
2025-02-06 16:36:50 +08:00
_nodeItem.insert(id,item);
connect(item,&GraphicsProjectModelItem::ifExist,this,&FixedPortsModel::onSignal_ifExits);
2025-02-06 16:36:50 +08:00
}
2025-11-14 19:31:09 +08:00
return pro->name();
2025-02-06 16:36:50 +08:00
}
}
2025-11-14 19:31:09 +08:00
return QString("err");
2025-02-06 16:36:50 +08:00
}
2025-03-28 18:08:21 +08:00
BaseProperty* FixedPortsModel::addNodeData(QUuid id,int type,QString name,QString modelName)
2025-02-06 16:36:50 +08:00
{
2025-05-23 10:30:52 +08:00
BaseProperty* pData = BasePropertyManager::instance().findEntityData(id); //已存在不不创建
2025-05-09 19:36:32 +08:00
if(pData != nullptr)
return pData;
2025-03-28 18:08:21 +08:00
2025-07-18 18:26:13 +08:00
VariableProperty* item = new VariableProperty();
2025-04-09 16:20:34 +08:00
//todo:关联到对应data
2025-03-28 18:08:21 +08:00
2025-02-06 16:36:50 +08:00
if(item)
{
item->setUuid(id);
2025-03-28 18:08:21 +08:00
item->setModelName(modelName);
2025-02-06 16:36:50 +08:00
item->setType(type);
2025-07-24 10:01:31 +08:00
GraphicsItemType localType = typeToProGraphic[type]; //将通用类型转换为工程模图元
2025-07-11 18:13:54 +08:00
item->setGraphicsType(localType);
2025-02-06 16:36:50 +08:00
item->setTag(name);
item->setName(name);
2025-07-11 18:13:54 +08:00
item->setDataChanged(true);
2025-05-23 10:30:52 +08:00
BasePropertyManager::instance().insertEntityData(id,item);
2025-02-06 16:36:50 +08:00
}
return item;
}
void FixedPortsModel::loadNodeDataFromDataBase()
{
if(!_dataInitialised)
{
QList<componentInfo> lst= DataBase::GetInstance()->getAllComponents();
for(auto &info:lst)
{
QString preTag = removeSuffix(info.tag);
QString prePath = removeSuffix(info.nspath);
2025-03-28 18:08:21 +08:00
BaseProperty* pData = addNodeData(info.uuid,info.type,info.name,info.modelName);
pData->setTag(preTag);
2025-02-06 16:36:50 +08:00
pData->setName(info.name);
pData->setPath(prePath);
2025-02-06 16:36:50 +08:00
pData->setDescription(info.description);
pData->setInService(info.inService);
pData->setState(info.state);
pData->setConnectedBus(info.connected_bus);
pData->setLabel(info.label);
pData->setContext(info.context);
pData->setGrid(info.grid);
pData->setZone(info.zone);
pData->setStation(info.station);
2025-11-21 19:22:41 +08:00
pData->setBay(prePath);
2025-02-06 16:36:50 +08:00
pData->setDataChanged(false);
2025-07-11 18:13:54 +08:00
QString sMeta = info.context["metaModel"].toString();
pData->setMetaModelName(sMeta);
2025-11-21 19:22:41 +08:00
QJsonArray nodesJsonArray = info.context["subList"].toArray();
QList<QPair<int, QUuid>> lst;
for (QJsonValueRef nodeJson : nodesJsonArray)
{
QJsonObject node = nodeJson.toObject();
int nCategory = node["category"].toInt();
QUuid uid = QUuid(node["uuid"].toString());
lst.append(qMakePair(nCategory,uid));
}
pData->setSubList(lst);
2025-05-16 19:20:46 +08:00
PowerEntity* pEntity = TopologyManager::instance().createEntity(EntityType::Component,info.uuid.toString(),info.name); //首先load所有data和entity全局唯一
if(pEntity){
createTopoTerminalsByData(pEntity,info.context);
2025-02-06 16:36:50 +08:00
}
2025-07-18 18:26:13 +08:00
QList<MeasurementInfo> lstMeasure = DataBase::GetInstance()->getMeasurement(info.uuid); //添加设备量测
QMap<QString,MeasurementInfo> mapMeasure;
for(auto& info:lstMeasure)
{
info.tag = removeSuffix(info.tag);
2025-07-18 18:26:13 +08:00
mapMeasure.insert(info.name,info);
}
pData->setMeasurement(mapMeasure);
2025-05-16 19:20:46 +08:00
}
2025-02-06 16:36:50 +08:00
2025-05-16 19:20:46 +08:00
QList<topologicInfo> lstTopo = DataBase::GetInstance()->getAllTopologics();
for(auto &info:lstTopo)
{
2025-06-20 18:09:41 +08:00
QString from_pin = info.context["from_pin"].toString();
QString to_pin = info.context["to_pin"].toString();
TopologyManager::instance().createConnection(QString::number(info.id),from_pin,to_pin,info.uuid_from.toString(),info.uuid_to.toString());
2025-02-06 16:36:50 +08:00
}
2025-07-18 18:26:13 +08:00
QList<bayInfo> lstBay = DataBase::GetInstance()->getAllBay();
for(auto& bay:lstBay)
{
QString showTag = removeSuffix(bay.tag);
2025-07-18 18:26:13 +08:00
BayProperty* pBay = addBayData(bay.uuid);
pBay->setName(bay.name);
pBay->setTag(showTag);
2025-07-18 18:26:13 +08:00
pBay->setType(bay.type);
pBay->setLstComponent(bay.components);
pBay->setVoltage(bay.unom);
pBay->setFla(bay.fla);
pBay->setCapacity(bay.capacity);
pBay->setInService(bay.inService);
auto fromLst = turnJsonArrToList(bay.fromUuid,"id","ids");
pBay->setLstFrom(fromLst);
auto toLst = turnJsonArrToList(bay.toUuid,"id","ids");
pBay->setLstTo(toLst);
auto proptecLst = turnJsonArrToList(bay.protect,"id","ids");
pBay->setLstProtect(proptecLst);
auto falRecLst = turnJsonArrToList(bay.faultRec,"id","ids");
pBay->setLstFaultRecord(falRecLst);
auto dynSenLst = turnJsonArrToList(bay.dynSense,"id","ids");
pBay->setLstDynSense(dynSenLst);
auto staLst = turnJsonArrToList(bay.status,"id","ids");
pBay->setLstStatus(staLst);
auto insLst = turnJsonArrToList(bay.instruct,"id","ids");
pBay->setLstInstruct(insLst);
auto etcLst = turnJsonArrToList(bay.etc,"id","ids");
pBay->setLstEtc(etcLst);
}
2025-02-06 16:36:50 +08:00
_dataInitialised = true;
}
else
{
2025-05-09 19:36:32 +08:00
//for(auto p:_nodeData)
2025-02-06 16:36:50 +08:00
{
int a = 1;
}
}
}
2025-11-14 19:31:09 +08:00
QString FixedPortsModel::addConnectLline(QUuid lineId,QUuid srcId,QUuid destId,QUuid srcPort,QUuid destPort)
2025-02-06 16:36:50 +08:00
{
GraphicsProjectModelItem* src = _nodeItem[srcId];
GraphicsProjectModelItem* dest = _nodeItem[destId];
2025-07-11 18:13:54 +08:00
QMap<QUuid,BaseProperty*> mapData = BasePropertyManager::instance().getEntityData();
if(mapData.contains(lineId))
2025-02-06 16:36:50 +08:00
{
2025-07-11 18:13:54 +08:00
BaseProperty* pPro = mapData.value(lineId);
2025-11-14 19:31:09 +08:00
if(src && dest && pPro)
2025-02-06 16:36:50 +08:00
{
2025-07-11 18:13:54 +08:00
ElectricConnectLineItem* pItem = new ElectricConnectLineItem();
pItem->setItemId(lineId);
pItem->setItemType(GIT_link);
_scene->addItem(pItem);
ItemPort* ptSrc = src->getPortById(srcPort.toString());
HandleType srcType = ptSrc->getType();
PortPos srcPos = ptSrc->portPos();
pItem->setStartPoint(ptSrc->scenePos());
ptSrc->setConnect(pItem);
ItemPort* ptDest = nullptr;
2025-05-16 19:20:46 +08:00
ptDest = dest->getPortById(destPort.toString());
2025-02-06 16:36:50 +08:00
pItem->setEndPoint(ptDest->scenePos());
2025-07-11 18:13:54 +08:00
if(ptDest != nullptr)
{
HandleType destType = ptDest->getType();
PortPos destPos = ptDest->portPos();
pItem->calculatePath();
2025-02-06 16:36:50 +08:00
2025-07-11 18:13:54 +08:00
pPro->setConnection(Connection(srcId,srcPort,srcType,srcPos,destId,destPort,destType,destPos));
ptDest->setConnect(pItem);
2025-02-06 16:36:50 +08:00
2025-07-11 18:13:54 +08:00
addNodeItem(pItem->itemId(),pItem);
pItem->setProperty(pPro);
}
2025-11-14 19:31:09 +08:00
return pPro->name();
2025-02-06 16:36:50 +08:00
}
}
2025-11-14 19:31:09 +08:00
return QString("err");
2025-02-06 16:36:50 +08:00
}
void FixedPortsModel::deleteNodeItem(GraphicsProjectModelItem* pItem)
2025-02-06 16:36:50 +08:00
{
if(pItem->getItemType() == GIT_link)
{
auto pLine = dynamic_cast<ElectricConnectLineItem*>(pItem);
if(pLine)
{
2025-04-30 16:29:17 +08:00
QUuid conId = pLine->itemId();
TopologyManager::instance().removeConnection(conId.toString());
PowerConnection* pCon = TopologyManager::instance().connection(conId.toString());
if(pCon){
PowerEntity* itemFrom = TopologyManager::instance().getEntityByTerminal(pCon->fromTerminalId());
PowerEntity* itemTo = TopologyManager::instance().getEntityByTerminal(pCon->toTerminalId());
if(itemFrom && itemTo)
{
_nodeItem.value(QUuid(itemFrom->id()))->setItemChanged(true);
_nodeItem.value(QUuid(itemTo->id()))->setItemChanged(true);
}
}
_nodeItem.take(conId);
_scene->removeItem(pLine);
2025-02-06 16:36:50 +08:00
delete pLine;
}
}
else
{
QUuid srcId = pItem->itemId();
2025-04-30 16:29:17 +08:00
QList<PowerConnection*> lstCon = TopologyManager::instance().getConnectionsFor(srcId.toString());
for(auto &con:lstCon)
{
PowerEntity* pFrom = TopologyManager::instance().getEntityByTerminal(con->fromTerminalId());
PowerEntity* pTo = TopologyManager::instance().getEntityByTerminal(con->toTerminalId());
if(pFrom && pTo)
{
if(srcId.toString() == pFrom->id()) //对象是srcItem
_nodeItem.value(QUuid(pTo->id()))->setItemChanged(true);
else //对象是toItem
_nodeItem.value(QUuid(pFrom->id()))->setItemChanged(true);
}
//TopologyManager::instance().removeConnection(con->id()); //删除entity时会同时删除相关连接无需手动删除
}
TopologyManager::instance().deleteEntity(srcId.toString());
2025-02-06 16:36:50 +08:00
pItem->setItemChanged(true);
_nodeItem.take(srcId);
_scene->removeItem(pItem);
delete pItem;
}
}
void FixedPortsModel::saveNode(int nPageId)
{
2025-07-18 18:26:13 +08:00
for(auto& bay:_bayItem)
{
AbstractProperty* pro = bay->getProperty(); //间隔
BayProperty* pBay = dynamic_cast<BayProperty*>(pro);
if(pBay){
bool val = DataBase::GetInstance()->ifBayExist(pBay->uuid());
QString tempTag = pBay->tag()+"_"+_pageName; //tag后加工程名保持全局唯一
2025-07-18 18:26:13 +08:00
if(!val){
QJsonObject objFrom = turnListToJson(pBay->getLstFrom(),"id","ids");
QJsonObject objTo= turnListToJson(pBay->getLstTo(),"id","ids");
QJsonObject objProtec= turnListToJson(pBay->getLstProtect(),"id","ids");
QJsonObject objFalRec= turnListToJson(pBay->getLstFaultRecord(),"id","ids");
QJsonObject objStatus= turnListToJson(pBay->getLstStatus(),"id","ids");
QJsonObject objDynSen= turnListToJson(pBay->getLstDynSense(),"id","ids");
QJsonObject objIns= turnListToJson(pBay->getLstInstruct(),"id","ids");
QJsonObject objEtc= turnListToJson(pBay->getLstEtc(),"id","ids");
DataBase::GetInstance()->insertBay(pBay->uuid(),pBay->name(),tempTag,pBay->getType(),pBay->getVoltage(),pBay->getFla(),pBay->getCapacity(),"1",pBay->getInService(),0,"1","1","1",QJsonObject(),objFrom,objTo,objProtec,objFalRec,objStatus,objDynSen,objIns,objEtc,pBay->getLstComponent(),QJsonObject());
2025-07-18 18:26:13 +08:00
}
else{
QJsonObject objFrom = turnListToJson(pBay->getLstFrom(),"id","ids");
QJsonObject objTo= turnListToJson(pBay->getLstTo(),"id","ids");
QJsonObject objProtec= turnListToJson(pBay->getLstProtect(),"id","ids");
QJsonObject objFalRec= turnListToJson(pBay->getLstFaultRecord(),"id","ids");
QJsonObject objStatus= turnListToJson(pBay->getLstStatus(),"id","ids");
QJsonObject objDynSen= turnListToJson(pBay->getLstDynSense(),"id","ids");
QJsonObject objIns= turnListToJson(pBay->getLstInstruct(),"id","ids");
QJsonObject objEtc= turnListToJson(pBay->getLstEtc(),"id","ids");
DataBase::GetInstance()->updateBay(pBay->uuid(),pBay->name(),tempTag,pBay->getVoltage(),pBay->getFla(),pBay->getCapacity(),"",pBay->getInService(),0,QJsonObject(),objFrom,objTo,objProtec,objFalRec,objStatus,objDynSen,objIns,objEtc,pBay->getLstComponent(),QJsonObject());
2025-07-18 18:26:13 +08:00
}
}
}
2025-07-11 18:13:54 +08:00
QMap<QUuid,GraphicsProjectModelItem*> mapItems = allItems();
for(auto& pItem:mapItems)
2025-02-06 16:36:50 +08:00
{
2025-07-11 18:13:54 +08:00
BaseProperty* pData = dynamic_cast<BaseProperty*>(pItem->getProperty());
if(pData){
Connection con = pData->getConnection();
QString fromPin = con.nSrcPortId.toString();
QString toPin = con.nDestPortId.toString();
QJsonObject context;
context["from_pin"] = fromPin;
context["to_pin"] = toPin;
if(pData->prepareDelete())
2025-02-06 16:36:50 +08:00
{
2025-07-11 18:13:54 +08:00
DataBase::GetInstance()->deleteComponent(pData->uuid().toString());
if(pData->type() == 8){
PowerConnection* pCon = TopologyManager::instance().connection(fromPin,toPin);
if(pCon){
DataBase::GetInstance()->deleteTopologic(con.nSrcPortId,con.nDestPortId);
TopologyManager::instance().removeConnection(pCon->id());
2025-04-09 16:20:34 +08:00
}
2025-02-06 16:36:50 +08:00
}
2025-07-11 18:13:54 +08:00
continue;
}
if(pData->dataChanged())
{
2025-07-18 18:26:13 +08:00
pData->setDataChanged(false);
2025-07-11 18:13:54 +08:00
bool exist = DataBase::GetInstance()->componentExist(pData->uuid().toString());
VariableProperty* pVariable = dynamic_cast<VariableProperty*>(pData);
if(pVariable)
2025-02-06 16:36:50 +08:00
{
2025-07-18 18:26:13 +08:00
modelDataInfo& dataInfo = pVariable->getPropertyValue();
2025-07-11 18:13:54 +08:00
if(exist) //已存在更新
{
QString tempTag = pData->tag()+"_"+_pageName; //tag后加工程名使得全局唯一
DataBase::GetInstance()->updateComponent(pData->uuid(),tempTag,pData->name(),pData->context());
2025-07-11 18:13:54 +08:00
for(auto &val:dataInfo.groupInfo)
{
if(val.groupName == "component")
continue;
DataBase::GetInstance()->updateDynamicProperty(pData->uuid(),val);
2025-07-18 18:26:13 +08:00
if(val.mapInfo.contains(pData->uuid())){ //保存时将数据锁复原
auto& mapPro = val.mapInfo[pData->uuid()];
for(auto& pro:mapPro)
{
pro.lock = false;
}
}
2025-07-11 18:13:54 +08:00
}
}
else
2025-02-06 16:36:50 +08:00
{
QString tempTag = pData->tag()+"_"+_pageName; //tag后加工程名使得全局唯一
QString tempPath = pData->path()+"_"+_pageName;
DataBase::GetInstance()->insertComponent(pData->uuid(),pData->modelName(),tempPath,tempTag,pData->name(),pData->description(),pData->grid(),pData->zone(),pData->station(),pData->type(),true,pData->state(),pData->status(),pData->connectedBus(),pData->label(),pData->context(),1);
2025-07-11 18:13:54 +08:00
for(auto &val:dataInfo.groupInfo)
{
if(val.groupName == "component")
continue;
DataBase::GetInstance()->insertDynamicProperty(pData->uuid(),val);
2025-07-18 18:26:13 +08:00
if(val.mapInfo.contains(pData->uuid())){ //保存时将数据锁复原
auto& mapPro = val.mapInfo[pData->uuid()];
for(auto& pro:mapPro)
{
pro.lock = false;
}
}
2025-07-11 18:13:54 +08:00
}
2025-04-09 16:20:34 +08:00
}
2025-07-18 18:26:13 +08:00
QMap<QString,MeasurementInfo> mapMeasure = pData->getMeasurement(); //量测
QList<MeasurementInfo> lstDataBase = DataBase::GetInstance()->getMeasurement(pData->uuid()); //数据库中现有量测
for(auto& info:mapMeasure)
{
int tpe = info.type; //todo:建立类型映射表
QJsonObject objDataSource;
QJsonObject objIoAddress;
if(info.nSource == 1){ //3611
objDataSource["type"] = 1;
objIoAddress["station"] = info.sStation;
objIoAddress["device"] = info.equipment;
objIoAddress["channel"] = info.sChannel;
2025-07-18 18:26:13 +08:00
}
else if(info.nSource == 2){ //104
objDataSource["type"] = 2;
objIoAddress["station"] = info.sStation;
objIoAddress["packet"] = info.nPacket;
objIoAddress["offset"] = info.nOffset;
2025-07-18 18:26:13 +08:00
}
objDataSource["io_address"] = objIoAddress;
QJsonObject objEventPlan;
QJsonObject objCause;
QJsonObject objAction;
QJsonArray arrPara;
objEventPlan["enable"] = info.bEnable;
if(tpe == 0){ //遥测
for(auto iter = info.mapTE.begin();iter != info.mapTE.end();++iter){
objCause[iter.key()] = iter.value();
}
2025-07-18 18:26:13 +08:00
}
else if(tpe == 1){ //遥信
objCause["edge"] = info.sEdge;
2025-07-18 18:26:13 +08:00
}
objEventPlan["cause"] = objCause;
objAction["command"] = info.sCommand;
for(auto &para:info.lstParameter){
arrPara.append(para);
2025-07-18 18:26:13 +08:00
}
objAction["parameters"] = arrPara;
objEventPlan["action"] = objAction;
QString tempTag = info.tag+"_"+_pageName; //tag后加工程名保持全局唯一
2025-07-18 18:26:13 +08:00
bool val = DataBase::GetInstance()->ifMeasureExist(info.name,pData->uuid());
if(val){
DataBase::GetInstance()->updateMeasurement(info.name,tpe,objDataSource,objEventPlan,info.size,pData->uuid());
2025-07-18 18:26:13 +08:00
}
else{
DataBase::GetInstance()->insertMeasurement(info.name,tempTag,tpe,objDataSource,objEventPlan,info.size,info.bayUuid,info.componentUuid);
2025-07-18 18:26:13 +08:00
}
for(int i = 0;i < lstDataBase.size();++i) //从数据库记录中移除操作过的对象
{
if(lstDataBase[i].name == info.name){
lstDataBase.removeAt(i);
break;
}
}
}
for(auto& info:lstDataBase) //操作的记录小于数据库中的记录,删除库中多出的记录
{
DataBase::GetInstance()->delteMeasurement(info.name,info.componentUuid);
}
2025-02-06 16:36:50 +08:00
}
2025-07-11 18:13:54 +08:00
if(pData->type() == 8){
PowerConnection* pCon = TopologyManager::instance().connection(fromPin,toPin);
if(pCon){
2025-07-18 18:26:13 +08:00
int id = DataBase::GetInstance()->topologicExist(con.nSrcNodeId,con.nDestNodeId);
if(id == -1)
DataBase::GetInstance()->insertTopologic(con.nSrcNodeId,con.nDestNodeId,context,0,"",0);
2025-07-11 18:13:54 +08:00
}
}
2025-05-16 19:20:46 +08:00
}
}
}
2025-02-06 16:36:50 +08:00
}
void FixedPortsModel::onSignal_ifExits(QUuid id,const QString& str,int type,GraphicsProjectModelItem* pitem)
2025-02-06 16:36:50 +08:00
{
bool exist = false;
BaseProperty* pData = nullptr;
2025-05-23 10:30:52 +08:00
QMap<QUuid,BaseProperty*> mapData = BasePropertyManager::instance().getEntityData();
2025-05-09 19:36:32 +08:00
for(auto pro:mapData)
2025-02-06 16:36:50 +08:00
{
if(pro->tag() == str)
{
pData = pro;
exist = true;
break;
}
}
if(exist) //已存在将发出信号的item绑定到此data
{
if(_nodeItem.contains(id)) //发出信号对象id与data对象id相同已绑定,不做响应
return;
QMessageBox msgBox;
msgBox.setText(QString::fromWCharArray(L"提示"));
2025-05-09 19:36:32 +08:00
msgBox.setInformativeText(QString::fromWCharArray(L"此名称对象已存在,是否使用该对象?"));
2025-02-06 16:36:50 +08:00
msgBox.setStandardButtons(QMessageBox::Ok | QMessageBox::Cancel);
msgBox.setDefaultButton(QMessageBox::Cancel);
int ret = msgBox.exec();
switch (ret) {
case QMessageBox::Ok:
{
//todo:断开原来的连接关系
pitem->setProperty(pData);
pitem->setItemId(pData->uuid());
2025-05-09 19:36:32 +08:00
PowerEntity* pEntity = TopologyManager::instance().findEntity(pData->uuid().toString());
if(pEntity){
pitem->setEntity(pEntity); //item对象的逻辑接线点无需重复创建
}
2025-02-06 16:36:50 +08:00
_nodeItem.take(id);
_nodeItem.insert(pData->uuid(),pitem);
}
break;
case QMessageBox::Cancel:
// Cancel was clicked
break;
default:
// should never be reached
break;
}
}
else //创建新data并绑定
{
2025-05-09 19:36:32 +08:00
BaseProperty* pData = addNodeData(id,type,str,pitem->getModelName());
if(pData)
2025-02-06 16:36:50 +08:00
{
2025-05-09 19:36:32 +08:00
pitem->setProperty(pData);
pData->setDataChanged(true); //数据状态改变
2025-02-06 16:36:50 +08:00
}
2025-05-09 19:36:32 +08:00
PowerEntity* pEntity = TopologyManager::instance().createEntity(EntityType::Component,id.toString(),str);
if(pEntity)
pitem->setEntity(pEntity);
2025-05-16 19:20:46 +08:00
createTopoTerminalsByItem(pitem); //创建item对象的逻辑接线点
2025-02-06 16:36:50 +08:00
}
}
void FixedPortsModel::onTimeOut()
{
_Interface->getPointData("i");
_Interface->getPointData("v");
}
void FixedPortsModel::onSignal_GetPointData(QString type,QMap<qint64,double> map)
{
if(map.size() == 1) //实时数据
{
double d = map.first();
2025-05-09 19:36:32 +08:00
//for(auto pro:_nodeData) //demo版本只有一个数据
2025-02-06 16:36:50 +08:00
{
2025-05-09 19:36:32 +08:00
//int t = pro->type();
//if(t == GIT_itemRect)
2025-02-06 16:36:50 +08:00
{
//todo:根据id匹配数据
/*auto p = dynamic_cast<ElectricSvgItemRect_Property*>(pro);
2025-02-06 16:36:50 +08:00
if(p)
{
p->notifyUpdate(); //通知更新
}*/
2025-02-06 16:36:50 +08:00
}
}
}
}
2025-07-04 18:47:49 +08:00
void FixedPortsModel::onSignal_generateDiagram(const QString& sName)
{
QStringList lstInfo;
for(auto& item:_baseItem){
BaseModelProperty* pBase = dynamic_cast<BaseModelProperty*>(item->getProperty());
if(pBase){
2025-10-17 18:14:44 +08:00
int nType = pBase->type();
2025-10-17 19:07:28 +08:00
if(nType == 0){ //为节点等无属性对象时跳过(自动赋值modelname)
pBase->setModelName(pBase->metaModelName());
2025-10-17 18:14:44 +08:00
continue;
2025-10-17 19:07:28 +08:00
}
2025-07-04 18:47:49 +08:00
QString sModel = pBase->getModelProperty().modelSetting.modelName;
if(sModel.isEmpty()){
lstInfo.append(pBase->name());
}
}
}
if(!lstInfo.isEmpty()){
QMessageBox::information(NULL, QString("提示"), QString::fromWCharArray(L"%1未设置完毕").arg(lstInfo.join("")));
return;
}
QList<GraphicsBaseModelItem*> lst;
for(auto& item:_baseItem)
{
lst.append(item);
}
2025-07-11 18:13:54 +08:00
QList<GraphicsNonStandardItem*> lstBay;
2025-10-21 18:46:51 +08:00
for(auto& item:_baseBayItem)
2025-07-11 18:13:54 +08:00
{
lstBay.append(item);
}
generateProjectModel(sName,lst,lstBay);
}
void FixedPortsModel::onSignal_openBayManager()
{
if(m_pBayManager == nullptr){
m_pBayManager = new BayManagerDlg(_widget);
m_pBayManager->setModelController(this);
}
m_pBayManager->showDlg();
2025-07-04 18:47:49 +08:00
}
2025-02-06 16:36:50 +08:00
void FixedPortsModel::startHttpRequest()
{
if(_timer)
{
_timer->setInterval(1000);
_timer->start();
}
}
2025-10-11 18:51:33 +08:00
void FixedPortsModel::addPortsToItem_json(PortState sta,QJsonArray jArr,GraphicsProjectModelItem* pItem)
{
for(QJsonValueRef portJson:jArr)
{
QJsonObject portObj = portJson.toObject();
QString portId = portObj["portId"].toString();
2025-10-17 18:14:44 +08:00
double x = portObj["x"].toDouble();
double y = portObj["y"].toDouble();
2025-10-11 18:51:33 +08:00
if(sta == P_const){
HandleType tye = HandleType(portObj["portType"].toInt());
PortPos locate = PortPos(portObj["locate"].toInt());
double ratioX = 0.0;
double ratioY = 0.0;
if(portObj.contains("xRatio") || portObj.contains("yRatio")){
ratioX = portObj["xRatio"].toDouble();
ratioY = portObj["yRatio"].toDouble();
}
pItem->addPort(P_const,QPointF(x,y),portId,tye,locate,ratioX,ratioY);
2025-10-11 18:51:33 +08:00
}
else if(sta == p_movable){
pItem->addPort(p_movable,QPointF(x,y),portId);
}
}
}
2025-10-21 18:46:51 +08:00
void FixedPortsModel::autoSetModelName(GraphicsBaseModelItem* pItem)
{
ModelProperty* p = pItem->getProperty();
BaseModelProperty* pro = dynamic_cast<BaseModelProperty*>(p);
if(pro){
QString sMeta = pro->metaModelName();
QString sModel = sMeta+"_"+_pageName;
bool exist = ProjectModelManager::instance().getData()[sMeta].contains(sModel);
if(exist){
pro->setModelName(sModel);
pro->getModelProperty().modelSetting.modelName = sModel;
}
}
}
QString FixedPortsModel::removeSuffix(const QString& str)
{
int lastUnderscore = str.lastIndexOf('_');
if (lastUnderscore == -1) return str; // 没有下划线
return str.left(lastUnderscore);
}
2025-11-14 19:31:09 +08:00
ModelProperty* FixedPortsModel::getItemByUid(QList<GraphicsBaseItem*> lst,QUuid uid)
{
for(auto& item:lst){
auto pPro = item->getProperty();
if(pPro->uuid() == uid){
return pPro;
}
}
return nullptr;
}
2025-10-21 18:46:51 +08:00
2025-02-06 16:36:50 +08:00
QWidget* FixedPortsModel::getTopWidget()
{
return dynamic_cast<QWidget*>(_widget);
}
2025-04-30 16:29:17 +08:00
QPointF FixedPortsModel::getTerminalPos(const QString& sTerminalId)
{
PowerEntity* pParent = TopologyManager::instance().getEntityByTerminal(sTerminalId);
if(pParent)
{
for(auto &item:_nodeItem)
{
if(pParent->id() == item->itemId().toString()) //找到terminal父图元
{
for(auto &pPort:item->getPorts())
{
if(pPort->getId() == sTerminalId)
{
return pPort->scenePos();
}
}
}
}
}
return QPointF(0,0);
}
ElectricConnectLineItem* FixedPortsModel::getLineItemById(const QString& terminalId)
{
for(auto iter:_nodeItem) //获取id所在的lineitem
{
auto item = dynamic_cast<GraphicsProjectModelItem*>(iter);
2025-04-30 16:29:17 +08:00
if(item)
{
if(item->getItemType() == GIT_link)
{
PowerConnection* pCon = TopologyManager::instance().getConnectionContainsTerminal(terminalId);
if(pCon)
{
if(item->itemId().toString() == pCon->id())
return dynamic_cast<ElectricConnectLineItem*>(item);
}
}
}
}
return nullptr;
}
void FixedPortsModel::showModelDlg(const QString& sName,QUuid uuid,GraphicsProjectModelItem* pItem)
2025-03-28 18:08:21 +08:00
{
modelStateInfo stateInfo = _modelStateInfo[sName];
ModelDataMap mapData = DataManager::instance().modelData();
ItemPropertyDlg* pDlg = dynamic_cast<ItemPropertyDlg*>(stateInfo._PropertyDlg);
if(pDlg)
2025-03-28 18:08:21 +08:00
{
2025-04-09 16:20:34 +08:00
pDlg->showDlg(mapData[sName],uuid,pItem);
2025-03-28 18:08:21 +08:00
}
else
qDebug()<<"showModelDlg err";
2025-03-28 18:08:21 +08:00
}
void FixedPortsModel::initialPropertyDlg()
2025-03-28 18:08:21 +08:00
{
for(auto &modelInfo:_modelStateInfo)
2025-03-28 18:08:21 +08:00
{
if(modelInfo._PropertyDlg == NULL)
2025-03-28 18:08:21 +08:00
{
generatePropertyDlg(modelInfo.modelName);
2025-03-28 18:08:21 +08:00
}
}
}
void FixedPortsModel::generatePropertyDlg(const QString& sModel)
2025-03-28 18:08:21 +08:00
{
modelStateInfo info = _modelStateInfo[sModel];
if(info._PropertyDlg == NULL)
2025-03-28 18:08:21 +08:00
{
ItemPropertyDlg* dlg = new ItemPropertyDlg(_widget);
if(dlg)
2025-03-28 18:08:21 +08:00
{
2025-07-04 18:47:49 +08:00
dlg->setModelController(this);
dlg->loadGroupButton(info.groupInfo);
2025-04-09 16:20:34 +08:00
_modelStateInfo[sModel]._PropertyDlg = dlg;
2025-03-28 18:08:21 +08:00
}
}
}
2025-04-30 16:29:17 +08:00
ConfigurationDiagram* FixedPortsModel::getTopologyDiagram()
{
return dynamic_cast<ConfigurationDiagram*>(_pEntity);
}
2025-05-09 19:36:32 +08:00
2025-06-20 18:09:41 +08:00
void FixedPortsModel::createTopoTerminalsByData(PowerEntity* pParent,QJsonObject componentCon,ModelFunctionType funType)
2025-05-16 19:20:46 +08:00
{
QJsonArray portsArray = componentCon["port"].toArray();
for (QJsonValueRef portJson : portsArray) //每个属性的状态信息
{
QJsonObject node = portJson.toObject();
QString portId = node["portId"].toString();
int x = node["x"].toInt();
int y = node["y"].toInt();
PortPos locate = PortPos(node["locate"].toInt());
HandleType portType = HandleType(node["portType"].toInt());
TerminalType terType;
switch (portType) {
case T_lineIn:
terType = TerminalType::PowerInput;
break;
case T_lineOut:
terType = TerminalType::PowerOutput;
break;
case T_lineInOut:
terType = TerminalType::PowerConnect;
break;
2025-10-17 18:14:44 +08:00
case T_newTral:
terType = TerminalType::NewTral;
break;
2025-05-16 19:20:46 +08:00
default:
break;
}
2025-10-17 18:14:44 +08:00
auto pTer = TopologyManager::instance().createTerminal(pParent->id(),terType,"",QPointF(x,y),portId,funType);
if(pTer)
pTer->setPortLocate(locate);
2025-05-16 19:20:46 +08:00
}
}
bool FixedPortsModel::isItemValid(GraphicsProjectModelItem* pItem)
2025-05-09 19:36:32 +08:00
{
ModelProperty* pData = pItem->getProperty();
2025-05-09 19:36:32 +08:00
PowerEntity* pEntity = pItem->entity();
return (pData != nullptr && pEntity != nullptr)?true:false;
}
void FixedPortsModel::insertProjectModelName(QString uuid,QString name)
{
if(!_projectModelName.contains(uuid))
_projectModelName.insert(uuid,name);
}
2025-10-17 18:14:44 +08:00
void FixedPortsModel::showProjectIconSettingDlg(GraphicsProjectModelItem* pItem)
{
if(m_projectIconSettingDlg == nullptr)
{
m_projectIconSettingDlg = new ProjectIconSetting(_widget);
m_projectIconSettingDlg->setController(this);
}
m_projectIconSettingDlg->showDlg(pItem);
}
void FixedPortsModel::updateItemIcon(QString sMeta,QString sModel)
{
for(auto &pItem:_nodeItem){
auto pro = pItem->getProperty();
QString sMe = pro->metaModelName();
QString sMo = pro->modelName();
if(sMeta == sMe && sModel == sMo){
auto pI = dynamic_cast<ElectricSvgItem*>(pItem);
auto pG = dynamic_cast<ElectricSvgGroup*>(pItem);
if(pI){
pI->updateMapSvg(ProjectModelManager::instance().getData()[sMeta][sModel].modelSetting.mapUsedSvg);
}
if(pG){
pG->updateMapSvg(ProjectModelManager::instance().getData()[sMeta][sModel].modelSetting.mapUsedSvg);
}
}
}
}
/*********************baseModel**********************/
QMap<QUuid,GraphicsBaseModelItem*>& FixedPortsModel::allBaseItems()
{
return _baseItem;
}
QVector<Connection> FixedPortsModel::allBaseConnections()
{
QVector<Connection> vec;
for(auto pItem:_baseItem)
{
if(pItem->getItemType() == GIT_baseLine)
{
auto pLine = dynamic_cast<ElectricBaseModelLineItem*>(pItem);
if(pLine)
{
2025-07-11 18:13:54 +08:00
vec.push_back(pLine->getProperty()->getConnection());
}
}
}
return vec;
}
QMap<QUuid,QPointF> FixedPortsModel::allBaseNodePos() const
{
QMap<QUuid,QPointF> map;
for(auto pItem:_baseItem)
{
if(pItem->getItemType() != GIT_baseLine)
map.insert(pItem->itemId(),pItem->pos());
}
return map;
}
2025-06-20 18:09:41 +08:00
bool FixedPortsModel::addBaseItem(QUuid uuid,GraphicsBaseModelItem* pItem)
{
if(_baseItem.contains(uuid))
return false;
else
{
_baseItem.insert(uuid,pItem);
return true;
}
}
2025-09-26 18:50:21 +08:00
BaseModelProperty* FixedPortsModel::addBaseNodeData(QUuid id,int type,QString name,QString metaName,QString bay)
{
BaseModelProperty* pData = BasePropertyManager::instance().findBaseEntityData(id); //已存在不不创建
if(pData != nullptr)
return pData;
BaseModelProperty* item = new BaseModelProperty(this);
if(item)
{
item->setUuid(id);
item->setMetaModelName(metaName);
item->setType(type);
item->setTag(name);
item->setName(name);
2025-09-26 18:50:21 +08:00
if(!bay.isEmpty())
item->setBay(bay);
BasePropertyManager::instance().insertBaseEntityData(id,item);
}
return item;
}
2025-06-20 18:09:41 +08:00
void FixedPortsModel::showProjectModelSettingDlg(GraphicsBaseModelItem* srcItem)
{
if(m_proModelSettingDlg == nullptr)
{
m_proModelSettingDlg = new ProjectModelSetting(_widget);
2025-07-23 17:27:35 +08:00
m_proModelSettingDlg->setController(this);
2025-06-20 18:09:41 +08:00
}
m_proModelSettingDlg->showDlg(srcItem);
}
2025-07-11 18:13:54 +08:00
void FixedPortsModel::generateProjectModel(const QString& sPageName,QList<GraphicsBaseModelItem*> lstItem,QList<GraphicsNonStandardItem*> lstOther)
2025-06-20 18:09:41 +08:00
{
DrawingPanel* pProPanel = nullptr;
if(_cavas){
DiagramInfo info;
info.id = QUuid::createUuid();
info.sName = sPageName;
info.sTag = sPageName;
info.sBasePageName = _pageName;
_cavas->onSignal_createDiagram(info);
pProPanel = _cavas->getPanel(sPageName);
}
2025-11-14 19:31:09 +08:00
for(auto& pBaseItem:lstItem) //先处理连线递归处理连线连接的item
2025-06-20 18:09:41 +08:00
{
2025-06-27 19:17:04 +08:00
BaseModelProperty* pBase = dynamic_cast<BaseModelProperty*>(pBaseItem->getProperty());
2025-07-11 18:13:54 +08:00
if(pBase->type() == 8){ //电缆
2025-10-11 18:51:33 +08:00
//QUuid id = QUuid::createUuid();
QUuid id = pBase->uuid();
2025-07-11 18:13:54 +08:00
BaseProperty* pData = pProPanel->getModelController()->addNodeData(id,pBase->type(),pBase->name(),pBase->modelName());
2025-06-27 19:17:04 +08:00
if(pData)
{
pData->setDataChanged(true); //数据状态改变
addProjectItemByBaseData(pProPanel,pBaseItem,pData);
}
}
2025-07-11 18:13:54 +08:00
}
2025-06-27 19:17:04 +08:00
2025-07-11 18:13:54 +08:00
QList<BaseProperty*> lstProData;
2025-11-14 19:31:09 +08:00
QList<QPair<QString,QUuid>> lstItems;
2025-07-11 18:13:54 +08:00
QMap<QUuid,GraphicsProjectModelItem*> mapItem = pProPanel->getModelController()->allItems(); //根据item获取data
for(auto& item:mapItem){
BaseProperty* pPro = dynamic_cast<BaseProperty*>(item->getProperty());
if(pPro){
lstProData.append(pPro);
2025-11-14 19:31:09 +08:00
lstItems.append(qMakePair(pPro->name(),pPro->uuid()));
}
}
QList<GraphicsBaseItem*> lstBase;
for(auto &pItem:lstItem){
GraphicsBaseItem* p = pItem;
lstBase.append(p);
}
QList<monitorRelationItem> lstFirst;
for(auto& pBaseItem:lstItem) //首次循环添加母线及独立设备(变压器等),更新列表显示使用
{
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:lstOther)
{
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;
auto pPro = getItemByUid(lstBase,subPair.second);
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 updateCurrentItems(lstFirst,true);
QList<monitorRelationItem> lstSecond;
for(auto& pBaseItem:lstItem) //二次循环添加间隔内设备(更新列表显示使用)
{
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:lstOther)
{
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);
2025-07-11 18:13:54 +08:00
}
}
2025-11-14 19:31:09 +08:00
emit updateCurrentItems(lstSecond,false);
2025-07-11 18:13:54 +08:00
for(auto& pOtherItem:lstOther)
2025-06-27 19:17:04 +08:00
{
2025-07-11 18:13:54 +08:00
BayProperty* pBay = dynamic_cast<BayProperty*>(pOtherItem->getProperty());
if(pBay){
BayProperty* pData = pProPanel->getModelController()->generateBayData(pBay,lstProData);
2025-06-27 19:17:04 +08:00
if(pData)
{
2025-11-14 19:31:09 +08:00
pData->setSubList(pBay->getSubList());
2025-07-11 18:13:54 +08:00
pProPanel->getModelController()->addBayByData(pData);
2025-06-27 19:17:04 +08:00
}
}
}
}
2025-11-14 19:31:09 +08:00
void FixedPortsModel::onWizardFinished(QMap<QUuid,GraphicsBaseModelItem*> mapItem,QList<EditBaseItem*> mapBlock)
2025-10-21 18:46:51 +08:00
{
QMap<QUuid,DiagramEditorItemProperty*> mapEditor = BasePropertyManager::instance().getEditorData();
for(auto& pro:mapEditor){
if(BasePropertyManager::instance().findBaseEntityData(pro->uuid()) == nullptr){ //拷贝editor数据到basemodel中
auto pPro = _widget->getModelController()->addBaseNodeData(pro->uuid(),pro->type(),pro->name(),pro->metaModelName(),pro->getBlock());
pPro->setConnection(pro->getConnection());
pPro->setGraphicsType(pro->graphicsType());
}
}
//pPanel->getModelController()->addTestData();
for(auto pItem:mapItem){
auto cloneItem = pItem->clone();
BaseModelProperty* pPro = BasePropertyManager::instance().findBaseEntityData(cloneItem->itemId());
if(pPro){
2025-11-14 19:31:09 +08:00
if(pPro->type() == 1){ //母线
for(auto item:mapBlock){
auto p = item->getBlockData(); //获取blockitem对应的data
if(p->getType() == 1){
DiagramEditorBusBlock* pBus = dynamic_cast<DiagramEditorBusBlock*>(p.data());
if(pBus){
QString sBus = pBus->getName();
if(sBus == pPro->name())
pPro->setSubList(pBus->getSubList()); //将子列表转移到item
}
}
}
}
else if(pPro->type() == 15 || pPro->type() == 16){ //变压器
for(auto item:mapBlock){
auto p = item->getBlockData(); //获取blockitem对应的data
if(p->getType() == 3){
DiagramEditorTransformerBlock* pTrans = dynamic_cast<DiagramEditorTransformerBlock*>(p.data());
if(pTrans){
QString sTrans = pTrans->getName();
if(sTrans == pPro->name())
pPro->setSubList(pTrans->getSubList()); //将子列表转移到item
}
}
}
}
2025-10-21 18:46:51 +08:00
cloneItem->setProperty(pPro);
_scene->addItem(cloneItem);
cloneItem->setPos(pItem->pos());
addBaseItem(cloneItem->itemId(),cloneItem);
pPro->setDataChanged(true);
autoSetModelName(cloneItem);
if(pPro->type() != 8){
PowerEntity* pEntity = TopologyManager::instance().findEntity(pPro->uuid().toString(),ModelFunctionType::BaseModel);
if(pEntity)
cloneItem->setEntity(pEntity);
}
else
{
}
}
}
QList<QGraphicsItem*> items = _scene->items();
if (items.isEmpty()) {
return; // 没有 items 时返回
}
// 计算所有 items 的联合包围盒
QRectF totalBoundingRect;
foreach (QGraphicsItem *item, items) {
totalBoundingRect |= item->sceneBoundingRect();
}
// 计算中心点
QPointF center = totalBoundingRect.center();
//_widget->getView()->centerOn(center);
//**************间隔*************
2025-11-14 19:31:09 +08:00
for(auto item:mapBlock){
2025-10-21 18:46:51 +08:00
auto p = item->getBlockData(); //获取blockitem对应的data
2025-11-14 19:31:09 +08:00
if(p->getType() == 2){
DiagramEditorBayBlock* pBay = dynamic_cast<DiagramEditorBayBlock*>(p.data());
if(pBay){
QString sBay = pBay->getName();
auto bayInfo = pBay->getBayInfo();
auto mapRoute = bayInfo.mapRoute;
auto mapCompo = bayInfo.mapComponent;
QList<DiagramEditorComponentInfo> lstInfo;
for(auto& route:mapRoute){ //获取路线中使用的设备
for(auto& compo:route.lstCompo){
auto info = mapCompo.value(compo.sName);
bool exist = false;
for(auto& inf:lstInfo){
if(inf == info){
exist = true;
break;
}
}
if(!exist){
lstInfo.append(info);
2025-10-21 18:46:51 +08:00
}
}
}
2025-11-14 19:31:09 +08:00
QList<GraphicsBaseItem*> lst;
for(auto &inf:lstInfo){
if(_baseItem.contains(inf.uid))
lst.append(_baseItem.value(inf.uid));
}
QRectF rec = calculateItemsBoundingRect(lst);
ElectricBayItem* pNew = new ElectricBayItem(rec);
pNew->setItemType(GIT_bay);
pNew->setText(sBay);
QString sType;
switch (pBay->getBayType()) {
case BayType::busSectionBay:
sType = QString("分段间隔");
break;
case BayType::busCouplerBay:
sType = QString("母联间隔");
break;
case BayType::ptBay:
sType = QString("PT间隔");
break;
case BayType::incomingBay:
sType = QString("进线间隔");
break;
case BayType::outcomingBay:
sType = QString("出线间隔");
break;
case BayType::compensationBay:
sType = QString("无功补偿间隔");
break;
case BayType::bypassBay:
sType = QString("旁路间隔");
break;
default:
break;
}
QUuid bayId = pBay->getId();
BayProperty* pBayData = addBayData(bayId,ModelFunctionType::BaseModel);
pNew->setProperty(pBayData);
pBayData->setName(sBay);
pBayData->setTag(sBay);
pBayData->setType(sType);
pBayData->setLstFrom(pBay->getBayInfo().lstFrom);
pBayData->setLstTo(pBay->getBayInfo().lstTo);
pBayData->setSubList(pBay->getSubList());
for(auto &info:lstInfo){
pBayData->getLstComponent().append(info.uid);
}
addBayItem(bayId,pNew,ModelFunctionType::BaseModel);
//pModel->addItemsToBay(lst,pNew);
_scene->addItem(pNew);
2025-10-21 18:46:51 +08:00
}
}
}
}
2025-07-11 18:13:54 +08:00
void FixedPortsModel::addProjectItemByBaseData(DrawingPanel* pPanel,GraphicsBaseModelItem* pItem,BaseProperty* pPro)
2025-06-27 19:17:04 +08:00
{
2025-07-11 18:13:54 +08:00
BaseModelProperty* pBase = dynamic_cast<BaseModelProperty*>(pItem->getProperty());
2025-06-27 19:17:04 +08:00
if(pBase){
if(_baseItem.contains(pBase->uuid())){
GraphicsProjectModelItem* pProItem = nullptr;
GraphicsBaseModelItem* pBaseItem = _baseItem.value(pBase->uuid());
2025-07-04 18:47:49 +08:00
pPro->setSourceItemId(pBaseItem->itemId().toString()); //设置被哪个对象生成
2025-07-11 18:13:54 +08:00
pPro->setMetaModelName(pBase->metaModelName()); //传递基模名
pPro->setPath(pBase->getBay());
2025-11-14 19:31:09 +08:00
pPro->setSubList(pBase->getSubList()); //传递sublist
pPro->setBay(pBase->getBay());
2025-10-17 18:14:44 +08:00
QString sMeta = pBase->metaModelName();
QString sModel = pBase->modelName();
2025-06-27 19:17:04 +08:00
int type = pBase->graphicsType();
2025-10-11 18:51:33 +08:00
if(type == GIT_baseNode)
{
auto pNode = new ElectricPortItem();
pProItem = pNode;
pProItem->setItemType(GIT_node);
}
else if(type == GIT_baseBus)
2025-06-27 19:17:04 +08:00
{
2025-07-04 18:47:49 +08:00
QByteArray svg;
if(pBase->getModelProperty().modelSetting.mapSvg.isEmpty()){
svg = DataBase::GetInstance()->ModelType()[1].icon;
}
else{
svg = pBase->getModelProperty().modelSetting.mapSvg.first();
}
2025-10-17 18:14:44 +08:00
ProjectModelManager::instance().getData()[sMeta][sModel].modelSetting.mapUsedSvg["bus"] = svg; //初始化使用的图标
2025-06-27 19:17:04 +08:00
QRectF rec = pBaseItem->boundingRect();
2025-10-11 18:51:33 +08:00
auto pBus = new ElectricSvgItemBus(rec.toRect());
2025-10-17 18:14:44 +08:00
pBus->updateMapSvg(ProjectModelManager::instance().getData()[sMeta][sModel].modelSetting.mapUsedSvg);
2025-07-04 18:47:49 +08:00
pBus->loadSvg(svg);
pProItem = pBus;
2025-06-27 19:17:04 +08:00
pProItem->setItemType(GIT_bus);
}
else if(type == GIT_baseBreaker)
{
2025-07-04 18:47:49 +08:00
QByteArray svg;
if(pBase->getModelProperty().modelSetting.mapSvg.isEmpty()){
svg = DataBase::GetInstance()->ModelType()[3].icon;
}
else{
svg = pBase->getModelProperty().modelSetting.mapSvg.first();
}
2025-10-17 18:14:44 +08:00
ProjectModelManager::instance().getData()[sMeta][sModel].modelSetting.mapUsedSvg["cb"] = svg;
2025-06-27 19:17:04 +08:00
QRectF rec = pBaseItem->boundingRect();
2025-07-04 18:47:49 +08:00
auto pBreaker = new ElectricSvgItemRect(rec.toRect());
2025-10-17 18:14:44 +08:00
pBreaker->updateMapSvg(ProjectModelManager::instance().getData()[sMeta][sModel].modelSetting.mapUsedSvg);
2025-07-04 18:47:49 +08:00
pBreaker->loadSvg(svg);
pProItem = pBreaker;
2025-06-27 19:17:04 +08:00
pProItem->setItemType(GIT_itemRect);
}
2025-10-11 18:51:33 +08:00
else if(type == GIT_baseCT)
{
QByteArray svg;
if(pBase->getModelProperty().modelSetting.mapSvg.isEmpty()){
svg = DataBase::GetInstance()->ModelType()[5].icon;
}
else{
svg = pBase->getModelProperty().modelSetting.mapSvg.first();
}
2025-10-17 18:14:44 +08:00
ProjectModelManager::instance().getData()[sMeta][sModel].modelSetting.mapUsedSvg["ct"] = svg;
ProjectModelManager::instance().getData()[sMeta][sModel].modelSetting.mapUsedSvg["zsct"] = svg;
2025-10-11 18:51:33 +08:00
QRectF rec = pBaseItem->boundingRect();
auto pCtGroup = new ElectricSvgGroupCT(rec.toRect());
2025-10-17 18:14:44 +08:00
pCtGroup->updateMapSvg(ProjectModelManager::instance().getData()[sMeta][sModel].modelSetting.mapUsedSvg);
2025-10-11 18:51:33 +08:00
pCtGroup->setGroupType(1);
pCtGroup->setLayout(1);
pProItem = pCtGroup;
pProItem->setItemType(GIT_ctGroup);
}
2025-10-17 18:14:44 +08:00
else if(type == GIT_basePT)
{
QByteArray svg;
if(pBase->getModelProperty().modelSetting.mapSvg.isEmpty()){
svg = DataBase::GetInstance()->ModelType()[6].icon;
}
else{
svg = pBase->getModelProperty().modelSetting.mapSvg.first();
}
ProjectModelManager::instance().getData()[sMeta][sModel].modelSetting.mapUsedSvg["y"] = svg;
ProjectModelManager::instance().getData()[sMeta][sModel].modelSetting.mapUsedSvg["z"] = svg;
QRectF rec = pBaseItem->boundingRect();
auto pPtGroup = new ElectricSvgGroupPT(rec.toRect());
pPtGroup->updateMapSvg(ProjectModelManager::instance().getData()[sMeta][sModel].modelSetting.mapUsedSvg);
pPtGroup->setGroupType(1);
pPtGroup->setLayout(1);
pProItem = pPtGroup;
pProItem->setItemType(GIT_ptGroup);
2025-10-17 18:14:44 +08:00
}
2025-10-11 18:51:33 +08:00
else if(type == GIT_baseES)
{
QByteArray svg;
if(pBase->getModelProperty().modelSetting.mapSvg.isEmpty()){
svg = DataBase::GetInstance()->ModelType()[8].icon;
}
else{
svg = pBase->getModelProperty().modelSetting.mapSvg.first();
}
2025-10-17 18:14:44 +08:00
ProjectModelManager::instance().getData()[sMeta][sModel].modelSetting.mapUsedSvg["es"] = svg;
2025-10-11 18:51:33 +08:00
QRectF rec = pBaseItem->boundingRect();
auto pEs = new ElectricSvgItemES(rec.toRect());
2025-10-17 18:14:44 +08:00
pEs->updateMapSvg(ProjectModelManager::instance().getData()[sMeta][sModel].modelSetting.mapUsedSvg);
2025-10-11 18:51:33 +08:00
pEs->loadSvg(svg);
pProItem = pEs;
pProItem->setItemType(GIT_ES);
}
else if(type == GIT_baseDS)
{
QByteArray svg;
if(pBase->getModelProperty().modelSetting.mapSvg.isEmpty()){
svg = DataBase::GetInstance()->ModelType()[7].icon;
}
else{
svg = pBase->getModelProperty().modelSetting.mapSvg.first();
}
2025-10-17 18:14:44 +08:00
ProjectModelManager::instance().getData()[sMeta][sModel].modelSetting.mapUsedSvg["ds"] = svg;
2025-10-11 18:51:33 +08:00
QRectF rec = pBaseItem->boundingRect();
auto pDs = new ElectricSvgItemDS(rec.toRect());
pDs->loadSvg(svg);
pProItem = pDs;
pProItem->setItemType(GIT_DS);
}
else if(type == GIT_baseFES)
{
QByteArray svg;
if(pBase->getModelProperty().modelSetting.mapSvg.isEmpty()){
svg = DataBase::GetInstance()->ModelType()[9].icon;
}
else{
svg = pBase->getModelProperty().modelSetting.mapSvg.first();
}
2025-10-17 18:14:44 +08:00
ProjectModelManager::instance().getData()[sMeta][sModel].modelSetting.mapUsedSvg["fes"] = svg;
2025-10-11 18:51:33 +08:00
QRectF rec = pBaseItem->boundingRect();
auto pFes = new ElectricSvgItemFES(rec.toRect());
pFes->loadSvg(svg);
pProItem = pFes;
pProItem->setItemType(GIT_FES);
}
else if(type == GIT_baseDTEDS)
{
QByteArray svg;
if(pBase->getModelProperty().modelSetting.mapSvg.isEmpty()){
svg = DataBase::GetInstance()->ModelType()[10].icon;
}
else{
svg = pBase->getModelProperty().modelSetting.mapSvg.first();
}
2025-10-17 18:14:44 +08:00
ProjectModelManager::instance().getData()[sMeta][sModel].modelSetting.mapUsedSvg["dteds"] = svg;
2025-10-11 18:51:33 +08:00
QRectF rec = pBaseItem->boundingRect();
auto pDteds = new ElectricSvgItemDTEDS(rec.toRect());
pDteds->loadSvg(svg);
pProItem = pDteds;
pProItem->setItemType(GIT_DTEDS);
}
else if(type == GIT_basePI)
{
QByteArray svg;
if(pBase->getModelProperty().modelSetting.mapSvg.isEmpty()){
svg = DataBase::GetInstance()->ModelType()[11].icon;
}
else{
svg = pBase->getModelProperty().modelSetting.mapSvg.first();
}
2025-10-17 18:14:44 +08:00
ProjectModelManager::instance().getData()[sMeta][sModel].modelSetting.mapUsedSvg["potential_indicator"] = svg;
2025-10-11 18:51:33 +08:00
QRectF rec = pBaseItem->boundingRect();
auto pPi = new ElectricSvgItemPI(rec.toRect());
pPi->loadSvg(svg);
pProItem = pPi;
pProItem->setItemType(GIT_PI);
}
else if(type == GIT_baseLightningArrester)
{
QByteArray svg;
if(pBase->getModelProperty().modelSetting.mapSvg.isEmpty()){
svg = DataBase::GetInstance()->ModelType()[12].icon;
}
else{
svg = pBase->getModelProperty().modelSetting.mapSvg.first();
}
2025-10-17 18:14:44 +08:00
ProjectModelManager::instance().getData()[sMeta][sModel].modelSetting.mapUsedSvg["lightning_arrester"] = svg;
2025-10-11 18:51:33 +08:00
QRectF rec = pBaseItem->boundingRect();
auto pLa = new ElectricSvgItemLA(rec.toRect());
pLa->loadSvg(svg);
pProItem = pLa;
pProItem->setItemType(GIT_LA);
}
else if(type == GIT_baseCableTer)
{
QByteArray svg;
if(pBase->getModelProperty().modelSetting.mapSvg.isEmpty()){
svg = DataBase::GetInstance()->ModelType()[13].icon;
}
else{
svg = pBase->getModelProperty().modelSetting.mapSvg.first();
}
2025-10-17 18:14:44 +08:00
ProjectModelManager::instance().getData()[sMeta][sModel].modelSetting.mapUsedSvg["cable_termination"] = svg;
2025-10-11 18:51:33 +08:00
QRectF rec = pBaseItem->boundingRect();
auto pCt = new ElectricSvgItemCableTer(rec.toRect());
pCt->loadSvg(svg);
pProItem = pCt;
pProItem->setItemType(GIT_cableTer);
}
else if(type == GIT_baseCableEnd)
{
QByteArray svg;
if(pBase->getModelProperty().modelSetting.mapSvg.isEmpty()){
svg = DataBase::GetInstance()->ModelType()[14].icon;
}
else{
svg = pBase->getModelProperty().modelSetting.mapSvg.first();
}
2025-10-17 18:14:44 +08:00
ProjectModelManager::instance().getData()[sMeta][sModel].modelSetting.mapUsedSvg["cable_end"] = svg;
2025-10-11 18:51:33 +08:00
QRectF rec = pBaseItem->boundingRect();
auto pCe = new ElectricSvgItemCableEnd(rec.toRect());
pCe->loadSvg(svg);
pProItem = pCe;
pProItem->setItemType(GIT_cableEnd);
}
else if(type == GIT_base2wTransformer)
{
QByteArray svg;
if(pBase->getModelProperty().modelSetting.mapSvg.isEmpty()){
svg = DataBase::GetInstance()->ModelType()[15].icon;
}
else{
svg = pBase->getModelProperty().modelSetting.mapSvg.first();
}
2025-10-17 18:14:44 +08:00
ProjectModelManager::instance().getData()[sMeta][sModel].modelSetting.mapUsedSvg["transformer_2w"] = svg;
2025-10-11 18:51:33 +08:00
QRectF rec = pBaseItem->boundingRect();
auto p2w = new ElectricSvgItem2wTransformer(rec.toRect());
p2w->loadSvg(svg);
pProItem = p2w;
pProItem->setItemType(GIT_2wTransformer);
}
else if(type == GIT_base3wTransformer)
{
QByteArray svg;
if(pBase->getModelProperty().modelSetting.mapSvg.isEmpty()){
svg = DataBase::GetInstance()->ModelType()[16].icon;
}
else{
svg = pBase->getModelProperty().modelSetting.mapSvg.first();
}
2025-10-17 18:14:44 +08:00
ProjectModelManager::instance().getData()[sMeta][sModel].modelSetting.mapUsedSvg["transformer_3w"] = svg;
2025-10-11 18:51:33 +08:00
QRectF rec = pBaseItem->boundingRect();
auto p3w = new ElectricSvgItem3wTransformer(rec.toRect());
p3w->loadSvg(svg);
pProItem = p3w;
pProItem->setItemType(GIT_3wTransformer);
}
2025-07-04 18:47:49 +08:00
else if(type == GIT_baseLine)
2025-06-27 19:17:04 +08:00
{
2025-07-04 18:47:49 +08:00
pProItem = new ElectricConnectLineItem();
pProItem->setItemId(pPro->uuid());
pProItem->setItemType(GIT_link);
pPanel->getScene()->addItem(pProItem);
2025-06-27 19:17:04 +08:00
}
2025-07-04 18:47:49 +08:00
if(pBase->graphicsType() != GIT_baseLine) //非连接线对象
2025-06-27 19:17:04 +08:00
{
2025-10-17 18:14:44 +08:00
if(pProItem){
PowerEntity* pEntity = TopologyManager::instance().createEntity(EntityType::Component,pPro->uuid().toString(),pBase->name());
QList<PowerTerminal*> lstBase = TopologyManager::instance().getTerminalsForEntity(pBase->uuid().toString(),ModelFunctionType::BaseModel); //获取基模的逻辑点
for(auto& baseTer:lstBase)
2025-06-27 19:17:04 +08:00
{
2025-10-17 18:14:44 +08:00
QUuid uid = QUuid::createUuid();
double dPerX = baseTer->getPerX();
double dPerY = baseTer->getPerY();
QPointF pRelaPos = baseTer->relativePosition();
PowerTerminal* proTer = TopologyManager::instance().createTerminal(pEntity->id(),baseTer->type(),"",pRelaPos,uid.toString(),ModelFunctionType::ProjectModel,dPerX,dPerY);
proTer->setGenerateBy(baseTer->id());
if(proTer->type() == TerminalType::PowerConnect)
2025-06-27 19:17:04 +08:00
{
2025-10-17 18:14:44 +08:00
pProItem->addPort(p_movable,proTer->relativePosition(),proTer->id());
ItemPort* pPort = pProItem->getPortById(proTer->id());
pPort->setSourcePortId(baseTer->id());
2025-06-27 19:17:04 +08:00
}
2025-10-17 18:14:44 +08:00
else if(proTer->type() == TerminalType::NewTral){
pProItem->addPort(P_const,proTer->relativePosition(),proTer->id(),T_newTral,PortPos(baseTer->getPortLocate()));
ItemPort* pPort = pProItem->getPortById(proTer->id());
pPort->setSourcePortId(baseTer->id());
2025-06-27 19:17:04 +08:00
}
2025-10-17 18:14:44 +08:00
else if(proTer->type() == TerminalType::PowerInput || proTer->type() == TerminalType::PowerOutput)
2025-06-27 19:17:04 +08:00
{
2025-10-17 18:14:44 +08:00
HandleType typ;
if(proTer->type() == TerminalType::PowerInput){
typ = T_lineIn;
}
else{
typ = T_lineOut;
}
QPointF pos = proTer->relativePosition();
PortPos locate = PortPos(baseTer->getPortLocate());
pProItem->addPort(P_const,pos,proTer->id(),typ,locate,dPerX,dPerY);
ItemPort* pPort = pProItem->getPortById(proTer->id());
pPort->setSourcePortId(baseTer->id());
2025-06-27 19:17:04 +08:00
}
}
2025-06-20 18:09:41 +08:00
2025-10-17 18:14:44 +08:00
pProItem->setItemId(QUuid(pEntity->id()));
pProItem->updateHandles();
pProItem->setPos(pBaseItem->pos());
pPanel->getScene()->addItem(pProItem);
pProItem->setProperty(pPro); //绑定模型
pProItem->updateByProperty(); //使用模型更新自身
2025-11-14 19:31:09 +08:00
2025-10-17 18:14:44 +08:00
pPanel->getModelController()->addNodeItem(QUuid(pEntity->id()),pProItem);
}
2025-07-04 18:47:49 +08:00
}
else //连接线对象
{
PowerConnection* pCon = TopologyManager::instance().connection(pBase->uuid().toString(),ModelFunctionType::BaseModel);
if(pCon){
//基模connect参数
QString baseFromComponentId = pCon->fromComponent();
QString baseToComponentId = pCon->toComponent();
QString baseFromTerId = pCon->fromTerminalId();
QString baseToTerId = pCon->toTerminalId();
QMap<QUuid,BaseProperty*> mapPro = BasePropertyManager::instance().getEntityData();
bool proFromExist = false; //工程模from对象是否生成
bool proToExist = false; //工程模to对象是否生成
QString proFromItemId;
QString proToItemId;
QString proFromTerId;
QString proToTerId;
2025-07-11 18:13:54 +08:00
HandleType proFromType;
PortPos proFromPos;
HandleType proToType;
PortPos proToPos;
2025-07-04 18:47:49 +08:00
for(auto& pPro:mapPro)
{
if(pPro->getSourceItemId() == baseFromComponentId){
proFromExist = true;
proFromItemId = pPro->uuid().toString();
continue;
}
if(pPro->getSourceItemId() == baseToComponentId){
proToExist = true;
proToItemId = pPro->uuid().toString();
continue;
}
}
if(!proFromExist) //工程模from对象未生成
{
2025-11-21 19:22:41 +08:00
QUuid id = QUuid(baseFromComponentId);
GraphicsBaseModelItem* pFromItem = _baseItem.value(id);
//QUuid id = QUuid::createUuid();
2025-07-04 18:47:49 +08:00
BaseProperty* pData = pPanel->getModelController()->addNodeData(id,pFromItem->getProperty()->type(),pFromItem->getProperty()->name(),pFromItem->getProperty()->modelName());
addProjectItemByBaseData(pPanel,pFromItem,pData);
proFromItemId = id.toString();
}
if(!proToExist) //工程模to对象未生成
{
2025-11-21 19:22:41 +08:00
QUuid id = QUuid(baseToComponentId);
GraphicsBaseModelItem* pToItem = _baseItem.value(id);
//QUuid id = QUuid::createUuid();
2025-07-04 18:47:49 +08:00
BaseProperty* pData = pPanel->getModelController()->addNodeData(id,pToItem->getProperty()->type(),pToItem->getProperty()->name(),pToItem->getProperty()->modelName());
addProjectItemByBaseData(pPanel,pToItem,pData);
proToItemId = id.toString();
}
GraphicsProjectModelItem* proFrom = pPanel->getModelController()->nodeItem(QUuid(proFromItemId));
GraphicsProjectModelItem* proTo = pPanel->getModelController()->nodeItem(QUuid(proToItemId));
if(proFrom){
QMap<QString,ItemPort*> mapFrom = proFrom->getPorts();
for(auto& port:mapFrom){
if(port->getSourcePortId() == baseFromTerId){
proFromTerId = port->getId();
2025-07-11 18:13:54 +08:00
proFromType = port->getType();
proFromPos = port->portPos();
2025-07-04 18:47:49 +08:00
auto pLine = dynamic_cast<ElectricConnectLineItem*>(pProItem);
if(pLine)
pLine->setStartPoint(port->scenePos());
}
}
}
if(proTo){
QMap<QString,ItemPort*> mapTo = proTo->getPorts();
for(auto& port:mapTo){
if(port->getSourcePortId() == baseToTerId){
proToTerId = port->getId();
2025-07-11 18:13:54 +08:00
proToType = port->getType();
proToPos = port->portPos();
2025-07-04 18:47:49 +08:00
auto pLine = dynamic_cast<ElectricConnectLineItem*>(pProItem);
if(pLine)
pLine->setEndPoint(port->scenePos());
}
}
}
PowerConnection* pCon = TopologyManager::instance().createConnection(pPro->uuid().toString(),proFromTerId,proToTerId,proFromItemId,proToItemId);
auto pLine = dynamic_cast<ElectricConnectLineItem*>(pProItem);
if(pLine)
pLine->calculatePath();
2025-07-11 18:13:54 +08:00
pPanel->getModelController()->addNodeItem(pBase->uuid(),pProItem);
pProItem->setProperty(pPro);
pPro->setConnection(Connection(QUuid(proFromItemId),QUuid(proFromTerId),proFromType,proFromPos,QUuid(proToItemId),QUuid(proToTerId),proToType,proToPos));
2025-07-04 18:47:49 +08:00
}
2025-06-27 19:17:04 +08:00
}
2025-11-14 19:31:09 +08:00
2025-10-17 18:14:44 +08:00
if(pProItem){
pProItem->setModelName(sModel);
pProItem->setRotation(pItem->rotation());
}
2025-06-20 18:09:41 +08:00
}
}
}
2025-10-21 18:46:51 +08:00
void FixedPortsModel::addBayItem(QUuid id,ModelFunctionType tpe)
2025-07-18 18:26:13 +08:00
{
2025-10-21 18:46:51 +08:00
if(tpe == ModelFunctionType::BaseModel){
QMap<QUuid,BayProperty*> mapData = BasePropertyManager::instance().getBaseBayData(); //加载的图形必定关联component(todo:完善判断条件,如判断拓扑节点)
if(mapData.contains(id))
{
BayProperty* pro = mapData.value(id);
if(pro)
{
addBayByData(pro,tpe);
}
}
}
else if(tpe == ModelFunctionType::ProjectModel)
2025-07-18 18:26:13 +08:00
{
2025-10-21 18:46:51 +08:00
QMap<QUuid,BayProperty*> mapData = BasePropertyManager::instance().getBayData(); //加载的图形必定关联component(todo:完善判断条件,如判断拓扑节点)
if(mapData.contains(id))
2025-07-18 18:26:13 +08:00
{
2025-10-21 18:46:51 +08:00
BayProperty* pro = mapData.value(id);
if(pro)
{
addBayByData(pro);
}
2025-07-18 18:26:13 +08:00
}
}
2025-10-21 18:46:51 +08:00
2025-07-18 18:26:13 +08:00
}
2025-10-21 18:46:51 +08:00
bool FixedPortsModel::addBayItem(QUuid id,ElectricBayItem* pBay,ModelFunctionType typ)
2025-07-11 18:13:54 +08:00
{
2025-10-21 18:46:51 +08:00
if(typ == ModelFunctionType::BaseModel){
if(_baseBayItem.contains(id))
return false;
else
{
_baseBayItem.insert(id,pBay);
return true;
}
2025-07-11 18:13:54 +08:00
}
2025-10-21 18:46:51 +08:00
else if(typ == ModelFunctionType::ProjectModel){
if(_bayItem.contains(id))
return false;
else
{
_bayItem.insert(id,pBay);
return true;
}
}
return false;
2025-07-11 18:13:54 +08:00
}
void FixedPortsModel::addItemsToBay(QList<GraphicsBaseItem*> lstItem,ElectricBayItem* pBay)
{
if(pBay == nullptr)
return;
BayProperty* proBay = dynamic_cast<BayProperty*>(pBay->getProperty());
if(proBay){
for(auto& item:lstItem){
if(item){
ModelProperty* p = item->getProperty();
auto lstCom = proBay->getLstComponent();
if(!lstCom.contains(p->uuid())){
proBay->getLstComponent().append(p->uuid());
}
}
}
}
}
2025-10-21 18:46:51 +08:00
BayProperty* FixedPortsModel::addBayData(QUuid uuid,ModelFunctionType typ)
2025-07-11 18:13:54 +08:00
{
2025-10-21 18:46:51 +08:00
if(typ == ModelFunctionType::BaseModel){
BayProperty* pData = BasePropertyManager::instance().findBaseBayData(uuid); //已存在不不创建
if(pData != nullptr)
return pData;
2025-07-11 18:13:54 +08:00
2025-10-21 18:46:51 +08:00
BayProperty* item = new BayProperty();
2025-07-11 18:13:54 +08:00
2025-10-21 18:46:51 +08:00
if(item)
{
item->setUuid(uuid);
BasePropertyManager::instance().insertBaseBayData(uuid,item);
}
return item;
2025-07-11 18:13:54 +08:00
}
2025-10-21 18:46:51 +08:00
else if(typ == ModelFunctionType::ProjectModel){
BayProperty* pData = BasePropertyManager::instance().findBayData(uuid); //已存在不不创建
if(pData != nullptr)
return pData;
BayProperty* item = new BayProperty();
if(item)
{
item->setUuid(uuid);
BasePropertyManager::instance().insertBayData(uuid,item);
}
return item;
}
return nullptr;
2025-07-11 18:13:54 +08:00
}
QMap<QUuid,ElectricBayItem*>& FixedPortsModel::allBayItem()
{
return _bayItem;
}
BayProperty* FixedPortsModel::generateBayData(BayProperty* pData,QList<BaseProperty*> lst)
{
2025-10-21 18:46:51 +08:00
BayProperty* p = addBayData(pData->uuid());
2025-07-11 18:13:54 +08:00
p->setTag(pData->tag());
p->setName(pData->name());
p->setType(pData->getType());
p->setVoltage(pData->getVoltage());
p->setFla(pData->getFla());
p->setCapacity(pData->getCapacity());
p->setInService(pData->getInService());
QList<QUuid> lstCompo = pData->getLstComponent();
QList<QUuid> lstNewCompo = getCorrespondId(lstCompo,lst); //将基模component替换为工程模component
p->setLstComponent(lstNewCompo);
QList<QUuid> lstFrom = pData->getLstFrom();
QList<QUuid> lstNewFrom = getCorrespondId(lstFrom,lst);
p->setLstFrom(lstNewFrom);
QList<QUuid> lstTo = pData->getLstTo();
QList<QUuid> lstNewTo = getCorrespondId(lstTo,lst);
p->setLstTo(lstNewTo);
QList<QUuid> lstProtect = pData->getLstProtect();
QList<QUuid> lstNewProtect = getCorrespondId(lstProtect,lst);
p->setLstProtect(lstNewProtect);
QList<QUuid> lstFaultRecord = pData->getLstFaultRecord();
QList<QUuid> lstNewFaultRecord = getCorrespondId(lstFaultRecord,lst);
p->setLstFaultRecord(lstNewFaultRecord);
QList<QUuid> lstDynSense = pData->getLstDynSense();
QList<QUuid> lstNewDynSense = getCorrespondId(lstDynSense,lst);
p->setLstDynSense(lstNewDynSense);
QList<QUuid> lstStatus = pData->getLstStatus();
QList<QUuid> lstNewStatus = getCorrespondId(lstStatus,lst);
p->setLstStatus(lstNewStatus);
QList<QUuid> lstInstruct = pData->getLstInstruct();
QList<QUuid> lstNewInstruct = getCorrespondId(lstInstruct,lst);
p->setLstInstruct(lstNewInstruct);
QList<QUuid> lstEtc = pData->getLstEtc();
QList<QUuid> lstNewEtc= getCorrespondId(lstEtc,lst);
p->setLstEtc(lstNewEtc);
return p;
}
QList<QUuid> FixedPortsModel::getCorrespondId(QList<QUuid> lstCompo,QList<BaseProperty*> lst)
{
QList<QUuid> lstNewCompo;
for(auto& uuid:lstCompo)
{
for(auto& basePro:lst)
{
if(basePro->getSourceItemId() == uuid.toString()){ //工程模sourceid等于基模存储的componentid
lstNewCompo.append(basePro->uuid());
break;
}
}
}
return lstNewCompo;
}
QRectF FixedPortsModel::calculateItemsBoundingRect(QList<GraphicsBaseItem*> items)
{
if (items.isEmpty())
return QRectF();
// 初始化矩形为第一个item的场景边界矩形
QRectF boundingRect = items.first()->sceneBoundingRect();
// 遍历剩余item扩展矩形以包含所有item
for (int i = 1; i < items.size(); ++i) {
QGraphicsItem* item = items.at(i);
// 确保item在场景中且有效
if (item && item->scene()) {
boundingRect = boundingRect.united(item->sceneBoundingRect());
}
}
return boundingRect.adjusted(-10,-10,10,10);
}
2025-10-21 18:46:51 +08:00
void FixedPortsModel::addBayByData(BayProperty* pData,ModelFunctionType typ)
2025-07-11 18:13:54 +08:00
{
2025-10-21 18:46:51 +08:00
if(typ == ModelFunctionType::BaseModel){
QList<GraphicsBaseItem*> items;
QList<QUuid> lstCompo = pData->getLstComponent();
for(auto& id:lstCompo){
if(_baseItem.contains(id)){
items.append(_baseItem.value(id));
}
2025-07-11 18:13:54 +08:00
}
2025-10-21 18:46:51 +08:00
QRectF rec = calculateItemsBoundingRect(items);
auto pBay = new ElectricBayItem(rec);
pBay->setItemType(GIT_bay);
pBay->setProperty(pData);
pBay->setText(pData->name());
addBayItem(pData->uuid(),pBay,typ);
getScene()->addItem(pBay);
2025-07-11 18:13:54 +08:00
}
2025-10-21 18:46:51 +08:00
else if(typ == ModelFunctionType::ProjectModel){
QList<GraphicsBaseItem*> items;
QList<QUuid> lstCompo = pData->getLstComponent();
for(auto& id:lstCompo){
if(_nodeItem.contains(id)){
items.append(_nodeItem.value(id));
}
}
2025-07-11 18:13:54 +08:00
2025-10-21 18:46:51 +08:00
QRectF rec = calculateItemsBoundingRect(items);
auto pBay = new ElectricBayItem(rec);
pBay->setItemType(GIT_bay);
pBay->setProperty(pData);
pBay->setText(pData->name());
addBayItem(pData->uuid(),pBay);
getScene()->addItem(pBay);
}
2025-07-11 18:13:54 +08:00
}
2025-06-20 18:09:41 +08:00
void FixedPortsModel::addTestData()
{
QUuid breakerId = QUuid::createUuid();
ElectricBaseModelSvgItem* pBreaker = new ElectricBaseModelSvgItem(QRect(-15, -15, 30, 30));
pBreaker->setItemId(breakerId);
pBreaker->setItemType(GIT_baseBreaker);
QByteArray byte = DataBase::GetInstance()->ModelType()[3].icon;
pBreaker->loadSvg(byte);
PowerEntity* pEntityBreaker = TopologyManager::instance().createEntity(EntityType::Component,breakerId.toString(),"断路器1",ModelFunctionType::BaseModel);
if(pEntityBreaker)
pBreaker->setEntity(pEntityBreaker);
BaseModelProperty* pBreakerData = addBaseNodeData(breakerId,3,"断路器1",DataBase::GetInstance()->ModelType()[3].modelType);
2025-07-04 18:47:49 +08:00
pBreakerData->setGraphicsType(GIT_baseBreaker);
2025-06-20 18:09:41 +08:00
if(pBreakerData)
{
pBreaker->setProperty(pBreakerData);
2025-08-28 10:59:04 +08:00
pBreaker->initialPortsByDatabase(3);
2025-06-27 19:17:04 +08:00
createTopoTerminalsByItem(pBreaker,ModelFunctionType::BaseModel);
2025-06-20 18:09:41 +08:00
pBreakerData->setDataChanged(true); //数据状态改变
}
addBaseItem(breakerId,pBreaker);
_scene->addItem(pBreaker);
pBreaker->setPos(QPointF(0,50));
QUuid busId = QUuid::createUuid();
ElectricBaseModelSvgBus* pBus = new ElectricBaseModelSvgBus(QRect(-200, -3, 400, 6));
pBus->setItemId(busId);
pBus->setItemType(GIT_baseBus);
//pBreaker->initialPortsByDatabase();
QByteArray byte1 = DataBase::GetInstance()->ModelType()[1].icon;
pBus->loadSvg(byte1);
//createTopoTerminalsByItem(pBreaker);
BaseModelProperty* pBusData = addBaseNodeData(busId,1,"母线1",DataBase::GetInstance()->ModelType()[1].modelType);
2025-07-04 18:47:49 +08:00
pBusData->setGraphicsType(GIT_baseBus);
2025-06-20 18:09:41 +08:00
if(pBusData)
{
pBus->setProperty(pBusData);
pBusData->setDataChanged(true); //数据状态改变
}
2025-07-04 18:47:49 +08:00
PowerEntity* pEntityBus = TopologyManager::instance().createEntity(EntityType::Component,busId.toString(),"母线1",ModelFunctionType::BaseModel);
2025-06-20 18:09:41 +08:00
if(pEntityBus)
pBus->setEntity(pEntityBus);
addBaseItem(busId,pBus);
_scene->addItem(pBus);
pBus->setPos(QPointF(0,150));
QUuid lineId = QUuid::createUuid();
ElectricBaseModelLineItem* pLine = new ElectricBaseModelLineItem();
pLine->setItemId(lineId);
pLine->setItemType(GIT_baseLine);
2025-06-27 19:17:04 +08:00
BaseModelProperty* pLineData = addBaseNodeData(lineId,8,"电缆1",DataBase::GetInstance()->ModelType()[4].modelType);
2025-07-04 18:47:49 +08:00
pLineData->setGraphicsType(GIT_baseLine);
2025-06-20 18:09:41 +08:00
if(pLineData)
{
pLine->setProperty(pLineData);
pLineData->setDataChanged(true); //数据状态改变
}
addBaseItem(lineId,pLine);
establishConnection(pBreaker,pBus,pLine,ModelFunctionType::BaseModel);
2025-06-20 18:09:41 +08:00
_scene->addItem(pLine);
2025-07-11 18:13:54 +08:00
QList<GraphicsBaseItem*> lst;
lst.append(pBreaker);
QRectF rec = calculateItemsBoundingRect(lst);
ElectricBayItem* pBay = new ElectricBayItem(rec);
pBay->setItemType(GIT_bay);
pBay->setText("间隔1");
QUuid bayId = QUuid::createUuid();
BayProperty* pBayData = addBayData(bayId);
pBay->setProperty(pBayData);
pBayData->setName("间隔1");
pBayData->setTag("间隔1");
pBayData->getLstComponent().append(breakerId);
addBayItem(bayId,pBay);
addItemsToBay(lst,pBay);
_scene->addItem(pBay);
2025-07-23 17:27:35 +08:00
QString s = pageName();
int a = 1;
2025-06-20 18:09:41 +08:00
}
2025-07-18 18:26:13 +08:00
QJsonObject FixedPortsModel::turnListToJson(QList<QUuid> lst,QString sInerTag,QString sOutTag)
{
QJsonObject o;
QJsonArray arr;
if(lst.isEmpty())
return QJsonObject();
for(auto id:lst)
{
QJsonObject obj;
obj[sInerTag] = id.toString();
arr.push_back(obj);
}
o[sOutTag] = arr;
return o;
}
QList<QUuid> FixedPortsModel::turnJsonArrToList(QJsonObject object,QString sInner,QString sOut)
{
QJsonArray jsonArray = object[sOut].toArray();
QList<QUuid> lst;
for (QJsonValueRef nodeJson : jsonArray)
{
QJsonObject node = nodeJson.toObject();
QUuid uid = QUuid(node[sInner].toString());
lst.append(uid);
}
return lst;
}
2025-11-21 19:22:41 +08:00
void FixedPortsModel::generateMonitor(QString sPage,QList<monitorRelationItem> lst)
2025-11-14 19:31:09 +08:00
{
MonitorPanel* pPanel = nullptr;
if(_cavas){
DiagramInfo info;
info.id = QUuid::createUuid();
info.sName = sPage;
info.sTag = sPage;
info.sBasePageName = _pageName;
info.parentId = _pEntity->id();
_cavas->onSignal_createDiagram(info,DiagramMode::DM_run);
pPanel = _cavas->getMonitorPanel(sPage);
2025-11-21 19:22:41 +08:00
QList<monitorRelationItem> lstFirst;
for(auto& itemInfo:lst)
2025-11-14 19:31:09 +08:00
{
2025-11-21 19:22:41 +08:00
if(itemInfo.item.nCategory == 0){ //设备
if(_nodeItem.contains(itemInfo.item.uid)){
auto pItem = _nodeItem.value(itemInfo.item.uid);
BaseProperty* pPro = dynamic_cast<BaseProperty*>(pItem->getProperty());
if(pPro){
auto pNewItem = pItem->clone();
if(pPro->type() == 8){
auto pLine = dynamic_cast<ElectricConnectLineItem*>(pNewItem);
if(pLine)
pLine->calculatePath();
}
else{
pNewItem->updateItem();
}
if(pNewItem && pPanel){
pNewItem->setProperty(pPro);
pNewItem->updateHandles();
pNewItem->updateByProperty(); //使用模型更新自身
pPanel->getModelController()->addNodeItem(pPro->uuid(),pNewItem);
pPanel->getScene()->addItem(pNewItem); //绑定模型
}
2025-11-14 19:31:09 +08:00
}
2025-11-21 19:22:41 +08:00
if(itemInfo.item.nEquipType == 1 || itemInfo.item.nEquipType == 15 || itemInfo.item.nEquipType == 16){ //先添加母线及独立设备
2025-11-14 19:31:09 +08:00
2025-11-21 19:22:41 +08:00
lstFirst.append(itemInfo);
2025-11-14 19:31:09 +08:00
}
}
}
}
2025-11-21 19:22:41 +08:00
QList<monitorRelationItem> lstSecond;
for(auto& itemInfo:lst) //第二次循环处理间隔
{
if(itemInfo.item.nCategory == 1){ //间隔
if(_bayItem.contains(itemInfo.item.uid)){
auto pBay = _bayItem.value(itemInfo.item.uid);
BayProperty* pPro = dynamic_cast<BayProperty*>(pBay->getProperty());
if(pPro){
pPanel->getModelController()->addBayByData(pPro);
}
}
}
else{
if(itemInfo.item.nEquipType != 1 && itemInfo.item.nEquipType != 15 && itemInfo.item.nEquipType != 16){
lstSecond.append(itemInfo);
}
2025-11-14 19:31:09 +08:00
}
}
2025-11-21 19:22:41 +08:00
if(pPanel){
if (!pPanel->getScene()->items().isEmpty()) {
QRectF itemsRect = pPanel->getScene()->itemsBoundingRect();
itemsRect.adjust(-100, -100, 100, 100);
auto map = _cavas->getMapMonitor();
if(map.contains(sPage)){
auto pSubWin = map.value(sPage).second;
pSubWin->resize(itemsRect.width(),itemsRect.height());
}
//pPanel->getScene()->setSceneRect(itemsRect);
pPanel->getView()->fitInView(itemsRect, Qt::KeepAspectRatio);
}
2025-12-01 20:29:36 +08:00
emit pPanel->getModelController()->monitorCreated(_pageName,qMakePair(sPage,info.id.toUuid()));
emit pPanel->getModelController()->monitorItems(lst);
generateMonitorConfig(pPanel);
2025-11-21 19:22:41 +08:00
2025-12-01 20:29:36 +08:00
pPanel->updateSelectedItems(lstFirst,true); //直接生成监控tree
pPanel->updateSelectedItems(lstSecond,false);
2025-11-21 19:22:41 +08:00
2025-12-01 20:29:36 +08:00
pPanel->initDisplayState();
pPanel->initDisplaySetting();
}
2025-11-21 19:22:41 +08:00
}
}
void FixedPortsModel::generateMonitorConfig(MonitorPanel* pPanel)
{
auto itemData = DataManager::instance().modelData();
auto itemState = DataManager::instance().modelState();
for(auto& pItem:_nodeItem){
2025-11-24 10:20:37 +08:00
auto pBasePro = pItem->getProperty();
auto pPro = dynamic_cast<BaseProperty*>(pBasePro);
2025-11-21 19:22:41 +08:00
if(pPro){
QString sModel = pPro->modelName();
QUuid uid = pPro->uuid();
2025-11-24 10:20:37 +08:00
QList<monitorItemAttributeInfo> lstInfo;
if(itemState.contains(sModel)){ //动态表字段数据使用modelState初始化(兼容无值情况)
2025-11-21 19:22:41 +08:00
auto mapData = itemState.value(sModel).groupInfo;
for(auto iter = mapData.begin();iter != mapData.end();++iter){
if(iter.value().isPublic == true) //公共属性组暂不显示
continue;
for(auto& attr: iter.value().info){
monitorItemAttributeInfo info;
info.sGroup = iter.key();
info.sTag = attr.name; //***暂时使用相同 051121 by
info.sName = attr.name;
2025-11-24 10:20:37 +08:00
info.nConnectType = 0;
2025-11-21 19:22:41 +08:00
lstInfo.append(info);
}
}
}
2025-11-24 10:20:37 +08:00
if(itemData.contains(sModel)){ //量测数据使用modelData初始化
2025-11-21 19:22:41 +08:00
auto mapData = itemData.value(sModel).groupInfo;
2025-11-24 10:20:37 +08:00
for(auto iter = mapData.begin();iter != mapData.end();iter++){ //遍历所有属性组
if(iter.key() == "bay"){ //量测数据放到间隔组
auto mapMeasure = pPro->getMeasurement();
for(auto it = mapMeasure.begin(); it != mapMeasure.end();++it){
2025-11-21 19:22:41 +08:00
monitorItemAttributeInfo info;
info.sGroup = iter.key();
2025-11-25 20:29:32 +08:00
info.sTag = it->name;
info.sName = it->tag;
2025-11-24 10:20:37 +08:00
info.nConnectType = 1;
2025-11-21 19:22:41 +08:00
lstInfo.append(info);
}
}
2025-11-24 10:20:37 +08:00
}
}
if(!lstInfo.isEmpty()){
2025-11-21 19:22:41 +08:00
if(!pPanel->getModelController()->getMonitorPara().contains(uid)){
pPanel->getModelController()->getMonitorPara().insert(uid,lstInfo);
}
}
}
2025-11-14 19:31:09 +08:00
}
}
2025-11-25 20:29:32 +08:00
void FixedPortsModel::monitorItemSelected(QUuid uid)
{
auto pMonitor = dynamic_cast<MonitorPanel*>(_widget);
if(pMonitor){
pMonitor->itemSelected(uid);
}
}
void FixedPortsModel::monitorItemDetailAttr(QUuid uid)
{
auto pMonitor = dynamic_cast<MonitorPanel*>(_widget);
if(pMonitor){
pMonitor->detailItemSelected(uid);
}
}
2025-11-26 20:33:13 +08:00
void FixedPortsModel::monitorItemSet(QUuid uid)
{
if(_nodeItem.contains(uid)){
//QList<QString> lstRemove; //需要从item移除的动态数据
QList<QString> lstAdd; //需要向item添加的动态数据
auto pItem = _nodeItem.value(uid);
auto lst = m_monitorPara.value(uid);
//auto mapText = pItem->getDynamicText();
/*for(auto iter = mapText.begin();iter != mapText.end();++iter){
bool exist = false;
for(auto& info:lst){
if(info.sTag == iter.key()){ //新旧队列都存在
exist = true;
}
}
if(!exist)
lstRemove.append(iter.key());
}*/
for(auto& info:lst){
if(info.bShowDiagram && info.bSelected){
lstAdd.append(info.sTag);
}
}
/*for(auto& str:lstRemove){
pItem->removeDynamicText(str);
}*/
pItem->removeAllDynamicText();
for(auto& str:lstAdd){
for(auto& info:lst){
if(info.sTag == str){
pItem->addDynamicText(info.sTag,info.sConnectPara);
continue;
}
}
}
}
}
2025-12-01 20:29:36 +08:00
void FixedPortsModel::updateMonitorDisplay()
{
for(auto& pItem:_nodeItem){
auto pPro = pItem->getProperty();
if(pPro){
QString sMeta = pPro->metaModelName();
for(auto iter = m_monitorDisplaySetting.begin();iter != m_monitorDisplaySetting.end();++iter){
if(iter.key().sTag == sMeta){
pItem->setMonitorDisplayInfo(iter.value());
break;
}
}
}
}
2025-12-01 20:29:36 +08:00
}