DiagramDesigner/diagramCavas/source/diagramCavas.cpp

620 lines
20 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 <QMdiSubWindow>
#include <QMessageBox>
#include <QJsonObject>
#include <QStandardItem>
#include <QLibrary>
#include <QMetaMethod>
#include "monitorPanel.h"
#include "diagramCavas.h"
#include "dataBase.h"
#include "graphicsItem/graphicsBaseItem.h"
#include "projectModelManager.h"
#include "topologyManager.h"
#include "powerEntity.h"
#include "cornerMonitorLauncher.h"
#include "loadMonitorPageDlg.h"
#include "diagramConnectSetting.h"
#include "diagramCommunication/include/communicationManager.h"
#include "diagramCommunication/include/configManager.h"
#include "instance/dataAccessor.h"
#include "uiCommunicationBus.h"
#include "itemPropertyDlg.h"
#include "monitorConfigDlg.h"
#include "structDataPreviewDlg.h"
#include "extraPropertyManager.h"
#include "createHMIdlg.h"
#include "QQuickDetailsViewMananger.h"
#include "propertyType/propertyTypeCustomization_DataSourceType.h"
#include "propertyType/dataSourceType.h"
DiagramCavas::DiagramCavas(QWidget *parent)
: QMdiArea(parent)
,_cornerButton(nullptr)
,_loadMonitorPageDlg(nullptr)
,_connectSetting(nullptr)
,_dataAccessor(nullptr)
,_structDataPreviewDlg(nullptr)
,_extraPropertyManager(nullptr)
,_createHMIDlg(nullptr)
{
_pageIndex = 0;
}
DiagramCavas::~DiagramCavas()
{
disconnect(); //断开连接避免动态库释放时信号问题
}
MonitorPanel* DiagramCavas::getMonitorPanel(QString sPage)
{
if(m_mapMonitorPanel.contains(sPage))
return m_mapMonitorPanel[sPage].first;
return nullptr;
}
void DiagramCavas::updateSubPos()
{
if(_cornerButton)
_cornerButton->positionAtCorner();
}
void DiagramCavas::passRecommmandHttpData(HttpRecommandInfo info)
{
if(_structDataPreviewDlg){ //数据预览dlg
QStringList lst;
for(auto &str:info.lstRecommand){
QString sCompleteName = info.sInput+str;
if(!lst.contains(sCompleteName))
lst.append(sCompleteName);
}
_structDataPreviewDlg->updateRecommandLst(lst);
}
//===============================================
QMdiSubWindow* pSub = currentSubWindow();
if(!pSub)
return;
QWidget* pWindow= pSub->widget();
BaseDrawingPanel* pPanel = dynamic_cast<BaseDrawingPanel*>(pWindow);
if(pPanel)
{
if(pPanel->getMode() == DM_run)
{
auto pMonitor = dynamic_cast<MonitorPanel*>(pPanel);
if(pMonitor){
auto pDlg = pMonitor->getMonitorConfigDlg();
if(pDlg){
QStringList lst;
for(auto &str:info.lstRecommand){
QString sCompleteName = info.sInput+str;
if(!lst.contains(sCompleteName))
lst.append(sCompleteName);
}
pDlg->updateRecommandLst(lst);
}
//FixedPortsModel* pModel = pMonitor->getModelController();
}
}
}
}
void DiagramCavas::initial()
{
//todo:读取数据并初始化
QList<PageInfo> lst = DataBase::GetInstance()->getAllPage();
for(auto &info:lst)
{
TopologyManager::instance().createDiagram(QString::number(info.id),info.name);
}
_cornerButton = new CornerMonitorLauncher(this);
_cornerButton->showDlg();
_loadMonitorPageDlg = new LoadMonitorPageDlg(this);
connect(_cornerButton,&CornerMonitorLauncher::openLoadMonitorDlg,this,[&](){
if(_loadMonitorPageDlg){
updateMonitorListFromDB(1);
_loadMonitorPageDlg->show();
}
});
connect(_loadMonitorPageDlg,&LoadMonitorPageDlg::monitorSelected,this,&DiagramCavas::onSignal_monitorSelected);
_connectSetting = new DiagramConnectSetting(this);
// 初始化通信管理器
CommunicationManager* comm = CommunicationManager::instance();
comm->initialize();
// 加载配置
ConfigManager* config = ConfigManager::instance();
config->loadConfig("config.json");
_extraPropertyManager = new ExtraPropertyManager(this);
_extraPropertyManager->initial();
// 应用配置
comm->updateHttpConfig(config->getHttpConfig());
comm->updateWebSocketConfig(config->getWebSocketConfig());
_dataAccessor = new DataAccessor(this);
_dataAccessor->setParent(this);
connect(UiCommunicationBus::instance(),
SIGNAL(httpDataProcessed(QString,QVariant)),
_dataAccessor,
SLOT(onReceiveHttpData(QString,QVariant)),
Qt::AutoConnection);
connect(UiCommunicationBus::instance(),
SIGNAL(websocketDataProcessed(QVariant)),
_dataAccessor,
SLOT(onReceiveWebsocketData(QVariant)),
Qt::AutoConnection);
_structDataPreviewDlg = new StructDataPreviewDlg(this);
_structDataPreviewDlg->setExtraPropertyManager(_extraPropertyManager);
_structDataPreviewDlg->loadData();
QQuickDetailsViewManager::Get()->registerPropertyTypeCustomization<DataSourceType, PropertyTypeCustomization_DataSourceType>();
_createHMIDlg = new CreateHMIdlg(this);
connect(_createHMIDlg,&CreateHMIdlg::createHMI,this,&DiagramCavas::onSignal_createHMIClicked);
updateHMIlstFromDB();
}
void DiagramCavas::onSignal_addDrawingPanel(PowerEntity* pItem,DiagramMode mode,QString parent)
{
if(mode == DM_run){
MonitorPanel* pPanel = new MonitorPanel(pItem,this,mode);
_curPage = pItem->name();
pPanel->setPageName(_curPage);
pPanel->setWindowTitle(_curPage);
pPanel->setParentPage(parent);
QMdiSubWindow* pSub = this->addSubWindow(pPanel);
m_mapMonitorPanel.insert(_curPage,qMakePair(pPanel,pSub));
pPanel->show();
FixedPortsModel* pModel = pPanel->getModelController();
pModel->setCavas(QPointer<DiagramCavas>(this));
connect(pModel,&FixedPortsModel::activatePage,this,&DiagramCavas::onSignal_activatePage);
connect(pPanel,&MonitorPanel::panelDelete,this,&DiagramCavas::onSignal_panelDelete);
connect(pModel,&FixedPortsModel::monitorCreated,this,&DiagramCavas::onSignal_monitorCreated);
connect(pModel,&FixedPortsModel::monitorItems,this,&DiagramCavas::onSignal_monitorItemCreated);
//connect(pModel,&FixedPortsModel::notifyUpdateMonitorTopology,this,&DiagramCavas::onSignal_updateMonitorTopology); ***使用属性构建拓扑层级暂不使用260317 by
connect(pModel,&FixedPortsModel::updateTopologyItems,this,&DiagramCavas::onSignal_updateTopology);
connect(pModel,&FixedPortsModel::HMIUpdated,this,&DiagramCavas::onSignal_updateHMI);
}
calculateLauncherVisible();
}
void DiagramCavas::onSignal_addGraphicsItem(ModelStateInfo& info)
{
QMdiSubWindow* actWindow = activeSubWindow();
if(!actWindow)
return;
QWidget* pWindow= currentSubWindow()->widget();
/*DrawingPanel* pPanel = dynamic_cast<DrawingPanel*>(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();
BaseDrawingPanel* pPanel = dynamic_cast<BaseDrawingPanel*>(pWindow);
if(pPanel)
{
if(pPanel->getMode() == DM_run)
{
auto pMonitor = dynamic_cast<MonitorPanel*>(pPanel);
if(pMonitor){
auto pEntity = pMonitor->getEntity();
if(pEntity){
QMap<QByteArray,HMIImageInfo>& mapResource = ProjectModelManager::instance().getHMIimageMap();
DataBase::GetInstance()->insertHMIimagesWithCheck(mapResource.values()); //智能查重插入HMIsource
QList<HMIImageRef>& imgRefLst = pMonitor->getModelController()->getHMIimageRef(); //获取当前HMI所有img引用
if(imgRefLst.size()){
auto lstRef = DataBase::GetInstance()->getHMIRefAll(imgRefLst.first().hmiId); //检测HMI是否存储过删除旧img引用
if(lstRef.size())
DataBase::GetInstance()->removeHMIRefAll(imgRefLst.first().hmiId);
DataBase::GetInstance()->insertHMIimageRefBatch(imgRefLst); //全部重新插入
}
if(DataBase::GetInstance()->getHMIdByName(pEntity->name()).isNull()) //不存在,创建
DataBase::GetInstance()->insertHMI(QUuid(pEntity->id()),pEntity->name(),pEntity->name(),pMonitor->getDiagramInfo());
else
DataBase::GetInstance()->updateHMI(pEntity->name(),pMonitor->getDiagramInfo());
auto pControl = pMonitor->getModelController();
if(pControl)
emit pControl->HMIUpdated(pEntity->name(),QUuid(pEntity->id()),1,QDateTime::currentDateTime().toString("yyyy-MM-dd HH:mm"));
QMessageBox::information(NULL, QString("提示"), QString::fromWCharArray(L"保存成功"));
}
}
}
}
}
void DiagramCavas::onSignal_loadMonitor(PowerEntity* p)
{
if(!m_mapMonitorPanel.contains(p->name()))
{
onSignal_addDrawingPanel(p,DiagramMode::DM_run);
QJsonObject context = DataBase::GetInstance()->getHMIContextByTag(p->name());
m_mapMonitorPanel[p->name()].first->loadNodes(context);
}
else //已存在
{
m_mapMonitorPanel[p->name()].first->show();
}
}
void DiagramCavas::runPage(const QString sName)
{
QString pageName = sName+QString("_run");
if(!m_mapMonitorPanel.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,int nType)
{
if(nType == 2){
MonitorPanel* pPanel = m_mapMonitorPanel.take(name).first;
this->removeSubWindow(pPanel);
delete pPanel;
}
calculateLauncherVisible();
}
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,DiagramMode mode)
{
PowerEntity* pEntity;
ModelFunctionType type;
if(mode == DM_run)
type = ModelFunctionType::RuntimeModel;
else if(mode == DM_edit)
type = ModelFunctionType::ProjectModel;
pEntity = TopologyManager::instance().findDiagram(info.id.toString(),type);
if(!pEntity) //不存在创建
{
pEntity = TopologyManager::instance().createDiagram(info.id.toString(),info.sName,type);
/*PowerEntity* pParent = TopologyManager::instance().findDiagram(info.parentId.toString());
if(pParent) //构建父子关系
{
pParent->addChild(pEntity);
}*/
onSignal_addDrawingPanel(pEntity,mode);
}
}
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::onSignal_openNetSetting()
{
if(_connectSetting){
_connectSetting->showDlg();
}
}
void DiagramCavas::onSignal_openStructDataPreview()
{
if(_structDataPreviewDlg)
_structDataPreviewDlg->showDlg();
}
void DiagramCavas::onSignal_createHMI(QString sName,QUuid id)
{
emit createHMI(sName,id);
}
void DiagramCavas::onSignal_updateHMI(QString sName,QUuid id,int nState,QString sTime)
{
emit updateHMI(sName,id,nState,sTime);
}
void DiagramCavas::removePanel(PowerEntity* pEntity)
{
QMap<QString,QPair<MonitorPanel*,QMdiSubWindow*>>::Iterator iter;
for(iter = m_mapMonitorPanel.begin(); iter != m_mapMonitorPanel.end();++iter)
{
if(pEntity->name() == iter.value().first->pageName())
{
MonitorPanel* pPanel = m_mapMonitorPanel.take(iter.key()).first;
QWidget* pWindow = static_cast<QWidget*>(pPanel);
setActiveSubWindow(iter->second);
closeActiveSubWindow();
//removeSubWindow(pPanel);
//todo记录删除组态图从数据库中删除
delete pPanel;
break;
}
}
}
void DiagramCavas::calculateLauncherVisible()
{
if(_cornerButton){
if (m_mapMonitorPanel.isEmpty()) {
_cornerButton->setVisible(true);
} else {
_cornerButton->setVisible(false);
}
}
}
void DiagramCavas::resizeEvent(QResizeEvent* event)
{
if(_cornerButton)
_cornerButton->positionAtCorner();
}
void DiagramCavas::onTargetSelected(QObject* obj)
{
if(obj)
emit selectTarget(obj);
}
/****************************************************/
void DiagramCavas::onSignal_updateTopology(QList<HierarchyItem> lst,bool refresh,bool showFull)
{
emit prepareUpdateTopology(lst,refresh,showFull);
}
/*******************bay************************/
void DiagramCavas::onSignl_openCurrentBay()
{
/*QWidget* pWindow= currentSubWindow()->widget();
if(pWindow == nullptr){
QMessageBox::information(NULL, QString("提示"), QString::fromWCharArray(L"当前无打开的工程模"));
}
MonitorPanel* pPanel = dynamic_cast<MonitorPanel*>(pWindow);
if(pPanel)
{
if(pPanel->getMode() == DM_run)
{
pPanel->getModelController()->onSignal_openBayManager();
}
}*/
}
/*********************monitor**************************/
void DiagramCavas::onCreateHMIClicked()
{
if(_createHMIDlg)
_createHMIDlg->showDlg();
}
void DiagramCavas::onSignal_createHMIClicked(QString sHMI,QString sStructPage,int modelType)
{
QUuid id = QUuid::createUuid();
auto *pEntity = TopologyManager::instance().createDiagram(id.toString(),sHMI,ModelFunctionType::RuntimeModel);
onSignal_addDrawingPanel(pEntity,DiagramMode::DM_run);
QJsonObject context = DataBase::GetInstance()->getMonitorContextByTag(sStructPage);
m_mapMonitorPanel[sHMI].first->loadNodes(context); //加载系统图结构
onSignal_createHMI(sHMI,id);
}
void DiagramCavas::onSignal_updateCurItems(QList<HierarchyItem> lst,bool refresh)
{
emit prepareUpdateItems(lst,refresh);
}
void DiagramCavas::onSignal_selectedItems(QList<HierarchyItem> lst)
{
emit prepareSelectItems(lst);
}
void DiagramCavas::onSignal_monitorCreated(QString sProj,QPair<QString,QUuid> pair)
{
emit updateMonitorList(sProj,pair);
}
void DiagramCavas::onSignal_monitorItemCreated(QList<HierarchyItem> lst)
{
emit createdMonitorItems(lst);
}
void DiagramCavas::onSignal_monitorSelected(DiagramInfo info)
{
PowerEntity* pEntity = TopologyManager::instance().findDiagram(info.id.toString(),ModelFunctionType::RuntimeModel);
if(pEntity)
{
onSignal_loadMonitor(pEntity);
}
}
void DiagramCavas::onSignal_saveMonitor(QList<QPair<QString,QUuid>> lst)
{
for(auto &pair:lst){
auto pMonitor = m_mapMonitorPanel.value(pair.first).first;
if(pMonitor){
if(DataBase::GetInstance()->getPageIdByName(pMonitor->getParentPage()) == -1){
QMessageBox::information(NULL, QString("提示"), QString::fromWCharArray(L"请先保存工程模型"));
return;
}
}
}
for(auto& pair:lst){
auto pMonitor = m_mapMonitorPanel.value(pair.first).first;
if(pMonitor){
if(DataBase::GetInstance()->getMonitorIdByName(pair.first).isNull()) //不存在,创建
DataBase::GetInstance()->insertMonitor(pair.second,pair.first,pair.first,pMonitor->getParentPage(),pMonitor->getDiagramInfo());
else
DataBase::GetInstance()->updateMonitor(pair.first,pMonitor->getDiagramInfo());
}
}
QMessageBox::information(NULL, QString("提示"), QString::fromWCharArray(L"保存成功"));
}
void DiagramCavas::updateMonitorListFromDB(int dest)
{
if(dest != 0)
_loadMonitorPageDlg->clearItems();
QList<MonitorPageInfo> lstMonitor = DataBase::GetInstance()->getAllMonitor();
for(auto &info:lstMonitor)
{
auto p = TopologyManager::instance().findDiagram(info.uid.toString(),ModelFunctionType::RuntimeModel);
if(!p){
TopologyManager::instance().createDiagram(info.uid.toString(),info.name,ModelFunctionType::RuntimeModel);
if(dest == 0)
emit updateMonitorList(info.parent,qMakePair(info.name,info.uid));
else{
_loadMonitorPageDlg->updateItems(info.parent,qMakePair(info.name,info.uid));
}
}
else{ //存在直接发送
if(dest == 0)
emit updateMonitorList(info.parent,qMakePair(info.name,info.uid));
else{
_loadMonitorPageDlg->updateItems(info.parent,qMakePair(info.name,info.uid));
}
}
}
}
void DiagramCavas::onSignal_updateMonitorTopology(QList<QUuid> lst)
{
emit updateMonitorTopology(lst);
}
void DiagramCavas::updateHMIlstFromDB()
{
QList<HMIPageInfo> lstMonitor = DataBase::GetInstance()->getAllHMI();
for(auto &info:lstMonitor)
{
auto p = TopologyManager::instance().findDiagram(info.uid.toString(),ModelFunctionType::RuntimeModel);
if(!p){
TopologyManager::instance().createDiagram(info.uid.toString(),info.name,ModelFunctionType::RuntimeModel);
}
}
}