#include #include #include #include #include "drawingPanel.h" #include "diagramCavas.h" #include "dataBase.h" #include "graphicsItem/graphicsBaseItem.h" #include "topologyManager.h" #include "powerEntity.h" #include "diagramEditor/diagramEditorWizard.h" //#include "componentIconManager.h" #include "baseProperty.h" #include "diagramEditor/editPanel.h" #include "graphicsDataModel/diagramEditorModel.h" #include "basePropertyManager.h" DiagramCavas::DiagramCavas(QWidget *parent) : QMdiArea(parent) { _pageIndex = 0; _pEditorWizard = nullptr; } DiagramCavas::~DiagramCavas() { } DrawingPanel* DiagramCavas::getPanel(QString sPage) { if(m_mapDrawPanel.contains(sPage)) return m_mapDrawPanel[sPage].first; return nullptr; } void DiagramCavas::initial() { //todo:读取数据并初始化 QList lst = DataBase::GetInstance()->getAllPage(); for(auto info:lst) { TopologyManager::instance().createDiagram(QString::number(info.id),info.name); } //QString sPath = ComponentIconManager::instance().getIconPath("circuitBreaker",DM_edit,VI_thumbnail); } void DiagramCavas::onSignal_addDrawingPanel(PowerEntity* pItem,DiagramMode mode) { DrawingPanel* pPanel = new DrawingPanel(pItem,this,mode); _curPage = pItem->name(); pPanel->setPageName(_curPage); pPanel->setWindowTitle(_curPage); //->setAttribute(Qt::WA_DeleteOnClose); QMdiSubWindow* pSub = this->addSubWindow(pPanel); m_mapDrawPanel.insert(_curPage,qMakePair(pPanel,pSub)); pPanel->show(); FixedPortsModel* pModel = pPanel->getModelController(); pModel->setCavas(this); connect(pModel,&FixedPortsModel::activatePage,this,&DiagramCavas::onSignal_activatePage); connect(pPanel,&DrawingPanel::panelDelete,this,&DiagramCavas::onSignal_panelDelete); if(mode == DM_baseModel) { } } void DiagramCavas::onSignal_addGraphicsItem(modelStateInfo& info) { QMdiSubWindow* actWindow = activeSubWindow(); if(!actWindow) return; QWidget* pWindow= currentSubWindow()->widget(); DrawingPanel* pPanel = dynamic_cast(pWindow); if(pPanel) pPanel->onSignal_addGraphicsItem(info); } void DiagramCavas::onSignal_addPage() { //onSignal_addDrawingPanel(QString("Page_")+QString::number(++_pageIndex)); } void DiagramCavas::onSignal_savePage() { QWidget* pWindow= currentSubWindow()->widget(); DrawingPanel* pPanel = dynamic_cast(pWindow); if(pPanel) { if(pPanel->getMode() == DM_run) { QMessageBox::about(NULL,QString::fromWCharArray(L"提示"), QString::fromWCharArray(L"运行中无法保存!")); } else if(pPanel->getMode() == DM_edit) { _curPage = pPanel->pageName(); QMessageBox msgBox; msgBox.setText(QString::fromWCharArray(L"提示")); msgBox.setInformativeText(QString::fromWCharArray(L"内容已修改,是否保存?")); msgBox.setStandardButtons(QMessageBox::Save | QMessageBox::Cancel); msgBox.setDefaultButton(QMessageBox::Save); int ret = msgBox.exec(); switch (ret) { case QMessageBox::Save: //todo:已存在更新 { QMap map = pPanel->getModelController()->allItems(); for(auto pItem:map) { BaseProperty* pData = dynamic_cast(pItem->getProperty()); if(pData){ if(pItem->itemChanged() || pData->dataChanged()) { pItem->updateConnectData(); //更新连接状态 pItem->setItemChanged(false); } } } if(DataBase::GetInstance()->getPageIdByName(_curPage) == -1) //不存在,创建 DataBase::GetInstance()->insertPage(_curPage,_curPage,QJsonObject(),pPanel->getDiagramInfo(),QString("page"),1); else DataBase::GetInstance()->updatePage(_curPage,_curPage,pPanel->getDiagramInfo()); int pageId = DataBase::GetInstance()->getPageIdByName(_curPage); pPanel->saveNodes(pageId); } break; case QMessageBox::Cancel: // Cancel was clicked break; default: // should never be reached break; } } else if(pPanel->getMode() == DM_baseModel) { } } } void DiagramCavas::onSignal_loadPage(PowerEntity* p) { if(!m_mapDrawPanel.contains(p->name())) { //todo:加载数据 onSignal_addDrawingPanel(p); QJsonObject context = DataBase::GetInstance()->getPageContextByName(p->name()); m_mapDrawPanel[p->name()].first->loadNodes(context); } else //已存在 { m_mapDrawPanel[p->name()].first->show(); } } void DiagramCavas::runPage(const QString sName) { QString pageName = sName+QString("_run"); if(!m_mapDrawPanel.contains(pageName)) { //onSignal_addDrawingPanel(pageName,DM_run); QJsonObject context = DataBase::GetInstance()->getPageContextByName(sName); //m_mapDrawPanel[pageName]->loadNodes(context); } else //已存在 { //m_mapDrawPanel[pageName]->show(); } } void DiagramCavas::onSignal_runPage() { runPage(_curPage); } void DiagramCavas::onSignal_deletePage() { } void DiagramCavas::onSignal_activatePage(const QString& name) { _curPage = name; } void DiagramCavas::onSignal_panelDelete(const QString& name) { DrawingPanel* pPanel = m_mapDrawPanel.take(name).first; if(m_mapDrawPanel.isEmpty()) { //FixedPortsModel::_dataInitialised = false; } this->removeSubWindow(pPanel); delete pPanel; } void DiagramCavas::onSignal_createEntity(EntityInfo info) { PowerEntity* pEntity; pEntity = TopologyManager::instance().findEntity(info.sUuid); if(!pEntity) //不存在创建 { pEntity = TopologyManager::instance().createEntity(info.eType,info.sUuid,info.sName); PowerEntity* pParent = TopologyManager::instance().findEntity(info.sParentId); if(pParent) //构建父子关系 { pParent->addChild(pEntity); } switch (info.eType){ case EntityType::Grid: case EntityType::Zone: case EntityType::Station: break; case EntityType::ConfigurationDiagram: onSignal_addDrawingPanel(pEntity); break; default: break; } } } void DiagramCavas::onSignal_changeEntity(EntityInfo info) { } void DiagramCavas::onSignal_deleteEntity(EntityInfo info) { PowerEntity* pEntity = TopologyManager::instance().findEntity(info.sUuid); if(pEntity) { switch (info.eType){ case EntityType::Grid: case EntityType::Zone: case EntityType::Station: TopologyManager::instance().deleteEntity(info.sUuid); break; case EntityType::ConfigurationDiagram: removePanel(pEntity); TopologyManager::instance().deleteEntity(info.sUuid); break; default: break; } } } void DiagramCavas::onSignal_selectEntity(EntityInfo info) { PowerEntity* pEntity = TopologyManager::instance().findEntity(info.sUuid); if(pEntity) { switch (info.eType){ case EntityType::Grid: case EntityType::Zone: case EntityType::Station: break; default: break; } } else //不存在,从数据库中load { } } void DiagramCavas::onSignal_createDiagram(DiagramInfo info) { PowerEntity* pEntity; pEntity = TopologyManager::instance().findDiagram(info.id.toString()); if(!pEntity) //不存在创建 { pEntity = TopologyManager::instance().createDiagram(info.id.toString(),info.sName); PowerEntity* pParent = TopologyManager::instance().findDiagram(info.parentId.toString()); if(pParent) //构建父子关系 { pParent->addChild(pEntity); } onSignal_addDrawingPanel(pEntity); } } void DiagramCavas::onSignal_changeDiagram(DiagramInfo info) { } void DiagramCavas::onSignal_deleteDiagram(DiagramInfo info) { PowerEntity* pEntity = TopologyManager::instance().findDiagram(info.id.toString()); if(pEntity) { removePanel(pEntity); TopologyManager::instance().deleteEntity(info.id.toString()); } } void DiagramCavas::onSignal_selectDiagram(DiagramInfo info) { PowerEntity* pEntity = TopologyManager::instance().findDiagram(QString::number(info.id.toInt())); if(pEntity) { onSignal_loadPage(pEntity); } else //不存在,从数据库中load { } } void DiagramCavas::removePanel(PowerEntity* pEntity) { QMap>::Iterator iter; for(iter = m_mapDrawPanel.begin(); iter != m_mapDrawPanel.end();++iter) { if(pEntity->name() == iter.value().first->pageName()) { DrawingPanel* pPanel = m_mapDrawPanel.take(iter.key()).first; QWidget* pWindow = static_cast(pPanel); setActiveSubWindow(iter->second); closeActiveSubWindow(); //removeSubWindow(pPanel); //todo:记录删除组态图,从数据库中删除 delete pPanel; break; } } } void DiagramCavas::onCreateTestBaseModelDiagram() { PowerEntity* pEntity; QUuid id = QUuid::createUuid(); pEntity = TopologyManager::instance().findDiagram(id.toString()); if(!pEntity) //不存在创建 { pEntity = TopologyManager::instance().createDiagram(id.toString(),"测试1"); onSignal_addDrawingPanel(pEntity,DM_baseModel); DrawingPanel* pPanel = getPanel(pEntity->name()); pPanel->getModelController()->addTestData(); } } /*******************************************************/ void DiagramCavas::onSignal_createEditPanel(QString sName) { //onSignal_addEditPanel(sName); onSignal_addEditWizard(sName); } EditPanel* DiagramCavas::onSignal_addEditPanel(QString sName) { EditPanel* pPanel = new EditPanel(this); pPanel->setProjectName(sName); pPanel->setWindowTitle(_curPage); QMdiSubWindow* pSub = this->addSubWindow(pPanel); pPanel->show(); return pPanel; } void DiagramCavas::onSignal_addEditWizard(QString name) { if(_pEditorWizard == nullptr){ _pEditorWizard = new DiagramEditorWizard(this); connect(_pEditorWizard,&DiagramEditorWizard::wizardFinish,this,[&,name](){ EditPanel* pPanel = onSignal_addEditPanel(name); pPanel->setOperateWizard(_pEditorWizard); auto pModel = pPanel->getModel(); if(pModel){ pModel->setWizard(_pEditorWizard); pModel->setCavas(this); } pPanel->initByWizardInfo(); }); } _pEditorWizard->show(); } void DiagramCavas::onSignal_wizardFinished(QString sName,QMap mapItem) { PowerEntity* pEntity; QUuid id = QUuid::createUuid(); pEntity = TopologyManager::instance().findDiagram(id.toString()); if(!pEntity) //不存在创建 { pEntity = TopologyManager::instance().createDiagram(id.toString(),sName); onSignal_addDrawingPanel(pEntity,DM_baseModel); DrawingPanel* pPanel = getPanel(pEntity->name()); TopologyManager::instance().cloneEditorToBase(); //拷贝拓扑结构 QMap mapEditor = BasePropertyManager::instance().getEditorData(); for(auto& pro:mapEditor){ if(BasePropertyManager::instance().findBaseEntityData(pro->uuid()) == nullptr){ //拷贝editor数据到basemodel中 auto pPro = pPanel->getModelController()->addBaseNodeData(pro->uuid(),pro->type(),pro->name(),pro->metaModelName(),pro->getBlock()); pPro->setConnection(pro->getConnection()); } } //pPanel->getModelController()->addTestData(); for(auto pItem:mapItem){ auto cloneItem = pItem->clone(); BaseModelProperty* pPro = BasePropertyManager::instance().findBaseEntityData(cloneItem->itemId()); if(pPro){ cloneItem->setProperty(pPro); pPanel->getScene()->addItem(cloneItem); if(pPro->type() != 8){ PowerEntity* pEntity = TopologyManager::instance().findEntity(pPro->uuid().toString(),ModelFunctionType::BaseModel); if(pEntity) cloneItem->setEntity(pEntity); } else { } } } } } /*******************bay************************/ void DiagramCavas::onSignl_openCurrentBay() { QWidget* pWindow= currentSubWindow()->widget(); DrawingPanel* pPanel = dynamic_cast(pWindow); if(pPanel) { if(pPanel->getMode() == DM_run) { } else if(pPanel->getMode() == DM_edit) { pPanel->getModelController()->onSignal_openBayManager(); } else if(pPanel->getMode() == DM_baseModel) { } } }