【问题标题】:How to add many selections to one variable in tcl如何在 tcl 中为一个变量添加多个选择
【发布时间】:2018-01-17 20:23:59
【问题描述】:

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

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

现在,如果我只有四个的话,手工就可以了,但在最终版本中,我将有数百个,这是无法手工完成的。我确定答案是某种循环,但我现在一直在考虑它,但我无法弄清楚。如果我有,比如说,$sel1,$sel2,一直到一个给定的数字,我将如何以我想要的任何数量显示的格式将它们添加到该行,并在开头显示 $box?非常感谢您的帮助。

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

set sel$i [atomselect $id all]

【问题讨论】:

    标签: tcl


    【解决方案1】:

    我不熟悉您使用的软件,但应该可以轻松解决此问题。

    如果你把它放在循环中:

    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)
    }
    

    文档: append, array, concat, dict, foreach, list, lsort, set

    【讨论】:

      猜你喜欢
      • 2021-08-28
      • 1970-01-01
      • 2018-02-19
      • 1970-01-01
      • 2020-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-09
      相关资源
      最近更新 更多