A Multi-Column Listbox
Hex Artifact Content
Not logged in

Artifact e35e9ca96b3c590ec0065717e3990963866dc8d1:

Attachment "plotchart.tcl" to ticket [1891251fff] added by relaxmike 2008-02-11 23:24:32.
0000: 23 20 70 6c 6f 74 63 68 61 72 74 2e 74 63 6c 20  # plotchart.tcl 
0010: 2d 2d 0d 0a 23 20 20 20 20 46 61 63 69 6c 69 74  --..#    Facilit
0020: 69 65 73 20 74 6f 20 64 72 61 77 20 73 69 6d 70  ies to draw simp
0030: 6c 65 20 70 6c 6f 74 73 20 69 6e 20 61 20 64 65  le plots in a de
0040: 64 69 63 61 74 65 64 20 63 61 6e 76 61 73 0d 0a  dicated canvas..
0050: 23 0d 0a 23 20 4e 6f 74 65 3a 0d 0a 23 20 20 20  #..# Note:..#   
0060: 20 54 68 69 73 20 73 6f 75 72 63 65 20 66 69 6c   This source fil
0070: 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 70  e contains the p
0080: 75 62 6c 69 63 20 66 75 6e 63 74 69 6f 6e 73 2e  ublic functions.
0090: 0d 0a 23 20 20 20 20 54 68 65 20 6f 74 68 65 72  ..#    The other
00a0: 73 20 61 72 65 20 63 6f 6e 74 61 69 6e 65 64 20  s are contained 
00b0: 69 6e 20 22 70 6c 6f 74 70 72 69 76 2e 74 63 6c  in "plotpriv.tcl
00c0: 22 0d 0a 23 0d 0a 70 61 63 6b 61 67 65 20 72 65  "..#..package re
00d0: 71 75 69 72 65 20 54 63 6c 20 38 2e 33 0d 0a 70  quire Tcl 8.3..p
00e0: 61 63 6b 61 67 65 20 72 65 71 75 69 72 65 20 54  ackage require T
00f0: 6b 0d 0a 0d 0a 23 20 50 6c 6f 74 63 68 61 72 74  k....# Plotchart
0100: 20 2d 2d 0d 0a 23 20 20 20 20 4e 61 6d 65 73 70   --..#    Namesp
0110: 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ace to hold the 
0120: 70 72 6f 63 65 64 75 72 65 73 20 61 6e 64 20 74  procedures and t
0130: 68 65 20 70 72 69 76 61 74 65 20 64 61 74 61 0d  he private data.
0140: 0a 23 0d 0a 6e 61 6d 65 73 70 61 63 65 20 65 76  .#..namespace ev
0150: 61 6c 20 3a 3a 50 6c 6f 74 63 68 61 72 74 20 7b  al ::Plotchart {
0160: 0d 0a 20 20 20 76 61 72 69 61 62 6c 65 20 73 65  ..   variable se
0170: 74 74 69 6e 67 73 0d 0a 20 20 20 76 61 72 69 61  ttings..   varia
0180: 62 6c 65 20 6c 65 67 65 6e 64 0d 0a 20 20 20 76  ble legend..   v
0190: 61 72 69 61 62 6c 65 20 73 63 61 6c 69 6e 67 0d  ariable scaling.
01a0: 0a 20 20 20 76 61 72 69 61 62 6c 65 20 6d 65 74  .   variable met
01b0: 68 6f 64 50 72 6f 63 0d 0a 20 20 20 76 61 72 69  hodProc..   vari
01c0: 61 62 6c 65 20 64 61 74 61 5f 73 65 72 69 65 73  able data_series
01d0: 0d 0a 0d 0a 20 20 20 6e 61 6d 65 73 70 61 63 65  ....   namespace
01e0: 20 65 78 70 6f 72 74 20 77 6f 72 6c 64 43 6f 6f   export worldCoo
01f0: 72 64 69 6e 61 74 65 73 20 76 69 65 77 50 6f 72  rdinates viewPor
0200: 74 20 63 6f 6f 72 64 73 54 6f 50 69 78 65 6c 20  t coordsToPixel 
0210: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
0220: 20 20 20 20 20 20 20 70 6f 6c 61 72 43 6f 6f 72         polarCoor
0230: 64 69 6e 61 74 65 73 20 73 65 74 5a 6f 6f 6d 50  dinates setZoomP
0240: 61 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  an \..          
0250: 20 20 20 20 20 20 20 20 20 20 77 6f 72 6c 64 33            world3
0260: 44 43 6f 6f 72 64 69 6e 61 74 65 73 20 63 6f 6f  DCoordinates coo
0270: 72 64 73 54 6f 50 69 78 65 6c 20 5c 0d 0a 20 20  rdsToPixel \..  
0280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0290: 20 20 63 6f 6f 72 64 73 33 44 54 6f 50 69 78 65    coords3DToPixe
02a0: 6c 20 70 6f 6c 61 72 54 6f 50 69 78 65 6c 20 5c  l polarToPixel \
02b0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
02c0: 20 20 20 20 20 20 70 69 78 65 6c 54 6f 43 6f 6f        pixelToCoo
02d0: 72 64 73 20 70 69 78 65 6c 54 6f 49 6e 64 65 78  rds pixelToIndex
02e0: 20 64 65 74 65 72 6d 69 6e 65 53 63 61 6c 65 20   determineScale 
02f0: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
0300: 20 20 20 20 20 20 20 63 72 65 61 74 65 58 59 50         createXYP
0310: 6c 6f 74 20 63 72 65 61 74 65 50 6f 6c 61 72 50  lot createPolarP
0320: 6c 6f 74 20 63 72 65 61 74 65 50 69 65 63 68 61  lot createPiecha
0330: 72 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  rt \..          
0340: 20 20 20 20 20 20 20 20 20 20 63 72 65 61 74 65            create
0350: 42 61 72 63 68 61 72 74 20 63 72 65 61 74 65 48  Barchart createH
0360: 6f 72 69 7a 6f 6e 74 61 6c 42 61 72 63 68 61 72  orizontalBarchar
0370: 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  t \..           
0380: 20 20 20 20 20 20 20 20 20 63 72 65 61 74 65 54           createT
0390: 69 6d 65 63 68 61 72 74 20 63 72 65 61 74 65 53  imechart createS
03a0: 74 72 69 70 63 68 61 72 74 20 5c 0d 0a 20 20 20  tripchart \..   
03b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
03c0: 20 63 72 65 61 74 65 49 73 6f 6d 65 74 72 69 63   createIsometric
03d0: 50 6c 6f 74 20 63 72 65 61 74 65 33 44 50 6c 6f  Plot create3DPlo
03e0: 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  t \..           
03f0: 20 20 20 20 20 20 20 20 20 63 72 65 61 74 65 47           createG
0400: 61 6e 74 74 43 68 61 72 74 20 63 72 65 61 74 65  anttChart create
0410: 48 69 73 74 6f 67 72 61 6d 20 63 6f 6c 6f 72 4d  Histogram colorM
0420: 61 70 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ap \..          
0430: 20 20 20 20 20 20 20 20 20 20 63 72 65 61 74 65            create
0440: 33 44 42 61 72 73 20 63 72 65 61 74 65 52 61 64  3DBars createRad
0450: 69 61 6c 63 68 61 72 74 20 5c 0d 0a 20 20 20 20  ialchart \..    
0460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0470: 63 72 65 61 74 65 54 58 50 6c 6f 74 20 63 72 65  createTXPlot cre
0480: 61 74 65 52 69 67 68 74 41 78 69 73 20 5c 0d 0a  ateRightAxis \..
0490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
04a0: 20 20 20 20 63 72 65 61 74 65 33 44 52 69 62 62      create3DRibb
04b0: 6f 6e 43 68 61 72 74 0d 0a 0d 0a 20 20 20 23 0d  onChart....   #.
04c0: 0a 20 20 20 23 20 41 72 72 61 79 20 6c 69 6e 6b  .   # Array link
04d0: 69 6e 67 20 70 72 6f 63 65 64 75 72 65 73 20 77  ing procedures w
04e0: 69 74 68 20 6d 65 74 68 6f 64 73 0d 0a 20 20 20  ith methods..   
04f0: 23 0d 0a 20 20 20 73 65 74 20 6d 65 74 68 6f 64  #..   set method
0500: 50 72 6f 63 28 78 79 70 6c 6f 74 2c 74 69 74 6c  Proc(xyplot,titl
0510: 65 29 20 20 20 20 20 20 20 20 20 20 44 72 61 77  e)          Draw
0520: 54 69 74 6c 65 0d 0a 20 20 20 73 65 74 20 6d 65  Title..   set me
0530: 74 68 6f 64 50 72 6f 63 28 78 79 70 6c 6f 74 2c  thodProc(xyplot,
0540: 78 74 65 78 74 29 20 20 20 20 20 20 20 20 20 20  xtext)          
0550: 44 72 61 77 58 74 65 78 74 0d 0a 20 20 20 73 65  DrawXtext..   se
0560: 74 20 6d 65 74 68 6f 64 50 72 6f 63 28 78 79 70  t methodProc(xyp
0570: 6c 6f 74 2c 79 74 65 78 74 29 20 20 20 20 20 20  lot,ytext)      
0580: 20 20 20 20 44 72 61 77 59 74 65 78 74 0d 0a 20      DrawYtext.. 
0590: 20 20 73 65 74 20 6d 65 74 68 6f 64 50 72 6f 63    set methodProc
05a0: 28 78 79 70 6c 6f 74 2c 70 6c 6f 74 29 20 20 20  (xyplot,plot)   
05b0: 20 20 20 20 20 20 20 20 44 72 61 77 44 61 74 61          DrawData
05c0: 0d 0a 20 20 20 73 65 74 20 6d 65 74 68 6f 64 50  ..   set methodP
05d0: 72 6f 63 28 78 79 70 6c 6f 74 2c 64 6f 74 29 20  roc(xyplot,dot) 
05e0: 20 20 20 20 20 20 20 20 20 20 20 44 72 61 77 44             DrawD
05f0: 6f 74 0d 0a 20 20 20 73 65 74 20 6d 65 74 68 6f  ot..   set metho
0600: 64 50 72 6f 63 28 78 79 70 6c 6f 74 2c 64 6f 74  dProc(xyplot,dot
0610: 63 6f 6e 66 69 67 29 20 20 20 20 20 20 44 6f 74  config)      Dot
0620: 43 6f 6e 66 69 67 75 72 65 0d 0a 20 20 20 73 65  Configure..   se
0630: 74 20 6d 65 74 68 6f 64 50 72 6f 63 28 78 79 70  t methodProc(xyp
0640: 6c 6f 74 2c 69 6e 74 65 72 76 61 6c 29 20 20 20  lot,interval)   
0650: 20 20 20 20 44 72 61 77 49 6e 74 65 72 76 61 6c      DrawInterval
0660: 0d 0a 20 20 20 73 65 74 20 6d 65 74 68 6f 64 50  ..   set methodP
0670: 72 6f 63 28 78 79 70 6c 6f 74 2c 74 72 65 6e 64  roc(xyplot,trend
0680: 29 20 20 20 20 20 20 20 20 20 20 44 72 61 77 54  )          DrawT
0690: 72 65 6e 64 4c 69 6e 65 0d 0a 20 20 20 73 65 74  rendLine..   set
06a0: 20 6d 65 74 68 6f 64 50 72 6f 63 28 78 79 70 6c   methodProc(xypl
06b0: 6f 74 2c 76 65 63 74 6f 72 29 20 20 20 20 20 20  ot,vector)      
06c0: 20 20 20 44 72 61 77 56 65 63 74 6f 72 0d 0a 20     DrawVector.. 
06d0: 20 20 73 65 74 20 6d 65 74 68 6f 64 50 72 6f 63    set methodProc
06e0: 28 78 79 70 6c 6f 74 2c 76 65 63 74 6f 72 63 6f  (xyplot,vectorco
06f0: 6e 66 69 67 29 20 20 20 56 65 63 74 6f 72 43 6f  nfig)   VectorCo
0700: 6e 66 69 67 75 72 65 0d 0a 20 20 20 73 65 74 20  nfigure..   set 
0710: 6d 65 74 68 6f 64 50 72 6f 63 28 78 79 70 6c 6f  methodProc(xyplo
0720: 74 2c 72 63 68 61 72 74 29 20 20 20 20 20 20 20  t,rchart)       
0730: 20 20 44 72 61 77 52 63 68 61 72 74 0d 0a 20 20    DrawRchart..  
0740: 20 73 65 74 20 6d 65 74 68 6f 64 50 72 6f 63 28   set methodProc(
0750: 78 79 70 6c 6f 74 2c 67 72 69 64 29 20 20 20 20  xyplot,grid)    
0760: 20 20 20 20 20 20 20 44 72 61 77 47 72 69 64 0d         DrawGrid.
0770: 0a 20 20 20 73 65 74 20 6d 65 74 68 6f 64 50 72  .   set methodPr
0780: 6f 63 28 78 79 70 6c 6f 74 2c 63 6f 6e 74 6f 75  oc(xyplot,contou
0790: 72 6c 69 6e 65 73 29 20 20 20 44 72 61 77 49 73  rlines)   DrawIs
07a0: 6f 6c 69 6e 65 73 0d 0a 20 20 20 73 65 74 20 6d  olines..   set m
07b0: 65 74 68 6f 64 50 72 6f 63 28 78 79 70 6c 6f 74  ethodProc(xyplot
07c0: 2c 63 6f 6e 74 6f 75 72 66 69 6c 6c 29 20 20 20  ,contourfill)   
07d0: 20 44 72 61 77 53 68 61 64 65 73 0d 0a 20 20 20   DrawShades..   
07e0: 73 65 74 20 6d 65 74 68 6f 64 50 72 6f 63 28 78  set methodProc(x
07f0: 79 70 6c 6f 74 2c 63 6f 6e 74 6f 75 72 62 6f 78  yplot,contourbox
0800: 29 20 20 20 20 20 44 72 61 77 42 6f 78 0d 0a 20  )     DrawBox.. 
0810: 20 20 73 65 74 20 6d 65 74 68 6f 64 50 72 6f 63    set methodProc
0820: 28 78 79 70 6c 6f 74 2c 73 61 76 65 70 6c 6f 74  (xyplot,saveplot
0830: 29 20 20 20 20 20 20 20 53 61 76 65 50 6c 6f 74  )       SavePlot
0840: 0d 0a 20 20 20 73 65 74 20 6d 65 74 68 6f 64 50  ..   set methodP
0850: 72 6f 63 28 78 79 70 6c 6f 74 2c 64 61 74 61 63  roc(xyplot,datac
0860: 6f 6e 66 69 67 29 20 20 20 20 20 44 61 74 61 43  onfig)     DataC
0870: 6f 6e 66 69 67 0d 0a 20 20 20 73 65 74 20 6d 65  onfig..   set me
0880: 74 68 6f 64 50 72 6f 63 28 78 79 70 6c 6f 74 2c  thodProc(xyplot,
0890: 78 63 6f 6e 66 69 67 29 20 20 20 20 20 20 20 20  xconfig)        
08a0: 58 43 6f 6e 66 69 67 0d 0a 20 20 20 73 65 74 20  XConfig..   set 
08b0: 6d 65 74 68 6f 64 50 72 6f 63 28 78 79 70 6c 6f  methodProc(xyplo
08c0: 74 2c 79 63 6f 6e 66 69 67 29 20 20 20 20 20 20  t,yconfig)      
08d0: 20 20 59 43 6f 6e 66 69 67 0d 0a 20 20 20 73 65    YConfig..   se
08e0: 74 20 6d 65 74 68 6f 64 50 72 6f 63 28 78 79 70  t methodProc(xyp
08f0: 6c 6f 74 2c 78 74 69 63 6b 6c 69 6e 65 73 29 20  lot,xticklines) 
0900: 20 20 20 20 44 72 61 77 58 54 69 63 6b 6c 69 6e      DrawXTicklin
0910: 65 73 0d 0a 20 20 20 73 65 74 20 6d 65 74 68 6f  es..   set metho
0920: 64 50 72 6f 63 28 78 79 70 6c 6f 74 2c 79 74 69  dProc(xyplot,yti
0930: 63 6b 6c 69 6e 65 73 29 20 20 20 20 20 44 72 61  cklines)     Dra
0940: 77 59 54 69 63 6b 6c 69 6e 65 73 0d 0a 20 20 20  wYTicklines..   
0950: 73 65 74 20 6d 65 74 68 6f 64 50 72 6f 63 28 78  set methodProc(x
0960: 79 70 6c 6f 74 2c 62 61 63 6b 67 72 6f 75 6e 64  yplot,background
0970: 29 20 20 20 20 20 42 61 63 6b 67 72 6f 75 6e 64  )     Background
0980: 43 6f 6c 6f 75 72 0d 0a 20 20 20 73 65 74 20 6d  Colour..   set m
0990: 65 74 68 6f 64 50 72 6f 63 28 78 79 70 6c 6f 74  ethodProc(xyplot
09a0: 2c 6c 65 67 65 6e 64 63 6f 6e 66 69 67 29 20 20  ,legendconfig)  
09b0: 20 4c 65 67 65 6e 64 43 6f 6e 66 69 67 75 72 65   LegendConfigure
09c0: 0d 0a 20 20 20 73 65 74 20 6d 65 74 68 6f 64 50  ..   set methodP
09d0: 72 6f 63 28 78 79 70 6c 6f 74 2c 6c 65 67 65 6e  roc(xyplot,legen
09e0: 64 29 20 20 20 20 20 20 20 20 20 44 72 61 77 4c  d)         DrawL
09f0: 65 67 65 6e 64 0d 0a 20 20 20 73 65 74 20 6d 65  egend..   set me
0a00: 74 68 6f 64 50 72 6f 63 28 78 79 70 6c 6f 74 2c  thodProc(xyplot,
0a10: 62 61 6c 6c 6f 6f 6e 29 20 20 20 20 20 20 20 20  balloon)        
0a20: 44 72 61 77 42 61 6c 6c 6f 6f 6e 0d 0a 20 20 20  DrawBalloon..   
0a30: 73 65 74 20 6d 65 74 68 6f 64 50 72 6f 63 28 78  set methodProc(x
0a40: 79 70 6c 6f 74 2c 62 61 6c 6c 6f 6f 6e 63 6f 6e  yplot,ballooncon
0a50: 66 69 67 29 20 20 43 6f 6e 66 69 67 42 61 6c 6c  fig)  ConfigBall
0a60: 6f 6f 6e 0d 0a 20 20 20 73 65 74 20 6d 65 74 68  oon..   set meth
0a70: 6f 64 50 72 6f 63 28 78 79 70 6c 6f 74 2c 70 6c  odProc(xyplot,pl
0a80: 61 69 6e 74 65 78 74 29 20 20 20 20 20 20 44 72  aintext)      Dr
0a90: 61 77 50 6c 61 69 6e 54 65 78 74 0d 0a 20 20 20  awPlainText..   
0aa0: 73 65 74 20 6d 65 74 68 6f 64 50 72 6f 63 28 70  set methodProc(p
0ab0: 69 65 63 68 61 72 74 2c 74 69 74 6c 65 29 20 20  iechart,title)  
0ac0: 20 20 20 20 20 20 44 72 61 77 54 69 74 6c 65 0d        DrawTitle.
0ad0: 0a 20 20 20 73 65 74 20 6d 65 74 68 6f 64 50 72  .   set methodPr
0ae0: 6f 63 28 70 69 65 63 68 61 72 74 2c 70 6c 6f 74  oc(piechart,plot
0af0: 29 20 20 20 20 20 20 20 20 20 44 72 61 77 50 69  )         DrawPi
0b00: 65 0d 0a 20 20 20 73 65 74 20 6d 65 74 68 6f 64  e..   set method
0b10: 50 72 6f 63 28 70 69 65 63 68 61 72 74 2c 73 61  Proc(piechart,sa
0b20: 76 65 70 6c 6f 74 29 20 20 20 20 20 53 61 76 65  veplot)     Save
0b30: 50 6c 6f 74 0d 0a 20 20 20 73 65 74 20 6d 65 74  Plot..   set met
0b40: 68 6f 64 50 72 6f 63 28 70 69 65 63 68 61 72 74  hodProc(piechart
0b50: 2c 62 61 6c 6c 6f 6f 6e 29 20 20 20 20 20 20 44  ,balloon)      D
0b60: 72 61 77 42 61 6c 6c 6f 6f 6e 0d 0a 20 20 20 73  rawBalloon..   s
0b70: 65 74 20 6d 65 74 68 6f 64 50 72 6f 63 28 70 69  et methodProc(pi
0b80: 65 63 68 61 72 74 2c 62 61 6c 6c 6f 6f 6e 63 6f  echart,balloonco
0b90: 6e 66 69 67 29 20 43 6f 6e 66 69 67 42 61 6c 6c  nfig) ConfigBall
0ba0: 6f 6f 6e 0d 0a 20 20 20 73 65 74 20 6d 65 74 68  oon..   set meth
0bb0: 6f 64 50 72 6f 63 28 70 69 65 63 68 61 72 74 2c  odProc(piechart,
0bc0: 70 6c 61 69 6e 74 65 78 74 29 20 20 20 20 44 72  plaintext)    Dr
0bd0: 61 77 50 6c 61 69 6e 54 65 78 74 0d 0a 20 20 20  awPlainText..   
0be0: 73 65 74 20 6d 65 74 68 6f 64 50 72 6f 63 28 70  set methodProc(p
0bf0: 6f 6c 61 72 70 6c 6f 74 2c 74 69 74 6c 65 29 20  olarplot,title) 
0c00: 20 20 20 20 20 20 44 72 61 77 54 69 74 6c 65 0d        DrawTitle.
0c10: 0a 20 20 20 73 65 74 20 6d 65 74 68 6f 64 50 72  .   set methodPr
0c20: 6f 63 28 70 6f 6c 61 72 70 6c 6f 74 2c 70 6c 6f  oc(polarplot,plo
0c30: 74 29 20 20 20 20 20 20 20 20 44 72 61 77 50 6f  t)        DrawPo
0c40: 6c 61 72 44 61 74 61 0d 0a 20 20 20 73 65 74 20  larData..   set 
0c50: 6d 65 74 68 6f 64 50 72 6f 63 28 70 6f 6c 61 72  methodProc(polar
0c60: 70 6c 6f 74 2c 73 61 76 65 70 6c 6f 74 29 20 20  plot,saveplot)  
0c70: 20 20 53 61 76 65 50 6c 6f 74 0d 0a 20 20 20 73    SavePlot..   s
0c80: 65 74 20 6d 65 74 68 6f 64 50 72 6f 63 28 70 6f  et methodProc(po
0c90: 6c 61 72 70 6c 6f 74 2c 64 61 74 61 63 6f 6e 66  larplot,dataconf
0ca0: 69 67 29 20 20 44 61 74 61 43 6f 6e 66 69 67 0d  ig)  DataConfig.
0cb0: 0a 20 20 20 73 65 74 20 6d 65 74 68 6f 64 50 72  .   set methodPr
0cc0: 6f 63 28 70 6f 6c 61 72 70 6c 6f 74 2c 62 61 63  oc(polarplot,bac
0cd0: 6b 67 72 6f 75 6e 64 29 20 20 42 61 63 6b 67 72  kground)  Backgr
0ce0: 6f 75 6e 64 43 6f 6c 6f 75 72 0d 0a 20 20 20 73  oundColour..   s
0cf0: 65 74 20 6d 65 74 68 6f 64 50 72 6f 63 28 70 6f  et methodProc(po
0d00: 6c 61 72 70 6c 6f 74 2c 6c 65 67 65 6e 64 63 6f  larplot,legendco
0d10: 6e 66 69 67 29 20 4c 65 67 65 6e 64 43 6f 6e 66  nfig) LegendConf
0d20: 69 67 75 72 65 0d 0a 20 20 20 73 65 74 20 6d 65  igure..   set me
0d30: 74 68 6f 64 50 72 6f 63 28 70 6f 6c 61 72 70 6c  thodProc(polarpl
0d40: 6f 74 2c 6c 65 67 65 6e 64 29 20 20 20 20 20 20  ot,legend)      
0d50: 44 72 61 77 4c 65 67 65 6e 64 0d 0a 20 20 20 73  DrawLegend..   s
0d60: 65 74 20 6d 65 74 68 6f 64 50 72 6f 63 28 70 6f  et methodProc(po
0d70: 6c 61 72 70 6c 6f 74 2c 62 61 6c 6c 6f 6f 6e 29  larplot,balloon)
0d80: 20 20 20 20 20 44 72 61 77 42 61 6c 6c 6f 6f 6e       DrawBalloon
0d90: 0d 0a 20 20 20 73 65 74 20 6d 65 74 68 6f 64 50  ..   set methodP
0da0: 72 6f 63 28 70 6f 6c 61 72 70 6c 6f 74 2c 62 61  roc(polarplot,ba
0db0: 6c 6c 6f 6f 6e 63 6f 6e 66 69 67 29 20 43 6f 6e  lloonconfig) Con
0dc0: 66 69 67 42 61 6c 6c 6f 6f 6e 0d 0a 20 20 20 73  figBalloon..   s
0dd0: 65 74 20 6d 65 74 68 6f 64 50 72 6f 63 28 70 6f  et methodProc(po
0de0: 6c 61 72 70 6c 6f 74 2c 70 6c 61 69 6e 74 65 78  larplot,plaintex
0df0: 74 29 20 20 20 44 72 61 77 50 6c 61 69 6e 54 65  t)   DrawPlainTe
0e00: 78 74 0d 0a 20 20 20 73 65 74 20 6d 65 74 68 6f  xt..   set metho
0e10: 64 50 72 6f 63 28 68 69 73 74 6f 67 72 61 6d 2c  dProc(histogram,
0e20: 74 69 74 6c 65 29 20 20 20 20 20 20 20 44 72 61  title)       Dra
0e30: 77 54 69 74 6c 65 0d 0a 20 20 20 73 65 74 20 6d  wTitle..   set m
0e40: 65 74 68 6f 64 50 72 6f 63 28 68 69 73 74 6f 67  ethodProc(histog
0e50: 72 61 6d 2c 78 74 65 78 74 29 20 20 20 20 20 20  ram,xtext)      
0e60: 20 44 72 61 77 58 74 65 78 74 0d 0a 20 20 20 73   DrawXtext..   s
0e70: 65 74 20 6d 65 74 68 6f 64 50 72 6f 63 28 68 69  et methodProc(hi
0e80: 73 74 6f 67 72 61 6d 2c 79 74 65 78 74 29 20 20  stogram,ytext)  
0e90: 20 20 20 20 20 44 72 61 77 59 74 65 78 74 0d 0a       DrawYtext..
0ea0: 20 20 20 73 65 74 20 6d 65 74 68 6f 64 50 72 6f     set methodPro
0eb0: 63 28 68 69 73 74 6f 67 72 61 6d 2c 70 6c 6f 74  c(histogram,plot
0ec0: 29 20 20 20 20 20 20 20 20 44 72 61 77 48 69 73  )        DrawHis
0ed0: 74 6f 67 72 61 6d 44 61 74 61 0d 0a 20 20 20 73  togramData..   s
0ee0: 65 74 20 6d 65 74 68 6f 64 50 72 6f 63 28 68 69  et methodProc(hi
0ef0: 73 74 6f 67 72 61 6d 2c 73 61 76 65 70 6c 6f 74  stogram,saveplot
0f00: 29 20 20 20 20 53 61 76 65 50 6c 6f 74 0d 0a 20  )    SavePlot.. 
0f10: 20 20 73 65 74 20 6d 65 74 68 6f 64 50 72 6f 63    set methodProc
0f20: 28 68 69 73 74 6f 67 72 61 6d 2c 64 61 74 61 63  (histogram,datac
0f30: 6f 6e 66 69 67 29 20 20 44 61 74 61 43 6f 6e 66  onfig)  DataConf
0f40: 69 67 0d 0a 20 20 20 73 65 74 20 6d 65 74 68 6f  ig..   set metho
0f50: 64 50 72 6f 63 28 68 69 73 74 6f 67 72 61 6d 2c  dProc(histogram,
0f60: 78 63 6f 6e 66 69 67 29 20 20 20 20 20 58 43 6f  xconfig)     XCo
0f70: 6e 66 69 67 0d 0a 20 20 20 73 65 74 20 6d 65 74  nfig..   set met
0f80: 68 6f 64 50 72 6f 63 28 68 69 73 74 6f 67 72 61  hodProc(histogra
0f90: 6d 2c 79 63 6f 6e 66 69 67 29 20 20 20 20 20 59  m,yconfig)     Y
0fa0: 43 6f 6e 66 69 67 0d 0a 20 20 20 73 65 74 20 6d  Config..   set m
0fb0: 65 74 68 6f 64 50 72 6f 63 28 68 69 73 74 6f 67  ethodProc(histog
0fc0: 72 61 6d 2c 79 74 69 63 6b 6c 69 6e 65 73 29 20  ram,yticklines) 
0fd0: 20 44 72 61 77 59 54 69 63 6b 6c 69 6e 65 73 0d   DrawYTicklines.
0fe0: 0a 20 20 20 73 65 74 20 6d 65 74 68 6f 64 50 72  .   set methodPr
0ff0: 6f 63 28 68 69 73 74 6f 67 72 61 6d 2c 62 61 63  oc(histogram,bac
1000: 6b 67 72 6f 75 6e 64 29 20 20 42 61 63 6b 67 72  kground)  Backgr
1010: 6f 75 6e 64 43 6f 6c 6f 75 72 0d 0a 20 20 20 73  oundColour..   s
1020: 65 74 20 6d 65 74 68 6f 64 50 72 6f 63 28 68 69  et methodProc(hi
1030: 73 74 6f 67 72 61 6d 2c 6c 65 67 65 6e 64 63 6f  stogram,legendco
1040: 6e 66 69 67 29 20 4c 65 67 65 6e 64 43 6f 6e 66  nfig) LegendConf
1050: 69 67 75 72 65 0d 0a 20 20 20 73 65 74 20 6d 65  igure..   set me
1060: 74 68 6f 64 50 72 6f 63 28 68 69 73 74 6f 67 72  thodProc(histogr
1070: 61 6d 2c 6c 65 67 65 6e 64 29 20 20 20 20 20 20  am,legend)      
1080: 44 72 61 77 4c 65 67 65 6e 64 0d 0a 20 20 20 73  DrawLegend..   s
1090: 65 74 20 6d 65 74 68 6f 64 50 72 6f 63 28 68 69  et methodProc(hi
10a0: 73 74 6f 67 72 61 6d 2c 62 61 6c 6c 6f 6f 6e 29  stogram,balloon)
10b0: 20 20 20 20 20 44 72 61 77 42 61 6c 6c 6f 6f 6e       DrawBalloon
10c0: 0d 0a 20 20 20 73 65 74 20 6d 65 74 68 6f 64 50  ..   set methodP
10d0: 72 6f 63 28 68 69 73 74 6f 67 72 61 6d 2c 62 61  roc(histogram,ba
10e0: 6c 6c 6f 6f 6e 63 6f 6e 66 69 67 29 20 43 6f 6e  lloonconfig) Con
10f0: 66 69 67 42 61 6c 6c 6f 6f 6e 0d 0a 20 20 20 73  figBalloon..   s
1100: 65 74 20 6d 65 74 68 6f 64 50 72 6f 63 28 68 69  et methodProc(hi
1110: 73 74 6f 67 72 61 6d 2c 70 6c 61 69 6e 74 65 78  stogram,plaintex
1120: 74 29 20 20 20 44 72 61 77 50 6c 61 69 6e 54 65  t)   DrawPlainTe
1130: 78 74 0d 0a 20 20 20 73 65 74 20 6d 65 74 68 6f  xt..   set metho
1140: 64 50 72 6f 63 28 68 6f 72 69 7a 62 61 72 73 2c  dProc(horizbars,
1150: 74 69 74 6c 65 29 20 20 20 20 20 20 20 44 72 61  title)       Dra
1160: 77 54 69 74 6c 65 0d 0a 20 20 20 73 65 74 20 6d  wTitle..   set m
1170: 65 74 68 6f 64 50 72 6f 63 28 68 6f 72 69 7a 62  ethodProc(horizb
1180: 61 72 73 2c 78 74 65 78 74 29 20 20 20 20 20 20  ars,xtext)      
1190: 20 44 72 61 77 58 74 65 78 74 0d 0a 20 20 20 73   DrawXtext..   s
11a0: 65 74 20 6d 65 74 68 6f 64 50 72 6f 63 28 68 6f  et methodProc(ho
11b0: 72 69 7a 62 61 72 73 2c 79 74 65 78 74 29 20 20  rizbars,ytext)  
11c0: 20 20 20 20 20 44 72 61 77 59 74 65 78 74 0d 0a       DrawYtext..
11d0: 20 20 20 73 65 74 20 6d 65 74 68 6f 64 50 72 6f     set methodPro
11e0: 63 28 68 6f 72 69 7a 62 61 72 73 2c 70 6c 6f 74  c(horizbars,plot
11f0: 29 20 20 20 20 20 20 20 20 44 72 61 77 48 6f 72  )        DrawHor
1200: 69 7a 42 61 72 44 61 74 61 0d 0a 20 20 20 73 65  izBarData..   se
1210: 74 20 6d 65 74 68 6f 64 50 72 6f 63 28 68 6f 72  t methodProc(hor
1220: 69 7a 62 61 72 73 2c 78 74 69 63 6b 6c 69 6e 65  izbars,xtickline
1230: 73 29 20 20 44 72 61 77 58 54 69 63 6b 6c 69 6e  s)  DrawXTicklin
1240: 65 73 0d 0a 20 20 20 73 65 74 20 6d 65 74 68 6f  es..   set metho
1250: 64 50 72 6f 63 28 68 6f 72 69 7a 62 61 72 73 2c  dProc(horizbars,
1260: 62 61 63 6b 67 72 6f 75 6e 64 29 20 20 42 61 63  background)  Bac
1270: 6b 67 72 6f 75 6e 64 43 6f 6c 6f 75 72 0d 0a 20  kgroundColour.. 
1280: 20 20 73 65 74 20 6d 65 74 68 6f 64 50 72 6f 63    set methodProc
1290: 28 68 6f 72 69 7a 62 61 72 73 2c 73 61 76 65 70  (horizbars,savep
12a0: 6c 6f 74 29 20 20 20 20 53 61 76 65 50 6c 6f 74  lot)    SavePlot
12b0: 0d 0a 20 20 20 73 65 74 20 6d 65 74 68 6f 64 50  ..   set methodP
12c0: 72 6f 63 28 68 6f 72 69 7a 62 61 72 73 2c 63 6f  roc(horizbars,co
12d0: 6c 6f 75 72 73 29 20 20 20 20 20 53 65 74 43 6f  lours)     SetCo
12e0: 6c 6f 75 72 73 0d 0a 20 20 20 73 65 74 20 6d 65  lours..   set me
12f0: 74 68 6f 64 50 72 6f 63 28 68 6f 72 69 7a 62 61  thodProc(horizba
1300: 72 73 2c 63 6f 6c 6f 72 73 29 20 20 20 20 20 20  rs,colors)      
1310: 53 65 74 43 6f 6c 6f 75 72 73 0d 0a 20 20 20 73  SetColours..   s
1320: 65 74 20 6d 65 74 68 6f 64 50 72 6f 63 28 68 6f  et methodProc(ho
1330: 72 69 7a 62 61 72 73 2c 78 63 6f 6e 66 69 67 29  rizbars,xconfig)
1340: 20 20 20 20 20 58 43 6f 6e 66 69 67 0d 0a 20 20       XConfig..  
1350: 20 73 65 74 20 6d 65 74 68 6f 64 50 72 6f 63 28   set methodProc(
1360: 68 6f 72 69 7a 62 61 72 73 2c 6c 65 67 65 6e 64  horizbars,legend
1370: 63 6f 6e 66 69 67 29 20 4c 65 67 65 6e 64 43 6f  config) LegendCo
1380: 6e 66 69 67 75 72 65 0d 0a 20 20 20 73 65 74 20  nfigure..   set 
1390: 6d 65 74 68 6f 64 50 72 6f 63 28 68 6f 72 69 7a  methodProc(horiz
13a0: 62 61 72 73 2c 6c 65 67 65 6e 64 29 20 20 20 20  bars,legend)    
13b0: 20 20 44 72 61 77 4c 65 67 65 6e 64 0d 0a 20 20    DrawLegend..  
13c0: 20 73 65 74 20 6d 65 74 68 6f 64 50 72 6f 63 28   set methodProc(
13d0: 68 6f 72 69 7a 62 61 72 73 2c 62 61 6c 6c 6f 6f  horizbars,balloo
13e0: 6e 29 20 20 20 20 20 44 72 61 77 42 61 6c 6c 6f  n)     DrawBallo
13f0: 6f 6e 0d 0a 20 20 20 73 65 74 20 6d 65 74 68 6f  on..   set metho
1400: 64 50 72 6f 63 28 68 6f 72 69 7a 62 61 72 73 2c  dProc(horizbars,
1410: 62 61 6c 6c 6f 6f 6e 63 6f 6e 66 69 67 29 20 43  balloonconfig) C
1420: 6f 6e 66 69 67 42 61 6c 6c 6f 6f 6e 0d 0a 20 20  onfigBalloon..  
1430: 20 73 65 74 20 6d 65 74 68 6f 64 50 72 6f 63 28   set methodProc(
1440: 68 6f 72 69 7a 62 61 72 73 2c 70 6c 61 69 6e 74  horizbars,plaint
1450: 65 78 74 29 20 20 20 44 72 61 77 50 6c 61 69 6e  ext)   DrawPlain
1460: 54 65 78 74 0d 0a 20 20 20 73 65 74 20 6d 65 74  Text..   set met
1470: 68 6f 64 50 72 6f 63 28 76 65 72 74 62 61 72 73  hodProc(vertbars
1480: 2c 74 69 74 6c 65 29 20 20 20 20 20 20 20 20 44  ,title)        D
1490: 72 61 77 54 69 74 6c 65 0d 0a 20 20 20 73 65 74  rawTitle..   set
14a0: 20 6d 65 74 68 6f 64 50 72 6f 63 28 76 65 72 74   methodProc(vert
14b0: 62 61 72 73 2c 78 74 65 78 74 29 20 20 20 20 20  bars,xtext)     
14c0: 20 20 20 44 72 61 77 58 74 65 78 74 0d 0a 20 20     DrawXtext..  
14d0: 20 73 65 74 20 6d 65 74 68 6f 64 50 72 6f 63 28   set methodProc(
14e0: 76 65 72 74 62 61 72 73 2c 79 74 65 78 74 29 20  vertbars,ytext) 
14f0: 20 20 20 20 20 20 20 44 72 61 77 59 74 65 78 74         DrawYtext
1500: 0d 0a 20 20 20 73 65 74 20 6d 65 74 68 6f 64 50  ..   set methodP
1510: 72 6f 63 28 76 65 72 74 62 61 72 73 2c 70 6c 6f  roc(vertbars,plo
1520: 74 29 20 20 20 20 20 20 20 20 20 44 72 61 77 56  t)         DrawV
1530: 65 72 74 42 61 72 44 61 74 61 0d 0a 20 20 20 73  ertBarData..   s
1540: 65 74 20 6d 65 74 68 6f 64 50 72 6f 63 28 76 65  et methodProc(ve
1550: 72 74 62 61 72 73 2c 62 61 63 6b 67 72 6f 75 6e  rtbars,backgroun
1560: 64 29 20 20 20 42 61 63 6b 67 72 6f 75 6e 64 43  d)   BackgroundC
1570: 6f 6c 6f 75 72 0d 0a 20 20 20 73 65 74 20 6d 65  olour..   set me
1580: 74 68 6f 64 50 72 6f 63 28 76 65 72 74 62 61 72  thodProc(vertbar
1590: 73 2c 79 74 69 63 6b 6c 69 6e 65 73 29 20 20 20  s,yticklines)   
15a0: 44 72 61 77 59 54 69 63 6b 6c 69 6e 65 73 0d 0a  DrawYTicklines..
15b0: 20 20 20 73 65 74 20 6d 65 74 68 6f 64 50 72 6f     set methodPro
15c0: 63 28 76 65 72 74 62 61 72 73 2c 73 61 76 65 70  c(vertbars,savep
15d0: 6c 6f 74 29 20 20 20 20 20 53 61 76 65 50 6c 6f  lot)     SavePlo
15e0: 74 0d 0a 20 20 20 73 65 74 20 6d 65 74 68 6f 64  t..   set method
15f0: 50 72 6f 63 28 76 65 72 74 62 61 72 73 2c 63 6f  Proc(vertbars,co
1600: 6c 6f 75 72 73 29 20 20 20 20 20 20 53 65 74 43  lours)      SetC
1610: 6f 6c 6f 75 72 73 0d 0a 20 20 20 73 65 74 20 6d  olours..   set m
1620: 65 74 68 6f 64 50 72 6f 63 28 76 65 72 74 62 61  ethodProc(vertba
1630: 72 73 2c 63 6f 6c 6f 72 73 29 20 20 20 20 20 20  rs,colors)      
1640: 20 53 65 74 43 6f 6c 6f 75 72 73 0d 0a 20 20 20   SetColours..   
1650: 73 65 74 20 6d 65 74 68 6f 64 50 72 6f 63 28 76  set methodProc(v
1660: 65 72 74 62 61 72 73 2c 79 63 6f 6e 66 69 67 29  ertbars,yconfig)
1670: 20 20 20 20 20 20 59 43 6f 6e 66 69 67 0d 0a 20        YConfig.. 
1680: 20 20 73 65 74 20 6d 65 74 68 6f 64 50 72 6f 63    set methodProc
1690: 28 76 65 72 74 62 61 72 73 2c 6c 65 67 65 6e 64  (vertbars,legend
16a0: 63 6f 6e 66 69 67 29 20 4c 65 67 65 6e 64 43 6f  config) LegendCo
16b0: 6e 66 69 67 75 72 65 0d 0a 20 20 20 73 65 74 20  nfigure..   set 
16c0: 6d 65 74 68 6f 64 50 72 6f 63 28 76 65 72 74 62  methodProc(vertb
16d0: 61 72 73 2c 6c 65 67 65 6e 64 29 20 20 20 20 20  ars,legend)     
16e0: 20 20 44 72 61 77 4c 65 67 65 6e 64 0d 0a 20 20    DrawLegend..  
16f0: 20 73 65 74 20 6d 65 74 68 6f 64 50 72 6f 63 28   set methodProc(
1700: 76 65 72 74 62 61 72 73 2c 62 61 6c 6c 6f 6f 6e  vertbars,balloon
1710: 29 20 20 20 20 20 20 44 72 61 77 42 61 6c 6c 6f  )      DrawBallo
1720: 6f 6e 0d 0a 20 20 20 73 65 74 20 6d 65 74 68 6f  on..   set metho
1730: 64 50 72 6f 63 28 76 65 72 74 62 61 72 73 2c 62  dProc(vertbars,b
1740: 61 6c 6c 6f 6f 6e 63 6f 6e 66 69 67 29 20 43 6f  alloonconfig) Co
1750: 6e 66 69 67 42 61 6c 6c 6f 6f 6e 0d 0a 20 20 20  nfigBalloon..   
1760: 73 65 74 20 6d 65 74 68 6f 64 50 72 6f 63 28 76  set methodProc(v
1770: 65 72 74 62 61 72 73 2c 70 6c 61 69 6e 74 65 78  ertbars,plaintex
1780: 74 29 20 20 20 20 44 72 61 77 50 6c 61 69 6e 54  t)    DrawPlainT
1790: 65 78 74 0d 0a 20 20 20 73 65 74 20 6d 65 74 68  ext..   set meth
17a0: 6f 64 50 72 6f 63 28 74 69 6d 65 63 68 61 72 74  odProc(timechart
17b0: 2c 74 69 74 6c 65 29 20 20 20 20 20 20 20 44 72  ,title)       Dr
17c0: 61 77 54 69 74 6c 65 0d 0a 20 20 20 73 65 74 20  awTitle..   set 
17d0: 6d 65 74 68 6f 64 50 72 6f 63 28 74 69 6d 65 63  methodProc(timec
17e0: 68 61 72 74 2c 70 65 72 69 6f 64 29 20 20 20 20  hart,period)    
17f0: 20 20 44 72 61 77 54 69 6d 65 50 65 72 69 6f 64    DrawTimePeriod
1800: 0d 0a 20 20 20 73 65 74 20 6d 65 74 68 6f 64 50  ..   set methodP
1810: 72 6f 63 28 74 69 6d 65 63 68 61 72 74 2c 6d 69  roc(timechart,mi
1820: 6c 65 73 74 6f 6e 65 29 20 20 20 44 72 61 77 54  lestone)   DrawT
1830: 69 6d 65 4d 69 6c 65 73 74 6f 6e 65 0d 0a 20 20  imeMilestone..  
1840: 20 73 65 74 20 6d 65 74 68 6f 64 50 72 6f 63 28   set methodProc(
1850: 74 69 6d 65 63 68 61 72 74 2c 76 65 72 74 6c 69  timechart,vertli
1860: 6e 65 29 20 20 20 20 44 72 61 77 54 69 6d 65 56  ne)    DrawTimeV
1870: 65 72 74 4c 69 6e 65 0d 0a 20 20 20 73 65 74 20  ertLine..   set 
1880: 6d 65 74 68 6f 64 50 72 6f 63 28 74 69 6d 65 63  methodProc(timec
1890: 68 61 72 74 2c 73 61 76 65 70 6c 6f 74 29 20 20  hart,saveplot)  
18a0: 20 20 53 61 76 65 50 6c 6f 74 0d 0a 20 20 20 73    SavePlot..   s
18b0: 65 74 20 6d 65 74 68 6f 64 50 72 6f 63 28 74 69  et methodProc(ti
18c0: 6d 65 63 68 61 72 74 2c 62 61 63 6b 67 72 6f 75  mechart,backgrou
18d0: 6e 64 29 20 20 42 61 63 6b 67 72 6f 75 6e 64 43  nd)  BackgroundC
18e0: 6f 6c 6f 75 72 0d 0a 20 20 20 73 65 74 20 6d 65  olour..   set me
18f0: 74 68 6f 64 50 72 6f 63 28 74 69 6d 65 63 68 61  thodProc(timecha
1900: 72 74 2c 62 61 6c 6c 6f 6f 6e 29 20 20 20 20 20  rt,balloon)     
1910: 44 72 61 77 42 61 6c 6c 6f 6f 6e 0d 0a 20 20 20  DrawBalloon..   
1920: 73 65 74 20 6d 65 74 68 6f 64 50 72 6f 63 28 74  set methodProc(t
1930: 69 6d 65 63 68 61 72 74 2c 62 61 6c 6c 6f 6f 6e  imechart,balloon
1940: 63 6f 6e 66 69 67 29 20 43 6f 6e 66 69 67 42 61  config) ConfigBa
1950: 6c 6c 6f 6f 6e 0d 0a 20 20 20 73 65 74 20 6d 65  lloon..   set me
1960: 74 68 6f 64 50 72 6f 63 28 74 69 6d 65 63 68 61  thodProc(timecha
1970: 72 74 2c 70 6c 61 69 6e 74 65 78 74 29 20 20 20  rt,plaintext)   
1980: 44 72 61 77 50 6c 61 69 6e 54 65 78 74 0d 0a 20  DrawPlainText.. 
1990: 20 20 73 65 74 20 6d 65 74 68 6f 64 50 72 6f 63    set methodProc
19a0: 28 67 61 6e 74 74 63 68 61 72 74 2c 74 69 74 6c  (ganttchart,titl
19b0: 65 29 20 20 20 20 20 20 44 72 61 77 54 69 74 6c  e)      DrawTitl
19c0: 65 0d 0a 20 20 20 73 65 74 20 6d 65 74 68 6f 64  e..   set method
19d0: 50 72 6f 63 28 67 61 6e 74 74 63 68 61 72 74 2c  Proc(ganttchart,
19e0: 70 65 72 69 6f 64 29 20 20 20 20 20 44 72 61 77  period)     Draw
19f0: 47 61 6e 74 74 50 65 72 69 6f 64 0d 0a 20 20 20  GanttPeriod..   
1a00: 73 65 74 20 6d 65 74 68 6f 64 50 72 6f 63 28 67  set methodProc(g
1a10: 61 6e 74 74 63 68 61 72 74 2c 74 61 73 6b 29 20  anttchart,task) 
1a20: 20 20 20 20 20 20 44 72 61 77 47 61 6e 74 74 50        DrawGanttP
1a30: 65 72 69 6f 64 0d 0a 20 20 20 73 65 74 20 6d 65  eriod..   set me
1a40: 74 68 6f 64 50 72 6f 63 28 67 61 6e 74 74 63 68  thodProc(ganttch
1a50: 61 72 74 2c 6d 69 6c 65 73 74 6f 6e 65 29 20 20  art,milestone)  
1a60: 44 72 61 77 47 61 6e 74 74 4d 69 6c 65 73 74 6f  DrawGanttMilesto
1a70: 6e 65 0d 0a 20 20 20 73 65 74 20 6d 65 74 68 6f  ne..   set metho
1a80: 64 50 72 6f 63 28 67 61 6e 74 74 63 68 61 72 74  dProc(ganttchart
1a90: 2c 76 65 72 74 6c 69 6e 65 29 20 20 20 44 72 61  ,vertline)   Dra
1aa0: 77 47 61 6e 74 74 56 65 72 74 4c 69 6e 65 0d 0a  wGanttVertLine..
1ab0: 20 20 20 73 65 74 20 6d 65 74 68 6f 64 50 72 6f     set methodPro
1ac0: 63 28 67 61 6e 74 74 63 68 61 72 74 2c 73 61 76  c(ganttchart,sav
1ad0: 65 70 6c 6f 74 29 20 20 20 53 61 76 65 50 6c 6f  eplot)   SavePlo
1ae0: 74 0d 0a 20 20 20 73 65 74 20 6d 65 74 68 6f 64  t..   set method
1af0: 50 72 6f 63 28 67 61 6e 74 74 63 68 61 72 74 2c  Proc(ganttchart,
1b00: 63 6f 6c 6f 72 29 20 20 20 20 20 20 47 61 6e 74  color)      Gant
1b10: 74 43 6f 6c 6f 72 0d 0a 20 20 20 73 65 74 20 6d  tColor..   set m
1b20: 65 74 68 6f 64 50 72 6f 63 28 67 61 6e 74 74 63  ethodProc(ganttc
1b30: 68 61 72 74 2c 63 6f 6c 6f 75 72 29 20 20 20 20  hart,colour)    
1b40: 20 47 61 6e 74 74 43 6f 6c 6f 72 0d 0a 20 20 20   GanttColor..   
1b50: 73 65 74 20 6d 65 74 68 6f 64 50 72 6f 63 28 67  set methodProc(g
1b60: 61 6e 74 74 63 68 61 72 74 2c 66 6f 6e 74 29 20  anttchart,font) 
1b70: 20 20 20 20 20 20 47 61 6e 74 74 46 6f 6e 74 0d        GanttFont.
1b80: 0a 20 20 20 73 65 74 20 6d 65 74 68 6f 64 50 72  .   set methodPr
1b90: 6f 63 28 67 61 6e 74 74 63 68 61 72 74 2c 63 6f  oc(ganttchart,co
1ba0: 6e 6e 65 63 74 29 20 20 20 20 44 72 61 77 47 61  nnect)    DrawGa
1bb0: 6e 74 74 43 6f 6e 6e 65 63 74 0d 0a 20 20 20 73  nttConnect..   s
1bc0: 65 74 20 6d 65 74 68 6f 64 50 72 6f 63 28 67 61  et methodProc(ga
1bd0: 6e 74 74 63 68 61 72 74 2c 73 75 6d 6d 61 72 79  nttchart,summary
1be0: 29 20 20 20 20 44 72 61 77 47 61 6e 74 74 53 75  )    DrawGanttSu
1bf0: 6d 6d 61 72 79 0d 0a 20 20 20 73 65 74 20 6d 65  mmary..   set me
1c00: 74 68 6f 64 50 72 6f 63 28 67 61 6e 74 74 63 68  thodProc(ganttch
1c10: 61 72 74 2c 62 61 63 6b 67 72 6f 75 6e 64 29 20  art,background) 
1c20: 42 61 63 6b 67 72 6f 75 6e 64 43 6f 6c 6f 75 72  BackgroundColour
1c30: 0d 0a 20 20 20 73 65 74 20 6d 65 74 68 6f 64 50  ..   set methodP
1c40: 72 6f 63 28 67 61 6e 74 74 63 68 61 72 74 2c 62  roc(ganttchart,b
1c50: 61 6c 6c 6f 6f 6e 29 20 20 20 20 20 44 72 61 77  alloon)     Draw
1c60: 42 61 6c 6c 6f 6f 6e 0d 0a 20 20 20 73 65 74 20  Balloon..   set 
1c70: 6d 65 74 68 6f 64 50 72 6f 63 28 67 61 6e 74 74  methodProc(gantt
1c80: 63 68 61 72 74 2c 62 61 6c 6c 6f 6f 6e 63 6f 6e  chart,ballooncon
1c90: 66 69 67 29 20 43 6f 6e 66 69 67 42 61 6c 6c 6f  fig) ConfigBallo
1ca0: 6f 6e 0d 0a 20 20 20 73 65 74 20 6d 65 74 68 6f  on..   set metho
1cb0: 64 50 72 6f 63 28 67 61 6e 74 74 63 68 61 72 74  dProc(ganttchart
1cc0: 2c 70 6c 61 69 6e 74 65 78 74 29 20 20 44 72 61  ,plaintext)  Dra
1cd0: 77 50 6c 61 69 6e 54 65 78 74 0d 0a 20 20 20 73  wPlainText..   s
1ce0: 65 74 20 6d 65 74 68 6f 64 50 72 6f 63 28 73 74  et methodProc(st
1cf0: 72 69 70 63 68 61 72 74 2c 74 69 74 6c 65 29 20  ripchart,title) 
1d00: 20 20 20 20 20 44 72 61 77 54 69 74 6c 65 0d 0a       DrawTitle..
1d10: 20 20 20 73 65 74 20 6d 65 74 68 6f 64 50 72 6f     set methodPro
1d20: 63 28 73 74 72 69 70 63 68 61 72 74 2c 78 74 65  c(stripchart,xte
1d30: 78 74 29 20 20 20 20 20 20 44 72 61 77 58 74 65  xt)      DrawXte
1d40: 78 74 0d 0a 20 20 20 73 65 74 20 6d 65 74 68 6f  xt..   set metho
1d50: 64 50 72 6f 63 28 73 74 72 69 70 63 68 61 72 74  dProc(stripchart
1d60: 2c 79 74 65 78 74 29 20 20 20 20 20 20 44 72 61  ,ytext)      Dra
1d70: 77 59 74 65 78 74 0d 0a 20 20 20 73 65 74 20 6d  wYtext..   set m
1d80: 65 74 68 6f 64 50 72 6f 63 28 73 74 72 69 70 63  ethodProc(stripc
1d90: 68 61 72 74 2c 70 6c 6f 74 29 20 20 20 20 20 20  hart,plot)      
1da0: 20 44 72 61 77 53 74 72 69 70 44 61 74 61 0d 0a   DrawStripData..
1db0: 20 20 20 73 65 74 20 6d 65 74 68 6f 64 50 72 6f     set methodPro
1dc0: 63 28 73 74 72 69 70 63 68 61 72 74 2c 73 61 76  c(stripchart,sav
1dd0: 65 70 6c 6f 74 29 20 20 20 53 61 76 65 50 6c 6f  eplot)   SavePlo
1de0: 74 0d 0a 20 20 20 73 65 74 20 6d 65 74 68 6f 64  t..   set method
1df0: 50 72 6f 63 28 73 74 72 69 70 63 68 61 72 74 2c  Proc(stripchart,
1e00: 64 61 74 61 63 6f 6e 66 69 67 29 20 44 61 74 61  dataconfig) Data
1e10: 43 6f 6e 66 69 67 0d 0a 20 20 20 73 65 74 20 6d  Config..   set m
1e20: 65 74 68 6f 64 50 72 6f 63 28 73 74 72 69 70 63  ethodProc(stripc
1e30: 68 61 72 74 2c 78 63 6f 6e 66 69 67 29 20 20 20  hart,xconfig)   
1e40: 20 58 43 6f 6e 66 69 67 0d 0a 20 20 20 73 65 74   XConfig..   set
1e50: 20 6d 65 74 68 6f 64 50 72 6f 63 28 73 74 72 69   methodProc(stri
1e60: 70 63 68 61 72 74 2c 79 63 6f 6e 66 69 67 29 20  pchart,yconfig) 
1e70: 20 20 20 59 43 6f 6e 66 69 67 0d 0a 20 20 20 73     YConfig..   s
1e80: 65 74 20 6d 65 74 68 6f 64 50 72 6f 63 28 73 74  et methodProc(st
1e90: 72 69 70 63 68 61 72 74 2c 79 74 69 63 6b 6c 69  ripchart,ytickli
1ea0: 6e 65 73 29 20 44 72 61 77 59 54 69 63 6b 6c 69  nes) DrawYTickli
1eb0: 6e 65 73 0d 0a 20 20 20 73 65 74 20 6d 65 74 68  nes..   set meth
1ec0: 6f 64 50 72 6f 63 28 73 74 72 69 70 63 68 61 72  odProc(stripchar
1ed0: 74 2c 62 61 63 6b 67 72 6f 75 6e 64 29 20 42 61  t,background) Ba
1ee0: 63 6b 67 72 6f 75 6e 64 43 6f 6c 6f 75 72 0d 0a  ckgroundColour..
1ef0: 20 20 20 73 65 74 20 6d 65 74 68 6f 64 50 72 6f     set methodPro
1f00: 63 28 73 74 72 69 70 63 68 61 72 74 2c 6c 65 67  c(stripchart,leg
1f10: 65 6e 64 63 6f 6e 66 69 67 29 20 4c 65 67 65 6e  endconfig) Legen
1f20: 64 43 6f 6e 66 69 67 75 72 65 0d 0a 20 20 20 73  dConfigure..   s
1f30: 65 74 20 6d 65 74 68 6f 64 50 72 6f 63 28 73 74  et methodProc(st
1f40: 72 69 70 63 68 61 72 74 2c 6c 65 67 65 6e 64 29  ripchart,legend)
1f50: 20 20 20 20 20 44 72 61 77 4c 65 67 65 6e 64 0d       DrawLegend.
1f60: 0a 20 20 20 73 65 74 20 6d 65 74 68 6f 64 50 72  .   set methodPr
1f70: 6f 63 28 73 74 72 69 70 63 68 61 72 74 2c 62 61  oc(stripchart,ba
1f80: 6c 6c 6f 6f 6e 29 20 20 20 20 44 72 61 77 42 61  lloon)    DrawBa
1f90: 6c 6c 6f 6f 6e 0d 0a 20 20 20 73 65 74 20 6d 65  lloon..   set me
1fa0: 74 68 6f 64 50 72 6f 63 28 73 74 72 69 70 63 68  thodProc(stripch
1fb0: 61 72 74 2c 62 61 6c 6c 6f 6f 6e 63 6f 6e 66 69  art,balloonconfi
1fc0: 67 29 20 43 6f 6e 66 69 67 42 61 6c 6c 6f 6f 6e  g) ConfigBalloon
1fd0: 0d 0a 20 20 20 73 65 74 20 6d 65 74 68 6f 64 50  ..   set methodP
1fe0: 72 6f 63 28 73 74 72 69 70 63 68 61 72 74 2c 70  roc(stripchart,p
1ff0: 6c 61 69 6e 74 65 78 74 29 20 20 44 72 61 77 50  laintext)  DrawP
2000: 6c 61 69 6e 54 65 78 74 0d 0a 20 20 20 73 65 74  lainText..   set
2010: 20 6d 65 74 68 6f 64 50 72 6f 63 28 69 73 6f 6d   methodProc(isom
2020: 65 74 72 69 63 2c 74 69 74 6c 65 29 20 20 20 20  etric,title)    
2030: 20 20 20 44 72 61 77 54 69 74 6c 65 0d 0a 20 20     DrawTitle..  
2040: 20 73 65 74 20 6d 65 74 68 6f 64 50 72 6f 63 28   set methodProc(
2050: 69 73 6f 6d 65 74 72 69 63 2c 78 74 65 78 74 29  isometric,xtext)
2060: 20 20 20 20 20 20 20 44 72 61 77 58 74 65 78 74         DrawXtext
2070: 0d 0a 20 20 20 73 65 74 20 6d 65 74 68 6f 64 50  ..   set methodP
2080: 72 6f 63 28 69 73 6f 6d 65 74 72 69 63 2c 79 74  roc(isometric,yt
2090: 65 78 74 29 20 20 20 20 20 20 20 44 72 61 77 59  ext)       DrawY
20a0: 74 65 78 74 0d 0a 20 20 20 73 65 74 20 6d 65 74  text..   set met
20b0: 68 6f 64 50 72 6f 63 28 69 73 6f 6d 65 74 72 69  hodProc(isometri
20c0: 63 2c 70 6c 6f 74 29 20 20 20 20 20 20 20 20 44  c,plot)        D
20d0: 72 61 77 49 73 6f 6d 65 74 72 69 63 44 61 74 61  rawIsometricData
20e0: 0d 0a 20 20 20 73 65 74 20 6d 65 74 68 6f 64 50  ..   set methodP
20f0: 72 6f 63 28 69 73 6f 6d 65 74 72 69 63 2c 73 61  roc(isometric,sa
2100: 76 65 70 6c 6f 74 29 20 20 20 20 53 61 76 65 50  veplot)    SaveP
2110: 6c 6f 74 0d 0a 20 20 20 73 65 74 20 6d 65 74 68  lot..   set meth
2120: 6f 64 50 72 6f 63 28 69 73 6f 6d 65 74 72 69 63  odProc(isometric
2130: 2c 62 61 63 6b 67 72 6f 75 6e 64 29 20 20 42 61  ,background)  Ba
2140: 63 6b 67 72 6f 75 6e 64 43 6f 6c 6f 75 72 0d 0a  ckgroundColour..
2150: 20 20 20 73 65 74 20 6d 65 74 68 6f 64 50 72 6f     set methodPro
2160: 63 28 69 73 6f 6d 65 74 72 69 63 2c 62 61 6c 6c  c(isometric,ball
2170: 6f 6f 6e 29 20 20 20 20 20 44 72 61 77 42 61 6c  oon)     DrawBal
2180: 6c 6f 6f 6e 0d 0a 20 20 20 73 65 74 20 6d 65 74  loon..   set met
2190: 68 6f 64 50 72 6f 63 28 69 73 6f 6d 65 74 72 69  hodProc(isometri
21a0: 63 2c 62 61 6c 6c 6f 6f 6e 63 6f 6e 66 69 67 29  c,balloonconfig)
21b0: 20 43 6f 6e 66 69 67 42 61 6c 6c 6f 6f 6e 0d 0a   ConfigBalloon..
21c0: 20 20 20 73 65 74 20 6d 65 74 68 6f 64 50 72 6f     set methodPro
21d0: 63 28 69 73 6f 6d 65 74 72 69 63 2c 70 6c 61 69  c(isometric,plai
21e0: 6e 74 65 78 74 29 20 20 20 44 72 61 77 50 6c 61  ntext)   DrawPla
21f0: 69 6e 54 65 78 74 0d 0a 20 20 20 73 65 74 20 6d  inText..   set m
2200: 65 74 68 6f 64 50 72 6f 63 28 33 64 70 6c 6f 74  ethodProc(3dplot
2210: 2c 74 69 74 6c 65 29 20 20 20 20 20 20 20 20 20  ,title)         
2220: 20 44 72 61 77 54 69 74 6c 65 0d 0a 20 20 20 73   DrawTitle..   s
2230: 65 74 20 6d 65 74 68 6f 64 50 72 6f 63 28 33 64  et methodProc(3d
2240: 70 6c 6f 74 2c 70 6c 6f 74 66 75 6e 63 29 20 20  plot,plotfunc)  
2250: 20 20 20 20 20 44 72 61 77 33 44 46 75 6e 63 74       Draw3DFunct
2260: 69 6f 6e 0d 0a 20 20 20 73 65 74 20 6d 65 74 68  ion..   set meth
2270: 6f 64 50 72 6f 63 28 33 64 70 6c 6f 74 2c 70 6c  odProc(3dplot,pl
2280: 6f 74 64 61 74 61 29 20 20 20 20 20 20 20 44 72  otdata)       Dr
2290: 61 77 33 44 44 61 74 61 0d 0a 20 20 20 73 65 74  aw3DData..   set
22a0: 20 6d 65 74 68 6f 64 50 72 6f 63 28 33 64 70 6c   methodProc(3dpl
22b0: 6f 74 2c 70 6c 6f 74 6c 69 6e 65 29 20 20 20 20  ot,plotline)    
22c0: 20 20 20 44 72 61 77 33 44 4c 69 6e 65 46 72 6f     Draw3DLineFro
22d0: 6d 33 44 63 6f 6f 72 64 69 6e 61 74 65 73 0d 0a  m3Dcoordinates..
22e0: 20 20 20 73 65 74 20 6d 65 74 68 6f 64 50 72 6f     set methodPro
22f0: 63 28 33 64 70 6c 6f 74 2c 67 72 69 64 73 69 7a  c(3dplot,gridsiz
2300: 65 29 20 20 20 20 20 20 20 47 72 69 64 53 69 7a  e)       GridSiz
2310: 65 33 44 0d 0a 20 20 20 73 65 74 20 6d 65 74 68  e3D..   set meth
2320: 6f 64 50 72 6f 63 28 33 64 70 6c 6f 74 2c 73 61  odProc(3dplot,sa
2330: 76 65 70 6c 6f 74 29 20 20 20 20 20 20 20 53 61  veplot)       Sa
2340: 76 65 50 6c 6f 74 0d 0a 20 20 20 73 65 74 20 6d  vePlot..   set m
2350: 65 74 68 6f 64 50 72 6f 63 28 33 64 70 6c 6f 74  ethodProc(3dplot
2360: 2c 63 6f 6c 6f 75 72 29 20 20 20 20 20 20 20 20  ,colour)        
2370: 20 53 65 74 43 6f 6c 6f 75 72 73 0d 0a 20 20 20   SetColours..   
2380: 73 65 74 20 6d 65 74 68 6f 64 50 72 6f 63 28 33  set methodProc(3
2390: 64 70 6c 6f 74 2c 63 6f 6c 6f 72 29 20 20 20 20  dplot,color)    
23a0: 20 20 20 20 20 20 53 65 74 43 6f 6c 6f 75 72 73        SetColours
23b0: 0d 0a 20 20 20 73 65 74 20 6d 65 74 68 6f 64 50  ..   set methodP
23c0: 72 6f 63 28 33 64 70 6c 6f 74 2c 78 63 6f 6e 66  roc(3dplot,xconf
23d0: 69 67 29 20 20 20 20 20 20 20 20 58 43 6f 6e 66  ig)        XConf
23e0: 69 67 0d 0a 20 20 20 73 65 74 20 6d 65 74 68 6f  ig..   set metho
23f0: 64 50 72 6f 63 28 33 64 70 6c 6f 74 2c 79 63 6f  dProc(3dplot,yco
2400: 6e 66 69 67 29 20 20 20 20 20 20 20 20 59 43 6f  nfig)        YCo
2410: 6e 66 69 67 0d 0a 20 20 20 73 65 74 20 6d 65 74  nfig..   set met
2420: 68 6f 64 50 72 6f 63 28 33 64 70 6c 6f 74 2c 7a  hodProc(3dplot,z
2430: 63 6f 6e 66 69 67 29 20 20 20 20 20 20 20 20 5a  config)        Z
2440: 43 6f 6e 66 69 67 0d 0a 20 20 20 73 65 74 20 6d  Config..   set m
2450: 65 74 68 6f 64 50 72 6f 63 28 33 64 70 6c 6f 74  ethodProc(3dplot
2460: 2c 70 6c 6f 74 66 75 6e 63 6f 6e 74 29 20 20 20  ,plotfuncont)   
2470: 20 44 72 61 77 33 44 46 75 6e 63 74 69 6f 6e 43   Draw3DFunctionC
2480: 6f 6e 74 6f 75 72 0d 0a 20 20 20 73 65 74 20 6d  ontour..   set m
2490: 65 74 68 6f 64 50 72 6f 63 28 33 64 70 6c 6f 74  ethodProc(3dplot
24a0: 2c 62 61 63 6b 67 72 6f 75 6e 64 29 20 20 20 20  ,background)    
24b0: 20 42 61 63 6b 67 72 6f 75 6e 64 43 6f 6c 6f 75   BackgroundColou
24c0: 72 0d 0a 20 20 20 73 65 74 20 6d 65 74 68 6f 64  r..   set method
24d0: 50 72 6f 63 28 33 64 62 61 72 73 2c 74 69 74 6c  Proc(3dbars,titl
24e0: 65 29 20 20 20 20 20 20 20 20 20 20 44 72 61 77  e)          Draw
24f0: 54 69 74 6c 65 0d 0a 20 20 20 73 65 74 20 6d 65  Title..   set me
2500: 74 68 6f 64 50 72 6f 63 28 33 64 62 61 72 73 2c  thodProc(3dbars,
2510: 70 6c 6f 74 29 20 20 20 20 20 20 20 20 20 20 20  plot)           
2520: 44 72 61 77 33 44 42 61 72 0d 0a 20 20 20 73 65  Draw3DBar..   se
2530: 74 20 6d 65 74 68 6f 64 50 72 6f 63 28 33 64 62  t methodProc(3db
2540: 61 72 73 2c 79 63 6f 6e 66 69 67 29 20 20 20 20  ars,yconfig)    
2550: 20 20 20 20 59 43 6f 6e 66 69 67 0d 0a 20 20 20      YConfig..   
2560: 73 65 74 20 6d 65 74 68 6f 64 50 72 6f 63 28 33  set methodProc(3
2570: 64 62 61 72 73 2c 73 61 76 65 70 6c 6f 74 29 20  dbars,saveplot) 
2580: 20 20 20 20 20 20 53 61 76 65 50 6c 6f 74 0d 0a        SavePlot..
2590: 20 20 20 73 65 74 20 6d 65 74 68 6f 64 50 72 6f     set methodPro
25a0: 63 28 33 64 62 61 72 73 2c 63 6f 6e 66 69 67 29  c(3dbars,config)
25b0: 20 20 20 20 20 20 20 20 20 43 6f 6e 66 69 67 33           Config3
25c0: 44 42 61 72 73 0d 0a 20 20 20 73 65 74 20 6d 65  DBars..   set me
25d0: 74 68 6f 64 50 72 6f 63 28 33 64 62 61 72 73 2c  thodProc(3dbars,
25e0: 62 61 6c 6c 6f 6f 6e 29 20 20 20 20 20 20 20 20  balloon)        
25f0: 44 72 61 77 42 61 6c 6c 6f 6f 6e 0d 0a 20 20 20  DrawBalloon..   
2600: 73 65 74 20 6d 65 74 68 6f 64 50 72 6f 63 28 33  set methodProc(3
2610: 64 62 61 72 73 2c 62 61 6c 6c 6f 6f 6e 63 6f 6e  dbars,ballooncon
2620: 66 69 67 29 20 20 43 6f 6e 66 69 67 42 61 6c 6c  fig)  ConfigBall
2630: 6f 6f 6e 0d 0a 20 20 20 73 65 74 20 6d 65 74 68  oon..   set meth
2640: 6f 64 50 72 6f 63 28 33 64 62 61 72 73 2c 70 6c  odProc(3dbars,pl
2650: 61 69 6e 74 65 78 74 29 20 20 20 20 20 20 44 72  aintext)      Dr
2660: 61 77 50 6c 61 69 6e 54 65 78 74 0d 0a 20 20 20  awPlainText..   
2670: 73 65 74 20 6d 65 74 68 6f 64 50 72 6f 63 28 72  set methodProc(r
2680: 61 64 69 61 6c 63 68 61 72 74 2c 74 69 74 6c 65  adialchart,title
2690: 29 20 20 20 20 20 44 72 61 77 54 69 74 6c 65 0d  )     DrawTitle.
26a0: 0a 20 20 20 73 65 74 20 6d 65 74 68 6f 64 50 72  .   set methodPr
26b0: 6f 63 28 72 61 64 69 61 6c 63 68 61 72 74 2c 70  oc(radialchart,p
26c0: 6c 6f 74 29 20 20 20 20 20 20 44 72 61 77 52 61  lot)      DrawRa
26d0: 64 69 61 6c 0d 0a 20 20 20 73 65 74 20 6d 65 74  dial..   set met
26e0: 68 6f 64 50 72 6f 63 28 72 61 64 69 61 6c 63 68  hodProc(radialch
26f0: 61 72 74 2c 73 61 76 65 70 6c 6f 74 29 20 20 53  art,saveplot)  S
2700: 61 76 65 50 6c 6f 74 0d 0a 20 20 20 73 65 74 20  avePlot..   set 
2710: 6d 65 74 68 6f 64 50 72 6f 63 28 72 61 64 69 61  methodProc(radia
2720: 6c 63 68 61 72 74 2c 62 61 6c 6c 6f 6f 6e 29 20  lchart,balloon) 
2730: 20 20 44 72 61 77 42 61 6c 6c 6f 6f 6e 0d 0a 20    DrawBalloon.. 
2740: 20 20 73 65 74 20 6d 65 74 68 6f 64 50 72 6f 63    set methodProc
2750: 28 72 61 64 69 61 6c 63 68 61 72 74 2c 70 6c 61  (radialchart,pla
2760: 69 6e 74 65 78 74 29 20 44 72 61 77 50 6c 61 69  intext) DrawPlai
2770: 6e 54 65 78 74 0d 0a 20 20 20 73 65 74 20 6d 65  nText..   set me
2780: 74 68 6f 64 50 72 6f 63 28 74 78 70 6c 6f 74 2c  thodProc(txplot,
2790: 74 69 74 6c 65 29 20 20 20 20 20 20 20 20 20 20  title)          
27a0: 44 72 61 77 54 69 74 6c 65 0d 0a 20 20 20 73 65  DrawTitle..   se
27b0: 74 20 6d 65 74 68 6f 64 50 72 6f 63 28 74 78 70  t methodProc(txp
27c0: 6c 6f 74 2c 78 74 65 78 74 29 20 20 20 20 20 20  lot,xtext)      
27d0: 20 20 20 20 44 72 61 77 58 74 65 78 74 0d 0a 20      DrawXtext.. 
27e0: 20 20 73 65 74 20 6d 65 74 68 6f 64 50 72 6f 63    set methodProc
27f0: 28 74 78 70 6c 6f 74 2c 79 74 65 78 74 29 20 20  (txplot,ytext)  
2800: 20 20 20 20 20 20 20 20 44 72 61 77 59 74 65 78          DrawYtex
2810: 74 0d 0a 20 20 20 73 65 74 20 6d 65 74 68 6f 64  t..   set method
2820: 50 72 6f 63 28 74 78 70 6c 6f 74 2c 70 6c 6f 74  Proc(txplot,plot
2830: 29 20 20 20 20 20 20 20 20 20 20 20 44 72 61 77  )           Draw
2840: 54 69 6d 65 44 61 74 61 0d 0a 20 20 20 73 65 74  TimeData..   set
2850: 20 6d 65 74 68 6f 64 50 72 6f 63 28 74 78 70 6c   methodProc(txpl
2860: 6f 74 2c 69 6e 74 65 72 76 61 6c 29 20 20 20 20  ot,interval)    
2870: 20 20 20 44 72 61 77 49 6e 74 65 72 76 61 6c 0d     DrawInterval.
2880: 0a 20 20 20 73 65 74 20 6d 65 74 68 6f 64 50 72  .   set methodPr
2890: 6f 63 28 74 78 70 6c 6f 74 2c 73 61 76 65 70 6c  oc(txplot,savepl
28a0: 6f 74 29 20 20 20 20 20 20 20 53 61 76 65 50 6c  ot)       SavePl
28b0: 6f 74 0d 0a 20 20 20 73 65 74 20 6d 65 74 68 6f  ot..   set metho
28c0: 64 50 72 6f 63 28 74 78 70 6c 6f 74 2c 64 61 74  dProc(txplot,dat
28d0: 61 63 6f 6e 66 69 67 29 20 20 20 20 20 44 61 74  aconfig)     Dat
28e0: 61 43 6f 6e 66 69 67 0d 0a 20 20 20 73 65 74 20  aConfig..   set 
28f0: 6d 65 74 68 6f 64 50 72 6f 63 28 74 78 70 6c 6f  methodProc(txplo
2900: 74 2c 78 63 6f 6e 66 69 67 29 20 20 20 20 20 20  t,xconfig)      
2910: 20 20 58 43 6f 6e 66 69 67 0d 0a 20 20 20 73 65    XConfig..   se
2920: 74 20 6d 65 74 68 6f 64 50 72 6f 63 28 74 78 70  t methodProc(txp
2930: 6c 6f 74 2c 79 63 6f 6e 66 69 67 29 20 20 20 20  lot,yconfig)    
2940: 20 20 20 20 59 43 6f 6e 66 69 67 0d 0a 20 20 20      YConfig..   
2950: 73 65 74 20 6d 65 74 68 6f 64 50 72 6f 63 28 74  set methodProc(t
2960: 78 70 6c 6f 74 2c 78 74 69 63 6b 6c 69 6e 65 73  xplot,xticklines
2970: 29 20 20 20 20 20 44 72 61 77 58 54 69 63 6b 6c  )     DrawXTickl
2980: 69 6e 65 73 0d 0a 20 20 20 73 65 74 20 6d 65 74  ines..   set met
2990: 68 6f 64 50 72 6f 63 28 74 78 70 6c 6f 74 2c 79  hodProc(txplot,y
29a0: 74 69 63 6b 6c 69 6e 65 73 29 20 20 20 20 20 44  ticklines)     D
29b0: 72 61 77 59 54 69 63 6b 6c 69 6e 65 73 0d 0a 20  rawYTicklines.. 
29c0: 20 20 73 65 74 20 6d 65 74 68 6f 64 50 72 6f 63    set methodProc
29d0: 28 74 78 70 6c 6f 74 2c 62 61 63 6b 67 72 6f 75  (txplot,backgrou
29e0: 6e 64 29 20 20 20 20 20 42 61 63 6b 67 72 6f 75  nd)     Backgrou
29f0: 6e 64 43 6f 6c 6f 75 72 0d 0a 20 20 20 73 65 74  ndColour..   set
2a00: 20 6d 65 74 68 6f 64 50 72 6f 63 28 74 78 70 6c   methodProc(txpl
2a10: 6f 74 2c 6c 65 67 65 6e 64 63 6f 6e 66 69 67 29  ot,legendconfig)
2a20: 20 20 20 4c 65 67 65 6e 64 43 6f 6e 66 69 67 75     LegendConfigu
2a30: 72 65 0d 0a 20 20 20 73 65 74 20 6d 65 74 68 6f  re..   set metho
2a40: 64 50 72 6f 63 28 74 78 70 6c 6f 74 2c 6c 65 67  dProc(txplot,leg
2a50: 65 6e 64 29 20 20 20 20 20 20 20 20 20 44 72 61  end)         Dra
2a60: 77 4c 65 67 65 6e 64 0d 0a 20 20 20 73 65 74 20  wLegend..   set 
2a70: 6d 65 74 68 6f 64 50 72 6f 63 28 74 78 70 6c 6f  methodProc(txplo
2a80: 74 2c 62 61 6c 6c 6f 6f 6e 29 20 20 20 20 20 20  t,balloon)      
2a90: 20 20 44 72 61 77 42 61 6c 6c 6f 6f 6e 0d 0a 20    DrawBalloon.. 
2aa0: 20 20 73 65 74 20 6d 65 74 68 6f 64 50 72 6f 63    set methodProc
2ab0: 28 74 78 70 6c 6f 74 2c 62 61 6c 6c 6f 6f 6e 63  (txplot,balloonc
2ac0: 6f 6e 66 69 67 29 20 20 43 6f 6e 66 69 67 42 61  onfig)  ConfigBa
2ad0: 6c 6c 6f 6f 6e 0d 0a 20 20 20 73 65 74 20 6d 65  lloon..   set me
2ae0: 74 68 6f 64 50 72 6f 63 28 74 78 70 6c 6f 74 2c  thodProc(txplot,
2af0: 70 6c 61 69 6e 74 65 78 74 29 20 20 20 20 20 20  plaintext)      
2b00: 44 72 61 77 50 6c 61 69 6e 54 65 78 74 0d 0a 20  DrawPlainText.. 
2b10: 20 20 73 65 74 20 6d 65 74 68 6f 64 50 72 6f 63    set methodProc
2b20: 28 33 64 72 69 62 62 6f 6e 2c 74 69 74 6c 65 29  (3dribbon,title)
2b30: 20 20 20 20 20 20 20 20 44 72 61 77 54 69 74 6c          DrawTitl
2b40: 65 0d 0a 20 20 20 73 65 74 20 6d 65 74 68 6f 64  e..   set method
2b50: 50 72 6f 63 28 33 64 72 69 62 62 6f 6e 2c 73 61  Proc(3dribbon,sa
2b60: 76 65 70 6c 6f 74 29 20 20 20 20 20 53 61 76 65  veplot)     Save
2b70: 50 6c 6f 74 0d 0a 20 20 20 73 65 74 20 6d 65 74  Plot..   set met
2b80: 68 6f 64 50 72 6f 63 28 33 64 72 69 62 62 6f 6e  hodProc(3dribbon
2b90: 2c 6c 69 6e 65 29 20 20 20 20 20 20 20 20 20 44  ,line)         D
2ba0: 72 61 77 33 44 4c 69 6e 65 0d 0a 20 20 20 73 65  raw3DLine..   se
2bb0: 74 20 6d 65 74 68 6f 64 50 72 6f 63 28 33 64 72  t methodProc(3dr
2bc0: 69 62 62 6f 6e 2c 61 72 65 61 29 20 20 20 20 20  ibbon,area)     
2bd0: 20 20 20 20 44 72 61 77 33 44 41 72 65 61 0d 0a      Draw3DArea..
2be0: 20 20 20 73 65 74 20 6d 65 74 68 6f 64 50 72 6f     set methodPro
2bf0: 63 28 33 64 72 69 62 62 6f 6e 2c 62 61 63 6b 67  c(3dribbon,backg
2c00: 72 6f 75 6e 64 29 20 20 20 42 61 63 6b 67 72 6f  round)   Backgro
2c10: 75 6e 64 43 6f 6c 6f 75 72 0d 0a 0d 0a 20 20 20  undColour....   
2c20: 23 0d 0a 20 20 20 23 20 41 75 78 69 6c 69 61 72  #..   # Auxiliar
2c30: 79 20 70 61 72 61 6d 65 74 65 72 73 0d 0a 20 20  y parameters..  
2c40: 20 23 0d 0a 20 20 20 76 61 72 69 61 62 6c 65 20   #..   variable 
2c50: 74 6f 72 61 64 0d 0a 20 20 20 73 65 74 20 74 6f  torad..   set to
2c60: 72 61 64 20 5b 65 78 70 72 20 7b 33 2e 31 34 31  rad [expr {3.141
2c70: 35 39 32 36 2f 31 38 30 2e 30 7d 5d 0d 0a 0d 0a  5926/180.0}]....
2c80: 20 20 20 76 61 72 69 61 62 6c 65 20 6f 70 74 69     variable opti
2c90: 6f 6e 73 0d 0a 20 20 20 76 61 72 69 61 62 6c 65  ons..   variable
2ca0: 20 6f 70 74 69 6f 6e 5f 6b 65 79 73 0d 0a 20 20   option_keys..  
2cb0: 20 76 61 72 69 61 62 6c 65 20 6f 70 74 69 6f 6e   variable option
2cc0: 5f 76 61 6c 75 65 73 0d 0a 20 20 20 73 65 74 20  _values..   set 
2cd0: 6f 70 74 69 6f 6e 73 20 20 20 20 20 20 20 7b 2d  options       {-
2ce0: 63 6f 6c 6f 75 72 20 2d 63 6f 6c 6f 72 20 20 2d  colour -color  -
2cf0: 73 79 6d 62 6f 6c 20 2d 74 79 70 65 20 2d 66 69  symbol -type -fi
2d00: 6c 6c 65 64 20 2d 66 69 6c 6c 63 6f 6c 6f 75 72  lled -fillcolour
2d10: 7d 0d 0a 20 20 20 73 65 74 20 6f 70 74 69 6f 6e  }..   set option
2d20: 5f 6b 65 79 73 20 20 20 7b 2d 63 6f 6c 6f 75 72  _keys   {-colour
2d30: 20 2d 63 6f 6c 6f 75 72 20 2d 73 79 6d 62 6f 6c   -colour -symbol
2d40: 20 2d 74 79 70 65 20 2d 66 69 6c 6c 65 64 20 2d   -type -filled -
2d50: 66 69 6c 6c 63 6f 6c 6f 75 72 7d 0d 0a 20 20 20  fillcolour}..   
2d60: 73 65 74 20 6f 70 74 69 6f 6e 5f 76 61 6c 75 65  set option_value
2d70: 73 20 7b 2d 63 6f 6c 6f 75 72 20 7b 2e 2e 2e 7d  s {-colour {...}
2d80: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
2d90: 20 20 20 20 20 20 20 20 2d 73 79 6d 62 6f 6c 20          -symbol 
2da0: 7b 70 6c 75 73 20 63 72 6f 73 73 20 63 69 72 63  {plus cross circ
2db0: 6c 65 20 75 70 20 64 6f 77 6e 20 64 6f 74 20 75  le up down dot u
2dc0: 70 66 69 6c 6c 65 64 20 64 6f 77 6e 66 69 6c 6c  pfilled downfill
2dd0: 65 64 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ed}..           
2de0: 20 20 20 20 20 20 20 20 20 20 20 2d 74 79 70 65             -type
2df0: 20 7b 6c 69 6e 65 20 73 79 6d 62 6f 6c 20 62 6f   {line symbol bo
2e00: 74 68 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  th}..           
2e10: 20 20 20 20 20 20 20 20 20 20 20 2d 66 69 6c 6c             -fill
2e20: 65 64 20 7b 6e 6f 20 75 70 20 64 6f 77 6e 7d 0d  ed {no up down}.
2e30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2e40: 20 20 20 20 20 20 20 2d 66 69 6c 6c 63 6f 6c 6f         -fillcolo
2e50: 75 72 20 7b 2e 2e 2e 7d 0d 0a 20 20 20 20 20 20  ur {...}..      
2e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
2e70: 0d 0a 0d 0a 20 20 20 76 61 72 69 61 62 6c 65 20  ....   variable 
2e80: 61 78 69 73 5f 6f 70 74 69 6f 6e 73 0d 0a 20 20  axis_options..  
2e90: 20 76 61 72 69 61 62 6c 65 20 61 78 69 73 5f 6f   variable axis_o
2ea0: 70 74 69 6f 6e 5f 63 6c 65 61 72 0d 0a 20 20 20  ption_clear..   
2eb0: 76 61 72 69 61 62 6c 65 20 61 78 69 73 5f 6f 70  variable axis_op
2ec0: 74 69 6f 6e 5f 76 61 6c 75 65 73 0d 0a 20 20 20  tion_values..   
2ed0: 73 65 74 20 61 78 69 73 5f 6f 70 74 69 6f 6e 73  set axis_options
2ee0: 20 20 20 20 20 20 20 7b 2d 66 6f 72 6d 61 74 20         {-format 
2ef0: 2d 74 69 63 6b 6c 65 6e 67 74 68 20 2d 74 69 63  -ticklength -tic
2f00: 6b 6c 69 6e 65 73 20 2d 73 63 61 6c 65 7d 0d 0a  klines -scale}..
2f10: 20 20 20 73 65 74 20 61 78 69 73 5f 6f 70 74 69     set axis_opti
2f20: 6f 6e 5f 63 6c 65 61 72 20 20 7b 20 30 20 20 20  on_clear  { 0   
2f30: 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20      0           
2f40: 30 20 20 20 20 20 20 20 20 20 20 31 20 20 20 20  0          1    
2f50: 7d 0d 0a 20 20 20 73 65 74 20 61 78 69 73 5f 6f  }..   set axis_o
2f60: 70 74 69 6f 6e 5f 76 61 6c 75 65 73 20 7b 2d 66  ption_values {-f
2f70: 6f 72 6d 61 74 20 20 20 20 20 7b 2e 2e 2e 7d 0d  ormat     {...}.
2f80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2f90: 20 20 20 20 20 20 20 20 20 20 20 20 2d 74 69 63              -tic
2fa0: 6b 6c 65 6e 67 74 68 20 7b 2e 2e 2e 7d 0d 0a 20  klength {...}.. 
2fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fc0: 20 20 20 20 20 20 20 20 20 20 2d 74 69 63 6b 6c            -tickl
2fd0: 69 6e 65 73 20 20 7b 30 20 31 7d 0d 0a 20 20 20  ines  {0 1}..   
2fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ff0: 20 20 20 20 20 20 20 20 2d 73 63 61 6c 65 20 20          -scale  
3000: 20 20 20 20 7b 2e 2e 2e 7d 0d 0a 20 20 20 20 20      {...}..     
3010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3020: 20 20 20 20 20 7d 0d 0a 20 20 20 76 61 72 69 61       }..   varia
3030: 62 6c 65 20 63 6f 6e 74 6f 75 72 5f 6f 70 74 69  ble contour_opti
3040: 6f 6e 73 0d 0a 7d 0d 0a 0d 0a 23 20 73 65 74 5a  ons..}....# setZ
3050: 6f 6f 6d 50 61 6e 20 2d 2d 0d 0a 23 20 20 20 20  oomPan --..#    
3060: 53 65 74 20 75 70 20 74 68 65 20 62 69 6e 64 69  Set up the bindi
3070: 6e 67 73 20 66 6f 72 20 7a 6f 6f 6d 69 6e 67 20  ngs for zooming 
3080: 61 6e 64 20 70 61 6e 6e 69 6e 67 0d 0a 23 20 41  and panning..# A
3090: 72 67 75 6d 65 6e 74 73 3a 0d 0a 23 20 20 20 20  rguments:..#    
30a0: 77 20 20 20 20 20 20 20 20 20 20 20 4e 61 6d 65  w           Name
30b0: 20 6f 66 20 74 68 65 20 63 61 6e 76 61 73 20 77   of the canvas w
30c0: 69 6e 64 6f 77 0d 0a 23 20 52 65 73 75 6c 74 3a  indow..# Result:
30d0: 0d 0a 23 20 20 20 20 4e 6f 6e 65 0d 0a 23 20 53  ..#    None..# S
30e0: 69 64 65 20 65 66 66 65 63 74 3a 0d 0a 23 20 20  ide effect:..#  
30f0: 20 20 42 69 6e 64 69 6e 67 73 20 73 65 74 20 75    Bindings set u
3100: 70 0d 0a 23 0d 0a 70 72 6f 63 20 3a 3a 50 6c 6f  p..#..proc ::Plo
3110: 74 63 68 61 72 74 3a 3a 73 65 74 5a 6f 6f 6d 50  tchart::setZoomP
3120: 61 6e 20 7b 20 77 20 7d 20 7b 0d 0a 20 20 20 73  an { w } {..   s
3130: 65 74 20 73 71 72 74 32 20 20 5b 65 78 70 72 20  et sqrt2  [expr 
3140: 7b 73 71 72 74 28 32 2e 30 29 7d 5d 0d 0a 20 20  {sqrt(2.0)}]..  
3150: 20 73 65 74 20 73 71 72 74 30 35 20 5b 65 78 70   set sqrt05 [exp
3160: 72 20 7b 73 71 72 74 28 30 2e 35 29 7d 5d 0d 0a  r {sqrt(0.5)}]..
3170: 0d 0a 20 20 20 62 69 6e 64 20 24 77 20 3c 43 6f  ..   bind $w <Co
3180: 6e 74 72 6f 6c 2d 42 75 74 74 6f 6e 2d 31 3e 20  ntrol-Button-1> 
3190: 5b 6c 69 73 74 20 3a 3a 50 6c 6f 74 63 68 61 72  [list ::Plotchar
31a0: 74 3a 3a 53 63 61 6c 65 49 74 65 6d 73 20 24 77  t::ScaleItems $w
31b0: 20 25 78 20 25 79 20 24 73 71 72 74 32 5d 0d 0a   %x %y $sqrt2]..
31c0: 20 20 20 62 69 6e 64 20 24 77 20 3c 43 6f 6e 74     bind $w <Cont
31d0: 72 6f 6c 2d 50 72 69 6f 72 3e 20 20 20 20 5b 6c  rol-Prior>    [l
31e0: 69 73 74 20 3a 3a 50 6c 6f 74 63 68 61 72 74 3a  ist ::Plotchart:
31f0: 3a 53 63 61 6c 65 49 74 65 6d 73 20 24 77 20 25  :ScaleItems $w %
3200: 78 20 25 79 20 24 73 71 72 74 32 5d 0d 0a 20 20  x %y $sqrt2]..  
3210: 20 62 69 6e 64 20 24 77 20 3c 43 6f 6e 74 72 6f   bind $w <Contro
3220: 6c 2d 42 75 74 74 6f 6e 2d 32 3e 20 5b 6c 69 73  l-Button-2> [lis
3230: 74 20 3a 3a 50 6c 6f 74 63 68 61 72 74 3a 3a 53  t ::Plotchart::S
3240: 63 61 6c 65 49 74 65 6d 73 20 24 77 20 25 78 20  caleItems $w %x 
3250: 25 79 20 24 73 71 72 74 30 35 5d 0d 0a 20 20 20  %y $sqrt05]..   
3260: 62 69 6e 64 20 24 77 20 3c 43 6f 6e 74 72 6f 6c  bind $w <Control
3270: 2d 42 75 74 74 6f 6e 2d 33 3e 20 5b 6c 69 73 74  -Button-3> [list
3280: 20 3a 3a 50 6c 6f 74 63 68 61 72 74 3a 3a 53 63   ::Plotchart::Sc
3290: 61 6c 65 49 74 65 6d 73 20 24 77 20 25 78 20 25  aleItems $w %x %
32a0: 79 20 24 73 71 72 74 30 35 5d 0d 0a 20 20 20 62  y $sqrt05]..   b
32b0: 69 6e 64 20 24 77 20 3c 43 6f 6e 74 72 6f 6c 2d  ind $w <Control-
32c0: 4e 65 78 74 3e 20 20 20 20 20 5b 6c 69 73 74 20  Next>     [list 
32d0: 3a 3a 50 6c 6f 74 63 68 61 72 74 3a 3a 53 63 61  ::Plotchart::Sca
32e0: 6c 65 49 74 65 6d 73 20 24 77 20 25 78 20 25 79  leItems $w %x %y
32f0: 20 24 73 71 72 74 30 35 5d 0d 0a 20 20 20 62 69   $sqrt05]..   bi
3300: 6e 64 20 24 77 20 3c 43 6f 6e 74 72 6f 6c 2d 55  nd $w <Control-U
3310: 70 3e 20 20 20 20 20 20 20 5b 6c 69 73 74 20 3a  p>       [list :
3320: 3a 50 6c 6f 74 63 68 61 72 74 3a 3a 4d 6f 76 65  :Plotchart::Move
3330: 49 74 65 6d 73 20 20 24 77 20 20 20 30 20 2d 34  Items  $w   0 -4
3340: 30 5d 0d 0a 20 20 20 62 69 6e 64 20 24 77 20 3c  0]..   bind $w <
3350: 43 6f 6e 74 72 6f 6c 2d 44 6f 77 6e 3e 20 20 20  Control-Down>   
3360: 20 20 5b 6c 69 73 74 20 3a 3a 50 6c 6f 74 63 68    [list ::Plotch
3370: 61 72 74 3a 3a 4d 6f 76 65 49 74 65 6d 73 20 20  art::MoveItems  
3380: 24 77 20 20 20 30 20 20 34 30 5d 0d 0a 20 20 20  $w   0  40]..   
3390: 62 69 6e 64 20 24 77 20 3c 43 6f 6e 74 72 6f 6c  bind $w <Control
33a0: 2d 4c 65 66 74 3e 20 20 20 20 20 5b 6c 69 73 74  -Left>     [list
33b0: 20 3a 3a 50 6c 6f 74 63 68 61 72 74 3a 3a 4d 6f   ::Plotchart::Mo
33c0: 76 65 49 74 65 6d 73 20 20 24 77 20 2d 34 30 20  veItems  $w -40 
33d0: 20 20 30 5d 0d 0a 20 20 20 62 69 6e 64 20 24 77    0]..   bind $w
33e0: 20 3c 43 6f 6e 74 72 6f 6c 2d 52 69 67 68 74 3e   <Control-Right>
33f0: 20 20 20 20 5b 6c 69 73 74 20 3a 3a 50 6c 6f 74      [list ::Plot
3400: 63 68 61 72 74 3a 3a 4d 6f 76 65 49 74 65 6d 73  chart::MoveItems
3410: 20 20 24 77 20 20 34 30 20 20 20 30 5d 0d 0a 20    $w  40   0].. 
3420: 20 20 66 6f 63 75 73 20 24 77 0d 0a 7d 0d 0a 0d    focus $w..}...
3430: 0a 23 20 76 69 65 77 50 6f 72 74 20 2d 2d 0d 0a  .# viewPort --..
3440: 23 20 20 20 20 53 65 74 20 74 68 65 20 70 69 78  #    Set the pix
3450: 65 6c 20 65 78 74 72 65 6d 65 73 20 66 6f 72 20  el extremes for 
3460: 74 68 65 20 67 72 61 70 68 0d 0a 23 20 41 72 67  the graph..# Arg
3470: 75 6d 65 6e 74 73 3a 0d 0a 23 20 20 20 20 77 20  uments:..#    w 
3480: 20 20 20 20 20 20 20 20 20 20 4e 61 6d 65 20 6f            Name o
3490: 66 20 74 68 65 20 63 61 6e 76 61 73 20 77 69 6e  f the canvas win
34a0: 64 6f 77 0d 0a 23 20 20 20 20 70 78 6d 69 6e 20  dow..#    pxmin 
34b0: 20 20 20 20 20 20 4d 69 6e 69 6d 75 6d 20 58 2d        Minimum X-
34c0: 63 6f 6f 72 64 69 6e 61 74 65 0d 0a 23 20 20 20  coordinate..#   
34d0: 20 70 79 6d 69 6e 20 20 20 20 20 20 20 4d 69 6e   pymin       Min
34e0: 69 6d 75 6d 20 59 2d 63 6f 6f 72 64 69 6e 61 74  imum Y-coordinat
34f0: 65 0d 0a 23 20 20 20 20 70 78 6d 61 78 20 20 20  e..#    pxmax   
3500: 20 20 20 20 4d 61 78 69 6d 75 6d 20 58 2d 63 6f      Maximum X-co
3510: 6f 72 64 69 6e 61 74 65 0d 0a 23 20 20 20 20 70  ordinate..#    p
3520: 79 6d 61 78 20 20 20 20 20 20 20 4d 61 78 69 6d  ymax       Maxim
3530: 75 6d 20 59 2d 63 6f 6f 72 64 69 6e 61 74 65 0d  um Y-coordinate.
3540: 0a 23 20 52 65 73 75 6c 74 3a 0d 0a 23 20 20 20  .# Result:..#   
3550: 20 4e 6f 6e 65 0d 0a 23 20 53 69 64 65 20 65 66   None..# Side ef
3560: 66 65 63 74 3a 0d 0a 23 20 20 20 20 41 72 72 61  fect:..#    Arra
3570: 79 20 73 63 61 6c 69 6e 67 20 66 69 6c 6c 65 64  y scaling filled
3580: 0d 0a 23 0d 0a 70 72 6f 63 20 3a 3a 50 6c 6f 74  ..#..proc ::Plot
3590: 63 68 61 72 74 3a 3a 76 69 65 77 50 6f 72 74 20  chart::viewPort 
35a0: 7b 20 77 20 70 78 6d 69 6e 20 70 79 6d 69 6e 20  { w pxmin pymin 
35b0: 70 78 6d 61 78 20 70 79 6d 61 78 20 7d 20 7b 0d  pxmax pymax } {.
35c0: 0a 20 20 20 76 61 72 69 61 62 6c 65 20 73 63 61  .   variable sca
35d0: 6c 69 6e 67 0d 0a 0d 0a 20 20 20 69 66 20 7b 20  ling....   if { 
35e0: 24 70 78 6d 69 6e 20 3e 3d 20 24 70 78 6d 61 78  $pxmin >= $pxmax
35f0: 20 7c 7c 20 24 70 79 6d 69 6e 20 3e 3d 20 24 70   || $pymin >= $p
3600: 79 6d 61 78 20 7d 20 7b 0d 0a 20 20 20 20 20 20  ymax } {..      
3610: 72 65 74 75 72 6e 20 2d 63 6f 64 65 20 65 72 72  return -code err
3620: 6f 72 20 22 49 6e 63 6f 6e 73 69 73 74 65 6e 74  or "Inconsistent
3630: 20 62 6f 75 6e 64 73 20 66 6f 72 20 76 69 65 77   bounds for view
3640: 70 6f 72 74 22 0d 0a 20 20 20 7d 0d 0a 0d 0a 23  port"..   }....#
3650: 20 3c 4d 42 3e 0d 0a 20 20 20 73 65 74 20 73 63   <MB>..   set sc
3660: 61 6c 69 6e 67 28 24 77 2c 70 78 6d 69 6e 29 20  aling($w,pxmin) 
3670: 20 20 20 24 70 78 6d 69 6e 0d 0a 20 20 20 73 65     $pxmin..   se
3680: 74 20 73 63 61 6c 69 6e 67 28 24 77 2c 70 79 6d  t scaling($w,pym
3690: 69 6e 29 20 20 20 20 24 70 79 6d 69 6e 0d 0a 20  in)    $pymin.. 
36a0: 20 20 73 65 74 20 73 63 61 6c 69 6e 67 28 24 77    set scaling($w
36b0: 2c 70 78 6d 61 78 29 20 20 20 20 24 70 78 6d 61  ,pxmax)    $pxma
36c0: 78 0d 0a 20 20 20 73 65 74 20 73 63 61 6c 69 6e  x..   set scalin
36d0: 67 28 24 77 2c 70 79 6d 61 78 29 20 20 20 20 24  g($w,pymax)    $
36e0: 70 79 6d 61 78 0d 0a 20 20 20 73 65 74 20 73 63  pymax..   set sc
36f0: 61 6c 69 6e 67 28 24 77 2c 6e 65 77 29 20 20 20  aling($w,new)   
3700: 20 20 20 31 0d 0a 7d 0d 0a 0d 0a 23 20 77 6f 72     1..}....# wor
3710: 6c 64 43 6f 6f 72 64 69 6e 61 74 65 73 20 2d 2d  ldCoordinates --
3720: 0d 0a 23 20 20 20 20 53 65 74 20 74 68 65 20 65  ..#    Set the e
3730: 78 74 72 65 6d 65 73 20 66 6f 72 20 74 68 65 20  xtremes for the 
3740: 77 6f 72 6c 64 20 63 6f 6f 72 64 69 6e 61 74 65  world coordinate
3750: 73 0d 0a 23 20 41 72 67 75 6d 65 6e 74 73 3a 0d  s..# Arguments:.
3760: 0a 23 20 20 20 20 77 20 20 20 20 20 20 20 20 20  .#    w         
3770: 20 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 61    Name of the ca
3780: 6e 76 61 73 20 77 69 6e 64 6f 77 0d 0a 23 20 20  nvas window..#  
3790: 20 20 78 6d 69 6e 20 20 20 20 20 20 20 20 4d 69    xmin        Mi
37a0: 6e 69 6d 75 6d 20 58 2d 63 6f 6f 72 64 69 6e 61  nimum X-coordina
37b0: 74 65 0d 0a 23 20 20 20 20 79 6d 69 6e 20 20 20  te..#    ymin   
37c0: 20 20 20 20 20 4d 69 6e 69 6d 75 6d 20 59 2d 63       Minimum Y-c
37d0: 6f 6f 72 64 69 6e 61 74 65 0d 0a 23 20 20 20 20  oordinate..#    
37e0: 78 6d 61 78 20 20 20 20 20 20 20 20 4d 61 78 69  xmax        Maxi
37f0: 6d 75 6d 20 58 2d 63 6f 6f 72 64 69 6e 61 74 65  mum X-coordinate
3800: 0d 0a 23 20 20 20 20 79 6d 61 78 20 20 20 20 20  ..#    ymax     
3810: 20 20 20 4d 61 78 69 6d 75 6d 20 59 2d 63 6f 6f     Maximum Y-coo
3820: 72 64 69 6e 61 74 65 0d 0a 23 20 52 65 73 75 6c  rdinate..# Resul
3830: 74 3a 0d 0a 23 20 20 20 20 4e 6f 6e 65 0d 0a 23  t:..#    None..#
3840: 20 53 69 64 65 20 65 66 66 65 63 74 3a 0d 0a 23   Side effect:..#
3850: 20 20 20 20 41 72 72 61 79 20 73 63 61 6c 69 6e      Array scalin
3860: 67 20 66 69 6c 6c 65 64 0d 0a 23 0d 0a 70 72 6f  g filled..#..pro
3870: 63 20 3a 3a 50 6c 6f 74 63 68 61 72 74 3a 3a 77  c ::Plotchart::w
3880: 6f 72 6c 64 43 6f 6f 72 64 69 6e 61 74 65 73 20  orldCoordinates 
3890: 7b 20 77 20 78 6d 69 6e 20 79 6d 69 6e 20 78 6d  { w xmin ymin xm
38a0: 61 78 20 79 6d 61 78 20 7d 20 7b 0d 0a 20 20 20  ax ymax } {..   
38b0: 76 61 72 69 61 62 6c 65 20 73 63 61 6c 69 6e 67  variable scaling
38c0: 0d 0a 0d 0a 20 20 20 69 66 20 7b 20 24 78 6d 69  ....   if { $xmi
38d0: 6e 20 3d 3d 20 24 78 6d 61 78 20 7c 7c 20 24 79  n == $xmax || $y
38e0: 6d 69 6e 20 3d 3d 20 24 79 6d 61 78 20 7d 20 7b  min == $ymax } {
38f0: 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d  ..      return -
3900: 63 6f 64 65 20 65 72 72 6f 72 20 22 4d 69 6e 69  code error "Mini
3910: 6d 75 6d 20 61 6e 64 20 6d 61 78 69 6d 75 6d 20  mum and maximum 
3920: 6d 75 73 74 20 64 69 66 66 65 72 20 66 6f 72 20  must differ for 
3930: 77 6f 72 6c 64 20 63 6f 6f 72 64 69 6e 61 74 65  world coordinate
3940: 73 22 0d 0a 20 20 20 7d 0d 0a 0d 0a 20 20 20 73  s"..   }....   s
3950: 65 74 20 73 63 61 6c 69 6e 67 28 24 77 2c 78 6d  et scaling($w,xm
3960: 69 6e 29 20 20 20 20 5b 65 78 70 72 20 7b 64 6f  in)    [expr {do
3970: 75 62 6c 65 28 24 78 6d 69 6e 29 7d 5d 0d 0a 20  uble($xmin)}].. 
3980: 20 20 73 65 74 20 73 63 61 6c 69 6e 67 28 24 77    set scaling($w
3990: 2c 79 6d 69 6e 29 20 20 20 20 5b 65 78 70 72 20  ,ymin)    [expr 
39a0: 7b 64 6f 75 62 6c 65 28 24 79 6d 69 6e 29 7d 5d  {double($ymin)}]
39b0: 0d 0a 20 20 20 73 65 74 20 73 63 61 6c 69 6e 67  ..   set scaling
39c0: 28 24 77 2c 78 6d 61 78 29 20 20 20 20 5b 65 78  ($w,xmax)    [ex
39d0: 70 72 20 7b 64 6f 75 62 6c 65 28 24 78 6d 61 78  pr {double($xmax
39e0: 29 7d 5d 0d 0a 20 20 20 73 65 74 20 73 63 61 6c  )}]..   set scal
39f0: 69 6e 67 28 24 77 2c 79 6d 61 78 29 20 20 20 20  ing($w,ymax)    
3a00: 5b 65 78 70 72 20 7b 64 6f 75 62 6c 65 28 24 79  [expr {double($y
3a10: 6d 61 78 29 7d 5d 0d 0a 0d 0a 20 20 20 73 65 74  max)}]....   set
3a20: 20 73 63 61 6c 69 6e 67 28 24 77 2c 6e 65 77 29   scaling($w,new)
3a30: 20 20 20 20 20 31 0d 0a 7d 0d 0a 0d 0a 23 20 70       1..}....# p
3a40: 6f 6c 61 72 43 6f 6f 72 64 69 6e 61 74 65 73 20  olarCoordinates 
3a50: 2d 2d 0d 0a 23 20 20 20 20 53 65 74 20 74 68 65  --..#    Set the
3a60: 20 65 78 74 72 65 6d 65 73 20 66 6f 72 20 74 68   extremes for th
3a70: 65 20 70 6f 6c 61 72 20 63 6f 6f 72 64 69 6e 61  e polar coordina
3a80: 74 65 73 0d 0a 23 20 41 72 67 75 6d 65 6e 74 73  tes..# Arguments
3a90: 3a 0d 0a 23 20 20 20 20 77 20 20 20 20 20 20 20  :..#    w       
3aa0: 20 20 20 20 4e 61 6d 65 20 6f 66 20 74 68 65 20      Name of the 
3ab0: 63 61 6e 76 61 73 20 77 69 6e 64 6f 77 0d 0a 23  canvas window..#
3ac0: 20 20 20 20 72 61 64 6d 61 78 20 20 20 20 20 20      radmax      
3ad0: 4d 61 78 69 6d 75 6d 20 72 61 64 69 75 73 0d 0a  Maximum radius..
3ae0: 23 20 52 65 73 75 6c 74 3a 0d 0a 23 20 20 20 20  # Result:..#    
3af0: 4e 6f 6e 65 0d 0a 23 20 53 69 64 65 20 65 66 66  None..# Side eff
3b00: 65 63 74 3a 0d 0a 23 20 20 20 20 41 72 72 61 79  ect:..#    Array
3b10: 20 73 63 61 6c 69 6e 67 20 66 69 6c 6c 65 64 0d   scaling filled.
3b20: 0a 23 0d 0a 70 72 6f 63 20 3a 3a 50 6c 6f 74 63  .#..proc ::Plotc
3b30: 68 61 72 74 3a 3a 70 6f 6c 61 72 43 6f 6f 72 64  hart::polarCoord
3b40: 69 6e 61 74 65 73 20 7b 20 77 20 72 61 64 6d 61  inates { w radma
3b50: 78 20 7d 20 7b 0d 0a 20 20 20 76 61 72 69 61 62  x } {..   variab
3b60: 6c 65 20 73 63 61 6c 69 6e 67 0d 0a 0d 0a 20 20  le scaling....  
3b70: 20 69 66 20 7b 20 24 72 61 64 6d 61 78 20 3c 3d   if { $radmax <=
3b80: 20 30 2e 30 20 7d 20 7b 0d 0a 20 20 20 20 20 20   0.0 } {..      
3b90: 72 65 74 75 72 6e 20 2d 63 6f 64 65 20 65 72 72  return -code err
3ba0: 6f 72 20 22 4d 61 78 69 6d 75 6d 20 72 61 64 69  or "Maximum radi
3bb0: 75 73 20 6d 75 73 74 20 62 65 20 70 6f 73 69 74  us must be posit
3bc0: 69 76 65 22 0d 0a 20 20 20 7d 0d 0a 0d 0a 20 20  ive"..   }....  
3bd0: 20 73 65 74 20 73 63 61 6c 69 6e 67 28 24 77 2c   set scaling($w,
3be0: 78 6d 69 6e 29 20 20 20 20 5b 65 78 70 72 20 7b  xmin)    [expr {
3bf0: 2d 64 6f 75 62 6c 65 28 24 72 61 64 6d 61 78 29  -double($radmax)
3c00: 7d 5d 0d 0a 20 20 20 73 65 74 20 73 63 61 6c 69  }]..   set scali
3c10: 6e 67 28 24 77 2c 79 6d 69 6e 29 20 20 20 20 5b  ng($w,ymin)    [
3c20: 65 78 70 72 20 7b 2d 64 6f 75 62 6c 65 28 24 72  expr {-double($r
3c30: 61 64 6d 61 78 29 7d 5d 0d 0a 20 20 20 73 65 74  admax)}]..   set
3c40: 20 73 63 61 6c 69 6e 67 28 24 77 2c 78 6d 61 78   scaling($w,xmax
3c50: 29 20 20 20 20 5b 65 78 70 72 20 7b 64 6f 75 62  )    [expr {doub
3c60: 6c 65 28 24 72 61 64 6d 61 78 29 7d 5d 0d 0a 20  le($radmax)}].. 
3c70: 20 20 73 65 74 20 73 63 61 6c 69 6e 67 28 24 77    set scaling($w
3c80: 2c 79 6d 61 78 29 20 20 20 20 5b 65 78 70 72 20  ,ymax)    [expr 
3c90: 7b 64 6f 75 62 6c 65 28 24 72 61 64 6d 61 78 29  {double($radmax)
3ca0: 7d 5d 0d 0a 0d 0a 20 20 20 73 65 74 20 73 63 61  }]....   set sca
3cb0: 6c 69 6e 67 28 24 77 2c 6e 65 77 29 20 20 20 20  ling($w,new)    
3cc0: 20 31 0d 0a 7d 0d 0a 0d 0a 23 20 77 6f 72 6c 64   1..}....# world
3cd0: 33 44 43 6f 6f 72 64 69 6e 61 74 65 73 20 2d 2d  3DCoordinates --
3ce0: 0d 0a 23 20 20 20 20 53 65 74 20 74 68 65 20 65  ..#    Set the e
3cf0: 78 74 72 65 6d 65 73 20 66 6f 72 20 74 68 65 20  xtremes for the 
3d00: 77 6f 72 6c 64 20 63 6f 6f 72 64 69 6e 61 74 65  world coordinate
3d10: 73 20 69 6e 20 33 44 20 70 6c 6f 74 73 0d 0a 23  s in 3D plots..#
3d20: 20 41 72 67 75 6d 65 6e 74 73 3a 0d 0a 23 20 20   Arguments:..#  
3d30: 20 20 77 20 20 20 20 20 20 20 20 20 20 20 4e 61    w           Na
3d40: 6d 65 20 6f 66 20 74 68 65 20 63 61 6e 76 61 73  me of the canvas
3d50: 20 77 69 6e 64 6f 77 0d 0a 23 20 20 20 20 78 6d   window..#    xm
3d60: 69 6e 20 20 20 20 20 20 20 20 4d 69 6e 69 6d 75  in        Minimu
3d70: 6d 20 58 2d 63 6f 6f 72 64 69 6e 61 74 65 0d 0a  m X-coordinate..
3d80: 23 20 20 20 20 79 6d 69 6e 20 20 20 20 20 20 20  #    ymin       
3d90: 20 4d 69 6e 69 6d 75 6d 20 59 2d 63 6f 6f 72 64   Minimum Y-coord
3da0: 69 6e 61 74 65 0d 0a 23 20 20 20 20 7a 6d 69 6e  inate..#    zmin
3db0: 20 20 20 20 20 20 20 20 4d 69 6e 69 6d 75 6d 20          Minimum 
3dc0: 5a 2d 63 6f 6f 72 64 69 6e 61 74 65 0d 0a 23 20  Z-coordinate..# 
3dd0: 20 20 20 78 6d 61 78 20 20 20 20 20 20 20 20 4d     xmax        M
3de0: 61 78 69 6d 75 6d 20 58 2d 63 6f 6f 72 64 69 6e  aximum X-coordin
3df0: 61 74 65 0d 0a 23 20 20 20 20 79 6d 61 78 20 20  ate..#    ymax  
3e00: 20 20 20 20 20 20 4d 61 78 69 6d 75 6d 20 59 2d        Maximum Y-
3e10: 63 6f 6f 72 64 69 6e 61 74 65 0d 0a 23 20 20 20  coordinate..#   
3e20: 20 7a 6d 61 78 20 20 20 20 20 20 20 20 4d 61 78   zmax        Max
3e30: 69 6d 75 6d 20 5a 2d 63 6f 6f 72 64 69 6e 61 74  imum Z-coordinat
3e40: 65 0d 0a 23 20 52 65 73 75 6c 74 3a 0d 0a 23 20  e..# Result:..# 
3e50: 20 20 20 4e 6f 6e 65 0d 0a 23 20 53 69 64 65 20     None..# Side 
3e60: 65 66 66 65 63 74 3a 0d 0a 23 20 20 20 20 41 72  effect:..#    Ar
3e70: 72 61 79 20 73 63 61 6c 69 6e 67 20 66 69 6c 6c  ray scaling fill
3e80: 65 64 0d 0a 23 0d 0a 70 72 6f 63 20 3a 3a 50 6c  ed..#..proc ::Pl
3e90: 6f 74 63 68 61 72 74 3a 3a 77 6f 72 6c 64 33 44  otchart::world3D
3ea0: 43 6f 6f 72 64 69 6e 61 74 65 73 20 7b 20 77 20  Coordinates { w 
3eb0: 78 6d 69 6e 20 79 6d 69 6e 20 7a 6d 69 6e 20 78  xmin ymin zmin x
3ec0: 6d 61 78 20 79 6d 61 78 20 7a 6d 61 78 20 7d 20  max ymax zmax } 
3ed0: 7b 0d 0a 20 20 20 76 61 72 69 61 62 6c 65 20 73  {..   variable s
3ee0: 63 61 6c 69 6e 67 0d 0a 0d 0a 20 20 20 69 66 20  caling....   if 
3ef0: 7b 20 24 78 6d 69 6e 20 3d 3d 20 24 78 6d 61 78  { $xmin == $xmax
3f00: 20 7c 7c 20 24 79 6d 69 6e 20 3d 3d 20 24 79 6d   || $ymin == $ym
3f10: 61 78 20 7c 7c 20 24 7a 6d 69 6e 20 3d 3d 20 24  ax || $zmin == $
3f20: 7a 6d 61 78 20 7d 20 7b 0d 0a 20 20 20 20 20 20  zmax } {..      
3f30: 72 65 74 75 72 6e 20 2d 63 6f 64 65 20 65 72 72  return -code err
3f40: 6f 72 20 22 4d 69 6e 69 6d 75 6d 20 61 6e 64 20  or "Minimum and 
3f50: 6d 61 78 69 6d 75 6d 20 6d 75 73 74 20 64 69 66  maximum must dif
3f60: 66 65 72 20 66 6f 72 20 77 6f 72 6c 64 20 63 6f  fer for world co
3f70: 6f 72 64 69 6e 61 74 65 73 22 0d 0a 20 20 20 7d  ordinates"..   }
3f80: 0d 0a 0d 0a 20 20 20 73 65 74 20 73 63 61 6c 69  ....   set scali
3f90: 6e 67 28 24 77 2c 78 6d 69 6e 29 20 20 20 20 5b  ng($w,xmin)    [
3fa0: 65 78 70 72 20 7b 64 6f 75 62 6c 65 28 24 78 6d  expr {double($xm
3fb0: 69 6e 29 7d 5d 0d 0a 20 20 20 73 65 74 20 73 63  in)}]..   set sc
3fc0: 61 6c 69 6e 67 28 24 77 2c 79 6d 69 6e 29 20 20  aling($w,ymin)  
3fd0: 20 20 5b 65 78 70 72 20 7b 64 6f 75 62 6c 65 28    [expr {double(
3fe0: 24 79 6d 69 6e 29 7d 5d 0d 0a 20 20 20 73 65 74  $ymin)}]..   set
3ff0: 20 73 63 61 6c 69 6e 67 28 24 77 2c 7a 6d 69 6e   scaling($w,zmin
4000: 29 20 20 20 20 5b 65 78 70 72 20 7b 64 6f 75 62  )    [expr {doub
4010: 6c 65 28 24 7a 6d 69 6e 29 7d 5d 0d 0a 20 20 20  le($zmin)}]..   
4020: 73 65 74 20 73 63 61 6c 69 6e 67 28 24 77 2c 78  set scaling($w,x
4030: 6d 61 78 29 20 20 20 20 5b 65 78 70 72 20 7b 64  max)    [expr {d
4040: 6f 75 62 6c 65 28 24 78 6d 61 78 29 7d 5d 0d 0a  ouble($xmax)}]..
4050: 20 20 20 73 65 74 20 73 63 61 6c 69 6e 67 28 24     set scaling($
4060: 77 2c 79 6d 61 78 29 20 20 20 20 5b 65 78 70 72  w,ymax)    [expr
4070: 20 7b 64 6f 75 62 6c 65 28 24 79 6d 61 78 29 7d   {double($ymax)}
4080: 5d 0d 0a 20 20 20 73 65 74 20 73 63 61 6c 69 6e  ]..   set scalin
4090: 67 28 24 77 2c 7a 6d 61 78 29 20 20 20 20 5b 65  g($w,zmax)    [e
40a0: 78 70 72 20 7b 64 6f 75 62 6c 65 28 24 7a 6d 61  xpr {double($zma
40b0: 78 29 7d 5d 0d 0a 0d 0a 20 20 20 73 65 74 20 73  x)}]....   set s
40c0: 63 61 6c 69 6e 67 28 24 77 2c 6e 65 77 29 20 20  caling($w,new)  
40d0: 20 20 20 31 0d 0a 7d 0d 0a 0d 0a 23 20 63 6f 6f     1..}....# coo
40e0: 72 64 73 54 6f 50 69 78 65 6c 20 2d 2d 0d 0a 23  rdsToPixel --..#
40f0: 20 20 20 20 43 6f 6e 76 65 72 74 20 77 6f 72 6c      Convert worl
4100: 64 20 63 6f 6f 72 64 69 6e 61 74 65 73 20 74 6f  d coordinates to
4110: 20 70 69 78 65 6c 20 63 6f 6f 72 64 69 6e 61 74   pixel coordinat
4120: 65 73 0d 0a 23 20 41 72 67 75 6d 65 6e 74 73 3a  es..# Arguments:
4130: 0d 0a 23 20 20 20 20 77 20 20 20 20 20 20 20 20  ..#    w        
4140: 20 20 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63     Name of the c
4150: 61 6e 76 61 73 0d 0a 23 20 20 20 20 78 63 72 64  anvas..#    xcrd
4160: 20 20 20 20 20 20 20 20 58 2d 63 6f 6f 72 64 69          X-coordi
4170: 6e 61 74 65 0d 0a 23 20 20 20 20 79 63 72 64 20  nate..#    ycrd 
4180: 20 20 20 20 20 20 20 59 2d 63 6f 6f 72 64 69 6e         Y-coordin
4190: 61 74 65 0d 0a 23 20 52 65 73 75 6c 74 3a 0d 0a  ate..# Result:..
41a0: 23 20 20 20 20 4c 69 73 74 20 6f 66 20 74 77 6f  #    List of two
41b0: 20 65 6c 65 6d 65 6e 74 73 2c 20 78 2d 20 61 6e   elements, x- an
41c0: 64 20 79 2d 63 6f 6f 72 64 69 6e 61 74 65 73 20  d y-coordinates 
41d0: 69 6e 20 70 69 78 65 6c 73 0d 0a 23 0d 0a 70 72  in pixels..#..pr
41e0: 6f 63 20 3a 3a 50 6c 6f 74 63 68 61 72 74 3a 3a  oc ::Plotchart::
41f0: 63 6f 6f 72 64 73 54 6f 50 69 78 65 6c 20 7b 20  coordsToPixel { 
4200: 77 20 78 63 72 64 20 79 63 72 64 20 7d 20 7b 0d  w xcrd ycrd } {.
4210: 0a 20 20 20 76 61 72 69 61 62 6c 65 20 73 63 61  .   variable sca
4220: 6c 69 6e 67 0d 0a 0d 0a 20 20 20 69 66 20 7b 20  ling....   if { 
4230: 24 73 63 61 6c 69 6e 67 28 24 77 2c 6e 65 77 29  $scaling($w,new)
4240: 20 3d 3d 20 31 20 7d 20 7b 0d 0a 20 20 20 20 20   == 1 } {..     
4250: 20 73 65 74 20 73 63 61 6c 69 6e 67 28 24 77 2c   set scaling($w,
4260: 6e 65 77 29 20 20 20 20 20 30 0d 0a 20 20 20 20  new)     0..    
4270: 20 20 73 65 74 20 77 69 64 74 68 20 20 20 20 20    set width     
4280: 20 20 20 20 20 20 20 20 20 20 5b 65 78 70 72 20            [expr 
4290: 7b 24 73 63 61 6c 69 6e 67 28 24 77 2c 70 78 6d  {$scaling($w,pxm
42a0: 61 78 29 2d 24 73 63 61 6c 69 6e 67 28 24 77 2c  ax)-$scaling($w,
42b0: 70 78 6d 69 6e 29 7d 5d 0d 0a 20 20 20 20 20 20  pxmin)}]..      
42c0: 73 65 74 20 68 65 69 67 68 74 20 20 20 20 20 20  set height      
42d0: 20 20 20 20 20 20 20 20 5b 65 78 70 72 20 7b 24          [expr {$
42e0: 73 63 61 6c 69 6e 67 28 24 77 2c 70 79 6d 61 78  scaling($w,pymax
42f0: 29 2d 24 73 63 61 6c 69 6e 67 28 24 77 2c 70 79  )-$scaling($w,py
4300: 6d 69 6e 29 7d 5d 0d 0a 0d 0a 20 20 20 20 20 20  min)}]....      
4310: 73 65 74 20 64 78 20 20 20 20 20 20 20 20 20 20  set dx          
4320: 20 20 20 20 20 20 20 20 5b 65 78 70 72 20 7b 24          [expr {$
4330: 73 63 61 6c 69 6e 67 28 24 77 2c 78 6d 61 78 29  scaling($w,xmax)
4340: 2d 24 73 63 61 6c 69 6e 67 28 24 77 2c 78 6d 69  -$scaling($w,xmi
4350: 6e 29 7d 5d 0d 0a 20 20 20 20 20 20 73 65 74 20  n)}]..      set 
4360: 64 79 20 20 20 20 20 20 20 20 20 20 20 20 20 20  dy              
4370: 20 20 20 20 5b 65 78 70 72 20 7b 24 73 63 61 6c      [expr {$scal
4380: 69 6e 67 28 24 77 2c 79 6d 61 78 29 2d 24 73 63  ing($w,ymax)-$sc
4390: 61 6c 69 6e 67 28 24 77 2c 79 6d 69 6e 29 7d 5d  aling($w,ymin)}]
43a0: 0d 0a 20 20 20 20 20 20 73 65 74 20 73 63 61 6c  ..      set scal
43b0: 69 6e 67 28 24 77 2c 78 66 61 63 74 6f 72 29 20  ing($w,xfactor) 
43c0: 5b 65 78 70 72 20 7b 24 77 69 64 74 68 2f 24 64  [expr {$width/$d
43d0: 78 7d 5d 0d 0a 20 20 20 20 20 20 73 65 74 20 73  x}]..      set s
43e0: 63 61 6c 69 6e 67 28 24 77 2c 79 66 61 63 74 6f  caling($w,yfacto
43f0: 72 29 20 5b 65 78 70 72 20 7b 24 68 65 69 67 68  r) [expr {$heigh
4400: 74 2f 24 64 79 7d 5d 0d 0a 20 20 20 7d 0d 0a 0d  t/$dy}]..   }...
4410: 0a 20 20 20 73 65 74 20 78 70 69 78 20 5b 65 78  .   set xpix [ex
4420: 70 72 20 7b 24 73 63 61 6c 69 6e 67 28 24 77 2c  pr {$scaling($w,
4430: 70 78 6d 69 6e 29 2b 28 24 78 63 72 64 2d 24 73  pxmin)+($xcrd-$s
4440: 63 61 6c 69 6e 67 28 24 77 2c 78 6d 69 6e 29 29  caling($w,xmin))
4450: 2a 24 73 63 61 6c 69 6e 67 28 24 77 2c 78 66 61  *$scaling($w,xfa
4460: 63 74 6f 72 29 7d 5d 0d 0a 20 20 20 73 65 74 20  ctor)}]..   set 
4470: 79 70 69 78 20 5b 65 78 70 72 20 7b 24 73 63 61  ypix [expr {$sca
4480: 6c 69 6e 67 28 24 77 2c 70 79 6d 69 6e 29 2b 28  ling($w,pymin)+(
4490: 24 73 63 61 6c 69 6e 67 28 24 77 2c 79 6d 61 78  $scaling($w,ymax
44a0: 29 2d 24 79 63 72 64 29 2a 24 73 63 61 6c 69 6e  )-$ycrd)*$scalin
44b0: 67 28 24 77 2c 79 66 61 63 74 6f 72 29 7d 5d 0d  g($w,yfactor)}].
44c0: 0a 20 20 20 72 65 74 75 72 6e 20 5b 6c 69 73 74  .   return [list
44d0: 20 24 78 70 69 78 20 24 79 70 69 78 5d 0d 0a 7d   $xpix $ypix]..}
44e0: 0d 0a 0d 0a 23 20 63 6f 6f 72 64 73 33 44 54 6f  ....# coords3DTo
44f0: 50 69 78 65 6c 20 2d 2d 0d 0a 23 20 20 20 20 43  Pixel --..#    C
4500: 6f 6e 76 65 72 74 20 77 6f 72 6c 64 20 63 6f 6f  onvert world coo
4510: 72 64 69 6e 61 74 65 73 20 74 6f 20 70 69 78 65  rdinates to pixe
4520: 6c 20 63 6f 6f 72 64 69 6e 61 74 65 73 20 28 33  l coordinates (3
4530: 44 20 70 6c 6f 74 73 29 0d 0a 23 20 41 72 67 75  D plots)..# Argu
4540: 6d 65 6e 74 73 3a 0d 0a 23 20 20 20 20 77 20 20  ments:..#    w  
4550: 20 20 20 20 20 20 20 20 20 4e 61 6d 65 20 6f 66           Name of
4560: 20 74 68 65 20 63 61 6e 76 61 73 0d 0a 23 20 20   the canvas..#  
4570: 20 20 78 63 72 64 20 20 20 20 20 20 20 20 58 2d    xcrd        X-
4580: 63 6f 6f 72 64 69 6e 61 74 65 0d 0a 23 20 20 20  coordinate..#   
4590: 20 79 63 72 64 20 20 20 20 20 20 20 20 59 2d 63   ycrd        Y-c
45a0: 6f 6f 72 64 69 6e 61 74 65 0d 0a 23 20 20 20 20  oordinate..#    
45b0: 7a 63 72 64 20 20 20 20 20 20 20 20 5a 2d 63 6f  zcrd        Z-co
45c0: 6f 72 64 69 6e 61 74 65 0d 0a 23 20 52 65 73 75  ordinate..# Resu
45d0: 6c 74 3a 0d 0a 23 20 20 20 20 4c 69 73 74 20 6f  lt:..#    List o
45e0: 66 20 74 77 6f 20 65 6c 65 6d 65 6e 74 73 2c 20  f two elements, 
45f0: 78 2d 20 61 6e 64 20 79 2d 63 6f 6f 72 64 69 6e  x- and y-coordin
4600: 61 74 65 73 20 69 6e 20 70 69 78 65 6c 73 0d 0a  ates in pixels..
4610: 23 0d 0a 70 72 6f 63 20 3a 3a 50 6c 6f 74 63 68  #..proc ::Plotch
4620: 61 72 74 3a 3a 63 6f 6f 72 64 73 33 44 54 6f 50  art::coords3DToP
4630: 69 78 65 6c 20 7b 20 77 20 78 63 72 64 20 79 63  ixel { w xcrd yc
4640: 72 64 20 7a 63 72 64 20 7d 20 7b 0d 0a 20 20 20  rd zcrd } {..   
4650: 76 61 72 69 61 62 6c 65 20 73 63 61 6c 69 6e 67  variable scaling
4660: 0d 0a 0d 0a 20 20 20 69 66 20 7b 20 24 73 63 61  ....   if { $sca
4670: 6c 69 6e 67 28 24 77 2c 6e 65 77 29 20 3d 3d 20  ling($w,new) == 
4680: 31 20 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65 74  1 } {..      set
4690: 20 73 63 61 6c 69 6e 67 28 24 77 2c 6e 65 77 29   scaling($w,new)
46a0: 20 20 20 20 20 20 30 0d 0a 20 20 20 20 20 20 73        0..      s
46b0: 65 74 20 77 69 64 74 68 20 20 20 20 20 20 20 20  et width        
46c0: 20 20 20 20 20 20 20 20 5b 65 78 70 72 20 7b 24          [expr {$
46d0: 73 63 61 6c 69 6e 67 28 24 77 2c 70 78 6d 61 78  scaling($w,pxmax
46e0: 29 2d 24 73 63 61 6c 69 6e 67 28 24 77 2c 70 78  )-$scaling($w,px
46f0: 6d 69 6e 29 7d 5d 0d 0a 20 20 20 20 20 20 73 65  min)}]..      se
4700: 74 20 68 65 69 67 68 74 20 20 20 20 20 20 20 20  t height        
4710: 20 20 20 20 20 20 20 5b 65 78 70 72 20 7b 24 73         [expr {$s
4720: 63 61 6c 69 6e 67 28 24 77 2c 70 79 6d 61 78 29  caling($w,pymax)
4730: 2d 24 73 63 61 6c 69 6e 67 28 24 77 2c 70 79 6d  -$scaling($w,pym
4740: 69 6e 29 7d 5d 0d 0a 0d 0a 20 20 20 20 20 20 73  in)}]....      s
4750: 65 74 20 64 78 20 20 20 20 20 20 20 20 20 20 20  et dx           
4760: 20 20 20 20 20 20 20 20 5b 65 78 70 72 20 7b 24          [expr {$
4770: 73 63 61 6c 69 6e 67 28 24 77 2c 78 6d 61 78 29  scaling($w,xmax)
4780: 2d 24 73 63 61 6c 69 6e 67 28 24 77 2c 78 6d 69  -$scaling($w,xmi
4790: 6e 29 7d 5d 0d 0a 20 20 20 20 20 20 73 65 74 20  n)}]..      set 
47a0: 64 79 20 20 20 20 20 20 20 20 20 20 20 20 20 20  dy              
47b0: 20 20 20 20 20 5b 65 78 70 72 20 7b 24 73 63 61       [expr {$sca
47c0: 6c 69 6e 67 28 24 77 2c 79 6d 61 78 29 2d 24 73  ling($w,ymax)-$s
47d0: 63 61 6c 69 6e 67 28 24 77 2c 79 6d 69 6e 29 7d  caling($w,ymin)}
47e0: 5d 0d 0a 20 20 20 20 20 20 73 65 74 20 64 7a 20  ]..      set dz 
47f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4800: 20 20 5b 65 78 70 72 20 7b 24 73 63 61 6c 69 6e    [expr {$scalin
4810: 67 28 24 77 2c 7a 6d 61 78 29 2d 24 73 63 61 6c  g($w,zmax)-$scal
4820: 69 6e 67 28 24 77 2c 7a 6d 69 6e 29 7d 5d 0d 0a  ing($w,zmin)}]..
4830: 20 20 20 20 20 20 73 65 74 20 73 63 61 6c 69 6e        set scalin
4840: 67 28 24 77 2c 78 79 66 61 63 74 6f 72 29 20 5b  g($w,xyfactor) [
4850: 65 78 70 72 20 7b 24 73 63 61 6c 69 6e 67 28 24  expr {$scaling($
4860: 77 2c 79 66 72 61 63 74 29 2a 24 77 69 64 74 68  w,yfract)*$width
4870: 2f 24 64 78 7d 5d 0d 0a 20 20 20 20 20 20 73 65  /$dx}]..      se
4880: 74 20 73 63 61 6c 69 6e 67 28 24 77 2c 78 7a 66  t scaling($w,xzf
4890: 61 63 74 6f 72 29 20 5b 65 78 70 72 20 7b 24 73  actor) [expr {$s
48a0: 63 61 6c 69 6e 67 28 24 77 2c 7a 66 72 61 63 74  caling($w,zfract
48b0: 29 2a 24 68 65 69 67 68 74 2f 24 64 78 7d 5d 0d  )*$height/$dx}].
48c0: 0a 20 20 20 20 20 20 73 65 74 20 73 63 61 6c 69  .      set scali
48d0: 6e 67 28 24 77 2c 79 66 61 63 74 6f 72 29 20 20  ng($w,yfactor)  
48e0: 5b 65 78 70 72 20 7b 24 77 69 64 74 68 2f 24 64  [expr {$width/$d
48f0: 79 7d 5d 0d 0a 20 20 20 20 20 20 73 65 74 20 73  y}]..      set s
4900: 63 61 6c 69 6e 67 28 24 77 2c 7a 66 61 63 74 6f  caling($w,zfacto
4910: 72 29 20 20 5b 65 78 70 72 20 7b 24 68 65 69 67  r)  [expr {$heig
4920: 68 74 2f 24 64 7a 7d 5d 0d 0a 20 20 20 7d 0d 0a  ht/$dz}]..   }..
4930: 0d 0a 20 20 20 23 0d 0a 20 20 20 23 20 54 68 65  ..   #..   # The
4940: 20 76 61 6c 75 65 73 20 66 6f 72 20 78 63 72 64   values for xcrd
4950: 20 3d 20 78 6d 61 78 0d 0a 20 20 20 23 0d 0a 20   = xmax..   #.. 
4960: 20 20 73 65 74 20 78 70 69 78 20 5b 65 78 70 72    set xpix [expr
4970: 20 7b 24 73 63 61 6c 69 6e 67 28 24 77 2c 70 78   {$scaling($w,px
4980: 6d 69 6e 29 2b 28 24 79 63 72 64 2d 24 73 63 61  min)+($ycrd-$sca
4990: 6c 69 6e 67 28 24 77 2c 79 6d 69 6e 29 29 2a 24  ling($w,ymin))*$
49a0: 73 63 61 6c 69 6e 67 28 24 77 2c 79 66 61 63 74  scaling($w,yfact
49b0: 6f 72 29 7d 5d 0d 0a 20 20 20 73 65 74 20 79 70  or)}]..   set yp
49c0: 69 78 20 5b 65 78 70 72 20 7b 24 73 63 61 6c 69  ix [expr {$scali
49d0: 6e 67 28 24 77 2c 70 79 6d 69 6e 29 2b 28 24 73  ng($w,pymin)+($s
49e0: 63 61 6c 69 6e 67 28 24 77 2c 7a 6d 61 78 29 2d  caling($w,zmax)-
49f0: 24 7a 63 72 64 29 2a 24 73 63 61 6c 69 6e 67 28  $zcrd)*$scaling(
4a00: 24 77 2c 7a 66 61 63 74 6f 72 29 7d 5d 0d 0a 0d  $w,zfactor)}]...
4a10: 0a 20 20 20 23 0d 0a 20 20 20 23 20 41 64 64 20  .   #..   # Add 
4a20: 74 68 65 20 73 68 69 66 74 20 64 75 65 20 74 6f  the shift due to
4a30: 20 78 63 72 64 2d 78 6d 61 78 0d 0a 20 20 20 23   xcrd-xmax..   #
4a40: 0d 0a 20 20 20 73 65 74 20 78 70 69 78 20 5b 65  ..   set xpix [e
4a50: 78 70 72 20 7b 24 78 70 69 78 20 2b 20 24 73 63  xpr {$xpix + $sc
4a60: 61 6c 69 6e 67 28 24 77 2c 78 79 66 61 63 74 6f  aling($w,xyfacto
4a70: 72 29 2a 28 24 78 63 72 64 2d 24 73 63 61 6c 69  r)*($xcrd-$scali
4a80: 6e 67 28 24 77 2c 78 6d 61 78 29 29 7d 5d 0d 0a  ng($w,xmax))}]..
4a90: 20 20 20 73 65 74 20 79 70 69 78 20 5b 65 78 70     set ypix [exp
4aa0: 72 20 7b 24 79 70 69 78 20 2d 20 24 73 63 61 6c  r {$ypix - $scal
4ab0: 69 6e 67 28 24 77 2c 78 7a 66 61 63 74 6f 72 29  ing($w,xzfactor)
4ac0: 2a 28 24 78 63 72 64 2d 24 73 63 61 6c 69 6e 67  *($xcrd-$scaling
4ad0: 28 24 77 2c 78 6d 61 78 29 29 7d 5d 0d 0a 0d 0a  ($w,xmax))}]....
4ae0: 20 20 20 72 65 74 75 72 6e 20 5b 6c 69 73 74 20     return [list 
4af0: 24 78 70 69 78 20 24 79 70 69 78 5d 0d 0a 7d 0d  $xpix $ypix]..}.
4b00: 0a 0d 0a 23 20 70 69 78 65 6c 54 6f 43 6f 6f 72  ...# pixelToCoor
4b10: 64 73 20 2d 2d 0d 0a 23 20 20 20 20 43 6f 6e 76  ds --..#    Conv
4b20: 65 72 74 20 70 69 78 65 6c 20 63 6f 6f 72 64 69  ert pixel coordi
4b30: 6e 61 74 65 73 20 74 6f 20 77 6f 72 6c 64 20 63  nates to world c
4b40: 6f 6f 72 64 69 6e 61 74 65 73 0d 0a 23 20 41 72  oordinates..# Ar
4b50: 67 75 6d 65 6e 74 73 3a 0d 0a 23 20 20 20 20 77  guments:..#    w
4b60: 20 20 20 20 20 20 20 20 20 20 20 4e 61 6d 65 20             Name 
4b70: 6f 66 20 74 68 65 20 63 61 6e 76 61 73 0d 0a 23  of the canvas..#
4b80: 20 20 20 20 78 70 69 78 20 20 20 20 20 20 20 20      xpix        
4b90: 58 2d 63 6f 6f 72 64 69 6e 61 74 65 20 28 70 69  X-coordinate (pi
4ba0: 78 65 6c 29 0d 0a 23 20 20 20 20 79 70 69 78 20  xel)..#    ypix 
4bb0: 20 20 20 20 20 20 20 59 2d 63 6f 6f 72 64 69 6e         Y-coordin
4bc0: 61 74 65 20 28 70 69 78 65 6c 29 0d 0a 23 20 52  ate (pixel)..# R
4bd0: 65 73 75 6c 74 3a 0d 0a 23 20 20 20 20 4c 69 73  esult:..#    Lis
4be0: 74 20 6f 66 20 74 77 6f 20 65 6c 65 6d 65 6e 74  t of two element
4bf0: 73 2c 20 78 2d 20 61 6e 64 20 79 2d 63 6f 6f 72  s, x- and y-coor
4c00: 64 69 6e 61 74 65 73 20 69 6e 20 77 6f 72 6c 64  dinates in world
4c10: 20 63 6f 6f 72 64 69 6e 61 74 65 20 73 79 73 74   coordinate syst
4c20: 65 6d 0d 0a 23 0d 0a 70 72 6f 63 20 3a 3a 50 6c  em..#..proc ::Pl
4c30: 6f 74 63 68 61 72 74 3a 3a 70 69 78 65 6c 54 6f  otchart::pixelTo
4c40: 43 6f 6f 72 64 73 20 7b 20 77 20 78 70 69 78 20  Coords { w xpix 
4c50: 79 70 69 78 20 7d 20 7b 0d 0a 20 20 20 76 61 72  ypix } {..   var
4c60: 69 61 62 6c 65 20 73 63 61 6c 69 6e 67 0d 0a 0d  iable scaling...
4c70: 0a 20 20 20 69 66 20 7b 20 24 73 63 61 6c 69 6e  .   if { $scalin
4c80: 67 28 24 77 2c 6e 65 77 29 20 3d 3d 20 31 20 7d  g($w,new) == 1 }
4c90: 20 7b 0d 0a 20 20 20 20 20 20 73 65 74 20 73 63   {..      set sc
4ca0: 61 6c 69 6e 67 28 24 77 2c 6e 65 77 29 20 20 20  aling($w,new)   
4cb0: 20 20 30 0d 0a 20 20 20 20 20 20 73 65 74 20 77    0..      set w
4cc0: 69 64 74 68 20 20 20 20 20 20 20 20 20 20 20 20  idth            
4cd0: 20 20 20 5b 65 78 70 72 20 7b 24 73 63 61 6c 69     [expr {$scali
4ce0: 6e 67 28 24 77 2c 70 78 6d 61 78 29 2d 24 73 63  ng($w,pxmax)-$sc
4cf0: 61 6c 69 6e 67 28 24 77 2c 70 78 6d 69 6e 29 7d  aling($w,pxmin)}
4d00: 5d 0d 0a 20 20 20 20 20 20 73 65 74 20 68 65 69  ]..      set hei
4d10: 67 68 74 20 20 20 20 20 20 20 20 20 20 20 20 20  ght             
4d20: 20 5b 65 78 70 72 20 7b 24 73 63 61 6c 69 6e 67   [expr {$scaling
4d30: 28 24 77 2c 70 79 6d 61 78 29 2d 24 73 63 61 6c  ($w,pymax)-$scal
4d40: 69 6e 67 28 24 77 2c 70 79 6d 69 6e 29 7d 5d 0d  ing($w,pymin)}].
4d50: 0a 0d 0a 20 20 20 20 20 20 73 65 74 20 64 78 20  ...      set dx 
4d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4d70: 20 5b 65 78 70 72 20 7b 24 73 63 61 6c 69 6e 67   [expr {$scaling
4d80: 28 24 77 2c 78 6d 61 78 29 2d 24 73 63 61 6c 69  ($w,xmax)-$scali
4d90: 6e 67 28 24 77 2c 78 6d 69 6e 29 7d 5d 0d 0a 20  ng($w,xmin)}].. 
4da0: 20 20 20 20 20 73 65 74 20 64 79 20 20 20 20 20       set dy     
4db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 65 78               [ex
4dc0: 70 72 20 7b 24 73 63 61 6c 69 6e 67 28 24 77 2c  pr {$scaling($w,
4dd0: 79 6d 61 78 29 2d 24 73 63 61 6c 69 6e 67 28 24  ymax)-$scaling($
4de0: 77 2c 79 6d 69 6e 29 7d 5d 0d 0a 20 20 20 20 20  w,ymin)}]..     
4df0: 20 73 65 74 20 73 63 61 6c 69 6e 67 28 24 77 2c   set scaling($w,
4e00: 78 66 61 63 74 6f 72 29 20 5b 65 78 70 72 20 7b  xfactor) [expr {
4e10: 24 77 69 64 74 68 2f 24 64 78 7d 5d 0d 0a 20 20  $width/$dx}]..  
4e20: 20 20 20 20 73 65 74 20 73 63 61 6c 69 6e 67 28      set scaling(
4e30: 24 77 2c 79 66 61 63 74 6f 72 29 20 5b 65 78 70  $w,yfactor) [exp
4e40: 72 20 7b 24 68 65 69 67 68 74 2f 24 64 79 7d 5d  r {$height/$dy}]
4e50: 0d 0a 20 20 20 7d 0d 0a 0d 0a 20 20 20 73 65 74  ..   }....   set
4e60: 20 78 63 72 64 20 5b 65 78 70 72 20 7b 24 73 63   xcrd [expr {$sc
4e70: 61 6c 69 6e 67 28 24 77 2c 78 6d 69 6e 29 2b 28  aling($w,xmin)+(
4e80: 24 78 70 69 78 2d 24 73 63 61 6c 69 6e 67 28 24  $xpix-$scaling($
4e90: 77 2c 70 78 6d 69 6e 29 29 2f 24 73 63 61 6c 69  w,pxmin))/$scali
4ea0: 6e 67 28 24 77 2c 78 66 61 63 74 6f 72 29 7d 5d  ng($w,xfactor)}]
4eb0: 0d 0a 20 20 20 73 65 74 20 79 63 72 64 20 5b 65  ..   set ycrd [e
4ec0: 78 70 72 20 7b 24 73 63 61 6c 69 6e 67 28 24 77  xpr {$scaling($w
4ed0: 2c 79 6d 61 78 29 2d 28 24 79 70 69 78 2d 24 73  ,ymax)-($ypix-$s
4ee0: 63 61 6c 69 6e 67 28 24 77 2c 70 79 6d 69 6e 29  caling($w,pymin)
4ef0: 29 2f 24 73 63 61 6c 69 6e 67 28 24 77 2c 79 66  )/$scaling($w,yf
4f00: 61 63 74 6f 72 29 7d 5d 0d 0a 20 20 20 72 65 74  actor)}]..   ret
4f10: 75 72 6e 20 5b 6c 69 73 74 20 24 78 63 72 64 20  urn [list $xcrd 
4f20: 24 79 63 72 64 5d 0d 0a 7d 0d 0a 0d 0a 23 20 70  $ycrd]..}....# p
4f30: 69 78 65 6c 54 6f 49 6e 64 65 78 20 2d 2d 0d 0a  ixelToIndex --..
4f40: 23 20 20 20 20 43 6f 6e 76 65 72 74 20 70 69 78  #    Convert pix
4f50: 65 6c 20 63 6f 6f 72 64 69 6e 61 74 65 73 20 74  el coordinates t
4f60: 6f 20 65 6c 65 6d 65 6e 74 73 20 6c 69 73 74 20  o elements list 
4f70: 69 6e 64 65 78 0d 0a 23 20 41 72 67 75 6d 65 6e  index..# Argumen
4f80: 74 73 3a 0d 0a 23 20 20 20 20 77 20 20 20 20 20  ts:..#    w     
4f90: 20 20 20 20 20 20 4e 61 6d 65 20 6f 66 20 74 68        Name of th
4fa0: 65 20 63 61 6e 76 61 73 0d 0a 23 20 20 20 20 78  e canvas..#    x
4fb0: 70 69 78 20 20 20 20 20 20 20 20 58 2d 63 6f 6f  pix        X-coo
4fc0: 72 64 69 6e 61 74 65 20 28 70 69 78 65 6c 29 0d  rdinate (pixel).
4fd0: 0a 23 20 20 20 20 79 70 69 78 20 20 20 20 20 20  .#    ypix      
4fe0: 20 20 59 2d 63 6f 6f 72 64 69 6e 61 74 65 20 28    Y-coordinate (
4ff0: 70 69 78 65 6c 29 0d 0a 23 20 52 65 73 75 6c 74  pixel)..# Result
5000: 3a 0d 0a 23 20 20 20 20 45 6c 65 6d 65 6e 74 73  :..#    Elements
5010: 20 6c 69 73 74 20 69 6e 64 65 78 0d 0a 23 0d 0a   list index..#..
5020: 70 72 6f 63 20 3a 3a 50 6c 6f 74 63 68 61 72 74  proc ::Plotchart
5030: 3a 3a 70 69 78 65 6c 54 6f 49 6e 64 65 78 20 7b  ::pixelToIndex {
5040: 20 77 20 78 70 69 78 20 79 70 69 78 20 7d 20 7b   w xpix ypix } {
5050: 0d 0a 20 20 20 76 61 72 69 61 62 6c 65 20 73 63  ..   variable sc
5060: 61 6c 69 6e 67 0d 0a 20 20 20 76 61 72 69 61 62  aling..   variab
5070: 6c 65 20 74 6f 72 61 64 0d 0a 0d 0a 20 20 20 73  le torad....   s
5080: 65 74 20 69 64 78 20 2d 31 0d 0a 20 20 20 73 65  et idx -1..   se
5090: 74 20 72 61 64 69 75 73 20 5b 65 78 70 72 20 7b  t radius [expr {
50a0: 28 24 73 63 61 6c 69 6e 67 28 24 7b 77 7d 2c 70  ($scaling(${w},p
50b0: 78 6d 61 78 29 20 2d 20 24 73 63 61 6c 69 6e 67  xmax) - $scaling
50c0: 28 24 7b 77 7d 2c 70 78 6d 69 6e 29 29 20 2f 20  (${w},pxmin)) / 
50d0: 32 7d 5d 0d 0a 20 20 20 73 65 74 20 78 72 65 6c  2}]..   set xrel
50e0: 20 5b 65 78 70 72 20 7b 24 7b 78 70 69 78 7d 20   [expr {${xpix} 
50f0: 2d 20 24 73 63 61 6c 69 6e 67 28 24 7b 77 7d 2c  - $scaling(${w},
5100: 70 78 6d 69 6e 29 20 2d 20 24 7b 72 61 64 69 75  pxmin) - ${radiu
5110: 73 7d 7d 5d 0d 0a 20 20 20 73 65 74 20 79 72 65  s}}]..   set yre
5120: 6c 20 5b 65 78 70 72 20 7b 2d 24 7b 79 70 69 78  l [expr {-${ypix
5130: 7d 20 2b 20 24 73 63 61 6c 69 6e 67 28 24 7b 77  } + $scaling(${w
5140: 7d 2c 70 79 6d 69 6e 29 20 2b 20 24 7b 72 61 64  },pymin) + ${rad
5150: 69 75 73 7d 7d 5d 0d 0a 20 20 20 69 66 20 7b 5b  ius}}]..   if {[
5160: 65 78 70 72 20 7b 70 6f 77 28 24 7b 72 61 64 69  expr {pow(${radi
5170: 75 73 7d 2c 32 29 20 3c 20 28 70 6f 77 28 24 7b  us},2) < (pow(${
5180: 78 72 65 6c 7d 2c 32 29 20 2b 20 70 6f 77 28 24  xrel},2) + pow($
5190: 7b 79 72 65 6c 7d 2c 32 29 29 7d 5d 7d 20 7b 0d  {yrel},2))}]} {.
51a0: 0a 20 20 20 20 20 20 20 23 20 64 6f 20 6e 6f 74  .       # do not
51b0: 68 69 6e 67 20 6f 75 74 20 6f 66 20 70 69 65 20  hing out of pie 
51c0: 63 68 61 72 74 0d 0a 20 20 20 7d 20 65 6c 73 65  chart..   } else
51d0: 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73  if {[info exists
51e0: 20 73 63 61 6c 69 6e 67 28 24 7b 77 7d 2c 61 6e   scaling(${w},an
51f0: 67 6c 65 73 29 5d 7d 20 7b 0d 0a 20 20 20 20 20  gles)]} {..     
5200: 20 20 73 65 74 20 78 79 5f 61 6e 67 6c 65 20 5b    set xy_angle [
5210: 65 78 70 72 20 7b 28 33 36 30 20 2b 20 72 6f 75  expr {(360 + rou
5220: 6e 64 28 61 74 61 6e 32 28 24 7b 79 72 65 6c 7d  nd(atan2(${yrel}
5230: 2c 24 7b 78 72 65 6c 7d 29 2f 24 7b 74 6f 72 61  ,${xrel})/${tora
5240: 64 7d 29 29 20 25 20 33 36 30 7d 5d 0d 0a 20 20  d})) % 360}]..  
5250: 20 20 20 20 20 66 6f 72 65 61 63 68 20 61 6e 67       foreach ang
5260: 6c 65 20 24 73 63 61 6c 69 6e 67 28 24 7b 77 7d  le $scaling(${w}
5270: 2c 61 6e 67 6c 65 73 29 20 7b 0d 0a 20 20 20 20  ,angles) {..    
5280: 20 20 20 69 66 20 7b 24 7b 78 79 5f 61 6e 67 6c     if {${xy_angl
5290: 65 7d 20 3c 3d 20 24 7b 61 6e 67 6c 65 7d 7d 20  e} <= ${angle}} 
52a0: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 62 72  {..           br
52b0: 65 61 6b 0d 0a 20 20 20 20 20 20 20 7d 0d 0a 20  eak..       }.. 
52c0: 20 20 20 20 20 20 69 6e 63 72 20 69 64 78 0d 0a        incr idx..
52d0: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 7d 0d 0a         }..   }..
52e0: 20 20 20 72 65 74 75 72 6e 20 24 7b 69 64 78 7d     return ${idx}
52f0: 0d 0a 7d 0d 0a 0d 0a 23 20 70 6f 6c 61 72 54 6f  ..}....# polarTo
5300: 50 69 78 65 6c 20 2d 2d 0d 0a 23 20 20 20 20 43  Pixel --..#    C
5310: 6f 6e 76 65 72 74 20 70 6f 6c 61 72 20 63 6f 6f  onvert polar coo
5320: 72 64 69 6e 61 74 65 73 20 74 6f 20 70 69 78 65  rdinates to pixe
5330: 6c 20 63 6f 6f 72 64 69 6e 61 74 65 73 0d 0a 23  l coordinates..#
5340: 20 41 72 67 75 6d 65 6e 74 73 3a 0d 0a 23 20 20   Arguments:..#  
5350: 20 20 77 20 20 20 20 20 20 20 20 20 20 20 4e 61    w           Na
5360: 6d 65 20 6f 66 20 74 68 65 20 63 61 6e 76 61 73  me of the canvas
5370: 0d 0a 23 20 20 20 20 72 61 64 20 20 20 20 20 20  ..#    rad      
5380: 20 20 20 52 61 64 69 75 73 20 6f 66 20 74 68 65     Radius of the
5390: 20 70 6f 69 6e 74 0d 0a 23 20 20 20 20 70 68 69   point..#    phi
53a0: 20 20 20 20 20 20 20 20 20 41 6e 67 6c 65 20 6f           Angle o
53b0: 66 20 74 68 65 20 70 6f 69 6e 74 20 28 64 65 67  f the point (deg
53c0: 72 65 65 73 29 0d 0a 23 20 52 65 73 75 6c 74 3a  rees)..# Result:
53d0: 0d 0a 23 20 20 20 20 4c 69 73 74 20 6f 66 20 74  ..#    List of t
53e0: 77 6f 20 65 6c 65 6d 65 6e 74 73 2c 20 78 2d 20  wo elements, x- 
53f0: 61 6e 64 20 79 2d 63 6f 6f 72 64 69 6e 61 74 65  and y-coordinate
5400: 73 20 69 6e 20 70 69 78 65 6c 73 0d 0a 23 0d 0a  s in pixels..#..
5410: 70 72 6f 63 20 3a 3a 50 6c 6f 74 63 68 61 72 74  proc ::Plotchart
5420: 3a 3a 70 6f 6c 61 72 54 6f 50 69 78 65 6c 20 7b  ::polarToPixel {
5430: 20 77 20 72 61 64 20 70 68 69 20 7d 20 7b 0d 0a   w rad phi } {..
5440: 20 20 20 76 61 72 69 61 62 6c 65 20 74 6f 72 61     variable tora
5450: 64 0d 0a 0d 0a 20 20 20 73 65 74 20 78 63 72 64  d....   set xcrd
5460: 20 5b 65 78 70 72 20 7b 24 72 61 64 2a 63 6f 73   [expr {$rad*cos
5470: 28 24 70 68 69 2a 24 74 6f 72 61 64 29 7d 5d 0d  ($phi*$torad)}].
5480: 0a 20 20 20 73 65 74 20 79 63 72 64 20 5b 65 78  .   set ycrd [ex
5490: 70 72 20 7b 24 72 61 64 2a 73 69 6e 28 24 70 68  pr {$rad*sin($ph
54a0: 69 2a 24 74 6f 72 61 64 29 7d 5d 0d 0a 0d 0a 20  i*$torad)}].... 
54b0: 20 20 63 6f 6f 72 64 73 54 6f 50 69 78 65 6c 20    coordsToPixel 
54c0: 24 77 20 24 78 63 72 64 20 24 79 63 72 64 0d 0a  $w $xcrd $ycrd..
54d0: 7d 0d 0a 0d 0a 23 20 63 72 65 61 74 65 58 59 50  }....# createXYP
54e0: 6c 6f 74 20 2d 2d 0d 0a 23 20 20 20 20 43 72 65  lot --..#    Cre
54f0: 61 74 65 20 61 20 63 6f 6d 6d 61 6e 64 20 66 6f  ate a command fo
5500: 72 20 64 72 61 77 69 6e 67 20 61 6e 20 58 59 20  r drawing an XY 
5510: 70 6c 6f 74 0d 0a 23 20 41 72 67 75 6d 65 6e 74  plot..# Argument
5520: 73 3a 0d 0a 23 20 20 20 20 77 20 20 20 20 20 20  s:..#    w      
5530: 20 20 20 20 20 4e 61 6d 65 20 6f 66 20 74 68 65       Name of the
5540: 20 63 61 6e 76 61 73 0d 0a 23 20 20 20 20 78 73   canvas..#    xs
5550: 63 61 6c 65 20 20 20 20 20 20 4d 69 6e 69 6d 75  cale      Minimu
5560: 6d 2c 20 6d 61 78 69 6d 75 6d 20 61 6e 64 20 73  m, maximum and s
5570: 74 65 70 20 66 6f 72 20 78 2d 61 78 69 73 20 28  tep for x-axis (
5580: 69 6e 69 74 69 61 6c 29 0d 0a 23 20 20 20 20 79  initial)..#    y
5590: 73 63 61 6c 65 20 20 20 20 20 20 4d 69 6e 69 6d  scale      Minim
55a0: 75 6d 2c 20 6d 61 78 69 6d 75 6d 20 61 6e 64 20  um, maximum and 
55b0: 73 74 65 70 20 66 6f 72 20 79 2d 61 78 69 73 0d  step for y-axis.
55c0: 0a 23 20 52 65 73 75 6c 74 3a 0d 0a 23 20 20 20  .# Result:..#   
55d0: 20 4e 61 6d 65 20 6f 66 20 61 20 6e 65 77 20 63   Name of a new c
55e0: 6f 6d 6d 61 6e 64 0d 0a 23 20 4e 6f 74 65 3a 0d  ommand..# Note:.
55f0: 0a 23 20 20 20 20 54 68 65 20 65 6e 74 69 72 65  .#    The entire
5600: 20 63 61 6e 76 61 73 20 77 69 6c 6c 20 62 65 20   canvas will be 
5610: 64 65 64 69 63 61 74 65 64 20 74 6f 20 74 68 65  dedicated to the
5620: 20 58 59 20 70 6c 6f 74 2e 0d 0a 23 20 20 20 20   XY plot...#    
5630: 54 68 65 20 70 6c 6f 74 20 77 69 6c 6c 20 62 65  The plot will be
5640: 20 64 72 61 77 6e 20 77 69 74 68 20 61 78 65 73   drawn with axes
5650: 0d 0a 23 0d 0a 70 72 6f 63 20 3a 3a 50 6c 6f 74  ..#..proc ::Plot
5660: 63 68 61 72 74 3a 3a 63 72 65 61 74 65 58 59 50  chart::createXYP
5670: 6c 6f 74 20 7b 20 77 20 78 73 63 61 6c 65 20 79  lot { w xscale y
5680: 73 63 61 6c 65 20 7d 20 7b 0d 0a 20 20 20 76 61  scale } {..   va
5690: 72 69 61 62 6c 65 20 64 61 74 61 5f 73 65 72 69  riable data_seri
56a0: 65 73 0d 0a 0d 0a 20 20 20 66 6f 72 65 61 63 68  es....   foreach
56b0: 20 73 20 5b 61 72 72 61 79 20 6e 61 6d 65 73 20   s [array names 
56c0: 64 61 74 61 5f 73 65 72 69 65 73 20 22 24 77 2c  data_series "$w,
56d0: 2a 22 5d 20 7b 0d 0a 20 20 20 20 20 20 75 6e 73  *"] {..      uns
56e0: 65 74 20 64 61 74 61 5f 73 65 72 69 65 73 28 24  et data_series($
56f0: 73 29 0d 0a 20 20 20 7d 0d 0a 0d 0a 20 20 20 73  s)..   }....   s
5700: 65 74 20 6e 65 77 63 68 61 72 74 20 22 78 79 70  et newchart "xyp
5710: 6c 6f 74 5f 24 77 22 0d 0a 20 20 20 69 6e 74 65  lot_$w"..   inte
5720: 72 70 20 61 6c 69 61 73 20 7b 7d 20 24 6e 65 77  rp alias {} $new
5730: 63 68 61 72 74 20 7b 7d 20 3a 3a 50 6c 6f 74 63  chart {} ::Plotc
5740: 68 61 72 74 3a 3a 50 6c 6f 74 48 61 6e 64 6c 65  hart::PlotHandle
5750: 72 20 78 79 70 6c 6f 74 20 24 77 0d 0a 0d 0a 20  r xyplot $w.... 
5760: 20 20 66 6f 72 65 61 63 68 20 7b 70 78 6d 69 6e    foreach {pxmin
5770: 20 70 79 6d 69 6e 20 70 78 6d 61 78 20 70 79 6d   pymin pxmax pym
5780: 61 78 7d 20 5b 4d 61 72 67 69 6e 73 52 65 63 74  ax} [MarginsRect
5790: 61 6e 67 6c 65 20 24 77 5d 20 7b 62 72 65 61 6b  angle $w] {break
57a0: 7d 0d 0a 0d 0a 20 20 20 66 6f 72 65 61 63 68 20  }....   foreach 
57b0: 7b 78 6d 69 6e 20 78 6d 61 78 20 78 64 65 6c 74  {xmin xmax xdelt
57c0: 7d 20 24 78 73 63 61 6c 65 20 7b 62 72 65 61 6b  } $xscale {break
57d0: 7d 0d 0a 20 20 20 66 6f 72 65 61 63 68 20 7b 79  }..   foreach {y
57e0: 6d 69 6e 20 79 6d 61 78 20 79 64 65 6c 74 7d 20  min ymax ydelt} 
57f0: 24 79 73 63 61 6c 65 20 7b 62 72 65 61 6b 7d 0d  $yscale {break}.
5800: 0a 0d 0a 20 20 20 69 66 20 7b 20 24 78 64 65 6c  ...   if { $xdel
5810: 74 20 3d 3d 20 30 2e 30 20 7c 7c 20 24 79 64 65  t == 0.0 || $yde
5820: 6c 74 20 3d 3d 20 30 2e 30 20 7d 20 7b 0d 0a 20  lt == 0.0 } {.. 
5830: 20 20 20 20 20 72 65 74 75 72 6e 20 2d 63 6f 64       return -cod
5840: 65 20 65 72 72 6f 72 20 22 53 74 65 70 20 73 69  e error "Step si
5850: 7a 65 20 63 61 6e 20 6e 6f 74 20 62 65 20 7a 65  ze can not be ze
5860: 72 6f 22 0d 0a 20 20 20 7d 0d 0a 0d 0a 20 20 20  ro"..   }....   
5870: 69 66 20 7b 20 28 24 78 6d 61 78 2d 24 78 6d 69  if { ($xmax-$xmi
5880: 6e 29 2a 24 78 64 65 6c 74 20 3c 20 30 2e 30 20  n)*$xdelt < 0.0 
5890: 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65 74 20 78  } {..      set x
58a0: 64 65 6c 74 20 5b 65 78 70 72 20 7b 2d 24 78 64  delt [expr {-$xd
58b0: 65 6c 74 7d 5d 0d 0a 20 20 20 7d 0d 0a 20 20 20  elt}]..   }..   
58c0: 69 66 20 7b 20 28 24 79 6d 61 78 2d 24 79 6d 69  if { ($ymax-$ymi
58d0: 6e 29 2a 24 79 64 65 6c 74 20 3c 20 30 2e 30 20  n)*$ydelt < 0.0 
58e0: 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65 74 20 79  } {..      set y
58f0: 64 65 6c 74 20 5b 65 78 70 72 20 7b 2d 24 79 64  delt [expr {-$yd
5900: 65 6c 74 7d 5d 0d 0a 20 20 20 7d 0d 0a 0d 0a 20  elt}]..   }.... 
5910: 20 20 76 69 65 77 50 6f 72 74 20 20 20 20 20 20    viewPort      
5920: 20 20 20 24 77 20 24 70 78 6d 69 6e 20 24 70 79     $w $pxmin $py
5930: 6d 69 6e 20 24 70 78 6d 61 78 20 24 70 79 6d 61  min $pxmax $pyma
5940: 78 0d 0a 20 20 20 77 6f 72 6c 64 43 6f 6f 72 64  x..   worldCoord
5950: 69 6e 61 74 65 73 20 24 77 20 24 78 6d 69 6e 20  inates $w $xmin 
5960: 20 24 79 6d 69 6e 20 20 24 78 6d 61 78 20 20 24   $ymin  $xmax  $
5970: 79 6d 61 78 0d 0a 0d 0a 20 20 20 44 72 61 77 59  ymax....   DrawY
5980: 61 78 69 73 20 20 20 20 20 20 20 20 24 77 20 24  axis        $w $
5990: 79 6d 69 6e 20 20 24 79 6d 61 78 20 20 24 79 64  ymin  $ymax  $yd
59a0: 65 6c 74 0d 0a 20 20 20 44 72 61 77 58 61 78 69  elt..   DrawXaxi
59b0: 73 20 20 20 20 20 20 20 20 24 77 20 24 78 6d 69  s        $w $xmi
59c0: 6e 20 20 24 78 6d 61 78 20 20 24 78 64 65 6c 74  n  $xmax  $xdelt
59d0: 0d 0a 20 20 20 44 72 61 77 4d 61 73 6b 20 20 20  ..   DrawMask   
59e0: 20 20 20 20 20 20 24 77 0d 0a 20 20 20 44 65 66        $w..   Def
59f0: 61 75 6c 74 4c 65 67 65 6e 64 20 20 20 20 24 77  aultLegend    $w
5a00: 0d 0a 20 20 20 44 65 66 61 75 6c 74 42 61 6c 6c  ..   DefaultBall
5a10: 6f 6f 6e 20 20 20 24 77 0d 0a 0d 0a 20 20 20 72  oon   $w....   r
5a20: 65 74 75 72 6e 20 24 6e 65 77 63 68 61 72 74 0d  eturn $newchart.
5a30: 0a 7d 0d 0a 0d 0a 23 20 63 72 65 61 74 65 53 74  .}....# createSt
5a40: 72 69 70 63 68 61 72 74 20 2d 2d 0d 0a 23 20 20  ripchart --..#  
5a50: 20 20 43 72 65 61 74 65 20 61 20 63 6f 6d 6d 61    Create a comma
5a60: 6e 64 20 66 6f 72 20 64 72 61 77 69 6e 67 20 61  nd for drawing a
5a70: 20 73 74 72 69 70 20 63 68 61 72 74 0d 0a 23 20   strip chart..# 
5a80: 41 72 67 75 6d 65 6e 74 73 3a 0d 0a 23 20 20 20  Arguments:..#   
5a90: 20 77 20 20 20 20 20 20 20 20 20 20 20 4e 61 6d   w           Nam
5aa0: 65 20 6f 66 20 74 68 65 20 63 61 6e 76 61 73 0d  e of the canvas.
5ab0: 0a 23 20 20 20 20 78 73 63 61 6c 65 20 20 20 20  .#    xscale    
5ac0: 20 20 4d 69 6e 69 6d 75 6d 2c 20 6d 61 78 69 6d    Minimum, maxim
5ad0: 75 6d 20 61 6e 64 20 73 74 65 70 20 66 6f 72 20  um and step for 
5ae0: 78 2d 61 78 69 73 20 28 69 6e 69 74 69 61 6c 29  x-axis (initial)
5af0: 0d 0a 23 20 20 20 20 79 73 63 61 6c 65 20 20 20  ..#    yscale   
5b00: 20 20 20 4d 69 6e 69 6d 75 6d 2c 20 6d 61 78 69     Minimum, maxi
5b10: 6d 75 6d 20 61 6e 64 20 73 74 65 70 20 66 6f 72  mum and step for
5b20: 20 79 2d 61 78 69 73 0d 0a 23 20 52 65 73 75 6c   y-axis..# Resul
5b30: 74 3a 0d 0a 23 20 20 20 20 4e 61 6d 65 20 6f 66  t:..#    Name of
5b40: 20 61 20 6e 65 77 20 63 6f 6d 6d 61 6e 64 0d 0a   a new command..
5b50: 23 20 4e 6f 74 65 3a 0d 0a 23 20 20 20 20 54 68  # Note:..#    Th
5b60: 65 20 65 6e 74 69 72 65 20 63 61 6e 76 61 73 20  e entire canvas 
5b70: 77 69 6c 6c 20 62 65 20 64 65 64 69 63 61 74 65  will be dedicate
5b80: 64 20 74 6f 20 74 68 65 20 73 74 72 69 70 63 68  d to the stripch
5b90: 61 72 74 2e 0d 0a 23 20 20 20 20 54 68 65 20 73  art...#    The s
5ba0: 74 72 69 70 63 68 61 72 74 20 77 69 6c 6c 20 62  tripchart will b
5bb0: 65 20 64 72 61 77 6e 20 77 69 74 68 20 61 78 65  e drawn with axe
5bc0: 73 0d 0a 23 0d 0a 70 72 6f 63 20 3a 3a 50 6c 6f  s..#..proc ::Plo
5bd0: 74 63 68 61 72 74 3a 3a 63 72 65 61 74 65 53 74  tchart::createSt
5be0: 72 69 70 63 68 61 72 74 20 7b 20 77 20 78 73 63  ripchart { w xsc
5bf0: 61 6c 65 20 79 73 63 61 6c 65 20 7d 20 7b 0d 0a  ale yscale } {..
5c00: 20 20 20 76 61 72 69 61 62 6c 65 20 64 61 74 61     variable data
5c10: 5f 73 65 72 69 65 73 0d 0a 0d 0a 20 20 20 73 65  _series....   se
5c20: 74 20 6e 65 77 63 68 61 72 74 20 5b 63 72 65 61  t newchart [crea
5c30: 74 65 58 59 50 6c 6f 74 20 24 77 20 24 78 73 63  teXYPlot $w $xsc
5c40: 61 6c 65 20 24 79 73 63 61 6c 65 5d 0d 0a 0d 0a  ale $yscale]....
5c50: 20 20 20 69 6e 74 65 72 70 20 61 6c 69 61 73 20     interp alias 
5c60: 7b 7d 20 24 6e 65 77 63 68 61 72 74 20 7b 7d 0d  {} $newchart {}.
5c70: 0a 0d 0a 20 20 20 73 65 74 20 6e 65 77 63 68 61  ...   set newcha
5c80: 72 74 20 22 73 74 72 69 70 63 68 61 72 74 5f 24  rt "stripchart_$
5c90: 77 22 0d 0a 20 20 20 69 6e 74 65 72 70 20 61 6c  w"..   interp al
5ca0: 69 61 73 20 7b 7d 20 24 6e 65 77 63 68 61 72 74  ias {} $newchart
5cb0: 20 7b 7d 20 3a 3a 50 6c 6f 74 63 68 61 72 74 3a   {} ::Plotchart:
5cc0: 3a 50 6c 6f 74 48 61 6e 64 6c 65 72 20 73 74 72  :PlotHandler str
5cd0: 69 70 63 68 61 72 74 20 24 77 0d 0a 0d 0a 20 20  ipchart $w....  
5ce0: 20 72 65 74 75 72 6e 20 24 6e 65 77 63 68 61 72   return $newchar
5cf0: 74 0d 0a 7d 0d 0a 0d 0a 23 20 63 72 65 61 74 65  t..}....# create
5d00: 49 73 6f 6d 65 74 72 69 63 50 6c 6f 74 20 2d 2d  IsometricPlot --
5d10: 0d 0a 23 20 20 20 20 43 72 65 61 74 65 20 61 20  ..#    Create a 
5d20: 63 6f 6d 6d 61 6e 64 20 66 6f 72 20 64 72 61 77  command for draw
5d30: 69 6e 67 20 61 6e 20 22 69 73 6f 6d 65 74 72 69  ing an "isometri
5d40: 63 22 20 70 6c 6f 74 0d 0a 23 20 41 72 67 75 6d  c" plot..# Argum
5d50: 65 6e 74 73 3a 0d 0a 23 20 20 20 20 77 20 20 20  ents:..#    w   
5d60: 20 20 20 20 20 20 20 20 4e 61 6d 65 20 6f 66 20          Name of 
5d70: 74 68 65 20 63 61 6e 76 61 73 0d 0a 23 20 20 20  the canvas..#   
5d80: 20 78 73 63 61 6c 65 20 20 20 20 20 20 4d 69 6e   xscale      Min
5d90: 69 6d 75 6d 20 61 6e 64 20 6d 61 78 69 6d 75 6d  imum and maximum
5da0: 20 66 6f 72 20 78 2d 61 78 69 73 0d 0a 23 20 20   for x-axis..#  
5db0: 20 20 79 73 63 61 6c 65 20 20 20 20 20 20 4d 69    yscale      Mi
5dc0: 6e 69 6d 75 6d 20 61 6e 64 20 6d 61 78 69 6d 75  nimum and maximu
5dd0: 6d 20 66 6f 72 20 79 2d 61 78 69 73 0d 0a 23 20  m for y-axis..# 
5de0: 20 20 20 73 74 65 70 73 69 7a 65 20 20 20 20 53     stepsize    S
5df0: 74 65 70 20 73 69 7a 65 20 66 6f 72 20 6e 75 6d  tep size for num
5e00: 62 65 72 73 20 6f 6e 20 74 68 65 20 61 78 65 73  bers on the axes
5e10: 20 6f 72 20 22 6e 6f 61 78 65 73 22 0d 0a 23 20   or "noaxes"..# 
5e20: 52 65 73 75 6c 74 3a 0d 0a 23 20 20 20 20 4e 61  Result:..#    Na
5e30: 6d 65 20 6f 66 20 61 20 6e 65 77 20 63 6f 6d 6d  me of a new comm
5e40: 61 6e 64 0d 0a 23 20 4e 6f 74 65 3a 0d 0a 23 20  and..# Note:..# 
5e50: 20 20 20 54 68 65 20 65 6e 74 69 72 65 20 63 61     The entire ca
5e60: 6e 76 61 73 20 77 69 6c 6c 20 62 65 20 64 65 64  nvas will be ded
5e70: 69 63 61 74 65 64 20 74 6f 20 74 68 65 20 70 6c  icated to the pl
5e80: 6f 74 0d 0a 23 20 20 20 20 54 68 65 20 70 6c 6f  ot..#    The plo
5e90: 74 20 77 69 6c 6c 20 62 65 20 64 72 61 77 6e 20  t will be drawn 
5ea0: 77 69 74 68 20 6f 72 20 77 69 74 68 6f 75 74 20  with or without 
5eb0: 61 78 65 73 0d 0a 23 0d 0a 70 72 6f 63 20 3a 3a  axes..#..proc ::
5ec0: 50 6c 6f 74 63 68 61 72 74 3a 3a 63 72 65 61 74  Plotchart::creat
5ed0: 65 49 73 6f 6d 65 74 72 69 63 50 6c 6f 74 20 7b  eIsometricPlot {
5ee0: 20 77 20 78 73 63 61 6c 65 20 79 73 63 61 6c 65   w xscale yscale
5ef0: 20 73 74 65 70 73 69 7a 65 20 7d 20 7b 0d 0a 20   stepsize } {.. 
5f00: 20 20 76 61 72 69 61 62 6c 65 20 64 61 74 61 5f    variable data_
5f10: 73 65 72 69 65 73 0d 0a 0d 0a 20 20 20 66 6f 72  series....   for
5f20: 65 61 63 68 20 73 20 5b 61 72 72 61 79 20 6e 61  each s [array na
5f30: 6d 65 73 20 64 61 74 61 5f 73 65 72 69 65 73 20  mes data_series 
5f40: 22 24 77 2c 2a 22 5d 20 7b 0d 0a 20 20 20 20 20  "$w,*"] {..     
5f50: 20 75 6e 73 65 74 20 64 61 74 61 5f 73 65 72 69   unset data_seri
5f60: 65 73 28 24 73 29 0d 0a 20 20 20 7d 0d 0a 0d 0a  es($s)..   }....
5f70: 20 20 20 73 65 74 20 6e 65 77 63 68 61 72 74 20     set newchart 
5f80: 22 69 73 6f 6d 65 74 72 69 63 5f 24 77 22 0d 0a  "isometric_$w"..
5f90: 20 20 20 69 6e 74 65 72 70 20 61 6c 69 61 73 20     interp alias 
5fa0: 7b 7d 20 24 6e 65 77 63 68 61 72 74 20 7b 7d 20  {} $newchart {} 
5fb0: 3a 3a 50 6c 6f 74 63 68 61 72 74 3a 3a 50 6c 6f  ::Plotchart::Plo
5fc0: 74 48 61 6e 64 6c 65 72 20 69 73 6f 6d 65 74 72  tHandler isometr
5fd0: 69 63 20 24 77 0d 0a 0d 0a 20 20 20 69 66 20 7b  ic $w....   if {
5fe0: 20 24 73 74 65 70 73 69 7a 65 20 21 3d 20 22 6e   $stepsize != "n
5ff0: 6f 61 78 65 73 22 20 7d 20 7b 0d 0a 20 20 20 20  oaxes" } {..    
6000: 20 20 66 6f 72 65 61 63 68 20 7b 70 78 6d 69 6e    foreach {pxmin
6010: 20 70 79 6d 69 6e 20 70 78 6d 61 78 20 70 79 6d   pymin pxmax pym
6020: 61 78 7d 20 5b 4d 61 72 67 69 6e 73 52 65 63 74  ax} [MarginsRect
6030: 61 6e 67 6c 65 20 24 77 5d 20 7b 62 72 65 61 6b  angle $w] {break
6040: 7d 0d 0a 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a  }..   } else {..
6050: 20 20 20 20 20 20 73 65 74 20 70 78 6d 69 6e 20        set pxmin 
6060: 30 0d 0a 20 20 20 20 20 20 73 65 74 20 70 79 6d  0..      set pym
6070: 69 6e 20 30 0d 0a 20 20 20 20 20 20 23 73 65 74  in 0..      #set
6080: 20 70 78 6d 61 78 20 5b 24 77 20 63 67 65 74 20   pxmax [$w cget 
6090: 2d 77 69 64 74 68 5d 0d 0a 20 20 20 20 20 20 23  -width]..      #
60a0: 73 65 74 20 70 79 6d 61 78 20 5b 24 77 20 63 67  set pymax [$w cg
60b0: 65 74 20 2d 68 65 69 67 68 74 5d 0d 0a 20 20 20  et -height]..   
60c0: 20 20 20 73 65 74 20 70 78 6d 61 78 20 5b 57 69     set pxmax [Wi
60d0: 64 74 68 43 61 6e 76 61 73 20 24 77 5d 0d 0a 20  dthCanvas $w].. 
60e0: 20 20 20 20 20 73 65 74 20 70 79 6d 61 78 20 5b       set pymax [
60f0: 48 65 69 67 68 74 43 61 6e 76 61 73 20 24 77 5d  HeightCanvas $w]
6100: 0d 0a 20 20 20 7d 0d 0a 0d 0a 20 20 20 66 6f 72  ..   }....   for
6110: 65 61 63 68 20 7b 78 6d 69 6e 20 78 6d 61 78 7d  each {xmin xmax}
6120: 20 24 78 73 63 61 6c 65 20 7b 62 72 65 61 6b 7d   $xscale {break}
6130: 0d 0a 20 20 20 66 6f 72 65 61 63 68 20 7b 79 6d  ..   foreach {ym
6140: 69 6e 20 79 6d 61 78 7d 20 24 79 73 63 61 6c 65  in ymax} $yscale
6150: 20 7b 62 72 65 61 6b 7d 0d 0a 0d 0a 20 20 20 69   {break}....   i
6160: 66 20 7b 20 24 78 6d 69 6e 20 3d 3d 20 24 78 6d  f { $xmin == $xm
6170: 61 78 20 7c 7c 20 24 79 6d 69 6e 20 3d 3d 20 24  ax || $ymin == $
6180: 79 6d 61 78 20 7d 20 7b 0d 0a 20 20 20 20 20 20  ymax } {..      
6190: 72 65 74 75 72 6e 20 2d 63 6f 64 65 20 65 72 72  return -code err
61a0: 6f 72 20 22 45 78 74 72 65 6d 65 73 20 66 6f 72  or "Extremes for
61b0: 20 61 78 65 73 20 6d 75 73 74 20 62 65 20 64 69   axes must be di
61c0: 66 66 65 72 65 6e 74 22 0d 0a 20 20 20 7d 0d 0a  fferent"..   }..
61d0: 0d 0a 20 20 20 76 69 65 77 50 6f 72 74 20 20 20  ..   viewPort   
61e0: 20 20 20 20 20 20 24 77 20 24 70 78 6d 69 6e 20        $w $pxmin 
61f0: 24 70 79 6d 69 6e 20 24 70 78 6d 61 78 20 24 70  $pymin $pxmax $p
6200: 79 6d 61 78 0d 0a 20 20 20 53 63 61 6c 65 49 73  ymax..   ScaleIs
6210: 6f 6d 65 74 72 69 63 20 20 20 24 77 20 24 78 6d  ometric   $w $xm
6220: 69 6e 20 20 24 79 6d 69 6e 20 20 24 78 6d 61 78  in  $ymin  $xmax
6230: 20 20 24 79 6d 61 78 0d 0a 0d 0a 20 20 20 69 66    $ymax....   if
6240: 20 7b 20 24 73 74 65 70 73 69 7a 65 20 21 3d 20   { $stepsize != 
6250: 22 6e 6f 61 78 65 73 22 20 7d 20 7b 0d 0a 20 20  "noaxes" } {..  
6260: 20 20 20 20 44 72 61 77 59 61 78 69 73 20 20 20      DrawYaxis   
6270: 20 20 20 20 20 24 77 20 24 79 6d 69 6e 20 20 24       $w $ymin  $
6280: 79 6d 61 78 20 20 24 79 64 65 6c 74 0d 0a 20 20  ymax  $ydelt..  
6290: 20 20 20 20 44 72 61 77 58 61 78 69 73 20 20 20      DrawXaxis   
62a0: 20 20 20 20 20 24 77 20 24 78 6d 69 6e 20 20 24       $w $xmin  $
62b0: 78 6d 61 78 20 20 24 78 64 65 6c 74 0d 0a 20 20  xmax  $xdelt..  
62c0: 20 20 20 20 44 72 61 77 4d 61 73 6b 20 20 20 20      DrawMask    
62d0: 20 20 20 20 20 24 77 0d 0a 20 20 20 7d 0d 0a 20       $w..   }.. 
62e0: 20 20 44 65 66 61 75 6c 74 4c 65 67 65 6e 64 20    DefaultLegend 
62f0: 20 24 77 0d 0a 20 20 20 44 65 66 61 75 6c 74 42   $w..   DefaultB
6300: 61 6c 6c 6f 6f 6e 20 24 77 0d 0a 0d 0a 20 20 20  alloon $w....   
6310: 72 65 74 75 72 6e 20 24 6e 65 77 63 68 61 72 74  return $newchart
6320: 0d 0a 7d 0d 0a 0d 0a 23 20 63 72 65 61 74 65 48  ..}....# createH
6330: 69 73 74 6f 67 72 61 6d 20 2d 2d 0d 0a 23 20 20  istogram --..#  
6340: 20 20 43 72 65 61 74 65 20 61 20 63 6f 6d 6d 61    Create a comma
6350: 6e 64 20 66 6f 72 20 64 72 61 77 69 6e 67 20 61  nd for drawing a
6360: 20 68 69 73 74 6f 67 72 61 6d 0d 0a 23 20 41 72   histogram..# Ar
6370: 67 75 6d 65 6e 74 73 3a 0d 0a 23 20 20 20 20 77  guments:..#    w
6380: 20 20 20 20 20 20 20 20 20 20 20 4e 61 6d 65 20             Name 
6390: 6f 66 20 74 68 65 20 63 61 6e 76 61 73 0d 0a 23  of the canvas..#
63a0: 20 20 20 20 78 73 63 61 6c 65 20 20 20 20 20 20      xscale      
63b0: 4d 69 6e 69 6d 75 6d 2c 20 6d 61 78 69 6d 75 6d  Minimum, maximum
63c0: 20 61 6e 64 20 73 74 65 70 20 66 6f 72 20 78 2d   and step for x-
63d0: 61 78 69 73 20 28 69 6e 69 74 69 61 6c 29 0d 0a  axis (initial)..
63e0: 23 20 20 20 20 79 73 63 61 6c 65 20 20 20 20 20  #    yscale     
63f0: 20 4d 69 6e 69 6d 75 6d 2c 20 6d 61 78 69 6d 75   Minimum, maximu
6400: 6d 20 61 6e 64 20 73 74 65 70 20 66 6f 72 20 79  m and step for y
6410: 2d 61 78 69 73 0d 0a 23 20 52 65 73 75 6c 74 3a  -axis..# Result:
6420: 0d 0a 23 20 20 20 20 4e 61 6d 65 20 6f 66 20 61  ..#    Name of a
6430: 20 6e 65 77 20 63 6f 6d 6d 61 6e 64 0d 0a 23 20   new command..# 
6440: 4e 6f 74 65 3a 0d 0a 23 20 20 20 20 54 68 65 20  Note:..#    The 
6450: 65 6e 74 69 72 65 20 63 61 6e 76 61 73 20 77 69  entire canvas wi
6460: 6c 6c 20 62 65 20 64 65 64 69 63 61 74 65 64 20  ll be dedicated 
6470: 74 6f 20 74 68 65 20 68 69 73 74 6f 67 72 61 6d  to the histogram
6480: 2e 0d 0a 23 20 20 20 20 54 68 65 20 70 6c 6f 74  ...#    The plot
6490: 20 77 69 6c 6c 20 62 65 20 64 72 61 77 6e 20 77   will be drawn w
64a0: 69 74 68 20 61 78 65 73 0d 0a 23 20 20 20 20 54  ith axes..#    T
64b0: 68 69 73 20 69 73 20 61 6c 6d 6f 73 74 20 74 68  his is almost th
64c0: 65 20 73 61 6d 65 20 63 6f 64 65 20 61 73 20 66  e same code as f
64d0: 6f 72 20 61 6e 20 58 59 20 70 6c 6f 74 0d 0a 23  or an XY plot..#
64e0: 0d 0a 70 72 6f 63 20 3a 3a 50 6c 6f 74 63 68 61  ..proc ::Plotcha
64f0: 72 74 3a 3a 63 72 65 61 74 65 48 69 73 74 6f 67  rt::createHistog
6500: 72 61 6d 20 7b 20 77 20 78 73 63 61 6c 65 20 79  ram { w xscale y
6510: 73 63 61 6c 65 20 7d 20 7b 0d 0a 20 20 20 76 61  scale } {..   va
6520: 72 69 61 62 6c 65 20 64 61 74 61 5f 73 65 72 69  riable data_seri
6530: 65 73 0d 0a 0d 0a 20 20 20 66 6f 72 65 61 63 68  es....   foreach
6540: 20 73 20 5b 61 72 72 61 79 20 6e 61 6d 65 73 20   s [array names 
6550: 64 61 74 61 5f 73 65 72 69 65 73 20 22 24 77 2c  data_series "$w,
6560: 2a 22 5d 20 7b 0d 0a 20 20 20 20 20 20 75 6e 73  *"] {..      uns
6570: 65 74 20 64 61 74 61 5f 73 65 72 69 65 73 28 24  et data_series($
6580: 73 29 0d 0a 20 20 20 7d 0d 0a 0d 0a 20 20 20 73  s)..   }....   s
6590: 65 74 20 6e 65 77 63 68 61 72 74 20 22 68 69 73  et newchart "his
65a0: 74 6f 67 72 61 6d 5f 24 77 22 0d 0a 20 20 20 69  togram_$w"..   i
65b0: 6e 74 65 72 70 20 61 6c 69 61 73 20 7b 7d 20 24  nterp alias {} $
65c0: 6e 65 77 63 68 61 72 74 20 7b 7d 20 3a 3a 50 6c  newchart {} ::Pl
65d0: 6f 74 63 68 61 72 74 3a 3a 50 6c 6f 74 48 61 6e  otchart::PlotHan
65e0: 64 6c 65 72 20 68 69 73 74 6f 67 72 61 6d 20 24  dler histogram $
65f0: 77 0d 0a 0d 0a 20 20 20 66 6f 72 65 61 63 68 20  w....   foreach 
6600: 7b 70 78 6d 69 6e 20 70 79 6d 69 6e 20 70 78 6d  {pxmin pymin pxm
6610: 61 78 20 70 79 6d 61 78 7d 20 5b 4d 61 72 67 69  ax pymax} [Margi
6620: 6e 73 52 65 63 74 61 6e 67 6c 65 20 24 77 5d 20  nsRectangle $w] 
6630: 7b 62 72 65 61 6b 7d 0d 0a 0d 0a 20 20 20 66 6f  {break}....   fo
6640: 72 65 61 63 68 20 7b 78 6d 69 6e 20 78 6d 61 78  reach {xmin xmax
6650: 20 78 64 65 6c 74 7d 20 24 78 73 63 61 6c 65 20   xdelt} $xscale 
6660: 7b 62 72 65 61 6b 7d 0d 0a 20 20 20 66 6f 72 65  {break}..   fore
6670: 61 63 68 20 7b 79 6d 69 6e 20 79 6d 61 78 20 79  ach {ymin ymax y
6680: 64 65 6c 74 7d 20 24 79 73 63 61 6c 65 20 7b 62  delt} $yscale {b
6690: 72 65 61 6b 7d 0d 0a 0d 0a 20 20 20 69 66 20 7b  reak}....   if {
66a0: 20 24 78 64 65 6c 74 20 3d 3d 20 30 2e 30 20 7c   $xdelt == 0.0 |
66b0: 7c 20 24 79 64 65 6c 74 20 3d 3d 20 30 2e 30 20  | $ydelt == 0.0 
66c0: 7d 20 7b 0d 0a 20 20 20 20 20 20 72 65 74 75 72  } {..      retur
66d0: 6e 20 2d 63 6f 64 65 20 65 72 72 6f 72 20 22 53  n -code error "S
66e0: 74 65 70 20 73 69 7a 65 20 63 61 6e 20 6e 6f 74  tep size can not
66f0: 20 62 65 20 7a 65 72 6f 22 0d 0a 20 20 20 7d 0d   be zero"..   }.
6700: 0a 0d 0a 20 20 20 69 66 20 7b 20 28 24 78 6d 61  ...   if { ($xma
6710: 78 2d 24 78 6d 69 6e 29 2a 24 78 64 65 6c 74 20  x-$xmin)*$xdelt 
6720: 3c 20 30 2e 30 20 7d 20 7b 0d 0a 20 20 20 20 20  < 0.0 } {..     
6730: 20 73 65 74 20 78 64 65 6c 74 20 5b 65 78 70 72   set xdelt [expr
6740: 20 7b 2d 24 78 64 65 6c 74 7d 5d 0d 0a 20 20 20   {-$xdelt}]..   
6750: 7d 0d 0a 20 20 20 69 66 20 7b 20 28 24 79 6d 61  }..   if { ($yma
6760: 78 2d 24 79 6d 69 6e 29 2a 24 79 64 65 6c 74 20  x-$ymin)*$ydelt 
6770: 3c 20 30 2e 30 20 7d 20 7b 0d 0a 20 20 20 20 20  < 0.0 } {..     
6780: 20 73 65 74 20 79 64 65 6c 74 20 5b 65 78 70 72   set ydelt [expr
6790: 20 7b 2d 24 79 64 65 6c 74 7d 5d 0d 0a 20 20 20   {-$ydelt}]..   
67a0: 7d 0d 0a 0d 0a 20 20 20 76 69 65 77 50 6f 72 74  }....   viewPort
67b0: 20 20 20 20 20 20 20 20 20 24 77 20 24 70 78 6d           $w $pxm
67c0: 69 6e 20 24 70 79 6d 69 6e 20 24 70 78 6d 61 78  in $pymin $pxmax
67d0: 20 24 70 79 6d 61 78 0d 0a 20 20 20 77 6f 72 6c   $pymax..   worl
67e0: 64 43 6f 6f 72 64 69 6e 61 74 65 73 20 24 77 20  dCoordinates $w 
67f0: 24 78 6d 69 6e 20 20 24 79 6d 69 6e 20 20 24 78  $xmin  $ymin  $x
6800: 6d 61 78 20 20 24 79 6d 61 78 0d 0a 0d 0a 20 20  max  $ymax....  
6810: 20 44 72 61 77 59 61 78 69 73 20 20 20 20 20 20   DrawYaxis      
6820: 20 20 24 77 20 24 79 6d 69 6e 20 20 24 79 6d 61    $w $ymin  $yma
6830: 78 20 20 24 79 64 65 6c 74 0d 0a 20 20 20 44 72  x  $ydelt..   Dr
6840: 61 77 58 61 78 69 73 20 20 20 20 20 20 20 20 24  awXaxis        $
6850: 77 20 24 78 6d 69 6e 20 20 24 78 6d 61 78 20 20  w $xmin  $xmax  
6860: 24 78 64 65 6c 74 0d 0a 20 20 20 44 72 61 77 4d  $xdelt..   DrawM
6870: 61 73 6b 20 20 20 20 20 20 20 20 20 24 77 0d 0a  ask         $w..
6880: 20 20 20 44 65 66 61 75 6c 74 4c 65 67 65 6e 64     DefaultLegend
6890: 20 20 20 20 24 77 0d 0a 20 20 20 44 65 66 61 75      $w..   Defau
68a0: 6c 74 42 61 6c 6c 6f 6f 6e 20 20 20 24 77 0d 0a  ltBalloon   $w..
68b0: 0d 0a 20 20 20 72 65 74 75 72 6e 20 24 6e 65 77  ..   return $new
68c0: 63 68 61 72 74 0d 0a 7d 0d 0a 0d 0a 23 20 63 72  chart..}....# cr
68d0: 65 61 74 65 50 69 65 63 68 61 72 74 20 2d 2d 0d  eatePiechart --.
68e0: 0a 23 20 20 20 20 43 72 65 61 74 65 20 61 20 63  .#    Create a c
68f0: 6f 6d 6d 61 6e 64 20 66 6f 72 20 64 72 61 77 69  ommand for drawi
6900: 6e 67 20 61 20 70 69 65 20 63 68 61 72 74 0d 0a  ng a pie chart..
6910: 23 20 41 72 67 75 6d 65 6e 74 73 3a 0d 0a 23 20  # Arguments:..# 
6920: 20 20 20 77 20 20 20 20 20 20 20 20 20 20 20 4e     w           N
6930: 61 6d 65 20 6f 66 20 74 68 65 20 63 61 6e 76 61  ame of the canva
6940: 73 0d 0a 23 20 52 65 73 75 6c 74 3a 0d 0a 23 20  s..# Result:..# 
6950: 20 20 20 4e 61 6d 65 20 6f 66 20 61 20 6e 65 77     Name of a new
6960: 20 63 6f 6d 6d 61 6e 64 0d 0a 23 20 4e 6f 74 65   command..# Note
6970: 3a 0d 0a 23 20 20 20 20 54 68 65 20 65 6e 74 69  :..#    The enti
6980: 72 65 20 63 61 6e 76 61 73 20 77 69 6c 6c 20 62  re canvas will b
6990: 65 20 64 65 64 69 63 61 74 65 64 20 74 6f 20 74  e dedicated to t
69a0: 68 65 20 70 69 65 20 63 68 61 72 74 2e 0d 0a 23  he pie chart...#
69b0: 0d 0a 70 72 6f 63 20 3a 3a 50 6c 6f 74 63 68 61  ..proc ::Plotcha
69c0: 72 74 3a 3a 63 72 65 61 74 65 50 69 65 63 68 61  rt::createPiecha
69d0: 72 74 20 7b 20 77 20 7d 20 7b 0d 0a 20 20 20 76  rt { w } {..   v
69e0: 61 72 69 61 62 6c 65 20 64 61 74 61 5f 73 65 72  ariable data_ser
69f0: 69 65 73 0d 0a 0d 0a 20 20 20 66 6f 72 65 61 63  ies....   foreac
6a00: 68 20 73 20 5b 61 72 72 61 79 20 6e 61 6d 65 73  h s [array names
6a10: 20 64 61 74 61 5f 73 65 72 69 65 73 20 22 24 77   data_series "$w
6a20: 2c 2a 22 5d 20 7b 0d 0a 20 20 20 20 20 20 75 6e  ,*"] {..      un
6a30: 73 65 74 20 64 61 74 61 5f 73 65 72 69 65 73 28  set data_series(
6a40: 24 73 29 0d 0a 20 20 20 7d 0d 0a 0d 0a 20 20 20  $s)..   }....   
6a50: 73 65 74 20 6e 65 77 63 68 61 72 74 20 22 70 69  set newchart "pi
6a60: 65 63 68 61 72 74 5f 24 77 22 0d 0a 20 20 20 69  echart_$w"..   i
6a70: 6e 74 65 72 70 20 61 6c 69 61 73 20 7b 7d 20 24  nterp alias {} $
6a80: 6e 65 77 63 68 61 72 74 20 7b 7d 20 3a 3a 50 6c  newchart {} ::Pl
6a90: 6f 74 63 68 61 72 74 3a 3a 50 6c 6f 74 48 61 6e  otchart::PlotHan
6aa0: 64 6c 65 72 20 70 69 65 63 68 61 72 74 20 24 77  dler piechart $w
6ab0: 0d 0a 0d 0a 20 20 20 66 6f 72 65 61 63 68 20 7b  ....   foreach {
6ac0: 70 78 6d 69 6e 20 70 79 6d 69 6e 20 70 78 6d 61  pxmin pymin pxma
6ad0: 78 20 70 79 6d 61 78 7d 20 5b 4d 61 72 67 69 6e  x pymax} [Margin
6ae0: 73 43 69 72 63 6c 65 20 24 77 5d 20 7b 62 72 65  sCircle $w] {bre
6af0: 61 6b 7d 0d 0a 0d 0a 20 20 20 76 69 65 77 50 6f  ak}....   viewPo
6b00: 72 74 20 24 77 20 24 70 78 6d 69 6e 20 24 70 79  rt $w $pxmin $py
6b10: 6d 69 6e 20 24 70 78 6d 61 78 20 24 70 79 6d 61  min $pxmax $pyma
6b20: 78 0d 0a 20 20 20 24 77 20 63 72 65 61 74 65 20  x..   $w create 
6b30: 6f 76 61 6c 20 24 70 78 6d 69 6e 20 24 70 79 6d  oval $pxmin $pym
6b40: 69 6e 20 24 70 78 6d 61 78 20 24 70 79 6d 61 78  in $pxmax $pymax
6b50: 0d 0a 0d 0a 20 20 20 53 65 74 43 6f 6c 6f 75 72  ....   SetColour
6b60: 73 20 24 77 20 62 6c 75 65 20 6c 69 67 68 74 62  s $w blue lightb
6b70: 6c 75 65 20 67 72 65 65 6e 20 79 65 6c 6c 6f 77  lue green yellow
6b80: 20 6f 72 61 6e 67 65 20 72 65 64 20 6d 61 67 65   orange red mage
6b90: 6e 74 61 20 62 72 6f 77 6e 0d 0a 20 20 20 44 65  nta brown..   De
6ba0: 66 61 75 6c 74 4c 65 67 65 6e 64 20 20 24 77 0d  faultLegend  $w.
6bb0: 0a 20 20 20 44 65 66 61 75 6c 74 42 61 6c 6c 6f  .   DefaultBallo
6bc0: 6f 6e 20 24 77 0d 0a 0d 0a 20 20 20 72 65 74 75  on $w....   retu
6bd0: 72 6e 20 24 6e 65 77 63 68 61 72 74 0d 0a 7d 0d  rn $newchart..}.
6be0: 0a 0d 0a 23 20 63 72 65 61 74 65 50 6f 6c 61 72  ...# createPolar
6bf0: 70 6c 6f 74 20 2d 2d 0d 0a 23 20 20 20 20 43 72  plot --..#    Cr
6c00: 65 61 74 65 20 61 20 63 6f 6d 6d 61 6e 64 20 66  eate a command f
6c10: 6f 72 20 64 72 61 77 69 6e 67 20 61 20 70 6f 6c  or drawing a pol
6c20: 61 72 20 70 6c 6f 74 0d 0a 23 20 41 72 67 75 6d  ar plot..# Argum
6c30: 65 6e 74 73 3a 0d 0a 23 20 20 20 20 77 20 20 20  ents:..#    w   
6c40: 20 20 20 20 20 20 20 20 20 20 4e 61 6d 65 20 6f            Name o
6c50: 66 20 74 68 65 20 63 61 6e 76 61 73 0d 0a 23 20  f the canvas..# 
6c60: 20 20 20 72 61 64 69 75 73 5f 64 61 74 61 20 20     radius_data  
6c70: 20 4d 61 78 69 6d 75 6d 20 72 61 64 69 75 73 20   Maximum radius 
6c80: 61 6e 64 20 73 74 65 70 0d 0a 23 20 52 65 73 75  and step..# Resu
6c90: 6c 74 3a 0d 0a 23 20 20 20 20 4e 61 6d 65 20 6f  lt:..#    Name o
6ca0: 66 20 61 20 6e 65 77 20 63 6f 6d 6d 61 6e 64 0d  f a new command.
6cb0: 0a 23 20 4e 6f 74 65 3a 0d 0a 23 20 20 20 20 54  .# Note:..#    T
6cc0: 68 65 20 65 6e 74 69 72 65 20 63 61 6e 76 61 73  he entire canvas
6cd0: 20 77 69 6c 6c 20 62 65 20 64 65 64 69 63 61 74   will be dedicat
6ce0: 65 64 20 74 6f 20 74 68 65 20 70 6f 6c 61 72 20  ed to the polar 
6cf0: 70 6c 6f 74 0d 0a 23 20 20 20 20 50 6f 73 73 69  plot..#    Possi
6d00: 62 6c 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 61  ble additional a
6d10: 72 67 75 6d 65 6e 74 73 20 28 6f 70 74 69 6f 6e  rguments (option
6d20: 61 6c 29 3a 20 6e 61 75 74 69 63 61 6c 2f 6d 61  al): nautical/ma
6d30: 74 68 65 6d 61 74 69 63 61 6c 0d 0a 23 20 20 20  thematical..#   
6d40: 20 73 74 65 70 20 69 6e 20 70 68 69 0d 0a 23 0d   step in phi..#.
6d50: 0a 70 72 6f 63 20 3a 3a 50 6c 6f 74 63 68 61 72  .proc ::Plotchar
6d60: 74 3a 3a 63 72 65 61 74 65 50 6f 6c 61 72 70 6c  t::createPolarpl
6d70: 6f 74 20 7b 20 77 20 72 61 64 69 75 73 5f 64 61  ot { w radius_da
6d80: 74 61 20 7d 20 7b 0d 0a 20 20 20 76 61 72 69 61  ta } {..   varia
6d90: 62 6c 65 20 64 61 74 61 5f 73 65 72 69 65 73 0d  ble data_series.
6da0: 0a 0d 0a 20 20 20 66 6f 72 65 61 63 68 20 73 20  ...   foreach s 
6db0: 5b 61 72 72 61 79 20 6e 61 6d 65 73 20 64 61 74  [array names dat
6dc0: 61 5f 73 65 72 69 65 73 20 22 24 77 2c 2a 22 5d  a_series "$w,*"]
6dd0: 20 7b 0d 0a 20 20 20 20 20 20 75 6e 73 65 74 20   {..      unset 
6de0: 64 61 74 61 5f 73 65 72 69 65 73 28 24 73 29 0d  data_series($s).
6df0: 0a 20 20 20 7d 0d 0a 0d 0a 20 20 20 73 65 74 20  .   }....   set 
6e00: 6e 65 77 63 68 61 72 74 20 22 70 6f 6c 61 72 70  newchart "polarp
6e10: 6c 6f 74 5f 24 77 22 0d 0a 20 20 20 69 6e 74 65  lot_$w"..   inte
6e20: 72 70 20 61 6c 69 61 73 20 7b 7d 20 24 6e 65 77  rp alias {} $new
6e30: 63 68 61 72 74 20 7b 7d 20 3a 3a 50 6c 6f 74 63  chart {} ::Plotc
6e40: 68 61 72 74 3a 3a 50 6c 6f 74 48 61 6e 64 6c 65  hart::PlotHandle
6e50: 72 20 70 6f 6c 61 72 70 6c 6f 74 20 24 77 0d 0a  r polarplot $w..
6e60: 0d 0a 20 20 20 73 65 74 20 72 61 64 5f 6d 61 78  ..   set rad_max
6e70: 20 20 20 5b 6c 69 6e 64 65 78 20 24 72 61 64 69     [lindex $radi
6e80: 75 73 5f 64 61 74 61 20 30 5d 0d 0a 20 20 20 73  us_data 0]..   s
6e90: 65 74 20 72 61 64 5f 73 74 65 70 20 20 5b 6c 69  et rad_step  [li
6ea0: 6e 64 65 78 20 24 72 61 64 69 75 73 5f 64 61 74  ndex $radius_dat
6eb0: 61 20 31 5d 0d 0a 0d 0a 20 20 20 69 66 20 7b 20  a 1]....   if { 
6ec0: 24 72 61 64 5f 73 74 65 70 20 3c 3d 20 30 2e 30  $rad_step <= 0.0
6ed0: 20 7d 20 7b 0d 0a 20 20 20 20 20 20 72 65 74 75   } {..      retu
6ee0: 72 6e 20 2d 63 6f 64 65 20 65 72 72 6f 72 20 22  rn -code error "
6ef0: 53 74 65 70 20 73 69 7a 65 20 63 61 6e 20 6e 6f  Step size can no
6f00: 74 20 62 65 20 7a 65 72 6f 20 6f 72 20 6e 65 67  t be zero or neg
6f10: 61 74 69 76 65 22 0d 0a 20 20 20 7d 0d 0a 20 20  ative"..   }..  
6f20: 20 69 66 20 7b 20 24 72 61 64 5f 6d 61 78 20 3c   if { $rad_max <
6f30: 3d 20 30 2e 30 20 7d 20 7b 0d 0a 20 20 20 20 20  = 0.0 } {..     
6f40: 20 72 65 74 75 72 6e 20 2d 63 6f 64 65 20 65 72   return -code er
6f50: 72 6f 72 20 22 4d 61 78 69 6d 75 6d 20 72 61 64  ror "Maximum rad
6f60: 69 75 73 20 63 61 6e 20 6e 6f 74 20 62 65 20 7a  ius can not be z
6f70: 65 72 6f 20 6f 72 20 6e 65 67 61 74 69 76 65 22  ero or negative"
6f80: 0d 0a 20 20 20 7d 0d 0a 0d 0a 20 20 20 66 6f 72  ..   }....   for
6f90: 65 61 63 68 20 7b 70 78 6d 69 6e 20 70 79 6d 69  each {pxmin pymi
6fa0: 6e 20 70 78 6d 61 78 20 70 79 6d 61 78 7d 20 5b  n pxmax pymax} [
6fb0: 4d 61 72 67 69 6e 73 43 69 72 63 6c 65 20 24 77  MarginsCircle $w
6fc0: 5d 20 7b 62 72 65 61 6b 7d 0d 0a 0d 0a 20 20 20  ] {break}....   
6fd0: 76 69 65 77 50 6f 72 74 20 20 20 20 20 20 20 20  viewPort        
6fe0: 20 24 77 20 24 70 78 6d 69 6e 20 20 20 20 20 24   $w $pxmin     $
6ff0: 70 79 6d 69 6e 20 20 20 20 20 24 70 78 6d 61 78  pymin     $pxmax
7000: 20 20 20 24 70 79 6d 61 78 0d 0a 20 20 20 70 6f     $pymax..   po
7010: 6c 61 72 43 6f 6f 72 64 69 6e 61 74 65 73 20 24  larCoordinates $
7020: 77 20 24 72 61 64 5f 6d 61 78 0d 0a 20 20 20 44  w $rad_max..   D
7030: 72 61 77 50 6f 6c 61 72 41 78 65 73 20 20 20 20  rawPolarAxes    
7040: 24 77 20 24 72 61 64 5f 6d 61 78 20 20 20 24 72  $w $rad_max   $r
7050: 61 64 5f 73 74 65 70 0d 0a 20 20 20 44 65 66 61  ad_step..   Defa
7060: 75 6c 74 4c 65 67 65 6e 64 20 20 20 20 24 77 0d  ultLegend    $w.
7070: 0a 20 20 20 44 65 66 61 75 6c 74 42 61 6c 6c 6f  .   DefaultBallo
7080: 6f 6e 20 20 20 24 77 0d 0a 0d 0a 20 20 20 72 65  on   $w....   re
7090: 74 75 72 6e 20 24 6e 65 77 63 68 61 72 74 0d 0a  turn $newchart..
70a0: 7d 0d 0a 0d 0a 23 20 63 72 65 61 74 65 42 61 72  }....# createBar
70b0: 63 68 61 72 74 20 2d 2d 0d 0a 23 20 20 20 20 43  chart --..#    C
70c0: 72 65 61 74 65 20 61 20 63 6f 6d 6d 61 6e 64 20  reate a command 
70d0: 66 6f 72 20 64 72 61 77 69 6e 67 20 61 20 62 61  for drawing a ba
70e0: 72 63 68 61 72 74 20 77 69 74 68 20 76 65 72 74  rchart with vert
70f0: 69 63 61 6c 20 62 61 72 73 0d 0a 23 20 41 72 67  ical bars..# Arg
7100: 75 6d 65 6e 74 73 3a 0d 0a 23 20 20 20 20 77 20  uments:..#    w 
7110: 20 20 20 20 20 20 20 20 20 20 4e 61 6d 65 20 6f            Name o
7120: 66 20 74 68 65 20 63 61 6e 76 61 73 0d 0a 23 20  f the canvas..# 
7130: 20 20 20 78 6c 61 62 65 6c 73 20 20 20 20 20 4c     xlabels     L
7140: 69 73 74 20 6f 66 20 6c 61 62 65 6c 73 20 66 6f  ist of labels fo
7150: 72 20 78 2d 61 78 69 73 0d 0a 23 20 20 20 20 79  r x-axis..#    y
7160: 73 63 61 6c 65 20 20 20 20 20 20 4d 69 6e 69 6d  scale      Minim
7170: 75 6d 2c 20 6d 61 78 69 6d 75 6d 20 61 6e 64 20  um, maximum and 
7180: 73 74 65 70 20 66 6f 72 20 79 2d 61 78 69 73 0d  step for y-axis.
7190: 0a 23 20 20 20 20 6e 6f 73 65 72 69 65 73 20 20  .#    noseries  
71a0: 20 20 4e 75 6d 62 65 72 20 6f 66 20 73 65 72 69    Number of seri
71b0: 65 73 20 6f 72 20 74 68 65 20 6b 65 79 77 6f 72  es or the keywor
71c0: 64 20 22 73 74 61 63 6b 65 64 22 0d 0a 23 20 52  d "stacked"..# R
71d0: 65 73 75 6c 74 3a 0d 0a 23 20 20 20 20 4e 61 6d  esult:..#    Nam
71e0: 65 20 6f 66 20 61 20 6e 65 77 20 63 6f 6d 6d 61  e of a new comma
71f0: 6e 64 0d 0a 23 20 4e 6f 74 65 3a 0d 0a 23 20 20  nd..# Note:..#  
7200: 20 20 54 68 65 20 65 6e 74 69 72 65 20 63 61 6e    The entire can
7210: 76 61 73 20 77 69 6c 6c 20 62 65 20 64 65 64 69  vas will be dedi
7220: 63 61 74 65 64 20 74 6f 20 74 68 65 20 62 61 72  cated to the bar
7230: 63 68 61 72 74 2e 0d 0a 23 0d 0a 70 72 6f 63 20  chart...#..proc 
7240: 3a 3a 50 6c 6f 74 63 68 61 72 74 3a 3a 63 72 65  ::Plotchart::cre
7250: 61 74 65 42 61 72 63 68 61 72 74 20 7b 20 77 20  ateBarchart { w 
7260: 78 6c 61 62 65 6c 73 20 79 73 63 61 6c 65 20 6e  xlabels yscale n
7270: 6f 73 65 72 69 65 73 20 7d 20 7b 0d 0a 20 20 20  oseries } {..   
7280: 76 61 72 69 61 62 6c 65 20 64 61 74 61 5f 73 65  variable data_se
7290: 72 69 65 73 0d 0a 0d 0a 20 20 20 66 6f 72 65 61  ries....   forea
72a0: 63 68 20 73 20 5b 61 72 72 61 79 20 6e 61 6d 65  ch s [array name
72b0: 73 20 64 61 74 61 5f 73 65 72 69 65 73 20 22 24  s data_series "$
72c0: 77 2c 2a 22 5d 20 7b 0d 0a 20 20 20 20 20 20 75  w,*"] {..      u
72d0: 6e 73 65 74 20 64 61 74 61 5f 73 65 72 69 65 73  nset data_series
72e0: 28 24 73 29 0d 0a 20 20 20 7d 0d 0a 0d 0a 20 20  ($s)..   }....  
72f0: 20 73 65 74 20 6e 65 77 63 68 61 72 74 20 22 62   set newchart "b
7300: 61 72 63 68 61 72 74 5f 24 77 22 0d 0a 20 20 20  archart_$w"..   
7310: 69 6e 74 65 72 70 20 61 6c 69 61 73 20 7b 7d 20  interp alias {} 
7320: 24 6e 65 77 63 68 61 72 74 20 7b 7d 20 3a 3a 50  $newchart {} ::P
7330: 6c 6f 74 63 68 61 72 74 3a 3a 50 6c 6f 74 48 61  lotchart::PlotHa
7340: 6e 64 6c 65 72 20 76 65 72 74 62 61 72 73 20 24  ndler vertbars $
7350: 77 0d 0a 0d 0a 20 20 20 66 6f 72 65 61 63 68 20  w....   foreach 
7360: 7b 70 78 6d 69 6e 20 70 79 6d 69 6e 20 70 78 6d  {pxmin pymin pxm
7370: 61 78 20 70 79 6d 61 78 7d 20 5b 4d 61 72 67 69  ax pymax} [Margi
7380: 6e 73 52 65 63 74 61 6e 67 6c 65 20 24 77 5d 20  nsRectangle $w] 
7390: 7b 62 72 65 61 6b 7d 0d 0a 0d 0a 20 20 20 73 65  {break}....   se
73a0: 74 20 78 6d 69 6e 20 20 30 2e 30 0d 0a 20 20 20  t xmin  0.0..   
73b0: 73 65 74 20 78 6d 61 78 20 20 5b 65 78 70 72 20  set xmax  [expr 
73c0: 7b 5b 6c 6c 65 6e 67 74 68 20 24 78 6c 61 62 65  {[llength $xlabe
73d0: 6c 73 5d 20 2b 20 30 2e 31 7d 5d 0d 0a 0d 0a 20  ls] + 0.1}].... 
73e0: 20 20 66 6f 72 65 61 63 68 20 7b 79 6d 69 6e 20    foreach {ymin 
73f0: 79 6d 61 78 20 79 64 65 6c 74 7d 20 24 79 73 63  ymax ydelt} $ysc
7400: 61 6c 65 20 7b 62 72 65 61 6b 7d 0d 0a 0d 0a 20  ale {break}.... 
7410: 20 20 69 66 20 7b 20 24 79 64 65 6c 74 20 3d 3d    if { $ydelt ==
7420: 20 30 2e 30 20 7d 20 7b 0d 0a 20 20 20 20 20 20   0.0 } {..      
7430: 72 65 74 75 72 6e 20 2d 63 6f 64 65 20 65 72 72  return -code err
7440: 6f 72 20 22 53 74 65 70 20 73 69 7a 65 20 63 61  or "Step size ca
7450: 6e 20 6e 6f 74 20 62 65 20 7a 65 72 6f 22 0d 0a  n not be zero"..
7460: 20 20 20 7d 0d 0a 0d 0a 20 20 20 69 66 20 7b 20     }....   if { 
7470: 28 24 79 6d 61 78 2d 24 79 6d 69 6e 29 2a 24 79  ($ymax-$ymin)*$y
7480: 64 65 6c 74 20 3c 20 30 2e 30 20 7d 20 7b 0d 0a  delt < 0.0 } {..
7490: 20 20 20 20 20 20 73 65 74 20 79 64 65 6c 74 20        set ydelt 
74a0: 5b 65 78 70 72 20 7b 2d 24 79 64 65 6c 74 7d 5d  [expr {-$ydelt}]
74b0: 0d 0a 20 20 20 7d 0d 0a 0d 0a 20 20 20 76 69 65  ..   }....   vie
74c0: 77 50 6f 72 74 20 20 20 20 20 20 20 20 20 24 77  wPort         $w
74d0: 20 24 70 78 6d 69 6e 20 24 70 79 6d 69 6e 20 24   $pxmin $pymin $
74e0: 70 78 6d 61 78 20 24 70 79 6d 61 78 0d 0a 20 20  pxmax $pymax..  
74f0: 20 77 6f 72 6c 64 43 6f 6f 72 64 69 6e 61 74 65   worldCoordinate
7500: 73 20 24 77 20 24 78 6d 69 6e 20 20 24 79 6d 69  s $w $xmin  $ymi
7510: 6e 20 20 24 78 6d 61 78 20 20 24 79 6d 61 78 0d  n  $xmax  $ymax.
7520: 0a 0d 0a 20 20 20 44 72 61 77 59 61 78 69 73 20  ...   DrawYaxis 
7530: 20 20 20 20 20 20 20 24 77 20 24 79 6d 69 6e 20         $w $ymin 
7540: 20 24 79 6d 61 78 20 20 24 79 64 65 6c 74 0d 0a   $ymax  $ydelt..
7550: 20 20 20 44 72 61 77 58 6c 61 62 65 6c 73 20 20     DrawXlabels  
7560: 20 20 20 20 24 77 20 24 78 6c 61 62 65 6c 73 20      $w $xlabels 
7570: 24 6e 6f 73 65 72 69 65 73 0d 0a 20 20 20 44 72  $noseries..   Dr
7580: 61 77 4d 61 73 6b 20 20 20 20 20 20 20 20 20 24  awMask         $
7590: 77 0d 0a 20 20 20 44 65 66 61 75 6c 74 4c 65 67  w..   DefaultLeg
75a0: 65 6e 64 20 20 20 20 24 77 0d 0a 20 20 20 73 65  end    $w..   se
75b0: 74 20 64 61 74 61 5f 73 65 72 69 65 73 28 24 77  t data_series($w
75c0: 2c 6c 65 67 65 6e 64 74 79 70 65 29 20 22 72 65  ,legendtype) "re
75d0: 63 74 61 6e 67 6c 65 22 0d 0a 20 20 20 44 65 66  ctangle"..   Def
75e0: 61 75 6c 74 42 61 6c 6c 6f 6f 6e 20 20 20 24 77  aultBalloon   $w
75f0: 0d 0a 0d 0a 20 20 20 53 65 74 43 6f 6c 6f 75 72  ....   SetColour
7600: 73 20 24 77 20 62 6c 75 65 20 6c 69 67 68 74 62  s $w blue lightb
7610: 6c 75 65 20 67 72 65 65 6e 20 79 65 6c 6c 6f 77  lue green yellow
7620: 20 6f 72 61 6e 67 65 20 72 65 64 20 6d 61 67 65   orange red mage
7630: 6e 74 61 20 62 72 6f 77 6e 0d 0a 0d 0a 20 20 20  nta brown....   
7640: 72 65 74 75 72 6e 20 24 6e 65 77 63 68 61 72 74  return $newchart
7650: 0d 0a 7d 0d 0a 0d 0a 23 20 63 72 65 61 74 65 48  ..}....# createH
7660: 6f 72 69 7a 6f 6e 74 61 6c 42 61 72 63 68 61 72  orizontalBarchar
7670: 74 20 2d 2d 0d 0a 23 20 20 20 20 43 72 65 61 74  t --..#    Creat
7680: 65 20 61 20 63 6f 6d 6d 61 6e 64 20 66 6f 72 20  e a command for 
7690: 64 72 61 77 69 6e 67 20 61 20 62 61 72 63 68 61  drawing a barcha
76a0: 72 74 20 77 69 74 68 20 68 6f 72 69 7a 6f 6e 74  rt with horizont
76b0: 61 6c 20 62 61 72 73 0d 0a 23 20 41 72 67 75 6d  al bars..# Argum
76c0: 65 6e 74 73 3a 0d 0a 23 20 20 20 20 77 20 20 20  ents:..#    w   
76d0: 20 20 20 20 20 20 20 20 4e 61 6d 65 20 6f 66 20          Name of 
76e0: 74 68 65 20 63 61 6e 76 61 73 0d 0a 23 20 20 20  the canvas..#   
76f0: 20 78 73 63 61 6c 65 20 20 20 20 20 20 4d 69 6e   xscale      Min
7700: 69 6d 75 6d 2c 20 6d 61 78 69 6d 75 6d 20 61 6e  imum, maximum an
7710: 64 20 73 74 65 70 20 66 6f 72 20 78 2d 61 78 69  d step for x-axi
7720: 73 0d 0a 23 20 20 20 20 79 6c 61 62 65 6c 73 20  s..#    ylabels 
7730: 20 20 20 20 4c 69 73 74 20 6f 66 20 6c 61 62 65      List of labe
7740: 6c 73 20 66 6f 72 20 79 2d 61 78 69 73 0d 0a 23  ls for y-axis..#
7750: 20 20 20 20 6e 6f 73 65 72 69 65 73 20 20 20 20      noseries    
7760: 4e 75 6d 62 65 72 20 6f 66 20 73 65 72 69 65 73  Number of series
7770: 20 6f 72 20 74 68 65 20 6b 65 79 77 6f 72 64 20   or the keyword 
7780: 22 73 74 61 63 6b 65 64 22 0d 0a 23 20 52 65 73  "stacked"..# Res
7790: 75 6c 74 3a 0d 0a 23 20 20 20 20 4e 61 6d 65 20  ult:..#    Name 
77a0: 6f 66 20 61 20 6e 65 77 20 63 6f 6d 6d 61 6e 64  of a new command
77b0: 0d 0a 23 20 4e 6f 74 65 3a 0d 0a 23 20 20 20 20  ..# Note:..#    
77c0: 54 68 65 20 65 6e 74 69 72 65 20 63 61 6e 76 61  The entire canva
77d0: 73 20 77 69 6c 6c 20 62 65 20 64 65 64 69 63 61  s will be dedica
77e0: 74 65 64 20 74 6f 20 74 68 65 20 62 61 72 63 68  ted to the barch
77f0: 61 72 74 2e 0d 0a 23 0d 0a 70 72 6f 63 20 3a 3a  art...#..proc ::
7800: 50 6c 6f 74 63 68 61 72 74 3a 3a 63 72 65 61 74  Plotchart::creat
7810: 65 48 6f 72 69 7a 6f 6e 74 61 6c 42 61 72 63 68  eHorizontalBarch
7820: 61 72 74 20 7b 20 77 20 78 73 63 61 6c 65 20 79  art { w xscale y
7830: 6c 61 62 65 6c 73 20 6e 6f 73 65 72 69 65 73 20  labels noseries 
7840: 7d 20 7b 0d 0a 20 20 20 76 61 72 69 61 62 6c 65  } {..   variable
7850: 20 64 61 74 61 5f 73 65 72 69 65 73 0d 0a 0d 0a   data_series....
7860: 20 20 20 66 6f 72 65 61 63 68 20 73 20 5b 61 72     foreach s [ar
7870: 72 61 79 20 6e 61 6d 65 73 20 64 61 74 61 5f 73  ray names data_s
7880: 65 72 69 65 73 20 22 24 77 2c 2a 22 5d 20 7b 0d  eries "$w,*"] {.
7890: 0a 20 20 20 20 20 20 75 6e 73 65 74 20 64 61 74  .      unset dat
78a0: 61 5f 73 65 72 69 65 73 28 24 73 29 0d 0a 20 20  a_series($s)..  
78b0: 20 7d 0d 0a 0d 0a 20 20 20 73 65 74 20 6e 65 77   }....   set new
78c0: 63 68 61 72 74 20 22 68 62 61 72 63 68 61 72 74  chart "hbarchart
78d0: 5f 24 77 22 0d 0a 20 20 20 69 6e 74 65 72 70 20  _$w"..   interp 
78e0: 61 6c 69 61 73 20 7b 7d 20 24 6e 65 77 63 68 61  alias {} $newcha
78f0: 72 74 20 7b 7d 20 3a 3a 50 6c 6f 74 63 68 61 72  rt {} ::Plotchar
7900: 74 3a 3a 50 6c 6f 74 48 61 6e 64 6c 65 72 20 68  t::PlotHandler h
7910: 6f 72 69 7a 62 61 72 73 20 24 77 0d 0a 0d 0a 20  orizbars $w.... 
7920: 20 20 73 65 74 20 6e 6f 74 65 78 74 20 32 2e 30    set notext 2.0
7930: 0d 0a 20 20 20 73 65 74 20 74 65 78 74 5f 77 69  ..   set text_wi
7940: 64 74 68 20 38 0d 0a 20 20 20 23 0d 0a 20 20 20  dth 8..   #..   
7950: 23 20 43 6f 6d 70 75 74 65 20 74 68 65 20 6d 61  # Compute the ma
7960: 78 69 6d 75 6d 20 77 69 64 74 68 20 6f 66 20 74  ximum width of t
7970: 68 65 20 6c 61 62 65 6c 73 0d 0a 20 20 20 23 20  he labels..   # 
7980: 3c 4d 42 3e 0d 0a 20 20 20 23 0d 0a 20 20 20 6c  <MB>..   #..   l
7990: 61 62 65 6c 20 2e 69 6e 76 69 73 69 62 6c 65 4c  abel .invisibleL
79a0: 61 62 65 6c 0d 0a 20 20 20 73 65 74 20 66 6f 6e  abel..   set fon
79b0: 74 6e 61 6d 65 20 5b 2e 69 6e 76 69 73 69 62 6c  tname [.invisibl
79c0: 65 4c 61 62 65 6c 20 63 67 65 74 20 2d 66 6f 6e  eLabel cget -fon
79d0: 74 5d 0d 0a 20 20 20 64 65 73 74 72 6f 79 20 2e  t]..   destroy .
79e0: 69 6e 76 69 73 69 62 6c 65 4c 61 62 65 6c 0d 0a  invisibleLabel..
79f0: 20 20 20 0d 0a 20 20 20 73 65 74 20 78 73 70 61     ..   set xspa
7a00: 63 65 6d 61 78 20 30 0d 0a 20 20 20 66 6f 72 65  cemax 0..   fore
7a10: 61 63 68 20 79 6c 61 62 20 24 79 6c 61 62 65 6c  ach ylab $ylabel
7a20: 73 20 7b 0d 0a 20 20 20 20 20 20 20 73 65 74 20  s {..       set 
7a30: 78 73 70 61 63 65 20 5b 66 6f 6e 74 20 6d 65 61  xspace [font mea
7a40: 73 75 72 65 20 24 66 6f 6e 74 6e 61 6d 65 20 24  sure $fontname $
7a50: 79 6c 61 62 5d 0d 0a 20 20 20 20 20 20 20 69 66  ylab]..       if
7a60: 20 7b 24 78 73 70 61 63 65 3e 20 24 78 73 70 61   {$xspace> $xspa
7a70: 63 65 6d 61 78 7d 20 74 68 65 6e 20 7b 0d 0a 20  cemax} then {.. 
7a80: 20 20 20 20 20 20 20 20 20 20 73 65 74 20 78 73            set xs
7a90: 70 61 63 65 6d 61 78 20 24 78 73 70 61 63 65 0d  pacemax $xspace.
7aa0: 0a 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 7d 0d  .       }..   }.
7ab0: 0a 20 20 20 73 65 74 20 74 65 78 74 5f 77 69 64  .   set text_wid
7ac0: 74 68 20 5b 65 78 70 72 20 7b 69 6e 74 20 28 20  th [expr {int ( 
7ad0: 24 78 73 70 61 63 65 6d 61 78 20 2f 20 31 30 2e  $xspacemax / 10.
7ae0: 29 20 2b 20 31 7d 5d 0d 0a 0d 0a 20 20 20 66 6f  ) + 1}]....   fo
7af0: 72 65 61 63 68 20 7b 70 78 6d 69 6e 20 70 79 6d  reach {pxmin pym
7b00: 69 6e 20 70 78 6d 61 78 20 70 79 6d 61 78 7d 20  in pxmax pymax} 
7b10: 5b 4d 61 72 67 69 6e 73 52 65 63 74 61 6e 67 6c  [MarginsRectangl
7b20: 65 20 24 77 20 24 6e 6f 74 65 78 74 20 24 74 65  e $w $notext $te
7b30: 78 74 5f 77 69 64 74 68 5d 20 7b 62 72 65 61 6b  xt_width] {break
7b40: 7d 0d 0a 0d 0a 20 20 20 73 65 74 20 79 6d 69 6e  }....   set ymin
7b50: 20 20 30 2e 30 0d 0a 20 20 20 73 65 74 20 79 6d    0.0..   set ym
7b60: 61 78 20 20 5b 65 78 70 72 20 7b 5b 6c 6c 65 6e  ax  [expr {[llen
7b70: 67 74 68 20 24 79 6c 61 62 65 6c 73 5d 20 2b 20  gth $ylabels] + 
7b80: 30 2e 31 7d 5d 0d 0a 0d 0a 20 20 20 66 6f 72 65  0.1}]....   fore
7b90: 61 63 68 20 7b 78 6d 69 6e 20 78 6d 61 78 20 78  ach {xmin xmax x
7ba0: 64 65 6c 74 7d 20 24 78 73 63 61 6c 65 20 7b 62  delt} $xscale {b
7bb0: 72 65 61 6b 7d 0d 0a 0d 0a 20 20 20 69 66 20 7b  reak}....   if {
7bc0: 20 24 78 64 65 6c 74 20 3d 3d 20 30 2e 30 20 7d   $xdelt == 0.0 }
7bd0: 20 7b 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e   {..      return
7be0: 20 2d 63 6f 64 65 20 65 72 72 6f 72 20 22 53 74   -code error "St
7bf0: 65 70 20 73 69 7a 65 20 63 61 6e 20 6e 6f 74 20  ep size can not 
7c00: 62 65 20 7a 65 72 6f 22 0d 0a 20 20 20 7d 0d 0a  be zero"..   }..
7c10: 0d 0a 20 20 20 69 66 20 7b 20 28 24 78 6d 61 78  ..   if { ($xmax
7c20: 2d 24 78 6d 69 6e 29 2a 24 78 64 65 6c 74 20 3c  -$xmin)*$xdelt <
7c30: 20 30 2e 30 20 7d 20 7b 0d 0a 20 20 20 20 20 20   0.0 } {..      
7c40: 73 65 74 20 78 64 65 6c 74 20 5b 65 78 70 72 20  set xdelt [expr 
7c50: 7b 2d 24 78 64 65 6c 74 7d 5d 0d 0a 20 20 20 7d  {-$xdelt}]..   }
7c60: 0d 0a 0d 0a 20 20 20 76 69 65 77 50 6f 72 74 20  ....   viewPort 
7c70: 20 20 20 20 20 20 20 20 24 77 20 24 70 78 6d 69          $w $pxmi
7c80: 6e 20 24 70 79 6d 69 6e 20 24 70 78 6d 61 78 20  n $pymin $pxmax 
7c90: 24 70 79 6d 61 78 0d 0a 20 20 20 77 6f 72 6c 64  $pymax..   world
7ca0: 43 6f 6f 72 64 69 6e 61 74 65 73 20 24 77 20 24  Coordinates $w $
7cb0: 78 6d 69 6e 20 20 24 79 6d 69 6e 20 20 24 78 6d  xmin  $ymin  $xm
7cc0: 61 78 20 20 24 79 6d 61 78 0d 0a 0d 0a 20 20 20  ax  $ymax....   
7cd0: 44 72 61 77 58 61 78 69 73 20 20 20 20 20 20 20  DrawXaxis       
7ce0: 20 24 77 20 24 78 6d 69 6e 20 20 24 78 6d 61 78   $w $xmin  $xmax
7cf0: 20 20 24 78 64 65 6c 74 0d 0a 20 20 20 44 72 61    $xdelt..   Dra
7d00: 77 59 6c 61 62 65 6c 73 20 20 20 20 20 20 24 77  wYlabels      $w
7d10: 20 24 79 6c 61 62 65 6c 73 20 24 6e 6f 73 65 72   $ylabels $noser
7d20: 69 65 73 0d 0a 20 20 20 44 72 61 77 4d 61 73 6b  ies..   DrawMask
7d30: 20 20 20 20 20 20 20 20 20 24 77 0d 0a 20 20 20           $w..   
7d40: 44 65 66 61 75 6c 74 4c 65 67 65 6e 64 20 20 20  DefaultLegend   
7d50: 20 24 77 0d 0a 20 20 20 73 65 74 20 64 61 74 61   $w..   set data
7d60: 5f 73 65 72 69 65 73 28 24 77 2c 6c 65 67 65 6e  _series($w,legen
7d70: 64 74 79 70 65 29 20 22 72 65 63 74 61 6e 67 6c  dtype) "rectangl
7d80: 65 22 0d 0a 20 20 20 44 65 66 61 75 6c 74 42 61  e"..   DefaultBa
7d90: 6c 6c 6f 6f 6e 20 20 20 24 77 0d 0a 0d 0a 20 20  lloon   $w....  
7da0: 20 53 65 74 43 6f 6c 6f 75 72 73 20 24 77 20 62   SetColours $w b
7db0: 6c 75 65 20 6c 69 67 68 74 62 6c 75 65 20 67 72  lue lightblue gr
7dc0: 65 65 6e 20 79 65 6c 6c 6f 77 20 6f 72 61 6e 67  een yellow orang
7dd0: 65 20 72 65 64 20 6d 61 67 65 6e 74 61 20 62 72  e red magenta br
7de0: 6f 77 6e 0d 0a 0d 0a 20 20 20 72 65 74 75 72 6e  own....   return
7df0: 20 24 6e 65 77 63 68 61 72 74 0d 0a 7d 0d 0a 0d   $newchart..}...
7e00: 0a 23 20 63 72 65 61 74 65 54 69 6d 65 63 68 61  .# createTimecha
7e10: 72 74 20 2d 2d 0d 0a 23 20 20 20 20 43 72 65 61  rt --..#    Crea
7e20: 74 65 20 61 20 63 6f 6d 6d 61 6e 64 20 66 6f 72  te a command for
7e30: 20 64 72 61 77 69 6e 67 20 61 20 73 69 6d 70 6c   drawing a simpl
7e40: 65 20 74 69 6d 65 63 68 61 72 74 0d 0a 23 20 41  e timechart..# A
7e50: 72 67 75 6d 65 6e 74 73 3a 0d 0a 23 20 20 20 20  rguments:..#    
7e60: 77 20 20 20 20 20 20 20 20 20 20 20 4e 61 6d 65  w           Name
7e70: 20 6f 66 20 74 68 65 20 63 61 6e 76 61 73 0d 0a   of the canvas..
7e80: 23 20 20 20 20 74 69 6d 65 5f 62 65 67 69 6e 20  #    time_begin 
7e90: 20 53 74 61 72 74 20 74 69 6d 65 20 28 69 6e 20   Start time (in 
7ea0: 74 68 65 20 66 6f 72 6d 20 6f 66 20 61 20 64 61  the form of a da
7eb0: 74 65 2f 74 69 6d 65 29 0d 0a 23 20 20 20 20 74  te/time)..#    t
7ec0: 69 6d 65 5f 65 6e 64 20 20 20 20 45 6e 64 20 74  ime_end    End t
7ed0: 69 6d 65 20 28 69 6e 20 74 68 65 20 66 6f 72 6d  ime (in the form
7ee0: 20 6f 66 20 61 20 64 61 74 65 2f 74 69 6d 65 29   of a date/time)
7ef0: 0d 0a 23 20 20 20 20 6e 6f 69 74 65 6d 73 20 20  ..#    noitems  
7f00: 20 20 20 4e 75 6d 62 65 72 20 6f 66 20 69 74 65     Number of ite
7f10: 6d 73 20 74 6f 20 62 65 20 73 68 6f 77 6e 20 28  ms to be shown (
7f20: 64 65 74 65 72 6d 69 6e 65 73 20 73 70 61 63 69  determines spaci
7f30: 6e 67 29 0d 0a 23 20 52 65 73 75 6c 74 3a 0d 0a  ng)..# Result:..
7f40: 23 20 20 20 20 4e 61 6d 65 20 6f 66 20 61 20 6e  #    Name of a n
7f50: 65 77 20 63 6f 6d 6d 61 6e 64 0d 0a 23 20 4e 6f  ew command..# No
7f60: 74 65 3a 0d 0a 23 20 20 20 20 54 68 65 20 65 6e  te:..#    The en
7f70: 74 69 72 65 20 63 61 6e 76 61 73 20 77 69 6c 6c  tire canvas will
7f80: 20 62 65 20 64 65 64 69 63 61 74 65 64 20 74 6f   be dedicated to
7f90: 20 74 68 65 20 74 69 6d 65 63 68 61 72 74 2e 0d   the timechart..
7fa0: 0a 23 0d 0a 70 72 6f 63 20 3a 3a 50 6c 6f 74 63  .#..proc ::Plotc
7fb0: 68 61 72 74 3a 3a 63 72 65 61 74 65 54 69 6d 65  hart::createTime
7fc0: 63 68 61 72 74 20 7b 20 77 20 74 69 6d 65 5f 62  chart { w time_b
7fd0: 65 67 69 6e 20 74 69 6d 65 5f 65 6e 64 20 6e 6f  egin time_end no
7fe0: 69 74 65 6d 73 20 7d 20 7b 0d 0a 20 20 20 76 61  items } {..   va
7ff0: 72 69 61 62 6c 65 20 64 61 74 61 5f 73 65 72 69  riable data_seri
8000: 65 73 0d 0a 20 20 20 76 61 72 69 61 62 6c 65 20  es..   variable 
8010: 73 63 61 6c 69 6e 67 0d 0a 0d 0a 20 20 20 66 6f  scaling....   fo
8020: 72 65 61 63 68 20 73 20 5b 61 72 72 61 79 20 6e  reach s [array n
8030: 61 6d 65 73 20 64 61 74 61 5f 73 65 72 69 65 73  ames data_series
8040: 20 22 24 77 2c 2a 22 5d 20 7b 0d 0a 20 20 20 20   "$w,*"] {..    
8050: 20 20 75 6e 73 65 74 20 64 61 74 61 5f 73 65 72    unset data_ser
8060: 69 65 73 28 24 73 29 0d 0a 20 20 20 7d 0d 0a 0d  ies($s)..   }...
8070: 0a 20 20 20 73 65 74 20 6e 65 77 63 68 61 72 74  .   set newchart
8080: 20 22 74 69 6d 65 63 68 61 72 74 5f 24 77 22 0d   "timechart_$w".
8090: 0a 20 20 20 69 6e 74 65 72 70 20 61 6c 69 61 73  .   interp alias
80a0: 20 7b 7d 20 24 6e 65 77 63 68 61 72 74 20 7b 7d   {} $newchart {}
80b0: 20 3a 3a 50 6c 6f 74 63 68 61 72 74 3a 3a 50 6c   ::Plotchart::Pl
80c0: 6f 74 48 61 6e 64 6c 65 72 20 74 69 6d 65 63 68  otHandler timech
80d0: 61 72 74 20 24 77 0d 0a 0d 0a 20 20 20 66 6f 72  art $w....   for
80e0: 65 61 63 68 20 7b 70 78 6d 69 6e 20 70 79 6d 69  each {pxmin pymi
80f0: 6e 20 70 78 6d 61 78 20 70 79 6d 61 78 7d 20 5b  n pxmax pymax} [
8100: 4d 61 72 67 69 6e 73 52 65 63 74 61 6e 67 6c 65  MarginsRectangle
8110: 20 24 77 20 33 5d 20 7b 62 72 65 61 6b 7d 0d 0a   $w 3] {break}..
8120: 0d 0a 20 20 20 73 65 74 20 79 6d 69 6e 20 20 30  ..   set ymin  0
8130: 2e 30 0d 0a 20 20 20 73 65 74 20 79 6d 61 78 20  .0..   set ymax 
8140: 20 24 6e 6f 69 74 65 6d 73 0d 0a 0d 0a 20 20 20   $noitems....   
8150: 73 65 74 20 78 6d 69 6e 20 20 5b 65 78 70 72 20  set xmin  [expr 
8160: 7b 31 2e 30 2a 5b 63 6c 6f 63 6b 20 73 63 61 6e  {1.0*[clock scan
8170: 20 24 74 69 6d 65 5f 62 65 67 69 6e 5d 7d 5d 0d   $time_begin]}].
8180: 0a 20 20 20 73 65 74 20 78 6d 61 78 20 20 5b 65  .   set xmax  [e
8190: 78 70 72 20 7b 31 2e 30 2a 5b 63 6c 6f 63 6b 20  xpr {1.0*[clock 
81a0: 73 63 61 6e 20 24 74 69 6d 65 5f 65 6e 64 5d 7d  scan $time_end]}
81b0: 5d 0d 0a 0d 0a 20 20 20 76 69 65 77 50 6f 72 74  ]....   viewPort
81c0: 20 20 20 20 20 20 20 20 20 24 77 20 24 70 78 6d           $w $pxm
81d0: 69 6e 20 24 70 79 6d 69 6e 20 24 70 78 6d 61 78  in $pymin $pxmax
81e0: 20 24 70 79 6d 61 78 0d 0a 20 20 20 77 6f 72 6c   $pymax..   worl
81f0: 64 43 6f 6f 72 64 69 6e 61 74 65 73 20 24 77 20  dCoordinates $w 
8200: 24 78 6d 69 6e 20 20 24 79 6d 69 6e 20 20 24 78  $xmin  $ymin  $x
8210: 6d 61 78 20 20 24 79 6d 61 78 0d 0a 0d 0a 20 20  max  $ymax....  
8220: 20 73 65 74 20 73 63 61 6c 69 6e 67 28 24 77 2c   set scaling($w,
8230: 63 75 72 72 65 6e 74 29 20 24 79 6d 61 78 0d 0a  current) $ymax..
8240: 20 20 20 73 65 74 20 73 63 61 6c 69 6e 67 28 24     set scaling($
8250: 77 2c 64 79 29 20 20 20 20 20 20 2d 30 2e 37 0d  w,dy)      -0.7.
8260: 0a 0d 0a 20 20 20 72 65 74 75 72 6e 20 24 6e 65  ...   return $ne
8270: 77 63 68 61 72 74 0d 0a 7d 0d 0a 0d 0a 23 20 63  wchart..}....# c
8280: 72 65 61 74 65 47 61 6e 74 74 63 68 61 72 74 20  reateGanttchart 
8290: 2d 2d 0d 0a 23 20 20 20 20 43 72 65 61 74 65 20  --..#    Create 
82a0: 61 20 63 6f 6d 6d 61 6e 64 20 66 6f 72 20 64 72  a command for dr
82b0: 61 77 69 6e 67 20 61 20 47 61 6e 74 74 20 28 70  awing a Gantt (p
82c0: 6c 61 6e 6e 69 6e 67 29 20 63 68 61 72 74 0d 0a  lanning) chart..
82d0: 23 20 41 72 67 75 6d 65 6e 74 73 3a 0d 0a 23 20  # Arguments:..# 
82e0: 20 20 20 77 20 20 20 20 20 20 20 20 20 20 20 4e     w           N
82f0: 61 6d 65 20 6f 66 20 74 68 65 20 63 61 6e 76 61  ame of the canva
8300: 73 0d 0a 23 20 20 20 20 74 69 6d 65 5f 62 65 67  s..#    time_beg
8310: 69 6e 20 20 53 74 61 72 74 20 74 69 6d 65 20 28  in  Start time (
8320: 69 6e 20 74 68 65 20 66 6f 72 6d 20 6f 66 20 61  in the form of a
8330: 20 64 61 74 65 2f 74 69 6d 65 29 0d 0a 23 20 20   date/time)..#  
8340: 20 20 74 69 6d 65 5f 65 6e 64 20 20 20 20 45 6e    time_end    En
8350: 64 20 74 69 6d 65 20 28 69 6e 20 74 68 65 20 66  d time (in the f
8360: 6f 72 6d 20 6f 66 20 61 20 64 61 74 65 2f 74 69  orm of a date/ti
8370: 6d 65 29 0d 0a 23 20 20 20 20 6e 6f 69 74 65 6d  me)..#    noitem
8380: 73 20 20 20 20 20 4e 75 6d 62 65 72 20 6f 66 20  s     Number of 
8390: 69 74 65 6d 73 20 74 6f 20 62 65 20 73 68 6f 77  items to be show
83a0: 6e 20 28 64 65 74 65 72 6d 69 6e 65 73 20 73 70  n (determines sp
83b0: 61 63 69 6e 67 29 0d 0a 23 20 20 20 20 74 65 78  acing)..#    tex
83c0: 74 5f 77 69 64 74 68 20 20 45 73 74 69 6d 61 74  t_width  Estimat
83d0: 65 64 20 6d 61 78 69 6d 75 6d 20 6c 65 6e 67 74  ed maximum lengt
83e0: 68 20 6f 66 20 74 65 78 74 20 28 64 65 66 61 75  h of text (defau
83f0: 6c 74 3a 20 32 30 29 0d 0a 23 20 52 65 73 75 6c  lt: 20)..# Resul
8400: 74 3a 0d 0a 23 20 20 20 20 4e 61 6d 65 20 6f 66  t:..#    Name of
8410: 20 61 20 6e 65 77 20 63 6f 6d 6d 61 6e 64 0d 0a   a new command..
8420: 23 20 4e 6f 74 65 3a 0d 0a 23 20 20 20 20 54 68  # Note:..#    Th
8430: 65 20 65 6e 74 69 72 65 20 63 61 6e 76 61 73 20  e entire canvas 
8440: 77 69 6c 6c 20 62 65 20 64 65 64 69 63 61 74 65  will be dedicate
8450: 64 20 74 6f 20 74 68 65 20 47 61 6e 74 74 20 63  d to the Gantt c
8460: 68 61 72 74 2e 0d 0a 23 20 20 20 20 4d 6f 73 74  hart...#    Most
8470: 20 63 6f 6d 6d 61 6e 64 73 20 74 61 6b 65 6e 20   commands taken 
8480: 66 72 6f 6d 20 74 69 6d 65 20 63 68 61 72 74 73  from time charts
8490: 2e 0d 0a 23 0d 0a 70 72 6f 63 20 3a 3a 50 6c 6f  ...#..proc ::Plo
84a0: 74 63 68 61 72 74 3a 3a 63 72 65 61 74 65 47 61  tchart::createGa
84b0: 6e 74 74 63 68 61 72 74 20 7b 20 77 20 74 69 6d  nttchart { w tim
84c0: 65 5f 62 65 67 69 6e 20 74 69 6d 65 5f 65 6e 64  e_begin time_end
84d0: 20 6e 6f 69 74 65 6d 73 0d 0a 20 20 20 20 20 20   noitems..      
84e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
84f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b                 {
8500: 74 65 78 74 5f 77 69 64 74 68 20 32 30 7d 20 7d  text_width 20} }
8510: 20 7b 0d 0a 0d 0a 20 20 20 76 61 72 69 61 62 6c   {....   variabl
8520: 65 20 64 61 74 61 5f 73 65 72 69 65 73 0d 0a 20  e data_series.. 
8530: 20 20 76 61 72 69 61 62 6c 65 20 73 63 61 6c 69    variable scali
8540: 6e 67 0d 0a 0d 0a 20 20 20 66 6f 72 65 61 63 68  ng....   foreach
8550: 20 73 20 5b 61 72 72 61 79 20 6e 61 6d 65 73 20   s [array names 
8560: 64 61 74 61 5f 73 65 72 69 65 73 20 22 24 77 2c  data_series "$w,
8570: 2a 22 5d 20 7b 0d 0a 20 20 20 20 20 20 75 6e 73  *"] {..      uns
8580: 65 74 20 64 61 74 61 5f 73 65 72 69 65 73 28 24  et data_series($
8590: 73 29 0d 0a 20 20 20 7d 0d 0a 0d 0a 20 20 20 73  s)..   }....   s
85a0: 65 74 20 6e 65 77 63 68 61 72 74 20 22 67 61 6e  et newchart "gan
85b0: 74 74 63 68 61 72 74 5f 24 77 22 0d 0a 20 20 20  ttchart_$w"..   
85c0: 69 6e 74 65 72 70 20 61 6c 69 61 73 20 7b 7d 20  interp alias {} 
85d0: 24 6e 65 77 63 68 61 72 74 20 7b 7d 20 3a 3a 50  $newchart {} ::P
85e0: 6c 6f 74 63 68 61 72 74 3a 3a 50 6c 6f 74 48 61  lotchart::PlotHa
85f0: 6e 64 6c 65 72 20 67 61 6e 74 74 63 68 61 72 74  ndler ganttchart
8600: 20 24 77 0d 0a 0d 0a 20 20 20 66 6f 72 65 61 63   $w....   foreac
8610: 68 20 7b 70 78 6d 69 6e 20 70 79 6d 69 6e 20 70  h {pxmin pymin p
8620: 78 6d 61 78 20 70 79 6d 61 78 7d 20 5b 4d 61 72  xmax pymax} [Mar
8630: 67 69 6e 73 52 65 63 74 61 6e 67 6c 65 20 24 77  ginsRectangle $w
8640: 20 33 20 24 74 65 78 74 5f 77 69 64 74 68 5d 20   3 $text_width] 
8650: 7b 62 72 65 61 6b 7d 0d 0a 0d 0a 20 20 20 73 65  {break}....   se
8660: 74 20 79 6d 69 6e 20 20 30 2e 30 0d 0a 20 20 20  t ymin  0.0..   
8670: 73 65 74 20 79 6d 61 78 20 20 24 6e 6f 69 74 65  set ymax  $noite
8680: 6d 73 0d 0a 0d 0a 20 20 20 73 65 74 20 78 6d 69  ms....   set xmi
8690: 6e 20 20 5b 65 78 70 72 20 7b 31 2e 30 2a 5b 63  n  [expr {1.0*[c
86a0: 6c 6f 63 6b 20 73 63 61 6e 20 24 74 69 6d 65 5f  lock scan $time_
86b0: 62 65 67 69 6e 5d 7d 5d 0d 0a 20 20 20 73 65 74  begin]}]..   set
86c0: 20 78 6d 61 78 20 20 5b 65 78 70 72 20 7b 31 2e   xmax  [expr {1.
86d0: 30 2a 5b 63 6c 6f 63 6b 20 73 63 61 6e 20 24 74  0*[clock scan $t
86e0: 69 6d 65 5f 65 6e 64 5d 7d 5d 0d 0a 0d 0a 20 20  ime_end]}]....  
86f0: 20 76 69 65 77 50 6f 72 74 20 20 20 20 20 20 20   viewPort       
8700: 20 20 24 77 20 24 70 78 6d 69 6e 20 24 70 79 6d    $w $pxmin $pym
8710: 69 6e 20 24 70 78 6d 61 78 20 24 70 79 6d 61 78  in $pxmax $pymax
8720: 0d 0a 20 20 20 77 6f 72 6c 64 43 6f 6f 72 64 69  ..   worldCoordi
8730: 6e 61 74 65 73 20 24 77 20 24 78 6d 69 6e 20 20  nates $w $xmin  
8740: 24 79 6d 69 6e 20 20 24 78 6d 61 78 20 20 24 79  $ymin  $xmax  $y
8750: 6d 61 78 0d 0a 0d 0a 20 20 20 73 65 74 20 73 63  max....   set sc
8760: 61 6c 69 6e 67 28 24 77 2c 63 75 72 72 65 6e 74  aling($w,current
8770: 29 20 24 79 6d 61 78 0d 0a 20 20 20 73 65 74 20  ) $ymax..   set 
8780: 73 63 61 6c 69 6e 67 28 24 77 2c 64 79 29 20 20  scaling($w,dy)  
8790: 20 20 20 20 2d 30 2e 37 0d 0a 0d 0a 20 20 20 23      -0.7....   #
87a0: 0d 0a 20 20 20 23 20 44 72 61 77 20 74 68 65 20  ..   # Draw the 
87b0: 62 61 63 6b 67 72 6f 75 6e 64 73 20 28 62 6f 74  backgrounds (bot
87c0: 68 20 69 6e 20 74 68 65 20 74 65 78 74 20 70 61  h in the text pa
87d0: 72 74 20 61 6e 64 20 74 68 65 0d 0a 20 20 20 23  rt and the..   #
87e0: 20 67 72 61 70 68 69 63 61 6c 20 70 61 72 74 3b   graphical part;
87f0: 20 74 68 65 20 74 65 78 74 20 70 61 72 74 20 68   the text part h
8800: 61 73 20 74 68 65 20 22 73 70 65 63 69 61 6c 22  as the "special"
8810: 20 74 61 67 0d 0a 20 20 20 23 20 22 45 64 69 74   tag..   # "Edit
8820: 22 20 74 6f 20 65 6e 61 62 6c 65 20 61 20 47 55  " to enable a GU
8830: 49 20 74 6f 20 63 68 61 6e 67 65 20 74 68 69 6e  I to change thin
8840: 67 73 29 0d 0a 20 20 20 23 0d 0a 20 20 20 73 65  gs)..   #..   se
8850: 74 20 79 65 6e 64 20 30 2e 30 0d 0a 20 20 20 66  t yend 0.0..   f
8860: 6f 72 20 7b 20 73 65 74 20 69 20 30 20 7d 20 7b  or { set i 0 } {
8870: 20 24 69 20 3c 20 24 6e 6f 69 74 65 6d 73 20 7d   $i < $noitems }
8880: 20 7b 20 69 6e 63 72 20 69 20 7d 20 7b 0d 0a 20   { incr i } {.. 
8890: 20 20 20 20 20 20 73 65 74 20 79 62 65 67 69 6e        set ybegin
88a0: 20 24 79 65 6e 64 0d 0a 20 20 20 20 20 20 20 73   $yend..       s
88b0: 65 74 20 79 65 6e 64 20 20 20 5b 65 78 70 72 20  et yend   [expr 
88c0: 7b 24 79 62 65 67 69 6e 2b 31 2e 30 7d 5d 0d 0a  {$ybegin+1.0}]..
88d0: 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 7b         foreach {
88e0: 78 31 20 79 31 7d 20 5b 63 6f 6f 72 64 73 54 6f  x1 y1} [coordsTo
88f0: 50 69 78 65 6c 20 24 77 20 24 78 6d 69 6e 20 24  Pixel $w $xmin $
8900: 79 62 65 67 69 6e 5d 20 7b 62 72 65 61 6b 7d 0d  ybegin] {break}.
8910: 0a 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20  .       foreach 
8920: 7b 78 32 20 79 32 7d 20 5b 63 6f 6f 72 64 73 54  {x2 y2} [coordsT
8930: 6f 50 69 78 65 6c 20 24 77 20 24 78 6d 61 78 20  oPixel $w $xmax 
8940: 24 79 65 6e 64 20 20 5d 20 7b 62 72 65 61 6b 7d  $yend  ] {break}
8950: 0d 0a 0d 0a 20 20 20 20 20 20 20 69 66 20 7b 20  ....       if { 
8960: 24 69 25 32 20 3d 3d 20 30 20 7d 20 7b 0d 0a 20  $i%2 == 0 } {.. 
8970: 20 20 20 20 20 20 20 20 20 20 73 65 74 20 74 61            set ta
8980: 67 20 6f 64 64 0d 0a 20 20 20 20 20 20 20 7d 20  g odd..       } 
8990: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
89a0: 20 20 20 73 65 74 20 74 61 67 20 65 76 65 6e 0d     set tag even.
89b0: 0a 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20  .       }..     
89c0: 20 20 24 77 20 63 72 65 61 74 65 20 72 65 63 74    $w create rect
89d0: 61 6e 67 6c 65 20 30 20 20 20 24 79 31 20 24 78  angle 0   $y1 $x
89e0: 31 20 24 79 32 20 2d 66 69 6c 6c 20 77 68 69 74  1 $y2 -fill whit
89f0: 65 20 2d 74 61 67 20 45 64 69 74 20 2d 6f 75 74  e -tag Edit -out
8a00: 6c 69 6e 65 20 77 68 69 74 65 0d 0a 20 20 20 20  line white..    
8a10: 20 20 20 24 77 20 63 72 65 61 74 65 20 72 65 63     $w create rec
8a20: 74 61 6e 67 6c 65 20 24 78 31 20 24 79 31 20 24  tangle $x1 $y1 $
8a30: 78 32 20 24 79 32 20 2d 66 69 6c 6c 20 77 68 69  x2 $y2 -fill whi
8a40: 74 65 20 2d 74 61 67 20 24 74 61 67 20 2d 6f 75  te -tag $tag -ou
8a50: 74 6c 69 6e 65 20 77 68 69 74 65 0d 0a 20 20 20  tline white..   
8a60: 7d 0d 0a 0d 0a 20 20 20 23 0d 0a 20 20 20 23 20  }....   #..   # 
8a70: 44 65 66 61 75 6c 74 20 63 6f 6c 6f 75 72 73 20  Default colours 
8a80: 61 6e 64 20 66 6f 6e 74 73 0d 0a 20 20 20 23 0d  and fonts..   #.
8a90: 0a 20 20 20 47 61 6e 74 74 43 6f 6c 6f 72 20 24  .   GanttColor $
8aa0: 77 20 64 65 73 63 72 69 70 74 69 6f 6e 20 62 6c  w description bl
8ab0: 61 63 6b 0d 0a 20 20 20 47 61 6e 74 74 43 6f 6c  ack..   GanttCol
8ac0: 6f 72 20 24 77 20 63 6f 6d 70 6c 65 74 65 64 20  or $w completed 
8ad0: 20 20 6c 69 67 68 74 62 6c 75 65 0d 0a 20 20 20    lightblue..   
8ae0: 47 61 6e 74 74 43 6f 6c 6f 72 20 24 77 20 6c 65  GanttColor $w le
8af0: 66 74 20 20 20 20 20 20 20 20 77 68 69 74 65 0d  ft        white.
8b00: 0a 20 20 20 47 61 6e 74 74 43 6f 6c 6f 72 20 24  .   GanttColor $
8b10: 77 20 6f 64 64 20 20 20 20 20 20 20 20 20 77 68  w odd         wh
8b20: 69 74 65 0d 0a 20 20 20 47 61 6e 74 74 43 6f 6c  ite..   GanttCol
8b30: 6f 72 20 24 77 20 65 76 65 6e 20 20 20 20 20 20  or $w even      
8b40: 20 20 6c 69 67 68 74 67 72 65 79 0d 0a 20 20 20    lightgrey..   
8b50: 47 61 6e 74 74 43 6f 6c 6f 72 20 24 77 20 73 75  GanttColor $w su
8b60: 6d 6d 61 72 79 20 20 20 20 20 62 6c 61 63 6b 0d  mmary     black.
8b70: 0a 20 20 20 47 61 6e 74 74 43 6f 6c 6f 72 20 24  .   GanttColor $
8b80: 77 20 73 75 6d 6d 61 72 79 62 61 72 20 20 62 6c  w summarybar  bl
8b90: 61 63 6b 0d 0a 20 20 20 47 61 6e 74 74 46 6f 6e  ack..   GanttFon
8ba0: 74 20 20 24 77 20 64 65 73 63 72 69 70 74 69 6f  t  $w descriptio
8bb0: 6e 20 22 74 69 6d 65 73 20 31 30 22 0d 0a 20 20  n "times 10"..  
8bc0: 20 47 61 6e 74 74 46 6f 6e 74 20 20 24 77 20 73   GanttFont  $w s
8bd0: 75 6d 6d 61 72 79 20 20 20 20 20 22 74 69 6d 65  ummary     "time
8be0: 73 20 31 30 20 62 6f 6c 64 22 0d 0a 20 20 20 47  s 10 bold"..   G
8bf0: 61 6e 74 74 46 6f 6e 74 20 20 24 77 20 73 63 61  anttFont  $w sca
8c00: 6c 65 20 20 20 20 20 20 20 22 74 69 6d 65 73 20  le       "times 
8c10: 37 22 0d 0a 20 20 20 44 65 66 61 75 6c 74 42 61  7"..   DefaultBa
8c20: 6c 6c 6f 6f 6e 20 24 77 0d 0a 0d 0a 20 20 20 72  lloon $w....   r
8c30: 65 74 75 72 6e 20 24 6e 65 77 63 68 61 72 74 0d  eturn $newchart.
8c40: 0a 7d 0d 0a 0d 0a 23 20 63 72 65 61 74 65 33 44  .}....# create3D
8c50: 50 6c 6f 74 20 2d 2d 0d 0a 23 20 20 20 20 43 72  Plot --..#    Cr
8c60: 65 61 74 65 20 61 20 73 69 6d 70 6c 65 20 33 44  eate a simple 3D
8c70: 20 70 6c 6f 74 0d 0a 23 20 41 72 67 75 6d 65 6e   plot..# Argumen
8c80: 74 73 3a 0d 0a 23 20 20 20 20 77 20 20 20 20 20  ts:..#    w     
8c90: 20 20 20 20 20 20 4e 61 6d 65 20 6f 66 20 74 68        Name of th
8ca0: 65 20 63 61 6e 76 61 73 0d 0a 23 20 20 20 20 78  e canvas..#    x
8cb0: 73 63 61 6c 65 20 20 20 20 20 20 4d 69 6e 69 6d  scale      Minim
8cc0: 75 6d 2c 20 6d 61 78 69 6d 75 6d 20 61 6e 64 20  um, maximum and 
8cd0: 73 74 65 70 20 66 6f 72 20 78 2d 61 78 69 73 20  step for x-axis 
8ce0: 28 69 6e 69 74 69 61 6c 29 0d 0a 23 20 20 20 20  (initial)..#    
8cf0: 79 73 63 61 6c 65 20 20 20 20 20 20 4d 69 6e 69  yscale      Mini
8d00: 6d 75 6d 2c 20 6d 61 78 69 6d 75 6d 20 61 6e 64  mum, maximum and
8d10: 20 73 74 65 70 20 66 6f 72 20 79 2d 61 78 69 73   step for y-axis
8d20: 0d 0a 23 20 20 20 20 7a 73 63 61 6c 65 20 20 20  ..#    zscale   
8d30: 20 20 20 4d 69 6e 69 6d 75 6d 2c 20 6d 61 78 69     Minimum, maxi
8d40: 6d 75 6d 20 61 6e 64 20 73 74 65 70 20 66 6f 72  mum and step for
8d50: 20 7a 2d 61 78 69 73 0d 0a 23 20 52 65 73 75 6c   z-axis..# Resul
8d60: 74 3a 0d 0a 23 20 20 20 20 4e 61 6d 65 20 6f 66  t:..#    Name of
8d70: 20 61 20 6e 65 77 20 63 6f 6d 6d 61 6e 64 0d 0a   a new command..
8d80: 23 20 4e 6f 74 65 3a 0d 0a 23 20 20 20 20 54 68  # Note:..#    Th
8d90: 65 20 65 6e 74 69 72 65 20 63 61 6e 76 61 73 20  e entire canvas 
8da0: 77 69 6c 6c 20 62 65 20 64 65 64 69 63 61 74 65  will be dedicate
8db0: 64 20 74 6f 20 74 68 65 20 33 44 20 70 6c 6f 74  d to the 3D plot
8dc0: 0d 0a 23 0d 0a 70 72 6f 63 20 3a 3a 50 6c 6f 74  ..#..proc ::Plot
8dd0: 63 68 61 72 74 3a 3a 63 72 65 61 74 65 33 44 50  chart::create3DP
8de0: 6c 6f 74 20 7b 20 77 20 78 73 63 61 6c 65 20 79  lot { w xscale y
8df0: 73 63 61 6c 65 20 7a 73 63 61 6c 65 20 7d 20 7b  scale zscale } {
8e00: 0d 0a 20 20 20 76 61 72 69 61 62 6c 65 20 64 61  ..   variable da
8e10: 74 61 5f 73 65 72 69 65 73 0d 0a 0d 0a 20 20 20  ta_series....   
8e20: 66 6f 72 65 61 63 68 20 73 20 5b 61 72 72 61 79  foreach s [array
8e30: 20 6e 61 6d 65 73 20 64 61 74 61 5f 73 65 72 69   names data_seri
8e40: 65 73 20 22 24 77 2c 2a 22 5d 20 7b 0d 0a 20 20  es "$w,*"] {..  
8e50: 20 20 20 20 75 6e 73 65 74 20 64 61 74 61 5f 73      unset data_s
8e60: 65 72 69 65 73 28 24 73 29 0d 0a 20 20 20 7d 0d  eries($s)..   }.
8e70: 0a 0d 0a 20 20 20 73 65 74 20 6e 65 77 63 68 61  ...   set newcha
8e80: 72 74 20 22 33 64 70 6c 6f 74 5f 24 77 22 0d 0a  rt "3dplot_$w"..
8e90: 20 20 20 69 6e 74 65 72 70 20 61 6c 69 61 73 20     interp alias 
8ea0: 7b 7d 20 24 6e 65 77 63 68 61 72 74 20 7b 7d 20  {} $newchart {} 
8eb0: 3a 3a 50 6c 6f 74 63 68 61 72 74 3a 3a 50 6c 6f  ::Plotchart::Plo
8ec0: 74 48 61 6e 64 6c 65 72 20 33 64 70 6c 6f 74 20  tHandler 3dplot 
8ed0: 24 77 0d 0a 0d 0a 20 20 20 66 6f 72 65 61 63 68  $w....   foreach
8ee0: 20 7b 70 78 6d 69 6e 20 70 79 6d 69 6e 20 70 78   {pxmin pymin px
8ef0: 6d 61 78 20 70 79 6d 61 78 7d 20 5b 4d 61 72 67  max pymax} [Marg
8f00: 69 6e 73 33 44 50 6c 6f 74 20 24 77 5d 20 7b 62  ins3DPlot $w] {b
8f10: 72 65 61 6b 7d 0d 0a 0d 0a 20 20 20 66 6f 72 65  reak}....   fore
8f20: 61 63 68 20 7b 78 6d 69 6e 20 78 6d 61 78 20 78  ach {xmin xmax x
8f30: 73 74 65 70 7d 20 24 78 73 63 61 6c 65 20 7b 62  step} $xscale {b
8f40: 72 65 61 6b 7d 0d 0a 20 20 20 66 6f 72 65 61 63  reak}..   foreac
8f50: 68 20 7b 79 6d 69 6e 20 79 6d 61 78 20 79 73 74  h {ymin ymax yst
8f60: 65 70 7d 20 24 79 73 63 61 6c 65 20 7b 62 72 65  ep} $yscale {bre
8f70: 61 6b 7d 0d 0a 20 20 20 66 6f 72 65 61 63 68 20  ak}..   foreach 
8f80: 7b 7a 6d 69 6e 20 7a 6d 61 78 20 7a 73 74 65 70  {zmin zmax zstep
8f90: 7d 20 24 7a 73 63 61 6c 65 20 7b 62 72 65 61 6b  } $zscale {break
8fa0: 7d 0d 0a 0d 0a 20 20 20 76 69 65 77 50 6f 72 74  }....   viewPort
8fb0: 20 20 20 20 20 20 20 20 20 20 20 24 77 20 24 70             $w $p
8fc0: 78 6d 69 6e 20 24 70 79 6d 69 6e 20 24 70 78 6d  xmin $pymin $pxm
8fd0: 61 78 20 24 70 79 6d 61 78 0d 0a 20 20 20 77 6f  ax $pymax..   wo
8fe0: 72 6c 64 33 44 43 6f 6f 72 64 69 6e 61 74 65 73  rld3DCoordinates
8ff0: 20 24 77 20 24 78 6d 69 6e 20 20 24 79 6d 69 6e   $w $xmin  $ymin
9000: 20 20 24 7a 6d 69 6e 20 20 24 78 6d 61 78 20 20    $zmin  $xmax  
9010: 24 79 6d 61 78 20 24 7a 6d 61 78 0d 0a 0d 0a 20  $ymax $zmax.... 
9020: 20 20 44 72 61 77 33 44 41 78 65 73 20 20 20 20    Draw3DAxes    
9030: 20 20 20 20 20 24 77 20 24 78 6d 69 6e 20 20 24       $w $xmin  $
9040: 79 6d 69 6e 20 20 24 7a 6d 69 6e 20 20 24 78 6d  ymin  $zmin  $xm
9050: 61 78 20 20 24 79 6d 61 78 20 24 7a 6d 61 78 20  ax  $ymax $zmax 
9060: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
9070: 20 20 20 20 20 20 20 20 20 20 20 20 24 78 73 74              $xst
9080: 65 70 20 24 79 73 74 65 70 20 24 7a 73 74 65 70  ep $ystep $zstep
9090: 0d 0a 20 20 20 44 65 66 61 75 6c 74 4c 65 67 65  ..   DefaultLege
90a0: 6e 64 20 20 20 20 20 20 24 77 0d 0a 20 20 20 44  nd      $w..   D
90b0: 65 66 61 75 6c 74 42 61 6c 6c 6f 6f 6e 20 20 20  efaultBalloon   
90c0: 20 20 24 77 0d 0a 0d 0a 20 20 20 53 65 74 43 6f    $w....   SetCo
90d0: 6c 6f 75 72 73 20 24 77 20 67 72 65 79 20 62 6c  lours $w grey bl
90e0: 61 63 6b 0d 0a 0d 0a 20 20 20 72 65 74 75 72 6e  ack....   return
90f0: 20 24 6e 65 77 63 68 61 72 74 0d 0a 7d 0d 0a 0d   $newchart..}...
9100: 0a 23 20 63 72 65 61 74 65 33 44 42 61 72 63 68  .# create3DBarch
9110: 61 72 74 20 2d 2d 0d 0a 23 20 20 20 20 43 72 65  art --..#    Cre
9120: 61 74 65 20 61 20 63 6f 6d 6d 61 6e 64 20 66 6f  ate a command fo
9130: 72 20 64 72 61 77 69 6e 67 20 61 20 62 61 72 63  r drawing a barc
9140: 68 61 72 74 20 77 69 74 68 20 76 65 72 74 69 63  hart with vertic
9150: 61 6c 20 33 44 20 62 61 72 73 0d 0a 23 20 41 72  al 3D bars..# Ar
9160: 67 75 6d 65 6e 74 73 3a 0d 0a 23 20 20 20 20 77  guments:..#    w
9170: 20 20 20 20 20 20 20 20 20 20 20 4e 61 6d 65 20             Name 
9180: 6f 66 20 74 68 65 20 63 61 6e 76 61 73 0d 0a 23  of the canvas..#
9190: 20 20 20 20 79 73 63 61 6c 65 20 20 20 20 20 20      yscale      
91a0: 4d 69 6e 69 6d 75 6d 2c 20 6d 61 78 69 6d 75 6d  Minimum, maximum
91b0: 20 61 6e 64 20 73 74 65 70 20 66 6f 72 20 79 2d   and step for y-
91c0: 61 78 69 73 0d 0a 23 20 20 20 20 6e 6f 62 61 72  axis..#    nobar
91d0: 73 20 20 20 20 20 20 4e 75 6d 62 65 72 20 6f 66  s      Number of
91e0: 20 62 61 72 73 20 74 6f 20 62 65 20 64 72 61 77   bars to be draw
91f0: 6e 0d 0a 23 20 52 65 73 75 6c 74 3a 0d 0a 23 20  n..# Result:..# 
9200: 20 20 20 4e 61 6d 65 20 6f 66 20 61 20 6e 65 77     Name of a new
9210: 20 63 6f 6d 6d 61 6e 64 0d 0a 23 20 4e 6f 74 65   command..# Note
9220: 3a 0d 0a 23 20 20 20 20 54 68 65 20 65 6e 74 69  :..#    The enti
9230: 72 65 20 63 61 6e 76 61 73 20 77 69 6c 6c 20 62  re canvas will b
9240: 65 20 64 65 64 69 63 61 74 65 64 20 74 6f 20 74  e dedicated to t
9250: 68 65 20 62 61 72 63 68 61 72 74 2e 0d 0a 23 0d  he barchart...#.
9260: 0a 70 72 6f 63 20 3a 3a 50 6c 6f 74 63 68 61 72  .proc ::Plotchar
9270: 74 3a 3a 63 72 65 61 74 65 33 44 42 61 72 63 68  t::create3DBarch
9280: 61 72 74 20 7b 20 77 20 79 73 63 61 6c 65 20 6e  art { w yscale n
9290: 6f 62 61 72 73 20 7d 20 7b 0d 0a 20 20 20 76 61  obars } {..   va
92a0: 72 69 61 62 6c 65 20 64 61 74 61 5f 73 65 72 69  riable data_seri
92b0: 65 73 0d 0a 0d 0a 20 20 20 66 6f 72 65 61 63 68  es....   foreach
92c0: 20 73 20 5b 61 72 72 61 79 20 6e 61 6d 65 73 20   s [array names 
92d0: 64 61 74 61 5f 73 65 72 69 65 73 20 22 24 77 2c  data_series "$w,
92e0: 2a 22 5d 20 7b 0d 0a 20 20 20 20 20 20 75 6e 73  *"] {..      uns
92f0: 65 74 20 64 61 74 61 5f 73 65 72 69 65 73 28 24  et data_series($
9300: 73 29 0d 0a 20 20 20 7d 0d 0a 0d 0a 20 20 20 73  s)..   }....   s
9310: 65 74 20 6e 65 77 63 68 61 72 74 20 22 33 64 62  et newchart "3db
9320: 61 72 63 68 61 72 74 5f 24 77 22 0d 0a 20 20 20  archart_$w"..   
9330: 69 6e 74 65 72 70 20 61 6c 69 61 73 20 7b 7d 20  interp alias {} 
9340: 24 6e 65 77 63 68 61 72 74 20 7b 7d 20 3a 3a 50  $newchart {} ::P
9350: 6c 6f 74 63 68 61 72 74 3a 3a 50 6c 6f 74 48 61  lotchart::PlotHa
9360: 6e 64 6c 65 72 20 33 64 62 61 72 73 20 24 77 0d  ndler 3dbars $w.
9370: 0a 0d 0a 20 20 20 66 6f 72 65 61 63 68 20 7b 70  ...   foreach {p
9380: 78 6d 69 6e 20 70 79 6d 69 6e 20 70 78 6d 61 78  xmin pymin pxmax
9390: 20 70 79 6d 61 78 7d 20 5b 4d 61 72 67 69 6e 73   pymax} [Margins
93a0: 52 65 63 74 61 6e 67 6c 65 20 24 77 20 34 5d 20  Rectangle $w 4] 
93b0: 7b 62 72 65 61 6b 7d 0d 0a 0d 0a 20 20 20 73 65  {break}....   se
93c0: 74 20 78 6d 69 6e 20 20 30 2e 30 0d 0a 20 20 20  t xmin  0.0..   
93d0: 73 65 74 20 78 6d 61 78 20 20 5b 65 78 70 72 20  set xmax  [expr 
93e0: 7b 24 6e 6f 62 61 72 73 20 2b 20 30 2e 31 7d 5d  {$nobars + 0.1}]
93f0: 0d 0a 0d 0a 20 20 20 66 6f 72 65 61 63 68 20 7b  ....   foreach {
9400: 79 6d 69 6e 20 79 6d 61 78 20 79 64 65 6c 74 7d  ymin ymax ydelt}
9410: 20 24 79 73 63 61 6c 65 20 7b 62 72 65 61 6b 7d   $yscale {break}
9420: 0d 0a 0d 0a 20 20 20 69 66 20 7b 20 24 79 64 65  ....   if { $yde
9430: 6c 74 20 3d 3d 20 30 2e 30 20 7d 20 7b 0d 0a 20  lt == 0.0 } {.. 
9440: 20 20 20 20 20 72 65 74 75 72 6e 20 2d 63 6f 64       return -cod
9450: 65 20 65 72 72 6f 72 20 22 53 74 65 70 20 73 69  e error "Step si
9460: 7a 65 20 63 61 6e 20 6e 6f 74 20 62 65 20 7a 65  ze can not be ze
9470: 72 6f 22 0d 0a 20 20 20 7d 0d 0a 0d 0a 20 20 20  ro"..   }....   
9480: 69 66 20 7b 20 28 24 79 6d 61 78 2d 24 79 6d 69  if { ($ymax-$ymi
9490: 6e 29 2a 24 79 64 65 6c 74 20 3c 20 30 2e 30 20  n)*$ydelt < 0.0 
94a0: 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65 74 20 79  } {..      set y
94b0: 64 65 6c 74 20 5b 65 78 70 72 20 7b 2d 24 79 64  delt [expr {-$yd
94c0: 65 6c 74 7d 5d 0d 0a 20 20 20 7d 0d 0a 0d 0a 20  elt}]..   }.... 
94d0: 20 20 76 69 65 77 50 6f 72 74 20 20 20 20 20 20    viewPort      
94e0: 20 20 20 24 77 20 24 70 78 6d 69 6e 20 24 70 79     $w $pxmin $py
94f0: 6d 69 6e 20 24 70 78 6d 61 78 20 24 70 79 6d 61  min $pxmax $pyma
9500: 78 0d 0a 20 20 20 77 6f 72 6c 64 43 6f 6f 72 64  x..   worldCoord
9510: 69 6e 61 74 65 73 20 24 77 20 24 78 6d 69 6e 20  inates $w $xmin 
9520: 20 24 79 6d 69 6e 20 20 24 78 6d 61 78 20 20 24   $ymin  $xmax  $
9530: 79 6d 61 78 0d 0a 0d 0a 20 20 20 44 72 61 77 59  ymax....   DrawY
9540: 61 78 69 73 20 20 20 20 20 20 20 20 24 77 20 24  axis        $w $
9550: 79 6d 69 6e 20 20 24 79 6d 61 78 20 20 24 79 64  ymin  $ymax  $yd
9560: 65 6c 74 0d 0a 20 20 23 44 72 61 77 4d 61 73 6b  elt..  #DrawMask
9570: 20 20 20 20 20 20 20 20 20 24 77 20 2d 2d 20 6e           $w -- n
9580: 6f 6e 65 21 0d 0a 20 20 20 44 72 61 77 33 44 42  one!..   Draw3DB
9590: 61 72 63 68 61 72 74 20 20 20 24 77 20 24 79 73  archart   $w $ys
95a0: 63 61 6c 65 20 24 6e 6f 62 61 72 73 0d 0a 20 20  cale $nobars..  
95b0: 20 44 65 66 61 75 6c 74 4c 65 67 65 6e 64 20 20   DefaultLegend  
95c0: 20 20 24 77 0d 0a 20 20 20 44 65 66 61 75 6c 74    $w..   Default
95d0: 42 61 6c 6c 6f 6f 6e 20 20 20 24 77 0d 0a 0d 0a  Balloon   $w....
95e0: 20 20 20 72 65 74 75 72 6e 20 24 6e 65 77 63 68     return $newch
95f0: 61 72 74 0d 0a 7d 0d 0a 0d 0a 23 20 63 72 65 61  art..}....# crea
9600: 74 65 52 61 64 69 61 6c 63 68 61 72 74 20 2d 2d  teRadialchart --
9610: 0d 0a 23 20 20 20 20 43 72 65 61 74 65 20 61 20  ..#    Create a 
9620: 63 6f 6d 6d 61 6e 64 20 66 6f 72 20 64 72 61 77  command for draw
9630: 69 6e 67 20 61 20 72 61 64 69 61 6c 20 63 68 61  ing a radial cha
9640: 72 74 0d 0a 23 20 41 72 67 75 6d 65 6e 74 73 3a  rt..# Arguments:
9650: 0d 0a 23 20 20 20 20 77 20 20 20 20 20 20 20 20  ..#    w        
9660: 20 20 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63     Name of the c
9670: 61 6e 76 61 73 0d 0a 23 20 20 20 20 6e 61 6d 65  anvas..#    name
9680: 73 20 20 20 20 20 20 20 4e 61 6d 65 73 20 6f 66  s       Names of
9690: 20 74 68 65 20 73 70 6f 6b 65 73 0d 0a 23 20 20   the spokes..#  
96a0: 20 20 73 63 61 6c 65 20 20 20 20 20 20 20 53 63    scale       Sc
96b0: 61 6c 65 20 66 61 63 74 6f 72 20 66 6f 72 20 74  ale factor for t
96c0: 68 65 20 64 61 74 61 0d 0a 23 20 20 20 20 73 74  he data..#    st
96d0: 79 6c 65 20 20 20 20 20 20 20 28 4f 70 74 69 6f  yle       (Optio
96e0: 6e 61 6c 29 20 73 74 79 6c 65 20 6f 66 20 74 68  nal) style of th
96f0: 65 20 63 68 61 72 74 20 28 6c 69 6e 65 73 2c 20  e chart (lines, 
9700: 63 75 6d 75 6c 61 74 69 76 65 20 6f 72 20 66 69  cumulative or fi
9710: 6c 6c 65 64 29 0d 0a 23 20 52 65 73 75 6c 74 3a  lled)..# Result:
9720: 0d 0a 23 20 20 20 20 4e 61 6d 65 20 6f 66 20 61  ..#    Name of a
9730: 20 6e 65 77 20 63 6f 6d 6d 61 6e 64 0d 0a 23 20   new command..# 
9740: 4e 6f 74 65 3a 0d 0a 23 20 20 20 20 54 68 65 20  Note:..#    The 
9750: 65 6e 74 69 72 65 20 63 61 6e 76 61 73 20 77 69  entire canvas wi
9760: 6c 6c 20 62 65 20 64 65 64 69 63 61 74 65 64 20  ll be dedicated 
9770: 74 6f 20 74 68 65 20 72 61 64 69 61 6c 20 63 68  to the radial ch
9780: 61 72 74 2e 0d 0a 23 0d 0a 70 72 6f 63 20 3a 3a  art...#..proc ::
9790: 50 6c 6f 74 63 68 61 72 74 3a 3a 63 72 65 61 74  Plotchart::creat
97a0: 65 52 61 64 69 61 6c 63 68 61 72 74 20 7b 20 77  eRadialchart { w
97b0: 20 6e 61 6d 65 73 20 73 63 61 6c 65 20 7b 73 74   names scale {st
97c0: 79 6c 65 20 6c 69 6e 65 73 7d 20 7d 20 7b 0d 0a  yle lines} } {..
97d0: 20 20 20 76 61 72 69 61 62 6c 65 20 73 65 74 74     variable sett
97e0: 69 6e 67 73 0d 0a 20 20 20 76 61 72 69 61 62 6c  ings..   variabl
97f0: 65 20 64 61 74 61 5f 73 65 72 69 65 73 0d 0a 0d  e data_series...
9800: 0a 20 20 20 66 6f 72 65 61 63 68 20 73 20 5b 61  .   foreach s [a
9810: 72 72 61 79 20 6e 61 6d 65 73 20 64 61 74 61 5f  rray names data_
9820: 73 65 72 69 65 73 20 22 24 77 2c 2a 22 5d 20 7b  series "$w,*"] {
9830: 0d 0a 20 20 20 20 20 20 75 6e 73 65 74 20 64 61  ..      unset da
9840: 74 61 5f 73 65 72 69 65 73 28 24 73 29 0d 0a 20  ta_series($s).. 
9850: 20 20 7d 0d 0a 0d 0a 20 20 20 73 65 74 20 6e 65    }....   set ne
9860: 77 63 68 61 72 74 20 22 72 61 64 69 61 6c 63 68  wchart "radialch
9870: 61 72 74 5f 24 77 22 0d 0a 20 20 20 69 6e 74 65  art_$w"..   inte
9880: 72 70 20 61 6c 69 61 73 20 7b 7d 20 24 6e 65 77  rp alias {} $new
9890: 63 68 61 72 74 20 7b 7d 20 3a 3a 50 6c 6f 74 63  chart {} ::Plotc
98a0: 68 61 72 74 3a 3a 50 6c 6f 74 48 61 6e 64 6c 65  hart::PlotHandle
98b0: 72 20 72 61 64 69 61 6c 63 68 61 72 74 20 24 77  r radialchart $w
98c0: 0d 0a 0d 0a 20 20 20 66 6f 72 65 61 63 68 20 7b  ....   foreach {
98d0: 70 78 6d 69 6e 20 70 79 6d 69 6e 20 70 78 6d 61  pxmin pymin pxma
98e0: 78 20 70 79 6d 61 78 7d 20 5b 4d 61 72 67 69 6e  x pymax} [Margin
98f0: 73 43 69 72 63 6c 65 20 24 77 5d 20 7b 62 72 65  sCircle $w] {bre
9900: 61 6b 7d 0d 0a 0d 0a 20 20 20 76 69 65 77 50 6f  ak}....   viewPo
9910: 72 74 20 24 77 20 24 70 78 6d 69 6e 20 24 70 79  rt $w $pxmin $py
9920: 6d 69 6e 20 24 70 78 6d 61 78 20 24 70 79 6d 61  min $pxmax $pyma
9930: 78 0d 0a 20 20 20 24 77 20 63 72 65 61 74 65 20  x..   $w create 
9940: 6f 76 61 6c 20 24 70 78 6d 69 6e 20 24 70 79 6d  oval $pxmin $pym
9950: 69 6e 20 24 70 78 6d 61 78 20 24 70 79 6d 61 78  in $pxmax $pymax
9960: 0d 0a 0d 0a 20 20 20 73 65 74 20 73 65 74 74 69  ....   set setti
9970: 6e 67 73 28 24 77 2c 73 63 61 6c 65 29 20 20 5b  ngs($w,scale)  [
9980: 65 78 70 72 20 7b 64 6f 75 62 6c 65 28 24 73 63  expr {double($sc
9990: 61 6c 65 29 7d 5d 0d 0a 20 20 20 73 65 74 20 73  ale)}]..   set s
99a0: 65 74 74 69 6e 67 73 28 24 77 2c 73 74 79 6c 65  ettings($w,style
99b0: 29 20 20 24 73 74 79 6c 65 0d 0a 20 20 20 73 65  )  $style..   se
99c0: 74 20 73 65 74 74 69 6e 67 73 28 24 77 2c 6e 75  t settings($w,nu
99d0: 6d 62 65 72 29 20 5b 6c 6c 65 6e 67 74 68 20 24  mber) [llength $
99e0: 6e 61 6d 65 73 5d 0d 0a 0d 0a 20 20 20 44 72 61  names]....   Dra
99f0: 77 52 61 64 69 61 6c 53 70 6f 6b 65 73 20 24 77  wRadialSpokes $w
9a00: 20 24 6e 61 6d 65 73 0d 0a 20 20 20 44 65 66 61   $names..   Defa
9a10: 75 6c 74 4c 65 67 65 6e 64 20 20 24 77 0d 0a 20  ultLegend  $w.. 
9a20: 20 20 44 65 66 61 75 6c 74 42 61 6c 6c 6f 6f 6e    DefaultBalloon
9a30: 20 24 77 0d 0a 0d 0a 20 20 20 72 65 74 75 72 6e   $w....   return
9a40: 20 24 6e 65 77 63 68 61 72 74 0d 0a 7d 0d 0a 0d   $newchart..}...
9a50: 0a 23 20 63 72 65 61 74 65 54 58 50 6c 6f 74 20  .# createTXPlot 
9a60: 2d 2d 0d 0a 23 20 20 20 20 43 72 65 61 74 65 20  --..#    Create 
9a70: 61 20 63 6f 6d 6d 61 6e 64 20 66 6f 72 20 64 72  a command for dr
9a80: 61 77 69 6e 67 20 61 20 54 58 20 70 6c 6f 74 20  awing a TX plot 
9a90: 28 78 20 76 65 72 73 75 73 20 64 61 74 65 2f 74  (x versus date/t
9aa0: 69 6d 65 29 0d 0a 23 20 41 72 67 75 6d 65 6e 74  ime)..# Argument
9ab0: 73 3a 0d 0a 23 20 20 20 20 77 20 20 20 20 20 20  s:..#    w      
9ac0: 20 20 20 20 20 4e 61 6d 65 20 6f 66 20 74 68 65       Name of the
9ad0: 20 63 61 6e 76 61 73 0d 0a 23 20 20 20 20 74 73   canvas..#    ts
9ae0: 63 61 6c 65 20 20 20 20 20 20 4d 69 6e 69 6d 75  cale      Minimu
9af0: 6d 2c 20 6d 61 78 69 6d 75 6d 20 61 6e 64 20 73  m, maximum and s
9b00: 74 65 70 20 66 6f 72 20 64 61 74 65 2f 74 69 6d  tep for date/tim
9b10: 65 2d 61 78 69 73 20 28 69 6e 69 74 69 61 6c 29  e-axis (initial)
9b20: 0d 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20  ..#             
9b30: 20 20 20 28 76 61 6c 75 65 73 20 6d 75 73 74 20     (values must 
9b40: 62 65 20 76 61 6c 69 64 20 64 61 74 65 73 20 61  be valid dates a
9b50: 6e 64 20 74 68 65 20 73 74 65 70 20 69 73 20 69  nd the step is i
9b60: 6e 20 64 61 79 73 29 0d 0a 23 20 20 20 20 78 73  n days)..#    xs
9b70: 63 61 6c 65 20 20 20 20 20 20 4d 69 6e 69 6d 75  cale      Minimu
9b80: 6d 2c 20 6d 61 78 69 6d 75 6d 20 61 6e 64 20 73  m, maximum and s
9b90: 74 65 70 20 66 6f 72 20 76 65 72 74 69 63 61 6c  tep for vertical
9ba0: 20 61 78 69 73 0d 0a 23 20 52 65 73 75 6c 74 3a   axis..# Result:
9bb0: 0d 0a 23 20 20 20 20 4e 61 6d 65 20 6f 66 20 61  ..#    Name of a
9bc0: 20 6e 65 77 20 63 6f 6d 6d 61 6e 64 0d 0a 23 20   new command..# 
9bd0: 4e 6f 74 65 3a 0d 0a 23 20 20 20 20 54 68 65 20  Note:..#    The 
9be0: 65 6e 74 69 72 65 20 63 61 6e 76 61 73 20 77 69  entire canvas wi
9bf0: 6c 6c 20 62 65 20 64 65 64 69 63 61 74 65 64 20  ll be dedicated 
9c00: 74 6f 20 74 68 65 20 54 58 20 70 6c 6f 74 2e 0d  to the TX plot..
9c10: 0a 23 20 20 20 20 54 68 65 20 70 6c 6f 74 20 77  .#    The plot w
9c20: 69 6c 6c 20 62 65 20 64 72 61 77 6e 20 77 69 74  ill be drawn wit
9c30: 68 20 61 78 65 73 0d 0a 23 0d 0a 70 72 6f 63 20  h axes..#..proc 
9c40: 3a 3a 50 6c 6f 74 63 68 61 72 74 3a 3a 63 72 65  ::Plotchart::cre
9c50: 61 74 65 54 58 50 6c 6f 74 20 7b 20 77 20 74 73  ateTXPlot { w ts
9c60: 63 61 6c 65 20 78 73 63 61 6c 65 20 7d 20 7b 0d  cale xscale } {.
9c70: 0a 20 20 20 76 61 72 69 61 62 6c 65 20 64 61 74  .   variable dat
9c80: 61 5f 73 65 72 69 65 73 0d 0a 0d 0a 20 20 20 66  a_series....   f
9c90: 6f 72 65 61 63 68 20 73 20 5b 61 72 72 61 79 20  oreach s [array 
9ca0: 6e 61 6d 65 73 20 64 61 74 61 5f 73 65 72 69 65  names data_serie
9cb0: 73 20 22 24 77 2c 2a 22 5d 20 7b 0d 0a 20 20 20  s "$w,*"] {..   
9cc0: 20 20 20 75 6e 73 65 74 20 64 61 74 61 5f 73 65     unset data_se
9cd0: 72 69 65 73 28 24 73 29 0d 0a 20 20 20 7d 0d 0a  ries($s)..   }..
9ce0: 0d 0a 20 20 20 73 65 74 20 6e 65 77 63 68 61 72  ..   set newchar
9cf0: 74 20 22 74 78 70 6c 6f 74 5f 24 77 22 0d 0a 20  t "txplot_$w".. 
9d00: 20 20 69 6e 74 65 72 70 20 61 6c 69 61 73 20 7b    interp alias {
9d10: 7d 20 24 6e 65 77 63 68 61 72 74 20 7b 7d 20 3a  } $newchart {} :
9d20: 3a 50 6c 6f 74 63 68 61 72 74 3a 3a 50 6c 6f 74  :Plotchart::Plot
9d30: 48 61 6e 64 6c 65 72 20 74 78 70 6c 6f 74 20 24  Handler txplot $
9d40: 77 0d 0a 0d 0a 20 20 20 66 6f 72 65 61 63 68 20  w....   foreach 
9d50: 7b 70 78 6d 69 6e 20 70 79 6d 69 6e 20 70 78 6d  {pxmin pymin pxm
9d60: 61 78 20 70 79 6d 61 78 7d 20 5b 4d 61 72 67 69  ax pymax} [Margi
9d70: 6e 73 52 65 63 74 61 6e 67 6c 65 20 24 77 5d 20  nsRectangle $w] 
9d80: 7b 62 72 65 61 6b 7d 0d 0a 0d 0a 20 20 20 66 6f  {break}....   fo
9d90: 72 65 61 63 68 20 7b 74 6d 69 6e 20 74 6d 61 78  reach {tmin tmax
9da0: 20 74 64 65 6c 74 7d 20 24 74 73 63 61 6c 65 20   tdelt} $tscale 
9db0: 7b 62 72 65 61 6b 7d 0d 0a 0d 0a 20 20 20 73 65  {break}....   se
9dc0: 74 20 78 6d 69 6e 20 20 5b 63 6c 6f 63 6b 20 73  t xmin  [clock s
9dd0: 63 61 6e 20 24 74 6d 69 6e 5d 0d 0a 20 20 20 73  can $tmin]..   s
9de0: 65 74 20 78 6d 61 78 20 20 5b 63 6c 6f 63 6b 20  et xmax  [clock 
9df0: 73 63 61 6e 20 24 74 6d 61 78 5d 0d 0a 20 20 20  scan $tmax]..   
9e00: 73 65 74 20 78 64 65 6c 74 20 5b 65 78 70 72 20  set xdelt [expr 
9e10: 7b 38 36 34 30 30 2a 24 74 64 65 6c 74 7d 5d 0d  {86400*$tdelt}].
9e20: 0a 0d 0a 20 20 20 66 6f 72 65 61 63 68 20 7b 79  ...   foreach {y
9e30: 6d 69 6e 20 79 6d 61 78 20 79 64 65 6c 74 7d 20  min ymax ydelt} 
9e40: 24 78 73 63 61 6c 65 20 7b 62 72 65 61 6b 7d 0d  $xscale {break}.
9e50: 0a 0d 0a 20 20 20 69 66 20 7b 20 24 78 64 65 6c  ...   if { $xdel
9e60: 74 20 3d 3d 20 30 2e 30 20 7c 7c 20 24 79 64 65  t == 0.0 || $yde
9e70: 6c 74 20 3d 3d 20 30 2e 30 20 7d 20 7b 0d 0a 20  lt == 0.0 } {.. 
9e80: 20 20 20 20 20 72 65 74 75 72 6e 20 2d 63 6f 64       return -cod
9e90: 65 20 65 72 72 6f 72 20 22 53 74 65 70 20 73 69  e error "Step si
9ea0: 7a 65 20 63 61 6e 20 6e 6f 74 20 62 65 20 7a 65  ze can not be ze
9eb0: 72 6f 22 0d 0a 20 20 20 7d 0d 0a 0d 0a 20 20 20  ro"..   }....   
9ec0: 69 66 20 7b 20 28 24 78 6d 61 78 2d 24 78 6d 69  if { ($xmax-$xmi
9ed0: 6e 29 2a 24 78 64 65 6c 74 20 3c 20 30 2e 30 20  n)*$xdelt < 0.0 
9ee0: 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65 74 20 78  } {..      set x
9ef0: 64 65 6c 74 20 5b 65 78 70 72 20 7b 2d 24 78 64  delt [expr {-$xd
9f00: 65 6c 74 7d 5d 0d 0a 20 20 20 7d 0d 0a 20 20 20  elt}]..   }..   
9f10: 69 66 20 7b 20 28 24 79 6d 61 78 2d 24 79 6d 69  if { ($ymax-$ymi
9f20: 6e 29 2a 24 79 64 65 6c 74 20 3c 20 30 2e 30 20  n)*$ydelt < 0.0 
9f30: 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65 74 20 79  } {..      set y
9f40: 64 65 6c 74 20 5b 65 78 70 72 20 7b 2d 24 79 64  delt [expr {-$yd
9f50: 65 6c 74 7d 5d 0d 0a 20 20 20 7d 0d 0a 0d 0a 20  elt}]..   }.... 
9f60: 20 20 76 69 65 77 50 6f 72 74 20 20 20 20 20 20    viewPort      
9f70: 20 20 20 24 77 20 24 70 78 6d 69 6e 20 24 70 79     $w $pxmin $py
9f80: 6d 69 6e 20 24 70 78 6d 61 78 20 24 70 79 6d 61  min $pxmax $pyma
9f90: 78 0d 0a 20 20 20 77 6f 72 6c 64 43 6f 6f 72 64  x..   worldCoord
9fa0: 69 6e 61 74 65 73 20 24 77 20 24 78 6d 69 6e 20  inates $w $xmin 
9fb0: 20 24 79 6d 69 6e 20 20 24 78 6d 61 78 20 20 24   $ymin  $xmax  $
9fc0: 79 6d 61 78 0d 0a 0d 0a 20 20 20 44 72 61 77 59  ymax....   DrawY
9fd0: 61 78 69 73 20 20 20 20 20 20 20 20 24 77 20 24  axis        $w $
9fe0: 79 6d 69 6e 20 20 24 79 6d 61 78 20 20 24 79 64  ymin  $ymax  $yd
9ff0: 65 6c 74 0d 0a 20 20 20 44 72 61 77 54 69 6d 65  elt..   DrawTime
a000: 61 78 69 73 20 20 20 20 20 24 77 20 24 74 6d 69  axis     $w $tmi
a010: 6e 20 20 24 74 6d 61 78 20 20 24 74 64 65 6c 74  n  $tmax  $tdelt
a020: 0d 0a 20 20 20 44 72 61 77 4d 61 73 6b 20 20 20  ..   DrawMask   
a030: 20 20 20 20 20 20 24 77 0d 0a 20 20 20 44 65 66        $w..   Def
a040: 61 75 6c 74 4c 65 67 65 6e 64 20 20 20 20 24 77  aultLegend    $w
a050: 0d 0a 20 20 20 44 65 66 61 75 6c 74 42 61 6c 6c  ..   DefaultBall
a060: 6f 6f 6e 20 20 20 24 77 0d 0a 0d 0a 20 20 20 72  oon   $w....   r
a070: 65 74 75 72 6e 20 24 6e 65 77 63 68 61 72 74 0d  eturn $newchart.
a080: 0a 7d 0d 0a 0d 0a 23 20 63 72 65 61 74 65 52 69  .}....# createRi
a090: 67 68 74 41 78 69 73 20 2d 2d 0d 0a 23 20 20 20  ghtAxis --..#   
a0a0: 20 43 72 65 61 74 65 20 61 20 63 6f 6d 6d 61 6e   Create a comman
a0b0: 64 20 66 6f 72 20 64 72 61 77 69 6e 67 20 61 20  d for drawing a 
a0c0: 70 6c 6f 74 20 77 69 74 68 20 61 20 72 69 67 68  plot with a righ
a0d0: 74 20 61 78 69 73 0d 0a 23 20 41 72 67 75 6d 65  t axis..# Argume
a0e0: 6e 74 73 3a 0d 0a 23 20 20 20 20 77 20 20 20 20  nts:..#    w    
a0f0: 20 20 20 20 20 20 20 4e 61 6d 65 20 6f 66 20 74         Name of t
a100: 68 65 20 63 61 6e 76 61 73 0d 0a 23 20 20 20 20  he canvas..#    
a110: 79 73 63 61 6c 65 20 20 20 20 20 20 4d 69 6e 69  yscale      Mini
a120: 6d 75 6d 2c 20 6d 61 78 69 6d 75 6d 20 61 6e 64  mum, maximum and
a130: 20 73 74 65 70 20 66 6f 72 20 76 65 72 74 69 63   step for vertic
a140: 61 6c 20 61 78 69 73 0d 0a 23 20 52 65 73 75 6c  al axis..# Resul
a150: 74 3a 0d 0a 23 20 20 20 20 4e 61 6d 65 20 6f 66  t:..#    Name of
a160: 20 61 20 6e 65 77 20 63 6f 6d 6d 61 6e 64 0d 0a   a new command..
a170: 23 20 4e 6f 74 65 3a 0d 0a 23 20 20 20 20 54 68  # Note:..#    Th
a180: 69 73 20 63 6f 6d 6d 61 6e 64 20 72 65 71 75 69  is command requi
a190: 72 65 73 20 74 68 61 74 20 61 6e 6f 74 68 65 72  res that another
a1a0: 20 70 6c 6f 74 20 63 6f 6d 6d 61 6e 64 20 68 61   plot command ha
a1b0: 73 20 62 65 65 6e 0d 0a 23 20 20 20 20 63 72 65  s been..#    cre
a1c0: 61 74 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68  ated prior to th
a1d0: 69 73 20 6f 6e 65 2e 20 53 6f 6d 65 20 6f 66 20  is one. Some of 
a1e0: 74 68 65 20 70 72 6f 70 65 72 74 69 65 73 20 66  the properties f
a1f0: 72 6f 6d 20 74 68 61 74 0d 0a 23 20 20 20 20 63  rom that..#    c
a200: 6f 6d 6d 61 6e 64 20 73 65 72 76 65 20 66 6f 72  ommand serve for
a210: 20 74 68 69 73 20 6f 6e 65 20 74 6f 6f 2e 0d 0a   this one too...
a220: 23 0d 0a 70 72 6f 63 20 3a 3a 50 6c 6f 74 63 68  #..proc ::Plotch
a230: 61 72 74 3a 3a 63 72 65 61 74 65 52 69 67 68 74  art::createRight
a240: 41 78 69 73 20 7b 20 77 20 79 73 63 61 6c 65 20  Axis { w yscale 
a250: 7d 20 7b 0d 0a 20 20 20 76 61 72 69 61 62 6c 65  } {..   variable
a260: 20 64 61 74 61 5f 73 65 72 69 65 73 0d 0a 20 20   data_series..  
a270: 20 76 61 72 69 61 62 6c 65 20 73 63 61 6c 69 6e   variable scalin
a280: 67 0d 0a 0d 0a 20 20 20 73 65 74 20 6e 65 77 63  g....   set newc
a290: 68 61 72 74 20 22 72 69 67 68 74 5f 24 77 22 0d  hart "right_$w".
a2a0: 0a 0d 0a 20 20 20 23 0d 0a 20 20 20 23 20 43 68  ...   #..   # Ch
a2b0: 65 63 6b 20 69 66 20 74 68 65 72 65 20 69 73 20  eck if there is 
a2c0: 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 70  an appropriate p
a2d0: 6c 6f 74 20 61 6c 72 65 61 64 79 20 64 65 66 69  lot already defi
a2e0: 6e 65 64 20 2d 20 74 68 65 72 65 0d 0a 20 20 20  ned - there..   
a2f0: 23 20 73 68 6f 75 6c 64 20 62 65 20 6f 6e 6c 79  # should be only
a300: 20 6f 6e 65 21 0d 0a 20 20 20 23 0d 0a 20 20 20   one!..   #..   
a310: 69 66 20 7b 20 5b 6c 6c 65 6e 67 74 68 20 5b 69  if { [llength [i
a320: 6e 66 6f 20 63 6f 6d 6d 61 6e 64 20 22 2a 5f 24  nfo command "*_$
a330: 77 22 20 5d 5d 20 3d 3d 20 30 20 7d 20 7b 0d 0a  w" ]] == 0 } {..
a340: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 63         return -c
a350: 6f 64 65 20 65 72 72 6f 72 20 22 54 68 65 72 65  ode error "There
a360: 20 73 68 6f 75 6c 64 20 62 65 20 61 20 70 6c 6f   should be a plo
a370: 74 20 77 69 74 68 20 61 20 6c 65 66 74 20 61 78  t with a left ax
a380: 69 73 20 61 6c 72 65 61 64 79 20 64 65 66 69 6e  is already defin
a390: 65 64 22 0d 0a 20 20 20 7d 0d 0a 20 20 20 69 66  ed"..   }..   if
a3a0: 20 7b 20 5b 6c 6c 65 6e 67 74 68 20 5b 69 6e 66   { [llength [inf
a3b0: 6f 20 63 6f 6d 6d 61 6e 64 20 22 2a 5f 24 77 22  o command "*_$w"
a3c0: 20 5d 5d 20 21 3d 20 31 20 7d 20 7b 0d 0a 20 20   ]] != 1 } {..  
a3d0: 20 20 20 20 20 72 65 74 75 72 6e 20 2d 63 6f 64       return -cod
a3e0: 65 20 65 72 72 6f 72 20 22 54 68 65 72 65 20 73  e error "There s
a3f0: 68 6f 75 6c 64 20 62 65 20 6f 6e 6c 79 20 6f 6e  hould be only on
a400: 65 20 70 6c 6f 74 20 63 6f 6d 6d 61 6e 64 20 66  e plot command f
a410: 6f 72 20 74 68 69 73 20 77 69 64 67 65 74 20 28  or this widget (
a420: 24 77 29 22 0d 0a 20 20 20 7d 0d 0a 0d 0a 20 20  $w)"..   }....  
a430: 20 73 65 74 20 74 79 70 65 20 5b 6c 69 6e 64 65   set type [linde
a440: 78 20 5b 69 6e 74 65 72 70 20 61 6c 69 61 73 20  x [interp alias 
a450: 7b 7d 20 5b 69 6e 66 6f 20 63 6f 6d 6d 61 6e 64  {} [info command
a460: 20 22 2a 5f 24 77 22 5d 5d 20 31 5d 0d 0a 0d 0a   "*_$w"]] 1]....
a470: 20 20 20 69 6e 74 65 72 70 20 61 6c 69 61 73 20     interp alias 
a480: 7b 7d 20 24 6e 65 77 63 68 61 72 74 20 7b 7d 20  {} $newchart {} 
a490: 3a 3a 50 6c 6f 74 63 68 61 72 74 3a 3a 50 6c 6f  ::Plotchart::Plo
a4a0: 74 48 61 6e 64 6c 65 72 20 24 74 79 70 65 20 72  tHandler $type r
a4b0: 24 77 0d 0a 20 20 20 69 6e 74 65 72 70 20 61 6c  $w..   interp al
a4c0: 69 61 73 20 7b 7d 20 72 24 77 20 20 20 20 20 20  ias {} r$w      
a4d0: 20 7b 7d 20 24 77 0d 0a 0d 0a 20 20 20 73 65 74   {} $w....   set
a4e0: 20 78 6d 69 6e 20 24 73 63 61 6c 69 6e 67 28 24   xmin $scaling($
a4f0: 77 2c 78 6d 69 6e 29 0d 0a 20 20 20 73 65 74 20  w,xmin)..   set 
a500: 78 6d 61 78 20 24 73 63 61 6c 69 6e 67 28 24 77  xmax $scaling($w
a510: 2c 78 6d 61 78 29 0d 0a 0d 0a 20 20 20 73 65 74  ,xmax)....   set
a520: 20 70 78 6d 69 6e 20 24 73 63 61 6c 69 6e 67 28   pxmin $scaling(
a530: 24 77 2c 70 78 6d 69 6e 29 0d 0a 20 20 20 73 65  $w,pxmin)..   se
a540: 74 20 70 78 6d 61 78 20 24 73 63 61 6c 69 6e 67  t pxmax $scaling
a550: 28 24 77 2c 70 78 6d 61 78 29 0d 0a 20 20 20 73  ($w,pxmax)..   s
a560: 65 74 20 70 79 6d 69 6e 20 24 73 63 61 6c 69 6e  et pymin $scalin
a570: 67 28 24 77 2c 70 79 6d 69 6e 29 0d 0a 20 20 20  g($w,pymin)..   
a580: 73 65 74 20 70 79 6d 61 78 20 24 73 63 61 6c 69  set pymax $scali
a590: 6e 67 28 24 77 2c 70 79 6d 61 78 29 0d 0a 0d 0a  ng($w,pymax)....
a5a0: 20 20 20 66 6f 72 65 61 63 68 20 7b 79 6d 69 6e     foreach {ymin
a5b0: 20 79 6d 61 78 20 79 64 65 6c 74 7d 20 24 79 73   ymax ydelt} $ys
a5c0: 63 61 6c 65 20 7b 62 72 65 61 6b 7d 0d 0a 0d 0a  cale {break}....
a5d0: 20 20 20 69 66 20 7b 20 24 79 64 65 6c 74 20 3d     if { $ydelt =
a5e0: 3d 20 30 2e 30 20 7d 20 7b 0d 0a 20 20 20 20 20  = 0.0 } {..     
a5f0: 20 72 65 74 75 72 6e 20 2d 63 6f 64 65 20 65 72   return -code er
a600: 72 6f 72 20 22 53 74 65 70 20 73 69 7a 65 20 63  ror "Step size c
a610: 61 6e 20 6e 6f 74 20 62 65 20 7a 65 72 6f 22 0d  an not be zero".
a620: 0a 20 20 20 7d 0d 0a 0d 0a 20 20 20 69 66 20 7b  .   }....   if {
a630: 20 28 24 79 6d 61 78 2d 24 79 6d 69 6e 29 2a 24   ($ymax-$ymin)*$
a640: 79 64 65 6c 74 20 3c 20 30 2e 30 20 7d 20 7b 0d  ydelt < 0.0 } {.
a650: 0a 20 20 20 20 20 20 73 65 74 20 79 64 65 6c 74  .      set ydelt
a660: 20 5b 65 78 70 72 20 7b 2d 24 79 64 65 6c 74 7d   [expr {-$ydelt}
a670: 5d 0d 0a 20 20 20 7d 0d 0a 0d 0a 20 20 20 76 69  ]..   }....   vi
a680: 65 77 50 6f 72 74 20 20 20 20 20 20 20 20 20 72  ewPort         r
a690: 24 77 20 24 70 78 6d 69 6e 20 24 70 79 6d 69 6e  $w $pxmin $pymin
a6a0: 20 24 70 78 6d 61 78 20 24 70 79 6d 61 78 0d 0a   $pxmax $pymax..
a6b0: 20 20 20 77 6f 72 6c 64 43 6f 6f 72 64 69 6e 61     worldCoordina
a6c0: 74 65 73 20 72 24 77 20 24 78 6d 69 6e 20 20 24  tes r$w $xmin  $
a6d0: 79 6d 69 6e 20 20 24 78 6d 61 78 20 20 24 79 6d  ymin  $xmax  $ym
a6e0: 61 78 0d 0a 0d 0a 20 20 20 44 72 61 77 52 69 67  ax....   DrawRig
a6f0: 68 74 61 78 69 73 20 20 20 20 72 24 77 20 24 79  htaxis    r$w $y
a700: 6d 69 6e 20 20 24 79 6d 61 78 20 20 24 79 64 65  min  $ymax  $yde
a710: 6c 74 0d 0a 0d 0a 20 20 20 72 65 74 75 72 6e 20  lt....   return 
a720: 24 6e 65 77 63 68 61 72 74 0d 0a 7d 0d 0a 0d 0a  $newchart..}....
a730: 23 20 63 72 65 61 74 65 33 44 52 69 62 62 6f 6e  # create3DRibbon
a740: 43 68 61 72 74 20 2d 2d 0d 0a 23 20 20 20 20 43  Chart --..#    C
a750: 72 65 61 74 65 20 61 20 63 68 61 72 74 20 74 68  reate a chart th
a760: 61 74 20 63 61 6e 20 64 69 73 70 6c 61 79 20 33  at can display 3
a770: 44 20 6c 69 6e 65 73 20 61 6e 64 20 61 72 65 61  D lines and area
a780: 73 0d 0a 23 20 41 72 67 75 6d 65 6e 74 73 3a 0d  s..# Arguments:.
a790: 0a 23 20 20 20 20 77 20 20 20 20 20 20 20 20 20  .#    w         
a7a0: 20 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 61    Name of the ca
a7b0: 6e 76 61 73 0d 0a 23 20 20 20 20 6e 61 6d 65 73  nvas..#    names
a7c0: 20 20 20 20 20 20 20 4c 61 62 65 6c 73 20 61 6c         Labels al
a7d0: 6f 6e 67 20 74 68 65 20 78 2d 61 78 69 73 0d 0a  ong the x-axis..
a7e0: 23 20 20 20 20 79 73 63 61 6c 65 20 20 20 20 20  #    yscale     
a7f0: 20 4d 69 6e 69 6d 75 6d 2c 20 6d 61 78 69 6d 75   Minimum, maximu
a800: 6d 20 61 6e 64 20 73 74 65 70 20 66 6f 72 20 79  m and step for y
a810: 2d 61 78 69 73 0d 0a 23 20 20 20 20 7a 73 63 61  -axis..#    zsca
a820: 6c 65 20 20 20 20 20 20 4d 69 6e 69 6d 75 6d 2c  le      Minimum,
a830: 20 6d 61 78 69 6d 75 6d 20 61 6e 64 20 73 74 65   maximum and ste
a840: 70 20 66 6f 72 20 7a 2d 61 78 69 73 0d 0a 23 20  p for z-axis..# 
a850: 52 65 73 75 6c 74 3a 0d 0a 23 20 20 20 20 4e 61  Result:..#    Na
a860: 6d 65 20 6f 66 20 61 20 6e 65 77 20 63 6f 6d 6d  me of a new comm
a870: 61 6e 64 0d 0a 23 20 4e 6f 74 65 3a 0d 0a 23 20  and..# Note:..# 
a880: 20 20 20 54 68 65 20 65 6e 74 69 72 65 20 63 61     The entire ca
a890: 6e 76 61 73 20 77 69 6c 6c 20 62 65 20 64 65 64  nvas will be ded
a8a0: 69 63 61 74 65 64 20 74 6f 20 74 68 65 20 33 44  icated to the 3D
a8b0: 20 63 68 61 72 74 0d 0a 23 0d 0a 70 72 6f 63 20   chart..#..proc 
a8c0: 3a 3a 50 6c 6f 74 63 68 61 72 74 3a 3a 63 72 65  ::Plotchart::cre
a8d0: 61 74 65 33 44 52 69 62 62 6f 6e 43 68 61 72 74  ate3DRibbonChart
a8e0: 20 7b 20 77 20 6e 61 6d 65 73 20 79 73 63 61 6c   { w names yscal
a8f0: 65 20 7a 73 63 61 6c 65 20 7d 20 7b 0d 0a 20 20  e zscale } {..  
a900: 20 76 61 72 69 61 62 6c 65 20 64 61 74 61 5f 73   variable data_s
a910: 65 72 69 65 73 0d 0a 0d 0a 20 20 20 66 6f 72 65  eries....   fore
a920: 61 63 68 20 73 20 5b 61 72 72 61 79 20 6e 61 6d  ach s [array nam
a930: 65 73 20 64 61 74 61 5f 73 65 72 69 65 73 20 22  es data_series "
a940: 24 77 2c 2a 22 5d 20 7b 0d 0a 20 20 20 20 20 20  $w,*"] {..      
a950: 75 6e 73 65 74 20 64 61 74 61 5f 73 65 72 69 65  unset data_serie
a960: 73 28 24 73 29 0d 0a 20 20 20 7d 0d 0a 0d 0a 20  s($s)..   }.... 
a970: 20 20 73 65 74 20 6e 65 77 63 68 61 72 74 20 22    set newchart "
a980: 33 64 72 69 62 62 6f 6e 5f 24 77 22 0d 0a 20 20  3dribbon_$w"..  
a990: 20 69 6e 74 65 72 70 20 61 6c 69 61 73 20 7b 7d   interp alias {}
a9a0: 20 24 6e 65 77 63 68 61 72 74 20 7b 7d 20 3a 3a   $newchart {} ::
a9b0: 50 6c 6f 74 63 68 61 72 74 3a 3a 50 6c 6f 74 48  Plotchart::PlotH
a9c0: 61 6e 64 6c 65 72 20 33 64 72 69 62 62 6f 6e 20  andler 3dribbon 
a9d0: 24 77 0d 0a 0d 0a 20 20 20 66 6f 72 65 61 63 68  $w....   foreach
a9e0: 20 7b 70 78 6d 69 6e 20 70 79 6d 69 6e 20 70 78   {pxmin pymin px
a9f0: 6d 61 78 20 70 79 6d 61 78 7d 20 5b 4d 61 72 67  max pymax} [Marg
aa00: 69 6e 73 33 44 50 6c 6f 74 20 24 77 5d 20 7b 62  ins3DPlot $w] {b
aa10: 72 65 61 6b 7d 0d 0a 0d 0a 20 20 20 66 6f 72 65  reak}....   fore
aa20: 61 63 68 20 7b 78 6d 69 6e 20 78 6d 61 78 20 78  ach {xmin xmax x
aa30: 73 74 65 70 7d 20 7b 30 2e 30 20 31 2e 30 20 30  step} {0.0 1.0 0
aa40: 2e 30 7d 20 7b 62 72 65 61 6b 7d 0d 0a 20 20 20  .0} {break}..   
aa50: 66 6f 72 65 61 63 68 20 7b 79 6d 69 6e 20 79 6d  foreach {ymin ym
aa60: 61 78 20 79 73 74 65 70 7d 20 24 79 73 63 61 6c  ax ystep} $yscal
aa70: 65 20 7b 62 72 65 61 6b 7d 0d 0a 20 20 20 66 6f  e {break}..   fo
aa80: 72 65 61 63 68 20 7b 7a 6d 69 6e 20 7a 6d 61 78  reach {zmin zmax
aa90: 20 7a 73 74 65 70 7d 20 24 7a 73 63 61 6c 65 20   zstep} $zscale 
aaa0: 7b 62 72 65 61 6b 7d 0d 0a 0d 0a 20 20 20 73 65  {break}....   se
aab0: 74 20 78 73 74 65 70 20 5b 65 78 70 72 20 7b 31  t xstep [expr {1
aac0: 2e 30 2f 5b 6c 6c 65 6e 67 74 68 20 24 6e 61 6d  .0/[llength $nam
aad0: 65 73 5d 7d 5d 0d 0a 20 20 20 73 65 74 20 64 61  es]}]..   set da
aae0: 74 61 5f 73 65 72 69 65 73 28 24 77 2c 78 62 61  ta_series($w,xba
aaf0: 73 65 29 20 20 5b 65 78 70 72 20 7b 31 2e 30 2d  se)  [expr {1.0-
ab00: 30 2e 31 35 2a 24 78 73 74 65 70 7d 5d 0d 0a 20  0.15*$xstep}].. 
ab10: 20 20 73 65 74 20 64 61 74 61 5f 73 65 72 69 65    set data_serie
ab20: 73 28 24 77 2c 78 73 74 65 70 29 20 20 24 78 73  s($w,xstep)  $xs
ab30: 74 65 70 0d 0a 20 20 20 73 65 74 20 64 61 74 61  tep..   set data
ab40: 5f 73 65 72 69 65 73 28 24 77 2c 78 77 69 64 74  _series($w,xwidt
ab50: 68 29 20 5b 65 78 70 72 20 7b 30 2e 37 2a 24 78  h) [expr {0.7*$x
ab60: 73 74 65 70 7d 5d 0d 0a 0d 0a 20 20 20 76 69 65  step}]....   vie
ab70: 77 50 6f 72 74 20 20 20 20 20 20 20 20 20 20 20  wPort           
ab80: 24 77 20 24 70 78 6d 69 6e 20 24 70 79 6d 69 6e  $w $pxmin $pymin
ab90: 20 24 70 78 6d 61 78 20 24 70 79 6d 61 78 0d 0a   $pxmax $pymax..
aba0: 20 20 20 77 6f 72 6c 64 33 44 43 6f 6f 72 64 69     world3DCoordi
abb0: 6e 61 74 65 73 20 24 77 20 24 78 6d 69 6e 20 20  nates $w $xmin  
abc0: 24 79 6d 69 6e 20 20 24 7a 6d 69 6e 20 20 24 78  $ymin  $zmin  $x
abd0: 6d 61 78 20 20 24 79 6d 61 78 20 24 7a 6d 61 78  max  $ymax $zmax
abe0: 0d 0a 0d 0a 20 20 20 44 72 61 77 33 44 41 78 65  ....   Draw3DAxe
abf0: 73 20 20 20 20 20 20 20 20 20 24 77 20 24 78 6d  s         $w $xm
ac00: 69 6e 20 20 24 79 6d 69 6e 20 20 24 7a 6d 69 6e  in  $ymin  $zmin
ac10: 20 20 24 78 6d 61 78 20 20 24 79 6d 61 78 20 24    $xmax  $ymax $
ac20: 7a 6d 61 78 20 5c 0d 0a 20 20 20 20 20 20 20 20  zmax \..        
ac30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ac40: 20 24 78 73 74 65 70 20 24 79 73 74 65 70 20 24   $xstep $ystep $
ac50: 7a 73 74 65 70 20 24 6e 61 6d 65 73 0d 0a 20 20  zstep $names..  
ac60: 20 44 65 66 61 75 6c 74 4c 65 67 65 6e 64 20 20   DefaultLegend  
ac70: 20 20 20 20 24 77 0d 0a 20 20 20 44 65 66 61 75      $w..   Defau
ac80: 6c 74 42 61 6c 6c 6f 6f 6e 20 20 20 20 20 24 77  ltBalloon     $w
ac90: 0d 0a 0d 0a 20 20 20 53 65 74 43 6f 6c 6f 75 72  ....   SetColour
aca0: 73 20 24 77 20 67 72 65 79 20 62 6c 61 63 6b 0d  s $w grey black.
acb0: 0a 0d 0a 20 20 20 72 65 74 75 72 6e 20 24 6e 65  ...   return $ne
acc0: 77 63 68 61 72 74 0d 0a 7d 0d 0a 0d 0a 23 20 4c  wchart..}....# L
acd0: 6f 61 64 20 74 68 65 20 70 72 69 76 61 74 65 20  oad the private 
ace0: 70 72 6f 63 65 64 75 72 65 73 0d 0a 23 0d 0a 73  procedures..#..s
acf0: 6f 75 72 63 65 20 5b 66 69 6c 65 20 6a 6f 69 6e  ource [file join
ad00: 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d 65 20 5b   [file dirname [
ad10: 69 6e 66 6f 20 73 63 72 69 70 74 5d 5d 20 22 70  info script]] "p
ad20: 6c 6f 74 70 72 69 76 2e 74 63 6c 22 5d 0d 0a 73  lotpriv.tcl"]..s
ad30: 6f 75 72 63 65 20 5b 66 69 6c 65 20 6a 6f 69 6e  ource [file join
ad40: 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d 65 20 5b   [file dirname [
ad50: 69 6e 66 6f 20 73 63 72 69 70 74 5d 5d 20 22 70  info script]] "p
ad60: 6c 6f 74 61 78 69 73 2e 74 63 6c 22 5d 0d 0a 73  lotaxis.tcl"]..s
ad70: 6f 75 72 63 65 20 5b 66 69 6c 65 20 6a 6f 69 6e  ource [file join
ad80: 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d 65 20 5b   [file dirname [
ad90: 69 6e 66 6f 20 73 63 72 69 70 74 5d 5d 20 22 70  info script]] "p
ada0: 6c 6f 74 33 64 2e 74 63 6c 22 5d 0d 0a 73 6f 75  lot3d.tcl"]..sou
adb0: 72 63 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b  rce [file join [
adc0: 66 69 6c 65 20 64 69 72 6e 61 6d 65 20 5b 69 6e  file dirname [in
add0: 66 6f 20 73 63 72 69 70 74 5d 5d 20 22 73 63 61  fo script]] "sca
ade0: 6c 69 6e 67 2e 74 63 6c 22 5d 0d 0a 73 6f 75 72  ling.tcl"]..sour
adf0: 63 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b 66  ce [file join [f
ae00: 69 6c 65 20 64 69 72 6e 61 6d 65 20 5b 69 6e 66  ile dirname [inf
ae10: 6f 20 73 63 72 69 70 74 5d 5d 20 22 70 6c 6f 74  o script]] "plot
ae20: 63 6f 6e 74 6f 75 72 2e 74 63 6c 22 5d 0d 0a 73  contour.tcl"]..s
ae30: 6f 75 72 63 65 20 5b 66 69 6c 65 20 6a 6f 69 6e  ource [file join
ae40: 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d 65 20 5b   [file dirname [
ae50: 69 6e 66 6f 20 73 63 72 69 70 74 5d 5d 20 22 70  info script]] "p
ae60: 6c 6f 74 67 61 6e 74 74 2e 74 63 6c 22 5d 0d 0a  lotgantt.tcl"]..
ae70: 73 6f 75 72 63 65 20 5b 66 69 6c 65 20 6a 6f 69  source [file joi
ae80: 6e 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d 65 20  n [file dirname 
ae90: 5b 69 6e 66 6f 20 73 63 72 69 70 74 5d 5d 20 22  [info script]] "
aea0: 70 6c 6f 74 62 75 73 69 6e 65 73 73 2e 74 63 6c  plotbusiness.tcl
aeb0: 22 5d 0d 0a 73 6f 75 72 63 65 20 5b 66 69 6c 65  "]..source [file
aec0: 20 6a 6f 69 6e 20 5b 66 69 6c 65 20 64 69 72 6e   join [file dirn
aed0: 61 6d 65 20 5b 69 6e 66 6f 20 73 63 72 69 70 74  ame [info script
aee0: 5d 5d 20 22 70 6c 6f 74 61 6e 6e 6f 74 2e 74 63  ]] "plotannot.tc
aef0: 6c 22 5d 0d 0a 0d 0a 23 20 41 6e 6e 6f 75 6e 63  l"]....# Announc
af00: 65 20 6f 75 72 20 70 72 65 73 65 6e 63 65 0d 0a  e our presence..
af10: 23 0d 0a 70 61 63 6b 61 67 65 20 70 72 6f 76 69  #..package provi
af20: 64 65 20 50 6c 6f 74 63 68 61 72 74 20 31 2e 33  de Plotchart 1.3
af30: 2e 32 0d 0a                                      .2..