[reportlab-users] Absolute coordinates of rendered flowables?
Robin Becker
robin at reportlab.com
Tue Mar 4 11:35:51 EST 2008
Dinu Gherman wrote:
> Robin Becker:
>
>> Dinu flowable drawOn methods are the ones that are passed the x, y.
>>
>> f.drawOn(canvas,x,y,_sW)
>>
>> _sW is supposed to be the spare width available for purposes of
>> horizontal adjustment ie available - flowable width.
>>
>.........
> I know about drawOn methods, but I'm not sure if they solve my problem.
> What want to do is use flowables like the following, which draw some-
> thing at absolute coordinates on the page while not consuming any space
> in the story themselves:
>
> class AbsoluteRect(Flowable):
> """A rectangle given in absolute canvas coordinates.
>
> Use in a Platypus story like this: AbsoluteRect((x, y, w, h))
> (This is mostly like XBox, but with absolute coordinates.)
> """
>
> def __init__(self, rect):
> Flowable.__init__(self)
> self.width = 0
> self.height = 0
> self.rect = rect
>
> def __repr__(self):
> return "AbsoluteRect(x=%s, y=%s, w=%s, h=%s)" % self.rect
>
> def draw(self):
> x, y, w, h = self.rect
> self.canv.rect(x, y, w, h)
> self.canv.line(x, y, x+w, y+h)
> self.canv.line(x, y+h, x+w, y)
>
........
well OK you need to provide the drawOn method to eliminate any translation
provided by the default behaviour. So I suspect your drawOn needs to look like this
def drawOn(self, canv, x, y, _sW=0):
try:
self.canv = canv
self.draw()
finally:
del self.canv
but this won't be sufficient if any other part of the process has modified the
canvas transformation. In that case you probably need to reset the
transformation in drawOn ie try doing
def drawOn(self, canv, x, y, _sW=0):
self.canv = canv
self.canv.saveState()
self.resetTransforms()
try:
self.draw()
finally:
del self.canv
self.canv.restoreState()
so in this last version you're using the default user space
--
Robin Becker
More information about the reportlab-users
mailing list