上次写了一篇在Hypermesh中自动生成六面体网格的二次开发文章:
球的六面体网格自动化程序
听说Hypermesh可以自动画球的六面体网格了?
是当时写的比较随意,里面有几个问题没处理掉,文章中也提到了
虽然不影响第一次网格的生成,但是第二次就会报错,今天刚好有空,就把以前的代码修改了下,现在生成球 的六面体网格就比较ok了
球的套娃行为,10个不同大小的球六面体网格重叠
当时的几个问题如图所示:
那就从第一个问题开始吧
如果存在comp,会报错,以前没有去判断这个comp是否存在,导致我在新建comp的时候就会报错,现在的逻辑就是如果存在,就删除comp,再生成comp,或者说也可以写成判断comp存在的话,在comp名称后面加个数字作为区分
# 使用的是很简单的catch方法,如果存在先删除,
# 如果不存在的话,删除这段代码会报错,所以catch{}一下,问题不大
catch {
*createmark components 1 $SphereCompName
*deletemark components 1
}
*createentity comps name=$SphereCompName
第二个问题,八分之一球的solidID识别问题之前都是通过最大的ID来识别的,这个方法本身就是错误的,因为如果新建一个hm运行一次的话,没啥问题,但是实际场景谁会为了生成球网格而新建个hm文件,并且如果我要生成多个不同大小的球,那这个逻辑就不可用了
现在的逻辑就是通过坐标来定位到想要的八分之一模型,这样的话,识别的很准确了
#留下1/8球体
# 使用与半径关联的点坐标进行solid的ID识别
set retainPoint "$tol $tol $tol"
foreach {x100 y100 z100} $retainPoint {}
*createmark solids 1 $SphereCompName
set retainSolidId [lindex [hm_measureshortestdistance2 $x100 $y100 $z100 solids 1 0 0] 4]
*createmark solids 1 "by comps name" $SphereCompName
hm_markremove solids 1 $retainSolidId
set remove [hm_getmark solids 1]
*createmark solids 1 {*}$remove
*deletesolidswithelems 1 0 1
第三个问题,球六面体网格质量的问题这个问题目前我还没解决,因为在14.0和2021.1上测试,生成的球体网格很规整,但是在2022.3上测试,生成的雅克比较低,而且并不是横平竖直的那种,我觉得这个可能大概率跟网格的基础算法有关,说白了就是版本之间的bug问题,感兴趣的读者可以测试下
Hypermesh 14.0的效果:
Hypermesh 2022.3的效果:
还可能有个问题就是你的球半径假设只有0.5或者1mm,然后使用0.1mm的网格尺寸,这样的话会报错,需要你在快捷键O中进行geometry和mesh选项中tol的设置,改小一些,就可以生成网格了