news 2026/5/1 8:25:05

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/5/1 3:48:14

“「Agent工程」:大模型开发新范式!告别‘在我机器上跑得好‘的尴尬,小白也能快速上手!“

如果你开发过Agent&#xff0c;你就会知道“在我的机器上运行正常”和“在生产环境中运行正常”之间的差距可能非常巨大。传统软件假定你基本了解输入&#xff0c;并且可以定义输出。而Agent则不提供这些&#xff1a;用户可以输入任何内容&#xff0c;可能的行为空间也无限广阔…

作者头像 李华
网站建设 2026/5/1 4:43:10

导师严选10个AI论文软件,专科生轻松搞定毕业论文!

导师严选10个AI论文软件&#xff0c;专科生轻松搞定毕业论文&#xff01; AI 工具让论文写作不再难 对于许多专科生来说&#xff0c;毕业论文是一个既熟悉又陌生的挑战。它不仅是学术能力的体现&#xff0c;更是对个人耐心和毅力的考验。然而&#xff0c;随着 AI 技术的不断进步…

作者头像 李华
网站建设 2026/5/1 4:43:36

Z-Image-Edit与DragGAN对比:两种编辑范式的差异

Z-Image-Edit与DragGAN对比&#xff1a;两种编辑范式的差异 在图像AI技术飞速演进的今天&#xff0c;我们正经历一场从“操作工具”到“表达意图”的创作革命。过去&#xff0c;修改一张照片需要熟练掌握Photoshop中的图层、蒙版和变形工具&#xff1b;如今&#xff0c;只需说一…

作者头像 李华
网站建设 2026/5/1 4:13:26

事务管理最全指南:嵌套事务、传播机制与失效场景深度复盘

&#x1f680; 前言&#xff1a;为什么事务管理如此重要&#xff1f; 在现代企业级应用开发中&#xff0c;数据一致性是系统的生命线。想象一个电商场景&#xff1a;用户下单购买商品&#xff0c;系统需要同时完成以下操作&#xff1a; &#x1f6d2; 扣减库存&#xff1a;商…

作者头像 李华