Python 语言创建 HyerMesh Tcl 命令流_hypermesh 命令流-程序员宅基地

技术标签: HyperMesh  二次开发  HyperWorks  Tcl  Python  




Blog Links





P ython    T oolC ommandL anguage





一、前言


  Tcl 是一种脚本语言,由 John Ousterhout 创建, 最早称为工具命令语言(Tool Command Language),Tcl 语言功能强大,容易学习。Tcl 经常被用于快速原型开发、脚本编程、GUI 和 测试等方面。


  Tk 为 Tcl 的扩展包,用于定制用户图形界面(GUI),包括常用的窗体控件的定义及其常用的方法。在二次开发时,用户可基于 Tk 提供的基本控件设计面板;基于控件的事件函数调用相关的宏或脚本。


  Tcl 进行功能实现类的二次开发,Tk 用于图形用户界面的二次开发。HyperMesh 支持 Tcl 和 Tk 语言对其进行二次开发。


  在 HyperMesh 程序启动时,将在当前工作目录内创建 command1.tcl 文件,用户在 HyperMesh 中进行的每一步操作所对应的 Tcl 命令都将存储在这个文件中。.tcl 为 ASCII 文件,采用任何一款文本编辑软件均可打开 command1.tcl 文件,并对其进行编辑。此外,还可以通过录制宏的方式,获得实现某一功能的 Tcl 命令。


  为了避免意向不到的错误,在启动 HyperMesh 程序前,可先将当前工作目录内已存在的 command1.tcl 文件删除。


  用户根据自身需求,可将记录在 command.tcl 文件中的这些命令修改为新的命令脚本,从而实现自动化建模。



在这里插入图片描述


.tcl文件的位置及其内容




二、Tcl 命令


  在 HyperMesh 系统中,主要有四类命令和函数,它们的名称和功能如下表所示。通常情况下,我们经常用到的是 Tcl Modify Commands ,根据这些命令可创建用于各种数值模拟的模型。



序号 名称 功能
1 Tcl GUI Commands Commands that operate on the HyperMesh GUI widgets.
2 Tcl Modify Commands Commands that modify the HyperMesh database.
3 Tcl Query Commands Commands that query the HyperMesh database.
4 Utility Menu Commands Documentation on the commands that control the Utility menu.



  The functionality of the HyperMesh Tcl Modify Command commands are available through Tcl. Additionally, commands that allow you to extract information from the HyperWorks Desktop database, such as entity ID numbers on a mark, a list of assemblies, component names, elements per component, nodes per element, node values, and so forth. These are known as HyperMesh Tcl Query Command commands. They are used to query information from the database or template system.




2.1 帮助文档


  各种 Tcl Modify Commands 命令的定义和详细说明详见官方帮助文档:HyperWorks Desktop Reference Guides >> HyperMesh >> Scripts >> Commands and Functions >> Tcl Modify Commands ,其查找方式如下图所示。


在这里插入图片描述


Tcl Modify Commands


2.2 命令窗口


  单击 HyperMesh 程序中菜单栏内的 View,勾选 Command Window,即可显示命令行窗口,在该窗口中可逐行输入 Tcl 命令,按回车后,该命令将被执行。采用此方式,可对二次开发 Tcl 代码进行调试。



在这里插入图片描述



  例如,在命令行中输入 *setbackgroundcolors 255 255 255 255 255 255 ,回车后,视口的背景颜色将被修改为白色,如下图所示。



在这里插入图片描述




2.3 运行脚本


  在 HyperMesh 中,运行 Tcl/Tk 脚本的方式一共有 6 种,如下图所示。


在这里插入图片描述


Tcl脚本的运行



2.4 基本语法


  Tcl variables are always strings even when they contain numeric values. Tcl 变量按如下方式进行赋值,即将变量 var1 的值定义为 “one plus one equals”。常见的 Tcl基本语法如下所示。


set var1 "one plus one equals"  # 变量赋值
puts $var1  # 打印变量var1的值

set pi [expr 2*asin(1.0)]  # 中括号执行计算功能

  更多关于 Tcl 语言的介绍见帮助文档:HyperWorks Desktop Reference Guides >> HyperMesh >> Scripts >> Introduction >> Tcl/Tk >> Tcl 。




三、模型组件


  HyperMesh 采用 Component 对模型进行组织管理,Component 内可以包含几何和网格,这类似于 Abaqus 中的 Part 以及 ANSYS 中的 Component。在 HyperMesh 中,创建组件/部件的命令格式如下:


*startnotehistorystate {
    Created Component prtname}
*collectorcreateonly components prtname
*endnotehistorystate {
    Created Component prtname}

  其中,可修改的参数为 prtname,表示所创建的组件/部件名称,新组件创建完成后,它自动被设置为当前活跃的组件,即接下来创建的各种几何和网格,都将存储在该组件内。例如,创建名称为 “Part1” 的组件的 Tcl 命令如下所示:


*startnotehistorystate {
    Created Component "Part1"}
*collectorcreateonly components "Part1"
*endnotehistorystate {
    Created Component "Part1"}


在这里插入图片描述


