fix editor component route reference

This commit is contained in:
baiYue 2026-05-29 17:42:30 +08:00
parent 01ce273d68
commit 8fa87baafc
11 changed files with 150 additions and 29 deletions

View File

@ -102,7 +102,7 @@ public:
virtual BayType getBayType() {return nBayType;}
virtual void setBayInfo(DiagramEditorBayInfo info) {bayInfo = info;}
virtual int getBayLocate() {return nBayLocate;}
virtual void setBayLocate(int n) {nBayLocate = n;}
virtual void setBayLocate(int n) {nBayLocate = n;bayInfo.nLocate = n;}
virtual DiagramEditorBayInfo& getBayInfo(){return bayInfo;}
};

View File

@ -53,6 +53,8 @@ public slots:
void onRouteEditClicked();
protected:
void resizeEvent(QResizeEvent *);
private:
void removeRouteUsageFromDevices(const QStringList &deviceNames, const QString &routeName); //移除设备中的线路占用
private:
Ui::diagramEditorBayDetailSettingDlg *ui;
DiagramEditorBayDetailAddDlg* _pAddDlg;

View File

@ -51,6 +51,8 @@ public slots:
void onRouteEditClicked();
protected:
void resizeEvent(QResizeEvent *);
private:
void removeRouteUsageFromDevices(const QStringList &deviceNames, const QString &routeName); //移除设备中的线路占用
private:
Ui::diagramEditorTransDetailSettingDlg *ui;
DiagramEditorTransDetailAddDlg* _pAddDlg;

View File

@ -70,7 +70,7 @@ public:
QMultiMap<int,QUuid> generateOutConnection(QList<DiagramEditorComponentInfo>,QList<HierarchyItem>&,int nTypeTransCon,int nPos = 0,DiagramEditorBaseBlock* pParent = nullptr); //生成外部连接手动bind的连接relation:层级关系引用 nTypeTransCon变压器连线类型,1中性点连接2外部连接,nPos中性点连接时的位置
QRectF updateTarget(QMap<QString,DiagramEditorRouteInfo>&,QMap<QString,DiagramEditorComponentInfo>&,QMap<QString, QMap<int,DirectionOccupancyRecord>>& directionOccupancyMap,QMap<QString, DirectionOccupancyRouteInfo>& routeDirectionMap,int nLayout,int nSource,bool saveToModel = true); //更新位置 nLayout主次朝向:8421,8421 上下左右,上下左右 nSource:0间隔1变压器 regenerate重新生成标志 saveToModel:生成到模型或map
void clearCompoDir(QMap<QString,DiagramEditorRouteInfo>&,QMap<QString,DiagramEditorComponentInfo>&,QMap<QString, QMap<int,DirectionOccupancyRecord>>& directionOccupancyMap,QMap<QString, DirectionOccupancyRouteInfo>& routeDirectionMap,int nSource); //清空component中的dir(updateTarget前调用)
void removeRouteDir(QMap<QString,DiagramEditorRouteInfo>&,QMap<QString,DiagramEditorComponentInfo>&,QMap<QString, QMap<int,DirectionOccupancyRecord>>& directionOccupancyMap,QMap<QString, DirectionOccupancyRouteInfo>& routeDirectionMap,int nSource); //删除某条线路上的方向占用
void removeRouteDir(const QString&,QMap<QString,DiagramEditorComponentInfo>&,QMap<QString, QMap<int,DirectionOccupancyRecord>>& directionOccupancyMap,QMap<QString, DirectionOccupancyRouteInfo>& routeDirectionMap,int nSource); //删除某条线路上的方向占用
QList<DiagramEditorComponentInfo> getRouteItemInfoList(QMap<QString,DiagramEditorComponentInfo>,QMap<QString,DiagramEditorRouteInfo>); //返回线路中包含的设备信息列表

View File

