Hex Artifact Content
Not logged in

Artifact 5f2c7c264280cf154c2ebbddf75251297d1e63f4:


0000: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0010: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0020: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0030: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0040: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0a  ###############.
0050: 23 0a 23 20 67 72 61 70 68 2e 74 63 6c 0a 23 0a  #.# graph.tcl.#.
0060: 23 20 20 43 6f 70 79 72 69 67 68 74 20 28 43 29  #  Copyright (C)
0070: 20 32 30 31 37 20 4a 6f 65 72 67 20 4d 65 68 72   2017 Joerg Mehr
0080: 69 6e 67 2c 20 42 6f 63 68 75 6d 2c 20 44 45 2c  ing, Bochum, DE,
0090: 20 3c 6a 2e 6d 65 68 72 69 6e 67 40 73 65 73 61   <j.mehring@sesa
00a0: 6d 2d 67 6d 62 68 2e 64 65 3e 0a 23 20 20 41 6c  m-gmbh.de>.#  Al
00b0: 6c 20 72 69 67 68 74 73 20 72 65 73 65 72 76 65  l rights reserve
00c0: 64 2e 20 28 42 53 44 2d 33 20 6c 69 63 65 6e 73  d. (BSD-3 licens
00d0: 65 29 0a 23 0a 23 20 20 52 65 64 69 73 74 72 69  e).#.#  Redistri
00e0: 62 75 74 69 6f 6e 20 61 6e 64 20 75 73 65 20 69  bution and use i
00f0: 6e 20 73 6f 75 72 63 65 20 61 6e 64 20 62 69 6e  n source and bin
0100: 61 72 79 20 66 6f 72 6d 73 2c 20 77 69 74 68 20  ary forms, with 
0110: 6f 72 20 77 69 74 68 6f 75 74 20 6d 6f 64 69 66  or without modif
0120: 69 63 61 74 69 6f 6e 2c 0a 23 20 20 61 72 65 20  ication,.#  are 
0130: 70 65 72 6d 69 74 74 65 64 20 70 72 6f 76 69 64  permitted provid
0140: 65 64 20 74 68 61 74 20 74 68 65 20 66 6f 6c 6c  ed that the foll
0150: 6f 77 69 6e 67 20 63 6f 6e 64 69 74 69 6f 6e 73  owing conditions
0160: 20 61 72 65 20 6d 65 74 3a 0a 23 0a 23 20 20 31   are met:.#.#  1
0170: 2e 20 52 65 64 69 73 74 72 69 62 75 74 69 6f 6e  . Redistribution
0180: 73 20 6f 66 20 73 6f 75 72 63 65 20 63 6f 64 65  s of source code
0190: 20 6d 75 73 74 20 72 65 74 61 69 6e 20 74 68 65   must retain the
01a0: 20 61 62 6f 76 65 20 63 6f 70 79 72 69 67 68 74   above copyright
01b0: 20 6e 6f 74 69 63 65 2c 20 74 68 69 73 0a 23 20   notice, this.# 
01c0: 20 20 20 20 6c 69 73 74 20 6f 66 20 63 6f 6e 64      list of cond
01d0: 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 66  itions and the f
01e0: 6f 6c 6c 6f 77 69 6e 67 20 64 69 73 63 6c 61 69  ollowing disclai
01f0: 6d 65 72 2e 0a 23 20 20 32 2e 20 52 65 64 69 73  mer..#  2. Redis
0200: 74 72 69 62 75 74 69 6f 6e 73 20 69 6e 20 62 69  tributions in bi
0210: 6e 61 72 79 20 66 6f 72 6d 20 6d 75 73 74 20 72  nary form must r
0220: 65 70 72 6f 64 75 63 65 20 74 68 65 20 61 62 6f  eproduce the abo
0230: 76 65 20 63 6f 70 79 72 69 67 68 74 20 6e 6f 74  ve copyright not
0240: 69 63 65 2c 0a 23 20 20 20 20 20 74 68 69 73 20  ice,.#     this 
0250: 6c 69 73 74 20 6f 66 20 63 6f 6e 64 69 74 69 6f  list of conditio
0260: 6e 73 20 61 6e 64 20 74 68 65 20 66 6f 6c 6c 6f  ns and the follo
0270: 77 69 6e 67 20 64 69 73 63 6c 61 69 6d 65 72 20  wing disclaimer 
0280: 69 6e 20 74 68 65 20 64 6f 63 75 6d 65 6e 74 61  in the documenta
0290: 74 69 6f 6e 0a 23 20 20 20 20 20 61 6e 64 2f 6f  tion.#     and/o
02a0: 72 20 6f 74 68 65 72 20 6d 61 74 65 72 69 61 6c  r other material
02b0: 73 20 70 72 6f 76 69 64 65 64 20 77 69 74 68 20  s provided with 
02c0: 74 68 65 20 64 69 73 74 72 69 62 75 74 69 6f 6e  the distribution
02d0: 2e 0a 23 20 20 33 2e 20 4e 65 69 74 68 65 72 20  ..#  3. Neither 
02e0: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
02f0: 70 72 6f 6a 65 63 74 20 6e 6f 72 20 74 68 65 20  project nor the 
0300: 6e 61 6d 65 73 20 6f 66 20 69 74 73 20 63 6f 6e  names of its con
0310: 74 72 69 62 75 74 6f 72 73 20 6d 61 79 20 62 65  tributors may be
0320: 20 75 73 65 64 0a 23 20 20 20 20 20 74 6f 20 65   used.#     to e
0330: 6e 64 6f 72 73 65 20 6f 72 20 70 72 6f 6d 6f 74  ndorse or promot
0340: 65 20 70 72 6f 64 75 63 74 73 20 64 65 72 69 76  e products deriv
0350: 65 64 20 66 72 6f 6d 20 74 68 69 73 20 73 6f 66  ed from this sof
0360: 74 77 61 72 65 20 77 69 74 68 6f 75 74 20 73 70  tware without sp
0370: 65 63 69 66 69 63 0a 23 20 20 20 20 20 70 72 69  ecific.#     pri
0380: 6f 72 20 77 72 69 74 74 65 6e 20 70 65 72 6d 69  or written permi
0390: 73 73 69 6f 6e 2e 0a 23 0a 23 20 20 54 48 49 53  ssion..#.#  THIS
03a0: 20 53 4f 46 54 57 41 52 45 20 49 53 20 50 52 4f   SOFTWARE IS PRO
03b0: 56 49 44 45 44 20 42 59 20 54 48 45 20 43 4f 50  VIDED BY THE COP
03c0: 59 52 49 47 48 54 20 48 4f 4c 44 45 52 53 20 41  YRIGHT HOLDERS A
03d0: 4e 44 20 43 4f 4e 54 52 49 42 55 54 4f 52 53 20  ND CONTRIBUTORS 
03e0: 22 41 53 20 49 53 22 20 41 4e 44 20 41 4e 59 0a  "AS IS" AND ANY.
03f0: 23 20 20 45 58 50 52 45 53 53 20 4f 52 20 49 4d  #  EXPRESS OR IM
0400: 50 4c 49 45 44 20 57 41 52 52 41 4e 54 49 45 53  PLIED WARRANTIES
0410: 2c 20 49 4e 43 4c 55 44 49 4e 47 2c 20 42 55 54  , INCLUDING, BUT
0420: 20 4e 4f 54 20 4c 49 4d 49 54 45 44 20 54 4f 2c   NOT LIMITED TO,
0430: 20 54 48 45 20 49 4d 50 4c 49 45 44 20 57 41 52   THE IMPLIED WAR
0440: 52 41 4e 54 49 45 53 0a 23 20 20 4f 46 20 4d 45  RANTIES.#  OF ME
0450: 52 43 48 41 4e 54 41 42 49 4c 49 54 59 20 41 4e  RCHANTABILITY AN
0460: 44 20 46 49 54 4e 45 53 53 20 46 4f 52 20 41 20  D FITNESS FOR A 
0470: 50 41 52 54 49 43 55 4c 41 52 20 50 55 52 50 4f  PARTICULAR PURPO
0480: 53 45 20 41 52 45 20 44 49 53 43 4c 41 49 4d 45  SE ARE DISCLAIME
0490: 44 2e 20 20 49 4e 20 4e 4f 20 45 56 45 4e 54 0a  D.  IN NO EVENT.
04a0: 23 20 20 53 48 41 4c 4c 20 54 48 45 20 43 4f 50  #  SHALL THE COP
04b0: 59 52 49 47 48 54 20 4f 57 4e 45 52 20 4f 52 20  YRIGHT OWNER OR 
04c0: 43 4f 4e 54 52 49 42 55 54 4f 52 53 20 42 45 20  CONTRIBUTORS BE 
04d0: 4c 49 41 42 4c 45 20 46 4f 52 20 41 4e 59 20 44  LIABLE FOR ANY D
04e0: 49 52 45 43 54 2c 20 49 4e 44 49 52 45 43 54 2c  IRECT, INDIRECT,
04f0: 0a 23 20 20 49 4e 43 49 44 45 4e 54 41 4c 2c 20  .#  INCIDENTAL, 
0500: 53 50 45 43 49 41 4c 2c 20 45 58 45 4d 50 4c 41  SPECIAL, EXEMPLA
0510: 52 59 2c 20 4f 52 20 43 4f 4e 53 45 51 55 45 4e  RY, OR CONSEQUEN
0520: 54 49 41 4c 20 44 41 4d 41 47 45 53 20 28 49 4e  TIAL DAMAGES (IN
0530: 43 4c 55 44 49 4e 47 2c 20 42 55 54 20 4e 4f 54  CLUDING, BUT NOT
0540: 20 4c 49 4d 49 54 45 44 0a 23 20 20 54 4f 2c 20   LIMITED.#  TO, 
0550: 50 52 4f 43 55 52 45 4d 45 4e 54 20 4f 46 20 53  PROCUREMENT OF S
0560: 55 42 53 54 49 54 55 54 45 20 47 4f 4f 44 53 20  UBSTITUTE GOODS 
0570: 4f 52 20 53 45 52 56 49 43 45 53 3b 20 4c 4f 53  OR SERVICES; LOS
0580: 53 20 4f 46 20 55 53 45 2c 20 44 41 54 41 2c 20  S OF USE, DATA, 
0590: 4f 52 20 50 52 4f 46 49 54 53 3b 20 4f 52 0a 23  OR PROFITS; OR.#
05a0: 20 20 42 55 53 49 4e 45 53 53 20 49 4e 54 45 52    BUSINESS INTER
05b0: 52 55 50 54 49 4f 4e 29 20 48 4f 57 45 56 45 52  RUPTION) HOWEVER
05c0: 20 43 41 55 53 45 44 20 41 4e 44 20 4f 4e 20 41   CAUSED AND ON A
05d0: 4e 59 20 54 48 45 4f 52 59 20 4f 46 20 4c 49 41  NY THEORY OF LIA
05e0: 42 49 4c 49 54 59 2c 20 57 48 45 54 48 45 52 20  BILITY, WHETHER 
05f0: 49 4e 0a 23 20 20 43 4f 4e 54 52 41 43 54 2c 20  IN.#  CONTRACT, 
0600: 53 54 52 49 43 54 20 4c 49 41 42 49 4c 49 54 59  STRICT LIABILITY
0610: 2c 20 4f 52 20 54 4f 52 54 20 28 49 4e 43 4c 55  , OR TORT (INCLU
0620: 44 49 4e 47 20 4e 45 47 4c 49 47 45 4e 43 45 20  DING NEGLIGENCE 
0630: 4f 52 20 4f 54 48 45 52 57 49 53 45 29 20 41 52  OR OTHERWISE) AR
0640: 49 53 49 4e 47 20 49 4e 0a 23 20 20 41 4e 59 20  ISING IN.#  ANY 
0650: 57 41 59 20 4f 55 54 20 4f 46 20 54 48 45 20 55  WAY OUT OF THE U
0660: 53 45 20 4f 46 20 54 48 49 53 20 53 4f 46 54 57  SE OF THIS SOFTW
0670: 41 52 45 2c 20 45 56 45 4e 20 49 46 20 41 44 56  ARE, EVEN IF ADV
0680: 49 53 45 44 20 4f 46 20 54 48 45 20 50 4f 53 53  ISED OF THE POSS
0690: 49 42 49 4c 49 54 59 20 4f 46 0a 23 20 20 53 55  IBILITY OF.#  SU
06a0: 43 48 20 44 41 4d 41 47 45 2e 0a 23 0a 23 0a 23  CH DAMAGE..#.#.#
06b0: 20 47 72 61 70 68 20 69 73 20 61 20 70 75 72 65   Graph is a pure
06c0: 20 74 63 6c 20 6c 69 62 72 61 72 79 20 65 78 65   tcl library exe
06d0: 63 75 74 69 6e 67 20 42 4c 54 20 28 39 39 25 20  cuting BLT (99% 
06e0: 63 6f 6d 70 61 74 69 62 6c 65 29 20 63 6f 6d 6d  compatible) comm
06f0: 61 6e 64 73 20 66 6f 72 20 0a 23 20 6f 75 74 70  ands for .# outp
0700: 75 74 73 20 6f 74 68 65 72 20 74 68 61 6e 20 74  uts other than t
0710: 68 65 20 73 63 72 65 65 6e 2e 20 49 74 20 6e 65  he screen. It ne
0720: 65 64 73 20 61 20 64 72 69 76 65 72 20 74 6f 20  eds a driver to 
0730: 70 72 6f 64 75 63 65 20 66 6f 72 20 65 78 61 6d  produce for exam
0740: 70 6c 65 20 50 44 46 0a 23 20 6f 75 74 70 75 74  ple PDF.# output
0750: 2e 20 54 68 65 72 65 66 6f 72 65 20 79 6f 75 20  . Therefore you 
0760: 63 61 6e 20 75 73 65 20 74 68 65 20 70 61 63 6b  can use the pack
0770: 61 67 65 20 70 64 66 34 74 63 6c 3a 3a 67 72 61  age pdf4tcl::gra
0780: 70 68 2e 20 49 74 20 75 73 65 73 20 74 68 65 20  ph. It uses the 
0790: 70 64 66 34 74 63 6c 0a 23 20 6c 69 62 72 61 72  pdf4tcl.# librar
07a0: 79 20 74 6f 20 67 65 6e 65 72 61 74 65 20 74 68  y to generate th
07b0: 65 20 6f 75 74 70 75 74 2e 20 54 68 65 20 67 72  e output. The gr
07c0: 61 70 68 20 6c 69 62 72 61 72 79 20 69 74 73 65  aph library itse
07d0: 6c 66 20 6f 6e 6c 79 20 63 61 6c 6c 73 20 70 72  lf only calls pr
07e0: 6f 63 65 64 75 72 65 73 0a 23 20 6c 69 6b 65 20  ocedures.# like 
07f0: 22 4c 69 6e 65 22 2c 20 22 52 65 63 74 22 2c 20  "Line", "Rect", 
0800: 22 41 72 63 22 2c 20 22 54 65 78 74 22 20 61 6e  "Arc", "Text" an
0810: 64 20 22 50 69 63 74 22 2e 20 54 68 65 79 20 68  d "Pict". They h
0820: 61 76 65 20 74 6f 20 64 6f 20 74 68 65 20 72 65  ave to do the re
0830: 61 6c 20 64 72 61 77 69 6e 67 0a 23 20 6a 6f 62  al drawing.# job
0840: 2e 20 44 72 69 76 65 72 73 20 65 78 69 73 74 73  . Drivers exists
0850: 20 66 6f 72 20 67 65 6e 65 72 61 74 69 6e 67 20   for generating 
0860: 50 6f 73 74 53 63 72 69 70 74 2c 20 50 44 46 20  PostScript, PDF 
0870: 77 69 74 68 20 70 64 66 34 74 63 6c 20 61 6e 64  with pdf4tcl and
0880: 20 61 6c 73 6f 20 66 6f 72 0a 23 20 74 68 65 20   also for.# the 
0890: 44 65 62 65 6e 75 20 50 44 46 20 4c 69 62 72 61  Debenu PDF Libra
08a0: 72 79 20 28 63 6f 6d 6d 65 72 63 69 61 6c 29 2e  ry (commercial).
08b0: 0a 23 0a 23 20 46 6f 72 20 61 6e 20 65 78 61 6d  .#.# For an exam
08c0: 70 6c 65 20 6f 66 20 75 73 61 67 65 20 70 6c 65  ple of usage ple
08d0: 61 73 65 20 68 61 76 65 20 6c 6f 6f 6b 20 61 74  ase have look at
08e0: 20 70 61 63 6b 61 67 65 20 70 64 66 34 74 63 6c   package pdf4tcl
08f0: 3a 3a 67 72 61 70 68 2e 0a 23 0a 23 23 23 23 23  ::graph..#.#####
0900: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0910: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0920: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0930: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0940: 23 23 23 23 23 23 23 23 23 23 0a 0a 70 61 63 6b  ##########..pack
0950: 61 67 65 20 70 72 6f 76 69 64 65 20 67 72 61 70  age provide grap
0960: 68 20 31 2e 30 0a 0a 0a 6e 61 6d 65 73 70 61 63  h 1.0...namespac
0970: 65 20 65 76 61 6c 20 67 72 61 70 68 20 7b 0a 20  e eval graph {. 
0980: 20 76 61 72 69 61 62 6c 65 20 67 72 61 70 68 5f   variable graph_
0990: 69 64 78 20 2d 31 0a 20 20 76 61 72 69 61 62 6c  idx -1.  variabl
09a0: 65 20 6d 61 72 6b 65 72 5f 69 64 78 20 2d 31 0a  e marker_idx -1.
09b0: 20 20 76 61 72 69 61 62 6c 65 20 73 79 6d 62 6f    variable symbo
09c0: 6c 73 0a 20 20 76 61 72 69 61 62 6c 65 20 67 72  ls.  variable gr
09d0: 61 70 68 0a 20 20 76 61 72 69 61 62 6c 65 20 67  aph.  variable g
09e0: 72 61 70 68 5f 64 65 66 61 75 6c 74 73 0a 20 20  raph_defaults.  
09f0: 76 61 72 69 61 62 6c 65 20 65 6c 65 6d 65 6e 74  variable element
0a00: 5f 64 65 66 61 75 6c 74 73 0a 20 20 76 61 72 69  _defaults.  vari
0a10: 61 62 6c 65 20 61 78 69 73 5f 64 65 66 61 75 6c  able axis_defaul
0a20: 74 73 0a 20 20 76 61 72 69 61 62 6c 65 20 6c 65  ts.  variable le
0a30: 67 65 6e 64 5f 64 65 66 61 75 6c 74 73 0a 20 20  gend_defaults.  
0a40: 76 61 72 69 61 62 6c 65 20 6d 61 72 6b 65 72 5f  variable marker_
0a50: 64 65 66 61 75 6c 74 73 0a 20 20 76 61 72 69 61  defaults.  varia
0a60: 62 6c 65 20 67 72 69 64 5f 64 65 66 61 75 6c 74  ble grid_default
0a70: 73 0a 20 20 76 61 72 69 61 62 6c 65 20 6e 75 6d  s.  variable num
0a80: 5f 74 69 63 6b 73 20 38 0a 20 20 23 20 74 68 65  _ticks 8.  # the
0a90: 20 6f 75 74 70 75 74 20 69 6e 73 74 61 6e 63 65   output instance
0aa0: 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74   for the current
0ab0: 20 50 44 46 20 67 65 6e 65 72 61 74 69 6e 67 20   PDF generating 
0ac0: 65 6e 67 69 6e 65 3a 0a 20 20 76 61 72 69 61 62  engine:.  variab
0ad0: 6c 65 20 67 72 61 70 68 4f 75 74 49 6e 73 74 20  le graphOutInst 
0ae0: 7b 7d 0a 0a 20 20 61 72 72 61 79 20 73 65 74 20  {}..  array set 
0af0: 67 72 61 70 68 5f 64 65 66 61 75 6c 74 73 20 7b  graph_defaults {
0b00: 0a 20 20 20 20 62 61 63 6b 67 72 6f 75 6e 64 20  .    background 
0b10: 20 20 20 20 20 7b 32 33 39 20 32 33 39 20 32 33       {239 239 23
0b20: 39 7d 0a 20 20 20 20 62 6f 72 64 65 72 77 69 64  9}.    borderwid
0b30: 74 68 20 20 20 20 20 30 2e 32 0a 20 20 20 20 62  th     0.2.    b
0b40: 6f 74 74 6f 6d 6d 61 72 67 69 6e 20 20 20 20 30  ottommargin    0
0b50: 0a 20 20 20 20 66 6f 6e 74 20 20 20 20 20 20 20  .    font       
0b60: 20 20 20 20 20 7b 48 65 6c 76 65 74 69 63 61 20       {Helvetica 
0b70: 34 7d 0a 20 20 20 20 68 65 69 67 68 74 20 20 20  4}.    height   
0b80: 20 20 20 20 20 20 20 31 30 31 0a 20 20 20 20 6a         101.    j
0b90: 75 73 74 69 66 79 20 20 20 20 20 20 20 20 20 63  ustify         c
0ba0: 65 6e 74 65 72 0a 20 20 20 20 6c 65 66 74 6d 61  enter.    leftma
0bb0: 72 67 69 6e 20 20 20 20 20 20 30 0a 20 20 20 20  rgin      0.    
0bc0: 70 6c 6f 74 62 61 63 6b 67 72 6f 75 6e 64 20 20  plotbackground  
0bd0: 7b 32 35 35 20 32 35 35 20 32 35 35 7d 0a 20 20  {255 255 255}.  
0be0: 20 20 70 6c 6f 74 62 6f 72 64 65 72 77 69 64 74    plotborderwidt
0bf0: 68 20 30 2e 31 0a 20 20 20 20 70 6c 6f 74 70 61  h 0.1.    plotpa
0c00: 64 78 20 20 20 20 20 20 20 20 32 2e 30 0a 20 20  dx        2.0.  
0c10: 20 20 70 6c 6f 74 70 61 64 79 20 20 20 20 20 20    plotpady      
0c20: 20 20 32 2e 30 0a 20 20 20 20 70 6c 6f 74 72 65    2.0.    plotre
0c30: 6c 69 65 66 20 20 20 20 20 20 73 6f 6c 69 64 0a  lief      solid.
0c40: 20 20 20 20 72 65 6c 69 65 66 20 20 20 20 20 20      relief      
0c50: 20 20 20 20 73 6f 6c 69 64 0a 20 20 20 20 72 69      solid.    ri
0c60: 67 68 74 6d 61 72 67 69 6e 20 20 20 20 20 30 0a  ghtmargin     0.
0c70: 20 20 20 20 74 69 74 6c 65 20 20 20 20 20 20 20      title       
0c80: 20 20 20 20 22 22 0a 20 20 20 20 74 6f 70 6d 61      "".    topma
0c90: 72 67 69 6e 20 20 20 20 20 20 20 30 0a 20 20 20  rgin       0.   
0ca0: 20 77 69 64 74 68 20 20 20 20 20 20 20 20 20 20   width          
0cb0: 20 31 32 37 0a 20 20 20 20 5f 65 6c 65 6d 65 6e   127.    _elemen
0cc0: 74 73 20 20 20 20 20 20 20 7b 7d 0a 20 20 20 20  ts       {}.    
0cd0: 5f 61 78 69 73 65 73 20 20 20 20 20 20 20 20 20  _axises         
0ce0: 7b 7d 0a 20 20 20 20 5f 6d 61 72 6b 65 72 73 20  {}.    _markers 
0cf0: 20 20 20 20 20 20 20 7b 7d 0a 20 20 20 20 5f 6d         {}.    _m
0d00: 61 72 67 69 6e 20 20 20 20 20 20 20 20 20 30 2e  argin         0.
0d10: 37 0a 20 20 20 20 5f 78 61 78 69 73 20 20 20 20  7.    _xaxis    
0d20: 20 20 20 20 20 20 78 0a 20 20 20 20 5f 79 61 78        x.    _yax
0d30: 69 73 20 20 20 20 20 20 20 20 20 20 79 0a 20 20  is          y.  
0d40: 20 20 5f 78 32 61 78 69 73 20 20 20 20 20 20 20    _x2axis       
0d50: 20 20 78 32 0a 20 20 20 20 5f 79 32 61 78 69 73    x2.    _y2axis
0d60: 20 20 20 20 20 20 20 20 20 79 32 0a 20 20 20 20           y2.    
0d70: 5f 63 6c 69 70 72 65 63 74 20 20 20 20 20 20 20  _cliprect       
0d80: 7b 7d 0a 20 20 7d 0a 20 20 61 72 72 61 79 20 73  {}.  }.  array s
0d90: 65 74 20 65 6c 65 6d 65 6e 74 5f 64 65 66 61 75  et element_defau
0da0: 6c 74 73 20 7b 0a 20 20 20 20 63 6f 6c 6f 72 20  lts {.    color 
0db0: 20 20 20 20 20 20 20 20 20 20 7b 30 20 30 20 31            {0 0 1
0dc0: 32 38 7d 0a 20 20 20 20 62 61 72 63 6f 6d 6d 61  28}.    barcomma
0dd0: 6e 64 20 20 20 20 20 20 7b 7d 0a 20 20 20 20 62  nd      {}.    b
0de0: 61 72 77 69 64 74 68 20 20 20 20 20 20 20 20 30  arwidth        0
0df0: 2e 39 0a 20 20 20 20 62 6f 72 64 65 72 77 69 64  .9.    borderwid
0e00: 74 68 20 20 20 20 20 30 2e 35 0a 20 20 20 20 64  th     0.5.    d
0e10: 61 73 68 65 73 20 20 20 20 20 20 20 20 20 20 7b  ashes          {
0e20: 7d 0a 20 20 20 20 64 61 74 61 20 20 20 20 20 20  }.    data      
0e30: 20 20 20 20 20 20 7b 7d 0a 20 20 20 20 66 69 6c        {}.    fil
0e40: 6c 20 20 20 20 20 20 20 20 20 20 20 20 7b 30 20  l            {0 
0e50: 30 20 31 32 38 7d 0a 20 20 20 20 68 69 64 65 20  0 128}.    hide 
0e60: 20 20 20 20 20 20 20 20 20 20 20 6e 6f 0a 20 20             no.  
0e70: 20 20 6c 61 62 65 6c 20 20 20 20 20 20 20 20 20    label         
0e80: 20 20 7b 7d 0a 20 20 20 20 6c 69 6e 65 77 69 64    {}.    linewid
0e90: 74 68 20 20 20 20 20 20 20 30 2e 32 0a 20 20 20  th       0.2.   
0ea0: 20 6d 61 70 78 20 20 20 20 20 20 20 20 20 20 20   mapx           
0eb0: 20 78 0a 20 20 20 20 6d 61 70 79 20 20 20 20 20   x.    mapy     
0ec0: 20 20 20 20 20 20 20 79 0a 20 20 20 20 6f 75 74         y.    out
0ed0: 6c 69 6e 65 20 20 20 20 20 20 20 20 20 7b 30 20  line         {0 
0ee0: 30 20 30 7d 0a 20 20 20 20 6f 75 74 6c 69 6e 65  0 0}.    outline
0ef0: 77 69 64 74 68 20 20 20 20 30 2e 31 0a 20 20 20  width    0.1.   
0f00: 20 70 69 78 65 6c 73 20 20 20 20 20 20 20 20 20   pixels         
0f10: 20 32 2e 37 35 0a 20 20 20 20 72 65 6c 69 65 66   2.75.    relief
0f20: 20 20 20 20 20 20 20 20 20 20 72 61 69 73 65 64            raised
0f30: 0a 20 20 20 20 73 6d 6f 6f 74 68 20 20 20 20 20  .    smooth     
0f40: 20 20 20 20 20 6c 69 6e 65 61 72 0a 20 20 20 20       linear.    
0f50: 73 79 6d 62 6f 6c 20 20 20 20 20 20 20 20 20 20  symbol          
0f60: 63 69 72 63 6c 65 0a 20 20 20 20 73 79 6d 62 6f  circle.    symbo
0f70: 6c 63 6f 6d 6d 61 6e 64 20 20 20 7b 7d 0a 20 20  lcommand   {}.  
0f80: 20 20 74 79 70 65 20 20 20 20 20 20 20 20 20 20    type          
0f90: 20 20 6c 69 6e 65 0a 20 20 20 20 78 64 61 74 61    line.    xdata
0fa0: 20 20 20 20 20 20 20 20 20 20 20 7b 7d 0a 20 20             {}.  
0fb0: 20 20 79 64 61 74 61 20 20 20 20 20 20 20 20 20    ydata         
0fc0: 20 20 7b 7d 0a 20 20 20 20 5f 76 61 6c 69 64 20    {}.    _valid 
0fd0: 20 20 20 20 20 20 20 20 20 6e 6f 0a 20 20 20 20           no.    
0fe0: 5f 78 6d 69 6e 20 20 20 20 20 20 20 20 20 20 20  _xmin           
0ff0: 30 2e 30 0a 20 20 20 20 5f 78 6d 61 78 20 20 20  0.0.    _xmax   
1000: 20 20 20 20 20 20 20 20 31 2e 30 0a 20 20 20 20          1.0.    
1010: 5f 79 6d 69 6e 20 20 20 20 20 20 20 20 20 20 20  _ymin           
1020: 30 2e 30 0a 20 20 20 20 5f 79 6d 61 78 20 20 20  0.0.    _ymax   
1030: 20 20 20 20 20 20 20 20 31 2e 30 0a 20 20 7d 0a          1.0.  }.
1040: 20 20 61 72 72 61 79 20 73 65 74 20 61 78 69 73    array set axis
1050: 5f 64 65 66 61 75 6c 74 73 20 7b 0a 20 20 20 20  _defaults {.    
1060: 63 6f 6c 6f 72 20 20 20 20 20 20 20 20 20 20 20  color           
1070: 7b 30 20 30 20 30 7d 0a 20 20 20 20 63 6f 6d 6d  {0 0 0}.    comm
1080: 61 6e 64 20 20 20 20 20 20 20 20 20 7b 7d 0a 20  and         {}. 
1090: 20 20 20 64 65 73 63 65 6e 64 69 6e 67 20 20 20     descending   
10a0: 20 20 20 30 0a 20 20 20 20 68 69 64 65 20 20 20     0.    hide   
10b0: 20 20 20 20 20 20 20 20 20 6e 6f 0a 20 20 20 20           no.    
10c0: 6a 75 73 74 69 66 79 20 20 20 20 20 20 20 20 20  justify         
10d0: 63 65 6e 74 65 72 0a 20 20 20 20 6c 69 6e 65 77  center.    linew
10e0: 69 64 74 68 20 20 20 20 20 20 20 30 2e 31 0a 20  idth       0.1. 
10f0: 20 20 20 6c 6f 67 73 63 61 6c 65 20 20 20 20 20     logscale     
1100: 20 20 20 6e 6f 0a 20 20 20 20 6c 6f 6f 73 65 20     no.    loose 
1110: 20 20 20 20 20 20 20 20 20 20 79 65 73 0a 20 20            yes.  
1120: 20 20 6d 61 6a 6f 72 74 69 63 6b 73 20 20 20 20    majorticks    
1130: 20 20 7b 7d 0a 20 20 20 20 6d 61 78 20 20 20 20    {}.    max    
1140: 20 20 20 20 20 20 20 20 20 7b 7d 0a 20 20 20 20           {}.    
1150: 6d 69 6e 20 20 20 20 20 20 20 20 20 20 20 20 20  min             
1160: 7b 7d 0a 20 20 20 20 6d 69 6e 6f 72 74 69 63 6b  {}.    minortick
1170: 73 20 20 20 20 20 20 7b 7d 0a 20 20 20 20 72 6f  s      {}.    ro
1180: 74 61 74 65 20 20 20 20 20 20 20 20 20 20 30 0a  tate          0.
1190: 20 20 20 20 73 74 65 70 73 69 7a 65 20 20 20 20      stepsize    
11a0: 20 20 20 20 30 2e 30 0a 20 20 20 20 73 75 62 64      0.0.    subd
11b0: 69 76 69 73 69 6f 6e 73 20 20 20 20 7b 7d 0a 20  ivisions    {}. 
11c0: 20 20 20 74 69 63 6b 66 6f 6e 74 20 20 20 20 20     tickfont     
11d0: 20 20 20 7b 48 65 6c 76 65 74 69 63 61 20 32 2e     {Helvetica 2.
11e0: 36 7d 0a 20 20 20 20 74 69 63 6b 6c 65 6e 67 74  6}.    ticklengt
11f0: 68 20 20 20 20 20 20 32 2e 35 0a 20 20 20 20 74  h      2.5.    t
1200: 69 74 6c 65 20 20 20 20 20 20 20 20 20 20 20 22  itle           "
1210: 22 0a 20 20 20 20 74 69 74 6c 65 63 6f 6c 6f 72  ".    titlecolor
1220: 20 20 20 20 20 20 7b 30 20 30 20 30 7d 0a 20 20        {0 0 0}.  
1230: 20 20 74 69 74 6c 65 66 6f 6e 74 20 20 20 20 20    titlefont     
1240: 20 20 7b 48 65 6c 76 65 74 69 63 61 20 34 7d 0a    {Helvetica 4}.
1250: 20 20 20 20 5f 76 61 6c 69 64 20 20 20 20 20 20      _valid      
1260: 20 20 20 20 6e 6f 0a 20 20 20 20 5f 77 69 64 74      no.    _widt
1270: 68 20 20 20 20 20 20 20 20 20 20 7b 7d 0a 20 20  h          {}.  
1280: 20 20 5f 68 65 69 67 68 74 20 20 20 20 20 20 20    _height       
1290: 20 20 7b 7d 0a 20 20 20 20 5f 66 6f 72 6d 61 74    {}.    _format
12a0: 20 20 20 20 20 20 20 20 20 25 2e 31 35 67 0a 20           %.15g. 
12b0: 20 20 20 5f 6d 69 6e 20 20 20 20 20 20 20 20 20     _min         
12c0: 20 20 20 30 2e 30 0a 20 20 20 20 5f 6d 61 78 20     0.0.    _max 
12d0: 20 20 20 20 20 20 20 20 20 20 20 31 2e 30 0a 20             1.0. 
12e0: 20 7d 0a 20 20 61 72 72 61 79 20 73 65 74 20 6c   }.  array set l
12f0: 65 67 65 6e 64 5f 64 65 66 61 75 6c 74 73 20 7b  egend_defaults {
1300: 0a 20 20 20 20 61 6e 63 68 6f 72 20 20 20 20 20  .    anchor     
1310: 20 20 20 20 20 6e 0a 20 20 20 20 62 61 63 6b 67       n.    backg
1320: 72 6f 75 6e 64 20 20 20 20 20 20 7b 32 33 39 20  round      {239 
1330: 32 33 39 20 32 33 39 7d 0a 20 20 20 20 62 6f 72  239 239}.    bor
1340: 64 65 72 77 69 64 74 68 20 20 20 20 20 30 2e 32  derwidth     0.2
1350: 0a 20 20 20 20 66 6f 6e 74 20 20 20 20 20 20 20  .    font       
1360: 20 20 20 20 20 7b 48 65 6c 76 65 74 69 63 61 20       {Helvetica 
1370: 32 2e 36 7d 0a 20 20 20 20 66 6f 72 65 67 72 6f  2.6}.    foregro
1380: 75 6e 64 20 20 20 20 20 20 7b 30 20 30 20 30 7d  und      {0 0 0}
1390: 0a 20 20 20 20 68 69 64 65 20 20 20 20 20 20 20  .    hide       
13a0: 20 20 20 20 20 6e 6f 0a 20 20 20 20 69 70 61 64       no.    ipad
13b0: 78 20 20 20 20 20 20 20 20 20 20 20 30 2e 35 0a  x           0.5.
13c0: 20 20 20 20 69 70 61 64 79 20 20 20 20 20 20 20      ipady       
13d0: 20 20 20 20 30 2e 35 0a 20 20 20 20 70 61 64 78      0.5.    padx
13e0: 20 20 20 20 20 20 20 20 20 20 20 20 30 2e 33 35              0.35
13f0: 0a 20 20 20 20 70 61 64 79 20 20 20 20 20 20 20  .    pady       
1400: 20 20 20 20 20 30 2e 33 35 0a 20 20 20 20 70 6f       0.35.    po
1410: 73 69 74 69 6f 6e 20 20 20 20 20 20 20 20 72 69  sition        ri
1420: 67 68 74 0a 20 20 20 20 72 61 69 73 65 64 20 20  ght.    raised  
1430: 20 20 20 20 20 20 20 20 6e 6f 0a 20 20 20 20 72          no.    r
1440: 65 6c 69 65 66 20 20 20 20 20 20 20 20 20 20 73  elief          s
1450: 75 6e 6b 65 6e 0a 20 20 7d 0a 20 20 61 72 72 61  unken.  }.  arra
1460: 79 20 73 65 74 20 6d 61 72 6b 65 72 5f 64 65 66  y set marker_def
1470: 61 75 6c 74 73 20 7b 0a 20 20 20 20 61 6e 63 68  aults {.    anch
1480: 6f 72 20 20 20 20 20 20 20 20 20 20 63 65 6e 74  or          cent
1490: 65 72 0a 20 20 20 20 63 6f 6f 72 64 73 20 20 20  er.    coords   
14a0: 20 20 20 20 20 20 20 7b 7d 0a 20 20 20 20 64 61         {}.    da
14b0: 73 68 65 73 20 20 20 20 20 20 20 20 20 20 7b 7d  shes          {}
14c0: 0a 20 20 20 20 65 6c 65 6d 65 6e 74 20 20 20 20  .    element    
14d0: 20 20 20 20 20 7b 7d 0a 20 20 20 20 66 69 6c 6c       {}.    fill
14e0: 20 20 20 20 20 20 20 20 20 20 20 20 7b 32 33 39              {239
14f0: 20 32 33 39 20 32 33 39 7d 0a 20 20 20 20 66 6f   239 239}.    fo
1500: 6e 74 20 20 20 20 20 20 20 20 20 20 20 20 7b 48  nt            {H
1510: 65 6c 76 65 74 69 63 61 20 32 2e 36 7d 0a 20 20  elvetica 2.6}.  
1520: 20 20 68 69 64 65 20 20 20 20 20 20 20 20 20 20    hide          
1530: 20 20 6e 6f 0a 20 20 20 20 69 6d 61 67 65 20 20    no.    image  
1540: 20 20 20 20 20 20 20 20 20 7b 7d 0a 20 20 20 20           {}.    
1550: 6a 75 73 74 69 66 79 20 20 20 20 20 20 20 20 20  justify         
1560: 63 65 6e 74 65 72 0a 20 20 20 20 6c 69 6e 65 77  center.    linew
1570: 69 64 74 68 20 20 20 20 20 20 20 30 2e 32 0a 20  idth       0.2. 
1580: 20 20 20 6d 61 70 78 20 20 20 20 20 20 20 20 20     mapx         
1590: 20 20 20 78 0a 20 20 20 20 6d 61 70 79 20 20 20     x.    mapy   
15a0: 20 20 20 20 20 20 20 20 20 79 0a 20 20 20 20 6e           y.    n
15b0: 61 6d 65 20 20 20 20 20 20 20 20 20 20 20 20 7b  ame            {
15c0: 7d 0a 20 20 20 20 6f 75 74 6c 69 6e 65 20 20 20  }.    outline   
15d0: 20 20 20 20 20 20 7b 30 20 30 20 30 7d 0a 20 20        {0 0 0}.  
15e0: 20 20 70 61 64 78 20 20 20 20 20 20 20 20 20 20    padx          
15f0: 20 20 30 2e 35 0a 20 20 20 20 70 61 64 79 20 20    0.5.    pady  
1600: 20 20 20 20 20 20 20 20 20 20 30 2e 35 0a 20 20            0.5.  
1610: 20 20 72 6f 74 61 74 65 20 20 20 20 20 20 20 20    rotate        
1620: 20 20 30 0a 20 20 20 20 74 65 78 74 20 20 20 20    0.    text    
1630: 20 20 20 20 20 20 20 20 22 22 0a 20 20 20 20 75          "".    u
1640: 6e 64 65 72 20 20 20 20 20 20 20 20 20 20 20 66  nder           f
1650: 61 6c 73 65 0a 20 20 20 20 78 6f 66 66 73 65 74  alse.    xoffset
1660: 20 20 20 20 20 20 20 20 20 30 0a 20 20 20 20 79           0.    y
1670: 6f 66 66 73 65 74 20 20 20 20 20 20 20 20 20 30  offset         0
1680: 0a 20 20 7d 0a 20 20 61 72 72 61 79 20 73 65 74  .  }.  array set
1690: 20 67 72 69 64 5f 64 65 66 61 75 6c 74 73 20 7b   grid_defaults {
16a0: 0a 20 20 20 20 63 6f 6c 6f 72 20 20 20 20 20 20  .    color      
16b0: 20 20 20 20 20 7b 32 30 30 20 32 30 30 20 32 30       {200 200 20
16c0: 30 7d 0a 20 20 20 20 64 61 73 68 65 73 20 20 20  0}.    dashes   
16d0: 20 20 20 20 20 20 20 7b 7d 0a 20 20 20 20 68 69         {}.    hi
16e0: 64 65 20 20 20 20 20 20 20 20 20 20 20 20 79 65  de            ye
16f0: 73 0a 20 20 20 20 6c 69 6e 65 77 69 64 74 68 20  s.    linewidth 
1700: 20 20 20 20 20 20 30 2e 31 0a 20 20 20 20 6d 61        0.1.    ma
1710: 70 78 20 20 20 20 20 20 20 20 20 20 20 20 78 0a  px            x.
1720: 20 20 20 20 6d 61 70 79 20 20 20 20 20 20 20 20      mapy        
1730: 20 20 20 20 79 0a 20 20 20 20 6d 69 6e 6f 72 20      y.    minor 
1740: 20 20 20 20 20 20 20 20 20 20 79 65 73 0a 20 20            yes.  
1750: 7d 0a 20 20 61 72 72 61 79 20 73 65 74 20 73 79  }.  array set sy
1760: 6d 62 6f 6c 73 20 7b 7d 0a 20 20 0a 20 20 61 72  mbols {}.  .  ar
1770: 72 61 79 20 73 65 74 20 6f 70 74 5f 64 65 66 61  ray set opt_defa
1780: 75 6c 74 73 20 7b 0a 20 20 20 20 6c 69 6e 65 77  ults {.    linew
1790: 69 64 74 68 20 20 20 30 2e 31 0a 20 20 20 20 72  idth   0.1.    r
17a0: 67 62 63 6f 6c 6f 72 20 20 20 20 7b 32 35 35 20  gbcolor    {255 
17b0: 32 35 35 20 32 35 35 7d 0a 20 20 20 20 64 61 73  255 255}.    das
17c0: 68 70 61 74 74 65 72 6e 20 7b 7d 0a 20 20 20 20  hpattern {}.    
17d0: 70 69 63 74 73 20 20 20 20 20 20 20 7b 7d 0a 20  picts       {}. 
17e0: 20 20 20 72 6f 74 61 74 69 6f 6e 20 20 20 20 30     rotation    0
17f0: 0a 20 20 20 20 78 70 6f 73 20 20 20 20 20 20 20  .    xpos       
1800: 20 30 0a 20 20 20 20 79 70 6f 73 20 20 20 20 20   0.    ypos     
1810: 20 20 20 30 0a 20 20 20 20 66 6f 6e 74 20 20 20     0.    font   
1820: 20 20 20 20 20 7b 48 65 6c 76 65 74 69 63 61 20       {Helvetica 
1830: 34 20 7b 7d 7d 0a 20 20 7d 0a 7d 0a 0a 23 23 23  4 {}}.  }.}..###
1840: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1850: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1860: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1870: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1880: 23 23 23 23 23 23 23 23 23 23 23 23 0a 23 0a 23  ############.#.#
1890: 20 62 61 73 69 63 20 67 6c 75 65 20 72 6f 75 74   basic glue rout
18a0: 69 6e 65 73 20 74 6f 20 63 6f 6d 62 69 6e 65 20  ines to combine 
18b0: 64 72 61 77 69 6e 67 20 65 6e 67 69 6e 65 20 77  drawing engine w
18c0: 69 74 68 20 67 72 61 70 68 20 63 61 6c 6c 73 0a  ith graph calls.
18d0: 23 0a 0a 70 72 6f 63 20 67 72 61 70 68 3a 3a 67  #..proc graph::g
18e0: 72 61 70 68 20 7b 20 61 72 67 73 20 7d 20 7b 0a  raph { args } {.
18f0: 20 20 72 65 74 75 72 6e 20 5b 67 72 61 70 68 5f    return [graph_
1900: 70 72 6f 63 20 24 61 72 67 73 5d 0a 7d 0a 0a 0a  proc $args].}...
1910: 70 72 6f 63 20 67 72 61 70 68 3a 3a 67 65 74 5f  proc graph::get_
1920: 6f 70 74 20 7b 20 67 20 6f 70 74 4e 61 6d 65 20  opt { g optName 
1930: 7d 20 7b 0a 20 20 76 61 72 69 61 62 6c 65 20 67  } {.  variable g
1940: 72 61 70 68 0a 20 20 0a 20 20 72 65 74 75 72 6e  raph.  .  return
1950: 20 24 67 72 61 70 68 28 24 67 2c 6f 70 74 73 2c   $graph($g,opts,
1960: 24 6f 70 74 4e 61 6d 65 29 0a 7d 0a 0a 0a 70 72  $optName).}...pr
1970: 6f 63 20 67 72 61 70 68 3a 3a 73 65 74 5f 6f 70  oc graph::set_op
1980: 74 20 7b 20 67 20 6f 70 74 4e 61 6d 65 20 76 61  t { g optName va
1990: 6c 75 65 20 7d 20 7b 0a 20 20 76 61 72 69 61 62  lue } {.  variab
19a0: 6c 65 20 67 72 61 70 68 0a 20 20 0a 20 20 73 65  le graph.  .  se
19b0: 74 20 67 72 61 70 68 28 24 67 2c 6f 70 74 73 2c  t graph($g,opts,
19c0: 24 6f 70 74 4e 61 6d 65 29 20 24 76 61 6c 75 65  $optName) $value
19d0: 0a 7d 0a 0a 0a 70 72 6f 63 20 67 72 61 70 68 3a  .}...proc graph:
19e0: 3a 61 70 70 65 6e 64 5f 6f 70 74 20 7b 20 67 20  :append_opt { g 
19f0: 6f 70 74 4e 61 6d 65 20 76 61 6c 75 65 20 7d 20  optName value } 
1a00: 7b 0a 20 20 76 61 72 69 61 62 6c 65 20 67 72 61  {.  variable gra
1a10: 70 68 0a 20 20 0a 20 20 6c 61 70 70 65 6e 64 20  ph.  .  lappend 
1a20: 67 72 61 70 68 28 24 67 2c 6f 70 74 73 2c 24 6f  graph($g,opts,$o
1a30: 70 74 4e 61 6d 65 29 20 24 76 61 6c 75 65 0a 7d  ptName) $value.}
1a40: 0a 0a 0a 70 72 6f 63 20 67 72 61 70 68 3a 3a 73  ...proc graph::s
1a50: 65 74 75 70 20 7b 20 65 6e 67 69 6e 65 20 69 6e  etup { engine in
1a60: 73 74 61 6e 63 65 20 7d 20 7b 0a 20 20 76 61 72  stance } {.  var
1a70: 69 61 62 6c 65 20 67 72 61 70 68 4f 75 74 49 6e  iable graphOutIn
1a80: 73 74 0a 20 20 0a 20 20 73 65 74 20 67 72 61 70  st.  .  set grap
1a90: 68 4f 75 74 49 6e 73 74 20 24 69 6e 73 74 61 6e  hOutInst $instan
1aa0: 63 65 0a 20 20 0a 20 20 6e 61 6d 65 73 70 61 63  ce.  .  namespac
1ab0: 65 20 69 6d 70 6f 72 74 20 3a 3a 24 7b 65 6e 67  e import ::${eng
1ac0: 69 6e 65 7d 3a 3a 67 72 61 70 68 3a 3a 2a 0a 7d  ine}::graph::*.}
1ad0: 0a 0a 0a 70 72 6f 63 20 67 72 61 70 68 3a 3a 65  ...proc graph::e
1ae0: 78 65 63 75 74 65 20 7b 61 72 67 73 7d 20 7b 0a  xecute {args} {.
1af0: 20 20 76 61 72 69 61 62 6c 65 20 67 72 61 70 68    variable graph
1b00: 4f 75 74 49 6e 73 74 0a 0a 20 20 72 65 74 75 72  OutInst..  retur
1b10: 6e 20 5b 24 67 72 61 70 68 4f 75 74 49 6e 73 74  n [$graphOutInst
1b20: 20 7b 2a 7d 24 61 72 67 73 5d 0a 7d 0a 0a 0a 23   {*}$args].}...#
1b30: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1b40: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1b50: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1b60: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1b70: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0a 23  ##############.#
1b80: 0a 23 20 67 72 61 70 68 20 70 72 6f 63 20 63 61  .# graph proc ca
1b90: 6c 6c 65 64 20 62 79 20 67 72 61 70 68 0a 23 0a  lled by graph.#.
1ba0: 0a 70 72 6f 63 20 67 72 61 70 68 3a 3a 67 72 61  .proc graph::gra
1bb0: 70 68 5f 70 72 6f 63 20 7b 20 70 61 72 61 6d 73  ph_proc { params
1bc0: 20 7d 20 7b 0a 20 20 76 61 72 69 61 62 6c 65 20   } {.  variable 
1bd0: 67 72 61 70 68 5f 69 64 78 0a 20 20 76 61 72 69  graph_idx.  vari
1be0: 61 62 6c 65 20 67 72 61 70 68 0a 20 20 76 61 72  able graph.  var
1bf0: 69 61 62 6c 65 20 6f 70 74 5f 64 65 66 61 75 6c  iable opt_defaul
1c00: 74 73 0a 0a 20 20 69 6e 69 74 5f 73 79 6d 62 6f  ts..  init_symbo
1c10: 6c 73 0a 0a 20 20 73 65 74 20 67 20 67 5b 69 6e  ls..  set g g[in
1c20: 63 72 20 67 72 61 70 68 5f 69 64 78 5d 0a 0a 20  cr graph_idx].. 
1c30: 20 6f 62 6a 5f 64 65 66 61 75 6c 74 73 20 20 24   obj_defaults  $
1c40: 67 20 67 72 61 70 68 5f 64 65 66 61 75 6c 74 73  g graph_defaults
1c50: 0a 20 20 6f 62 6a 5f 63 6f 6e 66 69 67 75 72 65  .  obj_configure
1c60: 20 24 67 20 24 70 61 72 61 6d 73 0a 0a 20 20 61   $g $params..  a
1c70: 78 69 73 20 24 67 20 63 72 65 61 74 65 20 78 0a  xis $g create x.
1c80: 20 20 61 78 69 73 20 24 67 20 63 72 65 61 74 65    axis $g create
1c90: 20 7b 78 32 20 2d 68 69 64 65 20 31 7d 0a 20 20   {x2 -hide 1}.  
1ca0: 61 78 69 73 20 24 67 20 63 72 65 61 74 65 20 79  axis $g create y
1cb0: 0a 20 20 61 78 69 73 20 24 67 20 63 72 65 61 74  .  axis $g creat
1cc0: 65 20 7b 79 32 20 2d 68 69 64 65 20 31 7d 0a 0a  e {y2 -hide 1}..
1cd0: 20 20 6f 62 6a 5f 64 65 66 61 75 6c 74 73 20 24    obj_defaults $
1ce0: 67 2c 6c 65 67 65 6e 64 20 6c 65 67 65 6e 64 5f  g,legend legend_
1cf0: 64 65 66 61 75 6c 74 73 0a 20 20 6f 62 6a 5f 64  defaults.  obj_d
1d00: 65 66 61 75 6c 74 73 20 24 67 2c 67 72 69 64 20  efaults $g,grid 
1d10: 20 20 67 72 69 64 5f 64 65 66 61 75 6c 74 73 20    grid_defaults 
1d20: 20 0a 20 20 6f 62 6a 5f 64 65 66 61 75 6c 74 73   .  obj_defaults
1d30: 20 24 67 2c 6f 70 74 73 20 20 20 6f 70 74 5f 64   $g,opts   opt_d
1d40: 65 66 61 75 6c 74 73 0a 0a 20 20 70 72 6f 63 20  efaults..  proc 
1d50: 3a 3a 67 72 61 70 68 3a 3a 24 67 20 7b 63 6f 6d  ::graph::$g {com
1d60: 6d 61 6e 64 20 61 72 67 73 7d 20 22 63 6f 6d 6d  mand args} "comm
1d70: 61 6e 64 20 24 67 20 5c 24 63 6f 6d 6d 61 6e 64  and $g \$command
1d80: 20 5c 24 61 72 67 73 22 0a 0a 20 20 72 65 74 75   \$args"..  retu
1d90: 72 6e 20 3a 3a 67 72 61 70 68 3a 3a 24 67 0a 7d  rn ::graph::$g.}
1da0: 0a 0a 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ..##############
1db0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1dc0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1dd0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1de0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1df0: 23 0a 23 0a 23 20 67 72 61 70 68 20 63 6f 6d 6d  #.#.# graph comm
1e00: 61 6e 64 20 70 72 6f 63 20 28 63 6f 6e 66 69 67  and proc (config
1e10: 75 72 65 2c 20 63 67 65 74 2c 20 65 6c 65 6d 65  ure, cget, eleme
1e20: 6e 74 2c 20 61 78 69 73 2c 20 65 74 63 2e 29 0a  nt, axis, etc.).
1e30: 23 0a 0a 70 72 6f 63 20 67 72 61 70 68 3a 3a 63  #..proc graph::c
1e40: 6f 6d 6d 61 6e 64 20 7b 20 67 20 63 6f 6d 6d 61  ommand { g comma
1e50: 6e 64 20 70 61 72 61 6d 73 20 7d 20 7b 0a 20 20  nd params } {.  
1e60: 76 61 72 69 61 62 6c 65 20 67 72 61 70 68 0a 0a  variable graph..
1e70: 20 20 73 77 69 74 63 68 20 2d 2d 20 24 63 6f 6d    switch -- $com
1e80: 6d 61 6e 64 20 7b 0a 20 20 20 20 63 6f 6e 66 69  mand {.    confi
1e90: 67 75 72 65 20 7b 0a 20 20 20 20 20 20 6f 62 6a  gure {.      obj
1ea0: 5f 63 6f 6e 66 69 67 75 72 65 20 24 67 20 24 70  _configure $g $p
1eb0: 61 72 61 6d 73 0a 20 20 20 20 7d 0a 20 20 20 20  arams.    }.    
1ec0: 63 67 65 74 20 7b 0a 20 20 20 20 20 20 72 65 74  cget {.      ret
1ed0: 75 72 6e 20 5b 6f 62 6a 5f 63 67 65 74 20 24 67  urn [obj_cget $g
1ee0: 20 5b 6c 69 6e 64 65 78 20 24 70 61 72 61 6d 73   [lindex $params
1ef0: 20 30 5d 5d 0a 20 20 20 20 7d 0a 20 20 20 20 64   0]].    }.    d
1f00: 72 61 77 20 7b 0a 20 20 20 20 20 20 64 72 61 77  raw {.      draw
1f10: 20 24 67 20 5b 6c 69 6e 64 65 78 20 24 70 61 72   $g [lindex $par
1f20: 61 6d 73 20 30 5d 20 5b 6c 72 61 6e 67 65 20 24  ams 0] [lrange $
1f30: 70 61 72 61 6d 73 20 31 20 65 6e 64 5d 0a 20 20  params 1 end].  
1f40: 20 20 7d 0a 20 20 20 20 65 6c 65 6d 65 6e 74 20    }.    element 
1f50: 7b 0a 20 20 20 20 20 20 65 6c 65 6d 65 6e 74 20  {.      element 
1f60: 24 67 20 5b 6c 69 6e 64 65 78 20 24 70 61 72 61  $g [lindex $para
1f70: 6d 73 20 30 5d 20 5b 6c 72 61 6e 67 65 20 24 70  ms 0] [lrange $p
1f80: 61 72 61 6d 73 20 31 20 65 6e 64 5d 0a 20 20 20  arams 1 end].   
1f90: 20 7d 0a 20 20 20 20 61 78 69 73 20 7b 0a 20 20   }.    axis {.  
1fa0: 20 20 20 20 61 78 69 73 20 24 67 20 5b 6c 69 6e      axis $g [lin
1fb0: 64 65 78 20 24 70 61 72 61 6d 73 20 30 5d 20 5b  dex $params 0] [
1fc0: 6c 72 61 6e 67 65 20 24 70 61 72 61 6d 73 20 31  lrange $params 1
1fd0: 20 65 6e 64 5d 0a 20 20 20 20 7d 0a 20 20 20 20   end].    }.    
1fe0: 78 61 78 69 73 20 2d 20 79 61 78 69 73 20 2d 20  xaxis - yaxis - 
1ff0: 78 32 61 78 69 73 20 2d 20 79 32 61 78 69 73 20  x2axis - y2axis 
2000: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b  {.      return [
2010: 61 78 69 73 75 73 61 67 65 20 24 67 20 24 63 6f  axisusage $g $co
2020: 6d 6d 61 6e 64 20 24 70 61 72 61 6d 73 5d 0a 20  mmand $params]. 
2030: 20 20 20 7d 0a 20 20 20 20 6c 65 67 65 6e 64 20     }.    legend 
2040: 7b 0a 20 20 20 20 20 20 6c 65 67 65 6e 64 20 24  {.      legend $
2050: 67 20 5b 6c 69 6e 64 65 78 20 24 70 61 72 61 6d  g [lindex $param
2060: 73 20 30 5d 20 5b 6c 72 61 6e 67 65 20 24 70 61  s 0] [lrange $pa
2070: 72 61 6d 73 20 31 20 65 6e 64 5d 0a 20 20 20 20  rams 1 end].    
2080: 7d 0a 20 20 20 20 6d 61 72 6b 65 72 20 7b 0a 20  }.    marker {. 
2090: 20 20 20 20 20 6d 61 72 6b 65 72 20 24 67 20 5b       marker $g [
20a0: 6c 69 6e 64 65 78 20 24 70 61 72 61 6d 73 20 30  lindex $params 0
20b0: 5d 20 5b 6c 72 61 6e 67 65 20 24 70 61 72 61 6d  ] [lrange $param
20c0: 73 20 31 20 65 6e 64 5d 0a 20 20 20 20 7d 0a 20  s 1 end].    }. 
20d0: 20 20 20 67 72 69 64 20 7b 0a 20 20 20 20 20 20     grid {.      
20e0: 67 72 69 64 20 24 67 20 5b 6c 69 6e 64 65 78 20  grid $g [lindex 
20f0: 24 70 61 72 61 6d 73 20 30 5d 20 5b 6c 72 61 6e  $params 0] [lran
2100: 67 65 20 24 70 61 72 61 6d 73 20 31 20 65 6e 64  ge $params 1 end
2110: 5d 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 73 74  ].    }.    dest
2120: 72 6f 79 20 7b 0a 20 20 20 20 20 20 72 65 6e 61  roy {.      rena
2130: 6d 65 20 3a 3a 67 72 61 70 68 3a 3a 24 67 20 7b  me ::graph::$g {
2140: 7d 0a 20 20 20 20 20 20 61 72 72 61 79 20 75 6e  }.      array un
2150: 73 65 74 20 67 72 61 70 68 20 24 67 2c 2a 0a 20  set graph $g,*. 
2160: 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74     }.    default
2170: 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   {.      return 
2180: 2d 63 6f 64 65 20 65 72 72 6f 72 20 22 75 6e 6b  -code error "unk
2190: 6e 6f 77 6e 20 63 6f 6d 6d 61 6e 64 20 5c 22 24  nown command \"$
21a0: 63 6f 6d 6d 61 6e 64 5c 22 22 0a 20 20 20 20 7d  command\"".    }
21b0: 0a 20 20 7d 0a 7d 0a 0a 23 23 23 23 23 23 23 23  .  }.}..########
21c0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
21d0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
21e0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
21f0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2200: 23 23 23 23 23 23 23 0a 23 0a 23 20 73 6f 6d 65  #######.#.# some
2210: 20 75 74 69 6c 69 74 69 65 73 20 66 6f 72 20 69   utilities for i
2220: 6e 74 65 72 6e 61 6c 20 75 73 65 20 6f 6e 6c 79  nternal use only
2230: 0a 23 0a 0a 70 72 6f 63 20 67 72 61 70 68 3a 3a  .#..proc graph::
2240: 69 6e 69 74 5f 73 79 6d 62 6f 6c 73 20 7b 7d 20  init_symbols {} 
2250: 7b 0a 20 20 76 61 72 69 61 62 6c 65 20 73 79 6d  {.  variable sym
2260: 62 6f 6c 73 0a 0a 20 20 69 66 20 7b 5b 61 72 72  bols..  if {[arr
2270: 61 79 20 73 69 7a 65 20 73 79 6d 62 6f 6c 73 5d  ay size symbols]
2280: 20 3e 20 30 7d 20 72 65 74 75 72 6e 0a 0a 20 20   > 0} return..  
2290: 61 72 72 61 79 20 73 65 74 20 73 79 6d 62 6f 6c  array set symbol
22a0: 73 20 7b 0a 20 20 20 20 73 71 75 61 72 65 20 20  s {.    square  
22b0: 20 7b 20 7b 2d 31 2e 30 20 20 31 2e 30 20 20 31   { {-1.0  1.0  1
22c0: 2e 30 20 2d 31 2e 30 20 2d 31 2e 30 7d 0a 20 20  .0 -1.0 -1.0}.  
22d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 2d 31               {-1
22e0: 2e 30 20 2d 31 2e 30 20 20 31 2e 30 20 20 31 2e  .0 -1.0  1.0  1.
22f0: 30 20 2d 31 2e 30 7d 20 7d 0a 20 20 20 20 70 6c  0 -1.0} }.    pl
2300: 75 73 20 20 20 20 20 7b 20 7b 2d 31 2e 30 20 2d  us     { {-1.0 -
2310: 30 2e 33 20 2d 30 2e 33 20 20 30 2e 33 20 20 30  0.3 -0.3  0.3  0
2320: 2e 33 20 20 31 2e 30 20 20 31 2e 30 20 20 30 2e  .3  1.0  1.0  0.
2330: 33 20 20 30 2e 33 20 2d 30 2e 33 20 2d 30 2e 33  3  0.3 -0.3 -0.3
2340: 20 2d 31 2e 30 20 2d 31 2e 30 7d 0a 20 20 20 20   -1.0 -1.0}.    
2350: 20 20 20 20 20 20 20 20 20 20 20 7b 2d 30 2e 33             {-0.3
2360: 20 2d 30 2e 33 20 2d 31 2e 30 20 2d 31 2e 30 20   -0.3 -1.0 -1.0 
2370: 2d 30 2e 33 20 2d 30 2e 33 20 20 30 2e 33 20 20  -0.3 -0.3  0.3  
2380: 30 2e 33 20 20 31 2e 30 20 20 31 2e 30 20 20 30  0.3  1.0  1.0  0
2390: 2e 33 20 20 30 2e 33 20 2d 30 2e 33 7d 20 7d 0a  .3  0.3 -0.3} }.
23a0: 20 20 20 20 73 70 6c 75 73 20 20 20 20 7b 20 7b      splus    { {
23b0: 2d 31 2e 30 20 2d 30 2e 31 20 2d 30 2e 31 20 20  -1.0 -0.1 -0.1  
23c0: 30 2e 31 20 20 30 2e 31 20 20 31 2e 30 20 20 31  0.1  0.1  1.0  1
23d0: 2e 30 20 20 30 2e 31 20 20 30 2e 31 20 2d 30 2e  .0  0.1  0.1 -0.
23e0: 31 20 2d 30 2e 31 20 2d 31 2e 30 20 2d 31 2e 30  1 -0.1 -1.0 -1.0
23f0: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
2400: 20 7b 2d 30 2e 31 20 2d 30 2e 31 20 2d 31 2e 30   {-0.1 -0.1 -1.0
2410: 20 2d 31 2e 30 20 2d 30 2e 31 20 2d 30 2e 31 20   -1.0 -0.1 -0.1 
2420: 20 30 2e 31 20 20 30 2e 31 20 20 31 2e 30 20 20   0.1  0.1  1.0  
2430: 31 2e 30 20 20 30 2e 31 20 20 30 2e 31 20 2d 30  1.0  0.1  0.1 -0
2440: 2e 31 7d 20 7d 0a 20 20 20 20 74 72 69 61 6e 67  .1} }.    triang
2450: 6c 65 20 7b 20 7b 2d 31 2e 31 20 20 31 2e 31 20  le { {-1.1  1.1 
2460: 20 30 2e 30 20 2d 31 2e 31 7d 0a 20 20 20 20 20   0.0 -1.1}.     
2470: 20 20 20 20 20 20 20 20 20 20 7b 2d 31 2e 30 20            {-1.0 
2480: 2d 31 2e 30 20 20 31 2e 30 20 2d 31 2e 30 7d 20  -1.0  1.0 -1.0} 
2490: 7d 0a 20 20 7d 20 20 0a 0a 20 20 23 20 63 72 65  }.  }  ..  # cre
24a0: 61 74 65 20 73 6f 6d 65 20 73 79 6d 62 6f 6c 73  ate some symbols
24b0: 20 62 79 20 74 75 72 6e 69 6e 67 20 6f 74 68 65   by turning othe
24c0: 72 73 20 62 79 20 34 35 20 64 65 67 72 65 65 73  rs by 45 degrees
24d0: 0a 20 20 73 65 74 20 73 63 34 35 20 30 2e 37 30  .  set sc45 0.70
24e0: 37 31 30 36 37 38 31 31 38 35 09 3b 23 20 73 69  7106781185.;# si
24f0: 6e 2f 63 6f 73 20 34 35 20 64 65 67 72 65 65 73  n/cos 45 degrees
2500: 0a 20 20 66 6f 72 65 61 63 68 20 7b 73 72 63 20  .  foreach {src 
2510: 64 73 74 7d 20 7b 73 71 75 61 72 65 20 64 69 61  dst} {square dia
2520: 6d 6f 6e 64 20 20 70 6c 75 73 20 63 72 6f 73 73  mond  plus cross
2530: 20 20 20 20 20 73 70 6c 75 73 20 73 63 72 6f 73       splus scros
2540: 73 20 20 74 72 69 61 6e 67 6c 65 20 61 72 72 6f  s  triangle arro
2550: 77 30 20 20 0a 20 20 20 20 20 20 20 20 20 20 20  w0  .           
2560: 20 20 20 20 20 20 20 20 20 20 61 72 72 6f 77 30            arrow0
2570: 20 61 72 72 6f 77 31 20 20 20 61 72 72 6f 77 31   arrow1   arrow1
2580: 20 61 72 72 6f 77 32 20 20 61 72 72 6f 77 32 20   arrow2  arrow2 
2590: 61 72 72 6f 77 20 20 7d 20 7b 0a 20 20 20 20 66  arrow  } {.    f
25a0: 6f 72 65 61 63 68 20 7b 70 78 20 70 79 7d 20 24  oreach {px py} $
25b0: 73 79 6d 62 6f 6c 73 28 24 73 72 63 29 20 7b 7d  symbols($src) {}
25c0: 0a 20 20 20 20 73 65 74 20 6c 78 20 7b 7d 0a 20  .    set lx {}. 
25d0: 20 20 20 73 65 74 20 6c 79 20 7b 7d 0a 20 20 20     set ly {}.   
25e0: 20 66 6f 72 65 61 63 68 20 78 20 24 70 78 20 79   foreach x $px y
25f0: 20 24 70 79 20 7b 0a 20 20 20 20 20 20 6c 61 70   $py {.      lap
2600: 70 65 6e 64 20 6c 78 20 5b 65 78 70 72 20 7b 28  pend lx [expr {(
2610: 24 78 20 2d 20 24 79 29 20 2a 20 24 73 63 34 35  $x - $y) * $sc45
2620: 7d 5d 0a 20 20 20 20 20 20 6c 61 70 70 65 6e 64  }].      lappend
2630: 20 6c 79 20 5b 65 78 70 72 20 7b 28 24 78 20 2b   ly [expr {($x +
2640: 20 24 79 29 20 2a 20 24 73 63 34 35 7d 5d 0a 20   $y) * $sc45}]. 
2650: 20 20 20 7d 0a 20 20 20 20 73 65 74 20 73 79 6d     }.    set sym
2660: 62 6f 6c 73 28 24 64 73 74 29 20 5b 6c 69 73 74  bols($dst) [list
2670: 20 24 6c 78 20 24 6c 79 5d 0a 20 20 7d 0a 20 20   $lx $ly].  }.  
2680: 0a 20 20 23 20 63 72 65 61 74 65 20 61 20 63 69  .  # create a ci
2690: 72 63 6c 65 20 77 69 74 68 20 61 20 32 30 2d 65  rcle with a 20-e
26a0: 64 67 65 20 28 31 38 20 64 65 67 72 65 65 73 29  dge (18 degrees)
26b0: 3a 0a 20 20 23 0a 20 20 23 20 73 65 74 20 6c 78  :.  #.  # set lx
26c0: 20 7b 7d 0a 20 20 23 20 73 65 74 20 6c 79 20 7b   {}.  # set ly {
26d0: 7d 0a 20 20 23 20 66 6f 72 20 7b 73 65 74 20 61  }.  # for {set a
26e0: 6e 67 6c 65 20 30 7d 20 7b 24 61 6e 67 6c 65 20  ngle 0} {$angle 
26f0: 3c 3d 20 33 36 30 7d 20 7b 69 6e 63 72 20 61 6e  <= 360} {incr an
2700: 67 6c 65 20 31 38 7d 20 7b 0a 20 20 23 20 20 20  gle 18} {.  #   
2710: 6c 61 70 70 65 6e 64 20 6c 78 20 5b 65 78 70 72  lappend lx [expr
2720: 20 7b 31 2e 32 20 2a 20 73 69 6e 28 30 2e 30 31   {1.2 * sin(0.01
2730: 37 34 35 33 32 39 32 35 31 39 39 20 2a 20 24 61  74532925199 * $a
2740: 6e 67 6c 65 29 7d 5d 0a 20 20 23 20 20 20 6c 61  ngle)}].  #   la
2750: 70 70 65 6e 64 20 6c 79 20 5b 65 78 70 72 20 7b  ppend ly [expr {
2760: 31 2e 32 20 2a 20 63 6f 73 28 30 2e 30 31 37 34  1.2 * cos(0.0174
2770: 35 33 32 39 32 35 31 39 39 20 2a 20 24 61 6e 67  532925199 * $ang
2780: 6c 65 29 7d 5d 0a 20 20 23 20 7d 0a 20 20 23 20  le)}].  # }.  # 
2790: 73 65 74 20 73 79 6d 62 6f 6c 73 28 63 69 72 63  set symbols(circ
27a0: 6c 65 29 20 5b 6c 69 73 74 20 24 6c 78 20 24 6c  le) [list $lx $l
27b0: 79 5d 0a 7d 0a 0a 0a 70 72 6f 63 20 67 72 61 70  y].}...proc grap
27c0: 68 3a 3a 64 72 61 77 5f 73 79 6d 62 6f 6c 20 7b  h::draw_symbol {
27d0: 20 67 20 78 30 20 79 30 20 73 79 6d 62 6f 6c 20   g x0 y0 symbol 
27e0: 73 69 7a 65 20 66 69 6c 6c 63 6f 6c 6f 72 20 6f  size fillcolor o
27f0: 75 74 6c 69 6e 65 63 6f 6c 6f 72 20 7d 20 7b 0a  utlinecolor } {.
2800: 20 20 76 61 72 69 61 62 6c 65 20 73 79 6d 62 6f    variable symbo
2810: 6c 73 0a 0a 20 20 69 66 20 7b 24 73 79 6d 62 6f  ls..  if {$symbo
2820: 6c 20 3d 3d 20 7b 7d 20 7c 7c 20 24 73 79 6d 62  l == {} || $symb
2830: 6f 6c 20 3d 3d 20 22 6e 6f 6e 65 22 20 7c 7c 20  ol == "none" || 
2840: 24 73 69 7a 65 20 3d 3d 20 30 7d 20 72 65 74 75  $size == 0} retu
2850: 72 6e 0a 0a 20 20 69 66 20 7b 24 73 79 6d 62 6f  rn..  if {$symbo
2860: 6c 20 3d 3d 20 22 63 69 72 63 6c 65 22 7d 20 7b  l == "circle"} {
2870: 0a 20 20 20 20 53 65 74 43 6f 6c 6f 72 20 24 67  .    SetColor $g
2880: 20 24 6f 75 74 6c 69 6e 65 63 6f 6c 6f 72 0a 20   $outlinecolor. 
2890: 20 20 20 41 72 63 20 24 67 20 24 78 30 20 24 79     Arc $g $x0 $y
28a0: 30 20 5b 65 78 70 72 20 7b 31 2e 32 20 2a 20 24  0 [expr {1.2 * $
28b0: 73 69 7a 65 7d 5d 20 30 20 33 36 30 20 24 66 69  size}] 0 360 $fi
28c0: 6c 6c 63 6f 6c 6f 72 0a 20 20 20 20 72 65 74 75  llcolor.    retu
28d0: 72 6e 0a 20 20 7d 0a 0a 20 20 69 66 20 7b 5b 72  rn.  }..  if {[r
28e0: 65 67 65 78 70 20 7b 5e 40 28 2e 2b 29 24 7d 20  egexp {^@(.+)$} 
28f0: 24 73 79 6d 62 6f 6c 20 61 6c 6c 20 70 6e 61 6d  $symbol all pnam
2900: 65 5d 7d 20 7b 0a 20 20 20 20 69 66 20 7b 5b 50  e]} {.    if {[P
2910: 69 63 74 53 69 7a 65 20 24 67 20 24 70 6e 61 6d  ictSize $g $pnam
2920: 65 5d 20 3d 3d 20 7b 7d 7d 20 7b 0a 20 20 20 20  e] == {}} {.    
2930: 20 20 4c 6f 61 64 50 69 63 74 20 24 67 20 24 70    LoadPict $g $p
2940: 6e 61 6d 65 0a 20 20 20 20 7d 0a 20 20 20 20 69  name.    }.    i
2950: 66 20 7b 5b 73 65 74 20 70 73 69 7a 65 20 5b 50  f {[set psize [P
2960: 69 63 74 53 69 7a 65 20 24 67 20 24 70 6e 61 6d  ictSize $g $pnam
2970: 65 5d 5d 20 3d 3d 20 7b 7d 7d 20 72 65 74 75 72  e]] == {}} retur
2980: 6e 0a 20 20 20 20 66 6f 72 65 61 63 68 20 7b 64  n.    foreach {d
2990: 78 20 64 79 7d 20 24 70 73 69 7a 65 20 7b 7d 0a  x dy} $psize {}.
29a0: 20 20 20 20 73 65 74 20 78 20 5b 65 78 70 72 20      set x [expr 
29b0: 7b 24 78 30 20 2d 20 24 64 78 20 2f 20 32 2e 30  {$x0 - $dx / 2.0
29c0: 7d 5d 0a 20 20 20 20 73 65 74 20 79 20 5b 65 78  }].    set y [ex
29d0: 70 72 20 7b 24 79 30 20 2d 20 24 64 79 20 2f 20  pr {$y0 - $dy / 
29e0: 32 2e 30 7d 5d 0a 20 20 20 20 50 69 63 74 20 24  2.0}].    Pict $
29f0: 67 20 24 78 20 24 79 20 24 70 6e 61 6d 65 0a 20  g $x $y $pname. 
2a00: 20 20 20 72 65 74 75 72 6e 0a 20 20 7d 0a 0a 20     return.  }.. 
2a10: 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73   if {![info exis
2a20: 74 73 20 73 79 6d 62 6f 6c 73 28 24 73 79 6d 62  ts symbols($symb
2a30: 6f 6c 29 5d 7d 20 72 65 74 75 72 6e 0a 0a 20 20  ol)]} return..  
2a40: 66 6f 72 65 61 63 68 20 7b 6c 78 20 6c 79 7d 20  foreach {lx ly} 
2a50: 24 73 79 6d 62 6f 6c 73 28 24 73 79 6d 62 6f 6c  $symbols($symbol
2a60: 29 20 7b 7d 0a 20 20 73 65 74 20 70 78 20 7b 7d  ) {}.  set px {}
2a70: 0a 20 20 73 65 74 20 70 79 20 7b 7d 0a 20 20 66  .  set py {}.  f
2a80: 6f 72 65 61 63 68 20 78 20 24 6c 78 20 79 20 24  oreach x $lx y $
2a90: 6c 79 20 7b 0a 20 20 20 20 6c 61 70 70 65 6e 64  ly {.    lappend
2aa0: 20 70 78 20 5b 65 78 70 72 20 7b 24 78 30 20 2b   px [expr {$x0 +
2ab0: 20 24 78 20 2a 20 24 73 69 7a 65 7d 5d 0a 20 20   $x * $size}].  
2ac0: 20 20 6c 61 70 70 65 6e 64 20 70 79 20 5b 65 78    lappend py [ex
2ad0: 70 72 20 7b 24 79 30 20 2b 20 24 79 20 2a 20 24  pr {$y0 + $y * $
2ae0: 73 69 7a 65 7d 5d 0a 20 20 7d 0a 20 20 50 6f 6c  size}].  }.  Pol
2af0: 79 4f 62 6a 65 63 74 20 24 67 20 5b 6c 69 73 74  yObject $g [list
2b00: 20 24 70 78 20 24 70 79 5d 20 5b 47 65 74 52 47   $px $py] [GetRG
2b10: 42 20 24 66 69 6c 6c 63 6f 6c 6f 72 5d 0a 20 20  B $fillcolor].  
2b20: 69 66 20 7b 24 6f 75 74 6c 69 6e 65 63 6f 6c 6f  if {$outlinecolo
2b30: 72 20 21 3d 20 7b 7d 7d 20 7b 0a 20 20 20 20 53  r != {}} {.    S
2b40: 65 74 43 6f 6c 6f 72 20 24 67 20 24 6f 75 74 6c  etColor $g $outl
2b50: 69 6e 65 63 6f 6c 6f 72 0a 20 20 20 20 50 6f 6c  inecolor.    Pol
2b60: 79 4f 62 6a 65 63 74 20 24 67 20 5b 6c 69 73 74  yObject $g [list
2b70: 20 24 70 78 20 24 70 79 5d 0a 20 20 7d 0a 7d 0a   $px $py].  }.}.
2b80: 0a 0a 70 72 6f 63 20 67 72 61 70 68 3a 3a 74 72  ..proc graph::tr
2b90: 61 6e 73 66 6f 72 6d 20 7b 20 78 20 61 20 62 20  ansform { x a b 
2ba0: 63 20 64 20 7b 6c 6f 67 20 6e 6f 7d 20 7d 20 7b  c d {log no} } {
2bb0: 0a 20 20 69 66 20 7b 24 6c 6f 67 7d 20 7b 20 73  .  if {$log} { s
2bc0: 65 74 20 78 20 5b 65 78 70 72 20 7b 28 24 78 20  et x [expr {($x 
2bd0: 3e 20 30 2e 30 29 3f 20 6c 6f 67 31 30 28 24 78  > 0.0)? log10($x
2be0: 29 20 3a 20 24 61 7d 5d 20 7d 0a 20 20 72 65 74  ) : $a}] }.  ret
2bf0: 75 72 6e 20 5b 65 78 70 72 20 7b 24 63 20 2b 20  urn [expr {$c + 
2c00: 28 24 64 20 2d 20 24 63 29 20 2a 20 28 24 78 20  ($d - $c) * ($x 
2c10: 2d 20 24 61 29 20 2f 20 28 24 62 20 2d 20 24 61  - $a) / ($b - $a
2c20: 29 7d 5d 0a 7d 0a 0a 0a 70 72 6f 63 20 67 72 61  )}].}...proc gra
2c30: 70 68 3a 3a 73 65 74 5f 6c 69 6e 65 77 69 64 74  ph::set_linewidt
2c40: 68 20 7b 20 67 20 77 69 64 74 68 20 7d 20 7b 0a  h { g width } {.
2c50: 20 20 76 61 72 69 61 62 6c 65 20 67 72 61 70 68    variable graph
2c60: 0a 0a 20 20 73 65 74 20 6f 72 67 5f 6c 69 6e 65  ..  set org_line
2c70: 77 69 64 74 68 20 5b 67 65 74 5f 6f 70 74 20 24  width [get_opt $
2c80: 67 20 6c 69 6e 65 77 69 64 74 68 5d 0a 20 20 73  g linewidth].  s
2c90: 65 74 5f 6f 70 74 20 24 67 20 6c 69 6e 65 77 69  et_opt $g linewi
2ca0: 64 74 68 20 24 77 69 64 74 68 0a 20 20 72 65 74  dth $width.  ret
2cb0: 75 72 6e 20 24 6f 72 67 5f 6c 69 6e 65 77 69 64  urn $org_linewid
2cc0: 74 68 0a 7d 0a 0a 0a 70 72 6f 63 20 67 72 61 70  th.}...proc grap
2cd0: 68 3a 3a 63 61 6c 63 5f 62 6f 78 20 7b 20 64 78  h::calc_box { dx
2ce0: 20 64 79 20 61 6e 67 6c 65 20 76 5f 62 6f 78 5f   dy angle v_box_
2cf0: 77 20 76 5f 62 6f 78 5f 68 20 7d 20 7b 0a 20 20  w v_box_h } {.  
2d00: 75 70 76 61 72 20 24 76 5f 62 6f 78 5f 77 20 62  upvar $v_box_w b
2d10: 6f 78 5f 77 0a 20 20 75 70 76 61 72 20 24 76 5f  ox_w.  upvar $v_
2d20: 62 6f 78 5f 68 20 62 6f 78 5f 68 0a 0a 20 20 69  box_h box_h..  i
2d30: 66 20 7b 24 61 6e 67 6c 65 20 3d 3d 20 30 7d 20  f {$angle == 0} 
2d40: 7b 0a 20 20 20 20 73 65 74 20 62 6f 78 5f 77 20  {.    set box_w 
2d50: 24 64 78 0a 20 20 20 20 73 65 74 20 62 6f 78 5f  $dx.    set box_
2d60: 68 20 24 64 79 0a 20 20 20 20 72 65 74 75 72 6e  h $dy.    return
2d70: 0a 20 20 7d 0a 20 20 73 65 74 20 61 6c 70 68 61  .  }.  set alpha
2d80: 20 5b 65 78 70 72 20 7b 30 2e 30 31 37 34 35 33   [expr {0.017453
2d90: 32 39 32 35 32 20 2a 20 24 61 6e 67 6c 65 7d 5d  29252 * $angle}]
2da0: 0a 20 20 73 65 74 20 73 69 6e 5f 61 6c 70 68 61  .  set sin_alpha
2db0: 20 5b 65 78 70 72 20 7b 73 69 6e 28 24 61 6c 70   [expr {sin($alp
2dc0: 68 61 29 7d 5d 0a 20 20 73 65 74 20 63 6f 73 5f  ha)}].  set cos_
2dd0: 61 6c 70 68 61 20 5b 65 78 70 72 20 7b 63 6f 73  alpha [expr {cos
2de0: 28 24 61 6c 70 68 61 29 7d 5d 0a 20 20 73 65 74  ($alpha)}].  set
2df0: 20 62 6f 78 5f 77 20 5b 65 78 70 72 20 7b 24 64   box_w [expr {$d
2e00: 79 20 2a 20 24 73 69 6e 5f 61 6c 70 68 61 20 2b  y * $sin_alpha +
2e10: 20 24 64 78 20 2a 20 24 63 6f 73 5f 61 6c 70 68   $dx * $cos_alph
2e20: 61 7d 5d 0a 20 20 73 65 74 20 62 6f 78 5f 68 20  a}].  set box_h 
2e30: 5b 65 78 70 72 20 7b 24 64 79 20 2a 20 24 63 6f  [expr {$dy * $co
2e40: 73 5f 61 6c 70 68 61 20 2b 20 24 64 78 20 2a 20  s_alpha + $dx * 
2e50: 24 73 69 6e 5f 61 6c 70 68 61 7d 5d 0a 20 20 72  $sin_alpha}].  r
2e60: 65 74 75 72 6e 20 5b 65 78 70 72 20 7b 73 71 72  eturn [expr {sqr
2e70: 74 28 24 62 6f 78 5f 77 20 2a 20 24 62 6f 78 5f  t($box_w * $box_
2e80: 77 20 2b 20 24 62 6f 78 5f 68 20 2a 20 24 62 6f  w + $box_h * $bo
2e90: 78 5f 68 29 7d 5d 0a 7d 0a 0a 0a 70 72 6f 63 20  x_h)}].}...proc 
2ea0: 67 72 61 70 68 3a 3a 73 77 61 70 20 7b 20 76 5f  graph::swap { v_
2eb0: 61 20 76 5f 62 20 7d 20 7b 0a 20 20 75 70 76 61  a v_b } {.  upva
2ec0: 72 20 24 76 5f 61 20 61 0a 20 20 75 70 76 61 72  r $v_a a.  upvar
2ed0: 20 24 76 5f 62 20 62 0a 0a 20 20 73 65 74 20 74   $v_b b..  set t
2ee0: 6d 70 20 24 61 3b 20 73 65 74 20 61 20 24 62 3b  mp $a; set a $b;
2ef0: 20 73 65 74 20 62 20 24 74 6d 70 0a 7d 0a 0a 0a   set b $tmp.}...
2f00: 70 72 6f 63 20 67 72 61 70 68 3a 3a 74 75 72 6e  proc graph::turn
2f10: 5f 76 65 63 74 6f 72 20 7b 20 76 5f 78 20 76 5f  _vector { v_x v_
2f20: 79 20 78 30 20 79 30 20 78 72 20 79 72 20 61 6e  y x0 y0 xr yr an
2f30: 67 6c 65 20 7d 20 7b 0a 20 20 75 70 76 61 72 20  gle } {.  upvar 
2f40: 24 76 5f 78 20 78 0a 20 20 75 70 76 61 72 20 24  $v_x x.  upvar $
2f50: 76 5f 79 20 79 0a 20 20 73 65 74 20 61 6c 70 68  v_y y.  set alph
2f60: 61 20 5b 65 78 70 72 20 7b 30 2e 30 31 37 34 35  a [expr {0.01745
2f70: 33 32 39 32 35 32 20 2a 20 24 61 6e 67 6c 65 7d  329252 * $angle}
2f80: 5d 0a 20 20 73 65 74 20 73 69 6e 5f 61 20 5b 65  ].  set sin_a [e
2f90: 78 70 72 20 7b 73 69 6e 28 24 61 6c 70 68 61 29  xpr {sin($alpha)
2fa0: 7d 5d 0a 20 20 73 65 74 20 63 6f 73 5f 61 20 5b  }].  set cos_a [
2fb0: 65 78 70 72 20 7b 63 6f 73 28 24 61 6c 70 68 61  expr {cos($alpha
2fc0: 29 7d 5d 0a 20 20 73 65 74 20 78 20 5b 65 78 70  )}].  set x [exp
2fd0: 72 20 7b 24 78 30 20 2b 20 24 78 72 20 2a 20 24  r {$x0 + $xr * $
2fe0: 63 6f 73 5f 61 20 2d 20 24 79 72 20 2a 20 24 73  cos_a - $yr * $s
2ff0: 69 6e 5f 61 7d 5d 0a 20 20 73 65 74 20 79 20 5b  in_a}].  set y [
3000: 65 78 70 72 20 7b 24 79 30 20 2b 20 24 78 72 20  expr {$y0 + $xr 
3010: 2a 20 24 73 69 6e 5f 61 20 2b 20 24 79 72 20 2a  * $sin_a + $yr *
3020: 20 24 63 6f 73 5f 61 7d 5d 0a 7d 0a 0a 0a 70 72   $cos_a}].}...pr
3030: 6f 63 20 67 72 61 70 68 3a 3a 74 65 78 74 5f 72  oc graph::text_r
3040: 6f 74 20 7b 20 67 20 74 78 74 20 78 63 20 79 63  ot { g txt xc yc
3050: 20 74 77 20 74 68 20 61 6e 67 6c 65 20 7d 20 7b   tw th angle } {
3060: 0a 20 20 73 65 74 20 64 78 20 5b 65 78 70 72 20  .  set dx [expr 
3070: 7b 2d 30 2e 35 20 2a 20 24 74 77 7d 5d 0a 20 20  {-0.5 * $tw}].  
3080: 73 65 74 20 64 79 20 5b 65 78 70 72 20 7b 2d 30  set dy [expr {-0
3090: 2e 33 20 2a 20 24 74 68 7d 5d 0a 20 20 69 66 20  .3 * $th}].  if 
30a0: 7b 24 61 6e 67 6c 65 20 21 3d 20 30 7d 20 7b 0a  {$angle != 0} {.
30b0: 20 20 20 20 74 75 72 6e 5f 76 65 63 74 6f 72 20      turn_vector 
30c0: 78 20 79 20 24 78 63 20 24 79 63 20 24 64 78 20  x y $xc $yc $dx 
30d0: 24 64 79 20 24 61 6e 67 6c 65 0a 20 20 20 20 54  $dy $angle.    T
30e0: 65 78 74 20 24 67 20 24 78 20 24 79 20 24 74 78  ext $g $x $y $tx
30f0: 74 20 72 6f 74 61 74 65 20 24 61 6e 67 6c 65 0a  t rotate $angle.
3100: 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 73    } else {.    s
3110: 65 74 20 78 20 5b 65 78 70 72 20 7b 24 78 63 20  et x [expr {$xc 
3120: 2b 20 24 64 78 7d 5d 0a 20 20 20 20 73 65 74 20  + $dx}].    set 
3130: 79 20 5b 65 78 70 72 20 7b 24 79 63 20 2b 20 24  y [expr {$yc + $
3140: 64 79 7d 5d 0a 20 20 20 20 54 65 78 74 20 24 67  dy}].    Text $g
3150: 20 24 78 20 24 79 20 24 74 78 74 0a 20 20 7d 0a   $x $y $txt.  }.
3160: 7d 0a 0a 0a 70 72 6f 63 20 67 72 61 70 68 3a 3a  }...proc graph::
3170: 64 72 61 77 5f 66 72 61 6d 65 20 7b 20 67 20 78  draw_frame { g x
3180: 5f 6c 65 66 74 20 79 5f 74 6f 70 20 78 5f 72 69  _left y_top x_ri
3190: 67 68 74 20 79 5f 62 6f 74 74 6f 6d 20 62 61 63  ght y_bottom bac
31a0: 6b 67 72 6f 75 6e 64 20 72 65 6c 69 65 66 20 62  kground relief b
31b0: 6f 72 64 65 72 77 69 64 74 68 20 7d 20 7b 0a 20  orderwidth } {. 
31c0: 20 69 66 20 7b 24 62 6f 72 64 65 72 77 69 64 74   if {$borderwidt
31d0: 68 20 3e 20 30 7d 20 7b 0a 20 20 20 20 73 65 74  h > 0} {.    set
31e0: 20 62 67 63 20 5b 47 65 74 52 47 42 20 24 62 61   bgc [GetRGB $ba
31f0: 63 6b 67 72 6f 75 6e 64 5d 0a 20 20 20 20 69 66  ckground].    if
3200: 20 7b 24 79 5f 74 6f 70 20 3c 20 24 79 5f 62 6f   {$y_top < $y_bo
3210: 74 74 6f 6d 7d 20 7b 20 73 77 61 70 20 79 5f 74  ttom} { swap y_t
3220: 6f 70 20 79 5f 62 6f 74 74 6f 6d 20 7d 0a 20 20  op y_bottom }.  
3230: 20 20 69 66 20 7b 24 78 5f 72 69 67 68 74 20 3c    if {$x_right <
3240: 20 24 78 5f 6c 65 66 74 7d 20 7b 20 73 77 61 70   $x_left} { swap
3250: 20 78 5f 6c 65 66 74 20 78 5f 72 69 67 68 74 20   x_left x_right 
3260: 7d 0a 20 20 20 20 73 65 74 20 78 6c 20 5b 65 78  }.    set xl [ex
3270: 70 72 20 7b 24 78 5f 6c 65 66 74 20 20 20 2b 20  pr {$x_left   + 
3280: 24 62 6f 72 64 65 72 77 69 64 74 68 7d 5d 0a 20  $borderwidth}]. 
3290: 20 20 20 73 65 74 20 78 72 20 5b 65 78 70 72 20     set xr [expr 
32a0: 7b 24 78 5f 72 69 67 68 74 20 20 2d 20 24 62 6f  {$x_right  - $bo
32b0: 72 64 65 72 77 69 64 74 68 7d 5d 0a 20 20 20 20  rderwidth}].    
32c0: 73 65 74 20 79 74 20 5b 65 78 70 72 20 7b 24 79  set yt [expr {$y
32d0: 5f 74 6f 70 20 20 20 20 2d 20 24 62 6f 72 64 65  _top    - $borde
32e0: 72 77 69 64 74 68 7d 5d 0a 20 20 20 20 73 65 74  rwidth}].    set
32f0: 20 79 62 20 5b 65 78 70 72 20 7b 24 79 5f 62 6f   yb [expr {$y_bo
3300: 74 74 6f 6d 20 2b 20 24 62 6f 72 64 65 72 77 69  ttom + $borderwi
3310: 64 74 68 7d 5d 0a 20 20 20 20 73 77 69 74 63 68  dth}].    switch
3320: 20 24 72 65 6c 69 65 66 20 7b 0a 20 20 20 20 20   $relief {.     
3330: 20 73 75 6e 6b 65 6e 20 7b 0a 09 73 65 74 20 63   sunken {..set c
3340: 6f 6c 6f 72 20 5b 72 67 62 64 61 72 6b 65 6e 20  olor [rgbdarken 
3350: 24 62 67 63 20 33 35 5d 0a 09 50 6f 6c 79 4f 62  $bgc 35]..PolyOb
3360: 6a 65 63 74 20 24 67 20 5b 6c 69 73 74 20 5b 6c  ject $g [list [l
3370: 69 73 74 20 24 78 5f 6c 65 66 74 20 20 20 24 78  ist $x_left   $x
3380: 5f 6c 65 66 74 20 24 78 5f 72 69 67 68 74 20 24  _left $x_right $
3390: 78 72 20 24 78 6c 20 24 78 6c 20 24 78 5f 6c 65  xr $xl $xl $x_le
33a0: 66 74 20 20 5d 20 5c 0a 09 09 09 20 5b 6c 69 73  ft  ] \.... [lis
33b0: 74 20 24 79 5f 62 6f 74 74 6f 6d 20 24 79 5f 74  t $y_bottom $y_t
33c0: 6f 70 20 20 24 79 5f 74 6f 70 20 20 20 24 79 74  op  $y_top   $yt
33d0: 20 24 79 74 20 24 79 62 20 24 79 5f 62 6f 74 74   $yt $yb $y_bott
33e0: 6f 6d 5d 5d 20 24 63 6f 6c 6f 72 0a 09 73 65 74  om]] $color..set
33f0: 20 63 6f 6c 6f 72 20 5b 72 67 62 6c 69 67 68 74   color [rgblight
3400: 65 6e 20 24 62 67 63 20 33 35 5d 0a 09 50 6f 6c  en $bgc 35]..Pol
3410: 79 4f 62 6a 65 63 74 20 24 67 20 5b 6c 69 73 74  yObject $g [list
3420: 20 5b 6c 69 73 74 20 24 78 5f 6c 65 66 74 20 20   [list $x_left  
3430: 20 24 78 5f 72 69 67 68 74 20 20 24 78 5f 72 69   $x_right  $x_ri
3440: 67 68 74 20 24 78 72 20 24 78 72 20 24 78 6c 20  ght $xr $xr $xl 
3450: 24 78 5f 6c 65 66 74 20 20 5d 20 5c 0a 09 09 09  $x_left  ] \....
3460: 20 5b 6c 69 73 74 20 24 79 5f 62 6f 74 74 6f 6d   [list $y_bottom
3470: 20 24 79 5f 62 6f 74 74 6f 6d 20 24 79 5f 74 6f   $y_bottom $y_to
3480: 70 20 20 20 24 79 74 20 24 79 62 20 24 79 62 20  p   $yt $yb $yb 
3490: 24 79 5f 62 6f 74 74 6f 6d 5d 5d 20 24 63 6f 6c  $y_bottom]] $col
34a0: 6f 72 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  or.      }.     
34b0: 20 72 61 69 73 65 64 20 7b 0a 09 73 65 74 20 63   raised {..set c
34c0: 6f 6c 6f 72 20 5b 72 67 62 6c 69 67 68 74 65 6e  olor [rgblighten
34d0: 20 24 62 67 63 20 33 35 5d 0a 09 50 6f 6c 79 4f   $bgc 35]..PolyO
34e0: 62 6a 65 63 74 20 24 67 20 5b 6c 69 73 74 20 5b  bject $g [list [
34f0: 6c 69 73 74 20 24 78 5f 6c 65 66 74 20 20 20 24  list $x_left   $
3500: 78 5f 6c 65 66 74 20 24 78 5f 72 69 67 68 74 20  x_left $x_right 
3510: 24 78 72 20 24 78 6c 20 24 78 6c 20 24 78 5f 6c  $xr $xl $xl $x_l
3520: 65 66 74 20 20 5d 20 5c 0a 09 09 09 20 5b 6c 69  eft  ] \.... [li
3530: 73 74 20 24 79 5f 62 6f 74 74 6f 6d 20 24 79 5f  st $y_bottom $y_
3540: 74 6f 70 20 20 24 79 5f 74 6f 70 20 20 20 24 79  top  $y_top   $y
3550: 74 20 24 79 74 20 24 79 62 20 24 79 5f 62 6f 74  t $yt $yb $y_bot
3560: 74 6f 6d 5d 5d 20 24 63 6f 6c 6f 72 0a 09 73 65  tom]] $color..se
3570: 74 20 63 6f 6c 6f 72 20 5b 72 67 62 64 61 72 6b  t color [rgbdark
3580: 65 6e 20 24 62 67 63 20 33 35 5d 0a 09 50 6f 6c  en $bgc 35]..Pol
3590: 79 4f 62 6a 65 63 74 20 24 67 20 5b 6c 69 73 74  yObject $g [list
35a0: 20 5b 6c 69 73 74 20 24 78 5f 6c 65 66 74 20 20   [list $x_left  
35b0: 20 24 78 5f 72 69 67 68 74 20 20 24 78 5f 72 69   $x_right  $x_ri
35c0: 67 68 74 20 24 78 72 20 24 78 72 20 24 78 6c 20  ght $xr $xr $xl 
35d0: 24 78 5f 6c 65 66 74 20 20 5d 20 5c 0a 09 09 09  $x_left  ] \....
35e0: 20 5b 6c 69 73 74 20 24 79 5f 62 6f 74 74 6f 6d   [list $y_bottom
35f0: 20 24 79 5f 62 6f 74 74 6f 6d 20 24 79 5f 74 6f   $y_bottom $y_to
3600: 70 20 20 20 24 79 74 20 24 79 62 20 24 79 62 20  p   $yt $yb $yb 
3610: 24 79 5f 62 6f 74 74 6f 6d 5d 5d 20 24 63 6f 6c  $y_bottom]] $col
3620: 6f 72 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  or.      }.     
3630: 20 73 6f 6c 69 64 20 7b 0a 09 52 65 63 74 20 24   solid {..Rect $
3640: 67 20 24 78 72 20 20 20 20 20 24 79 5f 62 6f 74  g $xr     $y_bot
3650: 74 6f 6d 20 24 78 5f 72 69 67 68 74 20 24 79 5f  tom $x_right $y_
3660: 74 6f 70 20 62 6c 61 63 6b 0a 09 52 65 63 74 20  top black..Rect 
3670: 24 67 20 24 78 5f 6c 65 66 74 20 24 79 74 20 20  $g $x_left $yt  
3680: 20 20 20 20 20 24 78 5f 72 69 67 68 74 20 24 79       $x_right $y
3690: 5f 74 6f 70 20 62 6c 61 63 6b 0a 09 52 65 63 74  _top black..Rect
36a0: 20 24 67 20 24 78 5f 6c 65 66 74 20 24 79 5f 62   $g $x_left $y_b
36b0: 6f 74 74 6f 6d 20 24 78 6c 20 20 20 20 20 20 24  ottom $xl      $
36c0: 79 5f 74 6f 70 20 62 6c 61 63 6b 0a 09 52 65 63  y_top black..Rec
36d0: 74 20 24 67 20 24 78 5f 6c 65 66 74 20 24 79 5f  t $g $x_left $y_
36e0: 62 6f 74 74 6f 6d 20 24 78 5f 72 69 67 68 74 20  bottom $x_right 
36f0: 24 79 62 20 20 20 20 62 6c 61 63 6b 0a 20 20 20  $yb    black.   
3700: 20 20 20 7d 0a 20 20 20 20 20 20 64 65 66 61 75     }.      defau
3710: 6c 74 20 7b 0a 20 20 20 20 20 20 20 20 23 20 6e  lt {.        # n
3720: 69 78 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  ix.      }.    }
3730: 0a 20 20 7d 0a 7d 0a 0a 0a 70 72 6f 63 20 67 72  .  }.}...proc gr
3740: 61 70 68 3a 3a 6f 62 6a 5f 64 65 66 61 75 6c 74  aph::obj_default
3750: 73 20 7b 20 69 6e 64 65 78 20 64 65 66 61 75 6c  s { index defaul
3760: 74 73 5f 6e 61 6d 65 20 7d 20 7b 0a 20 20 75 70  ts_name } {.  up
3770: 76 61 72 20 23 30 20 67 72 61 70 68 3a 3a 24 64  var #0 graph::$d
3780: 65 66 61 75 6c 74 73 5f 6e 61 6d 65 20 64 65 66  efaults_name def
3790: 61 75 6c 74 73 0a 20 20 76 61 72 69 61 62 6c 65  aults.  variable
37a0: 20 67 72 61 70 68 0a 0a 20 20 66 6f 72 65 61 63   graph..  foreac
37b0: 68 20 69 74 65 6d 20 5b 61 72 72 61 79 20 6e 61  h item [array na
37c0: 6d 65 73 20 64 65 66 61 75 6c 74 73 5d 20 7b 0a  mes defaults] {.
37d0: 20 20 20 20 73 65 74 20 67 72 61 70 68 28 24 69      set graph($i
37e0: 6e 64 65 78 2c 24 69 74 65 6d 29 20 24 64 65 66  ndex,$item) $def
37f0: 61 75 6c 74 73 28 24 69 74 65 6d 29 0a 20 20 7d  aults($item).  }
3800: 0a 7d 0a 0a 0a 70 72 6f 63 20 67 72 61 70 68 3a  .}...proc graph:
3810: 3a 6f 62 6a 5f 63 6f 6e 66 69 67 75 72 65 20 7b  :obj_configure {
3820: 20 69 6e 64 65 78 20 70 61 72 61 6d 73 20 7d 20   index params } 
3830: 7b 0a 20 20 76 61 72 69 61 62 6c 65 20 67 72 61  {.  variable gra
3840: 70 68 0a 0a 20 20 66 6f 72 65 61 63 68 20 7b 6e  ph..  foreach {n
3850: 61 6d 65 20 76 61 6c 75 65 7d 20 24 70 61 72 61  ame value} $para
3860: 6d 73 20 7b 0a 20 20 20 20 69 66 20 7b 5b 72 65  ms {.    if {[re
3870: 67 65 78 70 20 7b 5e 5c 2d 28 5c 77 2b 29 24 7d  gexp {^\-(\w+)$}
3880: 20 24 6e 61 6d 65 20 61 6c 6c 20 6f 70 74 69 6f   $name all optio
3890: 6e 5d 7d 20 7b 0a 20 20 20 20 20 20 69 66 20 7b  n]} {.      if {
38a0: 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 67 72 61  [info exists gra
38b0: 70 68 28 24 69 6e 64 65 78 2c 24 6f 70 74 69 6f  ph($index,$optio
38c0: 6e 29 5d 7d 20 7b 0a 09 73 65 74 20 67 72 61 70  n)]} {..set grap
38d0: 68 28 24 69 6e 64 65 78 2c 24 6f 70 74 69 6f 6e  h($index,$option
38e0: 29 20 24 76 61 6c 75 65 0a 20 20 20 20 20 20 7d  ) $value.      }
38f0: 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20   else {.        
3900: 72 65 74 75 72 6e 20 2d 63 6f 64 65 20 65 72 72  return -code err
3910: 6f 72 20 22 75 6e 6b 6e 6f 77 6e 20 6f 70 74 69  or "unknown opti
3920: 6f 6e 20 5c 22 24 6f 70 74 69 6f 6e 5c 22 22 0a  on \"$option\"".
3930: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 65 6c        }.    } el
3940: 73 65 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72  se {.      retur
3950: 6e 20 2d 63 6f 64 65 20 65 72 72 6f 72 20 22 73  n -code error "s
3960: 79 6e 74 61 78 20 65 72 72 6f 72 20 69 6e 20 6f  yntax error in o
3970: 70 74 69 6f 6e 20 5c 22 24 6f 70 74 69 6f 6e 5c  ption \"$option\
3980: 22 22 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  "".    }.  }.}..
3990: 0a 70 72 6f 63 20 67 72 61 70 68 3a 3a 6f 62 6a  .proc graph::obj
39a0: 5f 63 67 65 74 20 7b 20 69 6e 64 65 78 20 6f 70  _cget { index op
39b0: 74 69 6f 6e 20 7d 20 7b 0a 20 20 76 61 72 69 61  tion } {.  varia
39c0: 62 6c 65 20 67 72 61 70 68 0a 0a 20 20 72 65 67  ble graph..  reg
39d0: 65 78 70 20 7b 5e 5c 2d 28 5c 77 2b 29 24 7d 20  exp {^\-(\w+)$} 
39e0: 24 6f 70 74 69 6f 6e 20 61 6c 6c 20 6f 70 74 69  $option all opti
39f0: 6f 6e 0a 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65  on.  if {[info e
3a00: 78 69 73 74 73 20 67 72 61 70 68 28 24 69 6e 64  xists graph($ind
3a10: 65 78 2c 24 6f 70 74 69 6f 6e 29 5d 7d 20 7b 0a  ex,$option)]} {.
3a20: 20 20 20 20 72 65 74 75 72 6e 20 24 67 72 61 70      return $grap
3a30: 68 28 24 69 6e 64 65 78 2c 24 6f 70 74 69 6f 6e  h($index,$option
3a40: 29 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20  ).  } else {.   
3a50: 20 72 65 74 75 72 6e 20 2d 63 6f 64 65 20 65 72   return -code er
3a60: 72 6f 72 20 22 75 6e 6b 6e 6f 77 6e 20 6f 70 74  ror "unknown opt
3a70: 69 6f 6e 20 5c 22 24 6f 70 74 69 6f 6e 5c 22 22  ion \"$option\""
3a80: 0a 20 20 7d 0a 7d 0a 0a 0a 70 72 6f 63 20 67 72  .  }.}...proc gr
3a90: 61 70 68 3a 3a 6f 62 6a 5f 6e 61 6d 65 73 20 7b  aph::obj_names {
3aa0: 20 69 6e 64 65 78 20 7b 70 61 72 61 6d 73 20 2a   index {params *
3ab0: 7d 20 7d 20 7b 0a 20 20 76 61 72 69 61 62 6c 65  } } {.  variable
3ac0: 20 67 72 61 70 68 0a 0a 20 20 69 66 20 7b 24 70   graph..  if {$p
3ad0: 61 72 61 6d 73 20 3d 3d 20 22 2a 22 7d 20 7b 0a  arams == "*"} {.
3ae0: 20 20 20 20 72 65 74 75 72 6e 20 24 67 72 61 70      return $grap
3af0: 68 28 24 69 6e 64 65 78 29 0a 20 20 7d 0a 20 20  h($index).  }.  
3b00: 73 65 74 20 6c 73 74 20 7b 7d 0a 20 20 66 6f 72  set lst {}.  for
3b10: 65 61 63 68 20 69 74 65 6d 20 24 67 72 61 70 68  each item $graph
3b20: 28 24 69 6e 64 65 78 29 20 7b 0a 20 20 20 20 66  ($index) {.    f
3b30: 6f 72 65 61 63 68 20 70 61 74 74 65 72 6e 20 24  oreach pattern $
3b40: 70 61 72 61 6d 73 20 7b 0a 20 20 20 20 20 20 69  params {.      i
3b50: 66 20 7b 5b 73 74 72 69 6e 67 20 6d 61 74 63 68  f {[string match
3b60: 20 24 70 61 74 74 65 72 6e 20 24 69 74 65 6d 5d   $pattern $item]
3b70: 7d 20 7b 0a 09 6c 61 70 70 65 6e 64 20 6c 73 74  } {..lappend lst
3b80: 20 24 6e 61 6d 65 0a 09 62 72 65 61 6b 0a 20 20   $name..break.  
3b90: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
3ba0: 20 20 72 65 74 75 72 6e 20 24 6c 73 74 0a 7d 0a    return $lst.}.
3bb0: 0a 0a 70 72 6f 63 20 67 72 61 70 68 3a 3a 6f 62  ..proc graph::ob
3bc0: 6a 5f 64 65 6c 65 74 65 20 7b 20 69 74 65 6d 69  j_delete { itemi
3bd0: 6e 64 65 78 20 6c 69 73 74 69 6e 64 65 78 20 70  ndex listindex p
3be0: 61 72 61 6d 73 20 7d 20 7b 0a 20 20 76 61 72 69  arams } {.  vari
3bf0: 61 62 6c 65 20 67 72 61 70 68 0a 0a 20 20 66 6f  able graph..  fo
3c00: 72 65 61 63 68 20 6e 61 6d 65 20 24 70 61 72 61  reach name $para
3c10: 6d 73 20 7b 0a 20 20 20 20 69 66 20 7b 5b 73 65  ms {.    if {[se
3c20: 74 20 69 64 78 20 5b 6c 73 65 61 72 63 68 20 2d  t idx [lsearch -
3c30: 65 78 61 63 74 20 24 67 72 61 70 68 28 24 69 74  exact $graph($it
3c40: 65 6d 69 6e 64 65 78 29 20 24 6e 61 6d 65 5d 5d  emindex) $name]]
3c50: 20 21 3d 20 2d 31 7d 20 7b 0a 20 20 20 20 20 20   != -1} {.      
3c60: 61 72 72 61 79 20 75 6e 73 65 74 20 67 72 61 70  array unset grap
3c70: 68 20 24 6c 69 73 74 69 6e 64 65 78 2d 24 6e 61  h $listindex-$na
3c80: 6d 65 2c 2a 0a 20 20 20 20 20 20 73 65 74 20 67  me,*.      set g
3c90: 72 61 70 68 28 24 69 74 65 6d 69 6e 64 65 78 29  raph($itemindex)
3ca0: 20 5b 6c 72 65 70 6c 61 63 65 20 24 67 72 61 70   [lreplace $grap
3cb0: 68 28 24 69 74 65 6d 69 6e 64 65 78 29 20 24 69  h($itemindex) $i
3cc0: 64 78 20 24 69 64 78 5d 0a 20 20 20 20 7d 0a 20  dx $idx].    }. 
3cd0: 20 7d 0a 7d 0a 0a 23 23 23 23 23 23 23 23 23 23   }.}..##########
3ce0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
3cf0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
3d00: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
3d10: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
3d20: 23 23 23 23 23 0a 23 0a 23 20 65 6c 65 6d 65 6e  #####.#.# elemen
3d30: 74 20 63 6f 6d 70 6f 6e 65 6e 74 73 0a 23 0a 0a  t components.#..
3d40: 70 72 6f 63 20 67 72 61 70 68 3a 3a 65 6c 65 6d  proc graph::elem
3d50: 65 6e 74 20 7b 20 67 20 6f 70 65 72 61 74 69 6f  ent { g operatio
3d60: 6e 20 70 61 72 61 6d 73 20 7d 20 7b 0a 20 20 76  n params } {.  v
3d70: 61 72 69 61 62 6c 65 20 67 72 61 70 68 0a 0a 20  ariable graph.. 
3d80: 20 73 77 69 74 63 68 20 2d 2d 20 24 6f 70 65 72   switch -- $oper
3d90: 61 74 69 6f 6e 20 7b 0a 20 20 20 20 63 72 65 61  ation {.    crea
3da0: 74 65 20 7b 0a 20 20 20 20 20 20 73 65 74 20 6e  te {.      set n
3db0: 61 6d 65 20 5b 6c 69 6e 64 65 78 20 24 70 61 72  ame [lindex $par
3dc0: 61 6d 73 20 30 5d 0a 20 20 20 20 20 20 73 65 74  ams 0].      set
3dd0: 20 69 6e 64 65 78 20 24 67 2c 65 6c 65 6d 2d 24   index $g,elem-$
3de0: 6e 61 6d 65 0a 20 20 20 20 20 20 6f 62 6a 5f 64  name.      obj_d
3df0: 65 66 61 75 6c 74 73 20 20 24 69 6e 64 65 78 20  efaults  $index 
3e00: 65 6c 65 6d 65 6e 74 5f 64 65 66 61 75 6c 74 73  element_defaults
3e10: 0a 20 20 20 20 20 20 73 65 74 20 67 72 61 70 68  .      set graph
3e20: 28 24 69 6e 64 65 78 2c 6c 61 62 65 6c 29 20 24  ($index,label) $
3e30: 6e 61 6d 65 0a 20 20 20 20 20 20 65 6c 65 6d 65  name.      eleme
3e40: 6e 74 20 24 67 20 63 6f 6e 66 69 67 75 72 65 20  nt $g configure 
3e50: 24 70 61 72 61 6d 73 0a 20 20 20 20 20 20 6c 61  $params.      la
3e60: 70 70 65 6e 64 20 67 72 61 70 68 28 24 67 2c 5f  ppend graph($g,_
3e70: 65 6c 65 6d 65 6e 74 73 29 20 24 6e 61 6d 65 0a  elements) $name.
3e80: 20 20 20 20 7d 0a 20 20 20 20 63 6f 6e 66 69 67      }.    config
3e90: 75 72 65 20 7b 0a 20 20 20 20 20 20 73 65 74 20  ure {.      set 
3ea0: 6e 61 6d 65 20 5b 6c 69 6e 64 65 78 20 24 70 61  name [lindex $pa
3eb0: 72 61 6d 73 20 30 5d 0a 20 20 20 20 20 20 73 65  rams 0].      se
3ec0: 74 20 69 6e 64 65 78 20 24 67 2c 65 6c 65 6d 2d  t index $g,elem-
3ed0: 24 6e 61 6d 65 0a 20 20 20 20 20 20 6f 62 6a 5f  $name.      obj_
3ee0: 63 6f 6e 66 69 67 75 72 65 20 24 69 6e 64 65 78  configure $index
3ef0: 20 5b 6c 72 61 6e 67 65 20 24 70 61 72 61 6d 73   [lrange $params
3f00: 20 31 20 65 6e 64 5d 0a 20 20 20 20 20 20 73 65   1 end].      se
3f10: 74 20 63 61 6c 63 20 6e 6f 0a 20 20 20 20 20 20  t calc no.      
3f20: 69 66 20 7b 5b 6c 73 65 61 72 63 68 20 2d 65 78  if {[lsearch -ex
3f30: 61 63 74 20 24 70 61 72 61 6d 73 20 22 2d 64 61  act $params "-da
3f40: 74 61 22 5d 20 21 3d 20 2d 31 7d 20 7b 0a 20 20  ta"] != -1} {.  
3f50: 20 20 20 20 20 20 73 65 74 20 67 72 61 70 68 28        set graph(
3f60: 24 69 6e 64 65 78 2c 78 64 61 74 61 29 20 7b 7d  $index,xdata) {}
3f70: 0a 20 20 20 20 20 20 20 20 73 65 74 20 67 72 61  .        set gra
3f80: 70 68 28 24 69 6e 64 65 78 2c 79 64 61 74 61 29  ph($index,ydata)
3f90: 20 7b 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   {}.      }.    
3fa0: 20 20 69 66 20 7b 5b 6c 73 65 61 72 63 68 20 2d    if {[lsearch -
3fb0: 65 78 61 63 74 20 24 70 61 72 61 6d 73 20 22 2d  exact $params "-
3fc0: 78 64 61 74 61 22 5d 20 21 3d 20 2d 31 20 7c 7c  xdata"] != -1 ||
3fd0: 20 0a 20 20 20 20 20 20 20 20 20 20 5b 6c 73 65   .          [lse
3fe0: 61 72 63 68 20 2d 65 78 61 63 74 20 24 70 61 72  arch -exact $par
3ff0: 61 6d 73 20 22 2d 79 64 61 74 61 22 5d 20 21 3d  ams "-ydata"] !=
4000: 20 2d 31 20 20 20 7d 20 7b 0a 20 20 20 20 20 20   -1   } {.      
4010: 20 20 73 65 74 20 67 72 61 70 68 28 24 69 6e 64    set graph($ind
4020: 65 78 2c 64 61 74 61 29 20 7b 7d 0a 09 73 65 74  ex,data) {}..set
4030: 20 63 61 6c 63 20 79 65 73 0a 20 20 20 20 20 20   calc yes.      
4040: 7d 0a 20 20 20 20 20 20 73 65 74 20 67 72 61 70  }.      set grap
4050: 68 28 24 69 6e 64 65 78 2c 5f 76 61 6c 69 64 29  h($index,_valid)
4060: 20 6e 6f 0a 20 20 20 20 20 20 61 78 69 73 5f 69   no.      axis_i
4070: 6e 76 61 6c 69 64 61 74 65 20 24 67 0a 20 20 20  nvalidate $g.   
4080: 20 7d 0a 20 20 20 20 63 67 65 74 20 7b 0a 20 20   }.    cget {.  
4090: 20 20 20 20 73 65 74 20 6e 61 6d 65 20 5b 6c 69      set name [li
40a0: 6e 64 65 78 20 24 70 61 72 61 6d 73 20 30 5d 0a  ndex $params 0].
40b0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 6f 62        return [ob
40c0: 6a 5f 63 67 65 74 20 24 67 2c 65 6c 65 6d 2d 24  j_cget $g,elem-$
40d0: 6e 61 6d 65 20 5b 6c 69 6e 64 65 78 20 24 70 61  name [lindex $pa
40e0: 72 61 6d 73 20 31 5d 5d 0a 20 20 20 20 7d 0a 20  rams 1]].    }. 
40f0: 20 20 20 64 65 6c 65 74 65 20 7b 0a 20 20 20 20     delete {.    
4100: 20 20 6f 62 6a 5f 64 65 6c 65 74 65 20 24 67 2c    obj_delete $g,
4110: 5f 65 6c 65 6d 65 6e 74 73 20 24 67 2c 65 6c 65  _elements $g,ele
4120: 6d 20 24 70 61 72 61 6d 73 0a 20 20 20 20 20 20  m $params.      
4130: 61 78 69 73 5f 69 6e 76 61 6c 69 64 61 74 65 20  axis_invalidate 
4140: 24 67 0a 20 20 20 20 7d 0a 20 20 20 20 65 78 69  $g.    }.    exi
4150: 73 74 73 20 7b 0a 20 20 20 20 20 20 73 65 74 20  sts {.      set 
4160: 6e 61 6d 65 20 5b 6c 69 6e 64 65 78 20 24 70 61  name [lindex $pa
4170: 72 61 6d 73 20 30 5d 0a 20 20 20 20 20 20 72 65  rams 0].      re
4180: 74 75 72 6e 20 5b 69 6e 66 6f 20 65 78 69 73 74  turn [info exist
4190: 73 20 67 72 61 70 68 28 24 67 2c 65 6c 65 6d 2d  s graph($g,elem-
41a0: 24 6e 61 6d 65 2c 6c 61 62 65 6c 29 5d 0a 20 20  $name,label)].  
41b0: 20 20 7d 0a 20 20 20 20 6e 61 6d 65 73 20 7b 0a    }.    names {.
41c0: 20 20 20 20 20 20 69 66 20 7b 24 70 61 72 61 6d        if {$param
41d0: 73 20 3d 3d 20 7b 7d 7d 20 7b 20 73 65 74 20 70  s == {}} { set p
41e0: 61 72 61 6d 73 20 2a 20 7d 0a 20 20 20 20 20 20  arams * }.      
41f0: 72 65 74 75 72 6e 20 5b 6f 62 6a 5f 6e 61 6d 65  return [obj_name
4200: 73 20 24 67 2c 5f 65 6c 65 6d 65 6e 74 73 20 24  s $g,_elements $
4210: 70 61 72 61 6d 73 5d 0a 20 20 20 20 7d 0a 20 20  params].    }.  
4220: 20 20 74 79 70 65 20 7b 0a 20 20 20 20 20 20 73    type {.      s
4230: 65 74 20 6e 61 6d 65 20 5b 6c 69 6e 64 65 78 20  et name [lindex 
4240: 24 70 61 72 61 6d 73 20 30 5d 0a 20 20 20 20 20  $params 0].     
4250: 20 72 65 74 75 72 6e 20 24 67 72 61 70 68 28 24   return $graph($
4260: 67 2c 65 6c 65 6d 2d 24 6e 61 6d 65 2c 74 79 70  g,elem-$name,typ
4270: 65 29 0a 20 20 20 20 7d 0a 20 20 20 20 62 61 72  e).    }.    bar
4280: 64 61 74 61 20 7b 0a 20 20 20 20 20 20 73 65 74  data {.      set
4290: 20 76 61 6c 75 65 73 20 5b 6c 69 6e 64 65 78 20   values [lindex 
42a0: 24 70 61 72 61 6d 73 20 30 5d 0a 20 20 20 20 20  $params 0].     
42b0: 20 73 65 74 20 6d 69 6e 20 20 20 20 5b 6c 69 6e   set min    [lin
42c0: 64 65 78 20 24 70 61 72 61 6d 73 20 31 5d 0a 20  dex $params 1]. 
42d0: 20 20 20 20 20 73 65 74 20 6d 61 78 20 20 20 20       set max    
42e0: 5b 6c 69 6e 64 65 78 20 24 70 61 72 61 6d 73 20  [lindex $params 
42f0: 32 5d 0a 20 20 20 20 20 20 73 65 74 20 63 6c 63  2].      set clc
4300: 6e 74 20 20 5b 6c 69 6e 64 65 78 20 24 70 61 72  nt  [lindex $par
4310: 61 6d 73 20 33 5d 0a 20 20 20 20 20 20 73 65 74  ams 3].      set
4320: 20 73 63 61 6c 65 20 20 5b 6c 69 6e 64 65 78 20   scale  [lindex 
4330: 24 70 61 72 61 6d 73 20 34 5d 0a 20 20 20 20 20  $params 4].     
4340: 20 72 65 74 75 72 6e 20 5b 64 61 74 61 5f 74 6f   return [data_to
4350: 5f 62 61 72 5f 76 61 6c 75 65 73 20 24 76 61 6c  _bar_values $val
4360: 75 65 73 20 24 6d 69 6e 20 24 6d 61 78 20 24 63  ues $min $max $c
4370: 6c 63 6e 74 20 24 73 63 61 6c 65 5d 0a 20 20 20  lcnt $scale].   
4380: 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 20 7b   }.    default {
4390: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 63  .      return -c
43a0: 6f 64 65 20 65 72 72 6f 72 20 22 75 6e 6b 6e 6f  ode error "unkno
43b0: 77 6e 20 6f 70 65 72 61 74 69 6f 6e 20 5c 22 24  wn operation \"$
43c0: 6f 70 65 72 61 74 69 6f 6e 5c 22 22 0a 20 20 20  operation\"".   
43d0: 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a 70 72 6f 63 20   }.  }.}...proc 
43e0: 67 72 61 70 68 3a 3a 69 73 5f 76 61 72 5f 72 65  graph::is_var_re
43f0: 66 20 7b 20 76 61 72 6e 61 6d 65 20 7d 20 7b 0a  f { varname } {.
4400: 20 20 75 70 76 61 72 20 24 76 61 72 6e 61 6d 65    upvar $varname
4410: 20 76 61 72 0a 20 20 69 66 20 7b 5b 6c 6c 65 6e   var.  if {[llen
4420: 67 74 68 20 24 76 61 72 5d 20 3d 3d 20 31 20 26  gth $var] == 1 &
4430: 26 0a 20 20 20 20 20 20 5b 72 65 67 65 78 70 20  &.      [regexp 
4440: 7b 5e 5b 61 2d 7a 41 2d 5a 5f 5d 7d 20 24 76 61  {^[a-zA-Z_]} $va
4450: 72 5d 20 26 26 0a 20 20 20 20 20 20 5b 69 6e 66  r] &&.      [inf
4460: 6f 20 65 78 69 73 74 73 20 3a 3a 24 76 61 72 5d  o exists ::$var]
4470: 7d 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 79  } {.    return y
4480: 65 73 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  es.  }.  return 
4490: 6e 6f 0a 7d 0a 0a 0a 70 72 6f 63 20 67 72 61 70  no.}...proc grap
44a0: 68 3a 3a 65 6c 65 6d 5f 63 61 6c 63 20 7b 20 67  h::elem_calc { g
44b0: 20 6e 61 6d 65 20 7d 20 7b 0a 20 20 76 61 72 69   name } {.  vari
44c0: 61 62 6c 65 20 67 72 61 70 68 0a 0a 20 20 73 65  able graph..  se
44d0: 74 20 69 6e 64 65 78 20 24 67 2c 65 6c 65 6d 2d  t index $g,elem-
44e0: 24 6e 61 6d 65 0a 20 20 73 65 74 20 78 5f 6d 69  $name.  set x_mi
44f0: 6e 20 31 65 33 30 30 0a 20 20 73 65 74 20 78 5f  n 1e300.  set x_
4500: 6d 61 78 20 2d 31 65 33 30 30 0a 20 20 73 65 74  max -1e300.  set
4510: 20 79 5f 6d 69 6e 20 31 65 33 30 30 0a 20 20 73   y_min 1e300.  s
4520: 65 74 20 79 5f 6d 61 78 20 2d 31 65 33 30 30 0a  et y_max -1e300.
4530: 20 20 69 66 20 7b 24 67 72 61 70 68 28 24 69 6e    if {$graph($in
4540: 64 65 78 2c 64 61 74 61 29 20 21 3d 20 7b 7d 7d  dex,data) != {}}
4550: 20 7b 0a 20 20 20 20 69 66 20 7b 5b 69 73 5f 76   {.    if {[is_v
4560: 61 72 5f 72 65 66 20 67 72 61 70 68 28 24 69 6e  ar_ref graph($in
4570: 64 65 78 2c 64 61 74 61 29 5d 7d 20 7b 0a 20 20  dex,data)]} {.  
4580: 20 20 20 20 75 70 76 61 72 20 23 30 20 24 67 72      upvar #0 $gr
4590: 61 70 68 28 24 69 6e 64 65 78 2c 64 61 74 61 29  aph($index,data)
45a0: 20 78 79 64 61 74 61 0a 20 20 20 20 7d 20 65 6c   xydata.    } el
45b0: 73 65 20 7b 0a 20 20 20 20 20 20 75 70 76 61 72  se {.      upvar
45c0: 20 30 20 67 72 61 70 68 28 24 69 6e 64 65 78 2c   0 graph($index,
45d0: 64 61 74 61 29 20 78 79 64 61 74 61 0a 20 20 20  data) xydata.   
45e0: 20 7d 0a 20 20 20 20 66 6f 72 65 61 63 68 20 7b   }.    foreach {
45f0: 78 20 79 7d 20 24 78 79 64 61 74 61 20 7b 0a 20  x y} $xydata {. 
4600: 20 20 20 20 20 69 66 20 7b 24 78 20 3e 20 24 78       if {$x > $x
4610: 5f 6d 61 78 7d 20 7b 20 73 65 74 20 78 5f 6d 61  _max} { set x_ma
4620: 78 20 24 78 20 7d 0a 20 20 20 20 20 20 69 66 20  x $x }.      if 
4630: 7b 24 78 20 3c 20 24 78 5f 6d 69 6e 7d 20 7b 20  {$x < $x_min} { 
4640: 73 65 74 20 78 5f 6d 69 6e 20 24 78 20 7d 0a 20  set x_min $x }. 
4650: 20 20 20 20 20 69 66 20 7b 24 79 20 3e 20 24 79       if {$y > $y
4660: 5f 6d 61 78 7d 20 7b 20 73 65 74 20 79 5f 6d 61  _max} { set y_ma
4670: 78 20 24 79 20 7d 0a 20 20 20 20 20 20 69 66 20  x $y }.      if 
4680: 7b 24 79 20 3c 20 24 79 5f 6d 69 6e 7d 20 7b 20  {$y < $y_min} { 
4690: 73 65 74 20 79 5f 6d 69 6e 20 24 79 20 7d 0a 20  set y_min $y }. 
46a0: 20 20 20 7d 0a 20 20 7d 20 65 6c 73 65 20 7b 0a     }.  } else {.
46b0: 20 20 20 20 69 66 20 7b 5b 69 73 5f 76 61 72 5f      if {[is_var_
46c0: 72 65 66 20 67 72 61 70 68 28 24 69 6e 64 65 78  ref graph($index
46d0: 2c 78 64 61 74 61 29 5d 7d 20 7b 0a 20 20 20 20  ,xdata)]} {.    
46e0: 20 20 75 70 76 61 72 20 23 30 20 24 67 72 61 70    upvar #0 $grap
46f0: 68 28 24 69 6e 64 65 78 2c 78 64 61 74 61 29 20  h($index,xdata) 
4700: 78 64 61 74 61 0a 20 20 20 20 7d 20 65 6c 73 65  xdata.    } else
4710: 20 7b 0a 20 20 20 20 20 20 75 70 76 61 72 20 30   {.      upvar 0
4720: 20 67 72 61 70 68 28 24 69 6e 64 65 78 2c 78 64   graph($index,xd
4730: 61 74 61 29 20 78 64 61 74 61 0a 20 20 20 20 7d  ata) xdata.    }
4740: 0a 20 20 20 20 69 66 20 7b 24 78 64 61 74 61 20  .    if {$xdata 
4750: 21 3d 20 7b 7d 7d 20 7b 0a 20 20 20 20 20 20 66  != {}} {.      f
4760: 6f 72 65 61 63 68 20 78 20 24 78 64 61 74 61 20  oreach x $xdata 
4770: 7b 0a 09 69 66 20 7b 24 78 20 3e 20 24 78 5f 6d  {..if {$x > $x_m
4780: 61 78 7d 20 7b 20 73 65 74 20 78 5f 6d 61 78 20  ax} { set x_max 
4790: 24 78 20 7d 0a 09 69 66 20 7b 24 78 20 3c 20 24  $x }..if {$x < $
47a0: 78 5f 6d 69 6e 7d 20 7b 20 73 65 74 20 78 5f 6d  x_min} { set x_m
47b0: 69 6e 20 24 78 20 7d 0a 20 20 20 20 20 20 7d 0a  in $x }.      }.
47c0: 20 20 20 20 7d 0a 20 20 20 20 69 66 20 7b 5b 69      }.    if {[i
47d0: 73 5f 76 61 72 5f 72 65 66 20 67 72 61 70 68 28  s_var_ref graph(
47e0: 24 69 6e 64 65 78 2c 79 64 61 74 61 29 5d 7d 20  $index,ydata)]} 
47f0: 7b 0a 20 20 20 20 20 20 75 70 76 61 72 20 23 30  {.      upvar #0
4800: 20 24 67 72 61 70 68 28 24 69 6e 64 65 78 2c 79   $graph($index,y
4810: 64 61 74 61 29 20 79 64 61 74 61 0a 20 20 20 20  data) ydata.    
4820: 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 75  } else {.      u
4830: 70 76 61 72 20 30 20 67 72 61 70 68 28 24 69 6e  pvar 0 graph($in
4840: 64 65 78 2c 79 64 61 74 61 29 20 79 64 61 74 61  dex,ydata) ydata
4850: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 7b 24  .    }.    if {$
4860: 79 64 61 74 61 20 21 3d 20 7b 7d 7d 20 7b 0a 20  ydata != {}} {. 
4870: 20 20 20 20 20 66 6f 72 65 61 63 68 20 79 20 24       foreach y $
4880: 79 64 61 74 61 20 7b 0a 09 69 66 20 7b 24 79 20  ydata {..if {$y 
4890: 3e 20 24 79 5f 6d 61 78 7d 20 7b 20 73 65 74 20  > $y_max} { set 
48a0: 79 5f 6d 61 78 20 24 79 20 7d 0a 09 69 66 20 7b  y_max $y }..if {
48b0: 24 79 20 3c 20 24 79 5f 6d 69 6e 7d 20 7b 20 73  $y < $y_min} { s
48c0: 65 74 20 79 5f 6d 69 6e 20 24 79 20 7d 0a 20 20  et y_min $y }.  
48d0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
48e0: 20 20 69 66 20 7b 24 78 5f 6d 69 6e 20 3e 20 24    if {$x_min > $
48f0: 78 5f 6d 61 78 7d 20 7b 0a 20 20 20 20 73 65 74  x_max} {.    set
4900: 20 67 72 61 70 68 28 24 69 6e 64 65 78 2c 5f 78   graph($index,_x
4910: 6d 69 6e 29 20 30 2e 30 0a 20 20 20 20 73 65 74  min) 0.0.    set
4920: 20 67 72 61 70 68 28 24 69 6e 64 65 78 2c 5f 78   graph($index,_x
4930: 6d 61 78 29 20 31 2e 30 0a 20 20 7d 20 65 6c 73  max) 1.0.  } els
4940: 65 20 7b 0a 20 20 20 20 73 65 74 20 67 72 61 70  e {.    set grap
4950: 68 28 24 69 6e 64 65 78 2c 5f 78 6d 69 6e 29 20  h($index,_xmin) 
4960: 24 78 5f 6d 69 6e 0a 20 20 20 20 73 65 74 20 67  $x_min.    set g
4970: 72 61 70 68 28 24 69 6e 64 65 78 2c 5f 78 6d 61  raph($index,_xma
4980: 78 29 20 24 78 5f 6d 61 78 0a 20 20 7d 0a 20 20  x) $x_max.  }.  
4990: 69 66 20 7b 24 79 5f 6d 69 6e 20 3e 20 24 79 5f  if {$y_min > $y_
49a0: 6d 61 78 7d 20 7b 0a 20 20 20 20 73 65 74 20 67  max} {.    set g
49b0: 72 61 70 68 28 24 69 6e 64 65 78 2c 5f 79 6d 69  raph($index,_ymi
49c0: 6e 29 20 30 2e 30 0a 20 20 20 20 73 65 74 20 67  n) 0.0.    set g
49d0: 72 61 70 68 28 24 69 6e 64 65 78 2c 5f 79 6d 61  raph($index,_yma
49e0: 78 29 20 31 2e 30 0a 20 20 7d 20 65 6c 73 65 20  x) 1.0.  } else 
49f0: 7b 0a 20 20 20 20 73 65 74 20 67 72 61 70 68 28  {.    set graph(
4a00: 24 69 6e 64 65 78 2c 5f 79 6d 69 6e 29 20 24 79  $index,_ymin) $y
4a10: 5f 6d 69 6e 0a 20 20 20 20 73 65 74 20 67 72 61  _min.    set gra
4a20: 70 68 28 24 69 6e 64 65 78 2c 5f 79 6d 61 78 29  ph($index,_ymax)
4a30: 20 24 79 5f 6d 61 78 0a 20 20 7d 0a 20 20 69 66   $y_max.  }.  if
4a40: 20 7b 24 67 72 61 70 68 28 24 69 6e 64 65 78 2c   {$graph($index,
4a50: 6c 61 62 65 6c 29 20 3d 3d 20 22 22 7d 20 7b 0a  label) == ""} {.
4a60: 20 20 20 20 73 65 74 20 67 72 61 70 68 28 24 69      set graph($i
4a70: 6e 64 65 78 2c 5f 74 69 74 6c 65 29 20 24 6e 61  ndex,_title) $na
4a80: 6d 65 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  me.  } else {.  
4a90: 20 20 73 65 74 20 67 72 61 70 68 28 24 69 6e 64    set graph($ind
4aa0: 65 78 2c 5f 74 69 74 6c 65 29 20 24 67 72 61 70  ex,_title) $grap
4ab0: 68 28 24 69 6e 64 65 78 2c 6c 61 62 65 6c 29 0a  h($index,label).
4ac0: 20 20 7d 0a 20 20 73 65 74 20 67 72 61 70 68 28    }.  set graph(
4ad0: 24 69 6e 64 65 78 2c 5f 76 61 6c 69 64 29 20 79  $index,_valid) y
4ae0: 65 73 0a 7d 0a 0a 0a 70 72 6f 63 20 67 72 61 70  es.}...proc grap
4af0: 68 3a 3a 65 6c 65 6d 5f 64 72 61 77 20 7b 20 67  h::elem_draw { g
4b00: 20 65 6c 65 6d 20 78 6c 5f 67 72 61 70 68 20 79   elem xl_graph y
4b10: 74 5f 67 72 61 70 68 20 78 72 5f 67 72 61 70 68  t_graph xr_graph
4b20: 20 79 62 5f 67 72 61 70 68 20 7d 20 7b 0a 20 20   yb_graph } {.  
4b30: 76 61 72 69 61 62 6c 65 20 67 72 61 70 68 0a 0a  variable graph..
4b40: 20 20 73 65 74 20 69 6e 64 65 78 20 24 67 2c 65    set index $g,e
4b50: 6c 65 6d 2d 24 65 6c 65 6d 0a 0a 20 20 73 65 74  lem-$elem..  set
4b60: 20 6d 61 70 78 20 24 67 72 61 70 68 28 24 69 6e   mapx $graph($in
4b70: 64 65 78 2c 6d 61 70 78 29 0a 20 20 73 65 74 20  dex,mapx).  set 
4b80: 6d 61 70 79 20 24 67 72 61 70 68 28 24 69 6e 64  mapy $graph($ind
4b90: 65 78 2c 6d 61 70 79 29 0a 0a 20 20 73 65 74 20  ex,mapy)..  set 
4ba0: 78 5f 6d 69 6e 20 24 67 72 61 70 68 28 24 67 2c  x_min $graph($g,
4bb0: 61 78 69 73 2d 24 6d 61 70 78 2c 5f 6d 69 6e 29  axis-$mapx,_min)
4bc0: 0a 20 20 73 65 74 20 78 5f 6d 61 78 20 24 67 72  .  set x_max $gr
4bd0: 61 70 68 28 24 67 2c 61 78 69 73 2d 24 6d 61 70  aph($g,axis-$map
4be0: 78 2c 5f 6d 61 78 29 0a 20 20 73 65 74 20 78 5f  x,_max).  set x_
4bf0: 6c 6f 67 20 24 67 72 61 70 68 28 24 67 2c 61 78  log $graph($g,ax
4c00: 69 73 2d 24 6d 61 70 78 2c 6c 6f 67 73 63 61 6c  is-$mapx,logscal
4c10: 65 29 0a 20 20 73 65 74 20 79 5f 6d 69 6e 20 24  e).  set y_min $
4c20: 67 72 61 70 68 28 24 67 2c 61 78 69 73 2d 24 6d  graph($g,axis-$m
4c30: 61 70 79 2c 5f 6d 69 6e 29 0a 20 20 73 65 74 20  apy,_min).  set 
4c40: 79 5f 6d 61 78 20 24 67 72 61 70 68 28 24 67 2c  y_max $graph($g,
4c50: 61 78 69 73 2d 24 6d 61 70 79 2c 5f 6d 61 78 29  axis-$mapy,_max)
4c60: 0a 20 20 73 65 74 20 79 5f 6c 6f 67 20 24 67 72  .  set y_log $gr
4c70: 61 70 68 28 24 67 2c 61 78 69 73 2d 24 6d 61 70  aph($g,axis-$map
4c80: 79 2c 6c 6f 67 73 63 61 6c 65 29 0a 0a 20 20 73  y,logscale)..  s
4c90: 65 74 20 74 79 70 65 20 20 20 20 20 20 24 67 72  et type      $gr
4ca0: 61 70 68 28 24 69 6e 64 65 78 2c 74 79 70 65 29  aph($index,type)
4cb0: 0a 20 20 73 65 74 20 6c 69 6e 65 77 69 64 74 68  .  set linewidth
4cc0: 20 24 67 72 61 70 68 28 24 69 6e 64 65 78 2c 6c   $graph($index,l
4cd0: 69 6e 65 77 69 64 74 68 29 0a 20 20 73 65 74 20  inewidth).  set 
4ce0: 73 79 6d 62 6f 6c 20 20 20 20 24 67 72 61 70 68  symbol    $graph
4cf0: 28 24 69 6e 64 65 78 2c 73 79 6d 62 6f 6c 29 0a  ($index,symbol).
4d00: 20 20 73 65 74 20 73 79 6d 62 6f 6c 63 6d 64 20    set symbolcmd 
4d10: 24 67 72 61 70 68 28 24 69 6e 64 65 78 2c 73 79  $graph($index,sy
4d20: 6d 62 6f 6c 63 6f 6d 6d 61 6e 64 29 0a 20 20 73  mbolcommand).  s
4d30: 65 74 20 63 6f 6c 6f 72 20 20 20 20 20 24 67 72  et color     $gr
4d40: 61 70 68 28 24 69 6e 64 65 78 2c 63 6f 6c 6f 72  aph($index,color
4d50: 29 0a 20 20 73 65 74 20 6f 75 74 6c 63 6f 6c 6f  ).  set outlcolo
4d60: 72 20 24 67 72 61 70 68 28 24 69 6e 64 65 78 2c  r $graph($index,
4d70: 6f 75 74 6c 69 6e 65 29 0a 20 20 73 65 74 20 6f  outline).  set o
4d80: 75 74 6c 77 69 64 74 68 20 24 67 72 61 70 68 28  utlwidth $graph(
4d90: 24 69 6e 64 65 78 2c 6f 75 74 6c 69 6e 65 77 69  $index,outlinewi
4da0: 64 74 68 29 0a 20 20 73 65 74 20 66 69 6c 6c 63  dth).  set fillc
4db0: 6f 6c 6f 72 20 24 67 72 61 70 68 28 24 69 6e 64  olor $graph($ind
4dc0: 65 78 2c 66 69 6c 6c 29 0a 20 20 73 65 74 20 64  ex,fill).  set d
4dd0: 61 73 68 65 73 20 20 20 20 24 67 72 61 70 68 28  ashes    $graph(
4de0: 24 69 6e 64 65 78 2c 64 61 73 68 65 73 29 0a 20  $index,dashes). 
4df0: 20 73 65 74 20 73 6d 6f 6f 74 68 20 20 20 20 24   set smooth    $
4e00: 67 72 61 70 68 28 24 69 6e 64 65 78 2c 73 6d 6f  graph($index,smo
4e10: 6f 74 68 29 0a 20 20 73 65 74 20 73 79 6d 73 69  oth).  set symsi
4e20: 7a 65 20 20 20 24 67 72 61 70 68 28 24 69 6e 64  ze   $graph($ind
4e30: 65 78 2c 70 69 78 65 6c 73 29 0a 20 20 73 65 74  ex,pixels).  set
4e40: 20 73 79 6d 73 69 7a 65 5f 32 20 5b 65 78 70 72   symsize_2 [expr
4e50: 20 7b 24 73 79 6d 73 69 7a 65 20 2f 20 32 2e 30   {$symsize / 2.0
4e60: 7d 5d 0a 0a 20 20 73 65 74 20 78 5f 70 6f 69 6e  }]..  set x_poin
4e70: 74 73 20 7b 7d 0a 20 20 73 65 74 20 79 5f 70 6f  ts {}.  set y_po
4e80: 69 6e 74 73 20 7b 7d 0a 0a 20 20 69 66 20 7b 24  ints {}..  if {$
4e90: 67 72 61 70 68 28 24 69 6e 64 65 78 2c 64 61 74  graph($index,dat
4ea0: 61 29 20 21 3d 20 7b 7d 7d 20 7b 0a 20 20 20 20  a) != {}} {.    
4eb0: 69 66 20 7b 5b 69 73 5f 76 61 72 5f 72 65 66 20  if {[is_var_ref 
4ec0: 67 72 61 70 68 28 24 69 6e 64 65 78 2c 64 61 74  graph($index,dat
4ed0: 61 29 5d 7d 20 7b 0a 20 20 20 20 20 20 75 70 76  a)]} {.      upv
4ee0: 61 72 20 23 30 20 24 67 72 61 70 68 28 24 69 6e  ar #0 $graph($in
4ef0: 64 65 78 2c 64 61 74 61 29 20 78 79 64 61 74 61  dex,data) xydata
4f00: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  .    } else {.  
4f10: 20 20 20 20 75 70 76 61 72 20 30 20 67 72 61 70      upvar 0 grap
4f20: 68 28 24 69 6e 64 65 78 2c 64 61 74 61 29 20 78  h($index,data) x
4f30: 79 64 61 74 61 0a 20 20 20 20 7d 0a 20 20 20 20  ydata.    }.    
4f40: 73 65 74 20 63 6f 75 6e 74 20 30 0a 20 20 20 20  set count 0.    
4f50: 66 6f 72 65 61 63 68 20 7b 78 20 79 7d 20 24 78  foreach {x y} $x
4f60: 79 64 61 74 61 20 7b 0a 20 20 20 20 20 20 6c 61  ydata {.      la
4f70: 70 70 65 6e 64 20 78 5f 70 6f 69 6e 74 73 20 5b  ppend x_points [
4f80: 74 72 61 6e 73 66 6f 72 6d 20 24 78 20 24 78 5f  transform $x $x_
4f90: 6d 69 6e 20 24 78 5f 6d 61 78 20 24 78 6c 5f 67  min $x_max $xl_g
4fa0: 72 61 70 68 20 24 78 72 5f 67 72 61 70 68 20 24  raph $xr_graph $
4fb0: 78 5f 6c 6f 67 5d 0a 20 20 20 20 20 20 6c 61 70  x_log].      lap
4fc0: 70 65 6e 64 20 79 5f 70 6f 69 6e 74 73 20 5b 74  pend y_points [t
4fd0: 72 61 6e 73 66 6f 72 6d 20 24 79 20 24 79 5f 6d  ransform $y $y_m
4fe0: 69 6e 20 24 79 5f 6d 61 78 20 24 79 62 5f 67 72  in $y_max $yb_gr
4ff0: 61 70 68 20 24 79 74 5f 67 72 61 70 68 20 24 79  aph $yt_graph $y
5000: 5f 6c 6f 67 5d 0a 20 20 20 20 20 20 69 6e 63 72  _log].      incr
5010: 20 63 6f 75 6e 74 0a 20 20 20 20 7d 0a 20 20 7d   count.    }.  }
5020: 20 65 6c 73 65 20 7b 0a 20 20 20 20 69 66 20 7b   else {.    if {
5030: 5b 69 73 5f 76 61 72 5f 72 65 66 20 67 72 61 70  [is_var_ref grap
5040: 68 28 24 69 6e 64 65 78 2c 78 64 61 74 61 29 5d  h($index,xdata)]
5050: 7d 20 7b 0a 20 20 20 20 20 20 75 70 76 61 72 20  } {.      upvar 
5060: 23 30 20 24 67 72 61 70 68 28 24 69 6e 64 65 78  #0 $graph($index
5070: 2c 78 64 61 74 61 29 20 78 64 61 74 61 0a 20 20  ,xdata) xdata.  
5080: 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
5090: 20 75 70 76 61 72 20 30 20 67 72 61 70 68 28 24   upvar 0 graph($
50a0: 69 6e 64 65 78 2c 78 64 61 74 61 29 20 78 64 61  index,xdata) xda
50b0: 74 61 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20  ta.    }.    if 
50c0: 7b 5b 69 73 5f 76 61 72 5f 72 65 66 20 67 72 61  {[is_var_ref gra
50d0: 70 68 28 24 69 6e 64 65 78 2c 79 64 61 74 61 29  ph($index,ydata)
50e0: 5d 7d 20 7b 0a 20 20 20 20 20 20 75 70 76 61 72  ]} {.      upvar
50f0: 20 23 30 20 24 67 72 61 70 68 28 24 69 6e 64 65   #0 $graph($inde
5100: 78 2c 79 64 61 74 61 29 20 79 64 61 74 61 0a 20  x,ydata) ydata. 
5110: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
5120: 20 20 75 70 76 61 72 20 30 20 67 72 61 70 68 28    upvar 0 graph(
5130: 24 69 6e 64 65 78 2c 79 64 61 74 61 29 20 79 64  $index,ydata) yd
5140: 61 74 61 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ata.    }.    if
5150: 20 7b 24 78 64 61 74 61 20 21 3d 20 7b 7d 20 26   {$xdata != {} &
5160: 26 20 24 79 64 61 74 61 20 21 3d 20 7b 7d 7d 20  & $ydata != {}} 
5170: 7b 0a 20 20 20 20 20 20 73 65 74 20 63 6f 75 6e  {.      set coun
5180: 74 20 30 0a 20 20 20 20 20 20 66 6f 72 65 61 63  t 0.      foreac
5190: 68 20 78 20 24 78 64 61 74 61 20 79 20 24 79 64  h x $xdata y $yd
51a0: 61 74 61 20 7b 0a 09 6c 61 70 70 65 6e 64 20 78  ata {..lappend x
51b0: 5f 70 6f 69 6e 74 73 20 5b 74 72 61 6e 73 66 6f  _points [transfo
51c0: 72 6d 20 24 78 20 24 78 5f 6d 69 6e 20 24 78 5f  rm $x $x_min $x_
51d0: 6d 61 78 20 24 78 6c 5f 67 72 61 70 68 20 24 78  max $xl_graph $x
51e0: 72 5f 67 72 61 70 68 20 24 78 5f 6c 6f 67 5d 0a  r_graph $x_log].
51f0: 09 6c 61 70 70 65 6e 64 20 79 5f 70 6f 69 6e 74  .lappend y_point
5200: 73 20 5b 74 72 61 6e 73 66 6f 72 6d 20 24 79 20  s [transform $y 
5210: 24 79 5f 6d 69 6e 20 24 79 5f 6d 61 78 20 24 79  $y_min $y_max $y
5220: 62 5f 67 72 61 70 68 20 24 79 74 5f 67 72 61 70  b_graph $yt_grap
5230: 68 20 24 79 5f 6c 6f 67 5d 0a 09 69 6e 63 72 20  h $y_log]..incr 
5240: 63 6f 75 6e 74 0a 20 20 20 20 20 20 7d 0a 20 20  count.      }.  
5250: 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
5260: 20 73 65 74 20 63 6f 75 6e 74 20 5b 6c 6c 65 6e   set count [llen
5270: 67 74 68 20 24 79 64 61 74 61 5d 0a 20 20 20 20  gth $ydata].    
5280: 20 20 73 65 74 20 78 20 31 0a 20 20 20 20 20 20    set x 1.      
5290: 66 6f 72 65 61 63 68 20 79 20 24 79 64 61 74 61  foreach y $ydata
52a0: 20 7b 0a 09 6c 61 70 70 65 6e 64 20 78 5f 70 6f   {..lappend x_po
52b0: 69 6e 74 73 20 5b 74 72 61 6e 73 66 6f 72 6d 20  ints [transform 
52c0: 24 78 20 31 20 20 20 20 20 20 24 63 6f 75 6e 74  $x 1      $count
52d0: 20 24 78 6c 5f 67 72 61 70 68 20 24 78 72 5f 67   $xl_graph $xr_g
52e0: 72 61 70 68 20 24 78 5f 6c 6f 67 5d 0a 09 6c 61  raph $x_log]..la
52f0: 70 70 65 6e 64 20 79 5f 70 6f 69 6e 74 73 20 5b  ppend y_points [
5300: 74 72 61 6e 73 66 6f 72 6d 20 24 79 20 24 79 5f  transform $y $y_
5310: 6d 69 6e 20 24 79 5f 6d 61 78 20 24 79 62 5f 67  min $y_max $yb_g
5320: 72 61 70 68 20 24 79 74 5f 67 72 61 70 68 20 24  raph $yt_graph $
5330: 79 5f 6c 6f 67 5d 0a 09 69 6e 63 72 20 78 0a 20  y_log]..incr x. 
5340: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
5350: 0a 20 20 69 66 20 7b 24 63 6f 75 6e 74 20 3d 3d  .  if {$count ==
5360: 20 30 7d 20 72 65 74 75 72 6e 0a 0a 20 20 69 66   0} return..  if
5370: 20 7b 24 74 79 70 65 20 3d 3d 20 22 62 61 72 22   {$type == "bar"
5380: 7d 20 7b 0a 20 20 20 20 53 65 74 43 6f 6c 6f 72  } {.    SetColor
5390: 20 24 67 20 20 20 20 20 24 63 6f 6c 6f 72 0a 20   $g     $color. 
53a0: 20 20 20 53 65 74 4c 69 6e 65 77 69 64 74 68 20     SetLinewidth 
53b0: 24 67 20 24 6c 69 6e 65 77 69 64 74 68 0a 0a 20  $g $linewidth.. 
53c0: 20 20 20 73 65 74 20 72 65 6c 20 24 67 72 61 70     set rel $grap
53d0: 68 28 24 69 6e 64 65 78 2c 72 65 6c 69 65 66 29  h($index,relief)
53e0: 0a 20 20 20 20 73 65 74 20 62 61 77 20 24 67 72  .    set baw $gr
53f0: 61 70 68 28 24 69 6e 64 65 78 2c 62 61 72 77 69  aph($index,barwi
5400: 64 74 68 29 0a 20 20 20 20 73 65 74 20 63 6d 64  dth).    set cmd
5410: 20 24 67 72 61 70 68 28 24 69 6e 64 65 78 2c 62   $graph($index,b
5420: 61 72 63 6f 6d 6d 61 6e 64 29 0a 20 20 20 20 73  arcommand).    s
5430: 65 74 20 62 64 77 20 24 67 72 61 70 68 28 24 69  et bdw $graph($i
5440: 6e 64 65 78 2c 62 6f 72 64 65 72 77 69 64 74 68  ndex,borderwidth
5450: 29 0a 20 20 20 20 73 65 74 20 64 78 20 20 5b 65  ).    set dx  [e
5460: 78 70 72 20 7b 24 62 61 77 20 2a 20 28 24 78 72  xpr {$baw * ($xr
5470: 5f 67 72 61 70 68 20 2d 20 24 78 6c 5f 67 72 61  _graph - $xl_gra
5480: 70 68 29 20 2f 20 28 24 63 6f 75 6e 74 20 2b 31  ph) / ($count +1
5490: 29 7d 5d 0a 20 20 20 20 73 65 74 20 64 78 32 20  )}].    set dx2 
54a0: 5b 65 78 70 72 20 7b 24 64 78 20 2f 20 32 2e 30  [expr {$dx / 2.0
54b0: 7d 5d 0a 20 20 20 20 73 65 74 20 79 30 20 20 5b  }].    set y0  [
54c0: 74 72 61 6e 73 66 6f 72 6d 20 30 20 24 79 5f 6d  transform 0 $y_m
54d0: 69 6e 20 24 79 5f 6d 61 78 20 24 79 62 5f 67 72  in $y_max $yb_gr
54e0: 61 70 68 20 24 79 74 5f 67 72 61 70 68 5d 0a 20  aph $yt_graph]. 
54f0: 20 20 20 73 65 74 20 69 64 78 20 30 0a 20 20 20     set idx 0.   
5500: 20 66 6f 72 65 61 63 68 20 78 20 24 78 5f 70 6f   foreach x $x_po
5510: 69 6e 74 73 20 79 20 24 79 5f 70 6f 69 6e 74 73  ints y $y_points
5520: 20 7b 0a 20 20 20 20 20 20 73 65 74 20 78 6c 20   {.      set xl 
5530: 5b 65 78 70 72 20 7b 24 78 20 2d 20 24 64 78 32  [expr {$x - $dx2
5540: 7d 5d 0a 20 20 20 20 20 20 73 65 74 20 78 72 20  }].      set xr 
5550: 5b 65 78 70 72 20 7b 24 78 20 2b 20 24 64 78 32  [expr {$x + $dx2
5560: 7d 5d 0a 20 20 20 20 20 20 69 66 20 7b 24 79 20  }].      if {$y 
5570: 3e 3d 20 24 79 30 7d 20 7b 0a 09 73 65 74 20 79  >= $y0} {..set y
5580: 74 20 24 79 0a 09 73 65 74 20 79 62 20 24 79 30  t $y..set yb $y0
5590: 0a 09 69 66 20 7b 24 79 74 20 2d 20 24 79 62 20  ..if {$yt - $yb 
55a0: 3c 20 32 20 2a 20 24 62 64 77 7d 20 7b 0a 09 20  < 2 * $bdw} {.. 
55b0: 20 73 65 74 20 79 74 20 5b 65 78 70 72 20 7b 24   set yt [expr {$
55c0: 79 62 20 2b 20 32 20 2a 20 24 62 64 77 7d 5d 0a  yb + 2 * $bdw}].
55d0: 09 7d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20  .}.      } else 
55e0: 7b 0a 09 73 65 74 20 79 74 20 24 79 30 0a 09 73  {..set yt $y0..s
55f0: 65 74 20 79 62 20 24 79 0a 09 69 66 20 7b 24 79  et yb $y..if {$y
5600: 74 20 2d 20 24 79 62 20 3c 20 32 20 2a 20 24 62  t - $yb < 2 * $b
5610: 64 77 7d 20 7b 0a 09 20 20 73 65 74 20 79 62 20  dw} {..  set yb 
5620: 5b 65 78 70 72 20 7b 24 79 62 20 2d 20 32 20 2a  [expr {$yb - 2 *
5630: 20 24 62 64 77 7d 5d 0a 09 7d 0a 20 20 20 20 20   $bdw}]..}.     
5640: 20 7d 0a 20 20 20 20 20 20 69 66 20 7b 24 63 6d   }.      if {$cm
5650: 64 20 21 3d 20 7b 7d 7d 20 7b 0a 09 24 63 6d 64  d != {}} {..$cmd
5660: 20 24 69 64 78 20 5b 6c 69 6e 64 65 78 20 24 79   $idx [lindex $y
5670: 64 61 74 61 20 24 69 64 78 5d 20 24 78 6c 20 24  data $idx] $xl $
5680: 79 74 20 24 78 72 20 24 79 62 20 24 66 69 6c 6c  yt $xr $yb $fill
5690: 63 6f 6c 6f 72 20 24 72 65 6c 20 24 62 64 77 0a  color $rel $bdw.
56a0: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09        } else {..
56b0: 52 65 63 74 20 24 67 20 24 78 6c 20 24 79 74 20  Rect $g $xl $yt 
56c0: 24 78 72 20 24 79 62 20 24 66 69 6c 6c 63 6f 6c  $xr $yb $fillcol
56d0: 6f 72 0a 09 64 72 61 77 5f 66 72 61 6d 65 20 24  or..draw_frame $
56e0: 67 20 24 78 6c 20 24 79 74 20 24 78 72 20 24 79  g $xl $yt $xr $y
56f0: 62 20 24 66 69 6c 6c 63 6f 6c 6f 72 20 24 72 65  b $fillcolor $re
5700: 6c 20 24 62 64 77 0a 20 20 20 20 20 20 7d 0a 20  l $bdw.      }. 
5710: 20 20 20 20 20 69 6e 63 72 20 69 64 78 0a 20 20       incr idx.  
5720: 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 0a 20    }.    return. 
5730: 20 7d 0a 0a 20 20 69 66 20 7b 24 74 79 70 65 20   }..  if {$type 
5740: 3d 3d 20 22 6c 69 6e 65 22 7d 20 7b 0a 20 20 20  == "line"} {.   
5750: 20 53 65 74 43 6f 6c 6f 72 20 24 67 20 20 20 20   SetColor $g    
5760: 20 24 63 6f 6c 6f 72 0a 20 20 20 20 53 65 74 4c   $color.    SetL
5770: 69 6e 65 77 69 64 74 68 20 24 67 20 24 6c 69 6e  inewidth $g $lin
5780: 65 77 69 64 74 68 0a 20 20 20 20 53 65 74 44 61  ewidth.    SetDa
5790: 73 68 20 24 67 20 20 20 20 20 20 24 64 61 73 68  sh $g      $dash
57a0: 65 73 0a 0a 20 20 20 20 69 66 20 7b 24 6c 69 6e  es..    if {$lin
57b0: 65 77 69 64 74 68 20 21 3d 20 7b 7d 20 26 26 20  ewidth != {} && 
57c0: 24 6c 69 6e 65 77 69 64 74 68 20 3e 20 30 2e 30  $linewidth > 0.0
57d0: 7d 20 7b 0a 20 20 20 20 20 20 73 77 69 74 63 68  } {.      switch
57e0: 20 24 73 6d 6f 6f 74 68 20 7b 0a 09 73 74 65 70   $smooth {..step
57f0: 20 7b 0a 09 20 20 73 65 74 20 78 5f 70 6f 69 6e   {..  set x_poin
5800: 74 73 32 20 7b 7d 0a 09 20 20 73 65 74 20 79 5f  ts2 {}..  set y_
5810: 70 6f 69 6e 74 73 32 20 7b 7d 0a 09 20 20 73 65  points2 {}..  se
5820: 74 20 6c 61 73 74 5f 79 20 7b 7d 0a 09 20 20 66  t last_y {}..  f
5830: 6f 72 65 61 63 68 20 78 20 24 78 5f 70 6f 69 6e  oreach x $x_poin
5840: 74 73 20 79 20 24 79 5f 70 6f 69 6e 74 73 20 7b  ts y $y_points {
5850: 0a 09 20 20 20 20 69 66 20 7b 24 6c 61 73 74 5f  ..    if {$last_
5860: 79 20 21 3d 20 7b 7d 7d 20 7b 0a 09 20 20 20 20  y != {}} {..    
5870: 20 20 6c 61 70 70 65 6e 64 20 78 5f 70 6f 69 6e    lappend x_poin
5880: 74 73 32 20 24 78 0a 09 20 20 20 20 20 20 6c 61  ts2 $x..      la
5890: 70 70 65 6e 64 20 79 5f 70 6f 69 6e 74 73 32 20  ppend y_points2 
58a0: 24 6c 61 73 74 5f 79 0a 09 20 20 20 20 7d 0a 09  $last_y..    }..
58b0: 20 20 20 20 6c 61 70 70 65 6e 64 20 78 5f 70 6f      lappend x_po
58c0: 69 6e 74 73 32 20 24 78 0a 09 20 20 20 20 6c 61  ints2 $x..    la
58d0: 70 70 65 6e 64 20 79 5f 70 6f 69 6e 74 73 32 20  ppend y_points2 
58e0: 24 79 0a 09 20 20 20 20 73 65 74 20 6c 61 73 74  $y..    set last
58f0: 5f 79 20 24 79 0a 09 20 20 7d 0a 09 20 20 50 6f  _y $y..  }..  Po
5900: 6c 79 4f 62 6a 65 63 74 20 24 67 20 5b 6c 69 73  lyObject $g [lis
5910: 74 20 24 78 5f 70 6f 69 6e 74 73 32 20 24 79 5f  t $x_points2 $y_
5920: 70 6f 69 6e 74 73 32 5d 0a 09 7d 0a 09 6e 61 74  points2]..}..nat
5930: 75 72 61 6c 20 2d 20 71 75 61 64 72 61 74 69 63  ural - quadratic
5940: 20 7b 0a 09 20 20 4d 61 6b 65 53 70 6c 69 6e 65   {..  MakeSpline
5950: 44 61 74 61 20 78 5f 70 6f 69 6e 74 73 20 79 5f  Data x_points y_
5960: 70 6f 69 6e 74 73 20 78 5f 70 6f 69 6e 74 73 32  points x_points2
5970: 20 79 5f 70 6f 69 6e 74 73 32 0a 09 20 20 50 6f   y_points2..  Po
5980: 6c 79 4f 62 6a 65 63 74 20 24 67 20 5b 6c 69 73  lyObject $g [lis
5990: 74 20 24 78 5f 70 6f 69 6e 74 73 32 20 24 79 5f  t $x_points2 $y_
59a0: 70 6f 69 6e 74 73 32 5d 0a 09 7d 0a 09 64 65 66  points2]..}..def
59b0: 61 75 6c 74 20 7b 0a 09 20 20 50 6f 6c 79 4f 62  ault {..  PolyOb
59c0: 6a 65 63 74 20 24 67 20 5b 6c 69 73 74 20 24 78  ject $g [list $x
59d0: 5f 70 6f 69 6e 74 73 20 24 79 5f 70 6f 69 6e 74  _points $y_point
59e0: 73 5d 0a 09 7d 0a 20 20 20 20 20 20 7d 0a 20 20  s]..}.      }.  
59f0: 20 20 7d 0a 20 20 20 20 53 65 74 44 61 73 68 20    }.    SetDash 
5a00: 24 67 20 7b 7d 0a 0a 20 20 20 20 69 66 20 7b 24  $g {}..    if {$
5a10: 73 79 6d 62 6f 6c 20 3d 3d 20 7b 7d 20 7c 7c 20  symbol == {} || 
5a20: 24 73 79 6d 62 6f 6c 20 3d 3d 20 22 6e 6f 6e 65  $symbol == "none
5a30: 22 20 7c 7c 20 24 73 79 6d 73 69 7a 65 20 3d 3d  " || $symsize ==
5a40: 20 30 7d 20 72 65 74 75 72 6e 0a 0a 20 20 20 20   0} return..    
5a50: 53 65 74 4c 69 6e 65 77 69 64 74 68 20 24 67 20  SetLinewidth $g 
5a60: 24 6f 75 74 6c 77 69 64 74 68 0a 20 20 20 20 66  $outlwidth.    f
5a70: 6f 72 65 61 63 68 20 78 30 20 24 78 5f 70 6f 69  oreach x0 $x_poi
5a80: 6e 74 73 20 79 30 20 24 79 5f 70 6f 69 6e 74 73  nts y0 $y_points
5a90: 20 7b 0a 20 20 20 20 20 20 69 66 20 7b 24 73 79   {.      if {$sy
5aa0: 6d 62 6f 6c 63 6d 64 20 21 3d 20 7b 7d 7d 20 7b  mbolcmd != {}} {
5ab0: 0a 09 73 65 74 20 6e 61 6d 65 20 20 20 20 24 73  ..set name    $s
5ac0: 79 6d 62 6f 6c 0a 09 73 65 74 20 73 69 7a 65 20  ymbol..set size 
5ad0: 20 20 20 24 73 79 6d 73 69 7a 65 5f 32 0a 09 73     $symsize_2..s
5ae0: 65 74 20 66 69 6c 6c 20 20 20 20 24 66 69 6c 6c  et fill    $fill
5af0: 63 6f 6c 6f 72 0a 09 73 65 74 20 6f 75 74 6c 69  color..set outli
5b00: 6e 65 20 24 6f 75 74 6c 63 6f 6c 6f 72 0a 09 65  ne $outlcolor..e
5b10: 76 61 6c 20 22 24 73 79 6d 62 6f 6c 63 6d 64 20  val "$symbolcmd 
5b20: 24 78 30 20 24 79 30 20 6e 61 6d 65 20 73 69 7a  $x0 $y0 name siz
5b30: 65 20 66 69 6c 6c 20 6f 75 74 6c 69 6e 65 22 0a  e fill outline".
5b40: 09 64 72 61 77 5f 73 79 6d 62 6f 6c 20 24 67 20  .draw_symbol $g 
5b50: 24 78 30 20 24 79 30 20 24 6e 61 6d 65 20 24 73  $x0 $y0 $name $s
5b60: 69 7a 65 20 24 66 69 6c 6c 20 24 6f 75 74 6c 69  ize $fill $outli
5b70: 6e 65 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20  ne.      } else 
5b80: 7b 0a 09 64 72 61 77 5f 73 79 6d 62 6f 6c 20 24  {..draw_symbol $
5b90: 67 20 24 78 30 20 24 79 30 20 24 73 79 6d 62 6f  g $x0 $y0 $symbo
5ba0: 6c 20 24 73 79 6d 73 69 7a 65 5f 32 20 24 66 69  l $symsize_2 $fi
5bb0: 6c 6c 63 6f 6c 6f 72 20 24 6f 75 74 6c 63 6f 6c  llcolor $outlcol
5bc0: 6f 72 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  or.      }.    }
5bd0: 0a 20 20 20 20 72 65 74 75 72 6e 0a 20 20 7d 0a  .    return.  }.
5be0: 0a 20 20 72 65 74 75 72 6e 20 2d 63 6f 64 65 20  .  return -code 
5bf0: 65 72 72 6f 72 20 22 75 6e 6b 6e 6f 77 6e 20 65  error "unknown e
5c00: 6c 65 6d 65 6e 74 20 74 79 70 65 20 5c 22 24 74  lement type \"$t
5c10: 79 70 65 5c 22 22 0a 7d 0a 0a 0a 70 72 6f 63 20  ype\"".}...proc 
5c20: 67 72 61 70 68 3a 3a 64 61 74 61 5f 74 6f 5f 62  graph::data_to_b
5c30: 61 72 5f 76 61 6c 75 65 73 20 7b 20 76 61 6c 75  ar_values { valu
5c40: 65 73 20 6d 69 6e 20 6d 61 78 20 63 6c 63 6e 74  es min max clcnt
5c50: 20 7b 73 63 61 6c 65 20 31 2e 30 7d 20 7d 20 7b   {scale 1.0} } {
5c60: 0a 20 20 69 66 20 7b 5b 69 73 5f 76 61 72 5f 72  .  if {[is_var_r
5c70: 65 66 20 76 61 6c 75 65 73 5d 7d 20 7b 0a 20 20  ef values]} {.  
5c80: 20 20 75 70 76 61 72 20 23 30 20 24 76 61 6c 75    upvar #0 $valu
5c90: 65 73 20 64 61 74 61 0a 20 20 7d 20 65 6c 73 65  es data.  } else
5ca0: 20 7b 0a 20 20 20 20 75 70 76 61 72 20 30 20 76   {.    upvar 0 v
5cb0: 61 6c 75 65 73 20 64 61 74 61 0a 20 20 7d 0a 0a  alues data.  }..
5cc0: 20 20 73 65 74 20 63 6f 75 6e 74 20 5b 6c 6c 65    set count [lle
5cd0: 6e 67 74 68 20 24 64 61 74 61 5d 0a 20 20 73 65  ngth $data].  se
5ce0: 74 20 72 61 6e 67 65 20 5b 65 78 70 72 20 7b 24  t range [expr {$
5cf0: 6d 61 78 20 2d 20 24 6d 69 6e 7d 5d 0a 20 20 73  max - $min}].  s
5d00: 65 74 20 63 6c 6d 61 78 20 5b 65 78 70 72 20 7b  et clmax [expr {
5d10: 24 63 6c 63 6e 74 20 2d 31 7d 5d 0a 20 20 73 65  $clcnt -1}].  se
5d20: 74 20 64 65 6c 74 61 20 5b 65 78 70 72 20 7b 24  t delta [expr {$
5d30: 72 61 6e 67 65 20 2f 20 24 63 6c 63 6e 74 7d 5d  range / $clcnt}]
5d40: 0a 20 20 61 72 72 61 79 20 73 65 74 20 63 6c 61  .  array set cla
5d50: 73 73 65 73 20 7b 7d 0a 20 20 66 6f 72 20 7b 73  sses {}.  for {s
5d60: 65 74 20 63 6c 61 73 73 20 30 7d 20 7b 24 63 6c  et class 0} {$cl
5d70: 61 73 73 20 3c 20 24 63 6c 63 6e 74 7d 20 7b 69  ass < $clcnt} {i
5d80: 6e 63 72 20 63 6c 61 73 73 7d 20 7b 0a 20 20 20  ncr class} {.   
5d90: 20 73 65 74 20 63 6c 61 73 73 65 73 28 24 63 6c   set classes($cl
5da0: 61 73 73 29 20 30 0a 20 20 7d 0a 20 20 66 6f 72  ass) 0.  }.  for
5db0: 65 61 63 68 20 76 61 6c 20 24 64 61 74 61 20 7b  each val $data {
5dc0: 0a 20 20 20 20 73 65 74 20 63 6c 61 73 73 20 5b  .    set class [
5dd0: 65 78 70 72 20 7b 72 6f 75 6e 64 28 24 63 6c 63  expr {round($clc
5de0: 6e 74 20 2a 20 28 24 76 61 6c 20 2d 20 24 6d 69  nt * ($val - $mi
5df0: 6e 29 20 2f 20 24 72 61 6e 67 65 29 7d 5d 0a 20  n) / $range)}]. 
5e00: 20 20 20 69 66 20 7b 24 63 6c 61 73 73 20 3c 20     if {$class < 
5e10: 20 20 20 20 20 30 7d 20 7b 20 73 65 74 20 63 6c       0} { set cl
5e20: 61 73 73 20 20 20 20 20 20 30 20 7d 0a 20 20 20  ass      0 }.   
5e30: 20 69 66 20 7b 24 63 6c 61 73 73 20 3e 20 24 63   if {$class > $c
5e40: 6c 6d 61 78 7d 20 7b 20 73 65 74 20 63 6c 61 73  lmax} { set clas
5e50: 73 20 24 63 6c 6d 61 78 20 7d 0a 20 20 20 20 69  s $clmax }.    i
5e60: 6e 63 72 20 63 6c 61 73 73 65 73 28 24 63 6c 61  ncr classes($cla
5e70: 73 73 29 0a 20 20 7d 0a 20 20 73 65 74 20 63 6c  ss).  }.  set cl
5e80: 76 61 6c 73 20 7b 7d 0a 20 20 73 65 74 20 62 61  vals {}.  set ba
5e90: 72 73 20 7b 7d 0a 20 20 73 65 74 20 76 61 6c 75  rs {}.  set valu
5ea0: 65 20 24 6d 69 6e 0a 20 20 66 6f 72 20 7b 73 65  e $min.  for {se
5eb0: 74 20 63 6c 61 73 73 20 30 7d 20 7b 24 63 6c 61  t class 0} {$cla
5ec0: 73 73 20 3c 20 24 63 6c 63 6e 74 7d 20 7b 69 6e  ss < $clcnt} {in
5ed0: 63 72 20 63 6c 61 73 73 7d 20 7b 0a 20 20 20 20  cr class} {.    
5ee0: 6c 61 70 70 65 6e 64 20 63 6c 76 61 6c 73 20 24  lappend clvals $
5ef0: 76 61 6c 75 65 0a 20 20 20 20 73 65 74 20 76 61  value.    set va
5f00: 6c 75 65 20 5b 65 78 70 72 20 7b 24 76 61 6c 75  lue [expr {$valu
5f10: 65 20 2b 20 24 64 65 6c 74 61 7d 5d 0a 20 20 20  e + $delta}].   
5f20: 20 6c 61 70 70 65 6e 64 20 62 61 72 73 20 5b 65   lappend bars [e
5f30: 78 70 72 20 7b 24 73 63 61 6c 65 20 2a 20 24 63  xpr {$scale * $c
5f40: 6c 61 73 73 65 73 28 24 63 6c 61 73 73 29 20 2f  lasses($class) /
5f50: 20 24 63 6f 75 6e 74 7d 5d 0a 20 20 7d 0a 20 20   $count}].  }.  
5f60: 72 65 74 75 72 6e 20 5b 6c 69 73 74 20 24 63 6c  return [list $cl
5f70: 76 61 6c 73 20 24 62 61 72 73 20 24 64 65 6c 74  vals $bars $delt
5f80: 61 5d 0a 7d 0a 0a 23 23 23 23 23 23 23 23 23 23  a].}..##########
5f90: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
5fa0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
5fb0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
5fc0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
5fd0: 23 23 23 23 23 0a 23 0a 23 20 61 78 69 73 20 63  #####.#.# axis c
5fe0: 6f 6d 70 6f 6e 65 6e 74 73 0a 23 0a 0a 70 72 6f  omponents.#..pro
5ff0: 63 20 67 72 61 70 68 3a 3a 61 78 69 73 20 7b 20  c graph::axis { 
6000: 67 20 6f 70 65 72 61 74 69 6f 6e 20 70 61 72 61  g operation para
6010: 6d 73 20 7d 20 7b 0a 20 20 76 61 72 69 61 62 6c  ms } {.  variabl
6020: 65 20 67 72 61 70 68 0a 0a 20 20 73 77 69 74 63  e graph..  switc
6030: 68 20 2d 2d 20 24 6f 70 65 72 61 74 69 6f 6e 20  h -- $operation 
6040: 7b 0a 20 20 20 20 63 72 65 61 74 65 20 7b 0a 20  {.    create {. 
6050: 20 20 20 20 20 73 65 74 20 6e 61 6d 65 20 5b 6c       set name [l
6060: 69 6e 64 65 78 20 24 70 61 72 61 6d 73 20 30 5d  index $params 0]
6070: 0a 20 20 20 20 20 20 6f 62 6a 5f 64 65 66 61 75  .      obj_defau
6080: 6c 74 73 20 20 24 67 2c 61 78 69 73 2d 24 6e 61  lts  $g,axis-$na
6090: 6d 65 20 61 78 69 73 5f 64 65 66 61 75 6c 74 73  me axis_defaults
60a0: 0a 20 20 20 20 20 20 61 78 69 73 20 24 67 20 63  .      axis $g c
60b0: 6f 6e 66 69 67 75 72 65 20 24 70 61 72 61 6d 73  onfigure $params
60c0: 0a 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20 67  .      lappend g
60d0: 72 61 70 68 28 24 67 2c 5f 61 78 69 73 65 73 29  raph($g,_axises)
60e0: 20 24 6e 61 6d 65 0a 20 20 20 20 7d 0a 20 20 20   $name.    }.   
60f0: 20 63 6f 6e 66 69 67 75 72 65 20 7b 0a 20 20 20   configure {.   
6100: 20 20 20 73 65 74 20 6e 61 6d 65 20 5b 6c 69 6e     set name [lin
6110: 64 65 78 20 24 70 61 72 61 6d 73 20 30 5d 0a 20  dex $params 0]. 
6120: 20 20 20 20 20 6f 62 6a 5f 63 6f 6e 66 69 67 75       obj_configu
6130: 72 65 20 24 67 2c 61 78 69 73 2d 24 6e 61 6d 65  re $g,axis-$name
6140: 20 5b 6c 72 61 6e 67 65 20 24 70 61 72 61 6d 73   [lrange $params
6150: 20 31 20 65 6e 64 5d 0a 20 20 20 20 20 20 66 6f   1 end].      fo
6160: 72 65 61 63 68 20 69 74 65 6d 20 7b 6d 69 6e 20  reach item {min 
6170: 6d 61 78 7d 20 7b 0a 09 69 66 20 7b 24 67 72 61  max} {..if {$gra
6180: 70 68 28 24 67 2c 61 78 69 73 2d 24 6e 61 6d 65  ph($g,axis-$name
6190: 2c 24 69 74 65 6d 29 20 21 3d 20 7b 7d 7d 20 7b  ,$item) != {}} {
61a0: 0a 09 20 20 73 65 74 20 67 72 61 70 68 28 24 67  ..  set graph($g
61b0: 2c 61 78 69 73 2d 24 6e 61 6d 65 2c 5f 24 69 74  ,axis-$name,_$it
61c0: 65 6d 29 20 24 67 72 61 70 68 28 24 67 2c 61 78  em) $graph($g,ax
61d0: 69 73 2d 24 6e 61 6d 65 2c 24 69 74 65 6d 29 0a  is-$name,$item).
61e0: 09 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  .}.      }.    }
61f0: 0a 20 20 20 20 63 67 65 74 20 7b 0a 20 20 20 20  .    cget {.    
6200: 20 20 73 65 74 20 6e 61 6d 65 20 5b 6c 69 6e 64    set name [lind
6210: 65 78 20 24 70 61 72 61 6d 73 20 30 5d 0a 20 20  ex $params 0].  
6220: 20 20 20 20 72 65 74 75 72 6e 20 5b 6f 62 6a 5f      return [obj_
6230: 63 67 65 74 20 24 67 2c 61 78 69 73 2d 24 6e 61  cget $g,axis-$na
6240: 6d 65 20 5b 6c 69 6e 64 65 78 20 24 70 61 72 61  me [lindex $para
6250: 6d 73 20 31 5d 5d 0a 20 20 20 20 7d 0a 20 20 20  ms 1]].    }.   
6260: 20 64 65 6c 65 74 65 20 7b 0a 20 20 20 20 20 20   delete {.      
6270: 6f 62 6a 5f 64 65 6c 65 74 65 20 24 67 2c 5f 61  obj_delete $g,_a
6280: 78 69 73 65 73 20 24 67 2c 61 78 69 73 20 24 70  xises $g,axis $p
6290: 61 72 61 6d 73 0a 20 20 20 20 7d 0a 20 20 20 20  arams.    }.    
62a0: 6e 61 6d 65 73 20 7b 0a 20 20 20 20 20 20 69 66  names {.      if
62b0: 20 7b 24 70 61 72 61 6d 73 20 3d 3d 20 7b 7d 7d   {$params == {}}
62c0: 20 7b 20 73 65 74 20 70 61 72 61 6d 73 20 2a 20   { set params * 
62d0: 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b  }.      return [
62e0: 6f 62 6a 5f 6e 61 6d 65 73 20 24 67 2c 5f 61 78  obj_names $g,_ax
62f0: 69 73 65 73 20 24 70 61 72 61 6d 73 5d 0a 20 20  ises $params].  
6300: 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 20    }.    default 
6310: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d  {.      return -
6320: 63 6f 64 65 20 65 72 72 6f 72 20 22 75 6e 6b 6e  code error "unkn
6330: 6f 77 6e 20 6f 70 65 72 61 74 69 6f 6e 20 5c 22  own operation \"
6340: 24 6f 70 65 72 61 74 69 6f 6e 5c 22 22 0a 20 20  $operation\"".  
6350: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a 70 72 6f 63    }.  }.}...proc
6360: 20 67 72 61 70 68 3a 3a 61 78 69 73 75 73 61 67   graph::axisusag
6370: 65 20 7b 20 67 20 61 78 69 73 70 6c 61 63 65 20  e { g axisplace 
6380: 70 61 72 61 6d 73 20 7d 20 7b 0a 20 20 76 61 72  params } {.  var
6390: 69 61 62 6c 65 20 67 72 61 70 68 0a 0a 20 20 23  iable graph..  #
63a0: 20 65 78 61 6d 70 6c 65 20 6d 6f 76 69 6e 67 20   example moving 
63b0: 74 68 65 20 78 2d 61 78 69 73 20 74 6f 20 74 68  the x-axis to th
63c0: 65 20 72 69 67 68 74 20 73 69 64 65 3a 20 24 67  e right side: $g
63d0: 20 78 32 61 78 69 73 20 75 73 65 20 78 0a 20 20   x2axis use x.  
63e0: 69 66 20 7b 5b 6c 69 6e 64 65 78 20 24 70 61 72  if {[lindex $par
63f0: 61 6d 73 20 30 5d 20 21 3d 20 22 75 73 65 22 7d  ams 0] != "use"}
6400: 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 2d 63   {.    return -c
6410: 6f 64 65 20 65 72 72 6f 72 20 22 69 6e 76 61 6c  ode error "inval
6420: 69 64 20 63 6f 6d 6d 61 6e 64 20 5c 22 24 70 61  id command \"$pa
6430: 72 61 6d 73 5c 22 20 74 6f 20 24 61 78 69 73 70  rams\" to $axisp
6440: 6c 61 63 65 22 0a 20 20 7d 0a 20 20 73 65 74 20  lace".  }.  set 
6450: 61 6c 69 73 74 20 5b 6c 72 61 6e 67 65 20 24 70  alist [lrange $p
6460: 61 72 61 6d 73 20 31 20 65 6e 64 5d 0a 20 20 69  arams 1 end].  i
6470: 66 20 7b 5b 6c 6c 65 6e 67 74 68 20 24 61 6c 69  f {[llength $ali
6480: 73 74 5d 20 3d 3d 20 31 7d 20 7b 20 73 65 74 20  st] == 1} { set 
6490: 61 6c 69 73 74 20 5b 6c 69 6e 64 65 78 20 24 70  alist [lindex $p
64a0: 61 72 61 6d 73 20 31 5d 20 7d 0a 20 20 66 6f 72  arams 1] }.  for
64b0: 65 61 63 68 20 61 78 69 73 20 24 61 6c 69 73 74  each axis $alist
64c0: 20 7b 0a 20 20 20 20 69 66 20 7b 5b 6c 73 65 61   {.    if {[lsea
64d0: 72 63 68 20 7b 78 61 78 69 73 20 79 61 78 69 73  rch {xaxis yaxis
64e0: 20 78 32 61 78 69 73 20 79 32 61 78 69 73 7d 20   x2axis y2axis} 
64f0: 24 61 78 69 73 70 6c 61 63 65 5d 20 3d 3d 20 2d  $axisplace] == -
6500: 31 7d 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72  1} {.      retur
6510: 6e 20 2d 63 6f 64 65 20 65 72 72 6f 72 20 22 75  n -code error "u
6520: 6e 6b 6e 6f 77 6e 20 61 78 69 73 20 70 6c 61 63  nknown axis plac
6530: 65 20 5c 22 24 61 78 69 73 70 6c 61 63 65 5c 22  e \"$axisplace\"
6540: 22 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 7b  ".    }.    if {
6550: 24 61 78 69 73 20 21 3d 20 7b 7d 7d 20 7b 0a 20  $axis != {}} {. 
6560: 20 20 20 20 20 66 6f 72 65 61 63 68 20 70 6c 61       foreach pla
6570: 63 65 20 7b 78 61 78 69 73 20 79 61 78 69 73 20  ce {xaxis yaxis 
6580: 78 32 61 78 69 73 20 79 32 61 78 69 73 7d 20 7b  x2axis y2axis} {
6590: 0a 09 69 66 20 7b 5b 73 65 74 20 69 64 78 20 5b  ..if {[set idx [
65a0: 6c 73 65 61 72 63 68 20 24 67 72 61 70 68 28 24  lsearch $graph($
65b0: 67 2c 5f 24 70 6c 61 63 65 29 20 24 61 78 69 73  g,_$place) $axis
65c0: 5d 5d 20 21 3d 20 2d 31 7d 20 7b 0a 09 20 20 73  ]] != -1} {..  s
65d0: 65 74 20 67 72 61 70 68 28 24 67 2c 5f 24 70 6c  et graph($g,_$pl
65e0: 61 63 65 29 20 5b 6c 72 65 70 6c 61 63 65 20 24  ace) [lreplace $
65f0: 67 72 61 70 68 28 24 67 2c 5f 24 70 6c 61 63 65  graph($g,_$place
6600: 29 20 24 69 64 78 20 24 69 64 78 5d 0a 09 7d 0a  ) $idx $idx]..}.
6610: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6c 61        }.      la
6620: 70 70 65 6e 64 20 67 72 61 70 68 28 24 67 2c 5f  ppend graph($g,_
6630: 24 61 78 69 73 70 6c 61 63 65 29 20 24 61 78 69  $axisplace) $axi
6640: 73 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  s.    }.  }.  re
6650: 74 75 72 6e 20 24 67 72 61 70 68 28 24 67 2c 5f  turn $graph($g,_
6660: 24 61 78 69 73 70 6c 61 63 65 29 0a 7d 0a 0a 0a  $axisplace).}...
6670: 70 72 6f 63 20 67 72 61 70 68 3a 3a 61 78 69 73  proc graph::axis
6680: 5f 67 65 74 70 6c 61 63 65 20 7b 20 67 20 6e 61  _getplace { g na
6690: 6d 65 20 7d 20 7b 0a 20 20 76 61 72 69 61 62 6c  me } {.  variabl
66a0: 65 20 67 72 61 70 68 0a 0a 20 20 66 6f 72 65 61  e graph..  forea
66b0: 63 68 20 70 6c 61 63 65 20 7b 78 61 78 69 73 20  ch place {xaxis 
66c0: 79 61 78 69 73 20 78 32 61 78 69 73 20 79 32 61  yaxis x2axis y2a
66d0: 78 69 73 7d 20 7b 0a 20 20 20 20 69 66 20 7b 5b  xis} {.    if {[
66e0: 6c 73 65 61 72 63 68 20 24 67 72 61 70 68 28 24  lsearch $graph($
66f0: 67 2c 5f 24 70 6c 61 63 65 29 20 24 6e 61 6d 65  g,_$place) $name
6700: 5d 20 21 3d 20 2d 31 7d 20 7b 0a 20 20 20 20 20  ] != -1} {.     
6710: 20 72 65 74 75 72 6e 20 24 70 6c 61 63 65 0a 20   return $place. 
6720: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a 23 20 52     }.  }.}...# R
6730: 65 66 65 72 65 6e 63 65 3a 20 50 61 75 6c 20 48  eference: Paul H
6740: 65 63 6b 62 65 72 74 20 22 4e 69 63 65 20 4e 75  eckbert "Nice Nu
6750: 6d 62 65 72 73 20 66 6f 72 20 47 72 61 70 68 20  mbers for Graph 
6760: 4c 61 62 65 6c 73 22 2c 20 47 72 61 70 68 69 63  Labels", Graphic
6770: 73 20 47 65 6d 73 2c 20 70 70 20 36 31 2d 36 33  s Gems, pp 61-63
6780: 0a 70 72 6f 63 20 67 72 61 70 68 3a 3a 6e 69 63  .proc graph::nic
6790: 65 6e 75 6d 20 7b 20 78 20 72 6f 75 6e 64 20 7d  enum { x round }
67a0: 20 7b 0a 20 20 73 65 74 20 65 78 70 74 20 5b 65   {.  set expt [e
67b0: 78 70 72 20 7b 66 6c 6f 6f 72 28 6c 6f 67 31 30  xpr {floor(log10
67c0: 28 24 78 29 29 7d 5d 0a 20 20 73 65 74 20 66 72  ($x))}].  set fr
67d0: 61 63 20 5b 65 78 70 72 20 7b 24 78 20 2f 20 70  ac [expr {$x / p
67e0: 6f 77 28 31 30 2c 24 65 78 70 74 29 7d 5d 0a 20  ow(10,$expt)}]. 
67f0: 20 69 66 20 7b 24 72 6f 75 6e 64 7d 20 7b 0a 20   if {$round} {. 
6800: 20 20 20 69 66 20 7b 24 66 72 61 63 20 3c 20 31     if {$frac < 1
6810: 2e 35 7d 20 7b 0a 20 20 20 20 20 20 73 65 74 20  .5} {.      set 
6820: 6e 69 63 65 20 31 2e 30 0a 20 20 20 20 7d 20 65  nice 1.0.    } e
6830: 6c 73 65 69 66 20 7b 24 66 72 61 63 20 3c 20 33  lseif {$frac < 3
6840: 2e 30 7d 20 7b 0a 20 20 20 20 20 20 73 65 74 20  .0} {.      set 
6850: 6e 69 63 65 20 32 2e 30 0a 20 20 20 20 7d 20 65  nice 2.0.    } e
6860: 6c 73 65 69 66 20 7b 24 66 72 61 63 20 3c 20 37  lseif {$frac < 7
6870: 2e 30 7d 20 7b 0a 20 20 20 20 20 20 73 65 74 20  .0} {.      set 
6880: 6e 69 63 65 20 35 2e 30 0a 20 20 20 20 7d 20 65  nice 5.0.    } e
6890: 6c 73 65 20 7b 0a 20 20 20 20 20 20 73 65 74 20  lse {.      set 
68a0: 6e 69 63 65 20 31 30 2e 30 0a 20 20 20 20 7d 0a  nice 10.0.    }.
68b0: 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 69    } else {.    i
68c0: 66 20 7b 24 66 72 61 63 20 3c 20 31 2e 30 7d 20  f {$frac < 1.0} 
68d0: 7b 0a 20 20 20 20 20 20 73 65 74 20 6e 69 63 65  {.      set nice
68e0: 20 31 2e 30 0a 20 20 20 20 7d 20 65 6c 73 65 69   1.0.    } elsei
68f0: 66 20 7b 24 66 72 61 63 20 3c 20 32 2e 30 7d 20  f {$frac < 2.0} 
6900: 7b 0a 20 20 20 20 20 20 73 65 74 20 6e 69 63 65  {.      set nice
6910: 20 32 2e 30 0a 20 20 20 20 7d 20 65 6c 73 65 69   2.0.    } elsei
6920: 66 20 7b 24 66 72 61 63 20 3c 20 35 2e 30 7d 20  f {$frac < 5.0} 
6930: 7b 0a 20 20 20 20 20 20 73 65 74 20 6e 69 63 65  {.      set nice
6940: 20 35 2e 30 0a 20 20 20 20 7d 20 65 6c 73 65 20   5.0.    } else 
6950: 7b 0a 20 20 20 20 20 20 73 65 74 20 6e 69 63 65  {.      set nice
6960: 20 31 30 2e 30 0a 20 20 20 20 7d 0a 20 20 7d 0a   10.0.    }.  }.
6970: 20 20 73 65 74 20 76 61 6c 20 5b 65 78 70 72 20    set val [expr 
6980: 7b 24 6e 69 63 65 20 2a 20 70 6f 77 28 31 30 2c  {$nice * pow(10,
6990: 24 65 78 70 74 29 7d 5d 0a 20 20 72 65 74 75 72  $expt)}].  retur
69a0: 6e 20 24 76 61 6c 0a 7d 0a 0a 0a 23 20 52 65 66  n $val.}...# Ref
69b0: 65 72 65 6e 63 65 3a 20 42 4c 54 20 62 6c 74 47  erence: BLT bltG
69c0: 72 41 78 69 73 2e 63 20 4c 6f 67 53 63 61 6c 65  rAxis.c LogScale
69d0: 41 78 69 73 28 29 0a 70 72 6f 63 20 67 72 61 70  Axis().proc grap
69e0: 68 3a 3a 61 78 69 73 5f 6c 6f 67 73 63 61 6c 65  h::axis_logscale
69f0: 20 7b 20 69 6e 64 65 78 20 6d 69 6e 20 6d 61 78   { index min max
6a00: 20 7d 20 7b 0a 20 20 76 61 72 69 61 62 6c 65 20   } {.  variable 
6a10: 67 72 61 70 68 0a 20 20 76 61 72 69 61 62 6c 65  graph.  variable
6a20: 20 6e 75 6d 5f 74 69 63 6b 73 0a 0a 20 20 69 66   num_ticks..  if
6a30: 20 7b 24 67 72 61 70 68 28 24 69 6e 64 65 78 2c   {$graph($index,
6a40: 6d 69 6e 29 20 21 3d 20 7b 7d 7d 20 7b 20 73 65  min) != {}} { se
6a50: 74 20 6d 69 6e 20 24 67 72 61 70 68 28 24 69 6e  t min $graph($in
6a60: 64 65 78 2c 6d 69 6e 29 20 7d 0a 20 20 69 66 20  dex,min) }.  if 
6a70: 7b 24 67 72 61 70 68 28 24 69 6e 64 65 78 2c 6d  {$graph($index,m
6a80: 61 78 29 20 21 3d 20 7b 7d 7d 20 7b 20 73 65 74  ax) != {}} { set
6a90: 20 6d 61 78 20 24 67 72 61 70 68 28 24 69 6e 64   max $graph($ind
6aa0: 65 78 2c 6d 61 78 29 20 7d 0a 0a 20 20 73 65 74  ex,max) }..  set
6ab0: 20 6d 69 6e 20 5b 65 78 70 72 20 7b 28 24 6d 69   min [expr {($mi
6ac0: 6e 20 21 3d 20 30 2e 30 29 3f 20 6c 6f 67 31 30  n != 0.0)? log10
6ad0: 28 61 62 73 28 24 6d 69 6e 29 29 20 3a 20 30 2e  (abs($min)) : 0.
6ae0: 30 7d 5d 0a 20 20 73 65 74 20 6d 61 78 20 5b 65  0}].  set max [e
6af0: 78 70 72 20 7b 28 24 6d 61 78 20 21 3d 20 30 2e  xpr {($max != 0.
6b00: 30 29 3f 20 6c 6f 67 31 30 28 61 62 73 28 24 6d  0)? log10(abs($m
6b10: 61 78 29 29 20 3a 20 31 2e 30 7d 5d 0a 0a 20 20  ax)) : 1.0}]..  
6b20: 73 65 74 20 6e 4d 61 6a 6f 72 20 30 3b 20 73 65  set nMajor 0; se
6b30: 74 20 6e 4d 69 6e 6f 72 20 30 0a 20 20 73 65 74  t nMinor 0.  set
6b40: 20 6d 61 6a 6f 72 53 74 65 70 20 30 2e 30 3b 20   majorStep 0.0; 
6b50: 73 65 74 20 6d 69 6e 6f 72 53 74 65 70 20 30 2e  set minorStep 0.
6b60: 30 0a 0a 20 20 73 65 74 20 74 69 63 6b 4d 69 6e  0..  set tickMin
6b70: 20 5b 65 78 70 72 20 7b 66 6c 6f 6f 72 28 24 6d   [expr {floor($m
6b80: 69 6e 29 7d 5d 0a 20 20 73 65 74 20 74 69 63 6b  in)}].  set tick
6b90: 4d 61 78 20 5b 65 78 70 72 20 7b 63 65 69 6c 28  Max [expr {ceil(
6ba0: 24 6d 61 78 29 7d 5d 0a 20 20 73 65 74 20 72 61  $max)}].  set ra
6bb0: 6e 67 65 20 5b 65 78 70 72 20 7b 24 74 69 63 6b  nge [expr {$tick
6bc0: 4d 61 78 20 2d 20 24 74 69 63 6b 4d 69 6e 7d 5d  Max - $tickMin}]
6bd0: 0a 0a 20 20 69 66 20 7b 24 72 61 6e 67 65 20 3e  ..  if {$range >
6be0: 20 31 30 7d 20 7b 0a 20 20 20 20 73 65 74 20 72   10} {.    set r
6bf0: 61 6e 67 65 20 5b 6e 69 63 65 6e 75 6d 20 24 72  ange [nicenum $r
6c00: 61 6e 67 65 20 6e 6f 5d 0a 20 20 20 20 73 65 74  ange no].    set
6c10: 20 6d 61 6a 6f 72 53 74 65 70 20 5b 6e 69 63 65   majorStep [nice
6c20: 6e 75 6d 20 5b 65 78 70 72 20 7b 24 72 61 6e 67  num [expr {$rang
6c30: 65 20 2f 20 64 6f 75 62 6c 65 28 24 6e 75 6d 5f  e / double($num_
6c40: 74 69 63 6b 73 29 7d 5d 20 79 65 73 5d 0a 20 20  ticks)}] yes].  
6c50: 20 20 73 65 74 20 74 69 63 6b 4d 69 6e 20 5b 65    set tickMin [e
6c60: 78 70 72 20 7b 66 6c 6f 6f 72 28 24 74 69 63 6b  xpr {floor($tick
6c70: 4d 69 6e 20 2f 20 24 6d 61 6a 6f 72 53 74 65 70  Min / $majorStep
6c80: 29 20 2a 20 24 6d 61 6a 6f 72 53 74 65 70 7d 5d  ) * $majorStep}]
6c90: 0a 20 20 20 20 73 65 74 20 74 69 63 6b 4d 61 78  .    set tickMax
6ca0: 20 5b 65 78 70 72 20 7b 63 65 69 6c 28 24 74 69   [expr {ceil($ti
6cb0: 63 6b 4d 61 78 20 2f 20 24 6d 61 6a 6f 72 53 74  ckMax / $majorSt
6cc0: 65 70 29 20 2a 20 24 6d 61 6a 6f 72 53 74 65 70  ep) * $majorStep
6cd0: 7d 5d 0a 20 20 20 20 73 65 74 20 6e 4d 61 6a 6f  }].    set nMajo
6ce0: 72 20 5b 65 78 70 72 20 7b 69 6e 74 28 28 24 74  r [expr {int(($t
6cf0: 69 63 6b 4d 61 78 20 2d 20 24 74 69 63 6b 4d 69  ickMax - $tickMi
6d00: 6e 29 20 2f 20 24 6d 61 6a 6f 72 53 74 65 70 29  n) / $majorStep)
6d10: 20 2b 31 7d 5d 0a 20 20 20 20 73 65 74 20 6d 69   +1}].    set mi
6d20: 6e 6f 72 53 74 65 70 20 5b 65 78 70 72 20 7b 70  norStep [expr {p
6d30: 6f 77 28 31 30 2c 20 66 6c 6f 6f 72 28 6c 6f 67  ow(10, floor(log
6d40: 31 30 28 24 6d 61 6a 6f 72 53 74 65 70 29 29 29  10($majorStep)))
6d50: 7d 5d 0a 20 20 20 20 69 66 20 7b 24 6d 69 6e 6f  }].    if {$mino
6d60: 72 53 74 65 70 20 3d 3d 20 24 6d 61 6a 6f 72 53  rStep == $majorS
6d70: 74 65 70 7d 20 7b 0a 20 20 20 20 20 20 73 65 74  tep} {.      set
6d80: 20 6e 4d 69 6e 6f 72 20 34 0a 20 20 20 20 20 20   nMinor 4.      
6d90: 73 65 74 20 6d 69 6e 6f 72 53 74 65 70 20 30 2e  set minorStep 0.
6da0: 32 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20  2.    } else {. 
6db0: 20 20 20 20 20 73 65 74 20 6e 4d 69 6e 6f 72 20       set nMinor 
6dc0: 5b 65 78 70 72 20 7b 72 6f 75 6e 64 28 24 6d 61  [expr {round($ma
6dd0: 6a 6f 72 53 74 65 70 20 20 2f 20 24 6d 69 6e 6f  jorStep  / $mino
6de0: 72 53 74 65 70 29 20 2d 31 7d 5d 0a 20 20 20 20  rStep) -1}].    
6df0: 7d 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20  }.  } else {.   
6e00: 20 69 66 20 7b 24 74 69 63 6b 4d 69 6e 20 3d 3d   if {$tickMin ==
6e10: 20 24 74 69 63 6b 4d 61 78 7d 20 7b 20 69 6e 63   $tickMax} { inc
6e20: 72 20 74 69 63 6b 4d 61 78 20 7d 0a 20 20 20 20  r tickMax }.    
6e30: 73 65 74 20 6d 61 6a 6f 72 53 74 65 70 20 31 2e  set majorStep 1.
6e40: 30 0a 20 20 20 20 73 65 74 20 6e 4d 61 6a 6f 72  0.    set nMajor
6e50: 20 5b 65 78 70 72 20 7b 69 6e 74 28 24 74 69 63   [expr {int($tic
6e60: 6b 4d 61 78 20 2d 20 24 74 69 63 6b 4d 69 6e 20  kMax - $tickMin 
6e70: 2b 31 29 7d 5d 0a 20 20 20 20 73 65 74 20 6d 69  +1)}].    set mi
6e80: 6e 6f 72 53 74 65 70 20 30 2e 30 0a 20 20 20 20  norStep 0.0.    
6e90: 73 65 74 20 6e 4d 69 6e 6f 72 20 31 30 0a 20 20  set nMinor 10.  
6ea0: 7d 0a 0a 20 20 69 66 20 7b 24 67 72 61 70 68 28  }..  if {$graph(
6eb0: 24 69 6e 64 65 78 2c 6c 6f 6f 73 65 29 7d 20 7b  $index,loose)} {
6ec0: 0a 20 20 20 20 73 65 74 20 67 72 61 70 68 28 24  .    set graph($
6ed0: 69 6e 64 65 78 2c 5f 6d 69 6e 29 20 24 6d 69 6e  index,_min) $min
6ee0: 0a 20 20 20 20 73 65 74 20 67 72 61 70 68 28 24  .    set graph($
6ef0: 69 6e 64 65 78 2c 5f 6d 61 78 29 20 24 6d 61 78  index,_max) $max
6f00: 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20  .  } else {.    
6f10: 73 65 74 20 67 72 61 70 68 28 24 69 6e 64 65 78  set graph($index
6f20: 2c 5f 6d 69 6e 29 20 24 74 69 63 6b 4d 69 6e 0a  ,_min) $tickMin.
6f30: 20 20 20 20 73 65 74 20 67 72 61 70 68 28 24 69      set graph($i
6f40: 6e 64 65 78 2c 5f 6d 61 78 29 20 24 74 69 63 6b  ndex,_max) $tick
6f50: 4d 61 78 0a 20 20 7d 0a 20 20 73 65 74 20 67 72  Max.  }.  set gr
6f60: 61 70 68 28 24 69 6e 64 65 78 2c 5f 73 74 65 70  aph($index,_step
6f70: 29 20 20 24 6d 61 6a 6f 72 53 74 65 70 0a 20 20  )  $majorStep.  
6f80: 73 65 74 20 67 72 61 70 68 28 24 69 6e 64 65 78  set graph($index
6f90: 2c 5f 66 69 72 73 74 29 20 5b 65 78 70 72 20 7b  ,_first) [expr {
6fa0: 66 6c 6f 6f 72 28 24 74 69 63 6b 4d 69 6e 29 7d  floor($tickMin)}
6fb0: 5d 0a 20 20 73 65 74 20 67 72 61 70 68 28 24 69  ].  set graph($i
6fc0: 6e 64 65 78 2c 5f 72 61 6e 67 65 29 20 5b 65 78  ndex,_range) [ex
6fd0: 70 72 20 7b 24 67 72 61 70 68 28 24 69 6e 64 65  pr {$graph($inde
6fe0: 78 2c 5f 6d 61 78 29 20 2d 20 24 67 72 61 70 68  x,_max) - $graph
6ff0: 28 24 69 6e 64 65 78 2c 5f 6d 69 6e 29 7d 5d 0a  ($index,_min)}].
7000: 20 20 73 65 74 20 67 72 61 70 68 28 24 69 6e 64    set graph($ind
7010: 65 78 2c 5f 73 74 65 70 73 29 20 24 6e 4d 61 6a  ex,_steps) $nMaj
7020: 6f 72 0a 7d 0a 0a 0a 23 20 52 65 66 65 72 65 6e  or.}...# Referen
7030: 63 65 3a 20 42 4c 54 20 62 6c 74 47 72 41 78 69  ce: BLT bltGrAxi
7040: 73 2e 63 20 4c 69 6e 65 61 72 53 63 61 6c 65 41  s.c LinearScaleA
7050: 78 69 73 28 29 0a 70 72 6f 63 20 67 72 61 70 68  xis().proc graph
7060: 3a 3a 61 78 69 73 5f 6c 69 6e 65 61 72 73 63 61  ::axis_linearsca
7070: 6c 65 20 7b 20 69 6e 64 65 78 20 6d 69 6e 20 6d  le { index min m
7080: 61 78 20 7d 20 7b 0a 20 20 76 61 72 69 61 62 6c  ax } {.  variabl
7090: 65 20 67 72 61 70 68 0a 20 20 76 61 72 69 61 62  e graph.  variab
70a0: 6c 65 20 6e 75 6d 5f 74 69 63 6b 73 0a 0a 20 20  le num_ticks..  
70b0: 69 66 20 7b 24 67 72 61 70 68 28 24 69 6e 64 65  if {$graph($inde
70c0: 78 2c 6d 69 6e 29 20 21 3d 20 7b 7d 7d 20 7b 20  x,min) != {}} { 
70d0: 73 65 74 20 6d 69 6e 20 24 67 72 61 70 68 28 24  set min $graph($
70e0: 69 6e 64 65 78 2c 6d 69 6e 29 20 7d 0a 20 20 69  index,min) }.  i
70f0: 66 20 7b 24 67 72 61 70 68 28 24 69 6e 64 65 78  f {$graph($index
7100: 2c 6d 61 78 29 20 21 3d 20 7b 7d 7d 20 7b 20 73  ,max) != {}} { s
7110: 65 74 20 6d 61 78 20 24 67 72 61 70 68 28 24 69  et max $graph($i
7120: 6e 64 65 78 2c 6d 61 78 29 20 7d 0a 0a 20 20 73  ndex,max) }..  s
7130: 65 74 20 6e 54 69 63 6b 73 20 30 0a 20 20 73 65  et nTicks 0.  se
7140: 74 20 74 69 63 6b 4d 69 6e 20 30 2e 30 0a 20 20  t tickMin 0.0.  
7150: 73 65 74 20 74 69 63 6b 4d 61 78 20 30 2e 30 0a  set tickMax 0.0.
7160: 20 20 73 65 74 20 72 61 6e 67 65 20 5b 65 78 70    set range [exp
7170: 72 20 7b 24 6d 61 78 20 2d 20 24 6d 69 6e 7d 5d  r {$max - $min}]
7180: 0a 0a 20 20 23 20 43 61 6c 63 75 6c 61 74 65 20  ..  # Calculate 
7190: 74 68 65 20 6d 61 6a 6f 72 20 74 69 63 6b 20 73  the major tick s
71a0: 74 65 70 70 69 6e 67 2e 0a 20 20 69 66 20 7b 24  tepping..  if {$
71b0: 67 72 61 70 68 28 24 69 6e 64 65 78 2c 73 74 65  graph($index,ste
71c0: 70 73 69 7a 65 29 20 3e 20 30 2e 30 7d 20 7b 0a  psize) > 0.0} {.
71d0: 20 20 20 20 73 65 74 20 73 74 65 70 20 24 67 72      set step $gr
71e0: 61 70 68 28 24 69 6e 64 65 78 2c 73 74 65 70 73  aph($index,steps
71f0: 69 7a 65 29 0a 20 20 20 20 77 68 69 6c 65 20 7b  ize).    while {
7200: 32 20 2a 20 24 73 74 65 70 20 3e 3d 20 24 72 61  2 * $step >= $ra
7210: 6e 67 65 7d 20 7b 0a 20 20 20 20 20 20 73 65 74  nge} {.      set
7220: 20 73 74 65 70 20 5b 65 78 70 72 20 7b 24 73 74   step [expr {$st
7230: 65 70 20 2a 20 30 2e 35 7d 5d 0a 20 20 20 20 7d  ep * 0.5}].    }
7240: 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20  .  } else {.    
7250: 73 65 74 20 72 61 6e 67 65 20 5b 6e 69 63 65 6e  set range [nicen
7260: 75 6d 20 24 72 61 6e 67 65 20 6e 6f 5d 0a 20 20  um $range no].  
7270: 20 20 73 65 74 20 73 74 65 70 20 20 5b 6e 69 63    set step  [nic
7280: 65 6e 75 6d 20 5b 65 78 70 72 20 7b 24 72 61 6e  enum [expr {$ran
7290: 67 65 20 2f 20 64 6f 75 62 6c 65 28 24 6e 75 6d  ge / double($num
72a0: 5f 74 69 63 6b 73 29 7d 5d 20 79 65 73 5d 0a 20  _ticks)}] yes]. 
72b0: 20 7d 0a 20 20 73 65 74 20 67 72 61 70 68 28 24   }.  set graph($
72c0: 69 6e 64 65 78 2c 5f 73 74 65 70 29 20 24 73 74  index,_step) $st
72d0: 65 70 0a 0a 20 20 23 20 46 69 6e 64 20 74 68 65  ep..  # Find the
72e0: 20 6f 75 74 65 72 20 74 69 63 6b 20 76 61 6c 75   outer tick valu
72f0: 65 73 2e 0a 20 20 73 65 74 20 74 69 63 6b 4d 69  es..  set tickMi
7300: 6e 20 5b 65 78 70 72 20 7b 66 6c 6f 6f 72 28 24  n [expr {floor($
7310: 6d 69 6e 20 2f 20 24 73 74 65 70 29 20 2a 20 24  min / $step) * $
7320: 73 74 65 70 7d 5d 0a 20 20 73 65 74 20 74 69 63  step}].  set tic
7330: 6b 4d 61 78 20 5b 65 78 70 72 20 7b 63 65 69 6c  kMax [expr {ceil
7340: 28 24 6d 61 78 20 2f 20 24 73 74 65 70 29 20 2a  ($max / $step) *
7350: 20 24 73 74 65 70 7d 5d 0a 0a 20 20 69 66 20 7b   $step}]..  if {
7360: 24 67 72 61 70 68 28 24 69 6e 64 65 78 2c 6c 6f  $graph($index,lo
7370: 6f 73 65 29 7d 20 7b 0a 20 20 20 20 73 65 74 20  ose)} {.    set 
7380: 67 72 61 70 68 28 24 69 6e 64 65 78 2c 5f 6d 69  graph($index,_mi
7390: 6e 29 20 24 6d 69 6e 0a 20 20 20 20 73 65 74 20  n) $min.    set 
73a0: 67 72 61 70 68 28 24 69 6e 64 65 78 2c 5f 6d 61  graph($index,_ma
73b0: 78 29 20 24 6d 61 78 0a 20 20 7d 20 65 6c 73 65  x) $max.  } else
73c0: 20 7b 0a 20 20 20 20 73 65 74 20 67 72 61 70 68   {.    set graph
73d0: 28 24 69 6e 64 65 78 2c 5f 6d 69 6e 29 20 24 74  ($index,_min) $t
73e0: 69 63 6b 4d 69 6e 0a 20 20 20 20 73 65 74 20 67  ickMin.    set g
73f0: 72 61 70 68 28 24 69 6e 64 65 78 2c 5f 6d 61 78  raph($index,_max
7400: 29 20 24 74 69 63 6b 4d 61 78 0a 20 20 7d 0a 20  ) $tickMax.  }. 
7410: 20 73 65 74 20 67 72 61 70 68 28 24 69 6e 64 65   set graph($inde
7420: 78 2c 5f 66 69 72 73 74 29 20 24 74 69 63 6b 4d  x,_first) $tickM
7430: 69 6e 0a 20 20 73 65 74 20 67 72 61 70 68 28 24  in.  set graph($
7440: 69 6e 64 65 78 2c 5f 72 61 6e 67 65 29 20 5b 65  index,_range) [e
7450: 78 70 72 20 7b 24 67 72 61 70 68 28 24 69 6e 64  xpr {$graph($ind
7460: 65 78 2c 5f 6d 61 78 29 20 2d 20 24 67 72 61 70  ex,_max) - $grap
7470: 68 28 24 69 6e 64 65 78 2c 5f 6d 69 6e 29 7d 5d  h($index,_min)}]
7480: 0a 20 20 73 65 74 20 67 72 61 70 68 28 24 69 6e  .  set graph($in
7490: 64 65 78 2c 5f 73 74 65 70 73 29 20 5b 65 78 70  dex,_steps) [exp
74a0: 72 20 7b 72 6f 75 6e 64 28 28 24 74 69 63 6b 4d  r {round(($tickM
74b0: 61 78 20 2d 20 24 74 69 63 6b 4d 69 6e 29 20 2f  ax - $tickMin) /
74c0: 20 24 73 74 65 70 29 20 2b 31 7d 5d 0a 7d 0a 0a   $step) +1}].}..
74d0: 0a 70 72 6f 63 20 67 72 61 70 68 3a 3a 61 78 69  .proc graph::axi
74e0: 73 5f 63 61 6c 63 20 7b 20 67 20 6e 61 6d 65 20  s_calc { g name 
74f0: 7d 20 7b 0a 20 20 76 61 72 69 61 62 6c 65 20 67  } {.  variable g
7500: 72 61 70 68 0a 0a 20 20 73 65 74 20 69 6e 64 65  raph..  set inde
7510: 78 20 24 67 2c 61 78 69 73 2d 24 6e 61 6d 65 0a  x $g,axis-$name.
7520: 20 20 73 65 74 20 70 6c 61 63 65 20 5b 61 78 69    set place [axi
7530: 73 5f 67 65 74 70 6c 61 63 65 20 24 67 20 24 6e  s_getplace $g $n
7540: 61 6d 65 5d 0a 20 20 73 65 74 20 67 72 61 70 68  ame].  set graph
7550: 28 24 69 6e 64 65 78 2c 5f 70 6c 61 63 65 29 20  ($index,_place) 
7560: 24 70 6c 61 63 65 0a 20 20 69 66 20 7b 24 70 6c  $place.  if {$pl
7570: 61 63 65 20 3d 3d 20 7b 7d 7d 20 72 65 74 75 72  ace == {}} retur
7580: 6e 0a 0a 20 20 73 77 69 74 63 68 20 24 70 6c 61  n..  switch $pla
7590: 63 65 20 7b 0a 20 20 20 20 78 61 78 69 73 20 2d  ce {.    xaxis -
75a0: 20 78 32 61 78 69 73 20 7b 20 73 65 74 20 6f 72   x2axis { set or
75b0: 69 65 6e 74 20 68 6f 72 69 7a 6f 6e 74 61 6c 3b  ient horizontal;
75c0: 20 73 65 74 20 6d 69 6e 69 74 65 6d 20 5f 78 6d   set minitem _xm
75d0: 69 6e 3b 20 73 65 74 20 6d 61 78 69 74 65 6d 20  in; set maxitem 
75e0: 5f 78 6d 61 78 20 7d 0a 20 20 20 20 79 61 78 69  _xmax }.    yaxi
75f0: 73 20 2d 20 79 32 61 78 69 73 20 7b 20 73 65 74  s - y2axis { set
7600: 20 6f 72 69 65 6e 74 20 76 65 72 74 69 63 61 6c   orient vertical
7610: 3b 20 20 20 73 65 74 20 6d 69 6e 69 74 65 6d 20  ;   set minitem 
7620: 5f 79 6d 69 6e 3b 20 73 65 74 20 6d 61 78 69 74  _ymin; set maxit
7630: 65 6d 20 5f 79 6d 61 78 20 7d 0a 20 20 7d 0a 0a  em _ymax }.  }..
7640: 20 20 73 65 74 20 6d 69 6e 20 31 65 33 30 30 0a    set min 1e300.
7650: 20 20 73 65 74 20 6d 61 78 20 2d 31 65 33 30 30    set max -1e300
7660: 0a 20 20 73 65 74 20 62 61 72 67 72 61 70 68 20  .  set bargraph 
7670: 66 61 6c 73 65 0a 20 20 66 6f 72 65 61 63 68 20  false.  foreach 
7680: 65 6c 65 6d 20 24 67 72 61 70 68 28 24 67 2c 5f  elem $graph($g,_
7690: 65 6c 65 6d 65 6e 74 73 29 20 7b 0a 20 20 20 20  elements) {.    
76a0: 69 66 20 7b 24 67 72 61 70 68 28 24 67 2c 65 6c  if {$graph($g,el
76b0: 65 6d 2d 24 65 6c 65 6d 2c 5f 76 61 6c 69 64 29  em-$elem,_valid)
76c0: 7d 20 7b 0a 20 20 20 20 20 20 73 65 74 20 76 61  } {.      set va
76d0: 6c 20 24 67 72 61 70 68 28 24 67 2c 65 6c 65 6d  l $graph($g,elem
76e0: 2d 24 65 6c 65 6d 2c 24 6d 69 6e 69 74 65 6d 29  -$elem,$minitem)
76f0: 0a 20 20 20 20 20 20 69 66 20 7b 24 76 61 6c 20  .      if {$val 
7700: 3c 20 24 6d 69 6e 7d 20 7b 20 73 65 74 20 6d 69  < $min} { set mi
7710: 6e 20 24 76 61 6c 20 7d 0a 20 20 20 20 20 20 73  n $val }.      s
7720: 65 74 20 76 61 6c 20 24 67 72 61 70 68 28 24 67  et val $graph($g
7730: 2c 65 6c 65 6d 2d 24 65 6c 65 6d 2c 24 6d 61 78  ,elem-$elem,$max
7740: 69 74 65 6d 29 0a 20 20 20 20 20 20 69 66 20 7b  item).      if {
7750: 24 76 61 6c 20 3e 20 24 6d 61 78 7d 20 7b 20 73  $val > $max} { s
7760: 65 74 20 6d 61 78 20 24 76 61 6c 20 7d 0a 20 20  et max $val }.  
7770: 20 20 20 20 69 66 20 7b 24 67 72 61 70 68 28 24      if {$graph($
7780: 67 2c 65 6c 65 6d 2d 24 65 6c 65 6d 2c 74 79 70  g,elem-$elem,typ
7790: 65 29 20 3d 3d 20 22 62 61 72 22 7d 20 7b 0a 09  e) == "bar"} {..
77a0: 73 65 74 20 62 61 72 67 72 61 70 68 20 74 72 75  set bargraph tru
77b0: 65 0a 09 69 66 20 7b 24 6f 72 69 65 6e 74 20 3d  e..if {$orient =
77c0: 3d 20 22 68 6f 72 69 7a 6f 6e 74 61 6c 22 7d 20  = "horizontal"} 
77d0: 7b 0a 09 20 20 73 65 74 20 6d 69 6e 20 5b 65 78  {..  set min [ex
77e0: 70 72 20 7b 24 6d 69 6e 20 2d 20 30 2e 35 7d 5d  pr {$min - 0.5}]
77f0: 0a 09 20 20 73 65 74 20 6d 61 78 20 5b 65 78 70  ..  set max [exp
7800: 72 20 7b 24 6d 61 78 20 2b 20 30 2e 35 7d 5d 0a  r {$max + 0.5}].
7810: 09 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  .}.      }.    }
7820: 0a 20 20 7d 0a 20 20 69 66 20 7b 24 67 72 61 70  .  }.  if {$grap
7830: 68 28 24 69 6e 64 65 78 2c 6d 69 6e 29 20 21 3d  h($index,min) !=
7840: 20 7b 7d 7d 20 7b 20 73 65 74 20 6d 69 6e 20 24   {}} { set min $
7850: 67 72 61 70 68 28 24 69 6e 64 65 78 2c 6d 69 6e  graph($index,min
7860: 29 20 7d 0a 20 20 69 66 20 7b 24 67 72 61 70 68  ) }.  if {$graph
7870: 28 24 69 6e 64 65 78 2c 6d 61 78 29 20 21 3d 20  ($index,max) != 
7880: 7b 7d 7d 20 7b 20 73 65 74 20 6d 61 78 20 24 67  {}} { set max $g
7890: 72 61 70 68 28 24 69 6e 64 65 78 2c 6d 61 78 29  raph($index,max)
78a0: 20 7d 0a 0a 20 20 69 66 20 7b 24 6d 69 6e 20 3d   }..  if {$min =
78b0: 3d 20 24 6d 61 78 7d 20 72 65 74 75 72 6e 0a 0a  = $max} return..
78c0: 20 20 69 66 20 7b 24 6d 69 6e 20 3e 20 24 6d 61    if {$min > $ma
78d0: 78 7d 20 7b 20 73 65 74 20 6d 69 6e 20 30 2e 30  x} { set min 0.0
78e0: 3b 20 73 65 74 20 6d 61 78 20 31 2e 30 20 7d 0a  ; set max 1.0 }.
78f0: 0a 20 20 69 66 20 7b 24 62 61 72 67 72 61 70 68  .  if {$bargraph
7900: 7d 20 7b 0a 20 20 20 20 69 66 20 7b 24 6f 72 69  } {.    if {$ori
7910: 65 6e 74 20 3d 3d 20 22 68 6f 72 69 7a 6f 6e 74  ent == "horizont
7920: 61 6c 22 7d 20 7b 0a 20 20 20 20 20 20 69 66 20  al"} {.      if 
7930: 7b 24 67 72 61 70 68 28 24 69 6e 64 65 78 2c 73  {$graph($index,s
7940: 74 65 70 73 69 7a 65 29 20 3d 3d 20 30 2e 30 7d  tepsize) == 0.0}
7950: 20 7b 0a 09 73 65 74 20 67 72 61 70 68 28 24 69   {..set graph($i
7960: 6e 64 65 78 2c 73 74 65 70 73 69 7a 65 29 20 31  ndex,stepsize) 1
7970: 2e 30 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .0.      }.     
7980: 20 69 66 20 7b 24 67 72 61 70 68 28 24 69 6e 64   if {$graph($ind
7990: 65 78 2c 73 75 62 64 69 76 69 73 69 6f 6e 73 29  ex,subdivisions)
79a0: 20 3d 3d 20 7b 7d 7d 20 7b 0a 09 73 65 74 20 67   == {}} {..set g
79b0: 72 61 70 68 28 24 69 6e 64 65 78 2c 73 75 62 64  raph($index,subd
79c0: 69 76 69 73 69 6f 6e 73 29 20 31 0a 20 20 20 20  ivisions) 1.    
79d0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
79e0: 20 7b 24 6f 72 69 65 6e 74 20 3d 3d 20 22 76 65   {$orient == "ve
79f0: 72 74 69 63 61 6c 22 7d 20 7b 0a 20 20 20 20 20  rtical"} {.     
7a00: 20 69 66 20 7b 24 67 72 61 70 68 28 24 69 6e 64   if {$graph($ind
7a10: 65 78 2c 6d 69 6e 29 20 3d 3d 20 7b 7d 20 26 26  ex,min) == {} &&
7a20: 20 24 6d 69 6e 20 3e 20 30 2e 30 7d 20 7b 0a 09   $min > 0.0} {..
7a30: 73 65 74 20 67 72 61 70 68 28 24 69 6e 64 65 78  set graph($index
7a40: 2c 6d 69 6e 29 20 30 2e 30 0a 20 20 20 20 20 20  ,min) 0.0.      
7a50: 7d 0a 20 20 20 20 20 20 69 66 20 7b 24 67 72 61  }.      if {$gra
7a60: 70 68 28 24 69 6e 64 65 78 2c 6d 61 78 29 20 3d  ph($index,max) =
7a70: 3d 20 7b 7d 20 26 26 20 24 6d 61 78 20 3c 20 30  = {} && $max < 0
7a80: 2e 30 7d 20 7b 0a 09 73 65 74 20 67 72 61 70 68  .0} {..set graph
7a90: 28 24 69 6e 64 65 78 2c 6d 61 78 29 20 30 2e 30  ($index,max) 0.0
7aa0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
7ab0: 20 7d 0a 0a 20 20 73 65 74 20 6c 6f 67 73 63 61   }..  set logsca
7ac0: 6c 65 20 24 67 72 61 70 68 28 24 69 6e 64 65 78  le $graph($index
7ad0: 2c 6c 6f 67 73 63 61 6c 65 29 0a 20 20 69 66 20  ,logscale).  if 
7ae0: 7b 24 6c 6f 67 73 63 61 6c 65 7d 20 7b 0a 20 20  {$logscale} {.  
7af0: 20 20 61 78 69 73 5f 6c 6f 67 73 63 61 6c 65 20    axis_logscale 
7b00: 24 69 6e 64 65 78 20 24 6d 69 6e 20 24 6d 61 78  $index $min $max
7b10: 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20  .  } else {.    
7b20: 61 78 69 73 5f 6c 69 6e 65 61 72 73 63 61 6c 65  axis_linearscale
7b30: 20 24 69 6e 64 65 78 20 24 6d 69 6e 20 24 6d 61   $index $min $ma
7b40: 78 0a 20 20 7d 0a 20 20 0a 20 20 73 65 74 20 73  x.  }.  .  set s
7b50: 74 65 70 20 20 20 20 20 20 20 24 67 72 61 70 68  tep       $graph
7b60: 28 24 69 6e 64 65 78 2c 5f 73 74 65 70 29 0a 20  ($index,_step). 
7b70: 20 73 65 74 20 73 74 65 70 73 20 20 20 20 20 20   set steps      
7b80: 24 67 72 61 70 68 28 24 69 6e 64 65 78 2c 5f 73  $graph($index,_s
7b90: 74 65 70 73 29 0a 20 20 73 65 74 20 66 69 72 73  teps).  set firs
7ba0: 74 20 20 20 20 20 20 24 67 72 61 70 68 28 24 69  t      $graph($i
7bb0: 6e 64 65 78 2c 5f 66 69 72 73 74 29 0a 20 20 73  ndex,_first).  s
7bc0: 65 74 20 66 6f 72 6d 61 74 20 20 20 20 20 24 67  et format     $g
7bd0: 72 61 70 68 28 24 69 6e 64 65 78 2c 5f 66 6f 72  raph($index,_for
7be0: 6d 61 74 29 0a 20 20 73 65 74 20 61 6e 67 6c 65  mat).  set angle
7bf0: 20 20 20 20 20 20 24 67 72 61 70 68 28 24 69 6e        $graph($in
7c00: 64 65 78 2c 72 6f 74 61 74 65 29 0a 20 20 73 65  dex,rotate).  se
7c10: 74 20 6d 61 6a 6f 72 74 69 63 6b 73 20 24 67 72  t majorticks $gr
7c20: 61 70 68 28 24 69 6e 64 65 78 2c 6d 61 6a 6f 72  aph($index,major
7c30: 74 69 63 6b 73 29 0a 20 20 73 65 74 20 76 61 6c  ticks).  set val
7c40: 75 65 20 20 20 20 20 20 24 66 69 72 73 74 0a 0a  ue      $first..
7c50: 20 20 69 66 20 7b 24 67 72 61 70 68 28 24 69 6e    if {$graph($in
7c60: 64 65 78 2c 68 69 64 65 29 7d 20 7b 0a 20 20 20  dex,hide)} {.   
7c70: 20 73 65 74 20 67 72 61 70 68 28 24 69 6e 64 65   set graph($inde
7c80: 78 2c 5f 77 69 64 74 68 29 20 20 30 0a 20 20 20  x,_width)  0.   
7c90: 20 73 65 74 20 67 72 61 70 68 28 24 69 6e 64 65   set graph($inde
7ca0: 78 2c 5f 68 65 69 67 68 74 29 20 30 0a 20 20 7d  x,_height) 0.  }
7cb0: 20 65 6c 73 65 20 7b 0a 20 20 20 20 69 66 20 7b   else {.    if {
7cc0: 24 67 72 61 70 68 28 24 69 6e 64 65 78 2c 74 69  $graph($index,ti
7cd0: 74 6c 65 29 20 21 3d 20 22 22 7d 20 7b 0a 20 20  tle) != ""} {.  
7ce0: 20 20 20 20 66 6f 72 65 61 63 68 20 7b 66 6f 6e      foreach {fon
7cf0: 74 20 73 69 7a 65 20 61 74 74 72 7d 20 24 67 72  t size attr} $gr
7d00: 61 70 68 28 24 69 6e 64 65 78 2c 74 69 74 6c 65  aph($index,title
7d10: 66 6f 6e 74 29 20 7b 7d 0a 20 20 20 20 20 20 53  font) {}.      S
7d20: 65 74 46 6f 6e 74 20 24 67 20 24 66 6f 6e 74 20  etFont $g $font 
7d30: 24 73 69 7a 65 20 24 61 74 74 72 0a 20 20 20 20  $size $attr.    
7d40: 20 20 73 65 74 20 6d 61 72 67 69 6e 31 20 30 2e    set margin1 0.
7d50: 32 35 0a 20 20 20 20 20 20 73 65 74 20 74 69 74  25.      set tit
7d60: 6c 65 5f 68 20 5b 65 78 70 72 20 7b 5b 4c 69 6e  le_h [expr {[Lin
7d70: 65 48 65 69 67 68 74 5d 20 2b 20 24 6d 61 72 67  eHeight] + $marg
7d80: 69 6e 31 7d 5d 0a 20 20 20 20 7d 20 65 6c 73 65  in1}].    } else
7d90: 20 7b 0a 20 20 20 20 20 20 73 65 74 20 74 69 74   {.      set tit
7da0: 6c 65 5f 68 20 30 0a 20 20 20 20 7d 0a 0a 20 20  le_h 0.    }..  
7db0: 20 20 66 6f 72 65 61 63 68 20 7b 66 6f 6e 74 20    foreach {font 
7dc0: 73 69 7a 65 20 61 74 74 72 7d 20 24 67 72 61 70  size attr} $grap
7dd0: 68 28 24 69 6e 64 65 78 2c 74 69 63 6b 66 6f 6e  h($index,tickfon
7de0: 74 29 20 7b 7d 0a 20 20 20 20 53 65 74 46 6f 6e  t) {}.    SetFon
7df0: 74 20 24 67 20 24 66 6f 6e 74 20 24 73 69 7a 65  t $g $font $size
7e00: 20 24 61 74 74 72 0a 0a 20 20 20 20 73 65 74 20   $attr..    set 
7e10: 64 79 20 5b 4c 69 6e 65 48 65 69 67 68 74 5d 0a  dy [LineHeight].
7e20: 20 20 20 20 73 65 74 20 62 6f 78 5f 68 20 30 3b      set box_h 0;
7e30: 20 73 65 74 20 62 6f 78 5f 77 20 30 0a 20 20 20   set box_w 0.   
7e40: 20 73 65 74 20 6d 61 78 5f 68 20 30 3b 20 73 65   set max_h 0; se
7e50: 74 20 6d 61 78 5f 77 20 30 0a 20 20 20 20 73 65  t max_w 0.    se
7e60: 74 20 67 72 61 70 68 28 24 69 6e 64 65 78 2c 5f  t graph($index,_
7e70: 74 78 74 73 29 20 7b 7d 0a 0a 20 20 20 20 69 66  txts) {}..    if
7e80: 20 7b 24 6d 61 6a 6f 72 74 69 63 6b 73 20 3d 3d   {$majorticks ==
7e90: 20 7b 7d 7d 20 7b 0a 20 20 20 20 20 20 66 6f 72   {}} {.      for
7ea0: 20 7b 73 65 74 20 69 64 78 20 30 7d 20 7b 24 69   {set idx 0} {$i
7eb0: 64 78 20 3c 20 24 73 74 65 70 73 7d 20 7b 69 6e  dx < $steps} {in
7ec0: 63 72 20 69 64 78 7d 20 7b 0a 09 69 66 20 7b 24  cr idx} {..if {$
7ed0: 67 72 61 70 68 28 24 69 6e 64 65 78 2c 63 6f 6d  graph($index,com
7ee0: 6d 61 6e 64 29 20 21 3d 20 7b 7d 7d 20 7b 0a 09  mand) != {}} {..
7ef0: 20 20 73 65 74 20 74 78 74 20 5b 65 76 61 6c 20    set txt [eval 
7f00: 22 24 67 72 61 70 68 28 24 69 6e 64 65 78 2c 63  "$graph($index,c
7f10: 6f 6d 6d 61 6e 64 29 20 24 67 20 24 76 61 6c 75  ommand) $g $valu
7f20: 65 22 5d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20  e"]..} else {.. 
7f30: 20 69 66 20 7b 24 6c 6f 67 73 63 61 6c 65 7d 20   if {$logscale} 
7f40: 7b 0a 09 20 20 20 20 73 65 74 20 74 78 74 20 5b  {..    set txt [
7f50: 66 6f 72 6d 61 74 20 24 66 6f 72 6d 61 74 20 5b  format $format [
7f60: 65 78 70 72 20 7b 70 6f 77 28 31 30 2c 72 6f 75  expr {pow(10,rou
7f70: 6e 64 28 24 76 61 6c 75 65 29 29 7d 5d 5d 0a 09  nd($value))}]]..
7f80: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20    } else {..    
7f90: 73 65 74 20 74 78 74 20 5b 66 6f 72 6d 61 74 20  set txt [format 
7fa0: 24 66 6f 72 6d 61 74 20 24 76 61 6c 75 65 5d 0a  $format $value].
7fb0: 09 20 20 7d 0a 09 7d 0a 09 73 65 74 20 64 78 20  .  }..}..set dx 
7fc0: 5b 54 65 78 74 57 69 64 74 68 20 24 74 78 74 5d  [TextWidth $txt]
7fd0: 0a 09 73 65 74 20 73 69 7a 65 20 5b 63 61 6c 63  ..set size [calc
7fe0: 5f 62 6f 78 20 24 64 78 20 24 64 79 20 24 61 6e  _box $dx $dy $an
7ff0: 67 6c 65 20 62 6f 78 5f 77 20 62 6f 78 5f 68 5d  gle box_w box_h]
8000: 0a 09 6c 61 70 70 65 6e 64 20 67 72 61 70 68 28  ..lappend graph(
8010: 24 69 6e 64 65 78 2c 5f 74 78 74 73 29 20 5b 6c  $index,_txts) [l
8020: 69 73 74 20 24 74 78 74 20 24 64 78 20 24 64 79  ist $txt $dx $dy
8030: 20 24 62 6f 78 5f 77 20 24 62 6f 78 5f 68 20 24   $box_w $box_h $
8040: 73 69 7a 65 5d 0a 09 73 65 74 20 62 6f 78 5f 77  size]..set box_w
8050: 20 5b 65 78 70 72 20 7b 61 62 73 28 24 62 6f 78   [expr {abs($box
8060: 5f 77 29 7d 5d 0a 09 73 65 74 20 62 6f 78 5f 68  _w)}]..set box_h
8070: 20 5b 65 78 70 72 20 7b 61 62 73 28 24 62 6f 78   [expr {abs($box
8080: 5f 68 29 7d 5d 0a 09 69 66 20 7b 24 62 6f 78 5f  _h)}]..if {$box_
8090: 77 20 3e 20 24 6d 61 78 5f 77 7d 20 7b 20 73 65  w > $max_w} { se
80a0: 74 20 6d 61 78 5f 77 20 24 62 6f 78 5f 77 20 7d  t max_w $box_w }
80b0: 0a 09 69 66 20 7b 24 62 6f 78 5f 68 20 3e 20 24  ..if {$box_h > $
80c0: 6d 61 78 5f 68 7d 20 7b 20 73 65 74 20 6d 61 78  max_h} { set max
80d0: 5f 68 20 24 62 6f 78 5f 68 20 7d 0a 09 73 65 74  _h $box_h }..set
80e0: 20 76 61 6c 75 65 20 5b 65 78 70 72 20 7b 24 76   value [expr {$v
80f0: 61 6c 75 65 20 2b 20 24 73 74 65 70 7d 5d 0a 20  alue + $step}]. 
8100: 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 65 6c 73       }.    } els
8110: 65 20 7b 0a 20 20 20 20 20 20 66 6f 72 65 61 63  e {.      foreac
8120: 68 20 76 61 6c 75 65 20 24 6d 61 6a 6f 72 74 69  h value $majorti
8130: 63 6b 73 20 7b 0a 09 69 66 20 7b 24 67 72 61 70  cks {..if {$grap
8140: 68 28 24 69 6e 64 65 78 2c 63 6f 6d 6d 61 6e 64  h($index,command
8150: 29 20 21 3d 20 7b 7d 7d 20 7b 0a 09 20 20 73 65  ) != {}} {..  se
8160: 74 20 74 78 74 20 5b 65 76 61 6c 20 22 24 67 72  t txt [eval "$gr
8170: 61 70 68 28 24 69 6e 64 65 78 2c 63 6f 6d 6d 61  aph($index,comma
8180: 6e 64 29 20 24 67 20 24 76 61 6c 75 65 22 5d 0a  nd) $g $value"].
8190: 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 73 65 74  .} else {..  set
81a0: 20 74 78 74 20 5b 66 6f 72 6d 61 74 20 24 66 6f   txt [format $fo
81b0: 72 6d 61 74 20 24 76 61 6c 75 65 5d 0a 09 7d 0a  rmat $value]..}.
81c0: 09 73 65 74 20 64 78 20 5b 54 65 78 74 57 69 64  .set dx [TextWid
81d0: 74 68 20 24 74 78 74 5d 0a 09 73 65 74 20 73 69  th $txt]..set si
81e0: 7a 65 20 5b 63 61 6c 63 5f 62 6f 78 20 24 64 78  ze [calc_box $dx
81f0: 20 24 64 79 20 24 61 6e 67 6c 65 20 62 6f 78 5f   $dy $angle box_
8200: 77 20 62 6f 78 5f 68 5d 0a 09 6c 61 70 70 65 6e  w box_h]..lappen
8210: 64 20 67 72 61 70 68 28 24 69 6e 64 65 78 2c 5f  d graph($index,_
8220: 74 78 74 73 29 20 5b 6c 69 73 74 20 24 74 78 74  txts) [list $txt
8230: 20 24 64 78 20 24 64 79 20 24 62 6f 78 5f 77 20   $dx $dy $box_w 
8240: 24 62 6f 78 5f 68 20 24 73 69 7a 65 5d 0a 09 73  $box_h $size]..s
8250: 65 74 20 62 6f 78 5f 77 20 5b 65 78 70 72 20 7b  et box_w [expr {
8260: 61 62 73 28 24 62 6f 78 5f 77 29 7d 5d 0a 09 73  abs($box_w)}]..s
8270: 65 74 20 62 6f 78 5f 68 20 5b 65 78 70 72 20 7b  et box_h [expr {
8280: 61 62 73 28 24 62 6f 78 5f 68 29 7d 5d 0a 09 69  abs($box_h)}]..i
8290: 66 20 7b 24 62 6f 78 5f 77 20 3e 20 24 6d 61 78  f {$box_w > $max
82a0: 5f 77 7d 20 7b 20 73 65 74 20 6d 61 78 5f 77 20  _w} { set max_w 
82b0: 24 62 6f 78 5f 77 20 7d 0a 09 69 66 20 7b 24 62  $box_w }..if {$b
82c0: 6f 78 5f 68 20 3e 20 24 6d 61 78 5f 68 7d 20 7b  ox_h > $max_h} {
82d0: 20 73 65 74 20 6d 61 78 5f 68 20 24 62 6f 78 5f   set max_h $box_
82e0: 68 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  h }.      }.    
82f0: 7d 0a 0a 20 20 20 20 73 65 74 20 67 72 61 70 68  }..    set graph
8300: 28 24 69 6e 64 65 78 2c 5f 77 69 64 74 68 29 20  ($index,_width) 
8310: 20 24 6d 61 78 5f 77 0a 20 20 20 20 73 65 74 20   $max_w.    set 
8320: 67 72 61 70 68 28 24 69 6e 64 65 78 2c 5f 68 65  graph($index,_he
8330: 69 67 68 74 29 20 24 6d 61 78 5f 68 0a 20 20 20  ight) $max_h.   
8340: 20 73 65 74 20 74 69 63 6b 6c 65 6e 20 24 67 72   set ticklen $gr
8350: 61 70 68 28 24 69 6e 64 65 78 2c 74 69 63 6b 6c  aph($index,tickl
8360: 65 6e 67 74 68 29 0a 20 20 20 20 73 65 74 20 6d  ength).    set m
8370: 61 72 67 69 6e 32 20 30 2e 33 35 0a 20 20 20 20  argin2 0.35.    
8380: 69 66 20 7b 24 6f 72 69 65 6e 74 20 3d 3d 20 22  if {$orient == "
8390: 68 6f 72 69 7a 6f 6e 74 61 6c 22 7d 20 7b 0a 20  horizontal"} {. 
83a0: 20 20 20 20 20 73 65 74 20 67 72 61 70 68 28 24       set graph($
83b0: 69 6e 64 65 78 2c 5f 68 65 69 67 68 74 29 20 5b  index,_height) [
83c0: 65 78 70 72 20 7b 24 6d 61 78 5f 68 20 2b 20 24  expr {$max_h + $
83d0: 74 69 63 6b 6c 65 6e 20 2b 20 24 6d 61 72 67 69  ticklen + $margi
83e0: 6e 32 20 2b 20 24 74 69 74 6c 65 5f 68 7d 5d 0a  n2 + $title_h}].
83f0: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
8400: 20 20 20 73 65 74 20 67 72 61 70 68 28 24 69 6e     set graph($in
8410: 64 65 78 2c 5f 77 69 64 74 68 29 20 5b 65 78 70  dex,_width) [exp
8420: 72 20 7b 24 6d 61 78 5f 77 20 2b 20 24 74 69 63  r {$max_w + $tic
8430: 6b 6c 65 6e 20 2b 20 24 6d 61 72 67 69 6e 32 20  klen + $margin2 
8440: 2b 20 24 74 69 74 6c 65 5f 68 7d 5d 0a 20 20 20  + $title_h}].   
8450: 20 7d 0a 20 20 7d 0a 20 20 73 65 74 20 67 72 61   }.  }.  set gra
8460: 70 68 28 24 69 6e 64 65 78 2c 5f 76 61 6c 69 64  ph($index,_valid
8470: 29 20 79 65 73 0a 7d 0a 0a 0a 0a 70 72 6f 63 20  ) yes.}....proc 
8480: 67 72 61 70 68 3a 3a 61 78 69 73 5f 64 72 61 77  graph::axis_draw
8490: 5f 74 69 63 6b 20 7b 20 67 20 61 78 69 73 20 76  _tick { g axis v
84a0: 61 6c 75 65 20 6d 69 6e 20 6d 61 78 20 70 31 20  alue min max p1 
84b0: 70 32 20 74 69 63 6b 31 20 74 69 63 6b 32 20 6d  p2 tick1 tick2 m
84c0: 61 72 67 69 6e 0a 20 20 20 20 20 20 20 20 20 20  argin.          
84d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
84e0: 20 20 20 20 20 20 20 20 20 20 20 20 74 69 63 6b              tick
84f0: 74 78 74 20 61 6e 67 6c 65 20 64 6f 67 72 69 64  txt angle dogrid
8500: 5f 6d 61 6a 6f 72 0a 09 09 09 09 20 20 20 20 20  _major.....     
8510: 20 67 72 69 64 5f 63 6f 6c 6f 72 20 67 72 69 64   grid_color grid
8520: 5f 6c 69 6e 65 77 20 67 72 69 64 5f 64 61 73 68  _linew grid_dash
8530: 65 73 20 70 33 20 70 34 20 7d 20 7b 0a 20 20 73  es p3 p4 } {.  s
8540: 77 69 74 63 68 20 24 61 78 69 73 20 7b 0a 20 20  witch $axis {.  
8550: 20 20 78 20 20 2d 20 79 20 20 7b 20 73 65 74 20    x  - y  { set 
8560: 66 61 63 74 6f 72 20 2d 31 20 7d 0a 20 20 20 20  factor -1 }.    
8570: 78 32 20 2d 20 79 32 20 7b 20 73 65 74 20 66 61  x2 - y2 { set fa
8580: 63 74 6f 72 20 20 31 20 7d 0a 20 20 7d 0a 20 20  ctor  1 }.  }.  
8590: 73 77 69 74 63 68 20 24 61 78 69 73 20 7b 0a 20  switch $axis {. 
85a0: 20 20 20 78 20 2d 20 78 32 20 7b 0a 20 20 20 20     x - x2 {.    
85b0: 20 20 73 65 74 20 78 20 5b 74 72 61 6e 73 66 6f    set x [transfo
85c0: 72 6d 20 24 76 61 6c 75 65 20 24 6d 69 6e 20 24  rm $value $min $
85d0: 6d 61 78 20 24 70 31 20 24 70 32 5d 0a 20 20 20  max $p1 $p2].   
85e0: 20 20 20 69 66 20 7b 24 78 20 3e 3d 20 24 70 31     if {$x >= $p1
85f0: 20 26 26 20 24 78 20 3c 3d 20 24 70 32 7d 20 7b   && $x <= $p2} {
8600: 0a 09 4c 69 6e 65 20 24 67 20 24 78 20 24 74 69  ..Line $g $x $ti
8610: 63 6b 31 20 24 78 20 24 74 69 63 6b 32 0a 09 66  ck1 $x $tick2..f
8620: 6f 72 65 61 63 68 20 7b 74 78 74 20 74 77 20 74  oreach {txt tw t
8630: 68 20 62 77 20 62 68 20 73 69 7a 65 7d 20 24 74  h bw bh size} $t
8640: 69 63 6b 74 78 74 20 7b 7d 0a 09 73 65 74 20 78  icktxt {}..set x
8650: 63 20 24 78 0a 09 73 65 74 20 79 63 20 5b 65 78  c $x..set yc [ex
8660: 70 72 20 7b 24 74 69 63 6b 32 20 2b 20 24 66 61  pr {$tick2 + $fa
8670: 63 74 6f 72 20 2a 20 28 24 6d 61 72 67 69 6e 20  ctor * ($margin 
8680: 2b 20 30 2e 35 20 2a 20 61 62 73 28 24 62 68 29  + 0.5 * abs($bh)
8690: 29 7d 5d 0a 09 74 65 78 74 5f 72 6f 74 20 24 67  )}]..text_rot $g
86a0: 20 24 74 78 74 20 24 78 63 20 24 79 63 20 24 74   $txt $xc $yc $t
86b0: 77 20 24 74 68 20 24 61 6e 67 6c 65 0a 09 69 66  w $th $angle..if
86c0: 20 7b 24 64 6f 67 72 69 64 5f 6d 61 6a 6f 72 7d   {$dogrid_major}
86d0: 20 7b 0a 09 20 20 67 72 69 64 6c 69 6e 65 20 24   {..  gridline $
86e0: 67 20 24 67 72 69 64 5f 63 6f 6c 6f 72 20 24 67  g $grid_color $g
86f0: 72 69 64 5f 6c 69 6e 65 77 20 24 67 72 69 64 5f  rid_linew $grid_
8700: 64 61 73 68 65 73 20 24 78 20 24 70 33 20 24 78  dashes $x $p3 $x
8710: 20 24 70 34 0a 09 7d 0a 20 20 20 20 20 20 7d 0a   $p4..}.      }.
8720: 20 20 20 20 7d 0a 20 20 20 20 79 20 2d 20 79 32      }.    y - y2
8730: 20 7b 0a 20 20 20 20 20 20 73 65 74 20 79 20 5b   {.      set y [
8740: 74 72 61 6e 73 66 6f 72 6d 20 24 76 61 6c 75 65  transform $value
8750: 20 24 6d 69 6e 20 24 6d 61 78 20 24 70 31 20 24   $min $max $p1 $
8760: 70 32 5d 0a 20 20 20 20 20 20 69 66 20 7b 24 79  p2].      if {$y
8770: 20 3e 3d 20 24 70 31 20 26 26 20 24 79 20 3c 3d   >= $p1 && $y <=
8780: 20 24 70 32 7d 20 7b 0a 09 4c 69 6e 65 20 24 67   $p2} {..Line $g
8790: 20 24 74 69 63 6b 31 20 24 79 20 24 74 69 63 6b   $tick1 $y $tick
87a0: 32 20 24 79 0a 09 66 6f 72 65 61 63 68 20 7b 74  2 $y..foreach {t
87b0: 78 74 20 74 77 20 74 68 20 62 77 20 62 68 20 73  xt tw th bw bh s
87c0: 69 7a 65 7d 20 24 74 69 63 6b 74 78 74 20 7b 7d  ize} $ticktxt {}
87d0: 0a 09 73 65 74 20 78 63 20 5b 65 78 70 72 20 7b  ..set xc [expr {
87e0: 24 74 69 63 6b 32 20 2b 20 24 66 61 63 74 6f 72  $tick2 + $factor
87f0: 20 2a 20 28 24 6d 61 72 67 69 6e 20 2b 20 30 2e   * ($margin + 0.
8800: 35 20 2a 20 61 62 73 28 24 62 77 29 29 7d 5d 0a  5 * abs($bw))}].
8810: 09 73 65 74 20 79 63 20 24 79 0a 09 74 65 78 74  .set yc $y..text
8820: 5f 72 6f 74 20 24 67 20 24 74 78 74 20 24 78 63  _rot $g $txt $xc
8830: 20 24 79 63 20 24 74 77 20 24 74 68 20 24 61 6e   $yc $tw $th $an
8840: 67 6c 65 0a 09 69 66 20 7b 24 64 6f 67 72 69 64  gle..if {$dogrid
8850: 5f 6d 61 6a 6f 72 7d 20 7b 0a 09 20 20 67 72 69  _major} {..  gri
8860: 64 6c 69 6e 65 20 24 67 20 24 67 72 69 64 5f 63  dline $g $grid_c
8870: 6f 6c 6f 72 20 24 67 72 69 64 5f 6c 69 6e 65 77  olor $grid_linew
8880: 20 24 67 72 69 64 5f 64 61 73 68 65 73 20 24 70   $grid_dashes $p
8890: 33 20 24 79 20 24 70 34 20 24 79 0a 09 7d 0a 20  3 $y $p4 $y..}. 
88a0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
88b0: 0a 7d 0a 0a 0a 70 72 6f 63 20 67 72 61 70 68 3a  .}...proc graph:
88c0: 3a 61 78 69 73 5f 64 72 61 77 5f 73 75 62 74 69  :axis_draw_subti
88d0: 63 6b 73 20 7b 20 67 20 61 78 69 73 20 76 61 6c  cks { g axis val
88e0: 20 64 69 76 20 69 6e 74 65 72 76 61 6c 20 73 74   div interval st
88f0: 65 70 20 6d 69 6e 20 6d 61 78 20 70 31 20 70 32  ep min max p1 p2
8900: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
8910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8920: 20 20 20 20 20 20 20 20 20 20 20 6c 6f 67 73 63             logsc
8930: 61 6c 65 20 74 69 63 6b 31 20 74 69 63 6b 33 20  ale tick1 tick3 
8940: 64 6f 67 72 69 64 5f 6d 69 6e 6f 72 0a 09 09 09  dogrid_minor....
8950: 09 20 20 20 20 20 20 20 20 20 20 67 72 69 64 5f  .          grid_
8960: 63 6f 6c 6f 72 20 67 72 69 64 5f 6c 69 6e 65 77  color grid_linew
8970: 20 67 72 69 64 5f 64 61 73 68 65 73 0a 09 09 09   grid_dashes....
8980: 09 20 20 20 20 20 20 20 20 20 20 6d 69 6e 6f 72  .          minor
8990: 74 69 63 6b 73 20 70 33 20 70 34 20 7d 20 7b 0a  ticks p3 p4 } {.
89a0: 20 20 69 66 20 7b 24 6c 6f 67 73 63 61 6c 65 7d    if {$logscale}
89b0: 20 7b 0a 20 20 20 20 73 65 74 20 73 74 65 70 20   {.    set step 
89c0: 5b 65 78 70 72 20 7b 31 30 20 2a 20 24 73 74 65  [expr {10 * $ste
89d0: 70 20 2a 20 70 6f 77 28 31 30 2c 24 76 61 6c 29  p * pow(10,$val)
89e0: 7d 5d 0a 20 20 20 20 73 65 74 20 76 61 6c 20 20  }].    set val  
89f0: 30 0a 20 20 7d 0a 20 20 73 77 69 74 63 68 20 24  0.  }.  switch $
8a00: 61 78 69 73 20 7b 0a 20 20 20 20 78 20 2d 20 78  axis {.    x - x
8a10: 32 20 7b 0a 20 20 20 20 20 20 69 66 20 7b 24 6d  2 {.      if {$m
8a20: 69 6e 6f 72 74 69 63 6b 73 20 3d 3d 20 7b 7d 7d  inorticks == {}}
8a30: 20 7b 0a 09 66 6f 72 20 7b 73 65 74 20 73 75 62   {..for {set sub
8a40: 69 64 78 20 31 7d 20 7b 24 73 75 62 69 64 78 20  idx 1} {$subidx 
8a50: 3c 20 24 64 69 76 7d 20 7b 69 6e 63 72 20 73 75  < $div} {incr su
8a60: 62 69 64 78 7d 20 7b 0a 09 20 20 73 65 74 20 76  bidx} {..  set v
8a70: 61 6c 20 5b 65 78 70 72 20 7b 24 76 61 6c 20 2b  al [expr {$val +
8a80: 20 24 73 74 65 70 7d 5d 0a 09 20 20 73 65 74 20   $step}]..  set 
8a90: 78 20 5b 74 72 61 6e 73 66 6f 72 6d 20 24 76 61  x [transform $va
8aa0: 6c 20 24 6d 69 6e 20 24 6d 61 78 20 24 70 31 20  l $min $max $p1 
8ab0: 24 70 32 20 24 6c 6f 67 73 63 61 6c 65 5d 0a 09  $p2 $logscale]..
8ac0: 20 20 69 66 20 7b 24 78 20 3e 3d 20 24 70 31 20    if {$x >= $p1 
8ad0: 26 26 20 24 78 20 3c 3d 20 24 70 32 7d 20 7b 0a  && $x <= $p2} {.
8ae0: 09 20 20 20 20 4c 69 6e 65 20 24 67 20 24 78 20  .    Line $g $x 
8af0: 24 74 69 63 6b 31 20 24 78 20 24 74 69 63 6b 33  $tick1 $x $tick3
8b00: 0a 09 20 20 20 20 69 66 20 7b 24 64 6f 67 72 69  ..    if {$dogri
8b10: 64 5f 6d 69 6e 6f 72 7d 20 7b 0a 09 20 20 20 20  d_minor} {..    
8b20: 20 20 67 72 69 64 6c 69 6e 65 20 24 67 20 24 67    gridline $g $g
8b30: 72 69 64 5f 63 6f 6c 6f 72 20 24 67 72 69 64 5f  rid_color $grid_
8b40: 6c 69 6e 65 77 20 24 67 72 69 64 5f 64 61 73 68  linew $grid_dash
8b50: 65 73 20 24 78 20 24 70 33 20 24 78 20 24 70 34  es $x $p3 $x $p4
8b60: 0a 09 20 20 20 20 7d 0a 09 20 20 7d 0a 09 7d 0a  ..    }..  }..}.
8b70: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20        } else {. 
8b80: 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 6d         foreach m
8b90: 69 6e 6f 72 76 61 6c 20 24 6d 69 6e 6f 72 74 69  inorval $minorti
8ba0: 63 6b 73 20 7b 0a 09 20 20 73 65 74 20 78 20 5b  cks {..  set x [
8bb0: 74 72 61 6e 73 66 6f 72 6d 20 5b 65 78 70 72 20  transform [expr 
8bc0: 7b 24 76 61 6c 2b 24 6d 69 6e 6f 72 76 61 6c 2a  {$val+$minorval*
8bd0: 24 69 6e 74 65 72 76 61 6c 7d 5d 20 24 6d 69 6e  $interval}] $min
8be0: 20 24 6d 61 78 20 24 70 31 20 24 70 32 20 24 6c   $max $p1 $p2 $l
8bf0: 6f 67 73 63 61 6c 65 5d 0a 09 20 20 69 66 20 7b  ogscale]..  if {
8c00: 24 78 20 3e 3d 20 24 70 31 20 26 26 20 24 78 20  $x >= $p1 && $x 
8c10: 3c 3d 20 24 70 32 7d 20 7b 0a 09 20 20 20 20 4c  <= $p2} {..    L
8c20: 69 6e 65 20 24 67 20 24 78 20 24 74 69 63 6b 31  ine $g $x $tick1
8c30: 20 24 78 20 24 74 69 63 6b 33 0a 09 20 20 20 20   $x $tick3..    
8c40: 69 66 20 7b 24 64 6f 67 72 69 64 5f 6d 69 6e 6f  if {$dogrid_mino
8c50: 72 7d 20 7b 0a 09 20 20 20 20 20 20 67 72 69 64  r} {..      grid
8c60: 6c 69 6e 65 20 24 67 20 24 67 72 69 64 5f 63 6f  line $g $grid_co
8c70: 6c 6f 72 20 24 67 72 69 64 5f 6c 69 6e 65 77 20  lor $grid_linew 
8c80: 24 67 72 69 64 5f 64 61 73 68 65 73 20 24 78 20  $grid_dashes $x 
8c90: 24 70 33 20 24 78 20 24 70 34 0a 09 20 20 20 20  $p3 $x $p4..    
8ca0: 7d 0a 09 20 20 7d 0a 09 7d 0a 20 20 20 20 20 20  }..  }..}.      
8cb0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 79 20 2d 20  }.    }.    y - 
8cc0: 79 32 20 7b 0a 20 20 20 20 20 20 69 66 20 7b 24  y2 {.      if {$
8cd0: 6d 69 6e 6f 72 74 69 63 6b 73 20 3d 3d 20 7b 7d  minorticks == {}
8ce0: 7d 20 7b 0a 09 66 6f 72 20 7b 73 65 74 20 73 75  } {..for {set su
8cf0: 62 69 64 78 20 31 7d 20 7b 24 73 75 62 69 64 78  bidx 1} {$subidx
8d00: 20 3c 20 24 64 69 76 7d 20 7b 69 6e 63 72 20 73   < $div} {incr s
8d10: 75 62 69 64 78 7d 20 7b 0a 09 20 20 73 65 74 20  ubidx} {..  set 
8d20: 76 61 6c 20 5b 65 78 70 72 20 7b 24 76 61 6c 20  val [expr {$val 
8d30: 2b 20 24 73 74 65 70 7d 5d 0a 09 20 20 73 65 74  + $step}]..  set
8d40: 20 79 20 5b 74 72 61 6e 73 66 6f 72 6d 20 24 76   y [transform $v
8d50: 61 6c 20 24 6d 69 6e 20 24 6d 61 78 20 24 70 31  al $min $max $p1
8d60: 20 24 70 32 20 24 6c 6f 67 73 63 61 6c 65 5d 0a   $p2 $logscale].
8d70: 09 20 20 69 66 20 7b 24 79 20 3e 3d 20 24 70 31  .  if {$y >= $p1
8d80: 20 26 26 20 24 79 20 3c 3d 20 24 70 32 7d 20 7b   && $y <= $p2} {
8d90: 0a 09 20 20 20 20 4c 69 6e 65 20 24 67 20 24 74  ..    Line $g $t
8da0: 69 63 6b 31 20 24 79 20 24 74 69 63 6b 33 20 24  ick1 $y $tick3 $
8db0: 79 0a 09 20 20 20 20 69 66 20 7b 24 64 6f 67 72  y..    if {$dogr
8dc0: 69 64 5f 6d 69 6e 6f 72 7d 20 7b 0a 09 20 20 20  id_minor} {..   
8dd0: 20 20 20 67 72 69 64 6c 69 6e 65 20 24 67 20 24     gridline $g $
8de0: 67 72 69 64 5f 63 6f 6c 6f 72 20 24 67 72 69 64  grid_color $grid
8df0: 5f 6c 69 6e 65 77 20 24 67 72 69 64 5f 64 61 73  _linew $grid_das
8e00: 68 65 73 20 24 70 33 20 24 79 20 24 70 34 20 24  hes $p3 $y $p4 $
8e10: 79 0a 09 20 20 20 20 7d 0a 09 20 20 7d 0a 09 7d  y..    }..  }..}
8e20: 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  .      } else {.
8e30: 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20          foreach 
8e40: 6d 69 6e 6f 72 76 61 6c 20 24 6d 69 6e 6f 72 74  minorval $minort
8e50: 69 63 6b 73 20 7b 0a 09 20 20 73 65 74 20 79 20  icks {..  set y 
8e60: 5b 74 72 61 6e 73 66 6f 72 6d 20 5b 65 78 70 72  [transform [expr
8e70: 20 7b 24 76 61 6c 2b 24 6d 69 6e 6f 72 76 61 6c   {$val+$minorval
8e80: 2a 24 69 6e 74 65 72 76 61 6c 7d 5d 20 24 6d 69  *$interval}] $mi
8e90: 6e 20 24 6d 61 78 20 24 70 31 20 24 70 32 20 24  n $max $p1 $p2 $
8ea0: 6c 6f 67 73 63 61 6c 65 5d 0a 09 20 20 69 66 20  logscale]..  if 
8eb0: 7b 24 79 20 3e 3d 20 24 70 31 20 26 26 20 24 79  {$y >= $p1 && $y
8ec0: 20 3c 3d 20 24 70 32 7d 20 7b 0a 09 20 20 20 20   <= $p2} {..    
8ed0: 4c 69 6e 65 20 24 67 20 24 74 69 63 6b 31 20 24  Line $g $tick1 $
8ee0: 79 20 24 74 69 63 6b 33 20 24 79 0a 09 20 20 20  y $tick3 $y..   
8ef0: 20 69 66 20 7b 24 64 6f 67 72 69 64 5f 6d 69 6e   if {$dogrid_min
8f00: 6f 72 7d 20 7b 0a 09 20 20 20 20 20 20 67 72 69  or} {..      gri
8f10: 64 6c 69 6e 65 20 24 67 20 24 67 72 69 64 5f 63  dline $g $grid_c
8f20: 6f 6c 6f 72 20 24 67 72 69 64 5f 6c 69 6e 65 77  olor $grid_linew
8f30: 20 24 67 72 69 64 5f 64 61 73 68 65 73 20 24 70   $grid_dashes $p
8f40: 33 20 24 79 20 24 70 34 20 24 79 0a 09 20 20 20  3 $y $p4 $y..   
8f50: 20 7d 0a 09 20 20 7d 0a 09 7d 0a 20 20 20 20 20   }..  }..}.     
8f60: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a   }.    }.  }.}..
8f70: 0a 70 72 6f 63 20 67 72 61 70 68 3a 3a 61 78 69  .proc graph::axi
8f80: 73 5f 64 72 61 77 20 7b 20 67 20 6e 61 6d 65 20  s_draw { g name 
8f90: 78 6c 20 79 74 20 78 72 20 79 62 20 0a 20 20 20  xl yt xr yb .   
8fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 78 6c                xl
8fc0: 5f 67 72 61 70 68 20 79 74 5f 67 72 61 70 68 20  _graph yt_graph 
8fd0: 78 72 5f 67 72 61 70 68 20 79 62 5f 67 72 61 70  xr_graph yb_grap
8fe0: 68 20 7d 20 7b 0a 20 20 76 61 72 69 61 62 6c 65  h } {.  variable
8ff0: 20 67 72 61 70 68 0a 0a 20 20 73 65 74 20 69 6e   graph..  set in
9000: 64 65 78 20 24 67 2c 61 78 69 73 2d 24 6e 61 6d  dex $g,axis-$nam
9010: 65 0a 20 20 69 66 20 7b 21 24 67 72 61 70 68 28  e.  if {!$graph(
9020: 24 69 6e 64 65 78 2c 5f 76 61 6c 69 64 29 7d 20  $index,_valid)} 
9030: 72 65 74 75 72 6e 0a 20 20 69 66 20 7b 24 67 72  return.  if {$gr
9040: 61 70 68 28 24 69 6e 64 65 78 2c 68 69 64 65 29  aph($index,hide)
9050: 7d 20 72 65 74 75 72 6e 0a 0a 20 20 69 66 20 7b  } return..  if {
9060: 24 67 72 61 70 68 28 24 69 6e 64 65 78 2c 74 69  $graph($index,ti
9070: 74 6c 65 29 20 21 3d 20 22 22 7d 20 7b 0a 20 20  tle) != ""} {.  
9080: 20 20 73 65 74 20 74 78 74 20 24 67 72 61 70 68    set txt $graph
9090: 28 24 69 6e 64 65 78 2c 74 69 74 6c 65 29 0a 20  ($index,title). 
90a0: 20 20 20 53 65 74 43 6f 6c 6f 72 20 24 67 20 24     SetColor $g $
90b0: 67 72 61 70 68 28 24 69 6e 64 65 78 2c 74 69 74  graph($index,tit
90c0: 6c 65 63 6f 6c 6f 72 29 0a 20 20 20 20 66 6f 72  lecolor).    for
90d0: 65 61 63 68 20 7b 66 6f 6e 74 20 73 69 7a 65 20  each {font size 
90e0: 61 74 74 72 7d 20 24 67 72 61 70 68 28 24 69 6e  attr} $graph($in
90f0: 64 65 78 2c 74 69 74 6c 65 66 6f 6e 74 29 20 7b  dex,titlefont) {
9100: 7d 0a 20 20 20 20 53 65 74 46 6f 6e 74 20 24 67  }.    SetFont $g
9110: 20 24 66 6f 6e 74 20 24 73 69 7a 65 20 24 61 74   $font $size $at
9120: 74 72 0a 20 20 20 20 73 65 74 20 74 77 20 5b 54  tr.    set tw [T
9130: 65 78 74 57 69 64 74 68 20 24 74 78 74 5d 0a 20  extWidth $txt]. 
9140: 20 20 20 73 65 74 20 74 68 20 5b 4c 69 6e 65 48     set th [LineH
9150: 65 69 67 68 74 5d 0a 20 20 20 20 73 77 69 74 63  eight].    switc
9160: 68 20 24 67 72 61 70 68 28 24 69 6e 64 65 78 2c  h $graph($index,
9170: 5f 70 6c 61 63 65 29 20 7b 0a 20 20 20 20 20 20  _place) {.      
9180: 79 61 78 69 73 20 7b 0a 09 73 65 74 20 79 63 20  yaxis {..set yc 
9190: 5b 65 78 70 72 20 7b 24 79 62 20 2b 20 30 2e 35  [expr {$yb + 0.5
91a0: 20 2a 20 28 24 79 74 20 2d 20 24 79 62 29 7d 5d   * ($yt - $yb)}]
91b0: 0a 09 73 65 74 20 78 63 20 5b 65 78 70 72 20 7b  ..set xc [expr {
91c0: 24 78 6c 20 2b 20 30 2e 37 20 2a 20 24 74 68 7d  $xl + 0.7 * $th}
91d0: 5d 0a 09 74 65 78 74 5f 72 6f 74 20 24 67 20 24  ]..text_rot $g $
91e0: 74 78 74 20 24 78 63 20 24 79 63 20 24 74 77 20  txt $xc $yc $tw 
91f0: 24 74 68 20 39 30 0a 20 20 20 20 20 20 7d 0a 20  $th 90.      }. 
9200: 20 20 20 20 20 79 32 61 78 69 73 20 7b 0a 09 73       y2axis {..s
9210: 65 74 20 79 63 20 5b 65 78 70 72 20 7b 24 79 62  et yc [expr {$yb
9220: 20 2b 20 30 2e 35 20 2a 20 28 24 79 74 20 2d 20   + 0.5 * ($yt - 
9230: 24 79 62 29 7d 5d 0a 09 73 65 74 20 78 63 20 5b  $yb)}]..set xc [
9240: 65 78 70 72 20 7b 24 78 72 20 2d 20 30 2e 37 20  expr {$xr - 0.7 
9250: 2a 20 24 74 68 7d 5d 0a 09 74 65 78 74 5f 72 6f  * $th}]..text_ro
9260: 74 20 24 67 20 24 74 78 74 20 24 78 63 20 24 79  t $g $txt $xc $y
9270: 63 20 24 74 77 20 24 74 68 20 2d 39 30 0a 20 20  c $tw $th -90.  
9280: 20 20 20 20 7d 0a 20 20 20 20 20 20 78 61 78 69      }.      xaxi
9290: 73 20 7b 0a 09 73 65 74 20 78 63 20 5b 65 78 70  s {..set xc [exp
92a0: 72 20 7b 24 78 6c 20 2b 20 30 2e 35 20 2a 20 28  r {$xl + 0.5 * (
92b0: 24 78 72 20 2d 20 24 78 6c 29 7d 5d 0a 09 73 65  $xr - $xl)}]..se
92c0: 74 20 79 63 20 5b 65 78 70 72 20 7b 24 79 62 20  t yc [expr {$yb 
92d0: 2b 20 30 2e 37 20 2a 20 24 74 68 7d 5d 0a 09 74  + 0.7 * $th}]..t
92e0: 65 78 74 5f 72 6f 74 20 24 67 20 24 74 78 74 20  ext_rot $g $txt 
92f0: 24 78 63 20 24 79 63 20 24 74 77 20 24 74 68 20  $xc $yc $tw $th 
9300: 30 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  0.      }.      
9310: 78 32 61 78 69 73 20 7b 0a 09 73 65 74 20 78 63  x2axis {..set xc
9320: 20 5b 65 78 70 72 20 7b 24 78 6c 20 2b 20 30 2e   [expr {$xl + 0.
9330: 35 20 2a 20 28 24 78 72 20 2d 20 24 78 6c 29 7d  5 * ($xr - $xl)}
9340: 5d 0a 09 73 65 74 20 79 63 20 5b 65 78 70 72 20  ]..set yc [expr 
9350: 7b 24 79 74 20 2d 20 30 2e 37 20 2a 20 24 74 68  {$yt - 0.7 * $th
9360: 7d 5d 0a 09 74 65 78 74 5f 72 6f 74 20 24 67 20  }]..text_rot $g 
9370: 24 74 78 74 20 24 78 63 20 24 79 63 20 24 74 77  $txt $xc $yc $tw
9380: 20 24 74 68 20 30 0a 20 20 20 20 20 20 7d 0a 20   $th 0.      }. 
9390: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 53 65 74 43     }.  }..  SetC
93a0: 6f 6c 6f 72 20 24 67 20 20 20 20 20 24 67 72 61  olor $g     $gra
93b0: 70 68 28 24 69 6e 64 65 78 2c 63 6f 6c 6f 72 29  ph($index,color)
93c0: 0a 20 20 53 65 74 4c 69 6e 65 77 69 64 74 68 20  .  SetLinewidth 
93d0: 24 67 20 24 67 72 61 70 68 28 24 69 6e 64 65 78  $g $graph($index
93e0: 2c 6c 69 6e 65 77 69 64 74 68 29 0a 20 20 66 6f  ,linewidth).  fo
93f0: 72 65 61 63 68 20 7b 66 6f 6e 74 20 73 69 7a 65  reach {font size
9400: 20 61 74 74 72 7d 20 24 67 72 61 70 68 28 24 69   attr} $graph($i
9410: 6e 64 65 78 2c 74 69 63 6b 66 6f 6e 74 29 20 7b  ndex,tickfont) {
9420: 7d 0a 20 20 53 65 74 46 6f 6e 74 20 24 67 20 24  }.  SetFont $g $
9430: 66 6f 6e 74 20 24 73 69 7a 65 20 24 61 74 74 72  font $size $attr
9440: 0a 0a 20 20 73 65 74 20 61 73 63 32 20 5b 65 78  ..  set asc2 [ex
9450: 70 72 20 7b 24 73 69 7a 65 20 2a 20 30 2e 33 33  pr {$size * 0.33
9460: 7d 5d 0a 20 20 73 65 74 20 6d 61 72 67 69 6e 20  }].  set margin 
9470: 30 2e 37 0a 0a 20 20 73 65 74 20 74 69 63 6b 6c  0.7..  set tickl
9480: 65 6e 20 20 20 20 24 67 72 61 70 68 28 24 69 6e  en    $graph($in
9490: 64 65 78 2c 74 69 63 6b 6c 65 6e 67 74 68 29 0a  dex,ticklength).
94a0: 20 20 73 65 74 20 63 6f 6d 6d 61 6e 64 20 20 20    set command   
94b0: 20 24 67 72 61 70 68 28 24 69 6e 64 65 78 2c 63   $graph($index,c
94c0: 6f 6d 6d 61 6e 64 29 0a 20 20 73 65 74 20 73 75  ommand).  set su
94d0: 62 64 69 76 20 20 20 20 20 24 67 72 61 70 68 28  bdiv     $graph(
94e0: 24 69 6e 64 65 78 2c 73 75 62 64 69 76 69 73 69  $index,subdivisi
94f0: 6f 6e 73 29 0a 20 20 73 65 74 20 61 6e 67 6c 65  ons).  set angle
9500: 20 20 20 20 20 20 24 67 72 61 70 68 28 24 69 6e        $graph($in
9510: 64 65 78 2c 72 6f 74 61 74 65 29 0a 20 20 73 65  dex,rotate).  se
9520: 74 20 6c 6f 67 73 63 61 6c 65 20 20 20 24 67 72  t logscale   $gr
9530: 61 70 68 28 24 69 6e 64 65 78 2c 6c 6f 67 73 63  aph($index,logsc
9540: 61 6c 65 29 0a 20 20 73 65 74 20 6d 61 6a 6f 72  ale).  set major
9550: 74 69 63 6b 73 20 24 67 72 61 70 68 28 24 69 6e  ticks $graph($in
9560: 64 65 78 2c 6d 61 6a 6f 72 74 69 63 6b 73 29 0a  dex,majorticks).
9570: 20 20 73 65 74 20 6d 69 6e 6f 72 74 69 63 6b 73    set minorticks
9580: 20 24 67 72 61 70 68 28 24 69 6e 64 65 78 2c 6d   $graph($index,m
9590: 69 6e 6f 72 74 69 63 6b 73 29 0a 0a 20 20 73 65  inorticks)..  se
95a0: 74 20 66 69 72 73 74 20 20 24 67 72 61 70 68 28  t first  $graph(
95b0: 24 69 6e 64 65 78 2c 5f 66 69 72 73 74 29 0a 20  $index,_first). 
95c0: 20 73 65 74 20 6d 69 6e 20 20 20 20 24 67 72 61   set min    $gra
95d0: 70 68 28 24 69 6e 64 65 78 2c 5f 6d 69 6e 29 0a  ph($index,_min).
95e0: 20 20 73 65 74 20 6d 61 78 20 20 20 20 24 67 72    set max    $gr
95f0: 61 70 68 28 24 69 6e 64 65 78 2c 5f 6d 61 78 29  aph($index,_max)
9600: 0a 20 20 73 65 74 20 73 74 65 70 20 20 20 24 67  .  set step   $g
9610: 72 61 70 68 28 24 69 6e 64 65 78 2c 5f 73 74 65  raph($index,_ste
9620: 70 29 0a 20 20 73 65 74 20 73 74 65 70 73 20 20  p).  set steps  
9630: 24 67 72 61 70 68 28 24 69 6e 64 65 78 2c 5f 73  $graph($index,_s
9640: 74 65 70 73 29 0a 20 20 73 65 74 20 66 6f 72 6d  teps).  set form
9650: 61 74 20 24 67 72 61 70 68 28 24 69 6e 64 65 78  at $graph($index
9660: 2c 5f 66 6f 72 6d 61 74 29 0a 20 20 73 65 74 20  ,_format).  set 
9670: 76 61 6c 75 65 20 20 24 66 69 72 73 74 0a 0a 20  value  $first.. 
9680: 20 69 66 20 7b 24 73 75 62 64 69 76 20 3d 3d 20   if {$subdiv == 
9690: 7b 7d 7d 20 7b 0a 20 20 20 20 69 66 20 7b 24 6c  {}} {.    if {$l
96a0: 6f 67 73 63 61 6c 65 7d 20 7b 0a 20 20 20 20 20  ogscale} {.     
96b0: 20 73 65 74 20 73 75 62 64 69 76 20 31 30 0a 20   set subdiv 10. 
96c0: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
96d0: 20 20 73 65 74 20 73 75 62 64 69 76 20 32 0a 20    set subdiv 2. 
96e0: 20 20 20 7d 0a 20 20 7d 0a 20 20 73 65 74 20 73     }.  }.  set s
96f0: 75 62 73 74 65 70 20 5b 65 78 70 72 20 7b 64 6f  ubstep [expr {do
9700: 75 62 6c 65 28 24 73 74 65 70 29 20 2f 20 24 73  uble($step) / $s
9710: 75 62 64 69 76 7d 5d 0a 0a 20 20 73 65 74 20 64  ubdiv}]..  set d
9720: 6f 67 72 69 64 5f 6d 61 6a 6f 72 20 6e 6f 0a 20  ogrid_major no. 
9730: 20 73 65 74 20 64 6f 67 72 69 64 5f 6d 69 6e 6f   set dogrid_mino
9740: 72 20 6e 6f 0a 20 20 69 66 20 7b 21 24 67 72 61  r no.  if {!$gra
9750: 70 68 28 24 67 2c 67 72 69 64 2c 68 69 64 65 29  ph($g,grid,hide)
9760: 20 26 26 0a 20 20 20 20 20 20 28 24 67 72 61 70   &&.      ($grap
9770: 68 28 24 67 2c 67 72 69 64 2c 6d 61 70 78 29 20  h($g,grid,mapx) 
9780: 3d 3d 20 24 6e 61 6d 65 20 7c 7c 20 24 67 72 61  == $name || $gra
9790: 70 68 28 24 67 2c 67 72 69 64 2c 6d 61 70 79 29  ph($g,grid,mapy)
97a0: 20 3d 3d 20 24 6e 61 6d 65 29 7d 20 7b 0a 20 20   == $name)} {.  
97b0: 20 20 73 65 74 20 64 6f 67 72 69 64 5f 6d 61 6a    set dogrid_maj
97c0: 6f 72 20 79 65 73 0a 20 20 20 20 73 65 74 20 64  or yes.    set d
97d0: 6f 67 72 69 64 5f 6d 69 6e 6f 72 20 24 67 72 61  ogrid_minor $gra
97e0: 70 68 28 24 67 2c 67 72 69 64 2c 6d 69 6e 6f 72  ph($g,grid,minor
97f0: 29 0a 20 20 7d 0a 20 20 73 65 74 20 61 78 69 73  ).  }.  set axis
9800: 5f 6c 69 6e 65 77 20 20 24 67 72 61 70 68 28 24  _linew  $graph($
9810: 69 6e 64 65 78 2c 6c 69 6e 65 77 69 64 74 68 29  index,linewidth)
9820: 0a 20 20 73 65 74 20 67 72 69 64 5f 63 6f 6c 6f  .  set grid_colo
9830: 72 20 20 5b 47 65 74 52 47 42 20 24 67 72 61 70  r  [GetRGB $grap
9840: 68 28 24 67 2c 67 72 69 64 2c 63 6f 6c 6f 72 29  h($g,grid,color)
9850: 5d 0a 20 20 73 65 74 20 67 72 69 64 5f 6c 69 6e  ].  set grid_lin
9860: 65 77 20 20 24 67 72 61 70 68 28 24 67 2c 67 72  ew  $graph($g,gr
9870: 69 64 2c 6c 69 6e 65 77 69 64 74 68 29 0a 20 20  id,linewidth).  
9880: 73 65 74 20 67 72 69 64 5f 64 61 73 68 65 73 20  set grid_dashes 
9890: 24 67 72 61 70 68 28 24 67 2c 67 72 69 64 2c 64  $graph($g,grid,d
98a0: 61 73 68 65 73 29 0a 20 20 69 66 20 7b 24 61 78  ashes).  if {$ax
98b0: 69 73 5f 6c 69 6e 65 77 20 3d 3d 20 30 7d 20 7b  is_linew == 0} {
98c0: 0a 20 20 20 20 73 65 74 20 64 6f 67 72 69 64 5f  .    set dogrid_
98d0: 6d 61 6a 6f 72 20 66 61 6c 73 65 0a 20 20 20 20  major false.    
98e0: 73 65 74 20 64 6f 67 72 69 64 5f 6d 69 6e 6f 72  set dogrid_minor
98f0: 20 66 61 6c 73 65 0a 20 20 7d 0a 0a 20 20 73 77   false.  }..  sw
9900: 69 74 63 68 20 24 67 72 61 70 68 28 24 69 6e 64  itch $graph($ind
9910: 65 78 2c 5f 70 6c 61 63 65 29 20 7b 0a 20 20 20  ex,_place) {.   
9920: 20 78 61 78 69 73 20 7b 0a 20 20 20 20 20 20 4c   xaxis {.      L
9930: 69 6e 65 20 24 67 20 24 78 6c 20 24 79 74 20 24  ine $g $xl $yt $
9940: 78 72 20 24 79 74 0a 20 20 20 20 20 20 73 65 74  xr $yt.      set
9950: 20 79 5f 74 69 63 6b 31 20 24 79 74 0a 20 20 20   y_tick1 $yt.   
9960: 20 20 20 73 65 74 20 79 5f 74 69 63 6b 32 20 5b     set y_tick2 [
9970: 65 78 70 72 20 7b 24 79 74 20 2d 20 24 74 69 63  expr {$yt - $tic
9980: 6b 6c 65 6e 7d 5d 0a 20 20 20 20 20 20 73 65 74  klen}].      set
9990: 20 79 5f 74 69 63 6b 33 20 5b 65 78 70 72 20 7b   y_tick3 [expr {
99a0: 24 79 74 20 2d 20 24 74 69 63 6b 6c 65 6e 20 2f  $yt - $ticklen /
99b0: 20 32 2e 30 7d 5d 0a 20 20 20 20 20 20 73 65 74   2.0}].      set
99c0: 20 79 5f 74 65 78 74 20 20 24 79 62 0a 20 20 20   y_text  $yb.   
99d0: 20 20 20 69 66 20 7b 24 6d 61 6a 6f 72 74 69 63     if {$majortic
99e0: 6b 73 20 3d 3d 20 7b 7d 7d 20 7b 0a 09 66 6f 72  ks == {}} {..for
99f0: 20 7b 73 65 74 20 69 64 78 20 30 7d 20 7b 24 69   {set idx 0} {$i
9a00: 64 78 20 3c 20 24 73 74 65 70 73 7d 20 7b 69 6e  dx < $steps} {in
9a10: 63 72 20 69 64 78 7d 20 7b 0a 09 20 20 73 65 74  cr idx} {..  set
9a20: 20 74 78 74 20 5b 6c 69 6e 64 65 78 20 24 67 72   txt [lindex $gr
9a30: 61 70 68 28 24 69 6e 64 65 78 2c 5f 74 78 74 73  aph($index,_txts
9a40: 29 20 24 69 64 78 5d 0a 09 20 20 61 78 69 73 5f  ) $idx]..  axis_
9a50: 64 72 61 77 5f 74 69 63 6b 20 24 67 20 78 20 24  draw_tick $g x $
9a60: 76 61 6c 75 65 20 24 6d 69 6e 20 24 6d 61 78 20  value $min $max 
9a70: 24 78 6c 20 24 78 72 20 24 79 5f 74 69 63 6b 31  $xl $xr $y_tick1
9a80: 20 24 79 5f 74 69 63 6b 32 20 24 6d 61 72 67 69   $y_tick2 $margi
9a90: 6e 20 5c 0a 09 20 20 20 20 24 74 78 74 20 24 61  n \..    $txt $a
9aa0: 6e 67 6c 65 20 24 64 6f 67 72 69 64 5f 6d 61 6a  ngle $dogrid_maj
9ab0: 6f 72 20 24 67 72 69 64 5f 63 6f 6c 6f 72 20 24  or $grid_color $
9ac0: 67 72 69 64 5f 6c 69 6e 65 77 20 24 67 72 69 64  grid_linew $grid
9ad0: 5f 64 61 73 68 65 73 20 24 79 74 5f 67 72 61 70  _dashes $yt_grap
9ae0: 68 20 24 79 62 5f 67 72 61 70 68 0a 09 20 20 61  h $yb_graph..  a
9af0: 78 69 73 5f 64 72 61 77 5f 73 75 62 74 69 63 6b  xis_draw_subtick
9b00: 73 20 24 67 20 78 20 24 76 61 6c 75 65 20 24 73  s $g x $value $s
9b10: 75 62 64 69 76 20 24 73 74 65 70 20 24 73 75 62  ubdiv $step $sub
9b20: 73 74 65 70 20 24 6d 69 6e 20 24 6d 61 78 20 24  step $min $max $
9b30: 78 6c 20 24 78 72 20 24 6c 6f 67 73 63 61 6c 65  xl $xr $logscale
9b40: 20 5c 0a 09 20 20 20 20 24 79 5f 74 69 63 6b 31   \..    $y_tick1
9b50: 20 24 79 5f 74 69 63 6b 33 20 24 64 6f 67 72 69   $y_tick3 $dogri
9b60: 64 5f 6d 69 6e 6f 72 20 24 67 72 69 64 5f 63 6f  d_minor $grid_co
9b70: 6c 6f 72 20 24 67 72 69 64 5f 6c 69 6e 65 77 20  lor $grid_linew 
9b80: 24 67 72 69 64 5f 64 61 73 68 65 73 20 24 6d 69  $grid_dashes $mi
9b90: 6e 6f 72 74 69 63 6b 73 20 5c 0a 09 20 20 20 20  norticks \..    
9ba0: 24 79 74 5f 67 72 61 70 68 20 24 79 62 5f 67 72  $yt_graph $yb_gr
9bb0: 61 70 68 0a 09 20 20 73 65 74 20 76 61 6c 75 65  aph..  set value
9bc0: 20 5b 65 78 70 72 20 7b 24 76 61 6c 75 65 20 2b   [expr {$value +
9bd0: 20 24 73 74 65 70 7d 5d 0a 09 7d 0a 20 20 20 20   $step}]..}.    
9be0: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 73 65 74 20    } else {..set 
9bf0: 69 64 78 20 30 0a 20 20 20 20 20 20 20 20 66 6f  idx 0.        fo
9c00: 72 65 61 63 68 20 76 61 6c 75 65 20 24 6d 61 6a  reach value $maj
9c10: 6f 72 74 69 63 6b 73 20 7b 0a 09 20 20 73 65 74  orticks {..  set
9c20: 20 74 78 74 20 5b 6c 69 6e 64 65 78 20 24 67 72   txt [lindex $gr
9c30: 61 70 68 28 24 69 6e 64 65 78 2c 5f 74 78 74 73  aph($index,_txts
9c40: 29 20 24 69 64 78 5d 0a 09 20 20 61 78 69 73 5f  ) $idx]..  axis_
9c50: 64 72 61 77 5f 74 69 63 6b 20 24 67 20 78 20 24  draw_tick $g x $
9c60: 76 61 6c 75 65 20 24 6d 69 6e 20 24 6d 61 78 20  value $min $max 
9c70: 24 78 6c 20 24 78 72 20 24 79 5f 74 69 63 6b 31  $xl $xr $y_tick1
9c80: 20 24 79 5f 74 69 63 6b 32 20 24 6d 61 72 67 69   $y_tick2 $margi
9c90: 6e 20 5c 0a 09 20 20 20 20 24 74 78 74 20 24 61  n \..    $txt $a
9ca0: 6e 67 6c 65 20 24 64 6f 67 72 69 64 5f 6d 61 6a  ngle $dogrid_maj
9cb0: 6f 72 20 24 67 72 69 64 5f 63 6f 6c 6f 72 20 24  or $grid_color $
9cc0: 67 72 69 64 5f 6c 69 6e 65 77 20 24 67 72 69 64  grid_linew $grid
9cd0: 5f 64 61 73 68 65 73 20 24 79 74 5f 67 72 61 70  _dashes $yt_grap
9ce0: 68 20 24 79 62 5f 67 72 61 70 68 0a 09 20 20 69  h $yb_graph..  i
9cf0: 6e 63 72 20 69 64 78 0a 09 7d 0a 20 20 20 20 20  ncr idx..}.     
9d00: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 78 32 61   }.    }.    x2a
9d10: 78 69 73 20 7b 0a 20 20 20 20 20 20 4c 69 6e 65  xis {.      Line
9d20: 20 24 67 20 24 78 6c 20 24 79 62 20 24 78 72 20   $g $xl $yb $xr 
9d30: 24 79 62 0a 20 20 20 20 20 20 73 65 74 20 79 5f  $yb.      set y_
9d40: 74 69 63 6b 31 20 24 79 62 0a 20 20 20 20 20 20  tick1 $yb.      
9d50: 73 65 74 20 79 5f 74 69 63 6b 32 20 5b 65 78 70  set y_tick2 [exp
9d60: 72 20 7b 24 79 62 20 2b 20 24 74 69 63 6b 6c 65  r {$yb + $tickle
9d70: 6e 7d 5d 0a 20 20 20 20 20 20 73 65 74 20 79 5f  n}].      set y_
9d80: 74 69 63 6b 33 20 5b 65 78 70 72 20 7b 24 79 74  tick3 [expr {$yt
9d90: 20 2b 20 24 74 69 63 6b 6c 65 6e 20 2f 20 32 2e   + $ticklen / 2.
9da0: 30 7d 5d 0a 20 20 20 20 20 20 73 65 74 20 79 5f  0}].      set y_
9db0: 74 65 78 74 20 20 5b 65 78 70 72 20 7b 24 79 74  text  [expr {$yt
9dc0: 20 2d 20 5b 4c 69 6e 65 48 65 69 67 68 74 5d 7d   - [LineHeight]}
9dd0: 5d 0a 20 20 20 20 20 20 69 66 20 7b 24 6d 61 6a  ].      if {$maj
9de0: 6f 72 74 69 63 6b 73 20 3d 3d 20 7b 7d 7d 20 7b  orticks == {}} {
9df0: 0a 09 66 6f 72 20 7b 73 65 74 20 69 64 78 20 30  ..for {set idx 0
9e00: 7d 20 7b 24 69 64 78 20 3c 20 24 73 74 65 70 73  } {$idx < $steps
9e10: 7d 20 7b 69 6e 63 72 20 69 64 78 7d 20 7b 0a 09  } {incr idx} {..
9e20: 20 20 73 65 74 20 74 78 74 20 5b 6c 69 6e 64 65    set txt [linde
9e30: 78 20 24 67 72 61 70 68 28 24 69 6e 64 65 78 2c  x $graph($index,
9e40: 5f 74 78 74 73 29 20 24 69 64 78 5d 0a 09 20 20  _txts) $idx]..  
9e50: 61 78 69 73 5f 64 72 61 77 5f 74 69 63 6b 20 24  axis_draw_tick $
9e60: 67 20 78 32 20 24 76 61 6c 75 65 20 24 6d 69 6e  g x2 $value $min
9e70: 20 24 6d 61 78 20 24 78 6c 20 24 78 72 20 24 79   $max $xl $xr $y
9e80: 5f 74 69 63 6b 31 20 24 79 5f 74 69 63 6b 32 20  _tick1 $y_tick2 
9e90: 24 6d 61 72 67 69 6e 20 5c 0a 09 20 20 20 20 24  $margin \..    $
9ea0: 74 78 74 20 24 61 6e 67 6c 65 20 24 64 6f 67 72  txt $angle $dogr
9eb0: 69 64 5f 6d 61 6a 6f 72 20 24 67 72 69 64 5f 63  id_major $grid_c
9ec0: 6f 6c 6f 72 20 24 67 72 69 64 5f 6c 69 6e 65 77  olor $grid_linew
9ed0: 20 24 67 72 69 64 5f 64 61 73 68 65 73 20 24 79   $grid_dashes $y
9ee0: 74 5f 67 72 61 70 68 20 24 79 62 5f 67 72 61 70  t_graph $yb_grap
9ef0: 68 0a 09 20 20 61 78 69 73 5f 64 72 61 77 5f 73  h..  axis_draw_s
9f00: 75 62 74 69 63 6b 73 20 24 67 20 78 32 20 24 76  ubticks $g x2 $v
9f10: 61 6c 75 65 20 24 73 75 62 64 69 76 20 24 73 74  alue $subdiv $st
9f20: 65 70 20 24 73 75 62 73 74 65 70 20 24 6d 69 6e  ep $substep $min
9f30: 20 24 6d 61 78 20 24 78 6c 20 24 78 72 20 24 6c   $max $xl $xr $l
9f40: 6f 67 73 63 61 6c 65 20 5c 0a 09 20 20 20 20 24  ogscale \..    $
9f50: 79 5f 74 69 63 6b 31 20 24 79 5f 74 69 63 6b 33  y_tick1 $y_tick3
9f60: 20 24 64 6f 67 72 69 64 5f 6d 69 6e 6f 72 20 24   $dogrid_minor $
9f70: 67 72 69 64 5f 63 6f 6c 6f 72 20 24 67 72 69 64  grid_color $grid
9f80: 5f 6c 69 6e 65 77 20 24 67 72 69 64 5f 64 61 73  _linew $grid_das
9f90: 68 65 73 20 24 6d 69 6e 6f 72 74 69 63 6b 73 20  hes $minorticks 
9fa0: 5c 0a 09 20 20 20 20 24 79 74 5f 67 72 61 70 68  \..    $yt_graph
9fb0: 20 24 79 62 5f 67 72 61 70 68 0a 09 20 20 73 65   $yb_graph..  se
9fc0: 74 20 76 61 6c 75 65 20 5b 65 78 70 72 20 7b 24  t value [expr {$
9fd0: 76 61 6c 75 65 20 2b 20 24 73 74 65 70 7d 5d 0a  value + $step}].
9fe0: 09 7d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20  .}.      } else 
9ff0: 7b 0a 20 20 20 20 20 20 20 20 73 65 74 20 69 64  {.        set id
a000: 78 20 30 0a 09 66 6f 72 65 61 63 68 20 76 61 6c  x 0..foreach val
a010: 75 65 20 24 6d 61 6a 6f 72 74 69 63 6b 73 20 7b  ue $majorticks {
a020: 0a 09 20 20 73 65 74 20 74 78 74 20 5b 6c 69 6e  ..  set txt [lin
a030: 64 65 78 20 24 67 72 61 70 68 28 24 69 6e 64 65  dex $graph($inde
a040: 78 2c 5f 74 78 74 73 29 20 24 69 64 78 5d 0a 09  x,_txts) $idx]..
a050: 20 20 61 78 69 73 5f 64 72 61 77 5f 74 69 63 6b    axis_draw_tick
a060: 20 24 67 20 78 32 20 24 76 61 6c 75 65 20 24 6d   $g x2 $value $m
a070: 69 6e 20 24 6d 61 78 20 24 78 6c 20 24 78 72 20  in $max $xl $xr 
a080: 24 79 5f 74 69 63 6b 31 20 24 79 5f 74 69 63 6b  $y_tick1 $y_tick
a090: 32 20 24 6d 61 72 67 69 6e 20 5c 0a 09 20 20 20  2 $margin \..   
a0a0: 20 24 74 78 74 20 24 61 6e 67 6c 65 20 24 64 6f   $txt $angle $do
a0b0: 67 72 69 64 5f 6d 61 6a 6f 72 20 24 67 72 69 64  grid_major $grid
a0c0: 5f 63 6f 6c 6f 72 20 24 67 72 69 64 5f 6c 69 6e  _color $grid_lin
a0d0: 65 77 20 24 67 72 69 64 5f 64 61 73 68 65 73 20  ew $grid_dashes 
a0e0: 24 79 74 5f 67 72 61 70 68 20 24 79 62 5f 67 72  $yt_graph $yb_gr
a0f0: 61 70 68 0a 09 20 20 69 6e 63 72 20 69 64 78 0a  aph..  incr idx.
a100: 09 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  .}.      }.    }
a110: 0a 20 20 20 20 79 61 78 69 73 20 7b 0a 20 20 20  .    yaxis {.   
a120: 20 20 20 4c 69 6e 65 20 24 67 20 24 78 72 20 24     Line $g $xr $
a130: 79 74 20 24 78 72 20 24 79 62 0a 20 20 20 20 20  yt $xr $yb.     
a140: 20 73 65 74 20 78 5f 74 69 63 6b 31 20 24 78 72   set x_tick1 $xr
a150: 0a 20 20 20 20 20 20 73 65 74 20 78 5f 74 69 63  .      set x_tic
a160: 6b 32 20 5b 65 78 70 72 20 7b 24 78 72 20 2d 20  k2 [expr {$xr - 
a170: 24 74 69 63 6b 6c 65 6e 7d 5d 0a 20 20 20 20 20  $ticklen}].     
a180: 20 73 65 74 20 78 5f 74 69 63 6b 33 20 5b 65 78   set x_tick3 [ex
a190: 70 72 20 7b 24 78 72 20 2d 20 24 74 69 63 6b 6c  pr {$xr - $tickl
a1a0: 65 6e 20 2f 20 32 2e 30 7d 5d 0a 20 20 20 20 20  en / 2.0}].     
a1b0: 20 73 65 74 20 78 5f 74 65 78 74 20 20 5b 65 78   set x_text  [ex
a1c0: 70 72 20 7b 24 78 5f 74 69 63 6b 32 20 2d 20 24  pr {$x_tick2 - $
a1d0: 6d 61 72 67 69 6e 7d 5d 0a 20 20 20 20 20 20 69  margin}].      i
a1e0: 66 20 7b 24 6d 61 6a 6f 72 74 69 63 6b 73 20 3d  f {$majorticks =
a1f0: 3d 20 7b 7d 7d 20 7b 0a 09 66 6f 72 20 7b 73 65  = {}} {..for {se
a200: 74 20 69 64 78 20 30 7d 20 7b 24 69 64 78 20 3c  t idx 0} {$idx <
a210: 20 24 73 74 65 70 73 7d 20 7b 69 6e 63 72 20 69   $steps} {incr i
a220: 64 78 7d 20 7b 0a 09 20 20 73 65 74 20 74 78 74  dx} {..  set txt
a230: 20 5b 6c 69 6e 64 65 78 20 24 67 72 61 70 68 28   [lindex $graph(
a240: 24 69 6e 64 65 78 2c 5f 74 78 74 73 29 20 24 69  $index,_txts) $i
a250: 64 78 5d 0a 09 20 20 61 78 69 73 5f 64 72 61 77  dx]..  axis_draw
a260: 5f 74 69 63 6b 20 24 67 20 79 20 24 76 61 6c 75  _tick $g y $valu
a270: 65 20 24 6d 69 6e 20 24 6d 61 78 20 24 79 62 20  e $min $max $yb 
a280: 24 79 74 20 24 78 5f 74 69 63 6b 31 20 24 78 5f  $yt $x_tick1 $x_
a290: 74 69 63 6b 32 20 24 6d 61 72 67 69 6e 20 5c 0a  tick2 $margin \.
a2a0: 09 20 20 20 20 24 74 78 74 20 24 61 6e 67 6c 65  .    $txt $angle
a2b0: 20 24 64 6f 67 72 69 64 5f 6d 61 6a 6f 72 20 24   $dogrid_major $
a2c0: 67 72 69 64 5f 63 6f 6c 6f 72 20 24 67 72 69 64  grid_color $grid
a2d0: 5f 6c 69 6e 65 77 20 24 67 72 69 64 5f 64 61 73  _linew $grid_das
a2e0: 68 65 73 20 24 78 6c 5f 67 72 61 70 68 20 24 78  hes $xl_graph $x
a2f0: 72 5f 67 72 61 70 68 0a 09 20 20 61 78 69 73 5f  r_graph..  axis_
a300: 64 72 61 77 5f 73 75 62 74 69 63 6b 73 20 24 67  draw_subticks $g
a310: 20 79 20 24 76 61 6c 75 65 20 24 73 75 62 64 69   y $value $subdi
a320: 76 20 24 73 74 65 70 20 24 73 75 62 73 74 65 70  v $step $substep
a330: 20 24 6d 69 6e 20 24 6d 61 78 20 24 79 62 20 24   $min $max $yb $
a340: 79 74 20 24 6c 6f 67 73 63 61 6c 65 20 5c 0a 09  yt $logscale \..
a350: 20 20 20 20 24 78 5f 74 69 63 6b 31 20 24 78 5f      $x_tick1 $x_
a360: 74 69 63 6b 33 20 24 64 6f 67 72 69 64 5f 6d 69  tick3 $dogrid_mi
a370: 6e 6f 72 20 24 67 72 69 64 5f 63 6f 6c 6f 72 20  nor $grid_color 
a380: 24 67 72 69 64 5f 6c 69 6e 65 77 20 24 67 72 69  $grid_linew $gri
a390: 64 5f 64 61 73 68 65 73 20 24 6d 69 6e 6f 72 74  d_dashes $minort
a3a0: 69 63 6b 73 20 5c 0a 09 20 20 20 20 24 78 6c 5f  icks \..    $xl_
a3b0: 67 72 61 70 68 20 24 78 72 5f 67 72 61 70 68 0a  graph $xr_graph.
a3c0: 09 20 20 73 65 74 20 76 61 6c 75 65 20 5b 65 78  .  set value [ex
a3d0: 70 72 20 7b 24 76 61 6c 75 65 20 2b 20 24 73 74  pr {$value + $st
a3e0: 65 70 7d 5d 0a 09 7d 0a 20 20 20 20 20 20 7d 20  ep}]..}.      } 
a3f0: 65 6c 73 65 20 7b 0a 09 73 65 74 20 69 64 78 20  else {..set idx 
a400: 30 0a 20 20 20 20 20 20 20 20 66 6f 72 65 61 63  0.        foreac
a410: 68 20 76 61 6c 75 65 20 24 6d 61 6a 6f 72 74 69  h value $majorti
a420: 63 6b 73 20 7b 0a 09 20 20 73 65 74 20 74 78 74  cks {..  set txt
a430: 20 5b 6c 69 6e 64 65 78 20 24 67 72 61 70 68 28   [lindex $graph(
a440: 24 69 6e 64 65 78 2c 5f 74 78 74 73 29 20 24 69  $index,_txts) $i
a450: 64 78 5d 0a 09 20 20 61 78 69 73 5f 64 72 61 77  dx]..  axis_draw
a460: 5f 74 69 63 6b 20 24 67 20 79 20 24 76 61 6c 75  _tick $g y $valu
a470: 65 20 24 6d 69 6e 20 24 6d 61 78 20 24 79 62 20  e $min $max $yb 
a480: 24 79 74 20 24 78 5f 74 69 63 6b 31 20 24 78 5f  $yt $x_tick1 $x_
a490: 74 69 63 6b 32 20 24 6d 61 72 67 69 6e 20 5c 0a  tick2 $margin \.
a4a0: 09 20 20 20 20 24 74 78 74 20 24 61 6e 67 6c 65  .    $txt $angle
a4b0: 20 24 64 6f 67 72 69 64 5f 6d 61 6a 6f 72 20 24   $dogrid_major $
a4c0: 67 72 69 64 5f 63 6f 6c 6f 72 20 24 67 72 69 64  grid_color $grid
a4d0: 5f 6c 69 6e 65 77 20 24 67 72 69 64 5f 64 61 73  _linew $grid_das
a4e0: 68 65 73 20 24 78 6c 5f 67 72 61 70 68 20 24 78  hes $xl_graph $x
a4f0: 72 5f 67 72 61 70 68 0a 09 20 20 69 6e 63 72 20  r_graph..  incr 
a500: 69 64 78 0a 09 7d 0a 20 20 20 20 20 20 7d 0a 20  idx..}.      }. 
a510: 20 20 20 7d 0a 20 20 20 20 79 32 61 78 69 73 20     }.    y2axis 
a520: 7b 0a 20 20 20 20 20 20 4c 69 6e 65 20 24 67 20  {.      Line $g 
a530: 24 78 6c 20 24 79 74 20 24 78 6c 20 24 79 62 0a  $xl $yt $xl $yb.
a540: 20 20 20 20 20 20 73 65 74 20 78 5f 74 69 63 6b        set x_tick
a550: 31 20 24 78 6c 0a 20 20 20 20 20 20 73 65 74 20  1 $xl.      set 
a560: 78 5f 74 69 63 6b 32 20 5b 65 78 70 72 20 7b 24  x_tick2 [expr {$
a570: 78 6c 20 2b 20 24 74 69 63 6b 6c 65 6e 7d 5d 0a  xl + $ticklen}].
a580: 20 20 20 20 20 20 73 65 74 20 78 5f 74 69 63 6b        set x_tick
a590: 33 20 5b 65 78 70 72 20 7b 24 78 6c 20 2b 20 24  3 [expr {$xl + $
a5a0: 74 69 63 6b 6c 65 6e 20 2f 20 32 2e 30 7d 5d 0a  ticklen / 2.0}].
a5b0: 20 20 20 20 20 20 73 65 74 20 78 5f 74 65 78 74        set x_text
a5c0: 20 20 5b 65 78 70 72 20 7b 24 78 5f 74 69 63 6b    [expr {$x_tick
a5d0: 32 20 2b 20 24 6d 61 72 67 69 6e 7d 5d 0a 20 20  2 + $margin}].  
a5e0: 20 20 20 20 69 66 20 7b 24 6d 61 6a 6f 72 74 69      if {$majorti
a5f0: 63 6b 73 20 3d 3d 20 7b 7d 7d 20 7b 0a 09 66 6f  cks == {}} {..fo
a600: 72 20 7b 73 65 74 20 69 64 78 20 30 7d 20 7b 24  r {set idx 0} {$
a610: 69 64 78 20 3c 20 24 73 74 65 70 73 7d 20 7b 69  idx < $steps} {i
a620: 6e 63 72 20 69 64 78 7d 20 7b 0a 09 20 20 73 65  ncr idx} {..  se
a630: 74 20 74 78 74 20 5b 6c 69 6e 64 65 78 20 24 67  t txt [lindex $g
a640: 72 61 70 68 28 24 69 6e 64 65 78 2c 5f 74 78 74  raph($index,_txt
a650: 73 29 20 24 69 64 78 5d 0a 09 20 20 61 78 69 73  s) $idx]..  axis
a660: 5f 64 72 61 77 5f 74 69 63 6b 20 24 67 20 79 32  _draw_tick $g y2
a670: 20 24 76 61 6c 75 65 20 24 6d 69 6e 20 24 6d 61   $value $min $ma
a680: 78 20 24 79 62 20 24 79 74 20 24 78 5f 74 69 63  x $yb $yt $x_tic
a690: 6b 31 20 24 78 5f 74 69 63 6b 32 20 24 6d 61 72  k1 $x_tick2 $mar
a6a0: 67 69 6e 20 5c 0a 09 20 20 20 20 24 74 78 74 20  gin \..    $txt 
a6b0: 24 61 6e 67 6c 65 20 24 64 6f 67 72 69 64 5f 6d  $angle $dogrid_m
a6c0: 61 6a 6f 72 20 24 67 72 69 64 5f 63 6f 6c 6f 72  ajor $grid_color
a6d0: 20 24 67 72 69 64 5f 6c 69 6e 65 77 20 24 67 72   $grid_linew $gr
a6e0: 69 64 5f 64 61 73 68 65 73 20 24 78 6c 5f 67 72  id_dashes $xl_gr
a6f0: 61 70 68 20 24 78 72 5f 67 72 61 70 68 0a 09 20  aph $xr_graph.. 
a700: 20 61 78 69 73 5f 64 72 61 77 5f 73 75 62 74 69   axis_draw_subti
a710: 63 6b 73 20 24 67 20 79 32 20 24 76 61 6c 75 65  cks $g y2 $value
a720: 20 24 73 75 62 64 69 76 20 24 73 74 65 70 20 24   $subdiv $step $
a730: 73 75 62 73 74 65 70 20 24 6d 69 6e 20 24 6d 61  substep $min $ma
a740: 78 20 24 79 62 20 24 79 74 20 24 6c 6f 67 73 63  x $yb $yt $logsc
a750: 61 6c 65 20 5c 0a 09 20 20 20 20 24 78 5f 74 69  ale \..    $x_ti
a760: 63 6b 31 20 24 78 5f 74 69 63 6b 33 20 24 64 6f  ck1 $x_tick3 $do
a770: 67 72 69 64 5f 6d 69 6e 6f 72 20 24 67 72 69 64  grid_minor $grid
a780: 5f 63 6f 6c 6f 72 20 24 67 72 69 64 5f 6c 69 6e  _color $grid_lin
a790: 65 77 20 24 67 72 69 64 5f 64 61 73 68 65 73 20  ew $grid_dashes 
a7a0: 24 6d 69 6e 6f 72 74 69 63 6b 73 20 5c 0a 09 20  $minorticks \.. 
a7b0: 20 20 20 24 78 6c 5f 67 72 61 70 68 20 24 78 72     $xl_graph $xr
a7c0: 5f 67 72 61 70 68 0a 09 20 20 73 65 74 20 76 61  _graph..  set va
a7d0: 6c 75 65 20 5b 65 78 70 72 20 7b 24 76 61 6c 75  lue [expr {$valu
a7e0: 65 20 2b 20 24 73 74 65 70 7d 5d 0a 09 7d 0a 20  e + $step}]..}. 
a7f0: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20       } else {.  
a800: 20 20 20 20 20 20 73 65 74 20 69 64 78 20 30 0a        set idx 0.
a810: 09 66 6f 72 65 61 63 68 20 76 61 6c 75 65 20 24  .foreach value $
a820: 6d 61 6a 6f 72 74 69 63 6b 73 20 7b 0a 09 20 20  majorticks {..  
a830: 73 65 74 20 74 78 74 20 5b 6c 69 6e 64 65 78 20  set txt [lindex 
a840: 24 67 72 61 70 68 28 24 69 6e 64 65 78 2c 5f 74  $graph($index,_t
a850: 78 74 73 29 20 24 69 64 78 5d 0a 09 20 20 61 78  xts) $idx]..  ax
a860: 69 73 5f 64 72 61 77 5f 74 69 63 6b 20 24 67 20  is_draw_tick $g 
a870: 79 32 20 24 76 61 6c 75 65 20 24 6d 69 6e 20 24  y2 $value $min $
a880: 6d 61 78 20 24 79 62 20 24 79 74 20 24 78 5f 74  max $yb $yt $x_t
a890: 69 63 6b 31 20 24 78 5f 74 69 63 6b 32 20 24 6d  ick1 $x_tick2 $m
a8a0: 61 72 67 69 6e 20 5c 0a 09 20 20 20 20 24 74 78  argin \..    $tx
a8b0: 74 20 24 61 6e 67 6c 65 20 24 64 6f 67 72 69 64  t $angle $dogrid
a8c0: 5f 6d 61 6a 6f 72 20 24 67 72 69 64 5f 63 6f 6c  _major $grid_col
a8d0: 6f 72 20 24 67 72 69 64 5f 6c 69 6e 65 77 20 24  or $grid_linew $
a8e0: 67 72 69 64 5f 64 61 73 68 65 73 20 24 78 6c 5f  grid_dashes $xl_
a8f0: 67 72 61 70 68 20 24 78 72 5f 67 72 61 70 68 0a  graph $xr_graph.
a900: 09 20 20 69 6e 63 72 20 69 64 78 0a 09 7d 0a 20  .  incr idx..}. 
a910: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
a920: 0a 7d 0a 0a 0a 70 72 6f 63 20 67 72 61 70 68 3a  .}...proc graph:
a930: 3a 61 78 69 73 5f 69 6e 76 61 6c 69 64 61 74 65  :axis_invalidate
a940: 20 7b 20 67 20 7d 20 7b 0a 20 20 76 61 72 69 61   { g } {.  varia
a950: 62 6c 65 20 67 72 61 70 68 0a 0a 20 20 66 6f 72  ble graph..  for
a960: 65 61 63 68 20 6e 61 6d 65 20 24 67 72 61 70 68  each name $graph
a970: 28 24 67 2c 5f 61 78 69 73 65 73 29 20 7b 0a 20  ($g,_axises) {. 
a980: 20 20 20 73 65 74 20 67 72 61 70 68 28 24 67 2c     set graph($g,
a990: 61 78 69 73 2d 24 6e 61 6d 65 2c 5f 76 61 6c 69  axis-$name,_vali
a9a0: 64 29 20 6e 6f 0a 20 20 7d 0a 7d 0a 0a 23 23 23  d) no.  }.}..###
a9b0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
a9c0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
a9d0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
a9e0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
a9f0: 23 23 23 23 23 23 23 23 23 23 23 23 0a 23 0a 23  ############.#.#
aa00: 20 6c 65 67 65 6e 64 20 63 6f 6d 70 6f 6e 65 6e   legend componen
aa10: 74 73 0a 23 0a 0a 70 72 6f 63 20 67 72 61 70 68  ts.#..proc graph
aa20: 3a 3a 6c 65 67 65 6e 64 20 7b 20 67 20 6f 70 65  ::legend { g ope
aa30: 72 61 74 69 6f 6e 20 70 61 72 61 6d 73 20 7d 20  ration params } 
aa40: 7b 0a 20 20 76 61 72 69 61 62 6c 65 20 67 72 61  {.  variable gra
aa50: 70 68 0a 0a 20 20 73 77 69 74 63 68 20 2d 2d 20  ph..  switch -- 
aa60: 24 6f 70 65 72 61 74 69 6f 6e 20 7b 0a 20 20 20  $operation {.   
aa70: 20 63 6f 6e 66 69 67 75 72 65 20 7b 0a 20 20 20   configure {.   
aa80: 20 20 20 6f 62 6a 5f 63 6f 6e 66 69 67 75 72 65     obj_configure
aa90: 20 24 67 2c 6c 65 67 65 6e 64 20 24 70 61 72 61   $g,legend $para
aaa0: 6d 73 0a 20 20 20 20 7d 0a 20 20 20 20 63 67 65  ms.    }.    cge
aab0: 74 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  t {.      return
aac0: 20 5b 6f 62 6a 5f 63 67 65 74 20 24 67 2c 6c 65   [obj_cget $g,le
aad0: 67 65 6e 64 20 24 70 61 72 61 6d 73 20 31 5d 0a  gend $params 1].
aae0: 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c      }.    defaul
aaf0: 74 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  t {.      return
ab00: 20 2d 63 6f 64 65 20 65 72 72 6f 72 20 22 75 6e   -code error "un
ab10: 6b 6e 6f 77 6e 20 6f 70 65 72 61 74 69 6f 6e 20  known operation 
ab20: 5c 22 24 6f 70 65 72 61 74 69 6f 6e 5c 22 22 0a  \"$operation\"".
ab30: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a 70 72      }.  }.}...pr
ab40: 6f 63 20 67 72 61 70 68 3a 3a 6c 65 67 65 6e 64  oc graph::legend
ab50: 5f 63 61 6c 63 20 7b 20 67 20 7d 20 7b 0a 20 20  _calc { g } {.  
ab60: 76 61 72 69 61 62 6c 65 20 67 72 61 70 68 0a 0a  variable graph..
ab70: 20 20 73 65 74 20 74 69 74 6c 65 73 20 7b 7d 0a    set titles {}.
ab80: 20 20 66 6f 72 65 61 63 68 20 65 6c 65 6d 20 24    foreach elem $
ab90: 67 72 61 70 68 28 24 67 2c 5f 65 6c 65 6d 65 6e  graph($g,_elemen
aba0: 74 73 29 20 7b 0a 20 20 20 20 73 65 74 20 69 6e  ts) {.    set in
abb0: 64 65 78 20 24 67 2c 65 6c 65 6d 2d 24 65 6c 65  dex $g,elem-$ele
abc0: 6d 0a 20 20 20 20 69 66 20 7b 24 67 72 61 70 68  m.    if {$graph
abd0: 28 24 69 6e 64 65 78 2c 5f 76 61 6c 69 64 29 7d  ($index,_valid)}
abe0: 20 7b 0a 20 20 20 20 20 20 6c 61 70 70 65 6e 64   {.      lappend
abf0: 20 74 69 74 6c 65 73 20 24 67 72 61 70 68 28 24   titles $graph($
ac00: 69 6e 64 65 78 2c 5f 74 69 74 6c 65 29 0a 20 20  index,_title).  
ac10: 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 65 74 20 69    }.  }..  set i
ac20: 6e 64 65 78 20 24 67 2c 6c 65 67 65 6e 64 0a 20  ndex $g,legend. 
ac30: 20 69 66 20 7b 24 67 72 61 70 68 28 24 69 6e 64   if {$graph($ind
ac40: 65 78 2c 68 69 64 65 29 7d 20 7b 0a 20 20 20 20  ex,hide)} {.    
ac50: 73 65 74 20 67 72 61 70 68 28 24 69 6e 64 65 78  set graph($index
ac60: 2c 5f 76 61 6c 69 64 29 20 6e 6f 0a 20 20 20 20  ,_valid) no.    
ac70: 72 65 74 75 72 6e 0a 20 20 7d 0a 20 20 73 77 69  return.  }.  swi
ac80: 74 63 68 20 24 67 72 61 70 68 28 24 69 6e 64 65  tch $graph($inde
ac90: 78 2c 70 6f 73 69 74 69 6f 6e 29 20 7b 0a 20 20  x,position) {.  
aca0: 20 20 6c 65 66 74 20 2d 20 72 69 67 68 74 20 7b    left - right {
acb0: 20 73 65 74 20 69 6e 6d 61 72 67 69 6e 20 79 65   set inmargin ye
acc0: 73 3b 20 73 65 74 20 67 72 61 70 68 28 24 69 6e  s; set graph($in
acd0: 64 65 78 2c 5f 6f 72 69 65 6e 74 61 74 69 6f 6e  dex,_orientation
ace0: 29 20 76 65 72 74 69 63 61 6c 20 20 20 7d 0a 20  ) vertical   }. 
acf0: 20 20 20 74 6f 70 20 2d 20 62 6f 74 74 6f 6d 20     top - bottom 
ad00: 7b 20 73 65 74 20 69 6e 6d 61 72 67 69 6e 20 79  { set inmargin y
ad10: 65 73 3b 20 73 65 74 20 67 72 61 70 68 28 24 69  es; set graph($i
ad20: 6e 64 65 78 2c 5f 6f 72 69 65 6e 74 61 74 69 6f  ndex,_orientatio
ad30: 6e 29 20 68 6f 72 69 7a 6f 6e 74 61 6c 20 7d 0a  n) horizontal }.
ad40: 20 20 20 20 64 65 66 61 75 6c 74 20 20 20 20 20      default     
ad50: 20 7b 20 73 65 74 20 69 6e 6d 61 72 67 69 6e 20   { set inmargin 
ad60: 6e 6f 3b 20 20 73 65 74 20 67 72 61 70 68 28 24  no;  set graph($
ad70: 69 6e 64 65 78 2c 5f 6f 72 69 65 6e 74 61 74 69  index,_orientati
ad80: 6f 6e 29 20 76 65 72 74 69 63 61 6c 20 20 20 7d  on) vertical   }
ad90: 0a 20 20 7d 0a 20 20 73 65 74 20 67 72 61 70 68  .  }.  set graph
ada0: 28 24 69 6e 64 65 78 2c 5f 69 6e 6d 61 72 67 69  ($index,_inmargi
adb0: 6e 29 20 24 69 6e 6d 61 72 67 69 6e 0a 0a 20 20  n) $inmargin..  
adc0: 69 66 20 7b 24 74 69 74 6c 65 73 20 3d 3d 20 7b  if {$titles == {
add0: 7d 7d 20 7b 0a 20 20 20 20 73 65 74 20 67 72 61  }} {.    set gra
ade0: 70 68 28 24 69 6e 64 65 78 2c 5f 77 69 64 74 68  ph($index,_width
adf0: 29 20 20 30 0a 20 20 20 20 73 65 74 20 67 72 61  )  0.    set gra
ae00: 70 68 28 24 69 6e 64 65 78 2c 5f 68 65 69 67 68  ph($index,_heigh
ae10: 74 29 20 30 0a 20 20 20 20 73 65 74 20 67 72 61  t) 0.    set gra
ae20: 70 68 28 24 69 6e 64 65 78 2c 5f 76 61 6c 69 64  ph($index,_valid
ae30: 29 20 20 6e 6f 0a 20 20 20 20 72 65 74 75 72 6e  )  no.    return
ae40: 0a 20 20 7d 0a 20 20 73 65 74 20 63 6f 75 6e 74  .  }.  set count
ae50: 20 5b 6c 6c 65 6e 67 74 68 20 24 74 69 74 6c 65   [llength $title
ae60: 73 5d 0a 0a 20 20 66 6f 72 65 61 63 68 20 7b 66  s]..  foreach {f
ae70: 6f 6e 74 20 73 69 7a 65 20 61 74 74 72 7d 20 24  ont size attr} $
ae80: 67 72 61 70 68 28 24 69 6e 64 65 78 2c 66 6f 6e  graph($index,fon
ae90: 74 29 20 7b 7d 0a 20 20 53 65 74 46 6f 6e 74 20  t) {}.  SetFont 
aea0: 24 67 20 24 66 6f 6e 74 20 24 73 69 7a 65 20 24  $g $font $size $
aeb0: 61 74 74 72 0a 0a 20 20 73 65 74 20 6f 62 6a 77  attr..  set objw
aec0: 69 64 74 68 20 5b 65 78 70 72 20 7b 31 2e 35 20  idth [expr {1.5 
aed0: 2a 20 24 73 69 7a 65 7d 5d 0a 20 20 73 65 74 20  * $size}].  set 
aee0: 6f 62 6a 73 69 7a 65 20 20 5b 65 78 70 72 20 7b  objsize  [expr {
aef0: 24 73 69 7a 65 20 2f 20 33 2e 30 7d 5d 0a 0a 20  $size / 3.0}].. 
af00: 20 73 65 74 20 67 72 61 70 68 28 24 69 6e 64 65   set graph($inde
af10: 78 2c 5f 6f 62 6a 77 69 64 74 68 29 20 24 6f 62  x,_objwidth) $ob
af20: 6a 77 69 64 74 68 0a 20 20 73 65 74 20 67 72 61  jwidth.  set gra
af30: 70 68 28 24 69 6e 64 65 78 2c 5f 6f 62 6a 73 69  ph($index,_objsi
af40: 7a 65 29 20 20 24 6f 62 6a 73 69 7a 65 0a 0a 20  ze)  $objsize.. 
af50: 20 73 65 74 20 70 61 64 78 20 20 24 67 72 61 70   set padx  $grap
af60: 68 28 24 69 6e 64 65 78 2c 70 61 64 78 29 0a 20  h($index,padx). 
af70: 20 73 65 74 20 70 61 64 79 20 20 24 67 72 61 70   set pady  $grap
af80: 68 28 24 69 6e 64 65 78 2c 70 61 64 79 29 0a 20  h($index,pady). 
af90: 20 73 65 74 20 69 70 61 64 78 20 24 67 72 61 70   set ipadx $grap
afa0: 68 28 24 69 6e 64 65 78 2c 69 70 61 64 78 29 0a  h($index,ipadx).
afb0: 20 20 73 65 74 20 69 70 61 64 79 20 24 67 72 61    set ipady $gra
afc0: 70 68 28 24 69 6e 64 65 78 2c 69 70 61 64 79 29  ph($index,ipady)
afd0: 0a 20 20 73 65 74 20 62 64 77 20 20 20 24 67 72  .  set bdw   $gr
afe0: 61 70 68 28 24 69 6e 64 65 78 2c 62 6f 72 64 65  aph($index,borde
aff0: 72 77 69 64 74 68 29 0a 0a 20 20 69 66 20 7b 24  rwidth)..  if {$
b000: 67 72 61 70 68 28 24 69 6e 64 65 78 2c 5f 6f 72  graph($index,_or
b010: 69 65 6e 74 61 74 69 6f 6e 29 20 3d 3d 20 22 76  ientation) == "v
b020: 65 72 74 69 63 61 6c 22 7d 20 7b 0a 20 20 20 20  ertical"} {.    
b030: 73 65 74 20 67 72 61 70 68 28 24 69 6e 64 65 78  set graph($index
b040: 2c 5f 68 65 69 67 68 74 29 20 5b 65 78 70 72 20  ,_height) [expr 
b050: 7b 24 63 6f 75 6e 74 20 2a 20 28 5b 4c 69 6e 65  {$count * ([Line
b060: 48 65 69 67 68 74 5d 20 2b 20 24 69 70 61 64 79  Height] + $ipady
b070: 29 20 2b 20 24 69 70 61 64 79 7d 5d 0a 20 20 20  ) + $ipady}].   
b080: 20 73 65 74 20 6d 61 78 77 69 64 74 68 20 30 0a   set maxwidth 0.
b090: 20 20 20 20 66 6f 72 65 61 63 68 20 74 69 74 6c      foreach titl
b0a0: 65 20 24 74 69 74 6c 65 73 20 7b 0a 20 20 20 20  e $titles {.    
b0b0: 20 20 73 65 74 20 74 78 74 77 69 64 74 68 20 5b    set txtwidth [
b0c0: 54 65 78 74 57 69 64 74 68 20 24 74 69 74 6c 65  TextWidth $title
b0d0: 5d 0a 20 20 20 20 20 20 73 65 74 20 77 69 64 74  ].      set widt
b0e0: 68 20 5b 65 78 70 72 20 7b 24 6f 62 6a 77 69 64  h [expr {$objwid
b0f0: 74 68 20 2b 20 24 69 70 61 64 78 20 2b 20 24 74  th + $ipadx + $t
b100: 78 74 77 69 64 74 68 7d 5d 0a 20 20 20 20 20 20  xtwidth}].      
b110: 69 66 20 7b 24 77 69 64 74 68 20 3e 20 24 6d 61  if {$width > $ma
b120: 78 77 69 64 74 68 7d 20 7b 20 73 65 74 20 6d 61  xwidth} { set ma
b130: 78 77 69 64 74 68 20 24 77 69 64 74 68 20 7d 0a  xwidth $width }.
b140: 20 20 20 20 7d 0a 20 20 20 20 73 65 74 20 67 72      }.    set gr
b150: 61 70 68 28 24 69 6e 64 65 78 2c 5f 77 69 64 74  aph($index,_widt
b160: 68 29 20 5b 65 78 70 72 20 7b 24 69 70 61 64 78  h) [expr {$ipadx
b170: 20 2b 20 24 6d 61 78 77 69 64 74 68 20 2b 20 24   + $maxwidth + $
b180: 69 70 61 64 78 7d 5d 0a 20 20 7d 20 65 6c 73 65  ipadx}].  } else
b190: 20 7b 0a 20 20 20 20 73 65 74 20 67 72 61 70 68   {.    set graph
b1a0: 28 24 69 6e 64 65 78 2c 5f 68 65 69 67 68 74 29  ($index,_height)
b1b0: 20 5b 65 78 70 72 20 7b 5b 4c 69 6e 65 48 65 69   [expr {[LineHei
b1c0: 67 68 74 5d 20 2b 20 32 20 2a 20 24 69 70 61 64  ght] + 2 * $ipad
b1d0: 79 7d 5d 0a 20 20 20 20 73 65 74 20 73 75 6d 77  y}].    set sumw
b1e0: 69 64 74 68 20 30 0a 20 20 20 20 66 6f 72 65 61  idth 0.    forea
b1f0: 63 68 20 74 69 74 6c 65 20 24 74 69 74 6c 65 73  ch title $titles
b200: 20 7b 0a 20 20 20 20 20 20 73 65 74 20 74 78 74   {.      set txt
b210: 77 69 64 74 68 20 5b 54 65 78 74 57 69 64 74 68  width [TextWidth
b220: 20 24 74 69 74 6c 65 5d 0a 20 20 20 20 20 20 73   $title].      s
b230: 65 74 20 77 69 64 74 68 20 5b 65 78 70 72 20 7b  et width [expr {
b240: 24 6f 62 6a 77 69 64 74 68 20 2b 20 24 69 70 61  $objwidth + $ipa
b250: 64 78 20 2b 20 24 74 78 74 77 69 64 74 68 7d 5d  dx + $txtwidth}]
b260: 0a 20 20 20 20 20 20 73 65 74 20 73 75 6d 77 69  .      set sumwi
b270: 64 74 68 20 5b 65 78 70 72 20 7b 24 73 75 6d 77  dth [expr {$sumw
b280: 69 64 74 68 20 2b 20 24 69 70 61 64 78 20 2b 20  idth + $ipadx + 
b290: 24 77 69 64 74 68 7d 5d 0a 20 20 20 20 7d 0a 20  $width}].    }. 
b2a0: 20 20 20 73 65 74 20 67 72 61 70 68 28 24 69 6e     set graph($in
b2b0: 64 65 78 2c 5f 77 69 64 74 68 29 20 5b 65 78 70  dex,_width) [exp
b2c0: 72 20 7b 24 73 75 6d 77 69 64 74 68 20 2b 20 24  r {$sumwidth + $
b2d0: 69 70 61 64 78 7d 5d 0a 20 20 7d 0a 20 20 73 65  ipadx}].  }.  se
b2e0: 74 20 67 72 61 70 68 28 24 69 6e 64 65 78 2c 5f  t graph($index,_
b2f0: 77 69 64 74 68 29 20 20 5b 65 78 70 72 20 7b 24  width)  [expr {$
b300: 67 72 61 70 68 28 24 69 6e 64 65 78 2c 5f 77 69  graph($index,_wi
b310: 64 74 68 29 20 20 2b 20 32 20 2a 20 28 24 62 64  dth)  + 2 * ($bd
b320: 77 20 2b 20 24 70 61 64 78 29 7d 5d 0a 20 20 73  w + $padx)}].  s
b330: 65 74 20 67 72 61 70 68 28 24 69 6e 64 65 78 2c  et graph($index,
b340: 5f 68 65 69 67 68 74 29 20 5b 65 78 70 72 20 7b  _height) [expr {
b350: 24 67 72 61 70 68 28 24 69 6e 64 65 78 2c 5f 68  $graph($index,_h
b360: 65 69 67 68 74 29 20 2b 20 32 20 2a 20 28 24 62  eight) + 2 * ($b
b370: 64 77 20 2b 20 24 70 61 64 79 29 7d 5d 0a 20 20  dw + $pady)}].  
b380: 73 65 74 20 67 72 61 70 68 28 24 69 6e 64 65 78  set graph($index
b390: 2c 5f 76 61 6c 69 64 29 20 20 79 65 73 0a 7d 0a  ,_valid)  yes.}.
b3a0: 0a 0a 70 72 6f 63 20 67 72 61 70 68 3a 3a 6c 65  ..proc graph::le
b3b0: 67 65 6e 64 5f 64 72 61 77 20 7b 20 67 20 78 5f  gend_draw { g x_
b3c0: 6c 65 66 74 20 79 5f 74 6f 70 20 78 5f 72 69 67  left y_top x_rig
b3d0: 68 74 20 79 5f 62 6f 74 74 6f 6d 20 7d 20 7b 0a  ht y_bottom } {.
b3e0: 20 20 76 61 72 69 61 62 6c 65 20 67 72 61 70 68    variable graph
b3f0: 0a 0a 20 20 73 65 74 20 69 6e 64 65 78 20 24 67  ..  set index $g
b400: 2c 6c 65 67 65 6e 64 0a 0a 20 20 73 65 74 20 70  ,legend..  set p
b410: 61 64 78 20 20 20 24 67 72 61 70 68 28 24 69 6e  adx   $graph($in
b420: 64 65 78 2c 70 61 64 78 29 0a 20 20 73 65 74 20  dex,padx).  set 
b430: 70 61 64 79 20 20 20 24 67 72 61 70 68 28 24 69  pady   $graph($i
b440: 6e 64 65 78 2c 70 61 64 79 29 0a 20 20 73 65 74  ndex,pady).  set
b450: 20 69 70 61 64 78 20 20 24 67 72 61 70 68 28 24   ipadx  $graph($
b460: 69 6e 64 65 78 2c 69 70 61 64 78 29 0a 20 20 73  index,ipadx).  s
b470: 65 74 20 69 70 61 64 79 20 20 24 67 72 61 70 68  et ipady  $graph
b480: 28 24 69 6e 64 65 78 2c 69 70 61 64 79 29 0a 20  ($index,ipady). 
b490: 20 73 65 74 20 62 64 77 20 20 20 20 24 67 72 61   set bdw    $gra
b4a0: 70 68 28 24 69 6e 64 65 78 2c 62 6f 72 64 65 72  ph($index,border
b4b0: 77 69 64 74 68 29 0a 20 20 73 65 74 20 62 67 63  width).  set bgc
b4c0: 20 20 20 20 24 67 72 61 70 68 28 24 69 6e 64 65      $graph($inde
b4d0: 78 2c 62 61 63 6b 67 72 6f 75 6e 64 29 0a 20 20  x,background).  
b4e0: 73 65 74 20 66 67 63 20 20 20 20 24 67 72 61 70  set fgc    $grap
b4f0: 68 28 24 69 6e 64 65 78 2c 66 6f 72 65 67 72 6f  h($index,foregro
b500: 75 6e 64 29 0a 20 20 73 65 74 20 72 65 6c 20 20  und).  set rel  
b510: 20 20 24 67 72 61 70 68 28 24 69 6e 64 65 78 2c    $graph($index,
b520: 72 65 6c 69 65 66 29 0a 20 20 73 65 74 20 61 6e  relief).  set an
b530: 63 68 6f 72 20 24 67 72 61 70 68 28 24 69 6e 64  chor $graph($ind
b540: 65 78 2c 61 6e 63 68 6f 72 29 0a 20 20 73 65 74  ex,anchor).  set
b550: 20 70 6f 73 20 20 20 20 24 67 72 61 70 68 28 24   pos    $graph($
b560: 69 6e 64 65 78 2c 70 6f 73 69 74 69 6f 6e 29 0a  index,position).
b570: 0a 20 20 69 66 20 7b 24 70 6f 73 20 3d 3d 20 22  .  if {$pos == "
b580: 70 6c 6f 74 61 72 65 61 22 7d 20 7b 20 73 65 74  plotarea"} { set
b590: 20 70 6f 73 20 74 6f 70 20 7d 0a 0a 20 20 73 65   pos top }..  se
b5a0: 74 20 77 69 64 74 68 20 20 20 20 20 20 20 24 67  t width       $g
b5b0: 72 61 70 68 28 24 69 6e 64 65 78 2c 5f 77 69 64  raph($index,_wid
b5c0: 74 68 29 0a 20 20 73 65 74 20 68 65 69 67 68 74  th).  set height
b5d0: 20 20 20 20 20 20 24 67 72 61 70 68 28 24 69 6e        $graph($in
b5e0: 64 65 78 2c 5f 68 65 69 67 68 74 29 0a 20 20 73  dex,_height).  s
b5f0: 65 74 20 6f 62 6a 77 69 64 74 68 20 20 20 20 24  et objwidth    $
b600: 67 72 61 70 68 28 24 69 6e 64 65 78 2c 5f 6f 62  graph($index,_ob
b610: 6a 77 69 64 74 68 29 0a 20 20 73 65 74 20 6f 62  jwidth).  set ob
b620: 6a 73 69 7a 65 20 20 20 20 20 24 67 72 61 70 68  jsize     $graph
b630: 28 24 69 6e 64 65 78 2c 5f 6f 62 6a 73 69 7a 65  ($index,_objsize
b640: 29 0a 20 20 73 65 74 20 6f 72 69 65 6e 74 61 74  ).  set orientat
b650: 69 6f 6e 20 24 67 72 61 70 68 28 24 69 6e 64 65  ion $graph($inde
b660: 78 2c 5f 6f 72 69 65 6e 74 61 74 69 6f 6e 29 0a  x,_orientation).
b670: 0a 20 20 73 65 74 20 78 6c 20 24 78 5f 6c 65 66  .  set xl $x_lef
b680: 74 0a 20 20 73 65 74 20 78 72 20 5b 65 78 70 72  t.  set xr [expr
b690: 20 7b 24 78 6c 20 2b 20 24 77 69 64 74 68 7d 5d   {$xl + $width}]
b6a0: 0a 20 20 73 65 74 20 79 74 20 24 79 5f 74 6f 70  .  set yt $y_top
b6b0: 0a 20 20 73 65 74 20 79 62 20 5b 65 78 70 72 20  .  set yb [expr 
b6c0: 7b 24 79 74 20 2d 20 24 68 65 69 67 68 74 7d 5d  {$yt - $height}]
b6d0: 0a 0a 20 20 73 77 69 74 63 68 20 2d 67 6c 6f 62  ..  switch -glob
b6e0: 20 2d 2d 20 24 70 6f 73 20 7b 0a 20 20 20 20 6c   -- $pos {.    l
b6f0: 65 66 74 20 7b 0a 20 20 20 20 20 20 73 65 74 20  eft {.      set 
b700: 78 6c 20 24 78 5f 6c 65 66 74 0a 20 20 20 20 20  xl $x_left.     
b710: 20 73 65 74 20 78 72 20 5b 65 78 70 72 20 7b 24   set xr [expr {$
b720: 78 6c 20 2b 20 24 77 69 64 74 68 7d 5d 0a 20 20  xl + $width}].  
b730: 20 20 7d 0a 20 20 20 20 72 69 67 68 74 20 7b 0a    }.    right {.
b740: 20 20 20 20 20 20 73 65 74 20 78 72 20 24 78 5f        set xr $x_
b750: 72 69 67 68 74 0a 20 20 20 20 20 20 73 65 74 20  right.      set 
b760: 78 6c 20 5b 65 78 70 72 20 7b 24 78 72 20 2d 20  xl [expr {$xr - 
b770: 24 77 69 64 74 68 7d 5d 0a 20 20 20 20 7d 0a 20  $width}].    }. 
b780: 20 20 20 74 6f 70 20 2d 20 62 6f 74 74 6f 6d 20     top - bottom 
b790: 7b 0a 20 20 20 20 20 20 73 77 69 74 63 68 20 24  {.      switch $
b7a0: 61 6e 63 68 6f 72 20 7b 0a 20 20 20 20 20 20 20  anchor {.       
b7b0: 20 6e 20 2d 20 73 20 2d 20 63 65 6e 74 65 72 20   n - s - center 
b7c0: 7b 0a 09 20 20 73 65 74 20 78 6c 20 5b 65 78 70  {..  set xl [exp
b7d0: 72 20 7b 24 78 5f 6c 65 66 74 20 2b 20 28 24 78  r {$x_left + ($x
b7e0: 5f 72 69 67 68 74 20 2d 20 24 78 5f 6c 65 66 74  _right - $x_left
b7f0: 20 2d 20 24 77 69 64 74 68 29 20 2f 20 32 2e 30   - $width) / 2.0
b800: 7d 5d 0a 09 20 20 73 65 74 20 78 72 20 5b 65 78  }]..  set xr [ex
b810: 70 72 20 7b 24 78 6c 20 2b 20 24 77 69 64 74 68  pr {$xl + $width
b820: 7d 5d 0a 09 7d 0a 09 77 20 7b 0a 09 20 20 73 65  }]..}..w {..  se
b830: 74 20 78 6c 20 24 78 5f 6c 65 66 74 0a 09 20 20  t xl $x_left..  
b840: 73 65 74 20 78 72 20 5b 65 78 70 72 20 7b 24 78  set xr [expr {$x
b850: 6c 20 2b 20 24 77 69 64 74 68 7d 5d 0a 09 7d 0a  l + $width}]..}.
b860: 09 65 20 7b 0a 09 20 20 73 65 74 20 78 72 20 24  .e {..  set xr $
b870: 78 5f 72 69 67 68 74 0a 09 20 20 73 65 74 20 78  x_right..  set x
b880: 6c 20 5b 65 78 70 72 20 7b 24 78 72 20 2d 20 24  l [expr {$xr - $
b890: 77 69 64 74 68 7d 5d 0a 09 7d 0a 20 20 20 20 20  width}]..}.     
b8a0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 40 2a 2c   }.    }.    @*,
b8b0: 2a 20 7b 0a 20 20 20 20 20 20 69 66 20 7b 5b 72  * {.      if {[r
b8c0: 65 67 65 78 70 20 7b 40 28 5b 5c 64 5c 2e 5c 2d  egexp {@([\d\.\-
b8d0: 6d 63 70 69 5d 2b 29 2c 28 5b 5c 64 5c 2e 5c 2d  mcpi]+),([\d\.\-
b8e0: 6d 63 70 69 5d 2b 29 24 7d 20 24 70 6f 73 20 61  mcpi]+)$} $pos a
b8f0: 6c 6c 20 70 6f 73 5f 78 20 70 6f 73 5f 79 5d 7d  ll pos_x pos_y]}
b900: 20 7b 0a 09 69 66 20 7b 24 70 6f 73 5f 78 20 3e   {..if {$pos_x >
b910: 20 30 7d 20 7b 0a 09 20 20 73 65 74 20 78 6c 20   0} {..  set xl 
b920: 5b 65 78 70 72 20 7b 24 78 5f 6c 65 66 74 20 2b  [expr {$x_left +
b930: 20 24 70 6f 73 5f 78 7d 5d 0a 09 20 20 73 65 74   $pos_x}]..  set
b940: 20 78 72 20 5b 65 78 70 72 20 7b 24 78 6c 20 2b   xr [expr {$xl +
b950: 20 24 77 69 64 74 68 7d 5d 0a 09 7d 20 65 6c 73   $width}]..} els
b960: 65 20 7b 0a 09 20 20 73 65 74 20 78 72 20 5b 65  e {..  set xr [e
b970: 78 70 72 20 7b 24 78 5f 72 69 67 68 74 20 2d 20  xpr {$x_right - 
b980: 24 70 6f 73 5f 78 7d 5d 0a 09 20 20 73 65 74 20  $pos_x}]..  set 
b990: 78 6c 20 5b 65 78 70 72 20 7b 24 78 72 20 2d 20  xl [expr {$xr - 
b9a0: 24 77 69 64 74 68 7d 5d 0a 09 7d 0a 20 20 20 20  $width}]..}.    
b9b0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
b9c0: 73 77 69 74 63 68 20 2d 67 6c 6f 62 20 2d 2d 20  switch -glob -- 
b9d0: 24 67 72 61 70 68 28 24 69 6e 64 65 78 2c 70 6f  $graph($index,po
b9e0: 73 69 74 69 6f 6e 29 20 7b 0a 20 20 20 20 6c 65  sition) {.    le
b9f0: 66 74 20 2d 20 72 69 67 68 74 20 7b 0a 20 20 20  ft - right {.   
ba00: 20 20 20 73 77 69 74 63 68 20 24 61 6e 63 68 6f     switch $ancho
ba10: 72 20 7b 0a 20 20 20 20 20 20 20 20 6e 20 7b 0a  r {.        n {.
ba20: 09 20 20 73 65 74 20 79 74 20 24 79 5f 74 6f 70  .  set yt $y_top
ba30: 0a 09 20 20 73 65 74 20 79 62 20 5b 65 78 70 72  ..  set yb [expr
ba40: 20 7b 24 79 74 20 2d 20 24 68 65 69 67 68 74 7d   {$yt - $height}
ba50: 5d 0a 09 7d 0a 09 73 20 7b 0a 09 20 20 73 65 74  ]..}..s {..  set
ba60: 20 79 62 20 24 79 5f 62 6f 74 74 6f 6d 0a 09 20   yb $y_bottom.. 
ba70: 20 73 65 74 20 79 74 20 5b 65 78 70 72 20 7b 24   set yt [expr {$
ba80: 79 62 20 2b 20 24 68 65 69 67 68 74 7d 5d 0a 09  yb + $height}]..
ba90: 7d 0a 09 65 20 2d 20 77 20 2d 20 63 65 6e 74 65  }..e - w - cente
baa0: 72 20 7b 0a 09 20 20 73 65 74 20 79 62 20 5b 65  r {..  set yb [e
bab0: 78 70 72 20 7b 24 78 5f 62 6f 74 74 6f 6d 20 2b  xpr {$x_bottom +
bac0: 20 28 24 78 5f 74 6f 70 20 2d 20 24 78 5f 62 6f   ($x_top - $x_bo
bad0: 74 74 6f 6d 20 2d 20 24 68 65 69 67 68 74 29 20  ttom - $height) 
bae0: 2f 20 32 2e 30 7d 5d 0a 09 20 20 73 65 74 20 79  / 2.0}]..  set y
baf0: 74 20 5b 65 78 70 72 20 7b 24 79 62 20 2b 20 24  t [expr {$yb + $
bb00: 68 65 69 67 68 74 7d 5d 0a 09 7d 0a 20 20 20 20  height}]..}.    
bb10: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 74 6f    }.    }.    to
bb20: 70 20 7b 0a 20 20 20 20 20 20 73 65 74 20 79 74  p {.      set yt
bb30: 20 24 79 5f 74 6f 70 0a 20 20 20 20 20 20 73 65   $y_top.      se
bb40: 74 20 79 62 20 5b 65 78 70 72 20 7b 24 79 74 20  t yb [expr {$yt 
bb50: 2d 20 24 68 65 69 67 68 74 7d 5d 0a 20 20 20 20  - $height}].    
bb60: 7d 0a 20 20 20 20 62 6f 74 74 6f 6d 20 7b 0a 20  }.    bottom {. 
bb70: 20 20 20 20 20 73 65 74 20 79 62 20 24 79 5f 62       set yb $y_b
bb80: 6f 74 74 6f 6d 0a 20 20 20 20 20 20 73 65 74 20  ottom.      set 
bb90: 79 74 20 5b 65 78 70 72 20 7b 24 79 62 20 2b 20  yt [expr {$yb + 
bba0: 24 68 65 69 67 68 74 7d 5d 0a 20 20 20 20 7d 0a  $height}].    }.
bbb0: 20 20 20 20 40 2a 2c 2a 20 7b 0a 20 20 20 20 20      @*,* {.     
bbc0: 20 69 66 20 7b 5b 72 65 67 65 78 70 20 7b 40 28   if {[regexp {@(
bbd0: 5b 5c 64 5c 2e 5c 2d 6d 63 70 69 5d 2b 29 2c 28  [\d\.\-mcpi]+),(
bbe0: 5b 5c 64 5c 2e 5c 2d 6d 63 70 69 5d 2b 29 24 7d  [\d\.\-mcpi]+)$}
bbf0: 20 24 70 6f 73 20 61 6c 6c 20 70 6f 73 5f 78 20   $pos all pos_x 
bc00: 70 6f 73 5f 79 5d 7d 20 7b 0a 09 69 66 20 7b 24  pos_y]} {..if {$
bc10: 70 6f 73 5f 79 20 3e 20 30 7d 20 7b 0a 09 20 20  pos_y > 0} {..  
bc20: 73 65 74 20 79 74 20 5b 65 78 70 72 20 7b 24 79  set yt [expr {$y
bc30: 5f 74 6f 70 20 2d 20 24 70 6f 73 5f 79 7d 5d 0a  _top - $pos_y}].
bc40: 09 20 20 73 65 74 20 79 62 20 5b 65 78 70 72 20  .  set yb [expr 
bc50: 7b 24 79 74 20 2d 20 24 68 65 69 67 68 74 7d 5d  {$yt - $height}]
bc60: 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 73 65  ..} else {..  se
bc70: 74 20 79 62 20 5b 65 78 70 72 20 7b 24 79 5f 62  t yb [expr {$y_b
bc80: 6f 74 74 6f 6d 20 2d 20 24 70 6f 73 5f 79 7d 5d  ottom - $pos_y}]
bc90: 0a 09 20 20 73 65 74 20 79 74 20 5b 65 78 70 72  ..  set yt [expr
bca0: 20 7b 24 79 62 20 2b 20 24 68 65 69 67 68 74 7d   {$yb + $height}
bcb0: 5d 0a 09 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20  ]..}.      }.   
bcc0: 20 7d 0a 20 20 7d 0a 0a 20 20 23 20 73 68 72 69   }.  }..  # shri
bcd0: 6e 6b 20 61 72 65 61 20 77 69 74 68 20 70 61 64  nk area with pad
bce0: 64 69 6e 67 0a 20 20 73 65 74 20 78 6c 20 5b 65  ding.  set xl [e
bcf0: 78 70 72 20 7b 24 78 6c 20 2b 20 24 70 61 64 78  xpr {$xl + $padx
bd00: 7d 5d 0a 20 20 73 65 74 20 78 72 20 5b 65 78 70  }].  set xr [exp
bd10: 72 20 7b 24 78 72 20 2d 20 24 70 61 64 78 7d 5d  r {$xr - $padx}]
bd20: 0a 20 20 73 65 74 20 79 74 20 5b 65 78 70 72 20  .  set yt [expr 
bd30: 7b 24 79 74 20 2d 20 24 70 61 64 79 7d 5d 0a 20  {$yt - $pady}]. 
bd40: 20 73 65 74 20 79 62 20 5b 65 78 70 72 20 7b 24   set yb [expr {$
bd50: 79 62 20 2b 20 24 70 61 64 79 7d 5d 0a 0a 20 20  yb + $pady}]..  
bd60: 23 20 64 72 61 77 20 62 61 63 6b 67 72 6f 75 6e  # draw backgroun
bd70: 64 20 72 65 63 74 0a 20 20 73 65 74 5f 6c 69 6e  d rect.  set_lin
bd80: 65 77 69 64 74 68 20 24 67 20 2d 31 0a 20 20 52  ewidth $g -1.  R
bd90: 65 63 74 20 24 67 20 24 78 6c 20 24 79 74 20 24  ect $g $xl $yt $
bda0: 78 72 20 24 79 62 20 24 62 67 63 0a 20 20 73 65  xr $yb $bgc.  se
bdb0: 74 5f 6c 69 6e 65 77 69 64 74 68 20 24 67 20 30  t_linewidth $g 0
bdc0: 0a 0a 20 20 23 20 64 72 61 77 20 62 6f 72 64 65  ..  # draw borde
bdd0: 72 20 66 72 61 6d 65 0a 20 20 69 66 20 7b 24 62  r frame.  if {$b
bde0: 64 77 20 3e 20 30 7d 20 7b 0a 20 20 20 20 64 72  dw > 0} {.    dr
bdf0: 61 77 5f 66 72 61 6d 65 20 24 67 20 24 78 6c 20  aw_frame $g $xl 
be00: 24 79 74 20 24 78 72 20 24 79 62 20 24 62 67 63  $yt $xr $yb $bgc
be10: 20 24 72 65 6c 20 24 62 64 77 0a 0a 20 20 20 20   $rel $bdw..    
be20: 23 20 73 68 72 69 6e 6b 20 61 72 65 61 20 77 69  # shrink area wi
be30: 74 68 20 62 6f 72 64 65 72 20 77 69 64 74 68 0a  th border width.
be40: 20 20 20 20 73 65 74 20 78 6c 20 5b 65 78 70 72      set xl [expr
be50: 20 7b 24 78 6c 20 2b 20 24 62 64 77 7d 5d 0a 20   {$xl + $bdw}]. 
be60: 20 20 20 73 65 74 20 78 72 20 5b 65 78 70 72 20     set xr [expr 
be70: 7b 24 78 72 20 2d 20 24 62 64 77 7d 5d 0a 20 20  {$xr - $bdw}].  
be80: 20 20 73 65 74 20 79 74 20 5b 65 78 70 72 20 7b    set yt [expr {
be90: 24 79 74 20 2d 20 24 62 64 77 7d 5d 0a 20 20 20  $yt - $bdw}].   
bea0: 20 73 65 74 20 79 62 20 5b 65 78 70 72 20 7b 24   set yb [expr {$
beb0: 79 62 20 2b 20 24 62 64 77 7d 5d 0a 20 20 7d 0a  yb + $bdw}].  }.
bec0: 0a 20 20 66 6f 72 65 61 63 68 20 7b 66 6f 6e 74  .  foreach {font
bed0: 20 73 69 7a 65 20 61 74 74 72 7d 20 24 67 72 61   size attr} $gra
bee0: 70 68 28 24 69 6e 64 65 78 2c 66 6f 6e 74 29 20  ph($index,font) 
bef0: 7b 7d 0a 20 20 53 65 74 46 6f 6e 74 20 24 67 20  {}.  SetFont $g 
bf00: 24 66 6f 6e 74 20 24 73 69 7a 65 20 24 61 74 74  $font $size $att
bf10: 72 0a 20 20 73 65 74 20 66 68 20 5b 4c 69 6e 65  r.  set fh [Line
bf20: 48 65 69 67 68 74 5d 0a 0a 20 20 73 65 74 20 79  Height]..  set y
bf30: 74 20 5b 65 78 70 72 20 7b 24 79 74 20 2d 20 24  t [expr {$yt - $
bf40: 69 70 61 64 79 7d 5d 0a 20 20 73 65 74 20 78 6c  ipady}].  set xl
bf50: 20 5b 65 78 70 72 20 7b 24 78 6c 20 2b 20 24 69   [expr {$xl + $i
bf60: 70 61 64 78 7d 5d 0a 20 20 66 6f 72 65 61 63 68  padx}].  foreach
bf70: 20 65 6c 65 6d 20 24 67 72 61 70 68 28 24 67 2c   elem $graph($g,
bf80: 5f 65 6c 65 6d 65 6e 74 73 29 20 7b 0a 20 20 20  _elements) {.   
bf90: 20 73 65 74 20 65 69 64 78 20 24 67 2c 65 6c 65   set eidx $g,ele
bfa0: 6d 2d 24 65 6c 65 6d 0a 20 20 20 20 69 66 20 7b  m-$elem.    if {
bfb0: 21 24 67 72 61 70 68 28 24 65 69 64 78 2c 5f 76  !$graph($eidx,_v
bfc0: 61 6c 69 64 29 7d 20 63 6f 6e 74 69 6e 75 65 0a  alid)} continue.
bfd0: 20 20 20 20 73 65 74 20 65 5f 63 6f 6c 6f 72 20      set e_color 
bfe0: 20 24 67 72 61 70 68 28 24 65 69 64 78 2c 63 6f   $graph($eidx,co
bff0: 6c 6f 72 29 0a 20 20 20 20 73 65 74 20 65 5f 66  lor).    set e_f
c000: 63 6f 6c 6f 72 20 24 67 72 61 70 68 28 24 65 69  color $graph($ei
c010: 64 78 2c 66 69 6c 6c 29 0a 20 20 20 20 73 65 74  dx,fill).    set
c020: 20 65 5f 6f 63 6f 6c 6f 72 20 24 67 72 61 70 68   e_ocolor $graph
c030: 28 24 65 69 64 78 2c 6f 75 74 6c 69 6e 65 29 0a  ($eidx,outline).
c040: 20 20 20 20 73 65 74 20 65 5f 73 79 6d 62 6f 6c      set e_symbol
c050: 20 24 67 72 61 70 68 28 24 65 69 64 78 2c 73 79   $graph($eidx,sy
c060: 6d 62 6f 6c 29 0a 20 20 20 20 73 65 74 20 65 5f  mbol).    set e_
c070: 74 79 70 65 20 20 20 24 67 72 61 70 68 28 24 65  type   $graph($e
c080: 69 64 78 2c 74 79 70 65 29 0a 20 20 20 20 73 65  idx,type).    se
c090: 74 20 65 5f 64 61 73 68 65 73 20 24 67 72 61 70  t e_dashes $grap
c0a0: 68 28 24 65 69 64 78 2c 64 61 73 68 65 73 29 0a  h($eidx,dashes).
c0b0: 20 20 20 20 73 65 74 20 74 69 74 6c 65 20 20 20      set title   
c0c0: 20 24 67 72 61 70 68 28 24 65 69 64 78 2c 5f 74   $graph($eidx,_t
c0d0: 69 74 6c 65 29 0a 20 20 20 20 73 65 74 20 79 62  itle).    set yb
c0e0: 20 5b 65 78 70 72 20 7b 24 79 74 20 2d 20 24 66   [expr {$yt - $f
c0f0: 68 7d 5d 0a 20 20 20 20 73 65 74 20 79 6d 20 5b  h}].    set ym [
c100: 65 78 70 72 20 7b 24 79 74 20 2d 20 24 66 68 20  expr {$yt - $fh 
c110: 2a 20 30 2e 35 7d 5d 0a 20 20 20 20 73 65 74 20  * 0.5}].    set 
c120: 79 54 20 5b 65 78 70 72 20 7b 24 79 74 20 2d 20  yT [expr {$yt - 
c130: 24 66 68 20 2a 20 30 2e 38 7d 5d 0a 20 20 20 20  $fh * 0.8}].    
c140: 73 65 74 20 78 73 20 5b 65 78 70 72 20 7b 24 78  set xs [expr {$x
c150: 6c 20 2b 20 24 6f 62 6a 77 69 64 74 68 20 2f 20  l + $objwidth / 
c160: 32 2e 30 7d 5d 0a 20 20 20 20 73 65 74 20 78 72  2.0}].    set xr
c170: 20 5b 65 78 70 72 20 7b 24 78 6c 20 2b 20 24 6f   [expr {$xl + $o
c180: 62 6a 77 69 64 74 68 7d 5d 0a 0a 20 20 20 20 53  bjwidth}]..    S
c190: 65 74 43 6f 6c 6f 72 20 24 67 20 24 65 5f 63 6f  etColor $g $e_co
c1a0: 6c 6f 72 0a 20 20 20 20 53 65 74 4c 69 6e 65 77  lor.    SetLinew
c1b0: 69 64 74 68 20 24 67 20 30 2e 35 0a 20 20 20 20  idth $g 0.5.    
c1c0: 69 66 20 7b 24 65 5f 74 79 70 65 20 3d 3d 20 22  if {$e_type == "
c1d0: 6c 69 6e 65 22 7d 20 7b 0a 20 20 20 20 20 20 53  line"} {.      S
c1e0: 65 74 44 61 73 68 20 24 67 20 24 65 5f 64 61 73  etDash $g $e_das
c1f0: 68 65 73 0a 20 20 20 20 20 20 4c 69 6e 65 20 24  hes.      Line $
c200: 67 20 24 78 6c 20 24 79 6d 20 24 78 72 20 24 79  g $xl $ym $xr $y
c210: 6d 0a 20 20 20 20 20 20 53 65 74 44 61 73 68 20  m.      SetDash 
c220: 24 67 20 7b 7d 0a 20 20 20 20 7d 0a 0a 20 20 20  $g {}.    }..   
c230: 20 53 65 74 4c 69 6e 65 77 69 64 74 68 20 24 67   SetLinewidth $g
c240: 20 30 2e 32 0a 20 20 20 20 69 66 20 7b 24 65 5f   0.2.    if {$e_
c250: 74 79 70 65 20 3d 3d 20 22 62 61 72 22 7d 20 7b  type == "bar"} {
c260: 20 73 65 74 20 65 5f 73 79 6d 62 6f 6c 20 73 71   set e_symbol sq
c270: 75 61 72 65 20 7d 0a 20 20 20 20 64 72 61 77 5f  uare }.    draw_
c280: 73 79 6d 62 6f 6c 20 24 67 20 24 78 73 20 24 79  symbol $g $xs $y
c290: 6d 20 24 65 5f 73 79 6d 62 6f 6c 20 24 6f 62 6a  m $e_symbol $obj
c2a0: 73 69 7a 65 20 24 65 5f 66 63 6f 6c 6f 72 20 24  size $e_fcolor $
c2b0: 65 5f 6f 63 6f 6c 6f 72 0a 0a 20 20 20 20 53 65  e_ocolor..    Se
c2c0: 74 43 6f 6c 6f 72 20 24 67 20 24 66 67 63 0a 20  tColor $g $fgc. 
c2d0: 20 20 20 73 65 74 20 78 54 20 5b 65 78 70 72 20     set xT [expr 
c2e0: 7b 24 78 72 20 2b 20 24 69 70 61 64 78 7d 5d 0a  {$xr + $ipadx}].
c2f0: 20 20 20 20 54 65 78 74 20 24 67 20 24 78 54 20      Text $g $xT 
c300: 24 79 54 20 24 74 69 74 6c 65 0a 20 20 20 20 69  $yT $title.    i
c310: 66 20 7b 24 6f 72 69 65 6e 74 61 74 69 6f 6e 20  f {$orientation 
c320: 3d 3d 20 22 76 65 72 74 69 63 61 6c 22 7d 20 7b  == "vertical"} {
c330: 0a 20 20 20 20 20 20 73 65 74 20 79 74 20 5b 65  .      set yt [e
c340: 78 70 72 20 7b 24 79 62 20 2d 20 24 69 70 61 64  xpr {$yb - $ipad
c350: 79 7d 5d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  y}].    } else {
c360: 0a 20 20 20 20 20 20 73 65 74 20 74 78 74 77 69  .      set txtwi
c370: 64 74 68 20 5b 54 65 78 74 57 69 64 74 68 20 24  dth [TextWidth $
c380: 74 69 74 6c 65 5d 0a 20 20 20 20 20 20 73 65 74  title].      set
c390: 20 78 6c 20 5b 65 78 70 72 20 7b 24 78 72 20 2b   xl [expr {$xr +
c3a0: 20 24 69 70 61 64 78 20 2b 20 24 74 78 74 77 69   $ipadx + $txtwi
c3b0: 64 74 68 20 2b 20 24 69 70 61 64 78 7d 5d 0a 20  dth + $ipadx}]. 
c3c0: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 23 23 23     }.  }.}..####
c3d0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
c3e0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
c3f0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
c400: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
c410: 23 23 23 23 23 23 23 23 23 23 23 0a 23 0a 23 20  ###########.#.# 
c420: 6d 61 72 6b 65 72 20 63 6f 6d 70 6f 6e 65 6e 74  marker component
c430: 73 0a 23 0a 0a 70 72 6f 63 20 67 72 61 70 68 3a  s.#..proc graph:
c440: 3a 6d 61 72 6b 65 72 20 7b 20 67 20 6f 70 65 72  :marker { g oper
c450: 61 74 69 6f 6e 20 70 61 72 61 6d 73 20 7d 20 7b  ation params } {
c460: 0a 20 20 76 61 72 69 61 62 6c 65 20 67 72 61 70  .  variable grap
c470: 68 0a 0a 20 20 73 77 69 74 63 68 20 2d 2d 20 24  h..  switch -- $
c480: 6f 70 65 72 61 74 69 6f 6e 20 7b 0a 20 20 20 20  operation {.    
c490: 63 72 65 61 74 65 20 7b 0a 20 20 20 20 20 20 76  create {.      v
c4a0: 61 72 69 61 62 6c 65 20 6d 61 72 6b 65 72 5f 69  ariable marker_i
c4b0: 64 78 0a 20 20 20 20 20 20 73 65 74 20 6e 61 6d  dx.      set nam
c4c0: 65 20 6d 5b 69 6e 63 72 20 6d 61 72 6b 65 72 5f  e m[incr marker_
c4d0: 69 64 78 5d 0a 20 20 20 20 20 20 6f 62 6a 5f 64  idx].      obj_d
c4e0: 65 66 61 75 6c 74 73 20 24 67 2c 6d 61 72 6b 65  efaults $g,marke
c4f0: 72 2d 24 6e 61 6d 65 20 6d 61 72 6b 65 72 5f 64  r-$name marker_d
c500: 65 66 61 75 6c 74 73 0a 20 20 20 20 20 20 73 65  efaults.      se
c510: 74 20 67 72 61 70 68 28 24 67 2c 6d 61 72 6b 65  t graph($g,marke
c520: 72 2d 24 6e 61 6d 65 2c 74 79 70 65 29 20 5b 6c  r-$name,type) [l
c530: 69 6e 64 65 78 20 24 70 61 72 61 6d 73 20 30 5d  index $params 0]
c540: 0a 20 20 20 20 20 20 73 65 74 20 67 72 61 70 68  .      set graph
c550: 28 24 67 2c 6d 61 72 6b 65 72 2d 24 6e 61 6d 65  ($g,marker-$name
c560: 2c 6e 61 6d 65 29 20 24 6e 61 6d 65 0a 20 20 20  ,name) $name.   
c570: 20 20 20 73 65 74 20 70 61 72 61 6d 73 20 5b 6c     set params [l
c580: 72 65 70 6c 61 63 65 20 24 70 61 72 61 6d 73 20  replace $params 
c590: 30 20 30 20 24 6e 61 6d 65 5d 0a 20 20 20 20 20  0 0 $name].     
c5a0: 20 6d 61 72 6b 65 72 20 24 67 20 63 6f 6e 66 69   marker $g confi
c5b0: 67 75 72 65 20 24 70 61 72 61 6d 73 0a 20 20 20  gure $params.   
c5c0: 20 20 20 6c 61 70 70 65 6e 64 20 67 72 61 70 68     lappend graph
c5d0: 28 24 67 2c 5f 6d 61 72 6b 65 72 73 29 20 24 6e  ($g,_markers) $n
c5e0: 61 6d 65 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ame.      return
c5f0: 20 24 6e 61 6d 65 0a 20 20 20 20 7d 0a 20 20 20   $name.    }.   
c600: 20 63 6f 6e 66 69 67 75 72 65 20 7b 0a 20 20 20   configure {.   
c610: 20 20 20 73 65 74 20 6e 61 6d 65 20 5b 6c 69 6e     set name [lin
c620: 64 65 78 20 24 70 61 72 61 6d 73 20 30 5d 0a 20  dex $params 0]. 
c630: 20 20 20 20 20 6f 62 6a 5f 63 6f 6e 66 69 67 75       obj_configu
c640: 72 65 20 24 67 2c 6d 61 72 6b 65 72 2d 24 6e 61  re $g,marker-$na
c650: 6d 65 20 5b 6c 72 61 6e 67 65 20 24 70 61 72 61  me [lrange $para
c660: 6d 73 20 31 20 65 6e 64 5d 0a 20 20 20 20 7d 0a  ms 1 end].    }.
c670: 20 20 20 20 63 67 65 74 20 7b 0a 20 20 20 20 20      cget {.     
c680: 20 73 65 74 20 6e 61 6d 65 20 5b 6c 69 6e 64 65   set name [linde
c690: 78 20 24 70 61 72 61 6d 73 20 30 5d 0a 20 20 20  x $params 0].   
c6a0: 20 20 20 72 65 74 75 72 6e 20 5b 6f 62 6a 5f 63     return [obj_c
c6b0: 67 65 74 20 24 67 2c 6d 61 72 6b 65 72 2d 24 6e  get $g,marker-$n
c6c0: 61 6d 65 20 5b 6c 69 6e 64 65 78 20 24 70 61 72  ame [lindex $par
c6d0: 61 6d 73 20 31 5d 5d 0a 20 20 20 20 7d 0a 20 20  ams 1]].    }.  
c6e0: 20 20 64 65 6c 65 74 65 20 7b 0a 20 20 20 20 20    delete {.     
c6f0: 20 6f 62 6a 5f 64 65 6c 65 74 65 20 24 67 2c 5f   obj_delete $g,_
c700: 6d 61 72 6b 65 72 73 20 24 67 2c 6d 61 72 6b 65  markers $g,marke
c710: 72 20 24 70 61 72 61 6d 73 0a 20 20 20 20 7d 0a  r $params.    }.
c720: 20 20 20 20 65 78 69 73 74 73 20 7b 0a 20 20 20      exists {.   
c730: 20 20 20 69 66 20 7b 5b 6c 73 65 61 72 63 68 20     if {[lsearch 
c740: 5b 6d 61 72 6b 65 72 20 24 67 20 6e 61 6d 65 73  [marker $g names
c750: 5d 20 5b 6c 69 6e 64 65 78 20 24 70 61 72 61 6d  ] [lindex $param
c760: 73 20 30 5d 5d 20 21 3d 20 2d 31 7d 20 7b 0a 20  s 0]] != -1} {. 
c770: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 79 65         return ye
c780: 73 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  s.      } else {
c790: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
c7a0: 6e 6f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  no.      }.    }
c7b0: 0a 20 20 20 20 6e 61 6d 65 73 20 7b 0a 20 20 20  .    names {.   
c7c0: 20 20 20 69 66 20 7b 24 70 61 72 61 6d 73 20 3d     if {$params =
c7d0: 3d 20 7b 7d 7d 20 7b 20 73 65 74 20 70 61 72 61  = {}} { set para
c7e0: 6d 73 20 2a 20 7d 0a 20 20 20 20 20 20 72 65 74  ms * }.      ret
c7f0: 75 72 6e 20 5b 6f 62 6a 5f 6e 61 6d 65 73 20 24  urn [obj_names $
c800: 67 2c 5f 6d 61 72 6b 65 72 73 20 24 70 61 72 61  g,_markers $para
c810: 6d 73 5d 0a 20 20 20 20 7d 0a 20 20 20 20 64 65  ms].    }.    de
c820: 66 61 75 6c 74 20 7b 0a 20 20 20 20 20 20 72 65  fault {.      re
c830: 74 75 72 6e 20 2d 63 6f 64 65 20 65 72 72 6f 72  turn -code error
c840: 20 22 75 6e 6b 6e 6f 77 6e 20 6f 70 65 72 61 74   "unknown operat
c850: 69 6f 6e 20 5c 22 24 6f 70 65 72 61 74 69 6f 6e  ion \"$operation
c860: 5c 22 22 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  \"".    }.  }.}.
c870: 0a 0a 70 72 6f 63 20 67 72 61 70 68 3a 3a 6d 61  ..proc graph::ma
c880: 72 6b 65 72 5f 64 72 61 77 20 7b 20 67 20 6d 61  rker_draw { g ma
c890: 72 6b 65 72 20 78 6c 5f 67 72 61 70 68 20 79 74  rker xl_graph yt
c8a0: 5f 67 72 61 70 68 20 78 72 5f 67 72 61 70 68 20  _graph xr_graph 
c8b0: 79 62 5f 67 72 61 70 68 20 7d 20 7b 0a 20 20 76  yb_graph } {.  v
c8c0: 61 72 69 61 62 6c 65 20 67 72 61 70 68 0a 0a 20  ariable graph.. 
c8d0: 20 73 65 74 20 69 6e 64 65 78 20 24 67 2c 6d 61   set index $g,ma
c8e0: 72 6b 65 72 2d 24 6d 61 72 6b 65 72 0a 20 20 69  rker-$marker.  i
c8f0: 66 20 7b 24 67 72 61 70 68 28 24 69 6e 64 65 78  f {$graph($index
c900: 2c 68 69 64 65 29 20 7c 7c 0a 20 20 20 20 20 20  ,hide) ||.      
c910: 24 67 72 61 70 68 28 24 69 6e 64 65 78 2c 63 6f  $graph($index,co
c920: 6f 72 64 73 29 20 3d 3d 20 7b 7d 7d 20 63 6f 6e  ords) == {}} con
c930: 74 69 6e 75 65 0a 20 20 73 65 74 20 6d 61 70 78  tinue.  set mapx
c940: 20 20 20 24 67 72 61 70 68 28 24 69 6e 64 65 78     $graph($index
c950: 2c 6d 61 70 78 29 0a 20 20 73 65 74 20 6d 61 70  ,mapx).  set map
c960: 79 20 20 20 24 67 72 61 70 68 28 24 69 6e 64 65  y   $graph($inde
c970: 78 2c 6d 61 70 79 29 0a 20 20 73 65 74 20 63 6f  x,mapy).  set co
c980: 6f 72 64 73 20 24 67 72 61 70 68 28 24 69 6e 64  ords $graph($ind
c990: 65 78 2c 63 6f 6f 72 64 73 29 0a 20 20 73 65 74  ex,coords).  set
c9a0: 20 74 79 70 65 20 20 20 24 67 72 61 70 68 28 24   type   $graph($
c9b0: 69 6e 64 65 78 2c 74 79 70 65 29 0a 20 20 73 65  index,type).  se
c9c0: 74 20 78 73 75 62 20 20 20 24 67 72 61 70 68 28  t xsub   $graph(
c9d0: 24 69 6e 64 65 78 2c 78 6f 66 66 73 65 74 29 0a  $index,xoffset).
c9e0: 20 20 73 65 74 20 79 73 75 62 20 20 20 24 67 72    set ysub   $gr
c9f0: 61 70 68 28 24 69 6e 64 65 78 2c 79 6f 66 66 73  aph($index,yoffs
ca00: 65 74 29 0a 20 20 73 65 74 20 65 6c 65 6d 20 20  et).  set elem  
ca10: 20 24 67 72 61 70 68 28 24 69 6e 64 65 78 2c 65   $graph($index,e
ca20: 6c 65 6d 65 6e 74 29 0a 20 20 69 66 20 7b 24 65  lement).  if {$e
ca30: 6c 65 6d 20 21 3d 20 7b 7d 7d 20 7b 0a 20 20 20  lem != {}} {.   
ca40: 20 69 66 20 7b 5b 6c 73 65 61 72 63 68 20 24 67   if {[lsearch $g
ca50: 72 61 70 68 28 24 67 2c 5f 65 6c 65 6d 65 6e 74  raph($g,_element
ca60: 73 29 20 24 65 6c 65 6d 5d 20 3d 3d 20 2d 31 7d  s) $elem] == -1}
ca70: 20 63 6f 6e 74 69 6e 75 65 0a 20 20 20 20 69 66   continue.    if
ca80: 20 7b 21 24 67 72 61 70 68 28 24 67 2c 65 6c 65   {!$graph($g,ele
ca90: 6d 2d 24 65 6c 65 6d 2c 5f 76 61 6c 69 64 29 7d  m-$elem,_valid)}
caa0: 20 63 6f 6e 74 69 6e 75 65 0a 20 20 7d 0a 20 20   continue.  }.  
cab0: 69 66 20 7b 5b 6c 73 65 61 72 63 68 20 2d 65 78  if {[lsearch -ex
cac0: 61 63 74 20 24 67 72 61 70 68 28 24 67 2c 5f 61  act $graph($g,_a
cad0: 78 69 73 65 73 29 20 24 6d 61 70 78 5d 20 3d 3d  xises) $mapx] ==
cae0: 20 2d 31 20 7c 7c 0a 20 20 20 20 20 20 5b 6c 73   -1 ||.      [ls
caf0: 65 61 72 63 68 20 2d 65 78 61 63 74 20 24 67 72  earch -exact $gr
cb00: 61 70 68 28 24 67 2c 5f 61 78 69 73 65 73 29 20  aph($g,_axises) 
cb10: 24 6d 61 70 79 5d 20 3d 3d 20 2d 31 20 20 20 7d  $mapy] == -1   }
cb20: 20 63 6f 6e 74 69 6e 75 65 0a 20 20 73 65 74 20   continue.  set 
cb30: 78 5f 6d 69 6e 20 24 67 72 61 70 68 28 24 67 2c  x_min $graph($g,
cb40: 61 78 69 73 2d 24 6d 61 70 78 2c 5f 6d 69 6e 29  axis-$mapx,_min)
cb50: 0a 20 20 73 65 74 20 78 5f 6d 61 78 20 24 67 72  .  set x_max $gr
cb60: 61 70 68 28 24 67 2c 61 78 69 73 2d 24 6d 61 70  aph($g,axis-$map
cb70: 78 2c 5f 6d 61 78 29 0a 20 20 73 65 74 20 78 5f  x,_max).  set x_
cb80: 6c 6f 67 20 24 67 72 61 70 68 28 24 67 2c 61 78  log $graph($g,ax
cb90: 69 73 2d 24 6d 61 70 78 2c 6c 6f 67 73 63 61 6c  is-$mapx,logscal
cba0: 65 29 0a 20 20 73 65 74 20 79 5f 6d 69 6e 20 24  e).  set y_min $
cbb0: 67 72 61 70 68 28 24 67 2c 61 78 69 73 2d 24 6d  graph($g,axis-$m
cbc0: 61 70 79 2c 5f 6d 69 6e 29 0a 20 20 73 65 74 20  apy,_min).  set 
cbd0: 79 5f 6d 61 78 20 24 67 72 61 70 68 28 24 67 2c  y_max $graph($g,
cbe0: 61 78 69 73 2d 24 6d 61 70 79 2c 5f 6d 61 78 29  axis-$mapy,_max)
cbf0: 0a 20 20 73 65 74 20 79 5f 6c 6f 67 20 24 67 72  .  set y_log $gr
cc00: 61 70 68 28 24 67 2c 61 78 69 73 2d 24 6d 61 70  aph($g,axis-$map
cc10: 79 2c 6c 6f 67 73 63 61 6c 65 29 0a 20 20 73 65  y,logscale).  se
cc20: 74 20 63 6c 69 73 74 20 7b 7d 0a 20 20 66 6f 72  t clist {}.  for
cc30: 65 61 63 68 20 7b 78 20 79 7d 20 24 63 6f 6f 72  each {x y} $coor
cc40: 64 73 20 7b 0a 20 20 20 20 6c 61 70 70 65 6e 64  ds {.    lappend
cc50: 20 63 6c 69 73 74 20 5b 74 72 61 6e 73 66 6f 72   clist [transfor
cc60: 6d 20 5b 65 78 70 72 20 7b 24 78 20 2d 20 24 78  m [expr {$x - $x
cc70: 73 75 62 7d 5d 20 24 78 5f 6d 69 6e 20 24 78 5f  sub}] $x_min $x_
cc80: 6d 61 78 20 24 78 6c 5f 67 72 61 70 68 20 24 78  max $xl_graph $x
cc90: 72 5f 67 72 61 70 68 20 24 78 5f 6c 6f 67 5d 0a  r_graph $x_log].
cca0: 20 20 20 20 6c 61 70 70 65 6e 64 20 63 6c 69 73      lappend clis
ccb0: 74 20 5b 74 72 61 6e 73 66 6f 72 6d 20 5b 65 78  t [transform [ex
ccc0: 70 72 20 7b 24 79 20 2d 20 24 79 73 75 62 7d 5d  pr {$y - $ysub}]
ccd0: 20 24 79 5f 6d 69 6e 20 24 79 5f 6d 61 78 20 24   $y_min $y_max $
cce0: 79 62 5f 67 72 61 70 68 20 24 79 74 5f 67 72 61  yb_graph $yt_gra
ccf0: 70 68 20 24 79 5f 6c 6f 67 5d 0a 20 20 7d 0a 20  ph $y_log].  }. 
cd00: 20 0a 20 20 73 77 69 74 63 68 20 2d 2d 20 24 74   .  switch -- $t
cd10: 79 70 65 20 7b 0a 20 20 20 20 6c 69 6e 65 20 7b  ype {.    line {
cd20: 0a 20 20 20 20 20 20 53 65 74 44 61 73 68 20 24  .      SetDash $
cd30: 67 20 20 20 20 20 20 24 67 72 61 70 68 28 24 69  g      $graph($i
cd40: 6e 64 65 78 2c 64 61 73 68 65 73 29 0a 20 20 20  ndex,dashes).   
cd50: 20 20 20 53 65 74 43 6f 6c 6f 72 20 24 67 20 20     SetColor $g  
cd60: 20 20 20 24 67 72 61 70 68 28 24 69 6e 64 65 78     $graph($index
cd70: 2c 6f 75 74 6c 69 6e 65 29 0a 20 20 20 20 20 20  ,outline).      
cd80: 53 65 74 4c 69 6e 65 77 69 64 74 68 20 24 67 20  SetLinewidth $g 
cd90: 24 67 72 61 70 68 28 24 69 6e 64 65 78 2c 6c 69  $graph($index,li
cda0: 6e 65 77 69 64 74 68 29 0a 20 20 20 20 20 20 66  newidth).      f
cdb0: 6f 72 65 61 63 68 20 7b 78 6c 20 79 74 20 78 72  oreach {xl yt xr
cdc0: 20 79 62 7d 20 24 63 6c 69 73 74 20 7b 7d 0a 20   yb} $clist {}. 
cdd0: 20 20 20 20 20 4c 69 6e 65 20 24 67 20 24 78 6c       Line $g $xl
cde0: 20 24 79 74 20 24 78 72 20 24 79 62 0a 20 20 20   $yt $xr $yb.   
cdf0: 20 20 20 53 65 74 44 61 73 68 20 24 67 20 7b 7d     SetDash $g {}
ce00: 0a 20 20 20 20 7d 0a 20 20 20 20 70 6f 6c 79 67  .    }.    polyg
ce10: 6f 6e 20 7b 0a 20 20 20 20 20 20 53 65 74 44 61  on {.      SetDa
ce20: 73 68 20 24 67 20 20 20 20 20 20 24 67 72 61 70  sh $g      $grap
ce30: 68 28 24 69 6e 64 65 78 2c 64 61 73 68 65 73 29  h($index,dashes)
ce40: 0a 20 20 20 20 20 20 53 65 74 43 6f 6c 6f 72 20  .      SetColor 
ce50: 24 67 20 20 20 20 20 24 67 72 61 70 68 28 24 69  $g     $graph($i
ce60: 6e 64 65 78 2c 6f 75 74 6c 69 6e 65 29 0a 20 20  ndex,outline).  
ce70: 20 20 20 20 53 65 74 4c 69 6e 65 77 69 64 74 68      SetLinewidth
ce80: 20 24 67 20 24 67 72 61 70 68 28 24 69 6e 64 65   $g $graph($inde
ce90: 78 2c 6c 69 6e 65 77 69 64 74 68 29 0a 20 20 20  x,linewidth).   
cea0: 20 20 20 73 65 74 20 78 5f 6c 69 73 74 20 7b 7d     set x_list {}
ceb0: 0a 20 20 20 20 20 20 73 65 74 20 79 5f 6c 69 73  .      set y_lis
cec0: 74 20 7b 7d 0a 20 20 20 20 20 20 66 6f 72 65 61  t {}.      forea
ced0: 63 68 20 7b 78 20 79 7d 20 24 63 6c 69 73 74 20  ch {x y} $clist 
cee0: 7b 0a 20 20 20 20 20 20 20 20 6c 61 70 70 65 6e  {.        lappen
cef0: 64 20 78 5f 6c 69 73 74 20 24 78 0a 20 20 20 20  d x_list $x.    
cf00: 20 20 20 20 6c 61 70 70 65 6e 64 20 79 5f 6c 69      lappend y_li
cf10: 73 74 20 24 79 0a 20 20 20 20 20 20 7d 0a 20 20  st $y.      }.  
cf20: 20 20 20 20 50 6f 6c 79 4f 62 6a 65 63 74 20 24      PolyObject $
cf30: 67 20 5b 6c 69 73 74 20 24 78 5f 6c 69 73 74 20  g [list $x_list 
cf40: 24 79 5f 6c 69 73 74 5d 20 5b 47 65 74 52 47 42  $y_list] [GetRGB
cf50: 20 24 67 72 61 70 68 28 24 69 6e 64 65 78 2c 66   $graph($index,f
cf60: 69 6c 6c 29 5d 0a 20 20 20 20 20 20 53 65 74 44  ill)].      SetD
cf70: 61 73 68 20 24 67 20 7b 7d 0a 20 20 20 20 7d 0a  ash $g {}.    }.
cf80: 20 20 20 20 74 65 78 74 20 7b 0a 20 20 20 20 20      text {.     
cf90: 20 73 65 74 20 74 65 78 74 20 24 67 72 61 70 68   set text $graph
cfa0: 28 24 69 6e 64 65 78 2c 74 65 78 74 29 0a 20 20  ($index,text).  
cfb0: 20 20 20 20 69 66 20 7b 24 74 65 78 74 20 21 3d      if {$text !=
cfc0: 20 7b 7d 7d 20 7b 0a 09 73 65 74 20 66 69 6c 6c   {}} {..set fill
cfd0: 20 20 20 20 24 67 72 61 70 68 28 24 69 6e 64 65      $graph($inde
cfe0: 78 2c 66 69 6c 6c 29 0a 09 73 65 74 20 61 6e 63  x,fill)..set anc
cff0: 68 6f 72 20 20 24 67 72 61 70 68 28 24 69 6e 64  hor  $graph($ind
d000: 65 78 2c 61 6e 63 68 6f 72 29 0a 09 73 65 74 20  ex,anchor)..set 
d010: 6a 75 73 74 69 66 79 20 24 67 72 61 70 68 28 24  justify $graph($
d020: 69 6e 64 65 78 2c 6a 75 73 74 69 66 79 29 0a 09  index,justify)..
d030: 73 65 74 20 70 61 64 78 20 20 20 20 24 67 72 61  set padx    $gra
d040: 70 68 28 24 69 6e 64 65 78 2c 70 61 64 78 29 0a  ph($index,padx).
d050: 09 73 65 74 20 70 61 64 79 20 20 20 20 24 67 72  .set pady    $gr
d060: 61 70 68 28 24 69 6e 64 65 78 2c 70 61 64 79 29  aph($index,pady)
d070: 0a 0a 09 53 65 74 43 6f 6c 6f 72 20 24 67 20 24  ...SetColor $g $
d080: 67 72 61 70 68 28 24 69 6e 64 65 78 2c 6f 75 74  graph($index,out
d090: 6c 69 6e 65 29 0a 09 66 6f 72 65 61 63 68 20 7b  line)..foreach {
d0a0: 66 6f 6e 74 20 73 69 7a 65 20 61 74 74 72 7d 20  font size attr} 
d0b0: 24 67 72 61 70 68 28 24 69 6e 64 65 78 2c 66 6f  $graph($index,fo
d0c0: 6e 74 29 20 7b 7d 0a 09 53 65 74 46 6f 6e 74 20  nt) {}..SetFont 
d0d0: 24 67 20 24 66 6f 6e 74 20 24 73 69 7a 65 20 24  $g $font $size $
d0e0: 61 74 74 72 0a 0a 09 66 6f 72 65 61 63 68 20 7b  attr...foreach {
d0f0: 78 20 79 7d 20 24 63 6c 69 73 74 20 7b 7d 0a 0a  x y} $clist {}..
d100: 09 73 65 74 20 6c 69 6e 65 73 20 5b 73 70 6c 69  .set lines [spli
d110: 74 20 24 74 65 78 74 20 5c 6e 5d 0a 09 73 65 74  t $text \n]..set
d120: 20 6c 63 6e 74 20 5b 6c 6c 65 6e 67 74 68 20 24   lcnt [llength $
d130: 6c 69 6e 65 73 5d 0a 09 73 65 74 20 74 77 20 30  lines]..set tw 0
d140: 0a 09 66 6f 72 65 61 63 68 20 6c 69 6e 65 20 24  ..foreach line $
d150: 6c 69 6e 65 73 20 7b 0a 09 20 20 73 65 74 20 77  lines {..  set w
d160: 20 5b 54 65 78 74 57 69 64 74 68 20 24 6c 69 6e   [TextWidth $lin
d170: 65 5d 0a 09 20 20 69 66 20 7b 24 77 20 3e 20 24  e]..  if {$w > $
d180: 74 77 7d 20 7b 20 73 65 74 20 74 77 20 24 77 20  tw} { set tw $w 
d190: 7d 0a 09 7d 0a 09 73 65 74 20 6c 68 20 5b 4c 69  }..}..set lh [Li
d1a0: 6e 65 48 65 69 67 68 74 5d 0a 09 73 65 74 20 64  neHeight]..set d
d1b0: 78 20 5b 65 78 70 72 20 7b 24 74 77 20 2b 20 32  x [expr {$tw + 2
d1c0: 20 2a 20 24 70 61 64 78 7d 5d 0a 09 73 65 74 20   * $padx}]..set 
d1d0: 64 79 20 5b 65 78 70 72 20 7b 24 6c 63 6e 74 20  dy [expr {$lcnt 
d1e0: 2a 20 24 6c 68 20 2b 20 32 20 2a 20 24 70 61 64  * $lh + 2 * $pad
d1f0: 79 7d 5d 0a 0a 09 73 65 74 20 78 6c 20 5b 65 78  y}]...set xl [ex
d200: 70 72 20 7b 24 78 20 2d 20 24 64 78 20 2f 20 32  pr {$x - $dx / 2
d210: 2e 30 7d 5d 0a 09 73 65 74 20 79 74 20 5b 65 78  .0}]..set yt [ex
d220: 70 72 20 7b 24 79 20 2b 20 24 64 79 20 2f 20 32  pr {$y + $dy / 2
d230: 2e 30 7d 5d 0a 09 69 66 20 7b 24 61 6e 63 68 6f  .0}]..if {$ancho
d240: 72 20 21 3d 20 22 63 65 6e 74 65 72 22 7d 20 7b  r != "center"} {
d250: 0a 09 20 20 66 6f 72 65 61 63 68 20 69 74 65 6d  ..  foreach item
d260: 20 5b 73 70 6c 69 74 20 24 61 6e 63 68 6f 72 20   [split $anchor 
d270: 7b 7d 5d 20 7b 0a 09 20 20 20 20 73 77 69 74 63  {}] {..    switc
d280: 68 20 24 69 74 65 6d 20 7b 0a 09 20 20 20 20 20  h $item {..     
d290: 20 6e 20 7b 20 73 65 74 20 79 74 20 24 79 20 7d   n { set yt $y }
d2a0: 0a 09 20 20 20 20 20 20 73 20 7b 20 73 65 74 20  ..      s { set 
d2b0: 79 74 20 5b 65 78 70 72 20 7b 24 79 20 2b 20 24  yt [expr {$y + $
d2c0: 64 79 7d 5d 20 7d 0a 09 20 20 20 20 20 20 77 20  dy}] }..      w 
d2d0: 7b 20 73 65 74 20 78 6c 20 24 78 20 7d 0a 09 20  { set xl $x }.. 
d2e0: 20 20 20 20 20 65 20 7b 20 73 65 74 20 78 6c 20       e { set xl 
d2f0: 5b 65 78 70 72 20 7b 24 78 20 2d 20 24 64 78 7d  [expr {$x - $dx}
d300: 5d 20 7d 0a 09 20 20 20 20 7d 0a 09 20 20 7d 0a  ] }..    }..  }.
d310: 09 7d 0a 0a 09 69 66 20 7b 24 66 69 6c 6c 20 21  .}...if {$fill !
d320: 3d 20 7b 7d 7d 20 7b 0a 09 20 20 53 65 74 4c 69  = {}} {..  SetLi
d330: 6e 65 77 69 64 74 68 20 24 67 20 2d 31 0a 09 20  newidth $g -1.. 
d340: 20 73 65 74 20 78 72 20 5b 65 78 70 72 20 7b 24   set xr [expr {$
d350: 78 6c 20 2b 20 24 64 78 7d 5d 0a 09 20 20 73 65  xl + $dx}]..  se
d360: 74 20 79 62 20 5b 65 78 70 72 20 7b 24 79 74 20  t yb [expr {$yt 
d370: 2d 20 24 64 79 7d 5d 0a 09 20 20 52 65 63 74 20  - $dy}]..  Rect 
d380: 24 67 20 24 78 6c 20 24 79 74 20 24 78 72 20 24  $g $xl $yt $xr $
d390: 79 62 20 24 66 69 6c 6c 0a 09 7d 0a 0a 09 73 65  yb $fill..}...se
d3a0: 74 20 78 20 5b 65 78 70 72 20 7b 24 78 6c 20 2b  t x [expr {$xl +
d3b0: 20 24 70 61 64 78 7d 5d 0a 09 73 65 74 20 79 20   $padx}]..set y 
d3c0: 5b 65 78 70 72 20 7b 24 79 74 20 2d 20 24 70 61  [expr {$yt - $pa
d3d0: 64 79 20 2d 20 30 2e 38 20 2a 20 24 6c 68 7d 5d  dy - 0.8 * $lh}]
d3e0: 0a 09 73 65 74 20 77 20 5b 65 78 70 72 20 7b 24  ..set w [expr {$
d3f0: 64 78 20 2d 20 32 20 2a 20 24 70 61 64 78 7d 5d  dx - 2 * $padx}]
d400: 0a 09 66 6f 72 65 61 63 68 20 6c 69 6e 65 20 24  ..foreach line $
d410: 6c 69 6e 65 73 20 7b 0a 09 20 20 73 77 69 74 63  lines {..  switc
d420: 68 20 24 6a 75 73 74 69 66 79 20 7b 0a 09 20 20  h $justify {..  
d430: 20 20 6c 65 66 74 20 20 20 7b 20 54 65 78 74 20    left   { Text 
d440: 24 67 20 24 78 20 24 79 20 24 6c 69 6e 65 20 7d  $g $x $y $line }
d450: 0a 09 20 20 20 20 63 65 6e 74 65 72 20 7b 20 54  ..    center { T
d460: 65 78 74 20 24 67 20 24 78 20 24 79 20 24 6c 69  ext $g $x $y $li
d470: 6e 65 20 63 65 6e 74 65 72 20 24 77 20 7d 0a 09  ne center $w }..
d480: 20 20 20 20 72 69 67 68 74 20 20 7b 20 54 65 78      right  { Tex
d490: 74 20 24 67 20 24 78 20 24 79 20 24 6c 69 6e 65  t $g $x $y $line
d4a0: 20 72 69 67 68 74 20 20 24 77 20 7d 0a 09 20 20   right  $w }..  
d4b0: 7d 0a 09 20 20 73 65 74 20 79 20 5b 65 78 70 72  }..  set y [expr
d4c0: 20 7b 24 79 20 2d 20 24 6c 68 7d 5d 0a 09 7d 0a   {$y - $lh}]..}.
d4d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
d4e0: 20 20 69 6d 61 67 65 20 7b 0a 20 20 20 20 20 20    image {.      
d4f0: 73 65 74 20 70 6e 61 6d 65 20 24 67 72 61 70 68  set pname $graph
d500: 28 24 69 6e 64 65 78 2c 69 6d 61 67 65 29 0a 20  ($index,image). 
d510: 20 20 20 20 20 69 66 20 7b 5b 50 69 63 74 53 69       if {[PictSi
d520: 7a 65 20 24 67 20 24 70 6e 61 6d 65 5d 20 3d 3d  ze $g $pname] ==
d530: 20 7b 7d 7d 20 7b 0a 09 4c 6f 61 64 50 69 63 74   {}} {..LoadPict
d540: 20 24 67 20 24 70 6e 61 6d 65 0a 20 20 20 20 20   $g $pname.     
d550: 20 7d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 65   }.      if {[se
d560: 74 20 70 73 69 7a 65 20 5b 50 69 63 74 53 69 7a  t psize [PictSiz
d570: 65 20 24 67 20 24 70 6e 61 6d 65 5d 5d 20 3d 3d  e $g $pname]] ==
d580: 20 7b 7d 7d 20 72 65 74 75 72 6e 0a 20 20 20 20   {}} return.    
d590: 20 20 66 6f 72 65 61 63 68 20 7b 64 78 20 64 79    foreach {dx dy
d5a0: 7d 20 24 70 73 69 7a 65 20 7b 7d 0a 20 20 20 20  } $psize {}.    
d5b0: 20 20 66 6f 72 65 61 63 68 20 7b 78 30 20 79 30    foreach {x0 y0
d5c0: 7d 20 24 63 6c 69 73 74 20 7b 7d 0a 20 20 20 20  } $clist {}.    
d5d0: 20 20 73 65 74 20 78 20 5b 65 78 70 72 20 7b 24    set x [expr {$
d5e0: 78 30 20 2d 20 24 64 78 20 2f 20 32 2e 30 7d 5d  x0 - $dx / 2.0}]
d5f0: 0a 20 20 20 20 20 20 73 65 74 20 79 20 5b 65 78  .      set y [ex
d600: 70 72 20 7b 24 79 30 20 2d 20 24 64 79 20 2f 20  pr {$y0 - $dy / 
d610: 32 2e 30 7d 5d 0a 20 20 20 20 20 20 50 69 63 74  2.0}].      Pict
d620: 20 24 67 20 24 78 20 24 79 20 24 70 6e 61 6d 65   $g $x $y $pname
d630: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 23  .    }.  }.}..##
d640: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
d650: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
d660: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
d670: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
d680: 23 23 23 23 23 23 23 23 23 23 23 23 23 0a 23 0a  #############.#.
d690: 23 20 67 72 69 64 20 63 6f 6d 70 6f 6e 65 6e 74  # grid component
d6a0: 73 0a 23 0a 0a 70 72 6f 63 20 67 72 61 70 68 3a  s.#..proc graph:
d6b0: 3a 67 72 69 64 20 7b 20 67 20 6f 70 65 72 61 74  :grid { g operat
d6c0: 69 6f 6e 20 70 61 72 61 6d 73 20 7d 20 7b 0a 20  ion params } {. 
d6d0: 20 76 61 72 69 61 62 6c 65 20 67 72 61 70 68 0a   variable graph.
d6e0: 0a 20 20 73 77 69 74 63 68 20 2d 2d 20 24 6f 70  .  switch -- $op
d6f0: 65 72 61 74 69 6f 6e 20 7b 0a 20 20 20 20 63 6f  eration {.    co
d700: 6e 66 69 67 75 72 65 20 7b 0a 20 20 20 20 20 20  nfigure {.      
d710: 6f 62 6a 5f 63 6f 6e 66 69 67 75 72 65 20 24 67  obj_configure $g
d720: 2c 67 72 69 64 20 24 70 61 72 61 6d 73 0a 20 20  ,grid $params.  
d730: 20 20 7d 0a 20 20 20 20 63 67 65 74 20 7b 0a 20    }.    cget {. 
d740: 20 20 20 20 20 72 65 74 75 72 6e 20 5b 6f 62 6a       return [obj
d750: 5f 63 67 65 74 20 24 67 2c 67 72 69 64 20 5b 6c  _cget $g,grid [l
d760: 69 6e 64 65 78 20 24 70 61 72 61 6d 73 20 30 5d  index $params 0]
d770: 5d 0a 20 20 20 20 7d 0a 20 20 20 20 6f 6e 20 7b  ].    }.    on {
d780: 0a 20 20 20 20 20 20 73 65 74 20 67 72 61 70 68  .      set graph
d790: 28 24 67 2c 67 72 69 64 2c 68 69 64 65 29 20 6e  ($g,grid,hide) n
d7a0: 6f 0a 20 20 20 20 7d 0a 20 20 20 20 6f 66 66 20  o.    }.    off 
d7b0: 7b 0a 20 20 20 20 20 20 73 65 74 20 67 72 61 70  {.      set grap
d7c0: 68 28 24 67 2c 67 72 69 64 2c 68 69 64 65 29 20  h($g,grid,hide) 
d7d0: 79 65 73 0a 20 20 20 20 7d 0a 20 20 20 20 74 6f  yes.    }.    to
d7e0: 67 67 6c 65 20 7b 0a 20 20 20 20 20 20 69 66 20  ggle {.      if 
d7f0: 7b 24 67 72 61 70 68 28 24 67 2c 67 72 69 64 2c  {$graph($g,grid,
d800: 68 69 64 65 29 7d 20 7b 0a 20 20 20 20 20 20 20  hide)} {.       
d810: 20 67 72 69 64 20 24 67 20 6f 6e 0a 20 20 20 20   grid $g on.    
d820: 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
d830: 20 20 20 67 72 69 64 20 24 67 20 6f 66 66 0a 20     grid $g off. 
d840: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
d850: 20 64 65 66 61 75 6c 74 20 7b 0a 20 20 20 20 20   default {.     
d860: 20 72 65 74 75 72 6e 20 2d 63 6f 64 65 20 65 72   return -code er
d870: 72 6f 72 20 22 75 6e 6b 6e 6f 77 6e 20 6f 70 65  ror "unknown ope
d880: 72 61 74 69 6f 6e 20 5c 22 24 6f 70 65 72 61 74  ration \"$operat
d890: 69 6f 6e 5c 22 22 0a 20 20 20 20 7d 0a 20 20 7d  ion\"".    }.  }
d8a0: 0a 7d 0a 0a 0a 70 72 6f 63 20 67 72 61 70 68 3a  .}...proc graph:
d8b0: 3a 67 72 69 64 6c 69 6e 65 20 7b 20 67 20 63 6f  :gridline { g co
d8c0: 6c 6f 72 20 6c 69 6e 65 77 69 64 74 68 20 64 61  lor linewidth da
d8d0: 73 68 65 73 20 78 31 20 79 31 20 78 32 20 79 32  shes x1 y1 x2 y2
d8e0: 20 7d 20 7b 0a 20 20 76 61 72 69 61 62 6c 65 20   } {.  variable 
d8f0: 67 72 61 70 68 0a 0a 20 20 0a 20 20 73 65 74 20  graph..  .  set 
d900: 6f 72 67 5f 6c 69 6e 65 77 69 64 74 68 20 5b 67  org_linewidth [g
d910: 65 74 5f 6f 70 74 20 24 67 20 6c 69 6e 65 77 69  et_opt $g linewi
d920: 64 74 68 5d 0a 20 20 73 65 74 20 6f 72 67 5f 72  dth].  set org_r
d930: 67 62 63 6f 6c 6f 72 20 20 5b 67 65 74 5f 6f 70  gbcolor  [get_op
d940: 74 20 24 67 20 72 67 62 63 6f 6c 6f 72 5d 0a 20  t $g rgbcolor]. 
d950: 20 0a 20 20 53 65 74 4c 69 6e 65 77 69 64 74 68   .  SetLinewidth
d960: 20 24 67 20 24 6c 69 6e 65 77 69 64 74 68 0a 20   $g $linewidth. 
d970: 20 53 65 74 43 6f 6c 6f 72 20 24 67 20 20 20 20   SetColor $g    
d980: 20 24 63 6f 6c 6f 72 0a 20 20 53 65 74 44 61 73   $color.  SetDas
d990: 68 20 24 67 20 20 20 20 20 20 24 64 61 73 68 65  h $g      $dashe
d9a0: 73 0a 0a 20 20 4c 69 6e 65 20 24 67 20 24 78 31  s..  Line $g $x1
d9b0: 20 24 79 31 20 24 78 32 20 24 79 32 0a 0a 20 20   $y1 $x2 $y2..  
d9c0: 53 65 74 4c 69 6e 65 77 69 64 74 68 20 24 67 20  SetLinewidth $g 
d9d0: 24 6f 72 67 5f 6c 69 6e 65 77 69 64 74 68 0a 20  $org_linewidth. 
d9e0: 20 53 65 74 43 6f 6c 6f 72 20 24 67 20 20 20 20   SetColor $g    
d9f0: 20 24 6f 72 67 5f 72 67 62 63 6f 6c 6f 72 0a 20   $org_rgbcolor. 
da00: 20 53 65 74 44 61 73 68 20 24 67 20 20 20 20 20   SetDash $g     
da10: 20 7b 7d 0a 7d 0a 0a 23 23 23 23 23 23 23 23 23   {}.}..#########
da20: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
da30: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
da40: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
da50: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
da60: 23 23 23 23 23 23 0a 23 0a 23 20 67 72 61 70 68  ######.#.# graph
da70: 20 64 72 61 77 69 6e 67 20 70 72 6f 63 0a 23 0a   drawing proc.#.
da80: 0a 70 72 6f 63 20 67 72 61 70 68 3a 3a 64 72 61  .proc graph::dra
da90: 77 20 7b 20 67 20 78 30 20 79 30 20 7d 20 7b 0a  w { g x0 y0 } {.
daa0: 20 20 76 61 72 69 61 62 6c 65 20 67 72 61 70 68    variable graph
dab0: 0a 0a 20 20 73 65 74 20 6f 72 69 67 69 6e 20 5b  ..  set origin [
dac0: 47 65 74 4f 72 69 67 69 6e 20 24 67 5d 0a 0a 20  GetOrigin $g].. 
dad0: 20 73 65 74 20 6f 72 67 5f 66 6f 6e 74 20 20 20   set org_font   
dae0: 20 20 20 20 20 5b 67 65 74 5f 6f 70 74 20 24 67       [get_opt $g
daf0: 20 66 6f 6e 74 5d 0a 20 20 73 65 74 20 6f 72 67   font].  set org
db00: 5f 6c 69 6e 65 77 69 64 74 68 20 20 20 5b 67 65  _linewidth   [ge
db10: 74 5f 6f 70 74 20 24 67 20 6c 69 6e 65 77 69 64  t_opt $g linewid
db20: 74 68 5d 0a 20 20 73 65 74 20 6f 72 67 5f 72 67  th].  set org_rg
db30: 62 63 6f 6c 6f 72 20 20 20 20 5b 67 65 74 5f 6f  bcolor    [get_o
db40: 70 74 20 24 67 20 72 67 62 63 6f 6c 6f 72 5d 0a  pt $g rgbcolor].
db50: 20 20 73 65 74 20 6f 72 67 5f 64 61 73 68 70 61    set org_dashpa
db60: 74 74 65 72 6e 20 5b 67 65 74 5f 6f 70 74 20 24  ttern [get_opt $
db70: 67 20 64 61 73 68 70 61 74 74 65 72 6e 5d 0a 0a  g dashpattern]..
db80: 20 20 66 6f 72 65 61 63 68 20 65 6c 65 6d 20 24    foreach elem $
db90: 67 72 61 70 68 28 24 67 2c 5f 65 6c 65 6d 65 6e  graph($g,_elemen
dba0: 74 73 29 20 7b 0a 20 20 20 20 65 6c 65 6d 5f 63  ts) {.    elem_c
dbb0: 61 6c 63 20 24 67 20 24 65 6c 65 6d 0a 20 20 7d  alc $g $elem.  }
dbc0: 0a 20 20 66 6f 72 65 61 63 68 20 61 78 69 73 20  .  foreach axis 
dbd0: 24 67 72 61 70 68 28 24 67 2c 5f 61 78 69 73 65  $graph($g,_axise
dbe0: 73 29 20 7b 0a 20 20 20 20 61 78 69 73 5f 63 61  s) {.    axis_ca
dbf0: 6c 63 20 24 67 20 24 61 78 69 73 0a 20 20 7d 0a  lc $g $axis.  }.
dc00: 20 20 6c 65 67 65 6e 64 5f 63 61 6c 63 20 24 67    legend_calc $g
dc10: 0a 0a 20 20 73 65 74 20 6d 61 72 67 69 6e 20 24  ..  set margin $
dc20: 67 72 61 70 68 28 24 67 2c 5f 6d 61 72 67 69 6e  graph($g,_margin
dc30: 29 0a 20 20 20 20 0a 20 20 73 65 74 20 67 5f 77  ).    .  set g_w
dc40: 69 64 74 68 20 20 24 67 72 61 70 68 28 24 67 2c  idth  $graph($g,
dc50: 77 69 64 74 68 29 0a 20 20 73 65 74 20 67 5f 68  width).  set g_h
dc60: 65 69 67 68 74 20 24 67 72 61 70 68 28 24 67 2c  eight $graph($g,
dc70: 68 65 69 67 68 74 29 0a 0a 20 20 43 61 6c 63 58  height)..  CalcX
dc80: 59 20 24 67 20 78 30 20 79 30 20 20 20 20 20 20  Y $g x0 y0      
dc90: 20 3b 23 20 70 61 67 65 20 63 6f 6f 72 64 73 20   ;# page coords 
dca0: 74 6f 20 62 6f 74 74 6f 6d 2d 6c 65 66 74 20 72  to bottom-left r
dcb0: 65 6c 61 74 65 64 0a 0a 20 20 69 66 20 7b 24 6f  elated..  if {$o
dcc0: 72 69 67 69 6e 7d 20 7b 20 20 20 20 20 20 20 20  rigin} {        
dcd0: 3b 23 20 30 2f 30 20 3d 20 74 6f 70 2d 6c 65 66  ;# 0/0 = top-lef
dce0: 74 0a 20 20 20 20 73 65 74 20 78 5f 6c 65 66 74  t.    set x_left
dcf0: 20 20 20 24 78 30 0a 20 20 20 20 73 65 74 20 78     $x0.    set x
dd00: 5f 72 69 67 68 74 20 20 5b 65 78 70 72 20 7b 24  _right  [expr {$
dd10: 78 5f 6c 65 66 74 20 2b 20 24 67 5f 77 69 64 74  x_left + $g_widt
dd20: 68 7d 5d 20 20 0a 20 20 20 20 73 65 74 20 79 5f  h}]  .    set y_
dd30: 62 6f 74 74 6f 6d 20 5b 65 78 70 72 20 7b 24 79  bottom [expr {$y
dd40: 30 20 2d 20 24 67 5f 68 65 69 67 68 74 7d 5d 0a  0 - $g_height}].
dd50: 20 20 20 20 73 65 74 20 79 5f 74 6f 70 20 20 20      set y_top   
dd60: 20 24 79 30 0a 20 20 7d 20 65 6c 73 65 20 7b 20   $y0.  } else { 
dd70: 20 20 20 20 20 20 20 20 20 20 20 20 20 3b 23 20               ;# 
dd80: 30 2f 30 20 3d 20 62 6f 74 74 6f 6d 2d 6c 65 66  0/0 = bottom-lef
dd90: 74 0a 20 20 20 20 73 65 74 20 78 5f 6c 65 66 74  t.    set x_left
dda0: 20 20 20 24 78 30 0a 20 20 20 20 73 65 74 20 78     $x0.    set x
ddb0: 5f 72 69 67 68 74 20 20 5b 65 78 70 72 20 7b 24  _right  [expr {$
ddc0: 78 5f 6c 65 66 74 20 2b 20 24 67 5f 77 69 64 74  x_left + $g_widt
ddd0: 68 7d 5d 20 20 0a 20 20 20 20 73 65 74 20 79 5f  h}]  .    set y_
dde0: 62 6f 74 74 6f 6d 20 24 79 30 0a 20 20 20 20 73  bottom $y0.    s
ddf0: 65 74 20 79 5f 74 6f 70 20 20 20 20 5b 65 78 70  et y_top    [exp
de00: 72 20 7b 24 79 30 20 2b 20 24 67 5f 68 65 69 67  r {$y0 + $g_heig
de10: 68 74 7d 5d 0a 20 20 7d 0a 0a 20 20 73 65 74 20  ht}].  }..  set 
de20: 62 67 63 20 24 67 72 61 70 68 28 24 67 2c 62 61  bgc $graph($g,ba
de30: 63 6b 67 72 6f 75 6e 64 29 0a 20 20 73 65 74 20  ckground).  set 
de40: 62 64 77 20 24 67 72 61 70 68 28 24 67 2c 62 6f  bdw $graph($g,bo
de50: 72 64 65 72 77 69 64 74 68 29 0a 20 20 73 65 74  rderwidth).  set
de60: 20 72 65 6c 20 24 67 72 61 70 68 28 24 67 2c 72   rel $graph($g,r
de70: 65 6c 69 65 66 29 0a 0a 20 20 73 65 74 5f 6f 70  elief)..  set_op
de80: 74 20 24 67 20 6c 69 6e 65 77 69 64 74 68 20 2d  t $g linewidth -
de90: 31 0a 20 20 52 65 63 74 20 24 67 20 24 78 5f 6c  1.  Rect $g $x_l
dea0: 65 66 74 20 24 79 5f 74 6f 70 20 24 78 5f 72 69  eft $y_top $x_ri
deb0: 67 68 74 20 24 79 5f 62 6f 74 74 6f 6d 20 24 62  ght $y_bottom $b
dec0: 67 63 0a 20 20 73 65 74 5f 6f 70 74 20 24 67 20  gc.  set_opt $g 
ded0: 6c 69 6e 65 77 69 64 74 68 20 30 0a 0a 20 20 64  linewidth 0..  d
dee0: 72 61 77 5f 66 72 61 6d 65 20 24 67 20 24 78 5f  raw_frame $g $x_
def0: 6c 65 66 74 20 24 79 5f 74 6f 70 20 24 78 5f 72  left $y_top $x_r
df00: 69 67 68 74 20 24 79 5f 62 6f 74 74 6f 6d 20 24  ight $y_bottom $
df10: 62 67 63 20 24 72 65 6c 20 24 62 64 77 0a 0a 20  bgc $rel $bdw.. 
df20: 20 73 65 74 20 78 5f 6c 65 66 74 20 20 20 5b 65   set x_left   [e
df30: 78 70 72 20 7b 24 78 5f 6c 65 66 74 20 20 20 2b  xpr {$x_left   +
df40: 20 24 62 64 77 20 2b 20 24 6d 61 72 67 69 6e 7d   $bdw + $margin}
df50: 5d 0a 20 20 73 65 74 20 78 5f 72 69 67 68 74 20  ].  set x_right 
df60: 20 5b 65 78 70 72 20 7b 24 78 5f 72 69 67 68 74   [expr {$x_right
df70: 20 20 2d 20 24 62 64 77 20 2d 20 24 6d 61 72 67    - $bdw - $marg
df80: 69 6e 7d 5d 0a 20 20 73 65 74 20 79 5f 74 6f 70  in}].  set y_top
df90: 20 20 20 20 5b 65 78 70 72 20 7b 24 79 5f 74 6f      [expr {$y_to
dfa0: 70 20 20 20 20 2d 20 24 62 64 77 20 2d 20 24 6d  p    - $bdw - $m
dfb0: 61 72 67 69 6e 7d 5d 0a 20 20 73 65 74 20 79 5f  argin}].  set y_
dfc0: 62 6f 74 74 6f 6d 20 5b 65 78 70 72 20 7b 24 79  bottom [expr {$y
dfd0: 5f 62 6f 74 74 6f 6d 20 2b 20 24 62 64 77 20 2b  _bottom + $bdw +
dfe0: 20 24 6d 61 72 67 69 6e 7d 5d 0a 0a 20 20 23 20   $margin}]..  # 
dff0: 64 72 61 77 20 67 72 61 70 68 20 74 69 74 6c 65  draw graph title
e000: 3a 0a 20 20 69 66 20 7b 24 67 72 61 70 68 28 24  :.  if {$graph($
e010: 67 2c 74 69 74 6c 65 29 20 21 3d 20 22 22 7d 20  g,title) != ""} 
e020: 7b 0a 20 20 20 20 66 6f 72 65 61 63 68 20 7b 66  {.    foreach {f
e030: 6f 6e 74 20 73 69 7a 65 20 61 74 74 72 7d 20 24  ont size attr} $
e040: 67 72 61 70 68 28 24 67 2c 66 6f 6e 74 29 20 7b  graph($g,font) {
e050: 7d 0a 20 20 20 20 53 65 74 46 6f 6e 74 20 24 67  }.    SetFont $g
e060: 20 24 66 6f 6e 74 20 24 73 69 7a 65 20 24 61 74   $font $size $at
e070: 74 72 0a 20 20 20 20 73 65 74 20 66 68 20 5b 4c  tr.    set fh [L
e080: 69 6e 65 48 65 69 67 68 74 5d 0a 20 20 20 20 73  ineHeight].    s
e090: 65 74 20 79 5f 74 65 78 74 20 5b 65 78 70 72 20  et y_text [expr 
e0a0: 7b 24 79 5f 74 6f 70 20 2d 20 24 6d 61 72 67 69  {$y_top - $margi
e0b0: 6e 20 2d 20 24 66 68 20 2a 20 30 2e 38 7d 5d 0a  n - $fh * 0.8}].
e0c0: 20 20 20 20 73 65 74 20 74 78 74 6c 65 6e 20 5b      set txtlen [
e0d0: 54 65 78 74 57 69 64 74 68 20 24 67 72 61 70 68  TextWidth $graph
e0e0: 28 24 67 2c 74 69 74 6c 65 29 5d 0a 20 20 20 20  ($g,title)].    
e0f0: 73 77 69 74 63 68 20 24 67 72 61 70 68 28 24 67  switch $graph($g
e100: 2c 6a 75 73 74 69 66 79 29 20 7b 0a 20 20 20 20  ,justify) {.    
e110: 20 20 6c 65 66 74 20 7b 0a 20 20 20 20 20 20 20    left {.       
e120: 20 73 65 74 20 78 5f 74 65 78 74 20 5b 65 78 70   set x_text [exp
e130: 72 20 7b 24 78 5f 6c 65 66 74 20 2b 20 24 6d 61  r {$x_left + $ma
e140: 72 67 69 6e 7d 5d 0a 20 20 20 20 20 20 7d 0a 20  rgin}].      }. 
e150: 20 20 20 20 20 63 65 6e 74 65 72 20 7b 0a 20 20       center {.  
e160: 20 20 20 20 20 20 73 65 74 20 78 5f 74 65 78 74        set x_text
e170: 20 5b 65 78 70 72 20 7b 24 78 5f 6c 65 66 74 20   [expr {$x_left 
e180: 2b 20 28 24 78 5f 72 69 67 68 74 20 2d 20 24 78  + ($x_right - $x
e190: 5f 6c 65 66 74 20 2d 20 24 74 78 74 6c 65 6e 29  _left - $txtlen)
e1a0: 20 2f 20 32 2e 30 7d 5d 0a 20 20 20 20 20 20 7d   / 2.0}].      }
e1b0: 0a 20 20 20 20 20 20 72 69 67 68 74 20 7b 0a 20  .      right {. 
e1c0: 20 20 20 20 20 20 20 73 65 74 20 78 5f 74 65 78         set x_tex
e1d0: 74 20 5b 65 78 70 72 20 7b 24 78 5f 72 69 67 68  t [expr {$x_righ
e1e0: 74 20 2d 20 24 6d 61 72 67 69 6e 20 2d 20 24 74  t - $margin - $t
e1f0: 78 74 6c 65 6e 7d 5d 0a 20 20 20 20 20 20 7d 0a  xtlen}].      }.
e200: 20 20 20 20 7d 0a 20 20 20 20 54 65 78 74 20 24      }.    Text $
e210: 67 20 24 78 5f 74 65 78 74 20 24 79 5f 74 65 78  g $x_text $y_tex
e220: 74 20 24 67 72 61 70 68 28 24 67 2c 74 69 74 6c  t $graph($g,titl
e230: 65 29 0a 20 20 20 20 73 65 74 20 79 5f 74 6f 70  e).    set y_top
e240: 20 5b 65 78 70 72 20 7b 24 79 5f 74 6f 70 20 2d   [expr {$y_top -
e250: 20 24 66 68 20 2d 20 32 20 2a 20 24 6d 61 72 67   $fh - 2 * $marg
e260: 69 6e 7d 5d 0a 20 20 7d 0a 0a 20 20 23 20 64 72  in}].  }..  # dr
e270: 61 77 20 6c 65 67 65 6e 64 20 69 6e 20 6d 61 72  aw legend in mar
e280: 67 69 6e 3a 0a 20 20 69 66 20 7b 24 67 72 61 70  gin:.  if {$grap
e290: 68 28 24 67 2c 6c 65 67 65 6e 64 2c 5f 76 61 6c  h($g,legend,_val
e2a0: 69 64 29 7d 20 7b 0a 20 20 20 20 69 66 20 7b 24  id)} {.    if {$
e2b0: 67 72 61 70 68 28 24 67 2c 6c 65 67 65 6e 64 2c  graph($g,legend,
e2c0: 5f 69 6e 6d 61 72 67 69 6e 29 7d 20 7b 0a 20 20  _inmargin)} {.  
e2d0: 20 20 20 20 6c 65 67 65 6e 64 5f 64 72 61 77 20      legend_draw 
e2e0: 24 67 20 24 78 5f 6c 65 66 74 20 24 79 5f 74 6f  $g $x_left $y_to
e2f0: 70 20 24 78 5f 72 69 67 68 74 20 24 79 5f 62 6f  p $x_right $y_bo
e300: 74 74 6f 6d 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ttom.    }..    
e310: 73 65 74 20 77 69 64 74 68 20 20 24 67 72 61 70  set width  $grap
e320: 68 28 24 67 2c 6c 65 67 65 6e 64 2c 5f 77 69 64  h($g,legend,_wid
e330: 74 68 29 0a 20 20 20 20 73 65 74 20 68 65 69 67  th).    set heig
e340: 68 74 20 24 67 72 61 70 68 28 24 67 2c 6c 65 67  ht $graph($g,leg
e350: 65 6e 64 2c 5f 68 65 69 67 68 74 29 0a 20 20 20  end,_height).   
e360: 20 73 77 69 74 63 68 20 24 67 72 61 70 68 28 24   switch $graph($
e370: 67 2c 6c 65 67 65 6e 64 2c 70 6f 73 69 74 69 6f  g,legend,positio
e380: 6e 29 20 7b 0a 20 20 20 20 20 20 6c 65 66 74 20  n) {.      left 
e390: 20 20 7b 20 73 65 74 20 78 5f 6c 65 66 74 20 20    { set x_left  
e3a0: 20 5b 65 78 70 72 20 7b 24 78 5f 6c 65 66 74 20   [expr {$x_left 
e3b0: 20 20 2b 20 24 77 69 64 74 68 20 20 2b 20 24 6d    + $width  + $m
e3c0: 61 72 67 69 6e 7d 5d 20 7d 0a 20 20 20 20 20 20  argin}] }.      
e3d0: 72 69 67 68 74 20 20 7b 20 73 65 74 20 78 5f 72  right  { set x_r
e3e0: 69 67 68 74 20 20 5b 65 78 70 72 20 7b 24 78 5f  ight  [expr {$x_
e3f0: 72 69 67 68 74 20 20 2d 20 24 77 69 64 74 68 20  right  - $width 
e400: 20 2d 20 24 6d 61 72 67 69 6e 7d 5d 20 7d 0a 20   - $margin}] }. 
e410: 20 20 20 20 20 74 6f 70 20 20 20 20 7b 20 73 65       top    { se
e420: 74 20 79 5f 74 6f 70 20 20 20 20 5b 65 78 70 72  t y_top    [expr
e430: 20 7b 24 79 5f 74 6f 70 20 20 20 20 2d 20 24 68   {$y_top    - $h
e440: 65 69 67 68 74 20 2d 20 24 6d 61 72 67 69 6e 7d  eight - $margin}
e450: 5d 20 7d 0a 20 20 20 20 20 20 62 6f 74 74 6f 6d  ] }.      bottom
e460: 20 7b 20 73 65 74 20 79 5f 62 6f 74 74 6f 6d 20   { set y_bottom 
e470: 5b 65 78 70 72 20 7b 24 79 5f 62 6f 74 74 6f 6d  [expr {$y_bottom
e480: 20 2b 20 24 68 65 69 67 68 74 20 2b 20 24 6d 61   + $height + $ma
e490: 72 67 69 6e 7d 5d 20 7d 0a 20 20 20 20 7d 0a 20  rgin}] }.    }. 
e4a0: 20 7d 0a 0a 20 20 23 20 63 61 6c 63 20 64 72 61   }..  # calc dra
e4b0: 77 69 6e 67 20 61 72 65 61 3a 0a 20 20 73 65 74  wing area:.  set
e4c0: 20 78 6c 5f 64 72 61 77 20 24 78 5f 6c 65 66 74   xl_draw $x_left
e4d0: 0a 20 20 73 65 74 20 78 72 5f 64 72 61 77 20 24  .  set xr_draw $
e4e0: 78 5f 72 69 67 68 74 0a 20 20 73 65 74 20 79 74  x_right.  set yt
e4f0: 5f 64 72 61 77 20 24 79 5f 74 6f 70 0a 20 20 73  _draw $y_top.  s
e500: 65 74 20 79 62 5f 64 72 61 77 20 24 79 5f 62 6f  et yb_draw $y_bo
e510: 74 74 6f 6d 0a 20 20 69 66 20 7b 24 67 72 61 70  ttom.  if {$grap
e520: 68 28 24 67 2c 62 6f 74 74 6f 6d 6d 61 72 67 69  h($g,bottommargi
e530: 6e 29 20 3e 20 30 7d 20 7b 0a 20 20 20 20 73 65  n) > 0} {.    se
e540: 74 20 79 62 5f 64 72 61 77 20 5b 65 78 70 72 20  t yb_draw [expr 
e550: 7b 24 79 62 5f 64 72 61 77 20 2b 20 24 67 72 61  {$yb_draw + $gra
e560: 70 68 28 24 67 2c 62 6f 74 74 6f 6d 6d 61 72 67  ph($g,bottommarg
e570: 69 6e 29 20 2b 20 24 6d 61 72 67 69 6e 7d 5d 0a  in) + $margin}].
e580: 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 66    } else {.    f
e590: 6f 72 65 61 63 68 20 61 78 69 73 20 24 67 72 61  oreach axis $gra
e5a0: 70 68 28 24 67 2c 5f 78 61 78 69 73 29 20 7b 0a  ph($g,_xaxis) {.
e5b0: 20 20 20 20 20 20 73 65 74 20 69 6e 64 65 78 20        set index 
e5c0: 24 67 2c 61 78 69 73 2d 24 61 78 69 73 0a 20 20  $g,axis-$axis.  
e5d0: 20 20 20 20 69 66 20 7b 21 24 67 72 61 70 68 28      if {!$graph(
e5e0: 24 69 6e 64 65 78 2c 5f 76 61 6c 69 64 29 7d 20  $index,_valid)} 
e5f0: 63 6f 6e 74 69 6e 75 65 0a 20 20 20 20 20 20 73  continue.      s
e600: 65 74 20 79 62 5f 64 72 61 77 20 5b 65 78 70 72  et yb_draw [expr
e610: 20 7b 24 79 62 5f 64 72 61 77 20 2b 20 24 67 72   {$yb_draw + $gr
e620: 61 70 68 28 24 69 6e 64 65 78 2c 5f 68 65 69 67  aph($index,_heig
e630: 68 74 29 20 2b 20 24 6d 61 72 67 69 6e 7d 5d 0a  ht) + $margin}].
e640: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 20 7b      }.  }.  if {
e650: 24 67 72 61 70 68 28 24 67 2c 74 6f 70 6d 61 72  $graph($g,topmar
e660: 67 69 6e 29 20 3e 20 30 7d 20 7b 0a 20 20 20 20  gin) > 0} {.    
e670: 73 65 74 20 79 74 5f 64 72 61 77 20 5b 65 78 70  set yt_draw [exp
e680: 72 20 7b 24 79 74 5f 64 72 61 77 20 2d 20 24 67  r {$yt_draw - $g
e690: 72 61 70 68 28 24 67 2c 74 6f 70 6d 61 72 67 69  raph($g,topmargi
e6a0: 6e 29 20 2d 20 24 6d 61 72 67 69 6e 7d 5d 0a 20  n) - $margin}]. 
e6b0: 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 66 6f   } else {.    fo
e6c0: 72 65 61 63 68 20 61 78 69 73 20 24 67 72 61 70  reach axis $grap
e6d0: 68 28 24 67 2c 5f 78 32 61 78 69 73 29 20 7b 0a  h($g,_x2axis) {.
e6e0: 20 20 20 20 20 20 73 65 74 20 69 6e 64 65 78 20        set index 
e6f0: 24 67 2c 61 78 69 73 2d 24 61 78 69 73 0a 20 20  $g,axis-$axis.  
e700: 20 20 20 20 69 66 20 7b 21 24 67 72 61 70 68 28      if {!$graph(
e710: 24 69 6e 64 65 78 2c 5f 76 61 6c 69 64 29 7d 20  $index,_valid)} 
e720: 63 6f 6e 74 69 6e 75 65 0a 20 20 20 20 20 20 73  continue.      s
e730: 65 74 20 79 74 5f 64 72 61 77 20 5b 65 78 70 72  et yt_draw [expr
e740: 20 7b 24 79 74 5f 64 72 61 77 20 2d 20 24 67 72   {$yt_draw - $gr
e750: 61 70 68 28 24 69 6e 64 65 78 2c 5f 68 65 69 67  aph($index,_heig
e760: 68 74 29 20 2d 20 24 6d 61 72 67 69 6e 7d 5d 0a  ht) - $margin}].
e770: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 20 7b      }.  }.  if {
e780: 24 67 72 61 70 68 28 24 67 2c 6c 65 66 74 6d 61  $graph($g,leftma
e790: 72 67 69 6e 29 20 3e 20 30 7d 20 7b 0a 20 20 20  rgin) > 0} {.   
e7a0: 20 73 65 74 20 78 6c 5f 64 72 61 77 20 5b 65 78   set xl_draw [ex
e7b0: 70 72 20 7b 24 78 6c 5f 64 72 61 77 20 2b 20 24  pr {$xl_draw + $
e7c0: 67 72 61 70 68 28 24 67 2c 6c 65 66 74 6d 61 72  graph($g,leftmar
e7d0: 67 69 6e 29 20 2b 20 24 6d 61 72 67 69 6e 7d 5d  gin) + $margin}]
e7e0: 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20  .  } else {.    
e7f0: 66 6f 72 65 61 63 68 20 61 78 69 73 20 24 67 72  foreach axis $gr
e800: 61 70 68 28 24 67 2c 5f 79 61 78 69 73 29 20 7b  aph($g,_yaxis) {
e810: 0a 20 20 20 20 20 20 73 65 74 20 69 6e 64 65 78  .      set index
e820: 20 24 67 2c 61 78 69 73 2d 24 61 78 69 73 0a 20   $g,axis-$axis. 
e830: 20 20 20 20 20 69 66 20 7b 21 24 67 72 61 70 68       if {!$graph
e840: 28 24 69 6e 64 65 78 2c 5f 76 61 6c 69 64 29 7d  ($index,_valid)}
e850: 20 63 6f 6e 74 69 6e 75 65 0a 20 20 20 20 20 20   continue.      
e860: 73 65 74 20 78 6c 5f 64 72 61 77 20 5b 65 78 70  set xl_draw [exp
e870: 72 20 7b 24 78 6c 5f 64 72 61 77 20 2b 20 24 67  r {$xl_draw + $g
e880: 72 61 70 68 28 24 69 6e 64 65 78 2c 5f 77 69 64  raph($index,_wid
e890: 74 68 29 20 2b 20 24 6d 61 72 67 69 6e 7d 5d 0a  th) + $margin}].
e8a0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 20 7b      }.  }.  if {
e8b0: 24 67 72 61 70 68 28 24 67 2c 72 69 67 68 74 6d  $graph($g,rightm
e8c0: 61 72 67 69 6e 29 20 3e 20 30 7d 20 7b 0a 20 20  argin) > 0} {.  
e8d0: 20 20 73 65 74 20 78 72 5f 64 72 61 77 20 5b 65    set xr_draw [e
e8e0: 78 70 72 20 7b 24 78 72 5f 64 72 61 77 20 2d 20  xpr {$xr_draw - 
e8f0: 24 67 72 61 70 68 28 24 67 2c 72 69 67 68 74 6d  $graph($g,rightm
e900: 61 72 67 69 6e 29 20 2d 20 24 6d 61 72 67 69 6e  argin) - $margin
e910: 7d 5d 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  }].  } else {.  
e920: 20 20 66 6f 72 65 61 63 68 20 61 78 69 73 20 24    foreach axis $
e930: 67 72 61 70 68 28 24 67 2c 5f 79 32 61 78 69 73  graph($g,_y2axis
e940: 29 20 7b 0a 20 20 20 20 20 20 73 65 74 20 69 6e  ) {.      set in
e950: 64 65 78 20 24 67 2c 61 78 69 73 2d 24 61 78 69  dex $g,axis-$axi
e960: 73 0a 20 20 20 20 20 20 69 66 20 7b 21 24 67 72  s.      if {!$gr
e970: 61 70 68 28 24 69 6e 64 65 78 2c 5f 76 61 6c 69  aph($index,_vali
e980: 64 29 7d 20 63 6f 6e 74 69 6e 75 65 0a 20 20 20  d)} continue.   
e990: 20 20 20 73 65 74 20 78 72 5f 64 72 61 77 20 5b     set xr_draw [
e9a0: 65 78 70 72 20 7b 24 78 72 5f 64 72 61 77 20 2d  expr {$xr_draw -
e9b0: 20 24 67 72 61 70 68 28 24 69 6e 64 65 78 2c 5f   $graph($index,_
e9c0: 77 69 64 74 68 29 20 2d 20 24 6d 61 72 67 69 6e  width) - $margin
e9d0: 7d 5d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  }].    }.  }.  s
e9e0: 65 74 20 78 6c 5f 64 72 61 77 20 5b 65 78 70 72  et xl_draw [expr
e9f0: 20 7b 24 78 6c 5f 64 72 61 77 20 2b 20 24 6d 61   {$xl_draw + $ma
ea00: 72 67 69 6e 7d 5d 0a 20 20 73 65 74 20 78 72 5f  rgin}].  set xr_
ea10: 64 72 61 77 20 5b 65 78 70 72 20 7b 24 78 72 5f  draw [expr {$xr_
ea20: 64 72 61 77 20 2d 20 24 6d 61 72 67 69 6e 7d 5d  draw - $margin}]
ea30: 0a 20 20 73 65 74 20 79 74 5f 64 72 61 77 20 5b  .  set yt_draw [
ea40: 65 78 70 72 20 7b 24 79 74 5f 64 72 61 77 20 2d  expr {$yt_draw -
ea50: 20 24 6d 61 72 67 69 6e 7d 5d 0a 20 20 73 65 74   $margin}].  set
ea60: 20 79 62 5f 64 72 61 77 20 5b 65 78 70 72 20 7b   yb_draw [expr {
ea70: 24 79 62 5f 64 72 61 77 20 2b 20 24 6d 61 72 67  $yb_draw + $marg
ea80: 69 6e 7d 5d 0a 0a 20 20 23 20 63 61 6c 63 20 67  in}]..  # calc g
ea90: 72 61 70 68 20 61 72 65 61 3a 0a 20 20 73 65 74  raph area:.  set
eaa0: 20 70 61 64 78 20 24 67 72 61 70 68 28 24 67 2c   padx $graph($g,
eab0: 70 6c 6f 74 70 61 64 78 29 0a 20 20 73 65 74 20  plotpadx).  set 
eac0: 70 61 64 79 20 24 67 72 61 70 68 28 24 67 2c 70  pady $graph($g,p
ead0: 6c 6f 74 70 61 64 79 29 0a 20 20 73 65 74 20 78  lotpady).  set x
eae0: 6c 5f 67 72 61 70 68 20 5b 65 78 70 72 20 7b 24  l_graph [expr {$
eaf0: 78 6c 5f 64 72 61 77 20 2b 20 24 67 72 61 70 68  xl_draw + $graph
eb00: 28 24 67 2c 62 6f 72 64 65 72 77 69 64 74 68 29  ($g,borderwidth)
eb10: 20 2b 20 24 70 61 64 78 7d 5d 0a 20 20 73 65 74   + $padx}].  set
eb20: 20 78 72 5f 67 72 61 70 68 20 5b 65 78 70 72 20   xr_graph [expr 
eb30: 7b 24 78 72 5f 64 72 61 77 20 2d 20 24 67 72 61  {$xr_draw - $gra
eb40: 70 68 28 24 67 2c 62 6f 72 64 65 72 77 69 64 74  ph($g,borderwidt
eb50: 68 29 20 2d 20 24 70 61 64 78 7d 5d 0a 20 20 73  h) - $padx}].  s
eb60: 65 74 20 79 74 5f 67 72 61 70 68 20 5b 65 78 70  et yt_graph [exp
eb70: 72 20 7b 24 79 74 5f 64 72 61 77 20 2d 20 24 67  r {$yt_draw - $g
eb80: 72 61 70 68 28 24 67 2c 62 6f 72 64 65 72 77 69  raph($g,borderwi
eb90: 64 74 68 29 20 2d 20 24 70 61 64 79 7d 5d 0a 20  dth) - $pady}]. 
eba0: 20 73 65 74 20 79 62 5f 67 72 61 70 68 20 5b 65   set yb_graph [e
ebb0: 78 70 72 20 7b 24 79 62 5f 64 72 61 77 20 2b 20  xpr {$yb_draw + 
ebc0: 24 67 72 61 70 68 28 24 67 2c 62 6f 72 64 65 72  $graph($g,border
ebd0: 77 69 64 74 68 29 20 2b 20 24 70 61 64 79 7d 5d  width) + $pady}]
ebe0: 0a 20 20 73 65 74 20 67 72 61 70 68 28 24 67 2c  .  set graph($g,
ebf0: 5f 78 6c 5f 67 72 61 70 68 29 20 24 78 6c 5f 67  _xl_graph) $xl_g
ec00: 72 61 70 68 0a 20 20 73 65 74 20 67 72 61 70 68  raph.  set graph
ec10: 28 24 67 2c 5f 78 72 5f 67 72 61 70 68 29 20 24  ($g,_xr_graph) $
ec20: 78 72 5f 67 72 61 70 68 0a 20 20 73 65 74 20 67  xr_graph.  set g
ec30: 72 61 70 68 28 24 67 2c 5f 79 74 5f 67 72 61 70  raph($g,_yt_grap
ec40: 68 29 20 24 79 74 5f 67 72 61 70 68 0a 20 20 73  h) $yt_graph.  s
ec50: 65 74 20 67 72 61 70 68 28 24 67 2c 5f 79 62 5f  et graph($g,_yb_
ec60: 67 72 61 70 68 29 20 24 79 62 5f 67 72 61 70 68  graph) $yb_graph
ec70: 0a 0a 20 20 23 20 70 61 72 72 61 79 20 67 72 61  ..  # parray gra
ec80: 70 68 20 24 67 2c 2a 0a 0a 20 20 23 20 64 72 61  ph $g,*..  # dra
ec90: 77 20 67 72 61 70 68 20 62 61 63 6b 67 72 6f 75  w graph backgrou
eca0: 6e 64 20 61 6e 64 20 66 72 61 6d 65 0a 20 20 73  nd and frame.  s
ecb0: 65 74 20 62 67 63 20 24 67 72 61 70 68 28 24 67  et bgc $graph($g
ecc0: 2c 70 6c 6f 74 62 61 63 6b 67 72 6f 75 6e 64 29  ,plotbackground)
ecd0: 0a 20 20 73 65 74 20 72 65 6c 20 24 67 72 61 70  .  set rel $grap
ece0: 68 28 24 67 2c 70 6c 6f 74 72 65 6c 69 65 66 29  h($g,plotrelief)
ecf0: 0a 20 20 73 65 74 20 62 64 77 20 24 67 72 61 70  .  set bdw $grap
ed00: 68 28 24 67 2c 70 6c 6f 74 62 6f 72 64 65 72 77  h($g,plotborderw
ed10: 69 64 74 68 29 0a 20 20 73 65 74 5f 6f 70 74 20  idth).  set_opt 
ed20: 24 67 20 6c 69 6e 65 77 69 64 74 68 20 2d 31 0a  $g linewidth -1.
ed30: 20 20 52 65 63 74 20 24 67 20 24 78 6c 5f 64 72    Rect $g $xl_dr
ed40: 61 77 20 24 79 74 5f 64 72 61 77 20 24 78 72 5f  aw $yt_draw $xr_
ed50: 64 72 61 77 20 24 79 62 5f 64 72 61 77 20 24 62  draw $yb_draw $b
ed60: 67 63 0a 20 20 73 65 74 5f 6f 70 74 20 24 67 20  gc.  set_opt $g 
ed70: 6c 69 6e 65 77 69 64 74 68 20 30 0a 20 20 64 72  linewidth 0.  dr
ed80: 61 77 5f 66 72 61 6d 65 20 24 67 20 24 78 6c 5f  aw_frame $g $xl_
ed90: 64 72 61 77 20 24 79 74 5f 64 72 61 77 20 24 78  draw $yt_draw $x
eda0: 72 5f 64 72 61 77 20 24 79 62 5f 64 72 61 77 20  r_draw $yb_draw 
edb0: 24 62 67 63 20 24 72 65 6c 20 24 62 64 77 0a 20  $bgc $rel $bdw. 
edc0: 20 73 65 74 20 78 6c 5f 64 72 61 77 20 5b 65 78   set xl_draw [ex
edd0: 70 72 20 7b 24 78 6c 5f 64 72 61 77 20 2b 20 24  pr {$xl_draw + $
ede0: 62 64 77 7d 5d 0a 20 20 73 65 74 20 78 72 5f 64  bdw}].  set xr_d
edf0: 72 61 77 20 5b 65 78 70 72 20 7b 24 78 72 5f 64  raw [expr {$xr_d
ee00: 72 61 77 20 2d 20 24 62 64 77 7d 5d 0a 20 20 73  raw - $bdw}].  s
ee10: 65 74 20 79 74 5f 64 72 61 77 20 5b 65 78 70 72  et yt_draw [expr
ee20: 20 7b 24 79 74 5f 64 72 61 77 20 2d 20 24 62 64   {$yt_draw - $bd
ee30: 77 7d 5d 0a 20 20 73 65 74 20 79 62 5f 64 72 61  w}].  set yb_dra
ee40: 77 20 5b 65 78 70 72 20 7b 24 79 62 5f 64 72 61  w [expr {$yb_dra
ee50: 77 20 2b 20 24 62 64 77 7d 5d 0a 0a 20 20 23 20  w + $bdw}]..  # 
ee60: 64 72 61 77 20 61 78 65 73 20 28 61 6e 64 20 67  draw axes (and g
ee70: 72 69 64 20 6c 69 6e 65 73 29 3a 0a 20 20 73 65  rid lines):.  se
ee80: 74 20 78 6c 20 24 78 6c 5f 67 72 61 70 68 0a 20  t xl $xl_graph. 
ee90: 20 73 65 74 20 78 72 20 24 78 72 5f 67 72 61 70   set xr $xr_grap
eea0: 68 0a 20 20 73 65 74 20 79 62 20 24 79 5f 62 6f  h.  set yb $y_bo
eeb0: 74 74 6f 6d 0a 20 20 66 6f 72 65 61 63 68 20 61  ttom.  foreach a
eec0: 78 69 73 20 24 67 72 61 70 68 28 24 67 2c 5f 78  xis $graph($g,_x
eed0: 61 78 69 73 29 20 7b 0a 20 20 20 20 73 65 74 20  axis) {.    set 
eee0: 69 6e 64 65 78 20 24 67 2c 61 78 69 73 2d 24 61  index $g,axis-$a
eef0: 78 69 73 0a 20 20 20 20 69 66 20 7b 21 24 67 72  xis.    if {!$gr
ef00: 61 70 68 28 24 69 6e 64 65 78 2c 5f 76 61 6c 69  aph($index,_vali
ef10: 64 29 7d 20 63 6f 6e 74 69 6e 75 65 0a 20 20 20  d)} continue.   
ef20: 20 73 65 74 20 79 74 20 5b 65 78 70 72 20 7b 24   set yt [expr {$
ef30: 79 62 20 2b 20 24 67 72 61 70 68 28 24 69 6e 64  yb + $graph($ind
ef40: 65 78 2c 5f 68 65 69 67 68 74 29 20 2b 20 24 6d  ex,_height) + $m
ef50: 61 72 67 69 6e 7d 5d 0a 20 20 20 20 61 78 69 73  argin}].    axis
ef60: 5f 64 72 61 77 20 24 67 20 24 61 78 69 73 20 24  _draw $g $axis $
ef70: 78 6c 20 24 79 74 20 24 78 72 20 24 79 62 20 5c  xl $yt $xr $yb \
ef80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24  .              $
ef90: 78 6c 5f 67 72 61 70 68 20 24 79 74 5f 67 72 61  xl_graph $yt_gra
efa0: 70 68 20 24 78 72 5f 67 72 61 70 68 20 24 79 62  ph $xr_graph $yb
efb0: 5f 67 72 61 70 68 0a 20 20 20 20 73 65 74 20 79  _graph.    set y
efc0: 62 20 24 79 74 0a 20 20 7d 0a 20 20 73 65 74 20  b $yt.  }.  set 
efd0: 79 74 20 24 79 5f 74 6f 70 0a 20 20 66 6f 72 65  yt $y_top.  fore
efe0: 61 63 68 20 61 78 69 73 20 24 67 72 61 70 68 28  ach axis $graph(
eff0: 24 67 2c 5f 78 32 61 78 69 73 29 20 7b 0a 20 20  $g,_x2axis) {.  
f000: 20 20 73 65 74 20 69 6e 64 65 78 20 24 67 2c 61    set index $g,a
f010: 78 69 73 2d 24 61 78 69 73 0a 20 20 20 20 69 66  xis-$axis.    if
f020: 20 7b 21 24 67 72 61 70 68 28 24 69 6e 64 65 78   {!$graph($index
f030: 2c 5f 76 61 6c 69 64 29 7d 20 63 6f 6e 74 69 6e  ,_valid)} contin
f040: 75 65 0a 20 20 20 20 73 65 74 20 79 62 20 5b 65  ue.    set yb [e
f050: 78 70 72 20 7b 24 79 74 20 2d 20 24 67 72 61 70  xpr {$yt - $grap
f060: 68 28 24 69 6e 64 65 78 2c 5f 68 65 69 67 68 74  h($index,_height
f070: 29 20 2d 20 24 6d 61 72 67 69 6e 7d 5d 0a 20 20  ) - $margin}].  
f080: 20 20 61 78 69 73 5f 64 72 61 77 20 24 67 20 24    axis_draw $g $
f090: 61 78 69 73 20 24 78 6c 20 24 79 74 20 24 78 72  axis $xl $yt $xr
f0a0: 20 24 79 62 20 5c 0a 20 20 20 20 20 20 20 20 20   $yb \.         
f0b0: 20 20 20 20 20 20 20 20 20 20 20 24 78 6c 5f 67             $xl_g
f0c0: 72 61 70 68 20 24 79 74 5f 67 72 61 70 68 20 24  raph $yt_graph $
f0d0: 78 72 5f 67 72 61 70 68 20 24 79 62 5f 67 72 61  xr_graph $yb_gra
f0e0: 70 68 0a 20 20 20 20 73 65 74 20 79 74 20 24 79  ph.    set yt $y
f0f0: 62 0a 20 20 7d 0a 20 20 73 65 74 20 79 74 20 24  b.  }.  set yt $
f100: 79 74 5f 67 72 61 70 68 0a 20 20 73 65 74 20 79  yt_graph.  set y
f110: 62 20 24 79 62 5f 67 72 61 70 68 0a 20 20 73 65  b $yb_graph.  se
f120: 74 20 78 6c 20 24 78 5f 6c 65 66 74 0a 20 20 66  t xl $x_left.  f
f130: 6f 72 65 61 63 68 20 61 78 69 73 20 24 67 72 61  oreach axis $gra
f140: 70 68 28 24 67 2c 5f 79 61 78 69 73 29 20 7b 0a  ph($g,_yaxis) {.
f150: 20 20 20 20 73 65 74 20 69 6e 64 65 78 20 24 67      set index $g
f160: 2c 61 78 69 73 2d 24 61 78 69 73 0a 20 20 20 20  ,axis-$axis.    
f170: 69 66 20 7b 21 24 67 72 61 70 68 28 24 69 6e 64  if {!$graph($ind
f180: 65 78 2c 5f 76 61 6c 69 64 29 7d 20 63 6f 6e 74  ex,_valid)} cont
f190: 69 6e 75 65 0a 20 20 20 20 73 65 74 20 78 72 20  inue.    set xr 
f1a0: 5b 65 78 70 72 20 7b 24 78 6c 20 2b 20 24 67 72  [expr {$xl + $gr
f1b0: 61 70 68 28 24 69 6e 64 65 78 2c 5f 77 69 64 74  aph($index,_widt
f1c0: 68 29 20 2b 20 24 6d 61 72 67 69 6e 7d 5d 0a 20  h) + $margin}]. 
f1d0: 20 20 20 61 78 69 73 5f 64 72 61 77 20 24 67 20     axis_draw $g 
f1e0: 24 61 78 69 73 20 24 78 6c 20 24 79 74 20 24 78  $axis $xl $yt $x
f1f0: 72 20 24 79 62 20 5c 0a 20 20 20 20 20 20 20 20  r $yb \.        
f200: 20 20 20 20 20 20 20 20 20 20 20 20 24 78 6c 5f              $xl_
f210: 67 72 61 70 68 20 24 79 74 5f 67 72 61 70 68 20  graph $yt_graph 
f220: 24 78 72 5f 67 72 61 70 68 20 24 79 62 5f 67 72  $xr_graph $yb_gr
f230: 61 70 68 0a 20 20 20 20 73 65 74 20 78 6c 20 24  aph.    set xl $
f240: 78 72 0a 20 20 7d 0a 20 20 73 65 74 20 78 72 20  xr.  }.  set xr 
f250: 24 78 5f 72 69 67 68 74 0a 20 20 66 6f 72 65 61  $x_right.  forea
f260: 63 68 20 61 78 69 73 20 24 67 72 61 70 68 28 24  ch axis $graph($
f270: 67 2c 5f 79 32 61 78 69 73 29 20 7b 0a 20 20 20  g,_y2axis) {.   
f280: 20 73 65 74 20 69 6e 64 65 78 20 24 67 2c 61 78   set index $g,ax
f290: 69 73 2d 24 61 78 69 73 0a 20 20 20 20 69 66 20  is-$axis.    if 
f2a0: 7b 21 24 67 72 61 70 68 28 24 69 6e 64 65 78 2c  {!$graph($index,
f2b0: 5f 76 61 6c 69 64 29 7d 20 63 6f 6e 74 69 6e 75  _valid)} continu
f2c0: 65 0a 20 20 20 20 73 65 74 20 78 6c 20 5b 65 78  e.    set xl [ex
f2d0: 70 72 20 7b 24 78 72 20 2d 20 24 67 72 61 70 68  pr {$xr - $graph
f2e0: 28 24 69 6e 64 65 78 2c 5f 77 69 64 74 68 29 20  ($index,_width) 
f2f0: 2d 20 24 6d 61 72 67 69 6e 7d 5d 0a 20 20 20 20  - $margin}].    
f300: 61 78 69 73 5f 64 72 61 77 20 24 67 20 24 61 78  axis_draw $g $ax
f310: 69 73 20 24 78 6c 20 24 79 74 20 24 78 72 20 24  is $xl $yt $xr $
f320: 79 62 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20  yb \.           
f330: 20 20 20 20 20 20 20 20 20 24 78 6c 5f 67 72 61           $xl_gra
f340: 70 68 20 24 79 74 5f 67 72 61 70 68 20 24 78 72  ph $yt_graph $xr
f350: 5f 67 72 61 70 68 20 24 79 62 5f 67 72 61 70 68  _graph $yb_graph
f360: 0a 20 20 20 20 73 65 74 20 78 72 20 24 78 6c 0a  .    set xr $xl.
f370: 20 20 7d 0a 0a 20 20 43 6c 69 70 52 65 63 74 20    }..  ClipRect 
f380: 24 67 20 24 78 6c 5f 64 72 61 77 20 24 79 74 5f  $g $xl_draw $yt_
f390: 64 72 61 77 20 24 78 72 5f 64 72 61 77 20 24 79  draw $xr_draw $y
f3a0: 62 5f 64 72 61 77 0a 20 20 73 65 74 20 67 72 61  b_draw.  set gra
f3b0: 70 68 28 24 67 2c 5f 63 6c 69 70 72 65 63 74 29  ph($g,_cliprect)
f3c0: 20 5b 6c 69 73 74 20 24 78 6c 5f 64 72 61 77 20   [list $xl_draw 
f3d0: 24 79 74 5f 64 72 61 77 20 24 78 72 5f 64 72 61  $yt_draw $xr_dra
f3e0: 77 20 24 79 62 5f 64 72 61 77 5d 0a 0a 20 20 23  w $yb_draw]..  #
f3f0: 20 64 72 61 77 20 6d 61 72 6b 65 72 20 65 6c 65   draw marker ele
f400: 6d 65 6e 74 73 20 75 6e 64 65 72 20 64 61 74 61  ments under data
f410: 20 65 6c 65 6d 65 6e 74 73 0a 20 20 66 6f 72 65   elements.  fore
f420: 61 63 68 20 6d 61 72 6b 65 72 20 24 67 72 61 70  ach marker $grap
f430: 68 28 24 67 2c 5f 6d 61 72 6b 65 72 73 29 20 7b  h($g,_markers) {
f440: 0a 20 20 20 20 69 66 20 7b 24 67 72 61 70 68 28  .    if {$graph(
f450: 24 67 2c 6d 61 72 6b 65 72 2d 24 6d 61 72 6b 65  $g,marker-$marke
f460: 72 2c 75 6e 64 65 72 29 7d 20 7b 0a 20 20 20 20  r,under)} {.    
f470: 20 20 6d 61 72 6b 65 72 5f 64 72 61 77 20 24 67    marker_draw $g
f480: 20 24 6d 61 72 6b 65 72 20 24 78 6c 5f 67 72 61   $marker $xl_gra
f490: 70 68 20 24 79 74 5f 67 72 61 70 68 20 24 78 72  ph $yt_graph $xr
f4a0: 5f 67 72 61 70 68 20 24 79 62 5f 67 72 61 70 68  _graph $yb_graph
f4b0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 23 20  .    }.  }..  # 
f4c0: 64 72 61 77 20 67 72 61 70 68 20 65 6c 65 6d 65  draw graph eleme
f4d0: 6e 74 73 0a 20 20 66 6f 72 65 61 63 68 20 65 6c  nts.  foreach el
f4e0: 65 6d 20 24 67 72 61 70 68 28 24 67 2c 5f 65 6c  em $graph($g,_el
f4f0: 65 6d 65 6e 74 73 29 20 7b 0a 20 20 20 20 69 66  ements) {.    if
f500: 20 7b 21 24 67 72 61 70 68 28 24 67 2c 65 6c 65   {!$graph($g,ele
f510: 6d 2d 24 65 6c 65 6d 2c 5f 76 61 6c 69 64 29 7d  m-$elem,_valid)}
f520: 20 63 6f 6e 74 69 6e 75 65 0a 20 20 20 20 65 6c   continue.    el
f530: 65 6d 5f 64 72 61 77 20 24 67 20 24 65 6c 65 6d  em_draw $g $elem
f540: 20 24 78 6c 5f 67 72 61 70 68 20 24 79 74 5f 67   $xl_graph $yt_g
f550: 72 61 70 68 20 24 78 72 5f 67 72 61 70 68 20 24  raph $xr_graph $
f560: 79 62 5f 67 72 61 70 68 0a 20 20 7d 0a 0a 20 20  yb_graph.  }..  
f570: 23 20 64 72 61 77 20 6d 61 72 6b 65 72 20 65 6c  # draw marker el
f580: 65 6d 65 6e 74 73 20 61 62 6f 76 65 20 64 61 74  ements above dat
f590: 61 20 65 6c 65 6d 65 6e 74 73 0a 20 20 66 6f 72  a elements.  for
f5a0: 65 61 63 68 20 6d 61 72 6b 65 72 20 24 67 72 61  each marker $gra
f5b0: 70 68 28 24 67 2c 5f 6d 61 72 6b 65 72 73 29 20  ph($g,_markers) 
f5c0: 7b 0a 20 20 20 20 69 66 20 7b 21 24 67 72 61 70  {.    if {!$grap
f5d0: 68 28 24 67 2c 6d 61 72 6b 65 72 2d 24 6d 61 72  h($g,marker-$mar
f5e0: 6b 65 72 2c 75 6e 64 65 72 29 7d 20 7b 0a 20 20  ker,under)} {.  
f5f0: 20 20 20 20 6d 61 72 6b 65 72 5f 64 72 61 77 20      marker_draw 
f600: 24 67 20 24 6d 61 72 6b 65 72 20 24 78 6c 5f 67  $g $marker $xl_g
f610: 72 61 70 68 20 24 79 74 5f 67 72 61 70 68 20 24  raph $yt_graph $
f620: 78 72 5f 67 72 61 70 68 20 24 79 62 5f 67 72 61  xr_graph $yb_gra
f630: 70 68 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  ph.    }.  }..  
f640: 23 20 64 72 61 77 20 6c 65 67 65 6e 64 20 69 6e  # draw legend in
f650: 20 70 6c 6f 74 61 72 65 61 3a 0a 20 20 69 66 20   plotarea:.  if 
f660: 7b 24 67 72 61 70 68 28 24 67 2c 6c 65 67 65 6e  {$graph($g,legen
f670: 64 2c 5f 76 61 6c 69 64 29 7d 20 7b 0a 20 20 20  d,_valid)} {.   
f680: 20 53 65 74 43 6f 6c 6f 72 20 24 67 20 62 6c 61   SetColor $g bla
f690: 63 6b 0a 20 20 20 20 69 66 20 7b 21 24 67 72 61  ck.    if {!$gra
f6a0: 70 68 28 24 67 2c 6c 65 67 65 6e 64 2c 5f 69 6e  ph($g,legend,_in
f6b0: 6d 61 72 67 69 6e 29 7d 20 7b 0a 20 20 20 20 20  margin)} {.     
f6c0: 20 6c 65 67 65 6e 64 5f 64 72 61 77 20 24 67 20   legend_draw $g 
f6d0: 24 78 6c 5f 64 72 61 77 20 24 79 74 5f 64 72 61  $xl_draw $yt_dra
f6e0: 77 20 24 78 72 5f 64 72 61 77 20 24 79 62 5f 64  w $xr_draw $yb_d
f6f0: 72 61 77 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  raw.    }.  }.. 
f700: 20 55 6e 63 6c 69 70 52 65 63 74 20 24 67 0a 0a   UnclipRect $g..
f710: 20 20 66 6f 72 65 61 63 68 20 7b 66 6f 6e 74 20    foreach {font 
f720: 73 69 7a 65 20 61 74 74 72 7d 20 24 6f 72 67 5f  size attr} $org_
f730: 66 6f 6e 74 20 7b 7d 0a 20 20 53 65 74 46 6f 6e  font {}.  SetFon
f740: 74 20 24 67 20 24 66 6f 6e 74 20 24 73 69 7a 65  t $g $font $size
f750: 20 24 61 74 74 72 0a 20 20 53 65 74 4c 69 6e 65   $attr.  SetLine
f760: 77 69 64 74 68 20 24 67 20 20 20 24 6f 72 67 5f  width $g   $org_
f770: 6c 69 6e 65 77 69 64 74 68 0a 20 20 53 65 74 44  linewidth.  SetD
f780: 61 73 68 20 24 67 20 20 20 20 20 20 20 20 24 6f  ash $g        $o
f790: 72 67 5f 64 61 73 68 70 61 74 74 65 72 6e 0a 20  rg_dashpattern. 
f7a0: 20 53 65 74 43 6f 6c 6f 72 20 24 67 20 20 20 20   SetColor $g    
f7b0: 20 20 20 24 6f 72 67 5f 72 67 62 63 6f 6c 6f 72     $org_rgbcolor
f7c0: 0a 0a 20 20 72 65 74 75 72 6e 20 24 67 0a 7d 0a  ..  return $g.}.
f7d0: 0a 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  .###############
f7e0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
f7f0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
f800: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
f810: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
f820: 0a                                               .