ANSYS 参数化设计编程 (ANSYS Parameter Design Language —— APDL) 是 一种通过参数化变量方式建立分析模型的脚本语言,它用智能化分析的手段,为用户提供了自动完成有限元分析过程的功能,即程序的输入可根据指定的函数、变量以及选用的分析类型来确定,是完成优化设计和自适应网格的最主要基础。
显然,APDL 不是 编程语言 ,它只能使 ANSYS 建模自动化,除此以外毫无用处。因此,我们可采用 Python 语言将经常用到的 ANSYS APDL 命令流进行封装,供日后的重复利用。这样,只需要在编写 Python 函数时一次性地了解 APDL 命令流的含义,而不必经常性地接触枯燥且无聊的 APDL 命令流。
在此不得不吐槽一下,把 APDL 记的滚瓜烂熟有毛线用,至少采用本文这种方式创建 APDL 命令流能提高 Python 的使用技能。好歹 HyperMesh 自动化建模的 Tcl 语言是个脚本语言,用处也不只被局限于 HyperMesh,还可用于其他方面。我就问你个直击灵魂的问题:APDL 贼拉精通后,又能如何?你能拿它干什么,除非你数值模拟世界里只有 ANSYS 。垃圾,呸!经典 ANSYS 是本人最烦的软件,没有之一,简直就是反人类,不但界面难看而且丑陋。以上言论纯属个人观点,不喜欢走就。
Abaqus与Ansys近似对应关系
| Abaqus | Ansys | |
|---|---|---|
| 脚本语言 | Python | APDL |
| 命令流文件 | abaqus.rpy | jobname.log |
| 求解器输入文件 | .inp | .cdb(有限元求解文件) |
| 模型数据库文件 | .cae | .db(二进制数据库文件) |
| 结果数据库文件 | .odb | .rst |
在 ANSYS Mechanical APDL 程序启动时,将在当前工作目录内创建 jobname.log 文件,其中 jobname 为用户定义的工作名称,若事先为指定工作名称,则程序采用默认的 file.log、file0.log 或 file1.log 等为 log 文件的名称。

丑陋且难看的ANSYS经典界面
用户在 ANSYS 经典界面中进行的每一步操作所对应的 APDL 命令都将存储在这个文件中。.log 为 ASCII 文件,采用任何一款文本编辑软件均可打开 jobname.log 文件。通过,对它的修改编辑,用户可创建新的 APDL 命令文件,用以更方便地实现参数化建模。

记录APDL命令流的jobname.log文件
ANSYS 软件提供两种工作模式: 人机交互方式 (GUI 方式) 和 命令流输入方式 (Batch 方式) 。
在 ANSYS 中,输入的 APDL 命令流不区分大小写。通常情况下,为了提高命令流的可读性,约定:在输入的命令流中凡是用户输出的字符都采用小写字母方式,或第 1 个字母大写其余的字母为小写的方式,而 ANSYS 系统中的命令或标签名都采用大写。
APDL 的基本组成:参数化、 宏 命令、分支、循环、重复执行和数值。
在 ANSYS 经典界面中的菜单栏上,依次单击 Help >> Help Topics ,可弹出在线帮助文档。单击 Command Reference 便可查看各 APDL 命令的格式及相关介绍,如下图所示。

ANSYS在线帮助文档
如上图所示,创建结点的 APDL 命令格式为:
N, NODE, X, Y, Z, THXY, THYZ, THZX
其中,输入参数 NODE 为 Node number to be assigned ,X, Y, Z 为 Node location in the active coordinate system (R, θ, Z for cylindrical, R, θ, Φ for spherical or toroidal)。例如,在当前坐标系下,创建一编号为 107 的结点,且它在当前坐标系下的坐标为 (10,9,7),那么相应的 APDL 命令如下所示。
N, 107, 10, 9, 7, 0, 0, 0
另外,还可通过搜索神器 Everything,在本地电脑中,搜索到其 pdf 版的帮助文档,如下图所示。

在 ANSYS 经典界面的菜单栏下方的文本输入框为 APDL 命令窗口,用于命令的输入,按回车后执行输入的命令,如下图所示。

Command Prompt
例如,在前处理器处(PREP7)于活跃状态时,将上文创建 107 号结点的命令 “N, 107, 10, 9, 7, 0, 0, 0”,复制到命令窗口中,回车后,ANSYS 程序将执行该命令,创建的结点如下图所示。

