Re: Writing images from manipulate
- To: mathgroup at smc.vnet.net
- Subject: [mg117681] Re: Writing images from manipulate
- From: "W. Craig Carter" <ccarter at mit.edu>
- Date: Tue, 29 Mar 2011 06:59:33 -0500 (EST)
Hello John,
Thank you very much. Sjoerd De Vries also offered the Button solution---which is working exactly as I had wished. He also noted my currentgraphic==currentgraphic typo.
He had wondered why I was using CreatePallete part---which you include. I arrived at using CreatePallette, but I am not sure why but it appeared to be better behaved. It appears that you use it to make sure the is something to NotebookClose---is that right?
The SynchonusUpdating->True was there because---in the actual application---the simulation is linked to "time". Thus, I thought that SynchonusUpdating was more likely to give me a constant frame-rate.
As always, your help is appreciated--as is Sjoerd's, Craig
On 25 Mar, 2011, at 4:04 PM, John Fultz wrote:
> Because you're adding the SynchronousUpdating->True option, Mathematica is
> bracketing evaluations with a TimeConstrained[] to make sure that no part of the
> Dynamic ends up hanging the entire system. That includes the evaluation of
> SystemDialogInput[]. SystemDialogInput[] may take a very long time to evaluate
> because it does *not* return until the user has chosen a file.
>
> In any case, this is a somewhat tortured way of doing things, so let me suggest
> an entirely different approach to doing this. Instead of the checkbox which
> basically causes a strobe sort of response, it's much better to simply use a
> Button[]. The Button should have the Method->"Queued" option set so that it's
> not going to run into any problems with calling SystemDialogInput[].
>
> So, in your code...
>
> * Remove the If[WriteImage, ...] block
> * Remove the checkbox for WriteImage
> * Add a new control, our Button expression, which will look something like:
>
> Button["Write Image File",
> Module[{nb, nm = SystemDialogInput["FileSave"]},
> If[nm =!= $Canceled, nb = CreatePalette[nm];
> Export[nm, currentgraphic];
> NotebookClose[nb]]], Method -> "Queued"]
>
> Oh, and I'd do the same thing with your "reset to zero" checkbox, too. I made
> those two things buttons, popped them in a Grid[], did a couple more cleanups,
> and came up with the following:
>
>
> Manipulate[
> If[Evolution === "Go", radii += RandomReal[{0, .0001}, {20}];
> currentgraphic =
> Graphics[
> GraphicsComplex[seeds,
> Map[{colors[[#]], Disk[#, radii[[#]]]} &, Range[20]]]];];
> currentgraphic,
> {Evolution, {"Stop", "Go"}, ControlType -> RadioButton,
> Labeled -> False},
> Grid[{{
> Button["Write Image File",
> Module[{nb, nm = SystemDialogInput["FileSave"]},
> If[nm =!= $Canceled, nb = CreatePalette[nm];
> Export[nm, currentgraphic];
> NotebookClose[nb]]], Method -> "Queued"],
> Button["Reset to Zero", radii = ConstantArray[0, {20}];
> currentgraphic =
> Graphics[
> GraphicsComplex[seeds,
> Map[{colors[[#]], Disk[#, radii[[#]]]} &, Range[20]]]]]
> }}],
> TextCell[
> "Use .tiff, .gif, or .jpeg, etc, file extensions explicitly for \
> image file formats"], SynchronousUpdating -> True,
> Initialization -> (currentgraphic =
> currentgraphic =
> Graphics[
> GraphicsComplex[seeds,
> Map[{colors[[#]], Disk[#, radii[[#]]]} &, Range[20]]]])]
>
>
> Sincerely,
>
> John Fultz
> jfultz at wolfram.com
> User Interface Group
> Wolfram Research, Inc.
>
>
>
> On Thu, 24 Mar 2011 06:32:20 -0500 (EST), W. Craig Carter wrote:
>> Dear MathGroup,
>> I am teaching a laboratory course. As part of one laboratory, students
>> run a simulation on their laptops and then use a generated image in
>> their lab reports.
>>
>> I have a method of writing images from Manipulate, ***but it fails on
>> some but not all*** windows laptops that the students use.
>>
>> I've made as simplified representation of the code and am pasting it
>> here. I hope that it is not too long to receive some advice.
>>
>> The relevant bit is at the If[WriteImage,..] part. Is there a more
>> reliable way to save the image?
>>
>> Also, I am wondering if the constant reevaluation of the
>> If[Evolution=="go",...] part can be avoided, or should I not worry
>> about it.
>>
>> Just running the Manipulate will give a self-explanatory idea of what
>> the code is doing., Thanks Craig
>>
>>
>> seeds = RandomReal[{0, 1}, {20, 2}]
>> radii = ConstantArray[0, {20}]
>> colors = Hue /@ RandomReal[{0, 1}, {20}]
>>
>> Manipulate[
>>
>> If[reset,
>> radii = ConstantArray[0, {20}]; reset = False;
>> currentgraphic =
>> currentgraphic =
>> Graphics[
>> GraphicsComplex[seeds,
>> Map[{colors[[#]], Disk[#, radii[[#]]]} &, Range[20]]]]];
>>
>> If[WriteImage,(*works on a mac, works on *some* windows*)
>>
>> nb = CreatePalette[nm = SystemDialogInput["FileSave"]];
>> WriteImage = False;
>> Export[nm, currentgraphic];
>> NotebookClose[nb]
>> ];
>>
>> If[Evolution == "Go", (*constant evaluation of the if?*)
>> radii += RandomReal[{0, .0001}, {20}];
>> currentgraphic =
>> Graphics[
>> GraphicsComplex[seeds,
>> Map[{colors[[#]], Disk[#, radii[[#]]]} &, Range[20]]]];
>> ];
>> currentgraphic,
>>
>> {Evolution, {"Stop", "Go"}, ControlType -> RadioButton, Labeled -> False},
>> {{WriteImage, False, "Write Image File"}, {True, False},
>> ControlType -> Checkbox, Labeled -> False},
>> {{reset, False, "reset to zero"}, {True, False}, ControlType -> Checkbox,
>> Labeled -> False},
>> TextCell[
>> "Use .tiff, .gif, or .jpeg, etc, file extensions explicitly for image
>> file \
>> formats"],
>> SynchronousUpdating -> True,
>> Initialization -> (
>> currentgraphic =
>> currentgraphic =
>> Graphics[
>> GraphicsComplex[seeds,
>> Map[{colors[[#]], Disk[#, radii[[#]]]} &, Range[20]]]])
>> ]
>
>