examples/canvas.rb in rgl-0.4.0 vs examples/canvas.rb in rgl-0.5.0

- old
+ new

@@ -1,9 +1,9 @@ # From c.l.r SNIP IT: bond TkCanvas with RubyGraphLibrary # author: Phlip (see also -# http://www.rubygarden.org/ruby?RubyAlgorithmPackage/TkCanvasSample) -# +# http://www.rubygarden.org/ruby?RubyAlgorithmPackage/TkCanvasSample) +# # put a GraphViz graph into a TkCanvas, and make nodes # selectable. Illustrates a bug in GraphViz require 'rgl/graphxml' require 'rgl/adjacency' @@ -17,86 +17,85 @@ # ruby canvas.rb north/g.10.8.graphml & # ruby canvas.rb north/g.12.8.graphml & # ruby canvas.rb north/g.14.9.graphml & File.open(filename) { |file| - graph = DirectedAdjacencyGraph.from_graphxml(file) + graph = DirectedAdjacencyGraph.from_graphxml(file) graph.write_to_graphic_file('gif', filename) graph.write_to_graphic_file('plain', filename) - root = TkRoot.new{title "Ex1"} - - canvas = TkCanvas.new(root) { - width 400 - height 600 + root = TkRoot.new { title "Ex1" } + + canvas = TkCanvas.new(root) { + width 400 + height 600 } canvas.pack() ovals = [] TkcImage.new(canvas, 0, 0) { - anchor 'nw' - - image TkPhotoImage.new() { - file filename + '.gif' - } + anchor 'nw' + + image TkPhotoImage.new() { + file filename + '.gif' + } } # read the 'plain' file, and for each node put an invisible # oval over its image - - File.open(filename + '.plain') { |f| - graphLine = f.readline() - graphStats = graphLine.split() - graphHeight = graphStats[3].to_f() - nodeLine = f.readline() - fields = nodeLine.split() - - while fields[0] == 'node' - namer = fields[1] - # the following crud is because GraphViz has no system to - # emit a "plain" format in pixels that exactly match the - # locations of objects in dot's raster output + File.open(filename + '.plain') { |f| + graphLine = f.readline() + graphStats = graphLine.split() + graphHeight = graphStats[3].to_f() + nodeLine = f.readline() + fields = nodeLine.split() - # furtherless, the current GraphViz seems to be centering - # the raster output but not the 'plain' output. Hence on - # g.10.8.graphml the X fudge factor must be 45. >sigh< - - # YMMV, based on your system's opinion of the size of an inch + while fields[0] == 'node' + namer = fields[1] - exx = fields[2].to_f * 96 - 20 # 45 - why = (graphHeight - fields[3].to_f()) * 96 - 20 - widt = fields[4].to_f() * 90 - hite = fields[5].to_f() * 90 - - ov = TkcOval.new(canvas, exx, why, - exx + widt, why + hite) { - state 'hidden' - width 4 - outline 'green' - tags namer - } - ovals.push(ov) - nodeLine = f.readline() - fields = nodeLine.split() - end + # the following crud is because GraphViz has no system to + # emit a "plain" format in pixels that exactly match the + # locations of objects in dot's raster output + + # furtherless, the current GraphViz seems to be centering + # the raster output but not the 'plain' output. Hence on + # g.10.8.graphml the X fudge factor must be 45. >sigh< + + # YMMV, based on your system's opinion of the size of an inch + + exx = fields[2].to_f * 96 - 20 # 45 + why = (graphHeight - fields[3].to_f) * 96 - 20 + widt = fields[4].to_f() * 90 + hite = fields[5].to_f() * 90 + + ov = TkcOval.new(canvas, exx, why, exx + widt, why + hite) { + state 'hidden' + width 4 + outline 'green' + tags namer + } + ovals.push(ov) + nodeLine = f.readline() + fields = nodeLine.split() + end } lastOval = ovals[0] # at click time, search for an oval in range and display it - - canvas.bind('Button-1') do |event| - x,y = canvas.canvasx(event.x), canvas.canvasy(event.y) - - ovals.each { |r| - x1,y1,x2,y2 = r.coords() - - if x >= x1 and x <= x2 and y >= y1 and y <= y2 then - lastOval.configure('state' => 'hidden') - lastOval = r - lastOval.configure('state' => 'normal') - break - end - } + + canvas.bind('Button-1') do |event| + x, y = canvas.canvasx(event.x), canvas.canvasy(event.y) + + ovals.each { |r| + x1, y1, x2, y2 = r.coords() + + if x >= x1 and x <= x2 and y >= y1 and y <= y2 + lastOval.configure('state' => 'hidden') + lastOval = r + lastOval.configure('state' => 'normal') + break + end + } end Tk.mainloop }