diff options
Diffstat (limited to 'Perl/demos')
-rw-r--r-- | Perl/demos/Tk/demos/zinc_lib/transforms.pl | 573 |
1 files changed, 573 insertions, 0 deletions
diff --git a/Perl/demos/Tk/demos/zinc_lib/transforms.pl b/Perl/demos/Tk/demos/zinc_lib/transforms.pl new file mode 100644 index 0000000..8838a65 --- /dev/null +++ b/Perl/demos/Tk/demos/zinc_lib/transforms.pl @@ -0,0 +1,573 @@ +#!/usr/bin/perl -w + +# +# TODO: +# +# Ajouter la construction des items manquants +# + +use Tk; +use Tk::Zinc; + +my $currentgroup; +my $currentitem; +my $mw = MainWindow->new(); +my $top = 1; + +my $inactiveAxisColor = 'black'; +my $activeAxisColor = 'red'; +my $worldAxisColor = '#a5a5a5'; + +my $itemtype; +my $composerot = 1; +my $composescale = 1; +my $drag = 0; + +my $text = $mw->Scrolled('Text', + -relief => 'sunken', + -borderwidth => 2, + -setgrid => 1, + -height => 12, + -scrollbars => 'e'); +$text->pack(-expand => 0, -fill => 'x'); +$text->insert('0.0', 'Items are always added to the current group. +The available commands are: + Button 1 on the background, add an item with initial translation + Button 2 on the background, add a group with initial translation + Button 1 on item/group axes, select/deselect that item space + Drag Button 1 on item/group axes, translate that item space + Home reset the transformation + Shift-Home reset a group direct children transformations + PageUp/Down scale up/down + End/Del rotate right/left + Ins swap the Y axis + 4 arrows translate in the 4 directions'); +$text->configure(-state => 'disabled'); + +my $zinc = $mw->Zinc(-borderwidth => 3, + -highlightthickness => 0, + -relief => 'sunken', + -takefocus => 1); +$zinc->pack(-expand => 1, -fill => 'both'); +$zinc->configure(-width => 500, -height => 500); + +my $rc = $mw->Frame()->pack(-expand => 0, -fill => 'x'); +my $option = $rc->Optionmenu(-options => ['rectangle', 'arc', + 'bezier', 'curve', + 'icon', 'tabular', + 'text', 'track', + 'triangles', 'waypoint'], +# -command => sub { $zinc->Tk::focus(); }, + -variable => \$itemtype)->grid(-row => 0, + -column => 1, + -sticky => 'w'); + +$rc->Button(-text => 'Add item', + -command => \&additem)->grid(-row => 0, + -column => 2, + -padx => 10, + -sticky => 'ew'); +$rc->Button(-text => 'Add group', + -command => \&addgroup)->grid(-row => 0, + -column => 3, + -padx => 10, + -sticky => 'ew'); +$rc->Button(-text => 'Remove', + -command => \&removeitem)->grid(-row => 0, + -column => 4, + -padx => 10, + -sticky => 'ew'); + +$rc->Checkbutton(-text => '-composescale', + -command => \&togglecomposescale, + -variable => \$composescale)->grid(-row => 0, + -column => 6, + -sticky => 'w'); + +$rc->Checkbutton(-text => '-composesrotation', + -command => \&togglecomposerot, + -variable => \$composerot)->grid(-row => 1, + -column => 6, + -sticky => 'w'); + + +my $world = $zinc->add('group', $top); +$zinc->add('curve', $top, [0, 0, 80, 0], + -linewidth => 3, + -linecolor => $worldAxisColor, + -lastend => [6,8,3], + -tags => ["axis:$world"]); +$zinc->add('curve', $top, [0, 0, 0, 80], + -linewidth => 3, + -linecolor => $worldAxisColor, + -lastend => [6,8,3], + -tags => ["axis:$world"]); +$zinc->add('rectangle', $top, [-2, -2, 2, 2], + -filled => 1, + -fillcolor => $worldAxisColor, + -linecolor => $worldAxisColor, + -linewidth => 3, + -tags => ["axis:$world"]); +$zinc->add('text', $top, + -text => "This is the origin\nof the world", + -anchor => 's', + -color => $worldAxisColor, + -alignment => 'center', + -tags => ["axis:$world"]); + + +$currentgroup = $world; + +$zinc->Tk::bind('<1>', [\&mouseadd, 'item']); +$zinc->Tk::bind('<2>', [\&mouseadd, 'group']); +$zinc->Tk::bind('<Up>', \&moveup); +$zinc->Tk::bind('<Left>', \&moveleft); +$zinc->Tk::bind('<Right>', \&moveright); +$zinc->Tk::bind('<Down>', \&movedown); +$zinc->Tk::bind('<Next>', \&scaledown); +$zinc->Tk::bind('<Prior>', \&scaleup); +$zinc->Tk::bind('<Home>', \&reset); +$zinc->Tk::bind('<Shift-Home>', \&resetchildren); +$zinc->Tk::bind('<End>', \&rotateleft); +$zinc->Tk::bind('<Delete>', \&rotateright); +$zinc->Tk::bind('<Insert>', \&swapaxis); + +$zinc->Tk::bind('<Configure>', [\&resize]); + +$zinc->Tk::focus(); +$zinc->focusFollowsMouse(); + + +MainLoop(); + +sub resize { + my $ev = $zinc->XEvent(); + my $x = $ev->w/2; + my $y = $ev->h/2; + + $zinc->treset($world); + $zinc->treset("axis:$world"); + $zinc->translate($world, $x, $y); + $zinc->translate("axis:$world", $x, $y); +} + +sub swapaxis { + if (defined($currentitem)) { + $zinc->scale($currentitem, 1, -1); + $zinc->scale("axisgrp:$currentitem", 1, -1); + } +} + +sub togglecomposerot { + if (defined($currentitem)) { + $zinc->itemconfigure($currentitem, -composerotation => $composerot); + $zinc->itemconfigure("axisgrp:$currentitem", -composerotation => $composerot); + } +} + +sub togglecomposescale { + my $bool; + + if (defined($currentitem)) { + $zinc->itemconfigure($currentitem, -composescale => $composescale); + $zinc->itemconfigure("axisgrp:$currentitem", -composescale => $composescale); + } +} + +sub dragitem { + $drag = 1; + return if (!defined($currentitem)); + + my $ev = $zinc->XEvent(); + my $group = $zinc->group($currentitem); + my ($x, $y) = $zinc->transform($group, [$ev->x, $ev->y]); + + $zinc->treset($currentitem); + $zinc->treset("axisgrp:$currentitem"); + $zinc->translate($currentitem, $x, $y); + $zinc->translate("axisgrp:$currentitem", $x, $y); +} + +sub select { + my @tags = $zinc->gettags('current'); + my $t; + foreach $t (@tags) { + if ($t =~ '^axis:(\d+)') { + changeitem($1); + } + } +} + +sub changeitem { + my ($item) = @_; + + if (defined($currentitem) && !$drag) { + $zinc->itemconfigure("axis:$currentitem", + -linecolor => $inactiveAxisColor, + -fillcolor => $inactiveAxisColor); + if ($currentitem != $currentgroup) { + $zinc->itemconfigure("axis:$currentitem", + -linewidth => 1); + } + } + if (!defined($currentitem) || ($item != $currentitem)) { + $zinc->itemconfigure("axis:$item", + -linecolor => $activeAxisColor, + -fillcolor => $activeAxisColor, + -linewidth => 3); + $currentitem = $item; + $composerot = $zinc->itemcget($currentitem, -composerotation); + $composescale = $zinc->itemcget($currentitem, -composescale); + } + elsif (!$drag) { + $currentitem = undef; + $composerot = $composescale = 1; + } + $drag = 0; +} + +sub selectgroup { + my @tags = $zinc->gettags('current'); + my $t; + foreach $t (@tags) { + if ($t =~ '^axis:(\d+)') { + changegroup($1); + } + } +} + +sub changegroup { + my ($grp) = @_; + + changeitem($grp); + $zinc->itemconfigure("axis:$currentgroup", + -linewidth => 1); + if (defined($currentitem)) { + $currentgroup = $currentitem; + } + else { + $currentgroup = $world; + } + + $zinc->itemconfigure("axis:$currentgroup", + -linewidth => 3); +} + +sub reset { + if (defined($currentitem)) { + $zinc->treset($currentitem); + $zinc->treset("axisgrp:$currentitem"); + } +} + +sub resetchildren { + my @children; + + if (defined($currentitem) && ($zinc->type($currentitem) eq 'group')) { + @children = $zinc->addtag('rt', 'withtag', 'all', $currentitem, 0); + $zinc->treset('rt'); + $zinc->dtag('rt', 'rt'); + } +} + +sub moveup { + move(0, 20); +} + +sub movedown { + move(0, -20); +} + +sub moveright { + move(20, 0); +} + +sub moveleft { + move(-20, 0); +} + +sub move { + my ($dx, $dy) = @_; + + if (defined($currentitem)) { + $zinc->translate($currentitem, $dx, $dy); + $zinc->translate("axisgrp:$currentitem", $dx, $dy); + } +} + +sub scaleup { + scale(1.1, 1.1); +} + +sub scaledown { + scale(0.9, 0.9); +} + +sub scale { + my ($dx, $dy) = @_; + + if (defined($currentitem)) { + $zinc->scale($currentitem, $dx, $dy); + $zinc->scale("axisgrp:$currentitem", $dx, $dy); + } +} + +sub rotateleft { + rotate(-3.14159/18); +} + +sub rotateright { + rotate(3.14159/18); +} + +sub rotate { + my ($angle) = @_; + + if (defined($currentitem)) { + $zinc->rotate($currentitem, $angle); + $zinc->rotate("axisgrp:$currentitem", $angle); + } +} + +sub newrect { + return $zinc->add('rectangle', $currentgroup, + [-15, -15, 15, 15], + -filled => 1, + -linewidth => 0, + -fillcolor => 'tan'); +} + +sub newarc { + return $zinc->add('arc', $currentgroup, + [-25, -15, 25, 15], + -filled => 1, + -linewidth => 0, + -fillcolor => 'tan'); +} + +sub newbezier { + return $zinc->add('bezier', $currentgroup, + [-15, -15, -15, 15, 15, 15, 15, -15], + -filled => 1, + -linewidth => 0, + -fillcolor => 'tan'); +} + +sub newcurve { + return $zinc->add('curve', $currentgroup, + [-15, -15, -15, 15, 15, 15, 15, -15], + -filled => 1, + -linewidth => 0, + -fillcolor => 'tan'); +} + +sub newtext { + my $item = $zinc->add('text', $currentgroup, + -anchor => 's'); + $zinc->itemconfigure($item, -text => "Item id: $item"); + return $item; +} + +sub newicon { + my $item = $zinc->add('icon', $currentgroup, + -mask => 'AtcSymbol1', + -anchor => 'center', + -color => 'black'); + + return $item; +} + +sub newtriangles { + my $item = $zinc->add('triangles', $currentgroup, + [-25, 15, -10, -15, 5, 15, + 20, -15, 35, 15, 50, -30], + -colors => ['tan', 'wheat', 'tan', 'wheat']); + return $item; +} + +sub newtrack { + my $labelformat = "x80x50+0+0 a0a0^0^0 a0a0^0>1 a0a0>2>1 x30a0>3>1 a0a0^0>2"; + + my $item=$zinc->add('track', $currentgroup, 6, + -labelformat => $labelformat, + -speedvector => [30, -15], + -markersize => 20); + $zinc->itemconfigure($item, 0, + -filled => 0, + -bordercolor => 'DarkGreen', + -border => 'contour'); + $zinc->itemconfigure($item, 1, + -filled => 1, + -backcolor => 'gray60', + -text => 'AFR6128'); + $zinc->itemconfigure($item, 2, + -filled => 0, + -backcolor => 'gray65', + -text => '390'); + $zinc->itemconfigure($item, 3, + -filled => 0, + -backcolor => 'gray65', + -text => '/'); + $zinc->itemconfigure($item, 4, + -filled => 0, + -backcolor => 'gray65', + -text => '350'); + $zinc->itemconfigure($item, 5, + -filled => 0, + -backcolor => 'gray65', + -text => 'TUR'); + return $item; +} + +sub newwaypoint { + my $labelformat = "a0a0+0+0 a0a0>0^1"; + + my $item=$zinc->add('waypoint', $currentgroup, 2, + -labelformat => $labelformat); + $zinc->itemconfigure($item, 0, + -filled => 1, + -backcolor => 'DarkGreen', + -text => 'TUR'); + $zinc->itemconfigure($item, 1, + -text => '>>>'); + return $item; +} + +sub newtabular { + my $labelformat = "f700f600+0+0 f700a0^0^0 f700a0^0>1 f700a0^0>2 f700a0^0>3 f700a0^0>4 f700a0^0>5"; + + my $item=$zinc->add('tabular', $currentgroup, 7, + -labelformat => $labelformat); + $zinc->itemconfigure($item, 0, + -filled => 1, + -border => 'contour', + -bordercolor => 'black', + -backcolor => 'gray60'); + $zinc->itemconfigure($item, 1, + -alignment => 'center', + -text => 'AFR6128'); + $zinc->itemconfigure($item, 2, + -alignment => 'center', + -text => '390'); + $zinc->itemconfigure($item, 3, + -alignment => 'center', + -text => '370'); + $zinc->itemconfigure($item, 4, + -alignment => 'center', + -text => '350'); + $zinc->itemconfigure($item, 5, + -alignment => 'center', + -text => '330'); + $zinc->itemconfigure($item, 6, + -alignment => 'center', + -text => 'TUR'); + return $item; +} + +sub addaxes { + my ($item, $length, $command, $infront) = @_; + + my $axesgroup = $zinc->add('group', $currentgroup, + -tags => ["axisgrp:$item"]); + $zinc->add('curve', $axesgroup, [0, 0, $length, 0], + -linewidth => 2, + -lastend => [6,8,3], + -tags => ["axis:$item"]); + $zinc->add('curve', $axesgroup, [0, 0, 0, $length], + -linewidth => 2, + -lastend => [6,8,3], + -tags => ["axis:$item"]); + $zinc->add('rectangle', $axesgroup, [-2, -2, 2, 2], + -filled => 1, + -linewidth => 0, + -composescale => 0, + -tags => ["axis:$item"]); + if ($infront) { + $zinc->raise($item, $axesgroup); + } + $zinc->bind("axis:$item", '<B1-Motion>', \&dragitem); + $zinc->bind("axis:$item", '<ButtonRelease-1>', $command); +} + +sub additem { + my $item; + my $length = 25; + my $itemontop = 0; + + if ($itemtype eq 'rectangle') { + $item = newrect(); + } + elsif ($itemtype eq 'arc') { + $item = newarc(); + } + elsif ($itemtype eq 'bezier') { + $item = newbezier(); + } + elsif ($itemtype eq 'curve') { + $item = newcurve(); + } + elsif ($itemtype eq 'triangles') { + $item = newtriangles(); + } + elsif ($itemtype eq 'icon') { + $item = newicon(); + $itemontop = 1; + } + elsif ($itemtype eq 'text') { + $item = newtext(); + } + elsif ($itemtype eq 'track') { + $item = newtrack(); + $itemontop = 1; + } + elsif ($itemtype eq 'waypoint') { + $item = newwaypoint(); + $itemontop = 1; + } + elsif ($itemtype eq 'tabular') { + $item = newtabular(); + } + + addaxes($item, 25, \&select, $itemontop); + changeitem($item); +} + +sub addgroup { + my $item = $zinc->add('group', $currentgroup); + + addaxes($item, 80, \&selectgroup, 1); + changegroup($item); +} + +sub mouseadd { + my ($w, $itemorgrp) = @_; + my $ev = $zinc->XEvent(); + my ($x, $y) = $zinc->transform($currentgroup, [$ev->x, $ev->y]); + my $item = $zinc->find('withtag', 'current'); + + if (defined($item)) { + my @tags = $zinc->gettags($item); + foreach my $t (@tags) { + return if ($t =~ '^axis'); + } + } + if ($itemorgrp eq 'group') { + addgroup(); + } + else { + additem(); + } + $zinc->translate($currentitem, $x, $y); + $zinc->translate("axisgrp:$currentitem", $x, $y); +} + +sub removeitem { + if (defined($currentitem)) { + $zinc->remove($currentitem, "axisgrp:$currentitem"); + if ($currentitem == $currentgroup) { + $currentgroup = $world; + } + $currentitem = undef; + $composescale = $composerot = 1; + } +} |