用户可将 ANSYS 文件记录在一个宏文件中,有时也称为命令流文件,所谓宏文件就是记录 ANSYS 命令流且拓展名为 .mac 的文件,使用 .mac 为拓展名,可使 ANSYS 在执行该命令时,将其当作一个内部命令一样使用。但最好避免使用这个拓展名,因为它将被 ANSYS 的内部宏所使用。
def create_material_properties(matnum=None, rho=0, e=0, nu=0):
# 作者:DalNur;邮箱:liyang@alu.hit.edu.cn
# 功能:定义线弹性材料属性
# 参数:matnum为材料编号;rho为质量密度;e为弹性模量;nu为泊松比
# 返回:APDL命令流列表
s1 = "/PREP7" # 命令
c1 = "! Enters the model creation preprocessor." # 备注
cmds = [[s1, c1], ]
if matnum is None:
matnum = "matmax+1"
tmps = "*GET,matmax,MAT,,NUM,MAX"
tmpc = "! 当前最大材料编号<matmax>."
cmds.append([tmps, tmpc])
s2 = "MPTEMP,,,,,,,,"
c2 = "! Defines a temperature table."
s3 = "MPTEMP,1,0"
c3 = "! 定义温度表/SLOC=1."
s4 = "MPDATA,DENS,%s,,%s" % (matnum, rho)
c4 = "! 设置材性/材料编号<%s>/质量密度<%s>." % (matnum, rho)
s5 = "MPDATA,EX,%s,,%s" % (matnum, e)
c5 = "! 设置材性/材料编号<%s>/弹性模量<%s>." % (matnum, e)
s6 = "MPDATA,PRXY,%s,,%s" % (matnum, nu)
c6 = "! 设置材性/材料编号<%s>/泊松比<%s>." % (matnum, nu)
cmds = cmds + [[s2, c2], [s3, c3], [s4, c4], [s5, c5], [s6, c6]]
return cmds
def define_local_element_type(etnum=None, etname="SOLID185"):
# 作者:DalNur;邮箱:liyang@alu.hit.edu.cn
# 功能:定义单元类型/各单元关键选项均采样默认设置/后续修改
# Defines a local element type from the element library.
# 参数:matnum为材料编号;rho为质量密度;e为弹性模量;nu为泊松比
# 返回:APDL命令流列表
# *GET,etmax,ETYP,,NUM,MAX ! 当前最大单元类型号<etmax>
# ET,etmax+1,SOLID185 ! 定义单元/SOLID185/单元编号<etmax+1>.
s1 = "/PREP7" # 命令
c1 = "! Enters the model creation preprocessor." # 备注
cmds = [[s1, c1], ]
if etnum is None:
etnum = "etmax+1"
tmps = "*GET,etmax,ETYP,,NUM,MAX"
tmpc = "! 当前最大单元类型编号<etmax>."
cmds.append([tmps, tmpc])
s2 = "ET,%s,%s" % (etnum, etname)
c2 = "! 定义单元类型/单元类型编号<%s>/单元类别名称<%s>." % (etnum, etname)
cmds = cmds + [[s2, c2]]
return cmds
对于一维梁单元,其截面属性应包括所用材料和横截面的几何形状;对于二维板壳单元,其截面属性应包括所用材料和板壳的厚度;对于三维实体单元,其截面属性只需要提供所用材料即可。
对于一维梁单元,在 ANSYS 中,所提及的截面一般指的是梁的横截面几何形状,它是与 Abaqus 中的 Profile 相对应的。因此,截面/截面形状指梁横截面的几何尺寸,如长宽高等,截面属性除了包括截面形状外,还包括材料属性。
def create_circular_section(secname, secnum=None, radius=None):
# 作者:DalNur;邮箱:liyang@alu.hit.edu.cn
# 功能:定义圆形梁截面/几何尺寸
# 参数:secname为截面名称;secnum为梁的截面编号/截面形状号;radius为圆的半径
# 返回:APDL命令流
s1 = "/PREP7" # 命令
c1 = "! Enters the model creation preprocessor." # 备注
cmds = [[s1, c1], ]
if secnum is None:
secnum = "secmax+1"
tmps = "*GET,secmax,SECP,,NUM,MAX"
tmpc = "! 当前最大截面编号<secmax>."
cmds.append([tmps, tmpc])
s2 = "SECTYPE,%s,BEAM,CSOLID,%s,0" % (secnum,secname)
c2 = "! 定义实心圆形梁截面/截面编号<%s>/截面名称<%s>." % (secnum,secname)
s3 = "SECOFFSET,CENT"
c3 = "! 设置截面偏置/梁杆轴端点位于梁截面形心上."
s4 = "SECDATA,%s" % radius
c4 = "! 定义几何尺寸/圆的半径<%s>." % radius
cmds = cmds + [[s2, c2], [s3, c3], [s4, c4], ]
return cmds
def create_rectangular_section(secname, secnum=None, width=None, height=None):
# 作者:DalNur;邮箱:liyang@alu.hit.edu.cn
# 功能:定义矩形梁截面/几何尺寸
# 参数:secname为截面名称;secnum为梁的截面编号/截面形状号
# 参数:width、height分别为矩形的宽度和高度
# 返回:APDL命令流
s1 = "/PREP7" # 命令
c1 = "! Enters the model creation preprocessor." # 备注
cmds = [[s1, c1], ]
if secnum is None:
secnum = "secmax+1"
tmps = "*GET,secmax,SECP,,NUM,MAX"
tmpc = "! 当前最大截面编号<secmax>."
cmds.append([tmps, tmpc])
s2 = "SECTYPE,%s,BEAM,RECT,%s,0" % (secnum,secname)
c2 = "! 定义矩形梁截面/截面编号<%s>/截面名称<%s>." % (secnum,secname)
s3 = "SECOFFSET,CENT"
c3 = "! 设置截面偏置/梁杆轴端点位于梁截面形心上."
s4 = "SECDATA,%s,%s" % (width, height)
c4 = "! 定义几何尺寸/矩形的宽度<%s>/矩形的高度<%s>." % (width, height)
cmds = cmds + [[s2, c2], [s3, c3], [s4, c4], ]
return cmds
def create_shell_section_property(secname, secnum=None, thickness=0.1024, matnum=1024):
# 功能:定义壳截截面属性
# 参数:secname为截面名称;secnum为梁的截面编号/截面形状号;thickness为壳的厚度;matnum为材料编号
# 返回:APDL命令流
s1 = "/PREP7" # 命令
c1 = "! Enters the model creation preprocessor." # 备注
cmds = [[s1, c1], ]
if secnum is None:
secnum = "secmax+1"
tmps = "*GET,secmax,SECP,,NUM,MAX"
tmpc = "! 当前最大截面编号<secmax>."
cmds.append([tmps, tmpc])
s2 = "SECT,%s,SHELL,,%s,0.0,3" % (secnum, secname)
c2 = "! 定义板壳截面/截面编号<%s>/截面名称<%s>/Oriention<0.0>/积分点个数<3>." % (secnum, secname)
s3 = "SECOFFSET,MID"
c3 = "! 设置截面偏置/板的各结点位于截面中性面上."
s4 = "SECDATA,%s,%s," % (thickness, matnum)
c4 = "! 定义板壳属性/板壳的厚度<%s>/材料编号<%s>." % (thickness, matnum)
s5 = "SECCONTROL,,,,,,,"
c5 = "! Section Controls."
cmds = cmds + [[s2, c2], [s3, c3], [s4, c4], [s5, c5], ]
return cmds
与 Abaqus 不同,在 ANSYS 中,各项同性的三维实体单元的实体截面属性无需要单独定义并赋予,只需要指定材料编号即可。
def assign_property_to_beam_elements(compname, matnum=None, secnum=None, etnum=None):
# 作者:DalNur;邮箱:liyang@alu.hit.edu.cn
# 功能:为组件内的全部梁单元指定属性
# 参数:compname为组件名称;matname为材料编号;secnum为截面编号;etnmu为单元类型编号。
# 注意:组件的类型必须是单元
# 返回:APDL命令流
s1 = "/PREP7" # 命令
c1 = "! Enters the model creation preprocessor." # 备注
s2 = "ALLSEL,ALL"
c2 = "! Select Everything."
s3 = "CMSEL,S,%s" % compname
c3 = "! 选择组件/组件名称<%s>." % compname
s4 = "ALLSEL,BELOW,ELEM"
c4 = "! 选择组件内的全部单元."
cmds = [[s1, c1], [s2, c2], [s3, c3], [s4, c4], ]
if matnum is not None:
# 修改单元属性/修改材料属性
tmps = "EMODIF,ALL,MAT,%s" % matnum
tmpc = "! 修改单元属性/修改单元材料编号/新的单元材料编号<%s>." % matnum
cmds.append([tmps, tmpc])
if secnum is not None:
tmps = "EMODIF,ALL,SEC,%s" % secnum
tmpc = "! 修改单元属性/修改单元截面编号/新的单元截面编号<%s>." % secnum
cmds.append([tmps, tmpc])
if etnum is not None:
tmps = "EMODIF,ALL,TYPE,%s" % etnum
tmpc = "! 修改单元属性/修改单元类型编号/新的单元类型编号<%s>." % etnum
cmds.append([tmps, tmpc])
cmds = cmds + [[s2, c2], ]
return cmds
def assign_property_to_shell_elements(compname, matnum=None, secnum=None, etnum=None):
# 作者:DalNur;邮箱:liyang@alu.hit.edu.cn
# 功能:为组件内的全部壳单元指定属性
# 参数:compname为组件名称;matname为材料编号;secnum为截面编号;etnmu为单元类型编号。
# 注意:组件的类型必须是单元
# 返回:APDL命令流
s1 = "/PREP7" # 命令
c1 = "! Enters the model creation preprocessor." # 备注
s2 = "ALLSEL,ALL"
c2 = "! Select Everything."
s3 = "CMSEL,S,%s" % compname
c3 = "! 选择组件/组件名称<%s>." % compname
s4 = "ALLSEL,BELOW,ELEM"
c4 = "! 选择组件内的全部单元."
cmds = [[s1, c1], [s2, c2], [s3, c3], [s4, c4], ]
if matnum is not None:
# 修改单元属性/修改材料属性
tmps = "EMODIF,ALL,MAT,%s" % matnum
tmpc = "! 修改单元属性/修改单元材料编号/新的单元材料编号<%s>." % matnum
cmds.append([tmps, tmpc])
if secnum is not None:
tmps = "EMODIF,ALL,SEC,%s" % secnum
tmpc = "! 修改单元属性/修改单元截面编号/新的单元截面编号<%s>." % secnum
cmds.append([tmps, tmpc])
if etnum is not None:
tmps = "EMODIF,ALL,TYPE,%s" % etnum
tmpc = "! 修改单元属性/修改单元类型编号/新的单元类型编号<%s>." % etnum
cmds.append([tmps, tmpc])
cmds = cmds + [[s2, c2], ]
return cmds
def assign_property_to_solid_elements(compname, matnum=None, secnum=None, etnum=None):
# 作者:DalNur;邮箱:liyang@alu.hit.edu.cn
# 功能:为组件内的全部实体单元指定属性
# 参数:compname为组件名称;matname为材料编号;secnum为截面编号;etnmu为单元类型编号。
# 注意:组件的类型必须是单元/另外实体单元的secnum参数无意义
# 返回:APDL命令流
secnum = None
s1 = "/PREP7" # 命令
c1 = "! Enters the model creation preprocessor." # 备注
s2 = "ALLSEL,ALL"
c2 = "! Select Everything."
s3 = "CMSEL,S,%s" % compname
c3 = "! 选择组件/组件名称<%s>." % compname
s4 = "ALLSEL,BELOW,ELEM"
c4 = "! 选择组件内的全部单元."
cmds = [[s1, c1], [s2, c2], [s3, c3], [s4, c4], ]
if matnum is not None:
# 修改单元属性/修改材料属性
tmps = "EMODIF,ALL,MAT,%s" % matnum
tmpc = "! 修改单元属性/修改单元材料编号/新的单元材料编号<%s>." % matnum
cmds.append([tmps, tmpc])
if secnum is not None:
tmps = "EMODIF,ALL,SEC,%s" % secnum
tmpc = "! 修改单元属性/修改单元截面编号/新的单元截面编号<%s>." % secnum
cmds.append([tmps, tmpc])
if etnum is not None:
tmps = "EMODIF,ALL,TYPE,%s" % etnum
tmpc = "! 修改单元属性/修改单元类型编号/新的单元类型编号<%s>." % etnum
cmds.append([tmps, tmpc])
cmds = cmds + [[s2, c2], ]
return cmds
Python函数
| 序号 | 函数名称 | 功能 |
|---|---|---|
| 1 | activate_coordinate_system(csys) | 激活坐标系 |
| 2 | create_coordinate_system_from_three_points(origin, xpoint, ypoint, csysnumber, csystype, currcsys) | 三点创建坐标系 |
| 3 | rotate_nodal_coordinate_system(nodes, targetcsys) | 旋转结点的结果坐标系 |
| 4 | activate_coordinate_system_for_resluts_dispaly(csys) | 激活结果坐标系 |
| 5 | define_working_plane_from_three_points(origin, xpoint, ypoint, currcsys) | 三点创建工作平面 |
在 Ansys 系统中,有多种坐标系供选择,主要有:总体和局部坐标系、结点坐标系、单元坐标系和结果坐标系。各坐标系的功能/用途如下表所示。
| 序号 | 坐标系类别 | 用途/功能 |
|---|---|---|
| 1 | 总体和局部坐标系 | 定义几何形状参数 (结点、关键点等) 和空间位置 |
| 2 | 结点坐标系 | 定义每个结点的自由度和结点结果数据的方向。(单元结点自由度和全局结点自由度的区别) |
| 3 | 单元坐标系 | 确定材料特性主轴和单元结果数据的方向 |
| 4 | 结果坐标系 | 用来列表、显示或在通用后处理操作中将结点和单元结果转换到一个特定的坐标系中 |

