250 lines
11 KiB
C++
250 lines
11 KiB
C++
#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()<<QString("point %1 full of connection").arg(route.lstOrder[i].sName);
|
||
}
|
||
else if((nVal & 2) == 1){
|
||
//左被占用,右空
|
||
pItem->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()<<QString("point %1 full of connection").arg(route.lstOrder[i].sName);
|
||
}
|
||
else if((nVal & 2) == 1){
|
||
//左被占用,右空
|
||
pItem->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()<<QString("point %1 full of connection").arg(route.lstOrder[i].sName);
|
||
}
|
||
else if((nVal & 2) == 1){
|
||
//左被占用,右空
|
||
pItem->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()<<QString("point %1 full of connection").arg(route.lstOrder[i].sName);
|
||
}
|
||
else if((nVal & 2) == 1){
|
||
//左被占用,右空
|
||
pItem->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);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|