DiagramDesigner/diagramCavas/source/topologyManager.cpp

650 lines
20 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include <QJsonArray>
#include <QJsonDocument>
#include "topologyManager.h"
#include "powerEntity.h"
#include "graphicsItem/graphicsBaseItem.h"
TopologyManager& TopologyManager::instance()
{
static TopologyManager instance;
return instance;
}
TopologyManager::TopologyManager(QObject* parent)
: QObject(parent) {}
TopologyManager::~TopologyManager() {
clearAllData();
}
void TopologyManager::clearAllData()
{
// 删除所有连接
qDeleteAll(m_connections);
m_connections.clear();
m_connectionIndex.clear();
// 删除所有实体(自动删除子对象)
qDeleteAll(m_entities);
m_entities.clear();
m_allTerminals.clear(); //端点由父亲entity释放
}
PowerEntity* TopologyManager::createEntity(EntityType type,const QString& uuid, const QString& name,ModelFunctionType funType)
{
if(funType == ModelFunctionType::ProjectModel)
{
PowerEntity* entity = nullptr;
switch(type) {
case EntityType::Grid:
case EntityType::Zone:
case EntityType::Station:
entity = new PowerDivision(type, uuid,name);
default:
entity = new PowerComponent(type, uuid,name);
}
m_entities.insert(entity->id(), entity);
emit entityCreated(entity->id()); // 发送信号通知
return entity;
}
else if(funType == ModelFunctionType::BaseModel)
{
PowerEntity* entity = nullptr;
entity = new PowerComponent(type, uuid,name);
m_baseEntities.insert(entity->id(), entity);
emit entityCreated(entity->id()); // 发送信号通知
return entity;
}
return nullptr;
}
PowerEntity* TopologyManager::findEntity(const QString& id,ModelFunctionType funType) const
{
if(funType == ModelFunctionType::ProjectModel)
return m_entities.value(id, nullptr); // 避免异常的安全查询
else if(funType == ModelFunctionType::BaseModel)
return m_baseEntities.value(id, nullptr);
}
bool TopologyManager::deleteEntity(const QString& id,ModelFunctionType funType)
{
if(funType == ModelFunctionType::ProjectModel)
{
if (!m_entities.contains(id)) return false;
PowerEntity* entity = m_entities[id];
// 步骤1删除所有相关连接
auto relatedConns = getConnectionsFor(id);
for (auto conn : relatedConns) {
removeConnection(conn->id());
}
// 步骤2从父节点移除防止悬空指针
if (PowerEntity* parent = entity->parent()) {
parent->removeChild(entity);
}
// 步骤3递归删除子实体
auto children = entity->children();
for (auto child : children) {
deleteEntity(child->id()); // 递归删除
}
// 步骤4从哈希表移除并释放内存
m_entities.remove(id);
delete entity; // 触发PowerEntity析构函数
emit entityDeleted(id);
return true;
}
else if(funType == ModelFunctionType::BaseModel)
{
if (!m_baseEntities.contains(id)) return false;
PowerEntity* entity = m_baseEntities[id];
// 步骤1删除所有相关连接
auto relatedConns = getConnectionsFor(id,funType);
for (auto conn : relatedConns) {
removeConnection(conn->id(),funType);
}
// 步骤2从父节点移除防止悬空指针
if (PowerEntity* parent = entity->parent()) {
parent->removeChild(entity);
}
// 步骤3递归删除子实体
auto children = entity->children();
for (auto child : children) {
deleteEntity(child->id(),funType); // 递归删除
}
// 步骤4从哈希表移除并释放内存
m_baseEntities.remove(id);
delete entity; // 触发PowerEntity析构函数
emit entityDeleted(id);
return true;
}
}
PowerConnection* TopologyManager::createConnection(const QString& connId,const QString& fromTerId, const QString& toTerId,const QString& fromId,const QString& toId,ModelFunctionType funType)
{
PowerConnection* conn = nullptr;
if(funType == ModelFunctionType::ProjectModel)
{
// 验证有效性
if (!m_allTerminals.contains(fromTerId) ||
!m_allTerminals.contains(toTerId) ||
fromTerId == toTerId)
{
qWarning() << "Invalid connection endpoints";
return nullptr;
}
// 防止重复连接
foreach (auto conn, m_connections) {
if (conn->fromTerminalId() == fromTerId &&
conn->toTerminalId() == toTerId)
{
return conn; // 返回已存在的连接
}
}
// 创建新连接
conn = new PowerConnection(connId,fromTerId, toTerId,fromId,toId);
m_connections[connId] = conn;
// 更新索引
m_connectionIndex.insert(fromTerId, conn);
m_connectionIndex.insert(toTerId, conn);
emit connectionCreated(connId);
}
else if(funType == ModelFunctionType::BaseModel)
{
// 验证有效性
if (!m_baseAllTerminals.contains(fromTerId) ||
!m_baseAllTerminals.contains(toTerId) ||
fromTerId == toTerId)
{
qWarning() << "Invalid connection endpoints";
return nullptr;
}
// 防止重复连接
foreach (auto conn, m_baseConnections) {
if (conn->fromTerminalId() == fromTerId &&
conn->toTerminalId() == toTerId)
{
return conn; // 返回已存在的连接
}
}
// 创建新连接
conn = new PowerConnection(connId,fromTerId, toTerId,fromId,toId);
m_baseConnections[connId] = conn;
// 更新索引
m_baseConnectionIndex.insert(fromTerId, conn);
m_baseConnectionIndex.insert(toTerId, conn);
emit connectionCreated(connId);
}
return conn;
}
QList<PowerConnection*> TopologyManager::getConnectionsForTerminal(const QString& terminalId,ModelFunctionType funType) const
{
if(funType == ModelFunctionType::ProjectModel)
return m_connectionIndex.values(terminalId);
else if(funType == ModelFunctionType::BaseModel)
return m_baseConnectionIndex.values(terminalId);
}
void TopologyManager::removeConnection(const QString& connId,ModelFunctionType funType)
{
if(funType == ModelFunctionType::ProjectModel){
if (!m_connections.contains(connId)) return;
PowerConnection* conn = m_connections[connId];
// 更新索引
m_connectionIndex.remove(conn->fromTerminalId(), conn);
m_connectionIndex.remove(conn->toTerminalId(), conn);
// 清理内存
m_connections.remove(connId);
delete conn;
emit connectionRemoved(connId);
}
else if(funType == ModelFunctionType::BaseModel){
if (!m_baseConnections.contains(connId)) return;
PowerConnection* conn = m_baseConnections[connId];
// 更新索引
m_baseConnectionIndex.remove(conn->fromTerminalId(), conn);
m_baseConnectionIndex.remove(conn->toTerminalId(), conn);
// 清理内存
m_baseConnections.remove(connId);
delete conn;
emit connectionRemoved(connId);
}
}
bool TopologyManager::validateConnection(const QString& fromTermId, const QString& toTermId,ModelFunctionType funType) const
{
if(funType == ModelFunctionType::ProjectModel){
PowerTerminal* fromTerm = getTerminal(fromTermId);
PowerTerminal* toTerm = getTerminal(toTermId);
if (!fromTerm || !toTerm) return false;
// 类型兼容性检查(示例规则)
switch(fromTerm->type()) {
case TerminalType::PowerOutput:
if (toTerm->type() != TerminalType::PowerInput && toTerm->type() != TerminalType::PowerConnect) return false;
break;
case TerminalType::PowerInput:
if (toTerm->type() != TerminalType::PowerOutput && toTerm->type() != TerminalType::PowerConnect) return false;
break;
case TerminalType::PowerConnect:
break;
case TerminalType::ControlSignal:
if (toTerm->type() != TerminalType::ControlSignal) return false;
break;
default:
return false;
}
// 禁止自连接
return (fromTerm->parentEntityId() != toTerm->parentEntityId());
}
else if(funType == ModelFunctionType::BaseModel){
PowerTerminal* fromTerm = getTerminal(fromTermId,funType);
PowerTerminal* toTerm = getTerminal(toTermId,funType);
if (!fromTerm || !toTerm) return false;
// 类型兼容性检查(示例规则)
switch(fromTerm->type()) {
case TerminalType::PowerOutput:
if (toTerm->type() != TerminalType::PowerInput && toTerm->type() != TerminalType::PowerConnect) return false;
break;
case TerminalType::PowerInput:
if (toTerm->type() != TerminalType::PowerOutput && toTerm->type() != TerminalType::PowerConnect) return false;
break;
case TerminalType::PowerConnect:
break;
case TerminalType::ControlSignal:
if (toTerm->type() != TerminalType::ControlSignal) return false;
break;
default:
return false;
}
// 禁止自连接
return (fromTerm->parentEntityId() != toTerm->parentEntityId());
}
}
// 连接查询接口
/*QList<PowerConnection*> TopologyManager::connectionsFrom(const QString& elementId) const
{
QList<PowerConnection*> res;
QList<PowerConnection*> lst = m_connectionIndex.values(elementId);
for(auto &val:lst)
{
if(val->fromTerminalId() == elementId)
res.append(val);
}
return res;
}*/
/*QList<PowerConnection*> TopologyManager::connectionsTo(const QString& elementId) const
{
QList<PowerConnection*> res;
QList<PowerConnection*> lst = m_connectionIndex.values(elementId);
for(auto &val:lst)
{
if(val->toTerminalId() == elementId)
res.append(val);
}
return res;
}*/
QList<PowerConnection*> TopologyManager::getConnectionsFor(const QString& entityId,ModelFunctionType funType) const
{
QList<PowerConnection*> lst;
if(funType == ModelFunctionType::ProjectModel)
{
QList<PowerTerminal*> lstTerminal = getTerminalsForEntity(entityId);
for(auto &terminal:lstTerminal)
{
PowerConnection* con = getConnectionContainsTerminal(terminal->id());
if(con)
lst.append(con);
}
}
else if(funType == ModelFunctionType::BaseModel)
{
QList<PowerTerminal*> lstTerminal = getTerminalsForEntity(entityId,funType);
for(auto &terminal:lstTerminal)
{
PowerConnection* con = getConnectionContainsTerminal(terminal->id(),funType);
if(con)
lst.append(con);
}
}
return lst;
}
PowerConnection* TopologyManager::connection(const QString& conId,ModelFunctionType funType) const
{
if(funType == ModelFunctionType::ProjectModel)
return m_connections.value(conId,nullptr);
else if(funType == ModelFunctionType::BaseModel)
return m_baseConnections.value(conId,nullptr);
return nullptr;
}
PowerConnection* TopologyManager::connection(const QString& fromPin,const QString& toPin,ModelFunctionType funType)
{
if(funType == ModelFunctionType::ProjectModel){
for(auto &con:m_connections)
{
if(con->fromTerminalId() == fromPin && con->toTerminalId() == toPin)
return con;
}
}
else if(funType == ModelFunctionType::BaseModel){
for(auto &con:m_baseConnections)
{
if(con->fromTerminalId() == fromPin && con->toTerminalId() == toPin)
return con;
}
}
return nullptr;
}
QHash<QString,PowerConnection*> TopologyManager::getAllConnections(ModelFunctionType funType)
{
if(funType == ModelFunctionType::ProjectModel)
return m_connections;
else if(funType == ModelFunctionType::BaseModel)
return m_baseConnections;
}
PowerEntity* TopologyManager::getEntity(const QString& id,ModelFunctionType funType) const
{
if(funType == ModelFunctionType::ProjectModel){
auto it = m_entities.find(id);
return (it != m_entities.end()) ? it.value() : nullptr;
}
else if(funType == ModelFunctionType::BaseModel){
auto it = m_baseEntities.find(id);
return (it != m_baseEntities.end()) ? it.value() : nullptr;
}
return nullptr;
}
QList<PowerEntity*> TopologyManager::findEntitiesByName(const QString& name,ModelFunctionType funType) const
{
QList<PowerEntity*> results;
if(funType == ModelFunctionType::ProjectModel){
foreach (auto entity, m_entities) {
if (entity->name() == name) {
results.append(entity);
}
}
}
else if(funType == ModelFunctionType::BaseModel){
foreach (auto entity, m_baseEntities) {
if (entity->name() == name) {
results.append(entity);
}
}
}
return results;
}
PowerEntity* TopologyManager::createDiagram(const QString& id,const QString& name,ModelFunctionType funType)
{
PowerEntity* entity = nullptr;
if(funType == ModelFunctionType::ProjectModel){
if(!m_diagrams.contains(id))
{
entity = new ConfigurationDiagram(id,name);
m_diagrams.insert(entity->id(), entity);
}
}
else if(funType == ModelFunctionType::BaseModel){
if(!m_baseDiagrams.contains(id))
{
entity = new ConfigurationDiagram(id,name);
m_baseDiagrams.insert(entity->id(), entity);
}
}
return entity;
}
PowerEntity* TopologyManager::findDiagram(const QString& id,ModelFunctionType funType) const
{
if(funType == ModelFunctionType::ProjectModel)
return m_diagrams.value(id, nullptr); // 避免异常的安全查询
else if(funType == ModelFunctionType::BaseModel)
return m_baseDiagrams.value(id, nullptr);
return nullptr;
}
bool TopologyManager::deleteDiagram(const QString& id,ModelFunctionType funType)
{
if(funType == ModelFunctionType::ProjectModel){
if (!m_diagrams.contains(id)) return false;
PowerEntity* entity = m_diagrams[id];
// 步骤2从父节点移除防止悬空指针
if (PowerEntity* parent = entity->parent()) {
parent->removeChild(entity);
}
// 步骤3递归删除子实体
auto children = entity->children();
for (auto child : children) {
deleteDiagram(child->id()); // 递归删除
}
// 步骤4从哈希表移除并释放内存
m_diagrams.remove(id);
delete entity; // 触发析构函数
return true;
}
else if(funType == ModelFunctionType::BaseModel){
if (!m_baseDiagrams.contains(id)) return false;
PowerEntity* entity = m_baseDiagrams[id];
// 步骤2从父节点移除防止悬空指针
if (PowerEntity* parent = entity->parent()) {
parent->removeChild(entity);
}
// 步骤3递归删除子实体
auto children = entity->children();
for (auto child : children) {
deleteDiagram(child->id(),funType); // 递归删除
}
// 步骤4从哈希表移除并释放内存
m_baseDiagrams.remove(id);
delete entity; // 触发析构函数
return true;
}
}
PowerTerminal* TopologyManager::createTerminal(const QString& parentEntityId,
TerminalType type,
const QString& name,
const QPointF& relPos,
const QString& uuid,
ModelFunctionType funType) {
if(funType == ModelFunctionType::ProjectModel){
if (!m_entities.contains(parentEntityId)) return nullptr;
PowerTerminal* term = new PowerTerminal(parentEntityId, type, name, relPos, uuid);
m_allTerminals[term->id()] = term;
m_terminalsByEntity[parentEntityId].append(term);
// 关联到父实体
if (PowerEntity* parent = getEntity(parentEntityId)) {
parent->addTerminal(term);
}
return term;
}
else if(funType == ModelFunctionType::BaseModel){
if (!m_baseEntities.contains(parentEntityId)) return nullptr;
PowerTerminal* term = new PowerTerminal(parentEntityId, type, name, relPos, uuid);
m_baseAllTerminals[term->id()] = term;
m_baseTerminalsByEntity[parentEntityId].append(term);
// 关联到父实体
if (PowerEntity* parent = getEntity(parentEntityId,funType)) {
parent->addTerminal(term);
}
return term;
}
}
bool TopologyManager::deleteTerminal(const QString& terminalId,ModelFunctionType funType) {
if(funType == ModelFunctionType::ProjectModel){
if (!m_allTerminals.contains(terminalId)) return false;
PowerTerminal* term = m_allTerminals[terminalId];
QString parentId = term->parentEntityId();
// 从父实体移除
if (PowerEntity* parent = getEntity(parentId)) {
parent->removeTerminal(terminalId);
}
// 清理全局存储
m_terminalsByEntity[parentId].removeAll(term);
m_allTerminals.remove(terminalId);
return true;
}
else if(funType == ModelFunctionType::BaseModel){
if (!m_baseAllTerminals.contains(terminalId)) return false;
PowerTerminal* term = m_baseAllTerminals[terminalId];
QString parentId = term->parentEntityId();
// 从父实体移除
if (PowerEntity* parent = getEntity(parentId,funType)) {
parent->removeTerminal(terminalId);
}
// 清理全局存储
m_baseTerminalsByEntity[parentId].removeAll(term);
m_baseAllTerminals.remove(terminalId);
return true;
}
}
PowerTerminal* TopologyManager::getTerminal(const QString& terminalId,ModelFunctionType funType) const
{
if(funType == ModelFunctionType::ProjectModel){
auto it = m_allTerminals.find(terminalId);
return (it != m_allTerminals.end()) ? it.value() : nullptr;
}
else if(funType == ModelFunctionType::BaseModel){
auto it = m_baseAllTerminals.find(terminalId);
return (it != m_baseAllTerminals.end()) ? it.value() : nullptr;
}
return nullptr;
}
QList<PowerTerminal*> TopologyManager::getTerminalsForEntity(const QString& entityId,ModelFunctionType funType) const {
if(funType == ModelFunctionType::ProjectModel)
return m_terminalsByEntity.value(entityId);
else if(funType == ModelFunctionType::BaseModel)
return m_baseTerminalsByEntity.value(entityId);
}
PowerEntity* TopologyManager::getEntityByTerminal(const QString& terminalId,ModelFunctionType funType) const
{
if(funType == ModelFunctionType::ProjectModel){
QHash<QString, QList<PowerTerminal*>>::ConstIterator iter;
for(iter = m_terminalsByEntity.begin();iter != m_terminalsByEntity.end();++iter)
{
for(auto &terminal:iter.value())
{
if(terminal->id() == terminalId)
{
return m_entities[iter.key()];
}
}
}
}
else if(funType == ModelFunctionType::BaseModel){
QHash<QString, QList<PowerTerminal*>>::ConstIterator iter;
for(iter = m_baseTerminalsByEntity.begin();iter != m_baseTerminalsByEntity.end();++iter)
{
for(auto &terminal:iter.value())
{
if(terminal->id() == terminalId)
{
return m_baseEntities[iter.key()];
}
}
}
}
return nullptr;
}
PowerConnection* TopologyManager::getConnectionContainsTerminal(const QString& terminalId,ModelFunctionType funType) const
{
if(funType == ModelFunctionType::ProjectModel){
for(auto &con:m_connections)
{
if(con->fromTerminalId() == terminalId || con->toTerminalId() == terminalId)
{
return con;
}
}
}
else if(funType == ModelFunctionType::BaseModel){
for(auto &con:m_baseConnections)
{
if(con->fromTerminalId() == terminalId || con->toTerminalId() == terminalId)
{
return con;
}
}
}
return nullptr;
}