Hypermesh二次開發之批量選擇相同面

大家好,我是小鯨魚,好久不見,這是我寫的第二篇hypermesh二次開發的文章,是關于批量選擇面積相同的面然后去除的,這個功能的想法主要參考了SCDM,在模型簡化界,我個人覺得它算是排老大的,雖說各種前處理軟件對網格功能很完善,但是就拿hm而言,幾何簡化功能就是一坨shit,用它簡化模型會感覺到心煩、腦瓜嗡嗡的,甚至想砸電腦的沖動


可能有些讀者會說hm并沒有宣傳它的幾何功能有多厲害,這也沒錯,確實,但我還是想吐槽一下,因為我經常會遇到幾何修改會造成保存的時候軟件奔潰,然后修了好久的幾何功虧一簣,還有就是我去除圓角/倒角去除不掉的,去除掉導致模型破面的……等等,一系列在我看來很輕易就能搞定的問題


如果有選擇,我會在scdm中搞完幾何之后再用hm去畫網格,或者scdm搞完幾何直接ansys/abaqus畫網格,但就事論事,公司用啥我用啥,想各個軟件來回倒騰,也確實并非易事,希望Altair在新版本中能給幾何功能這塊多考量一下,畢竟全程用一個軟件做整套的體驗度還是極佳的


哈哈,閑話不扯,就直接上今天的主題吧,對于模型一些簡單的特征去除,比如塑膠件上的頂針印,金屬塑膠結構上的定位槽,這些特征的大小基本都是相同的,如果要在hm中一個個去簡化,幾個還好,就是鼠標框框一頓點的事情,那萬一幾十個,幾百個,那點到啥時候,如果說只用hm自帶的功能去除,如果不是重要件,我估計我都懶得簡化,所以我自己就寫了一個簡易版的幾何去除功能,主要針對對象是同大小的圓角或者圓孔(不是通孔),如果說用的時候有一個意外的發現,那就是我給你加的buff


01

SCDM界面的相同特征的選取

Hypermesh二次開發之批量選擇相同面的圖1


SCDM這個功能我真的要吹爆,太簡便了,選中之后之后快捷鍵F就直接去除掉孔了,1s搞定,還可以選擇半徑范圍進行條件選擇


Hypermesh二次開發之批量選擇相同面的圖2


Hypermesh二次開發之批量選擇相同面的圖3


02

hm面積相同面清理界面

Hypermesh二次開發之批量選擇相同面的圖4


其中,先選中要去除的面,也就是用Choose Surf選擇一個面,程序就會根據選擇的面選中跟它同樣大小的面并高亮,如果選擇的面已達到去除的標準, 那就直接用Remove Surf按鈕進行清除,一般清除孔的時候需要選中孔的底面和側壁才能達到去除成功的效果,所以一般情況下就要用到Adjacent,每點一次這個按鈕,把高亮選中的面進行鄰邊選中,然后再點Remove Surf就可以清理了


這個是最常規的操作,但是也許會遇到這種情況,比如我面積相同的孔,程序都給選中了,但是有些孔是不需要清理的,那就要取消掉那個孔的選擇,此時就可以用EX Surf的按鈕了,然后把不需要的孔點選一下,就取消選擇了,再去Remove就可以了


Hypermesh二次開發之批量選擇相同面的圖5


Hypermesh二次開發之批量選擇相同面的圖6


Hypermesh二次開發之批量選擇相同面的圖7


Hypermesh二次開發之批量選擇相同面的圖8

代碼思路


  1. 選中要批量選擇的面,程序自動通過獲取選擇那個面的面積

  2. 把界面中顯示的所有surf進行選中,然后遍歷一遍,進行面積判斷

  3. 如果面積相等的話就選中

  4. 去除選中的面


思路大概就是這樣子的,但是在這期間,我寫這個判斷面積的時候遇到了一個問題就是,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 {*}$sameareahm_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 dra wpanel $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


文章來源:CAE中學生

登錄后免費查看全文
立即登錄
App下載
技術鄰APP
工程師必備
  • 項目客服
  • 培訓客服
  • 平臺客服

TOP

1
2
6