如何在tcl中为一个变量添加许多选择

时间:2018-01-17 20:23:59

标签: tcl

在我的脚本中做了一些其他事情后,我最终得到了一系列在tcl($ sel1,$ sel2,$ sel3,...)中设置的变量,我需要将它们添加到以下行:

set all [::TopoTools::selections2mol "$box $sel1 $sel2 $sel3 $sel4"]

现在,如果我只有四个,那么手工就可以了,但在最终版本中,我会有数百个手工无法做到的。我确定答案是某种循环,但我现在已经考虑过了一些问题而且我无法弄明白。如果我有$ sel1,$ sel2,一直到给定的数字,我将如何以我想要的任何金额显示的格式将它们添加到该行,如图所示,开头的$框?非常感谢你的帮助。

它可能相关也可能不相关,但我在循环中定义变量如下:

set sel$i [atomselect $id all]

1 个答案:

答案 0 :(得分:2)

我不熟悉您正在使用的软件,但应该可以在没有太多麻烦的情况下解决这个问题。

如果你把它放在循环中:

set sell$i [atomselect $id all]
append valueStr " " [set sell$i]

(或许,即使它很小C:)

append valueStr " " [set sell$i [atomselect $id all]]

您将获得" $sel1 $sel2 $sel3 $sel4"被替换为的字符串(记得同时放入$box)。

使用Tcl 8.5或更高版本,您可以

dict set values $i [atomselect $id all]

在循环内部,它为您提供包含所有值的字典结构,然后使用以下命令创建值序列:

set all [::Topotools::selections2mol [concat $box [dict values $values]]]

根据atomselectselections2mol的输出格式和输入格式,后者在没有微调的情况下实际上可能无法正常工作,但值得一试。

在后一种情况下,您没有获得变量,但每个值都可用作

dict get $values $i 

您也可以使用数组执行此操作:

set values($i) [atomselect $id all]

但是你需要在收集值之前对键进行排序,比如

set valueStr [list $box]
foreach key [lsort -integer [array names values]] {
    append valueStr " " $values($key)
}

文档: appendarrayconcatdictforeachlistlsortset