创建新组件

  若 HyperMesh 中存在着多个组件,有时需要在各组件间进行切换,则激活已存在的组件的命令格式为:


*currentcollector components prtname

  其中,可修改的参数为 prtname,表示将被激活的组件/部件名称。


  综上,我们可以采用 Python 语言进一步简化上述 Tcl 命令的创建,在此我们定义两个 Python 函数:create_componentactivate_component ,分别用于自动生成实现新建组件和激活组件功能的 Tcl 命令,代码如下:


def create_component(prtname):
	# 作者:DalNur;邮箱:[email protected]
    # 功能:创建新组件
    # 参数:prtname为将被创建的新组件的名称
    # 返回:Tcl命令列表
    s1 = '*startnotehistorystate {Created Component "%s"}' % prtname
    s2 = '*collectorcreateonly components "%s"' % prtname
    s3 = '*endnotehistorystate {Created Component "%s"}' % prtname
    tmcs = [s1, s2, s3]
    return tmcs
# 示例
# prtname = "Part-1"
# tmcs = create_component(prtname)
# print(tmcs)

def activate_component(prtname):
	# 作者:DalNur;邮箱:[email protected]
    # 功能:创建新组件
    # 参数:prtname为将被创建的新组件的名称
    # 返回:Tcl命令列表
    s1 = '*currentcollector components "%s"' % prtname
    tmcs = [s1, ]
    return tmcs
# 示例
# prtname = "Part-1"
# tmcs = activate_component(prtname)
# print(tmcs)

  不要问为啥采用这么迂回的方式创建 Tcl 命令,因为哥想用 Python 架构起i所有计算程序。




四、几何模型


4.1 几何点/Point


  几何点通常用于创建高维图元,如由两点可确定一条直线,由三点可确定一圆弧等等。在 HyperMesh 中,创建几何点的命令格式如下:


*createpoint x y z csys

  其中,*createpoint 为创建几何点的关键字,类似于 Abaqus inp 文件中的关键字,其后的数据以一个空格作为分隔符号,x、y 和 z 分别为结点的坐标,csys 为所采用的坐标系编号,默认情况下,csys 为 0 ,即表示全局直角坐标系。那么,在全局直角坐标系中创建几何点 (11.6, 20.7, 30.98) 的 Tcl 命令为:


*createpoint 11.6 20.7 30.98 0

  在命令窗口中,输入以上命令,回车后,将在窗口中显示创建的几何点 (11.6, 20.7, 30.98) ,命令输入后的返回值为 1 ,表示命令顺利执行,没有 Bug ,如下图所示。



在这里插入图片描述


  基于此,我们可以编写生成自动创建 HyperMesh 几何点 Tcl 命令的 Python 函数 create_point_by_coords,如下:


def create_point_by_coords(prtname, x, y, z, csys=0):
	# 作者:DalNur;邮箱:[email protected]
    # 功能:生成根据几何点坐标创建几何点的Tcl命令
    # 参数:x、y和z为结点坐标;csys为坐标系编号
    # 参数:csys的默认值为0,表示全局直角坐标系
    # 参数:prtname为几何点所在的组件/部件名称
    # 返回:根据坐标创建几何点的Tcl命令列表,对应变量为tmcs(Tcl Modify Commands)
    s1 = '*currentcollector components "%s"' % prtname
    s2 = '*createpoint %s %s %s %s' % (x, y, z, csys)
    tmcs = [s1, s2]
    return tmcs




4.2 几何线/Line


4.2.1 创建直线


  在 HyperMesh 中,创建直线的命令格式如下所示。其中,*linecreatestraight 为创建直线的关键字,x1、y1、z1 为直线起点的坐标,x2、y2、z2 为直线终点的坐标,一般采用此方式创建直线时,坐标系为全局直角坐标系。


*linecreatestraight x1 y1 z1 x2 y2 z2

  为了节约篇幅,接下来将不进行每个 Tcl 命令的测试展示,生成 创建直线 Tcl 命令的 Python 函数 create_straight_line 如下所示:


def create_straight_line(prtname, p1=[], p2=[]):
	# 作者:DalNur;邮箱:[email protected]
    # 功能:生成创建直线的Tcl命令
    # 参数:prtname为直线所在的部件名称
    # 参数:p1为起点坐标列表,其内数据依次为x1、y1和z1
    # 参数:p2为终点坐标列表,其内数据依次为x2、y2和z2
    # 返回:创建直线的Tcl命令列表
    x1, y1, z1 = p1
    x2, y2, z2 = p2
    s1 = '*currentcollector components "%s"' % prtname
    s2 = '*linecreatestraight %s %s %s %s %s %s' % (x1, y1, z1, x2, y2, z2)
    tmcs = [s1, s2]
    return tmcs
# 示例
# p1 = [0.9,0.8,0.7]
# p2 = [10.8,10.7,11.5]
# prtname = "Part1"
# tmcs = create_straight(prtname, p1, p2)
# print(tmcs)


4.2.2 创建圆及圆弧


  在 HyperMesh 中,由三个结点创建圆和圆弧的关键字均为 *createcirclefrompoints ,它的命令格式如下:


