Hi Michael,

thank you for your suggestion. I would call it a bug. pos should always be 
equal to poscorr. This is implemented in changeset 3079.

Best,


André


Am 14.05.2011 um 13:58 schrieb Michael J Gruber:

> Currently, the pos parameter gives the position of the head of tip of
> the arrow. This is problematic when one wants to position the arrow in
> the middle of a line or arc: pos=0.5 gives an arrow which is visually
> off the middle (it is visually to the left of it).
> 
> Introduce a parameter poscorr which shifts the arrow by an amount which
> is relative to the size of the arrowhead (and the constriction).
> 
> poscorr=0 is the default (tip at pos)
> poscorr=1 puts the constriction center at pos
> ---
> pyx/deco.py |   21 +++++++++++++++------
> 1 files changed, 15 insertions(+), 6 deletions(-)
> 
> diff --git a/pyx/deco.py b/pyx/deco.py
> index 3206627..41848db 100644
> --- a/pyx/deco.py
> +++ b/pyx/deco.py
> @@ -431,20 +431,23 @@ class arrow(deco, attr.attr):
> 
>     """arrow is a decorator which adds an arrow to either side of the path"""
> 
> -    def __init__(self, attrs=[], pos=1, reversed=0, size=_base, angle=45, 
> constriction=0.8):
> +    def __init__(self, attrs=[], pos=1, poscorr=0, reversed=0, size=_base, 
> angle=45, constriction=0.8):
>         self.attrs = attr.mergeattrs([style.linestyle.solid, filled] + attrs)
>         attr.checkattrs(self.attrs, [deco, style.fillstyle, 
> style.strokestyle])
>         self.pos = pos
> +        self.poscorr = poscorr
>         self.reversed = reversed
>         self.size = size
>         self.angle = angle
>         self.constriction = constriction
> 
> -    def __call__(self, attrs=None, pos=None, reversed=None, size=None, 
> angle=None, constriction=_marker):
> +    def __call__(self, attrs=None, pos=None, poscorr=None, reversed=None, 
> size=None, angle=None, constriction=_marker):
>         if attrs is None:
>             attrs = self.attrs
>         if pos is None:
>             pos = self.pos
> +        if poscorr is None:
> +            poscorr = self.poscorr
>         if reversed is None:
>             reversed = self.reversed
>         if size is None:
> @@ -453,11 +456,12 @@ class arrow(deco, attr.attr):
>             angle = self.angle
>         if constriction is _marker:
>             constriction = self.constriction
> -        return arrow(attrs=attrs, pos=pos, reversed=reversed, size=size, 
> angle=angle, constriction=constriction)
> +        return arrow(attrs=attrs, pos=pos, poscorr=poscorr, 
> reversed=reversed, size=size, angle=angle, constriction=constriction)
> 
>     def decorate(self, dp, texrunner):
>         dp.ensurenormpath()
>         anormpath = dp.path
> +     arclen = anormpath.arclen()
> 
>         # calculate absolute arc length of constricition
>         # Note that we have to correct this length because the arrowtemplates 
> are rotated
> @@ -472,17 +476,22 @@ class arrow(deco, attr.attr):
>             constrictionlen = self.size * 1 * 
> math.cos(math.radians(self.angle/2.0))
>             arrowheadconstrictionlen = None
> 
> -        arclenfrombegin = self.pos * anormpath.arclen()
>         direction = self.reversed and -1 or 1
> +     selfpos = self.pos
> +     if self.poscorr:
> +            selfpos += direction * self.poscorr * constrictionlen / arclen
> +            selfpos = max(0, min(1, selfpos))
> +
> +        arclenfrombegin = selfpos * arclen
>         arrowhead = _arrowhead(anormpath, arclenfrombegin, direction, 
> self.size, self.angle, arrowheadconstrictionlen)
> 
>         # add arrowhead to decoratedpath
>         dp.ornaments.draw(arrowhead, self.attrs)
> 
>         # exlude part of the path from stroking when the arrow is strictly at 
> the begin or the end
> -        if self.pos == 0 and self.reversed:
> +        if selfpos == 0 and self.reversed:
>             dp.excluderange(0, min(self.size, constrictionlen))
> -        elif self.pos == 1 and not self.reversed:
> +        elif selfpos == 1 and not self.reversed:
>             dp.excluderange(anormpath.end() - min(self.size, 
> constrictionlen), anormpath.end())
> 
> arrow.clear = attr.clearclass(arrow)
> -- 
> 1.7.5.1.445.gf3e03
> 
> 
> ------------------------------------------------------------------------------
> Achieve unprecedented app performance and reliability
> What every C/C++ and Fortran developer should know.
> Learn how Intel has extended the reach of its next-generation tools
> to help boost performance applications - inlcuding clusters.
> http://p.sf.net/sfu/intel-dev2devmay
> _______________________________________________
> PyX-devel mailing list
> [email protected]
> https://lists.sourceforge.net/lists/listinfo/pyx-devel

-- 
by  _ _      _    Dr. André Wobst, Amselweg 22, 85716 Unterschleißheim
   / \ \    / )   [email protected], http://www.wobsta.de/
  / _ \ \/\/ /    PyX - High quality PostScript and PDF figures
 (_/ \_)_/\_/     with Python & TeX: visit http://pyx.sourceforge.net/

Attachment: smime.p7s
Description: S/MIME cryptographic signature

------------------------------------------------------------------------------
Achieve unprecedented app performance and reliability
What every C/C++ and Fortran developer should know.
Learn how Intel has extended the reach of its next-generation tools
to help boost performance applications - inlcuding clusters.
http://p.sf.net/sfu/intel-dev2devmay
_______________________________________________
PyX-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/pyx-devel

Reply via email to