我可以在行走时修改tcl struct ::图形



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,但这取决于您……

最新更新