@ -342,10 +342,17 @@ void DiagramEditorBayDetailSettingDlg::onRouteDeleteClicked()
}
onRouteModified(_curBayInfo.mapRoute,_curBayInfo.routeOrder,sName,true);
auto info = _curBayInfo.mapRoute.value(sName);
QStringList lst;
for(auto &compo:info.lstCompo){
lst.append(compo.sName);
}
removeRouteUsageFromDevices(lst,sName);
_curBayInfo.mapRoute.remove(sName); //同步移除数据
_curBayInfo.routeOrder.removeAll(sName); //移除排序
_pModel->removeRouteDir(sName,_curBayInfo.mapComponent,_curBayInfo.directionOccupancyMap,_curBayInfo.routeDirectionMap,0);
for(int i = 0;i < _routeModel->rowCount();++i){ //重新加载所有父路线
QStandardItem *itemName = _routeModel->item(i, 0);
for(auto& route:_curBayInfo.mapRoute){
@ -471,3 +478,52 @@ void DiagramEditorBayDetailSettingDlg::resizeEvent(QResizeEvent *) {
_pSizeGrip->move(width() - _pSizeGrip->width(),
height() - _pSizeGrip->height());
}
void DiagramEditorBayDetailSettingDlg::removeRouteUsageFromDevices(const QStringList &deviceNames, const QString &routeName)
{
if (deviceNames.isEmpty() || routeName.isEmpty()) {
qWarning() << "设备名列表或路线名为空";
return;
}
auto pCompoModel = _compoModel;
if (!pCompoModel) {
qWarning() << "组件模型为空";
return;
}
// 1. 设备名去重
QSet<QString> uniqueDeviceNames(deviceNames.begin(),deviceNames.end());
// 2. 遍历组件模型
for (int row = 0; row < pCompoModel->rowCount(); ++row) {
QStandardItem *itemName = pCompoModel->item(row, 1);
if (!itemName) continue;
QString currentDevice = itemName->text();
if (uniqueDeviceNames.contains(currentDevice)) {
// 3. 移除路线占用
QStandardItem *itemUsed = pCompoModel->item(row, 4);
if (!itemUsed) continue;
QString usageText = itemUsed->text();
QStringList routes = usageText.split(",", Qt::SkipEmptyParts);
int beforeCount = routes.count();
routes.removeAll(routeName);
// 4. 只有当有实际变化时才更新
if (routes.count() != beforeCount) {
itemUsed->setText(routes.isEmpty() ? "" : routes.join(","));
}
// 5. 从待处理集合中移除
uniqueDeviceNames.remove(currentDevice);
// 6. 如果所有设备都已处理,提前结束
if (uniqueDeviceNames.isEmpty()) {
break;
}
}
}
}

View File

@ -50,7 +50,7 @@ void DiagramEditorBayPreviewDlg::showDlg(int nLayout)
}
auto& bayInfo = _pParent->getBayInfo();
_pParent->getModel()->clearCompoDir(bayInfo.mapRoute,bayInfo.mapComponent,bayInfo.directionOccupancyMap,bayInfo.routeDirectionMap,0);
_pParent->getModel()->updateTarget(_pParent->getBayInfo().mapRoute,_pParent->getBayInfo().mapComponent,bayInfo.directionOccupancyMap,bayInfo.routeDirectionMap,nDir,0);
_pParent->getModel()->updateTarget(bayInfo.mapRoute,bayInfo.mapComponent,bayInfo.directionOccupancyMap,bayInfo.routeDirectionMap,nDir,0);
}
void DiagramEditorBayPreviewDlg::setSceneRect(const QRect rec)

View File

@ -363,30 +363,27 @@ void DiagramEditorTransDetailAddDlg::onAddClicked()
for (int col = 0; col < Col_Count; ++col)
{
QStandardItem *srcItem = pMainModel->item(row, col);
if (!srcItem)
{
newRow.append(new QStandardItem());
continue;
}
QStandardItem *sourceItem = pMainModel->item(row, col);
if (sourceItem) {
// 创建深拷贝(重要!)
if(col == 4){ //线路引用,特殊处理
QString strAllRoute = sourceItem->text();
QString strCurRoute = ui->le_routeName->text();
QStandardItem *newItem = srcItem->clone();
// ===== 5. Route 字段特殊处理 =====
if (col == Col_Route)
{
QString routeText = newItem->text();
if (!routeText.contains(curRoute))
{
if (routeText.isEmpty())
newItem->setText(curRoute);
else
newItem->setText(routeText + "," + curRoute);
if(!strAllRoute.contains(strCurRoute)){ //第一个引用不加符号
if(strAllRoute.isEmpty())
sourceItem->setText(strCurRoute);
else
sourceItem->setText(strAllRoute+","+strCurRoute);
}
}
}
newRow.append(newItem);
QStandardItem *newItem = sourceItem->clone();
newRow.append(newItem);
} else {
// 如果单元格为空,创建空项目
newRow.append(new QStandardItem());
}
}
_selectedModel->appendRow(newRow);
@ -597,7 +594,7 @@ void DiagramEditorTransDetailAddDlg::onCategoryChanged(const QString& str)
}
}
else if(str == "连接关系"){
ui->cb_type->addItem("连接点",1);
ui->cb_type->addItem("连接点",0);
}
}

