Take the 2-minute tour ×
Mathematica Stack Exchange is a question and answer site for users of Mathematica. It's 100% free, no registration required.

I've simplified my code to what can reproduce my error. Basically, I have two lines:

 spherePoint[x_] := Graphics3D[Sphere[{x, 0, 0}, 1]]; 
 Manipulate[Show[spherePoint[m]], {{m, 1}, -Pi/2, Pi/2}]

This runs perfectly fine when I evaluate it in a mathematica notebook, but when I do a CDF preview (or export), it gives me the error

Show::gtype: spherePoint is not a type of graphics. >>

What gives?! Show should accept Graphics3D, and spherePoint is a graphics 3D object! (I'm not sure about the last part of that sentence, because it's a function that gives a graphics 3d object, but I don't know what that implies for the program)

What am I doing wrong?

share|improve this question
3  
Add the option SaveDefinitions -> True to your Manipulate command. –  Mark McClure Dec 12 '12 at 20:27
    
Of course you want to include an option such as PlotRange->3 in the Show expression; otherwise, the sphere doesn't appear to move as you change the slider. –  murray Dec 13 '12 at 16:48

1 Answer 1

up vote 6 down vote accepted

The problem is that CDF player cannot execute any code outside the Manipulate scope (or some type of dynamic scope). Specifically, it doesn't know your definition of spherePoint. You can get around this using the SaveDefinitions or Initialization option. My experience is that Initialization is usually a bit more cross-platform independent. Here's how to use it:

spherePoint[x_] := Graphics3D[Sphere[{x, 0, 0}, 1]];
Manipulate[Show[spherePoint[m]], {{m, 1}, -Pi/2, Pi/2},
  Initialization :> (
spherePoint[x_] := Graphics3D[Sphere[{x, 0, 0}, 1]]
)]
share|improve this answer
    
Thank you! How would I go about intializing multiple function definitions? What comes after the :> isn't a list, and in my program I have three functions to define. It works perfectly using SaveDefinitions though. –  NeuroFuzzy Dec 13 '12 at 1:06
    
@NeuroFuzzy Note how the value of the Initialization is wrapped in parentheses. You can wrap an arbitrary block of code in those parentheses - i.e. (f1[x_] := def1; f2[x_] := def2) –  Mark McClure Dec 13 '12 at 1:21

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

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