#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" #include "baseModelItem/electricBaseModelSvgItem.h" #include "baseModelItem/electricBaseModelSvgBus.h" #include "baseModelItem/electricBaseModelLineItem.h" #include "graphicsItem/electricBayItem.h" #include "graphicsItem/itemPort.h" #include "designerScene.h" #include "dataBase.h" #include "httpInterface.h" #include "drawingPanel.h" #include "itemPropertyDlg.h" #include "dataManager.h" #include "powerEntity.h" #include "topologyManager.h" #include "basePropertyManager.h" #include "diagramCavas.h" #include #include #include #include "baseProperty.h" #include "projectModelSetting.h" #include "bayManagerDlg.h" #include "projectModelManager.h" #include "global.h" bool FixedPortsModel::_dataInitialised = false; FixedPortsModel::FixedPortsModel(PowerEntity* pEntity) :_scene(nullptr) ,_widget(nullptr) ,_Interface(nullptr) ,_pEntity(pEntity) ,m_proModelSettingDlg(nullptr) ,m_pBayManager(nullptr) { _cavas = nullptr; loadNodeDataFromDataBase(); _Interface = new HttpInterface(this); _timer = new QTimer(this); _modelStateInfo = DataManager::instance().modelState(); _modelDataInfo = DataManager::instance().modelData(); initialPropertyDlg(); connect(_timer,SIGNAL(timeout()),this,SLOT(onTimeOut())); connect(_Interface,&HttpInterface::sendPointData,this,&FixedPortsModel::onSignal_GetPointData); } FixedPortsModel::~FixedPortsModel() { } QMap FixedPortsModel::allNodePos() const { QMap map; for(auto pItem:_nodeItem) { if(pItem->getItemType() != GIT_link) map.insert(pItem->itemId(),pItem->pos()); } return map; } QVector FixedPortsModel::allConnectionProperty() { QVector vec; for(auto pItem:_nodeItem) { if(pItem->getItemType() == GIT_link) { auto pLine = dynamic_cast(pItem); if(pLine) { ModelProperty* pPro = pLine->getProperty(); if(pPro){ vec.push_back(pPro); } } } } return vec; } QMap& FixedPortsModel::allItems() { return _nodeItem; } GraphicsProjectModelItem* FixedPortsModel::nodeItem(QUuid uuid) { return _nodeItem.value(uuid,nullptr); } bool FixedPortsModel::addNodeItem(QUuid uuid,GraphicsProjectModelItem* pItem) { if(_nodeItem.contains(uuid)) return false; else { _nodeItem.insert(uuid,pItem); connect(pItem,&GraphicsProjectModelItem::ifExist,this,&FixedPortsModel::onSignal_ifExits); return true; } } void FixedPortsModel::addNodeItem(QUuid id/*,int type*/,QPointF pos) { //todo:load图形时必有拓扑实体,关联到对应的entity BaseProperty* pro = nullptr; GraphicsProjectModelItem* item = nullptr; QMap mapData = BasePropertyManager::instance().getEntityData(); //加载的图形必定关联component(todo:完善判断条件,如判断拓扑节点) if(mapData.contains(id)) { pro = mapData[id]; if(pro) { int type = pro->graphicsType(); if(type == GIT_link) //连线对象外部处理 return; QString sMeta = pro->metaModelName(); QString sProModel = pro->modelName(); if(type == GIT_itemTri) { item = new ElectricSvgItemTriangle(QRect(-15, -15, 30, 30)); item->setItemType(GIT_itemTri); } else if(type == GIT_itemRect) { PropertyModel model = ProjectModelManager::instance().getData()[sMeta][sProModel]; QByteArray svg; if(model.modelSetting.mapSvg.isEmpty()){ svg = DataBase::GetInstance()->ModelType()[3].icon; } else{ svg = model.modelSetting.mapSvg.first(); } auto pCb = new ElectricSvgItemRect(QRect(-15, -15, 30, 30),false); pCb->setItemType(GIT_itemRect); pCb->loadSvg(svg); item = pCb; 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); } } else if(type == GIT_bus) { PropertyModel model = ProjectModelManager::instance().getData()[sMeta][sProModel]; QByteArray svg; if(model.modelSetting.mapSvg.isEmpty()){ svg = DataBase::GetInstance()->ModelType()[1].icon; } else{ svg = model.modelSetting.mapSvg.first(); } auto pBus = new ElectricSvgItemBus(QRect(-100, -3, 200, 6)); pBus->setItemType(GIT_bus); pBus->loadSvg(svg); item = pBus; 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(); item->addPort(p_movable,QPointF(x,y),portId); } } 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); _nodeItem.insert(id,item); connect(item,&GraphicsProjectModelItem::ifExist,this,&FixedPortsModel::onSignal_ifExits); } } } } BaseProperty* FixedPortsModel::addNodeData(QUuid id,int type,QString name,QString modelName) { BaseProperty* pData = BasePropertyManager::instance().findEntityData(id); //已存在不不创建 if(pData != nullptr) return pData; VariableProperty* item = new VariableProperty(this); //todo:关联到对应data if(item) { item->setUuid(id); item->setModelName(modelName); item->setType(type); GraphicsItemType localType = corresbondItem::typeToProGraphic[type]; //将通用类型转换为工程模图元 item->setGraphicsType(localType); item->setTag(name); item->setName(name); item->setDataChanged(true); BasePropertyManager::instance().insertEntityData(id,item); } return item; } void FixedPortsModel::loadNodeDataFromDataBase() { if(!_dataInitialised) { QList lst= DataBase::GetInstance()->getAllComponents(); for(auto &info:lst) { BaseProperty* pData = addNodeData(info.uuid,info.type,info.name,info.modelName); 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); QString sMeta = info.context["metaModel"].toString(); pData->setMetaModelName(sMeta); PowerEntity* pEntity = TopologyManager::instance().createEntity(EntityType::Component,info.uuid.toString(),info.name); //首先load所有data和entity,全局唯一 if(pEntity){ createTopoTerminalsByData(pEntity,info.context); } } QList lstTopo = DataBase::GetInstance()->getAllTopologics(); for(auto &info:lstTopo) { QString from_pin = info.context["from_pin"].toString(); QString to_pin = info.context["to_pin"].toString(); TopologyManager::instance().createConnection(QString::number(info.id),from_pin,to_pin,info.uuid_from.toString(),info.uuid_to.toString()); } _dataInitialised = true; } else { //for(auto p:_nodeData) { int a = 1; } } } void FixedPortsModel::addConnectLline(QUuid lineId,QUuid srcId,QUuid destId,QUuid srcPort,QUuid destPort) { GraphicsProjectModelItem* src = _nodeItem[srcId]; GraphicsProjectModelItem* dest = _nodeItem[destId]; QMap mapData = BasePropertyManager::instance().getEntityData(); if(mapData.contains(lineId)) { BaseProperty* pPro = mapData.value(lineId); if(src && dest) { ElectricConnectLineItem* pItem = new ElectricConnectLineItem(); pItem->setItemId(lineId); pItem->setItemType(GIT_link); _scene->addItem(pItem); ItemPort* ptSrc = src->getPortById(srcPort.toString()); HandleType srcType = ptSrc->getType(); PortPos srcPos = ptSrc->portPos(); pItem->setStartPoint(ptSrc->scenePos()); ptSrc->setConnect(pItem); ItemPort* ptDest = nullptr; ptDest = dest->getPortById(destPort.toString()); pItem->setEndPoint(ptDest->scenePos()); if(ptDest != nullptr) { HandleType destType = ptDest->getType(); PortPos destPos = ptDest->portPos(); pItem->calculatePath(); pPro->setConnection(Connection(srcId,srcPort,srcType,srcPos,destId,destPort,destType,destPos)); ptDest->setConnect(pItem); addNodeItem(pItem->itemId(),pItem); pItem->setProperty(pPro); } } } } void FixedPortsModel::deleteNodeItem(GraphicsProjectModelItem* pItem) { if(pItem->getItemType() == GIT_link) { auto pLine = dynamic_cast(pItem); if(pLine) { 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); delete pLine; } } else { QUuid srcId = pItem->itemId(); QList 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()); 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; } /*QJsonObject FixedPortsModel::saveNode(QUuid const nodeId) const { QJsonObject nodeJson; nodeJson["id"] = nodeId.toString(); nodeJson["type"] = _nodeItem[nodeId]->getItemType(); { QPointF const pos = nodeData(nodeId, NodeRole::Position).value(); QJsonObject posJson; posJson["x"] = pos.x(); posJson["y"] = pos.y(); nodeJson["position"] = posJson; } return nodeJson; }*/ void FixedPortsModel::saveNode(int nPageId) { QMap mapItems = allItems(); for(auto& pItem:mapItems) { BaseProperty* pData = dynamic_cast(pItem->getProperty()); if(pData){ Connection con = pData->getConnection(); QString fromPin = con.nSrcPortId.toString(); QString toPin = con.nDestPortId.toString(); QJsonObject context; context["from_pin"] = fromPin; context["to_pin"] = toPin; if(pData->prepareDelete()) { DataBase::GetInstance()->deleteComponent(pData->uuid().toString()); if(pData->type() == 8){ PowerConnection* pCon = TopologyManager::instance().connection(fromPin,toPin); if(pCon){ DataBase::GetInstance()->deleteTopologic(con.nSrcPortId,con.nDestPortId); TopologyManager::instance().removeConnection(pCon->id()); } } continue; } if(pData->dataChanged()) { bool exist = DataBase::GetInstance()->componentExist(pData->uuid().toString()); VariableProperty* pVariable = dynamic_cast(pData); if(pVariable) { modelDataInfo dataInfo = pVariable->getPropertyValue(); if(exist) //已存在更新 { DataBase::GetInstance()->updateComponent(pData->uuid(),pData->tag(),pData->name(),pData->context()); for(auto &val:dataInfo.groupInfo) { if(val.groupName == "component") continue; DataBase::GetInstance()->updateDynamicProperty(pData->uuid(),val); } } else { 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); for(auto &val:dataInfo.groupInfo) { if(val.groupName == "component") continue; DataBase::GetInstance()->insertDynamicProperty(pData->uuid(),val); } } } if(pData->type() == 8){ PowerConnection* pCon = TopologyManager::instance().connection(fromPin,toPin); if(pCon){ DataBase::GetInstance()->insertTopologic(con.nSrcNodeId,con.nDestNodeId,context,0,"",0); } } } } } //todo:savebay } void FixedPortsModel::onSignal_ifExits(QUuid id,const QString& str,int type,GraphicsProjectModelItem* pitem) { bool exist = false; BaseProperty* pData = nullptr; QMap mapData = BasePropertyManager::instance().getEntityData(); for(auto pro:mapData) { 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"提示")); msgBox.setInformativeText(QString::fromWCharArray(L"此名称对象已存在,是否使用该对象?")); 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()); PowerEntity* pEntity = TopologyManager::instance().findEntity(pData->uuid().toString()); if(pEntity){ pitem->setEntity(pEntity); //item对象的逻辑接线点无需重复创建 } _nodeItem.take(id); _nodeItem.insert(pData->uuid(),pitem); } break; case QMessageBox::Cancel: // Cancel was clicked break; default: // should never be reached break; } } else //创建新data并绑定 { BaseProperty* pData = addNodeData(id,type,str,pitem->getModelName()); if(pData) { pitem->setProperty(pData); pData->setDataChanged(true); //数据状态改变 } PowerEntity* pEntity = TopologyManager::instance().createEntity(EntityType::Component,id.toString(),str); if(pEntity) pitem->setEntity(pEntity); createTopoTerminalsByItem(pitem); //创建item对象的逻辑接线点 } } void FixedPortsModel::onTimeOut() { _Interface->getPointData("i"); _Interface->getPointData("v"); } void FixedPortsModel::onSignal_GetPointData(QString type,QMap map) { if(map.size() == 1) //实时数据 { double d = map.first(); //for(auto pro:_nodeData) //demo版本只有一个数据 { //int t = pro->type(); //if(t == GIT_itemRect) { //todo:根据id匹配数据 /*auto p = dynamic_cast(pro); if(p) { p->notifyUpdate(); //通知更新 }*/ } } } } void FixedPortsModel::onSignal_generateDiagram(const QString& sName) { QStringList lstInfo; for(auto& item:_baseItem){ BaseModelProperty* pBase = dynamic_cast(item->getProperty()); if(pBase){ QString sModel = pBase->getModelProperty().modelSetting.modelName; if(sModel.isEmpty()){ lstInfo.append(pBase->name()); } } } if(!lstInfo.isEmpty()){ QMessageBox::information(NULL, QString("提示"), QString::fromWCharArray(L"%1未设置完毕").arg(lstInfo.join("、"))); return; } QList lst; for(auto& item:_baseItem) { lst.append(item); } QList lstBay; for(auto& item:_bayItem) { lstBay.append(item); } generateProjectModel(sName,lst,lstBay); } void FixedPortsModel::onSignal_openBayManager() { if(m_pBayManager == nullptr){ m_pBayManager = new BayManagerDlg(_widget); m_pBayManager->setModelController(this); } m_pBayManager->showDlg(); } void FixedPortsModel::startHttpRequest() { if(_timer) { _timer->setInterval(1000); _timer->start(); } } QWidget* FixedPortsModel::getTopWidget() { return dynamic_cast(_widget); } 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(iter); if(item) { if(item->getItemType() == GIT_link) { PowerConnection* pCon = TopologyManager::instance().getConnectionContainsTerminal(terminalId); if(pCon) { if(item->itemId().toString() == pCon->id()) return dynamic_cast(item); } } } } return nullptr; } template void FixedPortsModel::establishConnection(GraphicsBaseItem* pSrc,GraphicsBaseItem* pDest,TypeLine* pItem) { ItemPort* pSrcPort = nullptr; ItemPort* pDestPort = nullptr; if(pSrc->getItemType() == GIT_baseBus) { int index = pSrc->addPort(p_movable,pSrc->mapFromScene(calculateBusPortPos(pSrc,pDest))); createTopoTerminalsByItem(pSrc,ModelFunctionType::BaseModel); pSrcPort = pSrc->getPortPtr(index); QMap mapPorts = pDest->getPorts(); for(auto& port:mapPorts) { if(port->getType() == T_lineIn) { pDestPort = port; break; } } } else if(pDest->getItemType() == GIT_baseBus) { int index = pDest->addPort(p_movable,pDest->mapFromScene(calculateBusPortPos(pDest,pSrc))); createTopoTerminalsByItem(pDest,ModelFunctionType::BaseModel); pDestPort = pDest->getPortPtr(index); QMap mapPorts = pSrc->getPorts(); for(auto& port:mapPorts) { if(port->getType() == T_lineOut) { pSrcPort = port; break; } } } 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(),ModelFunctionType::BaseModel); //创建拓扑连接(逻辑) 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())); } } QPointF FixedPortsModel::calculateBusPortPos(GraphicsBaseItem* pBus,GraphicsBaseItem* item) { return QPointF(item->pos().x(),pBus->pos().y()); } void FixedPortsModel::showModelDlg(const QString& sName,QUuid uuid,GraphicsProjectModelItem* pItem) { modelStateInfo stateInfo = _modelStateInfo[sName]; ModelDataMap mapData = DataManager::instance().modelData(); ItemPropertyDlg* pDlg = dynamic_cast(stateInfo._PropertyDlg); if(pDlg) { pDlg->showDlg(mapData[sName],uuid,pItem); } else qDebug()<<"showModelDlg err"; } void FixedPortsModel::initialPropertyDlg() { for(auto &modelInfo:_modelStateInfo) { if(modelInfo._PropertyDlg == NULL) { generatePropertyDlg(modelInfo.modelName); } } } void FixedPortsModel::generatePropertyDlg(const QString& sModel) { modelStateInfo info = _modelStateInfo[sModel]; if(info._PropertyDlg == NULL) { ItemPropertyDlg* dlg = new ItemPropertyDlg(_widget); if(dlg) { dlg->setModelController(this); dlg->loadGroupButton(info.groupInfo); _modelStateInfo[sModel]._PropertyDlg = dlg; } } } ConfigurationDiagram* FixedPortsModel::getTopologyDiagram() { return dynamic_cast(_pEntity); } void FixedPortsModel::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); } } } void FixedPortsModel::createTopoTerminalsByData(PowerEntity* pParent,QJsonObject componentCon,ModelFunctionType funType) { 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,funType); } } bool FixedPortsModel::isItemValid(GraphicsProjectModelItem* pItem) { ModelProperty* pData = pItem->getProperty(); 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& FixedPortsModel::allBaseItems() { return _baseItem; } QVector FixedPortsModel::allBaseConnections() { QVector vec; for(auto pItem:_baseItem) { if(pItem->getItemType() == GIT_baseLine) { auto pLine = dynamic_cast(pItem); if(pLine) { vec.push_back(pLine->getProperty()->getConnection()); } } } return vec; } QMap FixedPortsModel::allBaseNodePos() const { QMap map; for(auto pItem:_baseItem) { if(pItem->getItemType() != GIT_baseLine) map.insert(pItem->itemId(),pItem->pos()); } return map; } bool FixedPortsModel::addBaseItem(QUuid uuid,GraphicsBaseModelItem* pItem) { if(_baseItem.contains(uuid)) return false; else { _baseItem.insert(uuid,pItem); return true; } } 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; } void FixedPortsModel::showProjectModelSettingDlg(GraphicsBaseModelItem* srcItem) { if(m_proModelSettingDlg == nullptr) { m_proModelSettingDlg = new ProjectModelSetting(_widget); } m_proModelSettingDlg->showDlg(srcItem); } void FixedPortsModel::generateProjectModel(const QString& sPageName,QList lstItem,QList lstOther) { DrawingPanel* pProPanel = nullptr; if(_cavas){ DiagramInfo info; info.id = QUuid::createUuid(); info.sName = sPageName; info.sTag = sPageName; info.sBasePageName = _pageName; _cavas->onSignal_createDiagram(info); pProPanel = _cavas->getPanel(sPageName); } for(auto& pBaseItem:lstItem) //第二次循环处理所有连线对象 { BaseModelProperty* pBase = dynamic_cast(pBaseItem->getProperty()); if(pBase->type() == 8){ //电缆 QUuid id = QUuid::createUuid(); BaseProperty* pData = pProPanel->getModelController()->addNodeData(id,pBase->type(),pBase->name(),pBase->modelName()); if(pData) { pData->setDataChanged(true); //数据状态改变 addProjectItemByBaseData(pProPanel,pBaseItem,pData); } } } QList lstProData; QMap mapItem = pProPanel->getModelController()->allItems(); //根据item获取data for(auto& item:mapItem){ BaseProperty* pPro = dynamic_cast(item->getProperty()); if(pPro){ lstProData.append(pPro); } } for(auto& pOtherItem:lstOther) { BayProperty* pBay = dynamic_cast(pOtherItem->getProperty()); if(pBay){ BayProperty* pData = pProPanel->getModelController()->generateBayData(pBay,lstProData); if(pData) { pProPanel->getModelController()->addBayByData(pData); } } } } void FixedPortsModel::addProjectItemByBaseData(DrawingPanel* pPanel,GraphicsBaseModelItem* pItem,BaseProperty* pPro) { BaseModelProperty* pBase = dynamic_cast(pItem->getProperty()); if(pBase){ if(_baseItem.contains(pBase->uuid())){ GraphicsProjectModelItem* pProItem = nullptr; GraphicsBaseModelItem* pBaseItem = _baseItem.value(pBase->uuid()); pPro->setSourceItemId(pBaseItem->itemId().toString()); //设置被哪个对象生成 pPro->setMetaModelName(pBase->metaModelName()); //传递基模名 int type = pBase->graphicsType(); if(type == GIT_baseBus) { QByteArray svg; if(pBase->getModelProperty().modelSetting.mapSvg.isEmpty()){ svg = DataBase::GetInstance()->ModelType()[1].icon; } else{ svg = pBase->getModelProperty().modelSetting.mapSvg.first(); } QRectF rec = pBaseItem->boundingRect(); auto pBus = new ElectricSvgItemRect(rec.toRect()); pBus->loadSvg(svg); pProItem = pBus; pProItem->setItemType(GIT_bus); } else if(type == GIT_baseBreaker) { QByteArray svg; if(pBase->getModelProperty().modelSetting.mapSvg.isEmpty()){ svg = DataBase::GetInstance()->ModelType()[3].icon; } else{ svg = pBase->getModelProperty().modelSetting.mapSvg.first(); } QRectF rec = pBaseItem->boundingRect(); auto pBreaker = new ElectricSvgItemRect(rec.toRect()); pBreaker->loadSvg(svg); pProItem = pBreaker; pProItem->setItemType(GIT_itemRect); } else if(type == GIT_baseLine) { pProItem = new ElectricConnectLineItem(); pProItem->setItemId(pPro->uuid()); pProItem->setItemType(GIT_link); pPanel->getScene()->addItem(pProItem); } if(pBase->graphicsType() != GIT_baseLine) //非连接线对象 { PowerEntity* pEntity = TopologyManager::instance().createEntity(EntityType::Component,pPro->uuid().toString(),pBase->name()); QList lstBase = TopologyManager::instance().getTerminalsForEntity(pBase->uuid().toString(),ModelFunctionType::BaseModel); //获取基模的逻辑点 for(auto& baseTer:lstBase) { QUuid uid = QUuid::createUuid(); PowerTerminal* proTer = TopologyManager::instance().createTerminal(pEntity->id(),baseTer->type(),"",baseTer->relativePosition(),uid.toString(),ModelFunctionType::ProjectModel); proTer->setGenerateBy(baseTer->id()); if(proTer->type() == TerminalType::PowerConnect) { pProItem->addPort(p_movable,proTer->relativePosition(),proTer->id()); ItemPort* pPort = pProItem->getPortById(proTer->id()); pPort->setSourcePortId(baseTer->id()); } else if(proTer->type() == TerminalType::PowerInput || proTer->type() == TerminalType::PowerOutput) { HandleType typ; if(proTer->type() == TerminalType::PowerInput){ typ = T_lineIn; } else{ typ = T_lineOut; } QPointF pos = proTer->relativePosition(); PortPos locate; if(pos.x() < 0) { locate = P_left; } else if(pos.x() > 0) { locate = P_right; } else if(pos.y() > 0) { locate = P_down; } else if(pos.y() < 0) { locate = P_top; } pProItem->addPort(P_const,pos,proTer->id(),typ,locate); ItemPort* pPort = pProItem->getPortById(proTer->id()); pPort->setSourcePortId(baseTer->id()); } } pProItem->setItemId(QUuid(pEntity->id())); pProItem->updateHandles(); pProItem->setPos(pBaseItem->pos()); pPanel->getScene()->addItem(pProItem); pProItem->setProperty(pPro); //绑定模型 pProItem->updateByProperty(); //使用模型更新自身 //QString sModel = _projectModelName.value(id.toString()); //QString sModel = pBase->getModelProperty().modelSetting.modelName; //pProItem->setModelName(sModel); pPanel->getModelController()->addNodeItem(QUuid(pEntity->id()),pProItem); } else //连接线对象 { PowerConnection* pCon = TopologyManager::instance().connection(pBase->uuid().toString(),ModelFunctionType::BaseModel); if(pCon){ //基模connect参数 QString baseFromComponentId = pCon->fromComponent(); QString baseToComponentId = pCon->toComponent(); QString baseFromTerId = pCon->fromTerminalId(); QString baseToTerId = pCon->toTerminalId(); QMap mapPro = BasePropertyManager::instance().getEntityData(); bool proFromExist = false; //工程模from对象是否生成 bool proToExist = false; //工程模to对象是否生成 QString proFromItemId; QString proToItemId; QString proFromTerId; QString proToTerId; HandleType proFromType; PortPos proFromPos; HandleType proToType; PortPos proToPos; for(auto& pPro:mapPro) { if(pPro->getSourceItemId() == baseFromComponentId){ proFromExist = true; proFromItemId = pPro->uuid().toString(); continue; } if(pPro->getSourceItemId() == baseToComponentId){ proToExist = true; proToItemId = pPro->uuid().toString(); continue; } } if(!proFromExist) //工程模from对象未生成 { GraphicsBaseModelItem* pFromItem = _baseItem.value(QUuid(baseFromComponentId)); QUuid id = QUuid::createUuid(); BaseProperty* pData = pPanel->getModelController()->addNodeData(id,pFromItem->getProperty()->type(),pFromItem->getProperty()->name(),pFromItem->getProperty()->modelName()); addProjectItemByBaseData(pPanel,pFromItem,pData); proFromItemId = id.toString(); } if(!proToExist) //工程模to对象未生成 { GraphicsBaseModelItem* pToItem = _baseItem.value(QUuid(baseToComponentId)); QUuid id = QUuid::createUuid(); BaseProperty* pData = pPanel->getModelController()->addNodeData(id,pToItem->getProperty()->type(),pToItem->getProperty()->name(),pToItem->getProperty()->modelName()); addProjectItemByBaseData(pPanel,pToItem,pData); proToItemId = id.toString(); } GraphicsProjectModelItem* proFrom = pPanel->getModelController()->nodeItem(QUuid(proFromItemId)); GraphicsProjectModelItem* proTo = pPanel->getModelController()->nodeItem(QUuid(proToItemId)); if(proFrom){ QMap mapFrom = proFrom->getPorts(); for(auto& port:mapFrom){ if(port->getSourcePortId() == baseFromTerId){ proFromTerId = port->getId(); proFromType = port->getType(); proFromPos = port->portPos(); auto pLine = dynamic_cast(pProItem); if(pLine) pLine->setStartPoint(port->scenePos()); } } } if(proTo){ QMap mapTo = proTo->getPorts(); for(auto& port:mapTo){ if(port->getSourcePortId() == baseToTerId){ proToTerId = port->getId(); proToType = port->getType(); proToPos = port->portPos(); auto pLine = dynamic_cast(pProItem); if(pLine) pLine->setEndPoint(port->scenePos()); } } } PowerConnection* pCon = TopologyManager::instance().createConnection(pPro->uuid().toString(),proFromTerId,proToTerId,proFromItemId,proToItemId); auto pLine = dynamic_cast(pProItem); if(pLine) pLine->calculatePath(); pPanel->getModelController()->addNodeItem(pBase->uuid(),pProItem); pProItem->setProperty(pPro); pPro->setConnection(Connection(QUuid(proFromItemId),QUuid(proFromTerId),proFromType,proFromPos,QUuid(proToItemId),QUuid(proToTerId),proToType,proToPos)); } } QString sModel = pBase->getModelProperty().modelSetting.modelName; pProItem->setModelName(sModel); } } } bool FixedPortsModel::addBayItem(QUuid id,ElectricBayItem* pBay) { if(_bayItem.contains(id)) return false; else { _bayItem.insert(id,pBay); return true; } } void FixedPortsModel::addItemsToBay(QList lstItem,ElectricBayItem* pBay) { if(pBay == nullptr) return; BayProperty* proBay = dynamic_cast(pBay->getProperty()); if(proBay){ for(auto& item:lstItem){ if(item){ ModelProperty* p = item->getProperty(); auto lstCom = proBay->getLstComponent(); if(!lstCom.contains(p->uuid())){ proBay->getLstComponent().append(p->uuid()); } } } } } BayProperty* FixedPortsModel::addBayData(QUuid uuid) { BayProperty* pData = BasePropertyManager::instance().findBayData(uuid); //已存在不不创建 if(pData != nullptr) return pData; BayProperty* item = new BayProperty(this); if(item) { item->setUuid(uuid); BasePropertyManager::instance().insertBayData(uuid,item); } return item; } QMap& FixedPortsModel::allBayItem() { return _bayItem; } BayProperty* FixedPortsModel::generateBayData(BayProperty* pData,QList lst) { QUuid id = QUuid::createUuid(); BayProperty* p = addBayData(id); p->setTag(pData->tag()); p->setName(pData->name()); p->setType(pData->getType()); p->setVoltage(pData->getVoltage()); p->setFla(pData->getFla()); p->setCapacity(pData->getCapacity()); p->setInService(pData->getInService()); QList lstCompo = pData->getLstComponent(); QList lstNewCompo = getCorrespondId(lstCompo,lst); //将基模component替换为工程模component p->setLstComponent(lstNewCompo); QList lstFrom = pData->getLstFrom(); QList lstNewFrom = getCorrespondId(lstFrom,lst); p->setLstFrom(lstNewFrom); QList lstTo = pData->getLstTo(); QList lstNewTo = getCorrespondId(lstTo,lst); p->setLstTo(lstNewTo); QList lstProtect = pData->getLstProtect(); QList lstNewProtect = getCorrespondId(lstProtect,lst); p->setLstProtect(lstNewProtect); QList lstFaultRecord = pData->getLstFaultRecord(); QList lstNewFaultRecord = getCorrespondId(lstFaultRecord,lst); p->setLstFaultRecord(lstNewFaultRecord); QList lstDynSense = pData->getLstDynSense(); QList lstNewDynSense = getCorrespondId(lstDynSense,lst); p->setLstDynSense(lstNewDynSense); QList lstStatus = pData->getLstStatus(); QList lstNewStatus = getCorrespondId(lstStatus,lst); p->setLstStatus(lstNewStatus); QList lstInstruct = pData->getLstInstruct(); QList lstNewInstruct = getCorrespondId(lstInstruct,lst); p->setLstInstruct(lstNewInstruct); QList lstEtc = pData->getLstEtc(); QList lstNewEtc= getCorrespondId(lstEtc,lst); p->setLstEtc(lstNewEtc); return p; } QList FixedPortsModel::getCorrespondId(QList lstCompo,QList lst) { QList lstNewCompo; for(auto& uuid:lstCompo) { for(auto& basePro:lst) { if(basePro->getSourceItemId() == uuid.toString()){ //工程模sourceid等于基模存储的componentid, lstNewCompo.append(basePro->uuid()); break; } } } return lstNewCompo; } QRectF FixedPortsModel::calculateItemsBoundingRect(QList items) { if (items.isEmpty()) return QRectF(); // 初始化矩形为第一个item的场景边界矩形 QRectF boundingRect = items.first()->sceneBoundingRect(); // 遍历剩余item,扩展矩形以包含所有item for (int i = 1; i < items.size(); ++i) { QGraphicsItem* item = items.at(i); // 确保item在场景中且有效 if (item && item->scene()) { boundingRect = boundingRect.united(item->sceneBoundingRect()); } } return boundingRect.adjusted(-10,-10,10,10); } void FixedPortsModel::addBayByData(BayProperty* pData) { QList items; QList lstCompo = pData->getLstComponent(); for(auto& id:lstCompo){ if(_nodeItem.contains(id)){ items.append(_nodeItem.value(id)); } } QRectF rec = calculateItemsBoundingRect(items); auto pBay = new ElectricBayItem(rec); pBay->setItemType(GIT_bay); pBay->setProperty(pData); pBay->setText(pData->tag()); addBayItem(pData->uuid(),pBay); getScene()->addItem(pBay); } void FixedPortsModel::addTestData() { QUuid breakerId = QUuid::createUuid(); ElectricBaseModelSvgItem* pBreaker = new ElectricBaseModelSvgItem(QRect(-15, -15, 30, 30)); pBreaker->setItemId(breakerId); pBreaker->setItemType(GIT_baseBreaker); QByteArray byte = DataBase::GetInstance()->ModelType()[3].icon; pBreaker->loadSvg(byte); PowerEntity* pEntityBreaker = TopologyManager::instance().createEntity(EntityType::Component,breakerId.toString(),"断路器1",ModelFunctionType::BaseModel); if(pEntityBreaker) pBreaker->setEntity(pEntityBreaker); BaseModelProperty* pBreakerData = addBaseNodeData(breakerId,3,"断路器1",DataBase::GetInstance()->ModelType()[3].modelType); pBreakerData->setGraphicsType(GIT_baseBreaker); if(pBreakerData) { pBreaker->setProperty(pBreakerData); pBreaker->initialPortsByDatabase(); createTopoTerminalsByItem(pBreaker,ModelFunctionType::BaseModel); pBreakerData->setDataChanged(true); //数据状态改变 } addBaseItem(breakerId,pBreaker); _scene->addItem(pBreaker); pBreaker->setPos(QPointF(0,50)); QUuid busId = QUuid::createUuid(); ElectricBaseModelSvgBus* pBus = new ElectricBaseModelSvgBus(QRect(-200, -3, 400, 6)); pBus->setItemId(busId); pBus->setItemType(GIT_baseBus); //pBreaker->initialPortsByDatabase(); QByteArray byte1 = DataBase::GetInstance()->ModelType()[1].icon; pBus->loadSvg(byte1); //createTopoTerminalsByItem(pBreaker); BaseModelProperty* pBusData = addBaseNodeData(busId,1,"母线1",DataBase::GetInstance()->ModelType()[1].modelType); pBusData->setGraphicsType(GIT_baseBus); if(pBusData) { pBus->setProperty(pBusData); pBusData->setDataChanged(true); //数据状态改变 } PowerEntity* pEntityBus = TopologyManager::instance().createEntity(EntityType::Component,busId.toString(),"母线1",ModelFunctionType::BaseModel); if(pEntityBus) pBus->setEntity(pEntityBus); addBaseItem(busId,pBus); _scene->addItem(pBus); pBus->setPos(QPointF(0,150)); QUuid lineId = QUuid::createUuid(); ElectricBaseModelLineItem* pLine = new ElectricBaseModelLineItem(); pLine->setItemId(lineId); pLine->setItemType(GIT_baseLine); BaseModelProperty* pLineData = addBaseNodeData(lineId,8,"电缆1",DataBase::GetInstance()->ModelType()[4].modelType); pLineData->setGraphicsType(GIT_baseLine); if(pLineData) { pLine->setProperty(pLineData); pLineData->setDataChanged(true); //数据状态改变 } addBaseItem(lineId,pLine); establishConnection(pBreaker,pBus,pLine); _scene->addItem(pLine); QList lst; lst.append(pBreaker); QRectF rec = calculateItemsBoundingRect(lst); ElectricBayItem* pBay = new ElectricBayItem(rec); pBay->setItemType(GIT_bay); pBay->setText("间隔1"); QUuid bayId = QUuid::createUuid(); BayProperty* pBayData = addBayData(bayId); pBay->setProperty(pBayData); pBayData->setName("间隔1"); pBayData->setTag("间隔1"); pBayData->getLstComponent().append(breakerId); addBayItem(bayId,pBay); addItemsToBay(lst,pBay); _scene->addItem(pBay); }