在仿真过程中,常常遇到已经处理玩模型了,突然要增加不同直径的圆孔,要是手工改动费时费力,可以通过Tcl语言对hypermesh进行二次开发,通过源代码自动生成指定半径的圆孔,并重新划分圆孔周边的网格,保证网格雅可比大于0.3。
大致思路如下:
1. 确定圆心节点,生成圆(line)
2.删除圆内所以壳单元
3.用project功能投影圆周边的节点到line
4.用remesh重新划分圆孔周边的壳单元
获取用户输入
首先,你需要定义一些基本参数,例如圆孔的中心坐标、半径以及壳单元的 ID。
# 定义圆孔参数
set centerNode [list x y z] ;# 圆心坐标
set radius 5.0 ;# 圆孔半径
set tolerance 0.1 ;# 容差,用于选择单元
创建临时节点
使用 createNode 命令在指定的圆心位置创建一个临时节点。
# 创建圆心节点
set centerNodeID [hwi GetSession Handle]
hwi GetSession -1 createNode $centerNode
生成圆周线
根据圆心节点和半径生成一个圆周线。可以通过将圆周均匀分成多个点来实现。
# 生成圆周线
set numPoints 36 ;# 圆周上点的数量
set linePoints {}
for {set i 0} {$i < $numPoints} {incr i} {
set angle [expr {2 * 3.141592653589793 * $i / $numPoints}]
set x [expr {[lindex $centerNode 0] + $radius * cos($angle)}]
set y [expr {[lindex $centerNode 1] + $radius * sin($angle)}]
lappend linePoints [list $x $y [lindex $centerNode 2]]
}
# 创建线
set lineID [hwi GetSession Handle]
hwi GetSession -1 createLine $linePoints
删除圆内的壳单元
使用几何条件删除圆内的所有壳单元。你需要遍历所有壳单元并检查它们的中心点是否在圆内。
# 删除圆内的壳单元
set elems [hwi GetSession -1 getElementList]
foreach elemID $elems {
set centroid [hwi GetSession -1 getElementCentroid $elemID]
set dist [expr {sqrt(pow([lindex $centroid 0] - [lindex $centerNode 0], 2) + pow([lindex $centroid 1] - [lindex $centerNode 1], 2))}]
if {$dist < $radius} {
hwi GetSession -1 deleteElement $elemID
}
}
投影节点到线
使用 project 功能将圆孔边上的节点投影到之前生成的线上。
# 投影节点
set projectedNodes {}
foreach nodeID $linePoints {
set projectedNodeID [hwi GetSession -1 projectNode $nodeID $lineID]
lappend projectedNodes $projectedNodeID
}
重新划分圆孔周边单元
最后,使用 mesh 命令重新划分圆孔周边的单元,并确保雅可比大于 0.3。
# 重新划分单元
set meshQuality 0.3
hwi GetSession -1 mesh $projectedNodes -quality $meshQuality