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格式");
}

代码说明

  1. 创建DAG实例:使用Dag::new()初始化一个新的有向无环图

  2. 定义节点样式:创建了三种不同的样式用于不同类型的节点

    • 开始节点:绿色
    • 处理节点:蓝色
    • 结束节点:红色
  3. 添加节点:使用add_node方法添加节点

    • 每个节点都设置了样式、大小和分层信息
    • with_layer控制节点在渲染时的垂直位置
  4. 添加边:使用add_edge方法连接节点,形成依赖关系

  5. 导出为SVG:矢量格式,适合打印和高分辨率显示

  6. 导出为PNG:位图格式,适合网页显示

性能建议

  1. 对于大型DAG(>1000个节点),考虑使用Dag::with_auto_layout(false)关闭自动布局
  2. 使用Node::with_size()预先设置节点大小可以提高布局效率
  3. 批量添加节点和边比逐个添加更高效

总结

sapling-renderdag为Rust开发者提供了一个简单而强大的工具来可视化和分析DAG结构。无论是用于任务调度可视化、依赖关系分析还是数据流展示,它都能提供清晰直观的图形表示。

回到顶部