又和大家見面啦!
上一期的作業大家完成了嗎?
如果遇到任何問題歡迎給我們留言哈~
這期教程我們來說說
二次開發中的 tcl 流程控制結構。
任何程式設計語言都有自己的流程控制結構,現代程式設計語言一般在程式設計中只使用順序、分支和迴圈三種流程控制結構,本文會依次介紹這三種結構~
為了避免純粹介紹語言語法讓本文過於呆板,本期將圍繞注塑件手工中面抽取使用到的幾個功能來寫代碼。
1、順序結構
要說哪種結構最好寫,那當然是順序結構啦~ 順序結構沒有任何的跳轉,符合我們的思維習慣。而且在 HyperMesh 二次開發中確實有很多時候順序結構就夠用了。
比如我們想實現了螺柱的中面抽取,我們可以先創建一條曲線然後將曲線拉伸得到曲面,最後再對曲面進行裁剪得到最終的中面。腳本運行的效果如下:
為了方便調用,我們把腳本包裝成一個函數,腳本內容如下:
01
變數初始化
02
獲取圓弧資訊
03
獲取圓的平面法向資訊
具体方法是在圆弧1上创建5个等距点,然后在点1点2和点1点3之间分别创建一个向量,然后叉乘得到法向:
04
創建圓並清理臨時節點
演示如下:
2、 分支結構
tcl 語言中有兩種分支結構,if 和 switch,if 比較常用,而且完全可以替代 switch,當分支很多時我們為了讓程式看起來簡潔會考慮改用 switch。
下圖中 switch 的例子用來判斷 range 函數後面跟了幾個參數:
我們可以以不同的方式調用range函數:
range 3
range 3 13
range 1 13 3
range 13 3 -3
不過這個 range 函數還是有缺陷的,如果調用方式不恰當有可能陷入閉環,這個問題留給大家作為課後作業思考如何改進。
上面的 switch 結構可以使用如下的 if 結構等效:
3、 迴圈結構
迴圈結構可以說是程式設計的關鍵之一,tcl 中有三種迴圈結構,分別是 for,while 和 foreach。
迴圈結構的應用我首先想起的是列印一個九九乘法表:這裡我用4種不同的二重迴圈來實現同一個問題,你還可以找到更多方法,比如 for+foreach。這說明一個什麼問題呢?就是各種迴圈的語法都是可以等效的,注意這裡用到了前面講過的 range 函數。
所有迴圈得到的輸出都是一樣的,格式不是很好看,可以考慮使用 format 函數進行格式化輸出,大家不妨自己動手試一下吧~
if 和 for 迴圈需要輸入的大括弧比較多,而且大括弧之間的空格是不能省略的。初學者經常會在這裡犯一些語法錯誤,想偷懶的話可以在 notepad++ 裡面定義宏,像下面這樣的結構:
雖然可以偷懶,但我們還是需要反復練習這些輸入直到變成一種手指的條件反射為止。
foreach 迴圈變種
對於 HyperMesh 二次開發來說通常foreach 會用得比較多。從執行的效率來說 foreach 是最高的,從靈活性來說 foreach 也是最靈活的,我們來看看 foreach 迴圈都有哪些變種。
1. 常規 foreach
每次從列表中取一個值
foreach var [list 1 2 3 4 5 6 7 8 9] {
puts $var
}
2
重複這個過程,var1 從緊跟在它後面的列表取值,var2 從緊跟在 var2 後面的列表取值。
foreach var1 [list 1 2 3 4 5 6 7 8 9] var2 [list 1 2 3 4 5 6 7 8 9] {
puts “$var1 X $var2”
}
3
每次從一個列表中取多個值並賦給多個變數
foreach {var1 var2} [list 1 2 3 4 5 6 7 8 9] {
puts “$var1 X $var2”
}
4. 最通用的形式
這是最通用的形式,其它形式都是這種形式的簡化版。
foreach {var1 var2} [list 1 2 3 4 5 6 7 8 9] {var3 var4 var5} [list 1 2 3 4 5 6 7 8 9] {
puts “$var1 X $var2”
puts “$var3 X $var4 X $var5”
}
運行的結果如下,注意如果清單的元素被取完後程式並不會出錯,接下來的變數將會取到空值,這會產生一些最常見的 bug。
foreach 迴圈實例
接下來我們用 foreach 迴圈來實現將多條線向兩端進行延伸的功能,代碼如下:
while 迴圈
while 迴圈最常用的地方是讀取檔,比如之前講過的使用 while 迴圈從 csv 檔讀取節點座標並創建臨時節點的腳本如下:
while 迴圈還經常用於一些永久迴圈(可以用 break 在循環體內退出)。
比如我們在本文開頭的地方創建圓的函數,每次只能創建一條曲線,如果需要在下一處螺柱處再創建一條就必須要重新運行腳本。我們可以通過 while 迴圈免去這個麻煩。
create_circle 函數的函數體裡面要加上相應的退出機制,比如可以在16行後面加上一行進行判斷所選圓弧的數量是否為2,如下:
案例實際操作
最後我們來看一下自己寫的程式怎麼在實際中使用吧。
我們的輸入是下圖中的注塑件(儀錶盤的局部):
希望得到的結果是帶厚度的中面網格,我們一起來看看該怎麼做吧~
步驟1
新建 comp,命名為 circle 並置為當前comp
步驟2
運行腳本得到圓曲線
步驟3
新建comp,命名為rib_line並置為當前comp
步驟4
得到加強筋的中線並運行腳本進行雙向延伸。
步驟5
新建comp,命名為 base_surf 並置為當前comp;
將基準面offset-1.25得到基面的中面。
步驟6
新建 comp,命名為 rib_circle_surf 並置為當前 comp,選擇剛剛創建的圓和曲線進行法向拉伸得到中面。
步驟7:曲面裁剪
步驟8
刪除多餘面,得到最終的中面。
步驟9:幾何清理和網格劃分
步驟10
從幾何體獲取厚度並創建相應的prop
這期教程就到這裡啦~ 喜歡的話不妨給我們點個讚或分享出去唷,我們下期見啦~
課後作業
HyperMesh自帶強大的自帶中面抽取功能,請按照素材視頻裡的操作完成零件的中面抽取和網格劃分。素材裡已經提供了劃分前後的模型唷~
下期預告
下次我們會講 tcl 中的函數及調用外部包。編寫自己的函數是簡化程式設計工作的關鍵也是最有意思的部分,感興趣的小夥伴要持續關注我們唷~
留言列表