add editor save/load

This commit is contained in:
baiYue 2025-10-30 17:20:10 +08:00
parent 1edfb1cb3d
commit 3a369e0b97
34 changed files with 827 additions and 227 deletions

View File

@ -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; //时间戳
};
//==================================================

View File

@ -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<QUuid,GraphicsBaseModelItem*>,QList<EditBaseItem*>);
void onSignal_unloadProject(const QString&);
/*********************************间隔**************************************/
void onSignl_openCurrentBay();
private:

View File

@ -37,6 +37,7 @@ public:
void setMaxDownH(double d){dMaxDownH = d;}
double getMaxDownH() {return dMaxDownH;}
QMap<int,QList<DiagramEditorBlockInfo>> getMapBlocksData(); //返回mapBlock中的数据
void clearData();
private:
QMap<int,QList<DiagramEditorBaseBlock*>> _mapBlocks; //容器中包含的对象列表,<pos,listBlocks> pos当前容器中的位置:0上,1中上,2中下3下

View File

@ -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<QUuid,DiagramEditorBriefConnect>& getConnection() {return _mapConnect;}
QList<QUuid> 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 <typename T> void reindexQMap(QMap<int, T> &map); //重新排序函数
void clearTargetLevelContent(int); //清除目标层的数据
void resetBusByData(); //根据数据设置bus界面
void resetBayByData();
void resetTransByData();
private:
Ui::diagramEditorWizard *ui;
BiDirectionalMap<int,QString> _divideType; //划分段数名对照
@ -78,7 +84,6 @@ private:
QMap<int,DiagramEditorWizardBusInfo> _mapBus; //母线信息
QMap<int,QList<DiagramEditorStructContainer*>> _mapSturctContainer; //划分后的区块
QMap<QUuid,DiagramEditorBriefConnect> _mapConnect; //连接列表
bool _busPageChanged; //母线页改变
};
#endif

View File

@ -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<DiagramCavas> p){_pCavas = p;}
void setTag(const QString& s){_tagName = s;}
QString getTag(){return _tagName;}
QPointer<DiagramCavas> 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<int,QList<DiagramEditorBaseBlock*>>); //返回容器中母线类型(单双)
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<DiagramCavas> _pCavas; //顶层界面容器
};

View File

@ -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:

View File

@ -37,6 +37,7 @@ public:
EditPanel* getPanel(){return _pPanel;}
void setWizard(QPointer<DiagramEditorWizard> p){_pWizard = p;}
QMap<QUuid,GraphicsBaseModelItem*> getPreviewItem(){return _previewItem;};
void clearItems(){_previewItem.clear();}
void generatePreview(); //生成预览
void calculateBlockPos(); //重新计算block位置

View File

@ -48,7 +48,7 @@ void DiagramCavas::initial()
{
//todo:读取数据并初始化
QList<pageInfo> 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,16 +219,24 @@ 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)
{
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())
{
//FixedPortsModel::_dataInitialised = false;
}
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,10 +443,11 @@ 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);
if(val)
pPanel->showWizard();
}
@ -438,6 +469,18 @@ void DiagramCavas::onSignal_wizardFinished(QString sName,QMap<QUuid,GraphicsBase
}
}
}
void DiagramCavas::onSignal_unloadProject(const QString& sName)
{
BasePropertyManager::instance().clearEditorData();
for(auto &pair:m_mapEditPanel){
EditPanel* pPanel = pair.first;
this->removeSubWindow(pPanel);
delete pPanel;
}
m_mapEditPanel.clear();
}
/*******************bay************************/
void DiagramCavas::onSignl_openCurrentBay()
{

View File

@ -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();

View File

@ -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);
}
}
}
}
}

View File

@ -175,6 +175,7 @@ void DiagramEditorBayDetailSettingDlg::refreshModel()
QStandardItem *itemComponents = new QStandardItem();
itemRoute->setText(sRoute);
itemRoute->setData(route.bMainRoute);
itemComponents->setText(lstComp.join(","));
QList<QStandardItem*> lstItems;
lstItems<<itemRoute<<itemComponents;

