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 .