首页/文章/ 详情

二次开发中一些小tips函数

3月前浏览1012

笔记是越记越多,记录也越来越混乱,重复的记录,错误的代码也记录上,时间一久就忘记了当时是怎样一个场景面临的问题。回过头来曾经一笔一笔记录的代码,最开始从





#这个API可以提供交互面板选择元素*createmarkpanel comps 1 "Select entity"#可以获取到选择的IDhm_getmark comps 1

开始记录,再到现在记录的关于图像识别的代码,还记得以前同事给我讲冒泡排序的时候,为了理解下来将每一行代码都写上注释。真是见证了半路出家的自己一步一步的成长。

在整理过程中,遇到以前记录有意思的函数。













proc map {lambda list} {    set result {}    foreach item $list {        lappend result [apply $lambda $item]    }    return $result}#匿名函数,模拟lambda函数map {x {return [string length $x]:$x}} {a bb ccc dddd}       #1:a 2:bb 3:ccc 4:ddddmap {x {expr {$x**2 + 3*$x - 2}}} {-4 -3 -2 -1 0 1 2 3 4}       #2 -2 -4 -4 -2 2 8 16 26





































#range函数,模拟python 的range函数功能proc range {{start 0} {end 10} {step 1}} {  set res [list]  for {set i $start} {$i < $end} {incr i $step} {    lappend res $i  }  return $res}set a [range 3 18 2]
#另一种写法# Range函数proc myRange {args} {    set start 0    set stop [lindex $args 0]    set step 1    if {[llength $args] == 2} {        set start [lindex $args 0]        set stop [lindex $args 1]    } elseif {[llength $args] == 3} {        set start [lindex $args 0]        set stop [lindex $args 1]        set step [lindex $args 2]    }    set result {}    set value $start    while {$value < $stop} {        lappend result $value        set value [expr {$value + $step}]    }    return $result}set result1 [myRange 5]set result2 [myRange 1 10]set result3 [myRange 1 10 2]




















































# 将单个图片白色背景替换为透明,用于解决Hyperview无法截取透明背景图片from PIL import Image
def make_image_transparent(image_path, output_path):    img = Image.open(image_path)    img = img.convert("RGBA")
   datas = img.getdata()
   new_data = []    for item in datas:        if item[0] in list(range(200, 256)):            new_data.append((255, 255, 255, 0))        else:            new_data.append(item)
   img.putdata(new_data)    img.save(output_path, "PNG")
# 使用函数make_image_transparent("ALLInfo_1692689722_64e4653a-5eef-5eef-5eef-005eef_0_morph.png""ALLInfo_1692689722_64e4653a-5eef-5eef-5eef-005eef_0_morphoutput.png")
# 将文件夹内的白色背景图片替换为透明import osfrom PIL import Image
def make_image_transparent(image_path, output_path):    img = Image.open(image_path)    img = img.convert("RGBA")
   datas = img.getdata()
   new_data = []    for item in datas:        if item[0] in list(range(200, 256)):            new_data.append((255, 255, 255, 0))        else:            new_data.append(item)
   img.putdata(new_data)    img.save(output_path, "PNG")
def process_directory(directory):    for filename in os.listdir(directory):        if filename.endswith(".png"):            base_filename = os.path.splitext(filename)[0]            output_filename = f"{base_filename}_Output.png"            make_image_transparent(os.path.join(directory, filename), os.path.join(directory, output_filename))# 使用函数process_directory("output")


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

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

Tcl(ToolCommandLanguage)是一种解释型的脚本语言,同时也是支持面向对象编程的语言。它提供了多种编程范式,包括面向过程、面向函数、基于命名空间的函数以及面向对象。不过需要注意的是,Tcl中的面向对象编程是基于命名空间和命令的,并没有严格的类和对象的概念。阅读本篇文章,您将了解到:1、tcl语言关于面向对象的语法格式首先,让我们看一段面向过程的Tcl代码:procgreet{name}{puts&quot;Hello,$name!&quot;}setname&quot;Alice&quot;greet$name上述代码定义了一个过程greet,并通过传递参数name实现了输出字符的功能。然后,我们给name赋值为Alice并调用greet过程。接下来是面向函数的Tcl代码:namespaceevalGreeter{variablenameprocset_name{new_name}{set::Greeter::name$new_name}procgreet{}{puts&quot;Hello,$::Greeter::name!&quot;}}Greeter::set_name&quot;Bob&quot;Greeter::greet上述代码使用命名空间(namespace)和变量(variable)来实现了函数式编程。通过命名空间,我们将相关的函数和变量组织在一起。这个例子中,我们使用Greeter命名空间,定义了set_name和greet函数。使用Greeter::set_name函数设置name变量的值,然后调用Greeter::greet函数来输出字符。现在,让我们看一段基于命名空间,共享变量的代码:namespaceevalGreeter{variablenameprocset_name{new_name}{variablenamesetname$new_name}procgreet{}{variablenameputs&quot;Hello,$name!&quot;}}Greeter::set_name&quot;Charlie&quot;Greeter::greet该代码与之前的面向函数的例子类似。不同之处在于,我们使用了variable命令来声明了name变量,这样就可以在所有函数中访问它。最后是基于面向对象的Tcl代码:itcl::classGreeter{privatevariablenameconstructor{new_name}{setname$new_name}methodset_name{new_name}{setname$new_name}methodgreet{}{puts&quot;Hello,$name!&quot;}}setgreeter[Greeternew&quot;Charlie&quot;]$greetergreet在这个示例中,我们使用itcl模块创建了一个名为Greeter的类。类中包含一个私有变量name、一个构造函数以及两个方法set_name和greet。构造函数用于初始化name变量,set_name方法用于设置name的值,greet方法用于输出语句。通过实例化Greeter类,并在构造函数中传递初始名字为&quot;Charlie&quot;,我们创建了一个名为greeter的对象。然后,我们调用对象的&quot;greet&quot;方法,输出&quot;Hello,Charlie!&quot;。接下来就是套话了。面向对象编程的主要优势在于它提供了更好的封装性、模块化和可维护性。通过将相关功能组织在一个类中,我们可以更容易地管理代码,减少代码之间的依赖性,并且可以轻松地创建多个实例,实现更高级的功能。在大型项目中,面向对象的编程范式可以提高代码的可读性和可扩展性。项目规模、团队合作、代码的复用和维护等。但对于二次开发而言代码量不大,使用基于命名空间的函数也是同样适用,通过source函数,同样能实现继承以往代码的效果。不同命名空间重写函数,同样能实现多态的效果。关键是结构还简单,写起来也快。以下是关于HyperMesh面对对象的小案例。packagerequireItclif{[::itcl::findclassNodeOperations]!=&quot;&quot;}{itcl::deleteclassNodeOperations}itcl::classNodeOperations{#定义实例变量variablenodelist#构造函数内容constructor{}{}#设置实例变量methodSelectNode{}{*createmarkpanelnodes1&quot;&quot;setnodelist[hm_getmarknode1]}#使用实例变量nodelist创建中点methodCreateCenter{}{*createmarknodes1{*}$nodelist*createbestcirclecenternodenodes1010}}#使用NodeOperations类创建一个对象setnodeOps[NodeOperations#auto]#调用SelectNode方法,设置实例变量nodelist$nodeOpsSelectNode#调用CreateCenter方法,它会使用实例变量nodelist$nodeOpsCreateCenter来源:TodayCAEer

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