1 个不稳定版本
0.2.0 | 2022年5月21日 |
---|
#333 in 可视化
用于 网络流
76KB
1.5K SLoC
描述
该库提供了对 graphviz 格式图形的基本访问,并具有导入到或从其导出的能力。
基础示例
解析 dot 源文件
use dot_structures::*;
use dot_generator::*;
fn parse_test() {
let g: Graph = parse(r#"
strict digraph t {
aa[color=green]
subgraph v {
aa[shape=square]
subgraph vv{a2 -> b2}
aaa[color=red]
aaa -> bbb
}
aa -> be -> subgraph v { d -> aaa}
aa -> aaa -> v
}
"#).unwrap();
assert_eq!(
g,
graph!(strict di id!("t");
node!("aa";attr!("color","green")),
subgraph!("v";
node!("aa"; attr!("shape","square")),
subgraph!("vv"; edge!(node_id!("a2") => node_id!("b2"))),
node!("aaa";attr!("color","red")),
edge!(node_id!("aaa") => node_id!("bbb"))
),
edge!(node_id!("aa") => node_id!("be") => subgraph!("v"; edge!(node_id!("d") => node_id!("aaa")))),
edge!(node_id!("aa") => node_id!("aaa") => node_id!("v"))
)
)
}
将图形打印为 dot 源文件
use dot_structures::*;
use dot_generator::*;
use graphviz_rust::printer::{PrinterContext, DotPrinter};
fn print_test() {
let mut g = graph!(strict di id!("id"));
assert_eq!("strict digraph id {}".to_string(), g.print(&mut PrinterContext::default()));
}
使用命令行引擎将图形转换为外部格式
use dot_structures::*;
use dot_generator::*;
use graphviz_rust::{exec, parse};
use graphviz_rust::cmd::{CommandArg, Format};
use graphviz_rust::printer::{PrinterContext, DotPrinter};
use graphviz_rust::attributes::*;
fn output_test() {
let mut g = graph!(id!("id");
node!("nod"),
subgraph!("sb";
edge!(node_id!("a") => subgraph!(;
node!("n";
NodeAttributes::color(color_name::black), NodeAttributes::shape(shape::egg))
))
),
edge!(node_id!("a1") => node_id!(esc "a2"))
);
let graph_svg = exec(g, &mut PrinterContext::default(), vec![
CommandArg::Format(Format::Svg),
]).unwrap();
}
结构
该结构尽量遵循 dot 表示法,因此具有直接对应性。结构可以在 dot_structures::*
中找到,具有以下表示
strict digraph t { : graph with t as id
aa[color=green] : node aa and attributes in []
subgraph v { : subgraph v
aa[shape=square] : node aa in subgraph
subgraph vv{a2 -> b2} : another subgraph carrying edge inside( a type of the edge is Pair)
aaa[color=red]
aaa -> subgraph { d -> aaa} : subgraph id is anonymous id
}
aa -> be -> d -> aaa : other edge with a type Chain
}
生成 dot 结构
该库提供了一组宏来简化图形构建的过程。
其中大部分具有序列模式(具有属性的节点、具有语句的图形或子图形等),具有以下语法
- 名称或 ID 或其他标记
- 用逗号分隔的结构列表或用分号分隔的元素序列
assert_eq!(
node!("node_id"; attr!("atr1","val1"),attr!("atr2","val2")),
node!("node_id", vec![attr!("atr1","val1"),attr!("atr2","val2")])
);
这些宏可以在 dot_generator::*
中找到,具有以下表示
fn graph_test() {
use dot_generator::*;
use dot_structures::*;
let g = r#"
strict digraph t {
aa[color=green]
subgraph v {
aa[shape=square]
subgraph vv{a2 -> b2}
aaa[color=red]
aaa -> bbb
}
aa -> be -> subgraph v { d -> aaa}
aa -> aaa -> v
}
"#;
graph!(strict di id!("t");
node!("aa";attr!("color","green")),
subgraph!("v";
node!("aa"; attr!("shape","square")),
subgraph!("vv"; edge!(node_id!("a2") => node_id!("b2"))),
node!("aaa";attr!("color","red")),
edge!(node_id!("aaa") => node_id!("bbb"))
),
edge!(node_id!("aa") => node_id!("be") => subgraph!("v"; edge!(node_id!("d") => node_id!("aaa")))),
edge!(node_id!("aa") => node_id!("aaa") => node_id!("v"))
);
}
属性
graphviz 提供了大量的可能 属性,为了支持它,该库提供了一组结构来简化在这些属性之间的导航,即
- 自定义属性可以很容易地通过宏
attr!(id,id)
复合,尽管还有其他可能的格式 - 使用像
graphviz_rust::attributes::color
这样的命名属性用于color
属性 - 使用特定的结构
graphviz_rust::attributes::{EdgeAttributes,SubgraphAttributes GraphAttributes, NodeAttributes}
来分组和显示哪个属性属于该结构。
use graphviz_rust::attributes::{color, color_name, GraphAttributes, NodeAttributes};
use into_attr::IntoAttribute;
use dot_structures::*;
use dot_generator::*;
fn test() {
assert_eq!(GraphAttributes::center(true), attr!("center",true));
assert_eq!(
NodeAttributes::color(color_name::antiquewhite1),
attr!("color","antiquewhite1"));
assert_eq!(color::default().into_attr(), attr!("color","black"));
}
按照 dot 格式转换为字符串
通过调用 DotPrinter
特性将图形结构转换为字符串。
use dot_generator::*;
use dot_structures::*;
use graphviz_rust::printer::{PrinterContext, DotPrinter};
fn subgraph_test() {
let mut ctx = PrinterContext::default();
let s = subgraph!("id"; node!("abc"), edge!(node_id!("a") => node_id!("b")));
assert_eq!(s.print(&mut ctx), "subgraph id {\n abc\n a -- b \n}".to_string());
}
该模块允许使用 PrinterContext
调整一些参数,例如缩进步长或行分隔符。
fn ctx() {
use self::graphviz_rust::printer::PrinterContext;
let mut ctx = PrinterContext::default();
ctx.always_inline(); // everything in one line
ctx.with_semi(); // semicolon at the end of every element
ctx.with_indent_step(4); // indent 4 (default 2)
ctx.with_inline_size(60); // size indicating the line needs to break into multilines
}
使用cmd引擎的外部格式及其他
该库提供从Rust代码中调用命令命令的功能。具体细节可在graphviz_rust::{exec}
中找到。
fn output_test() {
let mut g = graph!(id!("id"));
exec(g, PrinterContext::default(), vec![
CommandArg::Format(Format::Svg),
CommandArg::Output("path_to_file".to_string())
]);
}
注意:要成功运行,应安装命令客户端
依赖项
~5–14MB
~191K SLoC