ANSYS全局直角坐标系
通常情况下,高维度几何可由低维度几何经一定的操作创建而成,如几何体可由几何面经拉伸、旋转得到。那么,此时就需要提供一个参考平面,来指定几何面的拉伸法线方向。在 ANSYS 中,这个参考平面被称作工作平面;在 Abaqus 中,草图模块(Sketch)的功能类似于这个参考面;在 HyperMesh 中,没有明显与参考面相对应的功能。
工作平面是一个无限平面,有原点、二维坐标系、捕捉增量和显示栅格。在同一时刻只能定义一个工作平面 (当前定义一个新的工作平面时就会删除已有工作平面)。工作平面是与坐标系独立使用的。例如,工作平面与激活的坐标系可以有不同的原点和旋转方向。
当进入 ANSYS 程序时,有一个默认的工作平面,即总体笛卡尔坐标系的 x-y 平面。工作平面的 x 轴、y 轴分别取为总体笛卡尔坐标系的 x 轴和 y 轴。例如,由几何面经拉伸方式创建几何体时,几何面必须在某一工作平面上进行创建,这样在拉伸时,程序才知道往哪个方向拉伸,即工作平面的法线方向。
def activate_coordinate_system(csys):
# 功能:激活已存在的坐标系
# 参数:csys为已存在的坐标系的参考号
# 返回:APDL命令流列表
s1 = "/PREP7" # 命令
c1 = "! Enters the model creation preprocessor." # 备注
s2 = "CSYS,%s" % csys
c2 = "! 激活坐标系/坐标系参考号<%s>." % csys
cmds = [[s1, c1], [s2, c2], ]
return cmds
# 示例
# csys = 102 # 激活102号局部坐标系
# cmds = activate_coordinate_system(csys)
# for var in cmds:
# s, c = var
# cmd = s + " " + c
# print(cmd)
在 ANSYS 中,创建局部坐标系的命令有很多,如 LOCAL、CLOCAL 等等,为了方便,我们采用三点法创建局部坐标系,即通过给定三个关键点的坐标,便可在模型空间中唯一确定一局部坐标系,这三个关键点分别是:局部坐标系的坐标原点、局部 x 轴正方向上一点,局部 xy 平面上偏 y 轴正向一点。在 ANSYS 系统中,由三(结)点坐标创创建局部坐标系的命令为 CS,其相关介绍见下图。

