DiagramDesigner/diagramCavas/source/graphicsDataModel/baseModel.cpp

211 lines
7.5 KiB
C++

#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<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,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<QString,ItemPort*> 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<QString,ItemPort*> 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<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()));
}
}
template void BaseModel::establishConnection<ElectricBaseModelLineItem>(GraphicsBaseItem*,GraphicsBaseItem*,ElectricBaseModelLineItem*,ModelFunctionType,int,int);