33

Note that this is not a duplicate of the question over there. That one asks for a given point, while I'm asking about the lexical structure (which, of course, is not directly related to any point in the final graphics).

What I want to know is whether there's a way to access the currently set colour. For example, let's assume I write the following function:

mydisk[p_,r_]:={EdgeForm[Darker[CurrentColor]],Disk[p,r]}

and then use it like this:

Graphics[{Red, mydisk[{0,0},1], Green, mydisk[{1,1},1]}]

it should be equivalent to

Graphics[{Red, {EdgeForm[Darker[Red]], Disk[{0,0},1]},
          Green, {EdgeForm[Darker[Green]], Disk[{1,1},1]}}]

Is this possible, and if so, what would I write in the place of CurrentColor?

celtschk
  • 19,133
  • 1
  • 51
  • 106
  • 1
    +1, good question! I wanted to ask this myself at some point. This will come up when trying to convert a Mathematica Graphics-expression to some other format (e.g. export to some special format). – Szabolcs May 04 '12 at 13:22

1 Answers1

35

CurrentValue["Color"] seems to be doing the trick (not documented).

mydisk[p_, r_] := {Dynamic[EdgeForm[Darker[CurrentValue["Color"]]]], 
  Disk[p, r]}

Dynamic is needed because the value has to be evaluated by FrontEnd at the time of rendering. Here is the result:

Graphics[{EdgeForm[AbsoluteThickness[10]], Red, mydisk[{0, 0}, 1], 
  Green, mydisk[{1, 1}, 1]}]

enter image description here

CurrentValue is like a box of chocolate. It has a lot of features (mostly FE callbacks), many undocumented, but usually a very present surprise when it works.

A few other items that work with CurrentValue: "Thickness", "Opacity", "Dashing", "FontFamily", "FontSize", "FontSlant", "FontWeight", "FontColor" and "FontOpacity".

Szabolcs
  • 234,956
  • 30
  • 623
  • 1,263
Yu-Sung Chang
  • 7,061
  • 1
  • 39
  • 31