本文摘要(由AI生成):
本文主要介绍了 HyperMesh 二次开发中的 tcl 流程控制结构,包括顺序结构、分支结构和循环结构。顺序结构没有任何跳转,符合我们的思维习惯,而且在 HyperMesh 二次开发中确实有很多时候顺序结构就够用了。分支结构有两种,if 和 switch,if 比较常用,而且完全可以替代 switch,当分支很多时我们为了让程序看起来简洁会考虑改用 switch。循环结构可以说是程序设计的关键之一,tcl 中有三种循环结构,分别是 for, while 和 foreach。foreach 循环变种包括常规 foreach、重复这个过程、每次从一个列表中取多个值并赋给多个变量和最通用的形式。最后,文章通过一个案例实际操作演示了如何使用自己写的程序在实际中应用。
新的一期 HyperMesh 宝典
又和大家见面啦!
上一期的作业大家完成了吗?
如果遇到任何问题欢迎给我们留言哈~
这期教程我们来说说
二次开发中的 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
这期教程就到这里啦~ 喜欢的话不妨给我们点个赞或者分享到朋友圈,我们下期见啦~