联系我们:186 6505 3298
软件安装
► 学习 Tcl 语言自然需要一个 Tcl 解释器
► HyperMesh 安装后自带Tcl解释器
► 你也可以下载 ActiveTcl 进行练习,ActiveTcl 不仅自带 Tcl 的,而且不用每次都占用 HyperMesh 的 license,启动也快很多。
Tips:学习编程语言一般先尝试两样最简单的东西:输出 “hello world!” 和进行算术运算。学习的方法就是在Tcl解释器里面进行交互的执行。下面我们就来看看这两项要怎么做吧~
输出 "Hello World!"
► Tcl 中输出一个字符串有几种方法:
第一种: % puts “Hello World!”
输出: Hello World!
第二种: tk_messageBox –message “Hello World!”
输出:弹出框
Tips:为了方便大家识别,我们把输入部分放在%后面,把输出放在=> 后面,下面的例子都遵循这个规则。
算术运算
► Tcl 语言使用 expr 函数进行算术运算,例如:
% expr { 1+1 }
=> 2
% expr { max(pow(2,1.3), sin(1.0), acos(0.4), abs(tan(3.0)), min(exp(4.0), sqrt(5.0))) }
=> 2.4622888266898326
Tips:Tcl 推荐把所有表达式都放在“{ }”中,这样运行效率会高很多
如何运行一个文件
► 通常如果执行的命令很多,我们会将这些命令保存在一个后缀为Tcl的文件里。
► 比如,我们把 puts "Hello World!" 放在文件 D:hello.tcl 中,然后打开 tclsh 或者 HyperMesh 的命令行窗口。
% source {D:hello.tcl}
=> Hello World!
创建和使用变量
► 最简单的变量如下:
% set x 123
=> 123
% set y 111
=> 111
% set sum_res [ expr { $x + $y } ]
=> 234
在tcl语言中下面的命令是合法的
% set set set
=> set
控制结构
► 上期我们运行程序的时候并没有使用变量,但是如果我们使用变量来做,上期程序就都可以在3—5行内搞定。
► 把下面的语句放在文件 D:createnodes.tcl 中然后在 HyperMesh 的命令窗口中执行。
% source {D:createnodes.tcl}
set x_list { 0 1 2 3 4 5 6 7 8 9 }
set y_list { 0 1 2 3 4 5 6 7 8 9 }
set z_list { 0 1 2 3 4 5 6 7 8 9 }
foreach x $x_list y $y_list z $z_list {*createnode $x $y $z 0 0 0}
► 额外的好处是如果xyz的节点坐标变了,我们只需要修改前三行就可以了。
Tcl 与 HyperMesh
► 学习使用 Tcl 语言编写 HyperMesh 二次开发程序实际上是学习以下两项:
1、Tcl 语言的语法,也就是下一页讲到的十来条命令解析规则;
2、学习每一条命令,包括Tcl语言带的核心命令,一些包中的扩展命令,以及最最重要的 HyperMesh 为 Tcl 增加的命令,这部分通常也称为 API 。
解释器解析的简单实例
01变量替换
02命令替换
命令解析规则
► Tcl 语言最常犯的错误是搞不清楚替换在什么情况下发生,什么情况下不发生。
► Tcl 解释器就是从上到下依次执行每一条命令,每一条命令都是预先定义的函数。
► Tcl 没有保留字,只有几条解析命令的规则。
► 解析阶段各个单词的值没有任何具体意义,解析完全是简单的字符串操作。
01规则一
► 命令由单词组成,除以下几种特殊规则外,单词之间通过空格或制表符分割。
特殊规则一: { } 内的所有内容为一个单词,除了续行外不进行任何其它替换。
特殊规则二:双引号" "内为一个单词,进行命令替换、变量替换和反斜线替换。
02规则二
► 命令的第一个单词是函数名,后面的其它单词都是该函数的参数。
03规则三
► 通常换行符结束命令,分号也可结束命令。通常每行只写一条命令,行尾不加分号。
04规则四
► 命令替换:如果解析过程碰到 [ ],先求 [ ] 内的值再继续解析,[ ] 可以嵌套。
% set a 5
% set b 6
% puts [set c [expr {$a + $b}]] #这是一条复合命令,实际上执行puts命令前已经替换为puts 11
05规则五
► 变量替换:如果过程碰到 $ ,先将 $ 连同后面的变量名替换为变量的值,解释器对每个字符只会扫描一次,替换只会发生一次不会嵌套。即便替换的结果包含 $ 也不会再次进行替换。
% set company ALTAIR
% set module preprocess
% set $company$module SimLab
% puts $$company$module
我们前面刚刚说了中括号的命令替换是可以嵌套的。
% set company ALTAIR
% set module preprocess
% set $company$module SimLab
% puts [set [append company $module]]
或者把上面一句写成
% puts [set [set company][set module]]
另外一种方法是构建命令字符串,然后利用 eval 命令把该字符串当成命令执行。
% set company ALTAIR
% set module preprocess
% set $company$module SimLab
% set cmd {}
% append cmd {puts }
% append cmd {$}
% append cmd $company$module
% eval $cmd
当然,也可以使用数组/字典等高级数据类型来处理这个问题,这些我们放在下一讲介绍。
06规则六
► 反斜线替换: 和后面紧跟的一个字符组合成转义字符,例如 $ 前面加上 后,就成了普通的 $ 字符,不再进行变量替换,而 n 则表示换行符。 行尾的 会转义换行符,所以换行符不再起作用,下一行变成了续行。
% puts "egg's price is: $1.5/Kg“
=> egg's price is: $1.5/Kg
07规则七
► 无论替换后得到的结果是什么,每个字符只会发生一层替换。
(内容、图片来源:《焊接过程数值模拟》一书,侵删)
版权与免责声明:
凡未注明作者、来源的内容均为转载稿,如出现版权问题,请及时联系我们处理。我们对页面中展示内容的真实性、准确性和合法性均不承担任何法律责任。如内容信息对您产生影响,请及时联系我们修改或删除。
电话:186 6505 3298 邮箱:gaolu@icae.com.cn 地址:广东省-广州市-天河区 天河北路663号机械研究所8栋9层
关注我们