diff --git a/common/include/global.h b/common/include/global.h index ceafcc4..66dee24 100644 --- a/common/include/global.h +++ b/common/include/global.h @@ -17,6 +17,8 @@ const double g_dGriaphicsScene_Height = 600; const int g_dEditorItem_Width = 150; const int g_dEditorItem_Height = 80; +const int g_nEditorBus_Height = 10; + //Q_NAMESPACE enum GraphicsItemType { @@ -415,7 +417,8 @@ enum class EditorItemType //组态编辑中的图形项类型 { bus = 0, //母线 bay, //间隔 - Trans //变压器 + Trans, //变压器 + none //空白占位图 }; struct DiagramEditorWizardTransformerInfo //组态变压器信息 @@ -442,11 +445,12 @@ enum class DiagramEditorStructType struct DiagramEditorConnectType //组态编辑连接信息 { QString sName; - int nType = 0; //1母线,2间隔 + int nType = 0; //1母线,2间隔,3变压器 }; struct DiagramEditorBriefConnect //组态编辑时连接信息 { + QUuid uid; DiagramEditorConnectType con1; DiagramEditorConnectType con2; diff --git a/diagramCavas/include/diagramEditor/diagramEditorBaseBlock.h b/diagramCavas/include/diagramEditor/diagramEditorBaseBlock.h index 5fe088f..b22da23 100644 --- a/diagramCavas/include/diagramEditor/diagramEditorBaseBlock.h +++ b/diagramCavas/include/diagramEditor/diagramEditorBaseBlock.h @@ -17,18 +17,19 @@ public: virtual QString getName() {return sName;} virtual void setType(int n) {nType = n;} virtual int getType() {return nType;} - virtual void addConnect(const QString&,int nType,bool bCover = false); //与目标建立连接 - virtual void addConnect(DiagramEditorBriefConnect); //直接添加连接 - virtual void removeConnect(const QString&); - virtual void removeConnect(DiagramEditorBriefConnect); - virtual QList getConnect() {return lstCon;} - virtual void clearConnect() {lstCon.clear();} + virtual void addConnect(QUuid); //直接添加连接 + virtual void removeConnect(QUuid); + virtual QList getConnect() {return _lstCon;} + virtual void clearConnect() {_lstCon.clear();} virtual void setCurContainer(DiagramEditorStructContainer* p) {_curContainer = p;} virtual DiagramEditorStructContainer* getCurContainer() {return _curContainer;} + virtual void setContainerLevel(int n) {nContainerLevel = n;} + virtual int getContainerLevel() {return nContainerLevel;} protected: QString sName; int nType; //1母线,2间隔,3变压器 - QList lstCon; //连接信息 + int nContainerLevel; //所处容器的层级 0,1,2,3 + QList _lstCon; //连接信息 DiagramEditorStructContainer* _curContainer; //当前所处的容器 }; diff --git a/diagramCavas/include/diagramEditor/diagramEditorStructContainer.h b/diagramCavas/include/diagramEditor/diagramEditorStructContainer.h index 7d3c9ef..bc535fc 100644 --- a/diagramCavas/include/diagramEditor/diagramEditorStructContainer.h +++ b/diagramCavas/include/diagramEditor/diagramEditorStructContainer.h @@ -17,7 +17,10 @@ public: public: bool insertBlock(int,DiagramEditorBaseBlock*); auto& getBlockMap() {return _mapBlocks;} + void setId(const QString& s) {sId = s;} + QString getId() {return sId;} private: + QString sId; QMap> _mapBlocks; //容器中包含的对象列表, pos当前容器中的位置:0上,1中上,2中下,3下 }; diff --git a/diagramCavas/include/diagramEditor/diagramEditorWizard.h b/diagramCavas/include/diagramEditor/diagramEditorWizard.h index fb9aa4f..1212723 100644 --- a/diagramCavas/include/diagramEditor/diagramEditorWizard.h +++ b/diagramCavas/include/diagramEditor/diagramEditorWizard.h @@ -46,14 +46,20 @@ public slots: void onBayListSelected(QListWidgetItem* pItem); //baylist选择事件 public: QMap getMapBusInfo() {return _mapBus;} - QMap> getCointainerStruct(){return _mapSturctContainer;} + QMap>& getContainerStruct(){return _mapSturctContainer;} QList getTargetLevelBlocks(int nLevel,int nType); //返回指定层数的对应block,type:1母线,2间隔,3变压器 - DiagramEditorStructContainer* getContainerByBlock(int nLevel,int nType,QString sName); //根据block名称返回container + QList getTargetLevelBlocks_all(int nLevel); + DiagramEditorStructContainer* getContainerByBlock(int nLevel,int nType,QString sName); //根据block名称返回container nType:1母线2间隔3变压器 DiagramEditorBaseBlock* getBlockByName(int nLevel,int nType,QString sName); //根据名称返回block + DiagramEditorBaseBlock* getBlockByName_all(QString sName); bool removeBlockByName(int nLevel,int nType,const QString& sName); //依据名称删除block WizardBayContentDlg* getContentDlg() {return _bayContentDlg;} DiagramEditorBaySettingDlg* getBaySettingDlg() {return _baySettingDlg;} void flushTransPage(); //刷新变压器界面 + int getContainerIndex(int nLevel,DiagramEditorStructContainer*); //返回目标层级container的序号 + QUuid addConnection(const QString& str1,const QString& str2,int nType1,int nType2,bool bCover = false); //插入连接 + QMap& getConnection() {return _mapConnect;} + void removeConnection(QUuid); private: void initial(); void reOrderBus(); //重置bus次序 @@ -67,7 +73,8 @@ private: DiagramEditorBaySettingDlg* _baySettingDlg; DiagramEditorTransSettingDlg* _transSettingDlg; QMap _mapBus; //母线信息 - QMap> _mapSturctContainer; //划分后的区块 + QMap> _mapSturctContainer; //划分后的区块 + QMap _mapConnect; //连接列表 bool _busPageChanged; //母线页改变 }; diff --git a/diagramCavas/include/diagramEditor/editBaseStruct.h b/diagramCavas/include/diagramEditor/editBaseStruct.h index 2ed6c4e..2b6e65e 100644 --- a/diagramCavas/include/diagramEditor/editBaseStruct.h +++ b/diagramCavas/include/diagramEditor/editBaseStruct.h @@ -11,10 +11,13 @@ class EditBaseStruct : public QGraphicsWidget public: EditBaseStruct(QGraphicsItem *parent = 0); virtual ~EditBaseStruct(); + void setId(const QString& s) {sId = s;} + QString getId(){return sId;} void setDataType(DiagramEditorStructType t) {_dataType = t;} DiagramEditorStructType getDataType() {return _dataType;} protected: DiagramEditorStructType _dataType; + QString sId; }; #endif diff --git a/diagramCavas/include/diagramEditor/editContainerItem.h b/diagramCavas/include/diagramEditor/editContainerItem.h index 762d725..2e356a9 100644 --- a/diagramCavas/include/diagramEditor/editContainerItem.h +++ b/diagramCavas/include/diagramEditor/editContainerItem.h @@ -2,16 +2,21 @@ #define EDITCONTAINERITEM_H //存放间隔、分段母线、变压器的实体 #include +#include "diagramEditor/editBaseStruct.h" -class EditContainerItem : public QGraphicsWidget +class EditContainerItem : public EditBaseStruct { Q_OBJECT public: EditContainerItem(QGraphicsItem *parent = nullptr); ~EditContainerItem(); void setupUI(); +signals: + void containerSizeChange(EditContainerItem*); protected: virtual void mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event) override; + virtual void resizeEvent(QGraphicsSceneResizeEvent *event) override; + virtual void paint(QPainter*, const QStyleOptionGraphicsItem*, QWidget*) override; }; #endif diff --git a/diagramCavas/include/diagramEditor/editItems.h b/diagramCavas/include/diagramEditor/editItems.h index 469e10f..28b0233 100644 --- a/diagramCavas/include/diagramEditor/editItems.h +++ b/diagramCavas/include/diagramEditor/editItems.h @@ -2,10 +2,13 @@ #define EDITITEMS_H //组态过程中的item -#include +#include +#include #include "global.h" -class EditBaseItem : public QGraphicsObject +class DiagramEditorBaseBlock; + +class EditBaseItem : public QGraphicsWidget { Q_OBJECT public: @@ -17,13 +20,16 @@ public: virtual void setType(EditorItemType tpe) {nType = tpe;} virtual EditorItemType getType(){return nType;} virtual void setBoundingRect(QRectF rec) {m_boundingRect = rec;} - virtual QRectF boundingRect() {return m_boundingRect;} + virtual QRectF boundingRect() const {return m_boundingRect;} + virtual void setBlockData(QPointer p){_pBlock = p;} + virtual QPointer getBlockData(){return _pBlock;} protected: virtual QPainterPath shape(); protected: QString sName; EditorItemType nType; QRectF m_boundingRect; + QPointer _pBlock; }; /********************bus*********************/ diff --git a/diagramCavas/include/diagramEditor/editPanel.h b/diagramCavas/include/diagramEditor/editPanel.h index 51b2df8..1af0cd1 100644 --- a/diagramCavas/include/diagramEditor/editPanel.h +++ b/diagramCavas/include/diagramEditor/editPanel.h @@ -12,7 +12,9 @@ class QGraphicsLinearLayout; class QPushButton; class EditMainRect; class EditRowData; -class EditBaseStruct; +class EditContainerItem; +class DiagramEditorWizard; +class DiagramEditorBaseBlock; class EditPanel : public QWidget { @@ -22,10 +24,14 @@ public: ~EditPanel(); void initByWizardInfo(); + void setOperateWizard(DiagramEditorWizard* p) {_curWizard = p;} public slots: void onWidthChanged(int width); + void onContainerSizeChanged(EditContainerItem*); //容器大小改变时调整内部大小 private: void initial(); + void calculateContainerWidth(EditContainerItem*); //根据间隔数量计算容器宽度 todo:区分上下间隔 + int getContainerBusType(QMap>); //返回容器中母线类型(单双) private: EditView* m_pEditView; EditScene* m_pEditScene; @@ -37,7 +43,8 @@ private: int _maxWidth; int _maxHeight; QList _lstData; - QMap> _mapStruct; + QMap> _mapStruct; + DiagramEditorWizard* _curWizard; }; #endif diff --git a/diagramCavas/source/diagramCavas.cpp b/diagramCavas/source/diagramCavas.cpp index 79f6399..8ade56c 100644 --- a/diagramCavas/source/diagramCavas.cpp +++ b/diagramCavas/source/diagramCavas.cpp @@ -377,6 +377,7 @@ void DiagramCavas::onSignal_addEditWizard(QString name) _pEditorWizard = new DiagramEditorWizard(this); connect(_pEditorWizard,&DiagramEditorWizard::wizardFinish,this,[&,name](){ EditPanel* pPanel = onSignal_addEditPanel(name); + pPanel->setOperateWizard(_pEditorWizard); pPanel->initByWizardInfo(); }); } diff --git a/diagramCavas/source/diagramEditor/diagramEditorBaseBlock.cpp b/diagramCavas/source/diagramEditor/diagramEditorBaseBlock.cpp index 6283b7f..0e82e1f 100644 --- a/diagramCavas/source/diagramEditor/diagramEditorBaseBlock.cpp +++ b/diagramCavas/source/diagramEditor/diagramEditorBaseBlock.cpp @@ -5,63 +5,26 @@ DiagramEditorBaseBlock::DiagramEditorBaseBlock(QObject *parent) ,_curContainer(nullptr) { nType = 0; + nContainerLevel = 0; } DiagramEditorBaseBlock::~DiagramEditorBaseBlock() { } -void DiagramEditorBaseBlock::addConnect(const QString& str,int n,bool bCover) +void DiagramEditorBaseBlock::addConnect(QUuid uid) { - if(!bCover){ - if(str == sName) - return; - } + if(_lstCon.contains(uid)) + return; - for(auto& con:lstCon){ - if(con.con1.sName == str || con.con2.sName == str){ //已存在不插入 - return; - } - } - - DiagramEditorBriefConnect con; - con.con1.sName = sName; //首参数为自己名 - con.con1.nType = nType; - con.con2.sName = str; - con.con2.nType = n; - - lstCon.append(con); + _lstCon.append(uid); } -void DiagramEditorBaseBlock::addConnect(DiagramEditorBriefConnect obj) +void DiagramEditorBaseBlock::removeConnect(QUuid uid) { - for(auto& con:lstCon){ - if(con == obj){ //已存在不插入 - return; - } - } - lstCon.append(obj); + _lstCon.removeOne(uid); } -void DiagramEditorBaseBlock::removeConnect(const QString& str) -{ - for(int i = 0;i < lstCon.size();++i){ - if(lstCon[i].con1.sName == str || lstCon[i].con2.sName == str){ - lstCon.removeAt(i); - return; - } - } -} - -void DiagramEditorBaseBlock::removeConnect(DiagramEditorBriefConnect obj) -{ - for(int i = 0;i < lstCon.size();++i){ - if(lstCon[i] == obj){ - lstCon.removeAt(i); - return; - } - } -} /***************************划分后的分段bus单元****************************/ DiagramEditorBusBlock::DiagramEditorBusBlock(QObject *parent) :DiagramEditorBaseBlock(parent) diff --git a/diagramCavas/source/diagramEditor/diagramEditorBaySettingDlg.cpp b/diagramCavas/source/diagramEditor/diagramEditorBaySettingDlg.cpp index 29380f9..4133d29 100644 --- a/diagramCavas/source/diagramEditor/diagramEditorBaySettingDlg.cpp +++ b/diagramCavas/source/diagramEditor/diagramEditorBaySettingDlg.cpp @@ -49,9 +49,13 @@ void DiagramEditorBaySettingDlg::showDlg(int nLevel,DiagramEditorBayBlock* p) if(p){ auto lstCon = p->getConnect(); QStringList lst; - for(auto& con:lstCon){ - QString sOppo = con.getOppositeName(p->getName()); - lst.append(sOppo); + + for(auto& conId:lstCon){ + if(_pWizard->getConnection().contains(conId)){ + auto con = _pWizard->getConnection().value(conId); + QString sOpposite = con.getOppositeName(p->getName()); + lst.append(sOpposite); + } } ui->listWidget->addItems(lst); } @@ -66,7 +70,7 @@ void DiagramEditorBaySettingDlg::addNewBay() ui->cb_target->clear(); ui->listWidget->clear(); if(_pWizard){ - auto mapAllCon = _pWizard->getCointainerStruct(); + auto mapAllCon = _pWizard->getContainerStruct(); for(auto iter = mapAllCon.begin();iter != mapAllCon.end();++iter){ if(iter.key() == g_transformerLevel) continue; @@ -143,7 +147,8 @@ void DiagramEditorBaySettingDlg::onOkClicked() _curOperateBlock->clearConnect(); for(int i = 0;i < ui->listWidget->count();++i){ - _curOperateBlock->addConnect(ui->listWidget->item(i)->text(),1,true); + QUuid uid = _pWizard->addConnection(_curOperateBlock->getName(),ui->listWidget->item(i)->text(),2,1,true); + _curOperateBlock->addConnect(uid); } auto pContent = _pWizard->getContentDlg(); diff --git a/diagramCavas/source/diagramEditor/diagramEditorStructContainer.cpp b/diagramCavas/source/diagramEditor/diagramEditorStructContainer.cpp index 4b2ae40..83d6864 100644 --- a/diagramCavas/source/diagramEditor/diagramEditorStructContainer.cpp +++ b/diagramCavas/source/diagramEditor/diagramEditorStructContainer.cpp @@ -17,6 +17,7 @@ bool DiagramEditorStructContainer::insertBlock(int nPos,DiagramEditorBaseBlock* return false; } p->setCurContainer(this); //目标block所属container + p->setContainerLevel(nPos); _mapBlocks[nPos].append(p); return true; } diff --git a/diagramCavas/source/diagramEditor/diagramEditorTransSettingDlg.cpp b/diagramCavas/source/diagramEditor/diagramEditorTransSettingDlg.cpp index 0619e62..85392ff 100644 --- a/diagramCavas/source/diagramEditor/diagramEditorTransSettingDlg.cpp +++ b/diagramCavas/source/diagramEditor/diagramEditorTransSettingDlg.cpp @@ -41,13 +41,15 @@ void DiagramEditorTransSettingDlg::showDlg(DiagramEditorTransformerBlock* p) addNewTrans(); if(_pWizard){ ui->le_name->setText(p->getName()); - //ui->cb_level->setCurrentIndex(0); if(p){ auto lstCon = p->getConnect(); QStringList lst; - for(auto& con:lstCon){ - QString sOppo = con.getOppositeName(p->getName()); - lst.append(sOppo); + for(auto& conId:lstCon){ + if(_pWizard->getConnection().contains(conId)){ + auto con = _pWizard->getConnection().value(conId); + QString sOpposite = con.getOppositeName(p->getName()); + lst.append(sOpposite); + } } ui->listWidget->addItems(lst); } @@ -61,7 +63,7 @@ void DiagramEditorTransSettingDlg::addNewTrans() ui->cb_target->clear(); ui->listWidget->clear(); if(_pWizard){ - auto mapAllCon = _pWizard->getCointainerStruct(); + auto mapAllCon = _pWizard->getContainerStruct(); for(auto iter = mapAllCon.begin();iter != mapAllCon.end();++iter){ if(iter.key() == g_transformerLevel) continue; @@ -134,7 +136,8 @@ void DiagramEditorTransSettingDlg::onOkClicked() _curOperateBlock->clearConnect(); for(int i = 0;i < ui->listWidget->count();++i){ - _curOperateBlock->addConnect(ui->listWidget->item(i)->text(),1,true); + QUuid uid = _pWizard->addConnection(_curOperateBlock->getName(),ui->listWidget->item(i)->text(),3,2,true); + _curOperateBlock->addConnect(uid); } _pWizard->flushTransPage(); diff --git a/diagramCavas/source/diagramEditor/diagramEditorWizard.cpp b/diagramCavas/source/diagramEditor/diagramEditorWizard.cpp index 3ae6c07..0c91590 100644 --- a/diagramCavas/source/diagramEditor/diagramEditorWizard.cpp +++ b/diagramCavas/source/diagramEditor/diagramEditorWizard.cpp @@ -1,5 +1,7 @@ #include #include +#include +#include #include "diagramEditor/diagramEditorWizard.h" #include "diagramEditor/wizardBusTableDelegate.h" #include "ui_diagramEditorWizard.h" @@ -115,6 +117,7 @@ void DiagramEditorWizard::generateBayStruct() } auto pContainer = new DiagramEditorStructContainer(this); + pContainer->setId(QUuid::createUuid().toString()); auto pBus = new DiagramEditorBusBlock(this); pBus->setBusPro(sVoltage+"母线"+sDivPre,1,iter->dVoltage,0,i+1); pContainer->insertBlock(1,pBus); @@ -136,6 +139,7 @@ void DiagramEditorWizard::generateBayStruct() } auto pContainer = new DiagramEditorStructContainer(this); + pContainer->setId(QUuid::createUuid().toString()); auto pBus1 = new DiagramEditorBusBlock(this); pBus1->setBusPro(sVoltage+"Ⅰ母"+sDivPre,1,iter->dVoltage,1,i+1); @@ -143,9 +147,9 @@ void DiagramEditorWizard::generateBayStruct() auto pBus2 = new DiagramEditorBusBlock(this); pBus2->setBusPro(sVoltage+"Ⅱ母"+sDivPre,1,iter->dVoltage,2,i+1); - pContainer->insertBlock(2,pBus2); _mapSturctContainer[iter.key()].insert(i,pContainer); + } } else{ //双母线划分不同 @@ -217,9 +221,12 @@ void DiagramEditorWizard::flushTransPage() info.sName = pItem->getName(); info.nType = pItem->getTransType(); auto lstCon = pItem->getConnect(); //获取间隔所连对象的名称 - for(auto& con:lstCon){ - QString sOpposite = con.getOppositeName(pItem->getName()); - info.lstBindObj.append(sOpposite); + for(auto& conId:lstCon){ + if(_mapConnect.contains(conId)){ + auto con = _mapConnect.value(conId); + QString sOpposite = con.getOppositeName(pItem->getName()); + info.lstBindObj.append(sOpposite); + } } addTransformer(info); @@ -227,6 +234,43 @@ void DiagramEditorWizard::flushTransPage() } } +int DiagramEditorWizard::getContainerIndex(int nLevel,DiagramEditorStructContainer* pCon) +{ + auto lstCon = _mapSturctContainer.value(nLevel); + if(!lstCon.empty()){ + for(int i = 0;i < lstCon.size();++i){ + if(lstCon[i]->getId() == pCon->getId()){ + return i; + } + } + } + return -1; +} + +QUuid DiagramEditorWizard::addConnection(const QString& str1,const QString& str2,int nType1,int nType2,bool bCover) +{ + for(auto& con:_mapConnect){ + if((con.con1.sName == str1 && con.con2.sName == str2) || (con.con1.sName == str2 && con.con2.sName == str1)){ //已存在不插入 + return con.uid; + } + } + + DiagramEditorBriefConnect con; + con.uid = QUuid::createUuid(); + con.con1.sName = str1; + con.con1.nType = nType1; + con.con2.sName = str2; + con.con2.nType = nType2; + + _mapConnect.insert(con.uid,con); + return con.uid; +} + +void DiagramEditorWizard::removeConnection(QUuid uid) +{ + _mapConnect.remove(uid); +} + void DiagramEditorWizard::addTransformer(DiagramEditorWizardTransformerInfo info) { int row = ui->tableWidget_trans->rowCount(); @@ -380,19 +424,107 @@ void DiagramEditorWizard::onAddBayFinished(DiagramEditorWizardBayInfo info) int curIndex = ui->listWidget_bay->currentItem()->data(Qt::UserRole).toInt(); //当前层级 if(!info.lstBindObj.isEmpty()){ - auto pContainer = getContainerByBlock(curIndex,1,info.lstBindObj.first()); + QList lstlevel; //层级 + if(info.nType == BayType::busSectionBay) + { + for(auto& sName:info.lstBindObj){ + auto pBlock = getBlockByName(curIndex,1,sName); + if(pBlock){ + int n = pBlock->getContainerLevel(); + lstlevel.append(n); + } + } + + if(info.lstBindObj.size() < 2){ + QMessageBox::information(NULL, QString("提示"), QString::fromWCharArray(L"分段连接1%连接对象不足").arg(info.sName)); + return; + } + else{ + if(lstlevel.size() > 1){ + if(lstlevel[0] != lstlevel[1]){ + QMessageBox::information(NULL, QString("提示"), QString::fromWCharArray(L"分段连接1%连接母线错位").arg(info.sName)); + } + } + } + } DiagramEditorBayBlock* pBlock = new DiagramEditorBayBlock(this); pBlock->setName(info.sName); pBlock->setType(2); pBlock->setBayType(info.nType); - for(auto& sName:info.lstBindObj){ - pBlock->addConnect(sName,1); + QUuid uid = addConnection(pBlock->getName(),sName,2,1); + pBlock->addConnect(uid); } - pContainer->insertBlock(3,pBlock); + if(info.nType == BayType::busSectionBay){ + auto pC1 = getContainerByBlock(curIndex,1,info.lstBindObj.first()); + auto pC2 = getContainerByBlock(curIndex,1,info.lstBindObj.last()); + int idx1 = getContainerIndex(curIndex,pC1); + int idx2 = getContainerIndex(curIndex,pC2); + int n = qAbs(idx1-idx2); + + if(n == 1){ //两个容器相连,未插入container,新建 + auto pContainer = new DiagramEditorStructContainer(this); + pContainer->setId(QUuid::createUuid().toString()); + + QList lstIndex; + for(auto& sName:info.lstBindObj){ //寻找container所处index + auto pBlock = getBlockByName(curIndex,1,sName); + if(pBlock){ + auto pCon = pBlock->getCurContainer(); + if(pCon){ + int nRes = getContainerIndex(curIndex,pCon); + if(nRes != -1){ + lstIndex.append(nRes); + } + } + } + } + + if(!lstIndex.isEmpty()){ + int maxIndex = lstIndex.first(); // 取第一个元素作为初始值 + for (int i : lstIndex) { + if (i > maxIndex) { + maxIndex = i; // 更新最大值 + } + } + _mapSturctContainer[curIndex].insert(maxIndex,pContainer); //将容器插入到最右的前一个 + } + + if(lstlevel.size() > 1){ //判断连接母线在container中的层级 + if((lstlevel.value(0) == lstlevel.value(1))){ //加入container最上层 + if((lstlevel.value(0) == 1)){ + pContainer->insertBlock(0,pBlock); + } + else if((lstlevel.value(0) == 2)){ //加入container最下层 + pContainer->insertBlock(3,pBlock); + } + } + } + } + else{ //使用已有container + int nMiddle = (idx1+idx2)*0.5; + auto pContainer = _mapSturctContainer[curIndex].value(nMiddle); + if(pContainer){ + if(lstlevel.size() > 1){ //判断连接母线在container中的层级 + if((lstlevel.value(0) == lstlevel.value(1))){ //加入container最上层 + if((lstlevel.value(0) == 1)){ + pContainer->insertBlock(0,pBlock); + } + else if((lstlevel.value(0) == 2)){ //加入container最下层 + pContainer->insertBlock(3,pBlock); + } + } + } + } + } + } + else{ //其他间隔 + auto pContainer = getContainerByBlock(curIndex,1,info.lstBindObj.first()); + pContainer->insertBlock(3,pBlock); + } _bayContentDlg->flushData(curIndex); } } @@ -407,7 +539,8 @@ void DiagramEditorWizard::onAddTransFinished(DiagramEditorWizardTransformerInfo pTrans->setTransType(info.nType); for(auto& sName:info.lstBindObj){ - pTrans->addConnect(sName,2); + QUuid uid = addConnection(pTrans->getName(),sName,3,2); + pTrans->addConnect(uid); } pContainer->insertBlock(1,pTrans); @@ -537,12 +670,19 @@ void DiagramEditorWizard::onTransDeleteClicked() DiagramEditorStructContainer* pCon = getContainerByBlock(g_transformerLevel,3,sName); bool res = removeBlockByName(g_transformerLevel,3,sName); if(pCon){ //同时删除container(一个container包含一个变压器) - for(auto iter = _mapSturctContainer[g_transformerLevel].begin(); iter != _mapSturctContainer[g_transformerLevel].end();++iter){ - if(iter.value() == pCon){ + /*for(auto iter = _mapSturctContainer[g_transformerLevel].begin(); iter != _mapSturctContainer[g_transformerLevel].end();++iter){ + if(*iter == pCon){ delete pCon; _mapSturctContainer[g_transformerLevel].erase(iter); break; } + }*/ + for(int i = 0;i < _mapSturctContainer[g_transformerLevel].size();++i){ + if(_mapSturctContainer[g_transformerLevel][i] == pCon){ + delete pCon; + _mapSturctContainer[g_transformerLevel].removeAt(i); + break; + } } } if(res){ @@ -637,6 +777,27 @@ QList DiagramEditorWizard::getTargetLevelBlocks(int nL return lstBlock; } +QList DiagramEditorWizard::getTargetLevelBlocks_all(int nLevel) +{ + QList lstBlock; + for(auto iter = _mapSturctContainer.begin();iter != _mapSturctContainer.end();++iter){ + if(iter.key() == nLevel){ + for(auto& container:iter.value()) + { + auto mapBlock = container->getBlockMap(); + for(auto& lst:mapBlock) + { + for(auto& block:lst) + { + lstBlock.append(block); + } + } + } + } + } + return lstBlock; +} + DiagramEditorStructContainer* DiagramEditorWizard::getContainerByBlock(int nLevel,int nType,QString sName) { DiagramEditorStructContainer* pContainer = nullptr; @@ -652,14 +813,26 @@ DiagramEditorStructContainer* DiagramEditorWizard::getContainerByBlock(int nLeve DiagramEditorBaseBlock* DiagramEditorWizard::getBlockByName(int nLevel,int nType,QString sName) { - DiagramEditorBaseBlock* pBlock = nullptr; auto lstBlock = getTargetLevelBlocks(nLevel,nType); for(auto& block:lstBlock){ if(block->getName() == sName){ return block; } } - return pBlock; + return nullptr; +} + +DiagramEditorBaseBlock* DiagramEditorWizard::getBlockByName_all(QString sName) +{ + for(auto iter = _mapSturctContainer.begin(); iter != _mapSturctContainer.end();++iter){ + auto lstBlock = getTargetLevelBlocks_all(iter.key()); + for(auto& block:lstBlock){ + if(block->getName() == sName){ + return block; + } + } + } + return nullptr; } bool DiagramEditorWizard::removeBlockByName(int nLevel,int nType,const QString& sName) @@ -671,6 +844,18 @@ bool DiagramEditorWizard::removeBlockByName(int nLevel,int nType,const QString& for(int i = 0;i< lst.size();++i){ if(lst[i]->getName() == sName){ + QList lstUid = lst[i]->getConnect(); + for(auto uid:lstUid){ //删除对象前删除连接 + auto con = _mapConnect.value(uid); + QString sOppo = con.getOppositeName(sName); //删除相连的对象中连接信息 + auto pBlock = getBlockByName_all(sOppo); + if(pBlock){ + pBlock->removeConnect(uid); + } + + removeConnection(uid); + } + delete lst[i]; lst.removeAt(i); return true; diff --git a/diagramCavas/source/diagramEditor/editContainerItem.cpp b/diagramCavas/source/diagramEditor/editContainerItem.cpp index 42e0840..6074ee2 100644 --- a/diagramCavas/source/diagramEditor/editContainerItem.cpp +++ b/diagramCavas/source/diagramEditor/editContainerItem.cpp @@ -5,7 +5,7 @@ #include "diagramEditor/editContainerItem.h" EditContainerItem::EditContainerItem(QGraphicsItem *parent) - : QGraphicsWidget(parent) + : EditBaseStruct(parent) { setupUI(); } @@ -23,3 +23,14 @@ void EditContainerItem::mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event) { event->ignore(); } + +void EditContainerItem::resizeEvent(QGraphicsSceneResizeEvent *event) +{ + emit containerSizeChange(this); +} + +void EditContainerItem::paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget) +{ + painter->setPen(QColor(255,0,0)); + painter->drawRect(boundingRect()); +} diff --git a/diagramCavas/source/diagramEditor/editItems.cpp b/diagramCavas/source/diagramEditor/editItems.cpp index 432eda1..4639c75 100644 --- a/diagramCavas/source/diagramEditor/editItems.cpp +++ b/diagramCavas/source/diagramEditor/editItems.cpp @@ -2,7 +2,8 @@ #include "diagramEditor/editItems.h" EditBaseItem::EditBaseItem(QGraphicsItem *parent) - : QGraphicsObject(parent) + : QGraphicsWidget(parent) + ,_pBlock(nullptr) { } @@ -32,6 +33,7 @@ EditBusItem::~EditBusItem() void EditBusItem::paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget) { painter->fillRect(m_boundingRect,Qt::black); + painter->drawText(QPointF(-10,0),sName); } /********************Bay*********************/ @@ -48,8 +50,9 @@ EditBayItem::~EditBayItem() void EditBayItem::paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget) { - painter->setPen(QColor(100,149,237)); + painter->setPen(QColor(220,220,230)); painter->drawRect(m_boundingRect); + painter->drawText(QPointF(-10,0),sName); } /********************trans*********************/ @@ -66,5 +69,7 @@ EditTransItem::~EditTransItem() void EditTransItem::paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget) { - + painter->setPen(QColor(180,235,155)); + painter->drawRect(m_boundingRect); + painter->drawText(QPointF(-10,0),sName); } diff --git a/diagramCavas/source/diagramEditor/editPanel.cpp b/diagramCavas/source/diagramEditor/editPanel.cpp index 3b0f438..c95fce1 100644 --- a/diagramCavas/source/diagramEditor/editPanel.cpp +++ b/diagramCavas/source/diagramEditor/editPanel.cpp @@ -9,11 +9,17 @@ #include "diagramEditor/editRowData.h" #include "diagramEditor/editMainRect.h" #include "diagramEditor/editBlock.h" +#include "diagramEditor/diagramEditorWizard.h" +#include "diagramEditor/editContainerItem.h" +#include "diagramEditor/diagramEditorStructContainer.h" +#include "diagramEditor/diagramEditorBaseBlock.h" +#include "diagramEditor/editItems.h" #include "global.h" #include EditPanel::EditPanel(QWidget *parent) : QWidget(parent) + ,_curWizard(nullptr) { _maxWidth = 0; _maxHeight = 0; @@ -21,7 +27,7 @@ EditPanel::EditPanel(QWidget *parent) m_pEditScene = new EditScene(this); //设置场景大小.前两个参数为scene的坐标远点,设置到view的中心点后,无论view如何缩放,secne的坐标原点都不会动,方便后续的位置计算 //m_pEditScene->setSceneRect(-g_dGriaphicsScene_Width / 2, -g_dGriaphicsScene_Height / 2, g_dGriaphicsScene_Width, g_dGriaphicsScene_Height); - m_pEditScene->setSceneRect(0, 0, g_dGriaphicsScene_Width*4, g_dGriaphicsScene_Height*4); + m_pEditScene->setSceneRect(0, 0, g_dGriaphicsScene_Width*2, g_dGriaphicsScene_Height*2); m_pEditView = new EditView(this); m_pEditView->setScene(m_pEditScene); @@ -37,6 +43,154 @@ EditPanel::~EditPanel() void EditPanel::initByWizardInfo() { + auto& mapTotal = _curWizard->getContainerStruct(); + for(auto iter = mapTotal.begin();iter != mapTotal.end();++iter){ + if(iter.key() == g_transformerLevel) + continue; + QGraphicsLinearLayout* layoutRowData = new QGraphicsLinearLayout(Qt::Horizontal); + layoutRowData->setSpacing(20); + //layoutRowData->setMinimumHeight(300); + EditRowData* pRow = new EditRowData(); + pRow->setId(QString::number(iter.key())); + auto& mapCon = iter.value(); + for(int i = 0;i < mapCon.size();++i){ + EditContainerItem* pContain = new EditContainerItem(); + connect(pContain,&EditContainerItem::containerSizeChange,this,&EditPanel::onContainerSizeChanged); + pContain->setMinimumWidth(g_dEditorItem_Width+40); + layoutRowData->addItem(pContain); + + pContain->setId(QUuid::createUuid().toString()); + + QGraphicsLinearLayout* layV = new QGraphicsLinearLayout(Qt::Vertical); //container中分层布局 + layV->setSpacing(10); + layV->setMinimumHeight(260); + pContain->setLayout(layV); + + auto pConData = mapCon[i]; + auto mapBlock = pConData->getBlockMap(); + for(auto ite = mapBlock.begin();ite != mapBlock.end();++ite){ + QGraphicsLinearLayout* layH = new QGraphicsLinearLayout(Qt::Horizontal); //container中每一层的布局 + layV->addItem(layH); + if(ite.value().size() > 0){ + for(auto pBlock:ite.value()){ + int nType = pBlock->getType(); + + EditBaseItem* pItem = nullptr; + if(nType == 1){ //母线 + auto pBus = new EditBusItem(); + pBus->setType(EditorItemType::bus); + pItem = pBus; + layH->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Maximum); + layH->setPreferredHeight(10); // 固定高度 + } + else if(nType == 2){ //间隔 + auto pBay = new EditBayItem(); + pBay->setType(EditorItemType::bay); + pBay->setBoundingRect(QRectF(0,0,g_dEditorItem_Width,g_dEditorItem_Height)); + pItem = pBay; + } + /*else if(nType == 3){ //变压器 + auto pTrans = new EditTransItem(); + pTrans->setType(EditorItemType::Trans); + pItem = pTrans; + }*/ + + if(pItem){ + pItem->setName(pBlock->getName()); + pItem->setBlockData(pBlock); + layH->addItem(pItem); + } + } + } + } + if(mapBlock.value(0).isEmpty()){ //为空则添加间距 + //layV->insertStretch(0); + QGraphicsLinearLayout* layH = new QGraphicsLinearLayout(Qt::Horizontal); //container中每一层的布局 + layV->insertItem(0,layH); + auto pSpace = new EditBaseItem(); + pSpace->setType(EditorItemType::none); + pSpace->setBoundingRect(QRectF(0,0,g_dEditorItem_Width,g_dEditorItem_Height)); + layH->addItem(pSpace); + } + + if(mapBlock.value(3).isEmpty()){ //为空则添加间距 + //layV->addStretch(); + QGraphicsLinearLayout* layH = new QGraphicsLinearLayout(Qt::Horizontal); //container中每一层的布局 + layV->insertItem(3,layH); + auto pSpace = new EditBaseItem(); + pSpace->setType(EditorItemType::none); + pSpace->setBoundingRect(QRectF(0,0,g_dEditorItem_Width,g_dEditorItem_Height)); + layH->addItem(pSpace); + } + layV->insertStretch(3); + layV->insertStretch(1); + + calculateContainerWidth(pContain); + int n = getContainerBusType(mapBlock); + if(n == 1){ + layoutRowData->setMaximumHeight(210); + } + } + _lstData.append(pRow); + //layoutRowData->addStretch(); + _widgetLayout->addItem(layoutRowData); + + if(iter.key() == 0){ //若设置了变压器,直接插入到第一行下方 + if(!mapTotal.value(g_transformerLevel).empty()){ + QGraphicsLinearLayout* layoutRowData = new QGraphicsLinearLayout(Qt::Horizontal); + layoutRowData->setSpacing(20); + EditRowData* pRow = new EditRowData(); + pRow->setId(QString::number(g_transformerLevel)); + auto& mapCon = mapTotal[g_transformerLevel]; + for(int i = 0;i < mapCon.size();++i){ + EditContainerItem* pContain = new EditContainerItem(); + connect(pContain,&EditContainerItem::containerSizeChange,this,&EditPanel::onContainerSizeChanged); + pContain->setMinimumWidth(g_dEditorItem_Width+40); + layoutRowData->addItem(pContain); + + pContain->setId(QUuid::createUuid().toString()); + + QGraphicsLinearLayout* layV = new QGraphicsLinearLayout(Qt::Vertical); //container中分层布局 + layV->setSpacing(10); + layV->setMinimumHeight(260); + pContain->setLayout(layV); + + auto pConData = mapCon[i]; + auto mapBlock = pConData->getBlockMap(); + for(auto ite = mapBlock.begin();ite != mapBlock.end();++ite){ + QGraphicsLinearLayout* layH = new QGraphicsLinearLayout(Qt::Horizontal); //container中每一层的布局 + layV->addItem(layH); + if(ite.value().size() > 0){ + for(auto pBlock:ite.value()){ + int nType = pBlock->getType(); + + EditBaseItem* pItem = nullptr; + + if(nType == 3){ //变压器 + auto pTrans = new EditTransItem(); + pTrans->setType(EditorItemType::Trans); + pTrans->setBoundingRect(QRectF(0,0,g_dEditorItem_Width,g_dEditorItem_Width)); + pItem = pTrans; + } + + if(pItem){ + pItem->setName(pBlock->getName()); + pItem->setBlockData(pBlock); + layH->addItem(pItem); + } + } + } + } + layV->insertStretch(3); + layV->insertStretch(0); + layoutRowData->addStretch(); + } + layoutRowData->insertStretch(0); + _lstData.append(pRow); + _widgetLayout->addItem(layoutRowData); + } + } + } _widgetLayout->addStretch(); } @@ -54,11 +208,28 @@ void EditPanel::onWidthChanged(int width) } } +void EditPanel::onContainerSizeChanged(EditContainerItem* pItem) +{ + if(pItem){ + auto lst = pItem->childItems(); + for(auto p:lst){ + auto pBase = dynamic_cast(p); + if(pBase){ + QString sName = pBase->getName(); + EditorItemType tpe = pBase->getType(); + if(tpe == EditorItemType::bus){ + pBase->setBoundingRect(QRectF(0,0,pItem->boundingRect().width()-20,g_nEditorBus_Height)); + } + } + } + } +} + void EditPanel::initial() { _mainWidget = new EditMainRect; _widgetLayout = new QGraphicsLinearLayout(Qt::Vertical); - _widgetLayout->setSpacing(6); + _widgetLayout->setSpacing(40); _mainWidget->setLayout(_widgetLayout); m_pEditScene->addItem(_mainWidget); _mainWidget->setGeometry(m_pEditScene->sceneRect()); @@ -66,3 +237,59 @@ void EditPanel::initial() _maxHeight = _mainWidget->rect().height(); m_pEditView->centerOn(0,0); } + +void EditPanel::calculateContainerWidth(EditContainerItem* pItem) +{ + if(pItem){ + auto lst = pItem->childItems(); + int nWidth = 0; + int nTop = 0; //container上层item数 + int nBottom = 0; //下层 + bool isSection = false; //是否分段 + for(auto p:lst){ + auto pBase = dynamic_cast(p); + if(pBase){ + QString sName = pBase->getName(); + EditorItemType tpe = pBase->getType(); + if(tpe == EditorItemType::bay){ + auto pBay = dynamic_cast(pBase->getBlockData().data()); + if(pBay){ //分段连接的container固定大小 + BayType typ = pBay->getBayType(); + if(typ == BayType::busSectionBay){ + isSection = true; + } + } + auto pData = pBase->getBlockData(); + if(pData){ + int n = pData->getContainerLevel(); + if(n == 0){ + nTop += 1; + } + else if(n == 3){ + nBottom += 1; + } + } + //nWidth += g_dEditorItem_Width+20; + } + } + } + + if(nTop || nBottom){ + nWidth = (nTop > nBottom ? nTop : nBottom)*(g_dEditorItem_Width+20); + pItem->setMinimumWidth(nWidth); + if(isSection){ //分段连接的container固定大小 + pItem->setMaximumWidth(nWidth); + } + } + } +} + +int EditPanel::getContainerBusType(QMap> map) +{ + if(!map.value(1).isEmpty() && !map.value(2).isEmpty()){ //两条母线数据 + return 2; + } + else{ + return 1; + } +} diff --git a/diagramCavas/source/diagramEditor/wizardBayContentDlg.cpp b/diagramCavas/source/diagramEditor/wizardBayContentDlg.cpp index 662ff79..9f043e5 100644 --- a/diagramCavas/source/diagramEditor/wizardBayContentDlg.cpp +++ b/diagramCavas/source/diagramEditor/wizardBayContentDlg.cpp @@ -94,11 +94,14 @@ void WizardBayContentDlg::flushData(int nLevel) info.sName = pItem->getName(); info.nType = pItem->getBayType(); auto lstCon = pItem->getConnect(); //获取间隔所连对象的名称 - for(auto& con:lstCon){ - QString sOpposite = con.getOppositeName(pItem->getName()); - info.lstBindObj.append(sOpposite); - } + for(auto& conId:lstCon){ + if(_pWizard->getConnection().contains(conId)){ + auto con = _pWizard->getConnection().value(conId); + QString sOpposite = con.getOppositeName(pItem->getName()); + info.lstBindObj.append(sOpposite); + } + } addBay(info); } }