View File

@ -44,6 +44,8 @@ void DiagramEditorBaySettingDlg::showDlg(int nLevel,DiagramEditorBayBlock* p)
show();
addNewBay();
if(_pWizard){
int nType = int(p->getBayType());
ui->cb_type->setCurrentIndex(nType);
ui->le_name->setText(p->getName());
ui->cb_level->setCurrentIndex(nLevel);
if(p){

View File

@ -8,6 +8,7 @@ DiagramEditorStructContainer::DiagramEditorStructContainer(QObject *parent)
}
DiagramEditorStructContainer::~DiagramEditorStructContainer()
{
clearData();
}
bool DiagramEditorStructContainer::insertBlock(int nPos,DiagramEditorBaseBlock* p)
@ -38,3 +39,11 @@ QMap<int,QList<DiagramEditorBlockInfo>> DiagramEditorStructContainer::getMapBloc
return map;
}
void DiagramEditorStructContainer::clearData()
{
for(auto &lstCon:_mapBlocks){
qDeleteAll(lstCon);
}
_mapBlocks.clear();
}

View File

@ -2,6 +2,7 @@
#include <QMessageBox>
#include <QUuid>
#include <QtNumeric>
#include <QComboBox>
#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;
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<QUuid> DiagramEditorWizard::findConnectionByBlock(QString sName,int nType)
{
QList<QUuid> 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,16 +349,75 @@ 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<DiagramEditorStructContainer*> 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)
{
int row = ui->tableWidget_trans->rowCount();
@ -397,6 +469,113 @@ template <typename T> void DiagramEditorWizard::reindexQMap(QMap<int, T> &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<<","<<col<<":"<<value;
_mapBus[row].nState = 1;
}
}
@ -700,6 +880,21 @@ void DiagramEditorWizard::onBusDeleteClicked()
int nIndex = indexName.data(Qt::UserRole).toInt();
if(_mapBus.contains(nIndex)){
_mapBus.remove(nIndex);
if(_mapSturctContainer.contains(nIndex)){ //如果删除行,同步删除该行关联的内容
clearTargetLevelContent(nIndex);
}
}
for (int i = 0; i < ui->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,6 +1046,7 @@ QList<DiagramEditorBaseBlock*> DiagramEditorWizard::getTargetLevelBlocks(int nL
for(auto& container:iter.value())
{
auto mapBlock = container->getBlockMap();
if(!mapBlock.isEmpty()){
for(auto& lst:mapBlock)
{
for(auto& block:lst)
@ -863,6 +1059,7 @@ QList<DiagramEditorBaseBlock*> DiagramEditorWizard::getTargetLevelBlocks(int nL
}
}
}
}
return lstBlock;
}

View File

@ -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);
@ -374,15 +387,20 @@ void EditPanel::showConfirmDlg()
connect(_confirmEditor,&ConfirmEditorDlg::onConfirmEditor,this,[&](QString sAuthor,QString sTime){
auto pCavas = getCavas();
if(pCavas){
//QList<DiagramEditorBayBlock*> lstBocks;
QList<EditBaseItem*> pBays = getBlockItems(EditorItemType::bay);
pCavas->onSignal_wizardFinished(_projectName,_pModel->getPreviewItem(),pBays);
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<EditBaseItem*> 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);
}
}

View File

@ -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();
}
}
/************************预览*********************/

View File

@ -164,8 +164,11 @@ void WizardBayContentDlg::onModifyClicked()
DiagramEditorBaseBlock* pBlock = _pWizard->getBlockByName(_curLevel,2,sName);
if(pBlock){
auto pBay = dynamic_cast<DiagramEditorBayBlock*>(pBlock);
if(pBay)
_pWizard->getBaySettingDlg()->showDlg(_curLevel,pBay);
if(pBay){
auto pDlg = _pWizard->getBaySettingDlg();
if(pDlg)
pDlg->showDlg(_curLevel,pBay);
}
}
}
}

View File

