2025-02-06 16:36:50 +08:00
|
|
|
#include "graphicsDataModel/baseModel.h"
|
2025-08-25 12:02:15 +08:00
|
|
|
#include "graphicsItem/itemPort.h"
|
|
|
|
|
#include "graphicsItem/graphicsBaseItem.h"
|
|
|
|
|
#include "baseProperty.h"
|
|
|
|
|
#include "topologyManager.h"
|
|
|
|
|
#include "powerEntity.h"
|
|
|
|
|
#include "baseModelItem/electricBaseModelLineItem.h"
|
|
|
|
|
|
|
|
|
|
void BaseModel::createTopoTerminalsByItem(GraphicsBaseItem* pItem,ModelFunctionType funType)
|
|
|
|
|
{
|
|
|
|
|
PowerEntity* pEntity = pItem->entity();
|
|
|
|
|
|
|
|
|
|
if(pEntity)
|
|
|
|
|
{
|
|
|
|
|
QMap<QString,ItemPort*> mapPorts = pItem->getPorts(); //创建实体port对应的拓扑port
|
|
|
|
|
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;
|
|
|
|
|
}
|
|
|
|
|
QPointF f = port->pos();
|
|
|
|
|
TopologyManager::instance().createTerminal(pEntity->id(),terType,"",port->pos(),port->getId(),funType);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
QPointF BaseModel::calculateBusPortPos(GraphicsBaseItem* pBus,GraphicsBaseItem* item)
|
|
|
|
|
{
|
|
|
|
|
return QPointF(item->pos().x(),pBus->pos().y());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
template<typename TypeLine> void BaseModel::establishConnection(GraphicsBaseItem* pSrc,GraphicsBaseItem* pDest,TypeLine* pItem,ModelFunctionType nType)
|
|
|
|
|
{
|
|
|
|
|
ItemPort* pSrcPort = nullptr;
|
|
|
|
|
ItemPort* pDestPort = nullptr;
|
|
|
|
|
int nTypeSrc = pSrc->getProperty()->type();
|
|
|
|
|
int nTypeDest = pDest->getProperty()->type();
|
|
|
|
|
//if(pSrc->getItemType() == GIT_baseBus)
|
|
|
|
|
if(nTypeSrc == 1 || nTypeSrc == 14) //母线或节点
|
|
|
|
|
{
|
|
|
|
|
int index = 0;
|
|
|
|
|
if(nTypeSrc == 1 )
|
|
|
|
|
index = pSrc->addPort(p_movable,pSrc->mapFromScene(calculateBusPortPos(pSrc,pDest)));
|
|
|
|
|
else
|
|
|
|
|
index = pSrc->addPort(p_movable,QPoint(0,0)); //节点port与自身坐标重合
|
|
|
|
|
createTopoTerminalsByItem(pSrc,nType);
|
|
|
|
|
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)
|
|
|
|
|
else if(nTypeDest == 1 || nTypeDest == 14) //母线或节点
|
|
|
|
|
{
|
|
|
|
|
int index = 0;
|
|
|
|
|
if(nTypeDest == 1 )
|
|
|
|
|
index = pDest->addPort(p_movable,pDest->mapFromScene(calculateBusPortPos(pDest,pSrc)));
|
|
|
|
|
else
|
|
|
|
|
index = pDest->addPort(p_movable,QPoint(0,0)); //节点port与自身坐标重合
|
|
|
|
|
createTopoTerminalsByItem(pDest,nType);
|
|
|
|
|
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(),nType); //创建拓扑连接(逻辑)
|
|
|
|
|
if(pCon)
|
|
|
|
|
pCon->setState(DataState::changed);
|
|
|
|
|
pItem->getProperty()->setConnection(Connection(pSrc->itemId(),QUuid(pSrcPort->getId()),pSrcPort->getType(),pSrcPort->portPos(),pDest->itemId(),QUuid(pDestPort->getId()),pDestPort->getType(),pDestPort->portPos()));
|
|
|
|
|
}
|
|
|
|
|
}
|
2025-02-06 16:36:50 +08:00
|
|
|
|
2025-08-25 12:02:15 +08:00
|
|
|
template void BaseModel::establishConnection<ElectricBaseModelLineItem>(GraphicsBaseItem*,GraphicsBaseItem*,ElectricBaseModelLineItem*,ModelFunctionType);
|