【hm二开】3D网格质量优化
在hypermesh二次开发中,我们网格划分完成以后,检查并优化网格质量是非常必要的步骤,相对来说,2D网格质量的优化相对简单,API相对完善,3D网格质量的优化显得不怎么友好。
而hypermesh – Utility中就有一个比较友好的3D网格优化工具:Solid Mesh Optimization,如下图:


如果能直接在我们的代码中加入Solid Mesh optimization工具中的函数,就省下了我们自己写优化算法的时间了。
本文即介绍如何在我们自己的脚本中调用此工具:
首先,明确如下几个知识点:
1.此工具tcl文件位于:
[hm_info -appinfo ALTAIR_HOME]/hm/scripts/FixSliverTetras.tcl
2.此工具的网格质量检查执行proc为:
::FixSliverTetraElems::CheckProc
3.此工具的网格优化执行proc为:
::FixSliverTetraElems::BuildDialog
接下来,以四面体网格优化为例,说明调用过程:
先来看一下它的网格优化函数,注释见下方代码:
proc ::FixSliverTetraElems::ApplyProc { } {
if {[::hwt::Notebook $::FixSliverTetraElems::g_VarArray(tab_ctrl) cget curpage]==”Hexas”} {
::FixSliverTetraElems::ApplyProcHex;
return;
}
## 如果当前tab页为 Hexas,则调用6面体的优化函数,然后返回
if {[::hwt::Notebook $::FixSliverTetraElems::g_VarArray(tab_ctrl) cget curpage]!=”Tetras”} {
::FixSliverTetraElems::ApplyProcSecondOrder;
return;
}
## 如果当前tab页为Second order elements,则调用二阶网格优化函数,然后返回
::FixSliverTetraElems::ShowHideWidgetWhileApply 0;
## 以上这句话不用考虑
::CriteriaEditor::ReadFromCritTable3D 0;
## 以上这句话获取当前设置的网格质量参数
*tetmesh_set_input nodes $::FixSliverTetraElems::g_VarArray(anchor_nodes) 5 comps $::FixSliverTetraElems::g_VarArray(size_box) 4;
## 这块有两个变量分别获取Anchor Nodes和Refinement box Component
set tableList [::FixSliverTetraElems::GetTetraMeshStr];
## 从界面表格中获取优化项次和参数指标
if { $::FixSliverTetraElems::g_VarArray(valid_param) ==0 } {
::FixSliverTetraElems::ShowHideWidgetWhileApply 1;
return;
}
## 不用考虑
set numEntries [llength $tableList];
eval *createstringarray $numEntries $tableList;
set ::FixSliverTetraElems::g_VarArray(summary) ” “;
::FixSliverTetraElems::ResizeDlg
set ::FixSliverTetraElems::g_VarArray(ele_fix) [ hm_getmark elems 1 ];
## 这块有一个关键命令,因为需要优化的网格是从界面中手工选取的,
## 所以我们要做的就是在我们的代码中把需要优化的网格放到elems mark 1中
set opt_shell_remesh 6;
if { $::FixSliverTetraElems::g_VarArray(msh_opt_flag) == “remesh” } {
set opt_shell_remesh 7;
}
if [catch { *tetmesh elems 1 $opt_shell_remesh elems 2 1 1 2} err] {
::FixSliverTetraElems::ShowHideWidgetWhileApply 1;
return;
}
::FixSliverTetraElems::CheckProc ;
::FixSliverTetraElems::ShowHideWidgetWhileApply 1;
*entityhighlighting 1;
hm_highlightmark elements 1 h;
hm_highlightmark elements 2 h;
}
由以上注释可见,我们需要在我们自己代码中做的就是把需要优化的网格放到elems mark 1中,然后供优化函数获取就行了,其它的参数设置默认采用界面中的默认参数,当然也是可以自定义默认参数的,本文不延申。
我们自己函数需要这么写:
proc ::XXX::TetraOptimization {elem_list} {
## 形参 elem_list 为需要优化的网格
*clearmark elems 1;
*clearmark elems 2;
## 清空elems mark 1和2
set script_path “[hm_info -appinfo ALTAIR_HOME]/hm/scripts/FixSliverTetras.tcl”;
source “$script_path”;
## 加载 tcl文件
## set ::FixSliverTetraElems::dlg_built “dlg_open”;
## ::FixSliverTetraElems::BuildDialog;
## 由于tcl文件中已经直接执行了打开界面的函数,故我们自己代码中不需要再次打开;
## 如果不希望出现界面,可加如下代码把界面隐藏掉:
## wm withdraw .fixSliverTetraElemsDlg;
eval *createmark elems 1 $elem_list;
## 将需要优化的单元放入 elems mark 1中
::FixSliverTetraElems::ApplyProc;
## 调用优化函数
catch {destroy .fixSliverTetraElemsDlg};
## 关闭界面
*clearmark elems 2;
*clearmark elems 1;
return;
};
截图版:
