news 2026/4/16 13:30:32

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/16 19:55:41

Windows快捷键冲突终极排查指南:热键侦探实战手册

Windows快捷键冲突终极排查指南&#xff1a;热键侦探实战手册 【免费下载链接】hotkey-detective A small program for investigating stolen hotkeys under Windows 8 项目地址: https://gitcode.com/gh_mirrors/ho/hotkey-detective 在日常工作中&#xff0c;你是否遇…

作者头像 李华
网站建设 2026/4/15 16:36:27

中文文生图新突破:Z-Image对中文提示词的强大理解能力详解

中文文生图新突破&#xff1a;Z-Image对中文提示词的强大理解能力详解 在内容创作日益依赖视觉表达的今天&#xff0c;AI生成图像已经从“能出图”走向“懂意图”的阶段。然而&#xff0c;对于中文用户而言&#xff0c;长期面临一个尴尬局面&#xff1a;主流文生图模型虽然强大…

作者头像 李华
网站建设 2026/4/15 20:15:39

让OneNote变身专业Markdown编辑器的完整指南

让OneNote变身专业Markdown编辑器的完整指南 【免费下载链接】NoteWidget Markdown add-in for Microsoft Office OneNote 项目地址: https://gitcode.com/gh_mirrors/no/NoteWidget 你是否曾经在OneNote中记录技术文档时感到力不从心&#xff1f;面对复杂的代码块、系统…

作者头像 李华
网站建设 2026/4/16 8:39:31

【程序员必看】VSCode后台智能体隔离技术:让编辑器提速300%

第一章&#xff1a;VSCode后台智能体隔离技术概述 VSCode 作为现代开发者的首选编辑器&#xff0c;其高性能与可扩展性得益于底层对后台任务的精细化管理。其中&#xff0c;后台智能体&#xff08;Background Agent&#xff09;隔离技术是保障主进程响应性与系统稳定性的核心机…

作者头像 李华
网站建设 2026/4/15 12:21:32

CoreCycler完整使用指南:从入门到精通的7个核心技巧

CoreCycler完整使用指南&#xff1a;从入门到精通的7个核心技巧 【免费下载链接】corecycler Stability test script for PBO & Curve Optimizer stability testing on AMD Ryzen processors 项目地址: https://gitcode.com/gh_mirrors/co/corecycler CoreCycler是一…

作者头像 李华