目 录
- 一、前言
- 二、读取SAP模型数据
- 2.1 数据结构
- 2.2 表格信息
- 2.3 单位制
- 2.3 材料属性
- 2.4 框架截面属性
- 2.5 面截面属性
- 2.6 节点对象
- 2.7 框架对象
- 2.8 面对象
- 2.9 框架均布荷载
- 2.10 面均布荷载
- 2.11 边界条件
- 2.10 数据的精加工
- 2.11 创建csv文件
- 三、创建CAD图形
- 四、创建Abaqus模型
- 五、创建ANSYS模型
- 六、尾声
- 七、参考文献
一、前言
当保存模型时,SAP2000 将自动将模型文本文件存成一个后缀为 .$2k 的文件,它与模型数据 .sdb 保存的同时进行保存。如果由于一些原因不能打开模型 .sdb文件时, 可以试着导入 .$2k 文件。.$2k 文本文件只是用于分析目的或者在特殊情况下复原模型,并且它不是数据库文件可替代文件。不包含所有模型信息。
从一个给定的 SAP2000 模型可以导出任意多个文件。每个文件可以包含不同的表格并且可以应用于模型不同部分。这个文件可以被其它程序使用,进行修改后再次导入到 SAP2000 程序中,或用于其它的目的。s2k 文件便是其中之一,s2k 文件即SAP2000 数据库文本 (.s2k) 文件,它是从 SAP 输出的纯文本文件。
.$2k 或 .s2k 文件是 SAP2000 文本文件,它们的格式是完全一致的,工程师可以用 写字板、记事本 等文字处理软件打开,对其中的内容进行修改,然后再用 SAP2000 导入,可以实现对模型的修改。
$2k 在模型数据 .sdb 保存时自动创建,s2k 需手动导出。
SAP2000版本:SAP2000 v22.0.0 。
二、读取SAP模型数据
从 .$2k 文件中可获取 SAP 模型的绝大部分信息,如点对象的标签和坐标,框架对象的起点标签、终点标签、截面指定和局部轴方向等,材料属性,截面属性等等。
本文以如下图所示的 SAP 模型为例,通过 Python 编程读取其 s2k 文件数据,并对模型数据进行处理,完成对模型基本信息的分类,生成相应的 csv 文件,以方便在其他软件中复建该模型。
值得说明的是,为了适配更多版本的 s2k 文件,本文中很多 Pyhton 代码显得不是那么高明,甚至笨重啰嗦。但这些代码绝对逻辑清楚,考虑全面,通用性较强,容错能力优秀,提示信息简洁明了。如您有什么建议,还请不吝赐教,邮箱: liyang@alu.hit.edu.cn 。
本文程序以准确获取模型信息,适配尽可能多版本的 s2k 文件为主要目标,代码运行效率是否最优并不重要。速度不重要,准确最重要。
CADmep19x64.arx 此问题待解决。
#!/usr/bin/env python
# -*- coding: utf-8 -*-'''
=============================
Author: DalNur
Email: liyang@alu.hit.edu.cn
=============================
'''import os
import res2kname = "GG-JB.s2k" # s2k文件名称
currdir = os.getcwd() # 当前工作目录
s2kpath = currdir + "\\" + s2knames2kpath = r"D:\GTC\GG-JB.s2k" # s2k文件绝对路径
2.1 数据结构
从 s2k 文件内读取的各种模型信息,按类别存储在以下几个 Python 字典中, 用于存储节点对象信息的字典 jointObjs , 用于存储框架对象信息的字典 frameObjs , 用于存储面对象信息的字典 areaObjs , 用于存储材料属性信息的字典 matProps , 用于存储框架对象截面指定信息的字典 frameSecProps , 用于存储面对象截面指定信息的字典 areaSecProps, 用于存储框架对象 (均布) 荷载指定信息的字典 frameLoads, 用于存储面对象 (均布) 荷载指定信息的字典 areaLoads, 以及用于定位以上各种信息在 s2k 文件中的位置的字典 tables 。
字典名称 | 类别 |
---|---|
tables | 表格 |
matProps | 材性 |
frameSecProps | 框架截面 |
areaSecProps | 面截面 |
jointObjs | 点 |
frameObjs | 线 |
areaObjs | 面 |
frameLoads | 框架荷载 |
areaLoads | 面荷载 |
tables = {} # 表格信息定位
matProps = {} # 材料属性
frameSecProps, areaSecProps = {}, {} # 框架截面属性/面截面属性
jointObjs, frameObjs, areaObjs = {}, {}, {} # 点对象/框架对象/面对象
frameLoads, areaLoads = {}, {} # 框架对象荷载/面对象荷载
- 表格信息定位字典的数据结构
tables = {'TABLE: "PROGRAM CONTROL"': [4, 5], 'TABLE: "ACTIVE DEGREES OF FREEDOM"': [8, 8],'TABLE: "ANALYSIS OPTIONS"': [11, 11],. . . . . .'TABLE: "OPTIONS - COLORS - DISPLAY"': [75786, 75794],'TABLE: "OPTIONS - COLORS - OUTPUT"': [75797, 75805],'TABLE: "DATABASE FORMAT TYPES"': [75808, 75808],'TABLE: "PROJECT INFORMATION"': [75811, 75823]}
- 材料属性字典的数据结构
matProps = {'C30B': [1, 'Concrete', 'Isotropic', 2500.0, 30000000000.0, 12000000000.0, 0.25],. . . . . .'HPB300': [6, 'Rebar', 'Uniaxial', 7999.999999999999, 200000000000.0, 0, 0],. . . . . .'JTG-fpk1470': [8, 'Tendon', 'Uniaxial', 7849.999999999999, 195000000000.0, 0, 0],. . . . . .'Q235B': [9, 'Steel', 'Isotropic', 7799.999999999999, 206000000000.0, 79230769230.76921,0.3],. . . . . .'RIGIDBAR': [11, 'Other', 'Isotropic', 0.0, 2.8e+19, 1.4e+19, 0.0]}
- 框架截面字典的数据结构
frameSecProps = {'B1000X300X8X8XXQ80211B': [1, 'Q80211B', 'Box/Tube', 1.0, 0.3, 0.008, 0.008, 'Null', 'Null',0.020544, 0.001046, 0.002451, 0.000372, 0.0, 0.016, 0.0048, 0.004903,0.002478, 0.006254, 0.002659, 0.345423, 0.134507],. . . . . .'B600X200X10X10XXQ80211B': [29, 'Q80211B', 'Box/Tube', 0.6, 0.2, 0.01, 0.01, 'Null', 'Null',0.0156, 0.000322, 0.000673, 0.000118, 0.0, 0.012, 0.004, 0.002244,0.001181, 0.002862, 0.001302, 0.207754, 0.087016],. . . . . .'RIGIDBAR': [61, 'RIGIDBAR', 'Rectangular', 0.1, 0.1, 'Null', 'Null', 'Null', 'Null', 0.01,1.4e-05, 8e-06, 8e-06, 0.0, 0.008333, 0.008333, 0.000167, 0.000167, 0.00025,0.00025, 0.028868, 0.028868]}
- 面截面字典的数据结构
areaSecProps = {'RIG1000C35F': [1, 'C35F', 'Shell', 'Shell-Thick', 1.0],. . . . . .'RIG200C35F': [6, 'C35F', 'Shell', 'Shell-Thick', 0.2],. . . . . .'W500C40W': [11, 'C40W', 'Shell', 'Shell-Thick', 0.5]}
- 点对象字典的数据结构
jointObjs = {'2001902': [1, 'GLOBAL', 'Cartesian', 305.969, 91.824, 10.0],. . . . . .'4010545': [1682, 'GLOBAL', 'Cartesian', 93.291, 79.807, 0.928],. . . . . .'13001829': [3228, 'GLOBAL', 'Cartesian', 145.551, 55.207, 8.0]}
- 框架对象字典的数据结构
frameobjs = {'3000092': [1, '3000170', '3000171', 'B1200X600JXC35B', 0],. . . . . .'4009829': [1363, '4003302', '4005181', 'B1500X1200JXC35B', 0],. . . . . .'13005362': [4048, '13001829', '13000323', 'B800X400X25X25XXQ80211B', 0]}
- 面对象字典的数据结构
areaObjs = {'3000265': [1, '4', ['3000093', '3006515', '3007425', '3003723'], 'W500C40W'],. . . . . .'4019731': [1509, '5', ['4005397', '4005286', '4002422', '4005394', '4005340'], 'RIG120C35F'],. . . . . .'12000129': [2063, '4', ['12000229', '12000230', '12000161', '12000160'], 'RIG120C35F']}
- 框架均布荷载字典的数据结构
frameLoads = {1: ['5000001', 'DEAD', 'GLOBAL', 'Force', 'Gravity', 6000.0],. . . . . .555: ['8000460', 'DEAD', 'GLOBAL', 'Force', 'Gravity', 6000.0],. . . . . .1151: ['13001199', 'DEAD', 'GLOBAL', 'Force', 'Gravity', 6000.0]}
- 面均布荷载字典的数据结构
2.2 表格信息
在 s2k 文件中,模型的各种信息按类存储在不同的表格内,如轴网信息位于 TABLE: “GRID LINES” 表格内,通用材料属性信息位于 TABLE: “MATERIAL PROPERTIES 01 - GENERAL” 表格内,如下图所示。
在更精确获取模型信息前,有必要知道该信息所属表格在 s2k 文件中的位置,这样有利于提高代码的运行效率,尽最大可能减少对 s2k 整个文件的遍历次数,获取 s2k 文件内各表格信息的 Python 代码如下。
tablenames, tablerows = [], [] # 表格名称及所在行号with open(s2kpath, "r", encoding='utf-8') as f:s2kdata = f.readlines() # 获取s2k文件内全部数据totallines = len(s2kdata) # s2k文件总行数row = 0 # 行号计数器target_string = "TABLE" # 目标字符串/待匹配字符串for line in s2kdata:row = row + 1......... for i in range(len(tablenames) - 1):tablename = tablenames[i]row1, row2 = tablerows[i]+1, tablerows[i + 1]-2tables[tablename] = [row1, row2]row1, row2 = tablerows[-1]+1, totallines-2
tables[tablenames[-1]] = [row1, row2]
tablenames, tablerows = 0, 0 # 释放内存print(tables)
由上述代码得到的表格信息字典 tables 如下图所示。字典 tables 的键名为每个表格的表头名称,如 TABLE: “PROGRAM CONTROL” 、TABLE: “GRID LINES” 等,与键名相对应的键值为该表格有效数据行在s2k文件中的位置信息,即始末行号,计数始于1。
如键名 TABLE: “PROGRAM CONTROL” 对应的键值为列表 [4,5],其含义为表格 TABLE: “PROGRAM CONTROL” 的有效数据行为 s2k 文件中的第 4 行数据到第 5 行数据,通过此方式便可引用 s2k 文件中任意一表格内的数据。
2.3 单位制
与 Abaqus、ANSYS 等有限元计算软件不同,在 SAP2000 中存在单位制,用户可在状态条最右侧的单位制下拉列表中选择模型所采用的单位制,用户切换当前单位制后,系统自动完成单位换算。
质量 | 长度 | 时间 | 力 | 压强/应力 | 能量 | 密度 | 弹性模量 |
---|---|---|---|---|---|---|---|
kg | m | s | N | Pa | J | kg/m3 | Pa |
t | mm | s | N | MPa | N-mm | t/mm3 | MPa |
1 k g / m 3 = 1 0 − 12 t / m m 3 1 kg/m^3 = 10^{-12} t/mm^3 1kg/m3=10−12t/mm3
为了规范有限元建模,同时也方便各软件间的数据交换,特此规定,无论原 SAP 模型采用何种单位制,通过 Python 处理后的模型信息均采用国际标准单位制:N-m-kg 。
通常情况下,在 SAP2000 中,工程师习惯采用 N-mm-t 单位制,而英制单位在我国不常用到,因此,本文所编写的 Python 程序,只识别 N-m-kg 和 N-mm-t 单位制,并实现 N-mm-t 向 N-m-kg 的自动换算,其他单位制,则视为非法单位,若被程序识别出,程序自动终止运行。
table = 'TABLE: "PROGRAM CONTROL"' # 表格名称
row1, row2 = tables[table] # 确定有效数据行起始位置
tabledata = s2kdata[row1-1:row2] # 表格有效数据行数据target_strings = ["Version", "CurrUnits"] # 待匹配字符串列表
result_strings = ["Null", "Null"] # 匹配成功后输出的等号后的字符串/Null用于占位/防止报错temp_line = [] # 多行数据合并为1行
for line in tabledata:line = line.strip() # 去掉尾部换行符号line = re.split(r" +", line) # 2个及以上空格分割字符temp_line = temp_line + linei = 0
for s in temp_line:target_string = target_strings[i].........version, currunits = result_strings
s2kname = s2kpath.split("\\")[-1]
s1 = "-->> File Name: %s." % s2kname
s2 = "-->> Total Lines: %s." % totallines
s3 = "-->> Program Name: SAP2000."
s4 = "-->> Version: %s." % version
s5 = "-->> Current Units: %s." % currunits
print("\n")
print(s1)
print(s2)
print(s3)
print(s4)
print(s5)
if currunits == '"N, mm, C"':sf = 0.001 # scale factor/缩放系数s6 = "-->> Scale Factor: %s." % sfprint(s6)print("\n")
elif currunits == '"N, m, C"':sf = 1.0 # scale factor/缩放系数s6 = "-->> Scale Factor: %s." % sfprint(s6)print("\n")
else:# pass/# 非法单位提示print("\n")s6 = "**** ERROR: Illegal units."s7 = 12 * " " + "Program termination."s8 = 12 * " " + "Please check the SAP model."print(s6)print(s7)print(s8)print("\n")exit() # 非法单位程序自动终止运行
- 示例
运行上述代码,可获取 GG-JB.s2k 文件的基本信息及单位制信息,并确定其向国际标准单位的单位换算系数,若原 SAP 模型的单位制为 N-mm-kg,则单位换算系数 sf = 0.001,若原 SAP 模型的单位制为 N-m-kg,则单位换算系数 sf = 1.0,除此之外,其他的任何单位制都被视为非法单位,本程序不识别,程序运行至此处自动终止。
2.3 材料属性
def get_material_properties(s2kdata, tables, sf=1.0):"""获取s2k文件内的材料属性,并将其存储到字典matProps中,返回值为材料属性字典matProps。:param s2kdata: s2k文件全部数据。:param tables: s2k文件表格信息字典。:param sf: 单位换算系数。"""matProps = {} # 材料属性字典table = 'TABLE: "MATERIAL PROPERTIES 01 - GENERAL"' # 表格名称row1, row2 = tables[table] # 确定有效数据行起始位置tabledata = s2kdata[row1 - 1:row2] # 表格有效数据行数据......... matProps[matname] = [matnum, mattype, symtype, "Null", "Null", "Null", "Null"]# 材料编号、材料种类、力学分类、质量密度、弹性模量、剪切模量、泊松比。table = 'TABLE: "MATERIAL PROPERTIES 02 - BASIC MECHANICAL PROPERTIES"' # 表格名称row1, row2 = tables[table] # 确定有效数据行起始位置tabledata = s2kdata[row1 - 1:row2] # 表格有效数据行数据......... matProps[matname][2:] = rho, e, g, nureturn matProps
- 示例
运行上述代码,可获取 GG-JB.s2k 文件内所定义的材料属性信息,并将其存储在 matProps 字典中,各种材性的单位采用国际标准单位,即 N-m-kg。
字典 matPropss 的键名为各材料的材料名称,如 C30B、C40B 等,与键名相对应的键值为该材料的基本属性信息,依次为:材料编号、材料种类 (混凝土、钢材、钢筋等)、材料力学分类 (各向同性、单轴受力等)、质量密度、弹性模量、剪切模量、泊松比。
2.4 框架截面属性
def get_frame_section_properties(s2kdata, tables, sf=1.0):"""获取s2k文件内的框架截面属性,并将其存储到字典frameSecProps中,返回值为框架截面属性字典frameSecProps。:param s2kdata: s2k文件全部数据。:param tables: s2k文件表格信息字典。:param sf: 单位换算系数。"""frameSecProps = {} # 框架截面属性字典table = 'TABLE: "FRAME SECTION PROPERTIES 01 - GENERAL"' # 表格名称row1, row2 = tables[table] # 确定有效数据行起始位置tabledata = s2kdata[row1 - 1:row2] # 表格有效数据行数据secnum = 0 # 截面编号计数器......... target_strings = ["Material", "Shape", "t3", "t2", "tf", "tw", "t2b", "tfb", "Area","TorsConst", "I33", "I22", "I23", "AS2", "AS3", "S33", "S22", "Z33","Z22", "R33", "R22"] # 待匹配字符串......... return frameSecProps
- 示例
运行上述代码,可获取 GG-JB.s2k 文件内所定义的框架截面属性信息,并将其存储在 frameSecProps 字典中,各种几何属性的单位采用国际标准单位,即 N-m-kg。
字典 frameSecProps 的键名为各框架截面的截面名称,如 B1000X500JXC35B 等,与键名相对应的键值为该框架截面的基本属性信息,依次为:框架截面编号、截面采用的材料名称、截面形状、垂直 3 轴方向上的截面尺寸、垂直 2 轴方向上的截面尺寸、上翼缘厚度、腹板厚度、下翼缘宽度、下翼缘厚度、横截面积、扭转常数、截面对局部 3 轴的惯性矩、截面对局部 2 轴的惯性矩、截面惯性积、2 方向上的剪切面积、3 方向上的剪切面积、截面对局部 3 轴的截面模量、截面对局部 2 轴的截面模量、截面对局部 3 轴的塑性截面模量、截面对局部 2 轴的塑性截面模量、截面对局部 3 轴的回转半径、截面对局部 2 轴的回转半径。
2.5 面截面属性
def get_area_section_properties(s2kdata, tables, sf=1.0):"""获取s2k文件内的面截面属性,并将其存储到字典areaSecProps中,返回值为面截面属性字典areaSecProps。:param s2kdata: s2k文件全部数据。:param tables: s2k文件表格信息字典。:param sf: 单位换算系数。"""areaSecProps = {} # 框架截面属性字典table = 'TABLE: "AREA SECTION PROPERTIES"' # 表格名称row1, row2 = tables[table] # 确定有效数据行起始位置tabledata = s2kdata[row1 - 1:row2] # 表格有效数据行数据secnum = 0 # 截面编号计数器......... target_strings = ["Material", "AreaType", "Type", "Thickness"] # 待匹配字符串sfs = [None, None, None, sf] # 单位换算系数......... result = round(float(result) * sf, 6) # 单位换算areaSecProps[secname][i + 1] = resultreturn areaSecProps
- 示例
运行上述代码,可获取 GG-JB.s2k 文件内所定义的面截面属性信息,并将其存储在 areaSecProps 字典中,各种几何属性的单位采用国际标准单位,即 N-m-kg。
字典 areaSecProps 的键名为各面截面的截面名称,如 RIG1000C35F、RIG100C35F 等,与键名相对应的键值为该面截面的基本属性信息,依次为:面截面编号、面截面类型 (壳、平面、轴对称实体) 、计算类型 (厚壳、薄壳、厚板、薄板、膜等)、面截面的厚度。
2.6 节点对象
def get_joint_objects(s2kdata, tables, sf=1.0):"""获取s2k文件内的节点对象相关信息,并将其存储到字典jointObjs中,返回值为结点对象信息字典jointObjs。:param s2kdata: s2k文件全部数据。:param tables: s2k文件表格信息字典。:param sf: 单位换算系数。"""jointObjs = {} # 框架截面属性字典table = 'TABLE: "JOINT COORDINATES"' # 表格名称row1, row2 = tables[table] # 确定有效数据行起始位置tabledata = s2kdata[row1 - 1:row2] # 表格有效数据行数据jointnum = 0 # 结点编号计数器......... num = len(jointObjs)s = "Joints Number: %s." % numprint(s)return jointObjs
- 示例
运行上述代码,可获取 GG-JB.s2k 文件内所定义的各节点对象信息,并将其存储在 jointObjs 字典中,各节点坐标值的单位采用国际标准单位 m 。
字典 jointObjs 的键名为各节点对象的标签名称,如 2001902、2001903 等,与键名相对应的键值为该节点对象的基本信息,依次为: 结点编号、结点所采用的坐标系名称、坐标系类型 (笛卡尔、柱坐标、球坐标) 、全局坐标值 x 、全局坐标值 y 、全局坐标值 z 。
2.7 框架对象
def get_frame_objects(s2kdata, tables):"""获取s2k文件内的框架对象相关信息,并将其存储到字典frameObjs中,返回值为框架对象信息字典frameObjs。:param s2kdata: s2k文件全部数据。:param tables: s2k文件表格信息字典。"""frameObjs = {} # 框架截面属性字典table = 'TABLE: "CONNECTIVITY - FRAME"' # 表格名称row1, row2 = tables[table] # 确定有效数据行起始位置tabledata = s2kdata[row1 - 1:row2] # 表格有效数据行数据framenum = 0 # 框架编号计数器......... s = "Frames Number: %s." % framenumprint(s)return frameObjs
- 示例
运行上述代码,可获取 GG-JB.s2k 文件内所定义的各框架对象信息,并将其存储在 frameObjs 字典中,框架对象信息的相关单位采用国际标准单位,即 N-m-kg 。
字典 frameObjs 的键名为各框架对象的标签名称,如 3000092、3000093 等,与键名相对应的键值为该框架对象的基本信息,依次为: 框架编号 (始于1/ANSYS)、框架起点标签、框架终点标签、框架所采用的截面名称、局部轴转角。
2.8 面对象
def get_area_objects(s2kdata, tables):"""获取s2k文件内的面对象相关信息,并将其存储到字典areaObjs中,返回值为面对象信息字典areaObjs。:param s2kdata: s2k文件全部数据。:param tables: s2k文件表格信息字典。"""areaObjs = {} # 框架截面属性字典table = 'TABLE: "CONNECTIVITY - AREA"' # 表格名称row1, row2 = tables[table] # 确定有效数据行起始位置tabledata = s2kdata[row1 - 1:row2] # 表格有效数据行数据areanum = 0 # 面对象编号计数器for line in tabledata:line = line.strip() # 去掉尾部换行符号line = re.split(r" +", line) # 2个及以上空格分割字符joint_labels, secname = [], "Null" # 组成面对象的节点标签、面对象所采用的截面名称label = re.split(r"=+", line[0])[-1] # 至少一个等号分割字符/获得面对象标签match = re.match("NumJoints", line[1]) # 匹配面对象包含的节点个数......... return areaObjs
- 示例
运行上述代码,可获取 GG-JB.s2k 文件内所定义的各面对象信息,并将其存储在 areaObjs 字典中,面对象信息的相关单位采用国际标准单位,即 N-m-kg 。
字典 areaObjs 的键名为各面对象的标签名称,如 12000123、12000129 等,与键名相对应的键值为该框架对象的基本信息,依次为: 面的编号 (始于1/ANSYS)、面对象所包含的节点个数、各点标签、面对象所采用的截面名称。
2.9 框架均布荷载
在 SAP2000 中,对于框架填充墙或者设备荷载的处理,一般将其自重转化为线荷载指定给梁。
def get_frame_loads(s2kdata, tables, sf):"""获取s2k文件内的框架对象荷载信息,并将其存储到字典frameLoads中,返回值为框架荷载信息字典frameLoads。:param s2kdata: s2k文件全部数据。:param tables: s2k文件表格信息字典。:param sf: 单位换算系数。"""frameLoads = {} # 框架对象荷载信息字典table = 'TABLE: "FRAME LOADS - DISTRIBUTED"' # 表格名称row1, row2 = tables[table] # 确定有效数据行起始位置tabledata = s2kdata[row1 - 1:row2] # 表格有效数据行数据loadnum = 0 # 荷载编号计数器for line in tabledata:......... s = "Frame Loads Number: %s." % loadnumprint(s)return frameLoads
- 示例
运行上述代码,可获取 GG-JB.s2k 文件内所定义的作用在框架对象上的均布荷载信息,并将其存储在 frameLoads 字典中,荷载信息的相关单位采用国际标准单位,即 N-m-kg 。
字典 frameLoads 的键名为框架均布荷载编号 (始于1/ANSYS),如 1、2 等,与键名相对应的键值为作用在该框架上的均布荷载信息,依次为: 框架标签、荷载模式 (恒活、活荷等)、采用的坐标系、荷载类型 (力/力矩)、荷载作用方向、作用在框架上的均布荷载数值。
因为作用在框架上的荷载不止一种,方向也不止一个,因此,很难用框架标签作为框架均布荷载字典的键名,来对作用在框架上的均布荷载进行区分。另外,由此段代码得到的是作用在框架对象全跨上的均布荷载,全跨梯形分布荷载自动进行换算,分段梯形分布荷载自动被过滤掉,不在考虑范围内。
2.10 面均布荷载
在 SAP2000 中,面对象的分布荷载主要有两种施加方式: 面均布荷载和面荷载均匀导荷到框架。后者自动将均匀面荷载转化为等效线荷载作用于面周边的框架单元,从而实现面对象的自动导荷。
def get_area_loads(s2kdata, tables, sf):"""获取s2k文件内的面对象荷载信息,并将其存储到字典areaLoads中,返回值为面荷载信息字典areaLoads。:param s2kdata: s2k文件全部数据。:param tables: s2k文件表格信息字典。:param sf: 单位换算系数。"""areaLoads = {} # 框架对象荷载信息字典table1 = 'TABLE: "AREA LOADS - UNIFORM"' # 表格名称table2 = 'TABLE: "AREA LOADS - UNIFORM TO FRAME"' # 表格名称row1, row2 = tables[table1] # 确定有效数据行起始位置tabledata1 = s2kdata[row1 - 1:row2] # 表格有效数据行数据row1, row2 = tables[table2] # 确定有效数据行起始位置tabledata2 = s2kdata[row1 - 1:row2] # 表格有效数据行数据tabledata = tabledata1 + tabledata2 # 两个表格数据合并loadnum = 0 # 荷载编号计数器......... s = "Area Loads Number: %s." % loadnumprint(s)return areaLoads