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功能获得的路径一致

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1119033.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2025年碳化硅品牌口碑榜:这些品牌为何备受青睐?磨料/不锈钢灰/棕刚玉/铬刚玉/碳化硅/黑碳化硅,碳化硅定制口碑推荐 - 品牌推荐师

近年来,随着新能源汽车、光伏、半导体等行业的快速发展,碳化硅作为第三代半导体材料的核心原料,其市场需求持续攀升。据行业数据显示,2024年全球碳化硅市场规模已突破30亿美元,预计2025年将保持年均15%以上的增速…

西门子840D HMI ADVANCED PC版:数控与PLC数据备份恢复、伺服调试、参数设定...

西门子840D HMI ADVANCED FOR PC。 也可用于810D,840DSL。 1、软件可安装到台式机或笔记本上&#xff0c;可以连接到机床的NCU进行NC与PLC的数据备份与恢复&#xff0c;备份和恢复的数据存储在电脑中。 也可以把NC程序放到电脑中&#xff0c;通过此软件加载到NCU中&#xff0c;…

跨境家具的海外仓安装教程广告互动形式是什么?

跨境家具的海外仓安装教程广告,到底怎么搞才能让老外忍不住点赞转发? 嘿,朋友。咱们今天来聊聊一个特别具体,但又让很多做跨境家具的朋友头疼的事儿:怎么在Twitter上,用海外仓安装教程这种硬核内容,做出让人愿意…

2025年市面上的艺术漆厂商有哪些,诺兰迪艺术漆/诺兰迪艺术涂料/墙面艺术漆/环保艺术涂料,艺术漆公司哪个好 - 品牌推荐师

随着消费者对家居环境的美学追求与健康环保意识同步提升,艺术涂料市场正经历着一场深刻的变革。从简单的墙面装饰,到承载空间个性与情感表达的艺术载体,艺术漆以其丰富的质感、多变的色彩和独特的肌理,成为现代室内…

医疗宣称需替换为场景化描述才能合规?

Instagram 营销:当“医疗宣称”遇上“场景化描述”,我们到底在怕什么? 嘿,最近刷 Instagram,是不是发现很多品牌说话的方式变了?以前那种“三天见效”、“根治XX”的标题党好像收敛了不少。取而代之的,是一些看…

转速恒压频比交流变频调速系统Simulink仿真

转速恒压频比交流变频调速系统Simulink仿真&#xff0c;可观察到电压频率的变比情况以及电动机的转速波形。 配有精美的报告说明。在电力系统中&#xff0c;变频调速技术是一种非常重要的控制手段&#xff0c;广泛应用于电机调速、电力补偿等领域。转速恒压频比调速系统是一种基…

点阵数码管显示屏驱动LED显示驱动芯片VK1S68C 数显驱动器原厂【FAE技术支持】

VK1S68C是一种带键盘扫描接口的数码管或点阵LED驱动控制专用芯片,内部集成有3 线串行接口、数据锁存器、LED 驱动、键盘扫描等电路。SEG脚接LED阳极,GRID脚接LED 阴极,可支持13SEGx4GRID、12SEGx5GRID、11SEGx6GRID…

安防监控视频汇聚平台EasyCVR打造出入口匝道安全畅行智慧管理方案

出入口匝道作为高速公路、城市快速路的关键交通节点,是车流交汇、方向转换的核心区域,却也长期面临拥堵频发、事故率高、管控滞后等痛点。传统视频监控方案因存在协议兼容不足、网络传输不稳定、智能分析缺失等问题,…

paperzz 开题报告:AI 工具如何把 “开题焦虑” 变成 “一键搞定”?

Paperzz-AI官网免费论文查重复率AIGC检测/开题报告/文献综述/论文初稿 paperzz - 开题报告https://www.paperzz.cc/proposal 当你对着开题报告的空白文档&#xff0c;既怕研究思路不清晰被导师驳回&#xff0c;又愁 PPT 框架太松散撑不起答辩时&#xff0c;paperzz 的 AI 开题…

