diff --git a/common/include/global.h b/common/include/global.h index 66cc8d3..fa36ffb 100644 --- a/common/include/global.h +++ b/common/include/global.h @@ -460,8 +460,10 @@ struct DiagramEditorComponentInfo //组态设备信息 int nCategory = 0; //分类 0电气设备1连接关系 QString sName; int nType = 0; //类型 1母线2异步电动机3断路器4电缆5电流互感器6电压互感器7隔离开关8接地开关9快速接地开关10双掷接地隔离开关11带电指示器12避雷器13电缆出线套筒14电缆端 - QString sBindObj; //所关联的实体名 (母线block,间隔block) + QString sBindObj; //所关联的实体名 (母线block,间隔block,变压器高中低端子) int nBindType = 0; //关联实体的类型 1母线2间隔3变压器 + int nBindPara = 0; //关联额外参数,关联变压器时为(0高1中2低) + QString sBindParent; //关联父item名,关联变压器时为变压器名 QStringList sUsedRoute; //使用设备的线路名 int nUsedDirection = 0; //被占用的方向 8421 上下左右 QPoint deltaPos = QPoint(0,0); //相对坐标(相对间隔) @@ -478,6 +480,10 @@ struct DiagramEditorComponentInfo //组态设备信息 } }; +inline uint qHash(const DiagramEditorComponentInfo &key, uint seed = 0) { + return qHash(key.uid, seed); +} + struct DiagramEditorRouteInfo //间隔中单条线路信息 { QString sRouteName; @@ -489,12 +495,27 @@ struct DiagramEditorRouteInfo //间隔中单条线路信息 struct DiagramEditorBayInfo //组态编辑间隔信息 { - QString name; + QString name; //间隔名 int nLayout; //布局 0纵向1横向 QMap mapRoute; //线路信息 QMap mapComponent; //设备信息 }; +struct DiagramEditorTransNeutralInfo //组态编辑变压器中性点信息 +{ + QString name; //中性点名 + int nType = 0; //中性点类型 0高1中2低 + QPointF delPoint; //相对变压器偏移量 + QMap mapRoute; //中性点对应的线路结构 +}; + +struct DiagramEditorTransInfo //组态编辑变压器信息 +{ + QString name; //变压器名 + QMap mapNeutral; //中性点结构 + QMap mapComponent; //设备信息 +}; + enum class DiagramEditorStructType { block = 0, //模块(母线段、间隔、变压器) diff --git a/diagramCavas/include/diagramEditor/diagramEditorBaseBlock.h b/diagramCavas/include/diagramEditor/diagramEditorBaseBlock.h index 77dc9bb..ec11fe3 100644 --- a/diagramCavas/include/diagramEditor/diagramEditorBaseBlock.h +++ b/diagramCavas/include/diagramEditor/diagramEditorBaseBlock.h @@ -27,12 +27,18 @@ public: virtual DiagramEditorStructContainer* getCurContainer() {return _curContainer;} virtual void setContainerLevel(int n) {nContainerLevel = n;} virtual int getContainerLevel() {return nContainerLevel;} + virtual void setRecSize(QRectF rec) {recSize = rec;} + virtual QRectF getRecSize() {return recSize;} + virtual void setSeceneDelta(QPointF p){sceneDelta = p;} + virtual QPointF getSceneDelta() {return sceneDelta;} protected: QString sName; int nType; //1母线,2间隔,3变压器 int nContainerLevel; //所处容器的层级 0,1,2,3 QUuid uid; QList _lstCon; //连接信息 + QRectF recSize; //当前大小(根据内容确定) + QPointF sceneDelta; //block中心相对位移(计算布局位置 DiagramEditorStructContainer* _curContainer; //当前所处的容器 }; @@ -81,13 +87,10 @@ public: virtual ~DiagramEditorTransformerBlock(); virtual void setTransType(TransformerType typ) {nTransType = typ;} virtual TransformerType getTransType() {return nTransType;} - virtual void setRouteInfoMaps(QMap> info) {mapsRouteInfo = info;} - virtual QMap>& getRouteInfoMaps() {return mapsRouteInfo;} - virtual void setComponentMap(QMap info) {mapComponents = info;} - virtual QMap& getComponentMap() {return mapComponents;} + virtual void setTransInfo(DiagramEditorTransInfo info) {transInfo = info;} + virtual DiagramEditorTransInfo& getTranInfo() {return transInfo;} protected: TransformerType nTransType; - QMap> mapsRouteInfo; //变压器中性点线路信息 0高1中2低 - QMap mapComponents; //变压器中性点设备信息 + DiagramEditorTransInfo transInfo; }; #endif diff --git a/diagramCavas/include/diagramEditor/diagramEditorStructContainer.h b/diagramCavas/include/diagramEditor/diagramEditorStructContainer.h index bc535fc..022cb94 100644 --- a/diagramCavas/include/diagramEditor/diagramEditorStructContainer.h +++ b/diagramCavas/include/diagramEditor/diagramEditorStructContainer.h @@ -19,9 +19,34 @@ public: auto& getBlockMap() {return _mapBlocks;} void setId(const QString& s) {sId = s;} QString getId() {return sId;} + + void setMidUpY(double d){dMidUpY = d;} + double getMidUpY() {return dMidUpY;} + void setMidDownY(double d){dMidDownY = d;} + double getMidDownY() {return dMidDownY;} + void setWidth(double d){dWidth = d;} + double getWidth() {return dWidth;} + void setHeight(double d){dHeight = d;} + double getHeight() {return dHeight;} + void setStartX(double d){dStartX = d;} + double getStartX() {return dStartX;} + void setStartY(double d){dStartY = d;} + double getStartY() {return dStartY;} + void setMaxUpH(double d){dMaxUpH = d;} + double getMaxUpH() {return dMaxUpH;} + void setMaxDownH(double d){dMaxDownH = d;} + double getMaxDownH() {return dMaxDownH;} private: QString sId; QMap> _mapBlocks; //容器中包含的对象列表, pos当前容器中的位置:0上,1中上,2中下,3下 + double dMidUpY; //1母上边界 + double dMidDownY; //2母下边界 + double dStartX; //起始x + double dStartY; //起始y + double dWidth; //宽度 + double dHeight; + double dMaxUpH; //上方最大高度(1母线到上边界) + double dMaxDownH; //下方最大高度(2母线到下边界) }; #endif diff --git a/diagramCavas/include/diagramEditor/diagramEditorTransDetailAddDlg.h b/diagramCavas/include/diagramEditor/diagramEditorTransDetailAddDlg.h index e32ee73..71e1e52 100644 --- a/diagramCavas/include/diagramEditor/diagramEditorTransDetailAddDlg.h +++ b/diagramCavas/include/diagramEditor/diagramEditorTransDetailAddDlg.h @@ -21,6 +21,8 @@ public: void showDlg(int n); void showDlg(DiagramEditorRouteInfo info); //编辑 void setParent(DiagramEditorTransDetailSettingDlg* p) {_pParent = p;} +private: + void updateBindLst(); //刷新关联列表 public slots: void onAddClicked(); void onDeleteClicked(); @@ -39,6 +41,7 @@ private: DiagramEditorTransDetailSettingDlg* _pParent; int _curMode; //0新建1修改 int _curType; //当前回路类型 0高压中性点1中2低 + QStandardItemModel* _bindItemModel; //绑定的对象模型 }; #endif diff --git a/diagramCavas/include/diagramEditor/diagramEditorTransDetailSettingDlg.h b/diagramCavas/include/diagramEditor/diagramEditorTransDetailSettingDlg.h index 1b1373e..fee6a9f 100644 --- a/diagramCavas/include/diagramEditor/diagramEditorTransDetailSettingDlg.h +++ b/diagramCavas/include/diagramEditor/diagramEditorTransDetailSettingDlg.h @@ -25,13 +25,17 @@ public: void initial(); void refreshModel(); //刷新view显示的model void showDlg(DiagramEditorTransformerBlock*); - void setParent(DiagramEditorWizard* p) {_pWizard = p;} + void setWizard(DiagramEditorWizard* p) {_pWizard = p;} QStandardItemModel* getComponentModel() {return _compoModel;} QMap getRouteModels() {return _routeModels;} - void setRouteMaps(QMap> map) {_mapsRouteInfo = map;} - QMap>& getRouteMaps(){return _mapsRouteInfo;} + //void setRouteMaps(QMap> map) {_mapsRouteInfo = map;} + //QMap>& getRouteMaps(){return _mapsRouteInfo;} + void setTransInfo(DiagramEditorTransInfo info){_transInfo = info;} + DiagramEditorTransInfo& getTransInfo(){return _transInfo;} void setModelDelegate(DiagramEditorModel* p){_pModel = p;} DiagramEditorModel* getModel() {return _pModel;} + DiagramEditorTransformerBlock* getCurBlock(){return _curOperateObj;} + DiagramEditorWizard* getWizard() {return _pWizard;} public slots: void onAddClicked(); void onOkClicked(); @@ -50,7 +54,8 @@ private: DiagramEditorTransformerBlock* _curOperateObj; //当前加载的block对象 QStandardItemModel* _compoModel; //设备库model name中的data:1为占用方向,2为相对坐标,3为uuid,4为item标志位(1新建2修改),5旋转角度 QMap _routeModels; //中性点拓扑,0,1,2高中低 - QMap> _mapsRouteInfo; //侧中性点线路信息 + //QMap> _mapsRouteInfo; //中性点线路信息 int:0高1中2低 + DiagramEditorTransInfo _transInfo; //变压器信息 DiagramEditorModel* _pModel; QTableView* _curOperateRouteView; //当前操作的中性点拓扑view }; diff --git a/diagramCavas/include/graphicsDataModel/baseModel.h b/diagramCavas/include/graphicsDataModel/baseModel.h index 2be3505..8571ba0 100644 --- a/diagramCavas/include/graphicsDataModel/baseModel.h +++ b/diagramCavas/include/graphicsDataModel/baseModel.h @@ -20,7 +20,7 @@ class BaseModel : public QObject public: void createTopoTerminalsByItem(GraphicsBaseItem*,ModelFunctionType funType = ModelFunctionType::ProjectModel); //通过图形对象创建port接线点(新建) QPointF calculateBusPortPos(GraphicsBaseItem* pBus,GraphicsBaseItem* item); //计算母线上接线点位置 - template void establishConnection(GraphicsBaseItem*,GraphicsBaseItem*,TypeLine*,ModelFunctionType,int nMode=0,int nParam = 0); //在两个item之间建立连接 nMode:0正常1变压器中性点 nParam附加参数:中性点中表示需连接的位置(012高中低) + template void establishConnection(GraphicsBaseItem*,GraphicsBaseItem*,TypeLine*,ModelFunctionType,int nMode=0,int nParam = 0); //在两个item之间建立连接 nMode:0正常1变压器中性点2变压器 nParam附加参数:中性点中表示需连接的位置(012高中低) double distanceBetweenItems(QGraphicsItem* item1, QGraphicsItem* item2) { QPointF center1 = item1->mapToScene(item1->boundingRect().center()); QPointF center2 = item2->mapToScene(item2->boundingRect().center()); diff --git a/diagramCavas/include/graphicsDataModel/diagramEditorModel.h b/diagramCavas/include/graphicsDataModel/diagramEditorModel.h index 257b721..18f6f14 100644 --- a/diagramCavas/include/graphicsDataModel/diagramEditorModel.h +++ b/diagramCavas/include/graphicsDataModel/diagramEditorModel.h @@ -12,6 +12,8 @@ class DiagramEditorTransformerBlock; class EditPanel; class DiagramEditorWizard; +int const g_nHorizontalBlockSpacing = 100; //间隔横向间距 + class DiagramEditorModel : public BaseModel { Q_OBJECT @@ -22,7 +24,7 @@ public: bool addPreviewItem(QUuid uuid,GraphicsBaseModelItem*,int mode); //mode 0局部1整体 DiagramEditorItemProperty* addPreviewData(QUuid id,int type,QString name,QString metaName,QString sBlock,int mode = 0); //添加图元基模数据 mode:0局部1整体 void createTopoTerminalsByItem(GraphicsBaseItem*,ModelFunctionType funType = ModelFunctionType::ProjectModel); //通过图形对象创建port接线点(新建) - void generateTempBay(); //通过设置生成间隔预览对象 + QRectF generateTempBay(); //通过设置生成间隔预览对象 void generateTempTrans(int nType,DiagramEditorTransformerBlock* block = nullptr); //0高压侧1中压侧2低压侧3整个变压器 void connectTransToNeutral(DiagramEditorTransformerBlock* block); //连接变压器与中性点设备 void linkTransItem(GraphicsBaseModelItem*,QStandardItemModel*); //连接中性点与设备点 @@ -32,6 +34,8 @@ public: void setPanel(EditPanel* p) {_pPanel = p;} void setWizard(QPointer p){_pWizard = p;} void generatePreview(); //生成预览 + void calculateBlockPos(); //重新计算block位置 + void setItemInBlockPos(); //设置block中的item位置 void setCurBayRouteModel(QStandardItemModel* p) {_pCurBayRoute = p;} QStandardItemModel* getCurBayRouteModel() {return _pCurBayRoute;} @@ -46,11 +50,13 @@ public: QStandardItem* getNameItem(const QString&,int nFrom = 0); //获取返回当前设备模型中的name项 nFrom,0间隔1变压器 void generateItemByModel(QStandardItemModel* pModel,int nFrom = 0,QPoint delta = QPoint(0,0)); //0间隔1变压器 - void generateItemByInfo(QMap mapRoute,QMap mapCompo,QPointF delta = QPointF(0,0)); //根据data生成item + QList generateItemByInfo(QMap mapRoute,QMap mapCompo,QPointF delta = QPointF(0,0)); //根据data生成item + void generateOutConnection(QList,int nTypeTransCon,int nPos = 0); //生成外部连接(手动bind的连接) nTypeTransCon变压器连线类型,1中性点连接2外部连接,nPos中性点连接时的位置 void updateTarget(QMap&,int nLayout,int nSource); //更新位置 nLayout主次朝向:8421,8421 上下左右,上下左右 nSource:0间隔1变压器 private: - void bulidAndLinkComponent(QList); //生成并连接线路上的设备 + void bulidAndLinkComponent(QList,QMap); //生成并连接线路上的设备 lst,mapComponents(从map中获取正确数据) //DiagramEditorComponentInfo getCompoDataFromName(const QString&,QMap); //根据名称获取数据 + QList getRouteItemInfoList(QMap,QMap); //返回线路中包含的设备信息列表 private: QMap _tempItem; //临时预览对象 QMap _previewItem; //预览对象 diff --git a/diagramCavas/source/diagramEditor/diagramEditorBayDetailAddDlg.cpp b/diagramCavas/source/diagramEditor/diagramEditorBayDetailAddDlg.cpp index f285feb..5ef4bc6 100644 --- a/diagramCavas/source/diagramEditor/diagramEditorBayDetailAddDlg.cpp +++ b/diagramCavas/source/diagramEditor/diagramEditorBayDetailAddDlg.cpp @@ -72,14 +72,15 @@ void DiagramEditorBayDetailAddDlg::initial() ui->cb_lineType->setItemData(0,1); //设置主线支线 ui->cb_lineType->setItemData(1,0); - //_bindItemModel = new QStandardItemModel(this); - //ui->cb_bindObj->setModel(_bindItemModel); + _bindItemModel = new QStandardItemModel(this); + ui->cb_bindObj->setModel(_bindItemModel); } void DiagramEditorBayDetailAddDlg::updateBindLst() { - ui->cb_bindObj->clear(); - ui->cb_bindObj->addItem("无"); + _bindItemModel->clear(); + QStandardItem* it = new QStandardItem("无"); + _bindItemModel->appendRow(it); DiagramEditorBayBlock* pBlock = _pParent->getCurBlock(); if(pBlock){ QList lstCon = pBlock->getConnect(); @@ -91,41 +92,35 @@ void DiagramEditorBayDetailAddDlg::updateBindLst() auto con = mapCon.value(uid); DiagramEditorConnectType conOp = con.getOpposite(pBlock->getName()); if(conOp.nType == 1){ //母线单block单item - ui->cb_bindObj->addItem(conOp.sName,conOp.nType); + //ui->cb_bindObj->addItem(conOp.sName,conOp.nType); + QStandardItem* item = new QStandardItem(conOp.sName); + item->setData(conOp.nType, Qt::UserRole+1); // 设置用户数据 + _bindItemModel->appendRow(item); } else if(conOp.nType == 3){ //变压器,选择对应进/出线口 + QStandardItem* item = nullptr; + if(con.nPara == 0){ + item = new QStandardItem("高压接线端子"); + } + else if(con.nPara == 1){ + item = new QStandardItem("中压接线端子"); + } + else if(con.nPara == 2){ + item = new QStandardItem("低压接线端子"); + } + if(item){ + item->setData(conOp.nType, Qt::UserRole+1); + item->setData(con.nPara, Qt::UserRole+2); + item->setData(conOp.sName, Qt::UserRole+3); + _bindItemModel->appendRow(item); + } } } } } } ui->cb_bindObj->setCurrentIndex(0); - - //_bindItemModel->clear(); - /** pBlock = _pParent->getCurBlock(); - if(pBlock){ - QList lstCon = pBlock->getConnect(); - DiagramEditorWizard* pWizard = _pParent->getWizard(); - if(pWizard){ - QMap mapCon = pWizard->getConnection(); - for(auto& uid:lstCon){ - if(mapCon.contains(uid)){ - auto con = mapCon.value(uid); - DiagramEditorConnectType conOp = con.getOpposite(pBlock->getName()); - auto container = pWizard->getContainerByBlock_all(conOp.sName); - - if(conOp.nType == 1){ - //ui->cb_bindObj->addItem(conOp.sName,conOp.nType); - auto pItem = new QStandardItem(conOp.sName); - pItem->setData(conOp.nType,Qt::UserRole); - pItem->setData(container->getId(),Qt::UserRole+1); - } - } - } - } - } - ui->cb_bindObj->setCurrentIndex(0);*/ } void DiagramEditorBayDetailAddDlg::showDlg() @@ -323,7 +318,9 @@ void DiagramEditorBayDetailAddDlg::onSaveClicked() QString sType = ui->cb_type->currentText(); int nType = ui->cb_type->currentData().toInt(); QString sBindObj = ui->cb_bindObj->currentText(); - int nBindType = ui->cb_bindObj->currentData().toInt(); + int nBindType = ui->cb_bindObj->currentData(Qt::UserRole+1).toInt(); + int nBindPara = ui->cb_bindObj->currentData(Qt::UserRole+2).toInt(); + QString sBindParent = ui->cb_bindObj->currentData(Qt::UserRole+3).toString(); if(_pParent){ auto pCompoModel = _pParent->getComponentModel(); @@ -377,7 +374,9 @@ void DiagramEditorBayDetailAddDlg::onSaveClicked() itemType->setText(sType); itemType->setData(nType); itemObj->setText(sBindObj); - itemObj->setData(nBindType); + itemObj->setData(nBindType,Qt::UserRole+1); + itemObj->setData(nBindPara,Qt::UserRole+2); + itemObj->setData(sBindParent,Qt::UserRole+3); QList lstItems; lstItems<text(); QString sType = itemType->text(); QString sBind = itemBind->text(); - int nBindType = itemBind->data().toInt(); + int nBindType = itemBind->data(Qt::UserRole + 1).toInt(); + int nBindPara = itemBind->data(Qt::UserRole + 2).toInt(); + QString sBindParent = itemBind->data(Qt::UserRole + 3).toString(); QString sAllRoute = itemAllRoute->text(); QUuid uid = itemName->data(Qt::UserRole+3).toUuid(); @@ -424,6 +425,8 @@ void DiagramEditorBayDetailAddDlg::onOkClicked() compoInfo.nType = nType; compoInfo.sBindObj = sBind; compoInfo.nBindType = nBindType; + compoInfo.nBindPara = nBindPara; + compoInfo.sBindParent = sBindParent; compoInfo.uid = uid; compoInfo.sUsedRoute = sAllRoute.split(","); diff --git a/diagramCavas/source/diagramEditor/diagramEditorBayDetailSettingDlg.cpp b/diagramCavas/source/diagramEditor/diagramEditorBayDetailSettingDlg.cpp index 93a9d59..0fadf69 100644 --- a/diagramCavas/source/diagramEditor/diagramEditorBayDetailSettingDlg.cpp +++ b/diagramCavas/source/diagramEditor/diagramEditorBayDetailSettingDlg.cpp @@ -220,6 +220,8 @@ void DiagramEditorBayDetailSettingDlg::onOkClicked() compoInfo.nType = itemType->data().toInt(); compoInfo.sBindObj = itemBind->text(); compoInfo.nBindType = itemBind->data().toInt(); + compoInfo.nBindPara = itemBind->data(Qt::UserRole+2).toInt(); + compoInfo.sBindParent = itemBind->data(Qt::UserRole+3).toString(); compoInfo.sUsedRoute = itemRoute->text().split(","); compoInfo.nUsedDirection = nDir; compoInfo.deltaPos = deltaPos; @@ -341,7 +343,10 @@ void DiagramEditorBayDetailSettingDlg::onPreviewClicked() } if(!_pPreviewDlg->isVisible()){ _pPreviewDlg->showDlg(nLayout); - _pModel->generateTempBay(); + QRectF recContainAll = _pModel->generateTempBay(); + if(_curOperateObj){ + _curOperateObj->setRecSize(recContainAll); + } } else _pPreviewDlg->hide(); diff --git a/diagramCavas/source/diagramEditor/diagramEditorTransDetailAddDlg.cpp b/diagramCavas/source/diagramEditor/diagramEditorTransDetailAddDlg.cpp index 4aef43d..261f0c9 100644 --- a/diagramCavas/source/diagramEditor/diagramEditorTransDetailAddDlg.cpp +++ b/diagramCavas/source/diagramEditor/diagramEditorTransDetailAddDlg.cpp @@ -3,12 +3,15 @@ #include "diagramEditor/diagramEditorTransDetailAddDlg.h" #include "diagramEditor/diagramEditorTransDetailSettingDlg.h" #include "ui_diagramEditorTransDetailAddDlg.h" +#include "diagramEditor/diagramEditorBaseBlock.h" +#include "diagramEditor/diagramEditorWizard.h" DiagramEditorTransDetailAddDlg::DiagramEditorTransDetailAddDlg(QWidget *parent) : QDialog(parent) , ui(new Ui::diagramEditorTransDetailAddDlg) ,_selectedModel(nullptr) ,_pParent(nullptr) + ,_bindItemModel(nullptr) { ui->setupUi(this); this->setWindowFlags(Qt::FramelessWindowHint | windowFlags()); @@ -65,6 +68,9 @@ void DiagramEditorTransDetailAddDlg::initial() ui->tableView_selected->setSelectionBehavior(QAbstractItemView::SelectRows); ui->tableView_selected->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch); ui->tableView_selected->verticalHeader()->setVisible(false); + + _bindItemModel = new QStandardItemModel(this); + ui->cb_bindObj->setModel(_bindItemModel); } void DiagramEditorTransDetailAddDlg::showDlg(int nType) @@ -72,6 +78,7 @@ void DiagramEditorTransDetailAddDlg::showDlg(int nType) if(_pParent){ _selectedModel->clear(); _selectedModel->setHorizontalHeaderLabels({"分类", "名称", "类型", "关联对象", "引用线路"}); + updateBindLst(); show(); auto pCompo = _pParent->getComponentModel(); auto pRoute = _pParent->getRouteModels().value(nType); @@ -156,12 +163,14 @@ void DiagramEditorTransDetailAddDlg::showDlg(DiagramEditorRouteInfo info) itemName->setText(component.sName); itemType->setText(sType); itemObj->setText(component.sBindObj); + itemObj->setData(component.nBindType); itemRoute->setText(component.sUsedRoute.join(",")); QList lstItems; lstItems<appendRow(lstItems); } + updateBindLst(); show(); ui->label->setText("编辑线路"); ui->le_routeName->setReadOnly(false); @@ -169,6 +178,83 @@ void DiagramEditorTransDetailAddDlg::showDlg(DiagramEditorRouteInfo info) } } +void DiagramEditorTransDetailAddDlg::updateBindLst() +{ + _bindItemModel->clear(); + QStandardItem* it = new QStandardItem("无"); + _bindItemModel->appendRow(it); + DiagramEditorTransformerBlock* pBlock = _pParent->getCurBlock(); + if(pBlock){ + TransformerType typ = pBlock->getTransType(); + if(typ == TransformerType::twoWinding){ + QStandardItem* itemH = new QStandardItem("高压绕组中性点"); + QStandardItem* itemL = new QStandardItem("低压绕组中性点"); + + itemH->setData(3, Qt::UserRole+1); + itemH->setData(0, Qt::UserRole+2); + itemH->setData(pBlock->getName(), Qt::UserRole+3); + _bindItemModel->appendRow(itemH); + + itemL->setData(3, Qt::UserRole+1); + itemL->setData(2, Qt::UserRole+2); + itemL->setData(pBlock->getName(), Qt::UserRole+3); + _bindItemModel->appendRow(itemL); + } + else{ //三绕组 + QStandardItem* itemH = new QStandardItem("高压绕组中性点"); + QStandardItem* itemM = new QStandardItem("中压绕组中性点"); + QStandardItem* itemL = new QStandardItem("低压绕组中性点"); + + itemH->setData(3, Qt::UserRole+1); + itemH->setData(0, Qt::UserRole+2); + itemH->setData(pBlock->getName(), Qt::UserRole+3); + _bindItemModel->appendRow(itemH); + + itemM->setData(3, Qt::UserRole+1); + itemM->setData(1, Qt::UserRole+2); + itemM->setData(pBlock->getName(), Qt::UserRole+3); + _bindItemModel->appendRow(itemM); + + itemL->setData(3, Qt::UserRole+1); + itemL->setData(2, Qt::UserRole+2); + itemL->setData(pBlock->getName(), Qt::UserRole+3); + _bindItemModel->appendRow(itemL); + } + + QList lstCon = pBlock->getConnect(); + DiagramEditorWizard* pWizard = _pParent->getWizard(); + if(pWizard){ + QMap mapCon = pWizard->getConnection(); + for(auto& uid:lstCon){ + if(mapCon.contains(uid)){ + auto con = mapCon.value(uid); + DiagramEditorConnectType conOp = con.getOpposite(pBlock->getName()); + if(conOp.nType == 3){ //变压器,选择对应进/出线口 + QStandardItem* item = nullptr; + + if(con.nPara == 0){ + item = new QStandardItem("高压绕组中性点"); + } + else if(con.nPara == 1){ + item = new QStandardItem("中压绕组中性点"); + } + else if(con.nPara == 2){ + item = new QStandardItem("低压绕组中性点"); + } + if(item){ + item->setData(conOp.nType, Qt::UserRole+1); + item->setData(con.nPara, Qt::UserRole+2); + item->setData(conOp.sName, Qt::UserRole+3); + _bindItemModel->appendRow(item); + } + } + } + } + } + } + ui->cb_bindObj->setCurrentIndex(0); +} + void DiagramEditorTransDetailAddDlg::onAddClicked() { // 获取当前选中的索引 @@ -236,6 +322,8 @@ void DiagramEditorTransDetailAddDlg::onSaveClicked() QString sType = ui->cb_type->currentText(); int nType = ui->cb_type->currentData().toInt(); QString sBindObj = ui->cb_bindObj->currentText(); + int nBindType = ui->cb_bindObj->currentData(Qt::UserRole+1).toInt(); + QString sBindParent = ui->cb_bindObj->currentData(Qt::UserRole+3).toString(); if(_pParent){ auto pCompoModel = _pParent->getComponentModel(); @@ -289,6 +377,8 @@ void DiagramEditorTransDetailAddDlg::onSaveClicked() itemType->setText(sType); itemType->setData(nType); itemObj->setText(sBindObj); + itemObj->setData(nBindType); + itemObj->setData(sBindParent,Qt::UserRole+3); QList lstItems; lstItems<le_routeName->text(); - auto& mapRoute = _pParent->getRouteMaps()[_curType]; + auto& mapRoute = _pParent->getTransInfo().mapNeutral[_curType].mapRoute; QStringList lstName; //线路的设备列表 DiagramEditorRouteInfo routeInfo; routeInfo.sRouteName = sRoute; @@ -317,6 +407,8 @@ void DiagramEditorTransDetailAddDlg::onOkClicked() QString sName = itemName->text(); QString sType = itemType->text(); QString sBind = itemBind->text(); + int nBindType = itemBind->data().toInt(); + QString sBindParent = itemBind->data(Qt::UserRole+3).toString(); QString sAllRoute = itemAllRoute->text(); int nCate = 0; @@ -332,6 +424,8 @@ void DiagramEditorTransDetailAddDlg::onOkClicked() compoInfo.sName = sName; compoInfo.nType = nType; compoInfo.sBindObj = sBind; + compoInfo.nBindType = nBindType; + compoInfo.sBindParent = sBindParent; compoInfo.sUsedRoute = sAllRoute.split(","); routeInfo.lstCompo.append(compoInfo); @@ -429,7 +523,7 @@ void DiagramEditorTransDetailAddDlg::onComponentDeleteClicked() QString sName = indexName.data().toString(); bool bUsed = false; - auto& mapRoute = _pParent->getRouteMaps()[_curType]; //检索所有路线,判断设备占用情况 + auto& mapRoute = _pParent->getTransInfo().mapNeutral[_curType].mapRoute; //检索所有路线,判断设备占用情况 for(auto& route:mapRoute){ QString sRoute = route.sRouteName; for(auto& compo:route.lstCompo){ diff --git a/diagramCavas/source/diagramEditor/diagramEditorTransDetailSettingDlg.cpp b/diagramCavas/source/diagramEditor/diagramEditorTransDetailSettingDlg.cpp index 9e7d5ff..0d3c902 100644 --- a/diagramCavas/source/diagramEditor/diagramEditorTransDetailSettingDlg.cpp +++ b/diagramCavas/source/diagramEditor/diagramEditorTransDetailSettingDlg.cpp @@ -84,8 +84,9 @@ void DiagramEditorTransDetailSettingDlg::refreshModel() _compoModel->clear(); _compoModel->setColumnCount(5); _compoModel->setHorizontalHeaderLabels({"分类", "名称", "类型", "关联对象", "引用线路"}); - auto mapComponent = _curOperateObj->getComponentMap(); - for(auto& comp:mapComponent){ + auto transInfo = _curOperateObj->getTranInfo(); + + for(auto& comp:transInfo.mapComponent){ DiagramEditorComponentInfo info = comp; QStandardItem *itemCate = new QStandardItem(); QStandardItem *itemName = new QStandardItem(); @@ -173,10 +174,9 @@ void DiagramEditorTransDetailSettingDlg::refreshModel() pModel->setHorizontalHeaderLabels({"线路名", "包含设备"}); } - auto mapRoutes = _curOperateObj->getRouteInfoMaps(); - setRouteMaps(mapRoutes); //更新路径数据到本界面 - for(auto it = mapRoutes.begin();it != mapRoutes.end();++it){ - for(auto& route:it.value()){ + setTransInfo(transInfo); //更新路径数据到本界面 + for(auto it = transInfo.mapNeutral.begin();it != transInfo.mapNeutral.end();++it){ + for(auto& route:it.value().mapRoute){ QString sRoute = route.sRouteName; QStringList lstComp; for(auto& comp:route.lstCompo){ @@ -220,7 +220,7 @@ void DiagramEditorTransDetailSettingDlg::onOkClicked() { //将ui设置的参数更新到对应block if(_curOperateObj){ - _curOperateObj->setRouteInfoMaps(_mapsRouteInfo); + //_curOperateObj->setRouteInfoMaps(_mapsRouteInfo); QMap mapComponents; int nRowCount = _compoModel->rowCount(); @@ -235,6 +235,7 @@ void DiagramEditorTransDetailSettingDlg::onOkClicked() QUuid uid = itemName->data(Qt::UserRole+3).toUuid(); //uid int nVal = itemName->data(Qt::UserRole+4).toInt(); //标志 int nRotate = itemName->data(Qt::UserRole+5).toInt(); //旋转角度 + int nBindType = itemBind->data(Qt::UserRole+1).toInt(); DiagramEditorComponentInfo compoInfo; if(itemCate->text() == "电气设备"){ @@ -246,6 +247,9 @@ void DiagramEditorTransDetailSettingDlg::onOkClicked() compoInfo.sName = itemName->text(); compoInfo.nType = itemType->data().toInt(); compoInfo.sBindObj = itemBind->text(); + compoInfo.nBindType = nBindType; + compoInfo.nBindPara = itemBind->data(Qt::UserRole+2).toInt(); + compoInfo.sBindParent = itemBind->data(Qt::UserRole+3).toString(); compoInfo.sUsedRoute = itemRoute->text().split(","); compoInfo.nUsedDirection = nDir; compoInfo.deltaPos = deltaPos; @@ -255,7 +259,21 @@ void DiagramEditorTransDetailSettingDlg::onOkClicked() mapComponents.insert(compoInfo.sName,compoInfo); } - _curOperateObj->setComponentMap(mapComponents); + //_curOperateObj->setComponentMap(mapComponents); + _transInfo.mapComponent = mapComponents; + if(_transInfo.mapNeutral.contains(0)){ + _transInfo.mapNeutral[0].nType = 0; + _transInfo.mapNeutral[0].delPoint = QPointF(100,-100); + } + if(_transInfo.mapNeutral.contains(1)){ + _transInfo.mapNeutral[1].nType = 1; + _transInfo.mapNeutral[1].delPoint = QPointF(-100,-50); + } + if(_transInfo.mapNeutral.contains(2)){ + _transInfo.mapNeutral[2].nType = 2; + _transInfo.mapNeutral[2].delPoint = QPointF(100,0); + } + _curOperateObj->setTransInfo(_transInfo); TopologyManager::instance().clearGlobalBlockData(_curOperateObj->getName()); TopologyManager::instance().moveTempBlockData(); _curOperateObj = nullptr; @@ -305,7 +323,8 @@ void DiagramEditorTransDetailSettingDlg::onRouteDeleteClicked() _routeModels.value(n)->removeRow(row); } - _mapsRouteInfo.value(n).remove(sName); //同步移除数据 + //_mapsRouteInfo.value(n).remove(sName); //同步移除数据 + _transInfo.mapNeutral.value(n).mapRoute.remove(sName); //同步移除数据 } void DiagramEditorTransDetailSettingDlg::onRouteRbtnClicked(const QPoint &pos) @@ -363,7 +382,8 @@ void DiagramEditorTransDetailSettingDlg::onRouteEditClicked() QString sName = indexName.data().toString(); int n = ui->tabWidget->currentIndex(); - auto routeInfo = _mapsRouteInfo.value(n).value(sName); + //auto routeInfo = _mapsRouteInfo.value(n).value(sName); + auto routeInfo = _transInfo.mapNeutral.value(n).mapRoute.value(sName); _pAddDlg->showDlg(routeInfo); } diff --git a/diagramCavas/source/diagramEditor/diagramEditorTransPreviewDlg.cpp b/diagramCavas/source/diagramEditor/diagramEditorTransPreviewDlg.cpp index b439ce1..1902326 100644 --- a/diagramCavas/source/diagramEditor/diagramEditorTransPreviewDlg.cpp +++ b/diagramCavas/source/diagramEditor/diagramEditorTransPreviewDlg.cpp @@ -44,11 +44,11 @@ void DiagramEditorTransPreviewDlg::showDlg(int nType) void DiagramEditorTransPreviewDlg::updateModelData(int nType) { if(nType == 0 || nType == 1 || nType == 2){ - _pParent->getModel()->updateTarget(_pParent->getRouteMaps()[nType],14,1); //1右2下 + _pParent->getModel()->updateTarget(_pParent->getTransInfo().mapNeutral[nType].mapRoute,14,1); //1右2下 } else if(nType == 3){ //整个变压器 - _pParent->getModel()->updateTarget(_pParent->getRouteMaps()[0],18,1); //1右2上 - _pParent->getModel()->updateTarget(_pParent->getRouteMaps()[1],14,1); //1右2下 - _pParent->getModel()->updateTarget(_pParent->getRouteMaps()[2],24,1); //1左2下 + _pParent->getModel()->updateTarget(_pParent->getTransInfo().mapNeutral[0].mapRoute,18,1); //1右2上 + _pParent->getModel()->updateTarget(_pParent->getTransInfo().mapNeutral[1].mapRoute,14,1); //1右2下 + _pParent->getModel()->updateTarget(_pParent->getTransInfo().mapNeutral[2].mapRoute,24,1); //1左2下 } } diff --git a/diagramCavas/source/diagramEditor/diagramEditorWizard.cpp b/diagramCavas/source/diagramEditor/diagramEditorWizard.cpp index c2facae..cca26d5 100644 --- a/diagramCavas/source/diagramEditor/diagramEditorWizard.cpp +++ b/diagramCavas/source/diagramEditor/diagramEditorWizard.cpp @@ -581,9 +581,13 @@ void DiagramEditorWizard::onAddTransFinished(DiagramEditorWizardTransformerInfo for(auto& obj:info.lstBindObj){ QUuid uid = addConnection(pTrans->getName(),obj.sName,3,2,obj.nPara); pTrans->addConnect(uid); + auto pBlock = getBlockByName_all(obj.sName); //连接的双方都保存连接(todo:修改时删除对面保存的连接) + if(pBlock){ + pBlock->addConnect(uid); + } } - pContainer->insertBlock(1,pTrans); + pContainer->insertBlock(1,pTrans); //***变压器添加到了1层*** int nIndex =_mapSturctContainer.value(g_transformerLevel).size(); _mapSturctContainer[g_transformerLevel].insert(nIndex,pContainer); diff --git a/diagramCavas/source/diagramEditor/editPanel.cpp b/diagramCavas/source/diagramEditor/editPanel.cpp index dc8dfae..79a6124 100644 --- a/diagramCavas/source/diagramEditor/editPanel.cpp +++ b/diagramCavas/source/diagramEditor/editPanel.cpp @@ -431,6 +431,7 @@ void EditPanel::onItemDbClicked(QPointer pBlock) if(_transDetailSetting == nullptr){ _transDetailSetting = new DiagramEditorTransDetailSettingDlg(this); _transDetailSetting->setModelDelegate(_pModel); + _transDetailSetting->setWizard(_curWizard); } auto pTrans = dynamic_cast(pBlock.data()); if(pTrans) diff --git a/diagramCavas/source/graphicsDataModel/baseModel.cpp b/diagramCavas/source/graphicsDataModel/baseModel.cpp index f9272e5..efd1ad8 100644 --- a/diagramCavas/source/graphicsDataModel/baseModel.cpp +++ b/diagramCavas/source/graphicsDataModel/baseModel.cpp @@ -106,16 +106,6 @@ template void BaseModel::establishConnection(GraphicsBaseItem QMap mapPorts = pDest->getPorts(); if(nMode == 0){ - /*double minDis = 999; - for(auto& port:mapPorts) //与母线或节点连接时,连接最近接线点 - { - double dis = distanceBetweenItems(port,pSrc); - if(dis < minDis){ - minDis = dis; - pDestPort = port; - } - }*/ - pDestPort = getClosestUnusedPort(mapPorts,pSrc,nType); } else if(nMode == 1){ @@ -142,6 +132,30 @@ template void BaseModel::establishConnection(GraphicsBaseItem } } } + else if(nMode == 2){ + for(auto& port:mapPorts) //连接非中性点 + { + int nTpe = port->getType(); + int nPos = port->portPos(); + if(nTpe != T_newTral){ + if(nParam == 0){ + if(nPos == P_top){ + pDestPort = port; + } + } + else if(nParam == 1){ + if(nPos == P_left || nPos == P_right){ + pDestPort = port; + } + } + else if(nParam == 2){ + if(nPos == P_down){ + pDestPort = port; + } + } + } + } + } } else if((nTypeDest == 1 || nTypeDest == 0) && (nTypeSrc != 1 && nTypeSrc != 0)) { @@ -156,16 +170,6 @@ template void BaseModel::establishConnection(GraphicsBaseItem QMap mapPorts = pSrc->getPorts(); if(nMode == 0){ - /*double minDis = 999; - for(auto& port:mapPorts) //与母线或节点连接时,连接最近接线点 - { - double dis = distanceBetweenItems(port,pDest); - if(dis < minDis){ - minDis = dis; - pSrcPort = port; - } - }*/ - pSrcPort = getClosestUnusedPort(mapPorts,pDest,nType); } else if(nMode == 1){ @@ -192,7 +196,30 @@ template void BaseModel::establishConnection(GraphicsBaseItem } } } - + else if(nMode == 2){ + for(auto& port:mapPorts) //连接非中性点 + { + int nTpe = port->getType(); + int nPos = port->portPos(); + if(nTpe != T_newTral){ + if(nParam == 0){ + if(nPos == P_top){ + pSrcPort = port; + } + } + else if(nParam == 1){ + if(nPos == P_left || nPos == P_right){ + pSrcPort = port; + } + } + else if(nParam == 2){ + if(nPos == P_down){ + pSrcPort = port; + } + } + } + } + } } else if((nTypeSrc == 1 || nTypeSrc == 0) && (nTypeDest == 1 || nTypeDest == 0)){ //两个都是母线或节点 int index = 0; diff --git a/diagramCavas/source/graphicsDataModel/diagramEditorModel.cpp b/diagramCavas/source/graphicsDataModel/diagramEditorModel.cpp index 85e8222..655e5a9 100644 --- a/diagramCavas/source/graphicsDataModel/diagramEditorModel.cpp +++ b/diagramCavas/source/graphicsDataModel/diagramEditorModel.cpp @@ -15,6 +15,8 @@ #include "diagramEditor/diagramEditorBaseBlock.h" #include "diagramEditor/editItems.h" #include "diagramEditor/editPanel.h" +#include "diagramEditor/diagramEditorWizard.h" +#include "diagramEditor/diagramEditorStructContainer.h" DiagramEditorModel::DiagramEditorModel() :_pCurBayRoute(nullptr) @@ -120,9 +122,14 @@ void DiagramEditorModel::createTopoTerminalsByItem(GraphicsBaseItem* pItem,Model } } -void DiagramEditorModel::generateTempBay() +QRectF DiagramEditorModel::generateTempBay() { + QRectF itemsRect; generateItemByModel(_pCurBayRoute); + if(_pCurPreviewScene) + itemsRect = _pCurPreviewScene->itemsBoundingRect(); + + return itemsRect; } GraphicsBaseModelItem* DiagramEditorModel::generateComponent(QUuid uid,QString sName,int nCategory,int nType,QPointF pos,int nRotate,int mode) @@ -285,18 +292,29 @@ void DiagramEditorModel::generateTempTrans(int nType,DiagramEditorTransformerBlo } else if(nType == 3){ TransformerType typ = block->getTransType(); + auto pInfo = block->getTranInfo(); int nT = 0; if(typ == TransformerType::twoWinding){ generateItemByModel(_pCurTransLRoutes.value(0),1,QPoint(100,-25)); generateItemByModel(_pCurTransLRoutes.value(2),1,QPoint(100,25)); + pInfo.mapNeutral[0].delPoint = QPoint(100,-25); + pInfo.mapNeutral[2].delPoint = QPoint(100,25); } else if(typ == TransformerType::threeWinding){ generateItemByModel(_pCurTransLRoutes.value(0),1,QPoint(100,-25)); generateItemByModel(_pCurTransLRoutes.value(1),1,QPoint(-150,0)); generateItemByModel(_pCurTransLRoutes.value(2),1,QPoint(100,25)); + pInfo.mapNeutral[0].delPoint = QPoint(100,-25); + pInfo.mapNeutral[1].delPoint = QPoint(-150,0); + pInfo.mapNeutral[2].delPoint = QPoint(100,25); } connectTransToNeutral(block); + + if(_pCurPreviewScene){ + QRectF itemsRect = _pCurPreviewScene->itemsBoundingRect(); + block->setRecSize(itemsRect); + } } } @@ -313,17 +331,19 @@ void DiagramEditorModel::connectTransToNeutral(DiagramEditorTransformerBlock* bl else if(typ == TransformerType::threeWinding){ nT = 16; } - generateComponent(uid,sName,0,nT,QPoint(0,0),0,1); + generateComponent(uid,sName,0,nT,QPoint(0,0),0,0); auto pTransItem = _tempItem.value(uid); - if(typ == TransformerType::twoWinding){ - linkTransItem(pTransItem,_pCurTransLRoutes.value(0)); - linkTransItem(pTransItem,_pCurTransLRoutes.value(2)); - } - else if(typ == TransformerType::threeWinding){ - linkTransItem(pTransItem,_pCurTransLRoutes.value(0)); - linkTransItem(pTransItem,_pCurTransLRoutes.value(1)); - linkTransItem(pTransItem,_pCurTransLRoutes.value(2)); + if(pTransItem){ + if(typ == TransformerType::twoWinding){ + linkTransItem(pTransItem,_pCurTransLRoutes.value(0)); + linkTransItem(pTransItem,_pCurTransLRoutes.value(2)); + } + else if(typ == TransformerType::threeWinding){ + linkTransItem(pTransItem,_pCurTransLRoutes.value(0)); + linkTransItem(pTransItem,_pCurTransLRoutes.value(1)); + linkTransItem(pTransItem,_pCurTransLRoutes.value(2)); + } } } } @@ -356,7 +376,7 @@ void DiagramEditorModel::linkTransItem(GraphicsBaseModelItem* pTrans,QStandardIt auto pLineData = TopologyManager::instance().ifConnection(uid1.toString(),uid2.toString()); //判断两个item是否有连接 if(pLineData != nullptr){ if(!_tempItem.contains(QUuid(pLineData->id()))){ //connectdata已存在,item未绘制 - auto pLine = generateLine(QUuid(pLineData->id()),"",1); //重新绘制 + auto pLine = generateLine(QUuid(pLineData->id()),"",0); //重新绘制 if(pLine) establishConnection(pItem,pTrans,pLine,ModelFunctionType::BlockEditorModel,1,nPos); } @@ -364,7 +384,7 @@ void DiagramEditorModel::linkTransItem(GraphicsBaseModelItem* pTrans,QStandardIt } } else{ //connectdata不存在,新建 - auto pLine = generateLine(QUuid::createUuid(),"",1); + auto pLine = generateLine(QUuid::createUuid(),"",0); if(pLine) establishConnection(pItem,pTrans,pLine,ModelFunctionType::BlockEditorModel,1,nPos); } @@ -379,25 +399,45 @@ void DiagramEditorModel::generatePreview() if(_pPanel){ _pPanel->showPreview(); QList lst = _pPanel->getBlockItems(); + QMap> baysCompo; + QMap>> transCompo; + for(auto item:lst){ if(item->getType() == EditorItemType::bus){ //首次循环生成母线 auto p = item->getBlockData(); //获取blockitem对应的data if(p){ QUuid uid = p->getId(); QString name = p->getName(); + auto pContainer = _pWizard->getContainerByBlock_all(name); //获取block所在的container + + auto mapBlocks = pContainer->getBlockMap(); + int nMaxLen = 0; + for(auto &lst:mapBlocks){ //根据容器中block的最大长度,计算出母线最小length + int nLen = 0; + for(auto block:lst){ + if(block->getType() == 1) //容器中block是母线不计算 + continue; + nLen = 100+block->getRecSize().width(); + } + if(nMaxLen < nLen) + nMaxLen = nLen; + } + + QRectF rec = item->boundingRect(); QPointF pos = item->scenePos(); auto pItem = generateComponent(uid,name,0,1,pos,0,1); - pItem->setBoundingRect(item->boundingRect()); + if(nMaxLen > rec.width()) + rec.setWidth(nMaxLen); + pItem->setBoundingRect(rec); + p->setRecSize(rec); } } - } - - for(auto item:lst){ - if(item->getType() == EditorItemType::bay){ //第二次生成间隔,部分接线 + else if(item->getType() == EditorItemType::bay){ //第二次生成间隔、变压器 auto p = item->getBlockData(); //获取blockitem对应的data DiagramEditorBayBlock* pBay = dynamic_cast(p.data()); if(pBay){ + QString sBay = pBay->getName(); auto mapRoute = pBay->getBayInfo().mapRoute; auto mapCompo = pBay->getBayInfo().mapComponent; @@ -406,14 +446,255 @@ void DiagramEditorModel::generatePreview() QPointF centerLocal = rect.center(); // 转换为场景坐标系 QPointF centerScene = item->mapToScene(centerLocal); - generateItemByInfo(mapRoute,mapCompo,centerScene); + QList lstCompo = generateItemByInfo(mapRoute,mapCompo,centerScene); //返回与外部连接的compo + if(!baysCompo.contains(sBay)) + baysCompo.insert(sBay,lstCompo); + } + } + else if(item->getType() == EditorItemType::trans){ + auto p = item->getBlockData(); //获取blockitem对应的data + DiagramEditorTransformerBlock* pTrans = dynamic_cast(p.data()); + if(pTrans){ + //首先绘制本体 + auto pType = pTrans->getTransType(); + QString sTrans = pTrans->getName(); + QUuid uid = pTrans->getId(); + QString name = pTrans->getName(); + + QPointF pos = item->scenePos(); + int nType = 0; + if(pType == TransformerType::twoWinding) + nType = 15; + else + nType = 16; + auto pItem = generateComponent(uid,name,0,nType,pos,0,1); + + QRectF rect = item->boundingRect(); + // 计算中心点(本地坐标系) + QPointF centerLocal = rect.center(); + // 转换为场景坐标系 + QPointF centerScene = item->mapToScene(centerLocal); + auto transInfo = pTrans->getTranInfo(); + + QMap> neutralInfo; + for(auto &neutral:transInfo.mapNeutral){ + QPointF pDelta = neutral.delPoint; + int nT = neutral.nType; + QList lstCompo = generateItemByInfo(neutral.mapRoute,transInfo.mapComponent,centerScene+pDelta); + if(!neutralInfo.contains(nT)) + neutralInfo.insert(nT,lstCompo); + } + + if(!transCompo.contains(sTrans)) //添加需连接的中性点 + transCompo.insert(sTrans,neutralInfo); } } } - for(auto item:lst){ - if(item->getType() == EditorItemType::trans){ //第三次生成变压器,部分接线 + for(auto &lst:baysCompo){ + generateOutConnection(lst,2); + } + for(auto &map:transCompo){ + for(auto it = map.begin(); it != map.end();++it){ + generateOutConnection(it.value(),1,it.key()); + } + } + } + + calculateBlockPos(); +} + +void DiagramEditorModel::calculateBlockPos() +{ + if(_pWizard){ + double deltaY = 0; //竖直方向每行增量 + double lastMaxDownH = 0; //上一行的下部最大高度 + auto mapTotal = _pWizard->getContainerStruct(); + for(auto iter = mapTotal.begin();iter != mapTotal.end();++iter){ + if(iter.key() == g_transformerLevel) + continue; + double dMaxUp = 0; //计算最大上方空间 + double dMaxDown = 0; //计算最大下方空间 + + for(auto &pCon:iter.value()){ //首次循环遍历每行container,计算最大上空间高度,最大下空间高度,容器宽度 + auto mapBlocks = pCon->getBlockMap(); + auto lstBlockUp = mapBlocks.value(0); + auto lstBlockDown = mapBlocks.value(3); + double dConWidth = 0; + + double dWidthUp = 0; + for(auto pBlock:lstBlockUp){ + QRectF rec = pBlock->getRecSize(); + double dHeight = rec.height(); + double dWidth = rec.width(); + if(dMaxUp < dHeight) + dMaxUp = dHeight; + dWidthUp += g_nHorizontalBlockSpacing+dWidth; + } + + double dWidthDown = 0; + for(auto pBlock:lstBlockDown){ + QRectF rec = pBlock->getRecSize(); + double dHeight = rec.height(); + double dWidth = rec.width(); + if(dMaxDown < dHeight) + dMaxDown = dHeight; + dWidthDown = g_nHorizontalBlockSpacing+dWidth; + } + + dConWidth = dWidthUp > dWidthDown ? dWidthUp : dWidthDown; + pCon->setWidth(dConWidth); + } + + double dDeltaX = 0; //每行横向偏移 + for(auto &pCon:iter.value()){ //第二次循环赋值,计算位置(首先确定母线位置) + pCon->setMaxUpH(dMaxUp); + pCon->setMaxDownH(dMaxDown); + if(iter.value().first() == pCon){ //每行只进行一次y位移 + if(iter == mapTotal.begin()){ //首行 deltaY = 首行dMaxUpH + deltaY = pCon->getMaxUpH(); + } + else //其他行 deltaY = deltaY+母线高度+上行dMaxDownH+本行dMaxUpH + { + deltaY = deltaY + 50 + lastMaxDownH + pCon->getMaxUpH(); + } + lastMaxDownH = pCon->getMaxDownH(); + } + pCon->setMidUpY(deltaY); + pCon->setMidDownY(deltaY+50); + pCon->setStartX(dDeltaX); + dDeltaX += pCon->getWidth(); + + //计算container中block中心点的位置 + auto mapBlocks = pCon->getBlockMap(); + + for(auto it = mapBlocks.begin();it != mapBlocks.end();++it){ + double pStartX = pCon->getStartX(); //容器起始x + double dMiddleUpY = pCon->getMidUpY(); //获取1母上边y + double dMiddleDownY = pCon->getMidDownY(); //获取2母下边y + double deltaX = pStartX; + for(auto pBlock:it.value()){ + QRectF recBlock = pBlock->getRecSize(); + QPointF center; + if(pBlock->getType() == 1){ //母线 + if(it.key() == 1){ //1母 + center = QPointF(pStartX+recBlock.width()*0.5,dMiddleUpY+recBlock.height()*0.5); + } + else if(it.key() == 2){ //2母 + center = QPointF(pStartX+recBlock.width()*0.5,dMiddleDownY-recBlock.height()*0.5); + } + } + else if(pBlock->getType() == 2){ //间隔 + if(it.key() == 0){ //容器最上层 + center = QPointF(deltaX+recBlock.width()*0.5,dMiddleUpY-recBlock.height()*0.5); + } + else if(it.key() == 3){ //容器最下层 + center = QPointF(deltaX+recBlock.width()*0.5,dMiddleDownY+recBlock.height()*0.5); + } + deltaX += recBlock.width(); + } + else if(pBlock->getType() == 3){ //变压器 + } + + if(!center.isNull()) + pBlock->setSeceneDelta(center); + } + } + } + + dDeltaX = 0; + if(iter.key() == 0){ //若设置了变压器,直接插入到第一行下方 + if(!mapTotal.value(g_transformerLevel).empty()){ + for(auto &pCon:iter.value()){ //首次计算变压器大小 + auto mapBlocks = pCon->getBlockMap(); + auto lstBlock = mapBlocks.value(1); + for(auto &pb:lstBlock){ + QRectF rec = pb->getRecSize(); + pCon->setWidth(rec.width()); + pCon->setHeight(rec.height()); + } + } + + for(auto &pCon:iter.value()){ //计算位置 + if(pCon == iter.value().first()){ + //只在每行第一次改变deltaY + deltaY += pCon->getHeight(); + } + pCon->setStartY(deltaY-pCon->getHeight()); + pCon->setStartX(dDeltaX); + dDeltaX += pCon->getWidth(); + + auto mapBlocks = pCon->getBlockMap(); + + for(auto it = mapBlocks.begin();it != mapBlocks.end();++it){ + for(auto pBlock:it.value()){ + QRectF recBlock = pBlock->getRecSize(); + QPointF center = QPointF(pCon->getStartX()+recBlock.width()*0.5,pCon->getStartY()+recBlock.height()*0.5); + pBlock->setSeceneDelta(center); + } + } + } + } + } + } + } +} + +void DiagramEditorModel::setItemInBlockPos() +{ + QList lst = _pPanel->getBlockItems(); + + for(auto item:lst){ + if(item->getType() == EditorItemType::bus){ + auto p = item->getBlockData(); //获取blockitem对应的data + if(p){ + QUuid uid = p->getId(); + auto pItem = _previewItem.value(uid); + if(pItem){ + QPointF pPos = p->getSceneDelta(); + pItem->setPos(pPos); + } + } + } + else if(item->getType() == EditorItemType::bay){ + auto p = item->getBlockData(); //获取blockitem对应的data + DiagramEditorBayBlock* pBay = dynamic_cast(p.data()); + if(pBay){ + QString sBay = pBay->getName(); + auto bayInfo = pBay->getBayInfo(); + auto mapRoute = bayInfo.mapRoute; + auto mapCompo = bayInfo.mapComponent; + + auto lst = getRouteItemInfoList(mapCompo,mapRoute); + for(auto& info:lst){ + auto pItem = _previewItem.value(info.uid); + if(pItem){ + QPointF pos = info.deltaPos+pBay->getSceneDelta(); + pItem->setPos(pos); + } + } + } + } + else if(item->getType() == EditorItemType::trans){ + auto p = item->getBlockData(); //获取blockitem对应的data + DiagramEditorTransformerBlock* pTrans = dynamic_cast(p.data()); + if(pTrans){ + auto transInfo = pTrans->getTranInfo(); + auto mapCompo = transInfo.mapComponent; + + for(auto &neuInfo:transInfo.mapNeutral){ + auto mapRoute = neuInfo.mapRoute; + + auto lst = getRouteItemInfoList(mapCompo,mapRoute); + for(auto& info:lst){ + auto pItem = _previewItem.value(info.uid); + if(pItem){ + QPointF pos = info.deltaPos+(pTrans->getSceneDelta()-info.deltaPos); + pItem->setPos(pos); + } + } + } } } } @@ -505,7 +786,7 @@ void DiagramEditorModel::generateItemByModel(QStandardItemModel* pModel,int nFro } } -void DiagramEditorModel::generateItemByInfo(QMap mapRoute,QMap mapCompo,QPointF delta) +QList DiagramEditorModel::generateItemByInfo(QMap mapRoute,QMap mapCompo,QPointF delta) { QList lstBind; //连接外部对象的component QString sMain; @@ -522,7 +803,7 @@ void DiagramEditorModel::generateItemByInfo(QMap } if(route.lstCompo.size() > 1){ - bulidAndLinkComponent(route.lstCompo); + bulidAndLinkComponent(route.lstCompo,mapCompo); } } } @@ -550,14 +831,19 @@ void DiagramEditorModel::generateItemByInfo(QMap } if(route.lstOrder.size() > 1){ - bulidAndLinkComponent(route.lstOrder); + bulidAndLinkComponent(route.lstOrder,mapCompo); } if(route.lstReverse.size() > 1){ - bulidAndLinkComponent(route.lstReverse); + bulidAndLinkComponent(route.lstReverse,mapCompo); } } + return lstBind; +} + +void DiagramEditorModel::generateOutConnection(QList lstBind,int nTypeTransCon,int nPos) +{ for(auto& compo:lstBind){ //遍历关联外部的item,进行连线 if(compo.nBindType == 1){ //关联的是母线 母线没有数据,获取绘制的母线item for(auto& pItem:_previewItem){ @@ -586,6 +872,41 @@ void DiagramEditorModel::generateItemByInfo(QMap } } } + else if(compo.nBindType == 3){ //关联变压器 + for(auto& pItem:_previewItem){ + auto pro = pItem->getProperty(); + if(pro){ + QString sName = pro->name(); + if(sName == compo.sBindParent){ //判断变压器名 + GraphicsBaseModelItem* pSrc = _previewItem.value(compo.uid); + GraphicsBaseModelItem* pTarget = pItem; + auto pLineData = TopologyManager::instance().ifConnection(pSrc->itemId().toString(),pTarget->itemId().toString(),ModelFunctionType::EditorModel); //判断两个item是否有连接 + if(pLineData != nullptr){ + if(!_previewItem.contains(QUuid(pLineData->id()))){ //connectdata已存在,item未绘制 + auto pLine = generateLine(QUuid(pLineData->id()),"",1); //重新绘制 + if(pLine){ + if(nTypeTransCon == 2) + establishConnection(pSrc,pTarget,pLine,ModelFunctionType::EditorModel,2,compo.nBindPara); + else + establishConnection(pSrc,pTarget,pLine,ModelFunctionType::EditorModel,nTypeTransCon,nPos); + } + } + else{ //已绘制,略过 + } + } + else{ //connectdata不存在,新建 + auto pLine = generateLine(QUuid::createUuid(),"",1); + if(pLine){ + if(nTypeTransCon == 2) + establishConnection(pSrc,pTarget,pLine,ModelFunctionType::EditorModel,2,compo.nBindPara); + else + establishConnection(pSrc,pTarget,pLine,ModelFunctionType::EditorModel,nTypeTransCon,nPos); + } + } + } + } + } + } } } @@ -1134,15 +1455,17 @@ void DiagramEditorModel::updateTarget(QMap& data } } -void DiagramEditorModel::bulidAndLinkComponent(QList lst) +void DiagramEditorModel::bulidAndLinkComponent(QList lst,QMap components) { for(int i = 0;i < lst.size()-1;++i){ auto item1 = lst[i]; auto item2 = lst[i+1]; - if(_previewItem.contains(item1.uid) && _previewItem.contains(item2.uid)){ - GraphicsBaseModelItem* p1 = _previewItem.value(item1.uid); - GraphicsBaseModelItem* p2 = _previewItem.value(item2.uid); - auto pLineData = TopologyManager::instance().ifConnection(item1.uid.toString(),item2.uid.toString(),ModelFunctionType::EditorModel); //判断两个item是否有连接 + auto info1 = components.value(item1.sName); + auto info2 = components.value(item2.sName); + if(_previewItem.contains(info1.uid) && _previewItem.contains(info2.uid)){ + GraphicsBaseModelItem* p1 = _previewItem.value(info1.uid); + GraphicsBaseModelItem* p2 = _previewItem.value(info2.uid); + auto pLineData = TopologyManager::instance().ifConnection(info1.uid.toString(),info2.uid.toString(),ModelFunctionType::EditorModel); //判断两个item是否有连接 if(pLineData != nullptr){ if(!_previewItem.contains(QUuid(pLineData->id()))){ //connectdata已存在,item未绘制 auto pLine = generateLine(QUuid(pLineData->id()),"",1); //重新绘制 @@ -1160,3 +1483,25 @@ void DiagramEditorModel::bulidAndLinkComponent(QList } } } + +QList DiagramEditorModel::getRouteItemInfoList(QMap mapCompo,QMap mapRoute) +{ + QList lst; + for(auto& route:mapRoute){ //总路线中包含主路,首次生成主路 + for(auto& compo:route.lstCompo){ //首先生成设备 + auto info = mapCompo.value(compo.sName); + + bool exist = false; + for(auto& inf:lst){ + if(inf == info){ + exist = true; + break; + } + } + if(!exist){ + lst.append(info); + } + } + } + return lst; +} diff --git a/diagramCavas/ui/diagramEditorTransDetailAddDlg.ui b/diagramCavas/ui/diagramEditorTransDetailAddDlg.ui index 40a2ced..04d28ff 100644 --- a/diagramCavas/ui/diagramEditorTransDetailAddDlg.ui +++ b/diagramCavas/ui/diagramEditorTransDetailAddDlg.ui @@ -201,28 +201,7 @@ - - - - - - - - - 高压绕组中性点 - - - - - 中压绕组中性点 - - - - - 低压绕组中性点 - - - +