资料

官方文档:https://help.altair.com/hwdesktop/pythonapi/hypermesh.html

我的理解

Session and Model class

此功能允许用户在单个会话中使用多个 HyperMesh 模型,并通过多窗口布局将它们并排组织在单个页面上。设置了 Session 和 Model 两个类来提供管理此场景的机制。

对于我们常用的情境,只有一个模型,比较简单。

hm.Session()

hm.Model()

Entity Classes

每个 HyperMesh 实体类型(e.g. node, line, element, property)都由 hm.entities 模块中的相应类表示。因此,每个 HyperMesh 实体都可以表示为 Python 对象。所有的可用对象可以在下面网址查到:

https://help.altair.com/hwdesktop/pythonapi/hypermesh/hm_entities.html

Collections

在操作时各种命令都会有一个操作对象的范围,比如删除 1~10 号单元,复制所有结点等操作。这些对象的范围指定就需要使用 Collections 类。例如

1
2
3
4
5
6
7
8
9
10
11
12
% 选择1,2号Component
hm.Collection(model, ent.Component, [1, 2])

% 选择id=1,2的component里面的单元
elems = hm.Collection(model, ent.Element, hm.Collection(m, ent.Component, [1,2]))

% 特别的,如果需要所有单元,就不需要第3项了
elems = hm.Collection(model,ent.Element)

# 空的选集
empty_elem_col = hm.Collection(model,ent.Element,populate=False)

关于选集,有 4 个特别的函数: CollectionByAdjacent, CollectionByAttached, CollectionByDisplayed, CollectionByFace

1
2
# Collection of displayed elements
elm_disp = hm.CollectionByDisplayed(model, ent.Element)

查询与修改函数

Model Class Query Functions

所有可用的查询函数:https://help.altair.com/hwdesktop/pythonapi/hypermesh/hm_query_funcs.html

查询函数使用说明:https://help.altair.com/hwdesktop/pythonapi/hypermesh/hm_user_guide/hypermesh_funcs.html#query-functions

所有 HyperMesh 函数都返回一个状态对象。大多数查询函数还返回一个结果对象。通过状态对象,您可以查看函数返回的消息以及告诉函数是否成功的状态。状态值 0 表示成功,非零值表示失败。

查询函数的名称总是以“hm_”开头。它们的特点是,它们中的大多数除了返回状态对象外,还返回携带查询信息的结果对象。有两种类型的结果对象/类——HmQueryResult 和 HmQueryResultList。

HmQueryResult 是一种 HyperMesh 数据类型,默认情况下具有属性键result.key,该属性键返回携带函数返回的信息的所有属性的列表。

HmQueryResultList 表示 HmQueryResult 对象的列表。len(result),result[0].key

Model Class Modify Functions

https://help.altair.com/hwdesktop/pythonapi/hypermesh/hm_mod_funcs.html

比如连直线,多个直线围成面,移动复制单元等

牛刀小试

好,大致知识点就上面那些,下面我们要创建一个面并计算面积,步骤应该是:点-线-面-计算面积。

Step1: 创建 4 个角结点

要先找点的 Class, 好,找到了,叫Nodes, 下面是 Nodes 类的定义文档。

1
2
3
4
5
6
7
class Node(amodel: Model, *args, **kwargs)

Parameters: 几乎所有的Entity Class都是这种格式
amodel (Model) – HyperMesh model object.
args (dict) – User can specify internal entity ID to create an entity object
for an existing entity.
kwargs (dict) – Optional name-value pair arguments defining attributes of a new entity.

根据文档,需要输入 Model 对象,还需要一些参数。args 是 ID,kwargs 是一些键值对。这些键值对需要去 DateName 里面找:data_names-nodes.htm

1
2
3
4
5
6
7
8
9
10
11
# creat node
import hm
import hm.entities as ent

model = hm.Model()

nodeNew = ent.Node(model)
nodeNew.localcoordinates =[1,2,3]
nodeNew.id
nodeNew.coordinates

下面创建四个 node

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import hm
import hm.entities as ent

model = hm.Model()

