【hm二开】3D网格质量优化

ZWT0条评论 88 次浏览

在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;
};

截图版:


发表评论

? razz sad evil ! smile oops grin eek shock ??? cool lol mad twisted roll wink idea arrow neutral cry mrgreen