@ -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<QKeyEvent*>(event);
if (keyEvent->key() == Qt::Key_Return || keyEvent->key() == Qt::Key_Enter) {
QLineEdit* editor = qobject_cast<QLineEdit*>(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)

View File

@ -151,7 +151,7 @@ void DrawingPanel::closeEvent(QCloseEvent *closeEvent)
break;
}
}
emit panelDelete(_name);
emit panelDelete(_name,1);
}
else if(getMode() == DM_baseModel)
{

View File

@ -71,7 +71,7 @@ font: 12pt &quot;Microsoft YaHei UI&quot;;</string>
<string notr="true">color: rgb(0, 0, 0);</string>
</property>
<property name="text">
<string>生成接线</string>
<string>保存拓扑</string>
</property>
</widget>
</item>
@ -152,7 +152,7 @@ font: 12pt &quot;Microsoft YaHei UI&quot;;</string>
<item row="1" column="0">
<widget class="QLabel" name="label_3">
<property name="text">
<string>上次修改:</string>
<string>归档时间:</string>
</property>
</widget>
</item>

View File

@ -51,6 +51,7 @@ public:
DiagramEditorItemProperty* findEditorData(QUuid);
void deleteEditorData(QUuid);
QMap<QUuid,DiagramEditorItemProperty*> getEditorData() const;
void clearEditorData();
signals:
void dataCreated(QString uuid);
void dataChanged(QString uuid);

View File

@ -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<editorProjectInfo> 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<editorBaseSettingInfo> getAllBaseSetting();
bool deleteBaseSetting(QUuid);
bool ifBaseSettingExist(QUuid);
private:
QMap<int,attributeGroup> _attributeGroup; //属性组的组
QMap<int,dataType> _dataType; //数据类型组

View File

@ -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<editorBaseSettingInfo> 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<QString,DiagramEditorProjectInfo> _wizardInfo;
void prepareLoadBaseSetting(const QString& str,QUuid id);
void prepareDeleteBaseSetting(const QString& str,QUuid id);
};
#endif // PROJECTMANAGER_H

View File

@ -166,3 +166,11 @@ QMap<QUuid,DiagramEditorItemProperty*> BasePropertyManager::getEditorData() cons
{
return m_editorData;
}
void BasePropertyManager::clearEditorData()
{
for(auto &pPro:m_editorData){
delete pPro;
}
m_editorData.clear();
}

View File

