2013-02-02 23 views
14

Tôi đang cố gắng in ra biểu đồ có hướng, và tôi tiếp tục thay đổi các thuộc tính nút khác nhau như màu sắc và hình dạng. Có cách nào để sử dụng một biến được định nghĩa một lần và được sử dụng cho nhiều nút? Lý tưởng nhất là tôi muốn một cái gì đó như thế này:Ngôn ngữ DOT có hỗ trợ các biến/bí danh không?

digraph g { 

building_color = "red" 
land_color = "green" 

farm [ fillcolor=land_color] 
barn [ fillcolor=building_color] 
house [ fillcolor=building_color] 

} 

Vì vậy, tôi có thể thay đổi màu xây dựng một lần mà không cần phải đi đến từng nút. Điều này có thể không?

Trả lời

14

Bạn có thể xác định giá trị mặc định để tránh lặp lại:

digraph g{ 
    node[fillcolor=red]; 
    barn; 
    house; 
    ... 
    node[fillcolor=green]; 
    farm; 
    ... 

    edge[color=red]; 
    barn -> house; 
    edge[color=green]; 
    barn --> farm; 
    house --> farm; 
} 

Bất biến không được hỗ trợ.


Một cách giải quyết phức tạp hơn sẽ được sử dụng gvpr - graph pattern quét và ngôn ngữ xử lý.

gvpr đọc và xuất biểu đồ và cho phép thêm và sửa đổi biểu đồ, nút và thuộc tính.

Ví dụ: bạn có thể lưu trữ thông tin tùy chỉnh trong thuộc tính comment và thực hiện hành động tập lệnh dựa trên nội dung của thuộc tính này.

Thisthis Câu trả lời SO chứa các ví dụ về gvpr tập lệnh.

8

Giải pháp dễ nhất là sử dụng m4 - a generic text-to-text preprocessor.

SampleGraph.dot.m4:

digraph g { 

    define(`building_style',`style=filled, fillcolor = "red"') 
    define(`land_style',`style=filled, fillcolor = "green"') 

    farm [label="Farm", land_style] 
    barn [building_style] 
    house [label="House", building_style] 
} 

Run m4 SampleGraph.dot.m4 > SampleGraph.dot

Kết quả SampleGraph.dot:

digraph g { 




    farm [label="Farm", style=filled, fillcolor = "green"] 
    barn [style=filled, fillcolor = "red"] 
    house [label="House", style=filled, fillcolor = "red"] 
} 
Các vấn đề liên quan