资料 官方文档: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 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 import hmimport hm.entities as entmodel = 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 hmimport hm.entities as entmodel = 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 hmimport hm.entities as entmodel = hm.Model() L1 = ent.Line(model)
使用 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 hmimport hm.entities as entmodel = hm.Model() 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 hmimport hm.entities as entmodel = hm.Model() 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) 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 hmimport hm.entities as entmodel = 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 hmimport hm.entities as entmodel = 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 hmimport hm.entities as entmodel = 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 compID = 5 comp1 = ent.Component(model, compID) comp1.property = prop1
创建一个矢量用于移动单元 1 2 3 4 5 6 7 import hmimport hm.entities as entmodel = 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 )