使用 Python 启动 ETABS

1. 在 Python 中导入 CLR 库

最近闲暇时开始折腾 ETABS OAPI,一直以来 CSi 的文档里对使用 VBA 连接 ETABS 有比较完善的支持,但对其它语言的支持很有限。由于 Python 的广泛使用,使用 Python 进行不同软件之间的数据流控制非常方便,因此使用 Python 连接 ETABS 也就顺理成章。只是对于非计算机专业的结构工程师来说,纯粹依照官方文档的指示操作会遇到很多问题。这篇文章讲述的便是其中一个基本问题。

依照 CSi 官方文档,使用 Python 连接 Etabs 有两种方式,一种是基于 COM,另一种是基于 .NET。这里我们讨论基于 .NET 的 Python 代码。代码前三行如下:

import os

import sys

import clr # How to import clr?

如果你的 Python 没有安装 CLR,通常代码运行到第三行便会报错。如何在 Python 中导入 CLR,有以下两个选择。

  1. 第一种方法是直接调用 IronPython 做 compiler。IronPython 是一个基于 .NET Framework 的 Python 实现。它和 .NET Framework 深度集成,可以允许 Python 代码自由调用 .NET 库。使用 IronPython,在导入 CLR 时代码不会报错,但在运行后续代码时可能会遇到其它错误,比如序列化的问题,难以解决。
  2. 第二种方法便是安装 Pythonnet package。这个 Package 的主要目的是让 Python 可以像调用自身模块一样调用 .NET 库。安装 Pythonnet 的方法很简单,在 Terminal 里输入 pip install pythonnet 就可以了。但是要注意,安装前务必确认 Python 的版本与 Pythonnet 兼容。比如Pythonnet v2.5.2 只支持到 Python 3.8,那么所用的 Python 版本便需要低于 3.8。如果 Python 的版本高于3.8,很可能会安装失败。

使用 IronPython 或者安装完成 Pythonnet package 后,可以尝试运行后续代码,如下:

import clr

clr.AddReference("System.Runtime.InteropServices")

如果代码不报错,则证明 CLR 导入成功。

2. 使用 Python 运行 ETABS

成功安装并导入 CLR 后,就可以跟官方文档里的代码启动 ETABS 了。然而还是有几个需要注意的地方要提醒:

  • 从外部导入的 DLL 可能不会有代码自动填充,如果是自己敲键盘而不是复制已成功运行过的代码,要特别注意保证拼写以及英文字母的大小写正确。
  • 由 pythonnet (v2.5.2) 导入的 clr 没有 AddReferenceToFileAndPath 方法,导入 ETABSv1.dll 时建议跟官方文档统一使用 AddReference 方法。
  • 即便成功导入 CLR,依然会有警告和波浪线,但不影响代码运行。
  • 当编辑器有 auto format 的功能时,使用该功能后要人工检查,保证自动整理的代码语句的逻辑顺序正确,否侧代码无法运行。

下面就是简化后的 Etabs 启动代码,该代码根据 ETABS 官方 API 文档修改而来:

import os
import sys
import clr
​
clr.AddReference("System.Runtime.InteropServices")
from System.Runtime.InteropServices import Marshal # 此处代码下可能会有波浪线,但不影响代码运行
​
clr.AddReference('C:\Program Files\Computers and Structures\ETABS 19\ETABSv1.dll')
from ETABSv1 import *
​
helper = cHelper(Helper()) # Helper() 返回一个 wHelper 对象,需要转换成 cHelper 对象

etabs = cOAPI(helper.CreateObject("C:\Program Files\Computers and Structures\ETABS 19\ETABS.exe")) # 同上

etabs.ApplicationStart

etabs.ApplicationExit(False)

需要说明的是,Helper() 会返回一个 wHelper 对象,而不是我们以为的 cHelper。这两个 class 所包含的方法完全不同,CreateObject 这个方法是 cHelper 的成员,因此必须将 wHelper 对象转换成 cHelper 对象。同理,cHelper.CreateObject 返回的是 wOAPI 对象,使用前需要将其转换成 cOAPI 对象。

3. 使用 VBA 运行 ETABS

由于 ETABS 的 API 很早就支持 VBA 调用。作为对比,我们来看看使用 VBA 启动 ETABS 的情况。此时非常简单,代码如下:

Dim help As New Helper

help.CreateObject("C:\Program Files\Computers and Structures\ETABS 19\ETABS.exe").ApplicationStart

只需要以上两行代码就可以通过 VBA 启动 ETABS 了。

  1. 可以看到,VBA 基本避免了繁琐的 DLL 库导入的问题,但必须要在 Tool 菜单中添加相应的 References
  2. VBA 支持 ETABSv1 namespace 的代码自动填充,提高敲代码的效率和准确率。
  3. VBA 依附于 Excel,自带 IDE,不需要额外配置开发环境,容易上手。

如果需要关闭 ETABS,则运行如下代码即可。

help.GetObject("CSI.ETABS.API.ETABSObject").ApplicationExit(False)

上面的语句中,ApplicationExit() 必须要有参数,True 表示保存并退出,False 表示不保存退出。CSI.ETABS.API.ETABSObject 是 ProgID,CSi 的软件都有自己对应的 ProgID,SAP2000,SAFE 和 ETABS 的 ProgID 各不相同。另外,使用代码启动的 ETABS 程序,建议由代码关闭。否则可能会有进程残留的现象,占用计算机内存。

使用 VBA 时,要注意的一个问题便是 Excel 的版本需要与 ETABS 的版本兼容。也就是说,两个软件必须同时是 64位的或者同时是32位的,否则无法成功添加 DLL 库。

至此,通过 Python 启动 ETABS 的方法就基本介绍完毕。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值