*createcirclefrompoints list_id circle_flag

  其中,list_id 为结点对象列表的 ID 号,若创建圆弧,则结点列表中,结点的顺序至关重要。cirlce_flag 为创建的类型,若其值取为 1 ,则将创建圆,若其值取为 0 ,则将创建圆弧。在此,我们不区分创建线的点是几何点还是结点,均采用临时结点的方式创建相关的几何线,且在几何线创建完成后,临时结点将被清楚。


  基于此,我们可以编写l两个 Python 函数:create_circle_from_three_pointscreate_arc_from_three_points ,用于自动生成相关的 Tcl 命令,如下所示。


def create_circle_from_three_points(prtname, p1=[], p2=[], p3=[], csys=0):
	# 作者:DalNur;邮箱:[email protected]
    # 功能:由三点创建圆/Tcl命令
    # 参数:prtname为圆所在的部件名称
    # 参数:p1为圆上第1个点坐标列表,其内数据依次为x1、y1和z1
    # 参数:p2为圆上第2个点坐标列表,其内数据依次为x2、y2和z2
    # 参数:p3为圆上第3个点坐标列表,其内数据依次为x3、y3和z3
    # 参数:csys为点所在的坐标系编号,默认为0,即采用全局直角坐标系
    # 返回:创建圆的Tcl命令列表
    x1, y1, z1 = p1
    x2, y2, z2 = p2
    x3, y3, z3 = p3
    s1 = '*nodecleartempmark'  # 删除所有临时结点
    s2 = '*currentcollector components "%s"' % prtname  # 激活部件
    s3 = 'set var [hm_count nodes "all" 0 0]'  # 当前的结点总数量var
    s4 = 'set var1 [expr ($var+1)]'  # 新建结点编号
    s5 = 'set var2 [expr ($var+2)]'  # 新建结点编号
    s6 = 'set var3 [expr ($var+3)]'  # 新建结点编号
    s7 = '*createnode %s %s %s %s' % (x1, y1, z1, csys)  # 创建第1个临时结点
    s8 = '*createnode %s %s %s %s' % (x2, y2, z2, csys)  # 创建第2个临时结点
    s9 = '*createnode %s %s %s %s' % (x3, y3, z3, csys)  # 创建第3个临时结点
    # s6 = '*createmark nodes 1 "all"'  # 创造选择集
    # s7 = '*renumbersolverid nodes 1 1 1 0 0 0 0 0'  # 压缩全部结点编号
    s10 = '*createlist nodes 1 $var1 $var2 $var3'  # 创建结点对象列表/ID为1/组成结点编号为1、2和3
    s11 = '*createcirclefrompoints 1 1'  # 创建圆
    s12 = '*nodecleartempmark'  # 删除所有临时结点
    tmcs = [s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, ]
    return tmcs
# 示例
# p1 = [10.7, 0, 0]
# p2 = [0, 10.7, 0]
# p3 = [-10.7, 0, 0]
# prtname = "Part1"
# tmcs = create_circle_from_three_nodes(prtname, p1, p2, p3)
# print(tmcs)


def create_arc_from_three_points(prtname, p1=[], p2=[], p3=[], csys=0):
	# 作者:DalNur;邮箱:[email protected]
    # 功能:由三点创建圆弧/Tcl命令
    # 参数:prtname为圆弧所在的部件名称
    # 参数:p1为圆弧上的起点坐标列表,其内数据依次为x1、y1和z1
    # 参数:p2为圆弧上的任意一点坐标列表,其内数据依次为x2、y2和z2
    # 参数:p3为圆弧上的终点坐标列表,其内数据依次为x3、y3和z3
    # 参数:csys为点所在的坐标系编号,默认为0,即采用全局直角坐标系
    # 返回:创建圆弧的Tcl命令列表
    x1, y1, z1 = p1
    x2, y2, z2 = p2
    x3, y3, z3 = p3
    s1 = '*nodecleartempmark'  # 删除所有临时结点
    s2 = '*currentcollector components "%s"' % prtname  # 激活部件
    s3 = 'set var [hm_count nodes "all" 0 0]'  # 当前的结点总数量var
    s4 = 'set var1 [expr ($var+1)]'  # 新建结点编号
    s5 = 'set var2 [expr ($var+2)]'  # 新建结点编号
    s6 = 'set var3 [expr ($var+3)]'  # 新建结点编号
    s7 = '*createnode %s %s %s %s' % (x1, y1, z1, csys)  # 创建第1个临时结点
    s8 = '*createnode %s %s %s %s' % (x2, y2, z2, csys)  # 创建第2个临时结点
    s9 = '*createnode %s %s %s %s' % (x3, y3, z3, csys)  # 创建第3个临时结点
    # s6 = '*createmark nodes 1 "all"'  # 创造选择集
    # s7 = '*renumbersolverid nodes 1 1 1 0 0 0 0 0'  # 压缩全部结点编号
    s10 = '*createlist nodes 1 $var1 $var2 $var3'  # 创建结点对象列表/ID为1/组成结点编号为1、2和3
    s11 = '*createcirclefrompoints 1 0'  # 创建圆弧
    s12 = '*nodecleartempmark'  # 删除所有临时结点
    tmcs = [s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, ]
    return tmcs
