Displaying gruff graphs

V

Victor Reyes

[Note: parts of this message were removed to make it a legal post.]

Team,

Once a graph is written to disk, g.write("filename.png"), how can it be
displayed in Ruby?
I would like to re-create the graph and re-displayed often enough to give
the appearance of "real time"

Thank you

Victor
 
A

Alex Fenton

Victor said:
Once a graph is written to disk, g.write("filename.png"), how can it be
displayed in Ruby?
I would like to re-create the graph and re-displayed often enough to give
the appearance of "real time"

It's not clear whether you meant via a browser or in a desktop app. If
you want to show it on the desktop, you'll need some sort of GUI toolkit
to display a window then draw the bitmap in it.

You have a lot of choices: wxRuby, FXRuby, QT/Ruby, Tk, Ruby/GTK etc
etc. They vary widely in suitability for different platforms, ease of
installation, features, aesthetics.

I use wxRuby b/c it's easy to install (gem install wxruby) and looks
good on all the big platforms. A simple 25-line example that would
regularly redraw an updated graph is below:

hth
alex
__
require 'wx'
require 'tempfile'

# A frame that draws a regularly updated graph from Gruff every X millisecs
class GruffFrame < Wx::Frame
def initialize(refresh_delay = 5000)
super(nil, :title => 'Gruff')
Wx::Timer.every(refresh_delay) { refresh }
evt_paint :eek:n_paint
end

# Writes the gruff graph to a file then reads it back to draw it
def on_paint
# Set up your graph here
graph = Gruff::Lines.new # ....
# Write to a tempfile and read back
tmp = Tempfile.new('gruff')
graph.write(tmp.path)
bmp = Wx::Bitmap.new(tmp.path, Wx::BITMAP_TYPE_PNG)
# Draw it on the Frame
paint do | dc |
dc.draw_bitmap(bmp, 0, 0, false)
end
end
end

Wx::App.run { GruffFrame.new.show }
 
V

Victor Reyes

[Note: parts of this message were removed to make it a legal post.]

Mark, thank you for your answer and time.

Alex, this is exactly what I am looking for. I am trying to do two things at
the same time: Learning Ruby well and second learning to use gruff so I can
use it at work.
I copied your sample code where I incorporated the sample gruff code that I
got from the web. When I run it, a wx frame flashes quickly and end. Some
errors are displayed on the screen.
Would you mind if I send you directly my piece of code? It is very very
simple. It only adds about five (5) lines to your sample code.

Thank you for your help.

Victor

PS: The following are the errors:
C:\$user\vmr\Ruby>ruby rdg00.rb
c:/ruby/lib/ruby/gems/1.8/gems/gruff-0.3.1/lib/gruff/base.rb:465:in `write':
no encode delegate for this image format `C:/DOCUME~1/REYESV~1
:ImageMagickError)
from c:/ruby/lib/ruby/gems/1.8/gems/gruff-0.3.1/lib/gruff/base.rb:465:in
`write'
from rdg00.rb:25:in `on_paint'
from c:/ruby/lib/ruby/gems/1.8/gems/wxruby-1.9.5-i386-mswin32/lib/wx/classes/evthandler.rb:123:in
`call'
from c:/ruby/lib/ruby/gems/1.8/gems/wxruby-1.9.5-i386-mswin32/lib/wx/classes/evthandler.rb:123:in
`acquire_handler'
from c:/ruby/lib/ruby/gems/1.8/gems/wxruby-1.9.5-i386-mswin32/lib/wx/classes/window.rb:44:in
`call'
from c:/ruby/lib/ruby/gems/1.8/gems/wxruby-1.9.5-i386-mswin32/lib/wx/classes/window.rb:44:in
`evt_paint'
from c:/ruby/lib/ruby/gems/1.8/gems/wxruby-1.9.5-i386-mswin32/lib/wx/classes/app.rb:16:in
`call'
from c:/ruby/lib/ruby/gems/1.8/gems/wxruby-1.9.5-i386-mswin32/lib/wx/classes/app.rb:16:in
`process_event'
from c:/ruby/lib/ruby/gems/1.8/gems/wxruby-1.9.5-i386-mswin32/lib/wx/classes/app.rb:16:in
`main_loop'
from c:/ruby/lib/ruby/gems/1.8/gems/wxruby-1.9.5-i386-mswin32/lib/wx/classes/app.rb:16:in
`run'
from rdg00.rb:34
 
