I'm sorry, what is "Goo::Canvas"? I can't find it in the "GTK+ Reference
Manual"


On 8/13/08, zentara <[EMAIL PROTECTED]> wrote:
>
> On Tue, 12 Aug 2008 22:27:28 +0800
> "Lazy Fox" <[EMAIL PROTECTED]> wrote:
>
> > I want to draw a loopback-able dynamic curve, just like the following
> >picture:
> >http://www.nlm.nih.gov/medlineplus/ency/images/ency/fullsize/18030.jpg
> >
> >The curve is keeping going, from left to right. When reach the right
> border,
> >it will loopback to the left border, and do this again and again.
> >
> >But, when the curve loopback to the left border, the existent drawing will
> >not
> >be erased immediately. Instead, the older drawing will be erased step by
> >step,
> >where the new curve is drawing.
> >
> >Considering the efficiency. In this case, which widget should I draw on?
> >How can I erase the image step by step,
> >not erase all of it? Which function should I use?
>
> I apologize to the c experts for this Perl, :-), but it's so easy for
> me to prototype in Perl. Here is an example of what you can do on
> the Goo::Canvas.
>
> I simulated the beat pulse with a weird sine wave, but it should show you
> how nice it could work. The axis are a bit extra, but I already had this
> example, to show how to invert the y axis direction to get a standard
> cartesian
> plot, i.e. y increases going up.
> I also took the liberty of making a recursive sub call for this demo, but
> it
> should'nt be hard to feed in real data.  Of course, c will be faster, but
> it's up to you to port it, if you like it.
>
> #!/usr/bin/perl -w
> use strict;
> use warnings;
> use Goo::Canvas;
> use Gtk2 '-init';
> use Glib qw(TRUE FALSE);
> use Gtk2::Gdk::Keysyms;
>
> my $scale = 1;
>
> my $window = Gtk2::Window->new('toplevel');
> $window->signal_connect('delete_event' => sub { Gtk2->main_quit; });
> $window->set_size_request(800, 600);
>
> my $swin = Gtk2::ScrolledWindow->new;
> $swin->set_shadow_type('in');
> $window->add($swin);
>
> my ($cwidth,$cheight)= (1200,1200);
> my $canvas = Goo::Canvas->new();
> $canvas->set_size_request(800, 650);
> $canvas->set_bounds(0, 0, $cwidth, $cheight);
> my $black = Gtk2::Gdk::Color->new (0x0000,0x0000,0x0000);
> my $white = Gtk2::Gdk::Color->new (0xFFFF,0xFFFF,0xFFFF);
> $canvas->modify_base('normal',$white );
> $swin->add($canvas);
>
> my $root = $canvas->get_root_item();
>
> my ($margin_x,$margin_y) = (100,100);
>
> my $g = Goo::Canvas::Group->new($root);
> $g->scale(1,-1); #reverse direction of y axis, so graphing will be normal
> cartesian
> $g->translate(0 + $margin_x, -1200 + $margin_y); #notice translations are
> reversed
> $canvas->scroll_to(0,$cheight);
>
> # add a background rect filling $g, so button press will be detected
> # otherwise $g will be invisible to button-press-event
> my $rect = Goo::Canvas::Rect->new(
>    $g, 0, 0, $cwidth,$cheight,
>    'line-width' => 1,
>    'stroke-color' => 'white', #invisible on white bg
>    'fill-color' => 'white',   # must be filled for mouse event sensitivity
>    );
>
> # some key help
> my $markup = "<span font_family ='Arial '
>               foreground = '#000000'
>               size = '12000'
>               weight = 'ultralight'> Keys: 'Z' zoom in,   'z' zoom out,
> 's' save a PDF </span>";
>
> my $text = Goo::Canvas::Text->new(
>             $g,
>             $markup,
>             -80 , 80 , -1,
>             'w',
>             'use markup' => 1,
>            );
>
>            $text->scale(1,-1);
>
>
>
>
> $g->signal_connect('button-press-event',
>                      \&on_g_button_press);
>
> $canvas->signal_connect_after('key_press_event', \&on_key_press);
> $canvas->can_focus(TRUE);
> $canvas->grab_focus($root);
>
> &set_axis();
> &plot();
>
> $window->show_all();
>
> Gtk2->main;
>
> sub set_axis{
>
> # x axis
> my $xline = Goo::Canvas::Polyline->new(
>         $g, TRUE,
>         [0,0,900,0],
>         'stroke-color' => 'black',
>        'line-width' => 3,
>    );
>
> #label
>      my $markup = "<span font_family ='Arial '
>               foreground = '#000000'
>               size = '18000'
>               weight = 'bold'> X axis Label </span>";
>
>           my $text = Goo::Canvas::Text->new(
>             $g,
>             $markup,
>             450 , 80 , -1,
>             'center',
>             'use markup' => 1,
>            );
>
>            $text->scale(1,-1);
>
>
>
> for my $x (0..900){
>
>       if ($x % 100 == 0){
>          my $xtick = Goo::Canvas::Polyline->new(
>             $g, TRUE,
>             [$x,0,$x,-25],
>             'stroke-color' => 'black',
>             'line-width' => 3,
>        );
>
>          $markup = "<span font_family ='Arial '
>               foreground = '#0000ff'
>               size = '10000'
>               weight = 'light'> $x </span>";
>
>            $text = Goo::Canvas::Text->new(
>             $g,
>             $markup,
>             $x-1 , 10 , 1,
>             'north-east',
>             'use markup' => 1,
>             'wrap' => 'char');
>
>            $text->scale(1,-1);
>
>
>
>          }elsif ($x % 10 == 0){
>
>           my $xtick = Goo::Canvas::Polyline->new(
>               $g, TRUE,
>               [$x,0,$x,-15],
>               'stroke-color' => 'red',
>               'line-width' => 1,
>            );
>
>         my $markup = "<span font_family ='Arial '
>               foreground = '#ff0000'
>               size = '8000'
>               weight = 'ultralight'> $x </span>";
>
>           my $text = Goo::Canvas::Text->new(
>             $g,
>             $markup,
>             $x-1 , 6 , 1,
>             'north-east',
>             'use markup' => 1,
>             'wrap' => 'char');
>
>            $text->scale(1,-1);
>
>        }
> }
>
> # y axis
> my $yline = Goo::Canvas::Polyline->new(
>         $g, TRUE,
>         [0,0,0,900],
>         'stroke-color' => 'black',
>        'line-width' => 3,
>    );
>
>
> #label
>       $markup = "<span font_family ='Arial '
>               foreground = '#000000'
>               size = '18000'
>               weight = 'bold'> Y axis Label </span>";
>
>           $text = Goo::Canvas::Text->new(
>             $g,
>             $markup,
>             -70 ,-450 , -1,
>             'center',
>             'use markup' => 1,
>             );
>
>            $text->scale(1,-1);
>            $text->rotate(-90,-70,-450);
>
>
> for my $y (0..900){
>
>       if ($y % 100 == 0){
>          my $ytick = Goo::Canvas::Polyline->new(
>             $g, TRUE,
>             [0,$y,-25,$y],
>             'stroke-color' => 'black',
>             'line-width' => 3,
>        );
>
>          $markup = "<span font_family ='Arial '
>               foreground = '#0000ff'
>               size = '10000'
>               weight = 'light'> $y </span>";
>
>            $text = Goo::Canvas::Text->new(
>             $g,
>             $markup,
>             -25 , -$y -8 , -1,
>             'north-east',
>             'use markup' => 1,
>             );
>
>            $text->scale(1,-1);
>
>
>
>          }elsif ($y % 10 == 0){
>
>           my $ytick = Goo::Canvas::Polyline->new(
>               $g, TRUE,
>               [0,$y,-15,$y],
>               'stroke-color' => 'red',
>               'line-width' => 1,
>            );
>
>         my $markup = "<span font_family ='Arial '
>               foreground = '#ff0000'
>               size = '8000'
>               weight = 'ultralight'> $y </span>";
>
>           my $text = Goo::Canvas::Text->new(
>             $g,
>             $markup,
>             -16 , -$y - 6 , -1,
>             'north-east',
>             'use markup' => 1,
>             );
>
>            $text->scale(1,-1);
>
>        }
> }
>
>
> }
>
> sub plot{
>
>    my $points_ref = [0,300,0,300];
>
>    my $points = Goo::Canvas::Points->new( $points_ref  ); #need 2 points
> min
>
>    my $poly = Goo::Canvas::Polyline->new(
>        $g, FALSE,
>         undef, # points need to be set after creation
>        'stroke-color' => 'green',
>        'line-width' => 2,
>       );
>
>   #setting after line creation, sets the 'points' property by name
>   $poly->set(points => $points);
>
>
> my $x = 0; my $y = 0;
>
>   Glib::Timeout->add (100, sub {
>         $x+= 10;
>         $y =  300 + rand 100*sin( $x / 500);
>
>            if( $x > 301 ){
>
>                my $num = $g->find_child ($poly);
>                $g->remove_child($num);
>                &plot();
>               return FALSE;
>            }
>
>
>            push @$points_ref, $x, $y;
>            $points = Goo::Canvas::Points->new( $points_ref  ); #need 2
> points min
>            $poly->set(points => $points);
>            return TRUE;
>        });
>
> }
>
> sub on_g_button_press {
>     #print "@_\n";
>     my ( $group, $widget, $event ) = @_;
>     print $widget ,' ',$event->type, '  ','button',' ',$event->button,"\n";
>     my ($x,$y) = ($event->x,$event->y);
>      print "$x  $y\n";
>    return 0;
> }
>
> sub on_key_press {
>    # print "@_\n";
>     my ( $canvas, $event ) = @_;
>    # print $event->type,"\n";
>
>    if ( $event->keyval == $Gtk2::Gdk::Keysyms{Z} ) {
>        $scale += .1;
>        $canvas->set_scale($scale);
>        $canvas->scroll_to(0,$cheight);
>    }
>
>    if ( $event->keyval == $Gtk2::Gdk::Keysyms{z} ) {
>        $scale -= .1;
>        $canvas->set_scale($scale);
>        $canvas->set_scale($scale);
>        $canvas->scroll_to(0,$cheight);
>    }
>
>    if ( $event->keyval == $Gtk2::Gdk::Keysyms{s} ) {
>        write_pdf($canvas);
>    }
>
> #    print "key was ", chr( $event->keyval ), "\n";
>
>    return 0;
> }
>
>
> sub write_pdf {
>    #print "@_\n";
>    my $canvas = shift;
>    print "Write PDF...\n";
>
>    my $scale = $canvas->get_scale;
>    print "scale->$scale\n";
>
>    my $surface = Cairo::PdfSurface->create("$0-$scale.pdf",
>                    $scale*$cwidth, $scale*$cheight);
>
>    my $cr = Cairo::Context->create($surface);
>
>    # needed to save scaled version
>    $cr->scale($scale, $scale);
>
>    $canvas->render($cr, undef, 1);
>    $cr->show_page;
>    print "done\n";
>    return TRUE;
> }
>
> __END__
>
>
>
>
> zentara
>
>
>
> --
> I'm not really a human, but I play one on earth.
> http://zentara.net/Remember_How_Lucky_You_Are.html
>



-- 
----------------------------------------------
┏━━━━━━━━━━━━━━━━━━━━━━━━┓
┃菩提本无树,明镜亦非台。本来无一物,何处惹尘埃。┃
┗━━━━━━━━━━━━━━━━━━━━━━━━┛
_______________________________________________
gtk-list mailing list
[email protected]
http://mail.gnome.org/mailman/listinfo/gtk-list

Reply via email to