Руби Графвиз - Начальное состояние маркированной переходной системы? - PullRequest
0 голосов
/ 07 июня 2011

Я создаю инструмент, который может выполнять некоторые операции в системе переходов, а также должен их визуализировать.

Хотя документации по ruby-gem не так много (это было лучшее, что я могget: http://www.omninerd.com/articles/Automating_Data_Visualization_with_Ruby_and_Graphviz), мне удалось сделать график из моей системы переходов.(Не стесняйтесь использовать его, здесь не так много примеров кода. Также приветствуются комментарии / вопросы)

# note: model is something of my own datatype, 
   # having states, labels, transitions, start_state and a name
   # I hope the code is self-explaining

@graph = GraphViz::new(model.name, "type" => "graph" )

#settings
@graph.edge[:dir]      = "forward"
@graph.edge[:arrowsize]= "0.5"

#make the graph
model.states.each do |cur_state|
  @graph.add_node(cur_state.name).label = cur_state.name

  cur_state.out_transitions.each do |cur_transition|
      @graph.add_edge(cur_transition.from.name, cur_transition.to.name).label = cur_transition.label.to_s
  end
end

#make a .pdf output (can also be changed to .eps, .png or whatever)
@graph.output("pdf" => File.join(".")+"/" + @graph.name + ".pdf")
#it's really not that hard :-)

Единственное, что я не могу сделать: нарисовать стрелку «из ничего»в начальное состояние.Предложения кого-нибудь?

Ответы [ 2 ]

1 голос
/ 07 июня 2011

Я бы попытался добавить узел формы none или point и нарисовать оттуда стрелку.

@graph.add_node("Start", 
  "shape" => "point", 
  "label" => "" )

И что-то подобное в вашем цикле

if cur_transition.from.name.nil?
  @graph.add_edge("Start", cur_transition.to.name)
else
  @graph.add_edge(cur_transition.from.name, cur_transition.to.name).label = cur_transition.label.to_s
end
0 голосов
/ 07 июня 2011

кредитов Jonas Elfström, это мое решение

# note: model is something of my own datatype, 
   # having states, labels, transitions, start_state and a name
   # I hope the code is self-explaining    
@graph = GraphViz::new(model.name, "type" => "graph" )

#settings
@graph.edge[:dir]      = "forward"
@graph.edge[:arrowsize]= "0.5"

#make the graph
model.states.each do |cur_state|
  @graph.add_node(cur_state.name).label = cur_state.name

  cur_state.out_transitions.each do |cur_transition|
      @graph.add_edge(cur_transition.from.name, cur_transition.to.name).label = cur_transition.label.to_s
  end
end
#draw the arrow to the initial state (THE ADDED CODE)
@graph.add_node("Start",
  "shape" => "none",
  "label" => "" )
@graph.add_edge("Start", model.start_state.name)

#make a .pdf output (can also be changed to .eps, .png or whatever)
@graph.output("pdf" => File.join(".")+"/" + @graph.name + ".pdf")
#it's really not that hard :-)
...