首页/文章/ 详情

深入探索Tcl:从面向过程到面向对象编程

3月前浏览1182

Tcl(Tool Command Language)是一种解释型的脚本语言,同时也是支持面向对象编程的语言。它提供了多种编程范式,包括面向过程、面向函数、基于命名空间的函数以及面向对象。


不过需要注意的是,Tcl中的面向对象编程是基于命名空间和命令的,并没有严格的类和对象的概念。


阅读本篇文章,您将了解到:

1、tcl语言关于面向对象的语法格式



首先,让我们看一段面向过程的Tcl代码:






proc greet {name} {    puts "Hello, $name!"}set name "Alice"greet $name

上述代码定义了一个过程greet,并通过传递参数 name实现了输出字符的功能。然后,我们给 name赋值为 Alice并调用greet 过程。


接下来是面向函数的Tcl代码:












namespace eval Greeter {    variable name    proc set_name {new_name} {        set ::Greeter::name $new_name    }    proc greet {} {        puts "Hello, $::Greeter::name!"    }}Greeter::set_name "Bob"Greeter::greet

上述代码使用命名空间(namespace)和变量(variable)来实现了函数式编程。通过命名空间,我们将相关的函数和变量组织在一起。这个例子中,我们使用 Greeter命名空间,定义了 set_name 和 greet 函数。使用 Greeter::set_name 函数设置 name变量的值,然后调用Greeter::greet 函数来输出字符。


现在,让我们看一段基于命名空间,共享变量的代码:














namespace eval Greeter {    variable name    proc set_name {new_name} {        variable name        set name $new_name    }    proc greet {} {        variable name        puts "Hello, $name!"    }}Greeter::set_name "Charlie"Greeter::greet

该代码与之前的面向函数的例子类似。不同之处在于,我们使用了 variable命令来声明了 name变量,这样就可以在所有函数中访问它。



最后是基于面向对象的Tcl代码:















itcl::class Greeter {    private variable name    constructor {new_name} {        set name $new_name    }    method set_name {new_name} {        set name $new_name    }    method greet {} {        puts "Hello, $name!"    }}set greeter [Greeter new "Charlie"]$greeter greet

在这个示例中,我们使用itcl模块创建了一个名为Greeter的类。类中包含一个私有变量name、一个构造函数以及两个方法set_name和greet。构造函数用于初始化name变量,set_name方法用于设置name的值,greet方法用于输出语句。
通过实例化Greeter类,并在构造函数中传递初始名字为"Charlie",我们创建了一个名为greeter的对象。然后,我们调用对象的"greet"方法,输出"Hello, Charlie!"。


接下来就是套话了。

面向对象编程的主要优势在于它提供了更好的封装性、模块化和可维护性。通过将相关功能组织在一个类中,我们可以更容易地管理代码,减少代码之间的依赖性,并且可以轻松地创建多个实例,实现更高级的功能。在大型项目中,面向对象的编程范式可以提高代码的可读性和可扩展性。项目规模、团队合作、代码的复用和维护等。


但对于二次开发而言代码量不大,使用基于命名空间的函数也是同样适用,通过source函数,同样能实现继承以往代码的效果。不同命名空间重写函数,同样能实现多态的效果。

关键是结构还简单,写起来也快。


以下是关于HyperMesh面对对象的小案例。




































package require Itcl
if {[::itcl::find class NodeOperations] != ""} {    itcl::delete class  NodeOperations}
itcl::class NodeOperations {    # 定义实例变量    variable nodelist        # 构造函数内容    constructor {} {              }
   # 设置实例变量    method SelectNode {} {        *createmarkpanel nodes 1 ""        set nodelist [hm_getmark node 1]    }
   # 使用实例变量nodelist创建中点    method CreateCenter {} {        *createmark nodes 1 {*}$nodelist        *createbestcirclecenternode nodes 1 0 1 0    }}
# 使用NodeOperations类创建一个对象set nodeOps [NodeOperations #auto]
# 调用SelectNode方法,设置实例变量nodelist$nodeOps SelectNode
# 调用CreateCenter方法,它会使用实例变量nodelist$nodeOps CreateCenter


来源:TodayCAEer
HyperMesh二次开发
著作权归作者所有,欢迎分享,未经许可,不得转载
首次发布时间:2024-08-14
最近编辑:3月前
TodayCAEer
本科 签名征集中
获赞 18粉丝 29文章 249课程 0
点赞
收藏
作者推荐

HyperView二次开发_自动识别模态系列-GUI操作

识别模态的工具开发将分为两篇,本篇将介绍在GUI界面下手动操作的步骤,以及程序开发的逻辑。正所谓授人以鱼,不如授之以渔,咱们开始了。识别全局模态基于NVHUtilities工具,超级简单。选择文件,点击Load按钮,程序就自动识别模型的所有工况,如果不只是模态工况的话,需要手动切换为模态工况,设置识别的百分比,并根据模型设置具体的识别范围,节点的类型等。然后点击IdentifyModes开始识别,如果Global/Local的ListBox没有新的Item,表示你设置的Criterion比值太大,请减小数值,当出现Item后,点击Animate,即可加载对应的阶次动画。大部分模型,如果关注一阶扭转或弯曲,那么前两个Item就是你所需要的,是能识别正确的。如果对于TB这种大模型,或者局部模态较多的,可以采用FRF功能加以辅助甄别,当然这是另一个NVHUtilities工具下的另一个功能了。这就是识别整体模态的操作,但是对于像动力总成这类的模型,不仅仅关注的是整体模态,更关注的是各个部件的局部模态,这除了人工识别外,有没有其他办法实现呢,有知道的小伙伴,能后台分享下就更好了,哈哈哈。以上是手动识别的步骤,如果要开发自动识别的工具,前提条件是你得手动能操作出来,并捋清楚程序运行的逻辑,这样才可以着手开发,不然后世浪费时间。开发逻辑:这个工具是识别每一阶模态中,节点的参与的数量,最后得以一个参与因子,取最大值,简单粗暴。来源:TodayCAEer

未登录
还没有评论
课程
培训
服务
行家
VIP会员 学习 福利任务 兑换礼品
下载APP
联系我们
帮助与反馈