# 示例
# p1 = [10.7, 0, 10]
# p2 = [0, 10.7, 10]
# p3 = [-10.7, 0, 10]
# prtname = "Part1"
# tmcs = create_arc_from_three_nodes(prtname, p1, p2, p3)
# print(tmcs)




4.2.3 创建样条曲线


  在 HyperMesh 中,创建样条曲线的关键字为 *linecreatespline ,它的命令格式如下:


*linecreatespline point_type point_list scond econd svector evector

  其中,point_type 为点的类型,可以为 nodes 或 points ,若为 nodes ,则由结点创建样条曲线,若为 points,则由几何点创建样条曲线。point_list 为点列表的 ID,scond 和 econd 为曲线在始端、终端处的边界条件,可以为自由、闭合、指定切向等等。svector 和 evector 样条曲线在始端和终端处切线的方向向量。那么,由此可编写生成创建样条曲线 Tcl 命令流的 Python 函数 :create_spline_from_points ,如下所示。


def create_spline_from_points(prtname, points=[], csys=0, svector=None, evector=None):
	# 作者:DalNur;邮箱:[email protected]
    # 功能:由结点创建样条曲线
    # 参数:prtname为样条曲线所在的部件名称
    # 参数:points为各结点的坐标信息列表,各点最好顺序排列;csys为结点所在坐标系编号
    # 参数:svector为样条曲线起点处切线的方向向量,若为None,则样条曲线在起始端为自由状态
    # 参数:evector为样条曲线终点处切线的方向向量,若为None,则样条曲线在终止端为自由状态
    # 返回:创建样条曲线的Tcl命令列表
    num = len(points)  # 结点对象的个数
    s1 = '*nodecleartempmark'  # 删除所有临时结点
    s2 = '*currentcollector components "%s"' % prtname  # 激活部件
    s3 = 'set var [hm_count nodes "all" 0 0]'  # 当前的结点总数量var
    tmcs = [s1, s2, s3, ]  # tcl命令流列表
    labels = ""
    for i in range(num):
        tmps1 = 'set var%s [expr ($var+%s)]' % ((i + 1), (i + 1))  # 新建结点编号
        tmcs.append(tmps1)
        labels = labels + "$var%s " % (i + 1)
    for i in range(num):
        xi, yi, zi = points[i]
        tmps2 = '*createnode %s %s %s %s' % (xi, yi, zi, csys)  # 创建临时结点
        tmcs.append(tmps2)
    labels = labels[:-1]
    s4 = "*createlist nodes 1 %s" % labels
    tmcs.append(s4)
    scond, econd = 0, 0
    xi, yi, zi = 1, 0, 0
    xj, yj, zj = 1, 0, 0
    if svector is not None:
        scond = 3
        xi, yi, zi = svector
    if evector is not None:
        econd = 3
        xj, yj, zj = evector
    s5 = '*createvector 1 %s %s %s' % (xi, yi, zi)  # 创建向量/始端切线的方向向量
    s6 = '*createvector 2 %s %s %s' % (xj, yj, zj)  # 创建向量/终端切线的方向向量
    s7 = '*linecreatespline nodes 1 %s %s 1 2' % (scond, econd)
    s8 = '*nodecleartempmark'  # 删除所有临时结点
    tmcs = tmcs + [s5, s6, s7, s8]
    return tmcs
# 示例
# xs = [-10, -8.66, 0, 8.66, 10]
# ys = [0, 5, 10, 5, 0]
# points = []
# for i in range(len(xs)):
#     x, y, z = xs[i], ys[i], 0
#     points.append([x, y, z])
# prtname = "Part1"
# csys = 0
# svector = [0, 1, 0]
# evector = [0, -1, 0]
# tmcs = create_spline_from_points(prtname, points, csys, svector, evector)
# print(tmcs)




4.3 几何面/Surface


  在 HyperMesh 中,创建几何面的方法有很多种,比较常用的两个方法是由组成面的点坐标创建几何面和有封闭的线创建几何面,在此,我们仅讨论空间平面的创建,曲面等复杂几何面以二次开发的方式创建不具有实用意义。创建面的 Tcl 命令根据上述方式确定,本处不再赘述。


  由组成平面的点坐标创建空间几何平面和由组成平面的线编号创建空间几何平面的 Python 函数分别为:create_plane_from_pointscreate_plane_from_lines ,代码如下所示。


