DiagramDesigner/diagramCavas/source/graphicsDataModel/diagramEditorModel.cpp

288 lines
11 KiB
C++
Raw Normal View History

#include "graphicsDataModel/diagramEditorModel.h"
#include "basePropertyManager.h"
#include "baseProperty.h"
#include "powerEntity.h"
#include "graphicsItem/graphicsBaseItem.h"
#include "powerTerminal.h"
#include "graphicsItem/itemPort.h"
#include "topologyManager.h"
#include "baseModelItem/electricBaseModelSvgItem.h"
#include "dataBase.h"
#include "diagramEditor/editScene.h"
#include "baseModelItem/electricBaseModelPortItem.h"
#include "baseModelItem/electricBaseModelSvgBus.h"
#include "baseModelItem/electricBaseModelLineItem.h"
DiagramEditorModel::DiagramEditorModel()
:_pCurBayRoute(nullptr)
,_pCurBayComponent(nullptr)
,_pCurPreviewScene(nullptr)
{
}
DiagramEditorModel::~DiagramEditorModel()
{
}
bool DiagramEditorModel::addTempPreviewItem(QUuid uuid,GraphicsBaseModelItem* pItem)
{
if(_tempItem.contains(uuid))
return false;
else
{
_tempItem.insert(uuid,pItem);
return true;
}
}
DiagramEditorItemProperty* DiagramEditorModel::addTempPreviewData(QUuid id,int type,QString name,QString metaName,QString sBlock)
{
DiagramEditorItemProperty* pData = BasePropertyManager::instance().findTempEditorData(id); //已存在不不创建
if(pData != nullptr)
return pData;
DiagramEditorItemProperty* itemData = new DiagramEditorItemProperty(this);
if(itemData)
{
itemData->setUuid(id);
itemData->setMetaModelName(metaName);
itemData->setType(type);
itemData->setTag(name);
itemData->setName(name);
if(!sBlock.isEmpty())
itemData->setBlock(sBlock);
BasePropertyManager::instance().insertTempEditorData(id,itemData);
}
return itemData;
}
void DiagramEditorModel::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);
}
}
}
void DiagramEditorModel::generateTempBay()
{
int rowCount = _pCurBayRoute->rowCount();
for(int i = 0;i < rowCount;++i){
QStandardItem *itemComps = _pCurBayRoute->item(i, 1);
QString sComps = itemComps->text();
QStringList lst = sComps.split(",");
for(auto& name:lst){ //第一次循环生成item
QStandardItem* pItem = getNameItem(name);
if(pItem){
QModelIndex index = pItem->index();
QModelIndex indexCate = index.sibling(index.row(),0);
QModelIndex indexType = index.sibling(index.row(),2);
if(!pItem->data(Qt::UserRole+4).isValid()){ //未初始化新建item
pItem->setData(1,Qt::UserRole+4);
2025-08-28 10:59:04 +08:00
int nCate = indexCate.data(Qt::UserRole+1).toInt(); //0设备1连接
int nType = indexType.data(Qt::UserRole+1).toInt();
int nDir = pItem->data().toInt();
int nRotate = 0;
2025-08-28 10:59:04 +08:00
if(pItem->data(Qt::UserRole+5).isValid())
nRotate = pItem->data(Qt::UserRole+5).toInt();
QPoint pos = pItem->data(Qt::UserRole+2).toPoint();
QUuid uid = pItem->data(Qt::UserRole+3).toUuid();
2025-08-28 10:59:04 +08:00
if(!_tempItem.contains(uid))
generateTempComponent(uid,name,nCate,nType,pos,nRotate);
}
}
}
2025-08-28 10:59:04 +08:00
if(lst.size() > 1){
for(int i = 0;i < lst.size() -1;++i){
QStandardItem* pItemFirst = getNameItem(lst[i]);
QStandardItem* pItemSecond = getNameItem(lst[i+1]);
if(pItemFirst && pItemSecond){
QUuid uid1 = pItemFirst->data(Qt::UserRole+3).toUuid();
QUuid uid2 = pItemSecond->data(Qt::UserRole+3).toUuid();
2025-08-28 10:59:04 +08:00
if(_tempItem.contains(uid1) && _tempItem.contains(uid2)){
GraphicsBaseModelItem* p1 = _tempItem.value(uid1);
GraphicsBaseModelItem* p2 = _tempItem.value(uid2);
auto pLineData = TopologyManager::instance().ifConnection(uid1.toString(),uid2.toString()); //判断两个item是否有连接
if(pLineData != nullptr){
if(!_tempItem.contains(QUuid(pLineData->id()))){ //connectdata已存在item未绘制
auto pLine = generateTempLine(QUuid(pLineData->id()),""); //重新绘制
if(pLine)
establishConnection(p1,p2,pLine,ModelFunctionType::BaseModel);
}
else{ //已绘制,略过
}
}
else{ //connectdata不存在新建
auto pLine = generateTempLine(QUuid::createUuid(),"");
if(pLine)
establishConnection(p1,p2,pLine,ModelFunctionType::BaseModel);
}
}
}
}
}
}
}
void DiagramEditorModel::generateTempComponent(QUuid uid,QString sName,int nCategory,int nType,QPoint pos,int nRotate)
{
GraphicsBaseModelItem* pItem = nullptr;
if(nCategory == 0)
{
QByteArray byte;
if(nType == 1){ //母线
byte = DataBase::GetInstance()->ModelType()[nType].icon;
auto pBus = new ElectricBaseModelSvgBus(QRect(-200, -3, 400, 6));
pBus->loadSvg(byte);
2025-08-28 10:59:04 +08:00
pItem = pBus;
pItem->setItemType(GIT_baseBus);
}
else if(nType == 2){ //异步电动机
}
else if(nType == 3){ //断路器
2025-08-28 10:59:04 +08:00
byte = DataBase::GetInstance()->ModelType()[nType].icon; //注意modelType表与componentType表不一致
auto pBreaker = new ElectricBaseModelSvgItem(QRect(-15, -15, 30, 30));
pBreaker->loadSvg(byte);
2025-08-28 10:59:04 +08:00
pItem = pBreaker;
pItem->setItemType(GIT_baseBreaker);
2025-08-28 10:59:04 +08:00
pItem->initialPortsByDatabase(3);
}
else if(nType == 4){ //电缆
}
else if(nType == 5){ //电流互感器
2025-08-28 10:59:04 +08:00
byte = DataBase::GetInstance()->ModelType()[nType].icon; //注意modelType表与componentType表不一致
auto pBreaker = new ElectricBaseModelSvgItem(QRect(-10, -10, 20, 20));
pBreaker->loadSvg(byte);
pItem = pBreaker;
pItem->setItemType(GIT_baseCT);
pItem->initialPortsByDatabase(4);
}
else if(nType == 6){ //电压互感器
2025-08-28 10:59:04 +08:00
byte = DataBase::GetInstance()->ModelType()[nType].icon; //注意modelType表与componentType表不一致
auto pBreaker = new ElectricBaseModelSvgItem(QRect(-25, -25, 50, 50));
pBreaker->loadSvg(byte);
pItem = pBreaker;
pItem->setItemType(GIT_basePT);
pItem->initialPortsByDatabase(5);
}
else if(nType == 7){ //隔离开关
2025-08-28 10:59:04 +08:00
byte = DataBase::GetInstance()->ModelType()[nType].icon; //注意modelType表与componentType表不一致
auto pBreaker = new ElectricBaseModelSvgItem(QRect(-15, -15, 30, 30));
pBreaker->loadSvg(byte);
pItem = pBreaker;
pItem->setItemType(GIT_baseDS);
pItem->initialPortsByDatabase(9);
}
else if(nType == 8){ //接地开关
}
else if(nType == 9){ //快速接地开关
}
else if(nType == 10){ //双掷接地隔离开关
}
else if(nType == 11){ //带电指示器
}
else if(nType == 12){ //避雷器
}
else if(nType == 13){ //电缆出线套筒
}
else if(nType == 14){ //电缆端
}
}
else if(nCategory == 1){
if(nType == 1){ //节点
pItem = new ElectricBaseModelPortItem();
pItem->setItemType(GIT_baseNode);
}
}
if(pItem){
pItem->setItemId(uid);
pItem->setRotation(nRotate);
PowerEntity* pEntityData = TopologyManager::instance().createEntity(EntityType::Component,uid.toString(),sName,ModelFunctionType::BlockEditorModel);
if(pEntityData)
pItem->setEntity(pEntityData);
DiagramEditorItemProperty* pData = nullptr;
if(nCategory == 1){
pData = addTempPreviewData(uid,0,sName,"node");
}
else if(nCategory == 0){ //设备
pData = addTempPreviewData(uid,nType,sName,DataBase::GetInstance()->ModelType()[nType].modelType);
pData->setGraphicsType(pItem->getItemType());
}
if(pData)
{
pItem->setProperty(pData);
createTopoTerminalsByItem(pItem,ModelFunctionType::BlockEditorModel);
pData->setDataChanged(true); //数据状态改变
}
addTempPreviewItem(uid,pItem);
_pCurPreviewScene->addItem(pItem);
pItem->setPos(pos);
}
}
2025-08-28 10:59:04 +08:00
ElectricBaseModelLineItem* DiagramEditorModel::generateTempLine(QUuid uid,QString sName)
{
ElectricBaseModelLineItem* pLine = new ElectricBaseModelLineItem();
pLine->setItemId(uid);
pLine->setItemType(GIT_baseLine);
2025-08-28 10:59:04 +08:00
DiagramEditorItemProperty* pData = addTempPreviewData(uid,8,sName,DataBase::GetInstance()->ModelType()[4].modelType);
pData->setGraphicsType(GIT_baseLine);
if(pData)
{
pLine->setProperty(pData);
pData->setDataChanged(true); //数据状态改变
}
addTempPreviewItem(uid,pLine);
//establishConnection(pBreaker,pBus,pLine,ModelFunctionType::BaseModel);
_pCurPreviewScene->addItem(pLine);
2025-08-28 10:59:04 +08:00
return pLine;
}
void DiagramEditorModel::clearCurPreview()
{
if(_pCurPreviewScene)
_pCurPreviewScene->clear();
}
QStandardItem* DiagramEditorModel::getNameItem(const QString& sName)
{
int nRowCount = _pCurBayComponent->rowCount();
for(int i = 0;i < nRowCount;++i){
QStandardItem *itemName = _pCurBayComponent->item(i, 1);
if(sName == itemName->text()){
return itemName;
}
}
return nullptr;
}