Spring Boot 属性配置文件

Spring Boot 属性配置文件 Spring Boot 的属性配置文件是项目配置的核心,支持灵活的文件格式、加载规则和数据类型,本文将从文件类型、加载顺序、配置属性类型、实际使用示例等方面全面介绍。 配置文件类型 Spring B…

广告素材按产品图 → 场景视频 →UGC 合集顺序测试更高效?

Instagram 广告素材,到底要不要按“产品图 → 场景视频 → UGC 合集”死磕? 说真的,每次看到那种“绝对真理”式的营销公式,我脑子里都会冒出一个问号。特别是最近刷到好几次关于 Instagram 广告素材测试顺序的讨论…

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

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

美国地区长文广告的关键词密度最佳范围是什么?

聊透Twitter长文广告:别再纠结那个所谓的“最佳关键词密度”了 嘿,朋友。咱们今天不整那些虚头巴脑的理论,就坐下来像喝咖啡一样,聊聊你在Twitter上发长文广告这件事。我知道你肯定在某个SEO论坛或者某个“营销大师…

2026年靠谱涉外离婚律所排名,新测评精选涉外离婚律所推荐 - 工业品网

为帮客户高效锁定适配自身需求的涉外离婚法律服务合作伙伴,避免选型走弯路,我们从涉外法律专业度(如国际私法适配、跨境司法协作)、案件处理成功率(含财产分割、抚养权争夺)、全周期服务质量(覆盖前期咨询到后期…

Pandas简介 - 努力-

Pandas简介Pandas简介一、Pandas简介 Pandas是Python里处理数据的神器,尤其适合表格数据的分析和操作。它用起来简单高效,能帮你快速完成数据清洗、分析和可视化,是数据科学领域的必备工具。 核心功能: ‌1). 数据…

程序员必看!大模型技术学习路径与实战指南,建议收藏

文章为普通人提供了学习大模型技术的系统路径&#xff0c;涵盖提示词工程、RAG技术、LangChain应用、模型微调、AI Agent开发及多模态学习等关键领域。详细介绍了各项技术的原理、实践方法和应用场景&#xff0c;对比了AI测试与传统测试的区别&#xff0c;强调了数据质量验证、…

2026年山东高品质房企服务口碑排名:金茂山东市场口碑如何? - myqiye

TOP1 推荐:青岛金茂置业有限公司(金茂山东) 推荐指数:★★★★★ 口碑评分:山东市场口碑房企 专业能力:依托中国金茂央企背景,以释放城市未来生命力为核心使命,构建科技住宅+城市运营+生活服务三维能力体系。科…

JAVA打造:同城服务预约陪诊医院陪护系统

以下是一个基于JAVA技术打造的同城服务预约陪诊医院陪护系统的详细方案&#xff0c;涵盖系统架构、核心功能模块、技术实现细节、创新亮点及商业价值分析&#xff1a;一、系统架构设计1. 整体架构采用微服务架构&#xff0c;基于Spring Boot Spring Cloud Alibaba构建&#xf…

centos7安装redis3.0以及phpredis扩展

centos7安装redis3.0以及phpredis扩展Posted on 2026-01-06 15:41 pcwanli 阅读(0) 评论(0) 收藏 举报来源:https://blog.csdn.net/weixin_41608627/article/details/790123721.安装redis: #下载redis#wget h…

2026切割锯条品牌厂家TOP5权威推荐:定制实力厂商深度测评 - 工业品牌热点

工业制造领域中,切割精度与耗材成本直接影响企业利润,优质切割锯条成为生产环节的核心刚需。2023年数据显示,国内金属切割耗材市场规模超120亿元,年增速18%,但32%的企业投诉集中在锯条断裂、切割粗糙、维护复杂三…