#include "graphicsDataModel/baseModel.h" #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 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 void BaseModel::establishConnection(GraphicsBaseItem* pSrc,GraphicsBaseItem* pDest,TypeLine* pItem,ModelFunctionType nType,int nMode,int nParam) { 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 == 0) && (nTypeDest != 1 && nTypeDest != 0)) //母线或节点 { 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 mapPorts = pDest->getPorts(); if(nMode == 0){ double minDis = 999; for(auto& port:mapPorts) //与母线或节点连接时,连接最近接线点 { double dis = distanceBetweenItems(port,pDest); if(dis < minDis){ minDis = dis; pDestPort = port; } } } else if(nMode == 1){ for(auto& port:mapPorts) //连接中性点 { int nTpe = port->getType(); int nPos = port->portPos(); if(nTpe == T_newTral){ if(nParam == 0){ if(nPos == P_top){ pDestPort = port; } } else if(nParam == 1){ if(nPos == P_left || nPos == P_right){ pDestPort = port; } } else if(nParam == 2){ if(nPos == P_down){ pDestPort = port; } } } } } } else if((nTypeDest == 1 || nTypeDest == 0) && (nTypeSrc != 1 && nTypeSrc != 0)) { 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 mapPorts = pSrc->getPorts(); if(nMode == 0){ double minDis = 999; for(auto& port:mapPorts) //与母线或节点连接时,连接最近接线点 { double dis = distanceBetweenItems(port,pDest); if(dis < minDis){ minDis = dis; pSrcPort = port; } /*if(port->getType() == T_lineOut) { pSrcPort = port; break; }*/ } } else if(nMode == 1){ for(auto& port:mapPorts) //连接中性点 { int nTpe = port->getType(); int nPos = port->portPos(); if(nTpe == T_newTral){ if(nParam == 0){ if(nPos == P_top){ pSrcPort = port; } } else if(nParam == 1){ if(nPos == P_left || nPos == P_right){ pSrcPort = port; } } else if(nParam == 2){ if(nPos == P_down){ pSrcPort = port; } } } } } } else if((nTypeSrc == 1 || nTypeSrc == 0) && (nTypeDest == 1 || nTypeDest == 0)){ //两个都是母线或节点 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); 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); } else { QMap mapSrc = pSrc->getPorts(); pSrcPort = nullptr; for(auto& port:mapSrc) { if(port->getType() == T_lineOut) { pSrcPort = port; break; } } QMap 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())); } } template void BaseModel::establishConnection(GraphicsBaseItem*,GraphicsBaseItem*,ElectricBaseModelLineItem*,ModelFunctionType,int,int);