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/electricSvgItemTriangle.h"
|
|
|
|
|
|
#include "graphicsItem/electricConnectLineItem.h"
|
2025-06-13 19:00:05 +08:00
|
|
|
|
#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-02-06 16:36:50 +08:00
|
|
|
|
#include "graphicsItem/itemPort.h"
|
|
|
|
|
|
#include "designerScene.h"
|
|
|
|
|
|
#include "dataBase.h"
|
|
|
|
|
|
#include "httpInterface.h"
|
|
|
|
|
|
#include "drawingPanel.h"
|
2025-04-03 18:33:10 +08:00
|
|
|
|
#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>
|
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"
|
|
|
|
|
|
#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-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);
|
|
|
|
|
|
|
2025-04-03 18:33:10 +08:00
|
|
|
|
_modelStateInfo = DataManager::instance().modelState();
|
2025-04-09 16:20:34 +08:00
|
|
|
|
_modelDataInfo = DataManager::instance().modelData();
|
2025-04-03 18:33:10 +08:00
|
|
|
|
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()
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
QMap<QUuid,QPointF> FixedPortsModel::allNodePos() const
|
|
|
|
|
|
{
|
|
|
|
|
|
QMap<QUuid,QPointF> map;
|
|
|
|
|
|
for(auto pItem:_nodeItem)
|
|
|
|
|
|
{
|
|
|
|
|
|
if(pItem->getItemType() != GIT_link)
|
|
|
|
|
|
map.insert(pItem->itemId(),pItem->pos());
|
|
|
|
|
|
}
|
|
|
|
|
|
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;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-06-13 19:00:05 +08:00
|
|
|
|
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);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-06-13 19:00:05 +08:00
|
|
|
|
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);
|
2025-06-13 19:00:05 +08:00
|
|
|
|
connect(pItem,&GraphicsProjectModelItem::ifExist,this,&FixedPortsModel::onSignal_ifExits);
|
2025-02-06 16:36:50 +08:00
|
|
|
|
return true;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void FixedPortsModel::addNodeItem(QUuid id/*,int type*/,QPointF pos)
|
|
|
|
|
|
{
|
2025-05-16 19:20:46 +08:00
|
|
|
|
//todo:load图形时必有拓扑实体,关联到对应的entity
|
2025-02-06 16:36:50 +08:00
|
|
|
|
BaseProperty* pro = nullptr;
|
2025-06-13 19:00:05 +08:00
|
|
|
|
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) //连线对象外部处理
|
|
|
|
|
|
return;
|
|
|
|
|
|
QString sMeta = pro->metaModelName();
|
|
|
|
|
|
QString sProModel = pro->modelName();
|
2025-02-06 16:36:50 +08:00
|
|
|
|
if(type == GIT_itemTri)
|
|
|
|
|
|
{
|
|
|
|
|
|
item = new ElectricSvgItemTriangle(QRect(-15, -15, 30, 30));
|
|
|
|
|
|
item->setItemType(GIT_itemTri);
|
|
|
|
|
|
}
|
|
|
|
|
|
else if(type == GIT_itemRect)
|
|
|
|
|
|
{
|
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{
|
|
|
|
|
|
svg = model.modelSetting.mapSvg.first();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
auto pCb = new ElectricSvgItemRect(QRect(-15, -15, 30, 30),false);
|
|
|
|
|
|
pCb->setItemType(GIT_itemRect);
|
|
|
|
|
|
pCb->loadSvg(svg);
|
|
|
|
|
|
item = pCb;
|
2025-05-16 19:20:46 +08:00
|
|
|
|
QJsonArray portArr = pro->context()["port"].toArray();
|
|
|
|
|
|
for(QJsonValueRef portJson:portArr)
|
|
|
|
|
|
{
|
|
|
|
|
|
QJsonObject portObj = portJson.toObject();
|
|
|
|
|
|
QString portId = portObj["portId"].toString();
|
|
|
|
|
|
int x = portObj["x"].toInt();
|
|
|
|
|
|
int y = portObj["y"].toInt();
|
|
|
|
|
|
HandleType tye = HandleType(portObj["portType"].toInt());
|
|
|
|
|
|
PortPos locate = PortPos(portObj["locate"].toInt());
|
|
|
|
|
|
item->addPort(P_const,QPointF(x,y),portId,tye,locate);
|
|
|
|
|
|
}
|
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{
|
|
|
|
|
|
svg = model.modelSetting.mapSvg.first();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
auto pBus = new ElectricSvgItemBus(QRect(-100, -3, 200, 6));
|
|
|
|
|
|
pBus->setItemType(GIT_bus);
|
|
|
|
|
|
pBus->loadSvg(svg);
|
|
|
|
|
|
item = pBus;
|
2025-02-06 16:36:50 +08:00
|
|
|
|
|
|
|
|
|
|
QJsonArray portArr = pro->context()["port"].toArray();
|
|
|
|
|
|
for(QJsonValueRef portJson:portArr)
|
|
|
|
|
|
{
|
|
|
|
|
|
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-02-06 16:36:50 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
if(item)
|
|
|
|
|
|
{
|
|
|
|
|
|
item->setItemId(id);
|
|
|
|
|
|
item->editShape(0, pos);
|
|
|
|
|
|
item->setPos(pos);
|
|
|
|
|
|
//item->setSelected(true);
|
|
|
|
|
|
_scene->addItem(item);
|
|
|
|
|
|
item->addPoint(pos);
|
|
|
|
|
|
item->setProperty(pro); //绑定模型
|
|
|
|
|
|
item->updateByProperty(); //使用模型更新自身
|
2025-06-13 19:00:05 +08:00
|
|
|
|
QString sModel = _projectModelName.value(id.toString());
|
|
|
|
|
|
item->setModelName(sModel);
|
2025-02-06 16:36:50 +08:00
|
|
|
|
_nodeItem.insert(id,item);
|
2025-06-13 19:00:05 +08:00
|
|
|
|
connect(item,&GraphicsProjectModelItem::ifExist,this,&FixedPortsModel::onSignal_ifExits);
|
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)
|
|
|
|
|
|
{
|
2025-03-28 18:08:21 +08:00
|
|
|
|
BaseProperty* pData = addNodeData(info.uuid,info.type,info.name,info.modelName);
|
2025-02-06 16:36:50 +08:00
|
|
|
|
pData->setTag(info.tag);
|
|
|
|
|
|
pData->setName(info.name);
|
|
|
|
|
|
pData->setPath(info.nspath);
|
|
|
|
|
|
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);
|
|
|
|
|
|
pData->setDataChanged(false);
|
|
|
|
|
|
|
2025-07-11 18:13:54 +08:00
|
|
|
|
QString sMeta = info.context["metaModel"].toString();
|
|
|
|
|
|
pData->setMetaModelName(sMeta);
|
|
|
|
|
|
|
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)
|
|
|
|
|
|
{
|
|
|
|
|
|
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)
|
|
|
|
|
|
{
|
|
|
|
|
|
BayProperty* pBay = addBayData(bay.uuid);
|
|
|
|
|
|
pBay->setName(bay.name);
|
|
|
|
|
|
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-07-11 18:13:54 +08:00
|
|
|
|
void FixedPortsModel::addConnectLline(QUuid lineId,QUuid srcId,QUuid destId,QUuid srcPort,QUuid destPort)
|
2025-02-06 16:36:50 +08:00
|
|
|
|
{
|
2025-06-13 19:00:05 +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);
|
|
|
|
|
|
if(src && dest)
|
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-02-06 16:36:50 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-06-13 19:00:05 +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;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
QVariant FixedPortsModel::nodeData(QUuid nodeId, NodeRole role) const
|
|
|
|
|
|
{
|
|
|
|
|
|
QVariant result;
|
|
|
|
|
|
switch(role)
|
|
|
|
|
|
{
|
|
|
|
|
|
case NodeRole::Position:
|
|
|
|
|
|
result = _nodeItem[nodeId]->pos();
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/*auto it = _models.find(nodeId);
|
|
|
|
|
|
if (it == _models.end())
|
|
|
|
|
|
return result;
|
|
|
|
|
|
|
|
|
|
|
|
auto &model = *it;
|
|
|
|
|
|
|
|
|
|
|
|
switch (role) {
|
|
|
|
|
|
case NodeRole::Type:
|
|
|
|
|
|
result = model->name();
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case NodeRole::Position:
|
|
|
|
|
|
result = _nodeGeometryData[nodeId].pos;
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case NodeRole::Size:
|
|
|
|
|
|
result = _nodeGeometryData[nodeId].size;
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case NodeRole::CaptionVisible:
|
|
|
|
|
|
result = model->captionVisible();
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case NodeRole::Caption:
|
|
|
|
|
|
result = model->caption();
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case NodeRole::Style: {
|
|
|
|
|
|
//auto style = StyleCollection::nodeStyle();
|
|
|
|
|
|
//result = style.toJson().toVariantMap();
|
|
|
|
|
|
} break;
|
|
|
|
|
|
|
|
|
|
|
|
case NodeRole::InternalData: {
|
|
|
|
|
|
QJsonObject nodeJson;
|
|
|
|
|
|
|
|
|
|
|
|
//nodeJson["internal-data"] = _models[nodeId]->save();
|
|
|
|
|
|
|
|
|
|
|
|
result = nodeJson.toVariantMap();
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
case NodeRole::InPortCount:
|
|
|
|
|
|
result = model->nPorts(PortType::In);
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case NodeRole::OutPortCount:
|
|
|
|
|
|
result = model->nPorts(PortType::Out);
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case NodeRole::Widget: {
|
|
|
|
|
|
auto w = model->embeddedWidget();
|
|
|
|
|
|
result = QVariant::fromValue(w);
|
|
|
|
|
|
} break;
|
|
|
|
|
|
}*/
|
|
|
|
|
|
|
|
|
|
|
|
return result;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-05-16 19:20:46 +08:00
|
|
|
|
/*QJsonObject FixedPortsModel::saveNode(QUuid const nodeId) const
|
2025-02-06 16:36:50 +08:00
|
|
|
|
{
|
|
|
|
|
|
QJsonObject nodeJson;
|
|
|
|
|
|
|
|
|
|
|
|
nodeJson["id"] = nodeId.toString();
|
|
|
|
|
|
|
|
|
|
|
|
nodeJson["type"] = _nodeItem[nodeId]->getItemType();
|
|
|
|
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
QPointF const pos = nodeData(nodeId, NodeRole::Position).value<QPointF>();
|
|
|
|
|
|
|
|
|
|
|
|
QJsonObject posJson;
|
|
|
|
|
|
posJson["x"] = pos.x();
|
|
|
|
|
|
posJson["y"] = pos.y();
|
|
|
|
|
|
nodeJson["position"] = posJson;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return nodeJson;
|
2025-05-16 19:20:46 +08:00
|
|
|
|
}*/
|
2025-02-06 16:36:50 +08:00
|
|
|
|
|
|
|
|
|
|
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());
|
|
|
|
|
|
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(),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());
|
|
|
|
|
|
}
|
|
|
|
|
|
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(),pBay->getVoltage(),pBay->getFla(),pBay->getCapacity(),"",pBay->getInService(),0,QJsonObject(),objFrom,objTo,objProtec,objFalRec,objStatus,objDynSen,objIns,objEtc,pBay->getLstComponent());
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
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) //已存在更新
|
|
|
|
|
|
{
|
|
|
|
|
|
DataBase::GetInstance()->updateComponent(pData->uuid(),pData->tag(),pData->name(),pData->context());
|
|
|
|
|
|
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
|
|
|
|
{
|
2025-07-11 18:13:54 +08:00
|
|
|
|
DataBase::GetInstance()->insertComponent(pData->uuid(),pData->modelName(),pData->path(),pData->tag(),pData->name(),pData->description(),pData->grid(),pData->zone(),pData->station(),pData->type(),true,pData->state(),pData->status(),pData->connectedBus(),pData->label(),pData->context(),1);
|
|
|
|
|
|
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 = 0; //todo:建立类型映射表
|
|
|
|
|
|
if(info.type == "遥测"){
|
|
|
|
|
|
tpe = 0;
|
|
|
|
|
|
}
|
|
|
|
|
|
else if(info.type == "遥信"){
|
|
|
|
|
|
tpe = 1;
|
|
|
|
|
|
}
|
|
|
|
|
|
else if(info.type == "遥控"){
|
|
|
|
|
|
tpe = 2;
|
|
|
|
|
|
}
|
|
|
|
|
|
else if(info.type == "遥调"){
|
|
|
|
|
|
tpe = 3;
|
|
|
|
|
|
}
|
|
|
|
|
|
else if(info.type == "整定值"){
|
|
|
|
|
|
tpe = 4;
|
|
|
|
|
|
}
|
|
|
|
|
|
QJsonObject obj;
|
|
|
|
|
|
obj["type"] = info.equipment;
|
|
|
|
|
|
obj["main_pos"] = info.channel;
|
|
|
|
|
|
bool val = DataBase::GetInstance()->ifMeasureExist(info.name,pData->uuid());
|
|
|
|
|
|
if(val){
|
|
|
|
|
|
DataBase::GetInstance()->updateMeasurement(info.name,tpe,obj,info.size,pData->uuid());
|
|
|
|
|
|
}
|
|
|
|
|
|
else{
|
|
|
|
|
|
DataBase::GetInstance()->insertMeasurement(info.name,info.tag,tpe,obj,info.size,info.bayUuid,info.componentUuid);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
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
|
|
|
|
}
|
|
|
|
|
|
|
2025-06-13 19:00:05 +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匹配数据
|
2025-04-03 18:33:10 +08:00
|
|
|
|
/*auto p = dynamic_cast<ElectricSvgItemRect_Property*>(pro);
|
2025-02-06 16:36:50 +08:00
|
|
|
|
if(p)
|
|
|
|
|
|
{
|
|
|
|
|
|
p->notifyUpdate(); //通知更新
|
2025-04-03 18:33:10 +08:00
|
|
|
|
}*/
|
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){
|
|
|
|
|
|
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;
|
|
|
|
|
|
for(auto& item:_bayItem)
|
|
|
|
|
|
{
|
|
|
|
|
|
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();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
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
|
|
|
|
|
|
{
|
2025-06-13 19:00:05 +08:00
|
|
|
|
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;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-06-20 18:09:41 +08:00
|
|
|
|
template<typename TypeLine> void FixedPortsModel::establishConnection(GraphicsBaseItem* pSrc,GraphicsBaseItem* pDest,TypeLine* pItem)
|
|
|
|
|
|
{
|
|
|
|
|
|
ItemPort* pSrcPort = nullptr;
|
|
|
|
|
|
ItemPort* pDestPort = nullptr;
|
|
|
|
|
|
if(pSrc->getItemType() == GIT_baseBus)
|
|
|
|
|
|
{
|
|
|
|
|
|
int index = pSrc->addPort(p_movable,pSrc->mapFromScene(calculateBusPortPos(pSrc,pDest)));
|
|
|
|
|
|
createTopoTerminalsByItem(pSrc,ModelFunctionType::BaseModel);
|
|
|
|
|
|
pSrcPort = pSrc->getPortPtr(index);
|
|
|
|
|
|
|
|
|
|
|
|
QMap<QString,ItemPort*> mapPorts = pDest->getPorts();
|
|
|
|
|
|
|
|
|
|
|
|
for(auto& port:mapPorts)
|
|
|
|
|
|
{
|
|
|
|
|
|
if(port->getType() == T_lineIn)
|
|
|
|
|
|
{
|
|
|
|
|
|
pDestPort = port;
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
else if(pDest->getItemType() == GIT_baseBus)
|
|
|
|
|
|
{
|
|
|
|
|
|
int index = pDest->addPort(p_movable,pDest->mapFromScene(calculateBusPortPos(pDest,pSrc)));
|
|
|
|
|
|
createTopoTerminalsByItem(pDest,ModelFunctionType::BaseModel);
|
|
|
|
|
|
pDestPort = pDest->getPortPtr(index);
|
|
|
|
|
|
|
|
|
|
|
|
QMap<QString,ItemPort*> mapPorts = pSrc->getPorts();
|
|
|
|
|
|
|
|
|
|
|
|
for(auto& port:mapPorts)
|
|
|
|
|
|
{
|
|
|
|
|
|
if(port->getType() == T_lineOut)
|
|
|
|
|
|
{
|
|
|
|
|
|
pSrcPort = port;
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
QMap<QString,ItemPort*> mapSrc = pSrc->getPorts();
|
|
|
|
|
|
pSrcPort = nullptr;
|
|
|
|
|
|
for(auto& port:mapSrc)
|
|
|
|
|
|
{
|
|
|
|
|
|
if(port->getType() == T_lineOut)
|
|
|
|
|
|
{
|
|
|
|
|
|
pSrcPort = port;
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
QMap<QString,ItemPort*> mapDest = pDest->getPorts();
|
|
|
|
|
|
pDestPort = nullptr;
|
|
|
|
|
|
for(auto& port:mapDest)
|
|
|
|
|
|
{
|
|
|
|
|
|
if(port->getType() == T_lineIn)
|
|
|
|
|
|
{
|
|
|
|
|
|
pDestPort = port;
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
if(pSrcPort && pDestPort)
|
|
|
|
|
|
{
|
|
|
|
|
|
QPointF srcPortPos = pSrcPort->scenePos();
|
|
|
|
|
|
QPointF destPortPos = pDestPort->scenePos();
|
|
|
|
|
|
pItem->setStartPoint(srcPortPos);
|
|
|
|
|
|
pItem->setEndPoint(destPortPos);
|
|
|
|
|
|
pItem->calculatePath();
|
|
|
|
|
|
|
|
|
|
|
|
PowerConnection* pCon = TopologyManager::instance().createConnection(pItem->itemId().toString(),pSrcPort->getId(),pDestPort->getId(),pSrc->itemId().toString(),pDest->itemId().toString(),ModelFunctionType::BaseModel); //创建拓扑连接(逻辑)
|
|
|
|
|
|
if(pCon)
|
|
|
|
|
|
pCon->setState(DataState::changed);
|
2025-07-11 18:13:54 +08:00
|
|
|
|
pItem->getProperty()->setConnection(Connection(pSrc->itemId(),QUuid(pSrcPort->getId()),pSrcPort->getType(),pSrcPort->portPos(),pDest->itemId(),QUuid(pDestPort->getId()),pDestPort->getType(),pDestPort->portPos()));
|
2025-06-20 18:09:41 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
QPointF FixedPortsModel::calculateBusPortPos(GraphicsBaseItem* pBus,GraphicsBaseItem* item)
|
|
|
|
|
|
{
|
|
|
|
|
|
return QPointF(item->pos().x(),pBus->pos().y());
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-06-13 19:00:05 +08:00
|
|
|
|
void FixedPortsModel::showModelDlg(const QString& sName,QUuid uuid,GraphicsProjectModelItem* pItem)
|
2025-03-28 18:08:21 +08:00
|
|
|
|
{
|
2025-04-03 18:33:10 +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
|
|
|
|
}
|
2025-04-03 18:33:10 +08:00
|
|
|
|
else
|
|
|
|
|
|
qDebug()<<"showModelDlg err";
|
2025-03-28 18:08:21 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2025-04-03 18:33:10 +08:00
|
|
|
|
void FixedPortsModel::initialPropertyDlg()
|
2025-03-28 18:08:21 +08:00
|
|
|
|
{
|
2025-04-03 18:33:10 +08:00
|
|
|
|
for(auto &modelInfo:_modelStateInfo)
|
2025-03-28 18:08:21 +08:00
|
|
|
|
{
|
2025-04-03 18:33:10 +08:00
|
|
|
|
if(modelInfo._PropertyDlg == NULL)
|
2025-03-28 18:08:21 +08:00
|
|
|
|
{
|
2025-04-03 18:33:10 +08:00
|
|
|
|
generatePropertyDlg(modelInfo.modelName);
|
2025-03-28 18:08:21 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-04-03 18:33:10 +08:00
|
|
|
|
void FixedPortsModel::generatePropertyDlg(const QString& sModel)
|
2025-03-28 18:08:21 +08:00
|
|
|
|
{
|
2025-04-03 18:33:10 +08:00
|
|
|
|
modelStateInfo info = _modelStateInfo[sModel];
|
|
|
|
|
|
if(info._PropertyDlg == NULL)
|
2025-03-28 18:08:21 +08:00
|
|
|
|
{
|
2025-04-03 18:33:10 +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);
|
2025-04-03 18:33:10 +08:00
|
|
|
|
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::createTopoTerminalsByItem(GraphicsBaseItem* pItem,ModelFunctionType funType)
|
2025-05-09 19:36:32 +08:00
|
|
|
|
{
|
|
|
|
|
|
PowerEntity* pEntity = pItem->entity();
|
|
|
|
|
|
|
|
|
|
|
|
if(pEntity)
|
|
|
|
|
|
{
|
2025-05-16 19:20:46 +08:00
|
|
|
|
QMap<QString,ItemPort*> mapPorts = pItem->getPorts(); //创建实体port对应的拓扑port
|
2025-05-09 19:36:32 +08:00
|
|
|
|
for(auto &port:mapPorts)
|
|
|
|
|
|
{
|
|
|
|
|
|
TerminalType terType;
|
|
|
|
|
|
|
|
|
|
|
|
HandleType tpe = port->getType();
|
|
|
|
|
|
switch (tpe) {
|
|
|
|
|
|
case T_lineIn:
|
|
|
|
|
|
terType = TerminalType::PowerInput;
|
|
|
|
|
|
break;
|
|
|
|
|
|
case T_lineOut:
|
|
|
|
|
|
terType = TerminalType::PowerOutput;
|
|
|
|
|
|
break;
|
|
|
|
|
|
case T_lineInOut:
|
|
|
|
|
|
terType = TerminalType::PowerConnect;
|
|
|
|
|
|
break;
|
|
|
|
|
|
default:
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
2025-06-27 19:17:04 +08:00
|
|
|
|
QPointF f = port->pos();
|
2025-06-20 18:09:41 +08:00
|
|
|
|
TopologyManager::instance().createTerminal(pEntity->id(),terType,"",port->pos(),port->getId(),funType);
|
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;
|
|
|
|
|
|
default:
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
2025-06-20 18:09:41 +08:00
|
|
|
|
TopologyManager::instance().createTerminal(pParent->id(),terType,"",QPointF(x,y),portId,funType);
|
2025-05-16 19:20:46 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-06-13 19:00:05 +08:00
|
|
|
|
bool FixedPortsModel::isItemValid(GraphicsProjectModelItem* pItem)
|
2025-05-09 19:36:32 +08:00
|
|
|
|
{
|
2025-06-13 19:00:05 +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;
|
|
|
|
|
|
}
|
2025-06-13 19:00:05 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void FixedPortsModel::insertProjectModelName(QString uuid,QString name)
|
|
|
|
|
|
{
|
|
|
|
|
|
if(!_projectModelName.contains(uuid))
|
|
|
|
|
|
_projectModelName.insert(uuid,name);
|
|
|
|
|
|
}
|
|
|
|
|
|
/*********************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());
|
2025-06-13 19:00:05 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
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-06-13 19:00:05 +08:00
|
|
|
|
BaseModelProperty* FixedPortsModel::addBaseNodeData(QUuid id,int type,QString name,QString metaName)
|
|
|
|
|
|
{
|
|
|
|
|
|
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);
|
|
|
|
|
|
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-07-11 18:13:54 +08:00
|
|
|
|
for(auto& pBaseItem:lstItem) //第二次循环处理所有连线对象
|
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-06-27 19:17:04 +08:00
|
|
|
|
QUuid id = QUuid::createUuid();
|
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;
|
|
|
|
|
|
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);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
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-07-11 18:13:54 +08:00
|
|
|
|
pProPanel->getModelController()->addBayByData(pData);
|
2025-06-27 19:17:04 +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()); //传递基模名
|
2025-06-27 19:17:04 +08:00
|
|
|
|
int type = pBase->graphicsType();
|
|
|
|
|
|
if(type == GIT_baseBus)
|
|
|
|
|
|
{
|
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-06-27 19:17:04 +08:00
|
|
|
|
QRectF rec = pBaseItem->boundingRect();
|
2025-07-04 18:47:49 +08:00
|
|
|
|
auto pBus = new ElectricSvgItemRect(rec.toRect());
|
|
|
|
|
|
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-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());
|
|
|
|
|
|
pBreaker->loadSvg(svg);
|
|
|
|
|
|
pProItem = pBreaker;
|
2025-06-27 19:17:04 +08:00
|
|
|
|
pProItem->setItemType(GIT_itemRect);
|
|
|
|
|
|
}
|
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
|
|
|
|
{
|
|
|
|
|
|
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)
|
|
|
|
|
|
{
|
|
|
|
|
|
QUuid uid = QUuid::createUuid();
|
|
|
|
|
|
PowerTerminal* proTer = TopologyManager::instance().createTerminal(pEntity->id(),baseTer->type(),"",baseTer->relativePosition(),uid.toString(),ModelFunctionType::ProjectModel);
|
|
|
|
|
|
proTer->setGenerateBy(baseTer->id());
|
|
|
|
|
|
if(proTer->type() == TerminalType::PowerConnect)
|
|
|
|
|
|
{
|
|
|
|
|
|
pProItem->addPort(p_movable,proTer->relativePosition(),proTer->id());
|
2025-07-04 18:47:49 +08:00
|
|
|
|
ItemPort* pPort = pProItem->getPortById(proTer->id());
|
|
|
|
|
|
pPort->setSourcePortId(baseTer->id());
|
2025-06-27 19:17:04 +08:00
|
|
|
|
}
|
|
|
|
|
|
else if(proTer->type() == TerminalType::PowerInput || proTer->type() == TerminalType::PowerOutput)
|
|
|
|
|
|
{
|
|
|
|
|
|
HandleType typ;
|
|
|
|
|
|
if(proTer->type() == TerminalType::PowerInput){
|
|
|
|
|
|
typ = T_lineIn;
|
|
|
|
|
|
}
|
|
|
|
|
|
else{
|
|
|
|
|
|
typ = T_lineOut;
|
|
|
|
|
|
}
|
|
|
|
|
|
QPointF pos = proTer->relativePosition();
|
|
|
|
|
|
PortPos locate;
|
|
|
|
|
|
if(pos.x() < 0)
|
|
|
|
|
|
{
|
|
|
|
|
|
locate = P_left;
|
|
|
|
|
|
}
|
|
|
|
|
|
else if(pos.x() > 0)
|
|
|
|
|
|
{
|
|
|
|
|
|
locate = P_right;
|
|
|
|
|
|
}
|
|
|
|
|
|
else if(pos.y() > 0)
|
|
|
|
|
|
{
|
2025-07-04 18:47:49 +08:00
|
|
|
|
locate = P_down;
|
2025-06-27 19:17:04 +08:00
|
|
|
|
}
|
|
|
|
|
|
else if(pos.y() < 0)
|
|
|
|
|
|
{
|
2025-07-04 18:47:49 +08:00
|
|
|
|
locate = P_top;
|
2025-06-27 19:17:04 +08:00
|
|
|
|
}
|
|
|
|
|
|
pProItem->addPort(P_const,pos,proTer->id(),typ,locate);
|
2025-07-04 18:47:49 +08:00
|
|
|
|
|
|
|
|
|
|
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-06-27 19:17:04 +08:00
|
|
|
|
pProItem->setItemId(QUuid(pEntity->id()));
|
|
|
|
|
|
pProItem->updateHandles();
|
|
|
|
|
|
pProItem->setPos(pBaseItem->pos());
|
|
|
|
|
|
pPanel->getScene()->addItem(pProItem);
|
|
|
|
|
|
pProItem->setProperty(pPro); //绑定模型
|
|
|
|
|
|
pProItem->updateByProperty(); //使用模型更新自身
|
|
|
|
|
|
//QString sModel = _projectModelName.value(id.toString());
|
2025-07-04 18:47:49 +08:00
|
|
|
|
//QString sModel = pBase->getModelProperty().modelSetting.modelName;
|
|
|
|
|
|
//pProItem->setModelName(sModel);
|
|
|
|
|
|
pPanel->getModelController()->addNodeItem(QUuid(pEntity->id()),pProItem);
|
|
|
|
|
|
}
|
|
|
|
|
|
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对象未生成
|
|
|
|
|
|
{
|
|
|
|
|
|
GraphicsBaseModelItem* pFromItem = _baseItem.value(QUuid(baseFromComponentId));
|
|
|
|
|
|
QUuid id = QUuid::createUuid();
|
|
|
|
|
|
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对象未生成
|
|
|
|
|
|
{
|
|
|
|
|
|
GraphicsBaseModelItem* pToItem = _baseItem.value(QUuid(baseToComponentId));
|
|
|
|
|
|
QUuid id = QUuid::createUuid();
|
|
|
|
|
|
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-07-04 18:47:49 +08:00
|
|
|
|
QString sModel = pBase->getModelProperty().modelSetting.modelName;
|
|
|
|
|
|
pProItem->setModelName(sModel);
|
2025-06-20 18:09:41 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-07-18 18:26:13 +08:00
|
|
|
|
void FixedPortsModel::addBayItem(QUuid id)
|
|
|
|
|
|
{
|
|
|
|
|
|
QMap<QUuid,BayProperty*> mapData = BasePropertyManager::instance().getBayData(); //加载的图形必定关联component(todo:完善判断条件,如判断拓扑节点)
|
|
|
|
|
|
if(mapData.contains(id))
|
|
|
|
|
|
{
|
|
|
|
|
|
BayProperty* pro = mapData.value(id);
|
|
|
|
|
|
if(pro)
|
|
|
|
|
|
{
|
|
|
|
|
|
addBayByData(pro);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-07-11 18:13:54 +08:00
|
|
|
|
bool FixedPortsModel::addBayItem(QUuid id,ElectricBayItem* pBay)
|
|
|
|
|
|
{
|
|
|
|
|
|
if(_bayItem.contains(id))
|
|
|
|
|
|
return false;
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
_bayItem.insert(id,pBay);
|
|
|
|
|
|
return true;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
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());
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
BayProperty* FixedPortsModel::addBayData(QUuid uuid)
|
|
|
|
|
|
{
|
|
|
|
|
|
BayProperty* pData = BasePropertyManager::instance().findBayData(uuid); //已存在不不创建
|
|
|
|
|
|
if(pData != nullptr)
|
|
|
|
|
|
return pData;
|
|
|
|
|
|
|
2025-07-18 18:26:13 +08:00
|
|
|
|
BayProperty* item = new BayProperty();
|
2025-07-11 18:13:54 +08:00
|
|
|
|
|
|
|
|
|
|
if(item)
|
|
|
|
|
|
{
|
|
|
|
|
|
item->setUuid(uuid);
|
|
|
|
|
|
BasePropertyManager::instance().insertBayData(uuid,item);
|
|
|
|
|
|
}
|
|
|
|
|
|
return item;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
QMap<QUuid,ElectricBayItem*>& FixedPortsModel::allBayItem()
|
|
|
|
|
|
{
|
|
|
|
|
|
return _bayItem;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
BayProperty* FixedPortsModel::generateBayData(BayProperty* pData,QList<BaseProperty*> lst)
|
|
|
|
|
|
{
|
|
|
|
|
|
QUuid id = QUuid::createUuid();
|
|
|
|
|
|
BayProperty* p = addBayData(id);
|
|
|
|
|
|
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);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void FixedPortsModel::addBayByData(BayProperty* pData)
|
|
|
|
|
|
{
|
|
|
|
|
|
QList<GraphicsBaseItem*> items;
|
|
|
|
|
|
QList<QUuid> lstCompo = pData->getLstComponent();
|
|
|
|
|
|
for(auto& id:lstCompo){
|
|
|
|
|
|
if(_nodeItem.contains(id)){
|
|
|
|
|
|
items.append(_nodeItem.value(id));
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
QRectF rec = calculateItemsBoundingRect(items);
|
|
|
|
|
|
auto pBay = new ElectricBayItem(rec);
|
|
|
|
|
|
pBay->setItemType(GIT_bay);
|
|
|
|
|
|
pBay->setProperty(pData);
|
2025-07-18 18:26:13 +08:00
|
|
|
|
pBay->setText(pData->name());
|
2025-07-11 18:13:54 +08:00
|
|
|
|
addBayItem(pData->uuid(),pBay);
|
|
|
|
|
|
getScene()->addItem(pBay);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
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-06-27 19:17:04 +08:00
|
|
|
|
pBreaker->initialPortsByDatabase();
|
|
|
|
|
|
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);
|
|
|
|
|
|
_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;
|
|
|
|
|
|
}
|
|
|
|
|
|
|