在一些用于绘制数据的代码中,我正在遍历样本,并试图在动态创建标签(线和文本)的同时将数据与曲线连接。因此,我正在并行创建两个不相关的路径。这两个元素使用不同的图形属性和变换的坐标系,因此我经常使用gsave
... grestore
,可能会创建效率低下的代码。
我的想法是收集用于绘制这两个路径之一的指令,然后在绘制另一个补丁后执行它们。
可能cvx
会有所帮助,但是我想知道如何在将运算符添加到数组时防止执行这些运算符(我希望[ moveto ]
从]
之前的堆栈中弹出两个元素被执行)。 [ /moveto ]
会成功吗?
另一个问题是,当我需要操作数堆栈来绘制另一条路径时,很难收集操作数组。
例如,一部分标签代码(丑陋,因为仍在工作)看起来像这样:
gsave
currentpoint translate la rotate
0 rlineto
%% add a tick mark if it's far enough from the last one (or if it is important)
mlx x mly y distance lw 2 mul gt
m lm gt or
{ %if
/mlx x def
/mly y def
currentpoint
lw setlinewidth % label len
stroke
(Helvetica) findfont fs scalefont setfont
moveto % label
180 rotate
dup stringwidth pop neg fs 3 div sub fs -2.5 div
rmoveto
%% add a text label if it looks like there is room (or if it is important)
tlx x tly y distance fs 1.2 mul gt
m lm gt or
{ %ifelse
show
/tlx x def
/tly y def
}
{ pop } ifelse
/lm m def
} { pop }
ifelse
grestore
答案 0 :(得分:1)
对于第一部分,/moveto cvx
将为您提供一个不会立即执行的可执行文件名称,但是如果将其放入可执行数组并exec
,它将稍后执行。如果仅执行/moveto
,则该名称是文字名称,以后将不会使用exec
执行。
对于另一部分,在仍将堆栈用于执行的同时将片段收集到数组中,一种简单的方法是将mark
放在堆栈上,并将所有内容滚动到标记后面以进行处理。例如
mark
%... do stuff with stack
1 2 3 counttomark 1 add 3 roll % save 3 numbers behind mark
%... do stuff with stack
cleartomark % discard working area
count array astore % make array from stack contents