Rust DAG渲染库sapling-renderdag的使用,高效可视化有向无环图结构与依赖关系
Rust DAG渲染库sapling-renderdag的使用,高效可视化有向无环图结构与依赖关系
安装
在项目目录中运行以下Cargo命令:
cargo add sapling-renderdag
或者在Cargo.toml中添加以下行:
sapling-renderdag = "0.1.0"
使用示例
下面是一个完整的示例,展示如何使用sapling-renderdag库来创建和可视化DAG(有向无环图):
use sapling_renderdag::{RenderDag, Node, Edge};
fn main() {
// 创建DAG结构
let mut dag = RenderDag::new();
// 添加节点
let node1 = dag.add_node(Node::new("Task A".to_string()));
let node2 = dag.add_node(Node::new("Task B".to_string()));
let node3 = dag.add_node(Node::new("Task C".to_string()));
let node4 = dag.add_node(Node::new("Task D".to_string()));
// 添加边表示依赖关系
dag.add_edge(Edge::new(node1, node2)); // Task A -> Task B
dag.add_edge(Edge::new(node1, node3)); // Task A -> Task C
dag.add_edge(Edge::new(node2, node4)); // Task B -> Task D
dag.add_edge(Edge::new(node3, node4)); // Task C -> Task D
// 渲染DAG
let svg = dag.render().unwrap();
// 将SVG输出到文件
std::fs::write("dag_output.svg", svg).unwrap();
println!("DAG已成功渲染到dag_output.svg文件");
}
完整示例代码
以下是一个更完整的示例,展示了如何自定义节点样式和处理更复杂的DAG结构:
use sapling_renderdag::{RenderDag, Node, Edge, NodeStyle};
fn main() {
// 创建DAG结构
let mut dag = RenderDag::new();
// 自定义节点样式
let success_style = NodeStyle {
fill: Some("#4CAF50".to_string()), // 绿色
stroke: Some("#2E7D32".to_string()), // 深绿色边框
..Default::default()
};
let running_style = NodeStyle {
fill: Some("#2196F3".to_string()), // 蓝色
stroke: Some("#0D47A1".to_string()), // 深蓝色边框
..Default::default()
};
let failed_style = NodeStyle {
fill: Some("#F44336".to_string()), // 红色
stroke: Some("#B71C1C".to_string()), // 深红色边框
..Default::default()
};
// 添加节点并应用样式
let node1 = dag.add_node(Node::new("Initialize".to_string()).with_style(&success_style));
let node2 = dag.add_node(Node::new("Load Data".to_string()).with_style(&success_style));
let node3 = dag.add_node(Node::new("Process".to_string()).with_style(&running_style));
let node4 = dag.add_node(Node::new("Validate".to_string()));
let node5 = dag.add_node(Node::new("Failed Task".to_string()).with_style(&failed_style));
let node6 = dag.add_node(Node::new("Finalize".to_string()));
// 添加边表示依赖关系
dag.add_edge(Edge::new(node1, node2)); // Initialize -> Load Data
dag.add_edge(Edge::new(node2, node3)); // Load Data -> Process
dag.add_edge(Edge::new(node3, node4)); // Process -> Validate
dag.add_edge(Edge::new(node4, node6)); // Validate -> Finalize
dag.add_edge(Edge::new(node3, node5)); // Process -> Failed Task
// 添加并行列
let node7 = dag.add_node(Node::new("Parallel Task 1".to_string()));
let node8 = dag.add_node(Node::new("Parallel Task 2".to_string()));
dag.add_edge(Edge::new(node2, node7)); // Load Data -> Parallel Task 1
dag.add_edge(Edge::new(node2, node8)); // Load Data -> Parallel Task 2
dag.add_edge(Edge::new(node7, node6)); // Parallel Task 1 -> Finalize
dag.add_edge(Edge::new(node8, node6)); // Parallel Task 2 -> Finalize
// 渲染DAG
match dag.render() {
Ok(svg) => {
std::fs::write("complex_dag.svg", svg).unwrap();
println!("复杂DAG已成功渲染到complex_dag.svg文件");
}
Err(e) => eprintln!("渲染DAG时出错: {}", e),
}
}
这个库由Facebook团队维护,适合需要可视化任务依赖关系、工作流或任何DAG结构的应用场景。通过简单的API,开发者可以快速创建专业的图表来展示复杂的关系网络。
1 回复
Rust DAG渲染库sapling-renderdag使用指南
简介
sapling-renderdag是一个用于高效可视化有向无环图(DAG)结构的Rust库。它可以帮助开发者清晰地展示复杂的依赖关系、任务流程或数据流图。
主要特性
- 轻量级且高效的DAG渲染
- 支持自定义节点样式和连接线
- 自动布局算法
- 支持导出为多种格式(如SVG、PNG等)
- 易于集成到现有项目中
安装方法
在Cargo.toml中添加依赖:
[dependencies]
sapling-renderdag = "0.1" # 请使用最新版本号
完整示例代码
下面是一个结合基础使用和高级功能的完整示例:
use sapling_renderdag::{Dag, Node, Edge, NodeStyle, Color, Layer};
fn main() {
// 1. 创建DAG实例
let mut dag = Dag::new();
// 2. 定义节点样式
let start_style = NodeStyle {
fill_color: Color::new(200, 255, 200), // 浅绿色
border_color: Color::new(0, 100, 0), // 深绿色边框
border_width: 2.0,
..NodeStyle::default()
};
let process_style = NodeStyle {
fill_color: Color::new(200, 200, 255), // 浅蓝色
border_color: Color::new(0, 0, 100), // 深蓝色边框
border_width: 1.5,
..NodeStyle::default()
};
let end_style = NodeStyle {
fill_color: Color::new(255, 200, 200), // 浅红色
border_color: Color::new(100, 0, 0), // 深红色边框
border_width: 2.0,
..NodeStyle::default()
};
// 3. 添加节点(带分层和样式)
let start = dag.add_node(
Node::new("开始")
.with_style(start_style)
.with_size(50.0, 30.0)
.with_layer(Layer::new(0))
);
let process1 = dag.add_node(
Node::new("处理1")
.with_style(process_style)
.with_size(60.0, 40.0)
.with_layer(Layer::new(1))
);
let process2 = dag.add_node(
Node::new("处理2")
.with_style(process_style)
.with_size(60.0, 40.0)
.with_layer(Layer::new(1))
);
let merge = dag.add_node(
Node::new("合并")
.with_style(process_style)
.with_size(60.0, 40.0)
.with_layer(Layer::new(2))
);
let end = dag.add_node(
Node::new("结束")
.with_style(end_style)
.with_size(50.0, 30.0)
.with_layer(Layer::new(3))
);
// 4. 添加边(连接节点)
dag.add_edge(Edge::new(start, process1));
dag.add_edge(Edge::new(start, process2));
dag.add_edge(Edge::new(process1, merge));
dag.add_edge(Edge::new(process2, merge));
dag.add_edge(Edge::new(merge, end));
// 5. 渲染为SVG并保存
let svg = dag.render_svg().unwrap();
std::fs::write("workflow_dag.svg", svg).unwrap();
// 6. 同时导出为PNG
let png_data = dag.render_png(1024, 768).unwrap();
std::fs::write("workflow_dag.png", png_data).unwrap();
println!("DAG渲染完成,已保存为SVG和PNG格式");
}
代码说明
-
创建DAG实例:使用
Dag::new()
初始化一个新的有向无环图 -
定义节点样式:创建了三种不同的样式用于不同类型的节点
- 开始节点:绿色
- 处理节点:蓝色
- 结束节点:红色
-
添加节点:使用
add_node
方法添加节点- 每个节点都设置了样式、大小和分层信息
with_layer
控制节点在渲染时的垂直位置
-
添加边:使用
add_edge
方法连接节点,形成依赖关系 -
导出为SVG:矢量格式,适合打印和高分辨率显示
-
导出为PNG:位图格式,适合网页显示
性能建议
- 对于大型DAG(>1000个节点),考虑使用
Dag::with_auto_layout(false)
关闭自动布局 - 使用
Node::with_size()
预先设置节点大小可以提高布局效率 - 批量添加节点和边比逐个添加更高效
总结
sapling-renderdag为Rust开发者提供了一个简单而强大的工具来可视化和分析DAG结构。无论是用于任务调度可视化、依赖关系分析还是数据流展示,它都能提供清晰直观的图形表示。