如何为pytransitions动态创建节点设置Graphviz输出样式
为pytransitions动态虚拟状态设置自定义样式
不用改源码,也不用提前把虚拟状态加到初始化的states列表里,直接用现成的set_node_style接口就能给* ANY_STATE *这类动态生成的节点设样式,步骤很简单:
- 先给虚拟状态定义好你要的样式规则,和普通状态的样式定义方式完全一样,加在
style_attributes['node']里就行,比如:
# 保留你原来的三个样式定义 machine.style_attributes['node']['fail'] = {'fillcolor': 'brown1'} machine.style_attributes['node']['transient'] = {'fillcolor': 'gold'} machine.style_attributes['node']['target'] = {'fillcolor': 'chartreuse'} # 新增虚拟全局状态的样式,属性可以自己按需改 machine.style_attributes['node']['global_virtual'] = { 'fillcolor': 'gainsboro', 'style': 'dashed', 'fontcolor': 'dimgray', 'shape': 'box' }
- 注意设置样式的时机:必须等你调用
add_transition把带虚拟状态的转换加上之后,再调set_node_style绑定样式——因为虚拟节点是在添加转换的时候才会被自动加入图结构,提前调会找不到节点。直接在你原来给其他状态设样式的代码块最后加一行就行:
# 保留你原来的重置转换逻辑 machine.add_transition("Reset", "* ANY_STATE *", "INITIAL") model.eventC() # 保留你原来给三类普通状态设样式的循环 for s in transient_states: machine.model_graphs[id(model)].set_node_style(s, 'transient') for s in target_states: machine.model_graphs[id(model)].set_node_style(s, 'target') for s in fail_states: machine.model_graphs[id(model)].set_node_style(s, 'fail') # 加这一行给虚拟状态绑样式 machine.model_graphs[id(model)].set_node_style("* ANY_STATE *", "global_virtual")
补两个容易踩的坑:
- 这个方法对所有动态生成的、没在初始化states里声明的节点都管用,不是只能给
* ANY_STATE *用 - 如果你一个GraphMachine绑了多个模型,和普通状态一样,用对应模型实例的id取
model_graphs里的图对象就行,逻辑没区别
内容的提问来源于stack exchange,提问作者Jay M
相关产品推荐
相关产品推荐

