From 3a369e0b973babbf1899a29981e104a349154e87 Mon Sep 17 00:00:00 2001 From: baiYue Date: Thu, 30 Oct 2025 17:20:10 +0800 Subject: [PATCH] add editor save/load --- common/include/global.h | 18 +- diagramCavas/include/diagramCavas.h | 7 +- .../diagramEditorStructContainer.h | 1 + .../diagramEditor/diagramEditorWizard.h | 7 +- .../include/diagramEditor/editPanel.h | 14 +- diagramCavas/include/drawingPanel.h | 2 +- .../graphicsDataModel/diagramEditorModel.h | 1 + diagramCavas/source/diagramCavas.cpp | 69 ++++- .../source/diagramEditor/confirmEditorDlg.cpp | 2 +- .../diagramEditorBayDetailAddDlg.cpp | 13 +- .../diagramEditorBayDetailSettingDlg.cpp | 1 + .../diagramEditorBaySettingDlg.cpp | 2 + .../diagramEditorStructContainer.cpp | 9 + .../diagramEditor/diagramEditorWizard.cpp | 251 ++++++++++++++++-- .../source/diagramEditor/editPanel.cpp | 50 +++- .../source/diagramEditor/editScene.cpp | 5 +- .../diagramEditor/wizardBayContentDlg.cpp | 7 +- .../diagramEditor/wizardBusTableDelegate.cpp | 17 -- diagramCavas/source/drawingPanel.cpp | 2 +- diagramCavas/ui/confirmEditorDlg.ui | 4 +- diagramUtils/include/basePropertyManager.h | 1 + diagramUtils/include/dataBase.h | 12 +- diagramUtils/include/projectManager.h | 23 +- diagramUtils/source/basePropertyManager.cpp | 8 + diagramUtils/source/dataBase.cpp | 223 ++++++++++++---- diagramUtils/source/projectManager.cpp | 82 ++++-- include/diagramView.h | 5 +- include/mainwindow.h | 3 +- source/createEditor.cpp | 7 +- source/diagramView.cpp | 149 +++++++++-- source/loadPageDlg.cpp | 3 +- source/mainwindow.cpp | 26 +- source/topologyView.cpp | 16 +- ui/diagramView.ui | 14 +- 34 files changed, 827 insertions(+), 227 deletions(-) diff --git a/common/include/global.h b/common/include/global.h index e07903b..e47dadd 100644 --- a/common/include/global.h +++ b/common/include/global.h @@ -427,14 +427,14 @@ struct DiagramEditorWizardBusInfo //组态编辑母线信息 int nNum1 = 0; //1母 int nNum2 = 0; //2母 int connectType = 0; //接线方式,1为分段连接 - bool bChanged = false; //是否改变 + int nState = 0; //母线状态位 0已保存1新建2修改 friend QDataStream &operator<<(QDataStream &out, const DiagramEditorWizardBusInfo &data) { - out << data.nIndex << data.dVoltage << data.nLineType << data.nNum1 << data.nNum2 << data.connectType << data.bChanged; + out << data.nIndex << data.dVoltage << data.nLineType << data.nNum1 << data.nNum2 << data.connectType << data.nState; return out; } friend QDataStream &operator>>(QDataStream &in, DiagramEditorWizardBusInfo &data) { - in >> data.nIndex >> data.dVoltage >> data.nLineType >> data.nNum1 >> data.nNum2 >> data.connectType >> data.bChanged; + in >> data.nIndex >> data.dVoltage >> data.nLineType >> data.nNum1 >> data.nNum2 >> data.connectType >> data.nState; return in; } }; @@ -921,7 +921,17 @@ struct editorProjectInfo //editor工程数据 QUuid uuid; QString name; QString tag; - QByteArray context; +}; + +struct editorBaseSettingInfo //editor基础设置 +{ + int id = 0; + QUuid uuid; + QString projectName; //所属工程名 + QString autor; //作者 + QByteArray context; //内容 + QUuid generateUid; //生成的图uuid + QString ts; //时间戳 }; //================================================== diff --git a/diagramCavas/include/diagramCavas.h b/diagramCavas/include/diagramCavas.h index 7974578..0a8051a 100644 --- a/diagramCavas/include/diagramCavas.h +++ b/diagramCavas/include/diagramCavas.h @@ -40,7 +40,7 @@ public slots: void onSignal_deletePage(); void onSignal_activatePage(const QString& name); - void onSignal_panelDelete(const QString& name); + void onSignal_panelDelete(const QString& name,int nType); //type:0editorPanel,1drawPanel void onSignal_createEntity(EntityInfo); void onSignal_changeEntity(EntityInfo); @@ -55,10 +55,13 @@ public slots: void onCreateTestBaseModelDiagram(); //生成测试基模图 /******************************生成组态***********************************/ void onSignal_createEditPanel(QString,QUuid); + void onSignal_prepareOpenSetting(QString); void onSignal_prepareSaveEdit(QString); + void onSignal_prepareDeleteEditor(const QString&,QUuid); EditPanel* onSignal_addEditPanel(QString); - void onSignal_addEditWizard(QString,QUuid); + void onSignal_addEditWizard(QString,QUuid,bool val = true); //bool:是否显示wizard void onSignal_wizardFinished(QString,QMap,QList); + void onSignal_unloadProject(const QString&); /*********************************间隔**************************************/ void onSignl_openCurrentBay(); private: diff --git a/diagramCavas/include/diagramEditor/diagramEditorStructContainer.h b/diagramCavas/include/diagramEditor/diagramEditorStructContainer.h index 5067747..fac606b 100644 --- a/diagramCavas/include/diagramEditor/diagramEditorStructContainer.h +++ b/diagramCavas/include/diagramEditor/diagramEditorStructContainer.h @@ -37,6 +37,7 @@ public: void setMaxDownH(double d){dMaxDownH = d;} double getMaxDownH() {return dMaxDownH;} QMap> getMapBlocksData(); //返回mapBlock中的数据 + void clearData(); private: QMap> _mapBlocks; //容器中包含的对象列表, pos当前容器中的位置:0上,1中上,2中下,3下 diff --git a/diagramCavas/include/diagramEditor/diagramEditorWizard.h b/diagramCavas/include/diagramEditor/diagramEditorWizard.h index 5ac4e2c..b3dce3c 100644 --- a/diagramCavas/include/diagramEditor/diagramEditorWizard.h +++ b/diagramCavas/include/diagramEditor/diagramEditorWizard.h @@ -60,6 +60,7 @@ public: int getContainerIndex(int nLevel,DiagramEditorStructContainer*); //返回目标层级container的序号 QUuid addConnection(const QString& str1,const QString& str2,int nType1,int nType2,int nPara = 0); //插入连接 QMap& getConnection() {return _mapConnect;} + QList findConnectionByBlock(QString,int); //通过block找到连接 void removeConnection(QUuid); DiagramEditorProjectInfo getCurPara(); //获取当前的向导设置参数(同步数据到projectManager) void setPara(DiagramEditorProjectInfo); //使用load数据初始化 @@ -69,6 +70,11 @@ private: void generateBayStruct(); //根据bus设置生成bay结构 void addTransformer(DiagramEditorWizardTransformerInfo); //界面上添加变压器 template void reindexQMap(QMap &map); //重新排序函数 + void clearTargetLevelContent(int); //清除目标层的数据 + + void resetBusByData(); //根据数据设置bus界面 + void resetBayByData(); + void resetTransByData(); private: Ui::diagramEditorWizard *ui; BiDirectionalMap _divideType; //划分段数名对照 @@ -78,7 +84,6 @@ private: QMap _mapBus; //母线信息 QMap> _mapSturctContainer; //划分后的区块 QMap _mapConnect; //连接列表 - bool _busPageChanged; //母线页改变 }; #endif diff --git a/diagramCavas/include/diagramEditor/editPanel.h b/diagramCavas/include/diagramEditor/editPanel.h index 48d0bfe..857b51e 100644 --- a/diagramCavas/include/diagramEditor/editPanel.h +++ b/diagramCavas/include/diagramEditor/editPanel.h @@ -34,7 +34,8 @@ public: void initByWizardInfo(); void initBlockConnection(); //初始化block之间的连接信息 void showPreview(); //展示预览 - void showConfirmDlg(); //展示确认对话框 + void showConfirmDlg(); //展示确认对话框 bool:保存后是否生成 + void generate(); void showWizard(); DiagramEditorModel* getModel() {return _pModel;} @@ -46,10 +47,12 @@ public: void setUuid(QUuid uid) {_uid = uid;} QUuid getUuid() {return _uid;} void setCavas(QPointer p){_pCavas = p;} + void setTag(const QString& s){_tagName = s;} + QString getTag(){return _tagName;} QPointer getCavas(){return _pCavas;} void prepareSaveEditor(); //准备保存 - void loadEditor(const QString&); + void loadBaseSetting(QUuid); public slots: void onWidthChanged(int width); void onContainerSizeChanged(EditContainerItem*); //容器大小改变时调整内部大小 @@ -59,6 +62,10 @@ private: void calculateContainerWidth(EditContainerItem*); //根据间隔数量计算容器宽度 todo:区分上下间隔 int getContainerBusType(QMap>); //返回容器中母线类型(单双) EditBaseItem* getItemByName(const QString&); //根据名称获取指定item +signals: + void panelDelete(const QString&,int); +protected: + void closeEvent(QCloseEvent *closeEvent); private: EditView* m_pEditView; EditScene* m_pEditScene; @@ -75,8 +82,11 @@ private: DiagramEditorModel* _pModel; DiagramEditorPreviewDlg* _pPreview; ConfirmEditorDlg* _confirmEditor; + QString _tagName; //显示的名称(load后,新建不用) QString _projectName; QUuid _uid; + QString _author; + QString _timeStamp; DiagramEditorWizard* _pEditorWizard; QPointer _pCavas; //顶层界面容器 }; diff --git a/diagramCavas/include/drawingPanel.h b/diagramCavas/include/drawingPanel.h index 5e02381..12690b3 100644 --- a/diagramCavas/include/drawingPanel.h +++ b/diagramCavas/include/drawingPanel.h @@ -51,7 +51,7 @@ public: DesignerScene* getScene() {return m_pGraphicsScene;} DesignerView* getView() {return m_pGraphicsView;} signals: - void panelDelete(const QString&); + void panelDelete(const QString&,int); protected: void closeEvent(QCloseEvent *closeEvent); public slots: diff --git a/diagramCavas/include/graphicsDataModel/diagramEditorModel.h b/diagramCavas/include/graphicsDataModel/diagramEditorModel.h index 65a1ad9..ad40fb5 100644 --- a/diagramCavas/include/graphicsDataModel/diagramEditorModel.h +++ b/diagramCavas/include/graphicsDataModel/diagramEditorModel.h @@ -37,6 +37,7 @@ public: EditPanel* getPanel(){return _pPanel;} void setWizard(QPointer p){_pWizard = p;} QMap getPreviewItem(){return _previewItem;}; + void clearItems(){_previewItem.clear();} void generatePreview(); //生成预览 void calculateBlockPos(); //重新计算block位置 diff --git a/diagramCavas/source/diagramCavas.cpp b/diagramCavas/source/diagramCavas.cpp index ffad35b..94a5ab9 100644 --- a/diagramCavas/source/diagramCavas.cpp +++ b/diagramCavas/source/diagramCavas.cpp @@ -48,7 +48,7 @@ void DiagramCavas::initial() { //todo:读取数据并初始化 QList lst = DataBase::GetInstance()->getAllPage(); - for(auto info:lst) + for(auto &info:lst) { TopologyManager::instance().createDiagram(QString::number(info.id),info.name); } @@ -179,8 +179,8 @@ void DiagramCavas::onSignal_loadEdit(const QString& sProject,QUuid uid) if(!m_mapEditPanel.contains(sProject)) { //todo:加载数据 - onSignal_addEditWizard(sProject,uid); - m_mapEditPanel[sProject].first->loadEditor(sProject); + onSignal_addEditWizard(sProject,uid,false); + m_mapEditPanel[sProject].first->loadBaseSetting(uid); } else //已存在 { @@ -219,15 +219,23 @@ void DiagramCavas::onSignal_activatePage(const QString& name) _curPage = name; } -void DiagramCavas::onSignal_panelDelete(const QString& name) +void DiagramCavas::onSignal_panelDelete(const QString& name,int nType) { - DrawingPanel* pPanel = m_mapDrawPanel.take(name).first; - if(m_mapDrawPanel.isEmpty()) - { - //FixedPortsModel::_dataInitialised = false; + if(nType == 0){ + EditPanel* pPanel = m_mapEditPanel.take(name).first; + BasePropertyManager::instance().clearEditorData(); //关闭前清空当前单例 todo:测试其他单例 + this->removeSubWindow(pPanel); + delete pPanel; + } + else if(nType == 1){ + DrawingPanel* pPanel = m_mapDrawPanel.take(name).first; + if(m_mapDrawPanel.isEmpty()) + { + + } + this->removeSubWindow(pPanel); + delete pPanel; } - this->removeSubWindow(pPanel); - delete pPanel; } void DiagramCavas::onSignal_createEntity(EntityInfo info) @@ -391,21 +399,43 @@ void DiagramCavas::onSignal_createEditPanel(QString sName,QUuid uid) onSignal_addEditWizard(sName,uid); } -void DiagramCavas::onSignal_prepareSaveEdit(QString sProject) +void DiagramCavas::onSignal_prepareOpenSetting(QString sProject) { EditPanel* pPanel = getEditPanel(sProject); + if(pPanel){ + pPanel->showWizard(); + } +} + +void DiagramCavas::onSignal_prepareSaveEdit(QString sProject) +{ + QString sName = sProject; + if(sProject == "currentPage"){ + sName = _curPage; + } + EditPanel* pPanel = getEditPanel(sName); if(pPanel){ pPanel->prepareSaveEditor(); } } +void DiagramCavas::onSignal_prepareDeleteEditor(const QString& sProject,QUuid uid) +{ + EditPanel* pPanel = getEditPanel(sProject); + if(pPanel){ + pPanel->close(); + } +} + EditPanel* DiagramCavas::onSignal_addEditPanel(QString sName) { EditPanel* pPanel = new EditPanel(this); pPanel->setProjectName(sName); + pPanel->setTag(sName); _curPage = sName; pPanel->setWindowTitle(_curPage); pPanel->setCavas(this); + connect(pPanel,&EditPanel::panelDelete,this,&DiagramCavas::onSignal_panelDelete); QMdiSubWindow* pSub = this->addSubWindow(pPanel); m_mapEditPanel.insert(_curPage,qMakePair(pPanel,pSub)); @@ -413,11 +443,12 @@ EditPanel* DiagramCavas::onSignal_addEditPanel(QString sName) return pPanel; } -void DiagramCavas::onSignal_addEditWizard(QString name,QUuid uid) +void DiagramCavas::onSignal_addEditWizard(QString name,QUuid uid,bool val) { EditPanel* pPanel = onSignal_addEditPanel(name); pPanel->setUuid(uid); - pPanel->showWizard(); + if(val) + pPanel->showWizard(); } void DiagramCavas::onSignal_wizardFinished(QString sName,QMap mapItem,QList mapBay) @@ -438,6 +469,18 @@ void DiagramCavas::onSignal_wizardFinished(QString sName,QMapremoveSubWindow(pPanel); + delete pPanel; + } + m_mapEditPanel.clear(); +} /*******************bay************************/ void DiagramCavas::onSignl_openCurrentBay() { diff --git a/diagramCavas/source/diagramEditor/confirmEditorDlg.cpp b/diagramCavas/source/diagramEditor/confirmEditorDlg.cpp index 22bb2f2..36df85a 100644 --- a/diagramCavas/source/diagramEditor/confirmEditorDlg.cpp +++ b/diagramCavas/source/diagramEditor/confirmEditorDlg.cpp @@ -36,7 +36,7 @@ void ConfirmEditorDlg::onOkClicked() QDateTime currentDateTime = QDateTime::currentDateTime(); // 将日期和时间格式化为字符串 - QString dateTimeString = currentDateTime.toString("yyyy-MM-dd hh:mm:ss"); + QString dateTimeString = currentDateTime.toString("yyyy-MM-dd_hh:mm:ss"); emit onConfirmEditor(ui->le_name->text(),dateTimeString); hide(); diff --git a/diagramCavas/source/diagramEditor/diagramEditorBayDetailAddDlg.cpp b/diagramCavas/source/diagramEditor/diagramEditorBayDetailAddDlg.cpp index 5ef4bc6..db4e4fc 100644 --- a/diagramCavas/source/diagramEditor/diagramEditorBayDetailAddDlg.cpp +++ b/diagramCavas/source/diagramEditor/diagramEditorBayDetailAddDlg.cpp @@ -143,7 +143,7 @@ void DiagramEditorBayDetailAddDlg::showDlg() for(int i = 0;i < nCount;++i){ QStandardItem *itemRouteName = pRoute->item(i, 0); int nMain = itemRouteName->data().toInt(); - if(nMain == 1){ //主线已存在 + if(nMain == 1){ //主线已存在,新路线(本路线)设置为支线 ui->cb_lineType->setCurrentIndex(1); } } @@ -153,6 +153,9 @@ void DiagramEditorBayDetailAddDlg::showDlg() void DiagramEditorBayDetailAddDlg::showDlg(DiagramEditorRouteInfo info) { if(_pParent){ + auto pCompo = _pParent->getComponentModel(); + auto pRoute = _pParent->getRouteModel(); + ui->tableView_items->setModel(pCompo); _selectedModel->clear(); _selectedModel->setHorizontalHeaderLabels({"分类", "名称", "类型", "关联对象", "引用线路"}); ui->le_routeName->setText(info.sRouteName); @@ -233,20 +236,18 @@ void DiagramEditorBayDetailAddDlg::showDlg(DiagramEditorRouteInfo info) _curMode = 1; updateBindLst(); - auto pRoute = _pParent->getRouteModel(); int nCount = pRoute->rowCount(); for(int i = 0;i < nCount;++i){ QStandardItem *itemRouteName = pRoute->item(i, 0); if(itemRouteName->text() == info.sRouteName){ int nMain = itemRouteName->data().toInt(); if(nMain == 1){ //读取并设置是否主线 - ui->cb_lineType->setCurrentIndex(1); - } - else{ ui->cb_lineType->setCurrentIndex(0); } + else{ + ui->cb_lineType->setCurrentIndex(1); + } } - } } } diff --git a/diagramCavas/source/diagramEditor/diagramEditorBayDetailSettingDlg.cpp b/diagramCavas/source/diagramEditor/diagramEditorBayDetailSettingDlg.cpp index e60f225..a8548ff 100644 --- a/diagramCavas/source/diagramEditor/diagramEditorBayDetailSettingDlg.cpp +++ b/diagramCavas/source/diagramEditor/diagramEditorBayDetailSettingDlg.cpp @@ -175,6 +175,7 @@ void DiagramEditorBayDetailSettingDlg::refreshModel() QStandardItem *itemComponents = new QStandardItem(); itemRoute->setText(sRoute); + itemRoute->setData(route.bMainRoute); itemComponents->setText(lstComp.join(",")); QList lstItems; lstItems<getBayType()); + ui->cb_type->setCurrentIndex(nType); ui->le_name->setText(p->getName()); ui->cb_level->setCurrentIndex(nLevel); if(p){ diff --git a/diagramCavas/source/diagramEditor/diagramEditorStructContainer.cpp b/diagramCavas/source/diagramEditor/diagramEditorStructContainer.cpp index 47b3748..48d4bf4 100644 --- a/diagramCavas/source/diagramEditor/diagramEditorStructContainer.cpp +++ b/diagramCavas/source/diagramEditor/diagramEditorStructContainer.cpp @@ -8,6 +8,7 @@ DiagramEditorStructContainer::DiagramEditorStructContainer(QObject *parent) } DiagramEditorStructContainer::~DiagramEditorStructContainer() { + clearData(); } bool DiagramEditorStructContainer::insertBlock(int nPos,DiagramEditorBaseBlock* p) @@ -38,3 +39,11 @@ QMap> DiagramEditorStructContainer::getMapBloc return map; } + +void DiagramEditorStructContainer::clearData() +{ + for(auto &lstCon:_mapBlocks){ + qDeleteAll(lstCon); + } + _mapBlocks.clear(); +} diff --git a/diagramCavas/source/diagramEditor/diagramEditorWizard.cpp b/diagramCavas/source/diagramEditor/diagramEditorWizard.cpp index 63cc552..16ce58c 100644 --- a/diagramCavas/source/diagramEditor/diagramEditorWizard.cpp +++ b/diagramCavas/source/diagramEditor/diagramEditorWizard.cpp @@ -2,6 +2,7 @@ #include #include #include +#include #include "diagramEditor/diagramEditorWizard.h" #include "diagramEditor/wizardBusTableDelegate.h" #include "ui_diagramEditorWizard.h" @@ -18,7 +19,6 @@ DiagramEditorWizard::DiagramEditorWizard(QWidget *parent) ,_transSettingDlg(nullptr) { ui->setupUi(this); - _busPageChanged = false; this->setWindowFlags(Qt::FramelessWindowHint | windowFlags()); setStyleSheet("background-color: white;"); initial(); @@ -83,6 +83,7 @@ void DiagramEditorWizard::initial() void DiagramEditorWizard::reOrderBus() { reindexQMap(_mapBus); + //移动后结构只变序号(待测试) for(int row = 0 ;row < ui->tableWidget_bus->rowCount();++row) { @@ -96,12 +97,17 @@ void DiagramEditorWizard::generateBayStruct() { for(auto iter = _mapBus.begin();iter != _mapBus.end();++iter) { - if(!iter->bChanged) //只生成修改过的程序 + if(iter->nState == 0) //只生成修改过的程序 continue; - iter->bChanged = false; - QListWidgetItem* item = new QListWidgetItem("第"+QString::number(iter->nIndex+1)+"层"); - item->setData(Qt::UserRole,iter->nIndex); - ui->listWidget_bay->addItem(item); + if(iter->nState == 2){ //已修改 + clearTargetLevelContent(iter.key()); + } + else if(iter->nState == 1){ + QListWidgetItem* item = new QListWidgetItem("第"+QString::number(iter->nIndex+1)+"层"); + item->setData(Qt::UserRole,iter->nIndex); + ui->listWidget_bay->addItem(item); + } + iter->nState = 0; QString sVoltage; //电压前缀 sVoltage = QString::number(iter->dVoltage)+"kV"; @@ -229,13 +235,6 @@ void DiagramEditorWizard::flushTransPage() info.sName = pItem->getName(); info.nType = pItem->getTransType(); auto lstCon = pItem->getConnect(); //获取间隔所连对象的名称 - /*for(auto& conId:lstCon){ - if(_mapConnect.contains(conId)){ - auto con = _mapConnect.value(conId); - QString sOpposite = con.getOppositeName(pItem->getName()); - info.lstBindObj.append(sOpposite); - } - }*/ for(auto& conId:lstCon){ if(_mapConnect.contains(conId)){ @@ -298,6 +297,20 @@ QUuid DiagramEditorWizard::addConnection(const QString& str1,const QString& str2 return con.uid; } +QList DiagramEditorWizard::findConnectionByBlock(QString sName,int nType) +{ + QList lst; + for(auto iter = _mapConnect.begin(); iter != _mapConnect.end();++iter){ + auto con = iter.value(); + if((con.con1.sName == sName && con.con1.nType == nType) || (con.con2.sName == sName && con.con2.nType == nType)){ + if(!lst.contains(con.uid)) + lst.append(con.uid); + } + } + + return lst; +} + void DiagramEditorWizard::removeConnection(QUuid uid) { _mapConnect.remove(uid); @@ -336,14 +349,73 @@ DiagramEditorProjectInfo DiagramEditorWizard::getCurPara() void DiagramEditorWizard::setPara(DiagramEditorProjectInfo info) { _mapBus = info.mapBus; - + _mapConnect = info.mapConnect; for(auto iter = info.mapSturctContainer.begin(); iter != info.mapSturctContainer.end();++iter){ - QList lstCon; - for(auto &conInfo:iter.value()){ + for(int i = 0;i < iter.value().size();++i){ + auto conInfo = iter.value()[i]; + auto pContainer = new DiagramEditorStructContainer(this); + pContainer->setId(conInfo.sId); + pContainer->setMidUpY(conInfo.dMidUpY); + pContainer->setMidDownY(conInfo.dMidDownY); + pContainer->setWidth(conInfo.dWidth); + pContainer->setHeight(conInfo.dHeight); + pContainer->setStartX(conInfo.dStartX); + pContainer->setStartY(conInfo.dStartY); + pContainer->setMaxUpH(conInfo.dMaxUpH); + pContainer->setMaxDownH(conInfo.dMaxDownH); + for(auto ite = conInfo.mapBlockInfo.begin(); ite != conInfo.mapBlockInfo.end();++ite){ //<位置0123,容器列表> + for(auto &blockInfo:ite.value()){ + DiagramEditorBaseBlock* pBlock = nullptr; + if(blockInfo.nType == 1){ + auto pBus = new DiagramEditorBusBlock(this); + pBus->setId(blockInfo.uid); + pBus->setType(blockInfo.nType); + pBus->setBusPro(blockInfo.sName,1,blockInfo.fVoltage,blockInfo.nBusType,blockInfo.nIndex); + pBlock = pBus; + } + else if(blockInfo.nType == 2){ + DiagramEditorBayBlock* pBay = new DiagramEditorBayBlock(this); + pBay->setId(blockInfo.uid); + pBay->setName(blockInfo.sName); + pBay->setType(blockInfo.nType); + pBay->setBayType(blockInfo.nBayType); + for(auto& uid:blockInfo._lstCon){ + pBay->addConnect(uid); + } + pBay->setBayInfo(blockInfo.bayInfo); + pBlock = pBay; + } + else if(blockInfo.nType == 3){ + auto pTrans = new DiagramEditorTransformerBlock(this); + pTrans->setId(blockInfo.uid); + pTrans->setName(blockInfo.sName); + pTrans->setType(blockInfo.nType); + pTrans->setTransType(blockInfo.nTransType); + for(auto& uid:blockInfo._lstCon){ + pTrans->addConnect(uid); + } + pTrans->setTransInfo(blockInfo.transInfo); + pBlock = pTrans; + } + if(pBlock){ + pBlock->setContainerLevel(blockInfo.nContainerLevel); + pBlock->setRecSize(blockInfo.recSize); + pBlock->setSeceneDelta(blockInfo.sceneDelta); + pBlock->setEditState(blockInfo.bEditState); + pContainer->insertBlock(ite.key(),pBlock); + } + } + } + + _mapSturctContainer[iter.key()].insert(i,pContainer); } } + resetBusByData(); + resetBayByData(); + resetTransByData(); + emit wizardFinish(); } void DiagramEditorWizard::addTransformer(DiagramEditorWizardTransformerInfo info) @@ -397,6 +469,113 @@ template void DiagramEditorWizard::reindexQMap(QMap &map) { } } +void DiagramEditorWizard::clearTargetLevelContent(int nLevel) +{ + if(_mapSturctContainer.contains(nLevel)){ + auto lstCon = _mapSturctContainer.take(nLevel); + for(auto &pCon:lstCon){ + auto mapBlock = pCon->getBlockMap(); + for(auto &lstBlock:mapBlock){ + for(auto& pBlock:lstBlock){ + auto lst = findConnectionByBlock(pBlock->getName(),pBlock->getType()); //断开删除block相关的连接 + if(!lst.empty()){ + for(auto &uid:lst){ + removeConnection(uid); + } + } + } + } + delete pCon; + } + } +} + +void DiagramEditorWizard::resetBusByData() +{ + ui->tableWidget_bus->clearContents(); + ui->tableWidget_bus->setRowCount(0); + + for(auto iter = _mapBus.begin();iter != _mapBus.end();++iter){ + int row = ui->tableWidget_bus->rowCount(); + ui->tableWidget_bus->insertRow(row); + const DiagramEditorWizardBusInfo& data = iter.value(); + + QTableWidgetItem* pItem = new QTableWidgetItem("第"+QString::number(iter.key()+1)+"层"); + pItem->setData(Qt::UserRole,data.nIndex); + ui->tableWidget_bus->setItem(iter.key(), 0, pItem); + + QTableWidgetItem* pItemVoltage = new QTableWidgetItem(QString::number(data.dVoltage)+"KV"); + ui->tableWidget_bus->setItem(iter.key(), 1, pItemVoltage); + + // 列2 - 单双母 (ComboBox) + QString sLineType; + if(data.nLineType == 1){ + sLineType = "单母线"; + } + else if(data.nLineType == 2){ + sLineType = "双母线"; + } + QTableWidgetItem* pItemLine = new QTableWidgetItem(sLineType); + ui->tableWidget_bus->setItem(iter.key(), 2, pItemLine); + + QString sDivide; + QTableWidgetItem* pItemDivide = new QTableWidgetItem(); + if(data.nLineType == 1){ + QString sD1; + if(data.nNum1 == 1) + sD1 = "不分段"; + else + sD1 = QString::number(data.nNum1); + sDivide = "母线:"+sD1; + } + else if(data.nLineType == 2){ + QString sD1; + if(data.nNum1 == 1) + sD1 = "不分段"; + else + sD1 = QString::number(data.nNum1); + + QString sD2; + if(data.nNum2 == 1) + sD2 = "不分段"; + else + sD2 = QString::number(data.nNum2); + sDivide = "母线1:"+sD1+";"+"母线2:"+sD2; + } + pItemDivide->setText(sDivide); + ui->tableWidget_bus->setItem(iter.key(), 3, pItemDivide); + + // 列4 - 接线方式 (ComboBox) + QString sConnectType; + if(data.connectType == 1){ + sConnectType = "分段连接"; + } + QTableWidgetItem* pItemConnect = new QTableWidgetItem(sConnectType); + ui->tableWidget_bus->setItem(row, 4, pItemConnect); + } +} + +void DiagramEditorWizard::resetBayByData() +{ + if(_baySettingDlg == nullptr){ + _baySettingDlg = new DiagramEditorBaySettingDlg(this); + _baySettingDlg->setParent(this); + } + ui->listWidget_bay->clear(); + for(auto iter = _mapBus.begin();iter != _mapBus.end();++iter) + { + iter->nState = 0; + QListWidgetItem* item = new QListWidgetItem("第"+QString::number(iter->nIndex+1)+"层"); + item->setData(Qt::UserRole,iter->nIndex); + ui->listWidget_bay->addItem(item); + } +} + +void DiagramEditorWizard::resetTransByData() +{ + flushTransPage(); +} + void DiagramEditorWizard::onOkClicked() { emit wizardFinish(); @@ -476,7 +655,7 @@ void DiagramEditorWizard::onAddBusClicked() DiagramEditorWizardBusInfo info; info.nIndex = row; - info.bChanged = true; + info.nState = 1; //新建 _mapBus.insert(row,info); } @@ -486,7 +665,9 @@ void DiagramEditorWizard::onAddBayClicked() _baySettingDlg = new DiagramEditorBaySettingDlg(this); _baySettingDlg->setParent(this); } - _baySettingDlg->showDlg(ui->listWidget_bay->currentItem()->data(Qt::UserRole).toInt()); + auto pItem = ui->listWidget_bay->currentItem(); + if(pItem) + _baySettingDlg->showDlg(pItem->data(Qt::UserRole).toInt()); } void DiagramEditorWizard::onAddTransClicked() @@ -601,7 +782,7 @@ void DiagramEditorWizard::onAddBayFinished(DiagramEditorWizardBayInfo info) } } } - else if(info.nType == BayType::incomingBay || info.nType == BayType::ptBay){ //进线间隔和pt间隔在上边 + else if(info.nType == BayType::incomingBay || info.nType == BayType::ptBay || info.nType == BayType::busCouplerBay){ //进线间隔、母联间隔、pt间隔在上边 auto pContainer = getContainerByBlock(curIndex,1,info.lstBindObj.first()); pContainer->insertBlock(0,pBlock); } @@ -644,7 +825,7 @@ void DiagramEditorWizard::onDelegateFinishEdit(const QModelIndex &index, const Q { int row = index.row(); int col = index.column(); - if(_mapBus.contains(row)){ + if(_mapBus.contains(row)){ //todo:增加缓存,点击下页保存 if(col == 1){ _mapBus[row].dVoltage = value.toDouble(); } @@ -668,8 +849,7 @@ void DiagramEditorWizard::onDelegateFinishEdit(const QModelIndex &index, const Q else if(col == 4){ _mapBus[row].connectType = value.toInt(); } - _busPageChanged = true; - //qDebug() << row<<","<listWidget_bay->count(); ++i) { + QListWidgetItem *item = ui->listWidget_bay->item(i); + // 处理每个项 + QString text = item->text(); + qDebug() << "Item" << i << ":" << text; + int idx = item->data(Qt::UserRole).toInt(); + if(idx == nIndex){ + auto item = ui->listWidget_bay->takeItem(i); + delete item; + } } int currentRow = ui->tableWidget_bus->currentRow(); @@ -851,12 +1046,14 @@ QList DiagramEditorWizard::getTargetLevelBlocks(int nL for(auto& container:iter.value()) { auto mapBlock = container->getBlockMap(); - for(auto& lst:mapBlock) - { - for(auto& block:lst) + if(!mapBlock.isEmpty()){ + for(auto& lst:mapBlock) { - if(block->getType() == nType){ //返回对应type - lstBlock.append(block); + for(auto& block:lst) + { + if(block->getType() == nType){ //返回对应type + lstBlock.append(block); + } } } } diff --git a/diagramCavas/source/diagramEditor/editPanel.cpp b/diagramCavas/source/diagramEditor/editPanel.cpp index 931c366..a4fe1e9 100644 --- a/diagramCavas/source/diagramEditor/editPanel.cpp +++ b/diagramCavas/source/diagramEditor/editPanel.cpp @@ -60,6 +60,17 @@ EditPanel::~EditPanel() void EditPanel::initByWizardInfo() { + if(!_lstData.empty()){ + _pModel->clearItems(); + m_pEditScene->clear(); + _lstData.clear(); + _mainWidget = new EditMainRect; + _widgetLayout = new QGraphicsLinearLayout(Qt::Vertical); + _widgetLayout->setSpacing(40); + _mainWidget->setLayout(_widgetLayout); + m_pEditScene->addItem(_mainWidget); + _mainWidget->setGeometry(m_pEditScene->sceneRect()); + } auto& mapTotal = _pEditorWizard->getContainerStruct(); for(auto iter = mapTotal.begin();iter != mapTotal.end();++iter){ if(iter.key() == g_transformerLevel) @@ -233,6 +244,8 @@ void EditPanel::initBlockConnection() int nPara = con.nPara; auto item1 = _pEditorWizard->getBlockByName_all(con.con1.sName); auto item2 = _pEditorWizard->getBlockByName_all(con.con2.sName); + if(!item1 || !item2) + continue; auto con1 = _pEditorWizard->getContainerByBlock_all(con.con1.sName); auto con2 = _pEditorWizard->getContainerByBlock_all(con.con2.sName); @@ -373,16 +386,21 @@ void EditPanel::showConfirmDlg() connect(_confirmEditor,&ConfirmEditorDlg::onConfirmEditor,this,[&](QString sAuthor,QString sTime){ auto pCavas = getCavas(); - if(pCavas){ - - //QList lstBocks; - QList pBays = getBlockItems(EditorItemType::bay); - - pCavas->onSignal_wizardFinished(_projectName,_pModel->getPreviewItem(),pBays); + if(pCavas){ + QByteArray btWizard = _pModel->getWizardInfo(); + setWindowTitle(sTime); + ProjectManager::instance().saveEditorDataToDB(_uid,_projectName,_projectName,btWizard,sAuthor,sTime); } }); } - _confirmEditor->show(); + _confirmEditor->showDlg(_author,_timeStamp); +} + +void EditPanel::generate() +{ + auto pCavas = getCavas(); + QList pBays = getBlockItems(EditorItemType::bay); + pCavas->onSignal_wizardFinished(_projectName,_pModel->getPreviewItem(),pBays); } void EditPanel::showWizard() @@ -558,18 +576,26 @@ EditBaseItem* EditPanel::getItemByName(const QString& sName) return nullptr; } +void EditPanel::closeEvent(QCloseEvent *closeEvent) +{ + emit panelDelete(_tagName,0); +} + void EditPanel::prepareSaveEditor() { if(_pModel){ - QByteArray btWizard = _pModel->getWizardInfo(); - ProjectManager::instance().saveEditorDataToDB(_uid,_projectName,_projectName,btWizard); + showConfirmDlg(); } } -void EditPanel::loadEditor(const QString& str) +void EditPanel::loadBaseSetting(QUuid uid) { - QByteArray byte = ProjectManager::instance().getEditorDataByName(str); + auto info = ProjectManager::instance().getBaseSetting(uid); if(_pModel){ - _pModel->setWizardInfo(byte); + _author = info.autor; + _timeStamp = info.ts; + _tagName = _projectName; //将临时名称保存到变量 + _projectName = info.projectName; + _pModel->setWizardInfo(info.context); } } diff --git a/diagramCavas/source/diagramEditor/editScene.cpp b/diagramCavas/source/diagramEditor/editScene.cpp index 4d96947..25daf1f 100644 --- a/diagramCavas/source/diagramEditor/editScene.cpp +++ b/diagramCavas/source/diagramEditor/editScene.cpp @@ -30,6 +30,7 @@ void EditScene::contextMenuEvent(QGraphicsSceneContextMenuEvent *event) QMenu menu; QAction *previewAction = menu.addAction("预览"); QAction *generateAction = menu.addAction("生成"); + QAction *setting = menu.addAction("打开设置"); QAction *selectedAction = menu.exec(event->screenPos()); if (selectedAction == previewAction) { if(_pModel){ @@ -40,7 +41,9 @@ void EditScene::contextMenuEvent(QGraphicsSceneContextMenuEvent *event) _pModel->refreshConnection(); } } else if (selectedAction == generateAction) { - _pModel->getPanel()->showConfirmDlg(); + _pModel->getPanel()->generate(); + }else if (selectedAction == setting) { + _pModel->getPanel()->showWizard(); } } /************************预览*********************/ diff --git a/diagramCavas/source/diagramEditor/wizardBayContentDlg.cpp b/diagramCavas/source/diagramEditor/wizardBayContentDlg.cpp index b8becea..599d2bc 100644 --- a/diagramCavas/source/diagramEditor/wizardBayContentDlg.cpp +++ b/diagramCavas/source/diagramEditor/wizardBayContentDlg.cpp @@ -164,8 +164,11 @@ void WizardBayContentDlg::onModifyClicked() DiagramEditorBaseBlock* pBlock = _pWizard->getBlockByName(_curLevel,2,sName); if(pBlock){ auto pBay = dynamic_cast(pBlock); - if(pBay) - _pWizard->getBaySettingDlg()->showDlg(_curLevel,pBay); + if(pBay){ + auto pDlg = _pWizard->getBaySettingDlg(); + if(pDlg) + pDlg->showDlg(_curLevel,pBay); + } } } } diff --git a/diagramCavas/source/diagramEditor/wizardBusTableDelegate.cpp b/diagramCavas/source/diagramEditor/wizardBusTableDelegate.cpp index c47d4eb..193100e 100644 --- a/diagramCavas/source/diagramEditor/wizardBusTableDelegate.cpp +++ b/diagramCavas/source/diagramEditor/wizardBusTableDelegate.cpp @@ -49,23 +49,6 @@ QWidget* WizardBusTableDelegate::createEditor(QWidget* parent, const QStyleOptio return nullptr; } -/*bool ProjectTableDelegate::eventFilter(QObject* obj, QEvent* event) -{ - if (event->type() == QEvent::KeyPress) { - QKeyEvent* keyEvent = static_cast(event); - if (keyEvent->key() == Qt::Key_Return || keyEvent->key() == Qt::Key_Enter) { - QLineEdit* editor = qobject_cast(obj); - if (editor) { - emit yourCustomSignal(editor->text()); - commitData(editor); // 显式提交数据 - closeEditor(editor); // 关闭编辑器 - return true; // 阻止事件继续传播 - } - } - } - return QStyledItemDelegate::eventFilter(obj, event); -}*/ - void WizardBusTableDelegate::setEditorData(QWidget* editor, const QModelIndex& index) const { if(index.column() == 1 || index.column() == 2 || index.column() == 4) diff --git a/diagramCavas/source/drawingPanel.cpp b/diagramCavas/source/drawingPanel.cpp index 40a551d..becd6d3 100644 --- a/diagramCavas/source/drawingPanel.cpp +++ b/diagramCavas/source/drawingPanel.cpp @@ -151,7 +151,7 @@ void DrawingPanel::closeEvent(QCloseEvent *closeEvent) break; } } - emit panelDelete(_name); + emit panelDelete(_name,1); } else if(getMode() == DM_baseModel) { diff --git a/diagramCavas/ui/confirmEditorDlg.ui b/diagramCavas/ui/confirmEditorDlg.ui index dc7a834..afd18e6 100644 --- a/diagramCavas/ui/confirmEditorDlg.ui +++ b/diagramCavas/ui/confirmEditorDlg.ui @@ -71,7 +71,7 @@ font: 12pt "Microsoft YaHei UI"; color: rgb(0, 0, 0); - 生成接线 + 保存拓扑 @@ -152,7 +152,7 @@ font: 12pt "Microsoft YaHei UI"; - 上次修改: + 归档时间: diff --git a/diagramUtils/include/basePropertyManager.h b/diagramUtils/include/basePropertyManager.h index 6cdb831..2de6b47 100644 --- a/diagramUtils/include/basePropertyManager.h +++ b/diagramUtils/include/basePropertyManager.h @@ -51,6 +51,7 @@ public: DiagramEditorItemProperty* findEditorData(QUuid); void deleteEditorData(QUuid); QMap getEditorData() const; + void clearEditorData(); signals: void dataCreated(QString uuid); void dataChanged(QString uuid); diff --git a/diagramUtils/include/dataBase.h b/diagramUtils/include/dataBase.h index 0581530..3b17e19 100644 --- a/diagramUtils/include/dataBase.h +++ b/diagramUtils/include/dataBase.h @@ -135,12 +135,18 @@ public: public: /***********************************editor编辑器**********************************************/ - bool insertEditorProject(QUuid,QString,QString,QByteArray); - bool updateEditorProject(QString name,QByteArray context); - QByteArray getEditorProjectByName(QString name); + bool insertEditorProject(QUuid,QString,QString); QList getAllEditorProject(); bool deleteEditorProject(QString); bool ifEditorProjectExist(QString name); + /***********************************baseSetting**********************************************/ + bool insertBaseSetting(QUuid,QString,QString,QByteArray,QUuid,QString ts); + bool updateBaseSetting(QUuid,QByteArray context,QString ts); + QByteArray getBaseSettingByUid(QUuid); + editorBaseSettingInfo getBaseSettingInfo(QUuid); + QList getAllBaseSetting(); + bool deleteBaseSetting(QUuid); + bool ifBaseSettingExist(QUuid); private: QMap _attributeGroup; //属性组的组 QMap _dataType; //数据类型组 diff --git a/diagramUtils/include/projectManager.h b/diagramUtils/include/projectManager.h index 7c686f7..d43b60e 100644 --- a/diagramUtils/include/projectManager.h +++ b/diagramUtils/include/projectManager.h @@ -16,17 +16,28 @@ public: ~ProjectManager(); static ProjectManager& instance(); - void saveEditorDataToDB(QUuid,const QString&,const QString&,QByteArray); - QByteArray getEditorDataByName(const QString&); + void saveEditorDataToDB(QUuid,const QString&,const QString&,QByteArray,QString autor,QString sTime); + QByteArray getEditorBaseSettingByUid(QUuid); - void createEditor(const QString&); + bool createEditorProject(const QString&); //创建项目 + void unloadEditorProject(const QString&); //卸载项目 + + void openSetting(const QString&); void saveEditor(const QString&); + bool deleteEditor(const QString&,QUuid); //删除当前版本 + + void loadBaseSetting(const QString& str,QUuid id); //加载wizard与基模拓扑设置 + + QList getBaseSettingsByProject(const QString&); //获取工程名对应的设置列表 + editorBaseSettingInfo getBaseSetting(QUuid); //获取设置 signals: + void prepareUnloadProject(const QString&); + void prepareOpenSetting(const QString& str); void createNewEditor(const QString& str,QUuid id); - void editorSaved(const QString& str,QUuid uid); + void editorSaved(const QString& strPro,const QString& autor,QUuid uid,QString sTime); void prepareSaveEditor(QString); -private: - QMap _wizardInfo; + void prepareLoadBaseSetting(const QString& str,QUuid id); + void prepareDeleteBaseSetting(const QString& str,QUuid id); }; #endif // PROJECTMANAGER_H diff --git a/diagramUtils/source/basePropertyManager.cpp b/diagramUtils/source/basePropertyManager.cpp index 107ff68..3289b24 100644 --- a/diagramUtils/source/basePropertyManager.cpp +++ b/diagramUtils/source/basePropertyManager.cpp @@ -166,3 +166,11 @@ QMap BasePropertyManager::getEditorData() cons { return m_editorData; } + +void BasePropertyManager::clearEditorData() +{ + for(auto &pPro:m_editorData){ + delete pPro; + } + m_editorData.clear(); +} diff --git a/diagramUtils/source/dataBase.cpp b/diagramUtils/source/dataBase.cpp index 4ae9abf..838a7b1 100644 --- a/diagramUtils/source/dataBase.cpp +++ b/diagramUtils/source/dataBase.cpp @@ -2846,15 +2846,14 @@ QStringList DataBase::ifModelOccupy(const QString& sName) } } -bool DataBase::insertEditorProject(QUuid uid,QString name,QString tag,QByteArray byte) +bool DataBase::insertEditorProject(QUuid uid,QString name,QString tag) { - QString strSQL = "INSERT INTO diagramui_editorprojects(global_uuid, name, tag, context) VALUES (?, ?, ?, ?)"; + QString strSQL = "INSERT INTO diagramui_editor_projects(global_uuid, name, tag) VALUES (?, ?, ?)"; QVariantList params; params.append(uid); params.append(name); params.append(tag); - params.append(byte); try { executeSQL(strSQL,false,params); @@ -2862,57 +2861,15 @@ bool DataBase::insertEditorProject(QUuid uid,QString name,QString tag,QByteArray } catch (const std::exception& e) { - LOG_ERROR("DB", QString("Insert diagramui_editorprojects fail")); + LOG_ERROR("DB", QString("Insert diagramui_editor_projects fail")); return false; } } -bool DataBase::updateEditorProject(QString name,QByteArray context) -{ - QString strSQL = "UPDATE diagramui_editorprojects SET context = ? WHERE name = ?"; - QVariantList params; - params.append(context); - params.append(name); - - try - { - executeSQL(strSQL,false,params); - return true; - } - catch (const std::exception& e) - { - LOG_ERROR("DB", QString("Update diagramui_editorprojects %1 fail").arg(name)); - return false; - } -} - -QByteArray DataBase::getEditorProjectByName(QString name) -{ - QByteArray byte; - QString strSQL = "SELECT context FROM diagramui_editorprojects WHERE name = ?"; - QVariantList params; - params.append(name); - - try - { - QSqlQuery query = executeSQL(strSQL,false,params); - while (query.next()) - { - byte = query.value(0).toByteArray(); - } - query.clear(); - return byte; - } - catch (const std::exception& e) - { - return byte; - } -} - QList DataBase::getAllEditorProject() { QList lst; - QString strSQL = "SELECT id,global_uuid,name,tag,context FROM diagramui_editorprojects"; + QString strSQL = "SELECT id,global_uuid,name,tag FROM diagramui_editor_projects"; try { @@ -2924,7 +2881,6 @@ QList DataBase::getAllEditorProject() info.uuid = QUuid(query.value(1).toString()); info.name = query.value(2).toString(); info.tag = query.value(3).toString(); - info.context = query.value(4).toByteArray(); lst.append(info); } @@ -2939,26 +2895,26 @@ QList DataBase::getAllEditorProject() bool DataBase::deleteEditorProject(QString name) { - QString strSQL = "DELETE FROM diagramui_editorprojects WHERE name = ?"; + QString strSQL = "DELETE FROM diagramui_editor_projects WHERE name = ?"; QVariantList params; params.append(name); try { executeSQL(strSQL,false,params); - LOG_INFO("DB", QString("Delete diagramui_editorprojects %1 success").arg(name)); + LOG_INFO("DB", QString("Delete diagramui_editor_projects %1 success").arg(name)); return true; } catch (const std::exception& e) { - LOG_INFO("DB", QString("Delete diagramui_editorprojects %1 fail").arg(name)); + LOG_INFO("DB", QString("Delete diagramui_editor_projects %1 fail").arg(name)); return false; } } bool DataBase::ifEditorProjectExist(QString name) { - QString strSQL = "SELECT * FROM diagramui_editorprojects WHERE name = ?"; + QString strSQL = "SELECT * FROM diagramui_editor_projects WHERE name = ?"; QVariantList params; params.append(name); @@ -2976,3 +2932,166 @@ bool DataBase::ifEditorProjectExist(QString name) } return false; } +/***********************basesetting****************************/ +bool DataBase::insertBaseSetting(QUuid uid,QString projectName,QString autorName,QByteArray context,QUuid generateId,QString ts) +{ + QString strSQL = "INSERT INTO diagramui_editor_basesetting(global_uuid, project_name, autor, context, generate_uuid, ts) VALUES (?, ?, ?, ?, ?, ?)"; + + QVariantList params; + params.append(uid); + params.append(projectName); + params.append(autorName); + params.append(context); + params.append(generateId); + params.append(ts); + try + { + executeSQL(strSQL,false,params); + return true; + } + catch (const std::exception& e) + { + LOG_ERROR("DB", QString("Insert diagramui_editor_basesetting fail")); + return false; + } +} +bool DataBase::updateBaseSetting(QUuid uid,QByteArray context,QString ts) +{ + QString strSQL = "UPDATE diagramui_editor_basesetting SET context = ?, ts = ? WHERE global_uuid = ?"; + QVariantList params; + params.append(context); + params.append(ts); + params.append(uid); + + try + { + executeSQL(strSQL,false,params); + return true; + } + catch (const std::exception& e) + { + LOG_ERROR("DB", QString("Update diagramui_editor_basesetting %1 fail").arg(uid.toString())); + return false; + } +} + +QByteArray DataBase::getBaseSettingByUid(QUuid uid) +{ + QByteArray byte; + QString strSQL = "SELECT context FROM diagramui_editor_basesetting WHERE global_uuid = ?"; + QVariantList params; + params.append(uid); + + try + { + QSqlQuery query = executeSQL(strSQL,false,params); + while (query.next()) + { + byte = query.value(0).toByteArray(); + } + query.clear(); + return byte; + } + catch (const std::exception& e) + { + return byte; + } +} + +editorBaseSettingInfo DataBase::getBaseSettingInfo(QUuid uid) +{ + editorBaseSettingInfo info; + QString strSQL = "SELECT project_name, autor, context, generate_uuid, ts FROM diagramui_editor_basesetting WHERE global_uuid = ?"; + QVariantList params; + params.append(uid); + + try + { + QSqlQuery query = executeSQL(strSQL,false,params); + while (query.next()) + { + info.projectName = query.value(0).toString(); + info.autor = query.value(1).toString(); + info.context = query.value(2).toByteArray(); + info.generateUid = QUuid(query.value(3).toString()); + info.ts = query.value(4).toString(); + info.uuid = uid; + } + query.clear(); + return info; + } + catch (const std::exception& e) + { + return info; + } +} + +QList DataBase::getAllBaseSetting() +{ + QList lst; + QString strSQL = "SELECT id,global_uuid, project_name, autor, context, generate_uuid, ts FROM diagramui_editor_basesetting"; + + try + { + QSqlQuery query = executeSQL(strSQL); + while (query.next()) + { + editorBaseSettingInfo info; + info.id = query.value(0).toInt(); + info.uuid = QUuid(query.value(1).toString()); + info.projectName = query.value(2).toString(); + info.autor = query.value(3).toString(); + info.context = query.value(4).toByteArray(); + info.generateUid = QUuid(query.value(5).toString()); + info.ts = query.value(6).toString(); + + lst.append(info); + } + query.clear(); + return lst; + } + catch (const std::exception& e) + { + return lst; + } +} + +bool DataBase::deleteBaseSetting(QUuid uid) +{ + QString strSQL = "DELETE FROM diagramui_editor_basesetting WHERE global_uuid = ?"; + QVariantList params; + params.append(uid); + + try + { + executeSQL(strSQL,false,params); + LOG_INFO("DB", QString("Delete diagramui_editor_basesetting %1 success").arg(uid.toString())); + return true; + } + catch (const std::exception& e) + { + LOG_INFO("DB", QString("Delete diagramui_editor_basesetting %1 fail").arg(uid.toString())); + return false; + } +} + +bool DataBase::ifBaseSettingExist(QUuid uid) +{ + QString strSQL = "SELECT * FROM diagramui_editor_basesetting WHERE global_uuid = ?"; + QVariantList params; + params.append(uid); + + try + { + QSqlQuery query = executeSQL(strSQL,false,params); + while (query.next()) + { + return true; + } + } + catch (const std::exception& e) + { + return false; + } + return false; +} diff --git a/diagramUtils/source/projectManager.cpp b/diagramUtils/source/projectManager.cpp index c16a008..fbb6a8e 100644 --- a/diagramUtils/source/projectManager.cpp +++ b/diagramUtils/source/projectManager.cpp @@ -20,46 +20,70 @@ ProjectManager::~ProjectManager() } -void ProjectManager::saveEditorDataToDB(QUuid uid,const QString& name,const QString& tag,QByteArray byte) +void ProjectManager::saveEditorDataToDB(QUuid uid,const QString& name,const QString& tag,QByteArray byte,QString autor,QString sTime) { bool val = DataBase::GetInstance()->ifEditorProjectExist(name); - if(val) - { - bool res = DataBase::GetInstance()->updateEditorProject(name,byte); - if(res){ - emit editorSaved(name,uid); - QMessageBox::information(NULL, QString("提示"), QString::fromWCharArray(L"更新成功")); - } - else - QMessageBox::information(NULL, QString("提示"), QString::fromWCharArray(L"更新失败")); - } - else{ - bool res = DataBase::GetInstance()->insertEditorProject(uid,name,tag,byte); - if(res){ - emit editorSaved(name,uid); - QMessageBox::information(NULL, QString("提示"), QString::fromWCharArray(L"保存成功")); - } - else - QMessageBox::information(NULL, QString("提示"), QString::fromWCharArray(L"保存失败")); - } + if(!val) + DataBase::GetInstance()->insertEditorProject(uid,name,tag); + QUuid uidSetting = QUuid::createUuid(); //暂定没有更新,变更后存储为新记录 + bool res = DataBase::GetInstance()->insertBaseSetting(uidSetting,name,autor,byte,QUuid(),sTime); + if(res) + emit editorSaved(name,autor,uidSetting,sTime); } -QByteArray ProjectManager::getEditorDataByName(const QString& name) +QByteArray ProjectManager::getEditorBaseSettingByUid(QUuid uid) { - return DataBase::GetInstance()->getEditorProjectByName(name); + return DataBase::GetInstance()->getBaseSettingByUid(uid); } -void ProjectManager::createEditor(const QString& name) +bool ProjectManager::createEditorProject(const QString& name) { - if(!_wizardInfo.contains(name)){ - QUuid uid = QUuid::createUuid(); - _wizardInfo[name].sName = name; - _wizardInfo[name].uid = uid; - emit createNewEditor(name,uid); - } + bool bExist = DataBase::GetInstance()->ifEditorProjectExist(name); + if(bExist) + return true; + QUuid uid = QUuid::createUuid(); + emit createNewEditor(name,uid); + return false; +} + +void ProjectManager::unloadEditorProject(const QString& name) +{ + emit prepareUnloadProject(name); +} + +void ProjectManager::openSetting(const QString& name) +{ + emit prepareOpenSetting(name); } void ProjectManager::saveEditor(const QString& name) { emit prepareSaveEditor(name); } + +bool ProjectManager::deleteEditor(const QString& name,QUuid id) +{ + emit prepareDeleteBaseSetting(name,id); + return DataBase::GetInstance()->deleteBaseSetting(id); +} + +void ProjectManager::loadBaseSetting(const QString& str,QUuid id) +{ + emit prepareLoadBaseSetting(str,id); +} + +QList ProjectManager::getBaseSettingsByProject(const QString& strPro) +{ + QList lst; + QList lstAll = DataBase::GetInstance()->getAllBaseSetting(); + for(auto &info:lstAll){ + if(info.projectName == strPro) + lst.append(info); + } + return lst; +} + +editorBaseSettingInfo ProjectManager::getBaseSetting(QUuid uid) +{ + return DataBase::GetInstance()->getBaseSettingInfo(uid); +} diff --git a/include/diagramView.h b/include/diagramView.h index c9131c7..db32474 100644 --- a/include/diagramView.h +++ b/include/diagramView.h @@ -27,6 +27,7 @@ signals: void diagramDelete(DiagramInfo); void diagramSelected(DiagramInfo); + void createProject(); void loadProject(); public slots: void onIndexRbtnClicked(const QPoint &pos); //索引列表右键菜单 @@ -34,9 +35,11 @@ public slots: void onItemClicked(const QModelIndex &index); void onEditorRbtnClicked(const QPoint &pos); //editor右键菜单 + void onEditorDBClicked(QTreeWidgetItem* item, int column); //**********editor************ void onNewEditorCreated(const QString&,QUuid); - void onEditorSaved(const QString&,QUuid); + void onEditorLoaded(const QString&,QUuid); + void onEditorSaved(const QString& strPro,const QString& autor,QUuid uid,QString sTime); void onNewEditorClicked(); void onOpenEditorClicked(); diff --git a/include/mainwindow.h b/include/mainwindow.h index b2cae64..80606a2 100644 --- a/include/mainwindow.h +++ b/include/mainwindow.h @@ -49,9 +49,10 @@ private slots: void onAction_editBay(); void onSignal_addItem(QGraphicsItem*); void onSignal_deleteItem(); - void onSignal_loadPage(); + void onSignal_loadProject(); void onAction_createEditor(); + void onAction_unloadEditor(const QString&); public: GraphicElementsPanel* graphicsElementsPanel() const; diff --git a/source/createEditor.cpp b/source/createEditor.cpp index a36e874..bfdd568 100644 --- a/source/createEditor.cpp +++ b/source/createEditor.cpp @@ -1,4 +1,5 @@ #include +#include #include "createEditor.h" #include "projectManager.h" #include "ui_createEditor.h" @@ -31,7 +32,11 @@ void CreateEditor::showDlg() void CreateEditor::onOkClicked() { - ProjectManager::instance().createEditor(ui->le_name->text()); + bool res = ProjectManager::instance().createEditorProject(ui->le_name->text()); + if(res){ + QMessageBox::information(NULL, QString("提示"), QString::fromWCharArray(L"项目名已存在")); + return; + } hide(); } diff --git a/source/diagramView.cpp b/source/diagramView.cpp index 5fe1341..156ed1c 100644 --- a/source/diagramView.cpp +++ b/source/diagramView.cpp @@ -7,6 +7,7 @@ #include "topologyManager.h" #include "projectManager.h" #include "dataBase.h" +#include DiagramView::DiagramView(QWidget *parent) : QDialog(parent) @@ -36,9 +37,9 @@ void DiagramView::initial() connect(ui->btn_save, &QPushButton::clicked, this, &DiagramView::onSaveEditorClicked); connect(&ProjectManager::instance(),&ProjectManager::createNewEditor,this,&DiagramView::onNewEditorCreated); connect(&ProjectManager::instance(),&ProjectManager::editorSaved,this,&DiagramView::onEditorSaved); + connect(ui->treeWidget, &QTreeWidget::itemDoubleClicked, this, &DiagramView::onEditorDBClicked); ui->treeView->setHeaderHidden(true); ui->treeWidget->setHeaderHidden(true); - ui->treeWidget->setColumnCount(2); // 设置模型的列数 _pModel->setColumnCount(1); @@ -194,20 +195,12 @@ void DiagramView::onEditorRbtnClicked(const QPoint &pos) switch (level) { case 1:{ // 顶级节点 - QAction *actSaveTop = menu.addAction("保存"); - QAction *actGenTop = menu.addAction("生成"); - menu.addSeparator(); - QAction *actDelTop = menu.addAction("删除"); - - QAction *act = menu.exec(ui->treeWidget->mapToGlobal(pos)); - if(act == actSaveTop){ - ProjectManager::instance().saveEditor(item->text(0)); - } - else if(act == actGenTop){ - - } - else if(act == actDelTop){ + QAction *actUnload = menu.addAction("卸载项目"); + QAction *act = menu.exec(ui->treeWidget->mapToGlobal(pos)); + if(act == actUnload){ + ProjectManager::instance().unloadEditorProject(item->text(0)); + ui->treeWidget->clear(); } } break; @@ -215,10 +208,63 @@ void DiagramView::onEditorRbtnClicked(const QPoint &pos) } break; case 3:{ // 三级节点 + QAction *actOpenSetting = menu.addAction("打开设置"); + QAction *actSaveTop = menu.addAction("保存"); + //QAction *actGenTop = menu.addAction("生成"); + menu.addSeparator(); + QAction *actDelTop = menu.addAction("删除"); + + QAction *act = menu.exec(ui->treeWidget->mapToGlobal(pos)); + if(act == actOpenSetting){ + ProjectManager::instance().openSetting(item->text(0)); + } + else if(act == actSaveTop){ + ProjectManager::instance().saveEditor(item->text(0)); + } + /*else if(act == actGenTop){ + + }*/ + else if(act == actDelTop){ + 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: + { + bool res = ProjectManager::instance().deleteEditor(item->text(0),item->data(0,Qt::UserRole).toUuid()); + delete item; + QString str; + if(res) + str = "删除成功"; + else + str = "删除失败"; + QMessageBox::information(NULL, QString("提示"), str); + } + break; + case QMessageBox::Cancel: + // Cancel was clicked + default: + // should never be reached + break; + } + } } break; } +} +void DiagramView::onEditorDBClicked(QTreeWidgetItem* item, int column) +{ + int level = getItemLevel(item); + if(level == 3){ + auto pAuthor = item->parent(); + auto pProject = pAuthor->parent(); + ProjectManager::instance().loadBaseSetting(item->text(0),item->data(0,Qt::UserRole).toUuid()); + } } void DiagramView::onNewEditorCreated(const QString& str,QUuid id) @@ -227,28 +273,75 @@ void DiagramView::onNewEditorCreated(const QString& str,QUuid id) QTreeWidgetItem *topLevelItem = new QTreeWidgetItem(ui->treeWidget); topLevelItem->setText(0, str); topLevelItem->setData(0,Qt::UserRole,id); - topLevelItem->setText(1,"未保存"); - topLevelItem->setForeground(1,Qt::yellow); } -void DiagramView::onEditorSaved(const QString& str,QUuid uid) +void DiagramView::onEditorLoaded(const QString& str,QUuid id) { - QTreeWidgetItemIterator it(ui->treeWidget); - while (*it) { - QTreeWidgetItem* item = *it; - if(item->data(0,Qt::UserRole).toUuid() == uid) - { - item->setText(1,"已保存"); - item->setForeground(1,Qt::green); - break; + ui->treeWidget->clear(); + QTreeWidgetItem *topLevelItem = new QTreeWidgetItem(ui->treeWidget); + topLevelItem->setText(0, str); + topLevelItem->setData(0,Qt::UserRole,id); + auto lstInfo = ProjectManager::instance().getBaseSettingsByProject(str); + + for(auto &info:lstInfo){ + bool authorCreated = false; + for (int j = 0; j < topLevelItem->childCount(); ++j) { + QTreeWidgetItem* authorItem = topLevelItem->child(j); + if(authorItem->text(0) == info.autor){ //author存在 + QTreeWidgetItem* settingItem = new QTreeWidgetItem(authorItem); + settingItem->setText(0,info.ts); + settingItem->setData(0,Qt::UserRole,info.uuid); + authorCreated = true; + break; + } + } + + if(!authorCreated){ //新建author + QTreeWidgetItem* authorItem = new QTreeWidgetItem(topLevelItem); + authorItem->setText(0,info.autor); + + QTreeWidgetItem* settingItem = new QTreeWidgetItem(authorItem); + settingItem->setText(0,info.ts); + settingItem->setData(0,Qt::UserRole,info.uuid); + } + } + ui->treeWidget->expandAll(); +} + +void DiagramView::onEditorSaved(const QString& strPro,const QString& autor,QUuid uid,QString sTime) +{ + for (int i = 0; i < ui->treeWidget->topLevelItemCount(); ++i) { + QTreeWidgetItem* topItem = ui->treeWidget->topLevelItem(i); + if(topItem->text(0) == strPro){ //在指定项目下添加 + // 遍历子项 + bool exist = false; //名称已存在 + for (int j = 0; j < topItem->childCount(); ++j) { + QTreeWidgetItem* childItem = topItem->child(j); + if(childItem->text(0) == autor){ + exist = true; + QTreeWidgetItem *pItem = new QTreeWidgetItem(childItem); + pItem->setText(0, sTime); + pItem->setData(0,Qt::UserRole,uid); + break; + } + } + + if(!exist){ + QTreeWidgetItem *itemName = new QTreeWidgetItem(topItem); + itemName->setText(0, autor); + QTreeWidgetItem *pItem = new QTreeWidgetItem(itemName); + pItem->setText(0, sTime); + pItem->setData(0,Qt::UserRole,uid); + } } - ++it; } } void DiagramView::onNewEditorClicked() { - + ProjectManager::instance().unloadEditorProject(QString()); + ui->treeWidget->clear(); + emit createProject(); } void DiagramView::onOpenEditorClicked() @@ -258,7 +351,7 @@ void DiagramView::onOpenEditorClicked() void DiagramView::onSaveEditorClicked() { - + ProjectManager::instance().saveEditor("currentPage"); } QString DiagramView::generateName() diff --git a/source/loadPageDlg.cpp b/source/loadPageDlg.cpp index 4855822..e611a91 100644 --- a/source/loadPageDlg.cpp +++ b/source/loadPageDlg.cpp @@ -24,7 +24,7 @@ void LoadPageDlg::initial() m_standardItemModel = new QStandardItemModel(); // 使用model设置QTreeView表头 - m_standardItemModel->setHorizontalHeaderLabels(QStringList(QStringLiteral("接线图"))); + m_standardItemModel->setHorizontalHeaderLabels(QStringList(QStringLiteral("组态编辑"))); // TreeView控件载入model ui->treeView->setModel(m_standardItemModel); // 展开数据 @@ -52,6 +52,7 @@ void LoadPageDlg::updateList() pageList.append(item); } itemPage->appendRows(pageList); + ui->treeView->expandAll(); } } diff --git a/source/mainwindow.cpp b/source/mainwindow.cpp index 7abb288..828397c 100644 --- a/source/mainwindow.cpp +++ b/source/mainwindow.cpp @@ -74,13 +74,13 @@ void CMainWindow::changeEvent(QEvent* event) void CMainWindow::initializeDockUi() { m_pElectricElementsBox = new ElectricElementsBox(); - m_pElectricElementsBox->initial(); + /*m_pElectricElementsBox->initial(); QWidget* pBox = m_pElectricElementsBox->getToolBox(); QDockWidget* ElectricElementsDock = new QDockWidget(QString::fromWCharArray(L"图元面板"),this); ElectricElementsDock->setWidget(pBox); ElectricElementsDock->setMinimumSize(200,150); ElectricElementsDock->setAllowedAreas(Qt::LeftDockWidgetArea|Qt::RightDockWidgetArea); - this->addDockWidget(Qt::RightDockWidgetArea,ElectricElementsDock); + this->addDockWidget(Qt::RightDockWidgetArea,ElectricElementsDock);*/ m_pTopologyView = new TopologyView(this); m_pTopologyView->initial(); @@ -139,11 +139,13 @@ void CMainWindow::initializeAction() connect(m_pDiagramView,&DiagramView::diagramChange,m_pDiagramCavas,&DiagramCavas::onSignal_changeDiagram); connect(m_pDiagramView,&DiagramView::diagramDelete,m_pDiagramCavas,&DiagramCavas::onSignal_deleteDiagram); connect(m_pDiagramView,&DiagramView::diagramSelected,m_pDiagramCavas,&DiagramCavas::onSignal_selectDiagram); + connect(m_pDiagramView,&DiagramView::createProject,this,&CMainWindow::onAction_createEditor); + connect(&ProjectManager::instance(),&ProjectManager::prepareUnloadProject,this,&CMainWindow::onAction_unloadEditor); - connect(m_pDiagramView,&DiagramView::loadProject,this,&CMainWindow::onSignal_loadPage); + connect(m_pDiagramView,&DiagramView::loadProject,this,&CMainWindow::onSignal_loadProject); connect(ui->actionNew,&QAction::triggered,m_pDiagramCavas,&DiagramCavas::onSignal_addPage); - connect(ui->actionOpen,&QAction::triggered,this,&CMainWindow::onSignal_loadPage); + connect(ui->actionOpen,&QAction::triggered,this,&CMainWindow::onSignal_loadProject); connect(ui->actionSave,&QAction::triggered,m_pDiagramCavas,&DiagramCavas::onSignal_savePage); connect(ui->actionDelete,&QAction::triggered,m_pDiagramCavas,&DiagramCavas::onSignal_deletePage); @@ -238,12 +240,17 @@ void CMainWindow::onSignal_deleteItem() m_pUndoStack->push(deleteItemCommand); //push时会自动调用一次command的redo函数*/ } -void CMainWindow::onSignal_loadPage() +void CMainWindow::onSignal_loadProject() { if(m_pLoadPageDlg == nullptr) { m_pLoadPageDlg = new LoadPageDlg(this); - connect(m_pLoadPageDlg,&LoadPageDlg::selectedProject,m_pDiagramCavas,&DiagramCavas::onSignal_loadEdit); + connect(&ProjectManager::instance(),&ProjectManager::prepareLoadBaseSetting,m_pDiagramCavas,&DiagramCavas::onSignal_loadEdit); + connect(m_pLoadPageDlg,&LoadPageDlg::selectedProject,m_pDiagramView,&DiagramView::onEditorLoaded); + connect(&ProjectManager::instance(),&ProjectManager::createNewEditor,m_pDiagramCavas,&DiagramCavas::onSignal_createEditPanel); + connect(&ProjectManager::instance(),&ProjectManager::prepareSaveEditor,m_pDiagramCavas,&DiagramCavas::onSignal_prepareSaveEdit); + connect(&ProjectManager::instance(),&ProjectManager::prepareDeleteBaseSetting,m_pDiagramCavas,&DiagramCavas::onSignal_prepareDeleteEditor); + connect(&ProjectManager::instance(),&ProjectManager::prepareOpenSetting,m_pDiagramCavas,&DiagramCavas::onSignal_prepareOpenSetting); } m_pLoadPageDlg->updateList(); m_pLoadPageDlg->show(); @@ -255,11 +262,18 @@ void CMainWindow::onAction_createEditor() m_pCreateEdiotr = new CreateEditor(this); connect(&ProjectManager::instance(),&ProjectManager::createNewEditor,m_pDiagramCavas,&DiagramCavas::onSignal_createEditPanel); connect(&ProjectManager::instance(),&ProjectManager::prepareSaveEditor,m_pDiagramCavas,&DiagramCavas::onSignal_prepareSaveEdit); + connect(&ProjectManager::instance(),&ProjectManager::prepareDeleteBaseSetting,m_pDiagramCavas,&DiagramCavas::onSignal_prepareDeleteEditor); + connect(&ProjectManager::instance(),&ProjectManager::prepareOpenSetting,m_pDiagramCavas,&DiagramCavas::onSignal_prepareOpenSetting); } m_pCreateEdiotr->showDlg(); } +void CMainWindow::onAction_unloadEditor(const QString& str) +{ + m_pDiagramCavas->onSignal_unloadProject(str); +} + GraphicElementsPanel* CMainWindow::graphicsElementsPanel() const { if(m_pGraphicElementsPanel) diff --git a/source/topologyView.cpp b/source/topologyView.cpp index d52a8f4..b5fac3b 100644 --- a/source/topologyView.cpp +++ b/source/topologyView.cpp @@ -59,6 +59,8 @@ void TopologyView::initial() QString sZone = nZ; QString sStation = nS; + if(info.tag.isEmpty()) + continue; QStandardItem *pItem = new QStandardItem(info.tag); pItem->setData(info.uuid.toString(),Qt::UserRole); addItemToView(sGrid,sZone,sStation,rootItem,pItem); @@ -270,9 +272,17 @@ void TopologyView::onDataChanged(QString uuid) void TopologyView::addItemToView(QString sGrid,QString sZone,QString sStation,QStandardItem *root,QStandardItem *pItem) { - QModelIndex iG = findIndex(_pModel,sGrid); - QModelIndex iZ = findIndex(_pModel,sZone); - QModelIndex iS = findIndex(_pModel,sStation); + QModelIndex iG; + QModelIndex iZ; + QModelIndex iS; + + iG = findIndex(_pModel, sGrid, Qt::DisplayRole, QModelIndex()); + if (iG.isValid()) { + iZ = findIndex(_pModel, sZone, Qt::DisplayRole, iG); // 只在Grid下查找 + if (iZ.isValid()) { + iS = findIndex(_pModel, sStation, Qt::DisplayRole, iZ); // 只在Zone下查找 + } + } if(iG.isValid()) //已创建 { diff --git a/ui/diagramView.ui b/ui/diagramView.ui index 6c2d7c4..a6e384b 100644 --- a/ui/diagramView.ui +++ b/ui/diagramView.ui @@ -45,28 +45,34 @@ - + + + + 1 + + + - 新建 + 新建项目 - 打开 + 加载项目 - 保存 + 保存设置