def create_plane_from_points(prtname, points=[], csys=0):
	# 作者:DalNur;邮箱:[email protected]
    # 功能:由点坐标创建几何平面
    # 参数:prtname为几何平面所在的部件名称
    # 参数:points为各点的坐标信息列表,点坐标必须顺序排列;csys为结点所在坐标系编号
    # 返回:创建几何面的Tcl命令列表
    num = len(points)  # 结点对象的个数
    s1 = '*nodecleartempmark'  # 删除所有临时结点
    s2 = '*currentcollector components "%s"' % prtname  # 激活部件
    s3 = 'set var [hm_count lines "all" 0 0]'  # 当前的线的总数量var
    tmcs = [s1, s2, s3]
    labels = ""
    for i in range(num):
        tmps1 = 'set var%s [expr ($var+%s)]' % ((i + 1), (i + 1))  # 新建线的编号
        tmcs.append(tmps1)
        labels = labels + "$var%s " % (i + 1)
    for i in range(num - 1):
        x1, y1, z1 = points[i]
        x2, y2, z2 = points[i + 1]
        s3 = '*linecreatestraight %s %s %s %s %s %s' % (x1, y1, z1, x2, y2, z2)
        tmcs.append(s3)
    x1, y1, z1 = points[-1]
    x2, y2, z2 = points[0]
    s4 = '*linecreatestraight %s %s %s %s %s %s' % (x1, y1, z1, x2, y2, z2)
    s5 = '*surfacemode 4'
    labels = labels[:-1]
    s6 = '*createmark lines 1 %s' % labels  # 组成面的线的选择集合
    s7 = '*createplane 1 1 0 0 0 0 0'
    s8 = '*splinesurface lines 1 1 1 65'
    tmcs = tmcs + [s4, s5, s6, s7, s8]
    return tmcs
# 示例
# p1 = [-10.5, 0, 0]
# p2 = [0, 10.5, 0]
# p3 = [10.5, 0, 0]
# points = [p1, p2, p3]
# prtname = "Part1"
# tmcs = create_surface_from_points(prtname, points, csys=0)
# print(tmcs)


def create_plane_from_lines(prtname, lines=["1", "2", "3"]):
	# 作者:DalNur;邮箱:[email protected]
    # 功能:由线编号创建几何平面
    # 参数:prtname为几何平面所在的部件名称
    # 参数:lines为线的编号列表,组成面的线必须封闭
    # 返回:创建几何面的Tcl命令列表
    num = len(lines)  # 几何线对象的个数
    s1 = '*currentcollector components "%s"' % prtname  # 激活部件
    labels = ""
    for i in range(num):
        linelabel = lines[i]
        labels = labels + "%s " % linelabel
    s2 = '*surfacemode 4'
    labels = labels[:-1]
    s3 = '*createmark lines 1 %s' % labels  # 组成面的线的选择集合
    s4 = '*createplane 1 1 0 0 0 0 0'
    s5 = '*splinesurface lines 1 1 1 65'
    tmcs = [s1, s2, s3, s4, s5, ]
    return tmcs
# 示例
# lines = ["1", "2", "3"]
# prtname = "Part1"
# tmcs = create_plane_from_lines(prtname, lines)
# print(tmcs)





4.4 几何体/Solid


  在 HyperMesh 中,创建几何体的方法有很多种,比较常用主要有:由闭合几何面创建体、由几何面拉伸而成,由几何面旋转而成等等。而多数情况下,空间 3D 体网格可由 2D 面网格经各种操作得到,因此,几何体的创建不十分必要,本处仅列出由闭合几何面的标签创建空间几何体的 Python 函数:create_solid_from_surfaces ,代码如下:


def create_solid_from_surfaces(prtname, surfaces=["1", "2", "3", "4"]):
	# 作者:DalNur;邮箱:[email protected]
    # 功能:由面编号创建几何体
    # 参数:prtname为几何体所在的部件名称
    # 参数:surfaces为几何面的编号列表,组成几何体的面必须封闭
    # 返回:创建几何体的Tcl命令列表
    num = len(surfaces)  # 几何线对象的个数
    s1 = '*currentcollector components "%s"' % prtname  # 激活部件
    labels = ""
    for i in range(num):
        surflabel = surfaces[i]
        labels = labels + "%s " % surflabel
    labels = labels[:-1]
    s2 = '*createmark surfaces 1 %s' % labels  # 组成面的线的选择集合
    s3 = '*solids_create_from_surfaces 1 4 -1 2'
    tmcs = [s1, s2, s3 ]
    return tmcs
# 示例
# surfaces = ["2", "3", "4", "5", "6"]
# prtname = "Part1"
# tmcs = create_solid_from_surfaces(prtname, surfaces)
# print(tmcs)







五、坐标系/向量


  在创建数值模型时,有时采用柱坐标系、球坐标系或其他局部直角坐标系建模更为方便。


5.1 坐标系


  在 HyperMesh 中,常采用三个点创建局部直角坐标系,通过给定局部坐标系的原点、局部 x 轴正方向上一点,局部 xy 平面上偏 y 轴正向一点,便可唯一创建一局部直角坐标系。创建局部坐标系的 Python 函数为:create_system_from_three_points ,代码如下:


