大家好,我是小鲸鱼,好久不见,这是我写的第二篇hypermesh二次开发的文章,是关于批量选择面积相同的面然后去除的,这个功能的想法主要参考了SCDM,在模型简化界,我个人觉得它算是排老大的,虽说各种前处理软件对网格功能很完善,但是就拿hm而言,几何简化功能就是一坨shit,用它简化模型会感觉到心烦、脑瓜嗡嗡的,甚至想砸电脑的冲动
可能有些读者会说hm并没有宣传它的几何功能有多厉害,这也没错,确实,但我还是想吐槽一下,因为我经常会遇到几何修改会造成保存的时候软件奔溃,然后修了好久的几何功亏一篑,还有就是我去除圆角/倒角去除不掉的,去除掉导致模型破面的……等等,一系列在我看来很轻易就能搞定的问题
如果有选择,我会在scdm中搞完几何之后再用hm去画网格,或者scdm搞完几何直接ansys/abaqus画网格,但就事论事,公司用啥我用啥,想各个软件来回倒腾,也确实并非易事,希望Altair在新版本中能给几何功能这块多考量一下,毕竟全程用一个软件做整套的体验度还是极佳的
哈哈,闲话不扯,就直接上今天的主题吧,对于模型一些简单的特征去除,比如塑胶件上的顶针印,金属塑胶结构上的定位槽,这些特征的大小基本都是相同的,如果要在hm中一个个去简化,几个还好,就是鼠标框框一顿点的事情,那万一几十个,几百个,那点到啥时候,如果说只用hm自带的功能去除,如果不是重要件,我估计我都懒得简化,所以我自己就写了一个简易版的几何去除功能,主要针对对象是同大小的圆角或者圆孔(不是通孔),如果说用的时候有一个意外的发现,那就是我给你加的buff
对于二次开发,我上次也写了一篇简单的文章,读者也可以参考一下
01
SCDM界面的相同特征的选取
SCDM这个功能我真的要吹爆,太简便了,选中之后之后快捷键F就直接去除掉孔了,1s搞定,还可以选择半径范围进行条件选择
02
hm面积相同面清理界面
其中,先选中要去除的面,也就是用Choose Surf选择一个面,程序就会根据选择的面选中跟它同样大小的面并高亮,如果选择的面已达到去除的标准, 那就直接用Remove Surf按钮进行清除,一般清除孔的时候需要选中孔的底面和侧壁才能达到去除成功的效果,所以一般情况下就要用到Adjacent,每点一次这个按钮,把高亮选中的面进行邻边选中,然后再点Remove Surf就可以清理了
这个是最常规的操作,但是也许会遇到这种情况,比如我面积相同的孔,程序都给选中了,但是有些孔是不需要清理的,那就要取消掉那个孔的选择,此时就可以用EX Surf的按钮了,然后把不需要的孔点选一下,就取消选择了,再去Remove就可以了
代码思路
选中要批量选择的面,程序自动通过获取选择那个面的面积
把界面中显示的所有surf进行选中,然后遍历一遍,进行面积判断
如果面积相等的话就选中
去除选中的面
思路大概就是这样子的,但是在这期间,我写这个判断面积的时候遇到了一个问题就是,hm测出来的面积保留小数点位数很多,也就是说如果我用面积完全相等来判定,那么大概率是选不中的,因为1和1.00000000001这两个数字大小没啥区别,但是程序却认为这两个是不相等的,所以我本来用的是set tcl_precision 4,也就是科学保留4位数,但是发现如果选择的面积大,比如1000.2553,hm会输出1000.3,这样的话,也可能遗漏某些面积一样的surfs,后来我就用了面积做差法,如果两个面的面积相减小于0.0001的话,就判定这两个面的面积相同
其次就是EX surf这个按钮,背后的逻辑就是将两组surf的id面,进行反求交,用的是*markdifference的命令
笔者写代码比较随意,很多情况下,都没有写注释,这是一个很不好习惯,但是后来看着这简短的几十行代码,我觉得如果对hm二开比较感兴趣的估计都能看懂,我就不写注释了,哈哈,其实就是懒而已
虽然写的很简单,没啥技术含量,但希望不要拿来恶用
下面源代码附上
proc main {} {
*createmarkpanel surfs 1 "please choose the surfs that you will remove"
set eq_surf_id [hm_getmark surfs 1]
set samearea [list]
set surf_area [hm_getareaofsurface surfs $eq_surf_id]
*createmark surfs 2 "displayed"
set all_surf_id [hm_getmark surfs 2]
foreach area $all_surf_id {
set temp_surf_area [hm_getareaofsurface surfs $area]
if {[expr abs($surf_area - $temp_surf_area) < 0.0001] } {
lappend samearea $area
}
}
hm_markclearall 1;hm_markclearall 2
*createmark surfs 1 {*}$samearea
hm_highlightmark surfs 1 "high"
}
proc exclusion {} {
*createmarkpanel surfs 2 "please choose the exclusion surfaces"
set ex_surf_id [hm_getmark surfs 2]
*markdifference surfs 1 surfs 2
}
proc remove {} {
*createmark lines 1
*createmark lines 2
*surfacefilletremove 1 1 2
}
proc sameareatool {} {
catch {destroy .win}
set mainfrm [frame .win ]
hm_framework addpanel $mainfrm Cleantool
hm_framework drawpanel $mainfrm
set f1 [labelframe $mainfrm.lbl -text "Same Area surfs clean" -bd 2 -fg DarkRed ]
set lbl [label $f1.lbl -text "EX Surf :是要取消选择的surfs" -fg blue -width 15]
set choose_btn [hwtk::button $f1.choose_btn -text "Choose Surf" -width 10 -command {main}]
set adjacent_btn [hwtk::button $f1.adjacent_btn -text "Adjacent" -width 12 -command {*appendmark surfs 1 "by adjacent";hm_highlightmark surfs 1 "high"}]
set remove_btn [hwtk::button $f1.remove_btn -text "Remove Surf" -width 12 -command {remove}]
set ex_btn [hwtk::button $f1.ex_btn -text "EX Surf" -width 10 -command {exclusion}]
grid $f1 -row 0 -column 0 -sticky nsew
grid $choose_btn -row 1 -column 0 -padx 5 -pady 5 -sticky nsew
grid $adjacent_btn -row 2 -column 0 -padx 5 -pady 5 -sticky nsew
grid $remove_btn -row 2 -column 1 -padx 5 -pady 5 -sticky nsew
grid $ex_btn -row 1 -column 1 -padx 5 -pady 5 -sticky nsew
grid $lbl -row 3 -column 0 -columnspan 5 -padx 5 -pady 5 -sticky ew
}
sameareatool