2 个版本
0.1.1 | 2022 年 8 月 26 日 |
---|---|
0.1.0 | 2022 年 8 月 26 日 |
#133 在 可视化
170KB
4.5K SLoC
包 simple_dot
创建 GraphViz DOT 文件的简单 API。
待定
此包的目的是提供一个易于使用的构建器风格接口,以便轻松创建 DOT 文件。这牺牲了性能,并且与类似 dot 的包相比,内存使用量更高。
示例
use crate::writer::write_graph;
use crate::graph::{Cluster, Graph, RootGraph};
use crate::node::Node;
use crate::style::{
ClusterAttributes, ClusterStyles, Color, EdgeAttributes, FontName, GraphAttributes,
LabelString, NodeAttributes, NodeStyles, Shape, Styled,
};
use crate::writer::Indenter;
use crate::Identifier;
use std::str::FromStr;
let fonts = FontName::list(vec![
FontName::family("Helvetica").unwrap(),
FontName::family("Arial").unwrap(),
FontName::family("sans-serif").unwrap(),
]);
let root = RootGraph::new(Identifier::from_str("G").unwrap(), false, true)
.set_attributes(GraphAttributes::default().font_name(fonts.clone()))
.set_default_node_attributes(NodeAttributes::default().font_name(fonts.clone()))
.set_default_edge_attributes(EdgeAttributes::default().font_name(fonts.clone()))
.add_sub_graph(
Cluster::new(0i64.into())
.set_attributes(
ClusterAttributes::default()
.label(LabelString::from_str("process #1").unwrap())
.color(Color::named("lightgrey").unwrap().into())
.style(vec![ClusterStyles::Filled]),
)
.set_default_node_attributes(
NodeAttributes::default()
.color(Color::named("white").unwrap().into())
.style(vec![NodeStyles::Filled]),
)
.chain(vec![
Node::new(Identifier::from_str("a0").unwrap()),
Node::new(Identifier::from_str("a1").unwrap()),
Node::new(Identifier::from_str("a2").unwrap()),
Node::new(Identifier::from_str("a3").unwrap()),
]),
)
.add_sub_graph(
Cluster::new(1i64.into())
.set_attributes(
ClusterAttributes::default()
.label(LabelString::from_str("process #2").unwrap())
.color(Color::named("blue").unwrap().into()),
)
.set_default_node_attributes(
NodeAttributes::default().style(vec![NodeStyles::Filled]),
)
.chain(vec![
Node::new(Identifier::from_str("b0").unwrap()),
Node::new(Identifier::from_str("b1").unwrap()),
Node::new(Identifier::from_str("b2").unwrap()),
Node::new(Identifier::from_str("b3").unwrap()),
]),
)
.add_node(
Node::new(Identifier::from_str("start").unwrap())
.set_attributes(NodeAttributes::default().shape(Shape::m_diamond())),
)
.add_node(
Node::new(Identifier::from_str("end").unwrap())
.set_attributes(NodeAttributes::default().shape(Shape::m_square())),
)
.add_edge_between(
Identifier::from_str("start").unwrap(),
Identifier::from_str("a0").unwrap(),
)
.add_edge_between(
Identifier::from_str("start").unwrap(),
Identifier::from_str("b0").unwrap(),
)
.add_edge_between(
Identifier::from_str("a1").unwrap(),
Identifier::from_str("b3").unwrap(),
)
.add_edge_between(
Identifier::from_str("b2").unwrap(),
Identifier::from_str("a3").unwrap(),
)
.add_edge_between(
Identifier::from_str("a3").unwrap(),
Identifier::from_str("a0").unwrap(),
)
.add_edge_between(
Identifier::from_str("a3").unwrap(),
Identifier::from_str("end").unwrap(),
)
.add_edge_between(
Identifier::from_str("b3").unwrap(),
Identifier::from_str("end").unwrap(),
);
write_graph(&root, &mut std::io::stdout()).unwrap();
digraph G {
fontname = "Helvetica,Arial,sans-serif";
node [
fontname = "Helvetica,Arial,sans-serif";
];
edge [
fontname = "Helvetica,Arial,sans-serif";
];
subgraph cluster_0 {
label = "process #1";
color = lightgrey;
style = filled;
node [
color = white;
style = filled;
];
a0 -> a1;
a1 -> a2;
a2 -> a3;
}
subgraph cluster_1 {
label = "process #2";
color = blue;
node [
style = filled;
];
b0 -> b1;
b1 -> b2;
b2 -> b3;
}
start [
shape = Mdiamond;
];
end [
shape = Msquare;
];
start -> a0;
start -> b0;
a1 -> b3;
b2 -> a3;
a3 -> a0;
a3 -> end;
b3 -> end;
}
变更记录
版本 0.1.1
- 重写了自动 ID 生成,以创建 Cluster、Graph、节点和边 ID。
版本 0.1.0
- 初始版本。