def create_system_from_three_points(origin=[0, 0, 0], xpoint=[1, 0, 0], ypoint=[0, 1, 0], typenum=0, csys=0):
    # 作者:DalNur;邮箱:[email protected]
    # 功能:创建局部坐标系
    # 参数:origin为局部坐标系的原点的坐标值
    # 参数:xpoint为部坐标系+x轴上的一点的坐标值
    # 参数:ypoint为部坐标系偏+y轴上的一点的坐标值、注意偏、可以不在+y轴上、但不能在x轴线上
    # 参数:typenum为创建的局部坐标系的类型号,0表示直角坐标系,1表示柱坐标系,2表示球坐标系
    # 参数:csys为以上各点所在的坐标系编号
    # 返回:创建局部坐标系的Tcl命令列表
    csysType = {
    0: "Cartesian", 1: "Cylindrical", 2: "Spherical", }
    s1 = '*createmark systcols 1 "all"'  # 选择全部坐标系集
    s2 = '*renumbersolverid systcols 1 1 1 0 0 0 0 0'  # 重新编号
    s3 = 'set var [hm_count systcols "all" 0 0]'  # 当前的坐标系集的总数量var
    s4 = 'set var1 [expr ($var+1)]'  # 新建坐标系集的ID/var1
    s5 = 'set var2 [format "%03s" $var1]'  # 格式化var1/长度3、右对齐、0补齐/var2
    typename = csysType[type]  # 坐标系类型名称/typenum
    s6 = 'set var3 %s' % typename  # 坐标系类型
    s7 = 'set csysname [format "CSYS-%s-%s" $var2 $var3]'  # 坐标系集的名称
    s8 = '*startnotehistorystate {Created systemcollector}'
    s9 = '*collectorcreateonly systcols $csysname "" 31'  # 31为颜色号/新建坐标系集
    s10 = '*endnotehistorystate {Created systemcollector}'
    s11 = '*startnotehistorystate {Systcol $csysname made current}'
    s12 = '*currentcollector systcols $csysname'
    s13 = '*endnotehistorystate {Systcol $csysname made current}'  # 设置为当前
    s14 = '*nodecleartempmark'  # 删除所有临时结点
    s15 = 'set var [hm_count nodes "all" 0 0]'  # 当前的结点的总数量var
    s16 = 'set var1 [expr ($var+1)]'  # 新建点的编号/原点
    s17 = 'set var2 [expr ($var+2)]'  # 新建点的编号/+x轴点
    s18 = 'set var3 [expr ($var+3)]'  # 新建点的编号/偏+y轴点
    x1, y1, z1 = origin
    x2, y2, z2 = xpoint
    x3, y3, z3 = ypoint
    s19 = '*createnode %s %s %s %s' % (x1, y1, z1, csys)  # 创建原点
    s20 = '*createnode %s %s %s %s' % (x2, y2, z2, csys)  # 创建+x轴点
    s21 = '*createnode %s %s %s %s' % (x3, y3, z3, csys)  # 创建偏+y轴点
    s22 = '*systemcreate3nodes %s $var1 "x-axis" $var2 "xy-plane" $var3' % type
    s23 = '*nodecleartempmark'  # 删除所有临时结点
    tmcs = [s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15, s16, s17, s18, s19, s20, s21, s22, s23]
    return tmcs
# 示例
# origin = [10, 0, 0]
# xpoint = [-1, 0, 0]
# ypoint = [0, 1, 0]
# type = 0
# csys = 0
# tmcs = create_system_from_three_points(origin, xpoint, ypoint, type, csys)
# print(tmcs)
# origin = [20, 0, 0]
# xpoint = [-1, 0, 0]
# ypoint = [0, 1, 0]
# type = 1
# csys = 0
# tmcs = create_system_from_three_points(origin, xpoint, ypoint, type, csys)
# print(tmcs)


5.2 向量


  在几何空间中,由两点可唯一确定一向量,创建向量的 Python 函数为:create_vector_two_points ,代码如下:


def create_vector_from_two_points(p1=[0, 0, 0], p2=[1, 1, 1], csys=0):
    # 作者:DalNur;邮箱:[email protected]
    # 功能:由两点创建向量
    # 参数:p1、p2分别为向量的起点和终点坐标
    # 参数:csys为p1、p2点所在的坐标系编号
    # 返回:创建向量的Tcl命令列表
    s1 = '*createmark vectorcols 1 "all"'  # 选择全部向量集
    s2 = '*renumbersolverid vectorcols 1 1 1 0 0 0 0 0'  # 重新编号
    s3 = 'set var [hm_count vectorcols "all" 0 0]'  # 当前的向量集的总数量var
    s4 = 'set var1 [expr ($var+1)]'  # 新建向量集集的ID/var1
    s5 = 'set var2 [format "%03s" $var1]'  # 格式化var1/长度3、右对齐、0补齐/var2
    s6 = 'set vectname [format "Vector-%s" $var2]'  # 坐标系集的名称
    s7 = '*startnotehistorystate {Created vectorcollector}'
    s8 = '*collectorcreateonly vectorcols $vectname "" 55'  # 55为颜色号/新建向量集
    s9 = '*endnotehistorystate {Created vectorcollector}'
    s10 = '*nodecleartempmark'  # 删除所有临时结点
    s11 = 'set var [hm_count nodes "all" 0 0]'  # 当前的结点的总数量var
    s12 = 'set var1 [expr ($var+1)]'  # 新建点的编号/起点
    s13 = 'set var2 [expr ($var+2)]'  # 新建点的编号/终点
    x1, y1, z1 = p1
    x2, y2, z2 = p2
    s14 = '*createnode %s %s %s %s' % (x1, y1, z1, csys)  # 创建向量起点
    s15 = '*createnode %s %s %s %s' % (x2, y2, z2, csys)  # 创建向量终点
    s16 = '*vectorcreate_twonode $var1 $var2'  # 创建向量
    s17 = '*nodecleartempmark'  # 删除所有临时结点
    tmcs = [s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15, s16, s17]
    return tmcs