@ -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,17 +2861,107 @@ 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)
QList<editorProjectInfo> DataBase::getAllEditorProject()
{
QString strSQL = "UPDATE diagramui_editorprojects SET context = ? WHERE name = ?";
QList<editorProjectInfo> lst;
QString strSQL = "SELECT id,global_uuid,name,tag FROM diagramui_editor_projects";
try
{
QSqlQuery query = executeSQL(strSQL);
while (query.next())
{
editorProjectInfo info;
info.id = query.value(0).toInt();
info.uuid = QUuid(query.value(1).toString());
info.name = query.value(2).toString();
info.tag = query.value(3).toString();
lst.append(info);
}
query.clear();
return lst;
}
catch (const std::exception& e)
{
return lst;
}
}
bool DataBase::deleteEditorProject(QString 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_editor_projects %1 success").arg(name));
return true;
}
catch (const std::exception& e)
{
LOG_INFO("DB", QString("Delete diagramui_editor_projects %1 fail").arg(name));
return false;
}
}
bool DataBase::ifEditorProjectExist(QString name)
{
QString strSQL = "SELECT * FROM diagramui_editor_projects WHERE name = ?";
QVariantList params;
params.append(name);
try
{
QSqlQuery query = executeSQL(strSQL,false,params);
while (query.next())
{
return true;
}
}
catch (const std::exception& e)
{
return false;
}
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(name);
params.append(ts);
params.append(uid);
try
{
@ -2881,17 +2970,17 @@ bool DataBase::updateEditorProject(QString name,QByteArray context)
}
catch (const std::exception& e)
{
LOG_ERROR("DB", QString("Update diagramui_editorprojects %1 fail").arg(name));
LOG_ERROR("DB", QString("Update diagramui_editor_basesetting %1 fail").arg(uid.toString()));
return false;
}
}
QByteArray DataBase::getEditorProjectByName(QString name)
QByteArray DataBase::getBaseSettingByUid(QUuid uid)
{
QByteArray byte;
QString strSQL = "SELECT context FROM diagramui_editorprojects WHERE name = ?";
QString strSQL = "SELECT context FROM diagramui_editor_basesetting WHERE global_uuid = ?";
QVariantList params;
params.append(name);
params.append(uid);
try
{
@ -2909,22 +2998,52 @@ QByteArray DataBase::getEditorProjectByName(QString name)
}
}
QList<editorProjectInfo> DataBase::getAllEditorProject()
editorBaseSettingInfo DataBase::getBaseSettingInfo(QUuid uid)
{
QList<editorProjectInfo> lst;
QString strSQL = "SELECT id,global_uuid,name,tag,context FROM diagramui_editorprojects";
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<editorBaseSettingInfo> DataBase::getAllBaseSetting()
{
QList<editorBaseSettingInfo> 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())
{
editorProjectInfo info;
editorBaseSettingInfo info;
info.id = query.value(0).toInt();
info.uuid = QUuid(query.value(1).toString());
info.name = query.value(2).toString();
info.tag = query.value(3).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);
}
@ -2937,30 +3056,30 @@ QList<editorProjectInfo> DataBase::getAllEditorProject()
}
}
bool DataBase::deleteEditorProject(QString name)
bool DataBase::deleteBaseSetting(QUuid uid)
{
QString strSQL = "DELETE FROM diagramui_editorprojects WHERE name = ?";
QString strSQL = "DELETE FROM diagramui_editor_basesetting WHERE global_uuid = ?";
QVariantList params;
params.append(name);
params.append(uid);
try
{
executeSQL(strSQL,false,params);
LOG_INFO("DB", QString("Delete diagramui_editorprojects %1 success").arg(name));
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_editorprojects %1 fail").arg(name));
LOG_INFO("DB", QString("Delete diagramui_editor_basesetting %1 fail").arg(uid.toString()));
return false;
}
}
bool DataBase::ifEditorProjectExist(QString name)
bool DataBase::ifBaseSettingExist(QUuid uid)
{
QString strSQL = "SELECT * FROM diagramui_editorprojects WHERE name = ?";
QString strSQL = "SELECT * FROM diagramui_editor_basesetting WHERE global_uuid = ?";
QVariantList params;
params.append(name);
params.append(uid);
try
{

View File

@ -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)){
bool bExist = DataBase::GetInstance()->ifEditorProjectExist(name);
if(bExist)
return true;
QUuid uid = QUuid::createUuid();
_wizardInfo[name].sName = name;
_wizardInfo[name].uid = uid;
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<editorBaseSettingInfo> ProjectManager::getBaseSettingsByProject(const QString& strPro)
{
QList<editorBaseSettingInfo> lst;
QList<editorBaseSettingInfo> 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);
}

View File

@ -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();

View File

@ -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;

View File

@ -1,4 +1,5 @@
#include <QPushButton>
#include <QMessageBox>
#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();
}

View File

@ -7,6 +7,7 @@
#include "topologyManager.h"
#include "projectManager.h"
#include "dataBase.h"
#include <QMessageBox>
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 *actUnload = 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){
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);
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;
}
++it;
}
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);
}
}
}
}
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()

View File

@ -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();
}
}

View File

@ -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)

View File

@ -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()) //已创建
{

View File

@ -45,28 +45,34 @@
</attribute>
<layout class="QVBoxLayout" name="verticalLayout_2">
<item>
<widget class="QTreeWidget" name="treeWidget"/>
<widget class="QTreeWidget" name="treeWidget">
<column>
<property name="text">
<string notr="true">1</string>
</property>
</column>
</widget>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_2">
<item>
<widget class="QPushButton" name="btn_new">
<property name="text">
<string>新建</string>
<string>新建项目</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="btn_open">
<property name="text">
<string>打开</string>
<string>加载项目</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="btn_save">
<property name="text">
<string>保存</string>
<string>保存设置</string>
</property>
</widget>
</item>