tcl struct::graph
具有walk
命令,我想使用它来删除节点属性可访问的节点和清理数据,例如小部件名称。该文档对漫步图表时可以做什么和不能做什么,所以我想知道,如果我开始删除与步行节点相邻的弧线,它是如何工作的。
这是我的意图步行命令(几乎完成,可能是其中的错误(:
proc csp_scene_walk_remove {mode g n} {
set canvas [$g get canvas]
foreach arc [$g arcs -adj $n] {
$canvas delete [$g arc get $arc widget]
}
$canvas delete [$g node get $n widget] [$g node get $n widgetanno] [$g node get $n widgetanno].bg
$g node delete $n
}
我想,如果walk
在实际的图形对象上工作而不是副本,则可以在正确的时刻进行内部复制数据等。
Q:stuct :: Graph walk
的行为是什么?
编辑:命令似乎会做我想像这样的事情:
# destroy all nodes downstream with associated widgets
mygraph walk $node -order post -type dfs -dir forward -command csp_scene_walk_remove;
,但我无法判断这是否是tcllib所见的实现定义的行为。
虽然您正在做的工作将有效,但可疑是正确的,因为并发修改错误可怕。因此,最简单的方法将是积累一个节点列表以删除树时,然后使用$graph node delete {*}$theNodes
之后将它们全部删除。除了我们可以在图本身中积累的节点列表,这简化了一些。
proc csp_scene_walk_remove {mode g n} {
upvar #0 $nodeAccumulator nodes
set canvas [$g get canvas]
foreach arc [$g arcs -adj $n] {
$canvas delete [$g arc get $arc widget]
}
$canvas delete [$g node get $n widget] [$g node get $n widgetanno]
[$g node get $n widgetanno].bg
$g lappend deadNodes $n
}
mygraph set deadNodes {}
# Order of traversal is unimportant; nodes remain until afterwards
mygraph walk $node -command csp_scene_walk_remove
# NB: Expanding substitution is very useful here!
mygraph node delete {*}[mygraph get deadNodes]
mygraph unset deadNodes
我会更想让每个节点的帆布项目一个通用标签(例如节点ID!(,然后用它来删除它们,以便我不需要跟踪很多东西的画布ID,但这取决于您……