; docformat = 'rst' ; ; NAME: ; cgSymCat ; ; PURPOSE: ; This function provides a symbol catalog for specifying a number of plotting symbols. ; ;******************************************************************************************; ; ; ; Copyright (c) 20o6-2012, by Fanning Software Consulting, Inc. All rights reserved. ; ; ; ; Redistribution and use in source and binary forms, with or without ; ; modification, are permitted provided that the following conditions are met: ; ; ; ; * Redistributions of source code must retain the above copyright ; ; notice, this list of conditions and the following disclaimer. ; ; * Redistributions in binary form must reproduce the above copyright ; ; notice, this list of conditions and the following disclaimer in the ; ; documentation and/or other materials provided with the distribution. ; ; * Neither the name of Fanning Software Consulting, Inc. nor the names of its ; ; contributors may be used to endorse or promote products derived from this ; ; software without specific prior written permission. ; ; ; ; THIS SOFTWARE IS PROVIDED BY FANNING SOFTWARE CONSULTING, INC. ''AS IS'' AND ANY ; ; EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES ; ; OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT ; ; SHALL FANNING SOFTWARE CONSULTING, INC. BE LIABLE FOR ANY DIRECT, INDIRECT, ; ; INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED ; ; TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; ; ; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ; ; ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ; ; (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS ; ; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ; ;******************************************************************************************; ; ;+ ; This function provides a symbol catalog for specifying a number of plotting symbols. ; ; :Categories: ; Graphics ; ; :Params: ; theInSymbol: in, required, type=varies ; The number (or name) of the symbol you wish to use. Possible values are:: ; 0 : No symbol. NONE ; 1 : Plus sign. PLUSSIGN ; 2 : Asterisk. ASTERISK ; 3 : Dot (period). DOT ; 4 : Open diamond. OPENDIAMOND ; 5 : Open upward triangle. OPENUPTRIANGLE ; 6 : Open square. OPENSQUARE ; 7 : X. X ; 8 : Defined by the user with USERSYM. USERSYM ; 9 : Open circle. OPENCIRCLE ; 10 : Histogram style plot. HISTOGRAM ; 11 : Open downward triangle. OPENDOWNTRIANGLE ; 12 : Open rightfacing triangle. OPENRIGHTTRIANGLE ; 13 : Open leftfacing triangle. OPENLEFTTRIANGLE ; 14 : Filled diamond. FILLEDDIAMOND ; 15 : Filled square. FILLEDSQUARE ; 16 : Filled circle. FILLEDCIRCLE ; 17 : Filled upward triangle. FILLEDUPTRIANGLE ; 18 : Filled downward triangle. FILLEDDOWNTRIANGLE ; 19 : Filled rightfacing triangle. FILLEDRIGHTTRIANGLE ; 20 : Filled leftfacing triangle. FILLEDLEFTTRIANGLE ; 21 : Hourglass. HOURGLASS ; 22 : Filled Hourglass. FILLEDHOURGLASS ; 23 : Bowtie. BOWTIE ; 24 : Filled bowtie. FILLEDBOWTIE ; 25 : Standing Bar. STANDINGBAR ; 26 : Filled Standing Bar. FILLEDSTANDINGBAR ; 27 : Laying Bar. LAYINGBAR ; 28 : Filled Laying Bar. FILLEDLAYINGBAR ; 29 : Hat up. HATUP ; 30 : Hat down. HATDOWN ; 31 : Hat right. HATRIGHT ; 32 : Hat down. HATDOWN ; 33 : Big cross. BIGCROSS ; 34 : Filled big cross. FILLEDBIGCROSS ; 35 : Circle with plus. CIRCLEWITHPLUS ; 36 : Circle with X. CIRCLEWITHX ; 37 : Upper half circle. UPPERHALFCIRCLE ; 38 : Filled upper half circle. FILLEDUPPERHALFCIRCLE ; 39 : Lower half circle. LOWERHALFCIRCLE ; 40 : Filled lower half circle. FILLEDLOWERHALFCIRCLE ; 41 : Left half circle. LEFTHALFCIRCLE ; 42 : Filled left half circle. FILLEDLEFTHALFCIRCLE ; 43 : Right half circle. RIGHTHALFCIRCLE ; 44 : Filled right half circle. FILLEDRIGHTHALFCIRCLE ; 45 : Star. STAR ; 46 : Filled star. FILLEDSTAR ; ; :Keywords: ; color: in, optional, type=varies ; Set this keyword to the color (color table index, 24-bit value, or color name) ; of the color desired. ; names: in, optional, type=boolean, default=0 ; If this keyword is set, the function returns the names of the symbols allowed. ; The index number of the name is its symbol number. ; thick: in, optional, type=float, default=1.0 ; Set this keyword to the thickness desired. Default is 1. ; ; :Examples: ; ; To use with normal IDL routines:: ; Plot, findgen(11), PSYM=cgSymCat(theSymbol) ; ; To connect symbols with lines, use a negative value for the PSYM keyword:: ; Plot, findgen(11), PSYM=-cgSymCat(theSymbol) ; ; To use with Coyote Library routines, you can call cgSymCat indirectly:: ; cgPlot, findgne(11), PSYM=16, SYMCOLOR='dodger blue' ; ; :Author: ; FANNING SOFTWARE CONSULTING:: ; David W. Fanning ; 1645 Sheely Drive ; Fort Collins, CO 80526 USA ; Phone: 970-221-0438 ; E-mail: david@idlcoyote.com ; Coyote's Guide to IDL Programming: http://www.idlcoyote.com ; ; :History: ; Change History:: ; Written by David W. Fanning, 2 September 2006. Loosely based on the ; program MC_SYMBOL introduced on the IDL newsgroup 1 September 2006, ; and MPI_PLOTCONFIG__DEFINE from the Coyote Library. ; Modified to allow PSYM=8 and PSYM=10 to have their normal meanings. This shifted ; previous symbols by two values from their old meanings. For example, an hourglass ; went from symbol number 19 to 21. 2 October 2006. DWF. ; Whoops! Added two symbols but forgot to change limits to allow for them. 4 May 2007. DWF. ; Added THICK keyword. 21 Aug 2007. DWF. ; Added COLOR keyword and made THICK keyword apply to all symbols. 11 Nov 2008. DWF. ; If you are using USERSYM, the "color" can get "stuck" on the last color used to draw ; a symbol. To "unstick" the color, you have to call USERSYM without a color keyword ; before calling it again with a color keyword. This is, without a doubt, the strangest ; bug I've ever seen in IDL! 20 June 2012. DWF. ; Changed the way I "unstick" the color from calling USERSYM to calling SYMCAT. This ; avoids a problem in changing the symbol when SYMCAT is used (unnecessarily) to pass ; a symbol into Coyote Graphics programs. 9 July 2012. DWF. ; Added the ability (via Jack Saba) to ask for symbols by name. 17 July 2012. DWF. ; Added the ability to ask for the color by name. 17 July 2012. DWF. ; Renamed to cgSYMCAT from SYMCAT. 17 July 2012. DWF. ; The previous problem with USERSYM colors "sticking" turned out to be a problem ; with cgGraphicsKeywords, so I removed previous "fix". 18 July 2012. DWF. ; Modified the program to allow a "negative" string to be used as the symbol name ; (e.g., PSYM="-star"). 30 July 2012. DWF. ; Modified to use 36 points in circle, rather than 72. 10 May 2013. DWF. ; Fixed a problem with using parentheses, rather than square brackets. 15 Dec 2014. DWF. ; ; :Copyright: ; Copyright (c) 2006-2014, Fanning Software Consulting, Inc. ;- FUNCTION cgSymCat, theInSymbol, COLOR=color, NAMES=names, THICK=thick On_Error, 2 IF Keyword_Set(names) THEN BEGIN names = [ $ 'None', $ 'Plus Sign', $ 'Asterisk', $ 'Dot', $ 'Open Diamond', $ 'Open Up Triangle', $ 'Open Square', $ 'X', $ 'UserSym', $ 'Open Circle', $ 'Histogram', $ 'Open Down Triangle', $ 'Open Right Triangle', $ 'Open Left Triangle', $ 'Filled Diamond', $ 'Filled Square', $ 'Filled Circle', $ 'Filled Up Triangle', $ 'Filled Down Triangle', $ 'Filled Right Triangle', $ 'Filled Left Triangle', $ 'Hourglass', $ 'Filled Hourglass', $ 'Bowtie', $ 'Filled Bowtie', $ 'Standing Bar', $ 'Filled Standing Bar', $ 'Laying Bar', $ 'Filled Laying Bar', $ 'Hat Up', $ 'Hat Down', $ 'Hat Right', $ 'Hat Left', $ 'Big Cross', $ 'Filled Big Cross', $ 'Circle Plus', $ 'Circle X', $ 'Upper Half Circle', $ 'Fillled Upper Half Circle', $ 'Lower Half Circle', $ 'Filled Lower Half Circle', $ 'Left Half Circle', $ 'Filled Left Half Circle', $ 'Right Half Circle', $ 'Filled Right Half Circle', $ 'Star', $ 'Filled Star' ] RETURN, names ENDIF ; Is the symbol input as a string? IF ( SIZE(theInSymbol,/TNAME) EQ 'STRING' ) THEN BEGIN ; Is the first character a minus sign? IF (StrMid(theInSymbol,0,1) EQ "-") THEN BEGIN aMinusString = 1 theInSymbol = StrMid(theInSymbol,1) ENDIF ; Aliases defined here. IF StrUpCase(StrCompress(theInSymbol, /REMOVE_ALL)) EQ 'OPENUPWARDTRIANGLE' THEN theInSymbol = 'OPENUPTRIANGLE' IF StrUpCase(StrCompress(theInSymbol, /REMOVE_ALL)) EQ 'OPENDOWNWARDTRIANGLE' THEN theInSymbol = 'OPENDOWNTRIANGLE' IF StrUpCase(StrCompress(theInSymbol, /REMOVE_ALL)) EQ 'OPENRIGHTWARDTRIANGLE' THEN theInSymbol = 'OPENRIGHTTRIANGLE' IF StrUpCase(StrCompress(theInSymbol, /REMOVE_ALL)) EQ 'OPENLEFTWARDTRIANGLE' THEN theInSymbol = 'OPENLEFTTRIANGLE' IF StrUpCase(StrCompress(theInSymbol, /REMOVE_ALL)) EQ 'FILLEDUPWARDTRIANGLE' THEN theInSymbol = 'FILLEDUPTRIANGLE' IF StrUpCase(StrCompress(theInSymbol, /REMOVE_ALL)) EQ 'FILLEDDOWNWARDTRIANGLE' THEN theInSymbol = 'FILLEDDOWNTRIANGLE' IF StrUpCase(StrCompress(theInSymbol, /REMOVE_ALL)) EQ 'FILLEDDOWNWARDTRIANGLE' THEN theInSymbol = 'FILLEDDOWNTRIANGLE' IF StrUpCase(StrCompress(theInSymbol, /REMOVE_ALL)) EQ 'FILLEDLEFTWARDTRIANGLE' THEN theInSymbol = 'FILLEDLEFTTRIANGLE' CASE StrUpCase(StrCompress(theInSymbol, /REMOVE_ALL)) OF '': theSymbol = 0 'NONE': theSymbol = 0 'PLUSSIGN': theSymbol = 1 'ASTERISK': theSymbol = 2 'DOT': theSymbol = 3 'OPENDIAMOND': theSymbol = 4 'OPENUPTRIANGLE': theSymbol = 5 'OPENSQUARE': theSymbol = 6 'X': theSymbol = 7 'USERSYM': theSymbol = 8 'OPENCIRCLE': theSymbol = 9 'HISTOGRAM': theSymbol = 10 'OPENDOWNTRIANGLE': theSymbol = 11 'OPENRIGHTTRIANGLE': theSymbol = 12 'OPENLEFTTRIANGLE': theSymbol = 13 'FILLEDDIAMOND': theSymbol = 14 'FILLEDSQUARE': theSymbol = 15 'FILLEDCIRCLE': theSymbol = 16 'FILLEDUPTRIANGLE': theSymbol = 17 'FILLEDDOWNTRIANGLE': theSymbol = 18 'FILLEDRIGHTTRIANGLE': theSymbol = 19 'FILLEDLEFTTRIANGLE': theSymbol = 20 'HOURGLASS': theSymbol = 21 'FILLEDHOURGLASS': theSymbol = 22 'BOWTIE': theSymbol = 23 'FILLEDBOWTIE': theSymbol = 24 'STANDINGBAR': theSymbol = 25 'FILLEDSTANDINGBAR': theSymbol = 26 'LAYINGBAR': theSymbol = 27 'FILLEDLAYINGBAR': theSymbol = 28 'HATUP': theSymbol = 29 'HATDOWN': theSymbol = 30 'HATRIGHT': theSymbol = 31 'HATLEFT': theSymbol = 32 'BIGCROSS': theSymbol = 33 'FILLEDBIGCROSS': theSymbol = 34 'CIRCLEPLUS': theSymbol = 35 'CIRCLEX': theSymbol = 36 'UPPERHALFCIRCLE': theSymbol = 37 'FILLEDUPPERHALFCIRCLE': theSymbol = 38 'LOWERHALFCIRCLE': theSymbol = 39 'FILLEDLOWERHALFCIRCLE': theSymbol = 40 'LEFTHALFCIRCLE': theSymbol = 41 'FILLEDLEFTHALFCIRCLE': theSymbol = 42 'RIGHTHALFCIRCLE': theSymbol = 43 'FILLEDRIGHTHALFCIRCLE': theSymbol = 44 'STAR': theSymbol = 45 'FILLEDSTAR': theSymbol = 46 ELSE: Message, 'Symbol not defined.' ENDCASE ENDIF ELSE theSymbol = theInSymbol[0] ; Error checking. IF N_Elements(theSymbol) EQ 0 THEN RETURN, 0 IF N_Elements(thick) EQ 0 THEN thick = (!P.Thick EQ 0) ? 1 : !P.Thick IF (Abs(theSymbol) LT 0) OR (Abs(theSymbol) GT 46) THEN Message, 'Symbol number out of defined range.' theFinalSymbol = Fix(Abs(theSymbol)) ; Do you have a color? IF N_Elements(color) NE 0 THEN BEGIN ; Is color a string? IF Size(color, /TNAME) EQ 'STRING' THEN thisColor = cgColor(color) ELSE thisColor = color ENDIF ; Define helper variables for creating circles. phi = Findgen(36) * (!PI * 2 / 36.) phi = [ phi, phi[0] ] ; Use user defined symbol by default. result = 8 CASE theFinalSymbol OF 0 : result = 0 ; No symbol. 1 : UserSym, [1, -1, 0, 0, 0], [0, 0, 0, -1, 1], THICK=thick, COLOR=thisColor ; Plus sign. 2 : result = 2 ; Asterisk. 3 : result = 3 ; Dot (period). 4 : UserSym, [ 0, 1, 0, -1, 0 ], [ 1, 0, -1, 0, 1 ], THICK=thick, COLOR=thisColor ; Open diamond. 5 : UserSym, [ -1, 0, 1, -1 ], [ -1, 1, -1, -1 ], THICK=thick, COLOR=thisColor ; Open upward triangle. 6 : UserSym, [ -1, 1, 1, -1, -1 ], [ 1, 1, -1, -1, 1 ], THICK=thick, COLOR=thisColor ; Open square. 7 : result = 7 ; X. 8 : ; User defined with USERSYM. 9 : UserSym, cos(phi), sin(phi), THICK=thick, COLOR=thisColor ; Open circle. 10 : result = 10 ; Histogram type plot. 11 : UserSYm, [ -1, 0, 1, -1 ], [ 1, -1, 1, 1 ], THICK=thick, COLOR=thisColor ; Open downward facing triangle 12 : UserSym, [ -1, 1, -1, -1 ], [1, 0, -1, 1 ], THICK=thick, COLOR=thisColor ; Open rightfacing triangle. 13 : UserSym, [ 1, -1, 1, 1 ], [1, 0, -1, 1 ], THICK=thick, COLOR=thisColor ; Open leftfacing triangle. 14 : UserSym, [ 0, 1, 0, -1, 0 ], [ 1, 0, -1, 0, 1 ], /Fill, THICK=thick, COLOR=thisColor ; Filled diamond. 15 : UserSym, [ -1, 1, 1, -1, -1 ], [ 1, 1, -1, -1, 1 ], /Fill, THICK=thick, COLOR=thisColor ; Filled square. 16 : UserSym, Cos(phi), Sin(phi), /Fill, THICK=thick, COLOR=thisColor ; Filled circle. 17 : UserSym, [ -1, 0, 1, -1 ], [ -1, 1, -1, -1 ], /Fill, THICK=thick, COLOR=thisColor ; Filled upward triangle. 18 : UserSym, [ -1, 0, 1, -1 ], [ 1, -1, 1, 1 ], /Fill, THICK=thick, COLOR=thisColor ; Filled downward triangle. 19 : UserSym, [ -1, 1, -1, -1 ], [1, 0, -1, 1 ], /Fill, THICK=thick, COLOR=thisColor ; Filled rightfacing triangle. 20 : UserSym, [ 1, -1, 1, 1 ], [1, 0, -1, 1 ], /Fill, THICK=thick, COLOR=thisColor ; Filled leftfacing triangle. 21 : UserSym, [-1, 1,-1,1,-1], [-1,-1, 1,1,-1], THICK=thick, COLOR=thisColor ; Hourglass. 22 : UserSym, [-1, 1,-1,1,-1], [-1,-1, 1,1,-1], /Fill, THICK=thick, COLOR=thisColor ; Filled Hourglass. 23 : UserSym, [-1,-1, 1,1,-1], [-1, 1,-1,1,-1], THICK=thick, COLOR=thisColor ; Bowtie. 24 : UserSym, [-1,-1, 1,1,-1], [-1, 1,-1,1,-1], /Fill, THICK=thick, COLOR=thisColor ; Filled bowtie. 25 : UserSym, [-0.5,-0.5, 0.5, 0.5,-0.5], [-1, 1, 1,-1,-1], THICK=thick, COLOR=thisColor ; Standing Bar. 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. 27 : UserSym, [-1,-1, 1, 1,-1], [-0.5, 0.5, 0.5,-0.5,-0.5], THICK=thick, COLOR=thisColor ; Laying Bar. 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. 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. 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. 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. 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. 33 : UserSym, [1, 0.3, 0.3, -0.3, -0.3, -1, -1, -0.3, -0.3, 0.3, 0.3, 1, 1], $ [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. 34 : UserSym, [1, 0.3, 0.3, -0.3, -0.3, -1, -1, -0.3, -0.3, 0.3, 0.3, 1, 1], $ [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. 35 : UserSym, [1,.866, .707, .500, 0,-.500,-.707,-.866,-1, $ -.866,-.707,-.500, 0, .500, .707, .866, 1, -1, 0, 0, 0], $ [0,.500, .707, .866, 1, .866, .707, .500, 0, $ -.500,-.707,-.866,-1,-.866,-.707,-.500, 0, 0, 0, 1, -1], THICK=thick, COLOR=thisColor ; Circle with plus. 36 : UserSym, [1,.866, .707, .500, 0,-.500,-.707,-.866,-1, $ -.866,-.707,-.500, 0, .500, .707, .866, 1, $ .866,.707,-.707, 0, .707,-.707], $ [0,.500, .707, .866, 1, .866, .707, .500, 0, $ -.500,-.707,-.866,-1,-.866,-.707,-.500, 0, $ .500,.707,-.707, 0,-.707, .707] , THICK=thick, COLOR=thisColor ; Circle with X. 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. 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. 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. 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. 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. 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. 43 : UserSym, [Cos(phi[27:36]), Cos(phi[0:9]), Cos(phi[27])]-0.5, $ [Sin(phi[27:36]), Sin(phi[0:9]), Sin(phi[27])], THICK=thick, COLOR=thisColor ; Right half circle. 44 : UserSym, [Cos(phi[27:36]), Cos(phi[0:9]), Cos(phi[27])]-0.5, $ [Sin(phi[27:36]), Sin(phi[0:9]), Sin(phi[27])], /Fill, THICK=thick, COLOR=thisColor ; Filled right half circle. 45 : UserSym, [-1,-.33, 0,.33,1, .33, 0,-.33,-1], $ [ 0, .33, 1,.33,0,-.33,-1,-.33, 0], THICK=thick, COLOR=thisColor ; Star. 46 : UserSym, [-1,-.33, 0,.33,1, .33, 0,-.33,-1], $ [ 0, .33, 1,.33,0,-.33,-1,-.33, 0], /Fill, THICK=thick, COLOR=thisColor ; Filled star. ELSE: Message, 'Cannot resolve the symbol. Please specify an integer between 0 and 46.' ENDCASE ; If this is a minus string, we have to modify the result and fix the input. IF Keyword_Set(aMinusString) THEN BEGIN result = -result theInSymbol[0] = '-' + theInSymbol ENDIF RETURN, result END ;-----------------------------------------------------------------------------------------------------------------------------