N1 = ent.Node(model)
N1.localcoordinates =[0,0,0]
N2 = ent.Node(model)
N2.localcoordinates =[2,0,0]
N3 = ent.Node(model)
N3.localcoordinates =[2,1,0]
N4 = ent.Node(model)
N4.localcoordinates =[0,1,0]

Step2: 连直线

想着肯定是使用 Line Class, 再去找 Line 的 DataName: data_names-lines.htm, 应该需要 startcoords 与 endcoords。实验一下:上面的 Line Class 好像不能创建直线。

1
2
3
4
5
import hm
import hm.entities as ent
model = hm.Model()
L1 = ent.Line(model)
# RuntimeError: Invalid uid

使用 Model 的修改函数可以,如下。但是 L1 不能直接拿到 id。可使用hm_entitymaxid查询并记录编号

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import hm
import hm.entities as ent

model = hm.Model()

# *linecreatestraight x1 y1 z1 x2 y2 z2
L1 = model.linecreatestraight(x1=0,y1=0,z1=0, x2=2,y2=0,z2=0)
L2 = model.linecreatestraight(x1=2,y1=0,z1=0, x2=2,y2=1,z2=0)
L3 = model.linecreatestraight(x1=2,y1=1,z1=0, x2=0,y2=1,z2=0)
L4 = model.linecreatestraight(x1=0,y1=1,z1=0, x2=0,y2=0,z2=0)

status,result = model.hm_entitymaxid(ent.Line)
L4_id = result.maxInternalID

lines = hm.Collection(model, ent.Line)
for it in lines:
print(f"Line ID:{it.id}")
print(it.startcoords)
print(it.endcoords)

print('xdd')

现在的问题是这些修改函数怎么能知道,最简单的方法还是在 HyperMesh 操作一遍,然后看 command.tcl 文件

Step3: 创建面

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import hm
import hm.entities as ent

model = hm.Model()

# 创建直线 *linecreatestraight x1 y1 z1 x2 y2 z2
L1 = model.linecreatestraight(0,0,0, 2,0,0)
L2 = model.linecreatestraight(2,1,0, 0,1,0)
L3 = model.linecreatestraight(2,1,0, 0,1,0)
L4 = model.linecreatestraight(0,1,0, 0,0,0)

# 创建选集
lines = hm.Collection(model, ent.Line)

# 创建面 *surfacesplineonlinesloop mark_id fill_gaps use_surfs options
model.surfacesplineonlinesloop(lines,1,1,67)

# 查看面积
status,result = model.hm_entitymaxid(ent.Surface)
face1_id = result.maxInternalID
face1_class = ent.Surface(model, face1_id)
face1_class.area

案例

官方案例:https://help.altair.com/hwdesktop/pythonapi/hypermesh/examples/hm_examples.html#

获取某 entity 最大编号

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import hm
import hm.entities as ent

model = hm.Model()

N1 = ent.Node(model)
N1.localcoordinates =[0,0,0]
N2 = ent.Node(model)
N2.localcoordinates =[2,0,0]

# 获取结点最大编号
status,result = model.hm_entitymaxid(ent.Node)
result.maxInternalID

在此强调:要善于使用 Tab 键

查看 X 号结点的坐标

1
2
3
4
5
6
7
8
import hm
import hm.entities as ent

model = hm.Model()
id = 2
node = ent.Node(model, id)
node.coordinates
node.y

创建并指定材料与属性

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import hm
import hm.entities as ent

model = hm.Model()

# 创建材料
mat1 = ent.Material(model)
mat1.name = "Steel"
mat1.cardimage = "MAT1"
mat1.E = 21e04
mat1.Nu = 0.3
mat1.Rho = 7850

# 创建属性,并为属性添加材料
prop1 = ent.Property(model)
prop1.name = "Prop"
prop1.cardimage = "PSOLID"
prop1.materialid = mat1

# 为某个Component指定属性
compID = 5
comp1 = ent.Component(model, compID)
comp1.property = prop1

创建一个矢量用于移动单元

1
2
3
4
5
6
7
import hm
import hm.entities as ent

model = hm.Model()

elems = hm.Collection(model,ent.Element)
model.translatemark(collection=elems,vector_id=hm.hwTriple(0.0,0.0,1.0),distance=500.0)