Visum与其他软件的接口
在交通规划仿真软件Visum中,与其他软件的接口是一个非常重要的功能,它可以帮助用户将Visum的数据与其他工具进行交换,从而实现更复杂的分析和数据处理。本节将详细探讨Visum与各种软件接口的原理和内容,包括数据导入导出、脚本编写、与其他交通仿真软件的接口等。通过这些接口,用户可以充分利用Visum的强大功能,同时结合其他软件的优势,提高工作效率和分析精度。
数据导入导出
Visum支持多种数据格式的导入和导出,这使得用户可以方便地在不同软件之间交换数据。以下是几种常见的数据导入导出方式:
1. 导入CSV文件
CSV(Comma-Separated Values)文件是一种常见的数据交换格式,Visum可以通过CSV文件将数据导入到其模型中。以下是一个具体的例子,展示如何将一个CSV文件中的交通流量数据导入Visum。
例子:导入CSV文件中的交通流量数据
假设我们有一个CSV文件,其中包含多个路段的交通流量数据。文件内容如下:
LinkID,FromNode,ToNode,Flow
1,100,200,1500
2,200,300,2000
3,300,400,1000
要将这些数据导入Visum,可以按照以下步骤操作:
-
准备CSV文件:确保CSV文件的格式正确,列名与Visum中的属性名称匹配。
-
打开Visum模型:启动Visum并打开一个交通规划模型。
-
导入数据:使用Visum的数据导入功能将CSV文件中的数据导入模型。
以下是具体的代码示例,展示如何使用Visum的API导入CSV文件中的交通流量数据:
# 导入Visum API
import visum as vs
# 打开Visum模型
visum = vs.Visum()
model_path = r"C:\Path\To\Your\Model.INP"
visum.LoadVersion(model_path)
# 读取CSV文件
import pandas as pd
csv_path = r"C:\Path\To\Your\FlowData.csv"
flow_data = pd.read_csv(csv_path)
# 创建一个新的数据表
visum.Net.AddUserDefinedTable("LinkFlow", "LinkFlow", "LinkFlow", "LinkFlow")
# 添加列
link_flow_table = visum.Net.UserDefinedTables("LinkFlow")
link_flow_table.AddColumn("LinkID", "LinkID", "LinkID", "LinkID")
link_flow_table.AddColumn("FromNode", "FromNode", "FromNode", "FromNode")
link_flow_table.AddColumn("ToNode", "ToNode", "ToNode", "ToNode")
link_flow_table.AddColumn("Flow", "Flow", "Flow", "Flow")
# 导入数据
for index, row in flow_data.iterrows():
link_flow_table.AddRow({
"LinkID": row["LinkID"],
"FromNode": row["FromNode"],
"ToNode": row["ToNode"],
"Flow": row["Flow"]
})
# 保存模型
visum.SaveVersion(model_path)
2. 导出CSV文件
同样,Visum也支持将模型数据导出为CSV文件,以便在其他软件中进一步处理。以下是一个具体的例子,展示如何将Visum中的交通流量数据导出为CSV文件。
例子:导出Visum中的交通流量数据为CSV文件
假设我们已经在Visum模型中有一个包含交通流量数据的数据表。要将这些数据导出为CSV文件,可以按照以下步骤操作:
-
打开Visum模型:启动Visum并打开一个交通规划模型。
-
选择数据表:选择要导出的数据表。
-
导出数据:使用Visum的导出功能将数据导出为CSV文件。
以下是具体的代码示例,展示如何使用Visum的API导出交通流量数据为CSV文件:
# 导入Visum API
import visum as vs
# 打开Visum模型
visum = vs.Visum()
model_path = r"C:\Path\To\Your\Model.INP"
visum.LoadVersion(model_path)
# 选择数据表
link_flow_table = visum.Net.UserDefinedTables("LinkFlow")
# 读取数据
link_flow_data = []
for row in link_flow_table.Rows:
link_flow_data.append({
"LinkID": row["LinkID"],
"FromNode": row["FromNode"],
"ToNode": row["ToNode"],
"Flow": row["Flow"]
})
# 将数据转换为DataFrame
import pandas as pd
df = pd.DataFrame(link_flow_data)
# 导出为CSV文件
csv_path = r"C:\Path\To\Your\ExportedFlowData.csv"
df.to_csv(csv_path, index=False)
# 保存模型
visum.SaveVersion(model_path)
3. 导入Excel文件
Excel文件是另一种常用的数据交换格式,Visum也支持从Excel文件中导入数据。以下是一个具体的例子,展示如何将一个Excel文件中的交通流量数据导入Visum。
例子:导入Excel文件中的交通流量数据
假设我们有一个Excel文件,其中包含多个路段的交通流量数据。文件内容如下:
LinkID FromNode ToNode Flow
1 100 200 1500
2 200 300 2000
3 300 400 1000
要将这些数据导入Visum,可以按照以下步骤操作:
-
准备Excel文件:确保Excel文件的格式正确,列名与Visum中的属性名称匹配。
-
打开Visum模型:启动Visum并打开一个交通规划模型。
-
导入数据:使用Visum的数据导入功能将Excel文件中的数据导入模型。
以下是具体的代码示例,展示如何使用Visum的API导入Excel文件中的交通流量数据:
# 导入Visum API
import visum as vs
# 打开Visum模型
visum = vs.Visum()
model_path = r"C:\Path\To\Your\Model.INP"
visum.LoadVersion(model_path)
# 读取Excel文件
import pandas as pd
excel_path = r"C:\Path\To\Your\FlowData.xlsx"
flow_data = pd.read_excel(excel_path)
# 创建一个新的数据表
visum.Net.AddUserDefinedTable("LinkFlow", "LinkFlow", "LinkFlow", "LinkFlow")
# 添加列
link_flow_table = visum.Net.UserDefinedTables("LinkFlow")
link_flow_table.AddColumn("LinkID", "LinkID", "LinkID", "LinkID")
link_flow_table.AddColumn("FromNode", "FromNode", "FromNode", "FromNode")
link_flow_table.AddColumn("ToNode", "ToNode", "ToNode", "ToNode")
link_flow_table.AddColumn("Flow", "Flow", "Flow", "Flow")
# 导入数据
for index, row in flow_data.iterrows():
link_flow_table.AddRow({
"LinkID": row["LinkID"],
"FromNode": row["FromNode"],
"ToNode": row["ToNode"],
"Flow": row["Flow"]
})
# 保存模型
visum.SaveVersion(model_path)
4. 导出Excel文件
Visum同样支持将模型数据导出为Excel文件,以便在其他软件中进一步处理。以下是一个具体的例子,展示如何将Visum中的交通流量数据导出为Excel文件。
例子:导出Visum中的交通流量数据为Excel文件
假设我们已经在Visum模型中有一个包含交通流量数据的数据表。要将这些数据导出为Excel文件,可以按照以下步骤操作:
-
打开Visum模型:启动Visum并打开一个交通规划模型。
-
选择数据表:选择要导出的数据表。
-
导出数据:使用Visum的导出功能将数据导出为Excel文件。
以下是具体的代码示例,展示如何使用Visum的API导出交通流量数据为Excel文件:
# 导入Visum API
import visum as vs
# 打开Visum模型
visum = vs.Visum()
model_path = r"C:\Path\To\Your\Model.INP"
visum.LoadVersion(model_path)
# 选择数据表
link_flow_table = visum.Net.UserDefinedTables("LinkFlow")
# 读取数据
link_flow_data = []
for row in link_flow_table.Rows:
link_flow_data.append({
"LinkID": row["LinkID"],
"FromNode": row["FromNode"],
"ToNode": row["ToNode"],
"Flow": row["Flow"]
})
# 将数据转换为DataFrame
import pandas as pd
df = pd.DataFrame(link_flow_data)
# 导出为Excel文件
excel_path = r"C:\Path\To\Your\ExportedFlowData.xlsx"
df.to_excel(excel_path, index=False)
# 保存模型
visum.SaveVersion(model_path)
脚本编写
Visum提供了强大的脚本编写功能,用户可以通过编写脚本来自动化数据处理和分析任务。以下是一些常见的脚本编写场景和示例。
1. 数据处理脚本
数据处理脚本可以帮助用户自动完成数据清洗、转换和分析任务。以下是一个具体的例子,展示如何编写一个脚本来处理Visum中的交通流量数据。
例子:编写数据处理脚本
假设我们有一个Visum模型,其中包含交通流量数据。我们希望编写一个脚本来计算每个路段的平均流量,并将结果保存到一个新的数据表中。
-
打开Visum模型:启动Visum并打开一个交通规划模型。
-
读取数据:读取交通流量数据。
-
计算平均流量:计算每个路段的平均流量。
-
保存结果:将计算结果保存到一个新的数据表中。
以下是具体的代码示例:
# 导入Visum API
import visum as vs
# 打开Visum模型
visum = vs.Visum()
model_path = r"C:\Path\To\Your\Model.INP"
visum.LoadVersion(model_path)
# 选择数据表
link_flow_table = visum.Net.UserDefinedTables("LinkFlow")
# 读取数据
link_flow_data = []
for row in link_flow_table.Rows:
link_flow_data.append({
"LinkID": row["LinkID"],
"FromNode": row["FromNode"],
"ToNode": row["ToNode"],
"Flow": row["Flow"]
})
# 将数据转换为DataFrame
import pandas as pd
df = pd.DataFrame(link_flow_data)
# 计算平均流量
average_flow = df.groupby("LinkID")["Flow"].mean().reset_index()
# 创建一个新的数据表
visum.Net.AddUserDefinedTable("AverageLinkFlow", "AverageLinkFlow", "AverageLinkFlow", "AverageLinkFlow")
# 添加列
average_flow_table = visum.Net.UserDefinedTables("AverageLinkFlow")
average_flow_table.AddColumn("LinkID", "LinkID", "LinkID", "LinkID")
average_flow_table.AddColumn("AverageFlow", "AverageFlow", "AverageFlow", "AverageFlow")
# 导入数据
for index, row in average_flow.iterrows():
average_flow_table.AddRow({
"LinkID": row["LinkID"],
"AverageFlow": row["AverageFlow"]
})
# 保存模型
visum.SaveVersion(model_path)
2. 自动化分析脚本
自动化分析脚本可以帮助用户自动完成复杂的分析任务,例如交通分配、出行时间计算等。以下是一个具体的例子,展示如何编写一个脚本来自动进行交通分配。
例子:编写自动化交通分配脚本
假设我们有一个Visum模型,其中包含交通网络和需求数据。我们希望编写一个脚本来自动进行交通分配,并将结果保存到一个新的数据表中。
-
打开Visum模型:启动Visum并打开一个交通规划模型。
-
读取需求数据:读取交通需求数据。
-
进行交通分配:使用Visum的交通分配功能进行计算。
-
保存结果:将交通分配结果保存到一个新的数据表中。
以下是具体的代码示例:
# 导入Visum API
import visum as vs
# 打开Visum模型
visum = vs.Visum()
model_path = r"C:\Path\To\Your\Model.INP"
visum.LoadVersion(model_path)
# 选择需求数据表
demand_table = visum.Net.UserDefinedTables("Demand")
# 读取需求数据
demand_data = []
for row in demand_table.Rows:
demand_data.append({
"ZoneID1": row["ZoneID1"],
"ZoneID2": row["ZoneID2"],
"Volume": row["Volume"]
})
# 将数据转换为DataFrame
import pandas as pd
df = pd.DataFrame(demand_data)
# 配置交通分配
assignment = visum.Procedures.Assignment
assignment.SetAttributes({
"Method": "UserEquilibrium",
"Impedance": "TravelTime",
"Demand": "Demand"
})
# 运行交通分配
assignment.Run()
# 读取交通分配结果
link_flow_table = visum.Net.UserDefinedTables("LinkFlow")
# 创建一个新的数据表来保存结果
visum.Net.AddUserDefinedTable("AssignmentResults", "AssignmentResults", "AssignmentResults", "AssignmentResults")
# 添加列
assignment_results_table = visum.Net.UserDefinedTables("AssignmentResults")
assignment_results_table.AddColumn("LinkID", "LinkID", "LinkID", "LinkID")
assignment_results_table.AddColumn("AssignedFlow", "AssignedFlow", "AssignedFlow", "AssignedFlow")
# 导入结果数据
for row in link_flow_table.Rows:
assignment_results_table.AddRow({
"LinkID": row["LinkID"],
"AssignedFlow": row["Flow"]
})
# 保存模型
visum.SaveVersion(model_path)
3. 数据验证脚本
数据验证脚本可以帮助用户自动检查模型数据的完整性和准确性。以下是一个具体的例子,展示如何编写一个脚本来验证交通网络中的节点和路段数据。
例子:编写数据验证脚本
假设我们有一个Visum模型,其中包含交通网络节点和路段数据。我们希望编写一个脚本来验证每个节点是否有至少一个进来的路段和一个出去的路段。
-
打开Visum模型:启动Visum并打开一个交通规划模型。
-
读取节点和路段数据:读取交通网络中的节点和路段数据。
-
验证数据:检查每个节点是否有至少一个进来的路段和一个出去的路段。
-
输出结果:将验证结果输出到控制台或日志文件。
以下是具体的代码示例:
# 导入Visum API
import visum as vs
# 打开Visum模型
visum = vs.Visum()
model_path = r"C:\Path\To\Your\Model.INP"
visum.LoadVersion(model_path)
# 读取节点数据
nodes = visum.Net.Nodes
node_data = []
for node in nodes:
node_data.append({
"NodeID": node["NodeID"],
"IncomingLinks": [link["LinkID"] for link in node.IncomingLinks],
"OutgoingLinks": [link["LinkID"] for link in node.OutgoingLinks]
})
# 将数据转换为DataFrame
import pandas as pd
df = pd.DataFrame(node_data)
# 验证数据
invalid_nodes = []
for index, row in df.iterrows():
if len(row["IncomingLinks"]) == 0 or len(row["OutgoingLinks"]) == 0:
invalid_nodes.append(row["NodeID"])
# 输出结果
if invalid_nodes:
print(f"以下节点没有足够的进出路段:{invalid_nodes}")
else:
print("所有节点都有至少一个进来的路段和一个出去的路段")
# 保存模型
visum.SaveVersion(model_path)
与其他交通仿真软件的接口
Visum可以与其他交通仿真软件进行接口,实现数据交换和联合仿真。以下是一些常见的接口方式和示例。
1. 与MATSim接口
MATSim(Multi-Agent Transport Simulation)是一个开源的交通仿真软件,Visum可以通过数据交换与MATSim进行联合仿真。以下是一个具体的例子,展示如何将Visum中的交通网络和需求数据导出为MATSim的输入文件格式。
例子:将Visum数据导出为MATSim输入文件
假设我们有一个Visum模型,其中包含交通网络和需求数据。我们希望将这些数据导出为MATSim的输入文件格式。
-
打开Visum模型:启动Visum并打开一个交通规划模型。
-
读取网络数据:读取交通网络数据,包括节点和路段。
-
读取需求数据:读取交通需求数据。
-
导出数据:将网络和需求数据导出为MATSim的输入文件格式。
以下是具体的代码示例:
# 导入Visum API
import visum as vs
# 打开Visum模型
visum = vs.Visum()
model_path = r"C:\Path\To\Your\Model.INP"
visum.LoadVersion(model_path)
# 读取节点数据
nodes = visum.Net.Nodes
node_data = []
for node in nodes:
node_data.append({
"NodeID": node["NodeID"],
"X": node["X"],
"Y": node["Y"]
})
# 读取路段数据
links = visum.Net.Links
link_data = []
for link in links:
link_data.append({
"LinkID": link["LinkID"],
"FromNode": link["FromNode"],
"ToNode": link["ToNode"],
"Length": link["Length"],
"Capacity": link["Capacity"],
"FreeFlowSpeed": link["FreeFlowSpeed"]
})
# 读取需求数据
demand_table = visum.Net.UserDefinedTables("Demand")
demand_data = []
for row in demand_table.Rows:
demand_data.append({
"ZoneID1": row["ZoneID1"],
"ZoneID2": row["ZoneID2"],
"Volume": row["Volume"]
})
# 将数据转换为DataFrame
import pandas as pd
df_nodes = pd.DataFrame(node_data)
df_links = pd.DataFrame(link_data)
df_demand = pd.DataFrame(demand_data)
# 导出节点数据为CSV文件
nodes_csv_path = r"C:\Path\To\Your\Nodes.csv"
df_nodes.to_csv(nodes_csv_path, index=False)
# 导### 4. 导出路段数据为CSV文件
继续前面的示例,我们将路段数据导出为CSV文件,以便在MATSim中使用。
```python
# 导出路段数据为CSV文件
links_csv_path = r"C:\Path\To\Your\Links.csv"
df_links.to_csv(links_csv_path, index=False)
# 导出需求数据为CSV文件
demand_csv_path = r"C:\Path\To\Your\Demand.csv"
df_demand.to_csv(demand_csv_path, index=False)
# 保存模型
visum.SaveVersion(model_path)
2. 与Aimsun接口
Aimsun是一个商业交通仿真软件,Visum可以通过数据交换与Aimsun进行联合仿真。以下是一个具体的例子,展示如何将Visum中的交通网络和需求数据导出为Aimsun的输入文件格式。
例子:将Visum数据导出为Aimsun输入文件
假设我们有一个Visum模型,其中包含交通网络和需求数据。我们希望将这些数据导出为Aimsun的输入文件格式。
-
打开Visum模型:启动Visum并打开一个交通规划模型。
-
读取网络数据:读取交通网络数据,包括节点和路段。
-
读取需求数据:读取交通需求数据。
-
导出数据:将网络和需求数据导出为Aimsun的输入文件格式。
以下是具体的代码示例:
# 导入Visum API
import visum as vs
# 打开Visum模型
visum = vs.Visum()
model_path = r"C:\Path\To\Your\Model.INP"
visum.LoadVersion(model_path)
# 读取节点数据
nodes = visum.Net.Nodes
node_data = []
for node in nodes:
node_data.append({
"NodeID": node["NodeID"],
"X": node["X"],
"Y": node["Y"]
})
# 读取路段数据
links = visum.Net.Links
link_data = []
for link in links:
link_data.append({
"LinkID": link["LinkID"],
"FromNode": link["FromNode"],
"ToNode": link["ToNode"],
"Length": link["Length"],
"Capacity": link["Capacity"],
"FreeFlowSpeed": link["FreeFlowSpeed"]
})
# 读取需求数据
demand_table = visum.Net.UserDefinedTables("Demand")
demand_data = []
for row in demand_table.Rows:
demand_data.append({
"ZoneID1": row["ZoneID1"],
"ZoneID2": row["ZoneID2"],
"Volume": row["Volume"]
})
# 将数据转换为DataFrame
import pandas as pd
df_nodes = pd.DataFrame(node_data)
df_links = pd.DataFrame(link_data)
df_demand = pd.DataFrame(demand_data)
# 导出节点数据为CSV文件
nodes_csv_path = r"C:\Path\To\Your\Nodes.csv"
df_nodes.to_csv(nodes_csv_path, index=False)
# 导出路段数据为CSV文件
links_csv_path = r"C:\Path\To\Your\Links.csv"
df_links.to_csv(links_csv_path, index=False)
# 导出需求数据为CSV文件
demand_csv_path = r"C:\Path\To\Your\Demand.csv"
df_demand.to_csv(demand_csv_path, index=False)
# 保存模型
visum.SaveVersion(model_path)
3. 与SUMO接口
SUMO(Simulation of Urban MObility)是一个开源的交通仿真软件,Visum可以通过数据交换与SUMO进行联合仿真。以下是一个具体的例子,展示如何将Visum中的交通网络和需求数据导出为SUMO的输入文件格式。
例子:将Visum数据导出为SUMO输入文件
假设我们有一个Visum模型,其中包含交通网络和需求数据。我们希望将这些数据导出为SUMO的输入文件格式。
-
打开Visum模型:启动Visum并打开一个交通规划模型。
-
读取网络数据:读取交通网络数据,包括节点和路段。
-
读取需求数据:读取交通需求数据。
-
导出数据:将网络和需求数据导出为SUMO的输入文件格式。
以下是具体的代码示例:
# 导入Visum API
import visum as vs
# 打开Visum模型
visum = vs.Visum()
model_path = r"C:\Path\To\Your\Model.INP"
visum.LoadVersion(model_path)
# 读取节点数据
nodes = visum.Net.Nodes
node_data = []
for node in nodes:
node_data.append({
"NodeID": node["NodeID"],
"X": node["X"],
"Y": node["Y"]
})
# 读取路段数据
links = visum.Net.Links
link_data = []
for link in links:
link_data.append({
"LinkID": link["LinkID"],
"FromNode": link["FromNode"],
"ToNode": link["ToNode"],
"Length": link["Length"],
"Capacity": link["Capacity"],
"FreeFlowSpeed": link["FreeFlowSpeed"]
})
# 读取需求数据
demand_table = visum.Net.UserDefinedTables("Demand")
demand_data = []
for row in demand_table.Rows:
demand_data.append({
"ZoneID1": row["ZoneID1"],
"ZoneID2": row["ZoneID2"],
"Volume": row["Volume"]
})
# 将数据转换为DataFrame
import pandas as pd
df_nodes = pd.DataFrame(node_data)
df_links = pd.DataFrame(link_data)
df_demand = pd.DataFrame(demand_data)
# 导出节点数据为XML文件
nodes_xml_path = r"C:\Path\To\Your\Nodes.xml"
df_nodes.to_xml(nodes_xml_path, root_name="nodes", row_name="node", index=False)
# 导出路段数据为XML文件
links_xml_path = r"C:\Path\To\Your\Links.xml"
df_links.to_xml(links_xml_path, root_name="edges", row_name="edge", index=False)
# 导出需求数据为XML文件
demand_xml_path = r"C:\Path\To\Your\Demand.xml"
df_demand.to_xml(demand_xml_path, root_name="trips", row_name="trip", index=False)
# 保存模型
visum.SaveVersion(model_path)
4. 与ArcGIS接口
ArcGIS是一个强大的地理信息系统软件,Visum可以通过数据交换与ArcGIS进行联合分析。以下是一个具体的例子,展示如何将Visum中的交通网络数据导出为ArcGIS的输入文件格式。
例子:将Visum数据导出为ArcGIS输入文件
假设我们有一个Visum模型,其中包含交通网络数据。我们希望将这些数据导出为ArcGIS的输入文件格式。
-
打开Visum模型:启动Visum并打开一个交通规划模型。
-
读取网络数据:读取交通网络数据,包括节点和路段。
-
导出数据:将网络数据导出为ArcGIS的输入文件格式。
以下是具体的代码示例:
# 导入Visum API
import visum as vs
# 打开Visum模型
visum = vs.Visum()
model_path = r"C:\Path\To\Your\Model.INP"
visum.LoadVersion(model_path)
# 读取节点数据
nodes = visum.Net.Nodes
node_data = []
for node in nodes:
node_data.append({
"NodeID": node["NodeID"],
"X": node["X"],
"Y": node["Y"]
})
# 读取路段数据
links = visum.Net.Links
link_data = []
for link in links:
link_data.append({
"LinkID": link["LinkID"],
"FromNode": link["FromNode"],
"ToNode": link["ToNode"],
"Length": link["Length"],
"Capacity": link["Capacity"],
"FreeFlowSpeed": link["FreeFlowSpeed"]
})
# 将数据转换为DataFrame
import pandas as pd
df_nodes = pd.DataFrame(node_data)
df_links = pd.DataFrame(link_data)
# 导出节点数据为Shapefile
import geopandas as gpd
from shapely.geometry import Point
geometry = [Point(xy) for xy in zip(df_nodes["X"], df_nodes["Y"])]
gdf_nodes = gpd.GeoDataFrame(df_nodes, geometry=geometry)
nodes_shapefile_path = r"C:\Path\To\Your\Nodes.shp"
gdf_nodes.to_file(nodes_shapefile_path)
# 导出路段数据为Shapefile
from shapely.geometry import LineString
geometry = []
for i in range(len(df_links)):
from_node = df_nodes[df_nodes["NodeID"] == df_links["FromNode"][i]][["X", "Y"]].values[0]
to_node = df_nodes[df_nodes["NodeID"] == df_links["ToNode"][i]][["X", "Y"]].values[0]
geometry.append(LineString([from_node, to_node]))
gdf_links = gpd.GeoDataFrame(df_links, geometry=geometry)
links_shapefile_path = r"C:\Path\To\Your\Links.shp"
gdf_links.to_file(links_shapefile_path)
# 保存模型
visum.SaveVersion(model_path)
结论
Visum的接口功能为用户提供了极大的灵活性,使得交通规划和仿真工作可以更加高效和准确。通过数据导入导出、脚本编写以及与其他交通仿真软件的接口,用户可以充分利用Visum的强大功能,同时结合其他软件的优势,实现更复杂的分析和数据处理任务。希望本节的内容能够帮助用户更好地理解和使用Visum的接口功能,提升交通规划仿真工作的水平。
663

被折叠的 条评论
为什么被折叠?



