]> git.vpit.fr Git - perl/modules/LaTeX-TikZ.git/commitdiff
Introduce the ->begin and ->end path methods
authorVincent Pit <vince@profvince.com>
Mon, 31 Jan 2011 15:38:45 +0000 (16:38 +0100)
committerVincent Pit <vince@profvince.com>
Tue, 1 Feb 2011 10:49:13 +0000 (11:49 +0100)
lib/LaTeX/TikZ/Set/Chain.pm
lib/LaTeX/TikZ/Set/Circle.pm
lib/LaTeX/TikZ/Set/Line.pm
lib/LaTeX/TikZ/Set/Path.pm
lib/LaTeX/TikZ/Set/Point.pm
lib/LaTeX/TikZ/Set/Polyline.pm
lib/LaTeX/TikZ/Set/Raw.pm
lib/LaTeX/TikZ/Set/Rectangle.pm
lib/LaTeX/TikZ/Set/Union.pm
t/11-point.t
t/lib/LaTeX/TikZ/TestHelper.pm

index 8795de1bb15bfbe0197a9821508f4a7e1e09ef0f..e12587e3f3bfe919a8d7b2c2d1123fe825bde7ff 100644 (file)
@@ -195,6 +195,32 @@ sub path {
  return $path;
 }
 
+=head2 C<begin>
+
+=cut
+
+sub begin {
+ my $set = shift;
+
+ my @kids = $set->kids;
+ return undef unless @kids;
+
+ $kids[0]->begin;
+}
+
+=head2 C<end>
+
+=cut
+
+sub end {
+ my $set = shift;
+
+ my @kids = $set->kids;
+ return undef unless @kids;
+
+ $kids[-1]->end;
+}
+
 LaTeX::TikZ::Interface->register(
  join => sub {
   shift;
index 54c1540a5db5d5b9fee7e743be41879758707609..0de14df1256abfa93aa4fee2e3cdcea03798477e 100644 (file)
@@ -73,6 +73,18 @@ sub path {
  $set->center->path(@_) . ' circle (' . $tikz->len($set->radius) . ')';
 }
 
+=head2 C<begin>
+
+=cut
+
+sub begin { $_[0]->center->begin }
+
+=head2 C<end>
+
+=cut
+
+sub end { $_[0]->center->end }
+
 LaTeX::TikZ::Interface->register(
  circle => sub {
   shift;
index 4054bfd1d282eb380dad5f5758402b5bbe9665e8..faa4ccb22f018411b8febb610874b0761e9b2327 100644 (file)
@@ -70,6 +70,18 @@ sub path {
  $set->from->path(@_) . ' -- ' . $set->to->path(@_);
 }
 
+=head2 C<begin>
+
+=cut
+
+sub begin { $_[0]->from->begin }
+
+=head2 C<end>
+
+=cut
+
+sub end { $_[0]->to->end }
+
 LaTeX::TikZ::Interface->register(
  line => sub {
   shift;
index f7a5fb21b684deb1afca328d216f41597d42db27..081f35bce312e2ffe30e353d737ef3954e76d56e 100644 (file)
@@ -33,7 +33,7 @@ with 'LaTeX::TikZ::Set';
 
 =head1 METHODS
 
-This method is required by the interface :
+These methods are required by the interface :
 
 =over 4
 
@@ -43,12 +43,26 @@ C<path $formatter>
 
 Returns the TikZ code that builds a path out of the current set object as a string formatted by the L<LaTeX::TikZ::Formatter> object C<$formatter>.
 
+=item *
+
+C<begin>
+
+Returns a L<LaTeX::TikZ::Point> object pointing to the beginning of the path, or C<undef> if this path has no beginning.
+
+=item *
+
+C<end>
+
+A L<LaTeX::TikZ::Point> object pointing to the end of the path, or C<undef> if this path has no end.
+
 =back
 
 =cut
 
 requires qw<
  path
+ begin
+ end
 >;
 
 =head2 C<draw>
index d5761d17614c4186e66535b14c3e995af15bcdf1..4cf79921e16fe2d594059a52c69bf094379d3a86 100644 (file)
@@ -114,6 +114,18 @@ sub path {
  $path;
 }
 
+=head2 C<begin>
+
+=cut
+
+sub begin { $_[0]->point }
+
+=head2 C<end>
+
+=cut
+
+sub end { $_[0]->point }
+
 LaTeX::TikZ::Interface->register(
  point => sub {
   shift;
index a1992a5d11790e0bd677745bb28e6ee38bfeeaa8..987c321d380f3cb7efce1437b8d68f29a09cc2ef 100644 (file)
@@ -83,6 +83,32 @@ sub path {
               ($set->closed ? 'cycle' : ());
 }
 
+=head2 C<begin>
+
+=cut
+
+sub begin {
+ my $set = shift;
+
+ my @points = $set->points;
+ return undef unless @points;
+
+ $points[0]->begin;
+}
+
+=head2 C<end>
+
+=cut
+
+sub end {
+ my $set = shift;
+
+ my @points = $set->points;
+ return undef unless @points;
+
+ $points[-1]->end;
+}
+
 LaTeX::TikZ::Interface->register(
  polyline => sub {
   shift;
index 68f40254acc29ab0283583acba496b99a52f8e64..864128750bd2c2edb63a7ef962dc6aef378ac102 100644 (file)
@@ -50,6 +50,18 @@ has 'content' => (
 
 sub path { $_[0]->content }
 
+=head2 C<begin>
+
+=cut
+
+sub begin { undef }
+
+=head2 C<end>
+
+=cut
+
+sub end { undef }
+
 LaTeX::TikZ::Interface->register(
  raw => sub {
   shift;
index 2e290db8be8b013b6f42c2595d328580d0a1c8ef..838ff95697a039166b6a0052e97228df485a92d8 100644 (file)
@@ -92,6 +92,18 @@ sub path {
  $set->from->path(@_) . ' rectangle ' . $set->to->path(@_);
 }
 
+=head2 C<begin>
+
+=cut
+
+sub begin { $_[0]->from->begin }
+
+=head2 C<end>
+
+=cut
+
+sub end { $_[0]->to->end }
+
 my $meta = __PACKAGE__->meta;
 my $tc1  = $meta->find_attribute_by_name('from')->type_constraint;
 my $tc2  = $meta->find_attribute_by_name('to')->type_constraint;
index 228a6ff455a1bc5a404896abecb359bef9886056..13b5dc64c0623fb0d590eacce9de636f231ec816 100644 (file)
@@ -78,6 +78,32 @@ sub path {
  join ' ', map $_->path(@_), $set->kids;
 }
 
+=head2 C<begin>
+
+=cut
+
+sub begin {
+ my $set = shift;
+
+ my @kids = $set->kids;
+ return undef unless @kids;
+
+ $kids[0]->begin;
+}
+
+=head2 C<end>
+
+=cut
+
+sub end {
+ my $set = shift;
+
+ my @kids = $set->kids;
+ return undef unless @kids;
+
+ $kids[-1]->end;
+}
+
 LaTeX::TikZ::Interface->register(
  union => sub {
   shift;
index a8481ec2c844682b22ee5f3ab345b2a3db98abc1..4b31a503ea25690b0a0621aca3a31da1224b80d6 100644 (file)
@@ -3,7 +3,7 @@
 use strict;
 use warnings;
 
-use Test::More tests => 8 + 2 * 8;
+use Test::More tests => 8 + 2 * 8 + 2 * (1 + 2 * 3);
 
 use Math::Complex;
 
@@ -97,3 +97,25 @@ is $@, '',
 check $p, 'a labeled positioned point', <<'RES';
 \draw (2cm,-2cm) [fill] circle (0.4pt) node[scale=0.20,below right] {bar} ;
 RES
+
+my $union = eval {
+ Tikz->union(
+  Tikz->point([ 0, -1 ]),
+  Tikz->raw("foo"),
+  Tikz->point(9)
+ );
+};
+is          $@,            '',    'creating a simple union path doesn\'t croak';
+is_point_ok $union->begin, 0, -1, 'beginning of a simple union path';
+is_point_ok $union->end,   9, 0,  'end of a simple union path';
+
+my $path = eval {
+ Tikz->union(
+  Tikz->join('--' => 1, 2, 3),
+  $union,
+  Tikz->chain(5 => '--' => [ 6, 1 ]),
+ );
+};
+is          $@,           '',   'creating a complex union path doesn\'t croak';
+is_point_ok $path->begin, 1, 0, 'beginning of a complex union path';
+is_point_ok $path->end,   6, 1, 'end of a complex union path';
index deb1dff21cfe4978d8a1733c9f25b9e4980013c6..040fe824a33c0fc2fcd70bf11f2aeb0ffc42be88 100644 (file)
@@ -8,7 +8,7 @@ use Test::More ();
 use Any::Moose 'Exporter';
 
 any_moose('Exporter')->setup_import_methods(
- as_is => [ qw<using check> ],
+ as_is => [ qw<using check is_point_ok> ],
 );
 
 my $tikz;
@@ -40,4 +40,16 @@ sub check {
  return $head, $decl, $body;
 }
 
+sub is_point_ok {
+ my ($p, $x, $y, $desc) = @_;
+
+ my $ok = Test::More::isa_ok($p, 'LaTeX::TikZ::Point', "$desc isa point");
+ if ($ok) {
+  Test::More::cmp_ok($p->x, '==', $x, "$desc x coordinate is right");
+  Test::More::cmp_ok($p->y, '==', $y, "$desc y coordinate is right");
+ } else {
+  Test::More::fail("$desc placeholder $_") for 1, 2;
+ }
+}
+
 1;