BezierPath offset problem.
-
Hi,
I would like to translate a BezierPath, without changing it's bounds.Here is code where you can see my problem.
newPage(2000,2000) # Grey Rectangle path0 = BezierPath() path0.rect(1000,10,200,1990) with savedState(): fill(0, 0.1) drawPath(path0) # Green Rectangle path1 = BezierPath() path1.text("1", fontSize=200) with savedState(): fill(0,1,0) rect(*path1.bounds()) drawPath(path1) # Red Rectangle path2 = BezierPath() path2.text("2", fontSize=200, offset=(200,300)) with savedState(): fill(1,0,0) rect(*path2.bounds()) drawPath(path2) # Yellow Rectangle path3 = BezierPath() path3.text("3", fontSize=200) path3.translate(100,800) with savedState(): fill(1,1,0) rect(*path3.bounds()) drawPath(path3) # Magenta Rectangle translate(900,800) path4 = BezierPath() path4.text("4", fontSize=200) with savedState(): fill(1,0,1) rect(*path4.bounds()) drawPath(path4)
I tested 3 solution:
-
use offset in path.text
Change BezierPath bounds -
use path.translate
Change BezierPath bounds -
use translate
Don't change BezierPath bounds
But this is annoying, because I don't want to translate all my canvas just for that.
So what is the solution ?
-
-
I found a way.
newPage(2000,2000) # Red Rectangle path2 = BezierPath() path2.text("2", fontSize=200, offset=(200,300)) with savedState(): fill(1,0,0) x = path2.getNSBezierPath().bounds().origin.x y = path2.getNSBezierPath().bounds().origin.y w = path2.getNSBezierPath().bounds().size.width h = path2.getNSBezierPath().bounds().size.height rect(x,y,w,h) drawPath(path2)
I’m not sure if this is even allowed, maybe @frederik will take some reputation points away from me ;-). Also, I’m not sure if the way offset works is correct, or if it’s a bug.
Personally, I would just wrap your fourth solution in a savedState() and accept all the translations of the canvas. I think that would be the DrawBot way.
# Magenta Rectangle with savedState(): translate(900,800) path4 = BezierPath() path4.text("4", fontSize=200) with savedState(): fill(1,0,1) rect(*path4.bounds()) drawPath(path4)
-
the mistake here is that bounds are not structured as
x
,y
,width
,height
as required forrect(...)
but asminx
,miny
,maxx
,maxy
.minx, miny, maxx, maxy = path.bounds() rect(minx, miny, maxx-minx, maxy-miny)
-
@frederik Thanks for this clarification !