Re: Reading Directive Values
- To: mathgroup at smc.vnet.net
- Subject: [mg90833] Re: Reading Directive Values
- From: Jean-Marc Gulliet <jeanmarc.gulliet at gmail.com>
- Date: Fri, 25 Jul 2008 06:18:41 -0400 (EDT)
- Organization: The Open University, Milton Keynes, UK
- References: <1766B32F-CC9E-4A39-9FC7-D5BE3BFBE490@amherst.edu> <g69fvv$iid$1@smc.vnet.net>
Andy Anderson wrote: > I would like to be able to define graphics objects whose color > scheme, lighting, etc. might be changed by graphics directives in an > "informed" way. In order to do this, I need to be able to read the > current state of graphics directives. What I need is a function like > OptionValue, but I can't find one after substantial perusal of > official and unofficial documentation. > > For example, I'd like to be able to define something along these lines: > > pg = {If[DirectiveValue[Hue][[3]] <= 0.3, Brown, Sequence[], > Yellow], Polygon[{{1, 0, 0}, {1, 1, 1}, {0, 0, 1}}]} ; > > so that > > Graphics3D[pg] > Graphics3D[{Red, pg}] > Graphics3D[{Black, pg}] > > would produce yellow, red, and brown polygons. > > Any suggestions? A graphic is an expression as is everything in Mathematica. Therefore, one can use functions such as *Cases[]* to extract specific information from a graphic object. Below, the inner Cases[] seeks out expressions with head "Directive" and returns a list of such expressions. The outer cases looks for expressions with heads matching the second argument of the function, this within the list previously returned by the inner Cases[]. In[1]:= DirectiveValue[g_, d_Symbol] := Cases[Cases[g, r_Directive, Infinity], d[a__] -> a, Infinity] g = Plot3D[Im[ArcSin[(x + I y)^4]], {x, -2, 2}, {y, -2, 2}, Mesh -> None, PlotStyle -> Directive[Yellow, Specularity[White, 20], Opacity[0.8]], ExclusionsStyle-> {None, Red}] DirectiveValue[g, Opacity][[1]] DirectiveValue[g, Specularity][[2]] Out[2]= <... graphic deleted ...> Out[3]= 0.8 Out[4]= 20 HTH, -- Jean-Marc