#include #include #include "diagramEditor/diagramEditorBayDetailSettingDlg.h" #include "diagramEditor/diagramEditorBayDetailAddDlg.h" #include "diagramEditor/diagramEditorBayPreviewDlg.h" #include "diagramEditor/diagramEditorWizard.h" #include "ui_diagramEditorBayDetailSettingDlg.h" #include "diagramEditor/diagramEditorBaseBlock.h" #include "graphicsDataModel/diagramEditorModel.h" #include "topologyManager.h" DiagramEditorBayDetailSettingDlg::DiagramEditorBayDetailSettingDlg(QWidget *parent) : QDialog(parent) , ui(new Ui::diagramEditorBayDetailSettingDlg) ,_pAddDlg(nullptr) ,_curOperateObj(nullptr) ,_compoModel(nullptr) ,_routeModel(nullptr) ,_pPreviewDlg(nullptr) ,_pModel(nullptr) ,_pWizard(nullptr) { ui->setupUi(this); this->setWindowFlags(Qt::FramelessWindowHint | windowFlags()); this->setWindowModality(Qt::WindowModal); setStyleSheet("background-color: white;"); initial(); } DiagramEditorBayDetailSettingDlg::~DiagramEditorBayDetailSettingDlg() { delete ui; } void DiagramEditorBayDetailSettingDlg::initial() { _compoModel = new QStandardItemModel(this); _routeModel = new QStandardItemModel(this); _routeModel->setHorizontalHeaderLabels({"线路名", "包含设备"}); ui->tableView->setModel(_routeModel); connect(ui->btn_add,&QPushButton::clicked,this,&DiagramEditorBayDetailSettingDlg::onAddClicked); connect(ui->btn_ok,&QPushButton::clicked,this,&DiagramEditorBayDetailSettingDlg::onOkClicked); connect(ui->btn_cancel,&QPushButton::clicked,this,&DiagramEditorBayDetailSettingDlg::onCancelClicked); connect(ui->btn_preview,&QPushButton::clicked,this,&DiagramEditorBayDetailSettingDlg::onPreviewClicked); connect(ui->tableView, &QTableView::customContextMenuRequested, this, &DiagramEditorBayDetailSettingDlg::onRouteRbtnClicked); ui->tableView->setContextMenuPolicy(Qt::CustomContextMenu); ui->tableView->setSelectionMode(QAbstractItemView::SingleSelection); ui->tableView->setSelectionBehavior(QAbstractItemView::SelectRows); ui->tableView->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch); ui->tableView->verticalHeader()->setVisible(false); ui->cb_layout->addItem("纵向",0); ui->cb_layout->addItem("横向",1); } void DiagramEditorBayDetailSettingDlg::refreshModel() { if(_curOperateObj){ _compoModel->clear(); _compoModel->setColumnCount(5); _compoModel->setHorizontalHeaderLabels({"分类", "名称", "类型", "关联对象", "引用线路"}); auto mapComponent = _curOperateObj->getBayInfo().mapComponent; for(auto& comp:mapComponent){ DiagramEditorComponentInfo info = comp; QStandardItem *itemCate = new QStandardItem(); QStandardItem *itemName = new QStandardItem(); QStandardItem *itemType = new QStandardItem(); QStandardItem *itemObj = new QStandardItem(); QStandardItem *itemRoute = new QStandardItem(); QString sCategory; if(info.nCategory == 0){ sCategory = "设备"; } else if(info.nCategory == 1){ sCategory = "连接关系"; } QString sType; if(info.nType == 1) { sType = "母线"; } else if(info.nType == 2) { sType = "异步电动机"; } else if(info.nType == 3) { sType = "断路器"; } else if(info.nType == 4) { sType = "电缆"; } else if(info.nType == 5) { sType = "电流互感器"; } else if(info.nType == 6) { sType = "电压互感器"; } else if(info.nType == 7) { sType = "隔离开关"; } else if(info.nType == 8) { sType = "接地开关"; } else if(info.nType == 9) { sType = "快速接地开关"; } else if(info.nType == 10) { sType = "双掷接地隔离开关"; } else if(info.nType == 11) { sType = "带电指示器"; } else if(info.nType == 12) { sType = "避雷器"; } else if(info.nType == 13) { sType = "电缆出线套筒"; } else if(info.nType == 14) { sType = "电缆端"; } itemCate->setText(sCategory); itemName->setText(info.sName); itemType->setText(sType); itemObj->setText(info.sBindObj); itemRoute->setText(info.sUsedRoute.join("、")); QList lstItems; lstItems<appendRow(lstItems); } _routeModel->clear(); _routeModel->setColumnCount(2); _routeModel->setHorizontalHeaderLabels({"线路名", "包含设备"}); auto info = _curOperateObj->getBayInfo(); setBayInfo(info); auto mapRoute = info.mapRoute; //更新路径数据到本界面 for(auto& route:mapRoute){ QString sRoute = route.sRouteName; QStringList lstComp; for(auto& comp:route.lstCompo){ lstComp.append(comp.sName); } QStandardItem *itemRoute = new QStandardItem(); QStandardItem *itemComponents = new QStandardItem(); itemRoute->setText(sRoute); itemComponents->setText(lstComp.join(",")); QList lstItems; lstItems<appendRow(lstItems); } } } void DiagramEditorBayDetailSettingDlg::showDlg(DiagramEditorBayBlock* p) { show(); _curOperateObj = p; if(p->getBayType() == BayType::busSectionBay) //分段间隔默认水平 ui->cb_layout->setCurrentIndex(1); else ui->cb_layout->setCurrentIndex(0); refreshModel(); } void DiagramEditorBayDetailSettingDlg::onAddClicked() { if(_pAddDlg == nullptr){ _pAddDlg = new DiagramEditorBayDetailAddDlg(this); _pAddDlg->setParent(this); } _pAddDlg->showDlg(); } void DiagramEditorBayDetailSettingDlg::onOkClicked() { //将ui设置的参数更新到对应block if(_curOperateObj){ QMap mapComponents; int nRowCount = _compoModel->rowCount(); for(int i = 0;i < nRowCount;++i){ QStandardItem *itemCate = _compoModel->item(i, 0); QStandardItem *itemName = _compoModel->item(i, 1); QStandardItem *itemType = _compoModel->item(i, 2); QStandardItem *itemBind = _compoModel->item(i, 3); QStandardItem *itemRoute = _compoModel->item(i, 4); int nDir = itemName->data(Qt::UserRole+1).toInt(); //连接方向 QPoint deltaPos = itemName->data(Qt::UserRole+2).toPoint(); //相对位置 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(); //旋转角度 DiagramEditorComponentInfo compoInfo; if(itemCate->text() == "电气设备"){ compoInfo.nCategory = 0; } else if(itemCate->text() == "连接关系"){ compoInfo.nCategory = 1; } compoInfo.sName = itemName->text(); compoInfo.nType = itemType->data().toInt(); compoInfo.sBindObj = itemBind->text(); compoInfo.nBindType = itemBind->data().toInt(); compoInfo.sUsedRoute = itemRoute->text().split(","); compoInfo.nUsedDirection = nDir; compoInfo.deltaPos = deltaPos; compoInfo.uid = uid; compoInfo.nFlag = nVal; compoInfo.nRotate = nRotate; mapComponents.insert(compoInfo.sName,compoInfo); } int nLayout = ui->cb_layout->currentData().toInt(); _curBayInfo.nLayout = nLayout; _curBayInfo.mapComponent = mapComponents; _curOperateObj->setBayInfo(_curBayInfo); TopologyManager::instance().clearGlobalBlockData(_curOperateObj->getName()); TopologyManager::instance().moveTempBlockData(); _curOperateObj = nullptr; } hide(); _pModel->clearCurPreview(); //关闭时清除预览Item //todo:清除mainPanel中的对应item(如果存在) } void DiagramEditorBayDetailSettingDlg::onCancelClicked() { hide(); } void DiagramEditorBayDetailSettingDlg::onRouteDeleteClicked() { // 获取当前选中的索引 QModelIndexList selectedIndexes = ui->tableView->selectionModel()->selectedRows(); if (selectedIndexes.isEmpty()) { return; // 没有选中任何行 } // 获取行号并排序(从大到小删除避免索引变化) QList rowsToRemove; foreach (const QModelIndex &index, selectedIndexes) { rowsToRemove.append(index.row()); } // 获取当前选中的第一项索引 QModelIndex index = selectedIndexes.first(); if (!index.isValid()) { return; } QModelIndex indexName = index.sibling(index.row(),0); QString sName = indexName.data().toString(); // 移除行 foreach (int row, rowsToRemove) { QList rowItems; for (int col = 0; col < _routeModel->columnCount(); ++col) { QStandardItem *item = _routeModel->takeItem(row, col); rowItems.append(item); } qDeleteAll(rowItems); //take的item不释放 _routeModel->removeRow(row); } _curBayInfo.mapRoute.remove(sName); //同步移除数据 } void DiagramEditorBayDetailSettingDlg::onRouteRbtnClicked(const QPoint &pos) { QModelIndex index = ui->tableView->indexAt(pos); if (!index.isValid()) { return; // 如果点击的是空白区域,直接返回 } QMenu menu; QAction *deleteAction = new QAction("删除", this); QAction *modifyAction = new QAction("修改", this); menu.addAction(deleteAction); menu.addAction(modifyAction); // 连接删除菜单项的触发信号与槽函数 connect(deleteAction, &QAction::triggered, this, &DiagramEditorBayDetailSettingDlg::onRouteDeleteClicked); //连接修改 connect(modifyAction, &QAction::triggered, this, &DiagramEditorBayDetailSettingDlg::onRouteEditClicked); // 在点击位置显示菜单 menu.exec(ui->tableView->mapToGlobal(pos)); } void DiagramEditorBayDetailSettingDlg::onRouteEditClicked() { if(_pAddDlg == nullptr){ _pAddDlg = new DiagramEditorBayDetailAddDlg(this); _pAddDlg->setParent(this); } // 获取当前选中的索引 QModelIndexList selectedIndexes = ui->tableView->selectionModel()->selectedRows(); if (selectedIndexes.isEmpty()) { return; // 没有选中任何行 } // 获取当前选中的第一项索引 QModelIndex index = selectedIndexes.first(); if (!index.isValid()) { return; } QModelIndex indexName = index.sibling(index.row(),0); QString sName = indexName.data().toString(); auto routeInfo = _curBayInfo.mapRoute.value(sName); _pAddDlg->showDlg(routeInfo); } void DiagramEditorBayDetailSettingDlg::onPreviewClicked() { int nLayout = ui->cb_layout->currentData().toInt(); if(_pPreviewDlg == nullptr){ _pPreviewDlg = new DiagramEditorBayPreviewDlg(this); _pPreviewDlg->setParent(this); _pModel->setCurBayComponentModel(_compoModel); _pModel->setCurBayRouteModel(_routeModel); } if(!_pPreviewDlg->isVisible()){ _pPreviewDlg->showDlg(nLayout); _pModel->generateTempBay(); } else _pPreviewDlg->hide(); }