View File

@ -346,7 +346,12 @@ void DiagramEditorTransDetailSettingDlg::onRouteDeleteClicked()
_routeModels.value(n)->removeRow(row);
}
//_mapsRouteInfo.value(n).remove(sName); //同步移除数据
auto info = _transInfo.mapNeutral.value(n).mapRoute.value(sName);
QStringList lst;
for(auto &compo:info.lstCompo){
lst.append(compo.sName);
}
removeRouteUsageFromDevices(lst,sName);
_transInfo.mapNeutral.value(n).mapRoute.remove(sName); //同步移除数据
}
@ -434,3 +439,52 @@ void DiagramEditorTransDetailSettingDlg::resizeEvent(QResizeEvent *) {
_pSizeGrip->move(width() - _pSizeGrip->width(),
height() - _pSizeGrip->height());
}
void DiagramEditorTransDetailSettingDlg::removeRouteUsageFromDevices(const QStringList &deviceNames, const QString &routeName)
{
if (deviceNames.isEmpty() || routeName.isEmpty()) {
qWarning() << "设备名列表或路线名为空";
return;
}
auto pCompoModel = _compoModel;
if (!pCompoModel) {
qWarning() << "组件模型为空";
return;
}
// 1. 设备名去重
QSet<QString> uniqueDeviceNames(deviceNames.begin(),deviceNames.end());
// 2. 遍历组件模型
for (int row = 0; row < pCompoModel->rowCount(); ++row) {
QStandardItem *itemName = pCompoModel->item(row, 1);
if (!itemName) continue;
QString currentDevice = itemName->text();
if (uniqueDeviceNames.contains(currentDevice)) {
// 3. 移除路线占用
QStandardItem *itemUsed = pCompoModel->item(row, 4);
if (!itemUsed) continue;
QString usageText = itemUsed->text();
QStringList routes = usageText.split(",", Qt::SkipEmptyParts);
int beforeCount = routes.count();
routes.removeAll(routeName);
// 4. 只有当有实际变化时才更新
if (routes.count() != beforeCount) {
itemUsed->setText(routes.isEmpty() ? "" : routes.join(","));
}
// 5. 从待处理集合中移除
uniqueDeviceNames.remove(currentDevice);
// 6. 如果所有设备都已处理,提前结束
if (uniqueDeviceNames.isEmpty()) {
break;
}
}
}
}

View File

@ -54,6 +54,8 @@ QRectF DiagramLayoutEngine::executeLayout(
compo.deltaPos = mapCatch[compo.sName].deltaPos;
}
}
directionOccupancyMap = context.directionOccupancyMap;
routeDirectionMap = context.routeDirectionMap;
// 4. 计算边界
if (!context.saveToModel) {

View File

@ -1352,12 +1352,16 @@ void DiagramEditorModel::clearCompoDir(QMap<QString,DiagramEditorRouteInfo>& dat
}
}
void DiagramEditorModel::removeRouteDir(QMap<QString,DiagramEditorRouteInfo>&,QMap<QString,DiagramEditorComponentInfo>&,QMap<QString, QMap<int,DirectionOccupancyRecord>>& directionOccupancyMap,
void DiagramEditorModel::removeRouteDir(const QString& routeId,QMap<QString,DiagramEditorComponentInfo>& components,QMap<QString, QMap<int,DirectionOccupancyRecord>>& directionOccupancyMap,
QMap<QString, DirectionOccupancyRouteInfo>& routeDirectionMap,int nSource)
{
DiagramLayoutEngine engine(this);
DiagramLayoutEngine::Context context;
//engine.clearRouteDirectionOccupancy(routeId,context);
context.sourceId = nSource;
context.initComponentsCache(components);
context.initDirectionOccupancyCache(directionOccupancyMap);
context.initRouteDirectionMapCache(routeDirectionMap);
engine.clearRouteDirectionOccupancy(routeId,context);
}
QRectF DiagramEditorModel::updateTarget(

View File

@ -169,6 +169,10 @@ QMap<QUuid,DiagramEditorItemProperty*> BasePropertyManager::getEditorData() cons
void BasePropertyManager::clearEditorData()
{
for(auto& pTemp:m_editorTempData){
delete pTemp;
}
m_editorTempData.clear();
for(auto &pPro:m_editorData){
delete pPro;
}