#include "diagramEditor/diagramEditorBayPreviewDlg.h" #include "diagramEditor/diagramEditorBayDetailSettingDlg.h" #include "diagramEditor/editView.h" #include "diagramEditor/editScene.h" #include "graphicsDataModel/diagramEditorModel.h" #include "global.h" DiagramEditorBayPreviewDlg::DiagramEditorBayPreviewDlg(QWidget *parent) : QDialog(parent) ,_pView(nullptr) ,_pScene(nullptr) ,_pMainLayout(nullptr) ,_pParent(nullptr) { QRect recParent = parent->geometry(); setGeometry(recParent.right(),recParent.y(),recParent.width(),recParent.height()); initial(); } DiagramEditorBayPreviewDlg::~DiagramEditorBayPreviewDlg() { } void DiagramEditorBayPreviewDlg::initial() { _pMainLayout = new QVBoxLayout(this); _pView = new EditView(this); _pMainLayout->addWidget(_pView); _pScene = new EditPreviewScene(this); _pScene->setSceneRect(-g_dGriaphicsScene_Width / 2, -g_dGriaphicsScene_Height / 2, g_dGriaphicsScene_Width, g_dGriaphicsScene_Height); _pView->setScene(_pScene); } void DiagramEditorBayPreviewDlg::updateModelData() { auto& mapRoute = _pParent->getRouteMap(); QString sMainRoute; int nCount = 0; for(auto& route:mapRoute){ //寻找包含设备最多的线路 if(nCount < route.lstCompo.count()){ nCount = route.lstCompo.count(); sMainRoute = route.sRouteName; route.bMainRoute = true; } } auto& maoCompo = mapRoute[sMainRoute].lstCompo; //假设竖直情况下,上下等分为nSeg段 假设主线路水平居中 int nSeg = maoCompo.size()*0.5; int nSegIndex = -nSeg; //计数器,计算deltaY for(int i = 0;i < maoCompo.size();++i){ //优先遍历主线路,构建主体结构 int nDir = 0; if(i == 0){ //队首 maoCompo[i].nUsedDirection |= 4; //默认向下,队首单向下(单线路记录,不可作为跨线判断依据) nDir = 4; } else if(i == maoCompo.size()-1){ maoCompo[i].nUsedDirection |= 8; //队尾单向上(单线路记录,不可作为跨线判断依据) nDir = 8; } else{ maoCompo[i].nUsedDirection |= 12; //其余向上向下都被占用(单线路记录,不可作为跨线判断依据) nDir = 12; } int deltaY = nSegIndex*g_nVDiagramSpacing; auto pItemName = _pParent->getModel()->getNameItem(maoCompo[i].sName); if(pItemName){ int nVal = pItemName->data().toInt(); pItemName->setData(QString::number(nVal |= nDir)); //在公用模型中更新设备方向占用(重要) pItemName->setData(QPoint(0,deltaY),Qt::UserRole+2); //设置相对位置 } nSegIndex += 1; } for(auto& route:mapRoute){ //遍历主线路之外的线路 if(route.sRouteName == sMainRoute){ continue; } if(!route.lstCompo.isEmpty()){ //拆分线路为以节点为首 auto pItemFirst = _pParent->getModel()->getNameItem(route.lstCompo.first().sName); int nFirstVal = pItemFirst->data().toInt(); auto pItemLast = _pParent->getModel()->getNameItem(route.lstCompo.last().sName); int nLastVal = pItemLast->data().toInt(); if(nFirstVal != 0){ //首位为节点 route.lstOrder = route.lstCompo; } else if(nLastVal != 0){ //末位为节点 for (auto it = route.lstCompo.rbegin(); it != route.lstCompo.rend(); ++it) { route.lstReverse.append(*it); } } else{ //节点在中间 int nIndex = 0; for(int i = 0;i < route.lstCompo.size();++i){ auto pItem = _pParent->getModel()->getNameItem(route.lstCompo[i].sName); if(pItem){ int nVal = pItem->data().toInt(); if(nVal != 0){ nIndex = i; break; } } } for(int i = nIndex;i >= 0;--i){ route.lstReverse.append(route.lstCompo[i]); } for(int i = nIndex;i < route.lstCompo.size();++i){ route.lstOrder.append(route.lstCompo[i]); } } } int nOrderFirstDeltaY = 0; //首节点y偏移量(假设后续节点与头节点水平) int nXOrderIndex = 1; //横向计数 int nOrderPolarity = 1; //方向 1右 -1左 if(route.lstOrder.size() > 1){ for(int i = 0;i < route.lstOrder.size()-1;++i){ //遍历以节点为首的队列 auto pItem = _pParent->getModel()->getNameItem(route.lstOrder[i].sName); int nVal = pItem->data().toInt(); QPoint deltaP = pItem->data(Qt::UserRole+2).toPoint(); auto pNextItem = _pParent->getModel()->getNameItem(route.lstOrder[i+1].sName); //下一个item int nNextVal = pNextItem->data().toInt(); if(i == 0){ //首节点 nOrderFirstDeltaY = deltaP.y(); if(((nVal & 2) == 1) && ((nVal & 1) == 1)){ qDebug()<setData(QString::number(nVal | 1)); pNextItem->setData(QString::number(nNextVal | 2)); //同时连接下个点的一侧占用 nOrderPolarity = 1; } else if((nVal & 1) == 1){ //右被占用,左空 pItem->setData(QString::number(nVal | 2)); pNextItem->setData(QString::number(nNextVal | 1)); nOrderPolarity = -1; } else{ //左右都没被占,默认放到左边 pItem->setData(QString::number(nVal | 1)); pNextItem->setData(QString::number(nNextVal | 2)); nOrderPolarity = 1; } continue; } /*if(i == 0){ //首节点特殊处理 if(((nVal & 8) == 1) && ((nVal & 4) == 1)){ //上下都被占,在中间 } else if((nVal & 8) == 1 ){ //上被占,在末尾 } else if((nVal & 4) == 1 ){ //下被占,在头部 } } else{ }*/ int deltaX = nXOrderIndex*nOrderPolarity*g_nHDiagramSpacing; if(((nVal & 2) == 1) && ((nVal & 1) == 1)){ qDebug()<setData(QString::number(nVal | 1)); pNextItem->setData(QString::number(nNextVal | 2)); //同时连接下个点的一侧占用 } else if((nVal & 1) == 1){ //右被占用,左空 pItem->setData(QString::number(nVal | 2)); pNextItem->setData(QString::number(nNextVal | 1)); } else{ //左右都没被占,默认放到左边 pItem->setData(QString::number(nVal | 1)); pNextItem->setData(QString::number(nNextVal | 2)); } pNextItem->setData(QPoint(deltaX,nOrderFirstDeltaY),Qt::UserRole + 2); } } int nReverseFirstDeltaY = 0; //首节点y偏移量(假设后续节点与头节点水平) int nXReverseIndex = 1; //横向计数 int nReversePolarity = 1; //方向 1右 -1左 if(route.lstOrder.size() > 1){ for(int i = 0;i < route.lstOrder.size()-1;++i){ //遍历以节点为首的队列 auto pItem = _pParent->getModel()->getNameItem(route.lstOrder[i].sName); int nVal = pItem->data().toInt(); QPoint deltaP = pItem->data(Qt::UserRole+2).toPoint(); auto pNextItem = _pParent->getModel()->getNameItem(route.lstOrder[i+1].sName); //下一个item int nNextVal = pNextItem->data().toInt(); if(i == 0){ //首节点 nReverseFirstDeltaY = deltaP.y(); if(((nVal & 2) == 1) && ((nVal & 1) == 1)){ qDebug()<setData(QString::number(nVal | 1)); pNextItem->setData(QString::number(nNextVal | 2)); //同时连接下个点的一侧占用 nReversePolarity = 1; } else if((nVal & 1) == 1){ //右被占用,左空 pItem->setData(QString::number(nVal | 2)); pNextItem->setData(QString::number(nNextVal | 1)); nReversePolarity = -1; } else{ //左右都没被占,默认放到左边 pItem->setData(QString::number(nVal | 1)); pNextItem->setData(QString::number(nNextVal | 2)); nReversePolarity = 1; } continue; } int deltaX = nXReverseIndex*nReversePolarity*g_nHDiagramSpacing; if(((nVal & 2) == 1) && ((nVal & 1) == 1)){ qDebug()<setData(QString::number(nVal | 1)); pNextItem->setData(QString::number(nNextVal | 2)); //同时连接下个点的一侧占用 } else if((nVal & 1) == 1){ //右被占用,左空 pItem->setData(QString::number(nVal | 2)); pNextItem->setData(QString::number(nNextVal | 1)); } else{ //左右都没被占,默认放到左边 pItem->setData(QString::number(nVal | 1)); pNextItem->setData(QString::number(nNextVal | 2)); } pNextItem->setData(QPoint(deltaX,nReverseFirstDeltaY),Qt::UserRole + 2); } } } }