首先生成graphviz的dot格式文件
require 'find' class RefNode attr_accessor :name,:reference end include Find if __FILE__ == $0 name = "name" dot = [] h = Hash.new puts ["digraph #{name}{","overlap = false","spline = true","ranksep=1.5"].join("\n") Find.find('XX/dir1','XX/dir2') do |path| path = path.downcase if (path.end_with?(".h") && !path.end_with?("stdafx.h")) headers = [] File.readlines(path).each do |line| line = line begin m = /^\s*#include\s+"(.*?)"\s*/.match(line) rescue begin m = /^\s*#include\s+"(.*?)"\s*/u.match(line) rescue end end if (m) headers<<File.basename(m[1]).downcase end end headers.each do |header| if h.key?(header) h[header]<<File.basename(path); else h[header] = [] end end end end h.keys.each do |key| if (h[key].size > 3) src = key #sprintf("%d %s",h[key].size,key) color = sprintf("%.4f,%.4f,%.4f",1 - h[key].size/150.0,1 - h[key].size/150.0,1 - h[key].size/150.0) dot << sprintf("\nnode[color=\"%s\"]\nedge[color=\"%s\"]\n\"%s\"",color,color,src) h[key].each do |header| dot << sprintf("\t\"%s\"->\"%s\"",header,src) end end end puts dot.join("\n") puts "}\n" end
生成格式大概是这样的
node[color="0.9733,0.9733,0.9733"]
然后调用graphviz 的命令行 fdp -Tpng XX.dot -o XX.png这样调用关系就生成了