5
$\begingroup$

Edit: This is apparently only a problem on a mac running OSX.

I am trying to use the 'stretchText' function by Jens. But when I use it in manipulate, the output keeps updating without changing anything.

This is the simplest example in which the problems occurs:

Manipulate[
 choice;

 Graphics[{
   stretchText["{", {0, 0}, {.1, 1}]
   }],

 {{choice, "b"}, {"a", "b"}},

 Initialization -> {
   stretchText[char_, pos_, scale_, angle_ : 0] := 
     Module[{g, coords, xMin, xMax, yMin, yMax}, 
      g = First@
        First@ImportString[ExportString[char, "PDF"], 
          "TextOutlines" -> True]; 
      coords = 
       Apply[Join, 
        Cases[g, FilledCurve[___, p_] :> Flatten[p, 1], 
         Infinity]]; {{xMin, xMax}, {yMin, yMax}} = 
       Map[{Min[#], Max[#]} &[#] &, Transpose[coords]]; 
      Rotate[Inset[
        Graphics[g, PlotRange -> {{xMin, xMax}, {yMin, yMax}}, 
         If[ListQ[scale], AspectRatio -> Full, 
          AspectRatio -> Automatic]], pos, {xMin, yMin}, scale], 
       angle]];
   }]

What can I do to stop the endless updating?

$\endgroup$
5
$\begingroup$

The problem seems to lie somewhere in some part of the PostScript/PDF conversion system that is tagged for dynamic updating. I'm not sure why it is that way. One workaround is to cache (memoize) the text as it is converted, like this:

Clear[getCurve];
getCurve[s_String] := getCurve[s] = 
   First@First@
     ImportString[ExportString[s, "PDF"], "TextOutlines" -> True];

Manipulate[

 choice;
 stretchText["{", {0, 0}, {.1, 1}, 0], {{choice, "b"}, {"a", "b"}},

 {{stretchText, stretchText}, None}, 
 Initialization :> {stretchText[char_, pos_, scale_, angle_] := 
     Module[{g, coords, xMin, xMax, yMin, yMax, r},
      g = getCurve[char];
      coords = 
       Apply[Join, Cases[g, FilledCurve[_, p_] :> Flatten[p, 1], Infinity]];
      {{xMin, xMax}, {yMin, yMax}} = Map[{Min[#], Max[#]} &[#] &, Transpose[coords]];
      Graphics@
       Rotate[Inset[
         Graphics[g, PlotRange -> {{xMin, xMax}, {yMin, yMax}}, 
          If[ListQ[scale], AspectRatio -> Full, 
           AspectRatio -> Automatic]], pos, {xMin, yMin}, scale], 
        angle]];}]

Edit: There was an unnecessary Dynamic@ in front of stretchText["{",...] I removed.

|improve this answer|||||
$\endgroup$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.