DiagramDesigner/diagramCavas/source/graphicsDataModel/diagramEditorModel.cpp

288 lines
11 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 "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);
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;
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();
if(!_tempItem.contains(uid))
generateTempComponent(uid,name,nCate,nType,pos,nRotate);
}
}
}
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();
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);
pItem = pBus;
pItem->setItemType(GIT_baseBus);
}
else if(nType == 2){ //异步电动机
}
else if(nType == 3){ //断路器
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_baseBreaker);
pItem->initialPortsByDatabase(3);
}
else if(nType == 4){ //电缆
}
else if(nType == 5){ //电流互感器
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){ //电压互感器
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){ //隔离开关
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);
}
}
ElectricBaseModelLineItem* DiagramEditorModel::generateTempLine(QUuid uid,QString sName)
{
ElectricBaseModelLineItem* pLine = new ElectricBaseModelLineItem();
pLine->setItemId(uid);
pLine->setItemType(GIT_baseLine);
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);
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;
}