# 示例
# p1 = [10, 10, 10]
# p2 = [0, 0, 0]
# tmcs = create_vector_from_two_points(p1, p2, csys=0)
# print(tmcs)

  值得说明的是,上述代码中的第 14 行,55 表示的是显示颜色,在 HyperMesh 中,用 1 ~ 64 中的任意一数字来便捷指代颜色,具体颜色如下图所示。各显示由左至右、由上之下依次与数字 1 至 64 相对应,如 1 对应黑色,2 对应白色,依次类推。


在这里插入图片描述





六、有限元模型


6.1 结点


  在 HyperMesh 中用于创建其他图元的点,通常以临时结点的方式创建更为方便,这些临时结点在模型创建完成后,全部删除即可。在此,我们不区分几何点 Point 与网格结点 Node,在 HyperMesh 中,创建临时结点的命令格式如下:


*createnode x y z csys

  其中,*createnode 为创建结点的关键字,类似于 Abaqus inp 文件中的关键字,其后的数据以一个空格作为分隔符号,x、y 和 z 分别为结点的坐标,csys 为所采用的坐标系编号,默认情况下,csys 为 0 ,即表示全局直角坐标系。那么,在全局直角坐标系中创建结点 (10, 20, 30) 的 Tcl 命令为:


*createnode 10 20 30 0

  在命令窗口中,输入以上命令,回车后,将在窗口中显示创建的结点 (10, 20, 30) ,命令输入后的返回值为 1 ,表示命令顺利执行,没有 Bug ,如下图所示。


在这里插入图片描述


  基于此,我们可以编写生成自动创建 HyperMesh 结点 Tcl 命令的 Python 函数 create_node_by_coords,如下:


def create_node_by_coords(prtname, x, y, z, csys=0):
	# 作者:DalNur;邮箱:[email protected]
    # 功能:生成根据结点坐标创建结点的Tcl命令
    # 参数:x、y和z为结点坐标;csys为坐标系编号
    # 参数:x、y和z为结点坐标;csys为坐标系编号
    # 参数:csys的默认值为0,表示全局直角坐标系
    # 返回:根据坐标创建结点的Tcl命令列表,对应变量为tmcs(Tcl Modify Commands)
    s1 = '*currentcollector components "%s"' % prtname
    s2 = '*createnode %s %s %s %s' % (x, y, z, csys)
    tmcs = [s1, s2]
    return tmcs
# 示例
# x, y, z = 7.8, 5.9, 6.2
# prtname = "Part1"
# tmcs = create_node_by_coords(prtname, x, y, z)
# print(tmcs)

6.2 创建1D网格


6.3 创建2D网格


6.4 创建3D网格




七、编辑


7.1 删除


7.2 阵列


7.3 集合





八、文件


8.1 保存


8.2 输出


8.2.1 Abaqus/inp


8.2.2 ANSYS/cdb




九、尾声


  以上,便是基于 Python 语言自动创建 HyperMesh Tcl 命令流的简要介绍。

  因篇幅有限,某些非关键功能未做详细介绍,如有疑问,欢迎邮件交流。

  Email: [email protected]

  谨以此文为我 HyperMesh 二次开发的学习做一个阶段性地总结。

  与此同时,也希望能够为初学者/有需要的人提供多一点参考。

  本文仅用于个人学习,除此之外,无其他任何用途。

  因个人水平有限,文中难免有所疏漏,还请各位大神不吝批评指正。

  胸藏文墨怀若谷,腹有诗书气自华,希望各位都能在知识的 pāo 子里快乐徜徉。

  本文逻辑清楚,内容详实,引例丰富。

  欢迎大家点赞、评论及转载,转载请注明出处!

  为我打call,不如为我打款!

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



在这里插入图片描述





十、参考文献


[01]. hypermesh二次开发 专栏. CAECoder.

[02]. Hyper mesh 二次开发技术交流. 黄林.

[03]. HYPERMESH自动化介绍 - ALTAIR. 杨稳.





版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Hulunbuir/article/details/119957937

智能推荐

toDesk 远程连接软件 连接远程电脑后黑屏_todesk远程蓝屏了-程序员宅基地

文章浏览阅读2.7w次。问题 现象:黑屏原因: 远程电脑多个显示器,eg:主显示器是外接显示器,但是下班时把外接显示器关闭了.这时候只要再toDesk切换显示器就行了_todesk远程蓝屏了

idea 代码提示区分大小写_idea搜索区分大小写-程序员宅基地

