1; docformat = 'rst'
2;
3; NAME:
4;   cgSymCat
5;
6; PURPOSE:
7;   This function provides a symbol catalog for specifying a number of plotting symbols.
8;
9;******************************************************************************************;
10;                                                                                          ;
11;  Copyright (c) 20o6-2012, by Fanning Software Consulting, Inc. All rights reserved.      ;
12;                                                                                          ;
13;  Redistribution and use in source and binary forms, with or without                      ;
14;  modification, are permitted provided that the following conditions are met:             ;
15;                                                                                          ;
16;      * Redistributions of source code must retain the above copyright                    ;
17;        notice, this list of conditions and the following disclaimer.                     ;
18;      * Redistributions in binary form must reproduce the above copyright                 ;
19;        notice, this list of conditions and the following disclaimer in the               ;
20;        documentation and/or other materials provided with the distribution.              ;
21;      * Neither the name of Fanning Software Consulting, Inc. nor the names of its        ;
22;        contributors may be used to endorse or promote products derived from this         ;
23;        software without specific prior written permission.                               ;
24;                                                                                          ;
25;  THIS SOFTWARE IS PROVIDED BY FANNING SOFTWARE CONSULTING, INC. ''AS IS'' AND ANY        ;
26;  EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES    ;
27;  OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT     ;
28;  SHALL FANNING SOFTWARE CONSULTING, INC. BE LIABLE FOR ANY DIRECT, INDIRECT,             ;
29;  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED    ;
30;  TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;         ;
31;  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND             ;
32;  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT              ;
33;  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS           ;
34;  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.                            ;
35;******************************************************************************************;
36;
37;+
38; This function provides a symbol catalog for specifying a number of plotting symbols.
39;
40; :Categories:
41;    Graphics
42;
43; :Params:
44;    theInSymbol: in, required, type=varies
45;       The number (or name) of the symbol you wish to use. Possible values are::
46;          0  : No symbol.                         NONE
47;          1  : Plus sign.                         PLUSSIGN
48;          2  : Asterisk.                          ASTERISK
49;          3  : Dot (period).                      DOT
50;          4  : Open diamond.                      OPENDIAMOND
51;          5  : Open upward triangle.              OPENUPTRIANGLE
52;          6  : Open square.                       OPENSQUARE
53;          7  : X.                                 X
54;          8  : Defined by the user with USERSYM.  USERSYM
55;          9  : Open circle.                       OPENCIRCLE
56;         10  : Histogram style plot.              HISTOGRAM
57;         11  : Open downward triangle.            OPENDOWNTRIANGLE
58;         12  : Open rightfacing triangle.         OPENRIGHTTRIANGLE
59;         13  : Open leftfacing triangle.          OPENLEFTTRIANGLE
60;         14  : Filled diamond.                    FILLEDDIAMOND
61;         15  : Filled square.                     FILLEDSQUARE
62;         16  : Filled circle.                     FILLEDCIRCLE
63;         17  : Filled upward triangle.            FILLEDUPTRIANGLE
64;         18  : Filled downward triangle.          FILLEDDOWNTRIANGLE
65;         19  : Filled rightfacing triangle.       FILLEDRIGHTTRIANGLE
66;         20  : Filled leftfacing triangle.        FILLEDLEFTTRIANGLE
67;         21  : Hourglass.                         HOURGLASS
68;         22  : Filled Hourglass.                  FILLEDHOURGLASS
69;         23  : Bowtie.                            BOWTIE
70;         24  : Filled bowtie.                     FILLEDBOWTIE
71;         25  : Standing Bar.                      STANDINGBAR
72;         26  : Filled Standing Bar.               FILLEDSTANDINGBAR
73;         27  : Laying Bar.                        LAYINGBAR
74;         28  : Filled Laying Bar.                 FILLEDLAYINGBAR
75;         29  : Hat up.                            HATUP
76;         30  : Hat down.                          HATDOWN
77;         31  : Hat right.                         HATRIGHT
78;         32  : Hat down.                          HATDOWN
79;         33  : Big cross.                         BIGCROSS
80;         34  : Filled big cross.                  FILLEDBIGCROSS
81;         35  : Circle with plus.                  CIRCLEWITHPLUS
82;         36  : Circle with X.                     CIRCLEWITHX
83;         37  : Upper half circle.                 UPPERHALFCIRCLE
84;         38  : Filled upper half circle.          FILLEDUPPERHALFCIRCLE
85;         39  : Lower half circle.                 LOWERHALFCIRCLE
86;         40  : Filled lower half circle.          FILLEDLOWERHALFCIRCLE
87;         41  : Left half circle.                  LEFTHALFCIRCLE
88;         42  : Filled left half circle.           FILLEDLEFTHALFCIRCLE
89;         43  : Right half circle.                 RIGHTHALFCIRCLE
90;         44  : Filled right half circle.          FILLEDRIGHTHALFCIRCLE
91;         45  : Star.                              STAR
92;         46  : Filled star.                       FILLEDSTAR
93;
94; :Keywords:
95;     color: in, optional, type=varies
96;         Set this keyword to the color (color table index, 24-bit value, or color name)
97;         of the color desired.
98;     names: in, optional, type=boolean, default=0
99;         If this keyword is set, the function returns the names of the symbols allowed.
100;         The index number of the name is its symbol number.
101;     thick: in, optional, type=float, default=1.0
102;         Set this keyword to the thickness desired. Default is 1.
103;
104; :Examples:
105;
106;    To use with normal IDL routines::
107;       Plot, findgen(11), PSYM=cgSymCat(theSymbol)
108;
109;    To connect symbols with lines, use a negative value for the PSYM keyword::
110;       Plot, findgen(11), PSYM=-cgSymCat(theSymbol)
111;
112;    To use with Coyote Library routines, you can call cgSymCat indirectly::
113;       cgPlot, findgne(11), PSYM=16, SYMCOLOR='dodger blue'
114;
115; :Author:
116;    FANNING SOFTWARE CONSULTING::
117;       David W. Fanning
118;       1645 Sheely Drive
119;       Fort Collins, CO 80526 USA
120;       Phone: 970-221-0438
121;       E-mail: david@idlcoyote.com
122;       Coyote's Guide to IDL Programming: http://www.idlcoyote.com
123;
124; :History:
125;    Change History::
126;       Written by David W. Fanning, 2 September 2006. Loosely based on the
127;          program MC_SYMBOL introduced on the IDL newsgroup 1 September 2006,
128;          and MPI_PLOTCONFIG__DEFINE from the Coyote Library.
129;       Modified to allow PSYM=8 and PSYM=10 to have their normal meanings. This shifted
130;       previous symbols by two values from their old meanings. For example, an hourglass
131;       went from symbol number 19 to 21. 2 October 2006. DWF.
132;       Whoops! Added two symbols but forgot to change limits to allow for them. 4 May 2007. DWF.
133;       Added THICK keyword. 21 Aug 2007. DWF.
134;       Added COLOR keyword and made THICK keyword apply to all symbols. 11 Nov 2008. DWF.
135;       If you are using USERSYM, the "color" can get "stuck" on the last color used to draw
136;          a symbol. To "unstick" the color,  you have to call USERSYM without a color keyword
137;          before calling it again with a color keyword. This is, without a doubt, the strangest
138;          bug I've ever seen in IDL! 20 June 2012. DWF.
139;       Changed the way I "unstick" the color from calling USERSYM to calling SYMCAT. This
140;          avoids a problem in changing the symbol when SYMCAT is used (unnecessarily) to pass
141;          a symbol into Coyote Graphics programs. 9 July 2012. DWF.
142;       Added the ability (via Jack Saba) to ask for symbols by name. 17 July 2012. DWF.
143;       Added the ability to ask for the color by name. 17 July 2012. DWF.
144;       Renamed to cgSYMCAT from SYMCAT. 17 July 2012. DWF.
145;       The previous problem with USERSYM colors "sticking" turned out to be a problem
146;           with cgGraphicsKeywords, so I removed previous "fix". 18 July 2012. DWF.
147;       Modified the program to allow a "negative" string to be used as the symbol name
148;           (e.g., PSYM="-star"). 30 July 2012. DWF.
149;       Modified to use 36 points in circle, rather than 72. 10 May 2013. DWF.
150;       Fixed a problem with using parentheses, rather than square brackets. 15 Dec 2014. DWF.
151;
152; :Copyright:
153;     Copyright (c) 2006-2014, Fanning Software Consulting, Inc.
154;-
155FUNCTION cgSymCat, theInSymbol, COLOR=color, NAMES=names, THICK=thick
156
157   On_Error, 2
158
159   IF Keyword_Set(names) THEN BEGIN
160      names = [ $
161         'None', $
162         'Plus Sign', $
163         'Asterisk', $
164         'Dot', $
165         'Open Diamond', $
166         'Open Up Triangle', $
167         'Open Square', $
168         'X', $
169         'UserSym', $
170         'Open Circle', $
171         'Histogram', $
172         'Open Down Triangle', $
173         'Open Right Triangle', $
174         'Open Left Triangle', $
175         'Filled Diamond', $
176         'Filled Square', $
177         'Filled Circle', $
178         'Filled Up Triangle', $
179         'Filled Down Triangle', $
180         'Filled Right Triangle', $
181         'Filled Left Triangle', $
182         'Hourglass', $
183         'Filled Hourglass', $
184         'Bowtie', $
185         'Filled Bowtie', $
186         'Standing Bar', $
187         'Filled Standing Bar', $
188         'Laying Bar', $
189         'Filled Laying Bar', $
190         'Hat Up', $
191         'Hat Down', $
192         'Hat Right', $
193         'Hat Left', $
194         'Big Cross', $
195         'Filled Big Cross', $
196         'Circle Plus', $
197         'Circle X', $
198         'Upper Half Circle', $
199         'Fillled Upper Half Circle', $
200         'Lower Half Circle', $
201         'Filled Lower Half Circle', $
202         'Left Half Circle', $
203         'Filled Left Half Circle', $
204         'Right Half Circle', $
205         'Filled Right Half Circle', $
206         'Star', $
207         'Filled Star' ]
208
209       RETURN, names
210   ENDIF
211
212   ; Is the symbol input as a string?
213   IF ( SIZE(theInSymbol,/TNAME) EQ 'STRING' ) THEN BEGIN
214
215      ; Is the first character a minus sign?
216      IF (StrMid(theInSymbol,0,1) EQ "-") THEN BEGIN
217          aMinusString = 1
218          theInSymbol = StrMid(theInSymbol,1)
219      ENDIF
220
221      ; Aliases defined here.
222      IF StrUpCase(StrCompress(theInSymbol, /REMOVE_ALL)) EQ 'OPENUPWARDTRIANGLE' THEN theInSymbol = 'OPENUPTRIANGLE'
223      IF StrUpCase(StrCompress(theInSymbol, /REMOVE_ALL)) EQ 'OPENDOWNWARDTRIANGLE' THEN theInSymbol = 'OPENDOWNTRIANGLE'
224      IF StrUpCase(StrCompress(theInSymbol, /REMOVE_ALL)) EQ 'OPENRIGHTWARDTRIANGLE' THEN theInSymbol = 'OPENRIGHTTRIANGLE'
225      IF StrUpCase(StrCompress(theInSymbol, /REMOVE_ALL)) EQ 'OPENLEFTWARDTRIANGLE' THEN theInSymbol = 'OPENLEFTTRIANGLE'
226      IF StrUpCase(StrCompress(theInSymbol, /REMOVE_ALL)) EQ 'FILLEDUPWARDTRIANGLE' THEN theInSymbol = 'FILLEDUPTRIANGLE'
227      IF StrUpCase(StrCompress(theInSymbol, /REMOVE_ALL)) EQ 'FILLEDDOWNWARDTRIANGLE' THEN theInSymbol = 'FILLEDDOWNTRIANGLE'
228      IF StrUpCase(StrCompress(theInSymbol, /REMOVE_ALL)) EQ 'FILLEDDOWNWARDTRIANGLE' THEN theInSymbol = 'FILLEDDOWNTRIANGLE'
229      IF StrUpCase(StrCompress(theInSymbol, /REMOVE_ALL)) EQ 'FILLEDLEFTWARDTRIANGLE' THEN theInSymbol = 'FILLEDLEFTTRIANGLE'
230
231      CASE StrUpCase(StrCompress(theInSymbol, /REMOVE_ALL)) OF
232         '':                         theSymbol = 0
233         'NONE':                     theSymbol = 0
234         'PLUSSIGN':                 theSymbol = 1
235         'ASTERISK':                 theSymbol = 2
236         'DOT':                      theSymbol = 3
237         'OPENDIAMOND':              theSymbol = 4
238         'OPENUPTRIANGLE':           theSymbol = 5
239         'OPENSQUARE':               theSymbol = 6
240         'X':                        theSymbol = 7
241         'USERSYM':                  theSymbol = 8
242         'OPENCIRCLE':               theSymbol = 9
243         'HISTOGRAM':                theSymbol = 10
244         'OPENDOWNTRIANGLE':         theSymbol = 11
245         'OPENRIGHTTRIANGLE':        theSymbol = 12
246         'OPENLEFTTRIANGLE':         theSymbol = 13
247         'FILLEDDIAMOND':            theSymbol = 14
248         'FILLEDSQUARE':             theSymbol = 15
249         'FILLEDCIRCLE':             theSymbol = 16
250         'FILLEDUPTRIANGLE':         theSymbol = 17
251         'FILLEDDOWNTRIANGLE':       theSymbol = 18
252         'FILLEDRIGHTTRIANGLE':      theSymbol = 19
253         'FILLEDLEFTTRIANGLE':       theSymbol = 20
254         'HOURGLASS':                theSymbol = 21
255         'FILLEDHOURGLASS':          theSymbol = 22
256         'BOWTIE':                   theSymbol = 23
257         'FILLEDBOWTIE':             theSymbol = 24
258         'STANDINGBAR':              theSymbol = 25
259         'FILLEDSTANDINGBAR':        theSymbol = 26
260         'LAYINGBAR':                theSymbol = 27
261         'FILLEDLAYINGBAR':          theSymbol = 28
262         'HATUP':                    theSymbol = 29
263         'HATDOWN':                  theSymbol = 30
264         'HATRIGHT':                 theSymbol = 31
265         'HATLEFT':                  theSymbol = 32
266         'BIGCROSS':                 theSymbol = 33
267         'FILLEDBIGCROSS':           theSymbol = 34
268         'CIRCLEPLUS':               theSymbol = 35
269         'CIRCLEX':                  theSymbol = 36
270         'UPPERHALFCIRCLE':          theSymbol = 37
271         'FILLEDUPPERHALFCIRCLE':    theSymbol = 38
272         'LOWERHALFCIRCLE':          theSymbol = 39
273         'FILLEDLOWERHALFCIRCLE':    theSymbol = 40
274         'LEFTHALFCIRCLE':           theSymbol = 41
275         'FILLEDLEFTHALFCIRCLE':     theSymbol = 42
276         'RIGHTHALFCIRCLE':          theSymbol = 43
277         'FILLEDRIGHTHALFCIRCLE':    theSymbol = 44
278         'STAR':                     theSymbol = 45
279         'FILLEDSTAR':               theSymbol = 46
280         ELSE: Message, 'Symbol not defined.'
281      ENDCASE
282
283   ENDIF ELSE theSymbol = theInSymbol[0]
284
285   ; Error checking.
286   IF N_Elements(theSymbol) EQ 0 THEN RETURN, 0
287   IF N_Elements(thick) EQ 0 THEN thick = (!P.Thick EQ 0) ? 1 : !P.Thick
288   IF (Abs(theSymbol) LT 0) OR (Abs(theSymbol) GT 46) THEN Message, 'Symbol number out of defined range.'
289   theFinalSymbol = Fix(Abs(theSymbol))
290
291   ; Do you have a color?
292   IF N_Elements(color) NE 0 THEN BEGIN
293
294      ; Is color a string?
295      IF Size(color, /TNAME) EQ 'STRING' THEN thisColor = cgColor(color) ELSE thisColor = color
296
297   ENDIF
298
299   ; Define helper variables for creating circles.
300   phi = Findgen(36) * (!PI * 2 / 36.)
301   phi = [ phi, phi[0] ]
302
303   ; Use user defined symbol by default.
304   result = 8
305
306   CASE theFinalSymbol OF
307
308       0  : result = 0                                                                               ; No symbol.
309       1  : UserSym, [1, -1, 0, 0, 0], [0, 0, 0, -1, 1], THICK=thick, COLOR=thisColor                    ; Plus sign.
310       2  : result = 2                                                                               ; Asterisk.
311       3  : result = 3                                                                               ; Dot (period).
312       4  : UserSym, [ 0, 1, 0, -1, 0 ], [ 1, 0, -1, 0, 1 ], THICK=thick, COLOR=thisColor                ; Open diamond.
313       5  : UserSym, [ -1, 0, 1, -1 ], [ -1, 1, -1, -1 ], THICK=thick, COLOR=thisColor                   ; Open upward triangle.
314       6  : UserSym, [ -1, 1, 1, -1, -1 ], [ 1, 1, -1, -1, 1 ], THICK=thick, COLOR=thisColor             ; Open square.
315       7  : result = 7                                                                               ; X.
316       8  :                                                                                          ; User defined with USERSYM.
317       9  : UserSym, cos(phi), sin(phi), THICK=thick, COLOR=thisColor                                    ; Open circle.
318      10  : result = 10                                                                              ; Histogram type plot.
319      11  : UserSYm, [ -1, 0, 1, -1 ], [ 1, -1, 1, 1 ], THICK=thick, COLOR=thisColor                     ; Open downward facing triangle
320      12  : UserSym, [ -1, 1, -1, -1 ], [1, 0, -1, 1 ], THICK=thick, COLOR=thisColor                     ; Open rightfacing triangle.
321      13  : UserSym, [ 1, -1, 1, 1 ], [1, 0, -1, 1 ], THICK=thick, COLOR=thisColor                       ; Open leftfacing triangle.
322      14  : UserSym, [ 0, 1, 0, -1, 0 ], [ 1, 0, -1, 0, 1 ], /Fill, THICK=thick, COLOR=thisColor         ; Filled diamond.
323      15  : UserSym, [ -1, 1, 1, -1, -1 ], [ 1, 1, -1, -1, 1 ], /Fill, THICK=thick, COLOR=thisColor      ; Filled square.
324      16  : UserSym, Cos(phi), Sin(phi), /Fill, THICK=thick, COLOR=thisColor                             ; Filled circle.
325      17  : UserSym, [ -1, 0, 1, -1 ], [ -1, 1, -1, -1 ], /Fill, THICK=thick, COLOR=thisColor            ; Filled upward triangle.
326      18  : UserSym, [ -1, 0, 1, -1 ], [  1, -1, 1, 1 ], /Fill, THICK=thick, COLOR=thisColor             ; Filled downward triangle.
327      19  : UserSym, [ -1, 1, -1, -1 ], [1, 0, -1, 1 ], /Fill, THICK=thick, COLOR=thisColor              ; Filled rightfacing triangle.
328      20  : UserSym, [ 1, -1, 1, 1 ], [1, 0, -1, 1 ], /Fill, THICK=thick, COLOR=thisColor                ; Filled leftfacing triangle.
329      21  : UserSym, [-1, 1,-1,1,-1], [-1,-1, 1,1,-1], THICK=thick, COLOR=thisColor                      ; Hourglass.
330      22  : UserSym, [-1, 1,-1,1,-1], [-1,-1, 1,1,-1], /Fill, THICK=thick, COLOR=thisColor               ; Filled Hourglass.
331      23  : UserSym, [-1,-1, 1,1,-1], [-1, 1,-1,1,-1], THICK=thick, COLOR=thisColor                      ; Bowtie.
332      24  : UserSym, [-1,-1, 1,1,-1], [-1, 1,-1,1,-1], /Fill, THICK=thick, COLOR=thisColor               ; Filled bowtie.
333      25  : UserSym, [-0.5,-0.5, 0.5, 0.5,-0.5], [-1, 1, 1,-1,-1], THICK=thick, COLOR=thisColor          ; Standing Bar.
334      26  : UserSym, [-0.5,-0.5, 0.5, 0.5,-0.5], [-1, 1, 1,-1,-1], /Fill, THICK=thick, COLOR=thisColor   ; Filled Standing Bar.
335      27  : UserSym, [-1,-1, 1, 1,-1], [-0.5, 0.5, 0.5,-0.5,-0.5], THICK=thick, COLOR=thisColor          ; Laying Bar.
336      28  : UserSym, [-1,-1, 1, 1,-1], [-0.5, 0.5, 0.5,-0.5,-0.5], /Fill, THICK=thick, COLOR=thisColor   ; Filled Laying Bar.
337      29  : UserSym, [-1, -0.5, -0.5, 0.5, 0.5, 1, -1], [-0.7, -0.7, 0.7, 0.7, -0.7, -0.7, -0.7], THICK=thick, COLOR=thisColor ; Hat up.
338      30  : UserSym, [-1, -0.5, -0.5, 0.5, 0.5, 1, -1], [0.7, 0.7, -0.7, -0.7, 0.7, 0.7, 0.7], THICK=thick, COLOR=thisColor    ; Hat down.
339      31  : UserSym, [-0.7, -0.7, 0.7, 0.7, -0.7, -0.7, -0.7], [-1, -0.5, -0.5, 0.5, 0.5, 1, -1], THICK=thick, COLOR=thisColor ; Hat right.
340      32  : UserSym, [0.7, 0.7, -0.7, -0.7, 0.7, 0.7, 0.7], [-1, -0.5, -0.5, 0.5, 0.5, 1, -1], THICK=thick, COLOR=thisColor    ; Hat down.
341      33  : UserSym, [1, 0.3, 0.3, -0.3, -0.3, -1, -1, -0.3, -0.3, 0.3, 0.3, 1, 1], $
342                     [0.3, 0.3, 1, 1, 0.3, 0.3, -0.3, -0.3, -1, -1, -0.3, -0.3, 0.3], THICK=thick, COLOR=thisColor             ; Big cross.
343      34  : UserSym, [1, 0.3, 0.3, -0.3, -0.3, -1, -1, -0.3, -0.3, 0.3, 0.3, 1, 1], $
344                     [0.3, 0.3, 1, 1, 0.3, 0.3, -0.3, -0.3, -1, -1, -0.3, -0.3, 0.3], /Fill , THICK=thick, COLOR=thisColor     ; Filled big cross.
345      35  : UserSym, [1,.866, .707, .500, 0,-.500,-.707,-.866,-1, $
346                      -.866,-.707,-.500, 0, .500, .707, .866, 1, -1, 0, 0, 0], $
347                     [0,.500, .707, .866, 1, .866, .707, .500, 0, $
348                      -.500,-.707,-.866,-1,-.866,-.707,-.500, 0, 0, 0, 1, -1], THICK=thick, COLOR=thisColor                    ; Circle with plus.
349      36  : UserSym, [1,.866, .707, .500, 0,-.500,-.707,-.866,-1, $
350                      -.866,-.707,-.500, 0, .500, .707, .866, 1, $
351                      .866,.707,-.707,    0, .707,-.707], $
352                     [0,.500, .707, .866, 1, .866, .707, .500, 0, $
353                      -.500,-.707,-.866,-1,-.866,-.707,-.500, 0, $
354                      .500,.707,-.707,    0,-.707, .707]   , THICK=thick, COLOR=thisColor                                      ; Circle with X.
355      37  : UserSym, [Cos(phi[0:18]), Cos(phi[0])], [Sin(phi[0:18]), Sin(phi[0])]-0.5, THICK=thick, COLOR=thisColor            ; Upper half circle.
356      38  : UserSym, [Cos(phi[0:18]), Cos(phi[0])], [Sin(phi[0:18]), Sin(phi[0])]-0.5, /Fill, THICK=thick, COLOR=thisColor     ; Filled upper half circle.
357      39  : UserSym, [Cos(phi[18:36]), Cos(phi[18])], [Sin(phi[18:36]), Sin(phi[18])]+0.5, THICK=thick, COLOR=thisColor        ; Lower half circle.
358      40  : UserSym, [Cos(phi[18:36]), Cos(phi[18])], [Sin(phi[18:36]), Sin(phi[18])]+0.5, /Fill, THICK=thick, COLOR=thisColor ; Filled lower half circle.
359      41  : UserSym, [Cos(phi[9:27]), Cos(phi[9])]+0.5, [Sin(phi[9:27]), Sin(phi[9])], THICK=thick, COLOR=thisColor            ; Left half circle.
360      42  : UserSym, [Cos(phi[9:27]), Cos(phi[9])]+0.5, [Sin(phi[9:27]), Sin(phi[9])], /Fill, THICK=thick, COLOR=thisColor     ; Filled left half circle.
361      43  : UserSym, [Cos(phi[27:36]), Cos(phi[0:9]), Cos(phi[27])]-0.5, $
362                     [Sin(phi[27:36]), Sin(phi[0:9]), Sin(phi[27])], THICK=thick, COLOR=thisColor                              ; Right half circle.
363      44  : UserSym, [Cos(phi[27:36]), Cos(phi[0:9]), Cos(phi[27])]-0.5, $
364                     [Sin(phi[27:36]), Sin(phi[0:9]), Sin(phi[27])], /Fill, THICK=thick, COLOR=thisColor                       ; Filled right half circle.
365      45  : UserSym, [-1,-.33, 0,.33,1, .33, 0,-.33,-1], $
366                     [ 0, .33, 1,.33,0,-.33,-1,-.33, 0], THICK=thick, COLOR=thisColor                                          ; Star.
367      46  : UserSym, [-1,-.33, 0,.33,1, .33, 0,-.33,-1], $
368                     [ 0, .33, 1,.33,0,-.33,-1,-.33, 0], /Fill, THICK=thick, COLOR=thisColor                                   ; Filled star.
369      ELSE: Message, 'Cannot resolve the symbol. Please specify an integer between 0 and 46.'
370   ENDCASE
371
372   ; If this is a minus string, we have to modify the result and fix the input.
373   IF Keyword_Set(aMinusString) THEN BEGIN
374      result = -result
375      theInSymbol[0] = '-' + theInSymbol
376   ENDIF
377
378   RETURN, result
379END ;-----------------------------------------------------------------------------------------------------------------------------
380
381
382
383