DiagramDesigner/diagramCavas/source/graphicsDataModel/fixedPortsModel.cpp

792 lines
24 KiB
C++
Raw Normal View History

2025-02-06 16:36:50 +08:00
#include "graphicsDataModel/fixedPortsModel.h"
#include "graphicsItem/graphicsBaseItem.h"
#include "graphicsItem/electricSvgItemBus.h"
#include "graphicsItem/electricSvgItemRect.h"
#include "graphicsItem/electricSvgItemTriangle.h"
#include "graphicsItem/electricConnectLineItem.h"
#include "baseModelItem/electricBaseModelLineItem.h"
2025-02-06 16:36:50 +08:00
#include "graphicsItem/itemPort.h"
#include "designerScene.h"
#include "dataBase.h"
#include "httpInterface.h"
#include "drawingPanel.h"
#include "itemPropertyDlg.h"
#include "dataManager.h"
2025-04-30 16:29:17 +08:00
#include "powerEntity.h"
#include "topologyManager.h"
2025-05-23 10:30:52 +08:00
#include "basePropertyManager.h"
2025-02-06 16:36:50 +08:00
#include <QJsonArray>
#include <QMessageBox>
2025-05-23 10:30:52 +08:00
#include "baseProperty.h"
2025-02-06 16:36:50 +08:00
bool FixedPortsModel::_dataInitialised = false;
2025-04-30 16:29:17 +08:00
FixedPortsModel::FixedPortsModel(PowerEntity* pEntity)
2025-02-06 16:36:50 +08:00
:_scene(nullptr)
,_widget(nullptr)
,_Interface(nullptr)
2025-04-30 16:29:17 +08:00
,_pEntity(pEntity)
2025-02-06 16:36:50 +08:00
{
loadNodeDataFromDataBase();
_Interface = new HttpInterface(this);
_timer = new QTimer(this);
_modelStateInfo = DataManager::instance().modelState();
2025-04-09 16:20:34 +08:00
_modelDataInfo = DataManager::instance().modelData();
initialPropertyDlg();
2025-02-06 16:36:50 +08:00
connect(_timer,SIGNAL(timeout()),this,SLOT(onTimeOut()));
connect(_Interface,&HttpInterface::sendPointData,this,&FixedPortsModel::onSignal_GetPointData);
}
FixedPortsModel::~FixedPortsModel()
{
}
QMap<QUuid,QPointF> FixedPortsModel::allNodePos() const
{
QMap<QUuid,QPointF> map;
for(auto pItem:_nodeItem)
{
if(pItem->getItemType() != GIT_link)
map.insert(pItem->itemId(),pItem->pos());
}
return map;
}
QVector<Connection> FixedPortsModel::allConnections()
{
QVector<Connection> vec;
for(auto pItem:_nodeItem)
{
if(pItem->getItemType() == GIT_link)
{
auto pLine = dynamic_cast<ElectricConnectLineItem*>(pItem);
if(pLine)
{
vec.push_back(pLine->getConnection());
}
}
}
return vec;
}
QMap<QUuid,GraphicsProjectModelItem*>& FixedPortsModel::allItems()
2025-02-06 16:36:50 +08:00
{
return _nodeItem;
}
bool FixedPortsModel::addNodeItem(QUuid uuid,GraphicsProjectModelItem* pItem)
2025-02-06 16:36:50 +08:00
{
if(_nodeItem.contains(uuid))
return false;
else
{
_nodeItem.insert(uuid,pItem);
connect(pItem,&GraphicsProjectModelItem::ifExist,this,&FixedPortsModel::onSignal_ifExits);
2025-02-06 16:36:50 +08:00
return true;
}
}
void FixedPortsModel::addNodeItem(QUuid id/*,int type*/,QPointF pos)
{
2025-05-16 19:20:46 +08:00
//todo:load图形时必有拓扑实体关联到对应的entity
2025-02-06 16:36:50 +08:00
BaseProperty* pro = nullptr;
GraphicsProjectModelItem* item = nullptr;
2025-05-23 10:30:52 +08:00
QMap<QUuid,BaseProperty*> mapData = BasePropertyManager::instance().getEntityData(); //加载的图形必定关联component(todo:完善判断条件,如判断拓扑节点)
2025-05-09 19:36:32 +08:00
if(mapData.contains(id))
2025-02-06 16:36:50 +08:00
{
2025-05-09 19:36:32 +08:00
pro = mapData[id];
2025-02-06 16:36:50 +08:00
if(pro)
{
int type = pro->type();
if(type == GIT_itemTri)
{
item = new ElectricSvgItemTriangle(QRect(-15, -15, 30, 30));
item->setItemType(GIT_itemTri);
}
else if(type == GIT_itemRect)
{
2025-05-16 19:20:46 +08:00
item = new ElectricSvgItemRect(QRect(-15, -15, 30, 30),false);
2025-02-06 16:36:50 +08:00
item->setItemType(GIT_itemRect);
2025-05-16 19:20:46 +08:00
QJsonArray portArr = pro->context()["port"].toArray();
for(QJsonValueRef portJson:portArr)
{
QJsonObject portObj = portJson.toObject();
QString portId = portObj["portId"].toString();
int x = portObj["x"].toInt();
int y = portObj["y"].toInt();
HandleType tye = HandleType(portObj["portType"].toInt());
PortPos locate = PortPos(portObj["locate"].toInt());
item->addPort(P_const,QPointF(x,y),portId,tye,locate);
}
2025-02-06 16:36:50 +08:00
}
else if(type == GIT_bus)
{
item = new ElectricSvgItemBus(QRect(-100, -3, 200, 6));
item->setItemType(GIT_bus);
QJsonArray portArr = pro->context()["port"].toArray();
for(QJsonValueRef portJson:portArr)
{
QJsonObject portObj = portJson.toObject();
2025-05-16 19:20:46 +08:00
QString portId = portObj["portId"].toString();
2025-02-06 16:36:50 +08:00
int x = portObj["x"].toInt();
int y = portObj["y"].toInt();
2025-05-16 19:20:46 +08:00
item->addPort(p_movable,QPointF(x,y),portId);
2025-02-06 16:36:50 +08:00
}
}
if(item)
{
item->setItemId(id);
item->editShape(0, pos);
item->setPos(pos);
//item->setSelected(true);
_scene->addItem(item);
item->addPoint(pos);
item->setProperty(pro); //绑定模型
item->updateByProperty(); //使用模型更新自身
QString sModel = _projectModelName.value(id.toString());
item->setModelName(sModel);
2025-02-06 16:36:50 +08:00
_nodeItem.insert(id,item);
connect(item,&GraphicsProjectModelItem::ifExist,this,&FixedPortsModel::onSignal_ifExits);
2025-02-06 16:36:50 +08:00
}
}
}
}
2025-03-28 18:08:21 +08:00
BaseProperty* FixedPortsModel::addNodeData(QUuid id,int type,QString name,QString modelName)
2025-02-06 16:36:50 +08:00
{
2025-05-23 10:30:52 +08:00
BaseProperty* pData = BasePropertyManager::instance().findEntityData(id); //已存在不不创建
2025-05-09 19:36:32 +08:00
if(pData != nullptr)
return pData;
2025-03-28 18:08:21 +08:00
VariableProperty* item = new VariableProperty(this);
2025-04-09 16:20:34 +08:00
//todo:关联到对应data
2025-03-28 18:08:21 +08:00
2025-02-06 16:36:50 +08:00
if(item)
{
item->setUuid(id);
2025-03-28 18:08:21 +08:00
item->setModelName(modelName);
2025-02-06 16:36:50 +08:00
item->setType(type);
item->setTag(name);
item->setName(name);
2025-05-23 10:30:52 +08:00
BasePropertyManager::instance().insertEntityData(id,item);
2025-02-06 16:36:50 +08:00
}
return item;
}
void FixedPortsModel::loadNodeDataFromDataBase()
{
if(!_dataInitialised)
{
QList<componentInfo> lst= DataBase::GetInstance()->getAllComponents();
for(auto &info:lst)
{
2025-03-28 18:08:21 +08:00
BaseProperty* pData = addNodeData(info.uuid,info.type,info.name,info.modelName);
2025-02-06 16:36:50 +08:00
pData->setTag(info.tag);
pData->setName(info.name);
pData->setPath(info.nspath);
pData->setDescription(info.description);
pData->setInService(info.inService);
pData->setState(info.state);
pData->setConnectedBus(info.connected_bus);
pData->setLabel(info.label);
pData->setContext(info.context);
pData->setGrid(info.grid);
pData->setZone(info.zone);
pData->setStation(info.station);
pData->setDataChanged(false);
2025-05-16 19:20:46 +08:00
PowerEntity* pEntity = TopologyManager::instance().createEntity(EntityType::Component,info.uuid.toString(),info.name); //首先load所有data和entity全局唯一
if(pEntity){
createTopoTerminalsByData(pEntity,info.context);
2025-02-06 16:36:50 +08:00
}
2025-05-16 19:20:46 +08:00
}
2025-02-06 16:36:50 +08:00
2025-05-16 19:20:46 +08:00
QList<topologicInfo> lstTopo = DataBase::GetInstance()->getAllTopologics();
for(auto &info:lstTopo)
{
2025-05-23 10:30:52 +08:00
TopologyManager::instance().createConnection(QString::number(info.id),info.from_pin.toString(),info.to_pin.toString(),info.uuid_from.toString(),info.uuid_to.toString());
2025-02-06 16:36:50 +08:00
}
_dataInitialised = true;
}
else
{
2025-05-09 19:36:32 +08:00
//for(auto p:_nodeData)
2025-02-06 16:36:50 +08:00
{
int a = 1;
}
}
}
2025-05-16 19:20:46 +08:00
void FixedPortsModel::addConnectLline(QUuid srcId,QUuid destId,QUuid srcPort,QUuid destPort)
2025-02-06 16:36:50 +08:00
{
GraphicsProjectModelItem* src = _nodeItem[srcId];
GraphicsProjectModelItem* dest = _nodeItem[destId];
2025-02-06 16:36:50 +08:00
if(src && dest)
{
ElectricConnectLineItem* pItem = new ElectricConnectLineItem();
pItem->setItemId(QUuid::createUuid());
pItem->setItemType(GIT_link);
_scene->addItem(pItem);
2025-05-16 19:20:46 +08:00
ItemPort* ptSrc = src->getPortById(srcPort.toString());
2025-02-06 16:36:50 +08:00
HandleType srcType = ptSrc->getType();
PortPos srcPos = ptSrc->portPos();
pItem->setStartPoint(ptSrc->scenePos());
ptSrc->setConnect(pItem);
ItemPort* ptDest = nullptr;
2025-05-16 19:20:46 +08:00
ptDest = dest->getPortById(destPort.toString());
pItem->setEndPoint(ptDest->scenePos());
/*if(dest->getItemType() == GIT_bus) //母线动态创建port
2025-02-06 16:36:50 +08:00
{
2025-05-16 19:20:46 +08:00
ptDest = dest->getPortById(destPort.toString());
2025-02-06 16:36:50 +08:00
pItem->setEndPoint(ptDest->scenePos());
}
else
{
2025-05-16 19:20:46 +08:00
ptDest = dest->getPortById(destPort.toString());
2025-02-06 16:36:50 +08:00
pItem->setEndPoint(ptDest->scenePos());
2025-05-16 19:20:46 +08:00
}*/
2025-02-06 16:36:50 +08:00
if(ptDest != nullptr)
{
HandleType destType = ptDest->getType();
PortPos destPos = ptDest->portPos();
pItem->calculatePath();
pItem->setConnection(Connection(srcId,srcPort,srcType,srcPos,destId,destPort,destType,destPos));
ptDest->setConnect(pItem);
addNodeItem(pItem->itemId(),pItem);
}
}
}
void FixedPortsModel::deleteNodeItem(GraphicsProjectModelItem* pItem)
2025-02-06 16:36:50 +08:00
{
if(pItem->getItemType() == GIT_link)
{
auto pLine = dynamic_cast<ElectricConnectLineItem*>(pItem);
if(pLine)
{
2025-04-30 16:29:17 +08:00
QUuid conId = pLine->itemId();
TopologyManager::instance().removeConnection(conId.toString());
PowerConnection* pCon = TopologyManager::instance().connection(conId.toString());
if(pCon){
PowerEntity* itemFrom = TopologyManager::instance().getEntityByTerminal(pCon->fromTerminalId());
PowerEntity* itemTo = TopologyManager::instance().getEntityByTerminal(pCon->toTerminalId());
if(itemFrom && itemTo)
{
_nodeItem.value(QUuid(itemFrom->id()))->setItemChanged(true);
_nodeItem.value(QUuid(itemTo->id()))->setItemChanged(true);
}
}
_nodeItem.take(conId);
_scene->removeItem(pLine);
2025-02-06 16:36:50 +08:00
delete pLine;
}
}
else
{
QUuid srcId = pItem->itemId();
2025-04-30 16:29:17 +08:00
QList<PowerConnection*> lstCon = TopologyManager::instance().getConnectionsFor(srcId.toString());
for(auto &con:lstCon)
{
PowerEntity* pFrom = TopologyManager::instance().getEntityByTerminal(con->fromTerminalId());
PowerEntity* pTo = TopologyManager::instance().getEntityByTerminal(con->toTerminalId());
if(pFrom && pTo)
{
if(srcId.toString() == pFrom->id()) //对象是srcItem
_nodeItem.value(QUuid(pTo->id()))->setItemChanged(true);
else //对象是toItem
_nodeItem.value(QUuid(pFrom->id()))->setItemChanged(true);
}
//TopologyManager::instance().removeConnection(con->id()); //删除entity时会同时删除相关连接无需手动删除
}
TopologyManager::instance().deleteEntity(srcId.toString());
2025-02-06 16:36:50 +08:00
pItem->setItemChanged(true);
_nodeItem.take(srcId);
_scene->removeItem(pItem);
delete pItem;
}
}
QVariant FixedPortsModel::nodeData(QUuid nodeId, NodeRole role) const
{
QVariant result;
switch(role)
{
case NodeRole::Position:
result = _nodeItem[nodeId]->pos();
break;
}
/*auto it = _models.find(nodeId);
if (it == _models.end())
return result;
auto &model = *it;
switch (role) {
case NodeRole::Type:
result = model->name();
break;
case NodeRole::Position:
result = _nodeGeometryData[nodeId].pos;
break;
case NodeRole::Size:
result = _nodeGeometryData[nodeId].size;
break;
case NodeRole::CaptionVisible:
result = model->captionVisible();
break;
case NodeRole::Caption:
result = model->caption();
break;
case NodeRole::Style: {
//auto style = StyleCollection::nodeStyle();
//result = style.toJson().toVariantMap();
} break;
case NodeRole::InternalData: {
QJsonObject nodeJson;
//nodeJson["internal-data"] = _models[nodeId]->save();
result = nodeJson.toVariantMap();
break;
}
case NodeRole::InPortCount:
result = model->nPorts(PortType::In);
break;
case NodeRole::OutPortCount:
result = model->nPorts(PortType::Out);
break;
case NodeRole::Widget: {
auto w = model->embeddedWidget();
result = QVariant::fromValue(w);
} break;
}*/
return result;
}
2025-05-16 19:20:46 +08:00
/*QJsonObject FixedPortsModel::saveNode(QUuid const nodeId) const
2025-02-06 16:36:50 +08:00
{
QJsonObject nodeJson;
nodeJson["id"] = nodeId.toString();
nodeJson["type"] = _nodeItem[nodeId]->getItemType();
{
QPointF const pos = nodeData(nodeId, NodeRole::Position).value<QPointF>();
QJsonObject posJson;
posJson["x"] = pos.x();
posJson["y"] = pos.y();
nodeJson["position"] = posJson;
}
return nodeJson;
2025-05-16 19:20:46 +08:00
}*/
2025-02-06 16:36:50 +08:00
void FixedPortsModel::saveNode(int nPageId)
{
2025-05-23 10:30:52 +08:00
QMap<QUuid,BaseProperty*> mapData = BasePropertyManager::instance().getEntityData();
2025-05-09 19:36:32 +08:00
for(auto &pData:mapData)
2025-02-06 16:36:50 +08:00
{
if(pData->prepareDelete())
{
DataBase::GetInstance()->deleteComponent(pData->uuid().toString());
continue;
}
if(pData->dataChanged())
{
bool exist = DataBase::GetInstance()->componentExist(pData->uuid().toString());
2025-04-09 16:20:34 +08:00
VariableProperty* pVariable = dynamic_cast<VariableProperty*>(pData);
if(pVariable)
2025-02-06 16:36:50 +08:00
{
2025-04-09 16:20:34 +08:00
modelDataInfo dataInfo = pVariable->getPropertyValue();
if(exist) //已存在更新
2025-02-06 16:36:50 +08:00
{
2025-04-09 16:20:34 +08:00
DataBase::GetInstance()->updateComponent(pData->uuid(),pData->tag(),pData->name(),pData->context());
for(auto &val:dataInfo.groupInfo)
2025-02-06 16:36:50 +08:00
{
2025-04-09 16:20:34 +08:00
DataBase::GetInstance()->updateDynamicProperty(pData->uuid(),val);
}
2025-02-06 16:36:50 +08:00
}
2025-04-09 16:20:34 +08:00
else
2025-02-06 16:36:50 +08:00
{
2025-05-23 10:30:52 +08:00
DataBase::GetInstance()->insertComponent(pData->uuid(),pData->modelName(),pData->path(),pData->tag(),pData->name(),pData->description(),pData->grid(),pData->zone(),pData->station(),pData->type(),true,pData->state(),pData->status(),pData->connectedBus(),pData->label(),pData->context(),1);
2025-04-09 16:20:34 +08:00
for(auto &val:dataInfo.groupInfo)
2025-02-06 16:36:50 +08:00
{
2025-04-09 16:20:34 +08:00
DataBase::GetInstance()->insertDynamicProperty(pData->uuid(),val);
}
2025-02-06 16:36:50 +08:00
}
}
}
}
2025-05-16 19:20:46 +08:00
//todo:增加判断,只在设置模式保存连接关系
QVector<Connection> vecCon = allConnections(); //保存当前页面中的连接关系
for(auto &con:vecCon)
{
QString fromPin = con.nSrcPortId.toString();
QString toPin = con.nDestPortId.toString();
PowerConnection* pCon = TopologyManager::instance().connection(fromPin,toPin);
if(pCon)
{
DataState state = pCon->state();
switch (state) {
case DataState::unchanged:
break;
case DataState::prepareDelete:
DataBase::GetInstance()->deleteTopologic(con.nSrcPortId,con.nDestPortId);
TopologyManager::instance().removeConnection(pCon->id());
break;
case DataState::changed:
2025-05-23 10:30:52 +08:00
DataBase::GetInstance()->insertTopologic(con.nSrcNodeId,con.nDestNodeId,con.nSrcPortId,con.nDestPortId,0,"",0);
2025-05-16 19:20:46 +08:00
break;
default:
break;
}
}
}
2025-02-06 16:36:50 +08:00
}
void FixedPortsModel::onSignal_ifExits(QUuid id,const QString& str,int type,GraphicsProjectModelItem* pitem)
2025-02-06 16:36:50 +08:00
{
bool exist = false;
BaseProperty* pData = nullptr;
2025-05-23 10:30:52 +08:00
QMap<QUuid,BaseProperty*> mapData = BasePropertyManager::instance().getEntityData();
2025-05-09 19:36:32 +08:00
for(auto pro:mapData)
2025-02-06 16:36:50 +08:00
{
if(pro->tag() == str)
{
pData = pro;
exist = true;
break;
}
}
if(exist) //已存在将发出信号的item绑定到此data
{
if(_nodeItem.contains(id)) //发出信号对象id与data对象id相同已绑定,不做响应
return;
QMessageBox msgBox;
msgBox.setText(QString::fromWCharArray(L"提示"));
2025-05-09 19:36:32 +08:00
msgBox.setInformativeText(QString::fromWCharArray(L"此名称对象已存在,是否使用该对象?"));
2025-02-06 16:36:50 +08:00
msgBox.setStandardButtons(QMessageBox::Ok | QMessageBox::Cancel);
msgBox.setDefaultButton(QMessageBox::Cancel);
int ret = msgBox.exec();
switch (ret) {
case QMessageBox::Ok:
{
//todo:断开原来的连接关系
pitem->setProperty(pData);
pitem->setItemId(pData->uuid());
2025-05-09 19:36:32 +08:00
PowerEntity* pEntity = TopologyManager::instance().findEntity(pData->uuid().toString());
if(pEntity){
pitem->setEntity(pEntity); //item对象的逻辑接线点无需重复创建
}
2025-02-06 16:36:50 +08:00
_nodeItem.take(id);
_nodeItem.insert(pData->uuid(),pitem);
}
break;
case QMessageBox::Cancel:
// Cancel was clicked
break;
default:
// should never be reached
break;
}
}
else //创建新data并绑定
{
2025-05-09 19:36:32 +08:00
BaseProperty* pData = addNodeData(id,type,str,pitem->getModelName());
if(pData)
2025-02-06 16:36:50 +08:00
{
2025-05-09 19:36:32 +08:00
pitem->setProperty(pData);
pData->setDataChanged(true); //数据状态改变
2025-02-06 16:36:50 +08:00
}
2025-05-09 19:36:32 +08:00
PowerEntity* pEntity = TopologyManager::instance().createEntity(EntityType::Component,id.toString(),str);
if(pEntity)
pitem->setEntity(pEntity);
2025-05-16 19:20:46 +08:00
createTopoTerminalsByItem(pitem); //创建item对象的逻辑接线点
2025-02-06 16:36:50 +08:00
}
}
void FixedPortsModel::onTimeOut()
{
_Interface->getPointData("i");
_Interface->getPointData("v");
}
void FixedPortsModel::onSignal_GetPointData(QString type,QMap<qint64,double> map)
{
if(map.size() == 1) //实时数据
{
double d = map.first();
2025-05-09 19:36:32 +08:00
//for(auto pro:_nodeData) //demo版本只有一个数据
2025-02-06 16:36:50 +08:00
{
2025-05-09 19:36:32 +08:00
//int t = pro->type();
//if(t == GIT_itemRect)
2025-02-06 16:36:50 +08:00
{
//todo:根据id匹配数据
/*auto p = dynamic_cast<ElectricSvgItemRect_Property*>(pro);
2025-02-06 16:36:50 +08:00
if(p)
{
p->notifyUpdate(); //通知更新
}*/
2025-02-06 16:36:50 +08:00
}
}
}
}
void FixedPortsModel::startHttpRequest()
{
if(_timer)
{
_timer->setInterval(1000);
_timer->start();
}
}
QWidget* FixedPortsModel::getTopWidget()
{
return dynamic_cast<QWidget*>(_widget);
}
2025-04-30 16:29:17 +08:00
QPointF FixedPortsModel::getTerminalPos(const QString& sTerminalId)
{
PowerEntity* pParent = TopologyManager::instance().getEntityByTerminal(sTerminalId);
if(pParent)
{
for(auto &item:_nodeItem)
{
if(pParent->id() == item->itemId().toString()) //找到terminal父图元
{
for(auto &pPort:item->getPorts())
{
if(pPort->getId() == sTerminalId)
{
return pPort->scenePos();
}
}
}
}
}
return QPointF(0,0);
}
ElectricConnectLineItem* FixedPortsModel::getLineItemById(const QString& terminalId)
{
for(auto iter:_nodeItem) //获取id所在的lineitem
{
auto item = dynamic_cast<GraphicsProjectModelItem*>(iter);
2025-04-30 16:29:17 +08:00
if(item)
{
if(item->getItemType() == GIT_link)
{
PowerConnection* pCon = TopologyManager::instance().getConnectionContainsTerminal(terminalId);
if(pCon)
{
if(item->itemId().toString() == pCon->id())
return dynamic_cast<ElectricConnectLineItem*>(item);
}
}
}
}
return nullptr;
}
void FixedPortsModel::showModelDlg(const QString& sName,QUuid uuid,GraphicsProjectModelItem* pItem)
2025-03-28 18:08:21 +08:00
{
modelStateInfo stateInfo = _modelStateInfo[sName];
ModelDataMap mapData = DataManager::instance().modelData();
ItemPropertyDlg* pDlg = dynamic_cast<ItemPropertyDlg*>(stateInfo._PropertyDlg);
if(pDlg)
2025-03-28 18:08:21 +08:00
{
2025-04-09 16:20:34 +08:00
pDlg->showDlg(mapData[sName],uuid,pItem);
2025-03-28 18:08:21 +08:00
}
else
qDebug()<<"showModelDlg err";
2025-03-28 18:08:21 +08:00
}
void FixedPortsModel::initialPropertyDlg()
2025-03-28 18:08:21 +08:00
{
for(auto &modelInfo:_modelStateInfo)
2025-03-28 18:08:21 +08:00
{
if(modelInfo._PropertyDlg == NULL)
2025-03-28 18:08:21 +08:00
{
generatePropertyDlg(modelInfo.modelName);
2025-03-28 18:08:21 +08:00
}
}
}
void FixedPortsModel::generatePropertyDlg(const QString& sModel)
2025-03-28 18:08:21 +08:00
{
modelStateInfo info = _modelStateInfo[sModel];
if(info._PropertyDlg == NULL)
2025-03-28 18:08:21 +08:00
{
ItemPropertyDlg* dlg = new ItemPropertyDlg(_widget);
if(dlg)
2025-03-28 18:08:21 +08:00
{
dlg->loadGroupButton(info.groupInfo);
2025-04-09 16:20:34 +08:00
_modelStateInfo[sModel]._PropertyDlg = dlg;
2025-03-28 18:08:21 +08:00
}
}
}
2025-04-30 16:29:17 +08:00
ConfigurationDiagram* FixedPortsModel::getTopologyDiagram()
{
return dynamic_cast<ConfigurationDiagram*>(_pEntity);
}
2025-05-09 19:36:32 +08:00
2025-05-16 19:20:46 +08:00
void FixedPortsModel::createTopoTerminalsByItem(GraphicsBaseItem* pItem)
2025-05-09 19:36:32 +08:00
{
PowerEntity* pEntity = pItem->entity();
if(pEntity)
{
2025-05-16 19:20:46 +08:00
QMap<QString,ItemPort*> mapPorts = pItem->getPorts(); //创建实体port对应的拓扑port
2025-05-09 19:36:32 +08:00
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;
}
TopologyManager::instance().createTerminal(pEntity->id(),terType,"",port->pos(),port->getId());
}
}
}
2025-05-16 19:20:46 +08:00
void FixedPortsModel::createTopoTerminalsByData(PowerEntity* pParent,QJsonObject componentCon)
{
QJsonArray portsArray = componentCon["port"].toArray();
for (QJsonValueRef portJson : portsArray) //每个属性的状态信息
{
QJsonObject node = portJson.toObject();
QString portId = node["portId"].toString();
int x = node["x"].toInt();
int y = node["y"].toInt();
PortPos locate = PortPos(node["locate"].toInt());
HandleType portType = HandleType(node["portType"].toInt());
TerminalType terType;
switch (portType) {
case T_lineIn:
terType = TerminalType::PowerInput;
break;
case T_lineOut:
terType = TerminalType::PowerOutput;
break;
case T_lineInOut:
terType = TerminalType::PowerConnect;
break;
default:
break;
}
TopologyManager::instance().createTerminal(pParent->id(),terType,"",QPointF(x,y),portId);
}
}
bool FixedPortsModel::isItemValid(GraphicsProjectModelItem* pItem)
2025-05-09 19:36:32 +08:00
{
ModelProperty* pData = pItem->getProperty();
2025-05-09 19:36:32 +08:00
PowerEntity* pEntity = pItem->entity();
return (pData != nullptr && pEntity != nullptr)?true:false;
}
void FixedPortsModel::insertProjectModelName(QString uuid,QString name)
{
if(!_projectModelName.contains(uuid))
_projectModelName.insert(uuid,name);
}
/*********************baseModel**********************/
QMap<QUuid,GraphicsBaseModelItem*>& FixedPortsModel::allBaseItems()
{
return _baseItem;
}
QVector<Connection> FixedPortsModel::allBaseConnections()
{
QVector<Connection> vec;
for(auto pItem:_baseItem)
{
if(pItem->getItemType() == GIT_baseLine)
{
auto pLine = dynamic_cast<ElectricBaseModelLineItem*>(pItem);
if(pLine)
{
vec.push_back(pLine->getConnection());
}
}
}
return vec;
}
QMap<QUuid,QPointF> FixedPortsModel::allBaseNodePos() const
{
QMap<QUuid,QPointF> map;
for(auto pItem:_baseItem)
{
if(pItem->getItemType() != GIT_baseLine)
map.insert(pItem->itemId(),pItem->pos());
}
return map;
}
BaseModelProperty* FixedPortsModel::addBaseNodeData(QUuid id,int type,QString name,QString metaName)
{
BaseModelProperty* pData = BasePropertyManager::instance().findBaseEntityData(id); //已存在不不创建
if(pData != nullptr)
return pData;
BaseModelProperty* item = new BaseModelProperty(this);
if(item)
{
item->setUuid(id);
item->setMetaModelName(metaName);
item->setType(type);
item->setTag(name);
item->setName(name);
BasePropertyManager::instance().insertBaseEntityData(id,item);
}
return item;
}