文章浏览阅读2.8k次。新安装了一个idea 发现代码提示区分大小写.用起来很是不方便;只需要 Ctrl+Alt+S 打开Setting 然后 Editor---General----code Completion 取消勾选红框圈住的选项 Match case 即可_idea搜索区分大小写

[机器学习]机器学习资源大全中文版-程序员宅基地

文章浏览阅读6.1k次,点赞3次,收藏22次。机器学习资源大全中文版我想很多程序员应该记得 GitHub 上有一个 Awesome - XXX 系列的资源整理。awesome-machine-learning 就是 josephmisiti 发起维护的机器学习资源列表,内容包括了机器学习领域的框架、库以及软件(按编程语言排序)。Awesome 系列虽然挺全,但基本只对收录的资源做了极为简要的介绍,如果有更详细的中文介绍,对相应开发者的...

POJ2449-A*算法-第k短路-程序员宅基地

文章浏览阅读42次。(有任何问题欢迎留言或私聊 && 欢迎交流讨论哦题意:传送门 原题目描述在最下面。 给你一个有向图,求指定节点间的第k短路。思路: 先反向跑出从终点开始的到每个节点的最短距离。 乐观估计函数\(f(n) = g(n) + h'(n)\)。\(g(n)\)表示到当前状态跑的距离,\(h'(n)\)表示到目标状态还需要的距离。 对于\(A*\)然后跑一遍\(..._a*算法 poj

道格拉斯—普克(Douglas一Peukcer)节点抽稀算法-程序员宅基地

文章浏览阅读311次。Douglas一Peukcer算法由D.Douglas和T.Peueker于1973年提出,简称D一P算法,是眼下公认的线状要素化简经典算法。现有的线化简算法中,有相当一部分都是在该算法基础上进行改进产生的。它的长处是具有平移和旋转不变性,给定曲线与阂值后,抽样结果一定。本章线化简重点解说该算法。算法的基本思路是:对每一条曲线的首末点虚连一条直线,求所有点与直线的距离,并找出最大距离值dmax..._节点抽稀算法

LNMP环境搭建——PHP篇-程序员宅基地

文章浏览阅读95次。一、源代码安装1.编译安装./configure --prefix=/usr/local/php\--with-config-file-path=/usr/local/php/etc --with-bz2 --with-curl \--enable-ftp --enable-sockets --disable-ipv6 --with-gd \--with..._/json.so from install

随便推点

攻防世界CRYPTO cr3-what-is-this-encryption writeup(待)_cr3加密-程序员宅基地

文章浏览阅读869次。RSA加密根据题目所给的 pqec联想到密码学中学到的RSA加密算法关于RSA:题目中给出了p.q.e.c那么很容易算出来φ(n),进而算出来d,然后得出c,可以跑一个脚本import libnumfrom Crypto.Util.number import long_to_bytesq = int("0xa6055ec186de51800ddd6fcbf0192384ff42d707a55f57af4fcfb0d1dc7bd97055e8275cd4b78ec63c5d592f567c6_cr3加密

React在组件中监听redux中state状态的改变_redux监控state-程序员宅基地

文章浏览阅读1.2w次,点赞2次,收藏4次。解决方式:1、在组件中引入store2、在constructor构造器方法中,重写store.subscribe方法(该方法即是监听state状态改变的放过)组件完整代码如下:import React, { Component } from 'react'import CSSModules from 'react-css-modules'import { connect ..._redux监控state

Gson 将json格式字符串转换为对象_gson字符串转化为对象-程序员宅基地

文章浏览阅读8.4k次。使用谷歌的Gson进行字符串和json对象之间的转换,是很方便的,本文讲解如何使用Gson将json格式的字符串转换为json对象1、先创建实体类 package com.che.pri.bean; public class User { private String name; private String code; ..._gson字符串转化为对象

java service wrapper jar 服务_使用Java Service Wrapper将jar包安装成Windows服务-程序员宅基地

文章浏览阅读167次。encoding=UTF-8# Configuration files must begin with a line specifying the encoding# of the the file.#********************************************************************# Wrapper License Properties (..._pwijar

Cyanogen 宣布年底关停服务, CM fork 为 Lineage-程序员宅基地

文章浏览阅读80次。Cyanogen 公司已宣布于年底关闭与 CyanogenMod 相关的所有服务。由于 Cyanogen 公司拥有有关 Cyanogen 的所有商标,该社区项目不能再继续运行。因此,CyanogenMod 已经划入 LineageOS.该公司在官方微博发表声明称:“作为 Cyanogen 正在进行的重组的一个环节,所有服务以及 Cyanogen 支持..._lineage fork

shardingjdbc 开发问题集_shardingjdbc问题汇总-程序员宅基地

文章浏览阅读1k次。1、分片键日期不能用hutool工具类转化的日期对象去查询,否则会报错报错内容:ShardingvaluemustimplementsComparable解决方法:由于hutool转化的日期对象DateTime没有实现Comparable接口,所以报错,采用jdk的Date类型即可..._shardingjdbc问题汇总

推荐文章

热门文章

相关标签