V

Victor Reyes

[Note: parts of this message were removed to make it a legal post.]

I finally got this working with wx by hard-coding the file path. The graphs
(pie) is displayed, but now I have a small glitch, of course.
The frame is a about 1/4 of what it needs to be, and so I have to resize it
with the mouse.
Perhaps I need to make the frame where the graph is displayed a bit larger.
Is there anyway to make the size of the frame "dynamic" based on the size of
the image to be displayed?
In the mean time I will look in the wx documentation.

Thank you

Victor
 
A

Alex Fenton

Victor said:
I finally got this working with wx by hard-coding the file path.

That other first error looks like an ImageMagick problem. Sorry I can't
help with that as I'm too lazy to install it; I just used wxRuby's own
image file writing features to test it out quickly.
The graphs
(pie) is displayed, but now I have a small glitch, of course.
The frame is a about 1/4 of what it needs to be, and so I have to resize it
with the mouse.
Perhaps I need to make the frame where the graph is displayed a bit larger.
Is there anyway to make the size of the frame "dynamic" based on the size of
the image to be displayed?

You can either constrain the frame to be a particular size, and prevent
it being resized, or dynamically resize the graph image as the frame is
resized by the user's use of the mouse.

For the former, when you call super in the GruffFrame constructor, add
the argument :style => Wx::DEFAULT_FRAME_STYLE ^ Wx::RESIZE_BORDER

(i.e. use the default frame style, minus the mouse-draggable resize
handle in the corner)

Then in the GruffFrame#initialize method, set the Frame's client_size to
the size you want the image, e.g.

self.client_size = [480, 320]

(The "client size" is the space within the Frame that is available for
drawing on - its total pixel size minus the window borders, title bar
etc. This way of setting the frame size will given consistent results
across Linux, Windows and OS X)

If you want the latter, a resizeable frame, on each refresh, tell Gruff
what size of PNG you want. According to the docs, you can pass the
Gruff Graph constructor a size as a string. So call new like this:

graph = Gruff::Lines.new("#{client_size.width}x#{client_size.height}")

If you go down this route, you'll probably also want to refresh the
graph if the Frame is resized; use evt_size in the frame constructor for
this:

evt_size { | evt | refresh; evt.skip }
In the mean time I will look in the wx documentation.

I expect you've found http://wxruby.rubyforge.org/doc/

If you've got further questions about wxRuby, there's a friendly mailing
list which is a better place than c.l.r. for specifically wxRuby
questions: http://rubyforge.org/mail/?group_id=35

alex
 
V

Victor Reyes

[Note: parts of this message were removed to make it a legal post.]

Alex,

I do truly appreciate your time to explain this new stuff to me.
I will try to digest the info you provided me and also I will try to gather
more info from the wx doc.
Do you know if wx runs under AIX (IBM UNIX)?

Thank you

Victor

Victor said:
I finally got this working with wx by hard-coding the file path.

That other first error looks like an ImageMagick problem. Sorry I can't
help with that as I'm too lazy to install it; I just used wxRuby's own
image file writing features to test it out quickly.
The graphs
(pie) is displayed, but now I have a small glitch, of course.
The frame is a about 1/4 of what it needs to be, and so I have to resize it
with the mouse.
Perhaps I need to make the frame where the graph is displayed a bit larger.
Is there anyway to make the size of the frame "dynamic" based on the size of
the image to be displayed?

You can either constrain the frame to be a particular size, and prevent
it being resized, or dynamically resize the graph image as the frame is
resized by the user's use of the mouse.

For the former, when you call super in the GruffFrame constructor, add
the argument :style => Wx::DEFAULT_FRAME_STYLE ^ Wx::RESIZE_BORDER

(i.e. use the default frame style, minus the mouse-draggable resize
handle in the corner)

Then in the GruffFrame#initialize method, set the Frame's client_size to
the size you want the image, e.g.

self.client_size = [480, 320]

(The "client size" is the space within the Frame that is available for
drawing on - its total pixel size minus the window borders, title bar
etc. This way of setting the frame size will given consistent results
across Linux, Windows and OS X)

