DiagramDesigner/diagramCavas/source/diagramEditor/diagramEditorBayPreviewDlg.cpp

250 lines
11 KiB
C++
Raw Normal View History

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