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