目 录
Blog Links
一、前言
SAP2000 (Structure Analysis Program 2000) 是由美国 Computer and Structure Inc.(CSI) 公司开发研制的通用结构分析与设计软件,在世界范围内应用广泛。从简单的二维框架静力分析到复杂的三维非线性动力分析,SAP2000是最容易的和最高效的结构分析与设计解决方案。
从一个给定的 SAP2000 模型可以导出任意多个文件。每个文件可以包含不同的表格并且可以应用于模型不同部分。这个文件可以被其它程序使用,进行修改后再次导入到 SAP2000 程序中,或用于其它的目的。s2k 文件便是其中之一,s2k 文件即 SAP2000 数据库文本 (.s2k) 文件,它是从 SAP 输出的纯文本文件。
反过来,我们还可以通过在 SAP2000 中导入 s2k 文件来实现模型的创建,而 s2k 文件可通过 Python 语言快速创建,建模所需的输入信息可来自用户自定义的 csv 文件。我们采用 Python 语言创建 s2k 文件的目的是实现任意结构模型的基本信息在 SAP2000 中的复建,而不是所有信息的复建。这些基本信息主要包括:框架对象、面对象、体对象、材料属性、截面属性和分组等。
s2k 文件不是脚本文件,书写 s2k 文件也不是编程,它只是记录模型信息的一个文本文件,常见的文本编辑器如 UltraEdit 等均可对其进行修改和编辑,s2k 文件内 几乎 记录着 SAP 模型的全部信息。本文主要利用 Python 语言,将 s2k 文件内主要信息的创建程序化,以实现模型创建的自动化。
二、s2k文件数据库
2.1 数据库结构
s2k 文件内的数据以 Table 形式顺序排列,如 TABLE: “PROGRAM CONTROL” 用于定义模型的当前单位制等,TABLE: “GRID LINES” 用于定义模型的轴网等。为了方便 s2k 文件的创建,我们实现定义一个名为 s2kDatabase 的字典,将其作为 s2k 内信息存储的数据库,它的键名即为各 Table 名称,它的键值为相应的数据。
因某些属性的定义比较复杂且通用性不强,如部分材料属性、部分框架截面属性等,为了防止报错,我们可事先创建默认的材料属性和框架截面。同时,为了方便在 SAP2000 中的操作对象材料的指定、截面的指定,我们可在 s2k 文件中定义好各对象的分组信息,如相同截面的对象放置到一个组(Group)内。SAP2000 中的组(Group)就相当于 Abaqus 中的集合(Set)、ANSYS中的组件(Component)。
2.2 默认Table的创建
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
=================================
Author: DalNur/LiYang
Email: liyang@alu.hit.edu.cn
Date: 2021/09/18 11:11:59 Beijing
=================================
"""
s2kDatabase = {} # SAP2000 s2k 文件数据库
s2kDatabase = {"JOINT COORDINATES": [], "CONNECTIVITY - FRAME": [], "CONNECTIVITY - AREA": [],
"CONNECTIVITY - SOLID": [], "GROUPS 1 - DEFINITIONS": [], "GROUPS 2 - ASSIGNMENTS": []}
"01-标题数据块"
s2kDatabase["Heading"] = ["File E:\SAPWorkDir\JN-GTC.s2k was saved on m/d/yy at h:mm:ss",
"Hello, world! This s2k file was created by python.",
"Author: DalNur/LiYang; Email: liyang@alu.hit.edu.cn",
"Time: 2021-09-18 11:11:59."] # 标题
"02-项目数据块"
s2kDatabase["PROGRAM CONTROL"] = [' ProgramName=SAP2000 Version=21.0.2 CurrUnits="N, m, C"',] # 软件版本与单位制
"03-坐标系数据块"
s2kDatabase["COORDINATE SYSTEMS"] = [
' Name=GLOBAL Type=Cartesian X=0 Y=0 Z=0 AboutZ=0 AboutY=0 AboutX=0',] # 坐标系
三、属性
为了防止报错,我们预先创建默认材料 DalNur、默认框架截面 DalNur 和默认板壳截面 DalNur ,本文中所有默认属性的名称均为 DalNur 。
3.1 材料属性
"04-默认材料属性数据块"
s2kDatabase["MATERIAL PROPERTIES 01 - GENERAL"] = [
" Material=DalNur Type=Steel SymType=Isotropic TempDepend=No Color=Blue",]
s2kDatabase["MATERIAL PROPERTIES 02 - BASIC MECHANICAL PROPERTIES"] = [
" Material=DalNur UnitWeight=76970 UnitMass=7849 E1=200000000000 G12=76923076923.0769 U12=0.3 A1=6.5E-06",]
s2kDatabase["MATERIAL PROPERTIES 03A - STEEL DATA"] = [
" Material=DalNur Fy=345000000 Fu=490000000 EffFy=379500000 EffFu=539000000 SSCurveOpt=Simple SSHysType=Kinematic SHard=0.015 SMax=0.11 SRup=0.17 FinalSlope=-0.1",]
s2kDatabase["MATERIAL PROPERTIES 06 - DAMPING PARAMETERS"] = [
" Material=DalNur ModalRatio=0 VisMass=0 VisStiff=0 HysMass=0 HysStiff=0",]
3.2 框架截面
"05-1 默认框架截面属性数据块"
s2kDatabase["FRAME SECTION PROPERTIES 01 - GENERAL"] = [
" SectionName=DalNur Material=DalNur Shape=Pipe t3=0.1024 tw=0.007 Area=0.00209795557406726 TorsConst=4.79915729390183E-06 I33=2.39957864695091E-06 I22=2.39957864695091E-06 I23=0 AS2=0.00105273612350364 _",
" AS3=0.00105273612350364 S33=4.686677044826E-05 S22=4.686677044826E-05 Z33=6.38224533333333E-05 Z22=6.38224533333333E-05 R33=0.0338196688333875 R22=0.0338196688333875 ConcCol=No ConcBeam=No Color=Blue _",
" TotalWt=0 TotalMass=0 FromFile=No AMod=1 A2Mod=1 A3Mod=1 JMod=1 I2Mod=1 I3Mod=1 MMod=1 WMod=1"]
3.3 板壳截面
"05-2 默认板壳截面属性数据块"
s2kDatabase["AREA SECTION PROPERTIES"] = [
" Section=DalNur Material=DalNur MatAngle=0 AreaType=Shell Type=Shell-Thin DrillDOF=Yes Thickness=0.1024 BendThick=0.1024 Color=Blue F11Mod=1 F22Mod=1 F12Mod=1 M11Mod=1 M22Mod=1 M12Mod=1 V13Mod=1 V23Mod=1 _",
" MMod=1 WMod=1", ]
3.4 实体截面
"05-3 默认实体截面属性数据块"
s2kDatabase["SOLID PROPERTY DEFINITIONS"] = [
" SolidProp=DalNur Material=DalNur MatAngleA=0 MatAngleB=0 MatAngleC=0 InComp=Yes Color=Blue TotalWt=0 TotalMass=0", ]
四、对象
在 SAP2000 中,主要有节点对象(Joint)、框架对象(Frame)、面对象(Area)和实体对象(Solid)等,即分别与几何中的点、线、面和体相对应。由点连线,由点成面、由点建体,显然,在 SAP2000 中,点对象是最基本的对象元素。
4.1 节点对象
现定义 Python 函数 create_joint_objects 用于快速实现在 s2k 文件中定义点对象,它需要一个输入参数 joints,joints 为节点对象信息二元列表,其内每个元素为记录单个点对象信息的子列表,子列表内的元素依次表示为节点标签、定义该节点的坐标系名称、坐标系类型、节点 x 坐标、节点 y 坐标和节点 z 坐标。
def create_joint_objects(joints):
# 作者:DalNur;邮箱:liyang@alu.hit.edu.cn
# 功能:创建节点对象
# 参数:joints为节点信息列表,其内元素为单个结点对象信息列表,依次表示节点标签、坐标系名称、坐标系类型、点的三个坐标值。
# 返回:无
# jointnum = len(joints) # 节点总数
# dictkeys = s2kDatabase.keys() # 字典键名
for joint in joints:
label, coordcsys, coordtype, x, y, z = joint[0], joint[1], joint[2], joint[3], joint[4], joint[5]
# 节点标签、坐标系编号、坐标系类型、坐标值
coordSys, coordType = ["GLOBAL", ], ["Cartesian", ]
if coordcsys not in coordSys:
coordcsys = "GLOBAL"
if coordtype not in coordType:
coordtype = "Cartesian"
s = " Joint=%s CoordSys=%s CoordType=%s XorR=%s Y=%s Z=%s" % (label, coordcsys, coordtype, x, y, z)
global s2kDatabase # 全局变量/s2k文件数据库
s2kDatabase["JOINT COORDINATES"].append(s)
以下示例代码用于定义创建简易框架结构所必须的 18 个节点对象,该框架结构的长度、宽度和高度依次为 20 m,10 m 和 5 m。18 个节点对象的编号依次为 1~ 18,且在全局直角坐标系下定义。
length, width, height = 20, 10, 5
x1, x2 = -0.5 * length, 0.5 * length
y1, y2 = -0.5 * width, 0.5 * width
z1, z2 = 0, height
joint1 = [1, "GLOBAL", "Cartesian", x1, y2, z1] # 1号节点
joint2 = [2, "GLOBAL", "Cartesian", x1, y1, z1] # 2号节点
joint3 = [3, "GLOBAL", "Cartesian", x2, y1, z1] # 3号节点
joint4 = [4, "GLOBAL", "Cartesian", x2, y2, z1] # 4号节点
joint5 = [5, "GLOBAL", "Cartesian", x1, y2, z2] # 5号节点
joint6 = [6, "GLOBAL", "Cartesian", x1, y1, z2] # 6号节点
joint7 = [7, "GLOBAL", "Cartesian", x2, y1, z2] # 7号节点
joint8 = [8, "GLOBAL", "Cartesian", x2, y2, z2] # 8号节点
joint9 = [9, "GLOBAL", "Cartesian", x1, 0, z2] # 9号节点
joint10 = [10, "GLOBAL", "Cartesian", 0, y1, z2] # 10号节点
joint11 = [11, "GLOBAL", "Cartesian", x2, 0, z2] # 11号节点
joint12 = [12, "GLOBAL", "Cartesian", 0, y2, z2] # 12号节点
joint13 = [13, "GLOBAL", "Cartesian", 0, 0, z2] # 13号节点
joint14 = [14, "GLOBAL", "Cartesian", 0, 0, z1] # 14号节点
joint15 = [15, "GLOBAL", "Cartesian", x1, 0, z1] # 15号节点
joint16 = [16, "GLOBAL", "Cartesian", 0, y1, z1] # 16号节点
joint17 = [17, "GLOBAL", "Cartesian", x2, 0, z1] # 17号节点
joint18 = [18, "GLOBAL", "Cartesian", 0, y2, z1] # 18号节点
joints = [joint1, joint2, joint3, joint4, joint5, joint6, joint7,
joint8, joint9, joint10, joint11, joint12, joint13,
joint14, joint15, joint16, joint17, joint18, ]
create_joint_objects(joints) # 写入数据库
4.2 框架对象
现定义 Python 函数 create_frame_objects 用于快速实现在 s2k 文件中定义直线框架对象,它需要一个输入参数 frames,frames 为框架对象信息二元列表,其内每个元素为记录单个框架对象信息的子列表,子列表内的元素依次表示为框架标签、框架的起节点的标签和框架的终节点的标签。
def create_frame_objects(frames):
# 作者:DalNur;邮箱:liyang@alu.hit.edu.cn
# 功能:创建框架对象/直线框架
# 参数:frames为框架对象信息列表,其内元素为单个框架对象信息列表,依次表示框架编号、框架起点编号、框架终点编号
# 返回:无
for frame in frames:
label, joini, jointj = frame[0], frame[1], frame[2] # 框架编号、框架起点编号、框架终点编号
s = " Frame=%s JointI=%s JointJ=%s" % (label, joini, jointj)
global s2kDatabase # 全局变量/s2k文件数据库
s2kDatabase["CONNECTIVITY - FRAME"].append(s)
以下示例代码用于定义示例框架结构中的框架对象,共 21 个框架对象,框架的编号为 1 ~ 21 。
frame1 = [1, 1, 5] # 1号框架/框架起点编号1/框架终点编号5
frame2 = [2, 2, 6] # 2号框架/框架起点编号2/框架终点编号6
frame3 = [3, 3, 7] # 3号框架/框架起点编号3/框架终点编号7
frame4 = [4, 4, 8] # 4号框架/框架起点编号4/框架终点编号8
frame5 = [5, 5, 9] # 5号框架/框架起点编号5/框架终点编号9
frame6 = [6, 9, 6] # 6号框架/框架起点编号9/框架终点编号6
frame7 = [7, 6, 10] # 7号框架/框架起点编号6/框架终点编号10
frame8 = [8, 10, 7] # 8号框架/框架起点编号10/框架终点编号7
frame9 = [9, 7, 11] # 9号框架/框架起点编号7/框架终点编号11
frame10 = [10, 11, 8] # 10号框架/框架起点编号11/框架终点编号8
frame11 = [11, 8, 12] # 11号框架/框架起点编号8/框架终点编号12
frame12 = [12, 12, 5] # 12号框架/框架起点编号12/框架终点编号5
frame13 = [13, 9, 13] # 13号框架/框架起点编号9/框架终点编号13
frame14 = [14, 13, 11] # 14号框架/框架起点编号13/框架终点编号11
frame15 = [15, 10, 13] # 15号框架/框架起点编号4/框架终点编号13
frame16 = [16, 13, 12] # 16号框架/框架起点编号13/框架终点编号12
frame17 = [17, 14, 13] # 17号框架/框架起点编号14/框架终点编号13
frame18 = [18, 15, 9] # 18号框架/框架起点编号15/框架终点编号9
frame19 = [19, 16, 10] # 19号框架/框架起点编号16/框架终点编号10
frame20 = [20, 17, 11] # 20号框架/框架起点编号17/框架终点编号11
frame21 = [21, 18, 12] # 21号框架/框架起点编号18/框架终点编号12
frames = [frame1, frame2, frame3, frame4, frame5, frame6, frame7, frame8,
frame9, frame10, frame11, frame12, frame13, frame14, frame15,
frame16, frame17, frame18, frame19, frame20, frame21, ]
create_frame_objects(frames) # 写入数据库
4.3 平面对象
现定义 Python 函数 create_area_objects 用于快速实现在 s2k 文件中定义平面对象,它需要一个输入参数 areas,areas 为面对象信息二元列表,其内每个元素为记录单个平面对象信息的子列表,子列表内的元素依次表示为平面的标签、按顺/逆时针排列的组成面对象的节点标签。
def create_area_objects(areas):
# 作者:DalNur;邮箱:liyang@alu.hit.edu.cn
# 功能:创建面对象/平面对象
# 参数:areas为框面对象信息列表,其内元素为单个面对象信息列表,依次表示面对象编号、组成面对象的结点标签(顺/逆时针排列)
# 返回:无
for area in areas:
arealabel = area[0] # 面对象的标签
jointlabels = area[1:] # 组成面对象的节点标签列表
numjoints = len(jointlabels)
rst1, rst2 = numjoints // 4, numjoints % 4 # 整数、余数
global s2kDatabase # 全局变量/s2k文件数据库
if rst1 == 0:
if rst2 == 3:
# 三角形板
joint1, joint2, joint3 = jointlabels[0], jointlabels[1], jointlabels[2]
s1 = " Area=%s NumJoints=3 Joint1=%s Joint2=%s Joint3=%s Order=1" % (arealabel, joint1, joint2, joint3)
s2kDatabase["CONNECTIVITY - AREA"].append(s1)
else:
joint1, joint2, joint3, joint4 = jointlabels[:4]
s1 = " Area=%s NumJoints=%s Joint1=%s Joint2=%s Joint3=%s Joint4=%s Order=1" % (arealabel, numjoints, joint1, joint2, joint3, joint4)
s2kDatabase["CONNECTIVITY - AREA"].append(s1)
for k in range(rst1 - 1):
i, j = int(4 * (k + 1)), int(4 * (k + 1) + 4)
joint1, joint2, joint3, joint4 = jointlabels[i:j]
s2 = " Area=%s Joint1=%s Joint2=%s Joint3=%s Joint4=%s Order=%s" % (arealabel, joint1, joint2, joint3, joint4, int(k+1))
s2kDatabase["CONNECTIVITY - AREA"].append(s2)
if rst2 > 0:
s3 = " Area=%s" % arealabel
for k in range(rst2):
index = int(-rst2 + k)
jointlabel = jointlabels[index]
s4 = " Joint%s=%s" % (int(k + 1), jointlabel)
s3 = s3 + s4
s3 = s3 + " Order=%s" % int(rst1 + 1)
s2kDatabase["CONNECTIVITY - AREA"].append(s3)
以下示例代码用于定义示例框架结构中的平面对象,共 2 个面对象,面对象的编号为 1 和 2 。
area1 = [1, 5, 9, 13, 12] # 1号面对象/组成节点编号5、9、13和12
area2 = [2, 10, 7, 11, 13] # 2号面对象/组成节点编号4、7、11和13
areas = [area1, area2]
create_area_objects(areas) # 写入数据库
4.4 实体对象
现定义 Python 函数 create_solid_objects 用于快速实现在 s2k 文件中定义体对象,它需要一个输入参数 solids,solids 为体对象信息二元列表,其内每个元素为记录单个体对象信息的子列表,子列表内的元素依次表示为体面的标签、顺序排列的组成体对象的节点标签。
def create_solid_objects(solids):
# 作者:DalNur;邮箱:liyang@alu.hit.edu.cn
# 功能:创建体对象/8节点体对象
# 参数:solids为体对象信息列表,其内元素为单个体对象信息列表,依次表示体对象的编号、组成体对象的结点标签(顺序排列)
# 返回:无
for solid in solids:
solidlabel = solid[0] # 体对象的标签
jointlabels = solid[1:] # 组成体对象的节点标签列表
numjoints = len(jointlabels)
global s2kDatabase # 全局变量/s2k文件数据库
if numjoints == 8:
joint1, joint2, joint3, joint4 = jointlabels[0], jointlabels[1], jointlabels[2], jointlabels[3]
joint5, joint6, joint7, joint8 = jointlabels[4], jointlabels[5], jointlabels[6], jointlabels[7]
s = " Solid=%s Joint1=%s Joint2=%s Joint3=%s Joint4=%s Joint5=%s Joint6=%s Joint7=%s Joint8=%s" % (solidlabel, joint1, joint2, joint3, joint4, joint5, joint6, joint7, joint8)
s2kDatabase["CONNECTIVITY - SOLID"].append(s)
以下示例代码用于定义示例框架结构中的体对象,共 1 个体对象,体对象的编号为 1001 。
solid1 = [1001, 14, 17, 18, 4, 13, 11, 12, 8] # 1号体对象/组成节点编号14、17、4、18、13、11、8和12
solids = [solid1, ]
create_solid_objects(solids) # 写入数据库
五、分组
采用 Python 语言直接创建 SAP2000 的 s2k 文件时,没必要为框架对象、面对象和实体对象赋予精确的截面属性,但为了方便在 SAP2000 软件中的建模工作,我们可预先将具有相同截面属性的对象分为一组,这样在 SAP 软件中可选中该组而后指定截面属性。SAP2000 中的组(Group)就相当于 Abaqus 中的集合(Set)、ANSYS中的组件(Component)。
5.1 创建节点对象组
def create_joints_group(groupname, joints=[]):
# 作者:DalNur;邮箱:liyang@alu.hit.edu.cn
# 功能:创建节点对象分组、组内对象皆为节点
# 参数:groupname为新建的组名称;joints为组内节点对象标签列表
# 返回:无
global s2kDatabase # 全局变量/s2k文件数据库
s1 = " GroupName=%s Selection=Yes SectionCut=Yes Steel=Yes Concrete=Yes Aluminum=Yes ColdFormed=Yes" \
" Stage=Yes Bridge=Yes AutoSeismic=No AutoWind=No SelDesSteel=No SelDesAlum=No SelDesCold=No _" % groupname
s2 = " MassWeight=Yes Color=Green"
s2kDatabase["GROUPS 1 - DEFINITIONS"].append(s1)
s2kDatabase["GROUPS 1 - DEFINITIONS"].append(s2)
for joint in joints:
s3 = " GroupName=%s ObjectType=Joint ObjectLabel=%s" % (groupname, joint)
s2kDatabase["GROUPS 2 - ASSIGNMENTS"].append(s3)
joints = [1, 2, 3, 4, 15, 16, 17, 18, 14]
groupname = "FrameBotJoints"
create_joints_group(groupname, joints) # 写入数据库
5.2 创建框架对象组
def create_frames_group(groupname, frames=[]):
# 作者:DalNur;邮箱:liyang@alu.hit.edu.cn
# 功能:创建框架对象分组、组内对象皆为框架
# 参数:groupname为新建的组名称;frames为组内框架对象标签列表
# 返回:无
global s2kDatabase # 全局变量/s2k文件数据库
s1 = " GroupName=%s Selection=Yes SectionCut=Yes Steel=Yes Concrete=Yes Aluminum=Yes ColdFormed=Yes" \
" Stage=Yes Bridge=Yes AutoSeismic=No AutoWind=No SelDesSteel=No SelDesAlum=No SelDesCold=No _" % groupname
s2 = " MassWeight=Yes Color=Green"
s2kDatabase["GROUPS 1 - DEFINITIONS"].append(s1)
s2kDatabase["GROUPS 1 - DEFINITIONS"].append(s2)
for frame in frames:
s3 = " GroupName=%s ObjectType=Frame ObjectLabel=%s" % (groupname, frame)
s2kDatabase["GROUPS 2 - ASSIGNMENTS"].append(s3)
frames = [5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]
groupname = "FrameBeamFrames"
create_frames_group(groupname, frames) # 写入数据库
5.3 创建平面对象组
def create_areas_group(groupname, areas=[]):
# 作者:DalNur;邮箱:liyang@alu.hit.edu.cn
# 功能:创建面对象分组、组内对象皆为面对象
# 参数:groupname为新建的组名称;areas为组内面对象标签列表
# 返回:无
global s2kDatabase # 全局变量/s2k文件数据库
s1 = " GroupName=%s Selection=Yes SectionCut=Yes Steel=Yes Concrete=Yes Aluminum=Yes ColdFormed=Yes" \
" Stage=Yes Bridge=Yes AutoSeismic=No AutoWind=No SelDesSteel=No SelDesAlum=No SelDesCold=No _" % groupname
s2 = " MassWeight=Yes Color=Green"
s2kDatabase["GROUPS 1 - DEFINITIONS"].append(s1)
s2kDatabase["GROUPS 1 - DEFINITIONS"].append(s2)
for area in areas:
s3 = " GroupName=%s ObjectType=Area ObjectLabel=%s" % (groupname, area)
s2kDatabase["GROUPS 2 - ASSIGNMENTS"].append(s3)
areas = [1, 2]
groupname = "FrameSlabAreas"
create_areas_group(groupname, areas) # 写入数据库
5.4 创建实体对象组
def create_solids_group(groupname, solids=[]):
# 作者:DalNur;邮箱:liyang@alu.hit.edu.cn
# 功能:创建体对象分组、组内对象皆为体对象
# 参数:groupname为新建的组名称;solids为组内体对象标签列表
# 返回:无
global s2kDatabase # 全局变量/s2k文件数据库
s1 = " GroupName=%s Selection=Yes SectionCut=Yes Steel=Yes Concrete=Yes Aluminum=Yes ColdFormed=Yes" \
" Stage=Yes Bridge=Yes AutoSeismic=No AutoWind=No SelDesSteel=No SelDesAlum=No SelDesCold=No _" % groupname
s2 = " MassWeight=Yes Color=Green"
s2kDatabase["GROUPS 1 - DEFINITIONS"].append(s1)
s2kDatabase["GROUPS 1 - DEFINITIONS"].append(s2)
for solid in solids:
s3 = " GroupName=%s ObjectType=Solid ObjectLabel=%s" % (groupname, solid)
s2kDatabase["GROUPS 2 - ASSIGNMENTS"].append(s3)
solids = [1001, ]
groupname = "FrameWallSolids"
create_solids_group(groupname, solids) # 写入数据库
六、s2k文件的总成
根据 s2k 文件数据库 s2kDatabase 内的数据,我们可以创建包含模型基本信息的 s2k 文件,将其导入到 SAP2000 中,可对模型进行进一步处理。实现这一功能的 Python 函数为 create_s2k_file,代码如下。
def create_s2k_file(path, data):
# 作者:DalNur;邮箱:liyang@alu.hit.edu.cn
# 功能:创建s2k文件
# 参数:path为创建的s2k文件绝对路径;data为s2k文件数据库。
# 返回:创建的s2k文件绝对路径。
import time
currtime = time.localtime()
currtime = time.strftime("%Y-%m-%d %H:%M:%S", currtime)
with open(path, 'w') as f:
# 01-书写标题数据块及项目控制数据块
dtname = "Heading"
line1 = data[dtname][0]
s1, s2 = "E:\SAPWorkDir\JN-GTC.s2k", path
line1.replace(s1, s2)
line2 = data[dtname][1]
line3 = data[dtname][2]
# line4 = data[dtname][3]
# s1, s2 = "2021-09-18 11:11:59", currtime
# line4.replace(s1, s2)
line4 = "Time: %s." % currtime
f.write(line1 + "\n") # 写入数据
f.write(line2 + "\n") # 写入数据
f.write(line3 + "\n") # 写入数据
f.write(line4 + "\n") # 写入数据
f.write("" + "\n") # 数据块尾部空行
dtname = "PROGRAM CONTROL"
f.write("TABLE: " + '"' + dtname + '"' + "\n") # 数据块表表头
for line in data[dtname]:
f.write(line + "\n") # 写入数据
f.write("" + "\n") # 数据块尾部空行
# 02-书写坐标系数据块
dtname = "COORDINATE SYSTEMS"
f.write("TABLE: " + '"' + dtname + '"' + "\n") # 数据块表表头
for line in data[dtname]:
f.write(line + "\n") # 写入数据
f.write("" + "\n") # 数据块尾部空行
# 03-书写默认材料属性数据块
dtnames = ["MATERIAL PROPERTIES 01 - GENERAL", "MATERIAL PROPERTIES 02 - BASIC MECHANICAL PROPERTIES",
"MATERIAL PROPERTIES 03A - STEEL DATA", ]
for dtname in dtnames:
f.write("TABLE: " + '"' + dtname + '"' + "\n") # 数据块表表头
for line in data[dtname]:
f.write(line + "\n") # 写入数据
f.write("" + "\n") # 数据块尾部空行
# 04-书写默认截面属性数据块
dtnames = ["FRAME SECTION PROPERTIES 01 - GENERAL", "AREA SECTION PROPERTIES", "SOLID PROPERTY DEFINITIONS", ]
for dtname in dtnames:
f.write("TABLE: " + '"' + dtname + '"' + "\n") # 数据块表表头
for line in data[dtname]:
f.write(line + "\n") # 写入数据
f.write("" + "\n") # 数据块尾部空行
# 05-书写对象数据块/点对象/面对象/体对象
dtnames = ["JOINT COORDINATES", "CONNECTIVITY - FRAME", "CONNECTIVITY - AREA", "CONNECTIVITY - SOLID"]
for dtname in dtnames:
if len(data[dtname]) > 0:
f.write("TABLE: " + '"' + dtname + '"' + "\n") # 数据块表表头
for line in data[dtname]:
f.write(line + "\n") # 写入数据
f.write("" + "\n") # 数据块尾部空行
# 06-书写对象分组数据块/点对象分组/面对象分组/体对象分组
dtnames = ["GROUPS 1 - DEFINITIONS", "GROUPS 2 - ASSIGNMENTS", ]
for dtname in dtnames:
if len(data[dtname]) > 0:
f.write("TABLE: " + '"' + dtname + '"' + "\n") # 数据块表表头
for line in data[dtname]:
f.write(line + "\n") # 写入数据
f.write("" + "\n") # 数据块尾部空行
return path
将以上本文所列出的所有 Python 代码放置到一个 py 文件内,并运行下列代码,将得到记录 SAP 模型基本信息的 s2k 文件,即 DalNur-20210922-153748.s2k。
path = r"E:\SAPWorkDir\DalNur-20210922-153748.s2k" # 新建s2k文件的绝对路径
data = s2kDatabase # s2k数据库
create_s2k_file(path, data)
将 DalNur-20210922-153748.s2k 文件导入到 SAP2000 中,完成导入前,将产生如下的日志信息,其内记录着导入过程中的一些报错和警告信息。单击 Done 按钮后,便可查看通过 Python 书写 s2k 文件而创建的 SAP 模型,如下图所示。
显然,采用本文的方式可实现绝大部分结构数值模型在 SAP2000 中的复建。基本思路是:用 csv 文件存储模型的基本信息,如对象的组成节点信息、对象分组信息等;以 Python 语言为媒介,读取 csv 文件内记录的模型信息,根据本文内各 Python 函数创建相应的 s2k 文件。再大胆一步,ANSYS、Abaqus、HyperMesh、FLAC3D、AutoCAD、AQWA 等软件创建的模型所对应的基本信息都可按同样的格式存储到 csv 文件中,利用 Python 语言读取这些信息,进而可实现在各软件中传递数据,最终实现同一模型在不同软件中的完美复建。
七、尾声
行文至此,自动化创建 SAP2000 s2k 文件的各主要 Python 函数已介绍完毕。
根据本文列出的各 Python 函数,稍作加工便可实现任意数值模型在 SAP2000 中的复建。
本文是本人 Python 自动化建模技术的重要组成部分,因此偏向于自下而上创建有限元模型。
本文的顺利完成,标志着博主在 Python 自动化建模技术方面近四年的努力取得阶段性胜利,相关工作亦接近尾声。
自 2014 年 4 月初开始逐步接触 SAP2000 软件以来,经过多年的不懈努力,
实现了从最初的人肉点鼠标到现在的全自动化建模的跨越。特此记录,借以总结,同时也能方便后学者。
如有疑问、合作需求及推荐工作,请联系邮件联系本人,Email: liyang@alu.hit.edu.cn 。
本文仅用于个人学习,除此之外,无其他任何用途。
因个人水平有限,文中难免有所疏漏,还请各位大神不吝批评指正。
胸藏文墨怀若谷,腹有诗书气自华,希望各位都能在知识的 pāo 子里快乐徜徉。
本文首次发表于 2021-09-23 00:21:11,Beijing 。
欢迎大家点赞、评论及转载,转载请注明出处!
为我打call,不如为我打款!
最后,祝各位攻城狮们,珍爱生命,保护发际线!