CS命令
(ANSYS_Mechanical_APDL_Command_Reference.pdf)
综上,我们可以编写名为 create_coordinate_system_from_three_points 的 Python 函数,用于快速生成由三点法创建局部坐标系的 ANSYS APDL 命令流,Python 代码如下:
def create_coordinate_system_from_three_points(origin=[0, 0, 0], xpoint=[1, 0, 0], ypoint=[0, 1, 0], csysnumber=None, csystype=0, currcsys=0):
# 作者:DalNur;邮箱:liyang@alu.hit.edu.cn
# 功能:由3个点坐标创建局部坐标系
# 参数:origin为原点坐标;xpoint为局部x轴上正方向上一点的坐标;ypoint为局部xy平面上偏+y方向一点的坐标;
# 参数:csysnumber为新建坐标系的参考号(coordinate system reference number)、其值必须大于10;
# 参数:csystype为新建坐标系的类型,0为直角坐标系,1为柱坐标系,2为球坐标系;
# 参数:currcsys为当前活跃的坐标系,即上述三个点坐标所参考的坐标系,默认为0(全局直角坐标系)
# 返回:APDL命令流列表
s1 = "/PREP7" # 命令
c1 = "! Enters the model creation preprocessor." # 备注
s2 = "*GET,ndmax,NODE,,NUM,MAX"
c2 = "! 当前最大结点编号<ndmax>."
s3 = "CSYS,%s" % currcsys
c3 = "! 激活坐标系/坐标系参考号<%s>." % currcsys
x, y, z = origin
s4 = "N,ndmax+1,%s,%s,%s," % (x, y, z)
c4 = "! 新建结点/结点编号<ndmax+1>/结点坐标<(%s,%s,%s)>/坐标系<%s>." % (x, y, z, currcsys)
x, y, z = xpoint
s5 = "N,ndmax+2,%s,%s,%s," % (x, y, z)
c5 = "! 新建结点/结点编号<ndmax+2>/结点坐标<(%s,%s,%s)>/坐标系<%s>." % (x, y, z, currcsys)
x, y, z = ypoint
s6 = "N,ndmax+3,%s,%s,%s," % (x, y, z)
c6 = "! 新建结点/结点编号<ndmax+3>/结点坐标<(%s,%s,%s)>/坐标系<%s>." % (x, y, z, currcsys)
cmds = [[s1, c1], [s2, c2], [s3, c3], [s4, c4], [s5, c5], [s6, c6]]
csystypeypes = {
0: "Cartesian", 1: "Cylindrical", 2: "Spherical", }
if csysnumber is None:
tmps1 = "*GET,csmax,CDSY,,NUM,MAX"
tmpc1 = "! 当前最大坐标系参考号<csmax>."
tmps2 = "*IF,csmax,LE,10,THEN"
tmpc2 = "! 若当前最大坐标系参考号小于10."
tmps3 = " csmax=10"
tmpc3 = "! 当前最大坐标系参考号取10/用户自定义坐标系参考号需大于10."
tmps4 = "*ENDIF"
tmpc4 = "! 结束IF块."
tmps5 = "CS,csmax+1,%s,ndmax+1,ndmax+2,ndmax+3" % csystype
tmpc5 = "! 新建坐标系/坐标系参考号<ndmax+1>or<11>/坐标系类型<%s>." % csystypeypes[csystype]
cmds = cmds + [[tmps1, tmpc1], [tmps2, tmpc2], [tmps3, tmpc3], [tmps4, tmpc4], [tmps5, tmpc5], ]
else:
tmps1 = "CS,%s,%s,ndmax+1,ndmax+2,ndmax+3" % (csysnumber, csystype)
tmpc1 = "! 新建坐标系/坐标系参考号<%s>/坐标系类型<%s>." % (csysnumber, csystype)
cmds = cmds + [[tmps1, tmpc1],]
s7 = "NDELE,ndmax+1,ndmax+3,1"
c7 = "! 删除临时结点/临时结点编号<ndmax+1>、<ndmax+2>和<ndmax+3>."
s8 = "CSYS,0"
c8 = "! 激活全局直角坐标系."
s9 = "ALLSEL,ALL"
c9 = "! Select Everything."
cmds = cmds + [[s7, c7], [s8, c8], [s9, c9]]
return cmds
例如,我们想创建一编号为 107 的局部柱坐标系,它的坐标原点为 (100, 0, 0),且它的局部 x 轴正方向指向全局 Y 轴正方向,它的局部 y 轴 正方向指向全局 Z 轴负方向。那么,原点坐标参数 origin = [100, 0, 0],局部 x 轴上正方向上一点的坐标可取为 xpoint = [100, 10, 0],局部 xy 平面上且偏向 +y 轴方向的一点坐标可取为 ypoint = [100, 0, -10],基于此,可调用函数 create_coordinate_system_from_three_points 来生成创建 107 号局部柱坐标系的 APDL 命令流,如下所示。
origin, xpoint, ypoint = [100, 0, 0], [100, 10, 0], [100, 0, -10] # 原点/+x轴点/偏+y轴点
csysnumber, csystype, currcsys = 107, 1, 0 # 新建坐标系参考号/新建坐标系类型/当前活跃的坐标系
cmds = create_coordinate_system_from_three_points(origin, xpoint, ypoint, csysnumber, csystype, currcsys)
for var in cmds
免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删