news 2026/4/27 11:17:01

SWMM深度二次开发专题8:网络分析-最短路径查询

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
SWMM深度二次开发专题8:网络分析-最短路径查询

使用networkClass实例可以通过findShortestPath函数获得两点之间的最短路径信息.

1 案例项目内容

本专题对应的开发案例为\software\tutorial\exp_network_getNetwork文件夹中的内容,其中SWMMCPP_network_getNetwork子文件夹为VS2022 C++项目内容, swmm_network子文件夹为管网模型数据,即network.inp文件。建议按照本文内容自己新建项目,编写代码以便通过练习掌握“武理排水管网模拟分析系统”相关使用方法。按照专题1内容在\software\tutorial\exp_network_getNetwork文件夹中新建项目,并添加头文件及库文件。对于新建项目的:配置属性->常规->输出目录设置为:
“$(SolutionDir)$(Platform)\$(Configuration)\”
这样可执行文件会生成于\software\tutorial\x64\Debug文件夹下面,将\software\bin文件夹中内容全部拷贝至Debug文件夹,可以直接编译运行案例项目,方便统一进行调试运行。

2 路径处理相关函数

在main.cpp文件的最上面中添加路径处理相关函数,由于本案例会采用接口的实现类projectClass进行模拟计算,所以需要添加projectClass.h。

#include<windows.h>#include<filesystem>#include<shlwapi.h>// TODO: 在此处引用程序需要的其他头文件#include"swmm_cs.h"#include"projectClass.h"//projectClass.h引用了"networkClass.h"#pragmacomment(lib,"Shlwapi.lib")std::stringGetExecutablePath(){std::vector<char>buffer(MAX_PATH);DWORD len=GetModuleFileNameA(NULL,buffer.data(),MAX_PATH);if(len==0||len==MAX_PATH){// 缓冲区不够,动态扩容while(GetLastError()==ERROR_INSUFFICIENT_BUFFER){buffer.resize(buffer.size()*2);len=GetModuleFileNameA(NULL,buffer.data(),buffer.size());}}returnstd::string(buffer.data(),len);}// 获取 exe 所在目录std::stringGetExecutableDirectory(){std::string exePath=GetExecutablePath();chardir[MAX_PATH];lstrcpyA(dir,exePath.c_str());PathRemoveFileSpecA(dir);// 去掉文件名,留下目录returnstd::string(dir);}

3 通过networkClass获得两点间最短路径

下面的代码显示了如何通过networkClass实例获得模型网络中两个节点中间的最短路径。使用的是findShortestPath函数,该函数的具体使用说明可以查看帮助文件SwmmcppHelp.chm.

