Python 语言创建 SAP2000 s2k 文件






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 文件不是脚本文件,书写 s2k 文件也不是编程,它只是记录模型信息的一个文本文件,常见的文本编辑器如 UltraEdit 等均可对其进行修改和编辑,s2k 文件内 几乎 记录着 SAP 模型的全部信息。本文主要利用 Python 语言,将 s2k 文件内主要信息的创建程序化,以实现模型创建的自动化。





二、s2k文件数据库


2.1 数据库结构


  s2k 文件内的数据以 Table 形式顺序排列,如 TABLE: “PROGRAM CONTROL” 用于定义模型的当前单位制等,TABLE: “GRID LINES” 用于定义模型的轴网等。为了方便 s2k 文件的创建,我们实现定义一个名为 s2kDatabase 的字典,将其作为 s2k 内信息存储的数据库,它的键名即为各 Table 名称,它的键值为相应的数据。



在这里插入图片描述


TABLE: "GRID LINES"



  因某些属性的定义比较复杂且通用性不强,如部分材料属性、部分框架截面属性等,为了防止报错,我们可事先创建默认的材料属性和框架截面。同时,为了方便在 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 为框架对象信息二元列表,其内每个元素为记录单个框架对象信息的子列表,子列表内的元素依次表示为框架标签、框架的起节点的标签和框架的终节点的标签。


在这里插入图片描述


SAP2000中的梁单元/框架对象


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 为面对象信息二元列表,其内每个元素为记录单个平面对象信息的子列表,子列表内的元素依次表示为平面的标签、按顺/逆时针排列的组成面对象的节点标签。


在这里插入图片描述


SAP2000中的壳单元/面对象

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 为体对象信息二元列表,其内每个元素为记录单个体对象信息的子列表,子列表内的元素依次表示为体面的标签、顺序排列的组成体对象的节点标签。


在这里插入图片描述

SAP2000中的实体单元/实体对象


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)


在这里插入图片描述


由Python创建的DalNur-20210922-153748.s2k文件



  将 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,不如为我打款!

  最后,祝各位攻城狮们,珍爱生命,保护发际线!



在这里插入图片描述





  • 5
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hulunbuir

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值