A Multi-Column Listbox
Hex Artifact Content
Not logged in

Artifact 39f5e2dbb1eb1e50e9c383c520ecada54e0a407f:

Attachment "plotchart.tcl" to ticket [2691870fff] added by relaxmike 2009-03-18 21:15:00.
0000: 23 20 70 6c 6f 74 63 68 61 72 74 2e 74 63 6c 20  # plotchart.tcl 
0010: 2d 2d 0a 23 20 20 20 20 46 61 63 69 6c 69 74 69  --.#    Faciliti
0020: 65 73 20 74 6f 20 64 72 61 77 20 73 69 6d 70 6c  es to draw simpl
0030: 65 20 70 6c 6f 74 73 20 69 6e 20 61 20 64 65 64  e plots in a ded
0040: 69 63 61 74 65 64 20 63 61 6e 76 61 73 0a 23 0a  icated canvas.#.
0050: 23 20 4e 6f 74 65 3a 0a 23 20 20 20 20 54 68 69  # Note:.#    Thi
0060: 73 20 73 6f 75 72 63 65 20 66 69 6c 65 20 63 6f  s source file co
0070: 6e 74 61 69 6e 73 20 74 68 65 20 70 75 62 6c 69  ntains the publi
0080: 63 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 23 20 20  c functions..#  
0090: 20 20 54 68 65 20 70 72 69 76 61 74 65 20 66 75    The private fu
00a0: 6e 63 74 69 6f 6e 73 20 61 72 65 20 63 6f 6e 74  nctions are cont
00b0: 61 69 6e 65 64 20 69 6e 20 74 68 65 20 66 69 6c  ained in the fil
00c0: 65 73 20 22 73 6f 75 72 63 65 64 22 0a 23 20 20  es "sourced".#  
00d0: 20 20 61 74 20 74 68 65 20 65 6e 64 2e 0a 23 0a    at the end..#.
00e0: 70 61 63 6b 61 67 65 20 72 65 71 75 69 72 65 20  package require 
00f0: 54 63 6c 20 38 2e 34 0a 70 61 63 6b 61 67 65 20  Tcl 8.4.package 
0100: 72 65 71 75 69 72 65 20 54 6b 0a 0a 23 20 50 6c  require Tk..# Pl
0110: 6f 74 63 68 61 72 74 20 2d 2d 0a 23 20 20 20 20  otchart --.#    
0120: 4e 61 6d 65 73 70 61 63 65 20 74 6f 20 68 6f 6c  Namespace to hol
0130: 64 20 74 68 65 20 70 72 6f 63 65 64 75 72 65 73  d the procedures
0140: 20 61 6e 64 20 74 68 65 20 70 72 69 76 61 74 65   and the private
0150: 20 64 61 74 61 0a 23 0a 6e 61 6d 65 73 70 61 63   data.#.namespac
0160: 65 20 65 76 61 6c 20 3a 3a 50 6c 6f 74 63 68 61  e eval ::Plotcha
0170: 72 74 20 7b 0a 20 20 20 76 61 72 69 61 62 6c 65  rt {.   variable
0180: 20 73 65 74 74 69 6e 67 73 0a 20 20 20 76 61 72   settings.   var
0190: 69 61 62 6c 65 20 6c 65 67 65 6e 64 0a 20 20 20  iable legend.   
01a0: 76 61 72 69 61 62 6c 65 20 73 63 61 6c 69 6e 67  variable scaling
01b0: 0a 20 20 20 76 61 72 69 61 62 6c 65 20 6d 65 74  .   variable met
01c0: 68 6f 64 50 72 6f 63 0a 20 20 20 76 61 72 69 61  hodProc.   varia
01d0: 62 6c 65 20 64 61 74 61 5f 73 65 72 69 65 73 0a  ble data_series.
01e0: 0a 20 20 20 6e 61 6d 65 73 70 61 63 65 20 65 78  .   namespace ex
01f0: 70 6f 72 74 20 77 6f 72 6c 64 43 6f 6f 72 64 69  port worldCoordi
0200: 6e 61 74 65 73 20 76 69 65 77 50 6f 72 74 20 63  nates viewPort c
0210: 6f 6f 72 64 73 54 6f 50 69 78 65 6c 20 5c 0a 20  oordsToPixel \. 
0220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0230: 20 20 20 70 6f 6c 61 72 43 6f 6f 72 64 69 6e 61     polarCoordina
0240: 74 65 73 20 73 65 74 5a 6f 6f 6d 50 61 6e 20 5c  tes setZoomPan \
0250: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
0260: 20 20 20 20 20 77 6f 72 6c 64 33 44 43 6f 6f 72       world3DCoor
0270: 64 69 6e 61 74 65 73 20 63 6f 6f 72 64 73 54 6f  dinates coordsTo
0280: 50 69 78 65 6c 20 5c 0a 20 20 20 20 20 20 20 20  Pixel \.        
0290: 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6f 72              coor
02a0: 64 73 33 44 54 6f 50 69 78 65 6c 20 70 6f 6c 61  ds3DToPixel pola
02b0: 72 54 6f 50 69 78 65 6c 20 5c 0a 20 20 20 20 20  rToPixel \.     
02c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
02d0: 69 78 65 6c 54 6f 43 6f 6f 72 64 73 20 70 69 78  ixelToCoords pix
02e0: 65 6c 54 6f 49 6e 64 65 78 20 64 65 74 65 72 6d  elToIndex determ
02f0: 69 6e 65 53 63 61 6c 65 20 5c 0a 20 20 20 20 20  ineScale \.     
0300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
0310: 72 65 61 74 65 58 59 50 6c 6f 74 20 63 72 65 61  reateXYPlot crea
0320: 74 65 50 6f 6c 61 72 50 6c 6f 74 20 63 72 65 61  tePolarPlot crea
0330: 74 65 50 69 65 63 68 61 72 74 20 5c 0a 20 20 20  tePiechart \.   
0340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0350: 20 63 72 65 61 74 65 42 61 72 63 68 61 72 74 20   createBarchart 
0360: 63 72 65 61 74 65 48 6f 72 69 7a 6f 6e 74 61 6c  createHorizontal
0370: 42 61 72 63 68 61 72 74 20 5c 0a 20 20 20 20 20  Barchart \.     
0380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
0390: 72 65 61 74 65 54 69 6d 65 63 68 61 72 74 20 63  reateTimechart c
03a0: 72 65 61 74 65 53 74 72 69 70 63 68 61 72 74 20  reateStripchart 
03b0: 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  \.              
03c0: 20 20 20 20 20 20 63 72 65 61 74 65 49 73 6f 6d        createIsom
03d0: 65 74 72 69 63 50 6c 6f 74 20 63 72 65 61 74 65  etricPlot create
03e0: 33 44 50 6c 6f 74 20 5c 0a 20 20 20 20 20 20 20  3DPlot \.       
03f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 72 65               cre
0400: 61 74 65 47 61 6e 74 74 43 68 61 72 74 20 63 72  ateGanttChart cr
0410: 65 61 74 65 48 69 73 74 6f 67 72 61 6d 20 63 6f  eateHistogram co
0420: 6c 6f 72 4d 61 70 20 5c 0a 20 20 20 20 20 20 20  lorMap \.       
0430: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 72 65               cre
0440: 61 74 65 33 44 42 61 72 73 20 63 72 65 61 74 65  ate3DBars create
0450: 52 61 64 69 61 6c 63 68 61 72 74 20 5c 0a 20 20  Radialchart \.  
0460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0470: 20 20 63 72 65 61 74 65 54 58 50 6c 6f 74 20 63    createTXPlot c
0480: 72 65 61 74 65 52 69 67 68 74 41 78 69 73 20 5c  reateRightAxis \
0490: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
04a0: 20 20 20 20 20 63 72 65 61 74 65 33 44 52 69 62       create3DRib
04b0: 62 6f 6e 43 68 61 72 74 20 5c 0a 20 20 20 20 20  bonChart \.     
04c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
04d0: 72 65 61 74 65 58 4c 6f 67 59 50 6c 6f 74 20 5c  reateXLogYPlot \
04e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
04f0: 20 20 20 20 20 70 6c 6f 74 63 6f 6e 66 69 67 20       plotconfig 
0500: 70 6c 6f 74 70 61 63 6b 20 5c 0a 0a 20 20 20 23  plotpack \..   #
0510: 0a 20 20 20 23 20 41 72 72 61 79 20 6c 69 6e 6b  .   # Array link
0520: 69 6e 67 20 70 72 6f 63 65 64 75 72 65 73 20 77  ing procedures w
0530: 69 74 68 20 6d 65 74 68 6f 64 73 0a 20 20 20 23  ith methods.   #
0540: 0a 20 20 20 73 65 74 20 6d 65 74 68 6f 64 50 72  .   set methodPr
0550: 6f 63 28 78 79 70 6c 6f 74 2c 74 69 74 6c 65 29  oc(xyplot,title)
0560: 20 20 20 20 20 20 20 20 20 20 20 20 20 44 72 61               Dra
0570: 77 54 69 74 6c 65 0a 20 20 20 73 65 74 20 6d 65  wTitle.   set me
0580: 74 68 6f 64 50 72 6f 63 28 78 79 70 6c 6f 74 2c  thodProc(xyplot,
0590: 78 74 65 78 74 29 20 20 20 20 20 20 20 20 20 20  xtext)          
05a0: 20 20 20 44 72 61 77 58 74 65 78 74 0a 20 20 20     DrawXtext.   
05b0: 73 65 74 20 6d 65 74 68 6f 64 50 72 6f 63 28 78  set methodProc(x
05c0: 79 70 6c 6f 74 2c 79 74 65 78 74 29 20 20 20 20  yplot,ytext)    
05d0: 20 20 20 20 20 20 20 20 20 44 72 61 77 59 74 65           DrawYte
05e0: 78 74 0a 20 20 20 73 65 74 20 6d 65 74 68 6f 64  xt.   set method
05f0: 50 72 6f 63 28 78 79 70 6c 6f 74 2c 70 6c 6f 74  Proc(xyplot,plot
0600: 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 44  )              D
0610: 72 61 77 44 61 74 61 0a 20 20 20 73 65 74 20 6d  rawData.   set m
0620: 65 74 68 6f 64 50 72 6f 63 28 78 79 70 6c 6f 74  ethodProc(xyplot
0630: 2c 64 6f 74 29 20 20 20 20 20 20 20 20 20 20 20  ,dot)           
0640: 20 20 20 20 44 72 61 77 44 6f 74 0a 20 20 20 73      DrawDot.   s
0650: 65 74 20 6d 65 74 68 6f 64 50 72 6f 63 28 78 79  et methodProc(xy
0660: 70 6c 6f 74 2c 64 6f 74 63 6f 6e 66 69 67 29 20  plot,dotconfig) 
0670: 20 20 20 20 20 20 20 20 44 6f 74 43 6f 6e 66 69          DotConfi
0680: 67 75 72 65 0a 20 20 20 73 65 74 20 6d 65 74 68  gure.   set meth
0690: 6f 64 50 72 6f 63 28 78 79 70 6c 6f 74 2c 69 6e  odProc(xyplot,in
06a0: 74 65 72 76 61 6c 29 20 20 20 20 20 20 20 20 20  terval)         
06b0: 20 44 72 61 77 49 6e 74 65 72 76 61 6c 0a 20 20   DrawInterval.  
06c0: 20 73 65 74 20 6d 65 74 68 6f 64 50 72 6f 63 28   set methodProc(
06d0: 78 79 70 6c 6f 74 2c 74 72 65 6e 64 29 20 20 20  xyplot,trend)   
06e0: 20 20 20 20 20 20 20 20 20 20 44 72 61 77 54 72            DrawTr
06f0: 65 6e 64 4c 69 6e 65 0a 20 20 20 73 65 74 20 6d  endLine.   set m
0700: 65 74 68 6f 64 50 72 6f 63 28 78 79 70 6c 6f 74  ethodProc(xyplot
0710: 2c 76 65 63 74 6f 72 29 20 20 20 20 20 20 20 20  ,vector)        
0720: 20 20 20 20 44 72 61 77 56 65 63 74 6f 72 0a 20      DrawVector. 
0730: 20 20 73 65 74 20 6d 65 74 68 6f 64 50 72 6f 63    set methodProc
0740: 28 78 79 70 6c 6f 74 2c 76 65 63 74 6f 72 63 6f  (xyplot,vectorco
0750: 6e 66 69 67 29 20 20 20 20 20 20 56 65 63 74 6f  nfig)      Vecto
0760: 72 43 6f 6e 66 69 67 75 72 65 0a 20 20 20 73 65  rConfigure.   se
0770: 74 20 6d 65 74 68 6f 64 50 72 6f 63 28 78 79 70  t methodProc(xyp
0780: 6c 6f 74 2c 72 63 68 61 72 74 29 20 20 20 20 20  lot,rchart)     
0790: 20 20 20 20 20 20 20 44 72 61 77 52 63 68 61 72         DrawRchar
07a0: 74 0a 20 20 20 73 65 74 20 6d 65 74 68 6f 64 50  t.   set methodP
07b0: 72 6f 63 28 78 79 70 6c 6f 74 2c 67 72 69 64 29  roc(xyplot,grid)
07c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 44 72                Dr
07d0: 61 77 47 72 69 64 0a 20 20 20 73 65 74 20 6d 65  awGrid.   set me
07e0: 74 68 6f 64 50 72 6f 63 28 78 79 70 6c 6f 74 2c  thodProc(xyplot,
07f0: 63 6f 6e 74 6f 75 72 6c 69 6e 65 73 29 20 20 20  contourlines)   
0800: 20 20 20 44 72 61 77 49 73 6f 6c 69 6e 65 73 0a     DrawIsolines.
0810: 20 20 20 73 65 74 20 6d 65 74 68 6f 64 50 72 6f     set methodPro
0820: 63 28 78 79 70 6c 6f 74 2c 63 6f 6e 74 6f 75 72  c(xyplot,contour
0830: 66 69 6c 6c 29 20 20 20 20 20 20 20 44 72 61 77  fill)       Draw
0840: 53 68 61 64 65 73 0a 20 20 20 73 65 74 20 6d 65  Shades.   set me
0850: 74 68 6f 64 50 72 6f 63 28 78 79 70 6c 6f 74 2c  thodProc(xyplot,
0860: 63 6f 6e 74 6f 75 72 62 6f 78 29 20 20 20 20 20  contourbox)     
0870: 20 20 20 44 72 61 77 42 6f 78 0a 20 20 20 73 65     DrawBox.   se
0880: 74 20 6d 65 74 68 6f 64 50 72 6f 63 28 78 79 70  t methodProc(xyp
0890: 6c 6f 74 2c 73 61 76 65 70 6c 6f 74 29 20 20 20  lot,saveplot)   
08a0: 20 20 20 20 20 20 20 53 61 76 65 50 6c 6f 74 0a         SavePlot.
08b0: 20 20 20 73 65 74 20 6d 65 74 68 6f 64 50 72 6f     set methodPro
08c0: 63 28 78 79 70 6c 6f 74 2c 64 61 74 61 63 6f 6e  c(xyplot,datacon
08d0: 66 69 67 29 20 20 20 20 20 20 20 20 44 61 74 61  fig)        Data
08e0: 43 6f 6e 66 69 67 0a 20 20 20 73 65 74 20 6d 65  Config.   set me
08f0: 74 68 6f 64 50 72 6f 63 28 78 79 70 6c 6f 74 2c  thodProc(xyplot,
0900: 78 63 6f 6e 66 69 67 29 20 20 20 20 20 20 20 20  xconfig)        
0910: 20 20 20 58 43 6f 6e 66 69 67 0a 20 20 20 73 65     XConfig.   se
0920: 74 20 6d 65 74 68 6f 64 50 72 6f 63 28 78 79 70  t methodProc(xyp
0930: 6c 6f 74 2c 79 63 6f 6e 66 69 67 29 20 20 20 20  lot,yconfig)    
0940: 20 20 20 20 20 20 20 59 43 6f 6e 66 69 67 0a 20         YConfig. 
0950: 20 20 73 65 74 20 6d 65 74 68 6f 64 50 72 6f 63    set methodProc
0960: 28 78 79 70 6c 6f 74 2c 78 74 69 63 6b 6c 69 6e  (xyplot,xticklin
0970: 65 73 29 20 20 20 20 20 20 20 20 44 72 61 77 58  es)        DrawX
0980: 54 69 63 6b 6c 69 6e 65 73 0a 20 20 20 73 65 74  Ticklines.   set
0990: 20 6d 65 74 68 6f 64 50 72 6f 63 28 78 79 70 6c   methodProc(xypl
09a0: 6f 74 2c 79 74 69 63 6b 6c 69 6e 65 73 29 20 20  ot,yticklines)  
09b0: 20 20 20 20 20 20 44 72 61 77 59 54 69 63 6b 6c        DrawYTickl
09c0: 69 6e 65 73 0a 20 20 20 73 65 74 20 6d 65 74 68  ines.   set meth
09d0: 6f 64 50 72 6f 63 28 78 79 70 6c 6f 74 2c 62 61  odProc(xyplot,ba
09e0: 63 6b 67 72 6f 75 6e 64 29 20 20 20 20 20 20 20  ckground)       
09f0: 20 42 61 63 6b 67 72 6f 75 6e 64 43 6f 6c 6f 75   BackgroundColou
0a00: 72 0a 20 20 20 73 65 74 20 6d 65 74 68 6f 64 50  r.   set methodP
0a10: 72 6f 63 28 78 79 70 6c 6f 74 2c 6c 65 67 65 6e  roc(xyplot,legen
0a20: 64 63 6f 6e 66 69 67 29 20 20 20 20 20 20 4c 65  dconfig)      Le
0a30: 67 65 6e 64 43 6f 6e 66 69 67 75 72 65 0a 20 20  gendConfigure.  
0a40: 20 73 65 74 20 6d 65 74 68 6f 64 50 72 6f 63 28   set methodProc(
0a50: 78 79 70 6c 6f 74 2c 6c 65 67 65 6e 64 29 20 20  xyplot,legend)  
0a60: 20 20 20 20 20 20 20 20 20 20 44 72 61 77 4c 65            DrawLe
0a70: 67 65 6e 64 0a 20 20 20 73 65 74 20 6d 65 74 68  gend.   set meth
0a80: 6f 64 50 72 6f 63 28 78 79 70 6c 6f 74 2c 62 61  odProc(xyplot,ba
0a90: 6c 6c 6f 6f 6e 29 20 20 20 20 20 20 20 20 20 20  lloon)          
0aa0: 20 44 72 61 77 42 61 6c 6c 6f 6f 6e 0a 20 20 20   DrawBalloon.   
0ab0: 73 65 74 20 6d 65 74 68 6f 64 50 72 6f 63 28 78  set methodProc(x
0ac0: 79 70 6c 6f 74 2c 62 61 6c 6c 6f 6f 6e 63 6f 6e  yplot,ballooncon
0ad0: 66 69 67 29 20 20 20 20 20 43 6f 6e 66 69 67 42  fig)     ConfigB
0ae0: 61 6c 6c 6f 6f 6e 0a 20 20 20 73 65 74 20 6d 65  alloon.   set me
0af0: 74 68 6f 64 50 72 6f 63 28 78 79 70 6c 6f 74 2c  thodProc(xyplot,
0b00: 70 6c 61 69 6e 74 65 78 74 29 20 20 20 20 20 20  plaintext)      
0b10: 20 20 20 44 72 61 77 50 6c 61 69 6e 54 65 78 74     DrawPlainText
0b20: 0a 20 20 20 73 65 74 20 6d 65 74 68 6f 64 50 72  .   set methodPr
0b30: 6f 63 28 78 79 70 6c 6f 74 2c 62 69 6e 64 76 61  oc(xyplot,bindva
0b40: 72 29 20 20 20 20 20 20 20 20 20 20 20 42 69 6e  r)           Bin
0b50: 64 56 61 72 0a 20 20 20 73 65 74 20 6d 65 74 68  dVar.   set meth
0b60: 6f 64 50 72 6f 63 28 78 79 70 6c 6f 74 2c 62 69  odProc(xyplot,bi
0b70: 6e 64 63 6d 64 29 20 20 20 20 20 20 20 20 20 20  ndcmd)          
0b80: 20 42 69 6e 64 43 6d 64 0a 20 20 20 73 65 74 20   BindCmd.   set 
0b90: 6d 65 74 68 6f 64 50 72 6f 63 28 78 79 70 6c 6f  methodProc(xyplo
0ba0: 74 2c 72 65 73 63 61 6c 65 29 20 20 20 20 20 20  t,rescale)      
0bb0: 20 20 20 20 20 52 65 73 63 61 6c 65 50 6c 6f 74       RescalePlot
0bc0: 0a 20 20 20 73 65 74 20 6d 65 74 68 6f 64 50 72  .   set methodPr
0bd0: 6f 63 28 78 79 70 6c 6f 74 2c 62 6f 78 2d 61 6e  oc(xyplot,box-an
0be0: 64 2d 77 68 69 73 6b 65 72 73 29 20 20 44 72 61  d-whiskers)  Dra
0bf0: 77 42 6f 78 57 68 69 73 6b 65 72 73 0a 20 20 20  wBoxWhiskers.   
0c00: 73 65 74 20 6d 65 74 68 6f 64 50 72 6f 63 28 78  set methodProc(x
0c10: 6c 6f 67 79 70 6c 6f 74 2c 74 69 74 6c 65 29 20  logyplot,title) 
0c20: 20 20 20 20 20 20 20 20 20 44 72 61 77 54 69 74           DrawTit
0c30: 6c 65 0a 20 20 20 73 65 74 20 6d 65 74 68 6f 64  le.   set method
0c40: 50 72 6f 63 28 78 6c 6f 67 79 70 6c 6f 74 2c 78  Proc(xlogyplot,x
0c50: 74 65 78 74 29 20 20 20 20 20 20 20 20 20 20 44  text)          D
0c60: 72 61 77 58 74 65 78 74 0a 20 20 20 73 65 74 20  rawXtext.   set 
0c70: 6d 65 74 68 6f 64 50 72 6f 63 28 78 6c 6f 67 79  methodProc(xlogy
0c80: 70 6c 6f 74 2c 79 74 65 78 74 29 20 20 20 20 20  plot,ytext)     
0c90: 20 20 20 20 20 44 72 61 77 59 74 65 78 74 0a 20       DrawYtext. 
0ca0: 20 20 73 65 74 20 6d 65 74 68 6f 64 50 72 6f 63    set methodProc
0cb0: 28 78 6c 6f 67 79 70 6c 6f 74 2c 70 6c 6f 74 29  (xlogyplot,plot)
0cc0: 20 20 20 20 20 20 20 20 20 20 20 44 72 61 77 4c             DrawL
0cd0: 6f 67 44 61 74 61 0a 20 20 20 73 65 74 20 6d 65  ogData.   set me
0ce0: 74 68 6f 64 50 72 6f 63 28 78 6c 6f 67 79 70 6c  thodProc(xlogypl
0cf0: 6f 74 2c 64 6f 74 29 20 20 20 20 20 20 20 20 20  ot,dot)         
0d00: 20 20 20 44 72 61 77 4c 6f 67 44 6f 74 0a 20 20     DrawLogDot.  
0d10: 20 73 65 74 20 6d 65 74 68 6f 64 50 72 6f 63 28   set methodProc(
0d20: 78 6c 6f 67 79 70 6c 6f 74 2c 64 6f 74 63 6f 6e  xlogyplot,dotcon
0d30: 66 69 67 29 20 20 20 20 20 20 44 6f 74 43 6f 6e  fig)      DotCon
0d40: 66 69 67 75 72 65 0a 20 20 20 73 65 74 20 6d 65  figure.   set me
0d50: 74 68 6f 64 50 72 6f 63 28 78 6c 6f 67 79 70 6c  thodProc(xlogypl
0d60: 6f 74 2c 69 6e 74 65 72 76 61 6c 29 20 20 20 20  ot,interval)    
0d70: 20 20 20 44 72 61 77 4c 6f 67 49 6e 74 65 72 76     DrawLogInterv
0d80: 61 6c 0a 20 20 20 73 65 74 20 6d 65 74 68 6f 64  al.   set method
0d90: 50 72 6f 63 28 78 6c 6f 67 79 70 6c 6f 74 2c 74  Proc(xlogyplot,t
0da0: 72 65 6e 64 29 20 20 20 20 20 20 20 20 20 20 44  rend)          D
0db0: 72 61 77 4c 6f 67 54 72 65 6e 64 4c 69 6e 65 0a  rawLogTrendLine.
0dc0: 20 20 20 73 65 74 20 6d 65 74 68 6f 64 50 72 6f     set methodPro
0dd0: 63 28 78 6c 6f 67 79 70 6c 6f 74 2c 73 61 76 65  c(xlogyplot,save
0de0: 70 6c 6f 74 29 20 20 20 20 20 20 20 53 61 76 65  plot)       Save
0df0: 50 6c 6f 74 0a 20 20 20 73 65 74 20 6d 65 74 68  Plot.   set meth
0e00: 6f 64 50 72 6f 63 28 78 6c 6f 67 79 70 6c 6f 74  odProc(xlogyplot
0e10: 2c 64 61 74 61 63 6f 6e 66 69 67 29 20 20 20 20  ,dataconfig)    
0e20: 20 44 61 74 61 43 6f 6e 66 69 67 0a 20 20 20 73   DataConfig.   s
0e30: 65 74 20 6d 65 74 68 6f 64 50 72 6f 63 28 78 6c  et methodProc(xl
0e40: 6f 67 79 70 6c 6f 74 2c 78 63 6f 6e 66 69 67 29  ogyplot,xconfig)
0e50: 20 20 20 20 20 20 20 20 58 43 6f 6e 66 69 67 0a          XConfig.
0e60: 20 20 20 73 65 74 20 6d 65 74 68 6f 64 50 72 6f     set methodPro
0e70: 63 28 78 6c 6f 67 79 70 6c 6f 74 2c 79 63 6f 6e  c(xlogyplot,ycon
0e80: 66 69 67 29 20 20 20 20 20 20 20 20 59 43 6f 6e  fig)        YCon
0e90: 66 69 67 0a 20 20 20 73 65 74 20 6d 65 74 68 6f  fig.   set metho
0ea0: 64 50 72 6f 63 28 78 6c 6f 67 79 70 6c 6f 74 2c  dProc(xlogyplot,
0eb0: 78 74 69 63 6b 6c 69 6e 65 73 29 20 20 20 20 20  xticklines)     
0ec0: 44 72 61 77 58 54 69 63 6b 6c 69 6e 65 73 0a 20  DrawXTicklines. 
0ed0: 20 20 73 65 74 20 6d 65 74 68 6f 64 50 72 6f 63    set methodProc
0ee0: 28 78 6c 6f 67 79 70 6c 6f 74 2c 79 74 69 63 6b  (xlogyplot,ytick
0ef0: 6c 69 6e 65 73 29 20 20 20 20 20 44 72 61 77 59  lines)     DrawY
0f00: 54 69 63 6b 6c 69 6e 65 73 0a 20 20 20 73 65 74  Ticklines.   set
0f10: 20 6d 65 74 68 6f 64 50 72 6f 63 28 78 6c 6f 67   methodProc(xlog
0f20: 79 70 6c 6f 74 2c 62 61 63 6b 67 72 6f 75 6e 64  yplot,background
0f30: 29 20 20 20 20 20 42 61 63 6b 67 72 6f 75 6e 64  )     Background
0f40: 43 6f 6c 6f 75 72 0a 20 20 20 73 65 74 20 6d 65  Colour.   set me
0f50: 74 68 6f 64 50 72 6f 63 28 78 6c 6f 67 79 70 6c  thodProc(xlogypl
0f60: 6f 74 2c 6c 65 67 65 6e 64 63 6f 6e 66 69 67 29  ot,legendconfig)
0f70: 20 20 20 4c 65 67 65 6e 64 43 6f 6e 66 69 67 75     LegendConfigu
0f80: 72 65 0a 20 20 20 73 65 74 20 6d 65 74 68 6f 64  re.   set method
0f90: 50 72 6f 63 28 78 6c 6f 67 79 70 6c 6f 74 2c 6c  Proc(xlogyplot,l
0fa0: 65 67 65 6e 64 29 20 20 20 20 20 20 20 20 20 44  egend)         D
0fb0: 72 61 77 4c 65 67 65 6e 64 0a 20 20 20 73 65 74  rawLegend.   set
0fc0: 20 6d 65 74 68 6f 64 50 72 6f 63 28 78 6c 6f 67   methodProc(xlog
0fd0: 79 70 6c 6f 74 2c 62 61 6c 6c 6f 6f 6e 29 20 20  yplot,balloon)  
0fe0: 20 20 20 20 20 20 44 72 61 77 42 61 6c 6c 6f 6f        DrawBalloo
0ff0: 6e 0a 20 20 20 73 65 74 20 6d 65 74 68 6f 64 50  n.   set methodP
1000: 72 6f 63 28 78 6c 6f 67 79 70 6c 6f 74 2c 62 61  roc(xlogyplot,ba
1010: 6c 6c 6f 6f 6e 63 6f 6e 66 69 67 29 20 20 43 6f  lloonconfig)  Co
1020: 6e 66 69 67 42 61 6c 6c 6f 6f 6e 0a 20 20 20 73  nfigBalloon.   s
1030: 65 74 20 6d 65 74 68 6f 64 50 72 6f 63 28 78 6c  et methodProc(xl
1040: 6f 67 79 70 6c 6f 74 2c 70 6c 61 69 6e 74 65 78  ogyplot,plaintex
1050: 74 29 20 20 20 20 20 20 44 72 61 77 50 6c 61 69  t)      DrawPlai
1060: 6e 54 65 78 74 0a 20 20 20 73 65 74 20 6d 65 74  nText.   set met
1070: 68 6f 64 50 72 6f 63 28 70 69 65 63 68 61 72 74  hodProc(piechart
1080: 2c 74 69 74 6c 65 29 20 20 20 20 20 20 20 20 20  ,title)         
1090: 20 20 44 72 61 77 54 69 74 6c 65 0a 20 20 20 73    DrawTitle.   s
10a0: 65 74 20 6d 65 74 68 6f 64 50 72 6f 63 28 70 69  et methodProc(pi
10b0: 65 63 68 61 72 74 2c 70 6c 6f 74 29 20 20 20 20  echart,plot)    
10c0: 20 20 20 20 20 20 20 20 44 72 61 77 50 69 65 0a          DrawPie.
10d0: 20 20 20 73 65 74 20 6d 65 74 68 6f 64 50 72 6f     set methodPro
10e0: 63 28 70 69 65 63 68 61 72 74 2c 73 61 76 65 70  c(piechart,savep
10f0: 6c 6f 74 29 20 20 20 20 20 20 20 20 53 61 76 65  lot)        Save
1100: 50 6c 6f 74 0a 20 20 20 73 65 74 20 6d 65 74 68  Plot.   set meth
1110: 6f 64 50 72 6f 63 28 70 69 65 63 68 61 72 74 2c  odProc(piechart,
1120: 62 61 6c 6c 6f 6f 6e 29 20 20 20 20 20 20 20 20  balloon)        
1130: 20 44 72 61 77 42 61 6c 6c 6f 6f 6e 0a 20 20 20   DrawBalloon.   
1140: 73 65 74 20 6d 65 74 68 6f 64 50 72 6f 63 28 70  set methodProc(p
1150: 69 65 63 68 61 72 74 2c 62 61 6c 6c 6f 6f 6e 63  iechart,balloonc
1160: 6f 6e 66 69 67 29 20 20 20 43 6f 6e 66 69 67 42  onfig)   ConfigB
1170: 61 6c 6c 6f 6f 6e 0a 20 20 20 73 65 74 20 6d 65  alloon.   set me
1180: 74 68 6f 64 50 72 6f 63 28 70 69 65 63 68 61 72  thodProc(piechar
1190: 74 2c 70 6c 61 69 6e 74 65 78 74 29 20 20 20 20  t,plaintext)    
11a0: 20 20 20 44 72 61 77 50 6c 61 69 6e 54 65 78 74     DrawPlainText
11b0: 0a 20 20 20 73 65 74 20 6d 65 74 68 6f 64 50 72  .   set methodPr
11c0: 6f 63 28 70 6f 6c 61 72 70 6c 6f 74 2c 74 69 74  oc(polarplot,tit
11d0: 6c 65 29 20 20 20 20 20 20 20 20 20 20 44 72 61  le)          Dra
11e0: 77 54 69 74 6c 65 0a 20 20 20 73 65 74 20 6d 65  wTitle.   set me
11f0: 74 68 6f 64 50 72 6f 63 28 70 6f 6c 61 72 70 6c  thodProc(polarpl
1200: 6f 74 2c 70 6c 6f 74 29 20 20 20 20 20 20 20 20  ot,plot)        
1210: 20 20 20 44 72 61 77 50 6f 6c 61 72 44 61 74 61     DrawPolarData
1220: 0a 20 20 20 73 65 74 20 6d 65 74 68 6f 64 50 72  .   set methodPr
1230: 6f 63 28 70 6f 6c 61 72 70 6c 6f 74 2c 73 61 76  oc(polarplot,sav
1240: 65 70 6c 6f 74 29 20 20 20 20 20 20 20 53 61 76  eplot)       Sav
1250: 65 50 6c 6f 74 0a 20 20 20 73 65 74 20 6d 65 74  ePlot.   set met
1260: 68 6f 64 50 72 6f 63 28 70 6f 6c 61 72 70 6c 6f  hodProc(polarplo
1270: 74 2c 64 61 74 61 63 6f 6e 66 69 67 29 20 20 20  t,dataconfig)   
1280: 20 20 44 61 74 61 43 6f 6e 66 69 67 0a 20 20 20    DataConfig.   
1290: 73 65 74 20 6d 65 74 68 6f 64 50 72 6f 63 28 70  set methodProc(p
12a0: 6f 6c 61 72 70 6c 6f 74 2c 62 61 63 6b 67 72 6f  olarplot,backgro
12b0: 75 6e 64 29 20 20 20 20 20 42 61 63 6b 67 72 6f  und)     Backgro
12c0: 75 6e 64 43 6f 6c 6f 75 72 0a 20 20 20 73 65 74  undColour.   set
12d0: 20 6d 65 74 68 6f 64 50 72 6f 63 28 70 6f 6c 61   methodProc(pola
12e0: 72 70 6c 6f 74 2c 6c 65 67 65 6e 64 63 6f 6e 66  rplot,legendconf
12f0: 69 67 29 20 20 20 4c 65 67 65 6e 64 43 6f 6e 66  ig)   LegendConf
1300: 69 67 75 72 65 0a 20 20 20 73 65 74 20 6d 65 74  igure.   set met
1310: 68 6f 64 50 72 6f 63 28 70 6f 6c 61 72 70 6c 6f  hodProc(polarplo
1320: 74 2c 6c 65 67 65 6e 64 29 20 20 20 20 20 20 20  t,legend)       
1330: 20 20 44 72 61 77 4c 65 67 65 6e 64 0a 20 20 20    DrawLegend.   
1340: 73 65 74 20 6d 65 74 68 6f 64 50 72 6f 63 28 70  set methodProc(p
1350: 6f 6c 61 72 70 6c 6f 74 2c 62 61 6c 6c 6f 6f 6e  olarplot,balloon
1360: 29 20 20 20 20 20 20 20 20 44 72 61 77 42 61 6c  )        DrawBal
1370: 6c 6f 6f 6e 0a 20 20 20 73 65 74 20 6d 65 74 68  loon.   set meth
1380: 6f 64 50 72 6f 63 28 70 6f 6c 61 72 70 6c 6f 74  odProc(polarplot
1390: 2c 62 61 6c 6c 6f 6f 6e 63 6f 6e 66 69 67 29 20  ,balloonconfig) 
13a0: 20 43 6f 6e 66 69 67 42 61 6c 6c 6f 6f 6e 0a 20   ConfigBalloon. 
13b0: 20 20 73 65 74 20 6d 65 74 68 6f 64 50 72 6f 63    set methodProc
13c0: 28 70 6f 6c 61 72 70 6c 6f 74 2c 70 6c 61 69 6e  (polarplot,plain
13d0: 74 65 78 74 29 20 20 20 20 20 20 44 72 61 77 50  text)      DrawP
13e0: 6c 61 69 6e 54 65 78 74 0a 20 20 20 73 65 74 20  lainText.   set 
13f0: 6d 65 74 68 6f 64 50 72 6f 63 28 68 69 73 74 6f  methodProc(histo
1400: 67 72 61 6d 2c 74 69 74 6c 65 29 20 20 20 20 20  gram,title)     
1410: 20 20 20 20 20 44 72 61 77 54 69 74 6c 65 0a 20       DrawTitle. 
1420: 20 20 73 65 74 20 6d 65 74 68 6f 64 50 72 6f 63    set methodProc
1430: 28 68 69 73 74 6f 67 72 61 6d 2c 78 74 65 78 74  (histogram,xtext
1440: 29 20 20 20 20 20 20 20 20 20 20 44 72 61 77 58  )          DrawX
1450: 74 65 78 74 0a 20 20 20 73 65 74 20 6d 65 74 68  text.   set meth
1460: 6f 64 50 72 6f 63 28 68 69 73 74 6f 67 72 61 6d  odProc(histogram
1470: 2c 79 74 65 78 74 29 20 20 20 20 20 20 20 20 20  ,ytext)         
1480: 20 44 72 61 77 59 74 65 78 74 0a 20 20 20 73 65   DrawYtext.   se
1490: 74 20 6d 65 74 68 6f 64 50 72 6f 63 28 68 69 73  t methodProc(his
14a0: 74 6f 67 72 61 6d 2c 70 6c 6f 74 29 20 20 20 20  togram,plot)    
14b0: 20 20 20 20 20 20 20 44 72 61 77 48 69 73 74 6f         DrawHisto
14c0: 67 72 61 6d 44 61 74 61 0a 20 20 20 73 65 74 20  gramData.   set 
14d0: 6d 65 74 68 6f 64 50 72 6f 63 28 68 69 73 74 6f  methodProc(histo
14e0: 67 72 61 6d 2c 73 61 76 65 70 6c 6f 74 29 20 20  gram,saveplot)  
14f0: 20 20 20 20 20 53 61 76 65 50 6c 6f 74 0a 20 20       SavePlot.  
1500: 20 73 65 74 20 6d 65 74 68 6f 64 50 72 6f 63 28   set methodProc(
1510: 68 69 73 74 6f 67 72 61 6d 2c 64 61 74 61 63 6f  histogram,dataco
1520: 6e 66 69 67 29 20 20 20 20 20 44 61 74 61 43 6f  nfig)     DataCo
1530: 6e 66 69 67 0a 20 20 20 73 65 74 20 6d 65 74 68  nfig.   set meth
1540: 6f 64 50 72 6f 63 28 68 69 73 74 6f 67 72 61 6d  odProc(histogram
1550: 2c 78 63 6f 6e 66 69 67 29 20 20 20 20 20 20 20  ,xconfig)       
1560: 20 58 43 6f 6e 66 69 67 0a 20 20 20 73 65 74 20   XConfig.   set 
1570: 6d 65 74 68 6f 64 50 72 6f 63 28 68 69 73 74 6f  methodProc(histo
1580: 67 72 61 6d 2c 79 63 6f 6e 66 69 67 29 20 20 20  gram,yconfig)   
1590: 20 20 20 20 20 59 43 6f 6e 66 69 67 0a 20 20 20       YConfig.   
15a0: 73 65 74 20 6d 65 74 68 6f 64 50 72 6f 63 28 68  set methodProc(h
15b0: 69 73 74 6f 67 72 61 6d 2c 79 74 69 63 6b 6c 69  istogram,ytickli
15c0: 6e 65 73 29 20 20 20 20 20 44 72 61 77 59 54 69  nes)     DrawYTi
15d0: 63 6b 6c 69 6e 65 73 0a 20 20 20 73 65 74 20 6d  cklines.   set m
15e0: 65 74 68 6f 64 50 72 6f 63 28 68 69 73 74 6f 67  ethodProc(histog
15f0: 72 61 6d 2c 62 61 63 6b 67 72 6f 75 6e 64 29 20  ram,background) 
1600: 20 20 20 20 42 61 63 6b 67 72 6f 75 6e 64 43 6f      BackgroundCo
1610: 6c 6f 75 72 0a 20 20 20 73 65 74 20 6d 65 74 68  lour.   set meth
1620: 6f 64 50 72 6f 63 28 68 69 73 74 6f 67 72 61 6d  odProc(histogram
1630: 2c 6c 65 67 65 6e 64 63 6f 6e 66 69 67 29 20 20  ,legendconfig)  
1640: 20 4c 65 67 65 6e 64 43 6f 6e 66 69 67 75 72 65   LegendConfigure
1650: 0a 20 20 20 73 65 74 20 6d 65 74 68 6f 64 50 72  .   set methodPr
1660: 6f 63 28 68 69 73 74 6f 67 72 61 6d 2c 6c 65 67  oc(histogram,leg
1670: 65 6e 64 29 20 20 20 20 20 20 20 20 20 44 72 61  end)         Dra
1680: 77 4c 65 67 65 6e 64 0a 20 20 20 73 65 74 20 6d  wLegend.   set m
1690: 65 74 68 6f 64 50 72 6f 63 28 68 69 73 74 6f 67  ethodProc(histog
16a0: 72 61 6d 2c 62 61 6c 6c 6f 6f 6e 29 20 20 20 20  ram,balloon)    
16b0: 20 20 20 20 44 72 61 77 42 61 6c 6c 6f 6f 6e 0a      DrawBalloon.
16c0: 20 20 20 73 65 74 20 6d 65 74 68 6f 64 50 72 6f     set methodPro
16d0: 63 28 68 69 73 74 6f 67 72 61 6d 2c 62 61 6c 6c  c(histogram,ball
16e0: 6f 6f 6e 63 6f 6e 66 69 67 29 20 20 43 6f 6e 66  oonconfig)  Conf
16f0: 69 67 42 61 6c 6c 6f 6f 6e 0a 20 20 20 73 65 74  igBalloon.   set
1700: 20 6d 65 74 68 6f 64 50 72 6f 63 28 68 69 73 74   methodProc(hist
1710: 6f 67 72 61 6d 2c 70 6c 61 69 6e 74 65 78 74 29  ogram,plaintext)
1720: 20 20 20 20 20 20 44 72 61 77 50 6c 61 69 6e 54        DrawPlainT
1730: 65 78 74 0a 20 20 20 73 65 74 20 6d 65 74 68 6f  ext.   set metho
1740: 64 50 72 6f 63 28 68 6f 72 69 7a 62 61 72 73 2c  dProc(horizbars,
1750: 74 69 74 6c 65 29 20 20 20 20 20 20 20 20 20 20  title)          
1760: 44 72 61 77 54 69 74 6c 65 0a 20 20 20 73 65 74  DrawTitle.   set
1770: 20 6d 65 74 68 6f 64 50 72 6f 63 28 68 6f 72 69   methodProc(hori
1780: 7a 62 61 72 73 2c 78 74 65 78 74 29 20 20 20 20  zbars,xtext)    
1790: 20 20 20 20 20 20 44 72 61 77 58 74 65 78 74 0a        DrawXtext.
17a0: 20 20 20 73 65 74 20 6d 65 74 68 6f 64 50 72 6f     set methodPro
17b0: 63 28 68 6f 72 69 7a 62 61 72 73 2c 79 74 65 78  c(horizbars,ytex
17c0: 74 29 20 20 20 20 20 20 20 20 20 20 44 72 61 77  t)          Draw
17d0: 59 74 65 78 74 0a 20 20 20 73 65 74 20 6d 65 74  Ytext.   set met
17e0: 68 6f 64 50 72 6f 63 28 68 6f 72 69 7a 62 61 72  hodProc(horizbar
17f0: 73 2c 70 6c 6f 74 29 20 20 20 20 20 20 20 20 20  s,plot)         
1800: 20 20 44 72 61 77 48 6f 72 69 7a 42 61 72 44 61    DrawHorizBarDa
1810: 74 61 0a 20 20 20 73 65 74 20 6d 65 74 68 6f 64  ta.   set method
1820: 50 72 6f 63 28 68 6f 72 69 7a 62 61 72 73 2c 78  Proc(horizbars,x
1830: 74 69 63 6b 6c 69 6e 65 73 29 20 20 20 20 20 44  ticklines)     D
1840: 72 61 77 58 54 69 63 6b 6c 69 6e 65 73 0a 20 20  rawXTicklines.  
1850: 20 73 65 74 20 6d 65 74 68 6f 64 50 72 6f 63 28   set methodProc(
1860: 68 6f 72 69 7a 62 61 72 73 2c 62 61 63 6b 67 72  horizbars,backgr
1870: 6f 75 6e 64 29 20 20 20 20 20 42 61 63 6b 67 72  ound)     Backgr
1880: 6f 75 6e 64 43 6f 6c 6f 75 72 0a 20 20 20 73 65  oundColour.   se
1890: 74 20 6d 65 74 68 6f 64 50 72 6f 63 28 68 6f 72  t methodProc(hor
18a0: 69 7a 62 61 72 73 2c 73 61 76 65 70 6c 6f 74 29  izbars,saveplot)
18b0: 20 20 20 20 20 20 20 53 61 76 65 50 6c 6f 74 0a         SavePlot.
18c0: 20 20 20 73 65 74 20 6d 65 74 68 6f 64 50 72 6f     set methodPro
18d0: 63 28 68 6f 72 69 7a 62 61 72 73 2c 63 6f 6c 6f  c(horizbars,colo
18e0: 75 72 73 29 20 20 20 20 20 20 20 20 53 65 74 43  urs)        SetC
18f0: 6f 6c 6f 75 72 73 0a 20 20 20 73 65 74 20 6d 65  olours.   set me
1900: 74 68 6f 64 50 72 6f 63 28 68 6f 72 69 7a 62 61  thodProc(horizba
1910: 72 73 2c 63 6f 6c 6f 72 73 29 20 20 20 20 20 20  rs,colors)      
1920: 20 20 20 53 65 74 43 6f 6c 6f 75 72 73 0a 20 20     SetColours.  
1930: 20 73 65 74 20 6d 65 74 68 6f 64 50 72 6f 63 28   set methodProc(
1940: 68 6f 72 69 7a 62 61 72 73 2c 78 63 6f 6e 66 69  horizbars,xconfi
1950: 67 29 20 20 20 20 20 20 20 20 58 43 6f 6e 66 69  g)        XConfi
1960: 67 0a 20 20 20 73 65 74 20 6d 65 74 68 6f 64 50  g.   set methodP
1970: 72 6f 63 28 68 6f 72 69 7a 62 61 72 73 2c 6c 65  roc(horizbars,le
1980: 67 65 6e 64 63 6f 6e 66 69 67 29 20 20 20 4c 65  gendconfig)   Le
1990: 67 65 6e 64 43 6f 6e 66 69 67 75 72 65 0a 20 20  gendConfigure.  
19a0: 20 73 65 74 20 6d 65 74 68 6f 64 50 72 6f 63 28   set methodProc(
19b0: 68 6f 72 69 7a 62 61 72 73 2c 6c 65 67 65 6e 64  horizbars,legend
19c0: 29 20 20 20 20 20 20 20 20 20 44 72 61 77 4c 65  )         DrawLe
19d0: 67 65 6e 64 0a 20 20 20 73 65 74 20 6d 65 74 68  gend.   set meth
19e0: 6f 64 50 72 6f 63 28 68 6f 72 69 7a 62 61 72 73  odProc(horizbars
19f0: 2c 62 61 6c 6c 6f 6f 6e 29 20 20 20 20 20 20 20  ,balloon)       
1a00: 20 44 72 61 77 42 61 6c 6c 6f 6f 6e 0a 20 20 20   DrawBalloon.   
1a10: 73 65 74 20 6d 65 74 68 6f 64 50 72 6f 63 28 68  set methodProc(h
1a20: 6f 72 69 7a 62 61 72 73 2c 62 61 6c 6c 6f 6f 6e  orizbars,balloon
1a30: 63 6f 6e 66 69 67 29 20 20 43 6f 6e 66 69 67 42  config)  ConfigB
1a40: 61 6c 6c 6f 6f 6e 0a 20 20 20 73 65 74 20 6d 65  alloon.   set me
1a50: 74 68 6f 64 50 72 6f 63 28 68 6f 72 69 7a 62 61  thodProc(horizba
1a60: 72 73 2c 70 6c 61 69 6e 74 65 78 74 29 20 20 20  rs,plaintext)   
1a70: 20 20 20 44 72 61 77 50 6c 61 69 6e 54 65 78 74     DrawPlainText
1a80: 0a 20 20 20 73 65 74 20 6d 65 74 68 6f 64 50 72  .   set methodPr
1a90: 6f 63 28 76 65 72 74 62 61 72 73 2c 74 69 74 6c  oc(vertbars,titl
1aa0: 65 29 20 20 20 20 20 20 20 20 20 20 20 44 72 61  e)           Dra
1ab0: 77 54 69 74 6c 65 0a 20 20 20 73 65 74 20 6d 65  wTitle.   set me
1ac0: 74 68 6f 64 50 72 6f 63 28 76 65 72 74 62 61 72  thodProc(vertbar
1ad0: 73 2c 78 74 65 78 74 29 20 20 20 20 20 20 20 20  s,xtext)        
1ae0: 20 20 20 44 72 61 77 58 74 65 78 74 0a 20 20 20     DrawXtext.   
1af0: 73 65 74 20 6d 65 74 68 6f 64 50 72 6f 63 28 76  set methodProc(v
1b00: 65 72 74 62 61 72 73 2c 79 74 65 78 74 29 20 20  ertbars,ytext)  
1b10: 20 20 20 20 20 20 20 20 20 44 72 61 77 59 74 65           DrawYte
1b20: 78 74 0a 20 20 20 73 65 74 20 6d 65 74 68 6f 64  xt.   set method
1b30: 50 72 6f 63 28 76 65 72 74 62 61 72 73 2c 70 6c  Proc(vertbars,pl
1b40: 6f 74 29 20 20 20 20 20 20 20 20 20 20 20 20 44  ot)            D
1b50: 72 61 77 56 65 72 74 42 61 72 44 61 74 61 0a 20  rawVertBarData. 
1b60: 20 20 73 65 74 20 6d 65 74 68 6f 64 50 72 6f 63    set methodProc
1b70: 28 76 65 72 74 62 61 72 73 2c 62 61 63 6b 67 72  (vertbars,backgr
1b80: 6f 75 6e 64 29 20 20 20 20 20 20 42 61 63 6b 67  ound)      Backg
1b90: 72 6f 75 6e 64 43 6f 6c 6f 75 72 0a 20 20 20 73  roundColour.   s
1ba0: 65 74 20 6d 65 74 68 6f 64 50 72 6f 63 28 76 65  et methodProc(ve
1bb0: 72 74 62 61 72 73 2c 79 74 69 63 6b 6c 69 6e 65  rtbars,ytickline
1bc0: 73 29 20 20 20 20 20 20 44 72 61 77 59 54 69 63  s)      DrawYTic
1bd0: 6b 6c 69 6e 65 73 0a 20 20 20 73 65 74 20 6d 65  klines.   set me
1be0: 74 68 6f 64 50 72 6f 63 28 76 65 72 74 62 61 72  thodProc(vertbar
1bf0: 73 2c 73 61 76 65 70 6c 6f 74 29 20 20 20 20 20  s,saveplot)     
1c00: 20 20 20 53 61 76 65 50 6c 6f 74 0a 20 20 20 73     SavePlot.   s
1c10: 65 74 20 6d 65 74 68 6f 64 50 72 6f 63 28 76 65  et methodProc(ve
1c20: 72 74 62 61 72 73 2c 63 6f 6c 6f 75 72 73 29 20  rtbars,colours) 
1c30: 20 20 20 20 20 20 20 20 53 65 74 43 6f 6c 6f 75          SetColou
1c40: 72 73 0a 20 20 20 73 65 74 20 6d 65 74 68 6f 64  rs.   set method
1c50: 50 72 6f 63 28 76 65 72 74 62 61 72 73 2c 63 6f  Proc(vertbars,co
1c60: 6c 6f 72 73 29 20 20 20 20 20 20 20 20 20 20 53  lors)          S
1c70: 65 74 43 6f 6c 6f 75 72 73 0a 20 20 20 73 65 74  etColours.   set
1c80: 20 6d 65 74 68 6f 64 50 72 6f 63 28 76 65 72 74   methodProc(vert
1c90: 62 61 72 73 2c 79 63 6f 6e 66 69 67 29 20 20 20  bars,yconfig)   
1ca0: 20 20 20 20 20 20 59 43 6f 6e 66 69 67 0a 20 20        YConfig.  
1cb0: 20 73 65 74 20 6d 65 74 68 6f 64 50 72 6f 63 28   set methodProc(
1cc0: 76 65 72 74 62 61 72 73 2c 6c 65 67 65 6e 64 63  vertbars,legendc
1cd0: 6f 6e 66 69 67 29 20 20 20 20 4c 65 67 65 6e 64  onfig)    Legend
1ce0: 43 6f 6e 66 69 67 75 72 65 0a 20 20 20 73 65 74  Configure.   set
1cf0: 20 6d 65 74 68 6f 64 50 72 6f 63 28 76 65 72 74   methodProc(vert
1d00: 62 61 72 73 2c 6c 65 67 65 6e 64 29 20 20 20 20  bars,legend)    
1d10: 20 20 20 20 20 20 44 72 61 77 4c 65 67 65 6e 64        DrawLegend
1d20: 0a 20 20 20 73 65 74 20 6d 65 74 68 6f 64 50 72  .   set methodPr
1d30: 6f 63 28 76 65 72 74 62 61 72 73 2c 62 61 6c 6c  oc(vertbars,ball
1d40: 6f 6f 6e 29 20 20 20 20 20 20 20 20 20 44 72 61  oon)         Dra
1d50: 77 42 61 6c 6c 6f 6f 6e 0a 20 20 20 73 65 74 20  wBalloon.   set 
1d60: 6d 65 74 68 6f 64 50 72 6f 63 28 76 65 72 74 62  methodProc(vertb
1d70: 61 72 73 2c 62 61 6c 6c 6f 6f 6e 63 6f 6e 66 69  ars,balloonconfi
1d80: 67 29 20 20 20 43 6f 6e 66 69 67 42 61 6c 6c 6f  g)   ConfigBallo
1d90: 6f 6e 0a 20 20 20 73 65 74 20 6d 65 74 68 6f 64  on.   set method
1da0: 50 72 6f 63 28 76 65 72 74 62 61 72 73 2c 70 6c  Proc(vertbars,pl
1db0: 61 69 6e 74 65 78 74 29 20 20 20 20 20 20 20 44  aintext)       D
1dc0: 72 61 77 50 6c 61 69 6e 54 65 78 74 0a 20 20 20  rawPlainText.   
1dd0: 73 65 74 20 6d 65 74 68 6f 64 50 72 6f 63 28 74  set methodProc(t
1de0: 69 6d 65 63 68 61 72 74 2c 74 69 74 6c 65 29 20  imechart,title) 
1df0: 20 20 20 20 20 20 20 20 20 44 72 61 77 54 69 74           DrawTit
1e00: 6c 65 0a 20 20 20 73 65 74 20 6d 65 74 68 6f 64  le.   set method
1e10: 50 72 6f 63 28 74 69 6d 65 63 68 61 72 74 2c 70  Proc(timechart,p
1e20: 65 72 69 6f 64 29 20 20 20 20 20 20 20 20 20 44  eriod)         D
1e30: 72 61 77 54 69 6d 65 50 65 72 69 6f 64 0a 20 20  rawTimePeriod.  
1e40: 20 73 65 74 20 6d 65 74 68 6f 64 50 72 6f 63 28   set methodProc(
1e50: 74 69 6d 65 63 68 61 72 74 2c 6d 69 6c 65 73 74  timechart,milest
1e60: 6f 6e 65 29 20 20 20 20 20 20 44 72 61 77 54 69  one)      DrawTi
1e70: 6d 65 4d 69 6c 65 73 74 6f 6e 65 0a 20 20 20 73  meMilestone.   s
1e80: 65 74 20 6d 65 74 68 6f 64 50 72 6f 63 28 74 69  et methodProc(ti
1e90: 6d 65 63 68 61 72 74 2c 76 65 72 74 6c 69 6e 65  mechart,vertline
1ea0: 29 20 20 20 20 20 20 20 44 72 61 77 54 69 6d 65  )       DrawTime
1eb0: 56 65 72 74 4c 69 6e 65 0a 20 20 20 73 65 74 20  VertLine.   set 
1ec0: 6d 65 74 68 6f 64 50 72 6f 63 28 74 69 6d 65 63  methodProc(timec
1ed0: 68 61 72 74 2c 73 61 76 65 70 6c 6f 74 29 20 20  hart,saveplot)  
1ee0: 20 20 20 20 20 53 61 76 65 50 6c 6f 74 0a 20 20       SavePlot.  
1ef0: 20 73 65 74 20 6d 65 74 68 6f 64 50 72 6f 63 28   set methodProc(
1f00: 74 69 6d 65 63 68 61 72 74 2c 62 61 63 6b 67 72  timechart,backgr
1f10: 6f 75 6e 64 29 20 20 20 20 20 42 61 63 6b 67 72  ound)     Backgr
1f20: 6f 75 6e 64 43 6f 6c 6f 75 72 0a 20 20 20 73 65  oundColour.   se
1f30: 74 20 6d 65 74 68 6f 64 50 72 6f 63 28 74 69 6d  t methodProc(tim
1f40: 65 63 68 61 72 74 2c 62 61 6c 6c 6f 6f 6e 29 20  echart,balloon) 
1f50: 20 20 20 20 20 20 20 44 72 61 77 42 61 6c 6c 6f         DrawBallo
1f60: 6f 6e 0a 20 20 20 73 65 74 20 6d 65 74 68 6f 64  on.   set method
1f70: 50 72 6f 63 28 74 69 6d 65 63 68 61 72 74 2c 62  Proc(timechart,b
1f80: 61 6c 6c 6f 6f 6e 63 6f 6e 66 69 67 29 20 20 43  alloonconfig)  C
1f90: 6f 6e 66 69 67 42 61 6c 6c 6f 6f 6e 0a 20 20 20  onfigBalloon.   
1fa0: 73 65 74 20 6d 65 74 68 6f 64 50 72 6f 63 28 74  set methodProc(t
1fb0: 69 6d 65 63 68 61 72 74 2c 70 6c 61 69 6e 74 65  imechart,plainte
1fc0: 78 74 29 20 20 20 20 20 20 44 72 61 77 50 6c 61  xt)      DrawPla
1fd0: 69 6e 54 65 78 74 0a 20 20 20 73 65 74 20 6d 65  inText.   set me
1fe0: 74 68 6f 64 50 72 6f 63 28 74 69 6d 65 63 68 61  thodProc(timecha
1ff0: 72 74 2c 68 73 63 72 6f 6c 6c 29 20 20 20 20 20  rt,hscroll)     
2000: 20 20 20 43 6f 6e 6e 65 63 74 48 6f 72 69 7a 53     ConnectHorizS
2010: 63 72 6f 6c 6c 62 61 72 0a 20 20 20 73 65 74 20  crollbar.   set 
2020: 6d 65 74 68 6f 64 50 72 6f 63 28 74 69 6d 65 63  methodProc(timec
2030: 68 61 72 74 2c 76 73 63 72 6f 6c 6c 29 20 20 20  hart,vscroll)   
2040: 20 20 20 20 20 43 6f 6e 6e 65 63 74 56 65 72 74       ConnectVert
2050: 53 63 72 6f 6c 6c 62 61 72 0a 20 20 20 73 65 74  Scrollbar.   set
2060: 20 6d 65 74 68 6f 64 50 72 6f 63 28 67 61 6e 74   methodProc(gant
2070: 74 63 68 61 72 74 2c 74 69 74 6c 65 29 20 20 20  tchart,title)   
2080: 20 20 20 20 20 20 44 72 61 77 54 69 74 6c 65 0a        DrawTitle.
2090: 20 20 20 73 65 74 20 6d 65 74 68 6f 64 50 72 6f     set methodPro
20a0: 63 28 67 61 6e 74 74 63 68 61 72 74 2c 70 65 72  c(ganttchart,per
20b0: 69 6f 64 29 20 20 20 20 20 20 20 20 44 72 61 77  iod)        Draw
20c0: 47 61 6e 74 74 50 65 72 69 6f 64 0a 20 20 20 73  GanttPeriod.   s
20d0: 65 74 20 6d 65 74 68 6f 64 50 72 6f 63 28 67 61  et methodProc(ga
20e0: 6e 74 74 63 68 61 72 74 2c 74 61 73 6b 29 20 20  nttchart,task)  
20f0: 20 20 20 20 20 20 20 20 44 72 61 77 47 61 6e 74          DrawGant
2100: 74 50 65 72 69 6f 64 0a 20 20 20 73 65 74 20 6d  tPeriod.   set m
2110: 65 74 68 6f 64 50 72 6f 63 28 67 61 6e 74 74 63  ethodProc(ganttc
2120: 68 61 72 74 2c 6d 69 6c 65 73 74 6f 6e 65 29 20  hart,milestone) 
2130: 20 20 20 20 44 72 61 77 47 61 6e 74 74 4d 69 6c      DrawGanttMil
2140: 65 73 74 6f 6e 65 0a 20 20 20 73 65 74 20 6d 65  estone.   set me
2150: 74 68 6f 64 50 72 6f 63 28 67 61 6e 74 74 63 68  thodProc(ganttch
2160: 61 72 74 2c 76 65 72 74 6c 69 6e 65 29 20 20 20  art,vertline)   
2170: 20 20 20 44 72 61 77 47 61 6e 74 74 56 65 72 74     DrawGanttVert
2180: 4c 69 6e 65 0a 20 20 20 73 65 74 20 6d 65 74 68  Line.   set meth
2190: 6f 64 50 72 6f 63 28 67 61 6e 74 74 63 68 61 72  odProc(ganttchar
21a0: 74 2c 73 61 76 65 70 6c 6f 74 29 20 20 20 20 20  t,saveplot)     
21b0: 20 53 61 76 65 50 6c 6f 74 0a 20 20 20 73 65 74   SavePlot.   set
21c0: 20 6d 65 74 68 6f 64 50 72 6f 63 28 67 61 6e 74   methodProc(gant
21d0: 74 63 68 61 72 74 2c 63 6f 6c 6f 72 29 20 20 20  tchart,color)   
21e0: 20 20 20 20 20 20 47 61 6e 74 74 43 6f 6c 6f 72        GanttColor
21f0: 0a 20 20 20 73 65 74 20 6d 65 74 68 6f 64 50 72  .   set methodPr
2200: 6f 63 28 67 61 6e 74 74 63 68 61 72 74 2c 63 6f  oc(ganttchart,co
2210: 6c 6f 75 72 29 20 20 20 20 20 20 20 20 47 61 6e  lour)        Gan
2220: 74 74 43 6f 6c 6f 72 0a 20 20 20 73 65 74 20 6d  ttColor.   set m
2230: 65 74 68 6f 64 50 72 6f 63 28 67 61 6e 74 74 63  ethodProc(ganttc
2240: 68 61 72 74 2c 66 6f 6e 74 29 20 20 20 20 20 20  hart,font)      
2250: 20 20 20 20 47 61 6e 74 74 46 6f 6e 74 0a 20 20      GanttFont.  
2260: 20 73 65 74 20 6d 65 74 68 6f 64 50 72 6f 63 28   set methodProc(
2270: 67 61 6e 74 74 63 68 61 72 74 2c 63 6f 6e 6e 65  ganttchart,conne
2280: 63 74 29 20 20 20 20 20 20 20 44 72 61 77 47 61  ct)       DrawGa
2290: 6e 74 74 43 6f 6e 6e 65 63 74 0a 20 20 20 73 65  nttConnect.   se
22a0: 74 20 6d 65 74 68 6f 64 50 72 6f 63 28 67 61 6e  t methodProc(gan
22b0: 74 74 63 68 61 72 74 2c 73 75 6d 6d 61 72 79 29  ttchart,summary)
22c0: 20 20 20 20 20 20 20 44 72 61 77 47 61 6e 74 74         DrawGantt
22d0: 53 75 6d 6d 61 72 79 0a 20 20 20 73 65 74 20 6d  Summary.   set m
22e0: 65 74 68 6f 64 50 72 6f 63 28 67 61 6e 74 74 63  ethodProc(ganttc
22f0: 68 61 72 74 2c 62 61 63 6b 67 72 6f 75 6e 64 29  hart,background)
2300: 20 20 20 20 42 61 63 6b 67 72 6f 75 6e 64 43 6f      BackgroundCo
2310: 6c 6f 75 72 0a 20 20 20 73 65 74 20 6d 65 74 68  lour.   set meth
2320: 6f 64 50 72 6f 63 28 67 61 6e 74 74 63 68 61 72  odProc(ganttchar
2330: 74 2c 62 61 6c 6c 6f 6f 6e 29 20 20 20 20 20 20  t,balloon)      
2340: 20 44 72 61 77 42 61 6c 6c 6f 6f 6e 0a 20 20 20   DrawBalloon.   
2350: 73 65 74 20 6d 65 74 68 6f 64 50 72 6f 63 28 67  set methodProc(g
2360: 61 6e 74 74 63 68 61 72 74 2c 62 61 6c 6c 6f 6f  anttchart,balloo
2370: 6e 63 6f 6e 66 69 67 29 20 43 6f 6e 66 69 67 42  nconfig) ConfigB
2380: 61 6c 6c 6f 6f 6e 0a 20 20 20 73 65 74 20 6d 65  alloon.   set me
2390: 74 68 6f 64 50 72 6f 63 28 67 61 6e 74 74 63 68  thodProc(ganttch
23a0: 61 72 74 2c 70 6c 61 69 6e 74 65 78 74 29 20 20  art,plaintext)  
23b0: 20 20 20 44 72 61 77 50 6c 61 69 6e 54 65 78 74     DrawPlainText
23c0: 0a 20 20 20 73 65 74 20 6d 65 74 68 6f 64 50 72  .   set methodPr
23d0: 6f 63 28 67 61 6e 74 74 63 68 61 72 74 2c 68 73  oc(ganttchart,hs
23e0: 63 72 6f 6c 6c 29 20 20 20 20 20 20 20 43 6f 6e  croll)       Con
23f0: 6e 65 63 74 48 6f 72 69 7a 53 63 72 6f 6c 6c 62  nectHorizScrollb
2400: 61 72 0a 20 20 20 73 65 74 20 6d 65 74 68 6f 64  ar.   set method
2410: 50 72 6f 63 28 67 61 6e 74 74 63 68 61 72 74 2c  Proc(ganttchart,
2420: 76 73 63 72 6f 6c 6c 29 20 20 20 20 20 20 20 43  vscroll)       C
2430: 6f 6e 6e 65 63 74 56 65 72 74 53 63 72 6f 6c 6c  onnectVertScroll
2440: 62 61 72 0a 20 20 20 73 65 74 20 6d 65 74 68 6f  bar.   set metho
2450: 64 50 72 6f 63 28 73 74 72 69 70 63 68 61 72 74  dProc(stripchart
2460: 2c 74 69 74 6c 65 29 20 20 20 20 20 20 20 20 20  ,title)         
2470: 44 72 61 77 54 69 74 6c 65 0a 20 20 20 73 65 74  DrawTitle.   set
2480: 20 6d 65 74 68 6f 64 50 72 6f 63 28 73 74 72 69   methodProc(stri
2490: 70 63 68 61 72 74 2c 78 74 65 78 74 29 20 20 20  pchart,xtext)   
24a0: 20 20 20 20 20 20 44 72 61 77 58 74 65 78 74 0a        DrawXtext.
24b0: 20 20 20 73 65 74 20 6d 65 74 68 6f 64 50 72 6f     set methodPro
24c0: 63 28 73 74 72 69 70 63 68 61 72 74 2c 79 74 65  c(stripchart,yte
24d0: 78 74 29 20 20 20 20 20 20 20 20 20 44 72 61 77  xt)         Draw
24e0: 59 74 65 78 74 0a 20 20 20 73 65 74 20 6d 65 74  Ytext.   set met
24f0: 68 6f 64 50 72 6f 63 28 73 74 72 69 70 63 68 61  hodProc(stripcha
2500: 72 74 2c 70 6c 6f 74 29 20 20 20 20 20 20 20 20  rt,plot)        
2510: 20 20 44 72 61 77 53 74 72 69 70 44 61 74 61 0a    DrawStripData.
2520: 20 20 20 73 65 74 20 6d 65 74 68 6f 64 50 72 6f     set methodPro
2530: 63 28 73 74 72 69 70 63 68 61 72 74 2c 73 61 76  c(stripchart,sav
2540: 65 70 6c 6f 74 29 20 20 20 20 20 20 53 61 76 65  eplot)      Save
2550: 50 6c 6f 74 0a 20 20 20 73 65 74 20 6d 65 74 68  Plot.   set meth
2560: 6f 64 50 72 6f 63 28 73 74 72 69 70 63 68 61 72  odProc(stripchar
2570: 74 2c 64 61 74 61 63 6f 6e 66 69 67 29 20 20 20  t,dataconfig)   
2580: 20 44 61 74 61 43 6f 6e 66 69 67 0a 20 20 20 73   DataConfig.   s
2590: 65 74 20 6d 65 74 68 6f 64 50 72 6f 63 28 73 74  et methodProc(st
25a0: 72 69 70 63 68 61 72 74 2c 78 63 6f 6e 66 69 67  ripchart,xconfig
25b0: 29 20 20 20 20 20 20 20 58 43 6f 6e 66 69 67 0a  )       XConfig.
25c0: 20 20 20 73 65 74 20 6d 65 74 68 6f 64 50 72 6f     set methodPro
25d0: 63 28 73 74 72 69 70 63 68 61 72 74 2c 79 63 6f  c(stripchart,yco
25e0: 6e 66 69 67 29 20 20 20 20 20 20 20 59 43 6f 6e  nfig)       YCon
25f0: 66 69 67 0a 20 20 20 73 65 74 20 6d 65 74 68 6f  fig.   set metho
2600: 64 50 72 6f 63 28 73 74 72 69 70 63 68 61 72 74  dProc(stripchart
2610: 2c 79 74 69 63 6b 6c 69 6e 65 73 29 20 20 20 20  ,yticklines)    
2620: 44 72 61 77 59 54 69 63 6b 6c 69 6e 65 73 0a 20  DrawYTicklines. 
2630: 20 20 73 65 74 20 6d 65 74 68 6f 64 50 72 6f 63    set methodProc
2640: 28 73 74 72 69 70 63 68 61 72 74 2c 62 61 63 6b  (stripchart,back
2650: 67 72 6f 75 6e 64 29 20 20 20 20 42 61 63 6b 67  ground)    Backg
2660: 72 6f 75 6e 64 43 6f 6c 6f 75 72 0a 20 20 20 73  roundColour.   s
2670: 65 74 20 6d 65 74 68 6f 64 50 72 6f 63 28 73 74  et methodProc(st
2680: 72 69 70 63 68 61 72 74 2c 6c 65 67 65 6e 64 63  ripchart,legendc
2690: 6f 6e 66 69 67 29 20 20 4c 65 67 65 6e 64 43 6f  onfig)  LegendCo
26a0: 6e 66 69 67 75 72 65 0a 20 20 20 73 65 74 20 6d  nfigure.   set m
26b0: 65 74 68 6f 64 50 72 6f 63 28 73 74 72 69 70 63  ethodProc(stripc
26c0: 68 61 72 74 2c 6c 65 67 65 6e 64 29 20 20 20 20  hart,legend)    
26d0: 20 20 20 20 44 72 61 77 4c 65 67 65 6e 64 0a 20      DrawLegend. 
26e0: 20 20 73 65 74 20 6d 65 74 68 6f 64 50 72 6f 63    set methodProc
26f0: 28 73 74 72 69 70 63 68 61 72 74 2c 62 61 6c 6c  (stripchart,ball
2700: 6f 6f 6e 29 20 20 20 20 20 20 20 44 72 61 77 42  oon)       DrawB
2710: 61 6c 6c 6f 6f 6e 0a 20 20 20 73 65 74 20 6d 65  alloon.   set me
2720: 74 68 6f 64 50 72 6f 63 28 73 74 72 69 70 63 68  thodProc(stripch
2730: 61 72 74 2c 62 61 6c 6c 6f 6f 6e 63 6f 6e 66 69  art,balloonconfi
2740: 67 29 20 43 6f 6e 66 69 67 42 61 6c 6c 6f 6f 6e  g) ConfigBalloon
2750: 0a 20 20 20 73 65 74 20 6d 65 74 68 6f 64 50 72  .   set methodPr
2760: 6f 63 28 73 74 72 69 70 63 68 61 72 74 2c 70 6c  oc(stripchart,pl
2770: 61 69 6e 74 65 78 74 29 20 20 20 20 20 44 72 61  aintext)     Dra
2780: 77 50 6c 61 69 6e 54 65 78 74 0a 20 20 20 73 65  wPlainText.   se
2790: 74 20 6d 65 74 68 6f 64 50 72 6f 63 28 69 73 6f  t methodProc(iso
27a0: 6d 65 74 72 69 63 2c 74 69 74 6c 65 29 20 20 20  metric,title)   
27b0: 20 20 20 20 20 20 20 44 72 61 77 54 69 74 6c 65         DrawTitle
27c0: 0a 20 20 20 73 65 74 20 6d 65 74 68 6f 64 50 72  .   set methodPr
27d0: 6f 63 28 69 73 6f 6d 65 74 72 69 63 2c 78 74 65  oc(isometric,xte
27e0: 78 74 29 20 20 20 20 20 20 20 20 20 20 44 72 61  xt)          Dra
27f0: 77 58 74 65 78 74 0a 20 20 20 73 65 74 20 6d 65  wXtext.   set me
2800: 74 68 6f 64 50 72 6f 63 28 69 73 6f 6d 65 74 72  thodProc(isometr
2810: 69 63 2c 79 74 65 78 74 29 20 20 20 20 20 20 20  ic,ytext)       
2820: 20 20 20 44 72 61 77 59 74 65 78 74 0a 20 20 20     DrawYtext.   
2830: 73 65 74 20 6d 65 74 68 6f 64 50 72 6f 63 28 69  set methodProc(i
2840: 73 6f 6d 65 74 72 69 63 2c 70 6c 6f 74 29 20 20  sometric,plot)  
2850: 20 20 20 20 20 20 20 20 20 44 72 61 77 49 73 6f           DrawIso
2860: 6d 65 74 72 69 63 44 61 74 61 0a 20 20 20 73 65  metricData.   se
2870: 74 20 6d 65 74 68 6f 64 50 72 6f 63 28 69 73 6f  t methodProc(iso
2880: 6d 65 74 72 69 63 2c 73 61 76 65 70 6c 6f 74 29  metric,saveplot)
2890: 20 20 20 20 20 20 20 53 61 76 65 50 6c 6f 74 0a         SavePlot.
28a0: 20 20 20 73 65 74 20 6d 65 74 68 6f 64 50 72 6f     set methodPro
28b0: 63 28 69 73 6f 6d 65 74 72 69 63 2c 62 61 63 6b  c(isometric,back
28c0: 67 72 6f 75 6e 64 29 20 20 20 20 20 42 61 63 6b  ground)     Back
28d0: 67 72 6f 75 6e 64 43 6f 6c 6f 75 72 0a 20 20 20  groundColour.   
28e0: 73 65 74 20 6d 65 74 68 6f 64 50 72 6f 63 28 69  set methodProc(i
28f0: 73 6f 6d 65 74 72 69 63 2c 62 61 6c 6c 6f 6f 6e  sometric,balloon
2900: 29 20 20 20 20 20 20 20 20 44 72 61 77 42 61 6c  )        DrawBal
2910: 6c 6f 6f 6e 0a 20 20 20 73 65 74 20 6d 65 74 68  loon.   set meth
2920: 6f 64 50 72 6f 63 28 69 73 6f 6d 65 74 72 69 63  odProc(isometric
2930: 2c 62 61 6c 6c 6f 6f 6e 63 6f 6e 66 69 67 29 20  ,balloonconfig) 
2940: 20 43 6f 6e 66 69 67 42 61 6c 6c 6f 6f 6e 0a 20   ConfigBalloon. 
2950: 20 20 73 65 74 20 6d 65 74 68 6f 64 50 72 6f 63    set methodProc
2960: 28 69 73 6f 6d 65 74 72 69 63 2c 70 6c 61 69 6e  (isometric,plain
2970: 74 65 78 74 29 20 20 20 20 20 20 44 72 61 77 50  text)      DrawP
2980: 6c 61 69 6e 54 65 78 74 0a 20 20 20 73 65 74 20  lainText.   set 
2990: 6d 65 74 68 6f 64 50 72 6f 63 28 33 64 70 6c 6f  methodProc(3dplo
29a0: 74 2c 74 69 74 6c 65 29 20 20 20 20 20 20 20 20  t,title)        
29b0: 20 20 20 20 20 44 72 61 77 54 69 74 6c 65 0a 20       DrawTitle. 
29c0: 20 20 73 65 74 20 6d 65 74 68 6f 64 50 72 6f 63    set methodProc
29d0: 28 33 64 70 6c 6f 74 2c 70 6c 6f 74 66 75 6e 63  (3dplot,plotfunc
29e0: 29 20 20 20 20 20 20 20 20 20 20 44 72 61 77 33  )          Draw3
29f0: 44 46 75 6e 63 74 69 6f 6e 0a 20 20 20 73 65 74  DFunction.   set
2a00: 20 6d 65 74 68 6f 64 50 72 6f 63 28 33 64 70 6c   methodProc(3dpl
2a10: 6f 74 2c 70 6c 6f 74 64 61 74 61 29 20 20 20 20  ot,plotdata)    
2a20: 20 20 20 20 20 20 44 72 61 77 33 44 44 61 74 61        Draw3DData
2a30: 0a 20 20 20 73 65 74 20 6d 65 74 68 6f 64 50 72  .   set methodPr
2a40: 6f 63 28 33 64 70 6c 6f 74 2c 70 6c 6f 74 6c 69  oc(3dplot,plotli
2a50: 6e 65 29 20 20 20 20 20 20 20 20 20 20 44 72 61  ne)          Dra
2a60: 77 33 44 4c 69 6e 65 46 72 6f 6d 33 44 63 6f 6f  w3DLineFrom3Dcoo
2a70: 72 64 69 6e 61 74 65 73 0a 20 20 20 73 65 74 20  rdinates.   set 
2a80: 6d 65 74 68 6f 64 50 72 6f 63 28 33 64 70 6c 6f  methodProc(3dplo
2a90: 74 2c 67 72 69 64 73 69 7a 65 29 20 20 20 20 20  t,gridsize)     
2aa0: 20 20 20 20 20 47 72 69 64 53 69 7a 65 33 44 0a       GridSize3D.
2ab0: 20 20 20 73 65 74 20 6d 65 74 68 6f 64 50 72 6f     set methodPro
2ac0: 63 28 33 64 70 6c 6f 74 2c 73 61 76 65 70 6c 6f  c(3dplot,saveplo
2ad0: 74 29 20 20 20 20 20 20 20 20 20 20 53 61 76 65  t)          Save
2ae0: 50 6c 6f 74 0a 20 20 20 73 65 74 20 6d 65 74 68  Plot.   set meth
2af0: 6f 64 50 72 6f 63 28 33 64 70 6c 6f 74 2c 63 6f  odProc(3dplot,co
2b00: 6c 6f 75 72 29 20 20 20 20 20 20 20 20 20 20 20  lour)           
2b10: 20 53 65 74 43 6f 6c 6f 75 72 73 0a 20 20 20 73   SetColours.   s
2b20: 65 74 20 6d 65 74 68 6f 64 50 72 6f 63 28 33 64  et methodProc(3d
2b30: 70 6c 6f 74 2c 63 6f 6c 6f 72 29 20 20 20 20 20  plot,color)     
2b40: 20 20 20 20 20 20 20 20 53 65 74 43 6f 6c 6f 75          SetColou
2b50: 72 73 0a 20 20 20 73 65 74 20 6d 65 74 68 6f 64  rs.   set method
2b60: 50 72 6f 63 28 33 64 70 6c 6f 74 2c 78 63 6f 6e  Proc(3dplot,xcon
2b70: 66 69 67 29 20 20 20 20 20 20 20 20 20 20 20 58  fig)           X
2b80: 43 6f 6e 66 69 67 0a 20 20 20 73 65 74 20 6d 65  Config.   set me
2b90: 74 68 6f 64 50 72 6f 63 28 33 64 70 6c 6f 74 2c  thodProc(3dplot,
2ba0: 79 63 6f 6e 66 69 67 29 20 20 20 20 20 20 20 20  yconfig)        
2bb0: 20 20 20 59 43 6f 6e 66 69 67 0a 20 20 20 73 65     YConfig.   se
2bc0: 74 20 6d 65 74 68 6f 64 50 72 6f 63 28 33 64 70  t methodProc(3dp
2bd0: 6c 6f 74 2c 7a 63 6f 6e 66 69 67 29 20 20 20 20  lot,zconfig)    
2be0: 20 20 20 20 20 20 20 5a 43 6f 6e 66 69 67 0a 20         ZConfig. 
2bf0: 20 20 73 65 74 20 6d 65 74 68 6f 64 50 72 6f 63    set methodProc
2c00: 28 33 64 70 6c 6f 74 2c 70 6c 6f 74 66 75 6e 63  (3dplot,plotfunc
2c10: 6f 6e 74 29 20 20 20 20 20 20 20 44 72 61 77 33  ont)       Draw3
2c20: 44 46 75 6e 63 74 69 6f 6e 43 6f 6e 74 6f 75 72  DFunctionContour
2c30: 0a 20 20 20 73 65 74 20 6d 65 74 68 6f 64 50 72  .   set methodPr
2c40: 6f 63 28 33 64 70 6c 6f 74 2c 62 61 63 6b 67 72  oc(3dplot,backgr
2c50: 6f 75 6e 64 29 20 20 20 20 20 20 20 20 42 61 63  ound)        Bac
2c60: 6b 67 72 6f 75 6e 64 43 6f 6c 6f 75 72 0a 20 20  kgroundColour.  
2c70: 20 73 65 74 20 6d 65 74 68 6f 64 50 72 6f 63 28   set methodProc(
2c80: 33 64 62 61 72 73 2c 74 69 74 6c 65 29 20 20 20  3dbars,title)   
2c90: 20 20 20 20 20 20 20 20 20 20 44 72 61 77 54 69            DrawTi
2ca0: 74 6c 65 0a 20 20 20 73 65 74 20 6d 65 74 68 6f  tle.   set metho
2cb0: 64 50 72 6f 63 28 33 64 62 61 72 73 2c 70 6c 6f  dProc(3dbars,plo
2cc0: 74 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t)              
2cd0: 44 72 61 77 33 44 42 61 72 0a 20 20 20 73 65 74  Draw3DBar.   set
2ce0: 20 6d 65 74 68 6f 64 50 72 6f 63 28 33 64 62 61   methodProc(3dba
2cf0: 72 73 2c 79 63 6f 6e 66 69 67 29 20 20 20 20 20  rs,yconfig)     
2d00: 20 20 20 20 20 20 59 43 6f 6e 66 69 67 0a 20 20        YConfig.  
2d10: 20 73 65 74 20 6d 65 74 68 6f 64 50 72 6f 63 28   set methodProc(
2d20: 33 64 62 61 72 73 2c 73 61 76 65 70 6c 6f 74 29  3dbars,saveplot)
2d30: 20 20 20 20 20 20 20 20 20 20 53 61 76 65 50 6c            SavePl
2d40: 6f 74 0a 20 20 20 73 65 74 20 6d 65 74 68 6f 64  ot.   set method
2d50: 50 72 6f 63 28 33 64 62 61 72 73 2c 63 6f 6e 66  Proc(3dbars,conf
2d60: 69 67 29 20 20 20 20 20 20 20 20 20 20 20 20 43  ig)            C
2d70: 6f 6e 66 69 67 33 44 42 61 72 73 0a 20 20 20 73  onfig3DBars.   s
2d80: 65 74 20 6d 65 74 68 6f 64 50 72 6f 63 28 33 64  et methodProc(3d
2d90: 62 61 72 73 2c 62 61 6c 6c 6f 6f 6e 29 20 20 20  bars,balloon)   
2da0: 20 20 20 20 20 20 20 20 44 72 61 77 42 61 6c 6c          DrawBall
2db0: 6f 6f 6e 0a 20 20 20 73 65 74 20 6d 65 74 68 6f  oon.   set metho
2dc0: 64 50 72 6f 63 28 33 64 62 61 72 73 2c 62 61 6c  dProc(3dbars,bal
2dd0: 6c 6f 6f 6e 63 6f 6e 66 69 67 29 20 20 20 20 20  loonconfig)     
2de0: 43 6f 6e 66 69 67 42 61 6c 6c 6f 6f 6e 0a 20 20  ConfigBalloon.  
2df0: 20 73 65 74 20 6d 65 74 68 6f 64 50 72 6f 63 28   set methodProc(
2e00: 33 64 62 61 72 73 2c 70 6c 61 69 6e 74 65 78 74  3dbars,plaintext
2e10: 29 20 20 20 20 20 20 20 20 20 44 72 61 77 50 6c  )         DrawPl
2e20: 61 69 6e 54 65 78 74 0a 20 20 20 73 65 74 20 6d  ainText.   set m
2e30: 65 74 68 6f 64 50 72 6f 63 28 72 61 64 69 61 6c  ethodProc(radial
2e40: 63 68 61 72 74 2c 74 69 74 6c 65 29 20 20 20 20  chart,title)    
2e50: 20 20 20 20 44 72 61 77 54 69 74 6c 65 0a 20 20      DrawTitle.  
2e60: 20 73 65 74 20 6d 65 74 68 6f 64 50 72 6f 63 28   set methodProc(
2e70: 72 61 64 69 61 6c 63 68 61 72 74 2c 70 6c 6f 74  radialchart,plot
2e80: 29 20 20 20 20 20 20 20 20 20 44 72 61 77 52 61  )         DrawRa
2e90: 64 69 61 6c 0a 20 20 20 73 65 74 20 6d 65 74 68  dial.   set meth
2ea0: 6f 64 50 72 6f 63 28 72 61 64 69 61 6c 63 68 61  odProc(radialcha
2eb0: 72 74 2c 73 61 76 65 70 6c 6f 74 29 20 20 20 20  rt,saveplot)    
2ec0: 20 53 61 76 65 50 6c 6f 74 0a 20 20 20 73 65 74   SavePlot.   set
2ed0: 20 6d 65 74 68 6f 64 50 72 6f 63 28 72 61 64 69   methodProc(radi
2ee0: 61 6c 63 68 61 72 74 2c 62 61 6c 6c 6f 6f 6e 29  alchart,balloon)
2ef0: 20 20 20 20 20 20 44 72 61 77 42 61 6c 6c 6f 6f        DrawBalloo
2f00: 6e 0a 20 20 20 73 65 74 20 6d 65 74 68 6f 64 50  n.   set methodP
2f10: 72 6f 63 28 72 61 64 69 61 6c 63 68 61 72 74 2c  roc(radialchart,
2f20: 70 6c 61 69 6e 74 65 78 74 29 20 20 20 20 44 72  plaintext)    Dr
2f30: 61 77 50 6c 61 69 6e 54 65 78 74 0a 20 20 20 73  awPlainText.   s
2f40: 65 74 20 6d 65 74 68 6f 64 50 72 6f 63 28 74 78  et methodProc(tx
2f50: 70 6c 6f 74 2c 74 69 74 6c 65 29 20 20 20 20 20  plot,title)     
2f60: 20 20 20 20 20 20 20 20 44 72 61 77 54 69 74 6c          DrawTitl
2f70: 65 0a 20 20 20 73 65 74 20 6d 65 74 68 6f 64 50  e.   set methodP
2f80: 72 6f 63 28 74 78 70 6c 6f 74 2c 78 74 65 78 74  roc(txplot,xtext
2f90: 29 20 20 20 20 20 20 20 20 20 20 20 20 20 44 72  )             Dr
2fa0: 61 77 58 74 65 78 74 0a 20 20 20 73 65 74 20 6d  awXtext.   set m
2fb0: 65 74 68 6f 64 50 72 6f 63 28 74 78 70 6c 6f 74  ethodProc(txplot
2fc0: 2c 79 74 65 78 74 29 20 20 20 20 20 20 20 20 20  ,ytext)         
2fd0: 20 20 20 20 44 72 61 77 59 74 65 78 74 0a 20 20      DrawYtext.  
2fe0: 20 73 65 74 20 6d 65 74 68 6f 64 50 72 6f 63 28   set methodProc(
2ff0: 74 78 70 6c 6f 74 2c 70 6c 6f 74 29 20 20 20 20  txplot,plot)    
3000: 20 20 20 20 20 20 20 20 20 20 44 72 61 77 54 69            DrawTi
3010: 6d 65 44 61 74 61 0a 20 20 20 73 65 74 20 6d 65  meData.   set me
3020: 74 68 6f 64 50 72 6f 63 28 74 78 70 6c 6f 74 2c  thodProc(txplot,
3030: 69 6e 74 65 72 76 61 6c 29 20 20 20 20 20 20 20  interval)       
3040: 20 20 20 44 72 61 77 49 6e 74 65 72 76 61 6c 0a     DrawInterval.
3050: 20 20 20 73 65 74 20 6d 65 74 68 6f 64 50 72 6f     set methodPro
3060: 63 28 74 78 70 6c 6f 74 2c 73 61 76 65 70 6c 6f  c(txplot,saveplo
3070: 74 29 20 20 20 20 20 20 20 20 20 20 53 61 76 65  t)          Save
3080: 50 6c 6f 74 0a 20 20 20 73 65 74 20 6d 65 74 68  Plot.   set meth
3090: 6f 64 50 72 6f 63 28 74 78 70 6c 6f 74 2c 64 61  odProc(txplot,da
30a0: 74 61 63 6f 6e 66 69 67 29 20 20 20 20 20 20 20  taconfig)       
30b0: 20 44 61 74 61 43 6f 6e 66 69 67 0a 20 20 20 73   DataConfig.   s
30c0: 65 74 20 6d 65 74 68 6f 64 50 72 6f 63 28 74 78  et methodProc(tx
30d0: 70 6c 6f 74 2c 78 63 6f 6e 66 69 67 29 20 20 20  plot,xconfig)   
30e0: 20 20 20 20 20 20 20 20 58 43 6f 6e 66 69 67 0a          XConfig.
30f0: 20 20 20 73 65 74 20 6d 65 74 68 6f 64 50 72 6f     set methodPro
3100: 63 28 74 78 70 6c 6f 74 2c 79 63 6f 6e 66 69 67  c(txplot,yconfig
3110: 29 20 20 20 20 20 20 20 20 20 20 20 59 43 6f 6e  )           YCon
3120: 66 69 67 0a 20 20 20 73 65 74 20 6d 65 74 68 6f  fig.   set metho
3130: 64 50 72 6f 63 28 74 78 70 6c 6f 74 2c 78 74 69  dProc(txplot,xti
3140: 63 6b 6c 69 6e 65 73 29 20 20 20 20 20 20 20 20  cklines)        
3150: 44 72 61 77 58 54 69 63 6b 6c 69 6e 65 73 0a 20  DrawXTicklines. 
3160: 20 20 73 65 74 20 6d 65 74 68 6f 64 50 72 6f 63    set methodProc
3170: 28 74 78 70 6c 6f 74 2c 79 74 69 63 6b 6c 69 6e  (txplot,yticklin
3180: 65 73 29 20 20 20 20 20 20 20 20 44 72 61 77 59  es)        DrawY
3190: 54 69 63 6b 6c 69 6e 65 73 0a 20 20 20 73 65 74  Ticklines.   set
31a0: 20 6d 65 74 68 6f 64 50 72 6f 63 28 74 78 70 6c   methodProc(txpl
31b0: 6f 74 2c 62 61 63 6b 67 72 6f 75 6e 64 29 20 20  ot,background)  
31c0: 20 20 20 20 20 20 42 61 63 6b 67 72 6f 75 6e 64        Background
31d0: 43 6f 6c 6f 75 72 0a 20 20 20 73 65 74 20 6d 65  Colour.   set me
31e0: 74 68 6f 64 50 72 6f 63 28 74 78 70 6c 6f 74 2c  thodProc(txplot,
31f0: 6c 65 67 65 6e 64 63 6f 6e 66 69 67 29 20 20 20  legendconfig)   
3200: 20 20 20 4c 65 67 65 6e 64 43 6f 6e 66 69 67 75     LegendConfigu
3210: 72 65 0a 20 20 20 73 65 74 20 6d 65 74 68 6f 64  re.   set method
3220: 50 72 6f 63 28 74 78 70 6c 6f 74 2c 6c 65 67 65  Proc(txplot,lege
3230: 6e 64 29 20 20 20 20 20 20 20 20 20 20 20 20 44  nd)            D
3240: 72 61 77 4c 65 67 65 6e 64 0a 20 20 20 73 65 74  rawLegend.   set
3250: 20 6d 65 74 68 6f 64 50 72 6f 63 28 74 78 70 6c   methodProc(txpl
3260: 6f 74 2c 62 61 6c 6c 6f 6f 6e 29 20 20 20 20 20  ot,balloon)     
3270: 20 20 20 20 20 20 44 72 61 77 42 61 6c 6c 6f 6f        DrawBalloo
3280: 6e 0a 20 20 20 73 65 74 20 6d 65 74 68 6f 64 50  n.   set methodP
3290: 72 6f 63 28 74 78 70 6c 6f 74 2c 62 61 6c 6c 6f  roc(txplot,ballo
32a0: 6f 6e 63 6f 6e 66 69 67 29 20 20 20 20 20 43 6f  onconfig)     Co
32b0: 6e 66 69 67 42 61 6c 6c 6f 6f 6e 0a 20 20 20 73  nfigBalloon.   s
32c0: 65 74 20 6d 65 74 68 6f 64 50 72 6f 63 28 74 78  et methodProc(tx
32d0: 70 6c 6f 74 2c 70 6c 61 69 6e 74 65 78 74 29 20  plot,plaintext) 
32e0: 20 20 20 20 20 20 20 20 44 72 61 77 50 6c 61 69          DrawPlai
32f0: 6e 54 65 78 74 0a 20 20 20 73 65 74 20 6d 65 74  nText.   set met
3300: 68 6f 64 50 72 6f 63 28 33 64 72 69 62 62 6f 6e  hodProc(3dribbon
3310: 2c 74 69 74 6c 65 29 20 20 20 20 20 20 20 20 20  ,title)         
3320: 20 20 44 72 61 77 54 69 74 6c 65 0a 20 20 20 73    DrawTitle.   s
3330: 65 74 20 6d 65 74 68 6f 64 50 72 6f 63 28 33 64  et methodProc(3d
3340: 72 69 62 62 6f 6e 2c 73 61 76 65 70 6c 6f 74 29  ribbon,saveplot)
3350: 20 20 20 20 20 20 20 20 53 61 76 65 50 6c 6f 74          SavePlot
3360: 0a 20 20 20 73 65 74 20 6d 65 74 68 6f 64 50 72  .   set methodPr
3370: 6f 63 28 33 64 72 69 62 62 6f 6e 2c 6c 69 6e 65  oc(3dribbon,line
3380: 29 20 20 20 20 20 20 20 20 20 20 20 20 44 72 61  )            Dra
3390: 77 33 44 4c 69 6e 65 0a 20 20 20 73 65 74 20 6d  w3DLine.   set m
33a0: 65 74 68 6f 64 50 72 6f 63 28 33 64 72 69 62 62  ethodProc(3dribb
33b0: 6f 6e 2c 61 72 65 61 29 20 20 20 20 20 20 20 20  on,area)        
33c0: 20 20 20 20 44 72 61 77 33 44 41 72 65 61 0a 20      Draw3DArea. 
33d0: 20 20 73 65 74 20 6d 65 74 68 6f 64 50 72 6f 63    set methodProc
33e0: 28 33 64 72 69 62 62 6f 6e 2c 62 61 63 6b 67 72  (3dribbon,backgr
33f0: 6f 75 6e 64 29 20 20 20 20 20 20 42 61 63 6b 67  ound)      Backg
3400: 72 6f 75 6e 64 43 6f 6c 6f 75 72 0a 20 20 20 73  roundColour.   s
3410: 65 74 20 6d 65 74 68 6f 64 50 72 6f 63 28 62 6f  et methodProc(bo
3420: 78 70 6c 6f 74 2c 74 69 74 6c 65 29 20 20 20 20  xplot,title)    
3430: 20 20 20 20 20 20 20 20 44 72 61 77 54 69 74 6c          DrawTitl
3440: 65 0a 20 20 20 73 65 74 20 6d 65 74 68 6f 64 50  e.   set methodP
3450: 72 6f 63 28 62 6f 78 70 6c 6f 74 2c 78 74 65 78  roc(boxplot,xtex
3460: 74 29 20 20 20 20 20 20 20 20 20 20 20 20 44 72  t)            Dr
3470: 61 77 58 74 65 78 74 0a 20 20 20 73 65 74 20 6d  awXtext.   set m
3480: 65 74 68 6f 64 50 72 6f 63 28 62 6f 78 70 6c 6f  ethodProc(boxplo
3490: 74 2c 79 74 65 78 74 29 20 20 20 20 20 20 20 20  t,ytext)        
34a0: 20 20 20 20 44 72 61 77 59 74 65 78 74 0a 20 20      DrawYtext.  
34b0: 20 73 65 74 20 6d 65 74 68 6f 64 50 72 6f 63 28   set methodProc(
34c0: 62 6f 78 70 6c 6f 74 2c 70 6c 6f 74 29 20 20 20  boxplot,plot)   
34d0: 20 20 20 20 20 20 20 20 20 20 44 72 61 77 42 6f            DrawBo
34e0: 78 44 61 74 61 0a 20 20 20 73 65 74 20 6d 65 74  xData.   set met
34f0: 68 6f 64 50 72 6f 63 28 62 6f 78 70 6c 6f 74 2c  hodProc(boxplot,
3500: 73 61 76 65 70 6c 6f 74 29 20 20 20 20 20 20 20  saveplot)       
3510: 20 20 53 61 76 65 50 6c 6f 74 0a 20 20 20 73 65    SavePlot.   se
3520: 74 20 6d 65 74 68 6f 64 50 72 6f 63 28 62 6f 78  t methodProc(box
3530: 70 6c 6f 74 2c 64 61 74 61 63 6f 6e 66 69 67 29  plot,dataconfig)
3540: 20 20 20 20 20 20 20 44 61 74 61 43 6f 6e 66 69         DataConfi
3550: 67 0a 20 20 20 73 65 74 20 6d 65 74 68 6f 64 50  g.   set methodP
3560: 72 6f 63 28 62 6f 78 70 6c 6f 74 2c 78 63 6f 6e  roc(boxplot,xcon
3570: 66 69 67 29 20 20 20 20 20 20 20 20 20 20 58 43  fig)          XC
3580: 6f 6e 66 69 67 0a 20 20 20 73 65 74 20 6d 65 74  onfig.   set met
3590: 68 6f 64 50 72 6f 63 28 62 6f 78 70 6c 6f 74 2c  hodProc(boxplot,
35a0: 79 63 6f 6e 66 69 67 29 20 20 20 20 20 20 20 20  yconfig)        
35b0: 20 20 59 43 6f 6e 66 69 67 0a 20 20 20 73 65 74    YConfig.   set
35c0: 20 6d 65 74 68 6f 64 50 72 6f 63 28 62 6f 78 70   methodProc(boxp
35d0: 6c 6f 74 2c 78 74 69 63 6b 6c 69 6e 65 73 29 20  lot,xticklines) 
35e0: 20 20 20 20 20 20 44 72 61 77 58 54 69 63 6b 6c        DrawXTickl
35f0: 69 6e 65 73 0a 20 20 20 73 65 74 20 6d 65 74 68  ines.   set meth
3600: 6f 64 50 72 6f 63 28 62 6f 78 70 6c 6f 74 2c 79  odProc(boxplot,y
3610: 74 69 63 6b 6c 69 6e 65 73 29 20 20 20 20 20 20  ticklines)      
3620: 20 44 72 61 77 59 54 69 63 6b 6c 69 6e 65 73 0a   DrawYTicklines.
3630: 20 20 20 73 65 74 20 6d 65 74 68 6f 64 50 72 6f     set methodPro
3640: 63 28 62 6f 78 70 6c 6f 74 2c 62 61 63 6b 67 72  c(boxplot,backgr
3650: 6f 75 6e 64 29 20 20 20 20 20 20 20 42 61 63 6b  ound)       Back
3660: 67 72 6f 75 6e 64 43 6f 6c 6f 75 72 0a 20 20 20  groundColour.   
3670: 73 65 74 20 6d 65 74 68 6f 64 50 72 6f 63 28 62  set methodProc(b
3680: 6f 78 70 6c 6f 74 2c 6c 65 67 65 6e 64 63 6f 6e  oxplot,legendcon
3690: 66 69 67 29 20 20 20 20 20 4c 65 67 65 6e 64 43  fig)     LegendC
36a0: 6f 6e 66 69 67 75 72 65 0a 20 20 20 73 65 74 20  onfigure.   set 
36b0: 6d 65 74 68 6f 64 50 72 6f 63 28 62 6f 78 70 6c  methodProc(boxpl
36c0: 6f 74 2c 6c 65 67 65 6e 64 29 20 20 20 20 20 20  ot,legend)      
36d0: 20 20 20 20 20 44 72 61 77 4c 65 67 65 6e 64 0a       DrawLegend.
36e0: 20 20 20 73 65 74 20 6d 65 74 68 6f 64 50 72 6f     set methodPro
36f0: 63 28 62 6f 78 70 6c 6f 74 2c 62 61 6c 6c 6f 6f  c(boxplot,balloo
3700: 6e 29 20 20 20 20 20 20 20 20 20 20 44 72 61 77  n)          Draw
3710: 42 61 6c 6c 6f 6f 6e 0a 20 20 20 73 65 74 20 6d  Balloon.   set m
3720: 65 74 68 6f 64 50 72 6f 63 28 62 6f 78 70 6c 6f  ethodProc(boxplo
3730: 74 2c 62 61 6c 6c 6f 6f 6e 63 6f 6e 66 69 67 29  t,balloonconfig)
3740: 20 20 20 20 43 6f 6e 66 69 67 42 61 6c 6c 6f 6f      ConfigBalloo
3750: 6e 0a 20 20 20 73 65 74 20 6d 65 74 68 6f 64 50  n.   set methodP
3760: 72 6f 63 28 62 6f 78 70 6c 6f 74 2c 70 6c 61 69  roc(boxplot,plai
3770: 6e 74 65 78 74 29 20 20 20 20 20 20 20 20 44 72  ntext)        Dr
3780: 61 77 50 6c 61 69 6e 54 65 78 74 0a 0a 20 20 20  awPlainText..   
3790: 23 0a 20 20 20 23 20 41 75 78 69 6c 69 61 72 79  #.   # Auxiliary
37a0: 20 70 61 72 61 6d 65 74 65 72 73 0a 20 20 20 23   parameters.   #
37b0: 0a 20 20 20 76 61 72 69 61 62 6c 65 20 74 6f 72  .   variable tor
37c0: 61 64 0a 20 20 20 73 65 74 20 74 6f 72 61 64 20  ad.   set torad 
37d0: 5b 65 78 70 72 20 7b 33 2e 31 34 31 35 39 32 36  [expr {3.1415926
37e0: 2f 31 38 30 2e 30 7d 5d 0a 0a 20 20 20 76 61 72  /180.0}]..   var
37f0: 69 61 62 6c 65 20 6f 70 74 69 6f 6e 73 0a 20 20  iable options.  
3800: 20 76 61 72 69 61 62 6c 65 20 6f 70 74 69 6f 6e   variable option
3810: 5f 6b 65 79 73 0a 20 20 20 76 61 72 69 61 62 6c  _keys.   variabl
3820: 65 20 6f 70 74 69 6f 6e 5f 76 61 6c 75 65 73 0a  e option_values.
3830: 20 20 20 73 65 74 20 6f 70 74 69 6f 6e 73 20 20     set options  
3840: 20 20 20 20 20 7b 2d 63 6f 6c 6f 75 72 20 2d 63       {-colour -c
3850: 6f 6c 6f 72 20 20 2d 73 79 6d 62 6f 6c 20 2d 74  olor  -symbol -t
3860: 79 70 65 20 2d 66 69 6c 6c 65 64 20 2d 66 69 6c  ype -filled -fil
3870: 6c 63 6f 6c 6f 75 72 20 2d 62 6f 78 77 69 64 74  lcolour -boxwidt
3880: 68 7d 0a 20 20 20 73 65 74 20 6f 70 74 69 6f 6e  h}.   set option
3890: 5f 6b 65 79 73 20 20 20 7b 2d 63 6f 6c 6f 75 72  _keys   {-colour
38a0: 20 2d 63 6f 6c 6f 75 72 20 2d 73 79 6d 62 6f 6c   -colour -symbol
38b0: 20 2d 74 79 70 65 20 2d 66 69 6c 6c 65 64 20 2d   -type -filled -
38c0: 66 69 6c 6c 63 6f 6c 6f 75 72 20 2d 62 6f 78 77  fillcolour -boxw
38d0: 69 64 74 68 7d 0a 20 20 20 73 65 74 20 6f 70 74  idth}.   set opt
38e0: 69 6f 6e 5f 76 61 6c 75 65 73 20 7b 2d 63 6f 6c  ion_values {-col
38f0: 6f 75 72 20 7b 2e 2e 2e 7d 0a 20 20 20 20 20 20  our {...}.      
3900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3910: 2d 73 79 6d 62 6f 6c 20 7b 70 6c 75 73 20 63 72  -symbol {plus cr
3920: 6f 73 73 20 63 69 72 63 6c 65 20 75 70 20 64 6f  oss circle up do
3930: 77 6e 20 64 6f 74 20 75 70 66 69 6c 6c 65 64 20  wn dot upfilled 
3940: 64 6f 77 6e 66 69 6c 6c 65 64 7d 0a 20 20 20 20  downfilled}.    
3950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3960: 20 20 2d 74 79 70 65 20 7b 6c 69 6e 65 20 73 79    -type {line sy
3970: 6d 62 6f 6c 20 62 6f 74 68 7d 0a 20 20 20 20 20  mbol both}.     
3980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3990: 20 2d 66 69 6c 6c 65 64 20 7b 6e 6f 20 75 70 20   -filled {no up 
39a0: 64 6f 77 6e 7d 0a 20 20 20 20 20 20 20 20 20 20  down}.          
39b0: 20 20 20 20 20 20 20 20 20 20 20 20 2d 66 69 6c              -fil
39c0: 6c 63 6f 6c 6f 75 72 20 7b 2e 2e 2e 7d 0a 20 20  lcolour {...}.  
39d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
39e0: 20 20 20 20 2d 62 6f 78 77 69 64 74 68 20 20 20      -boxwidth   
39f0: 7b 2e 2e 2e 7d 0a 20 20 20 20 20 20 20 20 20 20  {...}.          
3a00: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20             }..  
3a10: 20 76 61 72 69 61 62 6c 65 20 61 78 69 73 5f 6f   variable axis_o
3a20: 70 74 69 6f 6e 73 0a 20 20 20 76 61 72 69 61 62  ptions.   variab
3a30: 6c 65 20 61 78 69 73 5f 6f 70 74 69 6f 6e 5f 63  le axis_option_c
3a40: 6c 65 61 72 0a 20 20 20 76 61 72 69 61 62 6c 65  lear.   variable
3a50: 20 61 78 69 73 5f 6f 70 74 69 6f 6e 5f 76 61 6c   axis_option_val
3a60: 75 65 73 0a 20 20 20 73 65 74 20 61 78 69 73 5f  ues.   set axis_
3a70: 6f 70 74 69 6f 6e 73 20 20 20 20 20 20 20 7b 2d  options       {-
3a80: 66 6f 72 6d 61 74 20 2d 74 69 63 6b 6c 65 6e 67  format -tickleng
3a90: 74 68 20 2d 74 69 63 6b 6c 69 6e 65 73 20 2d 73  th -ticklines -s
3aa0: 63 61 6c 65 7d 0a 20 20 20 73 65 74 20 61 78 69  cale}.   set axi
3ab0: 73 5f 6f 70 74 69 6f 6e 5f 63 6c 65 61 72 20 20  s_option_clear  
3ac0: 7b 20 30 20 20 20 20 20 20 20 30 20 20 20 20 20  { 0       0     
3ad0: 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20        0         
3ae0: 20 31 20 20 20 20 7d 0a 20 20 20 73 65 74 20 61   1    }.   set a
3af0: 78 69 73 5f 6f 70 74 69 6f 6e 5f 76 61 6c 75 65  xis_option_value
3b00: 73 20 7b 2d 66 6f 72 6d 61 74 20 20 20 20 20 7b  s {-format     {
3b10: 2e 2e 2e 7d 0a 20 20 20 20 20 20 20 20 20 20 20  ...}.           
3b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3b30: 2d 74 69 63 6b 6c 65 6e 67 74 68 20 7b 2e 2e 2e  -ticklength {...
3b40: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
3b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 74 69               -ti
3b60: 63 6b 6c 69 6e 65 73 20 20 7b 30 20 31 7d 0a 20  cklines  {0 1}. 
3b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3b80: 20 20 20 20 20 20 20 20 20 20 2d 73 63 61 6c 65            -scale
3b90: 20 20 20 20 20 20 7b 2e 2e 2e 7d 0a 20 20 20 20        {...}.    
3ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3bb0: 20 20 20 20 20 20 7d 0a 20 20 20 76 61 72 69 61        }.   varia
3bc0: 62 6c 65 20 63 6f 6e 74 6f 75 72 5f 6f 70 74 69  ble contour_opti
3bd0: 6f 6e 73 0a 7d 0a 0a 23 20 73 65 74 5a 6f 6f 6d  ons.}..# setZoom
3be0: 50 61 6e 20 2d 2d 0a 23 20 20 20 20 53 65 74 20  Pan --.#    Set 
3bf0: 75 70 20 74 68 65 20 62 69 6e 64 69 6e 67 73 20  up the bindings 
3c00: 66 6f 72 20 7a 6f 6f 6d 69 6e 67 20 61 6e 64 20  for zooming and 
3c10: 70 61 6e 6e 69 6e 67 0a 23 20 41 72 67 75 6d 65  panning.# Argume
3c20: 6e 74 73 3a 0a 23 20 20 20 20 77 20 20 20 20 20  nts:.#    w     
3c30: 20 20 20 20 20 20 4e 61 6d 65 20 6f 66 20 74 68        Name of th
3c40: 65 20 63 61 6e 76 61 73 20 77 69 6e 64 6f 77 0a  e canvas window.
3c50: 23 20 52 65 73 75 6c 74 3a 0a 23 20 20 20 20 4e  # Result:.#    N
3c60: 6f 6e 65 0a 23 20 53 69 64 65 20 65 66 66 65 63  one.# Side effec
3c70: 74 3a 0a 23 20 20 20 20 42 69 6e 64 69 6e 67 73  t:.#    Bindings
3c80: 20 73 65 74 20 75 70 0a 23 0a 70 72 6f 63 20 3a   set up.#.proc :
3c90: 3a 50 6c 6f 74 63 68 61 72 74 3a 3a 73 65 74 5a  :Plotchart::setZ
3ca0: 6f 6f 6d 50 61 6e 20 7b 20 77 20 7d 20 7b 0a 20  oomPan { w } {. 
3cb0: 20 20 73 65 74 20 73 71 72 74 32 20 20 5b 65 78    set sqrt2  [ex
3cc0: 70 72 20 7b 73 71 72 74 28 32 2e 30 29 7d 5d 0a  pr {sqrt(2.0)}].
3cd0: 20 20 20 73 65 74 20 73 71 72 74 30 35 20 5b 65     set sqrt05 [e
3ce0: 78 70 72 20 7b 73 71 72 74 28 30 2e 35 29 7d 5d  xpr {sqrt(0.5)}]
3cf0: 0a 0a 20 20 20 62 69 6e 64 20 24 77 20 3c 43 6f  ..   bind $w <Co
3d00: 6e 74 72 6f 6c 2d 42 75 74 74 6f 6e 2d 31 3e 20  ntrol-Button-1> 
3d10: 5b 6c 69 73 74 20 3a 3a 50 6c 6f 74 63 68 61 72  [list ::Plotchar
3d20: 74 3a 3a 53 63 61 6c 65 49 74 65 6d 73 20 24 77  t::ScaleItems $w
3d30: 20 25 78 20 25 79 20 24 73 71 72 74 32 5d 0a 20   %x %y $sqrt2]. 
3d40: 20 20 62 69 6e 64 20 24 77 20 3c 43 6f 6e 74 72    bind $w <Contr
3d50: 6f 6c 2d 50 72 69 6f 72 3e 20 20 20 20 5b 6c 69  ol-Prior>    [li
3d60: 73 74 20 3a 3a 50 6c 6f 74 63 68 61 72 74 3a 3a  st ::Plotchart::
3d70: 53 63 61 6c 65 49 74 65 6d 73 20 24 77 20 25 78  ScaleItems $w %x
3d80: 20 25 79 20 24 73 71 72 74 32 5d 0a 20 20 20 62   %y $sqrt2].   b
3d90: 69 6e 64 20 24 77 20 3c 43 6f 6e 74 72 6f 6c 2d  ind $w <Control-
3da0: 42 75 74 74 6f 6e 2d 32 3e 20 5b 6c 69 73 74 20  Button-2> [list 
3db0: 3a 3a 50 6c 6f 74 63 68 61 72 74 3a 3a 53 63 61  ::Plotchart::Sca
3dc0: 6c 65 49 74 65 6d 73 20 24 77 20 25 78 20 25 79  leItems $w %x %y
3dd0: 20 24 73 71 72 74 30 35 5d 0a 20 20 20 62 69 6e   $sqrt05].   bin
3de0: 64 20 24 77 20 3c 43 6f 6e 74 72 6f 6c 2d 42 75  d $w <Control-Bu
3df0: 74 74 6f 6e 2d 33 3e 20 5b 6c 69 73 74 20 3a 3a  tton-3> [list ::
3e00: 50 6c 6f 74 63 68 61 72 74 3a 3a 53 63 61 6c 65  Plotchart::Scale
3e10: 49 74 65 6d 73 20 24 77 20 25 78 20 25 79 20 24  Items $w %x %y $
3e20: 73 71 72 74 30 35 5d 0a 20 20 20 62 69 6e 64 20  sqrt05].   bind 
3e30: 24 77 20 3c 43 6f 6e 74 72 6f 6c 2d 4e 65 78 74  $w <Control-Next
3e40: 3e 20 20 20 20 20 5b 6c 69 73 74 20 3a 3a 50 6c  >     [list ::Pl
3e50: 6f 74 63 68 61 72 74 3a 3a 53 63 61 6c 65 49 74  otchart::ScaleIt
3e60: 65 6d 73 20 24 77 20 25 78 20 25 79 20 24 73 71  ems $w %x %y $sq
3e70: 72 74 30 35 5d 0a 20 20 20 62 69 6e 64 20 24 77  rt05].   bind $w
3e80: 20 3c 43 6f 6e 74 72 6f 6c 2d 55 70 3e 20 20 20   <Control-Up>   
3e90: 20 20 20 20 5b 6c 69 73 74 20 3a 3a 50 6c 6f 74      [list ::Plot
3ea0: 63 68 61 72 74 3a 3a 4d 6f 76 65 49 74 65 6d 73  chart::MoveItems
3eb0: 20 20 24 77 20 20 20 30 20 2d 34 30 5d 0a 20 20    $w   0 -40].  
3ec0: 20 62 69 6e 64 20 24 77 20 3c 43 6f 6e 74 72 6f   bind $w <Contro
3ed0: 6c 2d 44 6f 77 6e 3e 20 20 20 20 20 5b 6c 69 73  l-Down>     [lis
3ee0: 74 20 3a 3a 50 6c 6f 74 63 68 61 72 74 3a 3a 4d  t ::Plotchart::M
3ef0: 6f 76 65 49 74 65 6d 73 20 20 24 77 20 20 20 30  oveItems  $w   0
3f00: 20 20 34 30 5d 0a 20 20 20 62 69 6e 64 20 24 77    40].   bind $w
3f10: 20 3c 43 6f 6e 74 72 6f 6c 2d 4c 65 66 74 3e 20   <Control-Left> 
3f20: 20 20 20 20 5b 6c 69 73 74 20 3a 3a 50 6c 6f 74      [list ::Plot
3f30: 63 68 61 72 74 3a 3a 4d 6f 76 65 49 74 65 6d 73  chart::MoveItems
3f40: 20 20 24 77 20 2d 34 30 20 20 20 30 5d 0a 20 20    $w -40   0].  
3f50: 20 62 69 6e 64 20 24 77 20 3c 43 6f 6e 74 72 6f   bind $w <Contro
3f60: 6c 2d 52 69 67 68 74 3e 20 20 20 20 5b 6c 69 73  l-Right>    [lis
3f70: 74 20 3a 3a 50 6c 6f 74 63 68 61 72 74 3a 3a 4d  t ::Plotchart::M
3f80: 6f 76 65 49 74 65 6d 73 20 20 24 77 20 20 34 30  oveItems  $w  40
3f90: 20 20 20 30 5d 0a 20 20 20 66 6f 63 75 73 20 24     0].   focus $
3fa0: 77 0a 7d 0a 0a 23 20 76 69 65 77 50 6f 72 74 20  w.}..# viewPort 
3fb0: 2d 2d 0a 23 20 20 20 20 53 65 74 20 74 68 65 20  --.#    Set the 
3fc0: 70 69 78 65 6c 20 65 78 74 72 65 6d 65 73 20 66  pixel extremes f
3fd0: 6f 72 20 74 68 65 20 67 72 61 70 68 0a 23 20 41  or the graph.# A
3fe0: 72 67 75 6d 65 6e 74 73 3a 0a 23 20 20 20 20 77  rguments:.#    w
3ff0: 20 20 20 20 20 20 20 20 20 20 20 4e 61 6d 65 20             Name 
4000: 6f 66 20 74 68 65 20 63 61 6e 76 61 73 20 77 69  of the canvas wi
4010: 6e 64 6f 77 0a 23 20 20 20 20 70 78 6d 69 6e 20  ndow.#    pxmin 
4020: 20 20 20 20 20 20 4d 69 6e 69 6d 75 6d 20 58 2d        Minimum X-
4030: 63 6f 6f 72 64 69 6e 61 74 65 0a 23 20 20 20 20  coordinate.#    
4040: 70 79 6d 69 6e 20 20 20 20 20 20 20 4d 69 6e 69  pymin       Mini
4050: 6d 75 6d 20 59 2d 63 6f 6f 72 64 69 6e 61 74 65  mum Y-coordinate
4060: 0a 23 20 20 20 20 70 78 6d 61 78 20 20 20 20 20  .#    pxmax     
4070: 20 20 4d 61 78 69 6d 75 6d 20 58 2d 63 6f 6f 72    Maximum X-coor
4080: 64 69 6e 61 74 65 0a 23 20 20 20 20 70 79 6d 61  dinate.#    pyma
4090: 78 20 20 20 20 20 20 20 4d 61 78 69 6d 75 6d 20  x       Maximum 
40a0: 59 2d 63 6f 6f 72 64 69 6e 61 74 65 0a 23 20 52  Y-coordinate.# R
40b0: 65 73 75 6c 74 3a 0a 23 20 20 20 20 4e 6f 6e 65  esult:.#    None
40c0: 0a 23 20 53 69 64 65 20 65 66 66 65 63 74 3a 0a  .# Side effect:.
40d0: 23 20 20 20 20 41 72 72 61 79 20 73 63 61 6c 69  #    Array scali
40e0: 6e 67 20 66 69 6c 6c 65 64 0a 23 0a 70 72 6f 63  ng filled.#.proc
40f0: 20 3a 3a 50 6c 6f 74 63 68 61 72 74 3a 3a 76 69   ::Plotchart::vi
4100: 65 77 50 6f 72 74 20 7b 20 77 20 70 78 6d 69 6e  ewPort { w pxmin
4110: 20 70 79 6d 69 6e 20 70 78 6d 61 78 20 70 79 6d   pymin pxmax pym
4120: 61 78 20 7d 20 7b 0a 20 20 20 76 61 72 69 61 62  ax } {.   variab
4130: 6c 65 20 73 63 61 6c 69 6e 67 0a 0a 20 20 20 69  le scaling..   i
4140: 66 20 7b 20 24 70 78 6d 69 6e 20 3e 3d 20 24 70  f { $pxmin >= $p
4150: 78 6d 61 78 20 7c 7c 20 24 70 79 6d 69 6e 20 3e  xmax || $pymin >
4160: 3d 20 24 70 79 6d 61 78 20 7d 20 7b 0a 20 20 20  = $pymax } {.   
4170: 20 20 20 72 65 74 75 72 6e 20 2d 63 6f 64 65 20     return -code 
4180: 65 72 72 6f 72 20 22 49 6e 63 6f 6e 73 69 73 74  error "Inconsist
4190: 65 6e 74 20 62 6f 75 6e 64 73 20 66 6f 72 20 76  ent bounds for v
41a0: 69 65 77 70 6f 72 74 22 0a 20 20 20 7d 0a 0a 20  iewport".   }.. 
41b0: 20 20 73 65 74 20 73 63 61 6c 69 6e 67 28 24 77    set scaling($w
41c0: 2c 70 78 6d 69 6e 29 20 20 20 20 24 70 78 6d 69  ,pxmin)    $pxmi
41d0: 6e 0a 20 20 20 73 65 74 20 73 63 61 6c 69 6e 67  n.   set scaling
41e0: 28 24 77 2c 70 79 6d 69 6e 29 20 20 20 20 24 70  ($w,pymin)    $p
41f0: 79 6d 69 6e 0a 20 20 20 73 65 74 20 73 63 61 6c  ymin.   set scal
4200: 69 6e 67 28 24 77 2c 70 78 6d 61 78 29 20 20 20  ing($w,pxmax)   
4210: 20 24 70 78 6d 61 78 0a 20 20 20 73 65 74 20 73   $pxmax.   set s
4220: 63 61 6c 69 6e 67 28 24 77 2c 70 79 6d 61 78 29  caling($w,pymax)
4230: 20 20 20 20 24 70 79 6d 61 78 0a 20 20 20 73 65      $pymax.   se
4240: 74 20 73 63 61 6c 69 6e 67 28 24 77 2c 6e 65 77  t scaling($w,new
4250: 29 20 20 20 20 20 20 31 0a 7d 0a 0a 23 20 77 6f  )      1.}..# wo
4260: 72 6c 64 43 6f 6f 72 64 69 6e 61 74 65 73 20 2d  rldCoordinates -
4270: 2d 0a 23 20 20 20 20 53 65 74 20 74 68 65 20 65  -.#    Set the e
4280: 78 74 72 65 6d 65 73 20 66 6f 72 20 74 68 65 20  xtremes for the 
4290: 77 6f 72 6c 64 20 63 6f 6f 72 64 69 6e 61 74 65  world coordinate
42a0: 73 0a 23 20 41 72 67 75 6d 65 6e 74 73 3a 0a 23  s.# Arguments:.#
42b0: 20 20 20 20 77 20 20 20 20 20 20 20 20 20 20 20      w           
42c0: 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 61 6e 76  Name of the canv
42d0: 61 73 20 77 69 6e 64 6f 77 0a 23 20 20 20 20 78  as window.#    x
42e0: 6d 69 6e 20 20 20 20 20 20 20 20 4d 69 6e 69 6d  min        Minim
42f0: 75 6d 20 58 2d 63 6f 6f 72 64 69 6e 61 74 65 0a  um X-coordinate.
4300: 23 20 20 20 20 79 6d 69 6e 20 20 20 20 20 20 20  #    ymin       
4310: 20 4d 69 6e 69 6d 75 6d 20 59 2d 63 6f 6f 72 64   Minimum Y-coord
4320: 69 6e 61 74 65 0a 23 20 20 20 20 78 6d 61 78 20  inate.#    xmax 
4330: 20 20 20 20 20 20 20 4d 61 78 69 6d 75 6d 20 58         Maximum X
4340: 2d 63 6f 6f 72 64 69 6e 61 74 65 0a 23 20 20 20  -coordinate.#   
4350: 20 79 6d 61 78 20 20 20 20 20 20 20 20 4d 61 78   ymax        Max
4360: 69 6d 75 6d 20 59 2d 63 6f 6f 72 64 69 6e 61 74  imum Y-coordinat
4370: 65 0a 23 20 52 65 73 75 6c 74 3a 0a 23 20 20 20  e.# Result:.#   
4380: 20 4e 6f 6e 65 0a 23 20 53 69 64 65 20 65 66 66   None.# Side eff
4390: 65 63 74 3a 0a 23 20 20 20 20 41 72 72 61 79 20  ect:.#    Array 
43a0: 73 63 61 6c 69 6e 67 20 66 69 6c 6c 65 64 0a 23  scaling filled.#
43b0: 0a 70 72 6f 63 20 3a 3a 50 6c 6f 74 63 68 61 72  .proc ::Plotchar
43c0: 74 3a 3a 77 6f 72 6c 64 43 6f 6f 72 64 69 6e 61  t::worldCoordina
43d0: 74 65 73 20 7b 20 77 20 78 6d 69 6e 20 79 6d 69  tes { w xmin ymi
43e0: 6e 20 78 6d 61 78 20 79 6d 61 78 20 7d 20 7b 0a  n xmax ymax } {.
43f0: 20 20 20 76 61 72 69 61 62 6c 65 20 73 63 61 6c     variable scal
4400: 69 6e 67 0a 0a 20 20 20 69 66 20 7b 20 24 78 6d  ing..   if { $xm
4410: 69 6e 20 3d 3d 20 24 78 6d 61 78 20 7c 7c 20 24  in == $xmax || $
4420: 79 6d 69 6e 20 3d 3d 20 24 79 6d 61 78 20 7d 20  ymin == $ymax } 
4430: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d  {.      return -
4440: 63 6f 64 65 20 65 72 72 6f 72 20 22 4d 69 6e 69  code error "Mini
4450: 6d 75 6d 20 61 6e 64 20 6d 61 78 69 6d 75 6d 20  mum and maximum 
4460: 6d 75 73 74 20 64 69 66 66 65 72 20 66 6f 72 20  must differ for 
4470: 77 6f 72 6c 64 20 63 6f 6f 72 64 69 6e 61 74 65  world coordinate
4480: 73 22 0a 20 20 20 7d 0a 0a 20 20 20 73 65 74 20  s".   }..   set 
4490: 73 63 61 6c 69 6e 67 28 24 77 2c 78 6d 69 6e 29  scaling($w,xmin)
44a0: 20 20 20 20 5b 65 78 70 72 20 7b 64 6f 75 62 6c      [expr {doubl
44b0: 65 28 24 78 6d 69 6e 29 7d 5d 0a 20 20 20 73 65  e($xmin)}].   se
44c0: 74 20 73 63 61 6c 69 6e 67 28 24 77 2c 79 6d 69  t scaling($w,ymi
44d0: 6e 29 20 20 20 20 5b 65 78 70 72 20 7b 64 6f 75  n)    [expr {dou
44e0: 62 6c 65 28 24 79 6d 69 6e 29 7d 5d 0a 20 20 20  ble($ymin)}].   
44f0: 73 65 74 20 73 63 61 6c 69 6e 67 28 24 77 2c 78  set scaling($w,x
4500: 6d 61 78 29 20 20 20 20 5b 65 78 70 72 20 7b 64  max)    [expr {d
4510: 6f 75 62 6c 65 28 24 78 6d 61 78 29 7d 5d 0a 20  ouble($xmax)}]. 
4520: 20 20 73 65 74 20 73 63 61 6c 69 6e 67 28 24 77    set scaling($w
4530: 2c 79 6d 61 78 29 20 20 20 20 5b 65 78 70 72 20  ,ymax)    [expr 
4540: 7b 64 6f 75 62 6c 65 28 24 79 6d 61 78 29 7d 5d  {double($ymax)}]
4550: 0a 0a 20 20 20 73 65 74 20 73 63 61 6c 69 6e 67  ..   set scaling
4560: 28 24 77 2c 6e 65 77 29 20 20 20 20 20 31 0a 7d  ($w,new)     1.}
4570: 0a 0a 23 20 70 6f 6c 61 72 43 6f 6f 72 64 69 6e  ..# polarCoordin
4580: 61 74 65 73 20 2d 2d 0a 23 20 20 20 20 53 65 74  ates --.#    Set
4590: 20 74 68 65 20 65 78 74 72 65 6d 65 73 20 66 6f   the extremes fo
45a0: 72 20 74 68 65 20 70 6f 6c 61 72 20 63 6f 6f 72  r the polar coor
45b0: 64 69 6e 61 74 65 73 0a 23 20 41 72 67 75 6d 65  dinates.# Argume
45c0: 6e 74 73 3a 0a 23 20 20 20 20 77 20 20 20 20 20  nts:.#    w     
45d0: 20 20 20 20 20 20 4e 61 6d 65 20 6f 66 20 74 68        Name of th
45e0: 65 20 63 61 6e 76 61 73 20 77 69 6e 64 6f 77 0a  e canvas window.
45f0: 23 20 20 20 20 72 61 64 6d 61 78 20 20 20 20 20  #    radmax     
4600: 20 4d 61 78 69 6d 75 6d 20 72 61 64 69 75 73 0a   Maximum radius.
4610: 23 20 52 65 73 75 6c 74 3a 0a 23 20 20 20 20 4e  # Result:.#    N
4620: 6f 6e 65 0a 23 20 53 69 64 65 20 65 66 66 65 63  one.# Side effec
4630: 74 3a 0a 23 20 20 20 20 41 72 72 61 79 20 73 63  t:.#    Array sc
4640: 61 6c 69 6e 67 20 66 69 6c 6c 65 64 0a 23 0a 70  aling filled.#.p
4650: 72 6f 63 20 3a 3a 50 6c 6f 74 63 68 61 72 74 3a  roc ::Plotchart:
4660: 3a 70 6f 6c 61 72 43 6f 6f 72 64 69 6e 61 74 65  :polarCoordinate
4670: 73 20 7b 20 77 20 72 61 64 6d 61 78 20 7d 20 7b  s { w radmax } {
4680: 0a 20 20 20 76 61 72 69 61 62 6c 65 20 73 63 61  .   variable sca
4690: 6c 69 6e 67 0a 0a 20 20 20 69 66 20 7b 20 24 72  ling..   if { $r
46a0: 61 64 6d 61 78 20 3c 3d 20 30 2e 30 20 7d 20 7b  admax <= 0.0 } {
46b0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 63  .      return -c
46c0: 6f 64 65 20 65 72 72 6f 72 20 22 4d 61 78 69 6d  ode error "Maxim
46d0: 75 6d 20 72 61 64 69 75 73 20 6d 75 73 74 20 62  um radius must b
46e0: 65 20 70 6f 73 69 74 69 76 65 22 0a 20 20 20 7d  e positive".   }
46f0: 0a 0a 20 20 20 73 65 74 20 73 63 61 6c 69 6e 67  ..   set scaling
4700: 28 24 77 2c 78 6d 69 6e 29 20 20 20 20 5b 65 78  ($w,xmin)    [ex
4710: 70 72 20 7b 2d 64 6f 75 62 6c 65 28 24 72 61 64  pr {-double($rad
4720: 6d 61 78 29 7d 5d 0a 20 20 20 73 65 74 20 73 63  max)}].   set sc
4730: 61 6c 69 6e 67 28 24 77 2c 79 6d 69 6e 29 20 20  aling($w,ymin)  
4740: 20 20 5b 65 78 70 72 20 7b 2d 64 6f 75 62 6c 65    [expr {-double
4750: 28 24 72 61 64 6d 61 78 29 7d 5d 0a 20 20 20 73  ($radmax)}].   s
4760: 65 74 20 73 63 61 6c 69 6e 67 28 24 77 2c 78 6d  et scaling($w,xm
4770: 61 78 29 20 20 20 20 5b 65 78 70 72 20 7b 64 6f  ax)    [expr {do
4780: 75 62 6c 65 28 24 72 61 64 6d 61 78 29 7d 5d 0a  uble($radmax)}].
4790: 20 20 20 73 65 74 20 73 63 61 6c 69 6e 67 28 24     set scaling($
47a0: 77 2c 79 6d 61 78 29 20 20 20 20 5b 65 78 70 72  w,ymax)    [expr
47b0: 20 7b 64 6f 75 62 6c 65 28 24 72 61 64 6d 61 78   {double($radmax
47c0: 29 7d 5d 0a 0a 20 20 20 73 65 74 20 73 63 61 6c  )}]..   set scal
47d0: 69 6e 67 28 24 77 2c 6e 65 77 29 20 20 20 20 20  ing($w,new)     
47e0: 31 0a 7d 0a 0a 23 20 77 6f 72 6c 64 33 44 43 6f  1.}..# world3DCo
47f0: 6f 72 64 69 6e 61 74 65 73 20 2d 2d 0a 23 20 20  ordinates --.#  
4800: 20 20 53 65 74 20 74 68 65 20 65 78 74 72 65 6d    Set the extrem
4810: 65 73 20 66 6f 72 20 74 68 65 20 77 6f 72 6c 64  es for the world
4820: 20 63 6f 6f 72 64 69 6e 61 74 65 73 20 69 6e 20   coordinates in 
4830: 33 44 20 70 6c 6f 74 73 0a 23 20 41 72 67 75 6d  3D plots.# Argum
4840: 65 6e 74 73 3a 0a 23 20 20 20 20 77 20 20 20 20  ents:.#    w    
4850: 20 20 20 20 20 20 20 4e 61 6d 65 20 6f 66 20 74         Name of t
4860: 68 65 20 63 61 6e 76 61 73 20 77 69 6e 64 6f 77  he canvas window
4870: 0a 23 20 20 20 20 78 6d 69 6e 20 20 20 20 20 20  .#    xmin      
4880: 20 20 4d 69 6e 69 6d 75 6d 20 58 2d 63 6f 6f 72    Minimum X-coor
4890: 64 69 6e 61 74 65 0a 23 20 20 20 20 79 6d 69 6e  dinate.#    ymin
48a0: 20 20 20 20 20 20 20 20 4d 69 6e 69 6d 75 6d 20          Minimum 
48b0: 59 2d 63 6f 6f 72 64 69 6e 61 74 65 0a 23 20 20  Y-coordinate.#  
48c0: 20 20 7a 6d 69 6e 20 20 20 20 20 20 20 20 4d 69    zmin        Mi
48d0: 6e 69 6d 75 6d 20 5a 2d 63 6f 6f 72 64 69 6e 61  nimum Z-coordina
48e0: 74 65 0a 23 20 20 20 20 78 6d 61 78 20 20 20 20  te.#    xmax    
48f0: 20 20 20 20 4d 61 78 69 6d 75 6d 20 58 2d 63 6f      Maximum X-co
4900: 6f 72 64 69 6e 61 74 65 0a 23 20 20 20 20 79 6d  ordinate.#    ym
4910: 61 78 20 20 20 20 20 20 20 20 4d 61 78 69 6d 75  ax        Maximu
4920: 6d 20 59 2d 63 6f 6f 72 64 69 6e 61 74 65 0a 23  m Y-coordinate.#
4930: 20 20 20 20 7a 6d 61 78 20 20 20 20 20 20 20 20      zmax        
4940: 4d 61 78 69 6d 75 6d 20 5a 2d 63 6f 6f 72 64 69  Maximum Z-coordi
4950: 6e 61 74 65 0a 23 20 52 65 73 75 6c 74 3a 0a 23  nate.# Result:.#
4960: 20 20 20 20 4e 6f 6e 65 0a 23 20 53 69 64 65 20      None.# Side 
4970: 65 66 66 65 63 74 3a 0a 23 20 20 20 20 41 72 72  effect:.#    Arr
4980: 61 79 20 73 63 61 6c 69 6e 67 20 66 69 6c 6c 65  ay scaling fille
4990: 64 0a 23 0a 70 72 6f 63 20 3a 3a 50 6c 6f 74 63  d.#.proc ::Plotc
49a0: 68 61 72 74 3a 3a 77 6f 72 6c 64 33 44 43 6f 6f  hart::world3DCoo
49b0: 72 64 69 6e 61 74 65 73 20 7b 20 77 20 78 6d 69  rdinates { w xmi
49c0: 6e 20 79 6d 69 6e 20 7a 6d 69 6e 20 78 6d 61 78  n ymin zmin xmax
49d0: 20 79 6d 61 78 20 7a 6d 61 78 20 7d 20 7b 0a 20   ymax zmax } {. 
49e0: 20 20 76 61 72 69 61 62 6c 65 20 73 63 61 6c 69    variable scali
49f0: 6e 67 0a 0a 20 20 20 69 66 20 7b 20 24 78 6d 69  ng..   if { $xmi
4a00: 6e 20 3d 3d 20 24 78 6d 61 78 20 7c 7c 20 24 79  n == $xmax || $y
4a10: 6d 69 6e 20 3d 3d 20 24 79 6d 61 78 20 7c 7c 20  min == $ymax || 
4a20: 24 7a 6d 69 6e 20 3d 3d 20 24 7a 6d 61 78 20 7d  $zmin == $zmax }
4a30: 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   {.      return 
4a40: 2d 63 6f 64 65 20 65 72 72 6f 72 20 22 4d 69 6e  -code error "Min
4a50: 69 6d 75 6d 20 61 6e 64 20 6d 61 78 69 6d 75 6d  imum and maximum
4a60: 20 6d 75 73 74 20 64 69 66 66 65 72 20 66 6f 72   must differ for
4a70: 20 77 6f 72 6c 64 20 63 6f 6f 72 64 69 6e 61 74   world coordinat
4a80: 65 73 22 0a 20 20 20 7d 0a 0a 20 20 20 73 65 74  es".   }..   set
4a90: 20 73 63 61 6c 69 6e 67 28 24 77 2c 78 6d 69 6e   scaling($w,xmin
4aa0: 29 20 20 20 20 5b 65 78 70 72 20 7b 64 6f 75 62  )    [expr {doub
4ab0: 6c 65 28 24 78 6d 69 6e 29 7d 5d 0a 20 20 20 73  le($xmin)}].   s
4ac0: 65 74 20 73 63 61 6c 69 6e 67 28 24 77 2c 79 6d  et scaling($w,ym
4ad0: 69 6e 29 20 20 20 20 5b 65 78 70 72 20 7b 64 6f  in)    [expr {do
4ae0: 75 62 6c 65 28 24 79 6d 69 6e 29 7d 5d 0a 20 20  uble($ymin)}].  
4af0: 20 73 65 74 20 73 63 61 6c 69 6e 67 28 24 77 2c   set scaling($w,
4b00: 7a 6d 69 6e 29 20 20 20 20 5b 65 78 70 72 20 7b  zmin)    [expr {
4b10: 64 6f 75 62 6c 65 28 24 7a 6d 69 6e 29 7d 5d 0a  double($zmin)}].
4b20: 20 20 20 73 65 74 20 73 63 61 6c 69 6e 67 28 24     set scaling($
4b30: 77 2c 78 6d 61 78 29 20 20 20 20 5b 65 78 70 72  w,xmax)    [expr
4b40: 20 7b 64 6f 75 62 6c 65 28 24 78 6d 61 78 29 7d   {double($xmax)}
4b50: 5d 0a 20 20 20 73 65 74 20 73 63 61 6c 69 6e 67  ].   set scaling
4b60: 28 24 77 2c 79 6d 61 78 29 20 20 20 20 5b 65 78  ($w,ymax)    [ex
4b70: 70 72 20 7b 64 6f 75 62 6c 65 28 24 79 6d 61 78  pr {double($ymax
4b80: 29 7d 5d 0a 20 20 20 73 65 74 20 73 63 61 6c 69  )}].   set scali
4b90: 6e 67 28 24 77 2c 7a 6d 61 78 29 20 20 20 20 5b  ng($w,zmax)    [
4ba0: 65 78 70 72 20 7b 64 6f 75 62 6c 65 28 24 7a 6d  expr {double($zm
4bb0: 61 78 29 7d 5d 0a 0a 20 20 20 73 65 74 20 73 63  ax)}]..   set sc
4bc0: 61 6c 69 6e 67 28 24 77 2c 6e 65 77 29 20 20 20  aling($w,new)   
4bd0: 20 20 31 0a 7d 0a 0a 23 20 63 6f 6f 72 64 73 54    1.}..# coordsT
4be0: 6f 50 69 78 65 6c 20 2d 2d 0a 23 20 20 20 20 43  oPixel --.#    C
4bf0: 6f 6e 76 65 72 74 20 77 6f 72 6c 64 20 63 6f 6f  onvert world coo
4c00: 72 64 69 6e 61 74 65 73 20 74 6f 20 70 69 78 65  rdinates to pixe
4c10: 6c 20 63 6f 6f 72 64 69 6e 61 74 65 73 0a 23 20  l coordinates.# 
4c20: 41 72 67 75 6d 65 6e 74 73 3a 0a 23 20 20 20 20  Arguments:.#    
4c30: 77 20 20 20 20 20 20 20 20 20 20 20 4e 61 6d 65  w           Name
4c40: 20 6f 66 20 74 68 65 20 63 61 6e 76 61 73 0a 23   of the canvas.#
4c50: 20 20 20 20 78 63 72 64 20 20 20 20 20 20 20 20      xcrd        
4c60: 58 2d 63 6f 6f 72 64 69 6e 61 74 65 0a 23 20 20  X-coordinate.#  
4c70: 20 20 79 63 72 64 20 20 20 20 20 20 20 20 59 2d    ycrd        Y-
4c80: 63 6f 6f 72 64 69 6e 61 74 65 0a 23 20 52 65 73  coordinate.# Res
4c90: 75 6c 74 3a 0a 23 20 20 20 20 4c 69 73 74 20 6f  ult:.#    List o
4ca0: 66 20 74 77 6f 20 65 6c 65 6d 65 6e 74 73 2c 20  f two elements, 
4cb0: 78 2d 20 61 6e 64 20 79 2d 63 6f 6f 72 64 69 6e  x- and y-coordin
4cc0: 61 74 65 73 20 69 6e 20 70 69 78 65 6c 73 0a 23  ates in pixels.#
4cd0: 0a 70 72 6f 63 20 3a 3a 50 6c 6f 74 63 68 61 72  .proc ::Plotchar
4ce0: 74 3a 3a 63 6f 6f 72 64 73 54 6f 50 69 78 65 6c  t::coordsToPixel
4cf0: 20 7b 20 77 20 78 63 72 64 20 79 63 72 64 20 7d   { w xcrd ycrd }
4d00: 20 7b 0a 20 20 20 76 61 72 69 61 62 6c 65 20 73   {.   variable s
4d10: 63 61 6c 69 6e 67 0a 0a 20 20 20 69 66 20 7b 20  caling..   if { 
4d20: 24 73 63 61 6c 69 6e 67 28 24 77 2c 6e 65 77 29  $scaling($w,new)
4d30: 20 3d 3d 20 31 20 7d 20 7b 0a 20 20 20 20 20 20   == 1 } {.      
4d40: 73 65 74 20 73 63 61 6c 69 6e 67 28 24 77 2c 6e  set scaling($w,n
4d50: 65 77 29 20 20 20 20 20 30 0a 20 20 20 20 20 20  ew)     0.      
4d60: 73 65 74 20 77 69 64 74 68 20 20 20 20 20 20 20  set width       
4d70: 20 20 20 20 20 20 20 20 5b 65 78 70 72 20 7b 24          [expr {$
4d80: 73 63 61 6c 69 6e 67 28 24 77 2c 70 78 6d 61 78  scaling($w,pxmax
4d90: 29 2d 24 73 63 61 6c 69 6e 67 28 24 77 2c 70 78  )-$scaling($w,px
4da0: 6d 69 6e 29 7d 5d 0a 20 20 20 20 20 20 73 65 74  min)}].      set
4db0: 20 68 65 69 67 68 74 20 20 20 20 20 20 20 20 20   height         
4dc0: 20 20 20 20 20 5b 65 78 70 72 20 7b 24 73 63 61       [expr {$sca
4dd0: 6c 69 6e 67 28 24 77 2c 70 79 6d 61 78 29 2d 24  ling($w,pymax)-$
4de0: 73 63 61 6c 69 6e 67 28 24 77 2c 70 79 6d 69 6e  scaling($w,pymin
4df0: 29 7d 5d 0a 0a 20 20 20 20 20 20 73 65 74 20 64  )}]..      set d
4e00: 78 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x               
4e10: 20 20 20 5b 65 78 70 72 20 7b 24 73 63 61 6c 69     [expr {$scali
4e20: 6e 67 28 24 77 2c 78 6d 61 78 29 2d 24 73 63 61  ng($w,xmax)-$sca
4e30: 6c 69 6e 67 28 24 77 2c 78 6d 69 6e 29 7d 5d 0a  ling($w,xmin)}].
4e40: 20 20 20 20 20 20 73 65 74 20 64 79 20 20 20 20        set dy    
4e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 65                [e
4e60: 78 70 72 20 7b 24 73 63 61 6c 69 6e 67 28 24 77  xpr {$scaling($w
4e70: 2c 79 6d 61 78 29 2d 24 73 63 61 6c 69 6e 67 28  ,ymax)-$scaling(
4e80: 24 77 2c 79 6d 69 6e 29 7d 5d 0a 20 20 20 20 20  $w,ymin)}].     
4e90: 20 73 65 74 20 73 63 61 6c 69 6e 67 28 24 77 2c   set scaling($w,
4ea0: 78 66 61 63 74 6f 72 29 20 5b 65 78 70 72 20 7b  xfactor) [expr {
4eb0: 24 77 69 64 74 68 2f 24 64 78 7d 5d 0a 20 20 20  $width/$dx}].   
4ec0: 20 20 20 73 65 74 20 73 63 61 6c 69 6e 67 28 24     set scaling($
4ed0: 77 2c 79 66 61 63 74 6f 72 29 20 5b 65 78 70 72  w,yfactor) [expr
4ee0: 20 7b 24 68 65 69 67 68 74 2f 24 64 79 7d 5d 0a   {$height/$dy}].
4ef0: 20 20 20 7d 0a 0a 20 20 20 73 65 74 20 78 70 69     }..   set xpi
4f00: 78 20 5b 65 78 70 72 20 7b 24 73 63 61 6c 69 6e  x [expr {$scalin
4f10: 67 28 24 77 2c 70 78 6d 69 6e 29 2b 28 24 78 63  g($w,pxmin)+($xc
4f20: 72 64 2d 24 73 63 61 6c 69 6e 67 28 24 77 2c 78  rd-$scaling($w,x
4f30: 6d 69 6e 29 29 2a 24 73 63 61 6c 69 6e 67 28 24  min))*$scaling($
4f40: 77 2c 78 66 61 63 74 6f 72 29 7d 5d 0a 20 20 20  w,xfactor)}].   
4f50: 73 65 74 20 79 70 69 78 20 5b 65 78 70 72 20 7b  set ypix [expr {
4f60: 24 73 63 61 6c 69 6e 67 28 24 77 2c 70 79 6d 69  $scaling($w,pymi
4f70: 6e 29 2b 28 24 73 63 61 6c 69 6e 67 28 24 77 2c  n)+($scaling($w,
4f80: 79 6d 61 78 29 2d 24 79 63 72 64 29 2a 24 73 63  ymax)-$ycrd)*$sc
4f90: 61 6c 69 6e 67 28 24 77 2c 79 66 61 63 74 6f 72  aling($w,yfactor
4fa0: 29 7d 5d 0a 20 20 20 72 65 74 75 72 6e 20 5b 6c  )}].   return [l
4fb0: 69 73 74 20 24 78 70 69 78 20 24 79 70 69 78 5d  ist $xpix $ypix]
4fc0: 0a 7d 0a 0a 23 20 63 6f 6f 72 64 73 33 44 54 6f  .}..# coords3DTo
4fd0: 50 69 78 65 6c 20 2d 2d 0a 23 20 20 20 20 43 6f  Pixel --.#    Co
4fe0: 6e 76 65 72 74 20 77 6f 72 6c 64 20 63 6f 6f 72  nvert world coor
4ff0: 64 69 6e 61 74 65 73 20 74 6f 20 70 69 78 65 6c  dinates to pixel
5000: 20 63 6f 6f 72 64 69 6e 61 74 65 73 20 28 33 44   coordinates (3D
5010: 20 70 6c 6f 74 73 29 0a 23 20 41 72 67 75 6d 65   plots).# Argume
5020: 6e 74 73 3a 0a 23 20 20 20 20 77 20 20 20 20 20  nts:.#    w     
5030: 20 20 20 20 20 20 4e 61 6d 65 20 6f 66 20 74 68        Name of th
5040: 65 20 63 61 6e 76 61 73 0a 23 20 20 20 20 78 63  e canvas.#    xc
5050: 72 64 20 20 20 20 20 20 20 20 58 2d 63 6f 6f 72  rd        X-coor
5060: 64 69 6e 61 74 65 0a 23 20 20 20 20 79 63 72 64  dinate.#    ycrd
5070: 20 20 20 20 20 20 20 20 59 2d 63 6f 6f 72 64 69          Y-coordi
5080: 6e 61 74 65 0a 23 20 20 20 20 7a 63 72 64 20 20  nate.#    zcrd  
5090: 20 20 20 20 20 20 5a 2d 63 6f 6f 72 64 69 6e 61        Z-coordina
50a0: 74 65 0a 23 20 52 65 73 75 6c 74 3a 0a 23 20 20  te.# Result:.#  
50b0: 20 20 4c 69 73 74 20 6f 66 20 74 77 6f 20 65 6c    List of two el
50c0: 65 6d 65 6e 74 73 2c 20 78 2d 20 61 6e 64 20 79  ements, x- and y
50d0: 2d 63 6f 6f 72 64 69 6e 61 74 65 73 20 69 6e 20  -coordinates in 
50e0: 70 69 78 65 6c 73 0a 23 0a 70 72 6f 63 20 3a 3a  pixels.#.proc ::
50f0: 50 6c 6f 74 63 68 61 72 74 3a 3a 63 6f 6f 72 64  Plotchart::coord
5100: 73 33 44 54 6f 50 69 78 65 6c 20 7b 20 77 20 78  s3DToPixel { w x
5110: 63 72 64 20 79 63 72 64 20 7a 63 72 64 20 7d 20  crd ycrd zcrd } 
5120: 7b 0a 20 20 20 76 61 72 69 61 62 6c 65 20 73 63  {.   variable sc
5130: 61 6c 69 6e 67 0a 0a 20 20 20 69 66 20 7b 20 24  aling..   if { $
5140: 73 63 61 6c 69 6e 67 28 24 77 2c 6e 65 77 29 20  scaling($w,new) 
5150: 3d 3d 20 31 20 7d 20 7b 0a 20 20 20 20 20 20 73  == 1 } {.      s
5160: 65 74 20 73 63 61 6c 69 6e 67 28 24 77 2c 6e 65  et scaling($w,ne
5170: 77 29 20 20 20 20 20 20 30 0a 20 20 20 20 20 20  w)      0.      
5180: 73 65 74 20 77 69 64 74 68 20 20 20 20 20 20 20  set width       
5190: 20 20 20 20 20 20 20 20 20 5b 65 78 70 72 20 7b           [expr {
51a0: 24 73 63 61 6c 69 6e 67 28 24 77 2c 70 78 6d 61  $scaling($w,pxma
51b0: 78 29 2d 24 73 63 61 6c 69 6e 67 28 24 77 2c 70  x)-$scaling($w,p
51c0: 78 6d 69 6e 29 7d 5d 0a 20 20 20 20 20 20 73 65  xmin)}].      se
51d0: 74 20 68 65 69 67 68 74 20 20 20 20 20 20 20 20  t height        
51e0: 20 20 20 20 20 20 20 5b 65 78 70 72 20 7b 24 73         [expr {$s
51f0: 63 61 6c 69 6e 67 28 24 77 2c 70 79 6d 61 78 29  caling($w,pymax)
5200: 2d 24 73 63 61 6c 69 6e 67 28 24 77 2c 70 79 6d  -$scaling($w,pym
5210: 69 6e 29 7d 5d 0a 0a 20 20 20 20 20 20 73 65 74  in)}]..      set
5220: 20 64 78 20 20 20 20 20 20 20 20 20 20 20 20 20   dx             
5230: 20 20 20 20 20 20 5b 65 78 70 72 20 7b 24 73 63        [expr {$sc
5240: 61 6c 69 6e 67 28 24 77 2c 78 6d 61 78 29 2d 24  aling($w,xmax)-$
5250: 73 63 61 6c 69 6e 67 28 24 77 2c 78 6d 69 6e 29  scaling($w,xmin)
5260: 7d 5d 0a 20 20 20 20 20 20 73 65 74 20 64 79 20  }].      set dy 
5270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5280: 20 20 5b 65 78 70 72 20 7b 24 73 63 61 6c 69 6e    [expr {$scalin
5290: 67 28 24 77 2c 79 6d 61 78 29 2d 24 73 63 61 6c  g($w,ymax)-$scal
52a0: 69 6e 67 28 24 77 2c 79 6d 69 6e 29 7d 5d 0a 20  ing($w,ymin)}]. 
52b0: 20 20 20 20 20 73 65 74 20 64 7a 20 20 20 20 20       set dz     
52c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 65                [e
52d0: 78 70 72 20 7b 24 73 63 61 6c 69 6e 67 28 24 77  xpr {$scaling($w
52e0: 2c 7a 6d 61 78 29 2d 24 73 63 61 6c 69 6e 67 28  ,zmax)-$scaling(
52f0: 24 77 2c 7a 6d 69 6e 29 7d 5d 0a 20 20 20 20 20  $w,zmin)}].     
5300: 20 73 65 74 20 73 63 61 6c 69 6e 67 28 24 77 2c   set scaling($w,
5310: 78 79 66 61 63 74 6f 72 29 20 5b 65 78 70 72 20  xyfactor) [expr 
5320: 7b 24 73 63 61 6c 69 6e 67 28 24 77 2c 79 66 72  {$scaling($w,yfr
5330: 61 63 74 29 2a 24 77 69 64 74 68 2f 24 64 78 7d  act)*$width/$dx}
5340: 5d 0a 20 20 20 20 20 20 73 65 74 20 73 63 61 6c  ].      set scal
5350: 69 6e 67 28 24 77 2c 78 7a 66 61 63 74 6f 72 29  ing($w,xzfactor)
5360: 20 5b 65 78 70 72 20 7b 24 73 63 61 6c 69 6e 67   [expr {$scaling
5370: 28 24 77 2c 7a 66 72 61 63 74 29 2a 24 68 65 69  ($w,zfract)*$hei
5380: 67 68 74 2f 24 64 78 7d 5d 0a 20 20 20 20 20 20  ght/$dx}].      
5390: 73 65 74 20 73 63 61 6c 69 6e 67 28 24 77 2c 79  set scaling($w,y
53a0: 66 61 63 74 6f 72 29 20 20 5b 65 78 70 72 20 7b  factor)  [expr {
53b0: 24 77 69 64 74 68 2f 24 64 79 7d 5d 0a 20 20 20  $width/$dy}].   
53c0: 20 20 20 73 65 74 20 73 63 61 6c 69 6e 67 28 24     set scaling($
53d0: 77 2c 7a 66 61 63 74 6f 72 29 20 20 5b 65 78 70  w,zfactor)  [exp
53e0: 72 20 7b 24 68 65 69 67 68 74 2f 24 64 7a 7d 5d  r {$height/$dz}]
53f0: 0a 20 20 20 7d 0a 0a 20 20 20 23 0a 20 20 20 23  .   }..   #.   #
5400: 20 54 68 65 20 76 61 6c 75 65 73 20 66 6f 72 20   The values for 
5410: 78 63 72 64 20 3d 20 78 6d 61 78 0a 20 20 20 23  xcrd = xmax.   #
5420: 0a 20 20 20 73 65 74 20 78 70 69 78 20 5b 65 78  .   set xpix [ex
5430: 70 72 20 7b 24 73 63 61 6c 69 6e 67 28 24 77 2c  pr {$scaling($w,
5440: 70 78 6d 69 6e 29 2b 28 24 79 63 72 64 2d 24 73  pxmin)+($ycrd-$s
5450: 63 61 6c 69 6e 67 28 24 77 2c 79 6d 69 6e 29 29  caling($w,ymin))
5460: 2a 24 73 63 61 6c 69 6e 67 28 24 77 2c 79 66 61  *$scaling($w,yfa
5470: 63 74 6f 72 29 7d 5d 0a 20 20 20 73 65 74 20 79  ctor)}].   set y
5480: 70 69 78 20 5b 65 78 70 72 20 7b 24 73 63 61 6c  pix [expr {$scal
5490: 69 6e 67 28 24 77 2c 70 79 6d 69 6e 29 2b 28 24  ing($w,pymin)+($
54a0: 73 63 61 6c 69 6e 67 28 24 77 2c 7a 6d 61 78 29  scaling($w,zmax)
54b0: 2d 24 7a 63 72 64 29 2a 24 73 63 61 6c 69 6e 67  -$zcrd)*$scaling
54c0: 28 24 77 2c 7a 66 61 63 74 6f 72 29 7d 5d 0a 0a  ($w,zfactor)}]..
54d0: 20 20 20 23 0a 20 20 20 23 20 41 64 64 20 74 68     #.   # Add th
54e0: 65 20 73 68 69 66 74 20 64 75 65 20 74 6f 20 78  e shift due to x
54f0: 63 72 64 2d 78 6d 61 78 0a 20 20 20 23 0a 20 20  crd-xmax.   #.  
5500: 20 73 65 74 20 78 70 69 78 20 5b 65 78 70 72 20   set xpix [expr 
5510: 7b 24 78 70 69 78 20 2b 20 24 73 63 61 6c 69 6e  {$xpix + $scalin
5520: 67 28 24 77 2c 78 79 66 61 63 74 6f 72 29 2a 28  g($w,xyfactor)*(
5530: 24 78 63 72 64 2d 24 73 63 61 6c 69 6e 67 28 24  $xcrd-$scaling($
5540: 77 2c 78 6d 61 78 29 29 7d 5d 0a 20 20 20 73 65  w,xmax))}].   se
5550: 74 20 79 70 69 78 20 5b 65 78 70 72 20 7b 24 79  t ypix [expr {$y
5560: 70 69 78 20 2d 20 24 73 63 61 6c 69 6e 67 28 24  pix - $scaling($
5570: 77 2c 78 7a 66 61 63 74 6f 72 29 2a 28 24 78 63  w,xzfactor)*($xc
5580: 72 64 2d 24 73 63 61 6c 69 6e 67 28 24 77 2c 78  rd-$scaling($w,x
5590: 6d 61 78 29 29 7d 5d 0a 0a 20 20 20 72 65 74 75  max))}]..   retu
55a0: 72 6e 20 5b 6c 69 73 74 20 24 78 70 69 78 20 24  rn [list $xpix $
55b0: 79 70 69 78 5d 0a 7d 0a 0a 23 20 70 69 78 65 6c  ypix].}..# pixel
55c0: 54 6f 43 6f 6f 72 64 73 20 2d 2d 0a 23 20 20 20  ToCoords --.#   
55d0: 20 43 6f 6e 76 65 72 74 20 70 69 78 65 6c 20 63   Convert pixel c
55e0: 6f 6f 72 64 69 6e 61 74 65 73 20 74 6f 20 77 6f  oordinates to wo
55f0: 72 6c 64 20 63 6f 6f 72 64 69 6e 61 74 65 73 0a  rld coordinates.
5600: 23 20 41 72 67 75 6d 65 6e 74 73 3a 0a 23 20 20  # Arguments:.#  
5610: 20 20 77 20 20 20 20 20 20 20 20 20 20 20 4e 61    w           Na
5620: 6d 65 20 6f 66 20 74 68 65 20 63 61 6e 76 61 73  me of the canvas
5630: 0a 23 20 20 20 20 78 70 69 78 20 20 20 20 20 20  .#    xpix      
5640: 20 20 58 2d 63 6f 6f 72 64 69 6e 61 74 65 20 28    X-coordinate (
5650: 70 69 78 65 6c 29 0a 23 20 20 20 20 79 70 69 78  pixel).#    ypix
5660: 20 20 20 20 20 20 20 20 59 2d 63 6f 6f 72 64 69          Y-coordi
5670: 6e 61 74 65 20 28 70 69 78 65 6c 29 0a 23 20 52  nate (pixel).# R
5680: 65 73 75 6c 74 3a 0a 23 20 20 20 20 4c 69 73 74  esult:.#    List
5690: 20 6f 66 20 74 77 6f 20 65 6c 65 6d 65 6e 74 73   of two elements
56a0: 2c 20 78 2d 20 61 6e 64 20 79 2d 63 6f 6f 72 64  , x- and y-coord
56b0: 69 6e 61 74 65 73 20 69 6e 20 77 6f 72 6c 64 20  inates in world 
56c0: 63 6f 6f 72 64 69 6e 61 74 65 20 73 79 73 74 65  coordinate syste
56d0: 6d 0a 23 0a 70 72 6f 63 20 3a 3a 50 6c 6f 74 63  m.#.proc ::Plotc
56e0: 68 61 72 74 3a 3a 70 69 78 65 6c 54 6f 43 6f 6f  hart::pixelToCoo
56f0: 72 64 73 20 7b 20 77 20 78 70 69 78 20 79 70 69  rds { w xpix ypi
5700: 78 20 7d 20 7b 0a 20 20 20 76 61 72 69 61 62 6c  x } {.   variabl
5710: 65 20 73 63 61 6c 69 6e 67 0a 0a 20 20 20 69 66  e scaling..   if
5720: 20 7b 20 24 73 63 61 6c 69 6e 67 28 24 77 2c 6e   { $scaling($w,n
5730: 65 77 29 20 3d 3d 20 31 20 7d 20 7b 0a 20 20 20  ew) == 1 } {.   
5740: 20 20 20 73 65 74 20 73 63 61 6c 69 6e 67 28 24     set scaling($
5750: 77 2c 6e 65 77 29 20 20 20 20 20 30 0a 20 20 20  w,new)     0.   
5760: 20 20 20 73 65 74 20 77 69 64 74 68 20 20 20 20     set width    
5770: 20 20 20 20 20 20 20 20 20 20 20 5b 65 78 70 72             [expr
5780: 20 7b 24 73 63 61 6c 69 6e 67 28 24 77 2c 70 78   {$scaling($w,px
5790: 6d 61 78 29 2d 24 73 63 61 6c 69 6e 67 28 24 77  max)-$scaling($w
57a0: 2c 70 78 6d 69 6e 29 7d 5d 0a 20 20 20 20 20 20  ,pxmin)}].      
57b0: 73 65 74 20 68 65 69 67 68 74 20 20 20 20 20 20  set height      
57c0: 20 20 20 20 20 20 20 20 5b 65 78 70 72 20 7b 24          [expr {$
57d0: 73 63 61 6c 69 6e 67 28 24 77 2c 70 79 6d 61 78  scaling($w,pymax
57e0: 29 2d 24 73 63 61 6c 69 6e 67 28 24 77 2c 70 79  )-$scaling($w,py
57f0: 6d 69 6e 29 7d 5d 0a 0a 20 20 20 20 20 20 73 65  min)}]..      se
5800: 74 20 64 78 20 20 20 20 20 20 20 20 20 20 20 20  t dx            
5810: 20 20 20 20 20 20 5b 65 78 70 72 20 7b 24 73 63        [expr {$sc
5820: 61 6c 69 6e 67 28 24 77 2c 78 6d 61 78 29 2d 24  aling($w,xmax)-$
5830: 73 63 61 6c 69 6e 67 28 24 77 2c 78 6d 69 6e 29  scaling($w,xmin)
5840: 7d 5d 0a 20 20 20 20 20 20 73 65 74 20 64 79 20  }].      set dy 
5850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5860: 20 5b 65 78 70 72 20 7b 24 73 63 61 6c 69 6e 67   [expr {$scaling
5870: 28 24 77 2c 79 6d 61 78 29 2d 24 73 63 61 6c 69  ($w,ymax)-$scali
5880: 6e 67 28 24 77 2c 79 6d 69 6e 29 7d 5d 0a 20 20  ng($w,ymin)}].  
5890: 20 20 20 20 73 65 74 20 73 63 61 6c 69 6e 67 28      set scaling(
58a0: 24 77 2c 78 66 61 63 74 6f 72 29 20 5b 65 78 70  $w,xfactor) [exp
58b0: 72 20 7b 24 77 69 64 74 68 2f 24 64 78 7d 5d 0a  r {$width/$dx}].
58c0: 20 20 20 20 20 20 73 65 74 20 73 63 61 6c 69 6e        set scalin
58d0: 67 28 24 77 2c 79 66 61 63 74 6f 72 29 20 5b 65  g($w,yfactor) [e
58e0: 78 70 72 20 7b 24 68 65 69 67 68 74 2f 24 64 79  xpr {$height/$dy
58f0: 7d 5d 0a 20 20 20 7d 0a 0a 20 20 20 73 65 74 20  }].   }..   set 
5900: 78 63 72 64 20 5b 65 78 70 72 20 7b 24 73 63 61  xcrd [expr {$sca
5910: 6c 69 6e 67 28 24 77 2c 78 6d 69 6e 29 2b 28 24  ling($w,xmin)+($
5920: 78 70 69 78 2d 24 73 63 61 6c 69 6e 67 28 24 77  xpix-$scaling($w
5930: 2c 70 78 6d 69 6e 29 29 2f 24 73 63 61 6c 69 6e  ,pxmin))/$scalin
5940: 67 28 24 77 2c 78 66 61 63 74 6f 72 29 7d 5d 0a  g($w,xfactor)}].
5950: 20 20 20 73 65 74 20 79 63 72 64 20 5b 65 78 70     set ycrd [exp
5960: 72 20 7b 24 73 63 61 6c 69 6e 67 28 24 77 2c 79  r {$scaling($w,y
5970: 6d 61 78 29 2d 28 24 79 70 69 78 2d 24 73 63 61  max)-($ypix-$sca
5980: 6c 69 6e 67 28 24 77 2c 70 79 6d 69 6e 29 29 2f  ling($w,pymin))/
5990: 24 73 63 61 6c 69 6e 67 28 24 77 2c 79 66 61 63  $scaling($w,yfac
59a0: 74 6f 72 29 7d 5d 0a 20 20 20 72 65 74 75 72 6e  tor)}].   return
59b0: 20 5b 6c 69 73 74 20 24 78 63 72 64 20 24 79 63   [list $xcrd $yc
59c0: 72 64 5d 0a 7d 0a 0a 23 20 70 69 78 65 6c 54 6f  rd].}..# pixelTo
59d0: 49 6e 64 65 78 20 2d 2d 0a 23 20 20 20 20 43 6f  Index --.#    Co
59e0: 6e 76 65 72 74 20 70 69 78 65 6c 20 63 6f 6f 72  nvert pixel coor
59f0: 64 69 6e 61 74 65 73 20 74 6f 20 65 6c 65 6d 65  dinates to eleme
5a00: 6e 74 73 20 6c 69 73 74 20 69 6e 64 65 78 0a 23  nts list index.#
5a10: 20 41 72 67 75 6d 65 6e 74 73 3a 0a 23 20 20 20   Arguments:.#   
5a20: 20 77 20 20 20 20 20 20 20 20 20 20 20 4e 61 6d   w           Nam
5a30: 65 20 6f 66 20 74 68 65 20 63 61 6e 76 61 73 0a  e of the canvas.
5a40: 23 20 20 20 20 78 70 69 78 20 20 20 20 20 20 20  #    xpix       
5a50: 20 58 2d 63 6f 6f 72 64 69 6e 61 74 65 20 28 70   X-coordinate (p
5a60: 69 78 65 6c 29 0a 23 20 20 20 20 79 70 69 78 20  ixel).#    ypix 
5a70: 20 20 20 20 20 20 20 59 2d 63 6f 6f 72 64 69 6e         Y-coordin
5a80: 61 74 65 20 28 70 69 78 65 6c 29 0a 23 20 52 65  ate (pixel).# Re
5a90: 73 75 6c 74 3a 0a 23 20 20 20 20 45 6c 65 6d 65  sult:.#    Eleme
5aa0: 6e 74 73 20 6c 69 73 74 20 69 6e 64 65 78 0a 23  nts list index.#
5ab0: 0a 70 72 6f 63 20 3a 3a 50 6c 6f 74 63 68 61 72  .proc ::Plotchar
5ac0: 74 3a 3a 70 69 78 65 6c 54 6f 49 6e 64 65 78 20  t::pixelToIndex 
5ad0: 7b 20 77 20 78 70 69 78 20 79 70 69 78 20 7d 20  { w xpix ypix } 
5ae0: 7b 0a 20 20 20 76 61 72 69 61 62 6c 65 20 73 63  {.   variable sc
5af0: 61 6c 69 6e 67 0a 20 20 20 76 61 72 69 61 62 6c  aling.   variabl
5b00: 65 20 74 6f 72 61 64 0a 0a 20 20 20 73 65 74 20  e torad..   set 
5b10: 69 64 78 20 2d 31 0a 20 20 20 73 65 74 20 72 61  idx -1.   set ra
5b20: 64 69 75 73 20 5b 65 78 70 72 20 7b 28 24 73 63  dius [expr {($sc
5b30: 61 6c 69 6e 67 28 24 7b 77 7d 2c 70 78 6d 61 78  aling(${w},pxmax
5b40: 29 20 2d 20 24 73 63 61 6c 69 6e 67 28 24 7b 77  ) - $scaling(${w
5b50: 7d 2c 70 78 6d 69 6e 29 29 20 2f 20 32 7d 5d 0a  },pxmin)) / 2}].
5b60: 20 20 20 73 65 74 20 78 72 65 6c 20 5b 65 78 70     set xrel [exp
5b70: 72 20 7b 24 7b 78 70 69 78 7d 20 2d 20 24 73 63  r {${xpix} - $sc
5b80: 61 6c 69 6e 67 28 24 7b 77 7d 2c 70 78 6d 69 6e  aling(${w},pxmin
5b90: 29 20 2d 20 24 7b 72 61 64 69 75 73 7d 7d 5d 0a  ) - ${radius}}].
5ba0: 20 20 20 73 65 74 20 79 72 65 6c 20 5b 65 78 70     set yrel [exp
5bb0: 72 20 7b 2d 24 7b 79 70 69 78 7d 20 2b 20 24 73  r {-${ypix} + $s
5bc0: 63 61 6c 69 6e 67 28 24 7b 77 7d 2c 70 79 6d 69  caling(${w},pymi
5bd0: 6e 29 20 2b 20 24 7b 72 61 64 69 75 73 7d 7d 5d  n) + ${radius}}]
5be0: 0a 20 20 20 69 66 20 7b 5b 65 78 70 72 20 7b 70  .   if {[expr {p
5bf0: 6f 77 28 24 7b 72 61 64 69 75 73 7d 2c 32 29 20  ow(${radius},2) 
5c00: 3c 20 28 70 6f 77 28 24 7b 78 72 65 6c 7d 2c 32  < (pow(${xrel},2
5c10: 29 20 2b 20 70 6f 77 28 24 7b 79 72 65 6c 7d 2c  ) + pow(${yrel},
5c20: 32 29 29 7d 5d 7d 20 7b 0a 20 20 20 20 20 20 20  2))}]} {.       
5c30: 23 20 64 6f 20 6e 6f 74 68 69 6e 67 20 6f 75 74  # do nothing out
5c40: 20 6f 66 20 70 69 65 20 63 68 61 72 74 0a 20 20   of pie chart.  
5c50: 20 7d 20 65 6c 73 65 69 66 20 7b 5b 69 6e 66 6f   } elseif {[info
5c60: 20 65 78 69 73 74 73 20 73 63 61 6c 69 6e 67 28   exists scaling(
5c70: 24 7b 77 7d 2c 61 6e 67 6c 65 73 29 5d 7d 20 7b  ${w},angles)]} {
5c80: 0a 20 20 20 20 20 20 20 73 65 74 20 78 79 5f 61  .       set xy_a
5c90: 6e 67 6c 65 20 5b 65 78 70 72 20 7b 28 33 36 30  ngle [expr {(360
5ca0: 20 2b 20 72 6f 75 6e 64 28 61 74 61 6e 32 28 24   + round(atan2($
5cb0: 7b 79 72 65 6c 7d 2c 24 7b 78 72 65 6c 7d 29 2f  {yrel},${xrel})/
5cc0: 24 7b 74 6f 72 61 64 7d 29 29 20 25 20 33 36 30  ${torad})) % 360
5cd0: 7d 5d 0a 20 20 20 20 20 20 20 66 6f 72 65 61 63  }].       foreac
5ce0: 68 20 61 6e 67 6c 65 20 24 73 63 61 6c 69 6e 67  h angle $scaling
5cf0: 28 24 7b 77 7d 2c 61 6e 67 6c 65 73 29 20 7b 0a  (${w},angles) {.
5d00: 20 20 20 20 20 20 20 69 66 20 7b 24 7b 78 79 5f         if {${xy_
5d10: 61 6e 67 6c 65 7d 20 3c 3d 20 24 7b 61 6e 67 6c  angle} <= ${angl
5d20: 65 7d 7d 20 7b 0a 20 20 20 20 20 20 20 20 20 20  e}} {.          
5d30: 20 62 72 65 61 6b 0a 20 20 20 20 20 20 20 7d 0a   break.       }.
5d40: 20 20 20 20 20 20 20 69 6e 63 72 20 69 64 78 0a         incr idx.
5d50: 20 20 20 20 20 20 20 7d 0a 20 20 20 7d 0a 20 20         }.   }.  
5d60: 20 72 65 74 75 72 6e 20 24 7b 69 64 78 7d 0a 7d   return ${idx}.}
5d70: 0a 0a 23 20 70 6f 6c 61 72 54 6f 50 69 78 65 6c  ..# polarToPixel
5d80: 20 2d 2d 0a 23 20 20 20 20 43 6f 6e 76 65 72 74   --.#    Convert
5d90: 20 70 6f 6c 61 72 20 63 6f 6f 72 64 69 6e 61 74   polar coordinat
5da0: 65 73 20 74 6f 20 70 69 78 65 6c 20 63 6f 6f 72  es to pixel coor
5db0: 64 69 6e 61 74 65 73 0a 23 20 41 72 67 75 6d 65  dinates.# Argume
5dc0: 6e 74 73 3a 0a 23 20 20 20 20 77 20 20 20 20 20  nts:.#    w     
5dd0: 20 20 20 20 20 20 4e 61 6d 65 20 6f 66 20 74 68        Name of th
5de0: 65 20 63 61 6e 76 61 73 0a 23 20 20 20 20 72 61  e canvas.#    ra
5df0: 64 20 20 20 20 20 20 20 20 20 52 61 64 69 75 73  d         Radius
5e00: 20 6f 66 20 74 68 65 20 70 6f 69 6e 74 0a 23 20   of the point.# 
5e10: 20 20 20 70 68 69 20 20 20 20 20 20 20 20 20 41     phi         A
5e20: 6e 67 6c 65 20 6f 66 20 74 68 65 20 70 6f 69 6e  ngle of the poin
5e30: 74 20 28 64 65 67 72 65 65 73 29 0a 23 20 52 65  t (degrees).# Re
5e40: 73 75 6c 74 3a 0a 23 20 20 20 20 4c 69 73 74 20  sult:.#    List 
5e50: 6f 66 20 74 77 6f 20 65 6c 65 6d 65 6e 74 73 2c  of two elements,
5e60: 20 78 2d 20 61 6e 64 20 79 2d 63 6f 6f 72 64 69   x- and y-coordi
5e70: 6e 61 74 65 73 20 69 6e 20 70 69 78 65 6c 73 0a  nates in pixels.
5e80: 23 0a 70 72 6f 63 20 3a 3a 50 6c 6f 74 63 68 61  #.proc ::Plotcha
5e90: 72 74 3a 3a 70 6f 6c 61 72 54 6f 50 69 78 65 6c  rt::polarToPixel
5ea0: 20 7b 20 77 20 72 61 64 20 70 68 69 20 7d 20 7b   { w rad phi } {
5eb0: 0a 20 20 20 76 61 72 69 61 62 6c 65 20 74 6f 72  .   variable tor
5ec0: 61 64 0a 0a 20 20 20 73 65 74 20 78 63 72 64 20  ad..   set xcrd 
5ed0: 5b 65 78 70 72 20 7b 24 72 61 64 2a 63 6f 73 28  [expr {$rad*cos(
5ee0: 24 70 68 69 2a 24 74 6f 72 61 64 29 7d 5d 0a 20  $phi*$torad)}]. 
5ef0: 20 20 73 65 74 20 79 63 72 64 20 5b 65 78 70 72    set ycrd [expr
5f00: 20 7b 24 72 61 64 2a 73 69 6e 28 24 70 68 69 2a   {$rad*sin($phi*
5f10: 24 74 6f 72 61 64 29 7d 5d 0a 0a 20 20 20 63 6f  $torad)}]..   co
5f20: 6f 72 64 73 54 6f 50 69 78 65 6c 20 24 77 20 24  ordsToPixel $w $
5f30: 78 63 72 64 20 24 79 63 72 64 0a 7d 0a 0a 23 20  xcrd $ycrd.}..# 
5f40: 63 72 65 61 74 65 58 59 50 6c 6f 74 20 2d 2d 0a  createXYPlot --.
5f50: 23 20 20 20 20 43 72 65 61 74 65 20 61 20 63 6f  #    Create a co
5f60: 6d 6d 61 6e 64 20 66 6f 72 20 64 72 61 77 69 6e  mmand for drawin
5f70: 67 20 61 6e 20 58 59 20 70 6c 6f 74 0a 23 20 41  g an XY plot.# A
5f80: 72 67 75 6d 65 6e 74 73 3a 0a 23 20 20 20 20 77  rguments:.#    w
5f90: 20 20 20 20 20 20 20 20 20 20 20 4e 61 6d 65 20             Name 
5fa0: 6f 66 20 74 68 65 20 63 61 6e 76 61 73 0a 23 20  of the canvas.# 
5fb0: 20 20 20 78 73 63 61 6c 65 20 20 20 20 20 20 4d     xscale      M
5fc0: 69 6e 69 6d 75 6d 2c 20 6d 61 78 69 6d 75 6d 20  inimum, maximum 
5fd0: 61 6e 64 20 73 74 65 70 20 66 6f 72 20 78 2d 61  and step for x-a
5fe0: 78 69 73 20 28 69 6e 69 74 69 61 6c 29 0a 23 20  xis (initial).# 
5ff0: 20 20 20 79 73 63 61 6c 65 20 20 20 20 20 20 4d     yscale      M
6000: 69 6e 69 6d 75 6d 2c 20 6d 61 78 69 6d 75 6d 20  inimum, maximum 
6010: 61 6e 64 20 73 74 65 70 20 66 6f 72 20 79 2d 61  and step for y-a
6020: 78 69 73 0a 23 20 52 65 73 75 6c 74 3a 0a 23 20  xis.# Result:.# 
6030: 20 20 20 4e 61 6d 65 20 6f 66 20 61 20 6e 65 77     Name of a new
6040: 20 63 6f 6d 6d 61 6e 64 0a 23 20 4e 6f 74 65 3a   command.# Note:
6050: 0a 23 20 20 20 20 54 68 65 20 65 6e 74 69 72 65  .#    The entire
6060: 20 63 61 6e 76 61 73 20 77 69 6c 6c 20 62 65 20   canvas will be 
6070: 64 65 64 69 63 61 74 65 64 20 74 6f 20 74 68 65  dedicated to the
6080: 20 58 59 20 70 6c 6f 74 2e 0a 23 20 20 20 20 54   XY plot..#    T
6090: 68 65 20 70 6c 6f 74 20 77 69 6c 6c 20 62 65 20  he plot will be 
60a0: 64 72 61 77 6e 20 77 69 74 68 20 61 78 65 73 0a  drawn with axes.
60b0: 23 0a 70 72 6f 63 20 3a 3a 50 6c 6f 74 63 68 61  #.proc ::Plotcha
60c0: 72 74 3a 3a 63 72 65 61 74 65 58 59 50 6c 6f 74  rt::createXYPlot
60d0: 20 7b 20 77 20 78 73 63 61 6c 65 20 79 73 63 61   { w xscale ysca
60e0: 6c 65 20 7d 20 7b 0a 20 20 20 76 61 72 69 61 62  le } {.   variab
60f0: 6c 65 20 64 61 74 61 5f 73 65 72 69 65 73 0a 0a  le data_series..
6100: 20 20 20 66 6f 72 65 61 63 68 20 73 20 5b 61 72     foreach s [ar
6110: 72 61 79 20 6e 61 6d 65 73 20 64 61 74 61 5f 73  ray names data_s
6120: 65 72 69 65 73 20 22 24 77 2c 2a 22 5d 20 7b 0a  eries "$w,*"] {.
6130: 20 20 20 20 20 20 75 6e 73 65 74 20 64 61 74 61        unset data
6140: 5f 73 65 72 69 65 73 28 24 73 29 0a 20 20 20 7d  _series($s).   }
6150: 0a 0a 20 20 20 73 65 74 20 6e 65 77 63 68 61 72  ..   set newchar
6160: 74 20 22 78 79 70 6c 6f 74 5f 24 77 22 0a 20 20  t "xyplot_$w".  
6170: 20 69 6e 74 65 72 70 20 61 6c 69 61 73 20 7b 7d   interp alias {}
6180: 20 24 6e 65 77 63 68 61 72 74 20 7b 7d 20 3a 3a   $newchart {} ::
6190: 50 6c 6f 74 63 68 61 72 74 3a 3a 50 6c 6f 74 48  Plotchart::PlotH
61a0: 61 6e 64 6c 65 72 20 78 79 70 6c 6f 74 20 24 77  andler xyplot $w
61b0: 0a 20 20 20 43 6f 70 79 43 6f 6e 66 69 67 20 78  .   CopyConfig x
61c0: 79 70 6c 6f 74 20 24 77 0a 0a 20 20 20 66 6f 72  yplot $w..   for
61d0: 65 61 63 68 20 7b 70 78 6d 69 6e 20 70 79 6d 69  each {pxmin pymi
61e0: 6e 20 70 78 6d 61 78 20 70 79 6d 61 78 7d 20 5b  n pxmax pymax} [
61f0: 4d 61 72 67 69 6e 73 52 65 63 74 61 6e 67 6c 65  MarginsRectangle
6200: 20 24 77 5d 20 7b 62 72 65 61 6b 7d 0a 0a 20 20   $w] {break}..  
6210: 20 66 6f 72 65 61 63 68 20 7b 78 6d 69 6e 20 78   foreach {xmin x
6220: 6d 61 78 20 78 64 65 6c 74 7d 20 24 78 73 63 61  max xdelt} $xsca
6230: 6c 65 20 7b 62 72 65 61 6b 7d 0a 20 20 20 66 6f  le {break}.   fo
6240: 72 65 61 63 68 20 7b 79 6d 69 6e 20 79 6d 61 78  reach {ymin ymax
6250: 20 79 64 65 6c 74 7d 20 24 79 73 63 61 6c 65 20   ydelt} $yscale 
6260: 7b 62 72 65 61 6b 7d 0a 0a 20 20 20 69 66 20 7b  {break}..   if {
6270: 20 24 78 64 65 6c 74 20 3d 3d 20 30 2e 30 20 7c   $xdelt == 0.0 |
6280: 7c 20 24 79 64 65 6c 74 20 3d 3d 20 30 2e 30 20  | $ydelt == 0.0 
6290: 7d 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  } {.      return
62a0: 20 2d 63 6f 64 65 20 65 72 72 6f 72 20 22 53 74   -code error "St
62b0: 65 70 20 73 69 7a 65 20 63 61 6e 20 6e 6f 74 20  ep size can not 
62c0: 62 65 20 7a 65 72 6f 22 0a 20 20 20 7d 0a 0a 20  be zero".   }.. 
62d0: 20 20 69 66 20 7b 20 28 24 78 6d 61 78 2d 24 78    if { ($xmax-$x
62e0: 6d 69 6e 29 2a 24 78 64 65 6c 74 20 3c 20 30 2e  min)*$xdelt < 0.
62f0: 30 20 7d 20 7b 0a 20 20 20 20 20 20 73 65 74 20  0 } {.      set 
6300: 78 64 65 6c 74 20 5b 65 78 70 72 20 7b 2d 24 78  xdelt [expr {-$x
6310: 64 65 6c 74 7d 5d 0a 20 20 20 7d 0a 20 20 20 69  delt}].   }.   i
6320: 66 20 7b 20 28 24 79 6d 61 78 2d 24 79 6d 69 6e  f { ($ymax-$ymin
6330: 29 2a 24 79 64 65 6c 74 20 3c 20 30 2e 30 20 7d  )*$ydelt < 0.0 }
6340: 20 7b 0a 20 20 20 20 20 20 73 65 74 20 79 64 65   {.      set yde
6350: 6c 74 20 5b 65 78 70 72 20 7b 2d 24 79 64 65 6c  lt [expr {-$ydel
6360: 74 7d 5d 0a 20 20 20 7d 0a 0a 20 20 20 76 69 65  t}].   }..   vie
6370: 77 50 6f 72 74 20 20 20 20 20 20 20 20 20 24 77  wPort         $w
6380: 20 24 70 78 6d 69 6e 20 24 70 79 6d 69 6e 20 24   $pxmin $pymin $
6390: 70 78 6d 61 78 20 24 70 79 6d 61 78 0a 20 20 20  pxmax $pymax.   
63a0: 77 6f 72 6c 64 43 6f 6f 72 64 69 6e 61 74 65 73  worldCoordinates
63b0: 20 24 77 20 24 78 6d 69 6e 20 20 24 79 6d 69 6e   $w $xmin  $ymin
63c0: 20 20 24 78 6d 61 78 20 20 24 79 6d 61 78 0a 0a    $xmax  $ymax..
63d0: 20 20 20 44 72 61 77 59 61 78 69 73 20 20 20 20     DrawYaxis    
63e0: 20 20 20 20 24 77 20 24 79 6d 69 6e 20 20 24 79      $w $ymin  $y
63f0: 6d 61 78 20 20 24 79 64 65 6c 74 0a 20 20 20 44  max  $ydelt.   D
6400: 72 61 77 58 61 78 69 73 20 20 20 20 20 20 20 20  rawXaxis        
6410: 24 77 20 24 78 6d 69 6e 20 20 24 78 6d 61 78 20  $w $xmin  $xmax 
6420: 20 24 78 64 65 6c 74 0a 20 20 20 44 72 61 77 4d   $xdelt.   DrawM
6430: 61 73 6b 20 20 20 20 20 20 20 20 20 24 77 0a 20  ask         $w. 
6440: 20 20 44 65 66 61 75 6c 74 4c 65 67 65 6e 64 20    DefaultLegend 
6450: 20 20 20 24 77 0a 20 20 20 44 65 66 61 75 6c 74     $w.   Default
6460: 42 61 6c 6c 6f 6f 6e 20 20 20 24 77 0a 0a 20 20  Balloon   $w..  
6470: 20 72 65 74 75 72 6e 20 24 6e 65 77 63 68 61 72   return $newchar
6480: 74 0a 7d 0a 0a 23 20 63 72 65 61 74 65 53 74 72  t.}..# createStr
6490: 69 70 63 68 61 72 74 20 2d 2d 0a 23 20 20 20 20  ipchart --.#    
64a0: 43 72 65 61 74 65 20 61 20 63 6f 6d 6d 61 6e 64  Create a command
64b0: 20 66 6f 72 20 64 72 61 77 69 6e 67 20 61 20 73   for drawing a s
64c0: 74 72 69 70 20 63 68 61 72 74 0a 23 20 41 72 67  trip chart.# Arg
64d0: 75 6d 65 6e 74 73 3a 0a 23 20 20 20 20 77 20 20  uments:.#    w  
64e0: 20 20 20 20 20 20 20 20 20 4e 61 6d 65 20 6f 66           Name of
64f0: 20 74 68 65 20 63 61 6e 76 61 73 0a 23 20 20 20   the canvas.#   
6500: 20 78 73 63 61 6c 65 20 20 20 20 20 20 4d 69 6e   xscale      Min
6510: 69 6d 75 6d 2c 20 6d 61 78 69 6d 75 6d 20 61 6e  imum, maximum an
6520: 64 20 73 74 65 70 20 66 6f 72 20 78 2d 61 78 69  d step for x-axi
6530: 73 20 28 69 6e 69 74 69 61 6c 29 0a 23 20 20 20  s (initial).#   
6540: 20 79 73 63 61 6c 65 20 20 20 20 20 20 4d 69 6e   yscale      Min
6550: 69 6d 75 6d 2c 20 6d 61 78 69 6d 75 6d 20 61 6e  imum, maximum an
6560: 64 20 73 74 65 70 20 66 6f 72 20 79 2d 61 78 69  d step for y-axi
6570: 73 0a 23 20 52 65 73 75 6c 74 3a 0a 23 20 20 20  s.# Result:.#   
6580: 20 4e 61 6d 65 20 6f 66 20 61 20 6e 65 77 20 63   Name of a new c
6590: 6f 6d 6d 61 6e 64 0a 23 20 4e 6f 74 65 3a 0a 23  ommand.# Note:.#
65a0: 20 20 20 20 54 68 65 20 65 6e 74 69 72 65 20 63      The entire c
65b0: 61 6e 76 61 73 20 77 69 6c 6c 20 62 65 20 64 65  anvas will be de
65c0: 64 69 63 61 74 65 64 20 74 6f 20 74 68 65 20 73  dicated to the s
65d0: 74 72 69 70 63 68 61 72 74 2e 0a 23 20 20 20 20  tripchart..#    
65e0: 54 68 65 20 73 74 72 69 70 63 68 61 72 74 20 77  The stripchart w
65f0: 69 6c 6c 20 62 65 20 64 72 61 77 6e 20 77 69 74  ill be drawn wit
6600: 68 20 61 78 65 73 0a 23 0a 70 72 6f 63 20 3a 3a  h axes.#.proc ::
6610: 50 6c 6f 74 63 68 61 72 74 3a 3a 63 72 65 61 74  Plotchart::creat
6620: 65 53 74 72 69 70 63 68 61 72 74 20 7b 20 77 20  eStripchart { w 
6630: 78 73 63 61 6c 65 20 79 73 63 61 6c 65 20 7d 20  xscale yscale } 
6640: 7b 0a 20 20 20 76 61 72 69 61 62 6c 65 20 64 61  {.   variable da
6650: 74 61 5f 73 65 72 69 65 73 0a 0a 20 20 20 73 65  ta_series..   se
6660: 74 20 6e 65 77 63 68 61 72 74 20 5b 63 72 65 61  t newchart [crea
6670: 74 65 58 59 50 6c 6f 74 20 24 77 20 24 78 73 63  teXYPlot $w $xsc
6680: 61 6c 65 20 24 79 73 63 61 6c 65 5d 0a 0a 20 20  ale $yscale]..  
6690: 20 69 6e 74 65 72 70 20 61 6c 69 61 73 20 7b 7d   interp alias {}
66a0: 20 24 6e 65 77 63 68 61 72 74 20 7b 7d 0a 0a 20   $newchart {}.. 
66b0: 20 20 73 65 74 20 6e 65 77 63 68 61 72 74 20 22    set newchart "
66c0: 73 74 72 69 70 63 68 61 72 74 5f 24 77 22 0a 20  stripchart_$w". 
66d0: 20 20 69 6e 74 65 72 70 20 61 6c 69 61 73 20 7b    interp alias {
66e0: 7d 20 24 6e 65 77 63 68 61 72 74 20 7b 7d 20 3a  } $newchart {} :
66f0: 3a 50 6c 6f 74 63 68 61 72 74 3a 3a 50 6c 6f 74  :Plotchart::Plot
6700: 48 61 6e 64 6c 65 72 20 73 74 72 69 70 63 68 61  Handler stripcha
6710: 72 74 20 24 77 0a 20 20 20 43 6f 70 79 43 6f 6e  rt $w.   CopyCon
6720: 66 69 67 20 73 74 72 69 70 63 68 61 72 74 20 24  fig stripchart $
6730: 77 0a 0a 20 20 20 72 65 74 75 72 6e 20 24 6e 65  w..   return $ne
6740: 77 63 68 61 72 74 0a 7d 0a 0a 23 20 63 72 65 61  wchart.}..# crea
6750: 74 65 49 73 6f 6d 65 74 72 69 63 50 6c 6f 74 20  teIsometricPlot 
6760: 2d 2d 0a 23 20 20 20 20 43 72 65 61 74 65 20 61  --.#    Create a
6770: 20 63 6f 6d 6d 61 6e 64 20 66 6f 72 20 64 72 61   command for dra
6780: 77 69 6e 67 20 61 6e 20 22 69 73 6f 6d 65 74 72  wing an "isometr
6790: 69 63 22 20 70 6c 6f 74 0a 23 20 41 72 67 75 6d  ic" plot.# Argum
67a0: 65 6e 74 73 3a 0a 23 20 20 20 20 77 20 20 20 20  ents:.#    w    
67b0: 20 20 20 20 20 20 20 4e 61 6d 65 20 6f 66 20 74         Name of t
67c0: 68 65 20 63 61 6e 76 61 73 0a 23 20 20 20 20 78  he canvas.#    x
67d0: 73 63 61 6c 65 20 20 20 20 20 20 4d 69 6e 69 6d  scale      Minim
67e0: 75 6d 20 61 6e 64 20 6d 61 78 69 6d 75 6d 20 66  um and maximum f
67f0: 6f 72 20 78 2d 61 78 69 73 0a 23 20 20 20 20 79  or x-axis.#    y
6800: 73 63 61 6c 65 20 20 20 20 20 20 4d 69 6e 69 6d  scale      Minim
6810: 75 6d 20 61 6e 64 20 6d 61 78 69 6d 75 6d 20 66  um and maximum f
6820: 6f 72 20 79 2d 61 78 69 73 0a 23 20 20 20 20 73  or y-axis.#    s
6830: 74 65 70 73 69 7a 65 20 20 20 20 53 74 65 70 20  tepsize    Step 
6840: 73 69 7a 65 20 66 6f 72 20 6e 75 6d 62 65 72 73  size for numbers
6850: 20 6f 6e 20 74 68 65 20 61 78 65 73 20 6f 72 20   on the axes or 
6860: 22 6e 6f 61 78 65 73 22 0a 23 20 52 65 73 75 6c  "noaxes".# Resul
6870: 74 3a 0a 23 20 20 20 20 4e 61 6d 65 20 6f 66 20  t:.#    Name of 
6880: 61 20 6e 65 77 20 63 6f 6d 6d 61 6e 64 0a 23 20  a new command.# 
6890: 4e 6f 74 65 3a 0a 23 20 20 20 20 54 68 65 20 65  Note:.#    The e
68a0: 6e 74 69 72 65 20 63 61 6e 76 61 73 20 77 69 6c  ntire canvas wil
68b0: 6c 20 62 65 20 64 65 64 69 63 61 74 65 64 20 74  l be dedicated t
68c0: 6f 20 74 68 65 20 70 6c 6f 74 0a 23 20 20 20 20  o the plot.#    
68d0: 54 68 65 20 70 6c 6f 74 20 77 69 6c 6c 20 62 65  The plot will be
68e0: 20 64 72 61 77 6e 20 77 69 74 68 20 6f 72 20 77   drawn with or w
68f0: 69 74 68 6f 75 74 20 61 78 65 73 0a 23 0a 70 72  ithout axes.#.pr
6900: 6f 63 20 3a 3a 50 6c 6f 74 63 68 61 72 74 3a 3a  oc ::Plotchart::
6910: 63 72 65 61 74 65 49 73 6f 6d 65 74 72 69 63 50  createIsometricP
6920: 6c 6f 74 20 7b 20 77 20 78 73 63 61 6c 65 20 79  lot { w xscale y
6930: 73 63 61 6c 65 20 73 74 65 70 73 69 7a 65 20 7d  scale stepsize }
6940: 20 7b 0a 20 20 20 76 61 72 69 61 62 6c 65 20 64   {.   variable d
6950: 61 74 61 5f 73 65 72 69 65 73 0a 0a 20 20 20 66  ata_series..   f
6960: 6f 72 65 61 63 68 20 73 20 5b 61 72 72 61 79 20  oreach s [array 
6970: 6e 61 6d 65 73 20 64 61 74 61 5f 73 65 72 69 65  names data_serie
6980: 73 20 22 24 77 2c 2a 22 5d 20 7b 0a 20 20 20 20  s "$w,*"] {.    
6990: 20 20 75 6e 73 65 74 20 64 61 74 61 5f 73 65 72    unset data_ser
69a0: 69 65 73 28 24 73 29 0a 20 20 20 7d 0a 0a 20 20  ies($s).   }..  
69b0: 20 73 65 74 20 6e 65 77 63 68 61 72 74 20 22 69   set newchart "i
69c0: 73 6f 6d 65 74 72 69 63 5f 24 77 22 0a 20 20 20  sometric_$w".   
69d0: 69 6e 74 65 72 70 20 61 6c 69 61 73 20 7b 7d 20  interp alias {} 
69e0: 24 6e 65 77 63 68 61 72 74 20 7b 7d 20 3a 3a 50  $newchart {} ::P
69f0: 6c 6f 74 63 68 61 72 74 3a 3a 50 6c 6f 74 48 61  lotchart::PlotHa
6a00: 6e 64 6c 65 72 20 69 73 6f 6d 65 74 72 69 63 20  ndler isometric 
6a10: 24 77 0a 20 20 20 43 6f 70 79 43 6f 6e 66 69 67  $w.   CopyConfig
6a20: 20 69 73 6f 6d 65 74 72 69 63 20 24 77 0a 0a 20   isometric $w.. 
6a30: 20 20 69 66 20 7b 20 24 73 74 65 70 73 69 7a 65    if { $stepsize
6a40: 20 21 3d 20 22 6e 6f 61 78 65 73 22 20 7d 20 7b   != "noaxes" } {
6a50: 0a 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 7b  .      foreach {
6a60: 70 78 6d 69 6e 20 70 79 6d 69 6e 20 70 78 6d 61  pxmin pymin pxma
6a70: 78 20 70 79 6d 61 78 7d 20 5b 4d 61 72 67 69 6e  x pymax} [Margin
6a80: 73 52 65 63 74 61 6e 67 6c 65 20 24 77 5d 20 7b  sRectangle $w] {
6a90: 62 72 65 61 6b 7d 0a 20 20 20 7d 20 65 6c 73 65  break}.   } else
6aa0: 20 7b 0a 20 20 20 20 20 20 73 65 74 20 70 78 6d   {.      set pxm
6ab0: 69 6e 20 30 0a 20 20 20 20 20 20 73 65 74 20 70  in 0.      set p
6ac0: 79 6d 69 6e 20 30 0a 20 20 20 20 20 20 23 73 65  ymin 0.      #se
6ad0: 74 20 70 78 6d 61 78 20 5b 24 77 20 63 67 65 74  t pxmax [$w cget
6ae0: 20 2d 77 69 64 74 68 5d 0a 20 20 20 20 20 20 23   -width].      #
6af0: 73 65 74 20 70 79 6d 61 78 20 5b 24 77 20 63 67  set pymax [$w cg
6b00: 65 74 20 2d 68 65 69 67 68 74 5d 0a 20 20 20 20  et -height].    
6b10: 20 20 73 65 74 20 70 78 6d 61 78 20 5b 57 69 64    set pxmax [Wid
6b20: 74 68 43 61 6e 76 61 73 20 24 77 5d 0a 20 20 20  thCanvas $w].   
6b30: 20 20 20 73 65 74 20 70 79 6d 61 78 20 5b 48 65     set pymax [He
6b40: 69 67 68 74 43 61 6e 76 61 73 20 24 77 5d 0a 20  ightCanvas $w]. 
6b50: 20 20 7d 0a 0a 20 20 20 66 6f 72 65 61 63 68 20    }..   foreach 
6b60: 7b 78 6d 69 6e 20 78 6d 61 78 7d 20 24 78 73 63  {xmin xmax} $xsc
6b70: 61 6c 65 20 7b 62 72 65 61 6b 7d 0a 20 20 20 66  ale {break}.   f
6b80: 6f 72 65 61 63 68 20 7b 79 6d 69 6e 20 79 6d 61  oreach {ymin yma
6b90: 78 7d 20 24 79 73 63 61 6c 65 20 7b 62 72 65 61  x} $yscale {brea
6ba0: 6b 7d 0a 0a 20 20 20 69 66 20 7b 20 24 78 6d 69  k}..   if { $xmi
6bb0: 6e 20 3d 3d 20 24 78 6d 61 78 20 7c 7c 20 24 79  n == $xmax || $y
6bc0: 6d 69 6e 20 3d 3d 20 24 79 6d 61 78 20 7d 20 7b  min == $ymax } {
6bd0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 63  .      return -c
6be0: 6f 64 65 20 65 72 72 6f 72 20 22 45 78 74 72 65  ode error "Extre
6bf0: 6d 65 73 20 66 6f 72 20 61 78 65 73 20 6d 75 73  mes for axes mus
6c00: 74 20 62 65 20 64 69 66 66 65 72 65 6e 74 22 0a  t be different".
6c10: 20 20 20 7d 0a 0a 20 20 20 76 69 65 77 50 6f 72     }..   viewPor
6c20: 74 20 20 20 20 20 20 20 20 20 24 77 20 24 70 78  t         $w $px
6c30: 6d 69 6e 20 24 70 79 6d 69 6e 20 24 70 78 6d 61  min $pymin $pxma
6c40: 78 20 24 70 79 6d 61 78 0a 20 20 20 53 63 61 6c  x $pymax.   Scal
6c50: 65 49 73 6f 6d 65 74 72 69 63 20 20 20 24 77 20  eIsometric   $w 
6c60: 24 78 6d 69 6e 20 20 24 79 6d 69 6e 20 20 24 78  $xmin  $ymin  $x
6c70: 6d 61 78 20 20 24 79 6d 61 78 0a 0a 20 20 20 69  max  $ymax..   i
6c80: 66 20 7b 20 24 73 74 65 70 73 69 7a 65 20 21 3d  f { $stepsize !=
6c90: 20 22 6e 6f 61 78 65 73 22 20 7d 20 7b 0a 20 20   "noaxes" } {.  
6ca0: 20 20 20 20 44 72 61 77 59 61 78 69 73 20 20 20      DrawYaxis   
6cb0: 20 20 20 20 20 24 77 20 24 79 6d 69 6e 20 20 24       $w $ymin  $
6cc0: 79 6d 61 78 20 20 24 79 64 65 6c 74 0a 20 20 20  ymax  $ydelt.   
6cd0: 20 20 20 44 72 61 77 58 61 78 69 73 20 20 20 20     DrawXaxis    
6ce0: 20 20 20 20 24 77 20 24 78 6d 69 6e 20 20 24 78      $w $xmin  $x
6cf0: 6d 61 78 20 20 24 78 64 65 6c 74 0a 20 20 20 20  max  $xdelt.    
6d00: 20 20 44 72 61 77 4d 61 73 6b 20 20 20 20 20 20    DrawMask      
6d10: 20 20 20 24 77 0a 20 20 20 7d 0a 20 20 20 44 65     $w.   }.   De
6d20: 66 61 75 6c 74 4c 65 67 65 6e 64 20 20 24 77 0a  faultLegend  $w.
6d30: 20 20 20 44 65 66 61 75 6c 74 42 61 6c 6c 6f 6f     DefaultBalloo
6d40: 6e 20 24 77 0a 0a 20 20 20 72 65 74 75 72 6e 20  n $w..   return 
6d50: 24 6e 65 77 63 68 61 72 74 0a 7d 0a 0a 23 20 63  $newchart.}..# c
6d60: 72 65 61 74 65 58 4c 6f 67 59 50 6c 6f 74 20 2d  reateXLogYPlot -
6d70: 2d 0a 23 20 20 20 20 43 72 65 61 74 65 20 61 20  -.#    Create a 
6d80: 63 6f 6d 6d 61 6e 64 20 66 6f 72 20 64 72 61 77  command for draw
6d90: 69 6e 67 20 61 6e 20 58 59 20 70 6c 6f 74 20 28  ing an XY plot (
6da0: 77 69 74 68 20 61 20 76 65 72 74 69 63 61 6c 20  with a vertical 
6db0: 6c 6f 67 61 72 69 74 68 6d 69 63 20 61 78 69 73  logarithmic axis
6dc0: 29 0a 23 20 41 72 67 75 6d 65 6e 74 73 3a 0a 23  ).# Arguments:.#
6dd0: 20 20 20 20 77 20 20 20 20 20 20 20 20 20 20 20      w           
6de0: 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 61 6e 76  Name of the canv
6df0: 61 73 0a 23 20 20 20 20 78 73 63 61 6c 65 20 20  as.#    xscale  
6e00: 20 20 20 20 4d 69 6e 69 6d 75 6d 2c 20 6d 61 78      Minimum, max
6e10: 69 6d 75 6d 20 61 6e 64 20 73 74 65 70 20 66 6f  imum and step fo
6e20: 72 20 78 2d 61 78 69 73 20 28 69 6e 69 74 69 61  r x-axis (initia
6e30: 6c 29 0a 23 20 20 20 20 79 73 63 61 6c 65 20 20  l).#    yscale  
6e40: 20 20 20 20 4d 69 6e 69 6d 75 6d 2c 20 6d 61 78      Minimum, max
6e50: 69 6d 75 6d 20 61 6e 64 20 73 74 65 70 20 66 6f  imum and step fo
6e60: 72 20 79 2d 61 78 69 73 20 28 73 74 65 70 20 69  r y-axis (step i
6e70: 73 20 69 67 6e 6f 72 65 64 21 29 0a 23 20 52 65  s ignored!).# Re
6e80: 73 75 6c 74 3a 0a 23 20 20 20 20 4e 61 6d 65 20  sult:.#    Name 
6e90: 6f 66 20 61 20 6e 65 77 20 63 6f 6d 6d 61 6e 64  of a new command
6ea0: 0a 23 20 4e 6f 74 65 3a 0a 23 20 20 20 20 54 68  .# Note:.#    Th
6eb0: 65 20 65 6e 74 69 72 65 20 63 61 6e 76 61 73 20  e entire canvas 
6ec0: 77 69 6c 6c 20 62 65 20 64 65 64 69 63 61 74 65  will be dedicate
6ed0: 64 20 74 6f 20 74 68 65 20 58 59 20 70 6c 6f 74  d to the XY plot
6ee0: 2e 0a 23 20 20 20 20 54 68 65 20 70 6c 6f 74 20  ..#    The plot 
6ef0: 77 69 6c 6c 20 62 65 20 64 72 61 77 6e 20 77 69  will be drawn wi
6f00: 74 68 20 61 78 65 73 0a 23 0a 70 72 6f 63 20 3a  th axes.#.proc :
6f10: 3a 50 6c 6f 74 63 68 61 72 74 3a 3a 63 72 65 61  :Plotchart::crea
6f20: 74 65 58 4c 6f 67 59 50 6c 6f 74 20 7b 20 77 20  teXLogYPlot { w 
6f30: 78 73 63 61 6c 65 20 79 73 63 61 6c 65 20 7d 20  xscale yscale } 
6f40: 7b 0a 20 20 20 76 61 72 69 61 62 6c 65 20 64 61  {.   variable da
6f50: 74 61 5f 73 65 72 69 65 73 0a 0a 20 20 20 66 6f  ta_series..   fo
6f60: 72 65 61 63 68 20 73 20 5b 61 72 72 61 79 20 6e  reach s [array n
6f70: 61 6d 65 73 20 64 61 74 61 5f 73 65 72 69 65 73  ames data_series
6f80: 20 22 24 77 2c 2a 22 5d 20 7b 0a 20 20 20 20 20   "$w,*"] {.     
6f90: 20 75 6e 73 65 74 20 64 61 74 61 5f 73 65 72 69   unset data_seri
6fa0: 65 73 28 24 73 29 0a 20 20 20 7d 0a 0a 20 20 20  es($s).   }..   
6fb0: 73 65 74 20 6e 65 77 63 68 61 72 74 20 22 78 6c  set newchart "xl
6fc0: 6f 67 79 70 6c 6f 74 5f 24 77 22 0a 20 20 20 69  ogyplot_$w".   i
6fd0: 6e 74 65 72 70 20 61 6c 69 61 73 20 7b 7d 20 24  nterp alias {} $
6fe0: 6e 65 77 63 68 61 72 74 20 7b 7d 20 3a 3a 50 6c  newchart {} ::Pl
6ff0: 6f 74 63 68 61 72 74 3a 3a 50 6c 6f 74 48 61 6e  otchart::PlotHan
7000: 64 6c 65 72 20 78 6c 6f 67 79 70 6c 6f 74 20 24  dler xlogyplot $
7010: 77 0a 20 20 20 43 6f 70 79 43 6f 6e 66 69 67 20  w.   CopyConfig 
7020: 78 6c 6f 67 79 70 6c 6f 74 20 24 77 0a 0a 20 20  xlogyplot $w..  
7030: 20 66 6f 72 65 61 63 68 20 7b 70 78 6d 69 6e 20   foreach {pxmin 
7040: 70 79 6d 69 6e 20 70 78 6d 61 78 20 70 79 6d 61  pymin pxmax pyma
7050: 78 7d 20 5b 4d 61 72 67 69 6e 73 52 65 63 74 61  x} [MarginsRecta
7060: 6e 67 6c 65 20 24 77 5d 20 7b 62 72 65 61 6b 7d  ngle $w] {break}
7070: 0a 0a 20 20 20 66 6f 72 65 61 63 68 20 7b 78 6d  ..   foreach {xm
7080: 69 6e 20 78 6d 61 78 20 78 64 65 6c 74 7d 20 24  in xmax xdelt} $
7090: 78 73 63 61 6c 65 20 7b 62 72 65 61 6b 7d 0a 20  xscale {break}. 
70a0: 20 20 66 6f 72 65 61 63 68 20 7b 79 6d 69 6e 20    foreach {ymin 
70b0: 79 6d 61 78 20 79 64 65 6c 74 7d 20 24 79 73 63  ymax ydelt} $ysc
70c0: 61 6c 65 20 7b 62 72 65 61 6b 7d 0a 0a 20 20 20  ale {break}..   
70d0: 69 66 20 7b 20 24 78 64 65 6c 74 20 3d 3d 20 30  if { $xdelt == 0
70e0: 2e 30 20 7c 7c 20 24 79 64 65 6c 74 20 3d 3d 20  .0 || $ydelt == 
70f0: 30 2e 30 20 7d 20 7b 0a 20 20 20 20 20 20 72 65  0.0 } {.      re
7100: 74 75 72 6e 20 2d 63 6f 64 65 20 65 72 72 6f 72  turn -code error
7110: 20 22 53 74 65 70 20 73 69 7a 65 20 63 61 6e 20   "Step size can 
7120: 6e 6f 74 20 62 65 20 7a 65 72 6f 22 0a 20 20 20  not be zero".   
7130: 7d 0a 0a 20 20 20 69 66 20 7b 20 24 79 6d 69 6e  }..   if { $ymin
7140: 20 3c 3d 20 30 2e 30 20 7c 7c 20 24 79 6d 61 78   <= 0.0 || $ymax
7150: 20 3c 3d 20 30 2e 30 20 7d 20 7b 0a 20 20 20 20   <= 0.0 } {.    
7160: 20 20 72 65 74 75 72 6e 20 2d 63 6f 64 65 20 65    return -code e
7170: 72 72 6f 72 20 22 4d 69 6e 69 6d 75 6d 20 61 6e  rror "Minimum an
7180: 64 20 6d 61 78 69 6d 75 6d 20 66 6f 72 20 79 2d  d maximum for y-
7190: 61 78 69 73 20 6d 75 73 74 20 62 65 20 70 6f 73  axis must be pos
71a0: 69 74 69 76 65 22 0a 20 20 20 7d 0a 0a 20 20 20  itive".   }..   
71b0: 23 0a 20 20 20 23 20 54 4f 44 4f 3a 20 72 65 76  #.   # TODO: rev
71c0: 65 72 73 65 64 20 6c 6f 67 20 70 6c 6f 74 0a 20  ersed log plot. 
71d0: 20 20 23 0a 0a 20 20 20 76 69 65 77 50 6f 72 74    #..   viewPort
71e0: 20 20 20 20 20 20 20 20 20 24 77 20 24 70 78 6d           $w $pxm
71f0: 69 6e 20 24 70 79 6d 69 6e 20 24 70 78 6d 61 78  in $pymin $pxmax
7200: 20 24 70 79 6d 61 78 0a 20 20 20 77 6f 72 6c 64   $pymax.   world
7210: 43 6f 6f 72 64 69 6e 61 74 65 73 20 24 77 20 24  Coordinates $w $
7220: 78 6d 69 6e 20 20 5b 65 78 70 72 20 7b 6c 6f 67  xmin  [expr {log
7230: 31 30 28 24 79 6d 69 6e 29 7d 5d 20 20 24 78 6d  10($ymin)}]  $xm
7240: 61 78 20 5b 65 78 70 72 20 7b 6c 6f 67 31 30 28  ax [expr {log10(
7250: 24 79 6d 61 78 29 7d 5d 0a 0a 20 20 20 44 72 61  $ymax)}]..   Dra
7260: 77 4c 6f 67 59 61 78 69 73 20 20 20 20 20 24 77  wLogYaxis     $w
7270: 20 24 79 6d 69 6e 20 20 24 79 6d 61 78 20 20 24   $ymin  $ymax  $
7280: 79 64 65 6c 74 0a 20 20 20 44 72 61 77 58 61 78  ydelt.   DrawXax
7290: 69 73 20 20 20 20 20 20 20 20 24 77 20 24 78 6d  is        $w $xm
72a0: 69 6e 20 20 24 78 6d 61 78 20 20 24 78 64 65 6c  in  $xmax  $xdel
72b0: 74 0a 20 20 20 44 72 61 77 4d 61 73 6b 20 20 20  t.   DrawMask   
72c0: 20 20 20 20 20 20 24 77 0a 20 20 20 44 65 66 61        $w.   Defa
72d0: 75 6c 74 4c 65 67 65 6e 64 20 20 20 20 24 77 0a  ultLegend    $w.
72e0: 20 20 20 44 65 66 61 75 6c 74 42 61 6c 6c 6f 6f     DefaultBalloo
72f0: 6e 20 20 20 24 77 0a 0a 20 20 20 72 65 74 75 72  n   $w..   retur
7300: 6e 20 24 6e 65 77 63 68 61 72 74 0a 7d 0a 0a 23  n $newchart.}..#
7310: 20 63 72 65 61 74 65 48 69 73 74 6f 67 72 61 6d   createHistogram
7320: 20 2d 2d 0a 23 20 20 20 20 43 72 65 61 74 65 20   --.#    Create 
7330: 61 20 63 6f 6d 6d 61 6e 64 20 66 6f 72 20 64 72  a command for dr
7340: 61 77 69 6e 67 20 61 20 68 69 73 74 6f 67 72 61  awing a histogra
7350: 6d 0a 23 20 41 72 67 75 6d 65 6e 74 73 3a 0a 23  m.# Arguments:.#
7360: 20 20 20 20 77 20 20 20 20 20 20 20 20 20 20 20      w           
7370: 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 61 6e 76  Name of the canv
7380: 61 73 0a 23 20 20 20 20 78 73 63 61 6c 65 20 20  as.#    xscale  
7390: 20 20 20 20 4d 69 6e 69 6d 75 6d 2c 20 6d 61 78      Minimum, max
73a0: 69 6d 75 6d 20 61 6e 64 20 73 74 65 70 20 66 6f  imum and step fo
73b0: 72 20 78 2d 61 78 69 73 20 28 69 6e 69 74 69 61  r x-axis (initia
73c0: 6c 29 0a 23 20 20 20 20 79 73 63 61 6c 65 20 20  l).#    yscale  
73d0: 20 20 20 20 4d 69 6e 69 6d 75 6d 2c 20 6d 61 78      Minimum, max
73e0: 69 6d 75 6d 20 61 6e 64 20 73 74 65 70 20 66 6f  imum and step fo
73f0: 72 20 79 2d 61 78 69 73 0a 23 20 52 65 73 75 6c  r y-axis.# Resul
7400: 74 3a 0a 23 20 20 20 20 4e 61 6d 65 20 6f 66 20  t:.#    Name of 
7410: 61 20 6e 65 77 20 63 6f 6d 6d 61 6e 64 0a 23 20  a new command.# 
7420: 4e 6f 74 65 3a 0a 23 20 20 20 20 54 68 65 20 65  Note:.#    The e
7430: 6e 74 69 72 65 20 63 61 6e 76 61 73 20 77 69 6c  ntire canvas wil
7440: 6c 20 62 65 20 64 65 64 69 63 61 74 65 64 20 74  l be dedicated t
7450: 6f 20 74 68 65 20 68 69 73 74 6f 67 72 61 6d 2e  o the histogram.
7460: 0a 23 20 20 20 20 54 68 65 20 70 6c 6f 74 20 77  .#    The plot w
7470: 69 6c 6c 20 62 65 20 64 72 61 77 6e 20 77 69 74  ill be drawn wit
7480: 68 20 61 78 65 73 0a 23 20 20 20 20 54 68 69 73  h axes.#    This
7490: 20 69 73 20 61 6c 6d 6f 73 74 20 74 68 65 20 73   is almost the s
74a0: 61 6d 65 20 63 6f 64 65 20 61 73 20 66 6f 72 20  ame code as for 
74b0: 61 6e 20 58 59 20 70 6c 6f 74 0a 23 0a 70 72 6f  an XY plot.#.pro
74c0: 63 20 3a 3a 50 6c 6f 74 63 68 61 72 74 3a 3a 63  c ::Plotchart::c
74d0: 72 65 61 74 65 48 69 73 74 6f 67 72 61 6d 20 7b  reateHistogram {
74e0: 20 77 20 78 73 63 61 6c 65 20 79 73 63 61 6c 65   w xscale yscale
74f0: 20 7d 20 7b 0a 20 20 20 76 61 72 69 61 62 6c 65   } {.   variable
7500: 20 64 61 74 61 5f 73 65 72 69 65 73 0a 0a 20 20   data_series..  
7510: 20 66 6f 72 65 61 63 68 20 73 20 5b 61 72 72 61   foreach s [arra
7520: 79 20 6e 61 6d 65 73 20 64 61 74 61 5f 73 65 72  y names data_ser
7530: 69 65 73 20 22 24 77 2c 2a 22 5d 20 7b 0a 20 20  ies "$w,*"] {.  
7540: 20 20 20 20 75 6e 73 65 74 20 64 61 74 61 5f 73      unset data_s
7550: 65 72 69 65 73 28 24 73 29 0a 20 20 20 7d 0a 0a  eries($s).   }..
7560: 20 20 20 73 65 74 20 6e 65 77 63 68 61 72 74 20     set newchart 
7570: 22 68 69 73 74 6f 67 72 61 6d 5f 24 77 22 0a 20  "histogram_$w". 
7580: 20 20 69 6e 74 65 72 70 20 61 6c 69 61 73 20 7b    interp alias {
7590: 7d 20 24 6e 65 77 63 68 61 72 74 20 7b 7d 20 3a  } $newchart {} :
75a0: 3a 50 6c 6f 74 63 68 61 72 74 3a 3a 50 6c 6f 74  :Plotchart::Plot
75b0: 48 61 6e 64 6c 65 72 20 68 69 73 74 6f 67 72 61  Handler histogra
75c0: 6d 20 24 77 0a 20 20 20 43 6f 70 79 43 6f 6e 66  m $w.   CopyConf
75d0: 69 67 20 68 69 73 74 6f 67 72 61 6d 20 24 77 0a  ig histogram $w.
75e0: 0a 20 20 20 66 6f 72 65 61 63 68 20 7b 70 78 6d  .   foreach {pxm
75f0: 69 6e 20 70 79 6d 69 6e 20 70 78 6d 61 78 20 70  in pymin pxmax p
7600: 79 6d 61 78 7d 20 5b 4d 61 72 67 69 6e 73 52 65  ymax} [MarginsRe
7610: 63 74 61 6e 67 6c 65 20 24 77 5d 20 7b 62 72 65  ctangle $w] {bre
7620: 61 6b 7d 0a 0a 20 20 20 66 6f 72 65 61 63 68 20  ak}..   foreach 
7630: 7b 78 6d 69 6e 20 78 6d 61 78 20 78 64 65 6c 74  {xmin xmax xdelt
7640: 7d 20 24 78 73 63 61 6c 65 20 7b 62 72 65 61 6b  } $xscale {break
7650: 7d 0a 20 20 20 66 6f 72 65 61 63 68 20 7b 79 6d  }.   foreach {ym
7660: 69 6e 20 79 6d 61 78 20 79 64 65 6c 74 7d 20 24  in ymax ydelt} $
7670: 79 73 63 61 6c 65 20 7b 62 72 65 61 6b 7d 0a 0a  yscale {break}..
7680: 20 20 20 69 66 20 7b 20 24 78 64 65 6c 74 20 3d     if { $xdelt =
7690: 3d 20 30 2e 30 20 7c 7c 20 24 79 64 65 6c 74 20  = 0.0 || $ydelt 
76a0: 3d 3d 20 30 2e 30 20 7d 20 7b 0a 20 20 20 20 20  == 0.0 } {.     
76b0: 20 72 65 74 75 72 6e 20 2d 63 6f 64 65 20 65 72   return -code er
76c0: 72 6f 72 20 22 53 74 65 70 20 73 69 7a 65 20 63  ror "Step size c
76d0: 61 6e 20 6e 6f 74 20 62 65 20 7a 65 72 6f 22 0a  an not be zero".
76e0: 20 20 20 7d 0a 0a 20 20 20 69 66 20 7b 20 28 24     }..   if { ($
76f0: 78 6d 61 78 2d 24 78 6d 69 6e 29 2a 24 78 64 65  xmax-$xmin)*$xde
7700: 6c 74 20 3c 20 30 2e 30 20 7d 20 7b 0a 20 20 20  lt < 0.0 } {.   
7710: 20 20 20 73 65 74 20 78 64 65 6c 74 20 5b 65 78     set xdelt [ex
7720: 70 72 20 7b 2d 24 78 64 65 6c 74 7d 5d 0a 20 20  pr {-$xdelt}].  
7730: 20 7d 0a 20 20 20 69 66 20 7b 20 28 24 79 6d 61   }.   if { ($yma
7740: 78 2d 24 79 6d 69 6e 29 2a 24 79 64 65 6c 74 20  x-$ymin)*$ydelt 
7750: 3c 20 30 2e 30 20 7d 20 7b 0a 20 20 20 20 20 20  < 0.0 } {.      
7760: 73 65 74 20 79 64 65 6c 74 20 5b 65 78 70 72 20  set ydelt [expr 
7770: 7b 2d 24 79 64 65 6c 74 7d 5d 0a 20 20 20 7d 0a  {-$ydelt}].   }.
7780: 0a 20 20 20 76 69 65 77 50 6f 72 74 20 20 20 20  .   viewPort    
7790: 20 20 20 20 20 24 77 20 24 70 78 6d 69 6e 20 24       $w $pxmin $
77a0: 70 79 6d 69 6e 20 24 70 78 6d 61 78 20 24 70 79  pymin $pxmax $py
77b0: 6d 61 78 0a 20 20 20 77 6f 72 6c 64 43 6f 6f 72  max.   worldCoor
77c0: 64 69 6e 61 74 65 73 20 24 77 20 24 78 6d 69 6e  dinates $w $xmin
77d0: 20 20 24 79 6d 69 6e 20 20 24 78 6d 61 78 20 20    $ymin  $xmax  
77e0: 24 79 6d 61 78 0a 0a 20 20 20 44 72 61 77 59 61  $ymax..   DrawYa
77f0: 78 69 73 20 20 20 20 20 20 20 20 24 77 20 24 79  xis        $w $y
7800: 6d 69 6e 20 20 24 79 6d 61 78 20 20 24 79 64 65  min  $ymax  $yde
7810: 6c 74 0a 20 20 20 44 72 61 77 58 61 78 69 73 20  lt.   DrawXaxis 
7820: 20 20 20 20 20 20 20 24 77 20 24 78 6d 69 6e 20         $w $xmin 
7830: 20 24 78 6d 61 78 20 20 24 78 64 65 6c 74 0a 20   $xmax  $xdelt. 
7840: 20 20 44 72 61 77 4d 61 73 6b 20 20 20 20 20 20    DrawMask      
7850: 20 20 20 24 77 0a 20 20 20 44 65 66 61 75 6c 74     $w.   Default
7860: 4c 65 67 65 6e 64 20 20 20 20 24 77 0a 20 20 20  Legend    $w.   
7870: 44 65 66 61 75 6c 74 42 61 6c 6c 6f 6f 6e 20 20  DefaultBalloon  
7880: 20 24 77 0a 0a 20 20 20 72 65 74 75 72 6e 20 24   $w..   return $
7890: 6e 65 77 63 68 61 72 74 0a 7d 0a 0a 23 20 63 72  newchart.}..# cr
78a0: 65 61 74 65 50 69 65 63 68 61 72 74 20 2d 2d 0a  eatePiechart --.
78b0: 23 20 20 20 20 43 72 65 61 74 65 20 61 20 63 6f  #    Create a co
78c0: 6d 6d 61 6e 64 20 66 6f 72 20 64 72 61 77 69 6e  mmand for drawin
78d0: 67 20 61 20 70 69 65 20 63 68 61 72 74 0a 23 20  g a pie chart.# 
78e0: 41 72 67 75 6d 65 6e 74 73 3a 0a 23 20 20 20 20  Arguments:.#    
78f0: 77 20 20 20 20 20 20 20 20 20 20 20 4e 61 6d 65  w           Name
7900: 20 6f 66 20 74 68 65 20 63 61 6e 76 61 73 0a 23   of the canvas.#
7910: 20 52 65 73 75 6c 74 3a 0a 23 20 20 20 20 4e 61   Result:.#    Na
7920: 6d 65 20 6f 66 20 61 20 6e 65 77 20 63 6f 6d 6d  me of a new comm
7930: 61 6e 64 0a 23 20 4e 6f 74 65 3a 0a 23 20 20 20  and.# Note:.#   
7940: 20 54 68 65 20 65 6e 74 69 72 65 20 63 61 6e 76   The entire canv
7950: 61 73 20 77 69 6c 6c 20 62 65 20 64 65 64 69 63  as will be dedic
7960: 61 74 65 64 20 74 6f 20 74 68 65 20 70 69 65 20  ated to the pie 
7970: 63 68 61 72 74 2e 0a 23 0a 70 72 6f 63 20 3a 3a  chart..#.proc ::
7980: 50 6c 6f 74 63 68 61 72 74 3a 3a 63 72 65 61 74  Plotchart::creat
7990: 65 50 69 65 63 68 61 72 74 20 7b 20 77 20 7d 20  ePiechart { w } 
79a0: 7b 0a 20 20 20 76 61 72 69 61 62 6c 65 20 64 61  {.   variable da
79b0: 74 61 5f 73 65 72 69 65 73 0a 0a 20 20 20 66 6f  ta_series..   fo
79c0: 72 65 61 63 68 20 73 20 5b 61 72 72 61 79 20 6e  reach s [array n
79d0: 61 6d 65 73 20 64 61 74 61 5f 73 65 72 69 65 73  ames data_series
79e0: 20 22 24 77 2c 2a 22 5d 20 7b 0a 20 20 20 20 20   "$w,*"] {.     
79f0: 20 75 6e 73 65 74 20 64 61 74 61 5f 73 65 72 69   unset data_seri
7a00: 65 73 28 24 73 29 0a 20 20 20 7d 0a 0a 20 20 20  es($s).   }..   
7a10: 73 65 74 20 6e 65 77 63 68 61 72 74 20 22 70 69  set newchart "pi
7a20: 65 63 68 61 72 74 5f 24 77 22 0a 20 20 20 69 6e  echart_$w".   in
7a30: 74 65 72 70 20 61 6c 69 61 73 20 7b 7d 20 24 6e  terp alias {} $n
7a40: 65 77 63 68 61 72 74 20 7b 7d 20 3a 3a 50 6c 6f  ewchart {} ::Plo
7a50: 74 63 68 61 72 74 3a 3a 50 6c 6f 74 48 61 6e 64  tchart::PlotHand
7a60: 6c 65 72 20 70 69 65 63 68 61 72 74 20 24 77 0a  ler piechart $w.
7a70: 20 20 20 43 6f 70 79 43 6f 6e 66 69 67 20 70 69     CopyConfig pi
7a80: 65 63 68 61 72 74 20 24 77 0a 0a 20 20 20 66 6f  echart $w..   fo
7a90: 72 65 61 63 68 20 7b 70 78 6d 69 6e 20 70 79 6d  reach {pxmin pym
7aa0: 69 6e 20 70 78 6d 61 78 20 70 79 6d 61 78 7d 20  in pxmax pymax} 
7ab0: 5b 4d 61 72 67 69 6e 73 43 69 72 63 6c 65 20 24  [MarginsCircle $
7ac0: 77 5d 20 7b 62 72 65 61 6b 7d 0a 0a 20 20 20 76  w] {break}..   v
7ad0: 69 65 77 50 6f 72 74 20 24 77 20 24 70 78 6d 69  iewPort $w $pxmi
7ae0: 6e 20 24 70 79 6d 69 6e 20 24 70 78 6d 61 78 20  n $pymin $pxmax 
7af0: 24 70 79 6d 61 78 0a 20 20 20 24 77 20 63 72 65  $pymax.   $w cre
7b00: 61 74 65 20 6f 76 61 6c 20 24 70 78 6d 69 6e 20  ate oval $pxmin 
7b10: 24 70 79 6d 69 6e 20 24 70 78 6d 61 78 20 24 70  $pymin $pxmax $p
7b20: 79 6d 61 78 0a 0a 20 20 20 53 65 74 43 6f 6c 6f  ymax..   SetColo
7b30: 75 72 73 20 24 77 20 62 6c 75 65 20 6c 69 67 68  urs $w blue ligh
7b40: 74 62 6c 75 65 20 67 72 65 65 6e 20 79 65 6c 6c  tblue green yell
7b50: 6f 77 20 6f 72 61 6e 67 65 20 72 65 64 20 6d 61  ow orange red ma
7b60: 67 65 6e 74 61 20 62 72 6f 77 6e 0a 20 20 20 44  genta brown.   D
7b70: 65 66 61 75 6c 74 4c 65 67 65 6e 64 20 20 24 77  efaultLegend  $w
7b80: 0a 20 20 20 44 65 66 61 75 6c 74 42 61 6c 6c 6f  .   DefaultBallo
7b90: 6f 6e 20 24 77 0a 0a 20 20 20 72 65 74 75 72 6e  on $w..   return
7ba0: 20 24 6e 65 77 63 68 61 72 74 0a 7d 0a 0a 23 20   $newchart.}..# 
7bb0: 63 72 65 61 74 65 50 6f 6c 61 72 70 6c 6f 74 20  createPolarplot 
7bc0: 2d 2d 0a 23 20 20 20 20 43 72 65 61 74 65 20 61  --.#    Create a
7bd0: 20 63 6f 6d 6d 61 6e 64 20 66 6f 72 20 64 72 61   command for dra
7be0: 77 69 6e 67 20 61 20 70 6f 6c 61 72 20 70 6c 6f  wing a polar plo
7bf0: 74 0a 23 20 41 72 67 75 6d 65 6e 74 73 3a 0a 23  t.# Arguments:.#
7c00: 20 20 20 20 77 20 20 20 20 20 20 20 20 20 20 20      w           
7c10: 20 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 61    Name of the ca
7c20: 6e 76 61 73 0a 23 20 20 20 20 72 61 64 69 75 73  nvas.#    radius
7c30: 5f 64 61 74 61 20 20 20 4d 61 78 69 6d 75 6d 20  _data   Maximum 
7c40: 72 61 64 69 75 73 20 61 6e 64 20 73 74 65 70 0a  radius and step.
7c50: 23 20 52 65 73 75 6c 74 3a 0a 23 20 20 20 20 4e  # Result:.#    N
7c60: 61 6d 65 20 6f 66 20 61 20 6e 65 77 20 63 6f 6d  ame of a new com
7c70: 6d 61 6e 64 0a 23 20 4e 6f 74 65 3a 0a 23 20 20  mand.# Note:.#  
7c80: 20 20 54 68 65 20 65 6e 74 69 72 65 20 63 61 6e    The entire can
7c90: 76 61 73 20 77 69 6c 6c 20 62 65 20 64 65 64 69  vas will be dedi
7ca0: 63 61 74 65 64 20 74 6f 20 74 68 65 20 70 6f 6c  cated to the pol
7cb0: 61 72 20 70 6c 6f 74 0a 23 20 20 20 20 50 6f 73  ar plot.#    Pos
7cc0: 73 69 62 6c 65 20 61 64 64 69 74 69 6f 6e 61 6c  sible additional
7cd0: 20 61 72 67 75 6d 65 6e 74 73 20 28 6f 70 74 69   arguments (opti
7ce0: 6f 6e 61 6c 29 3a 20 6e 61 75 74 69 63 61 6c 2f  onal): nautical/
7cf0: 6d 61 74 68 65 6d 61 74 69 63 61 6c 0a 23 20 20  mathematical.#  
7d00: 20 20 73 74 65 70 20 69 6e 20 70 68 69 0a 23 0a    step in phi.#.
7d10: 70 72 6f 63 20 3a 3a 50 6c 6f 74 63 68 61 72 74  proc ::Plotchart
7d20: 3a 3a 63 72 65 61 74 65 50 6f 6c 61 72 70 6c 6f  ::createPolarplo
7d30: 74 20 7b 20 77 20 72 61 64 69 75 73 5f 64 61 74  t { w radius_dat
7d40: 61 20 7d 20 7b 0a 20 20 20 76 61 72 69 61 62 6c  a } {.   variabl
7d50: 65 20 64 61 74 61 5f 73 65 72 69 65 73 0a 0a 20  e data_series.. 
7d60: 20 20 66 6f 72 65 61 63 68 20 73 20 5b 61 72 72    foreach s [arr
7d70: 61 79 20 6e 61 6d 65 73 20 64 61 74 61 5f 73 65  ay names data_se
7d80: 72 69 65 73 20 22 24 77 2c 2a 22 5d 20 7b 0a 20  ries "$w,*"] {. 
7d90: 20 20 20 20 20 75 6e 73 65 74 20 64 61 74 61 5f       unset data_
7da0: 73 65 72 69 65 73 28 24 73 29 0a 20 20 20 7d 0a  series($s).   }.
7db0: 0a 20 20 20 73 65 74 20 6e 65 77 63 68 61 72 74  .   set newchart
7dc0: 20 22 70 6f 6c 61 72 70 6c 6f 74 5f 24 77 22 0a   "polarplot_$w".
7dd0: 20 20 20 69 6e 74 65 72 70 20 61 6c 69 61 73 20     interp alias 
7de0: 7b 7d 20 24 6e 65 77 63 68 61 72 74 20 7b 7d 20  {} $newchart {} 
7df0: 3a 3a 50 6c 6f 74 63 68 61 72 74 3a 3a 50 6c 6f  ::Plotchart::Plo
7e00: 74 48 61 6e 64 6c 65 72 20 70 6f 6c 61 72 70 6c  tHandler polarpl
7e10: 6f 74 20 24 77 0a 20 20 20 43 6f 70 79 43 6f 6e  ot $w.   CopyCon
7e20: 66 69 67 20 70 6f 6c 61 72 70 6c 6f 74 20 24 77  fig polarplot $w
7e30: 0a 0a 20 20 20 73 65 74 20 72 61 64 5f 6d 61 78  ..   set rad_max
7e40: 20 20 20 5b 6c 69 6e 64 65 78 20 24 72 61 64 69     [lindex $radi
7e50: 75 73 5f 64 61 74 61 20 30 5d 0a 20 20 20 73 65  us_data 0].   se
7e60: 74 20 72 61 64 5f 73 74 65 70 20 20 5b 6c 69 6e  t rad_step  [lin
7e70: 64 65 78 20 24 72 61 64 69 75 73 5f 64 61 74 61  dex $radius_data
7e80: 20 31 5d 0a 0a 20 20 20 69 66 20 7b 20 24 72 61   1]..   if { $ra
7e90: 64 5f 73 74 65 70 20 3c 3d 20 30 2e 30 20 7d 20  d_step <= 0.0 } 
7ea0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d  {.      return -
7eb0: 63 6f 64 65 20 65 72 72 6f 72 20 22 53 74 65 70  code error "Step
7ec0: 20 73 69 7a 65 20 63 61 6e 20 6e 6f 74 20 62 65   size can not be
7ed0: 20 7a 65 72 6f 20 6f 72 20 6e 65 67 61 74 69 76   zero or negativ
7ee0: 65 22 0a 20 20 20 7d 0a 20 20 20 69 66 20 7b 20  e".   }.   if { 
7ef0: 24 72 61 64 5f 6d 61 78 20 3c 3d 20 30 2e 30 20  $rad_max <= 0.0 
7f00: 7d 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  } {.      return
7f10: 20 2d 63 6f 64 65 20 65 72 72 6f 72 20 22 4d 61   -code error "Ma
7f20: 78 69 6d 75 6d 20 72 61 64 69 75 73 20 63 61 6e  ximum radius can
7f30: 20 6e 6f 74 20 62 65 20 7a 65 72 6f 20 6f 72 20   not be zero or 
7f40: 6e 65 67 61 74 69 76 65 22 0a 20 20 20 7d 0a 0a  negative".   }..
7f50: 20 20 20 66 6f 72 65 61 63 68 20 7b 70 78 6d 69     foreach {pxmi
7f60: 6e 20 70 79 6d 69 6e 20 70 78 6d 61 78 20 70 79  n pymin pxmax py
7f70: 6d 61 78 7d 20 5b 4d 61 72 67 69 6e 73 43 69 72  max} [MarginsCir
7f80: 63 6c 65 20 24 77 5d 20 7b 62 72 65 61 6b 7d 0a  cle $w] {break}.
7f90: 0a 20 20 20 76 69 65 77 50 6f 72 74 20 20 20 20  .   viewPort    
7fa0: 20 20 20 20 20 24 77 20 24 70 78 6d 69 6e 20 20       $w $pxmin  
7fb0: 20 20 20 24 70 79 6d 69 6e 20 20 20 20 20 24 70     $pymin     $p
7fc0: 78 6d 61 78 20 20 20 24 70 79 6d 61 78 0a 20 20  xmax   $pymax.  
7fd0: 20 70 6f 6c 61 72 43 6f 6f 72 64 69 6e 61 74 65   polarCoordinate
7fe0: 73 20 24 77 20 24 72 61 64 5f 6d 61 78 0a 20 20  s $w $rad_max.  
7ff0: 20 44 72 61 77 50 6f 6c 61 72 41 78 65 73 20 20   DrawPolarAxes  
8000: 20 20 24 77 20 24 72 61 64 5f 6d 61 78 20 20 20    $w $rad_max   
8010: 24 72 61 64 5f 73 74 65 70 0a 20 20 20 44 65 66  $rad_step.   Def
8020: 61 75 6c 74 4c 65 67 65 6e 64 20 20 20 20 24 77  aultLegend    $w
8030: 0a 20 20 20 44 65 66 61 75 6c 74 42 61 6c 6c 6f  .   DefaultBallo
8040: 6f 6e 20 20 20 24 77 0a 0a 20 20 20 72 65 74 75  on   $w..   retu
8050: 72 6e 20 24 6e 65 77 63 68 61 72 74 0a 7d 0a 0a  rn $newchart.}..
8060: 23 20 63 72 65 61 74 65 42 61 72 63 68 61 72 74  # createBarchart
8070: 20 2d 2d 0a 23 20 20 20 20 43 72 65 61 74 65 20   --.#    Create 
8080: 61 20 63 6f 6d 6d 61 6e 64 20 66 6f 72 20 64 72  a command for dr
8090: 61 77 69 6e 67 20 61 20 62 61 72 63 68 61 72 74  awing a barchart
80a0: 20 77 69 74 68 20 76 65 72 74 69 63 61 6c 20 62   with vertical b
80b0: 61 72 73 0a 23 20 41 72 67 75 6d 65 6e 74 73 3a  ars.# Arguments:
80c0: 0a 23 20 20 20 20 77 20 20 20 20 20 20 20 20 20  .#    w         
80d0: 20 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 61    Name of the ca
80e0: 6e 76 61 73 0a 23 20 20 20 20 78 6c 61 62 65 6c  nvas.#    xlabel
80f0: 73 20 20 20 20 20 4c 69 73 74 20 6f 66 20 6c 61  s     List of la
8100: 62 65 6c 73 20 66 6f 72 20 78 2d 61 78 69 73 0a  bels for x-axis.
8110: 23 20 20 20 20 79 73 63 61 6c 65 20 20 20 20 20  #    yscale     
8120: 20 4d 69 6e 69 6d 75 6d 2c 20 6d 61 78 69 6d 75   Minimum, maximu
8130: 6d 20 61 6e 64 20 73 74 65 70 20 66 6f 72 20 79  m and step for y
8140: 2d 61 78 69 73 0a 23 20 20 20 20 6e 6f 73 65 72  -axis.#    noser
8150: 69 65 73 20 20 20 20 4e 75 6d 62 65 72 20 6f 66  ies    Number of
8160: 20 73 65 72 69 65 73 20 6f 72 20 74 68 65 20 6b   series or the k
8170: 65 79 77 6f 72 64 20 22 73 74 61 63 6b 65 64 22  eyword "stacked"
8180: 0a 23 20 52 65 73 75 6c 74 3a 0a 23 20 20 20 20  .# Result:.#    
8190: 4e 61 6d 65 20 6f 66 20 61 20 6e 65 77 20 63 6f  Name of a new co
81a0: 6d 6d 61 6e 64 0a 23 20 4e 6f 74 65 3a 0a 23 20  mmand.# Note:.# 
81b0: 20 20 20 54 68 65 20 65 6e 74 69 72 65 20 63 61     The entire ca
81c0: 6e 76 61 73 20 77 69 6c 6c 20 62 65 20 64 65 64  nvas will be ded
81d0: 69 63 61 74 65 64 20 74 6f 20 74 68 65 20 62 61  icated to the ba
81e0: 72 63 68 61 72 74 2e 0a 23 0a 70 72 6f 63 20 3a  rchart..#.proc :
81f0: 3a 50 6c 6f 74 63 68 61 72 74 3a 3a 63 72 65 61  :Plotchart::crea
8200: 74 65 42 61 72 63 68 61 72 74 20 7b 20 77 20 78  teBarchart { w x
8210: 6c 61 62 65 6c 73 20 79 73 63 61 6c 65 20 6e 6f  labels yscale no
8220: 73 65 72 69 65 73 20 7d 20 7b 0a 20 20 20 76 61  series } {.   va
8230: 72 69 61 62 6c 65 20 64 61 74 61 5f 73 65 72 69  riable data_seri
8240: 65 73 0a 0a 20 20 20 66 6f 72 65 61 63 68 20 73  es..   foreach s
8250: 20 5b 61 72 72 61 79 20 6e 61 6d 65 73 20 64 61   [array names da
8260: 74 61 5f 73 65 72 69 65 73 20 22 24 77 2c 2a 22  ta_series "$w,*"
8270: 5d 20 7b 0a 20 20 20 20 20 20 75 6e 73 65 74 20  ] {.      unset 
8280: 64 61 74 61 5f 73 65 72 69 65 73 28 24 73 29 0a  data_series($s).
8290: 20 20 20 7d 0a 0a 20 20 20 73 65 74 20 6e 65 77     }..   set new
82a0: 63 68 61 72 74 20 22 62 61 72 63 68 61 72 74 5f  chart "barchart_
82b0: 24 77 22 0a 20 20 20 69 6e 74 65 72 70 20 61 6c  $w".   interp al
82c0: 69 61 73 20 7b 7d 20 24 6e 65 77 63 68 61 72 74  ias {} $newchart
82d0: 20 7b 7d 20 3a 3a 50 6c 6f 74 63 68 61 72 74 3a   {} ::Plotchart:
82e0: 3a 50 6c 6f 74 48 61 6e 64 6c 65 72 20 76 65 72  :PlotHandler ver
82f0: 74 62 61 72 73 20 24 77 0a 20 20 20 43 6f 70 79  tbars $w.   Copy
8300: 43 6f 6e 66 69 67 20 76 65 72 74 62 61 72 73 20  Config vertbars 
8310: 24 77 0a 0a 20 20 20 66 6f 72 65 61 63 68 20 7b  $w..   foreach {
8320: 70 78 6d 69 6e 20 70 79 6d 69 6e 20 70 78 6d 61  pxmin pymin pxma
8330: 78 20 70 79 6d 61 78 7d 20 5b 4d 61 72 67 69 6e  x pymax} [Margin
8340: 73 52 65 63 74 61 6e 67 6c 65 20 24 77 5d 20 7b  sRectangle $w] {
8350: 62 72 65 61 6b 7d 0a 0a 20 20 20 73 65 74 20 78  break}..   set x
8360: 6d 69 6e 20 20 30 2e 30 0a 20 20 20 73 65 74 20  min  0.0.   set 
8370: 78 6d 61 78 20 20 5b 65 78 70 72 20 7b 5b 6c 6c  xmax  [expr {[ll
8380: 65 6e 67 74 68 20 24 78 6c 61 62 65 6c 73 5d 20  ength $xlabels] 
8390: 2b 20 30 2e 31 7d 5d 0a 0a 20 20 20 66 6f 72 65  + 0.1}]..   fore
83a0: 61 63 68 20 7b 79 6d 69 6e 20 79 6d 61 78 20 79  ach {ymin ymax y
83b0: 64 65 6c 74 7d 20 24 79 73 63 61 6c 65 20 7b 62  delt} $yscale {b
83c0: 72 65 61 6b 7d 0a 0a 20 20 20 69 66 20 7b 20 24  reak}..   if { $
83d0: 79 64 65 6c 74 20 3d 3d 20 30 2e 30 20 7d 20 7b  ydelt == 0.0 } {
83e0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 63  .      return -c
83f0: 6f 64 65 20 65 72 72 6f 72 20 22 53 74 65 70 20  ode error "Step 
8400: 73 69 7a 65 20 63 61 6e 20 6e 6f 74 20 62 65 20  size can not be 
8410: 7a 65 72 6f 22 0a 20 20 20 7d 0a 0a 20 20 20 69  zero".   }..   i
8420: 66 20 7b 20 28 24 79 6d 61 78 2d 24 79 6d 69 6e  f { ($ymax-$ymin
8430: 29 2a 24 79 64 65 6c 74 20 3c 20 30 2e 30 20 7d  )*$ydelt < 0.0 }
8440: 20 7b 0a 20 20 20 20 20 20 73 65 74 20 79 64 65   {.      set yde
8450: 6c 74 20 5b 65 78 70 72 20 7b 2d 24 79 64 65 6c  lt [expr {-$ydel
8460: 74 7d 5d 0a 20 20 20 7d 0a 0a 20 20 20 76 69 65  t}].   }..   vie
8470: 77 50 6f 72 74 20 20 20 20 20 20 20 20 20 24 77  wPort         $w
8480: 20 24 70 78 6d 69 6e 20 24 70 79 6d 69 6e 20 24   $pxmin $pymin $
8490: 70 78 6d 61 78 20 24 70 79 6d 61 78 0a 20 20 20  pxmax $pymax.   
84a0: 77 6f 72 6c 64 43 6f 6f 72 64 69 6e 61 74 65 73  worldCoordinates
84b0: 20 24 77 20 24 78 6d 69 6e 20 20 24 79 6d 69 6e   $w $xmin  $ymin
84c0: 20 20 24 78 6d 61 78 20 20 24 79 6d 61 78 0a 0a    $xmax  $ymax..
84d0: 20 20 20 44 72 61 77 59 61 78 69 73 20 20 20 20     DrawYaxis    
84e0: 20 20 20 20 24 77 20 24 79 6d 69 6e 20 20 24 79      $w $ymin  $y
84f0: 6d 61 78 20 20 24 79 64 65 6c 74 0a 20 20 20 44  max  $ydelt.   D
8500: 72 61 77 58 6c 61 62 65 6c 73 20 20 20 20 20 20  rawXlabels      
8510: 24 77 20 24 78 6c 61 62 65 6c 73 20 24 6e 6f 73  $w $xlabels $nos
8520: 65 72 69 65 73 0a 20 20 20 44 72 61 77 4d 61 73  eries.   DrawMas
8530: 6b 20 20 20 20 20 20 20 20 20 24 77 0a 20 20 20  k         $w.   
8540: 44 65 66 61 75 6c 74 4c 65 67 65 6e 64 20 20 20  DefaultLegend   
8550: 20 24 77 0a 20 20 20 73 65 74 20 64 61 74 61 5f   $w.   set data_
8560: 73 65 72 69 65 73 28 24 77 2c 6c 65 67 65 6e 64  series($w,legend
8570: 74 79 70 65 29 20 22 72 65 63 74 61 6e 67 6c 65  type) "rectangle
8580: 22 0a 20 20 20 44 65 66 61 75 6c 74 42 61 6c 6c  ".   DefaultBall
8590: 6f 6f 6e 20 20 20 24 77 0a 0a 20 20 20 53 65 74  oon   $w..   Set
85a0: 43 6f 6c 6f 75 72 73 20 24 77 20 62 6c 75 65 20  Colours $w blue 
85b0: 6c 69 67 68 74 62 6c 75 65 20 67 72 65 65 6e 20  lightblue green 
85c0: 79 65 6c 6c 6f 77 20 6f 72 61 6e 67 65 20 72 65  yellow orange re
85d0: 64 20 6d 61 67 65 6e 74 61 20 62 72 6f 77 6e 0a  d magenta brown.
85e0: 0a 20 20 20 72 65 74 75 72 6e 20 24 6e 65 77 63  .   return $newc
85f0: 68 61 72 74 0a 7d 0a 0a 23 20 63 72 65 61 74 65  hart.}..# create
8600: 48 6f 72 69 7a 6f 6e 74 61 6c 42 61 72 63 68 61  HorizontalBarcha
8610: 72 74 20 2d 2d 0a 23 20 20 20 20 43 72 65 61 74  rt --.#    Creat
8620: 65 20 61 20 63 6f 6d 6d 61 6e 64 20 66 6f 72 20  e a command for 
8630: 64 72 61 77 69 6e 67 20 61 20 62 61 72 63 68 61  drawing a barcha
8640: 72 74 20 77 69 74 68 20 68 6f 72 69 7a 6f 6e 74  rt with horizont
8650: 61 6c 20 62 61 72 73 0a 23 20 41 72 67 75 6d 65  al bars.# Argume
8660: 6e 74 73 3a 0a 23 20 20 20 20 77 20 20 20 20 20  nts:.#    w     
8670: 20 20 20 20 20 20 4e 61 6d 65 20 6f 66 20 74 68        Name of th
8680: 65 20 63 61 6e 76 61 73 0a 23 20 20 20 20 78 73  e canvas.#    xs
8690: 63 61 6c 65 20 20 20 20 20 20 4d 69 6e 69 6d 75  cale      Minimu
86a0: 6d 2c 20 6d 61 78 69 6d 75 6d 20 61 6e 64 20 73  m, maximum and s
86b0: 74 65 70 20 66 6f 72 20 78 2d 61 78 69 73 0a 23  tep for x-axis.#
86c0: 20 20 20 20 79 6c 61 62 65 6c 73 20 20 20 20 20      ylabels     
86d0: 4c 69 73 74 20 6f 66 20 6c 61 62 65 6c 73 20 66  List of labels f
86e0: 6f 72 20 79 2d 61 78 69 73 0a 23 20 20 20 20 6e  or y-axis.#    n
86f0: 6f 73 65 72 69 65 73 20 20 20 20 4e 75 6d 62 65  oseries    Numbe
8700: 72 20 6f 66 20 73 65 72 69 65 73 20 6f 72 20 74  r of series or t
8710: 68 65 20 6b 65 79 77 6f 72 64 20 22 73 74 61 63  he keyword "stac
8720: 6b 65 64 22 0a 23 20 52 65 73 75 6c 74 3a 0a 23  ked".# Result:.#
8730: 20 20 20 20 4e 61 6d 65 20 6f 66 20 61 20 6e 65      Name of a ne
8740: 77 20 63 6f 6d 6d 61 6e 64 0a 23 20 4e 6f 74 65  w command.# Note
8750: 3a 0a 23 20 20 20 20 54 68 65 20 65 6e 74 69 72  :.#    The entir
8760: 65 20 63 61 6e 76 61 73 20 77 69 6c 6c 20 62 65  e canvas will be
8770: 20 64 65 64 69 63 61 74 65 64 20 74 6f 20 74 68   dedicated to th
8780: 65 20 62 61 72 63 68 61 72 74 2e 0a 23 0a 70 72  e barchart..#.pr
8790: 6f 63 20 3a 3a 50 6c 6f 74 63 68 61 72 74 3a 3a  oc ::Plotchart::
87a0: 63 72 65 61 74 65 48 6f 72 69 7a 6f 6e 74 61 6c  createHorizontal
87b0: 42 61 72 63 68 61 72 74 20 7b 20 77 20 78 73 63  Barchart { w xsc
87c0: 61 6c 65 20 79 6c 61 62 65 6c 73 20 6e 6f 73 65  ale ylabels nose
87d0: 72 69 65 73 20 7d 20 7b 0a 20 20 20 76 61 72 69  ries } {.   vari
87e0: 61 62 6c 65 20 64 61 74 61 5f 73 65 72 69 65 73  able data_series
87f0: 0a 20 20 20 76 61 72 69 61 62 6c 65 20 63 6f 6e  .   variable con
8800: 66 69 67 0a 0a 20 20 20 66 6f 72 65 61 63 68 20  fig..   foreach 
8810: 73 20 5b 61 72 72 61 79 20 6e 61 6d 65 73 20 64  s [array names d
8820: 61 74 61 5f 73 65 72 69 65 73 20 22 24 77 2c 2a  ata_series "$w,*
8830: 22 5d 20 7b 0a 20 20 20 20 20 20 75 6e 73 65 74  "] {.      unset
8840: 20 64 61 74 61 5f 73 65 72 69 65 73 28 24 73 29   data_series($s)
8850: 0a 20 20 20 7d 0a 0a 20 20 20 73 65 74 20 6e 65  .   }..   set ne
8860: 77 63 68 61 72 74 20 22 68 62 61 72 63 68 61 72  wchart "hbarchar
8870: 74 5f 24 77 22 0a 20 20 20 69 6e 74 65 72 70 20  t_$w".   interp 
8880: 61 6c 69 61 73 20 7b 7d 20 24 6e 65 77 63 68 61  alias {} $newcha
8890: 72 74 20 7b 7d 20 3a 3a 50 6c 6f 74 63 68 61 72  rt {} ::Plotchar
88a0: 74 3a 3a 50 6c 6f 74 48 61 6e 64 6c 65 72 20 68  t::PlotHandler h
88b0: 6f 72 69 7a 62 61 72 73 20 24 77 0a 20 20 20 43  orizbars $w.   C
88c0: 6f 70 79 43 6f 6e 66 69 67 20 68 6f 72 69 7a 62  opyConfig horizb
88d0: 61 72 73 20 24 77 0a 0a 20 20 20 73 65 74 20 66  ars $w..   set f
88e0: 6f 6e 74 20 20 20 20 20 20 24 63 6f 6e 66 69 67  ont      $config
88f0: 28 24 77 2c 6c 65 66 74 61 78 69 73 2c 66 6f 6e  ($w,leftaxis,fon
8900: 74 29 0a 20 20 20 73 65 74 20 78 73 70 61 63 65  t).   set xspace
8910: 6d 61 78 20 30 0a 20 20 20 66 6f 72 65 61 63 68  max 0.   foreach
8920: 20 79 6c 61 62 65 6c 20 24 79 6c 61 62 65 6c 73   ylabel $ylabels
8930: 20 7b 0a 20 20 20 20 20 20 20 73 65 74 20 78 73   {.       set xs
8940: 70 61 63 65 20 5b 66 6f 6e 74 20 6d 65 61 73 75  pace [font measu
8950: 72 65 20 24 66 6f 6e 74 20 24 79 6c 61 62 65 6c  re $font $ylabel
8960: 5d 0a 20 20 20 20 20 20 20 69 66 20 7b 20 24 78  ].       if { $x
8970: 73 70 61 63 65 20 3e 20 24 78 73 70 61 63 65 6d  space > $xspacem
8980: 61 78 20 7d 20 7b 0a 20 20 20 20 20 20 20 20 20  ax } {.         
8990: 20 20 73 65 74 20 78 73 70 61 63 65 6d 61 78 20    set xspacemax 
89a0: 24 78 73 70 61 63 65 0a 20 20 20 20 20 20 20 7d  $xspace.       }
89b0: 0a 20 20 20 7d 0a 20 20 20 73 65 74 20 63 6f 6e  .   }.   set con
89c0: 66 69 67 28 24 77 2c 6d 61 72 67 69 6e 2c 6c 65  fig($w,margin,le
89d0: 66 74 29 20 5b 65 78 70 72 20 7b 24 78 73 70 61  ft) [expr {$xspa
89e0: 63 65 6d 61 78 2b 35 7d 5d 20 3b 23 20 53 6c 69  cemax+5}] ;# Sli
89f0: 67 68 74 6c 79 20 6d 6f 72 65 20 73 70 61 63 65  ghtly more space
8a00: 20 72 65 71 75 69 72 65 64 21 0a 0a 20 20 20 66   required!..   f
8a10: 6f 72 65 61 63 68 20 7b 70 78 6d 69 6e 20 70 79  oreach {pxmin py
8a20: 6d 69 6e 20 70 78 6d 61 78 20 70 79 6d 61 78 7d  min pxmax pymax}
8a30: 20 5b 4d 61 72 67 69 6e 73 52 65 63 74 61 6e 67   [MarginsRectang
8a40: 6c 65 20 24 77 5d 20 7b 62 72 65 61 6b 7d 0a 0a  le $w] {break}..
8a50: 20 20 20 73 65 74 20 79 6d 69 6e 20 20 30 2e 30     set ymin  0.0
8a60: 0a 20 20 20 73 65 74 20 79 6d 61 78 20 20 5b 65  .   set ymax  [e
8a70: 78 70 72 20 7b 5b 6c 6c 65 6e 67 74 68 20 24 79  xpr {[llength $y
8a80: 6c 61 62 65 6c 73 5d 20 2b 20 30 2e 31 7d 5d 0a  labels] + 0.1}].
8a90: 0a 20 20 20 66 6f 72 65 61 63 68 20 7b 78 6d 69  .   foreach {xmi
8aa0: 6e 20 78 6d 61 78 20 78 64 65 6c 74 7d 20 24 78  n xmax xdelt} $x
8ab0: 73 63 61 6c 65 20 7b 62 72 65 61 6b 7d 0a 0a 20  scale {break}.. 
8ac0: 20 20 69 66 20 7b 20 24 78 64 65 6c 74 20 3d 3d    if { $xdelt ==
8ad0: 20 30 2e 30 20 7d 20 7b 0a 20 20 20 20 20 20 72   0.0 } {.      r
8ae0: 65 74 75 72 6e 20 2d 63 6f 64 65 20 65 72 72 6f  eturn -code erro
8af0: 72 20 22 53 74 65 70 20 73 69 7a 65 20 63 61 6e  r "Step size can
8b00: 20 6e 6f 74 20 62 65 20 7a 65 72 6f 22 0a 20 20   not be zero".  
8b10: 20 7d 0a 0a 20 20 20 69 66 20 7b 20 28 24 78 6d   }..   if { ($xm
8b20: 61 78 2d 24 78 6d 69 6e 29 2a 24 78 64 65 6c 74  ax-$xmin)*$xdelt
8b30: 20 3c 20 30 2e 30 20 7d 20 7b 0a 20 20 20 20 20   < 0.0 } {.     
8b40: 20 73 65 74 20 78 64 65 6c 74 20 5b 65 78 70 72   set xdelt [expr
8b50: 20 7b 2d 24 78 64 65 6c 74 7d 5d 0a 20 20 20 7d   {-$xdelt}].   }
8b60: 0a 0a 20 20 20 76 69 65 77 50 6f 72 74 20 20 20  ..   viewPort   
8b70: 20 20 20 20 20 20 24 77 20 24 70 78 6d 69 6e 20        $w $pxmin 
8b80: 24 70 79 6d 69 6e 20 24 70 78 6d 61 78 20 24 70  $pymin $pxmax $p
8b90: 79 6d 61 78 0a 20 20 20 77 6f 72 6c 64 43 6f 6f  ymax.   worldCoo
8ba0: 72 64 69 6e 61 74 65 73 20 24 77 20 24 78 6d 69  rdinates $w $xmi
8bb0: 6e 20 20 24 79 6d 69 6e 20 20 24 78 6d 61 78 20  n  $ymin  $xmax 
8bc0: 20 24 79 6d 61 78 0a 0a 20 20 20 44 72 61 77 58   $ymax..   DrawX
8bd0: 61 78 69 73 20 20 20 20 20 20 20 20 24 77 20 24  axis        $w $
8be0: 78 6d 69 6e 20 20 24 78 6d 61 78 20 20 24 78 64  xmin  $xmax  $xd
8bf0: 65 6c 74 0a 20 20 20 44 72 61 77 59 6c 61 62 65  elt.   DrawYlabe
8c00: 6c 73 20 20 20 20 20 20 24 77 20 24 79 6c 61 62  ls      $w $ylab
8c10: 65 6c 73 20 24 6e 6f 73 65 72 69 65 73 0a 20 20  els $noseries.  
8c20: 20 44 72 61 77 4d 61 73 6b 20 20 20 20 20 20 20   DrawMask       
8c30: 20 20 24 77 0a 20 20 20 44 65 66 61 75 6c 74 4c    $w.   DefaultL
8c40: 65 67 65 6e 64 20 20 20 20 24 77 0a 20 20 20 73  egend    $w.   s
8c50: 65 74 20 64 61 74 61 5f 73 65 72 69 65 73 28 24  et data_series($
8c60: 77 2c 6c 65 67 65 6e 64 74 79 70 65 29 20 22 72  w,legendtype) "r
8c70: 65 63 74 61 6e 67 6c 65 22 0a 20 20 20 44 65 66  ectangle".   Def
8c80: 61 75 6c 74 42 61 6c 6c 6f 6f 6e 20 20 20 24 77  aultBalloon   $w
8c90: 0a 0a 20 20 20 53 65 74 43 6f 6c 6f 75 72 73 20  ..   SetColours 
8ca0: 24 77 20 62 6c 75 65 20 6c 69 67 68 74 62 6c 75  $w blue lightblu
8cb0: 65 20 67 72 65 65 6e 20 79 65 6c 6c 6f 77 20 6f  e green yellow o
8cc0: 72 61 6e 67 65 20 72 65 64 20 6d 61 67 65 6e 74  range red magent
8cd0: 61 20 62 72 6f 77 6e 0a 0a 20 20 20 72 65 74 75  a brown..   retu
8ce0: 72 6e 20 24 6e 65 77 63 68 61 72 74 0a 7d 0a 0a  rn $newchart.}..
8cf0: 23 20 63 72 65 61 74 65 42 6f 78 70 6c 6f 74 20  # createBoxplot 
8d00: 2d 2d 0a 23 20 20 20 20 43 72 65 61 74 65 20 61  --.#    Create a
8d10: 20 63 6f 6d 6d 61 6e 64 20 66 6f 72 20 64 72 61   command for dra
8d20: 77 69 6e 67 20 61 20 70 6c 6f 74 20 77 69 74 68  wing a plot with
8d30: 20 62 6f 78 2d 61 6e 64 2d 77 68 69 73 6b 65 72   box-and-whisker
8d40: 73 0a 23 20 41 72 67 75 6d 65 6e 74 73 3a 0a 23  s.# Arguments:.#
8d50: 20 20 20 20 77 20 20 20 20 20 20 20 20 20 20 20      w           
8d60: 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 61 6e 76  Name of the canv
8d70: 61 73 0a 23 20 20 20 20 78 73 63 61 6c 65 20 20  as.#    xscale  
8d80: 20 20 20 20 4d 69 6e 69 6d 75 6d 2c 20 6d 61 78      Minimum, max
8d90: 69 6d 75 6d 20 61 6e 64 20 73 74 65 70 20 66 6f  imum and step fo
8da0: 72 20 78 2d 61 78 69 73 0a 23 20 20 20 20 79 6c  r x-axis.#    yl
8db0: 61 62 65 6c 73 20 20 20 20 20 4c 69 73 74 20 6f  abels     List o
8dc0: 66 20 6c 61 62 65 6c 73 20 66 6f 72 20 79 2d 61  f labels for y-a
8dd0: 78 69 73 0a 23 20 52 65 73 75 6c 74 3a 0a 23 20  xis.# Result:.# 
8de0: 20 20 20 4e 61 6d 65 20 6f 66 20 61 20 6e 65 77     Name of a new
8df0: 20 63 6f 6d 6d 61 6e 64 0a 23 20 4e 6f 74 65 3a   command.# Note:
8e00: 0a 23 20 20 20 20 54 68 65 20 65 6e 74 69 72 65  .#    The entire
8e10: 20 63 61 6e 76 61 73 20 77 69 6c 6c 20 62 65 20   canvas will be 
8e20: 64 65 64 69 63 61 74 65 64 20 74 6f 20 74 68 65  dedicated to the
8e30: 20 62 6f 78 70 6c 6f 74 2e 0a 23 0a 70 72 6f 63   boxplot..#.proc
8e40: 20 3a 3a 50 6c 6f 74 63 68 61 72 74 3a 3a 63 72   ::Plotchart::cr
8e50: 65 61 74 65 42 6f 78 70 6c 6f 74 20 7b 20 77 20  eateBoxplot { w 
8e60: 78 73 63 61 6c 65 20 79 6c 61 62 65 6c 73 20 7d  xscale ylabels }
8e70: 20 7b 0a 20 20 20 76 61 72 69 61 62 6c 65 20 64   {.   variable d
8e80: 61 74 61 5f 73 65 72 69 65 73 0a 20 20 20 76 61  ata_series.   va
8e90: 72 69 61 62 6c 65 20 63 6f 6e 66 69 67 0a 0a 20  riable config.. 
8ea0: 20 20 66 6f 72 65 61 63 68 20 73 20 5b 61 72 72    foreach s [arr
8eb0: 61 79 20 6e 61 6d 65 73 20 64 61 74 61 5f 73 65  ay names data_se
8ec0: 72 69 65 73 20 22 24 77 2c 2a 22 5d 20 7b 0a 20  ries "$w,*"] {. 
8ed0: 20 20 20 20 20 75 6e 73 65 74 20 64 61 74 61 5f       unset data_
8ee0: 73 65 72 69 65 73 28 24 73 29 0a 20 20 20 7d 0a  series($s).   }.
8ef0: 0a 20 20 20 73 65 74 20 6e 65 77 63 68 61 72 74  .   set newchart
8f00: 20 22 62 6f 78 70 6c 6f 74 5f 24 77 22 0a 20 20   "boxplot_$w".  
8f10: 20 69 6e 74 65 72 70 20 61 6c 69 61 73 20 7b 7d   interp alias {}
8f20: 20 24 6e 65 77 63 68 61 72 74 20 7b 7d 20 3a 3a   $newchart {} ::
8f30: 50 6c 6f 74 63 68 61 72 74 3a 3a 50 6c 6f 74 48  Plotchart::PlotH
8f40: 61 6e 64 6c 65 72 20 62 6f 78 70 6c 6f 74 20 24  andler boxplot $
8f50: 77 0a 20 20 20 43 6f 70 79 43 6f 6e 66 69 67 20  w.   CopyConfig 
8f60: 62 6f 78 70 6c 6f 74 20 24 77 0a 0a 20 20 20 73  boxplot $w..   s
8f70: 65 74 20 66 6f 6e 74 20 20 20 20 20 20 24 63 6f  et font      $co
8f80: 6e 66 69 67 28 24 77 2c 6c 65 66 74 61 78 69 73  nfig($w,leftaxis
8f90: 2c 66 6f 6e 74 29 0a 20 20 20 73 65 74 20 78 73  ,font).   set xs
8fa0: 70 61 63 65 6d 61 78 20 30 0a 20 20 20 66 6f 72  pacemax 0.   for
8fb0: 65 61 63 68 20 79 6c 61 62 65 6c 20 24 79 6c 61  each ylabel $yla
8fc0: 62 65 6c 73 20 7b 0a 20 20 20 20 20 20 20 73 65  bels {.       se
8fd0: 74 20 78 73 70 61 63 65 20 5b 66 6f 6e 74 20 6d  t xspace [font m
8fe0: 65 61 73 75 72 65 20 24 66 6f 6e 74 20 24 79 6c  easure $font $yl
8ff0: 61 62 65 6c 5d 0a 20 20 20 20 20 20 20 69 66 20  abel].       if 
9000: 7b 20 24 78 73 70 61 63 65 20 3e 20 24 78 73 70  { $xspace > $xsp
9010: 61 63 65 6d 61 78 20 7d 20 7b 0a 20 20 20 20 20  acemax } {.     
9020: 20 20 20 20 20 20 73 65 74 20 78 73 70 61 63 65        set xspace
9030: 6d 61 78 20 24 78 73 70 61 63 65 0a 20 20 20 20  max $xspace.    
9040: 20 20 20 7d 0a 20 20 20 7d 0a 20 20 20 73 65 74     }.   }.   set
9050: 20 63 6f 6e 66 69 67 28 24 77 2c 6d 61 72 67 69   config($w,margi
9060: 6e 2c 6c 65 66 74 29 20 5b 65 78 70 72 20 7b 24  n,left) [expr {$
9070: 78 73 70 61 63 65 6d 61 78 2b 35 7d 5d 20 3b 23  xspacemax+5}] ;#
9080: 20 53 6c 69 67 68 74 6c 79 20 6d 6f 72 65 20 73   Slightly more s
9090: 70 61 63 65 20 72 65 71 75 69 72 65 64 21 0a 20  pace required!. 
90a0: 20 20 66 6f 72 65 61 63 68 20 7b 70 78 6d 69 6e    foreach {pxmin
90b0: 20 70 79 6d 69 6e 20 70 78 6d 61 78 20 70 79 6d   pymin pxmax pym
90c0: 61 78 7d 20 5b 4d 61 72 67 69 6e 73 52 65 63 74  ax} [MarginsRect
90d0: 61 6e 67 6c 65 20 24 77 5d 20 7b 62 72 65 61 6b  angle $w] {break
90e0: 7d 0a 0a 20 20 20 73 65 74 20 79 6d 69 6e 20 20  }..   set ymin  
90f0: 30 2e 30 0a 20 20 20 73 65 74 20 79 6d 61 78 20  0.0.   set ymax 
9100: 20 5b 65 78 70 72 20 7b 5b 6c 6c 65 6e 67 74 68   [expr {[llength
9110: 20 24 79 6c 61 62 65 6c 73 5d 20 2b 20 30 2e 31   $ylabels] + 0.1
9120: 7d 5d 0a 0a 20 20 20 66 6f 72 65 61 63 68 20 7b  }]..   foreach {
9130: 78 6d 69 6e 20 78 6d 61 78 20 78 64 65 6c 74 7d  xmin xmax xdelt}
9140: 20 24 78 73 63 61 6c 65 20 7b 62 72 65 61 6b 7d   $xscale {break}
9150: 0a 0a 20 20 20 69 66 20 7b 20 24 78 64 65 6c 74  ..   if { $xdelt
9160: 20 3d 3d 20 30 2e 30 20 7d 20 7b 0a 20 20 20 20   == 0.0 } {.    
9170: 20 20 72 65 74 75 72 6e 20 2d 63 6f 64 65 20 65    return -code e
9180: 72 72 6f 72 20 22 53 74 65 70 20 73 69 7a 65 20  rror "Step size 
9190: 63 61 6e 20 6e 6f 74 20 62 65 20 7a 65 72 6f 22  can not be zero"
91a0: 0a 20 20 20 7d 0a 0a 20 20 20 69 66 20 7b 20 28  .   }..   if { (
91b0: 24 78 6d 61 78 2d 24 78 6d 69 6e 29 2a 24 78 64  $xmax-$xmin)*$xd
91c0: 65 6c 74 20 3c 20 30 2e 30 20 7d 20 7b 0a 20 20  elt < 0.0 } {.  
91d0: 20 20 20 20 73 65 74 20 78 64 65 6c 74 20 5b 65      set xdelt [e
91e0: 78 70 72 20 7b 2d 24 78 64 65 6c 74 7d 5d 0a 20  xpr {-$xdelt}]. 
91f0: 20 20 7d 0a 0a 20 20 20 76 69 65 77 50 6f 72 74    }..   viewPort
9200: 20 20 20 20 20 20 20 20 20 24 77 20 24 70 78 6d           $w $pxm
9210: 69 6e 20 24 70 79 6d 69 6e 20 24 70 78 6d 61 78  in $pymin $pxmax
9220: 20 24 70 79 6d 61 78 0a 20 20 20 77 6f 72 6c 64   $pymax.   world
9230: 43 6f 6f 72 64 69 6e 61 74 65 73 20 24 77 20 24  Coordinates $w $
9240: 78 6d 69 6e 20 20 24 79 6d 69 6e 20 20 24 78 6d  xmin  $ymin  $xm
9250: 61 78 20 20 24 79 6d 61 78 0a 0a 20 20 20 44 72  ax  $ymax..   Dr
9260: 61 77 58 61 78 69 73 20 20 20 20 20 20 20 20 24  awXaxis        $
9270: 77 20 24 78 6d 69 6e 20 20 24 78 6d 61 78 20 20  w $xmin  $xmax  
9280: 24 78 64 65 6c 74 0a 20 20 20 44 72 61 77 59 6c  $xdelt.   DrawYl
9290: 61 62 65 6c 73 20 20 20 20 20 20 24 77 20 24 79  abels      $w $y
92a0: 6c 61 62 65 6c 73 20 31 0a 20 20 20 44 72 61 77  labels 1.   Draw
92b0: 4d 61 73 6b 20 20 20 20 20 20 20 20 20 24 77 0a  Mask         $w.
92c0: 20 20 20 44 65 66 61 75 6c 74 4c 65 67 65 6e 64     DefaultLegend
92d0: 20 20 20 20 24 77 0a 20 20 20 73 65 74 20 64 61      $w.   set da
92e0: 74 61 5f 73 65 72 69 65 73 28 24 77 2c 6c 65 67  ta_series($w,leg
92f0: 65 6e 64 74 79 70 65 29 20 22 72 65 63 74 61 6e  endtype) "rectan
9300: 67 6c 65 22 0a 20 20 20 44 65 66 61 75 6c 74 42  gle".   DefaultB
9310: 61 6c 6c 6f 6f 6e 20 20 20 24 77 0a 0a 20 20 20  alloon   $w..   
9320: 73 65 74 20 63 6f 6e 66 69 67 28 24 77 2c 61 78  set config($w,ax
9330: 69 73 6e 61 6d 65 73 29 20 24 79 6c 61 62 65 6c  isnames) $ylabel
9340: 73 0a 0a 20 20 20 72 65 74 75 72 6e 20 24 6e 65  s..   return $ne
9350: 77 63 68 61 72 74 0a 7d 0a 0a 23 20 63 72 65 61  wchart.}..# crea
9360: 74 65 54 69 6d 65 63 68 61 72 74 20 2d 2d 0a 23  teTimechart --.#
9370: 20 20 20 20 43 72 65 61 74 65 20 61 20 63 6f 6d      Create a com
9380: 6d 61 6e 64 20 66 6f 72 20 64 72 61 77 69 6e 67  mand for drawing
9390: 20 61 20 73 69 6d 70 6c 65 20 74 69 6d 65 63 68   a simple timech
93a0: 61 72 74 0a 23 20 41 72 67 75 6d 65 6e 74 73 3a  art.# Arguments:
93b0: 0a 23 20 20 20 20 77 20 20 20 20 20 20 20 20 20  .#    w         
93c0: 20 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 61    Name of the ca
93d0: 6e 76 61 73 0a 23 20 20 20 20 74 69 6d 65 5f 62  nvas.#    time_b
93e0: 65 67 69 6e 20 20 53 74 61 72 74 20 74 69 6d 65  egin  Start time
93f0: 20 28 69 6e 20 74 68 65 20 66 6f 72 6d 20 6f 66   (in the form of
9400: 20 61 20 64 61 74 65 2f 74 69 6d 65 29 0a 23 20   a date/time).# 
9410: 20 20 20 74 69 6d 65 5f 65 6e 64 20 20 20 20 45     time_end    E
9420: 6e 64 20 74 69 6d 65 20 28 69 6e 20 74 68 65 20  nd time (in the 
9430: 66 6f 72 6d 20 6f 66 20 61 20 64 61 74 65 2f 74  form of a date/t
9440: 69 6d 65 29 0a 23 20 20 20 20 61 72 67 73 20 20  ime).#    args  
9450: 20 20 20 20 20 20 4e 75 6d 62 65 72 20 6f 66 20        Number of 
9460: 69 74 65 6d 73 20 74 6f 20 62 65 20 73 68 6f 77  items to be show
9470: 6e 20 28 64 65 74 65 72 6d 69 6e 65 73 20 73 70  n (determines sp
9480: 61 63 69 6e 67 29 0a 23 20 20 20 20 20 20 20 20  acing).#        
9490: 20 20 20 20 20 20 20 20 6f 72 20 6f 6e 65 20 6f          or one o
94a0: 72 20 6d 6f 72 65 20 6f 70 74 69 6f 6e 73 20 28  r more options (
94b0: 2d 62 61 72 68 65 69 67 68 74 20 70 69 78 65 6c  -barheight pixel
94c0: 73 2c 20 2d 79 6c 61 62 65 6c 77 69 64 74 68 20  s, -ylabelwidth 
94d0: 70 69 78 65 6c 73 29 0a 23 20 52 65 73 75 6c 74  pixels).# Result
94e0: 3a 0a 23 20 20 20 20 4e 61 6d 65 20 6f 66 20 61  :.#    Name of a
94f0: 20 6e 65 77 20 63 6f 6d 6d 61 6e 64 0a 23 20 4e   new command.# N
9500: 6f 74 65 3a 0a 23 20 20 20 20 54 68 65 20 65 6e  ote:.#    The en
9510: 74 69 72 65 20 63 61 6e 76 61 73 20 77 69 6c 6c  tire canvas will
9520: 20 62 65 20 64 65 64 69 63 61 74 65 64 20 74 6f   be dedicated to
9530: 20 74 68 65 20 74 69 6d 65 63 68 61 72 74 2e 0a   the timechart..
9540: 23 0a 70 72 6f 63 20 3a 3a 50 6c 6f 74 63 68 61  #.proc ::Plotcha
9550: 72 74 3a 3a 63 72 65 61 74 65 54 69 6d 65 63 68  rt::createTimech
9560: 61 72 74 20 7b 20 77 20 74 69 6d 65 5f 62 65 67  art { w time_beg
9570: 69 6e 20 74 69 6d 65 5f 65 6e 64 20 61 72 67 73  in time_end args
9580: 7d 20 7b 0a 20 20 20 76 61 72 69 61 62 6c 65 20  } {.   variable 
9590: 64 61 74 61 5f 73 65 72 69 65 73 0a 20 20 20 76  data_series.   v
95a0: 61 72 69 61 62 6c 65 20 73 63 61 6c 69 6e 67 0a  ariable scaling.
95b0: 0a 20 20 20 66 6f 72 65 61 63 68 20 73 20 5b 61  .   foreach s [a
95c0: 72 72 61 79 20 6e 61 6d 65 73 20 64 61 74 61 5f  rray names data_
95d0: 73 65 72 69 65 73 20 22 24 77 2c 2a 22 5d 20 7b  series "$w,*"] {
95e0: 0a 20 20 20 20 20 20 75 6e 73 65 74 20 64 61 74  .      unset dat
95f0: 61 5f 73 65 72 69 65 73 28 24 73 29 0a 20 20 20  a_series($s).   
9600: 7d 0a 0a 20 20 20 73 65 74 20 6e 65 77 63 68 61  }..   set newcha
9610: 72 74 20 22 74 69 6d 65 63 68 61 72 74 5f 24 77  rt "timechart_$w
9620: 22 0a 20 20 20 69 6e 74 65 72 70 20 61 6c 69 61  ".   interp alia
9630: 73 20 7b 7d 20 24 6e 65 77 63 68 61 72 74 20 7b  s {} $newchart {
9640: 7d 20 3a 3a 50 6c 6f 74 63 68 61 72 74 3a 3a 50  } ::Plotchart::P
9650: 6c 6f 74 48 61 6e 64 6c 65 72 20 74 69 6d 65 63  lotHandler timec
9660: 68 61 72 74 20 24 77 0a 20 20 20 43 6f 70 79 43  hart $w.   CopyC
9670: 6f 6e 66 69 67 20 74 69 6d 65 63 68 61 72 74 20  onfig timechart 
9680: 24 77 0a 0a 20 20 20 23 0a 20 20 20 23 20 48 61  $w..   #.   # Ha
9690: 6e 64 6c 65 20 74 68 65 20 61 72 67 75 6d 65 6e  ndle the argumen
96a0: 74 73 0a 20 20 20 23 0a 20 20 20 73 65 74 20 62  ts.   #.   set b
96b0: 61 72 68 65 69 67 68 74 20 20 20 20 30 0a 20 20  arheight    0.  
96c0: 20 73 65 74 20 6e 6f 69 74 65 6d 73 20 20 20 20   set noitems    
96d0: 20 20 5b 6c 69 6e 64 65 78 20 24 61 72 67 73 20    [lindex $args 
96e0: 30 5d 0a 20 20 20 73 65 74 20 79 6c 61 62 65 6c  0].   set ylabel
96f0: 77 69 64 74 68 20 20 38 0a 0a 20 20 20 69 66 20  width  8..   if 
9700: 7b 20 5b 73 74 72 69 6e 67 20 69 73 20 69 6e 74  { [string is int
9710: 65 67 65 72 20 2d 73 74 72 69 63 74 20 24 6e 6f  eger -strict $no
9720: 69 74 65 6d 73 5d 20 7d 20 7b 0a 20 20 20 20 20  items] } {.     
9730: 20 20 73 65 74 20 61 72 67 73 20 5b 6c 72 61 6e    set args [lran
9740: 67 65 20 24 61 72 67 73 20 31 20 65 6e 64 5d 0a  ge $args 1 end].
9750: 20 20 20 7d 0a 20 20 20 66 6f 72 65 61 63 68 20     }.   foreach 
9760: 7b 6b 65 79 77 6f 72 64 20 76 61 6c 75 65 7d 20  {keyword value} 
9770: 24 61 72 67 73 20 7b 0a 20 20 20 20 20 20 20 73  $args {.       s
9780: 77 69 74 63 68 20 2d 2d 20 24 6b 65 79 77 6f 72  witch -- $keywor
9790: 64 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 22  d {.           "
97a0: 2d 62 61 72 68 65 69 67 68 74 22 20 7b 0a 20 20  -barheight" {.  
97b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65                se
97c0: 74 20 62 61 72 68 65 69 67 68 74 20 24 76 61 6c  t barheight $val
97d0: 75 65 0a 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ue.           }.
97e0: 20 20 20 20 20 20 20 20 20 20 20 22 2d 79 6c 61             "-yla
97f0: 62 65 6c 77 69 64 74 68 22 20 7b 0a 20 20 20 20  belwidth" {.    
9800: 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20              set 
9810: 79 6c 61 62 65 6c 77 69 64 74 68 20 5b 65 78 70  ylabelwidth [exp
9820: 72 20 7b 24 76 61 6c 75 65 2f 31 30 2e 30 7d 5d  r {$value/10.0}]
9830: 20 3b 23 20 50 69 78 65 6c 73 20 74 6f 20 63 68   ;# Pixels to ch
9840: 61 72 61 63 74 65 72 73 0a 20 20 20 20 20 20 20  aracters.       
9850: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
9860: 20 64 65 66 61 75 6c 74 20 7b 0a 20 20 20 20 20   default {.     
9870: 20 20 20 20 20 20 20 20 20 20 20 23 20 49 67 6e             # Ign
9880: 6f 72 65 0a 20 20 20 20 20 20 20 20 20 20 20 7d  ore.           }
9890: 0a 20 20 20 20 20 20 20 7d 0a 20 20 20 7d 0a 0a  .       }.   }..
98a0: 20 20 20 66 6f 72 65 61 63 68 20 7b 70 78 6d 69     foreach {pxmi
98b0: 6e 20 70 79 6d 69 6e 20 70 78 6d 61 78 20 70 79  n pymin pxmax py
98c0: 6d 61 78 7d 20 5b 4d 61 72 67 69 6e 73 52 65 63  max} [MarginsRec
98d0: 74 61 6e 67 6c 65 20 24 77 20 33 20 24 79 6c 61  tangle $w 3 $yla
98e0: 62 65 6c 77 69 64 74 68 5d 20 7b 62 72 65 61 6b  belwidth] {break
98f0: 7d 0a 0a 20 20 20 69 66 20 7b 20 24 62 61 72 68  }..   if { $barh
9900: 65 69 67 68 74 20 21 3d 20 30 20 7d 20 7b 0a 20  eight != 0 } {. 
9910: 20 20 20 20 20 20 73 65 74 20 6e 6f 69 74 65 6d        set noitem
9920: 73 20 5b 65 78 70 72 20 7b 28 24 70 78 6d 61 78  s [expr {($pxmax
9930: 2d 24 70 78 6d 69 6e 29 2f 64 6f 75 62 6c 65 28  -$pxmin)/double(
9940: 24 62 61 72 68 65 69 67 68 74 29 7d 5d 0a 20 20  $barheight)}].  
9950: 20 7d 0a 20 20 20 73 65 74 20 73 63 61 6c 69 6e   }.   set scalin
9960: 67 28 24 77 2c 62 61 72 68 65 69 67 68 74 29 20  g($w,barheight) 
9970: 24 62 61 72 68 65 69 67 68 74 0a 0a 20 20 20 73  $barheight..   s
9980: 65 74 20 79 6d 69 6e 20 20 30 2e 30 0a 20 20 20  et ymin  0.0.   
9990: 73 65 74 20 79 6d 61 78 20 20 24 6e 6f 69 74 65  set ymax  $noite
99a0: 6d 73 0a 0a 20 20 20 73 65 74 20 78 6d 69 6e 20  ms..   set xmin 
99b0: 20 5b 65 78 70 72 20 7b 31 2e 30 2a 5b 63 6c 6f   [expr {1.0*[clo
99c0: 63 6b 20 73 63 61 6e 20 24 74 69 6d 65 5f 62 65  ck scan $time_be
99d0: 67 69 6e 5d 7d 5d 0a 20 20 20 73 65 74 20 78 6d  gin]}].   set xm
99e0: 61 78 20 20 5b 65 78 70 72 20 7b 31 2e 30 2a 5b  ax  [expr {1.0*[
99f0: 63 6c 6f 63 6b 20 73 63 61 6e 20 24 74 69 6d 65  clock scan $time
9a00: 5f 65 6e 64 5d 7d 5d 0a 0a 20 20 20 76 69 65 77  _end]}]..   view
9a10: 50 6f 72 74 20 20 20 20 20 20 20 20 20 24 77 20  Port         $w 
9a20: 24 70 78 6d 69 6e 20 24 70 79 6d 69 6e 20 24 70  $pxmin $pymin $p
9a30: 78 6d 61 78 20 24 70 79 6d 61 78 0a 20 20 20 77  xmax $pymax.   w
9a40: 6f 72 6c 64 43 6f 6f 72 64 69 6e 61 74 65 73 20  orldCoordinates 
9a50: 24 77 20 24 78 6d 69 6e 20 20 24 79 6d 69 6e 20  $w $xmin  $ymin 
9a60: 20 24 78 6d 61 78 20 20 24 79 6d 61 78 0a 0a 20   $xmax  $ymax.. 
9a70: 20 20 73 65 74 20 73 63 61 6c 69 6e 67 28 24 77    set scaling($w
9a80: 2c 63 75 72 72 65 6e 74 29 20 24 79 6d 61 78 0a  ,current) $ymax.
9a90: 20 20 20 73 65 74 20 73 63 61 6c 69 6e 67 28 24     set scaling($
9aa0: 77 2c 64 79 29 20 20 20 20 20 20 2d 30 2e 37 0a  w,dy)      -0.7.
9ab0: 0a 20 20 20 44 72 61 77 53 63 72 6f 6c 6c 4d 61  .   DrawScrollMa
9ac0: 73 6b 20 24 77 0a 20 20 20 73 65 74 20 73 63 61  sk $w.   set sca
9ad0: 6c 69 6e 67 28 24 77 2c 63 75 72 70 6f 73 29 20  ling($w,curpos) 
9ae0: 20 30 0a 20 20 20 73 65 74 20 73 63 61 6c 69 6e   0.   set scalin
9af0: 67 28 24 77 2c 63 75 72 68 70 6f 73 29 20 30 0a  g($w,curhpos) 0.
9b00: 0a 20 20 20 72 65 74 75 72 6e 20 24 6e 65 77 63  .   return $newc
9b10: 68 61 72 74 0a 7d 0a 0a 23 20 63 72 65 61 74 65  hart.}..# create
9b20: 47 61 6e 74 74 63 68 61 72 74 20 2d 2d 0a 23 20  Ganttchart --.# 
9b30: 20 20 20 43 72 65 61 74 65 20 61 20 63 6f 6d 6d     Create a comm
9b40: 61 6e 64 20 66 6f 72 20 64 72 61 77 69 6e 67 20  and for drawing 
9b50: 61 20 47 61 6e 74 74 20 28 70 6c 61 6e 6e 69 6e  a Gantt (plannin
9b60: 67 29 20 63 68 61 72 74 0a 23 20 41 72 67 75 6d  g) chart.# Argum
9b70: 65 6e 74 73 3a 0a 23 20 20 20 20 77 20 20 20 20  ents:.#    w    
9b80: 20 20 20 20 20 20 20 4e 61 6d 65 20 6f 66 20 74         Name of t
9b90: 68 65 20 63 61 6e 76 61 73 0a 23 20 20 20 20 74  he canvas.#    t
9ba0: 69 6d 65 5f 62 65 67 69 6e 20 20 53 74 61 72 74  ime_begin  Start
9bb0: 20 74 69 6d 65 20 28 69 6e 20 74 68 65 20 66 6f   time (in the fo
9bc0: 72 6d 20 6f 66 20 61 20 64 61 74 65 2f 74 69 6d  rm of a date/tim
9bd0: 65 29 0a 23 20 20 20 20 74 69 6d 65 5f 65 6e 64  e).#    time_end
9be0: 20 20 20 20 45 6e 64 20 74 69 6d 65 20 28 69 6e      End time (in
9bf0: 20 74 68 65 20 66 6f 72 6d 20 6f 66 20 61 20 64   the form of a d
9c00: 61 74 65 2f 74 69 6d 65 29 0a 23 20 20 20 20 61  ate/time).#    a
9c10: 72 67 73 20 20 20 20 20 20 20 20 28 46 69 72 73  rgs        (Firs
9c20: 74 20 69 6e 74 65 67 65 72 29 20 4e 75 6d 62 65  t integer) Numbe
9c30: 72 20 6f 66 20 69 74 65 6d 73 20 74 6f 20 62 65  r of items to be
9c40: 20 73 68 6f 77 6e 20 28 64 65 74 65 72 6d 69 6e   shown (determin
9c50: 65 73 20 73 70 61 63 69 6e 67 29 0a 23 20 20 20  es spacing).#   
9c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 65               (Se
9c70: 63 6f 6e 64 20 69 6e 74 65 67 65 72 29 20 45 73  cond integer) Es
9c80: 74 69 6d 61 74 65 64 20 6d 61 78 69 6d 75 6d 20  timated maximum 
9c90: 6c 65 6e 67 74 68 20 6f 66 20 74 65 78 74 20 28  length of text (
9ca0: 64 65 66 61 75 6c 74 3a 20 32 30 29 0a 23 20 20  default: 20).#  
9cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 72                Or
9cc0: 20 6b 65 79 77 6f 72 64 2d 76 61 6c 75 65 20 70   keyword-value p
9cd0: 61 69 72 73 0a 23 20 52 65 73 75 6c 74 3a 0a 23  airs.# Result:.#
9ce0: 20 20 20 20 4e 61 6d 65 20 6f 66 20 61 20 6e 65      Name of a ne
9cf0: 77 20 63 6f 6d 6d 61 6e 64 0a 23 20 4e 6f 74 65  w command.# Note
9d00: 3a 0a 23 20 20 20 20 54 68 65 20 65 6e 74 69 72  :.#    The entir
9d10: 65 20 63 61 6e 76 61 73 20 77 69 6c 6c 20 62 65  e canvas will be
9d20: 20 64 65 64 69 63 61 74 65 64 20 74 6f 20 74 68   dedicated to th
9d30: 65 20 47 61 6e 74 74 20 63 68 61 72 74 2e 0a 23  e Gantt chart..#
9d40: 20 20 20 20 4d 6f 73 74 20 63 6f 6d 6d 61 6e 64      Most command
9d50: 73 20 74 61 6b 65 6e 20 66 72 6f 6d 20 74 69 6d  s taken from tim
9d60: 65 20 63 68 61 72 74 73 2e 0a 23 0a 70 72 6f 63  e charts..#.proc
9d70: 20 3a 3a 50 6c 6f 74 63 68 61 72 74 3a 3a 63 72   ::Plotchart::cr
9d80: 65 61 74 65 47 61 6e 74 74 63 68 61 72 74 20 7b  eateGanttchart {
9d90: 20 77 20 74 69 6d 65 5f 62 65 67 69 6e 20 74 69   w time_begin ti
9da0: 6d 65 5f 65 6e 64 20 61 72 67 73 7d 20 7b 0a 0a  me_end args} {..
9db0: 20 20 20 76 61 72 69 61 62 6c 65 20 64 61 74 61     variable data
9dc0: 5f 73 65 72 69 65 73 0a 20 20 20 76 61 72 69 61  _series.   varia
9dd0: 62 6c 65 20 73 63 61 6c 69 6e 67 0a 0a 20 20 20  ble scaling..   
9de0: 66 6f 72 65 61 63 68 20 73 20 5b 61 72 72 61 79  foreach s [array
9df0: 20 6e 61 6d 65 73 20 64 61 74 61 5f 73 65 72 69   names data_seri
9e00: 65 73 20 22 24 77 2c 2a 22 5d 20 7b 0a 20 20 20  es "$w,*"] {.   
9e10: 20 20 20 75 6e 73 65 74 20 64 61 74 61 5f 73 65     unset data_se
9e20: 72 69 65 73 28 24 73 29 0a 20 20 20 7d 0a 0a 20  ries($s).   }.. 
9e30: 20 20 73 65 74 20 6e 65 77 63 68 61 72 74 20 22    set newchart "
9e40: 67 61 6e 74 74 63 68 61 72 74 5f 24 77 22 0a 20  ganttchart_$w". 
9e50: 20 20 69 6e 74 65 72 70 20 61 6c 69 61 73 20 7b    interp alias {
9e60: 7d 20 24 6e 65 77 63 68 61 72 74 20 7b 7d 20 3a  } $newchart {} :
9e70: 3a 50 6c 6f 74 63 68 61 72 74 3a 3a 50 6c 6f 74  :Plotchart::Plot
9e80: 48 61 6e 64 6c 65 72 20 67 61 6e 74 74 63 68 61  Handler ganttcha
9e90: 72 74 20 24 77 0a 20 20 20 43 6f 70 79 43 6f 6e  rt $w.   CopyCon
9ea0: 66 69 67 20 67 61 6e 74 74 63 68 61 72 74 20 24  fig ganttchart $
9eb0: 77 0a 0a 20 20 20 23 0a 20 20 20 23 20 48 61 6e  w..   #.   # Han
9ec0: 64 6c 65 20 74 68 65 20 61 72 67 75 6d 65 6e 74  dle the argument
9ed0: 73 0a 20 20 20 23 0a 20 20 20 73 65 74 20 62 61  s.   #.   set ba
9ee0: 72 68 65 69 67 68 74 20 20 20 20 30 0a 20 20 20  rheight    0.   
9ef0: 73 65 74 20 6e 6f 69 74 65 6d 73 20 20 20 20 20  set noitems     
9f00: 20 5b 6c 69 6e 64 65 78 20 24 61 72 67 73 20 30   [lindex $args 0
9f10: 5d 0a 0a 20 20 20 69 66 20 7b 20 5b 73 74 72 69  ]..   if { [stri
9f20: 6e 67 20 69 73 20 69 6e 74 65 67 65 72 20 2d 73  ng is integer -s
9f30: 74 72 69 63 74 20 24 6e 6f 69 74 65 6d 73 5d 20  trict $noitems] 
9f40: 7d 20 7b 0a 20 20 20 20 20 20 20 73 65 74 20 61  } {.       set a
9f50: 72 67 73 20 20 20 20 20 20 20 20 5b 6c 72 61 6e  rgs        [lran
9f60: 67 65 20 24 61 72 67 73 20 31 20 65 6e 64 5d 0a  ge $args 1 end].
9f70: 20 20 20 20 20 20 20 73 65 74 20 79 6c 61 62 65         set ylabe
9f80: 6c 77 69 64 74 68 20 5b 6c 69 6e 64 65 78 20 24  lwidth [lindex $
9f90: 61 72 67 73 20 30 5d 0a 20 20 20 20 20 20 20 69  args 0].       i
9fa0: 66 20 7b 20 5b 73 74 72 69 6e 67 20 69 73 20 69  f { [string is i
9fb0: 6e 74 65 67 65 72 20 2d 73 74 72 69 63 74 20 24  nteger -strict $
9fc0: 79 6c 61 62 65 6c 77 69 64 74 68 5d 20 7d 20 7b  ylabelwidth] } {
9fd0: 0a 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20  .           set 
9fe0: 61 72 67 73 20 5b 6c 72 61 6e 67 65 20 24 61 72  args [lrange $ar
9ff0: 67 73 20 31 20 65 6e 64 5d 0a 20 20 20 20 20 20  gs 1 end].      
a000: 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20   } else {.      
a010: 20 20 20 20 20 73 65 74 20 79 6c 61 62 65 6c 77       set ylabelw
a020: 69 64 74 68 20 32 30 0a 20 20 20 20 20 20 20 7d  idth 20.       }
a030: 0a 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20  .   } else {.   
a040: 20 20 20 20 73 65 74 20 79 6c 61 62 65 6c 77 69      set ylabelwi
a050: 64 74 68 20 32 30 0a 20 20 20 7d 0a 0a 20 20 20  dth 20.   }..   
a060: 66 6f 72 65 61 63 68 20 7b 6b 65 79 77 6f 72 64  foreach {keyword
a070: 20 76 61 6c 75 65 7d 20 24 61 72 67 73 20 7b 0a   value} $args {.
a080: 20 20 20 20 20 20 20 73 77 69 74 63 68 20 2d 2d         switch --
a090: 20 24 6b 65 79 77 6f 72 64 20 7b 0a 20 20 20 20   $keyword {.    
a0a0: 20 20 20 20 20 20 20 22 2d 62 61 72 68 65 69 67         "-barheig
a0b0: 68 74 22 20 7b 0a 20 20 20 20 20 20 20 20 20 20  ht" {.          
a0c0: 20 20 20 20 20 20 73 65 74 20 62 61 72 68 65 69        set barhei
a0d0: 67 68 74 20 24 76 61 6c 75 65 0a 20 20 20 20 20  ght $value.     
a0e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
a0f0: 20 20 20 22 2d 79 6c 61 62 65 6c 77 69 64 74 68     "-ylabelwidth
a100: 22 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  " {.            
a110: 20 20 20 20 73 65 74 20 79 6c 61 62 65 6c 77 69      set ylabelwi
a120: 64 74 68 20 5b 65 78 70 72 20 7b 24 76 61 6c 75  dth [expr {$valu
a130: 65 2f 31 30 2e 30 7d 5d 20 3b 23 20 50 69 78 65  e/10.0}] ;# Pixe
a140: 6c 73 20 74 6f 20 63 68 61 72 61 63 74 65 72 73  ls to characters
a150: 0a 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  .           }.  
a160: 20 20 20 20 20 20 20 20 20 64 65 66 61 75 6c 74           default
a170: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
a180: 20 20 20 23 20 49 67 6e 6f 72 65 0a 20 20 20 20     # Ignore.    
a190: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
a1a0: 7d 0a 20 20 20 7d 0a 0a 20 20 20 66 6f 72 65 61  }.   }..   forea
a1b0: 63 68 20 7b 70 78 6d 69 6e 20 70 79 6d 69 6e 20  ch {pxmin pymin 
a1c0: 70 78 6d 61 78 20 70 79 6d 61 78 7d 20 5b 4d 61  pxmax pymax} [Ma
a1d0: 72 67 69 6e 73 52 65 63 74 61 6e 67 6c 65 20 24  rginsRectangle $
a1e0: 77 20 33 20 24 79 6c 61 62 65 6c 77 69 64 74 68  w 3 $ylabelwidth
a1f0: 5d 20 7b 62 72 65 61 6b 7d 0a 0a 20 20 20 69 66  ] {break}..   if
a200: 20 7b 20 24 62 61 72 68 65 69 67 68 74 20 21 3d   { $barheight !=
a210: 20 30 20 7d 20 7b 0a 20 20 20 20 20 20 20 73 65   0 } {.       se
a220: 74 20 6e 6f 69 74 65 6d 73 20 5b 65 78 70 72 20  t noitems [expr 
a230: 7b 28 24 70 78 6d 61 78 2d 24 70 78 6d 69 6e 29  {($pxmax-$pxmin)
a240: 2f 64 6f 75 62 6c 65 28 24 62 61 72 68 65 69 67  /double($barheig
a250: 68 74 29 7d 5d 0a 20 20 20 7d 0a 20 20 20 73 65  ht)}].   }.   se
a260: 74 20 73 63 61 6c 69 6e 67 28 24 77 2c 62 61 72  t scaling($w,bar
a270: 68 65 69 67 68 74 29 20 24 62 61 72 68 65 69 67  height) $barheig
a280: 68 74 0a 0a 20 20 20 73 65 74 20 79 6d 69 6e 20  ht..   set ymin 
a290: 20 30 2e 30 0a 20 20 20 73 65 74 20 79 6d 61 78   0.0.   set ymax
a2a0: 20 20 24 6e 6f 69 74 65 6d 73 0a 0a 20 20 20 73    $noitems..   s
a2b0: 65 74 20 78 6d 69 6e 20 20 5b 65 78 70 72 20 7b  et xmin  [expr {
a2c0: 31 2e 30 2a 5b 63 6c 6f 63 6b 20 73 63 61 6e 20  1.0*[clock scan 
a2d0: 24 74 69 6d 65 5f 62 65 67 69 6e 5d 7d 5d 0a 20  $time_begin]}]. 
a2e0: 20 20 73 65 74 20 78 6d 61 78 20 20 5b 65 78 70    set xmax  [exp
a2f0: 72 20 7b 31 2e 30 2a 5b 63 6c 6f 63 6b 20 73 63  r {1.0*[clock sc
a300: 61 6e 20 24 74 69 6d 65 5f 65 6e 64 5d 7d 5d 0a  an $time_end]}].
a310: 0a 20 20 20 76 69 65 77 50 6f 72 74 20 20 20 20  .   viewPort    
a320: 20 20 20 20 20 24 77 20 24 70 78 6d 69 6e 20 24       $w $pxmin $
a330: 70 79 6d 69 6e 20 24 70 78 6d 61 78 20 24 70 79  pymin $pxmax $py
a340: 6d 61 78 0a 20 20 20 77 6f 72 6c 64 43 6f 6f 72  max.   worldCoor
a350: 64 69 6e 61 74 65 73 20 24 77 20 24 78 6d 69 6e  dinates $w $xmin
a360: 20 20 24 79 6d 69 6e 20 20 24 78 6d 61 78 20 20    $ymin  $xmax  
a370: 24 79 6d 61 78 0a 0a 20 20 20 73 65 74 20 73 63  $ymax..   set sc
a380: 61 6c 69 6e 67 28 24 77 2c 63 75 72 72 65 6e 74  aling($w,current
a390: 29 20 24 79 6d 61 78 0a 20 20 20 73 65 74 20 73  ) $ymax.   set s
a3a0: 63 61 6c 69 6e 67 28 24 77 2c 64 79 29 20 20 20  caling($w,dy)   
a3b0: 20 20 20 2d 30 2e 37 0a 0a 20 20 20 23 0a 20 20     -0.7..   #.  
a3c0: 20 23 20 44 72 61 77 20 74 68 65 20 62 61 63 6b   # Draw the back
a3d0: 67 72 6f 75 6e 64 73 20 28 62 6f 74 68 20 69 6e  grounds (both in
a3e0: 20 74 68 65 20 74 65 78 74 20 70 61 72 74 20 61   the text part a
a3f0: 6e 64 20 74 68 65 0a 20 20 20 23 20 67 72 61 70  nd the.   # grap
a400: 68 69 63 61 6c 20 70 61 72 74 3b 20 74 68 65 20  hical part; the 
a410: 74 65 78 74 20 70 61 72 74 20 68 61 73 20 74 68  text part has th
a420: 65 20 22 73 70 65 63 69 61 6c 22 20 74 61 67 0a  e "special" tag.
a430: 20 20 20 23 20 22 45 64 69 74 22 20 74 6f 20 65     # "Edit" to e
a440: 6e 61 62 6c 65 20 61 20 47 55 49 20 74 6f 20 63  nable a GUI to c
a450: 68 61 6e 67 65 20 74 68 69 6e 67 73 29 0a 20 20  hange things).  
a460: 20 23 0a 20 20 20 73 65 74 20 79 65 6e 64 20 30   #.   set yend 0
a470: 2e 30 0a 20 20 20 66 6f 72 20 7b 20 73 65 74 20  .0.   for { set 
a480: 69 20 30 20 7d 20 7b 20 24 69 20 3c 20 24 6e 6f  i 0 } { $i < $no
a490: 69 74 65 6d 73 20 7d 20 7b 20 69 6e 63 72 20 69  items } { incr i
a4a0: 20 7d 20 7b 0a 20 20 20 20 20 20 20 73 65 74 20   } {.       set 
a4b0: 79 62 65 67 69 6e 20 24 79 65 6e 64 0a 20 20 20  ybegin $yend.   
a4c0: 20 20 20 20 73 65 74 20 79 65 6e 64 20 20 20 5b      set yend   [
a4d0: 65 78 70 72 20 7b 24 79 62 65 67 69 6e 2b 31 2e  expr {$ybegin+1.
a4e0: 30 7d 5d 0a 20 20 20 20 20 20 20 66 6f 72 65 61  0}].       forea
a4f0: 63 68 20 7b 78 31 20 79 31 7d 20 5b 63 6f 6f 72  ch {x1 y1} [coor
a500: 64 73 54 6f 50 69 78 65 6c 20 24 77 20 24 78 6d  dsToPixel $w $xm
a510: 69 6e 20 24 79 62 65 67 69 6e 5d 20 7b 62 72 65  in $ybegin] {bre
a520: 61 6b 7d 0a 20 20 20 20 20 20 20 66 6f 72 65 61  ak}.       forea
a530: 63 68 20 7b 78 32 20 79 32 7d 20 5b 63 6f 6f 72  ch {x2 y2} [coor
a540: 64 73 54 6f 50 69 78 65 6c 20 24 77 20 24 78 6d  dsToPixel $w $xm
a550: 61 78 20 24 79 65 6e 64 20 20 5d 20 7b 62 72 65  ax $yend  ] {bre
a560: 61 6b 7d 0a 0a 20 20 20 20 20 20 20 69 66 20 7b  ak}..       if {
a570: 20 24 69 25 32 20 3d 3d 20 30 20 7d 20 7b 0a 20   $i%2 == 0 } {. 
a580: 20 20 20 20 20 20 20 20 20 20 73 65 74 20 74 61            set ta
a590: 67 20 6f 64 64 0a 20 20 20 20 20 20 20 7d 20 65  g odd.       } e
a5a0: 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20  lse {.          
a5b0: 20 73 65 74 20 74 61 67 20 65 76 65 6e 0a 20 20   set tag even.  
a5c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 24 77       }.       $w
a5d0: 20 63 72 65 61 74 65 20 72 65 63 74 61 6e 67 6c   create rectangl
a5e0: 65 20 30 20 20 20 24 79 31 20 24 78 31 20 24 79  e 0   $y1 $x1 $y
a5f0: 32 20 2d 66 69 6c 6c 20 77 68 69 74 65 20 5c 0a  2 -fill white \.
a600: 20 20 20 20 20 20 20 20 20 20 20 2d 74 61 67 20             -tag 
a610: 7b 45 64 69 74 20 76 65 72 74 73 63 72 6f 6c 6c  {Edit vertscroll
a620: 20 6c 6f 77 65 73 74 7d 20 2d 6f 75 74 6c 69 6e   lowest} -outlin
a630: 65 20 77 68 69 74 65 0a 20 20 20 20 20 20 20 24  e white.       $
a640: 77 20 63 72 65 61 74 65 20 72 65 63 74 61 6e 67  w create rectang
a650: 6c 65 20 24 78 31 20 24 79 31 20 24 78 32 20 24  le $x1 $y1 $x2 $
a660: 79 32 20 2d 66 69 6c 6c 20 77 68 69 74 65 20 5c  y2 -fill white \
a670: 0a 20 20 20 20 20 20 20 20 20 20 20 2d 74 61 67  .           -tag
a680: 20 5b 6c 69 73 74 20 24 74 61 67 20 76 65 72 74   [list $tag vert
a690: 73 63 72 6f 6c 6c 20 6c 6f 77 65 73 74 5d 20 2d  scroll lowest] -
a6a0: 6f 75 74 6c 69 6e 65 20 77 68 69 74 65 0a 20 20  outline white.  
a6b0: 20 7d 0a 0a 20 20 20 23 0a 20 20 20 23 20 44 65   }..   #.   # De
a6c0: 66 61 75 6c 74 20 63 6f 6c 6f 75 72 73 20 61 6e  fault colours an
a6d0: 64 20 66 6f 6e 74 73 0a 20 20 20 23 0a 20 20 20  d fonts.   #.   
a6e0: 47 61 6e 74 74 43 6f 6c 6f 72 20 24 77 20 64 65  GanttColor $w de
a6f0: 73 63 72 69 70 74 69 6f 6e 20 62 6c 61 63 6b 0a  scription black.
a700: 20 20 20 47 61 6e 74 74 43 6f 6c 6f 72 20 24 77     GanttColor $w
a710: 20 63 6f 6d 70 6c 65 74 65 64 20 20 20 6c 69 67   completed   lig
a720: 68 74 62 6c 75 65 0a 20 20 20 47 61 6e 74 74 43  htblue.   GanttC
a730: 6f 6c 6f 72 20 24 77 20 6c 65 66 74 20 20 20 20  olor $w left    
a740: 20 20 20 20 77 68 69 74 65 0a 20 20 20 47 61 6e      white.   Gan
a750: 74 74 43 6f 6c 6f 72 20 24 77 20 6f 64 64 20 20  ttColor $w odd  
a760: 20 20 20 20 20 20 20 77 68 69 74 65 0a 20 20 20         white.   
a770: 47 61 6e 74 74 43 6f 6c 6f 72 20 24 77 20 65 76  GanttColor $w ev
a780: 65 6e 20 20 20 20 20 20 20 20 6c 69 67 68 74 67  en        lightg
a790: 72 65 79 0a 20 20 20 47 61 6e 74 74 43 6f 6c 6f  rey.   GanttColo
a7a0: 72 20 24 77 20 73 75 6d 6d 61 72 79 20 20 20 20  r $w summary    
a7b0: 20 62 6c 61 63 6b 0a 20 20 20 47 61 6e 74 74 43   black.   GanttC
a7c0: 6f 6c 6f 72 20 24 77 20 73 75 6d 6d 61 72 79 62  olor $w summaryb
a7d0: 61 72 20 20 62 6c 61 63 6b 0a 20 20 20 47 61 6e  ar  black.   Gan
a7e0: 74 74 46 6f 6e 74 20 20 24 77 20 64 65 73 63 72  ttFont  $w descr
a7f0: 69 70 74 69 6f 6e 20 22 74 69 6d 65 73 20 31 30  iption "times 10
a800: 22 0a 20 20 20 47 61 6e 74 74 46 6f 6e 74 20 20  ".   GanttFont  
a810: 24 77 20 73 75 6d 6d 61 72 79 20 20 20 20 20 22  $w summary     "
a820: 74 69 6d 65 73 20 31 30 20 62 6f 6c 64 22 0a 20  times 10 bold". 
a830: 20 20 47 61 6e 74 74 46 6f 6e 74 20 20 24 77 20    GanttFont  $w 
a840: 73 63 61 6c 65 20 20 20 20 20 20 20 22 74 69 6d  scale       "tim
a850: 65 73 20 37 22 0a 20 20 20 44 65 66 61 75 6c 74  es 7".   Default
a860: 42 61 6c 6c 6f 6f 6e 20 24 77 0a 0a 20 20 20 44  Balloon $w..   D
a870: 72 61 77 53 63 72 6f 6c 6c 4d 61 73 6b 20 24 77  rawScrollMask $w
a880: 0a 20 20 20 73 65 74 20 73 63 61 6c 69 6e 67 28  .   set scaling(
a890: 24 77 2c 63 75 72 70 6f 73 29 20 20 30 0a 20 20  $w,curpos)  0.  
a8a0: 20 73 65 74 20 73 63 61 6c 69 6e 67 28 24 77 2c   set scaling($w,
a8b0: 63 75 72 68 70 6f 73 29 20 30 0a 0a 20 20 20 72  curhpos) 0..   r
a8c0: 65 74 75 72 6e 20 24 6e 65 77 63 68 61 72 74 0a  eturn $newchart.
a8d0: 7d 0a 0a 23 20 63 72 65 61 74 65 33 44 50 6c 6f  }..# create3DPlo
a8e0: 74 20 2d 2d 0a 23 20 20 20 20 43 72 65 61 74 65  t --.#    Create
a8f0: 20 61 20 73 69 6d 70 6c 65 20 33 44 20 70 6c 6f   a simple 3D plo
a900: 74 0a 23 20 41 72 67 75 6d 65 6e 74 73 3a 0a 23  t.# Arguments:.#
a910: 20 20 20 20 77 20 20 20 20 20 20 20 20 20 20 20      w           
a920: 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 61 6e 76  Name of the canv
a930: 61 73 0a 23 20 20 20 20 78 73 63 61 6c 65 20 20  as.#    xscale  
a940: 20 20 20 20 4d 69 6e 69 6d 75 6d 2c 20 6d 61 78      Minimum, max
a950: 69 6d 75 6d 20 61 6e 64 20 73 74 65 70 20 66 6f  imum and step fo
a960: 72 20 78 2d 61 78 69 73 20 28 69 6e 69 74 69 61  r x-axis (initia
a970: 6c 29 0a 23 20 20 20 20 79 73 63 61 6c 65 20 20  l).#    yscale  
a980: 20 20 20 20 4d 69 6e 69 6d 75 6d 2c 20 6d 61 78      Minimum, max
a990: 69 6d 75 6d 20 61 6e 64 20 73 74 65 70 20 66 6f  imum and step fo
a9a0: 72 20 79 2d 61 78 69 73 0a 23 20 20 20 20 7a 73  r y-axis.#    zs
a9b0: 63 61 6c 65 20 20 20 20 20 20 4d 69 6e 69 6d 75  cale      Minimu
a9c0: 6d 2c 20 6d 61 78 69 6d 75 6d 20 61 6e 64 20 73  m, maximum and s
a9d0: 74 65 70 20 66 6f 72 20 7a 2d 61 78 69 73 0a 23  tep for z-axis.#
a9e0: 20 52 65 73 75 6c 74 3a 0a 23 20 20 20 20 4e 61   Result:.#    Na
a9f0: 6d 65 20 6f 66 20 61 20 6e 65 77 20 63 6f 6d 6d  me of a new comm
aa00: 61 6e 64 0a 23 20 4e 6f 74 65 3a 0a 23 20 20 20  and.# Note:.#   
aa10: 20 54 68 65 20 65 6e 74 69 72 65 20 63 61 6e 76   The entire canv
aa20: 61 73 20 77 69 6c 6c 20 62 65 20 64 65 64 69 63  as will be dedic
aa30: 61 74 65 64 20 74 6f 20 74 68 65 20 33 44 20 70  ated to the 3D p
aa40: 6c 6f 74 0a 23 0a 70 72 6f 63 20 3a 3a 50 6c 6f  lot.#.proc ::Plo
aa50: 74 63 68 61 72 74 3a 3a 63 72 65 61 74 65 33 44  tchart::create3D
aa60: 50 6c 6f 74 20 7b 20 77 20 78 73 63 61 6c 65 20  Plot { w xscale 
aa70: 79 73 63 61 6c 65 20 7a 73 63 61 6c 65 20 7d 20  yscale zscale } 
aa80: 7b 0a 20 20 20 76 61 72 69 61 62 6c 65 20 64 61  {.   variable da
aa90: 74 61 5f 73 65 72 69 65 73 0a 0a 20 20 20 66 6f  ta_series..   fo
aaa0: 72 65 61 63 68 20 73 20 5b 61 72 72 61 79 20 6e  reach s [array n
aab0: 61 6d 65 73 20 64 61 74 61 5f 73 65 72 69 65 73  ames data_series
aac0: 20 22 24 77 2c 2a 22 5d 20 7b 0a 20 20 20 20 20   "$w,*"] {.     
aad0: 20 75 6e 73 65 74 20 64 61 74 61 5f 73 65 72 69   unset data_seri
aae0: 65 73 28 24 73 29 0a 20 20 20 7d 0a 0a 20 20 20  es($s).   }..   
aaf0: 73 65 74 20 6e 65 77 63 68 61 72 74 20 22 33 64  set newchart "3d
ab00: 70 6c 6f 74 5f 24 77 22 0a 20 20 20 69 6e 74 65  plot_$w".   inte
ab10: 72 70 20 61 6c 69 61 73 20 7b 7d 20 24 6e 65 77  rp alias {} $new
ab20: 63 68 61 72 74 20 7b 7d 20 3a 3a 50 6c 6f 74 63  chart {} ::Plotc
ab30: 68 61 72 74 3a 3a 50 6c 6f 74 48 61 6e 64 6c 65  hart::PlotHandle
ab40: 72 20 33 64 70 6c 6f 74 20 24 77 0a 20 20 20 43  r 3dplot $w.   C
ab50: 6f 70 79 43 6f 6e 66 69 67 20 33 64 70 6c 6f 74  opyConfig 3dplot
ab60: 20 24 77 0a 0a 20 20 20 66 6f 72 65 61 63 68 20   $w..   foreach 
ab70: 7b 70 78 6d 69 6e 20 70 79 6d 69 6e 20 70 78 6d  {pxmin pymin pxm
ab80: 61 78 20 70 79 6d 61 78 7d 20 5b 4d 61 72 67 69  ax pymax} [Margi
ab90: 6e 73 33 44 50 6c 6f 74 20 24 77 5d 20 7b 62 72  ns3DPlot $w] {br
aba0: 65 61 6b 7d 0a 0a 20 20 20 66 6f 72 65 61 63 68  eak}..   foreach
abb0: 20 7b 78 6d 69 6e 20 78 6d 61 78 20 78 73 74 65   {xmin xmax xste
abc0: 70 7d 20 24 78 73 63 61 6c 65 20 7b 62 72 65 61  p} $xscale {brea
abd0: 6b 7d 0a 20 20 20 66 6f 72 65 61 63 68 20 7b 79  k}.   foreach {y
abe0: 6d 69 6e 20 79 6d 61 78 20 79 73 74 65 70 7d 20  min ymax ystep} 
abf0: 24 79 73 63 61 6c 65 20 7b 62 72 65 61 6b 7d 0a  $yscale {break}.
ac00: 20 20 20 66 6f 72 65 61 63 68 20 7b 7a 6d 69 6e     foreach {zmin
ac10: 20 7a 6d 61 78 20 7a 73 74 65 70 7d 20 24 7a 73   zmax zstep} $zs
ac20: 63 61 6c 65 20 7b 62 72 65 61 6b 7d 0a 0a 20 20  cale {break}..  
ac30: 20 76 69 65 77 50 6f 72 74 20 20 20 20 20 20 20   viewPort       
ac40: 20 20 20 20 24 77 20 24 70 78 6d 69 6e 20 24 70      $w $pxmin $p
ac50: 79 6d 69 6e 20 24 70 78 6d 61 78 20 24 70 79 6d  ymin $pxmax $pym
ac60: 61 78 0a 20 20 20 77 6f 72 6c 64 33 44 43 6f 6f  ax.   world3DCoo
ac70: 72 64 69 6e 61 74 65 73 20 24 77 20 24 78 6d 69  rdinates $w $xmi
ac80: 6e 20 20 24 79 6d 69 6e 20 20 24 7a 6d 69 6e 20  n  $ymin  $zmin 
ac90: 20 24 78 6d 61 78 20 20 24 79 6d 61 78 20 24 7a   $xmax  $ymax $z
aca0: 6d 61 78 0a 0a 20 20 20 44 72 61 77 33 44 41 78  max..   Draw3DAx
acb0: 65 73 20 20 20 20 20 20 20 20 20 24 77 20 24 78  es         $w $x
acc0: 6d 69 6e 20 20 24 79 6d 69 6e 20 20 24 7a 6d 69  min  $ymin  $zmi
acd0: 6e 20 20 24 78 6d 61 78 20 20 24 79 6d 61 78 20  n  $xmax  $ymax 
ace0: 24 7a 6d 61 78 20 5c 0a 20 20 20 20 20 20 20 20  $zmax \.        
acf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ad00: 20 24 78 73 74 65 70 20 24 79 73 74 65 70 20 24   $xstep $ystep $
ad10: 7a 73 74 65 70 0a 20 20 20 44 65 66 61 75 6c 74  zstep.   Default
ad20: 4c 65 67 65 6e 64 20 20 20 20 20 20 24 77 0a 20  Legend      $w. 
ad30: 20 20 44 65 66 61 75 6c 74 42 61 6c 6c 6f 6f 6e    DefaultBalloon
ad40: 20 20 20 20 20 24 77 0a 0a 20 20 20 53 65 74 43       $w..   SetC
ad50: 6f 6c 6f 75 72 73 20 24 77 20 67 72 65 79 20 62  olours $w grey b
ad60: 6c 61 63 6b 0a 0a 20 20 20 72 65 74 75 72 6e 20  lack..   return 
ad70: 24 6e 65 77 63 68 61 72 74 0a 7d 0a 0a 23 20 63  $newchart.}..# c
ad80: 72 65 61 74 65 33 44 42 61 72 63 68 61 72 74 20  reate3DBarchart 
ad90: 2d 2d 0a 23 20 20 20 20 43 72 65 61 74 65 20 61  --.#    Create a
ada0: 20 63 6f 6d 6d 61 6e 64 20 66 6f 72 20 64 72 61   command for dra
adb0: 77 69 6e 67 20 61 20 62 61 72 63 68 61 72 74 20  wing a barchart 
adc0: 77 69 74 68 20 76 65 72 74 69 63 61 6c 20 33 44  with vertical 3D
add0: 20 62 61 72 73 0a 23 20 41 72 67 75 6d 65 6e 74   bars.# Argument
ade0: 73 3a 0a 23 20 20 20 20 77 20 20 20 20 20 20 20  s:.#    w       
adf0: 20 20 20 20 4e 61 6d 65 20 6f 66 20 74 68 65 20      Name of the 
ae00: 63 61 6e 76 61 73 0a 23 20 20 20 20 79 73 63 61  canvas.#    ysca
ae10: 6c 65 20 20 20 20 20 20 4d 69 6e 69 6d 75 6d 2c  le      Minimum,
ae20: 20 6d 61 78 69 6d 75 6d 20 61 6e 64 20 73 74 65   maximum and ste
ae30: 70 20 66 6f 72 20 79 2d 61 78 69 73 0a 23 20 20  p for y-axis.#  
ae40: 20 20 6e 6f 62 61 72 73 20 20 20 20 20 20 4e 75    nobars      Nu
ae50: 6d 62 65 72 20 6f 66 20 62 61 72 73 20 74 6f 20  mber of bars to 
ae60: 62 65 20 64 72 61 77 6e 0a 23 20 52 65 73 75 6c  be drawn.# Resul
ae70: 74 3a 0a 23 20 20 20 20 4e 61 6d 65 20 6f 66 20  t:.#    Name of 
ae80: 61 20 6e 65 77 20 63 6f 6d 6d 61 6e 64 0a 23 20  a new command.# 
ae90: 4e 6f 74 65 3a 0a 23 20 20 20 20 54 68 65 20 65  Note:.#    The e
aea0: 6e 74 69 72 65 20 63 61 6e 76 61 73 20 77 69 6c  ntire canvas wil
aeb0: 6c 20 62 65 20 64 65 64 69 63 61 74 65 64 20 74  l be dedicated t
aec0: 6f 20 74 68 65 20 62 61 72 63 68 61 72 74 2e 0a  o the barchart..
aed0: 23 0a 70 72 6f 63 20 3a 3a 50 6c 6f 74 63 68 61  #.proc ::Plotcha
aee0: 72 74 3a 3a 63 72 65 61 74 65 33 44 42 61 72 63  rt::create3DBarc
aef0: 68 61 72 74 20 7b 20 77 20 79 73 63 61 6c 65 20  hart { w yscale 
af00: 6e 6f 62 61 72 73 20 7d 20 7b 0a 20 20 20 76 61  nobars } {.   va
af10: 72 69 61 62 6c 65 20 64 61 74 61 5f 73 65 72 69  riable data_seri
af20: 65 73 0a 0a 20 20 20 66 6f 72 65 61 63 68 20 73  es..   foreach s
af30: 20 5b 61 72 72 61 79 20 6e 61 6d 65 73 20 64 61   [array names da
af40: 74 61 5f 73 65 72 69 65 73 20 22 24 77 2c 2a 22  ta_series "$w,*"
af50: 5d 20 7b 0a 20 20 20 20 20 20 75 6e 73 65 74 20  ] {.      unset 
af60: 64 61 74 61 5f 73 65 72 69 65 73 28 24 73 29 0a  data_series($s).
af70: 20 20 20 7d 0a 0a 20 20 20 73 65 74 20 6e 65 77     }..   set new
af80: 63 68 61 72 74 20 22 33 64 62 61 72 63 68 61 72  chart "3dbarchar
af90: 74 5f 24 77 22 0a 20 20 20 69 6e 74 65 72 70 20  t_$w".   interp 
afa0: 61 6c 69 61 73 20 7b 7d 20 24 6e 65 77 63 68 61  alias {} $newcha
afb0: 72 74 20 7b 7d 20 3a 3a 50 6c 6f 74 63 68 61 72  rt {} ::Plotchar
afc0: 74 3a 3a 50 6c 6f 74 48 61 6e 64 6c 65 72 20 33  t::PlotHandler 3
afd0: 64 62 61 72 73 20 24 77 0a 20 20 20 43 6f 70 79  dbars $w.   Copy
afe0: 43 6f 6e 66 69 67 20 33 64 62 61 72 73 20 24 77  Config 3dbars $w
aff0: 0a 0a 20 20 20 66 6f 72 65 61 63 68 20 7b 70 78  ..   foreach {px
b000: 6d 69 6e 20 70 79 6d 69 6e 20 70 78 6d 61 78 20  min pymin pxmax 
b010: 70 79 6d 61 78 7d 20 5b 4d 61 72 67 69 6e 73 52  pymax} [MarginsR
b020: 65 63 74 61 6e 67 6c 65 20 24 77 20 34 5d 20 7b  ectangle $w 4] {
b030: 62 72 65 61 6b 7d 0a 0a 20 20 20 73 65 74 20 78  break}..   set x
b040: 6d 69 6e 20 20 30 2e 30 0a 20 20 20 73 65 74 20  min  0.0.   set 
b050: 78 6d 61 78 20 20 5b 65 78 70 72 20 7b 24 6e 6f  xmax  [expr {$no
b060: 62 61 72 73 20 2b 20 30 2e 31 7d 5d 0a 0a 20 20  bars + 0.1}]..  
b070: 20 66 6f 72 65 61 63 68 20 7b 79 6d 69 6e 20 79   foreach {ymin y
b080: 6d 61 78 20 79 64 65 6c 74 7d 20 24 79 73 63 61  max ydelt} $ysca
b090: 6c 65 20 7b 62 72 65 61 6b 7d 0a 0a 20 20 20 69  le {break}..   i
b0a0: 66 20 7b 20 24 79 64 65 6c 74 20 3d 3d 20 30 2e  f { $ydelt == 0.
b0b0: 30 20 7d 20 7b 0a 20 20 20 20 20 20 72 65 74 75  0 } {.      retu
b0c0: 72 6e 20 2d 63 6f 64 65 20 65 72 72 6f 72 20 22  rn -code error "
b0d0: 53 74 65 70 20 73 69 7a 65 20 63 61 6e 20 6e 6f  Step size can no
b0e0: 74 20 62 65 20 7a 65 72 6f 22 0a 20 20 20 7d 0a  t be zero".   }.
b0f0: 0a 20 20 20 69 66 20 7b 20 28 24 79 6d 61 78 2d  .   if { ($ymax-
b100: 24 79 6d 69 6e 29 2a 24 79 64 65 6c 74 20 3c 20  $ymin)*$ydelt < 
b110: 30 2e 30 20 7d 20 7b 0a 20 20 20 20 20 20 73 65  0.0 } {.      se
b120: 74 20 79 64 65 6c 74 20 5b 65 78 70 72 20 7b 2d  t ydelt [expr {-
b130: 24 79 64 65 6c 74 7d 5d 0a 20 20 20 7d 0a 0a 20  $ydelt}].   }.. 
b140: 20 20 76 69 65 77 50 6f 72 74 20 20 20 20 20 20    viewPort      
b150: 20 20 20 24 77 20 24 70 78 6d 69 6e 20 24 70 79     $w $pxmin $py
b160: 6d 69 6e 20 24 70 78 6d 61 78 20 24 70 79 6d 61  min $pxmax $pyma
b170: 78 0a 20 20 20 77 6f 72 6c 64 43 6f 6f 72 64 69  x.   worldCoordi
b180: 6e 61 74 65 73 20 24 77 20 24 78 6d 69 6e 20 20  nates $w $xmin  
b190: 24 79 6d 69 6e 20 20 24 78 6d 61 78 20 20 24 79  $ymin  $xmax  $y
b1a0: 6d 61 78 0a 0a 20 20 20 44 72 61 77 59 61 78 69  max..   DrawYaxi
b1b0: 73 20 20 20 20 20 20 20 20 24 77 20 24 79 6d 69  s        $w $ymi
b1c0: 6e 20 20 24 79 6d 61 78 20 20 24 79 64 65 6c 74  n  $ymax  $ydelt
b1d0: 0a 20 20 23 44 72 61 77 4d 61 73 6b 20 20 20 20  .  #DrawMask    
b1e0: 20 20 20 20 20 24 77 20 2d 2d 20 6e 6f 6e 65 21       $w -- none!
b1f0: 0a 20 20 20 44 72 61 77 33 44 42 61 72 63 68 61  .   Draw3DBarcha
b200: 72 74 20 20 20 24 77 20 24 79 73 63 61 6c 65 20  rt   $w $yscale 
b210: 24 6e 6f 62 61 72 73 0a 20 20 20 44 65 66 61 75  $nobars.   Defau
b220: 6c 74 4c 65 67 65 6e 64 20 20 20 20 24 77 0a 20  ltLegend    $w. 
b230: 20 20 44 65 66 61 75 6c 74 42 61 6c 6c 6f 6f 6e    DefaultBalloon
b240: 20 20 20 24 77 0a 0a 20 20 20 72 65 74 75 72 6e     $w..   return
b250: 20 24 6e 65 77 63 68 61 72 74 0a 7d 0a 0a 23 20   $newchart.}..# 
b260: 63 72 65 61 74 65 52 61 64 69 61 6c 63 68 61 72  createRadialchar
b270: 74 20 2d 2d 0a 23 20 20 20 20 43 72 65 61 74 65  t --.#    Create
b280: 20 61 20 63 6f 6d 6d 61 6e 64 20 66 6f 72 20 64   a command for d
b290: 72 61 77 69 6e 67 20 61 20 72 61 64 69 61 6c 20  rawing a radial 
b2a0: 63 68 61 72 74 0a 23 20 41 72 67 75 6d 65 6e 74  chart.# Argument
b2b0: 73 3a 0a 23 20 20 20 20 77 20 20 20 20 20 20 20  s:.#    w       
b2c0: 20 20 20 20 4e 61 6d 65 20 6f 66 20 74 68 65 20      Name of the 
b2d0: 63 61 6e 76 61 73 0a 23 20 20 20 20 6e 61 6d 65  canvas.#    name
b2e0: 73 20 20 20 20 20 20 20 4e 61 6d 65 73 20 6f 66  s       Names of
b2f0: 20 74 68 65 20 73 70 6f 6b 65 73 0a 23 20 20 20   the spokes.#   
b300: 20 73 63 61 6c 65 20 20 20 20 20 20 20 53 63 61   scale       Sca
b310: 6c 65 20 66 61 63 74 6f 72 20 66 6f 72 20 74 68  le factor for th
b320: 65 20 64 61 74 61 0a 23 20 20 20 20 73 74 79 6c  e data.#    styl
b330: 65 20 20 20 20 20 20 20 28 4f 70 74 69 6f 6e 61  e       (Optiona
b340: 6c 29 20 73 74 79 6c 65 20 6f 66 20 74 68 65 20  l) style of the 
b350: 63 68 61 72 74 20 28 6c 69 6e 65 73 2c 20 63 75  chart (lines, cu
b360: 6d 75 6c 61 74 69 76 65 20 6f 72 20 66 69 6c 6c  mulative or fill
b370: 65 64 29 0a 23 20 52 65 73 75 6c 74 3a 0a 23 20  ed).# Result:.# 
b380: 20 20 20 4e 61 6d 65 20 6f 66 20 61 20 6e 65 77     Name of a new
b390: 20 63 6f 6d 6d 61 6e 64 0a 23 20 4e 6f 74 65 3a   command.# Note:
b3a0: 0a 23 20 20 20 20 54 68 65 20 65 6e 74 69 72 65  .#    The entire
b3b0: 20 63 61 6e 76 61 73 20 77 69 6c 6c 20 62 65 20   canvas will be 
b3c0: 64 65 64 69 63 61 74 65 64 20 74 6f 20 74 68 65  dedicated to the
b3d0: 20 72 61 64 69 61 6c 20 63 68 61 72 74 2e 0a 23   radial chart..#
b3e0: 0a 70 72 6f 63 20 3a 3a 50 6c 6f 74 63 68 61 72  .proc ::Plotchar
b3f0: 74 3a 3a 63 72 65 61 74 65 52 61 64 69 61 6c 63  t::createRadialc
b400: 68 61 72 74 20 7b 20 77 20 6e 61 6d 65 73 20 73  hart { w names s
b410: 63 61 6c 65 20 7b 73 74 79 6c 65 20 6c 69 6e 65  cale {style line
b420: 73 7d 20 7d 20 7b 0a 20 20 20 76 61 72 69 61 62  s} } {.   variab
b430: 6c 65 20 73 65 74 74 69 6e 67 73 0a 20 20 20 76  le settings.   v
b440: 61 72 69 61 62 6c 65 20 64 61 74 61 5f 73 65 72  ariable data_ser
b450: 69 65 73 0a 0a 20 20 20 66 6f 72 65 61 63 68 20  ies..   foreach 
b460: 73 20 5b 61 72 72 61 79 20 6e 61 6d 65 73 20 64  s [array names d
b470: 61 74 61 5f 73 65 72 69 65 73 20 22 24 77 2c 2a  ata_series "$w,*
b480: 22 5d 20 7b 0a 20 20 20 20 20 20 75 6e 73 65 74  "] {.      unset
b490: 20 64 61 74 61 5f 73 65 72 69 65 73 28 24 73 29   data_series($s)
b4a0: 0a 20 20 20 7d 0a 0a 20 20 20 73 65 74 20 6e 65  .   }..   set ne
b4b0: 77 63 68 61 72 74 20 22 72 61 64 69 61 6c 63 68  wchart "radialch
b4c0: 61 72 74 5f 24 77 22 0a 20 20 20 69 6e 74 65 72  art_$w".   inter
b4d0: 70 20 61 6c 69 61 73 20 7b 7d 20 24 6e 65 77 63  p alias {} $newc
b4e0: 68 61 72 74 20 7b 7d 20 3a 3a 50 6c 6f 74 63 68  hart {} ::Plotch
b4f0: 61 72 74 3a 3a 50 6c 6f 74 48 61 6e 64 6c 65 72  art::PlotHandler
b500: 20 72 61 64 69 61 6c 63 68 61 72 74 20 24 77 0a   radialchart $w.
b510: 20 20 20 43 6f 70 79 43 6f 6e 66 69 67 20 72 61     CopyConfig ra
b520: 64 69 61 6c 63 68 61 72 74 20 24 77 0a 0a 20 20  dialchart $w..  
b530: 20 66 6f 72 65 61 63 68 20 7b 70 78 6d 69 6e 20   foreach {pxmin 
b540: 70 79 6d 69 6e 20 70 78 6d 61 78 20 70 79 6d 61  pymin pxmax pyma
b550: 78 7d 20 5b 4d 61 72 67 69 6e 73 43 69 72 63 6c  x} [MarginsCircl
b560: 65 20 24 77 5d 20 7b 62 72 65 61 6b 7d 0a 0a 20  e $w] {break}.. 
b570: 20 20 76 69 65 77 50 6f 72 74 20 24 77 20 24 70    viewPort $w $p
b580: 78 6d 69 6e 20 24 70 79 6d 69 6e 20 24 70 78 6d  xmin $pymin $pxm
b590: 61 78 20 24 70 79 6d 61 78 0a 20 20 20 24 77 20  ax $pymax.   $w 
b5a0: 63 72 65 61 74 65 20 6f 76 61 6c 20 24 70 78 6d  create oval $pxm
b5b0: 69 6e 20 24 70 79 6d 69 6e 20 24 70 78 6d 61 78  in $pymin $pxmax
b5c0: 20 24 70 79 6d 61 78 0a 0a 20 20 20 73 65 74 20   $pymax..   set 
b5d0: 73 65 74 74 69 6e 67 73 28 24 77 2c 73 63 61 6c  settings($w,scal
b5e0: 65 29 20 20 5b 65 78 70 72 20 7b 64 6f 75 62 6c  e)  [expr {doubl
b5f0: 65 28 24 73 63 61 6c 65 29 7d 5d 0a 20 20 20 73  e($scale)}].   s
b600: 65 74 20 73 65 74 74 69 6e 67 73 28 24 77 2c 73  et settings($w,s
b610: 74 79 6c 65 29 20 20 24 73 74 79 6c 65 0a 20 20  tyle)  $style.  
b620: 20 73 65 74 20 73 65 74 74 69 6e 67 73 28 24 77   set settings($w
b630: 2c 6e 75 6d 62 65 72 29 20 5b 6c 6c 65 6e 67 74  ,number) [llengt
b640: 68 20 24 6e 61 6d 65 73 5d 0a 0a 20 20 20 44 72  h $names]..   Dr
b650: 61 77 52 61 64 69 61 6c 53 70 6f 6b 65 73 20 24  awRadialSpokes $
b660: 77 20 24 6e 61 6d 65 73 0a 20 20 20 44 65 66 61  w $names.   Defa
b670: 75 6c 74 4c 65 67 65 6e 64 20 20 24 77 0a 20 20  ultLegend  $w.  
b680: 20 44 65 66 61 75 6c 74 42 61 6c 6c 6f 6f 6e 20   DefaultBalloon 
b690: 24 77 0a 0a 20 20 20 72 65 74 75 72 6e 20 24 6e  $w..   return $n
b6a0: 65 77 63 68 61 72 74 0a 7d 0a 0a 23 20 63 72 65  ewchart.}..# cre
b6b0: 61 74 65 54 58 50 6c 6f 74 20 2d 2d 0a 23 20 20  ateTXPlot --.#  
b6c0: 20 20 43 72 65 61 74 65 20 61 20 63 6f 6d 6d 61    Create a comma
b6d0: 6e 64 20 66 6f 72 20 64 72 61 77 69 6e 67 20 61  nd for drawing a
b6e0: 20 54 58 20 70 6c 6f 74 20 28 78 20 76 65 72 73   TX plot (x vers
b6f0: 75 73 20 64 61 74 65 2f 74 69 6d 65 29 0a 23 20  us date/time).# 
b700: 41 72 67 75 6d 65 6e 74 73 3a 0a 23 20 20 20 20  Arguments:.#    
b710: 77 20 20 20 20 20 20 20 20 20 20 20 4e 61 6d 65  w           Name
b720: 20 6f 66 20 74 68 65 20 63 61 6e 76 61 73 0a 23   of the canvas.#
b730: 20 20 20 20 74 73 63 61 6c 65 20 20 20 20 20 20      tscale      
b740: 4d 69 6e 69 6d 75 6d 2c 20 6d 61 78 69 6d 75 6d  Minimum, maximum
b750: 20 61 6e 64 20 73 74 65 70 20 66 6f 72 20 64 61   and step for da
b760: 74 65 2f 74 69 6d 65 2d 61 78 69 73 20 28 69 6e  te/time-axis (in
b770: 69 74 69 61 6c 29 0a 23 20 20 20 20 20 20 20 20  itial).#        
b780: 20 20 20 20 20 20 20 20 28 76 61 6c 75 65 73 20          (values 
b790: 6d 75 73 74 20 62 65 20 76 61 6c 69 64 20 64 61  must be valid da
b7a0: 74 65 73 20 61 6e 64 20 74 68 65 20 73 74 65 70  tes and the step
b7b0: 20 69 73 20 69 6e 20 64 61 79 73 29 0a 23 20 20   is in days).#  
b7c0: 20 20 78 73 63 61 6c 65 20 20 20 20 20 20 4d 69    xscale      Mi
b7d0: 6e 69 6d 75 6d 2c 20 6d 61 78 69 6d 75 6d 20 61  nimum, maximum a
b7e0: 6e 64 20 73 74 65 70 20 66 6f 72 20 76 65 72 74  nd step for vert
b7f0: 69 63 61 6c 20 61 78 69 73 0a 23 20 52 65 73 75  ical axis.# Resu
b800: 6c 74 3a 0a 23 20 20 20 20 4e 61 6d 65 20 6f 66  lt:.#    Name of
b810: 20 61 20 6e 65 77 20 63 6f 6d 6d 61 6e 64 0a 23   a new command.#
b820: 20 4e 6f 74 65 3a 0a 23 20 20 20 20 54 68 65 20   Note:.#    The 
b830: 65 6e 74 69 72 65 20 63 61 6e 76 61 73 20 77 69  entire canvas wi
b840: 6c 6c 20 62 65 20 64 65 64 69 63 61 74 65 64 20  ll be dedicated 
b850: 74 6f 20 74 68 65 20 54 58 20 70 6c 6f 74 2e 0a  to the TX plot..
b860: 23 20 20 20 20 54 68 65 20 70 6c 6f 74 20 77 69  #    The plot wi
b870: 6c 6c 20 62 65 20 64 72 61 77 6e 20 77 69 74 68  ll be drawn with
b880: 20 61 78 65 73 0a 23 0a 70 72 6f 63 20 3a 3a 50   axes.#.proc ::P
b890: 6c 6f 74 63 68 61 72 74 3a 3a 63 72 65 61 74 65  lotchart::create
b8a0: 54 58 50 6c 6f 74 20 7b 20 77 20 74 73 63 61 6c  TXPlot { w tscal
b8b0: 65 20 78 73 63 61 6c 65 20 7d 20 7b 0a 20 20 20  e xscale } {.   
b8c0: 76 61 72 69 61 62 6c 65 20 64 61 74 61 5f 73 65  variable data_se
b8d0: 72 69 65 73 0a 0a 20 20 20 66 6f 72 65 61 63 68  ries..   foreach
b8e0: 20 73 20 5b 61 72 72 61 79 20 6e 61 6d 65 73 20   s [array names 
b8f0: 64 61 74 61 5f 73 65 72 69 65 73 20 22 24 77 2c  data_series "$w,
b900: 2a 22 5d 20 7b 0a 20 20 20 20 20 20 75 6e 73 65  *"] {.      unse
b910: 74 20 64 61 74 61 5f 73 65 72 69 65 73 28 24 73  t data_series($s
b920: 29 0a 20 20 20 7d 0a 0a 20 20 20 73 65 74 20 6e  ).   }..   set n
b930: 65 77 63 68 61 72 74 20 22 74 78 70 6c 6f 74 5f  ewchart "txplot_
b940: 24 77 22 0a 20 20 20 69 6e 74 65 72 70 20 61 6c  $w".   interp al
b950: 69 61 73 20 7b 7d 20 24 6e 65 77 63 68 61 72 74  ias {} $newchart
b960: 20 7b 7d 20 3a 3a 50 6c 6f 74 63 68 61 72 74 3a   {} ::Plotchart:
b970: 3a 50 6c 6f 74 48 61 6e 64 6c 65 72 20 74 78 70  :PlotHandler txp
b980: 6c 6f 74 20 24 77 0a 20 20 20 43 6f 70 79 43 6f  lot $w.   CopyCo
b990: 6e 66 69 67 20 74 78 70 6c 6f 74 20 24 77 0a 0a  nfig txplot $w..
b9a0: 20 20 20 66 6f 72 65 61 63 68 20 7b 70 78 6d 69     foreach {pxmi
b9b0: 6e 20 70 79 6d 69 6e 20 70 78 6d 61 78 20 70 79  n pymin pxmax py
b9c0: 6d 61 78 7d 20 5b 4d 61 72 67 69 6e 73 52 65 63  max} [MarginsRec
b9d0: 74 61 6e 67 6c 65 20 24 77 5d 20 7b 62 72 65 61  tangle $w] {brea
b9e0: 6b 7d 0a 0a 20 20 20 66 6f 72 65 61 63 68 20 7b  k}..   foreach {
b9f0: 74 6d 69 6e 20 74 6d 61 78 20 74 64 65 6c 74 7d  tmin tmax tdelt}
ba00: 20 24 74 73 63 61 6c 65 20 7b 62 72 65 61 6b 7d   $tscale {break}
ba10: 0a 0a 20 20 20 73 65 74 20 78 6d 69 6e 20 20 5b  ..   set xmin  [
ba20: 63 6c 6f 63 6b 20 73 63 61 6e 20 24 74 6d 69 6e  clock scan $tmin
ba30: 5d 0a 20 20 20 73 65 74 20 78 6d 61 78 20 20 5b  ].   set xmax  [
ba40: 63 6c 6f 63 6b 20 73 63 61 6e 20 24 74 6d 61 78  clock scan $tmax
ba50: 5d 0a 20 20 20 73 65 74 20 78 64 65 6c 74 20 5b  ].   set xdelt [
ba60: 65 78 70 72 20 7b 38 36 34 30 30 2a 24 74 64 65  expr {86400*$tde
ba70: 6c 74 7d 5d 0a 0a 20 20 20 66 6f 72 65 61 63 68  lt}]..   foreach
ba80: 20 7b 79 6d 69 6e 20 79 6d 61 78 20 79 64 65 6c   {ymin ymax ydel
ba90: 74 7d 20 24 78 73 63 61 6c 65 20 7b 62 72 65 61  t} $xscale {brea
baa0: 6b 7d 0a 0a 20 20 20 69 66 20 7b 20 24 78 64 65  k}..   if { $xde
bab0: 6c 74 20 3d 3d 20 30 2e 30 20 7c 7c 20 24 79 64  lt == 0.0 || $yd
bac0: 65 6c 74 20 3d 3d 20 30 2e 30 20 7d 20 7b 0a 20  elt == 0.0 } {. 
bad0: 20 20 20 20 20 72 65 74 75 72 6e 20 2d 63 6f 64       return -cod
bae0: 65 20 65 72 72 6f 72 20 22 53 74 65 70 20 73 69  e error "Step si
baf0: 7a 65 20 63 61 6e 20 6e 6f 74 20 62 65 20 7a 65  ze can not be ze
bb00: 72 6f 22 0a 20 20 20 7d 0a 0a 20 20 20 69 66 20  ro".   }..   if 
bb10: 7b 20 28 24 78 6d 61 78 2d 24 78 6d 69 6e 29 2a  { ($xmax-$xmin)*
bb20: 24 78 64 65 6c 74 20 3c 20 30 2e 30 20 7d 20 7b  $xdelt < 0.0 } {
bb30: 0a 20 20 20 20 20 20 73 65 74 20 78 64 65 6c 74  .      set xdelt
bb40: 20 5b 65 78 70 72 20 7b 2d 24 78 64 65 6c 74 7d   [expr {-$xdelt}
bb50: 5d 0a 20 20 20 7d 0a 20 20 20 69 66 20 7b 20 28  ].   }.   if { (
bb60: 24 79 6d 61 78 2d 24 79 6d 69 6e 29 2a 24 79 64  $ymax-$ymin)*$yd
bb70: 65 6c 74 20 3c 20 30 2e 30 20 7d 20 7b 0a 20 20  elt < 0.0 } {.  
bb80: 20 20 20 20 73 65 74 20 79 64 65 6c 74 20 5b 65      set ydelt [e
bb90: 78 70 72 20 7b 2d 24 79 64 65 6c 74 7d 5d 0a 20  xpr {-$ydelt}]. 
bba0: 20 20 7d 0a 0a 20 20 20 76 69 65 77 50 6f 72 74    }..   viewPort
bbb0: 20 20 20 20 20 20 20 20 20 24 77 20 24 70 78 6d           $w $pxm
bbc0: 69 6e 20 24 70 79 6d 69 6e 20 24 70 78 6d 61 78  in $pymin $pxmax
bbd0: 20 24 70 79 6d 61 78 0a 20 20 20 77 6f 72 6c 64   $pymax.   world
bbe0: 43 6f 6f 72 64 69 6e 61 74 65 73 20 24 77 20 24  Coordinates $w $
bbf0: 78 6d 69 6e 20 20 24 79 6d 69 6e 20 20 24 78 6d  xmin  $ymin  $xm
bc00: 61 78 20 20 24 79 6d 61 78 0a 0a 20 20 20 44 72  ax  $ymax..   Dr
bc10: 61 77 59 61 78 69 73 20 20 20 20 20 20 20 20 24  awYaxis        $
bc20: 77 20 24 79 6d 69 6e 20 20 24 79 6d 61 78 20 20  w $ymin  $ymax  
bc30: 24 79 64 65 6c 74 0a 20 20 20 44 72 61 77 54 69  $ydelt.   DrawTi
bc40: 6d 65 61 78 69 73 20 20 20 20 20 24 77 20 24 74  meaxis     $w $t
bc50: 6d 69 6e 20 20 24 74 6d 61 78 20 20 24 74 64 65  min  $tmax  $tde
bc60: 6c 74 0a 20 20 20 44 72 61 77 4d 61 73 6b 20 20  lt.   DrawMask  
bc70: 20 20 20 20 20 20 20 24 77 0a 20 20 20 44 65 66         $w.   Def
bc80: 61 75 6c 74 4c 65 67 65 6e 64 20 20 20 20 24 77  aultLegend    $w
bc90: 0a 20 20 20 44 65 66 61 75 6c 74 42 61 6c 6c 6f  .   DefaultBallo
bca0: 6f 6e 20 20 20 24 77 0a 0a 20 20 20 72 65 74 75  on   $w..   retu
bcb0: 72 6e 20 24 6e 65 77 63 68 61 72 74 0a 7d 0a 0a  rn $newchart.}..
bcc0: 23 20 63 72 65 61 74 65 52 69 67 68 74 41 78 69  # createRightAxi
bcd0: 73 20 2d 2d 0a 23 20 20 20 20 43 72 65 61 74 65  s --.#    Create
bce0: 20 61 20 63 6f 6d 6d 61 6e 64 20 66 6f 72 20 64   a command for d
bcf0: 72 61 77 69 6e 67 20 61 20 70 6c 6f 74 20 77 69  rawing a plot wi
bd00: 74 68 20 61 20 72 69 67 68 74 20 61 78 69 73 0a  th a right axis.
bd10: 23 20 41 72 67 75 6d 65 6e 74 73 3a 0a 23 20 20  # Arguments:.#  
bd20: 20 20 77 20 20 20 20 20 20 20 20 20 20 20 4e 61    w           Na
bd30: 6d 65 20 6f 66 20 74 68 65 20 63 61 6e 76 61 73  me of the canvas
bd40: 0a 23 20 20 20 20 79 73 63 61 6c 65 20 20 20 20  .#    yscale    
bd50: 20 20 4d 69 6e 69 6d 75 6d 2c 20 6d 61 78 69 6d    Minimum, maxim
bd60: 75 6d 20 61 6e 64 20 73 74 65 70 20 66 6f 72 20  um and step for 
bd70: 76 65 72 74 69 63 61 6c 20 61 78 69 73 0a 23 20  vertical axis.# 
bd80: 52 65 73 75 6c 74 3a 0a 23 20 20 20 20 4e 61 6d  Result:.#    Nam
bd90: 65 20 6f 66 20 61 20 6e 65 77 20 63 6f 6d 6d 61  e of a new comma
bda0: 6e 64 0a 23 20 4e 6f 74 65 3a 0a 23 20 20 20 20  nd.# Note:.#    
bdb0: 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20 72 65 71  This command req
bdc0: 75 69 72 65 73 20 74 68 61 74 20 61 6e 6f 74 68  uires that anoth
bdd0: 65 72 20 70 6c 6f 74 20 63 6f 6d 6d 61 6e 64 20  er plot command 
bde0: 68 61 73 20 62 65 65 6e 0a 23 20 20 20 20 63 72  has been.#    cr
bdf0: 65 61 74 65 64 20 70 72 69 6f 72 20 74 6f 20 74  eated prior to t
be00: 68 69 73 20 6f 6e 65 2e 20 53 6f 6d 65 20 6f 66  his one. Some of
be10: 20 74 68 65 20 70 72 6f 70 65 72 74 69 65 73 20   the properties 
be20: 66 72 6f 6d 20 74 68 61 74 0a 23 20 20 20 20 63  from that.#    c
be30: 6f 6d 6d 61 6e 64 20 73 65 72 76 65 20 66 6f 72  ommand serve for
be40: 20 74 68 69 73 20 6f 6e 65 20 74 6f 6f 2e 0a 23   this one too..#
be50: 0a 70 72 6f 63 20 3a 3a 50 6c 6f 74 63 68 61 72  .proc ::Plotchar
be60: 74 3a 3a 63 72 65 61 74 65 52 69 67 68 74 41 78  t::createRightAx
be70: 69 73 20 7b 20 77 20 79 73 63 61 6c 65 20 7d 20  is { w yscale } 
be80: 7b 0a 20 20 20 76 61 72 69 61 62 6c 65 20 64 61  {.   variable da
be90: 74 61 5f 73 65 72 69 65 73 0a 20 20 20 76 61 72  ta_series.   var
bea0: 69 61 62 6c 65 20 73 63 61 6c 69 6e 67 0a 0a 20  iable scaling.. 
beb0: 20 20 73 65 74 20 6e 65 77 63 68 61 72 74 20 22    set newchart "
bec0: 72 69 67 68 74 5f 24 77 22 0a 0a 20 20 20 23 0a  right_$w"..   #.
bed0: 20 20 20 23 20 43 68 65 63 6b 20 69 66 20 74 68     # Check if th
bee0: 65 72 65 20 69 73 20 61 6e 20 61 70 70 72 6f 70  ere is an approp
bef0: 72 69 61 74 65 20 70 6c 6f 74 20 61 6c 72 65 61  riate plot alrea
bf00: 64 79 20 64 65 66 69 6e 65 64 20 2d 20 74 68 65  dy defined - the
bf10: 72 65 0a 20 20 20 23 20 73 68 6f 75 6c 64 20 62  re.   # should b
bf20: 65 20 6f 6e 6c 79 20 6f 6e 65 21 0a 20 20 20 23  e only one!.   #
bf30: 0a 20 20 20 69 66 20 7b 20 5b 6c 6c 65 6e 67 74  .   if { [llengt
bf40: 68 20 5b 69 6e 66 6f 20 63 6f 6d 6d 61 6e 64 20  h [info command 
bf50: 22 2a 5f 24 77 22 20 5d 5d 20 3d 3d 20 30 20 7d  "*_$w" ]] == 0 }
bf60: 20 7b 0a 20 20 20 20 20 20 20 72 65 74 75 72 6e   {.       return
bf70: 20 2d 63 6f 64 65 20 65 72 72 6f 72 20 22 54 68   -code error "Th
bf80: 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20 61 20  ere should be a 
bf90: 70 6c 6f 74 20 77 69 74 68 20 61 20 6c 65 66 74  plot with a left
bfa0: 20 61 78 69 73 20 61 6c 72 65 61 64 79 20 64 65   axis already de
bfb0: 66 69 6e 65 64 22 0a 20 20 20 7d 0a 20 20 20 69  fined".   }.   i
bfc0: 66 20 7b 20 5b 6c 6c 65 6e 67 74 68 20 5b 69 6e  f { [llength [in
bfd0: 66 6f 20 63 6f 6d 6d 61 6e 64 20 22 2a 5f 24 77  fo command "*_$w
bfe0: 22 20 5d 5d 20 3e 3d 20 32 20 7d 20 7b 0a 20 20  " ]] >= 2 } {.  
bff0: 20 20 20 20 20 69 66 20 7b 20 5b 6c 6c 65 6e 67       if { [lleng
c000: 74 68 20 5b 69 6e 66 6f 20 63 6f 6d 6d 61 6e 64  th [info command
c010: 20 22 72 69 67 68 74 5f 24 77 22 5d 5d 20 3d 3d   "right_$w"]] ==
c020: 20 30 20 7d 20 7b 0a 20 20 20 20 20 20 20 20 20   0 } {.         
c030: 20 20 72 65 74 75 72 6e 20 2d 63 6f 64 65 20 65    return -code e
c040: 72 72 6f 72 20 22 54 68 65 72 65 20 73 68 6f 75  rror "There shou
c050: 6c 64 20 62 65 20 6f 6e 6c 79 20 6f 6e 65 20 70  ld be only one p
c060: 6c 6f 74 20 63 6f 6d 6d 61 6e 64 20 66 6f 72 20  lot command for 
c070: 74 68 69 73 20 77 69 64 67 65 74 20 28 24 77 29  this widget ($w)
c080: 22 0a 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20  ".       } else 
c090: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 63 61 74  {.           cat
c0a0: 63 68 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ch {.           
c0b0: 20 20 20 20 69 6e 74 65 72 70 20 61 6c 69 61 73      interp alias
c0c0: 20 7b 7d 20 24 6e 65 77 63 68 61 72 74 20 7b 7d   {} $newchart {}
c0d0: 0a 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  .           }.  
c0e0: 20 20 20 20 20 7d 0a 20 20 20 7d 0a 0a 20 20 20       }.   }..   
c0f0: 66 6f 72 65 61 63 68 20 73 20 5b 61 72 72 61 79  foreach s [array
c100: 20 6e 61 6d 65 73 20 64 61 74 61 5f 73 65 72 69   names data_seri
c110: 65 73 20 22 72 24 77 2c 2a 22 5d 20 7b 0a 20 20  es "r$w,*"] {.  
c120: 20 20 20 20 75 6e 73 65 74 20 64 61 74 61 5f 73      unset data_s
c130: 65 72 69 65 73 28 24 73 29 0a 20 20 20 7d 0a 0a  eries($s).   }..
c140: 20 20 20 73 65 74 20 74 79 70 65 20 5b 6c 69 6e     set type [lin
c150: 64 65 78 20 5b 69 6e 74 65 72 70 20 61 6c 69 61  dex [interp alia
c160: 73 20 7b 7d 20 5b 69 6e 66 6f 20 63 6f 6d 6d 61  s {} [info comma
c170: 6e 64 20 22 2a 5f 24 77 22 5d 5d 20 31 5d 0a 0a  nd "*_$w"]] 1]..
c180: 20 20 20 69 6e 74 65 72 70 20 61 6c 69 61 73 20     interp alias 
c190: 7b 7d 20 24 6e 65 77 63 68 61 72 74 20 7b 7d 20  {} $newchart {} 
c1a0: 3a 3a 50 6c 6f 74 63 68 61 72 74 3a 3a 50 6c 6f  ::Plotchart::Plo
c1b0: 74 48 61 6e 64 6c 65 72 20 24 74 79 70 65 20 72  tHandler $type r
c1c0: 24 77 0a 20 20 20 69 6e 74 65 72 70 20 61 6c 69  $w.   interp ali
c1d0: 61 73 20 7b 7d 20 72 24 77 20 20 20 20 20 20 20  as {} r$w       
c1e0: 7b 7d 20 24 77 0a 20 20 20 43 6f 70 79 43 6f 6e  {} $w.   CopyCon
c1f0: 66 69 67 20 24 74 79 70 65 20 72 24 77 0a 0a 20  fig $type r$w.. 
c200: 20 20 73 65 74 20 78 6d 69 6e 20 24 73 63 61 6c    set xmin $scal
c210: 69 6e 67 28 24 77 2c 78 6d 69 6e 29 0a 20 20 20  ing($w,xmin).   
c220: 73 65 74 20 78 6d 61 78 20 24 73 63 61 6c 69 6e  set xmax $scalin
c230: 67 28 24 77 2c 78 6d 61 78 29 0a 0a 20 20 20 73  g($w,xmax)..   s
c240: 65 74 20 70 78 6d 69 6e 20 24 73 63 61 6c 69 6e  et pxmin $scalin
c250: 67 28 24 77 2c 70 78 6d 69 6e 29 0a 20 20 20 73  g($w,pxmin).   s
c260: 65 74 20 70 78 6d 61 78 20 24 73 63 61 6c 69 6e  et pxmax $scalin
c270: 67 28 24 77 2c 70 78 6d 61 78 29 0a 20 20 20 73  g($w,pxmax).   s
c280: 65 74 20 70 79 6d 69 6e 20 24 73 63 61 6c 69 6e  et pymin $scalin
c290: 67 28 24 77 2c 70 79 6d 69 6e 29 0a 20 20 20 73  g($w,pymin).   s
c2a0: 65 74 20 70 79 6d 61 78 20 24 73 63 61 6c 69 6e  et pymax $scalin
c2b0: 67 28 24 77 2c 70 79 6d 61 78 29 0a 0a 20 20 20  g($w,pymax)..   
c2c0: 66 6f 72 65 61 63 68 20 7b 79 6d 69 6e 20 79 6d  foreach {ymin ym
c2d0: 61 78 20 79 64 65 6c 74 7d 20 24 79 73 63 61 6c  ax ydelt} $yscal
c2e0: 65 20 7b 62 72 65 61 6b 7d 0a 0a 20 20 20 69 66  e {break}..   if
c2f0: 20 7b 20 24 79 64 65 6c 74 20 3d 3d 20 30 2e 30   { $ydelt == 0.0
c300: 20 7d 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72   } {.      retur
c310: 6e 20 2d 63 6f 64 65 20 65 72 72 6f 72 20 22 53  n -code error "S
c320: 74 65 70 20 73 69 7a 65 20 63 61 6e 20 6e 6f 74  tep size can not
c330: 20 62 65 20 7a 65 72 6f 22 0a 20 20 20 7d 0a 0a   be zero".   }..
c340: 20 20 20 69 66 20 7b 20 28 24 79 6d 61 78 2d 24     if { ($ymax-$
c350: 79 6d 69 6e 29 2a 24 79 64 65 6c 74 20 3c 20 30  ymin)*$ydelt < 0
c360: 2e 30 20 7d 20 7b 0a 20 20 20 20 20 20 73 65 74  .0 } {.      set
c370: 20 79 64 65 6c 74 20 5b 65 78 70 72 20 7b 2d 24   ydelt [expr {-$
c380: 79 64 65 6c 74 7d 5d 0a 20 20 20 7d 0a 0a 20 20  ydelt}].   }..  
c390: 20 76 69 65 77 50 6f 72 74 20 20 20 20 20 20 20   viewPort       
c3a0: 20 20 72 24 77 20 24 70 78 6d 69 6e 20 24 70 79    r$w $pxmin $py
c3b0: 6d 69 6e 20 24 70 78 6d 61 78 20 24 70 79 6d 61  min $pxmax $pyma
c3c0: 78 0a 20 20 20 77 6f 72 6c 64 43 6f 6f 72 64 69  x.   worldCoordi
c3d0: 6e 61 74 65 73 20 72 24 77 20 24 78 6d 69 6e 20  nates r$w $xmin 
c3e0: 20 24 79 6d 69 6e 20 20 24 78 6d 61 78 20 20 24   $ymin  $xmax  $
c3f0: 79 6d 61 78 0a 0a 20 20 20 44 72 61 77 52 69 67  ymax..   DrawRig
c400: 68 74 61 78 69 73 20 20 20 20 72 24 77 20 24 79  htaxis    r$w $y
c410: 6d 69 6e 20 20 24 79 6d 61 78 20 20 24 79 64 65  min  $ymax  $yde
c420: 6c 74 0a 0a 20 20 20 23 44 65 66 61 75 6c 74 4c  lt..   #DefaultL
c430: 65 67 65 6e 64 20 20 20 20 72 24 77 0a 20 20 20  egend    r$w.   
c440: 23 44 65 66 61 75 6c 74 42 61 6c 6c 6f 6f 6e 20  #DefaultBalloon 
c450: 20 20 72 24 77 0a 0a 20 20 20 72 65 74 75 72 6e    r$w..   return
c460: 20 24 6e 65 77 63 68 61 72 74 0a 7d 0a 0a 23 20   $newchart.}..# 
c470: 63 72 65 61 74 65 33 44 52 69 62 62 6f 6e 43 68  create3DRibbonCh
c480: 61 72 74 20 2d 2d 0a 23 20 20 20 20 43 72 65 61  art --.#    Crea
c490: 74 65 20 61 20 63 68 61 72 74 20 74 68 61 74 20  te a chart that 
c4a0: 63 61 6e 20 64 69 73 70 6c 61 79 20 33 44 20 6c  can display 3D l
c4b0: 69 6e 65 73 20 61 6e 64 20 61 72 65 61 73 0a 23  ines and areas.#
c4c0: 20 41 72 67 75 6d 65 6e 74 73 3a 0a 23 20 20 20   Arguments:.#   
c4d0: 20 77 20 20 20 20 20 20 20 20 20 20 20 4e 61 6d   w           Nam
c4e0: 65 20 6f 66 20 74 68 65 20 63 61 6e 76 61 73 0a  e of the canvas.
c4f0: 23 20 20 20 20 6e 61 6d 65 73 20 20 20 20 20 20  #    names      
c500: 20 4c 61 62 65 6c 73 20 61 6c 6f 6e 67 20 74 68   Labels along th
c510: 65 20 78 2d 61 78 69 73 0a 23 20 20 20 20 79 73  e x-axis.#    ys
c520: 63 61 6c 65 20 20 20 20 20 20 4d 69 6e 69 6d 75  cale      Minimu
c530: 6d 2c 20 6d 61 78 69 6d 75 6d 20 61 6e 64 20 73  m, maximum and s
c540: 74 65 70 20 66 6f 72 20 79 2d 61 78 69 73 0a 23  tep for y-axis.#
c550: 20 20 20 20 7a 73 63 61 6c 65 20 20 20 20 20 20      zscale      
c560: 4d 69 6e 69 6d 75 6d 2c 20 6d 61 78 69 6d 75 6d  Minimum, maximum
c570: 20 61 6e 64 20 73 74 65 70 20 66 6f 72 20 7a 2d   and step for z-
c580: 61 78 69 73 0a 23 20 52 65 73 75 6c 74 3a 0a 23  axis.# Result:.#
c590: 20 20 20 20 4e 61 6d 65 20 6f 66 20 61 20 6e 65      Name of a ne
c5a0: 77 20 63 6f 6d 6d 61 6e 64 0a 23 20 4e 6f 74 65  w command.# Note
c5b0: 3a 0a 23 20 20 20 20 54 68 65 20 65 6e 74 69 72  :.#    The entir
c5c0: 65 20 63 61 6e 76 61 73 20 77 69 6c 6c 20 62 65  e canvas will be
c5d0: 20 64 65 64 69 63 61 74 65 64 20 74 6f 20 74 68   dedicated to th
c5e0: 65 20 33 44 20 63 68 61 72 74 0a 23 0a 70 72 6f  e 3D chart.#.pro
c5f0: 63 20 3a 3a 50 6c 6f 74 63 68 61 72 74 3a 3a 63  c ::Plotchart::c
c600: 72 65 61 74 65 33 44 52 69 62 62 6f 6e 43 68 61  reate3DRibbonCha
c610: 72 74 20 7b 20 77 20 6e 61 6d 65 73 20 79 73 63  rt { w names ysc
c620: 61 6c 65 20 7a 73 63 61 6c 65 20 7d 20 7b 0a 20  ale zscale } {. 
c630: 20 20 76 61 72 69 61 62 6c 65 20 64 61 74 61 5f    variable data_
c640: 73 65 72 69 65 73 0a 0a 20 20 20 66 6f 72 65 61  series..   forea
c650: 63 68 20 73 20 5b 61 72 72 61 79 20 6e 61 6d 65  ch s [array name
c660: 73 20 64 61 74 61 5f 73 65 72 69 65 73 20 22 24  s data_series "$
c670: 77 2c 2a 22 5d 20 7b 0a 20 20 20 20 20 20 75 6e  w,*"] {.      un
c680: 73 65 74 20 64 61 74 61 5f 73 65 72 69 65 73 28  set data_series(
c690: 24 73 29 0a 20 20 20 7d 0a 0a 20 20 20 73 65 74  $s).   }..   set
c6a0: 20 6e 65 77 63 68 61 72 74 20 22 33 64 72 69 62   newchart "3drib
c6b0: 62 6f 6e 5f 24 77 22 0a 20 20 20 69 6e 74 65 72  bon_$w".   inter
c6c0: 70 20 61 6c 69 61 73 20 7b 7d 20 24 6e 65 77 63  p alias {} $newc
c6d0: 68 61 72 74 20 7b 7d 20 3a 3a 50 6c 6f 74 63 68  hart {} ::Plotch
c6e0: 61 72 74 3a 3a 50 6c 6f 74 48 61 6e 64 6c 65 72  art::PlotHandler
c6f0: 20 33 64 72 69 62 62 6f 6e 20 24 77 0a 20 20 20   3dribbon $w.   
c700: 43 6f 70 79 43 6f 6e 66 69 67 20 33 64 72 69 62  CopyConfig 3drib
c710: 62 6f 6e 20 24 77 0a 0a 20 20 20 66 6f 72 65 61  bon $w..   forea
c720: 63 68 20 7b 70 78 6d 69 6e 20 70 79 6d 69 6e 20  ch {pxmin pymin 
c730: 70 78 6d 61 78 20 70 79 6d 61 78 7d 20 5b 4d 61  pxmax pymax} [Ma
c740: 72 67 69 6e 73 33 44 50 6c 6f 74 20 24 77 5d 20  rgins3DPlot $w] 
c750: 7b 62 72 65 61 6b 7d 0a 0a 20 20 20 66 6f 72 65  {break}..   fore
c760: 61 63 68 20 7b 78 6d 69 6e 20 78 6d 61 78 20 78  ach {xmin xmax x
c770: 73 74 65 70 7d 20 7b 30 2e 30 20 31 2e 30 20 30  step} {0.0 1.0 0
c780: 2e 30 7d 20 7b 62 72 65 61 6b 7d 0a 20 20 20 66  .0} {break}.   f
c790: 6f 72 65 61 63 68 20 7b 79 6d 69 6e 20 79 6d 61  oreach {ymin yma
c7a0: 78 20 79 73 74 65 70 7d 20 24 79 73 63 61 6c 65  x ystep} $yscale
c7b0: 20 7b 62 72 65 61 6b 7d 0a 20 20 20 66 6f 72 65   {break}.   fore
c7c0: 61 63 68 20 7b 7a 6d 69 6e 20 7a 6d 61 78 20 7a  ach {zmin zmax z
c7d0: 73 74 65 70 7d 20 24 7a 73 63 61 6c 65 20 7b 62  step} $zscale {b
c7e0: 72 65 61 6b 7d 0a 0a 20 20 20 73 65 74 20 78 73  reak}..   set xs
c7f0: 74 65 70 20 5b 65 78 70 72 20 7b 31 2e 30 2f 5b  tep [expr {1.0/[
c800: 6c 6c 65 6e 67 74 68 20 24 6e 61 6d 65 73 5d 7d  llength $names]}
c810: 5d 0a 20 20 20 73 65 74 20 64 61 74 61 5f 73 65  ].   set data_se
c820: 72 69 65 73 28 24 77 2c 78 62 61 73 65 29 20 20  ries($w,xbase)  
c830: 5b 65 78 70 72 20 7b 31 2e 30 2d 30 2e 31 35 2a  [expr {1.0-0.15*
c840: 24 78 73 74 65 70 7d 5d 0a 20 20 20 73 65 74 20  $xstep}].   set 
c850: 64 61 74 61 5f 73 65 72 69 65 73 28 24 77 2c 78  data_series($w,x
c860: 73 74 65 70 29 20 20 24 78 73 74 65 70 0a 20 20  step)  $xstep.  
c870: 20 73 65 74 20 64 61 74 61 5f 73 65 72 69 65 73   set data_series
c880: 28 24 77 2c 78 77 69 64 74 68 29 20 5b 65 78 70  ($w,xwidth) [exp
c890: 72 20 7b 30 2e 37 2a 24 78 73 74 65 70 7d 5d 0a  r {0.7*$xstep}].
c8a0: 0a 20 20 20 76 69 65 77 50 6f 72 74 20 20 20 20  .   viewPort    
c8b0: 20 20 20 20 20 20 20 24 77 20 24 70 78 6d 69 6e         $w $pxmin
c8c0: 20 24 70 79 6d 69 6e 20 24 70 78 6d 61 78 20 24   $pymin $pxmax $
c8d0: 70 79 6d 61 78 0a 20 20 20 77 6f 72 6c 64 33 44  pymax.   world3D
c8e0: 43 6f 6f 72 64 69 6e 61 74 65 73 20 24 77 20 24  Coordinates $w $
c8f0: 78 6d 69 6e 20 20 24 79 6d 69 6e 20 20 24 7a 6d  xmin  $ymin  $zm
c900: 69 6e 20 20 24 78 6d 61 78 20 20 24 79 6d 61 78  in  $xmax  $ymax
c910: 20 24 7a 6d 61 78 0a 0a 20 20 20 44 72 61 77 33   $zmax..   Draw3
c920: 44 41 78 65 73 20 20 20 20 20 20 20 20 20 24 77  DAxes         $w
c930: 20 24 78 6d 69 6e 20 20 24 79 6d 69 6e 20 20 24   $xmin  $ymin  $
c940: 7a 6d 69 6e 20 20 24 78 6d 61 78 20 20 24 79 6d  zmin  $xmax  $ym
c950: 61 78 20 24 7a 6d 61 78 20 5c 0a 20 20 20 20 20  ax $zmax \.     
c960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c970: 20 20 20 20 24 78 73 74 65 70 20 24 79 73 74 65      $xstep $yste
c980: 70 20 24 7a 73 74 65 70 20 24 6e 61 6d 65 73 0a  p $zstep $names.
c990: 20 20 20 44 65 66 61 75 6c 74 4c 65 67 65 6e 64     DefaultLegend
c9a0: 20 20 20 20 20 20 24 77 0a 20 20 20 44 65 66 61        $w.   Defa
c9b0: 75 6c 74 42 61 6c 6c 6f 6f 6e 20 20 20 20 20 24  ultBalloon     $
c9c0: 77 0a 0a 20 20 20 53 65 74 43 6f 6c 6f 75 72 73  w..   SetColours
c9d0: 20 24 77 20 67 72 65 79 20 62 6c 61 63 6b 0a 0a   $w grey black..
c9e0: 20 20 20 72 65 74 75 72 6e 20 24 6e 65 77 63 68     return $newch
c9f0: 61 72 74 0a 7d 0a 0a 23 20 4c 6f 61 64 20 74 68  art.}..# Load th
ca00: 65 20 70 72 69 76 61 74 65 20 70 72 6f 63 65 64  e private proced
ca10: 75 72 65 73 0a 23 0a 73 6f 75 72 63 65 20 5b 66  ures.#.source [f
ca20: 69 6c 65 20 6a 6f 69 6e 20 5b 66 69 6c 65 20 64  ile join [file d
ca30: 69 72 6e 61 6d 65 20 5b 69 6e 66 6f 20 73 63 72  irname [info scr
ca40: 69 70 74 5d 5d 20 22 70 6c 6f 74 70 72 69 76 2e  ipt]] "plotpriv.
ca50: 74 63 6c 22 5d 0a 73 6f 75 72 63 65 20 5b 66 69  tcl"].source [fi
ca60: 6c 65 20 6a 6f 69 6e 20 5b 66 69 6c 65 20 64 69  le join [file di
ca70: 72 6e 61 6d 65 20 5b 69 6e 66 6f 20 73 63 72 69  rname [info scri
ca80: 70 74 5d 5d 20 22 70 6c 6f 74 61 78 69 73 2e 74  pt]] "plotaxis.t
ca90: 63 6c 22 5d 0a 73 6f 75 72 63 65 20 5b 66 69 6c  cl"].source [fil
caa0: 65 20 6a 6f 69 6e 20 5b 66 69 6c 65 20 64 69 72  e join [file dir
cab0: 6e 61 6d 65 20 5b 69 6e 66 6f 20 73 63 72 69 70  name [info scrip
cac0: 74 5d 5d 20 22 70 6c 6f 74 33 64 2e 74 63 6c 22  t]] "plot3d.tcl"
cad0: 5d 0a 73 6f 75 72 63 65 20 5b 66 69 6c 65 20 6a  ].source [file j
cae0: 6f 69 6e 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d  oin [file dirnam
caf0: 65 20 5b 69 6e 66 6f 20 73 63 72 69 70 74 5d 5d  e [info script]]
cb00: 20 22 73 63 61 6c 69 6e 67 2e 74 63 6c 22 5d 0a   "scaling.tcl"].
cb10: 73 6f 75 72 63 65 20 5b 66 69 6c 65 20 6a 6f 69  source [file joi
cb20: 6e 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d 65 20  n [file dirname 
cb30: 5b 69 6e 66 6f 20 73 63 72 69 70 74 5d 5d 20 22  [info script]] "
cb40: 70 6c 6f 74 63 6f 6e 74 6f 75 72 2e 74 63 6c 22  plotcontour.tcl"
cb50: 5d 0a 73 6f 75 72 63 65 20 5b 66 69 6c 65 20 6a  ].source [file j
cb60: 6f 69 6e 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d  oin [file dirnam
cb70: 65 20 5b 69 6e 66 6f 20 73 63 72 69 70 74 5d 5d  e [info script]]
cb80: 20 22 70 6c 6f 74 67 61 6e 74 74 2e 74 63 6c 22   "plotgantt.tcl"
cb90: 5d 0a 73 6f 75 72 63 65 20 5b 66 69 6c 65 20 6a  ].source [file j
cba0: 6f 69 6e 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d  oin [file dirnam
cbb0: 65 20 5b 69 6e 66 6f 20 73 63 72 69 70 74 5d 5d  e [info script]]
cbc0: 20 22 70 6c 6f 74 62 75 73 69 6e 65 73 73 2e 74   "plotbusiness.t
cbd0: 63 6c 22 5d 0a 73 6f 75 72 63 65 20 5b 66 69 6c  cl"].source [fil
cbe0: 65 20 6a 6f 69 6e 20 5b 66 69 6c 65 20 64 69 72  e join [file dir
cbf0: 6e 61 6d 65 20 5b 69 6e 66 6f 20 73 63 72 69 70  name [info scrip
cc00: 74 5d 5d 20 22 70 6c 6f 74 61 6e 6e 6f 74 2e 74  t]] "plotannot.t
cc10: 63 6c 22 5d 0a 73 6f 75 72 63 65 20 5b 66 69 6c  cl"].source [fil
cc20: 65 20 6a 6f 69 6e 20 5b 66 69 6c 65 20 64 69 72  e join [file dir
cc30: 6e 61 6d 65 20 5b 69 6e 66 6f 20 73 63 72 69 70  name [info scrip
cc40: 74 5d 5d 20 22 70 6c 6f 74 63 6f 6e 66 69 67 2e  t]] "plotconfig.
cc50: 74 63 6c 22 5d 0a 73 6f 75 72 63 65 20 5b 66 69  tcl"].source [fi
cc60: 6c 65 20 6a 6f 69 6e 20 5b 66 69 6c 65 20 64 69  le join [file di
cc70: 72 6e 61 6d 65 20 5b 69 6e 66 6f 20 73 63 72 69  rname [info scri
cc80: 70 74 5d 5d 20 22 70 6c 6f 74 70 61 63 6b 2e 74  pt]] "plotpack.t
cc90: 63 6c 22 5d 0a 23 73 6f 75 72 63 65 20 5b 66 69  cl"].#source [fi
cca0: 6c 65 20 6a 6f 69 6e 20 5b 66 69 6c 65 20 64 69  le join [file di
ccb0: 72 6e 61 6d 65 20 5b 69 6e 66 6f 20 73 63 72 69  rname [info scri
ccc0: 70 74 5d 5d 20 22 70 6c 6f 74 62 69 6e 64 2e 74  pt]] "plotbind.t
ccd0: 63 6c 22 5d 0a 0a 23 20 41 6e 6e 6f 75 6e 63 65  cl"]..# Announce
cce0: 20 6f 75 72 20 70 72 65 73 65 6e 63 65 0a 23 0a   our presence.#.
ccf0: 70 61 63 6b 61 67 65 20 70 72 6f 76 69 64 65 20  package provide 
cd00: 50 6c 6f 74 63 68 61 72 74 20 31 2e 36 2e 31 0a  Plotchart 1.6.1.