批量替换VISSIM 6.0路网文件元素

刚才有个朋友问我,发生甚么事了,我说怎么回事,给我发了几张截图,我一看,噢,原来是昨天,搞得仿真没有把期望速度分布曲线、跟驰模型参数输入到模型里。60多个路网文件,散布在各个不同的文件夹里,每个文件都要手动调整,这好吗?这不好。于是尝试使用Python批量替换路网文件的元素。

1

首先是期望速度曲线,打开路网inpx文件,找到要修改的速度分布曲线位置。

2

然后编写代码,上网找了一个替换文件中行的函数代码,再读取一下文件。

替换一下元素,其中X是横轴(速度),FX是频率分布的百分比(0-1之间)

替换之前强烈建议备份,不然替换出错了路网文件就打不开了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
def changetext(dir,a,b):
with open(dir, 'r', encoding='utf-8') as f:
lines = [] # 创建了一个空列表,里面没有元素
for line in f.readlines():
if line != '\n':
lines.append(line)
f.close()
with open(dir, 'w', encoding='utf-8') as f:
for line in lines:
if a in line:
line = b
f.write('%s\n' % line)
else:
f.write('%s' % line)
if __name__=='__main__':
penetrate_ratio = [5,10,15,20,30,40]
manage_lane_type = ['base - fair','softMLinline','strongMLinLine','strongMLoutline']
peak_type=['peak','sub-peak']
for p in penetrate_ratio:
for item_ml in manage_lane_type:
for k in peak_type:
dir = "C:\\Users\\Run\\Desktop\\毕设仿真\\veryFair\\"+str(item_ml)+"\\"+k+"\\"+str(p)+"\\simu_model.inpx"
changetext(dir,'<speedDistributionDataPoint fx="0.000000" x="85.000000"/>', '\t\t\t\t<speedDistributionDataPoint fx="0.000000" x="60.000000"/>')
changetext(dir,'<speedDistributionDataPoint fx="0.070822" x="95.687023"/>', '\t\t\t\t<speedDistributionDataPoint fx="0.10610000" x="75.000000"/>')
changetext(dir,'<speedDistributionDataPoint fx="0.274788" x="103.893130"/>', '\t\t\t\t<speedDistributionDataPoint fx="0.1950000" x="80.000000"/>')
changetext(dir,'<speedDistributionDataPoint fx="0.793201" x="114.484733"/>', '\t\t\t\t<speedDistributionDataPoint fx="0.26260000" x="85.000000"/>')
changetext(dir,'<speedDistributionDataPoint fx="0.954674" x="121.259542"/>', '\t\t\t\t<speedDistributionDataPoint fx="0.41410000" x="95.000000"/>')
changetext(dir,'<speedDistributionDataPoint fx="1.000000" x="135.000000"/>', '\t\t\t\t<speedDistributionDataPoint fx="0.59090000" x="100.000000"/>\n\t\t\t\t<speedDistributionDataPoint fx="0.88380000" x="105.000000"/>\n\t\t\t\t<speedDistributionDataPoint fx="1.0000" x="110.000000"/>')

虽然循环层数很多,不是什么好算法,不过啪的一下就搞完了,很快啊!

替换完的效果:

3

后来有朋友又问我,能不能教教他怎么批量替换跟驰模型参数,仿真的时候把快速模式开开,再把部分道路车道1开放了给所有车辆通行,帮助治疗一下他的颈椎病,我说可以。我说你一个个手动调整,不好用,他不服气,他说你这个替换路网没用,我说我换一招,用COM接口来调整。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import win32com.client as com  # VISSIM COM
if __name__=='__main__':
penetrate_ratio = [5,10,15,20,30,40]
link_ids=[21,19,17,15,13,2]
manage_lane_type = ['base - fair','softMLinline','strongMLinLine','strongMLoutline']
peak_type=['peak','sub-peak']
Vissim = com.Dispatch("Vissim.Vissim.600")
for p in penetrate_ratio:
for item_ml in manage_lane_type:
for k in peak_type:
dir = "C:\\Users\\Run\\Desktop\\毕设仿真\\veryFair\\"+str(item_ml)+"\\"+k+"\\"+str(p)+"\\simu_model.inpx"
Vissim.LoadNet(dir)
dbps = Vissim.Net.DrivingBehaviors.ItemByKey(3) # Driving behavior module
dbps.SetAttValue('W99cc0', 1.233)
dbps.SetAttValue('W99cc1', 1.477)
dbps.SetAttValue('W99cc2', 2.466)
Vissim.Graphics.CurrentNetworkWindow.SetAttValue('QuickMode',True)
for lkid in link_ids:#把道路车道1开放给所有车辆通行
link=Vissim.Net.Links.ItemByKey(lkid)
lane=link.lanes.ItemByKey(1)
lane.SetAttValue('BlockedVehClasses','')
Vissim.SaveNet()
# Vissim.Simulation.RunContinuous()



依然是啪的一下就搞完了,很快啊!

4

VISSIM 6.0 的COM手册不讲武德,让我25岁的老同志找了半天也没找着类的关系图(比如这个快速模式的设置是在Vissim.Graphics.CurrentNetworkWindow下不是Vissim.Net下),希望武林有识之士能够提供一张类图,谢谢朋友们!

-------------文章已结束~感谢您的阅读-------------
穷且益坚,不堕青云之志。