If you want the latter, a resizeable frame, on each refresh, tell Gruff
what size of PNG you want. According to the docs, you can pass the
Gruff Graph constructor a size as a string. So call new like this:

graph = Gruff::Lines.new("#{client_size.width}x#{client_size.height}")

If you go down this route, you'll probably also want to refresh the
graph if the Frame is resized; use evt_size in the frame constructor for
this:

evt_size { | evt | refresh; evt.skip }
In the mean time I will look in the wx documentation.

I expect you've found http://wxruby.rubyforge.org/doc/

If you've got further questions about wxRuby, there's a friendly mailing
list which is a better place than c.l.r. for specifically wxRuby
questions: http://rubyforge.org/mail/?group_id=35

alex
 
V

Victor Reyes

[Note: parts of this message were removed to make it a legal post.]

I found the answer to my last question. WxRuby runs under MS Windows, Linux
and OS X.

Victor

Alex,

I do truly appreciate your time to explain this new stuff to me.
I will try to digest the info you provided me and also I will try to
gather
more info from the wx doc.
Do you know if wx runs under AIX (IBM UNIX)?

Thank you

Victor

Victor said:
I finally got this working with wx by hard-coding the file path.

That other first error looks like an ImageMagick problem. Sorry I can't
help with that as I'm too lazy to install it; I just used wxRuby's own
image file writing features to test it out quickly.
The graphs
(pie) is displayed, but now I have a small glitch, of course.
The frame is a about 1/4 of what it needs to be, and so I have to
resize
it
with the mouse.
Perhaps I need to make the frame where the graph is displayed a bit larger.
Is there anyway to make the size of the frame "dynamic" based on the size of
the image to be displayed?

You can either constrain the frame to be a particular size, and prevent
it being resized, or dynamically resize the graph image as the frame is
resized by the user's use of the mouse.

For the former, when you call super in the GruffFrame constructor, add
the argument :style => Wx::DEFAULT_FRAME_STYLE ^ Wx::RESIZE_BORDER

(i.e. use the default frame style, minus the mouse-draggable resize
handle in the corner)

Then in the GruffFrame#initialize method, set the Frame's client_size to
the size you want the image, e.g.

self.client_size = [480, 320]

(The "client size" is the space within the Frame that is available for
drawing on - its total pixel size minus the window borders, title bar
etc. This way of setting the frame size will given consistent results
across Linux, Windows and OS X)

If you want the latter, a resizeable frame, on each refresh, tell Gruff
what size of PNG you want. According to the docs, you can pass the
Gruff Graph constructor a size as a string. So call new like this:

graph = Gruff::Lines.new("#{client_size.width}x#{client_size.height}")

If you go down this route, you'll probably also want to refresh the
graph if the Frame is resized; use evt_size in the frame constructor for
this:

evt_size { | evt | refresh; evt.skip }
In the mean time I will look in the wx documentation.

I expect you've found http://wxruby.rubyforge.org/doc/

If you've got further questions about wxRuby, there's a friendly mailing
list which is a better place than c.l.r. for specifically wxRuby
questions: http://rubyforge.org/mail/?group_id=35

alex
 
A

Alex Fenton

Victor said:
Do you know if wx runs under AIX (IBM UNIX)?

Yes: http://www.wxwidgets.org/docs/platform.htm

Victor said:
I found the answer to my last question. WxRuby runs under MS Windows, Linux
and OS X.

Almost - it supports a number of desktop environments: Windows, OS X,
and GTK. The latter should work on any Unix-ish system where you can
build GTK and wxWidgets.

We provide binary builds (i686 and AMD64) for Linux because it's the
dominant desktop *nix OS, and thus well tested and widely used there.

AFAIK no-one has ever posted about building wxRuby on other *nix
systems. But on any setup that can build Ruby and WxWidgets (see link
above) it should be possible to compile wxRuby - this includes the BSDs
and the commercial Unices like AIX.

I'd guess it'd be easiest using gcc rather than IBM's own compiler.

alex
 
V

Victor Reyes

[Note: parts of this message were removed to make it a legal post.]

I will attempt to compile wx under AIX with the gcc compiler.

Victor
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,981
Messages
2,570,188
Members
46,731
Latest member
MarcyGipso

Latest Threads

Top