intFindShortestPath(std::string inpFilePath,std::string rptFilePath,std::string outFilePath,constchar*snodeid,constchar*tnodeid){SWMMCPP::projectClass*pswmm=NULL;if(GetSwmmSimulation((void**)&pswmm)!=0){printf("create swmm simulation interface object failed\n");return1;}if(pswmm->swmm_open((char*)inpFilePath.data(),(char*)rptFilePath.data(),(char*)outFilePath.data())!=0)//打开swmm的inp文件{printf("swmm_open failed\n");pswmm->swmm_close();//关闭swmm模型ReleaseSwmmSimulation((void*&)pswmm);return1;}if(pswmm->swmm_start(1)!=0)//打开swmm的inp文件{printf("swmm_start failed\n");pswmm->swmm_close();//关闭swmm模型ReleaseSwmmSimulation((void*&)pswmm);return1;}//根据节点名称获得节点的索引号intsnode=pswmm->swmm_objectIndex(2,snodeid);if(snode==-1){printf("%s is not a node id\n",snodeid);pswmm->swmm_close();//关闭swmm模型ReleaseSwmmSimulation((void*&)pswmm);return1;}inttnode=pswmm->swmm_objectIndex(2,tnodeid);if(tnode==-1){printf("%s is not a node id\n",tnodeid);pswmm->swmm_close();//关闭swmm模型ReleaseSwmmSimulation((void*&)pswmm);return1;}//创建networkClass对象networkClass*pnetwork=NULL;if(pswmm->swmm_getNetwork((void**)&pnetwork)!=0){pswmm->swmm_close();//关闭swmm模型ReleaseSwmmSimulation((void*&)pswmm);return1;}intNnodeInPath=0,NlinkInPath=0;int*nodesInPath=newint[pnetwork->Nnode];int*linksInPath=newint[pnetwork->Nlink];if(!pnetwork->findShortestPath(snode,tnode,&NnodeInPath,&NlinkInPath,nodesInPath,linksInPath)){printf("there is no path between node %s and node %s\n",snodeid,tnodeid);}else{printf("there is a path of %d nodes and %d links between node %s and node %s\n",NnodeInPath,NlinkInPath,snodeid,tnodeid);std::string nodeids="nodes: ";for(inti=0;i<NnodeInPath;i++){nodeids.append(pnetwork->nodeArray[nodesInPath[i]].ID.data());nodeids.append(", ");}nodeids.append("\n");printf("%s",nodeids.data());std::string linkids="links: ";for(inti=0;i<NlinkInPath;i++){linkids.append(pnetwork->linkArray[linksInPath[i]].ID.data());linkids.append(", ");}linkids.append("\n");printf("%s",linkids.data());}delete[]nodesInPath;delete[]linksInPath;ReleaseSwmmNetwork((void*&)pnetwork);pswmm->swmm_close();//关闭swmm模型ReleaseSwmmSimulation((void*&)pswmm);return0;}

4 main函数

main函数内容如下

intmain(){//获得当前路径std::string exeFileDic=GetExecutableDirectory();std::filesystem::pathp(exeFileDic);std::filesystem::path parent=p.parent_path();// 获取父目录parent=parent.parent_path();// 获取父目录//根据当前路径获得模型文件位置,并根据模型文件名,生成报告文件及结果文件的//文件名std::string inpFilePath=parent.string()+"\\exp_swmmcpp_FSP\\swmm_network\\network.inp";std::string rptFilePath=inpFilePath;rptFilePath.replace(rptFilePath.length()-3,3,"rpt");std::string outFilePath=inpFilePath;outFilePath.replace(outFilePath.length()-3,3,"out");//调用函数FindShortestPath(inpFilePath,rptFilePath,outFilePath,"J305797","J602860");}

5 编译运行

编译运行结果如下:

there is a path of14nodes and13links between node J305797 and node J602860 nodes:J305797,J305638,J305574,J305570,J305540,J305565,J603360,J603358,J603354,J603352,J602868,J602863,J602861,J602860,links:L3112348,L3115412,L3115350,L3115346,L3115340,L3115339,L6116053,L6009766,L6009765,L6009745,L6009739,L6009738,L6009734,

可以看出其获得的结果与SWMM的profile plot功能获得的路径一致

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/25 13:13:10

学霸同款9个AI论文工具,助你轻松搞定本科论文!

学霸同款9个AI论文工具&#xff0c;助你轻松搞定本科论文&#xff01; AI 工具如何帮你轻松应对论文写作的挑战 对于很多本科生来说&#xff0c;撰写一篇结构严谨、内容充实的本科论文是一项不小的挑战。从选题到资料收集&#xff0c;再到撰写和修改&#xff0c;每一个环节都可…

作者头像 李华
网站建设 2026/4/27 8:01:14

楼宇ICT规划实施标准:公区架构、基础设施与管理的稳定性保障

楼宇ICT系统是支撑楼宇智能化运维的核心基础设施&#xff0c;其规划实施标准的科学性直接决定了设施稳定性与服务可靠性。本文从公区规划架构、基础设施实施标准、管理标准三个维度&#xff0c;阐述保障楼宇ICT设施和服务稳定性的关键路径。 公区规划架构设计 公区是楼宇内人员…

作者头像 李华
网站建设 2026/4/17 14:01:17

【收藏必学】突破LLM瓶颈:AI Agent记忆系统架构设计与实践全攻略

文章深入解析了AI Agent记忆系统的架构与实现&#xff0c;包括短期记忆与长期记忆的区分及交互机制。详细介绍了主流框架的记忆系统设计、上下文工程策略及长期记忆技术组件&#xff0c;解决了LLM上下文窗口限制和成本问题。对比了开源记忆系统产品&#xff0c;展望了记忆即服务…

作者头像 李华
网站建设 2026/4/26 7:34:28

Android Studio终极汉化配置:深度解析中文界面实现原理

Android Studio终极汉化配置&#xff1a;深度解析中文界面实现原理 【免费下载链接】AndroidStudioChineseLanguagePack AndroidStudio中文插件(官方修改版本&#xff09; 项目地址: https://gitcode.com/gh_mirrors/an/AndroidStudioChineseLanguagePack Android Studi…

作者头像 李华
网站建设 2026/4/22 19:16:48

DM数据库物理存储结构深度解析与理论实践

引言 DM&#xff08;达梦&#xff09;数据库作为国产数据库的标杆产品&#xff0c;其物理存储结构的设计直接决定了数据存储的安全性、可靠性和访问性能。物理存储结构是数据库底层数据组织的核心载体&#xff0c;包含配置文件、控制文件、数据文件、日志文件等多个关键组件&am…

作者头像 李华
网站建设 2026/4/27 0:08:31

2003-2023年 285个地级市邻接矩阵、经济地理矩阵等8个矩阵数据

01、数据简介 共八个矩阵&#xff0c;各类矩阵通过量化空间关系&#xff0c;为区域政策制定&#xff08;如交通规划、产业布局&#xff09;和学术研究&#xff08;如空间溢出效应、区域收敛&#xff09;提供关键工具&#xff0c;需根据研究目标灵活选择或组合使用。 空间权重…

作者头像 李华