如何使用Graphviz自动展示合并类的全部继承属性?
实现Graphviz中类属性的自动合并展示
Graphviz本身没有原生支持自动合并多个类属性到目标类的功能,但可以通过以下两种方式实现自动化,避免手动复制属性的繁琐操作:
方法1:利用Graphviz的宏定义功能
Graphviz支持通过define指令创建可复用的属性片段宏,后续合并类直接引用这些宏即可。新增类时,只需添加对应宏并在合并类中引用,无需重复编写属性代码。
示例代码
digraph { graph [pad="0.5", nodesep="0.5", ranksep="2"]; node [shape=plain] rankdir=LR; // 定义各输入类的属性宏 define FOOS_ATTRS <<tr><td>one</td></tr><tr><td>two</td></tr>> define BARS_ATTRS <<tr><td>three</td></tr><tr><td>four</td></tr>> // 新增类D时,添加:define DS_ATTRS <<tr><td>five</td></tr><tr><td>six</td></tr>> Foo [label=< <table border="0" cellborder="1" cellspacing="0"> <tr><td><i>Input Foo</i></td></tr> {FOOS_ATTRS} </table>>]; Bar [label=< <table border="0" cellborder="1" cellspacing="0"> <tr><td><i>Input Bar</i></td></tr> {BARS_ATTRS} </table>>]; Baz [label=< <table border="0" cellborder="1" cellspacing="0"> <tr><td><i>Output Baz</i></td></tr> {FOOS_ATTRS} {BARS_ATTRS} // 新增类D时,添加:{DS_ATTRS} </table>>]; Foo -> Baz; Bar -> Baz; }
编译时直接用标准dot命令即可:dot -Tpng input.dot -o output.png
方法2:用外部脚本自动生成Graphviz代码
如果需要更灵活的管理(比如从配置文件读取类信息、批量处理),可以用脚本(如Python)自动生成完整的dot代码。只需维护类的属性配置,脚本会自动完成合并和代码生成。
示例Python脚本
# 维护类的属性配置 classes = { "Foo": {"type": "Input", "attrs": ["one", "two"]}, "Bar": {"type": "Input", "attrs": ["three", "four"]}, # 新增类D时,添加:"D": {"type": "Input", "attrs": ["five", "six"]}, } merged_class = { "name": "Baz", "type": "Output", "sources": ["Foo", "Bar"] # 新增类D时,将"D"加入此列表 } # 生成Graphviz代码 dot_code = '''digraph { graph [pad="0.5", nodesep="0.5", ranksep="2"]; node [shape=plain] rankdir=LR; ''' # 生成输入类节点 for name, info in classes.items(): attrs_rows = '\n '.join([f'<tr><td>{attr}</td></tr>' for attr in info['attrs']]) dot_code += f''' {name} [label=< <table border="0" cellborder="1" cellspacing="0"> <tr><td><i>{info["type"]} {name}</i></td></tr> {attrs_rows} </table>>]; ''' # 生成合并类节点 all_attrs = [] for source in merged_class["sources"]: all_attrs.extend(classes[source]["attrs"]) merged_attrs_rows = '\n '.join([f'<tr><td>{attr}</td></tr>' for attr in all_attrs]) dot_code += f''' {merged_class["name"]} [label=< <table border="0" cellborder="1" cellspacing="0"> <tr><td><i>{merged_class["type"]} {merged_class["name"]}</i></td></tr> {merged_attrs_rows} </table>>]; ''' # 生成连线 for source in merged_class["sources"]: dot_code += f' {source} -> {merged_class["name"]};\n' dot_code += '}' # 保存dot文件 with open('merged_classes.dot', 'w') as f: f.write(dot_code) # 可选:直接调用dot命令生成图片 # import subprocess # subprocess.run(['dot', '-Tpng', 'merged_classes.dot', '-o', 'merged_classes.png'])
运行脚本后会自动生成包含所有合并属性的dot文件,后续只需更新配置即可。
内容的提问来源于stack exchange,提问作者ozz
相关产品推荐
相关产品推荐

